gorogoroyasu

福岡の開発会社で働いている。

iPhone の充電ができないときに調べるべきただ一つのこと

ここ2ヶ月ぐらいずっと、iPhone の調子がおかしかった。
これは、ライトニングケーブルが断線してるな。
勘のいいボクはすぐに気づいた。

最近買った、Magic Trackpad 2 付属のライトニングケーブルを使ってみた。
そのときはうまく充電できた。
しかし、その能力も長くは続かなかった。

それからは、iPhone を省電力モードにして、だましだまし使ってきた。
電池の色が黄色いのがデフォルトだった。
いつも、何度かケーブルを抜き差しして、ちょうどよい角度を探していた。

そして、先週の週末、夜、充電できなくなった。

充電は残り3%。
絶体絶命だ。
このまま電池が切れ、二度と充電できない状況になったら、
二段階認証 が一切できなくなる。
念の為、Google の 二段階認証 は解除した。
Authy に移行していなかった自分に腹が立つ。
また、最近 Google Photos にアップロードしていない写真たちも消滅する。
LINE も移行しなければならない。
ボクは iPhone に頼りすぎていたことに気づいた。
そして、バックアップの重要性を思い出した。

時刻は21:05。
Apple Store はすでにしまっている。
ボクは絶望に暮れた。
念の為、ビッグカメラの営業時間を調べた。
こちらも21:00 まで。
終わった。 そう思った。
しかし、次の瞬間、ボクの脳裏に、ひらめきが走った。

ヨドバシカメラApple 製品おいてるゾーンあるよな。
時間を確認する。すると、22:00 まで開いている。
自宅からヨドバシカメラまで、チャリで15分。
余裕で間に合う。

勢いで直行した。修理できない可能性はあるが仕方ない。
最悪iPhone8 を買って帰ろう。 と心の中で決めていた。

ヨドバシカメラでの体験は、最悪だった。
修理ができないのは仕方ない。
しかし、あんなに広いスペースを使って製品を展示いるにもかかわらず、販売すらしていないのだ。

値段を聞いたら、「展示してあるiPhoneApple.co.jp にアクセスすれば見れますよ」 と言われた。
そんな事も知らないんですか? 的なテンションで。

知っとるがな!w

泣く泣くヨドバシカメラを立ち去り、家路についた。
クロアチアが勝つかフランスが勝つか よりもiPhone の充電のほうが気になった。

なんとか充電してください!!!

藁にもすがる思いで何度もコネクタを抜き差しした。
しかし、何もおこらない。

ポケモンを捕まえるときに、 A B ボタンを連打したら捕まえやすくなる みたいな噂があったが、あれと同じぐらい無駄なことをしていると感じた。
ちなみに、ポケモンに関して言うと、ホウオウをモンスターボールでゲットしたことがあることを思い出した。

話を戻す。

数十分の格闘の末、iPhone が震えた。
その角度をキープしつつ、フル充電した。

次の日、起きてすぐ Apple Store に向かった。
予約せずに行ったので、予約してないやつらが並ばされる長い列の最後尾に追加された。
暇そうにしている店員に腹が立つ。

しかし、もうすぐiPhone を修理できる。
そう信じて並んだ。
並び続けた。

30分ぐらいして自分の番がきた。

店員に言った。 「充電ができなくなりました。交換だと思います。」
3秒ぐらいiPhone を見回した店員は、言った。 「あー、Dock に誇り溜まってますねー」

そして、ホコリを取り除いてくれた。 結局、原因はDock のホコリだった。

ボクのiPhone は、生き返ったかのように充電できるようになった。

TensorFlow の ObjectDetection API を Fine Tuning する

TensorFlow には、Object Detection を行うためのコードが用意されています。
今回は、TensorFlow 1.8.0 でObject Detection を行ってみました。

github.com

実行した環境は以下の通り。

Ubuntu 16.04 に Mac Book Pro から ssh で接続
nvidia-docker: 18.03.1-ce
CUDA: 9
cudnn: 7
tensorflow-gpu: 1.8.0

参考にしたもの

自分は、以下の動画を見ながらどのように行えばよいかを学びました。
非常に丁寧に説明されているので、おすすめです。
ただ、問題は解説がWindows 向けにされていること。
なので、今回は Ubuntu でどのようにやればよいかを書いていきたいと思います。

www.youtube.com

準備

実行するソースコードの準備

上記の環境の任意のディレクトリに、 github.com をclone します。

cd /path/to/dir
git clone https://github.com/tensorflow/models

また、先程の動画の作者の方が作られたレポジトリがあるので、そのコードをclone します。

git clone https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10.git

その後、TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 ディレクトリの中身を
models/research/object_detection にコピーします。

rm -r models/research/object_detection/doc
rm -r models/research/object_detection/images
rm -r models/research/object_detection/inference_graph
rm -r models/research/object_detection/training
cp TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/* models/research/object_detection/

環境の整備

protobuf の準備をします。

apt-get install protobuf-compiler

を行い。 protobuf をインストールした後、

cd path/to/dir
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools ../../models/research/
cd models/research
protoc object_detection/protos/*.proto --python_out=.

というコマンドを実行します。 これらのコマンドは、
models/installation.md at master · tensorflow/models · GitHub に載っています。

ラベルの準備

次に、ラベルの準備を行います。 自分は、MacApp Store から¥240 で購入できます。
とても使い勝手がいいのでおすすめです!

RectLabel for object detection

RectLabel for object detection

  • Ryo Kawamura
  • 開発ツール
  • ¥240

RectLabel を使ってラベルをつけていきます。

他にも labelbox.com というツールが有るようで、動画ではこちらを使っています。

こんな感じでラベルをつけていきます。

f:id:adiboy:20180713152914p:plain

ラベルの作成が終わったら、 Ubuntu 上、 /path/to/dir/models/research/object_detection/images に画像をコピーします。
その後、 cd /path/to/dir/models/research/object_detection/images && mv annotations/* ./ && rm -r annotations && mkdir test train を実行します。

動画内で、学習データは200枚以上必要と言っていたので、
頑張ってラベリングしてくださいw

また、画像のサイズは、720x1280 以下にすることが推奨されるようです。

これらが終わったら、適当に jpg と xml のペアを
train, もしくはtest に振り分けていきます。

/path/to/dir/models/research/object_detection/images にて、

import glob, shutil
import numpy as np

xmls = glob.glob('*.xml')
assert len(xmls) > 200

train = np.random.choice(xmls, 200, replace=False)

for xml in xmls:
    name = xml[-4:]
    if xml in train:
        shutil.move(xml, 'train/{}'.format(xml))
        shutil.move('{}.JPG'.format(name), 'train/{}.JPG'.format(name))
    else:
        shutil.move(xml, 'test/{}'.format(xml))
        shutil.move('{}.JPG'.format(name), 'test/{}.JPG'.format(name))

みたいなコードを実行して、適当にディレクトリを振り分けていきます。
上記のコードは、実際に動かしたわけではないので、動作保証はしません。

これで、ラベルの準備は完了です。

fine tuning する対象の重み

今回は、Faster R-CNN をファインチューニングしていこうと思います。
事前に学習された重みは、下記サイトに掲載されているので、

github.com

cd /path/to/dir/models/research/object_detection/
wget http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz
tar -zxvf faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

というふうに、ダウンロードして解凍します。

その後、

cp samples/configs/faster_rcnn_inception_v2_pets.config training
cp data/pet_label_map.pbtxt training/label_map.pbtxt

とし、これらの中身を編集していきます。

training/label_map.pbtxt の中には、アイテムのID と名前を書きます。

item {
  id: 1
  name: 'madatsubomi'
}

item {
  id: 2
  name: 'otachi'
}

item {
  id: 3
  name: 'pijotto'
}

faster_rcnn_inception_v2_pets.config は少し修正箇所が多いのですが、

# 10行目
num_classes を自分が学習させたいラベルの数に書き換える
# 107行目
fine_tune_checkpoint を /path/to/dir/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt に書き換える
# 122 行目
input_path を、 /path/to/dir/models/research/object_detection/train.record に書き換える (未作成)
#124 行目
label_map_path を /path/to/dir/models/research/object_detection/training/label_map.pbtxt に書き換える
#128行目
num_examples を テストデータの数に書き換える
#236行目
input_path を、/path/to/dir/models/research/object_detection/test.record に書き換える (未作成)
#238行目
label_map_path を /path/to/dir/models/research/object_detection/training/label_map.pbtxt に書き換える

これらの操作により、設定は完了です。

TensorFlow が読み出すデータの作成

generate_tfrecord.py というファイルを編集します。
編集するのは、class_text_to_int という関数の中身です。
この関数の中身を、自分のデータセットと training/label_map.pbtxt に書いた内容を見比べながら編集していきます。

def class_text_to_int(row_label):
    if row_label == 'madatsubomi':
        return 1
    elif row_label == 'otachi':
        return 2
    elif row_label == 'pijotto':
        return 3
    else:
        None

その後、train.record, test.record というファイルを作成していきます。

cd /path/to/dir/models/research/object_detection/
python xml_to_csv.py
python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
python generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record

これで、TensorFlow が学習時に読み出すデータが作成できました。

学習の実行

学習を実行します。

cd /path/to/dir/models/research/object_detection/ 
nohup python -u  train.py --logtostderr --train_dir=training \
--pipeline_config_path=training/faster_rcnn_inception_v2_coco.config \
> success.log 2> error.log &

これで、学習が開始されます。
学習の経過を見たい場合は、 tailf error.log を見てみてください。
(なぜ success.log ではなく error.log の方に吐かれるのかは不明)

loss の平均値が 0.05 を下回るようになったら学習完了らしいです。 (動画で言っていた。)

出力

では、出力を確認してみましょう。
出力の確認には、 export_inference_graph.py というファイルを利用します。

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_coco.config \
--trained_checkpoint_prefix training/model.ckpt-X --output_directory inference_graph #ただし X は、 training/model.ckpt-X となっているX の値

その後、 Object_detection_image.py の中の IMAGE_NAME を変更し、

python Object_detection_image.py

を実行します。

そうすると、NN が元画像に box を上書きした画像を出力してくれます。

なにか問題点があったら教えてください。

以上。

PyCon Kyushu 2018 実行してきた

2018 年の前半最後となる6/30 に、
LINE Fukuoka さんの会場をお借りしてPyConKyushu 2018 を開催してきました。

なんか、発言が上からですいません。 でも、本当に開催してきたんです。

今回は、登壇者・参加者としての参加ではなく、
実行委員として関わってきました。

きっかけは、去年の秋に福岡で Python Boot Camp in Fukuoka が開催されたことでした。
その懇親会で、@yk さんと @kiyotamanさんと PyCon を福岡で開けたらいいねー みたいな話で盛り上がりました。

ただ、今年はPHPカンファレンス福岡のスタッフに参加しようと思っていたので、 6月頃開催しようと思っている と言われたとき、どうしようか揺らぎました。
揺らいだ理由は、弊社からPHPカンファレンス福岡に登壇する人間は多いのに、
スタッフをする人間が少ないからでした。
しかし、PHPカンファレンスは、何年も実行してきた経験がある団体。
僕一人がいなくてもなんとかなるだろう。
そんな思いで、PyCon Kyushu の実行委員に参加しました。
来年は、PHPカンファレンスのスタッフをやらせていただきたいと思います!

PyFukuoka を主催されている @yujikawa_py さんと @tsurubee3 さんのちからが凄まじく、
すごい勢いでスタッフが増えていったのを覚えています。

スタッフは、

  • 企画
  • 会場
  • 事務
  • 広報

に分類されました。

自分は、広報のしごとをしていました。

多分、一番何をしているかわからないと思われていたんじゃないかなと思いますw

自分の主な仕事は、公式Webサイト の更新と Twitter業でした。
仕事でWeb を触ることはありますが、HTML はあまり触らないので、
新鮮さを感じたりしていました。

Webサイトの感想とかTwitterの感想とかもお待ちしています。

そんなこんなで迎えた当日、他の班の方々が慌ただしくしている中、
自分はずっとPCに向かっていました。
なんか、申し訳ない気持ちでいっぱいでした。

あまり皆さんの発表を見ることができなかったため、
後ほどビデオで復習しようと思います。
質問があったら Twitter などでメンションを飛ばすかもしれません。
その際は、めんどくさくてもニコニコと答えてくださると嬉しいです。

2次回へは行かずに帰っちゃいましたが、
懇親会で @terapyon さんとかとお話できて楽しかったです!

来年は沖縄!
完全に参加者として楽しませていただくつもりです!
楽しみにしています!!!よろしくおねがいします!!!

PHPカンファレンス福岡で平成最後のLTをしてきた!

先日、 2018/06/16 に開催された PHPカンファレンス福岡にて、
5分間のLTスピーカーとして登壇させていただきました。

phpcon.fukuoka.jp

運のいいことに(?)、 LT順が最後!
つまり、来年の4/30 までにPHPカンファレンス福岡2019 が開催されなければ、
平成最後のLTスピーカーということになります。

例年通りだと、PHPカンファレンス福岡は 6月開催なので大丈夫なはず!
ですよね?次期委員長

ということで、簡単に、登壇内容について書かせていただきます。
(スライド上げないので。)

発表内容

タイトル: PHPerが1年間機械学習勉強した
内容:
- TensorFlow というライブラリの紹介
- 機械学習界隈では、驚くような勢いで論文が出ているということの紹介
- TensorFlow.js の紹介 (<- 一番大事!)
- デモ(Reptile)
- デモ(PoseNet)

という流れでした。

デモに関しては、

blog.openai.com

と、

PoseNet - Camera Feed Demo

という2つのWebサイトのものを使わせていただきました。

Reptile に関しては、少しカスタマイズしたものを

github.com

においてます。
まだjQuery 使ってるの? みたいなツッコミお待ちしてます悲

以上が発表内容でした。
ちなみに、応募するときに、 - 45分 - 30分 - 15分 - LT みたいなのを選択する枠(複数選択可)があるのですが、
今回自分は 30 分と 15分と LTにチェックを付けました。
そしたら、ギリギリ LT に滑り込めました。
念の為LTにチェックを付けておくのおすすめです! (これは、 ペパボの @k1LoW さんから習った)

以降、スピーカー・スポンサー・スタッフの前夜祭からFusicという会社で開催されたAfter Hack までの様子を
ちらほら書いていきます。

スピーカー・スポンサー・スタッフの前夜祭

前夜祭

料理がとても美味しかったり、
普段からお付き合いさせていただいている会社の方とじっくり話せたりして、
とても楽しかったです。

エールズ

2次会はいつもどおりエールズでした。
東京でお世話になった方たちにいっぱい会えたり
@youukkariさんからメルチャリ便利話を聞いたりして
大満足でした!
近い内にマグロ食べに行きましょう!

とても楽しい前夜祭でしたが、
特に初めてお会いした方とあまり話せなかった印象です。
自分が人見知りだからでしょうが。。。
ぜひ、積極的に声かけてください!w

一番の成果は、@tanakahisateru さんと初めてお話したことです。たぶん。
全く話したことないのに気軽に話しかけてすいませんでした。

その後、 @kis さんに連れられてもぐおれに行く人々を見送って、
F社の人だけで3次会したのは内緒です。
まー、そこそこ、いや、とても熱い話ができたのでそれはそれで楽しかったです。

当日

当日は、少し遅れて会場入りしました。
実は会社にPC等を置いていたので、
メルチャリで会社に出社して地下鉄でFFG入りというプランを立てていました。
が!!!
残念ながらメルチャリと自分の相性が悪く乗ることができませんでした。

会場についてからは、ブースの方回ったり、色々おしゃべりしたりしていました。
最初のセッション見逃したのは内緒です。

skaffold を使って Kubernetes してみた

見に行きました。
k8s を全く使ったことがなかったのでところどころ難しかったです。
が、Ask The Speaker で聞きに行って、
なんとなく概要を理解することができました。
ATS でディスカッションしたことを先週会社で試してみたのですが、
今の自分達の用途にはうまくマッチしなさそうだったのが少し残念でした。

【プラチナスポンサーセッション】Fusic n本の矢 〜生きた集合知の作り方〜

土星が盛り上がってた印象でした。

【ゴールドスポンサーセッション】「未経験からの挑戦!超速ネイティブアプリ開発

知見がない中、Dartで記述する Flutter というフレームワークを使ってネイティブアプリを開発した話でした。
主な感想は、
- チャレンジャー精神半端ない
- PHP関係ない
でした。
とてもおもしろかったです!

昼休み

天下一品に行きました。
美味しかったです。
あと、ヨーギラス捕まえてました。
進化させるのを忘れてたのだけが心残りです。。。。

SOLIDの原則ってどんなふうに使うの?オープン・クローズドの原則編 拡大版

とても丁寧な解説で、わかりやすかったです!
自分は圧倒的に後輩くん立ち位置なので、
あんな感じの良い質問して先輩を困らせていこうと思いました!w

裏になっちゃった "Event Sourcing, CQRS For PHP" もとても聴きたかったです。
ビデオ上がるの楽しみにしていますw

【プラチナスポンサーセッション】ロリポップ!マネージドクラウドを支えるコンテナ技術のすべて

実はこの発表見てないんですよ。
ただ、僕にとって重大な発表でした。
なぜなら、
自分がやるデモを ロリポップ!マネージドクラウド からホスティングすることを思いついたから!
この発表を聞かなかったら思いついていなかっただろうし、
これより後で思いついても時間の関係で無理だったと思うので、
助かりました!!

Phoenix + Reactで社内システムを密かに作ってる

難しい話でした。
ただ、登壇者の方が淡々と語ってたのが面白かったです。
あと、登壇者の方の左胸に sigfy シールが貼ってあったのが印象的でした。

PHPerのためのよくわかるCPU脆弱性解説

PHP語で語られていたのでわかりやすかったです。 あと、おまけコーナーの CPU の話とかが面白かったです!
ちょっと勉強してみたくなりました!

ちなみに、裏では @rina さんがやらかしてたらしいので、
そのセッションも見たかったです ><
動画上がりますように!w

LT

LT は、"社内SEは(VBAを投げ捨てて)PHPの夢を見るか?初級 - For Beginner" が全てだったように思います。
自分も職を失ったり投げ捨てたりしたらLTするので、そのときは拾ってください泣

懇親会

LT で機械学習の話をしたら、本職の方から声をかけていただきました。
少し業務形態は違いますが、だいぶすごい業務をされていました。
先日あった DLL 1周年記念行事のときに探したけど、見つけられませんでした。
また機会があったらお会いしましょう!

あと、加賀澤さんの悔しそうな顔が脳裏から離れませんw
ちなみに、加賀澤さんの周りで話してた マイクロソフト社の話、めっちゃ面白かったです!

2次会

中洲ハイボールに行きました。
そうだいさんやP山さん、うずらさんとお話しました。
P山さんはじつは去年もお会いしたんだけど、おそらく覚えられてなかったからお話できて嬉しかったです。
そうだいさんは、怖い人かと思ってたけど、あまり怖い人ではなかったです。

エールズ

その後、エールズに行きました。
エールズでの衝撃は、@yui_tang さんとお会いしたことでした。
会ってそうそう当日朝のメルチャリの不満ぶちまけたりしてすいませんでした。
色々なお話が聞けて超楽しかったです。

ラーメン

エールズでうんちしてたらほとんど人がいなくなっていました悲
同じく置いていかれた@hamaco @ichikawa_0829 前田さん(弁護士(嘘)) とラーメン屋を探すたびに出ました。

ここからが大変。
元祖は嫌だとかshinshin は昨日食べたとか言われ海鳴まで歩くも長蛇の列。。。
風び は閉店、大砲ラーメンも閉店と不運が続いて、
結局たどり着いたのは 鳳凛。
4km ぐらい歩いたんじゃないかなー?w

まあでも、一応ご満足いただけたようなので、良かったです。
今思ったけど、一幸舎行けばよかった。

After Hack

11:00 開始だったのに余裕の遅刻を噛ましてしまった。。。
11:30 頃到着。
それから電源ない問題とかをくぐり抜け、ちょっと開発。
@tenkoma さんや @s_kozo さんと CakePHPの話とかしつつ、
皆さんのLT を聞く。

うずらさんの発表では、Swoole という全く聞いたことがない PHP のエクステンションのことを教えてもらいました。
Guzzle との違いとか調べると言っていたので、一応調べました。
ベンチマークとかろくにとったことないので、調べ方が正しいかどうかわかりませんがw

qiita.com

@mao_sum のLT再演なんかもあったりして、超盛り上がりました!
そういや、まだ .phpstorm.meta.php 調べてないので、明日調べます!

そんなこんなで、無事無限ビールを達成して解散。
こうして僕のPHPカンファレンスは無事幕をおろしたのでした。

雑記

以上、僕の PHPカンファレンス福岡 を書かせていただきました。
何文字書いても書ききれないところばかりであります。
お話したのに書けていない方も多くいらっしゃいます。
文句行ってもらえたらラーメン奢るので許してください。

スタッフの方々、今年も開催していただきありがとうございました!
とても楽しかったです!
嬉しいことに来年の開催が発表されたので、
来年は自分もスタッフとして参加させていただこうと思っている所存であります。
スタッフへの応募方法とかわからないけど、たぶん時期が来たら教えてもらえるはず。。。
その際はよろしくおねがいします!

f:id:adiboy:20180624224503j:plain

宣伝

6/30 に PyCon Kyushu 2018 を LINE Fukuoka さんで開催するので、
暇な人はチケット買ってください!
僕の発表より圧倒的に面白い話が聞けます!
また、Python でWeb やってる人の話とかも聞けます!
おすすめです!
応募は こちら から!

DeepLab V3 をADE20K のデータセットでトレーニングする際にハマったこと

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs を手元で動かしてみました。

実装は、 Tensorflow 公式 に公開されています。

ADE20K のデータセットを使うためのREADME.md はこちら。
github.com

こんな感じで、とても親切にコードとドキュメントを準備いただいているのですが、
一つだけ、致命的ではないですが一つだけ漏れがありました。

それは、

cd /path/to/dataset/ && python build_ade20k_data.py 

を実行すること。
これについての言及が一切ない。

おかげでけっこうハマリました。

ちなみに、

marunouchi-tech.i-studio.co.jp

の記事を参考に VOC2012 のデータセットで試した時は特に問題は置きなかったので、
ADE20K のデータセットを使う時のみ発生する問題なんじゃないかな? と思っています。

実はまだ学習を回せてない(リソースの都合上)ので、正確には解決に至ってはいません。
このやり方で問題なく学習・評価等ができたら、
README 修正のPR でも書こうと思います。

Nim で PHP のExtension を作る

Nim とは?

https://ja.wikipedia.org/wiki/Nim

Nim (旧称はNimrod)とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、   
アンドレアス・ランプフにより設計・開発された。  
Nimは「効率的で表現豊かで優雅」であるように設計されている。  
メタプログラミング、関数型プログラミング、メッセージパッシング、手続き型プログラミング、  
オブジェクト指向プログラミングをサポートしており、 コンパイル時のコード生成、代数的データ型、  
C言語のForeign function interface (FFI)、JavaScriptへのコンパイルなどの機能を提供している。  
Pythonのようなシンプルな構文で書かれるが、C言語並みの高いパフォーマンスを有している。  
Rust、D言語、Goなどの言語としばしば比較される。

らしいです。

公式: https://nim-lang.org/

感想など: https://qiita.com/snowlt23/items/f50ab84afeab9469e422

なぜ Nim なのか?

別に、理由はありません。
http://wolfbash.hateblo.jp/entry/2017/07/30/193412

の記事を見たからです。

今日の昼休みに、 Rust を勉強しようと思って色々見ていたら、
たまたま見つけました。
なんか、早そうだし、やってみるか! ぐらいの勢いです。

Nim のインストールとか

おおよそ、ここを参考にしてインストールしました。
http://howistart.org/posts/nim/1/

koch が何かはよく分かってないですが (たぶんpyenv 的なやつ)、
nimble というやつの設置が簡単でした。 (nimble は、 pipやcomposerと同じ、パッケージマネージャーらしいです。)

環境など

Nim

root@1421f749bd0f:/nim# nim -v

Nim Compiler Version 0.17.2 (2017-09-07) [Linux: amd64]
Copyright (c) 2006-2017 by Andreas Rumpf

Nimble

root@1421f749bd0f:/nim# nimble -v

nimble v0.8.8 compiled at 2018-03-13 13:08:39

PHP

root@1421f749bd0f:/nim# php -v
PHP 7.0.25-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.25-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

その他

ubuntu16.04 の docker 上に環境を構築しました。

PHP の Extension を作る

Extension を作るのは初めてだったので、都合はよく分かっていませんが、
https://github.com/nim-lang/nimble を使うと簡単に作れました (嘘)

とりあえず、上のレポジトリ のREADME をコピペしていきます。
3つファイルを作りました。

その後、コマンドを実行しました。

一応、nimfun.nim ファイルだけ (僅かに) 変更したので貼っておきます。

import nimzend
import math

proc max(a: int, b:int): int =
    if a > b:
        return a
    return b
proc min(a: int, b:int): int =
    if a < b:
        return a
    return b

proc nimFun(a: int, b: int): ZValArray {.phpfunc.} =
  result["add"] = a + b
  result["sub"] = a - b
  result["concat"] = $a & $b
  var arr = zvalArray()
  arr.add a
  arr.add b
  result["array"] = arr

  result["mean"] = (a + b) / 2
  result["max"] = max(a, b)
  result["min"] = min(a, b)
finishExtension("nimfun.so", "0.1")

ハマリどころ

Nimble のインストール

上に貼った記事通りにやるのが良いと思います。
Nim version 0.15.0 以上は、 Nimble が Nim についてきてるとか。
最初はそのへんが全く分からず闇の中にいました。

PHP のインストール

以外なことに (?) PHP のインストールにハマリました。
apt install php ではなく、apt install php-dev を行う必要があります。

実行結果

とりあえず、実行結果貼ります。

root@1421f749bd0f:/nim# php test.php
Array
(
    [add] => 220
    [sub] => -20
    [concat] => 100120
    [array] => Array
        (
            [0] => 100
            [1] => 120
        )

    [mean] => 110
    [max] => 120
    [min] => 100
)

わお!PHP の配列として扱えてる!

ということで、もう少しNim で遊んでみようと思います。 (情報少ない)

Fusic Advent Calendar 2017 社内で行っているPandas等の勉強会の話

Fusic Advent Calendar 2017 記念すべき1日目の記事です。
昨年は、2日目に甘んじてしまいましたが、
今年は、初っ端からハードルを下げていく感じで行きたいと思います。

qiita.com

概要説明

最近、機械学習が大流行中ということで、
自分もついていこうと、踏ん張っています。

自分は、Deep Learning しか触っていないのですが、
それ以外の方法も、色々勉強していきたいと思い、
時間があったら知識をインプットしています。

ただ、機械学習を始めてすぐ、
もちろん手法は大事だけど、データを上手く扱うことも非常に大事だと気づきました。

データ扱うの難しい。。
pandas とか numpy とか、仲良くなったらいいんでしょうけど、
なかなかとっつきづらい。。。
あと、可視化重要。
可視化しないと、どんなデータかは基本分からない。。。

ということで、社内の興味ある人を集めて、
計4回の勉強会を開催しました。

今日は、 他に書くこともないし時間もないので どんな型式で、どのように勉強会を進めたかを書いていきます。

どんな勉強会?

事前にpandas, numpy 等を使った問題を出し、
週に1回1時間、皆で回答を解説をするという勉強会です。
問題の作成に1~2 時間、 回答に 1~2 時間かかるぐらいのボリュームになればいいなと思ってはじめました。

環境

環境構築の手間が省けるよう、
社内サーバーにjupyter notebook を立て、
誰でもアクセスできるようにしました。
参加者の約半数は、自分が用意した jupyter を使ってくれていたと思います。
ちなみに、そのjupyter は、 docker 上で動かしていたので、壊しても安心な感じにしていました。
(バックアップ とってないけどホストにマウントしてる。 ホストが死んだら終わり。)

第一回

第一回は、 numpyと pandas の入門を行いました。
これから始めようという人がいたら、やってみるといいと思います。

問題はこちら。

第一回 (numpy)

# 問題1
正規分布 に従う、10x10 の行列を作成し、ヒストグラムを描画してください。

# 問題2
平均値10, 標準偏差10 1000 個の値のヒストグラム、
平均値50, 標準偏差10 1000 個の値のヒストグラム を1枚の画像として重ねて出力してください。
ただし、各グラフは透過させてください。

# 問題3 
こんな図を書くこと。 (ヒント:np.sin(), np.cos() )  

問題3の図

f:id:adiboy:20171201230324p:plain

第一回 (pandas)

https://grouplens.org/datasets/movielens/1m/ から取得した zip を解凍し、  
rating.csv をpython で読みこんで、  
user_id 1 の人が評価した映画に対してつけた得点の数を円グラフに描画してください。  
(実際は、解凍したものを準備した)  

csv には、
- rating.csv
  user_id    :ユーザーID
  movie_id   : 映画ID
  rating     : 評価 (1 ~ 5)
  timestamp  : 時刻

のデータが入っています。

第二回

https://grouplens.org/datasets/movielens/1m/ から取得した zip を解凍し、  
users.csv, rating.csv, movies.csv を python で読み込んで、  
以下の課題を行ってください。  
csv にはそれぞれ、  
- users.csv
  user_id    : ユーザーID
  gender     : 性別
  age        : 年齢
  occupation : 職業
  zip        : ZIPコード (不明)

- movies.csv
  movie_id   : 映画ID
  title      : タイトル
  genres     : ジャンル

- rating.csv
  user_id    :ユーザーID
  movie_id   : 映画ID
  rating     : 評価 (1 ~ 5)
  timestamp  : 時刻

のデータが入っています。

問題1
最も男女で評価の平均値が分かれた映画の公開年 (title の横に括弧つきで書かれている4桁の数字)は?

問題2
最も男女で評価が分かれた映画 トップ100 について、公開年のヒストグラムを書いてください。

第三回

今回のデータは、実際に使われているサーバーにあったアクセスログです。
実データは、謎の値が入っていたり欠損があったりして、
今まで使っていた加工されたデータより取扱いが難しいです。

が、けっこう面白かったので、ぜひ挑戦してみてください。

問題1
{実際に動かしているApache のアクセスログ} のデータから、
下記の例を示すような条件で ip, datetime, method, code を抽出したDataFrame を作成してください。
なお、datetime カラムには、 datetime 型でデータを入れてください。

例) 0.0.0.0 - - [1/Dec/2017:00:00:00 +0900] "GET / HTTP/1.1" 302 - の場合、

ip: 0.0.0.0
time: 2017-12-01 00:00:00+09:00
method: GET
code: 302
となります。

問題2
method が 'GET' と 'POST' 以外のデータの件数を出力してください。

問題3
上記のDataFrame から、POST と GET の時間毎のアクセス数を表で表し、また、1時間区切りのヒストグラムで重ねて表示してください。  
なお、POST とGETの数の差が大きいので、  
左軸に GET のアクセス数、右軸に POST のアクセス数を記載した、  
2軸グラフが望ましいです。  

第四回 (Confusion Matrix)

問題1

適当に作ったCSV.csv を用いて、confusion matrix を作成してください。  

なお、confusion matrix は、以下の要領で作成することを想定しています。  

confuion matrix の使い方  

適当に作ったCSV.csv の labelカラムと、predict カラムに値が入っている。  
Confusion Matrix は、以下のように作成する。  

||predict 1|redict 0|
|::|::|::|
|label 1| TP|FN|
|label 0| FP|TN|

問題2

適当に作ったCSV.csv より、 accuracy, recall, precision を計算してください。

accuracy = (TP + TN) / (TP + FP + FN + TN)  
recall = TP / (TP + FN)  
precision = TP / (TP + FP)
また、accuracy, recall, precision の意味を調べておいてください。  

問題3

適当に作ったCSV.csv を読み込み、しきい値 0.5 の時のAccuracy を計算してください。  
しきい値が0.5 で、predict が 0.45の時、 predict は 0 と判定されます。  

shikii_chi = 0.5  
answer = 0 if predict >= shikii_chi else 1  
式はこんな感じです。  

上記のような問題を出題しました。
答えは、いつかブログに書きます。(もしくは gist に貼っておきます)
時間がある人は、是非やってみてください。

今後の予定

今は少し休止中 (1ヶ月ぐらい) ですが、
この勉強会自体は継続して行きたいと思います。
上述の通り、今は殆ど機械学習の知識がないので、
この勉強会で、機械学習の手法等のレクチャーもできるようになるといいなと思っています。

実は、問題作成がけっこうめんどくさいので、
こんな問題集的なのあるよ! という人がいたらコメント等でお知らせ頂けたら幸いです。
こんな案件有るよ!? とかでももちろん大丈夫です。

明日は、 @fantasista_21jp が書きます! (といってもあと1時間もない)
ワクワクして待っててくださいませ!!

P.S.

Fusic では、技術が大好きなエンジニアを募集しています。
一緒に、機械学習について勉強しませんか?
いや、機械学習教えてくれませんか?