YAPC::Asia Tokyo 2015 に行ってきた!

今年でラストということなので、いろんなものを放り投げて行ってきた!

yapcasia.org

Day 1

飛行機の関係で午後から参加。
「ビッグサイトから○○までは○時間!」 | YAPC::Asia Tokyo 2015 のおかげで迷わずに済んだ。
わかりやすくてホント助った〜(^^)

HTTP/2時代のウェブサイト設計

・・から観たかったけど、間に合わずorz

Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜

はてなブログの開発話。
オブジェクト指向やDDDとか、実際にやってきたことを聴けたのがよかった。
コピペの話や定期的に発せられる「最高」がステキだったw
ユビキタス言語のくだりはうちもちゃんとやろうと思った。

Yet Another Perl Cooking

自分が一番楽しかったのがコレ。
Nomikuが届かない、とろ火の定義がわからない、ビニールが焦げるなどなど、おもしろポイント満載だったw
ただ、おもしろ要素だけじゃなく、Nomiku届かないからとRaspberry Piで自作したのは凄いなと。
Chefをリアルワールドにって発想が素晴らしいと思った。

esa.io - 趣味から育てたWebサービスで生きていく

今年の Hackers Champloo に来ていただいていたera.ioさん。
Bug Fixタイムアタックってのは驚いた。
雑なコードにならないのかなぁ・・

Lightning Talks Day 1

まさにお祭りって感じで楽しかった!
障害対応術のLT時に実際の障害通知があったり、LTの準備中だけ喋る人が出てきたりと、息つく間もない60分だったw
で、一番沸いた(と思う)のがコレ。

隣の人達がざわついてたので、修正頑張ってくださいと祈ってました(^^;)

Day 2

ISUCONの勝ち方

ISUCON自体は知らなかったけど、チューニング系が聴けそうだったので参加。
analyze_apache_logsやpt-query-digest、iftopは聴いたこと無かったんで、勉強不足を痛感。
「心にいつもB+Treeを」
楽しそうなので、うちもチームで出てみたいなと。

我々はどのように冗長化を失敗したのか

こういう失敗事例を聴けるのは貴重だなと。
hostsは上からなめて最初のものをすぐに返すってのは知らなかったorz
道具への理解と責任のくだりはホントそうだなと頷くばかり。

ランチセッションの1つ前

ランチセッションB付近で待機。
Day 1の経験から、普通にトークを聞いた後だと入れないと確信。
ま、弁当云々より、位置情報関連技術の話が聴きたくて・・

ランチセッションB

駅メモで使用されている位置情報技術について。
座標のランク関数とかとってもわかりやすかった。
GeoHex便利そうなんで、ぜひ使ってみたい(うちにそんな案件あるのか知らないけど)
お弁当もありがとうございました!(何だかんだで、ちゃっかり頂きましたw)

データ分析基盤を支える技術

用語は聞いたことあるけど・・みたいなデータ分析基盤の話が聴けて勉強になった。
SQLは大事ってのと、データ分析基盤は自前でやるもんじゃないってのはわかりましたww

   

ここでタイムアップ・・
YAPCあるあるの歓声を聞きつつ、泣く泣く空港へ・・・

その他

Network

ちょこちょこ繋がらないこともあったけど、この規模でこの安定性って凄いと思った。
CONBUさん凄すぎる!
おかげで快適に過ごせました。ありがとうございました!
カンファレンスネットワークの作り方 - YAPC::Asia Tokyo 2015 も聴きたかったな・・

移動

ちゃんとスケジューリングしないと部屋に入れもしないw
ネズミの国みたいだなとww

空港

トータルで1時間半遅延orz
YAPCあるあるの直前までいたのになー
同じトラックだったのになー
使用機に雷落ちるとかー

まとめ

YAPC::Asia Tokyo 2015 楽しかった!
ホント、エンジニアのお祭りって感じで居心地がよかった。(特にDay 1のLT大会)
エンジニアとして負けないよう修行せねば。

f:id:tnaototo:20150827224532j:plain

f:id:tnaototo:20150827224855j:plain

f:id:tnaototo:20150827224621j:plain

無限コーヒー
ありがとうございました!
f:id:tnaototo:20150827225011j:plain

f:id:tnaototo:20150827230604j:plain

いいアイデア思いついたら

まさにこれ。
すぐ動く癖があるので、肝に銘じておこう・・

周囲を見渡しても同様のサービスがなく、「これは世界初なんです!」と勢いよく持ち込む前に「なぜそれがなかったのか」「それが欲しいのは自分(似た境遇の人数人)だけではないのか」という自問自答する時間と心の余裕は持ちたいものです。

引用元:2015年Q2に「死亡した」スタートアップ12社の理由 - THE BRIDGE(ザ・ブリッジ)

ERROR:Error: Cannot find module 'jsupm_adxl345'

Edison + 三軸加速度センサーを試そうとしたら、タイトルのエラーが・・・

確かに見当たらない・・

# ls -la /usr/lib/node_modules/ | grep jsupm_adxl345
# 

Fix & Sample for LCD on Edisonに書いてあるとおりにopkg(パッケージマネージャ)をupgradeしたら解消した。

# opkg upgrade
# opkg update

# ls -la /usr/lib/node_modules/ | grep jsupm_adxl345
drwxr-sr-x    2 root     root          4096 Jun 19 11:10 jsupm_adxl345  

解消したが、今度はセンサーの値を正しく取得できてないorz

先は長そうだ・・

Jenkins勉強会に行ってきた

2015.05.30に行われた「Jenkins勉強会 第1回 Jenkins初期構築と運用について」に行ってきた。

jenkins-ug-okinawa.doorkeeper.jp

今更感満載だが、じっくり触れていなかったので
ゴニョゴニョできて良かった。

実際の導入話も聴けたし、(主に懇親会でw)情報交換もできたので、楽しいひと時を過ごせたなと。
次回はSeleniumをがっつり回せるようにしたい。

イベント自体の流れなどは、こちらのエントリの方が詳しいです。

takkuru98.ti-da.net

以下、自分メモ。
途中までしかできてない & ほぼSelenium・・


13:00 〜 とあるプロジェクトにおけるJenkinsの導入実績

  • 精神論より仕組み
    • 週1でレビューしようではなく、JenkinsでOKじゃないとだめという風にする
  • 実際のケース
    • リリース手順が多くて大変
      • リリースに丸二日・・
    • ハインリッヒの法則
      • 1:29:300
    • Jenkins導入後 -> 0.5日に短縮
      • 導入するのはどのぐらいかかったんだろう?
        • ステージングが全く同じ環境があったので、3営業日で検証終了
  • 自動化出来る作業は計算機に委任する
  • Jenkinsをアップデートする動機は?
    • 新しいPluginが対応してないとか
  • Jenkinsのバックアップはディレクトリごとtarで固めてとか、PluginとかでOK
    • グリーとかはJenkins用にリソース結構割いてる
    • Jenkinsが落ちても大丈夫な構成は要検討

オススメ書籍

13:30〜 Jenkins初期構築ハンズオン

cf. 今更始めるJenkins勉強会 チートシート一覧 - Qiita

もくもく

Jenkins + Selenium
cf. CentOS6.4 + Selenium の環境作成 - Qiita
cf. Ruby - CentOS上にてRSpec+Turnip+Capybara+Selenium Webdriver+Headlessでスクリーンショットを撮るまで - Qiita

$ sudo yum install xorg-x11-server-Xvfb
$ sudo yum install ImageMagick
$ sudo yum groupinstall "Japanese Support"

$ curl -L https://get.rvm.io | bash -s stable
$ source /home/vagrant/.rvm/scripts/rvm
$ rvm install 1.9.3

$ mkdir selenium
$ cd selenium
$ bundle init
$ vi Gemfile

Gemfile

# A sample Gemfile
source "https://rubygems.org"

# gem "rails"

gem "headless"
gem "selenium-webdriver"
gem "rspec"

 

$ bundle install
$ vi ~/.bash_profile

# 追加
export DISPLAY=:99

$ source ~/.bash_profile

# テスト
$ Xvfb :99 -screen 0 1024x768x24 &
$ firefox &

Audio関係のエラーがでるけど、使わないので無視
cf. ImageMagickとlibreofficeを使ったOffice->PDF->PNG変換について(コマンドライン編) - Qiita

The XKEYBOARD keymap compiler (xkbcomp) reports:
> Internal error:   Could not resolve keysym XF86AudioMicMute
Errors from xkbcomp are not fatal to the X server

Selenium試す

cf. Linux CUI環境でruby + selenium-webdriver - Qiita

エラー・・

nable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055) (Selenium::WebDriver::Error::WebDriverError)

firefoxバージョンアップ?

$ firefox -v
Mozilla Firefox 38.0.1

$ gem list
selenium-webdriver (2.45.0)

Googleのキャプチャ取ってみる
cf. XvfbとFirefoxを使ってWebサイトのSSを撮る - 私の昆布

$ Xvfb :99 -screen 0 1024x768x24 &
$ firefox http://google.com/ &
$ import -window root test.png
$ ls
test.png

firefoxのたたき方間違ってたorz
cf. Xvfb+Firefoxで"Error: No running window found"となってハマりかけた話 - Qiita

# NG
$ Xvfb :1 &
$ DISPLAY=:1 firefox -remote "openURL(http://www.google.co.jp/)" &

# OK
$ Xvfb :1 &
$ firefox http://google.com/ &

Rubyのエラーorz

$ ruby test.rb
test.rb:33:in `block in <main>': undefined method `pp' for main:Object (NoMethodError)
    from /home/vagrant/.rvm/gems/ruby-1.9.3-p551/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:187:in `block in each'
    from /home/vagrant/.rvm/gems/ruby-1.9.3-p551/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:186:in `upto'
    from /home/vagrant/.rvm/gems/ruby-1.9.3-p551/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:186:in `each'
    from test.rb:32:in `<main>'

ppコマンドが無いみたいなので、pに変更すると・・

$ ruby test.rb
"http://ja.wikipedia.org/wiki/FIFA%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E3%82%AB%E3%83%83%E3%83%97"
"http://www.jfa.jp/nadeshikojapan/worldcup2015/"
"http://www.jfa.jp/nadeshikojapan/worldcup2015/schedule_result/"
"http://members.jcom.home.ne.jp/wcp/"
"http://blog.livedoor.jp/sekaiminzoku/archives/44234655.html"
"http://www.asahi.com/worldcup/"
"http://matome.naver.jp/topic/1LvDt"
"http://www.soccer-king.jp/news/wc"
"http://www.fujitv.co.jp/sports/vabonet/wcv/"

キタワァ・゚゚・:.。..。.:・゚(n‘∀‘)η゚・:.。..。.:・゚゚・ !!!!!

15:30 〜 Jenkins運用についてのブレインストーミング

お題

  • 開発で導入したいこと
  • クラウドでJenkinsを導入するメリット
  • 社内でJenkinsを導入するには
    • 導入障壁って何だろう?
  • 次回以降やっていきたいこと

その他: 雑感

  • インストールは -y オプションあってもいいかな
  • 軽いBGMあってもいいかも
  • Jenkinsで軽いテスト(?)みたいなものをやってもいいかな
    • 放り出された感がしたかなと(^^;)
  • 次回は「#jenkinsug」を事前告知してみよう

作業メモ:Edison + IoT Analytics で Device not found in IoT cloudと出た

背景

23: Intel Edison実践編 (3) 〜 XDKで開発したプログラムからiotkit-agentにデータを送る | Developers.IO を読んで、Edison + IoT Analyticsを試す
 ↓
(・∀・)イイネ!!
 ↓
別の場所に移動してセンシング
 ↓
プロットされない・・orz
 ↓
Edisonでこんなエラーが・・

# systemctl status iotkit-agent -l
~(略)~

May 27 06:40:22 edison1 iotkit-agent[475]: 2015-05-27T06:40:22.106Z - error: Data Submission Error  {"code":1404,"message":"Device not found i
n IoT cloud. Try initializing and activating the device once again."}                                                                              
May 27 06:40:22 dev-tnaototo iotkit-agent[475]: 2015-05-27T06:40:22.108Z - info: Response received:  {"code":1404,"message":"Device not found in Io
T cloud. Try initializing and activating the device once again."}                                                                                  
May 27 06:40:22 edison1 iotkit-agent[475]: 2015-05-27T06:40:22.191Z - error: Data Submission Error  {"code":1404,"message":"Device not found i
n IoT cloud. Try initializing and activating the device once again."}                                                                              
May 27 06:40:22 edison1 iotkit-agent[475]: 2015-05-27T06:40:22.193Z - info: Response received:  {"code":1404,"message":"Device not found in Io
T cloud. Try initializing and activating the device once again."}          

 ↓
Activateし直してもダメ
 ↓
iotkit-admin initialize やればいいの? ← イマココ

Getting Started Guide を参考にInitialize

cf. Intel® Internet of Things (IoT) Developer Kit IoT Cloud-Based Analytics User Guide (PDF)

# iotkit-admin initialize
2015-05-27T07:36:11.813Z - info: Token file: /usr/share/iotkit-agent/certs/token.json
2015-05-27T07:36:11.847Z - info: Using data store: /usr/share/iotkit-agent/data/
2015-05-27T07:36:11.852Z - info: Initialized
# iotkit-admin activate <<device_activation_code>>
2015-05-27T07:36:37.771Z- info: Activating...
2015-05-27T07:36:39.589Z- info: Saving device token...                                                                                              
2015-05-27T07:36:39.602Z- info: Updating metadata...                                                                                                
2015-05-27T07:36:39.611Z- info: Metadata updated.     
# systemctl restart iotkit-agent
# systemctl status iotkit-agent -l
~(略)~
                              
May 27 07:39:32 edison1 systemd[1]: Starting iotkit-agent...                                                                                    
May 27 07:39:32 edison1 systemd[1]: Started iotkit-agent.                                                                                       
May 27 07:39:35 edison1 iotkit-agent[520]: 2015-05-27T07:39:35.406Z - info: Device has already been activated. Updating ...                     
May 27 07:39:35 edison1 iotkit-agent[520]: 2015-05-27T07:39:35.436Z - info: Updating metadata...                                                
May 27 07:39:35 edison1 iotkit-agent[520]: 2015-05-27T07:39:35.477Z - info: Metadata updated.                                                   
May 27 07:39:37 edison1 iotkit-agent[520]: 2015-05-27T07:39:37.169Z - info: Starting listeners...                                               
May 27 07:39:37 edison1 iotkit-agent[520]: 2015-05-27T07:39:37.318Z - info: MQTT listener started on port:  1884                                
May 27 07:39:37 edison1 iotkit-agent[520]: 2015-05-27T07:39:37.322Z - info: TCP listener started on port:   7070                                
May 27 07:39:37 edison1 iotkit-agent[520]: 2015-05-27T07:39:37.329Z - info: UDP listener started on port:  41234

コンポーネント再登録

# iotkit-admin register temp temperature.v1.0
2015-05-27T07:55:40.115Z - info: Starting registration ...                                                                                           
2015-05-27T07:55:40.227Z - info: Device has already been activated. Updating ...                                                                     
2015-05-27T07:55:40.235Z - info: Updating metadata...                                                                                                
2015-05-27T07:55:40.274Z - info: Metadata updated.                                                                                                   
Attributes sent                                   

# iotkit-admin register light light.v1.0
2015-05-27T07:55:40.115Z - info: Starting registration ...                                                                                           
2015-05-27T07:55:40.227Z - info: Device has already been activated. Updating ...                                                                     
2015-05-27T07:55:40.235Z - info: Updating metadata...                                                                                                
2015-05-27T07:55:40.274Z - info: Metadata updated.                                                                                                   
Attributes sent                                   

 ↓
プロットされるようになった(´∀`)

その他

IoT Analytics Dashboardにデバイスが一つ増えたけど、これ何だろう・・(-_-;)

DeepLearningに先立つ機械学習講習会 に行ってきた

いろんなものを放置調整して、機械学習の勉強会に行ってきた。 machinelearningstudy.doorkeeper.jp

こちらのエントリの方がきれいにまとまっています。 www.itbook.info

以下、感想 f:id:tnaototo:20150524114826j:plain

ただでさえも遅刻なのに飛行機が遅延するというorz
着いた時には環境構築やってて、遅れを取り戻せるか不安だったが、
vagrantのboxが提供されていたので助かった・・
vagrantやdockerイメージがあるとハマらなくて済むなと(^^)
 

環境構築後は実習
Pythonの使い方で1時間、機械学習で1時間
全てiPythonのnotebook(?)でやったけど、コードが補完されるので書きやすかった。
 

機械学習は日本語でコードの説明が聴けたのが一番の収穫だったなと。
scikit-learnのチュートリアル含め、英語の情報がほとんどなので・・
ま、英語を勉強し(ry  

実習時の資料やコードを持って帰れたので、
帰ったら今一度パラメータいじって試してみよう。
 

今回は「教師なし学習」のみだったので、次回以降も参加したい。
 

以下、メモ


20150523 DeepLearningに先立つ機械学習講習会

機械学習とは

機械に「問題を解くためのの規則性」を見つけさせる

用語

  • 「正解」となる値 = Target(目的変数)
  • 「予測のもと」となる値 = Feature(特徴量)

教師あり学習

  • 分類
  • 回帰

教師なし学習

  • 正解のないデータから規則性を見つける

一番いい手法なんて無い

  • No Free Lunch Theorem
  • 人の手による試行錯誤
    • Under-FittingとOver-Fitting(過学習)
      • 「ちょうどいい」複雑さを探す
  • LinkPlaza Demo

  • Featureの重要性

    • 肌感覚
      • 手法の改良
        • 改善しても数%..
      • 良いFeature
        • 最低15%の改善は見込める
        • 学習しないとわからない

Deep Learningの強み

  • 自動的に「有用な」Featureの抽出
    • 化学知らなくても化合物の活性予測で優勝(Featureの選択してない)
  • Featureの自動抽出が「革命的」

Deep Learningの黒魔術

  • 学習時のパラメータが多すぎる
    • 通常10個 <-> Deep Learningは100以上
  • パラメータ調整に独特なコツ

Python

読み方

  • pandas - パンダス
  • numpy - ナムパイ
  • scikit - サイキット

書き方

  • [3:5] -> 3番目と4番目のデータのみを取り出す
    • 5番目は入らないので注意
years_list = [2010, 2011, 2012, 2013, 2014, 2015]
print years_list[3:5]
[2013, 2014]
  • [] -> リスト
  • () -> タプル

  • lambda -> 無名関数

  • Pandas.Series -> 時系列データを扱う

機械学習

Irisデータ - どんな変なモデルでも精度が出る

まずはいろいろグラフを出してみて、使えそうなパターンを見つける

学習の典型的パターン

  1. target=y, feature=xとする
  2. モデルの形を決める
  3. モデルの形で一番いいパラメータを求める

「あてはまり」の最大化 =「あてはまらなさ」の最小化

典型的でないパターン

  • K-近傍法
    • 予測したいFeatureの近くにあるFeatureをk個取ってくる
    • それの平均から判断する
      • 「近いデータと同じになるだろう」

教師あり学習のタイプ

  • 典型的パターン:パラメトリック
    • 学習・予測早い
    • データに強い仮定を置く
  • 典型的でないパターン:ノンパラメトリック
    • 学習・予測遅い
    • データに弱い仮定を置く

どのパターンがいい?

  • 性能評価
    • 誤差で見るとOverFitting(過学習)に陥る・・
    • Cross Validating(交差)
      • 学習データの一部を検証にのみ使う
      • 例) 10回やって、各誤差の平均値をそのモデルの性能とする
from sklearn.linear_model import LogisticRegression
from sklearn import cross_validation
cv = 10 # 何分割するか
logit= LogisticRegression()
scores = cross_validation.cross_val_score(logit,X,Y,cv=cv)
print(sum(scores)/cv)

Over-FittingとUnder-Fitting

  • k=1 : モデルが難しすぎる = Over Fitting
  • k=80 : モデルが簡単過ぎる = Under Fitting

  • k=80でもcol_index=2と3にすると精度が上がる

    • 有用なFeatureがわかれば精度が格段に上がる

おすすめ書籍

よくやるパターン

  1. 大量のデータがある
  2. プロットしてみる
  3. プロットするFeatureを色々変えて、目視
  4. これかな〜というものを見つけたら、掘ってみる

実習でやったようなアプローチ


雑感:Ringを使ってみた

ちょっと前(最近?)に話題になったRingを上司が購入してたので、触らせてもらった。 f:id:tnaototo:20150519134640j:plain

結論から先に言うと、この動画みたいにはいかなかったorz
www.kickstarter.com

ジェスチャーがうまいこと認識されず・・

できること

音楽再生やボリュームの調整、TwitterFacebookへの投稿など、いろいろできる。
f:id:tnaototo:20150519134705j:plain

この記事に細かく書かれている。
mobilelaby.com

使用感

アクション用のジェスチャーは何回かやってると慣れる。
あと、自分でジェスチャー設定できるので、認識しやすいものを設定したらいいかなと。

同じアクションを何個も(?)登録できるので、
ジェスチャーを変えて登録しておけば、定型文の投稿でも使えるのかなと。
ただ、似たようなジェスチャーにすると、結構ご認識されるので注意。

で、Twitterでジェスチャー入力した文字を投稿できるが、この入力が激ムズw
「test」と投稿したかったけど、どうやっても「e」が「t」や「f」になるので諦めた。

OpenURI

個人的に気に入ったのが、これ。
APIが叩ける。
今のところGetしかできなそうだけど、API側でいろいろやれるのはいいなと。

試しに、Ringでアクション起こしたら携帯に電話をかけるというサンプルを作ってみた。
(運転中に帰るコールする的な)
API叩いているだけですけどねw

サンプルのDockerfile
naotty/docker-twilio · GitHub

Twilioイイっすね(違  

最後に

まだまだこれからだな〜と。
ジェスチャーをきれいに認識して、SDKとかが充実したら楽しそうではある。