gorogoroyasu

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

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

練習ゼロ体重90kgでもマラソンを走りきった話

マラソンの季節

そろそろ、マラソンの季節ですねー。
福岡でも、福岡マラソンが迫ってきました。
まだ半袖で過ごせる気候なので、今年は辛い戦いになるんじゃないかなー と思っています。

今日は、練習ゼロ、体重90kg でもマラソンを走りきった話をしようかと思います。

一つ、注意です。
このブログの目的はあくまで、
完走することです。
5時間以内に走りたい 等という高い目標は捨ててください。

なぜこの記事を書くの?

理由は、巷に溢れている情報には、練習しないと無理 みたいな情報しかないからです。
いやいや、そりゃ 3 時間で走るのは無理ですよ。
でも、完走ならいけます!
断言できます。
理由は、自分がやったから!
ということで、コツ みたいなことを書いていこうと思います。
時間がない人は、以下のリストだけ読んでください。
詳細は下の方に書きます。

失敗から学んだリスト

  • いい靴を履く
  • トイレには行かない
  • 食べすぎない
  • 飴を持っておく

成功から学んだリスト

  • 鎮痛剤とかいっぱい塗っておく
  • 乳首に絆創膏
  • 朝ごはんはしっかり食べる
  • 携帯とイヤホンを持って行く
  • ペースメーカーの人についていく

その他

  • 完走率は96%以上ということを知っておく

失敗から学んだリスト

いい靴を履く

自分は、2年間ぐらい使ったボロボロの靴を履いていきました (一応ランニングシューズ)
3km ぐらい走ったところで左膝が痛くなりました。
これは、走りきるまでずっと続きました。
いい靴を履いたら痛くならないとは言い切れませんが、
クッション性の高い靴を履くといくらかはましになると思います。

トイレには行かない

これはもう、絶対です。
トイレ行くなら、漏らしたほうがいいと思うレベルです。
自分は20km 手前でトイレの魔力に負けました。
めっちゃ空いてたからついつい。。。
でも、その後足が棒のようになり、走れなくなりました。
特に、 25km 地点以降は、 100m 走って 200m 歩く ような感じになってしまいました。
トイレは、漏らしたほうがいいと思います。
大の方だったら、漏らすのは流石にまずいので、必ず 開始前にトイレに行ってください。

食べすぎない

他のマラソンは分かりませんが、福岡マラソンでは、大量に食べ物が用意されています。
いちごとかトマトとかうどんとか。。。
おいしいのですが、食べ過ぎるとお腹が痛くなります。
自分はうどんが美味しすぎて誘惑に負けてしまいました。
スタッフの方に進められますが、食品を何個も取るのはやめましょう。

飴を持っておく

飴は、とても大事です。
特に、塩味の飴が美味しかったです。
途中で配って下さる人もいますが、自分のペースで食べるためにも自分で持っていくべきでしょう。

成功から学んだリスト

鎮痛剤とかいっぱい塗っておく

当日の朝、痛み止めを飲み、たっぷりと痛みどめを塗り出発しました。
塗ってなかったらどうなってたかは残念ながら検証していないので分かりませんが、
あんだけ塗ったから大丈夫 と、心のどこかで思ってたのを思い出します。
精神安定上、とても大事でした。

乳首に絆創膏

これは、やっといてよかったな と思います。
服にこすれるから。
あるのとないのではぜんぜん違うと思います。
もちろん、絆創膏じゃなくても可ですが、絆創膏が一番入手しやすいかと・・・。

朝ごはんはしっかり食べる

以外かもしれませんが、しっかり食べておいたほうがいいと思います。
理由は、お腹がすくから。
福岡マラソンでは色々な食品を提供してくれますが、
最初の方は果物とかがメインです。
お腹にはあまりたまりません。
お腹が空いて走れなくなるぐらいなら、多少重くなってもいっぱい食べておいたほうがいいと思います。

  • 携帯とイヤホンを持って行く 暇つぶしです。
    去年の今頃はポケモンが流行ってたので、タマゴ孵化させながらマラソン走ってました。
    あと、Runtastic というアプリを使って、自分が何キロ走ったか? を記録していました。

  • ペースメーカーの人についていく 走っていると、 X時間のペース みたいな旗を持った人に出会うと思います。
    その人達についていくと、安定したペースで走れるのでおすすめです。
    僕は、5時間半のペース の人について行っていました。
    15km地点ぐらいでついていけなくなって追いかけるのをやめましたが、
    非常に走りやすかったです。

完走率は96%以上ということを知っておく

大丈夫!ゴールにたどり着けます!!!
www.f-marathon.jp

まとめ

以上が、マラソンを走って得た知見です。
練習してなかったら走れない? -> 大丈夫です。
太ってたら走れない? -> 大丈夫です。
タバコ吸ってたら走れない? -> 大丈夫です。
頑張って完走しましょう!!!

Fukuoka.php Vol.24 で、手書き文字認識のデモをした話

2017/10/21 に、Fusic 社で Fukuoka.php Vol.24 が開催されました。
そこで、 ニューラルネットワークはじめました というタイトルで発表させていただいたので、
発表内容を書いていきます。

なお、発表はデモ型式で行ったため、スライドの公開はしません。
ご了承ください。

発表内容

パート1

機械学習を行うにあたり、
どのようなフレームワーク・データ を利用するのか? という話をしました。

フレームワーク

  1. TensorFlow (Google 製のフレームワーク)
  2. chainer (国産のフレームワーク株式会社Preferred Networks 製)
  3. Theano (2017年末までに v. 1.0 が発表するらしい。詳しくは知らないですごめんなさい)
  4. kears (TensorFlow や Theano など複数のフレームワークをラッパーしてるいいやつ)
  5. caffe (難しい。)
  6. PyTorch (Facebook製? Twitter 見てる感じ、最近流行ってそう)
  7. PHP-ML (PHP製のフレームワーク)

データセット

MNIST (手書き文字データ)
Iris (花の花弁数等のデータ)
CIFAR-10 (画像の10クラス分類)
MovieLens 1M (映画評価データ)

パート2

MNIST のデータセットを使って学習させたネットワークに、実際に手で書いた文字を入れ、
ちゃんと判定できるか? というデモを行いました。
※ こちらのサイトを3項にさせていただきました。
aidiary.hatenablog.com

やったことを列挙していきます。
1. 予め準備したニューラルネット をその場で学習させた
1. iPad Pro の GoodNotes というアプリを使い、 実際に数字を書いた 1. 書いた数字を画像として切り出して、Google Drive に上げた
1. その画像をPC 側から参照し、準備した jupyter notebook にアップロード 1. jupyter 内で画像のパスを指定し、画像を読み込み。
1. その際に、画像サイズを 28 * 28 * 1 にリサイズ
1. 学習した重みを使って、クラスを予測 1. 実際に聴衆の一人に文字を書いてもらい、同じことをもう一度やった

パート3

今回作ったニューラルネット は、 全結合層のみ利用したものだが、
CNNを使うともっと良くなりますよ ということを口頭で説明。
また、今回のニューラルネット は学習がすぐ(5秒程度) 終わったが、
実際はもっと時間がかかるケースがあることを説明 (長いものだと2週間とかかかる的な話。もっとかかるやつもあるだろうけど。)
更に詳しく調べたい人は、 fine tuningでぐぐってくださいと、キーワードを提示

という感じで発表を行いました。

デモを作成するにあたって困ったこと

いくつかハマリポイントがあったが、最も辛かったのは、色の反転に気づけなかったこと。
まじでハマった。
何を言っているかというと、

MNIST の画像は、こんな感じになっている。
f:id:adiboy:20171026194940p:plain

一方、読み取る画像のリサイズ前の状態はこんな感じ。
f:id:adiboy:20171026195035p:plain

これを、28 x 28 x 1 にリサイズ
すると、こんな画像になる。
f:id:adiboy:20171026195228p:plain

そう、白黒が反転している。

これに気づかず結構時間がかかった。
最終的に問題に気づいて、白黒を反転させると
f:id:adiboy:20171026195129p:plain

このような画像ができた。

この画像をニューラルネット に投げると、うまく結果が出力された。

ハマって改めて感じたのは、データを見るのが大事だということ。
ちゃんとデータチェックしましょう。

[豆知識]
白黒反転した画像を入力したときにニューラルネット は、 すべての画像を5 と判定していた。 なぜそうなるのかは分からないが、どんな画像を入れても 5 だった。

iPad Pro はいいぞー

iPad Pro 買った自慢ブログです。
購買欲を上げたい方にはお勧めですが、
節制しようと覚悟している人にはあまりお勧めしません。

ということで、行ってきました。
Apple Store 表参道店。
素敵。

そして、買ってきました。
iPad Pro 10.5 インチと スタイラス Apple Pencil。

カバーは残念ながら、Apple Store にはなかったから、
Amazon で買いました。

カバー。
そんなものを使う日がくるなんて。。。 と、ずっと思ってきました。
もちろん僕のiPhone SE には、カバーなんてものはつけてません。
そして、僕のiPad Air2 にも、カバーなんてものはつけてません。

でも。。でも。。。
カメラが。。。
iPad のカメラとか何に使うか一切わからないけど、
割れたら割れたでかっこ悪い。
そう。カメラが出っ張ってるんです。(今更)

最初はカバーなしで使ってたけど、
気にするのがめんどくさくなって、結局カバー買っちゃいました。

でも、買ったカバーが地味に優秀。

Amazon CAPTCHA

なんといっても、ペンが刺さるところがいい!
そして、カメラも気にしなくていい!

ただ、だいぶ重たい。

片手で持つのはだいぶつらいぐらい重たい。

なので、用途を選ぶと思います。
家に帰ってYoutube 見るようにiPad Air 2 を持ち上げた時の喜びと言ったら。。。

プロブロガーみたいなこと書いてしまった

閑話休題

そもそも、なぜiPad Pro を買ったのか。
それは、論文を読むためです。

最近機械学習とかの勉強してて、最新の論文を追っていないと取り残される と感じたから。

そして、その論文を読むという分野において、iPad Pro は、とてもよい。
PC より軽くて、思ったことをPDF に直接書き込める。

そして、付帯効果として紙を抹殺できる。(でかい)
今までスケッチブックをメモ帳代わりに持ち歩いていたけど、かさばるし、情報は散らばるしであまり好きではなかった。
だけど、iPad Pro だと、その心配は(少なくとも今の段階では)ない。

こんな感じで、完璧だらけ(今のところ。9万円の価値があるかは別問題。)のiPad Pro だけど、
いくつか不満もある。

正確に言うと、iPad Pro に対する不満というより、アプリに対する不満だけど。

Mendeley

まず、論文を読み書きするときによく使われるアプリ、Mendeley。

www.mendeley.com

このアプリ、非常に便利でよいのだけど、
肝心のPDF に文字を書き込む機能が付いていない。

こんな感じで欲してる人は多いはずなのに。。。
ちなみにこの掲示板的なところ、けっこう長文のスパムがついてて、まじめに読まされて萎えた。
“7年間ウィルソンとともに歩んできたけど、彼は去っていった” 的な入りだったら、中の人も大変だなー。って思って読むでしょ!
ただのスパムだった。ふざけるな。。

GoodNotes

今使ってるのは、評判が高い GoodNotes というアプリ。
1000円ぐらいだった気がする。
Evernote とかも使いやすいらしいけど、消費者としてはやっぱり買い切りのほうがいい。
(ちゃんと見てないけど、GoodNotes がサブスクリプション型だったらつらい)

PDF の書き込みができて、その完成度が高いところは非常に感謝してる。
ただ、このアプリに一つ不満がある。
それは、手書き部分を非表示にできないこと。
フォトショのレイヤー的な概念(使ったことないけど)で手書きをしたいのに、それができない。

ということで、まだ決定版がない感じです。
さっき調べたところによると、Mendeley にはAPI があるっぽいから、
最悪 自分で作 誰かに作ってもらえばいい。
300円上げるからだれか作ってー。。。

PHP BLT に参加してきた話

PHP BLT

PHPBLT とは、簡単に言うと、PHPネタについてLT をしようという企画のようです!
fukuokaphp みたいな感じですね。

今回は、メルカリさんのオフィスを会場にして行われました。

六本木ヒルズ
f:id:adiboy:20170820153958j:plain

ビルの中に入るのが難しいww

会場に入ると、こんな感じで飲み物と食事が準備されていました。
とても美味しかったです!!
f:id:adiboy:20170820154325p:plain
ちなみに、こちらのお食事、一人の方が作られていて、スケールアウトできないのだとか。
いいTシャツ有るんですけどね。

早速、LT!

koyhoge さん

PSR12 についての発表でした。
なんと、PSR は誰でも提案できるらしいです!(英語)
実際に発行済み 8つ 提案中 15個なのだとか。

PSR2 は、2012 年の規約で若干古くなってきたので、
PSR2 を内包するような形でPSR-12 が策定されようとしているそうです。

登壇資料はこちら!
https://speakerdeck.com/koyhoge/psr-12

まみーさん

ちなみに、まみーさんは、闇のエンジニアらしいです。
まみーさんの呼びかけにより、闇のエンジニアが挙手しましたが、けっこう多かったです。
(※ 闇のエンジニア: DB に画像を保存したことがあるエンジニア)

本LTのまとめ
画像の保存にDBは使わないほうがいいよ
楽だからDBに画像保存はよくない
パフォーマンス・コストとのトレードオフ (覚悟が必要)
しっかり計画しておく (あとで困らないように)
RDB の責務を考えましょう

資料はこちら
https://speakerdeck.com/mamy1326/put-the-image-in-the-rdb-advantages-and-disadvantages

hanhan1978 さん

キャッシュの話。
ISUCON も迫ってきたので、キャッシュ速度の話をしよう という発表でした。
目標は、キャッシュすることにより、1万レコード全件取得する時間が MySQL より速くなること。
MySQL にindex を貼ってたかどうか聴き逃しました。
たぶん、発表資料に書いてあるはず。

結論は、
mysql は偉大です。
Redis に頼りっきりはよくない
IOはコストがかかる
とのことでした。

ちなみに、

  • 大量データを低コストで華麗に読み込む方法
  • Cache にすべきかどうかは要検討らしい

を募集しているそうです。
これ! という解決策をお持ちの方はぜひお知らせください!

なお、議論が分かれるところだったらしく、
memcache は? とか、 全件Select するならCache の意味ないじゃん みたいな質問が飛び交いました。

rela1470 さん

API 仕様書が気づいたらExcel になってた話

資料はこちら

speakerdeck.com

API 仕様書がなぜExcel になってしまったのかが、
時系列で書かれていました。
大事なところですが、正確には、Excel ではなくSpread sheetに落ち着いたそうです。
最低限の人権は保証されている と主張されていました。

ちなみに、Insomnia Teams が、便利らしいです。
(詳しくは発表資料をご参照ください!)
あ、あとこちらもよい案があれば教えてほしいとのことでした!

LEE さん

残念ながら、資料が見つかりませんでした。
上げてください!そして、上げたら @gorogoroyasu までメンション飛ばしてくださいw

韓国の、Leeさんの発表でした。
デザインパターンの話が勉強会で言及されにくいのはなぜか?という話に対する問題提起でした。

なぜあまり論点にならないかの考察は、主に以下の3点でした。

  • 実コードを見ながらやる必要があるから?
  • 他人にどうこう言われる必要はない?
  • 宗教戦争になる?

ちなみに、LEE さんは、ドリフト仲間募集中らしいです。
命知らずの方 興味有る方はぜひ!

KazuakiM さん

vim for php
PHP を書くのに vim を使いましょうという話でした。
この手の話で必ず挙がるのがPhpStorm の使用者の話ですが、
今回もご多分に漏れずPhpStorm 愛用者の挙手イベントが発生しました。
およそ半分ぐらいが使ってる印象でした。
想像以上におおかった。
あ、ちなみに僕もついにJetBrains AllProducts に課金したので、PhpStorm ユーザーです!
Atom 好きなんだけどなー。
ということで、突然ですが、Atom のいいところを発表しようと思います(以下略)

tenkoma さん

社内のSVN を全部GitLab に移行しました!!
だそうです。

又、CakePHP3 x Circle CI の環境を構築されたそうです!

この話超面白かったので、
ブログでまとめてほしいと思ってたら、ポストが出てました!
ほんと、ブログ枠で参加しといて登壇者より出すの遅いとか申し訳ありません。。。

tenkoma.hatenablog.com

Circle CIの話、参考にさせていただきます!

chiroruxx さん

phpDoc のおさらい

初PHPBLT && 初LT だそうです!
素晴らしいですね!

仕様を書く場所は
- phpDoc
- phpspec
- 仕様書
- ユニットテスト
- コード
のように色々ありますが、その中でPHPDoc を使うとこんなにいいことがあるよ という話でした。
自分もけっこうPHPDoc 育てる派ですw

休憩!

ここから、魔の休憩時間が始まりました。
何が “魔” か?

それは、ビルの構造が複雑なこと。
トイレを探して、色々歩き回った結果、ビルの中で迷ってしまいました。
休憩時間5分だったのですが、
戻ってきたのは10分後。

ということで、

Hirakuさん

さんの発表を聞けませんでした。
大変申し訳ありません。
PHPの現場、拝聴しました!

p さん

テスト時のモックライブラリの話。

スプラトゥーンやってるそうです!
テスト大事ですよね?
最近レガシーなプロダクトをバージョンアップしつつ、
テストも鋭意追加されているそうです。

Prophecy というものがおすすめだそうです。
もちろん、新規開発とレガシーコードの保守という役割の違いによるステージの違いもありそうですが。

ちなみに、考えた話なので、これから実践されるそうです。

実践して困った話についてもお聞きしたいですね!

資料はこちら!

speakerdeck.com

きのこたけのこ さん

たけのこのほうが好きらしいです。
言い切っちゃう辺り、すごいですね!

koemu さん

外部API は、いつか切り替えなきゃいけないですよね。
僕は、その準備ができてませんでした。

ドメインクラスを使うとよさそう らしいです。
やっぱ、密結合は辛い。

という話でした。

ぶっちー さん

PHP機械学習をしようという話で、
PHP-ML というライブラリの紹介でした。
PHP のなんでもあるところが大好き とのことでした!
素晴らしい!

ちなみに、自分も最近機械学習に足を突っ込んでるので、
とてもおもしろい話でした。
できることはpython製ライブラリ に比べると少ないそうですが、
PHP で書かれているというところがワクワクします。

YuichiKishimoto

PHP Beginner がぶち当たった壁の話!でした。

ざっと説明すると、
- Fat Controller になるよねー
- Fat Model になるよねー
-> MVC固執せず、自由にクラス分割しましょう!
という話でした。
また、

phpunit でテスト書いてます。
no test no life 

だそうです!

書いたほうがコスパ高いとおっしゃっていました。
まあ、後々のこととか考えるとそうかも と思いました。

きりん さん いいレビュイーになるには? という話でした。
基本みんな忙しい(暇な人は会社やばいかも?)
そこで考えたのが、
“厳正な抽選を hubot で行う"という方法。
これについては、昨年PHPConference のLT で発表しました!

この時の話は、レビュアーに強制的に仕事を振っていくのが解決策だ というのが結論だったそうです。

しかし、レビュイーもけっこうデキることが多いのでは?と感じられたとのこと。

具体的には、
- github テンプレートはいいぞ!
- todo の洗い出しもデキるぞ!
- GFM 記法で書くといいぞー

という話でした。
tips がいっぱい詰まってるので、スライドを是非御覧ください!

scrapbox.io

最後に、@cocoitiban さんによる、飛び込みLT がありました。
昔の話 ということで、聴衆の大半を置いてきぼりにするガラケーの話がありました。
自分が PHPカンファレンス福岡のLT で発表したガラケーの話にも少し触れて頂きました。
PHPの現場podcast でも言及されておりますので、よろしければ!

php-genba.shin1x1.com

福岡から東京に進出してきて2ヶ月、
東京は、色々な勉強会があるなーと感心しています。

もう少しおりますので、色々参加させていただきます!
よろしくどうぞ!

複数のGPUを積んだマシンで、未使用のGPU を選ぶやつ作った。

タイトルが難しい。

とりあえず、作りました。
github.com

作り方はとっても簡単。

nvidia-smi

コマンドたたいて、結果をCSV で受け取るだけ。

使い方はもっと簡単。

使い方

from get_unused_gpu.main import get_unused_gpu


os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = str(get_unused_gpu())

python のお作法は知らないので、git clone して、適当に使ってください。

PyPI 一応登録はしたものの、ちょっと怖くて使えてません。
気が向いたら登録します。

とりあえず、自分用です。
なんか、こんなブログですいません。。。

あ、ちなみに、

gpu temp: under 40°C
utilization.gpu: 0 %
utilization.memory: 0 %

が未使用と判定する条件です。
時系列情報とかとってないし、同時に処理が実行されたときのこととか関係ないのであしからず。
あと、現状使用可能なGPU がない場合 exit() してるので、止まります。
PiPY 登録するときは、最低限この辺きちんと作らなきゃなー