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

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

アメッシュでECONNRESETを食らっててslackbotが死んでた件

おはようございます。次男の保護者会に行けずに、個別に面談する予定でしたが、電車の人身事故で保育園のお迎え時間もぎりぎりになり面談はなくなり、資料をもらうだけになりました。まぁ次男はうまいことやってることが予想されるのであんまり気にしてません。kjunichiです。

背景

気づいたら、botkitで作ってHerokuにあげていたslackbotが死んでました

調査

このbotは「雨どう」と尋ねると、東京アメッシュの画像を張り付ける機能があり、 ここでエラーが起き、node.jsが死んでました。

原因

エラーの原因は、アメッシュからJPEGファイルを取得する際なぜか、通信途中でECONNRESETがかかり、 JPEGファイルの一部が欠落した状態でした。

2017-02-09T22:20:00.602972+00:00 app[web.1]: http://tokyo-ame.jwa.or.jp/mesh/000/201702100715.gif
2017-02-09T22:20:01.290589+00:00 app[web.1]: { Error: read ECONNRESET
2017-02-09T22:20:01.290599+00:00 app[web.1]:     at exports._errnoException (util.js:1026:11)
2017-02-09T22:20:01.290600+00:00 app[web.1]:     at TCP.onread (net.js:569:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
2017-02-09T22:20:03.239987+00:00 app[web.1]: Premature end of JPEG file

対策

Node.jsでの定番のハンドリングできなかった例外をキャッチして続行することで、bot自体は 死なないようにできました。

process.on('uncaughtException', function(err) {
            console.log(err);
});

ECONNRESETへの対応

これが謎。 公式のhttp.getの解説だと

getの外でerrorをとらえてはいるが、このやり方だと、今回設定したuncaughtExceptionまでいってしまった。

また、連続して画像を取得するのが悪いのかと思い、各レイヤーごとにウェイトを入れてアクセスしてみたが、 これもダメだった。

関連記事

Tensorflowのclassify_image.pyにElectronでGUIを被せてみた

パソコン・インターネット

こんにちは、最近次男は保育園の帰り道、自分で走って帰るといって聞かず、自宅までの走って帰る日々です。長男も同じような時期にそういうことがあったので、そういうもんなんだと諦めて、次男の走りに付き合ってます。kjunichiです。

GPUを使えるTensorflowをWin,Macに入れたものの

tensorflowを入れたものの、動かし方が、実はよくわからず、Python APIのみの pipで入れても、実はサンプルコードがsite-lib配下にインストールされてることすら 最近まで知りませんでしたw。

classify_image.pyにElectronでGUIをつけてみた。

Linux,Windowsで画像ファイルをドロップすると、classify_image.pyで画像分類できるように してみた。

これで、子供たちと、簡単に画像ファイルを選んで、人工知能にどんな写真かを調べてもらうことが できました。

f:id:kjw_junichi:20170205134019p:plain

pipでいれたTensorflowのサンプルコードのありか

import site
print(site.getsitepackages())

これで、pipでインストールされるインストール先のディレクトリ一覧が取得できる。 環境によって、複数のパスが返されるので、この中からtensorflowディレクトリを探す。

画像ファイルをドロップして読み込む

大昔、HTML5の修業であれこれ作った

jsdo.it

から持ってきた。

iphoneの写真だとEXIFを考慮する必要ありだった

これまた大昔、

jsdo.it

を作ったが、この知識が役に立った。

Exifでカメラの回転情報を保持しているので、 これ考慮してclassify_image.pyに渡さないと分類結果に影響が出た。

もっとも、オリジナルのJPEGファイルをそのまま、classify_image.pyに渡せばこの辺り、Tensorflow側で 処理してくれたのかもしれないが。。

成果物

github.com

Windowsの場合はConadaのPython3を優先して動かすようにしてます。 その他のプラットフォームではパスに登録されてるPython3を優先して、そこにtensorflowがあれば、 それを使う感じにしてます。

関連記事

WindowsでDocker ToolboxとMSのOpenSSHのサーバーと共存するには

こんばんは、熱の引いた長男ですが、顔やそのほか体のあちこちに発疹が出てきて、週明けは通院が確定のkjunichiです。

背景

だいぶ前からMS公式のOpenSSHでWindowssshdサーバーがたてられることを知っていいたので、 先日、chocolatey経由でやってみたが、どうもDOSの内部コマンド的なdir等は実行できるものの、mirb等の外部コマンドが 使えず、実行してもなにも起こらず、プロンプトが返ってきました。

現状、ほんとにDocker Toolboxsshd的なサービスをインストール時に設定しているのか確証はありませんが、 そのほか気になるソフトもないので、疑っている状況です。

対策

Docker Toolboxは触らず、ChocolateyでいれるOpenSSHのポートを変更することで対応できました。

choco install openssh -params "/SSHServerFeature /SSHServerPort:20022"

変更したポートに別のマシンからsshでログインして、無事mirb等の外部コマンドも使えるようになりました。