var indentation = " "; JSON.stringify(JSON.parse('{"foo": [1, 2], "bar": {"buz": "quz"}}'), null, indentation);
みたいに書くと,
{ "foo": [ 1, 2 ], "bar": { "buz": "quz" } }
という風な整形された文字列が返って来て便利だった
var indentation = " "; JSON.stringify(JSON.parse('{"foo": [1, 2], "bar": {"buz": "quz"}}'), null, indentation);
みたいに書くと,
{ "foo": [ 1, 2 ], "bar": { "buz": "quz" } }
という風な整形された文字列が返って来て便利だった
行ってきたついでに話してきました.
とりあえず先日Perl::Lintが出来たので,その一連の開発で得られた知見に就いてシェアーさせて頂きました.大体スライドに書いてある事をしゃべりました.
発表時は軽い感じで流したんですけど,3番目の「誰でも開発に参加できるようにしておく」というのは割と重要な話題だと思っています.
OSSだとそのライブラリやプロダクトを「利用する為の」ドキュメントは提供されていることは多いですが,「開発の手引きとなるような」ドキュメントはあまり提供されていないように感じていて,そういうのが無いと手がかりなしでソースコードを読む羽目になるので,開発参加に際しての障壁が高くなるのではないかと思います.そういった開発の手引き (ドキュメントであれチュートリアルであれ) や,「ここのソースコード読めば大体雰囲気わかるよ」的な足がかりになる部分へのポインターを提供するのは,協調作業をする (したい) 上で重要なのでは無いかと思った次第です.
また「誰でもやれる」と言うのも大切で,新機能を実装したいときにその為のスケルトンを生成してくれるジェネレータスクリプトや,リリースの自動化スクリプトなども提供しておくことで,ある程度規律を保った上で属人的ではなくなる,いわゆる「お願いします脳」みたいなものも排除できて,作業効率や開発への参加しやすさが向上するような気がしています *1.
ここらへんは今年のYAPCのAbigailさんのReleasing perlの発表や,懇親会でid:shiba_yu36さんと話してて気づきを得た点です.感謝.
そしてとにかくPerl::Lintの開発はつらかった.現場からは以上です.
今週金曜日 (10月12日) はテンプレートエンジンNightです!!
多くのテンプレートエンジン関連の発表が目白押しとなっております.
各位におかれましてはふるってご参加いただきたく存じます.
参加可能枠を拡張いたしましたので,「人が多すぎて参加できなさそうだワ!」という方でもご参加頂けるようになったのでは無いかと思います!!!
それでは当日お会いしましょう!
PerlにはBenchmark.pmというお手軽にベンチマークを取るためのライブラリがあって,これがまあ便利なわけです.
そこで,深い事情により最近書いているPHPにもこういうツールがあると便利だろうなーってことで書いたのがこのBenchMarkerになります.
moznion/BenchMarker · GitHub
moznion/benchmarker - Packagist
ノリと勢いでPackagistにもアップロードしましたのでお手軽にご利用いただけます.
使い方ですが,cmpThese()
を例に取ると,
<?php $code = function () use ($foo) { // do something }; $benchmarker = new \Moznion\Benchmarker(); $benchmarker->cmpThese(10000, [ "code A" => function () { // do something }, "code B" => $code, // callableな変数も渡せる ]);
という風に,無名関数を渡してやると,
Rate code A code B code A 22571/s -- -49% code B 44656/s 98% --
という感じで,各々のコードを10000回試行した比較結果がわかりやすい出力されて便利!!! という勢いです.
ほぼほぼPerlのBenchmark.pmからパクってきたので,知ってる人ならサクッと使えるのではないかという感じです.
詳しくはBenchMarkerのドキュメントかBenchmark.pmのドキュメントなんかを参照してくださいませ.
golangでforkってどうやるんだ
— 単位落としました (@moznion) 2014, 9月 14
@moznion できねぇよ
— Daisuke Maki (@lestrrat) 2014, 9月 14
@moznion 外部プロセスの起動、ならできる。
— Daisuke Maki (@lestrrat) 2014, 9月 14
@moznion でもforkしたい、という考え(設計)を改めるのが先です。
— Daisuke Maki (@lestrrat) 2014, 9月 14
@lestrrat なんということだ……
— 単位落としました (@moznion) 2014, 9月 14
forkはできないとのこと
— 単位落としました (@moznion) 2014, 9月 14
考えを改めている
— 単位落としました (@moznion) 2014, 9月 14
特定のgoroutineだけ殺す、みたいなこともできねえのか
— 単位落としました (@moznion) 2014, 9月 14
@moznion おい、わけえの。まず俺のトークスライドをよまねぇか http://t.co/AKyRzwM4Nf
— Daisuke Maki (@lestrrat) 2014, 9月 14
@lestrrat 僕の知りたかったことがほとんど書いていたッ……!! ありがとうございます
— 単位落としました (@moznion) 2014, 9月 14
ということは、特定のgoroutineを終了させる為にはそのgoroutineに応じたメッセージをchannelで送ってやれば良いのか
— 単位落としました (@moznion) 2014, 9月 14
@moznion そうなんだけど、多分そもそもそのgoroutineを外部から殺そうと思っている時点で設計が違う。(多分。もちろん時と場合によるけど、POSIXひきずってるとそれがそもそも間違ってる事が多い)
— Daisuke Maki (@lestrrat) 2014, 9月 14
牧さんに今日だけで3度ほど命を救われている
— 単位落としました (@moznion) 2014, 9月 14
もうだれも買わない可能性が高いすでに5年も前のモダンPerl入門の在庫を買ってくれてもいいんだぜ?>@moznion
— Daisuke Maki (@lestrrat) 2014, 9月 14
欲しがらない
@moznion syscall.Sycall()をsyscall.SYS_FORKで呼ぶって方法もあったような。
— Hayato 光合成 Imai (@hayajo) 2014, 9月 14
@hayajo なるほど、これはマルチプラットフォームでの動作が保障されないって感じですかね?
— 単位落としました (@moznion) 2014, 9月 14
@moznion その通りですね
— Hayato 光合成 Imai (@hayajo) 2014, 9月 14
@moznion ちなみに本当に本当に欲しい場合、無理矢理goroutine IDをとる方法はあります。それに依存したコード書いたらあほだけど。
— Daisuke Maki (@lestrrat) 2014, 9月 14
@moznion BK: http://t.co/cXG3tGf8SA もしこれをmoznionが使ってるコードを見たら削除するPRを即刻送ります
— Daisuke Maki (@lestrrat) 2014, 9月 14
goroutineまわりについてはgoがいくらかけるかではなくて、まず並行処理の勘があるか+CSPのやりかたを理解できるか の二つだけな気がするな。言語覚えてもしょうがなくて、どちらかというと概念的な問題だと思う
— Daisuke Maki (@lestrrat) 2014, 9月 14
CUDAの組み込み関数はほとんどcudaError_t
というエラーコードのenumの値を返してくるので,これを適宜見てエラー処理をする必要があります.最近ではそこまででもないですが,CUDAの組み込み関数はカジュアルにエラーを吐くのでちゃんと見てやらなければならない.
見てやると言っても,CUDAの組み込み関数がエラーを吐いてきたらほとんどの場合そのまま潔く死んで欲しいので (個人の意見),以下の様に戻り値をチェックしてexit()
するというコードを大量に書くことになります.
int *foo; cudaError_t err; err = cudaMalloc((void **)&foo, sizeof(int) * 42); if (err != cudaSuccess) { exit(err); } ...
まあ,素直に書けばええやん! という意見は尤もなのですが,いかんせんこういうエラーチェックが大量に入ると本質的なコードが追いにくくなってつらい.
あとカジュアルにエラーチェックを忘れてしまって,バグッた時にハマる (しかしまあ,これはもうどうしようもない気がしている).golangとかだと,返ってきたerr
が使われてないと「err使われてないよ! (つまりエラー処理してないんじゃねえの!)」と処理系が叱ってくれるからナイスですね.羨ましい.あとgolangは「エラーを受け取っても受け取らなくても良いよ」みたいなものが無いから,そこら辺のコードを規約化出来て良いという印象があります.
さて,そうしたリッチな機構が無い上でどうするかというと,僕は以下の様なマクロを書いてしのいでいます.
でもって,こう書く
int *foo; CUDA_SAFE_CALL( cudaMalloc((void **)&foo, sizeof(int) * 42) );
こうしておくと,CUDA組み込み関数からエラーが吐かれた時にエラーメッセージ・ファイル名・行番号と共に,エラーコードでexit()してくれるのでまあまあ便利.
ちなみにcudaGetErrorString()
っていう関数はcudaError_t
の値をもとにエラーメッセージを引っ張ってきてくれる君です.
しかし,これも野蛮な方法であることには違いないし (なにより,CUDAの組み込み関数がCUDA_SAFE_CALLに渡される事が保証されない),エラーチェックが忘れがちになってしまうという問題については何一つ解決されていません.
現段階では,ちょっとだけコードが見やすくなって便利,くらいの感覚です.
もっと良い方法知ってる人いたら是非教えて下さい.
ページャNightなるイベントが開催されてからはや2ヶ月,
あの「なんとかNight」が帰ってきた!!!!
今回はテンプレートエンジンNightです.その名の通りテンプレートエンジンとその周辺技術専門の勉強会です.
テンプレートエンジン尽くしの2時間となる予定ですので,テンプレートエンジンに興味のある方は是非ふるってご参加下さい.
予定ですと,
といった,たくさんの言語のテンプレートエンジンエンジンの話が聞ける予定です.
めちゃめちゃ楽しみです!!!
よろしくお願いします.