ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2017年8月8日火曜日

Node.jsでPHPのセッションの復号をあれこれしてた

Node.jsでPHPのセッションを読むというようなことをやっていた。あんまり筋の良いことではないし、当然同じことをやっている人は少なく、一応PHPの直列化した文字列を復号するパッケージは無いわけではないが片手で数えるほどで、大なり小なり問題を抱えていた。

問題の形は様々ではあったけど、躓いている箇所は同じで、みんな文字長を計算する箇所で間違えていた。つまりはこういうことだ。PHPの直列化した文字列はs:文字列長(バイト):"文字列"みたいになっているのだけど、PHP側ではUTF-8で文字列長を計算しているものが、JavaScript側ではUTF-16になっているので、長さを相互に調節しなければいけないということだ。
これは問題としては特に難しくないはずだけど、そもそもマルチバイトの文字列のことが想定されていなかったり、その想定されていない状態から無理に対応をしようとして片手落ちになっていたりした。本来PRでも投げるべきなのだろうけど、いくつかパッケージを試した時点でそもそもこの方法で対応するのは良くないかもと思ってやめたので、備忘録として書いている。

もうちょっと具体的に書いておくと、UTF-8ではUnicodeの符号位置を表すのはアスキーの場合1byte(これは完全にアスキーコードと同じ)、ウムラウト(Äとか)なんかの記号の場合2byte、日本語の標準的な文字の場合3byte、絵文字(🍰)や外字なんかの場合4byteみたいに可変長で文字を表している。これに対してJavaScriptの内部エンコード(これはJavaScriptのソースコードを記述してる文字コードとは関係ない)であるUTF-16の場合、2byteないし4byte(サロゲートペア)で表すことになる。

サロゲートペアの文字列はJavaScript上では二文字のように見える。たとえば、
"🍰".length は2を返すし、"🍰".charCodeAt(0)は55356、"🍰".charCodeAt(1)は57200を返すし、これを前半部・後半部とかだけ切り出してしまうと読めない文字に化けてしまう。

で、PHPで直列化されたものをJavaScript側で読むコードを書くと、サロゲートペア以外は一文字として読んでいくような処理になる。つまり最初の格納種別と、長さを読んで、その後長さ分の文字列を切り出すわけだけど、そのときに読んだ文字がUTF-8で何byteに相当するのかということをまず計算しなくちゃいけない。これは前出のString.charCodeAtとかString.codePointAtで調べれば良い。その上で、更に今読んだ一文字がサロゲートペアなら、その後半部(次の添字の文字)はうまいことスキップするような処理を入れてやればいい。

最終的に私はNode.jsで処理するのをやめて、phpで標準入力から入ってきた直列化文字列をそのままJSONエンコードを通して標準出力するだけの数行のプログラムを書き、Node.jsのプログラムからspawnで呼び出すようにした。あまりまともなやり方ではないかもしれないが、今回の仕事ではそれで十分だった。プログラムに色々な人が居るならば、私は綺麗に溶接してヤスリをかけ塗装するより、ダクトテープでぐるぐる巻きにするタイプであろうと思う。

2017年7月16日日曜日

VSCodeでArduinoのコードを書く

Visual studio codeのArudino拡張がOSS化したというニュースを見た。
OSS化も何も、そんなものあったのか、と思って試してみた。
結論から言うと、結構使いやすいです。使う。

ここ最近は、デフォルトで使ってもそれなりに使いやすいことから、もっぱらVSCodeを使っている。仕事なんかだと、結構あっちやこっちでとりあえずコード書ける状態を作って作業するみたいなことがあるので、ライセンスを気にせずデフォルトでも書きやすいと嬉しい。それから、VSCodeに問題があってもGithubのイシューへの対応も早かったりする。これはよいことです。
で、コード書く環境ってあんまりあれこれ変えたくない。特にArduinoの標準の開発環境は使いやすいとは言いづらい。学習用途だからわざとだったりすんのかもしれないけど、たまにしか書かない言語でインテリセンスとかないと現代っ子はダルい訳です。
そういうことからArduino拡張を使ってみる。

1. 使わなくともArduino IDE入れておく必要があります。

2. インストールは拡張のライブラリから調べるだけなのでアレしてください。

インストールしたらコマンドパレットからArduino initializeとかしたら現在開いているフォルダ下に設定ファイル作ったりメインルーチンのファイル作ってくれたりします。シリアルポート設定したりボードの種別設定してArduino uploadでスケッチをアップロードできます。そしてお前はクソほど文字化けしてる出力を見ることになるんだ!



Arduino IDE自体の設定で言語設定をEnglishにしておけば英語出力になるので、ひとまずの精神の安定は保たれます。だいたいエラーメッセージなんて日本語である必要ないでしょう。MSDNの日本語訳とか英語原文より分かりにくいこと多いだろアレ…。

文字化けしてる原因はVSCodeの出力(ターミナルじゃなくて)がUTF-8じゃないせいだとかどうとかいうイシューがあったけど未対応っぽいので、詳しい人はアレ投げてアレしてもらったら良いんでないですかね。

2017年7月2日日曜日

AWS Cognito user pools使ってみた

JavaScriptのライブラリがJAVAっぽいのと、個人的な印象ではAWSのSDKってたいがいあんまり使いやすい感じなくてこれもそう。使ってる感じだと、同じような認証システムだとFirebaseとかのが使い。とはいえ、現状でAPI Gatewayの認証付きエンドポイントにリクエスト投げるみたいな役割で使いたいのでFirebase使うわけにもいかない。
cloud functionsがベータじゃなくなればGoocle cloud endpoints + cloud functionsとかで代用したほうが色々幸せになれるかもしれない(あまりよく知らない)。
あとそんな感じの用途で使うとIAMの設定が毎回辛い。私はIAMの設定を雰囲気でやっているしARNも雰囲気で把握している。このあたりAWSの制作チームは採用まで含めて完全に機能ごとに独立してるって聞いたのでそのせいなのかなと思うけど、毎度ARNが書いている位置が違ったり、そもそも書いてなくてnameとかから推測したり(多い)、不便極まりない。リソースごとにARN必ず表示するとか表示位置固定するとかやってくれないかなと切に思う。

とか色々文句ばっかり書いているけど、アプリでユーザー登録+パスワード変更とAPI Gatewayのエンドポイント認証させて叩くくらいまでなら一日で出来たので、すげー簡単と言えばすげー簡単かなという気もする。もし今自分が情報システムみたいなものがあまり無い中小企業に転職して、金かけずに一人でユーザー認証とか社内アプリとか作ってくれって言われたら、こんな感じのものを適当に組み合わせて作ると思う。
なんせCognito user poolsなんて普通に社内システムとして使うなら、よほど社員数の多い会社じゃない限りは無料枠で収まる。

2017年6月28日水曜日

pHAT三種買った

PimoroniからpHATを三種買った。


pHATというのはPimoroniが作っているRaspberryPi用の拡張ボードで今回買ったのはRaspberry Pi Zeroのサイズにぴったりのもの。装着するとちょうどRpiZeroのボードと同じサイズで重なるような感じ。

買ったのはスピーカー拡張のSperker pHATと、LEDマトリクスのScroll pHAT HD、カラーLEDマトリクスのUnicorn pHAT。どのモジュールもPythonのライブラリが公開されていて、ちょこっと使うなら簡単そう。

Pimoroniは送料も安くて、届くのも一週間程度なので使いやすいです。
スイッチサイエンスで買ってもそこまでの値段の差がないので、ケチらないならそっちでも良いかもしれない。

2017年6月13日火曜日

がんばらない

仕事でプログラムを書くとき、ややこしかったり、大きくなりそうな箇所に差し掛かると、とにかく「ゆっくりやる、ゆっくりやる、がんばらない、がんばらない」と念じて書いてる。そうすると集中力の途切れるまでの時間が多少は伸びる。ゆっくりやろうと思ったところで、さほど手の速度が落ちるわけでもないし、トータル早いし楽になる。そんな気がする。ライフハック。