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 }
導入の方法
- Download->install
$ go get github.com/gin-gonic/gin
- コードにインポートする
import "github.com/gin-gonic/gin"
- (オプション)
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 |