サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
qiita.com/Hiraku
HTTPのステータスコードにあたる概念がgRPC Codeであり、以下で定義されている。 https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto 例えばGo言語だと以下にprotoから生成されたコードがある。 https://github.com/grpc/grpc-go/blob/master/codes/codes.go 一覧 適当に翻訳していく。 OK = 0 エラーなし。成功を返した。 HTTPだと 200 OK CANCELLED = 1 処理がキャンセルされた。通常は呼び出し側によるキャンセル。 HTTPだと 499 Client Closed Request ※Lを2つ重ねるスペルなことに注意。後述 UNKNOWN = 2 不明エラー。他のアドレス空間から受け取ったステータスを、適切
gRPC関連でprotocol buffersを使うことが増えたのだが、protocol buffers自体にまだ慣れていないので調べてまとめる。 https://developers.google.com/protocol-buffers/docs/proto3 protocol buffers自体のおさらい Googleが2008年にOSS化したプログラミング言語に中立なデータのシリアライズ形式である。(略称はprotobuf) 型情報は.protoというIDLに書き、これを送信と受信の双方で事前共有しておく。こうすることによって余計な型情報を省いてバイナリに固めることができる。 この性質から、APIドキュメントとしても使える。「RESTっぽいJSON API + OpenAPIによる記述」とだいたい同じニーズをカバーする。(IDLを抜きにしてMessagePackやJSONと比較する
必要に迫られて、Goでバイナリの読み書きをしているのですが、encoding/binaryに関する解説が少ない気がしたのでまとめます。 固定長フォーマットとは なんかこう、「先頭から 4byte, 2byte, 10byteという風に区切って、最初の4byteがA, 次の2byteはビッグエンディアンでuint32扱いでB, 次の10byteは文字列…」みたいに、一切の説明が省かれたフォーマットのことを指して発言しています。 当然、元データをparseして、構造体とかに変換してからプログラムで扱いたくなると思います。ただの[]byteのまま扱うとか地獄すぎですよね。 type Foo struct{ A [4]byte B uint32 C uint16 D uint16 } func ParseBinary(in []byte) *Foo { // ... } // 実行イメージ fun
gRPCにおけるエラー(status)には拡張性がある。 基本的には、status.New()で作る。 func New(c codes.Code, msg string) *Status func Newf(c codes.Code, format string, a ...interface{}) *Status import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) //... st := status.New(codes.InvalidArgument, "bad request") status.Statusはerrorインターフェースを満たす型にすることもできて、.Err()メソッドで変換できる。error化してもStatus型だった頃の情報は持ったままなので、気軽に変換して良い。(とい
"Accept interfaces, Return structs"が基本なのに、何でerrorはerrorで返すのかGo 表題の通り、Goのお作法に「インターフェースで受けて、実体で返せ」というものがあります。 戻り値はなるべく具体的な型で書き、受け取る側が必要なインターフェースを定義して受け取るべき、というものです。 例えば net/http の *Client は具体的な型ですが、これを使う関数の引数をそのまま*http.Clientとか書いちゃって、テストしづらくて詰む、なんてことはよくあります。
だいぶ昔の記事ですが、 Golang Error Handling lesson by Rob Pike - Block Rockin’ Codes の、自分なりの理解をメモします。 if err != nil { ... }が多すぎるコード Goは例外機構がありませんので、戻り値を使ってエラーを伝搬していく必要があります。 func doSomething() error { resA, err := doA() if err != nil { return err } resB, err := doB(resA) if err != nil { return err } resC, err := doC(resB) if err != nil { return err } err := doD(resC) if err != nil { return err } } もちろんこれは擬似
何気なくGoのsortパッケージのdocを眺めていたら、冒頭にこんな感じのサンプルが書かれていたんですよ。 sort.Slice(people, func(i, j int) bool { return people[i].Age > people[j].Age }) 要素の大小関係を比較する関数が、compareとかcmpって名前じゃなくて、lessと名付けられていて、しかもbool値を返すようになっている!! 個人的にtimeのFormat構文レベルでびっくりしたんだけど、特にググってもびっくりしてる人が見当たらなかったので記事にまとめます。 ※ちなみに経緯が調べきれなかったので、読み終わってもすっきりしない記事です!! sortのcomparatorと言えばintじゃないの?! ユーザー定義の比較関数を使って配列をソートする関数や機構は、さまざまな言語で実装されています。この比較関数
qiita.com
やっぱり自分なりにまとめないと理解した気になれないので、まとめてみることにする。 https://godoc.org/github.com/pkg/errors Golangにおけるエラー処理(おさらい) Goは言語仕様として例外機構(Exception)がない。例外ではなく、複数の戻り値を返せるという特徴を利用し、最後の戻り値をエラーに割り当てるということをする。throwを書きたくなったら代わりにreturnを書くわけだ。 import "fmt" // helloはnameが空だったらエラー扱いにする func hello(name string) (string, error) { if name == "" { return nil, fmt.Errorf("name is invalid") } return fmt.Sprint("hello %v", name) }
declare(strict_types=1); とは、PHP7から導入された、厳格な型検査モードの指定構文です。 有効範囲をあまり把握してなかったのでまとめてみました。 strict_types基本の動き 例えばこんなコード。 <?php function add(int $a, int $b): int { return $a + $b; } var_dump(add(1.0, 2.0)); この状態で単体実行すると、int(3)が出力されます。 渡しているのはdouble型なのですが、よしなにキャストされて処理されています。まあ、昔ながらのPHPらしい動きです。 ここで、declare(strict_types=1)を有効にしてみます。
タスクの工数を見積もる際に、タスク自体が確定していないから、見積もりにくいことがあります。 こういう時、その不確定さも含めて見積もってしまい、作業バッファとして積むという技があります。(勝手に2点見積もりと呼んでいます) 少しまとめておきます。 ちなみに、見積もりの単位はストーリーポイントでも人日でも関係なく使える話です。 平均時間と最悪時間 勘でタスクごとに2つの見積もり数字を出します。 「平均的に終わらせるとしたら」の時間 「ハマったりして時間がかかったとしたら」の時間 なお、(2)は「明日、地球に隕石が落下して世界が滅びたらどうしよう」みたいな、常識的に考えると起こり得ないことまでは考慮しません。想定できる範囲で、「悪いことが重なったらどうしよう」と考えてください。 イメージとして、50%と90%を念頭においてください。 50% ぐらい、もしかしたらオーバーするかも 90% まあ確実
MySQLで集合差を出す - Qiita これと似たようなところで、集合同士の重なり(intersect)を出す方法。 ぱっといい例が思いつかないので適当だけど、 CREATE TABLE a ( id INT NOT NULL, PRIMARY KEY(id) ); CREATE TABLE b ( id INT NOT NULL, PRIMARY KEY(id) );
(例外安全ネタでもう少し長い記事が書きたいんだけど、思いつきだけまとめておく) PHPにはアトミックでない関数が結構ある。本来1つの処理だったものが複数に分かれているような関数。終了する方の関数を呼ばずにいると、変な状態のままになってしまう。 fopen/fclose flock(LOCK_EX)/flock(LOCK_UN) PDO::beginTransaction / PDO::commit / PDO::rollback ob_start / ob_get_clean こういったものは気をつけて書かないと終了の関数だけが実行されず、例外安全を破ってしまう。 どうすれば「気をつけて書いている」ことになるのか考えてみた。 finallyを都度書く finallyを使えば、例外が起きても終了処理が呼ばれる。とりあえず、これで例外安全にはなる。 ob_start(); try { // 例
昔、こんな記事を書いたことがあるのですが、 PHPで高速オシャレな配列操作を求めて - Qiita やっぱりforeachを書きまくってて疲れてきたので、コレクションライブラリとして仕立てました。 spindle/spindle-collection: The fastest php collection library ※割とAPIに悩んでいるので、まだしばらくは0.X系にしておくつもり。0.0.2までは無かったことにして下さい。 使い方 <?php require 'vendor/autoload.php'; use Spindle\Collection\Collection; (new Collection(range(1, 100)) ->filter('$_ % 10 === 0') ->map('$_ * 2') ->assignTo($collection); echo $c
PHPのHTTPクライアントライブラリであるところのGuzzleは、実際にHTTPリクエストを行う部分をハンドラと称して切り離せるようにしており、ここを差し替えることでモックを作ることができます。 テストのときに実際のAPIサーバーへリクエストを投げなくても、思った通りのレスポンスを受け取ったことにして、コードを実行することができます。 Guzzle公式のMockHandler Guzzleには標準でMockHandlerなるテスト用のハンドラが付属します。 http://docs.guzzlephp.org/en/latest/testing.html#mock-handler use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr
docker本体にオプションとして組み込まれてたの知らなかった… コンテナ内で素直にtmpfsをmountしようとすると、権限の調整が必要でちょっと面倒。 docker runなど https://docs.docker.com/engine/reference/commandline/run/ http://docs.docker.jp/engine/reference/commandline/run.html#tmpfs-tmpfs (日本語訳) tmpfsオプションがある
PHPのSPL系組み込み例外は全部で13個あるんですが、正直、使い分けがよく分かりませんでした。公式ヘルプを見ても、わかったような、わからんような。。 (全部うしろにExceptionって付くので省略してます) Logic系 BadFunctionCall BadMethodCall Domain InvalidArgument Length OutOfRange Runtime系 OutOfBounds Overflow Underflow Range UnexpectedValue 名前の似ているOutOfRangeとOutOfBoundsが全然違うって辺りが罠。 どういうときに使われるのかをPHP本体のソースコードからgrepしてみます。 そもそも、SPLというオブジェクト指向のライブラリを作る上で導入されたのがSPLの例外だったはずだから、本家の使い分けが一番信用に足るはず。。 ソ
すげー便利そうに見えて、微妙に使いづらい子だな…という印象。(言いたいこと終わり) https://phpunit.de/manual/current/ja/appendixes.assertions.html 配列のアサーションの問題 例えば、ある関数の実行結果がこういう感じの配列をだとしよう。 [ [ 'name' => 'taro', 'gender' => 'male', 'updated' => '2015-08-10 12:01:13', ], [ 'name' => 'hanako', 'gender' => 'female', 'updated' => '2016-07-31 13:04:14', ], ]; 関数のテストを書くなら、↑の配列をexpectとして用意して、結果をassertEqualsで比較すればいい。 ところが、別に全部の要素を厳密に比較しなくてもいいこと
意外と知られていないような気がしたので。 普通にタイプヒントを書くと、nullを許可しない設定になる。
final や public の順番は、ひっくり返しても別に動作するのだけど、なんとなく順番を決めたほうが気持ちが良いもの。調べてたらPHPとJavaで作法が違ったのでメモ。 PSR-2が実質上の標準。 http://www.php-fig.org/psr/psr-2/ Visibility MUST be declared on all properties and methods; abstract and final MUST be declared before the visibility; static MUST be declared after the visibility. abstract / final (あれば) visibility (private / protected / public) 常に書く static (あれば) PHPは他に修飾子がないので、3つ
composer-pluginの一種なんだけど、ちょっと面白いなと思った。 インストール(グローバルでもいいし、パッケージローカルでもOK)すると、composerのサブコマンドに、qa:から始まるものが色々生える。 webysther/composer-plugin-qa 自体は、特に何かをrequireしているわけではなく、このサブコマンドを生やすという機能単体で実装されている。 composer qa:testがPHPUnitに対応していて、ローカルにインストールされた vendor/bin/phpunit と同等の意味になる。 他にもphpcbf, phpcsなどのツールも、composerのサブコマンドから叩ける用にしてくれる。 vendor/bin/phpunitの代替手段 - Qiita scriptsで頑張ってcomposer testなどのサブコマンドを生やしている人も多
PHPUnitのデータプロバイダという機能について、自分なりにまとめます。 データプロバイダとは何か PHPUnitで、複数のテストパターンを書くことはよくあります。この時、似たようなアサーションを何度も書くことになります。 例えば… 足し算するだけの関数をテストするとして、
<?php define('HOGE', 'hoge'); const FUGA = 'fuga'; 見て分かる通り、defineは関数であるのに対しconstは関数ではないのでconstの方が高速に処理される。 大量に定数定義したいならconstを使う方が望ましい。 その昔「定数定義を高速に行う」というためだけの関数がいくつか存在していたが、いずれも拡張モジュールのメンテナンスが止まっているようなので、今やるならconst書き換えが現実的なチューニング法なんじゃないかな。 http://php.net/manual/ja/function.apc-define-constants.php https://pecl.php.net/package/hidef defineでしかできないこと defineは関数なので、引数には式であれば何でも書くことができる。関数の実行結果を書いてもOK。
Prophecyとは phpspec/prophecy PHPUnitと組み合わせて使えるモックライブラリ。 元はphpspecの一部として開発されたもので、phpspecと組み合わせなくても単独で使うことができる。 PHPUnit 4.5からパッケージに同梱されるようになった。PHPUnitの新しいバージョンを使っていれば、composer.jsonに加えなくても使うことができる。 テストダブルとは ユニットテストを書くときに、テスト対象の依存の代替として使うオブジェクトをテストダブルと言う。目的はいくつかある。 依存オブジェクトの準備を手抜きする。100行の準備をしないとテストが書けないとしたらユニットテストが読みにくくなってしまう。 実行しづらいメソッドを差し替える。外部へ通信してしまうもの、I/Oが発生するもの、すごーくたまにしか失敗しないものなどを強制的に変更したいとき。 メソッ
しかしコマンドが長くなるし、イマイチ格好良くない。 そもそも、vendor/binはcomposerの設定によって変更可能であり、ハードコードするのも行儀が悪い。 $(composer config bin-dir)/phpunit vendor/binのハードコードをなくすとしたら、こう書ける。しかし大変ダサい…。vendor/binよりもタイプ数増えてるし。
PHPには大量の配列操作関数が用意されています。 これらの関数、イマイチ書き味が悪いということで、よくPHPがDISられるポイントになっています。 お題として、こんな感じのコードを書きたいとしましょう。(意味は特にないです) 0~10000のうち、偶数だけを抽出して自乗し、結果が20を超えるものを足しあわせよ array_xxx系の関数だけで入れ子にしながら書くとこんなことになります。 echo array_sum( array_filter( array_map( function ($v) { return $v ** 2; }, array_filter(range(0, 10000), function ($v) { return $v % 2 === 0; }) ), function ($v) { return $v > 20; } ) ); 読めたもんじゃないですね。 関数の
.phpdbginitという名前のファイルをカレントディレクトリに置いておくと、phpdbg起動時に読み取って勝手に設定してくれる。 ブレークポイントの設定 (break 関数名)などを書くのが定番だけど、関数を作ってregisterしておくこともできて、適当にbtっていうスタックトレースを表示する関数を作ってみた。 こんな風に <: 〜 :>でくくった部分はPHPとして実行され、関数の登録ができる。 <: function bt() { $bt = debug_backtrace(); foreach ($bt as $i => $trace) { echo "$i => "; if (isset($trace['class'])) { echo "\033[36m$trace[class]\033[m$trace[type]"; } echo "\033[32m$trace[funct
途中で気づいたけど y_utiさんの記事にめっちゃ詳しく書いてあったから、皆こっちを読むといいよ! php-build をカスタマイズして使う - y_uti のブログ ここから元の文章↓ php-buildは単独でインストールすることもできる。 phpenvやphpbrewの雑な比較 - Qiita phpenvとrbenvの競合で消耗した記憶から、phpenvは入れなくてもいいんじゃないかって気になった。というわけで単独でセットアップする方法についてまとめる。 インストール php-buildはPHPの新しいバージョンがリリースされる度にアップデートが走る。そのためgit pullを頻繁にできたほうが良い。 私はhomeをpeco+ghqの標準的なディレクトリ構成にしているので、素直にその構成に従ってgit cloneする。
任意の文字列が与えられた時、先頭が"abc"であることを判定したい。 いろいろ書き方があると思うが、どう書くのが良いのか。 「文字列が含まれているか」を判定するときはstrposを使うのが最速だと知られている。 strposは最初にneedleが現れた位置を数字で返し、見つからなければfalseを返す。 if (false !== strpos($haystack, $needle)) { echo "$needle が $haystack の中に含まれています"; }
Composerのリポジトリは簡単な認証であれば設定できるようになっている。基本的に$(composer config -g cache-dir)/auth.jsonに記載していくが、configコマンドでも設定が可能。 すべてドメインごとに設定できる。 Basic認証 なんかconfigコマンドに渡すhttp-basic.という部分がドメインの一部っぽく見えるが関係なくて、http-basic.まではJSON記法、それ以降がドメインを指す。(http-basic[example.com]みたいな記法だったら分かりやすかったのに。。) たとえばexample.comに対してユーザー名:aribaba パスワード:opensesameが必要だったとしたらこんな感じ。 # set $ composer config -g http-basic.example.com aribaba opens
次のページ
このページを最初にブックマークしてみませんか?
『@Hirakuのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く