読者です 読者をやめる 読者になる 読者になる

php switch文のstring比較に気をつけろ

phpのゆるふわ型比較で引っかかった話

常識なのかもしれませんが、 普段GOとかJavaとか使ってた自分にとってこんなに理不尽なことはないと思ったので書きたい。

暗黙の型変換怖い・・・

事象

$array = [
    'test', 0,
];

foreach ($array as $value) {
    switch ($value) {
        case 'test':
       echo('test!');
             break;
        default:
             echo('default!');
    }
}

結果

test!test!

はい。こうなります。やめて・・・

っていうのも型比較がゆるいかららしい。

解決策

foreach ($array as $value) {
    $stringValue = is_string($value) ? $value : (string)$value
    switch ($stringValue) {
        case 'test':
       echo('test!');
             break;
        default:
             echo('default!');
    }
}

ひとまず、型変換したら通ったよ...


みなさんもゆるふわ型変換には気を付けよう。

golang 1.7について

い つ も の

ブログの三日坊主?発動! 極端なんですよねー。自分のブログ。

環境のバージョンあげちゃうかもって話でたので、 Golang v1.7について、おさらいしたい

概要

2016年12月4日時点でのGolangの最新バージョンは1.7.4です。

v1.6 -> v1.7

  • コンパイラの改善による最適化と高速化
  • import をより効率よく処理できるようになった
    • 高速化とバイナリサイズの削減
  • 標準ライブラリ拡充
  • vendorディレクトリ(1.6でデフォルト対応になったやつ)が常時有効になった
    • 有効化オプションの廃止

参考文献

Tool系

cgo package

cgoパッケージ:C言語を呼ぶGoパッケージの生成が可能 (こいつ使ったことないのでよくわかんないけど)

-> C, C++, Objective-c, SWIGに加えて Fortranのソースファイルも増えた

Go command

基本的な命令は変わってないけどいくつか変わりました。

やっぱり注目すべき変更はVendoring supportですかね。

下記は更新あり

  • Go doc
  • Go doc
  • Go vet
  • Go tool dist
  • Go tool trace

パフォーマンス

(めんどくさくなったので引用。改善されたよってこと)

引用 https://tip.golang.org/doc/go1.7?la=ja#performance

As always, the changes are so general and varied that precise statements about performance are difficult to make. Most programs should run a bit faster, due to speedups in the garbage collector and optimizations in the core library. On x86-64 systems, many programs will run significantly faster, due to improvements in generated code brought by the new compiler back end. As noted above, in our own benchmarks, the code generation changes alone typically reduce program CPU time by 5-35%.

There have been significant optimizations bringing more than 10% improvements to implementations in the crypto/sha1, crypto/sha256, encoding/binary, fmt, hash/adler32, hash/crc32, hash/crc64, image/color, math/big, strconv, strings, unicode, and unicode/utf16 packages.

Garbage collection pauses should be significantly shorter than they were in Go 1.6 for programs with large numbers of idle goroutines, substantial stack size fluctuation, or large package-level variables.

Core library

下記に変更あったよー

  • golang.org/x/net/context -> context (標準ライブラリに)
  • net/http/httptrace
  • testing
  • Runtime

Minor Change

目通しておくと不幸せにならないかも??


あとがき

やっぱり、手間にならない程度でブログ書いてこう。 今日みたいなまとめは英語読むのしんどい&そもそもGoあんまりよくわかってないから、 リハビリ的なものじゃなかった・・・

Laravelの素敵な機能(Collection)

PHP7の登場でPHP界隈が盛り上がってますね!

そして、PHPフレームワークのLaravelも5系の登場で人気急上昇中といった感じでしょうか。

Laravelの機能で気になったことがあるので紹介しますー。

Collection

Laravelには配列データを操作するために、書きやすく使いやすいラッパーが用意されています。

それをCollectionと呼びます。(Illuminate\Support\Collectionクラス)

Collectionクラスは、内部で持っている配列を操作でき、メソッドチェーンでスムーズに処理してくれます。 ※つまり、すべてのCollectionメソッドは新しいCollectionインスタンスを返すってことですね。

$collection = collect(['a', 'b', 'c', 'hogehoge'])
    ->map(function($name)){
        return strtoupper($name);
    })
    ->reject(function($name)) {
        return strlen($name) > 1;
    });

上記サンプルは、要素ひとつひとつについて、小文字をすべて大文字にしてから、文字数が1文字を超える要素を削除することをしています。

コレクションの生成

上記サンプルで書いたように配列を引数にcollect(['hogehoge', 'hoge', ''])としてあげればいいです。

Eloquentオブジェクトは、Collectionを返却してくれるので、コレクションさえ扱えれば、データ取得後も配列操作がより簡単になります!

配列操作はCollectionで!

これは後日書きますね。

golang ...演算子

...で記述される可変数関数。

これ結構便利というか知らなかったことが多かった。

そもそも、…パラメータとは??

func append(zeroValue int, value ...int)

Sum(-10, 50, 3, 10, -17)

このような関数とその呼出しがあるとします。

その場合、valueの値は[]int{50, 3, 10, -17}となります。

最後の引数がスライス型[]Tに対し、代入可能!

スライス型を使って呼び出すことも可能です!!

value := []int{50, 3, 10, -17}
Sum(-10, value...)

すげぇ。

これをうまく使うと、 appendでスライド同士の結合も可能で、 結合される側のスライスに...を付記で出来る!

num := []int{1, 2, 3, 4, 5, 99}
num = append([]int{99}, num...)

スライスの結合、地道にループしてたのですが、 この方法のがパフォーマンス的にもいいですね。

ただの可変長な引数にするだけだと思ってたので、こういう使い方ができるとは!知らんかった。。。

RESTful API

RESTful APIとは

Webシステムを外部から利用するためのプログラム呼出し規約の種類の一つでRESTと呼ばれる設計原則に従って策定されたもの

引用 http://e-words.jp/w/RESTful_API.html

ざっくり言えば、パラメータを指定して特定のURLにHTTPでアクセスしてリソース操作/取得するようにAPIを設計すること

システムの状態やセッションに依存せず 同じURLやパラメータの組み合わせからは同じ結果が返されることが期待され、リソースの操作はHTTPメソッドによって指定され、結果はJSONなどで返され、HTTPステータスコードで通知する。

REST API

  • GET
    • リソースの取得
  • POST
    • 子リソースの作成やリソースへのデータの追加
  • PUT
    • リソースの更新:全部を置き換える
  • PATCH
    • リソースの更新:一部のみ更新
  • DELETE
    • リソースの削除
  • HEAD
  • OPTION
    • サポートしているメソッドの取得

CRUD

CRUDは、CreateReadUpdateDeleteの4つのデータ操作の基本の処理


APIを実装する際はRESTfulなものを作れるように意識したいですね。

golang/gin

Go言語のフレームワークのひとつを紹介したいと思います。 公式だと英語なのと検証結果など情報が多いので、使い方とかシンプルに紹介したいと思います。

gin flamework

ginはGo言語で記述されたHTTPのWebフレームワークです。

martiniライク(https://github.com/go-martini/martini)なAPIで、よりパフォーマンスに特化しており、40倍以上速いとのことです。

それはHttpRouterというGo用の軽量でハイパフォーマンスなHttpリクエストルータ(https://github.com/julienschmidt/httprouter)を利用することによる恩恵で速いとのことです。

パフォーマンスを求め、良いプロダクティビティを求めるならGinを愛せるでしょう

API Examples

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and server on 0.0.0.0:8080
}

導入の方法

  1. Download->install

$ go get github.com/gin-gonic/gin

  1. コードにインポートする

import "github.com/gin-gonic/gin"

  1. (オプション) net/httpをインポートすることで、http.StatusOKといった、ステータスコード を利用できる。

import "net/http"


参考(https://github.com/gin-gonic/gin)

今回はここまで!! また、いろんなこと紹介していこうと思います。

HTTP Status Code

HTTPのステータスコードってよく忘れがち。 主要なのを一覧を記述しときます。 あんま使わないものは書きませんでした。

Webサーバからのレスポンスを意味する3桁の数字のコード

Status code explain
1xx Information
100 Continue
2xx Success
200 OK
201 Created
202 Accepted
204 No Content
3xx Redirection
301 Moved Permanently (恒久的に移動)
302 Found (Moved Temprarily)
303 See Other
304 Not Modified
307 Temporary Ridirect
308 Permanent Redirect
4xx Client error
400 Bad Request
402 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
413 Payload Too Large
414 URI Too Long
415 Unsupported Media Type
5xx Server error
500 Internal Server Error
501 Not Implemented (実装されていない)
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported

参考URL

wiki