nikkie-ftnextの日記

イベントレポートや読書メモを発信

告知 | 若手エンジニアで書く合同誌にKaggleタイタニックコンペでアウトプットして #技術書典6 に参加します #spzcolab

はじめに

今週末4/14は技術書典ですね、nikkieです。
実は今回初めて書く側に回ったので、告知記事を書きます。
当日お時間がありましたら、く17「サポーターズCoLab(サポーターズコラボ)」まで立ち読みにいらしていただけると嬉しいです。

サークル概要

執筆経験のないメンバーを集めて技術書を書いてみた、いわゆる「やってみた本」です。

技術書を書いたことないから書いてみたい、このテーマなら書けそうだけど一人で出版するのは不安、という声にこたえる形で、「みんなで書けば怖くない」というテーマの下、多ジャンルの合同誌を執筆することにしました。

そもそものことの始まりは。。

【サポーターズ】CoLabのみんなで技術書デビュー!しちゃおう! - サポーターズCoLab

昨年11月末のこちらのイベントまで遡ります。
昨年10月に開催された技術書典5は来場者1万人超えと大盛り上がりでしたね。
技術書典4から買う側参加していますが、「いずれ書く側でも参加したい」と考えるようになりました。

サポーターズCoLabは若手(20代)エンジニアのコミュニティです。
毎日勉強会が開かれており、最新技術のキャッチアップ目的1でちょくちょく参加しています。
合同誌を書こうという企画に「面白そう!」と参加を決めました。

集いし5人の執筆者たち

私以外の4名の参加者を紹介します。
Go, Laravel, Python, ランサムウェアと多岐にわたるテーマになっています!
様々なトピックが読めるのが多ジャンル合同誌の売りだと思っています。
日本語レビューで一通り読んでいますので、簡単な感想つきで紹介します。

ひろのぶさん

ランサムウェアについて執筆されています。
全然知らない世界で、衝撃的な内容でした。

サポーターズでは無線LANについて登壇されています。

Psyduckさん

PythonSpotifyのプレイリスト生成の開発について執筆されています。

開発で工夫した点が読めるのが魅力的でした。
「こういうアウトプットの仕方もあるのか」と参考になります。

po3rinさん

GoについてQiitaやLTで精力的にアウトプットされているpo3rinさん。
この本ではGo + OpenAPIについて執筆されています。
OpenAPIを初めて知った私は「こんな簡単にAPIが作れるのか!」と衝撃を受けました。

また、執筆中に画像のグレースケール変換が必要になり、パッケージとして実装してくださるなど、Goを使って執筆陣のサポートもしてくださいました(多謝)。

おかしょいさん

Laravelのtipsについて執筆されています。

Laravelに馴染みがない私ですが、ログの設計が特に参考になりました。
他のWebフレームワークにも読み替えられる内容だと思います。

nikkie: Kaggleタイタニックコンペで交差検証・グリッドサーチ

私は、Kaggleタイタニックコンペについて執筆しました。
1月と3月にサポーターズCoLabで開催したハンズオンを元にしています。
1月:【サポーターズ】機械学習に興味ありますか?Kaggle始めたいですか?タイタニックでもいいですか? - サポーターズCoLab
3月:続・機械学習に興味ありますか?Kaggle始めたいですか?タイタニックでもいいですか?【勉強会】 - サポーターズCoLab

ハンズオンは入門者向けとし、機械学習の基本的な部分に絞って実施しました。
合同誌では、ハンズオンの内容に「交差検証」や「グリッドサーチ」を追加して執筆しました。
執筆を通して、交差検証でモデル作成用データをまんべんなく使い、グリッドサーチでモデルをしらみつぶしに試して、一番性能の高いモデルが作られるということに気づきました。

ソースコードはKernelに公開しています:

解説やコメントはほとんどありませんので、「解説が読みたい!」という方は、ぜひ く17 までお越しください(立ち読みだけでもありがたいです)。

おわりに

技術書典告知記事は以上になります。
立ち読みだけで構いませんので、く17までお越しいただけると嬉しいです(なお、私がブースに居るかは未確定です)。

ひとまずここまで来れてホッとしています。
技術書典の後、執筆振り返り記事を予定しています。

「夢いっぱい、本いっぱい」のイベントで皆さまによき出会いがありますように。


  1. 私のDockerへの理解が深まったのは、サポーターズCoLabで定期的にDockerの勉強会に通ったのが大きかったです。

イベントレポート | Django Girls Japanの月次勉強会でコーチをしてきました(2019年3月) #djangogirls

はじめに

いつも心は虹色に! nikkieです。
3/30にDjango Girls Tutorialを使った勉強会のコーチをしてきました。
参加者の方の質問に答える中で学んだことをレポートとしてお送りします。

f:id:nikkie-ftnext:20190331122559j:plain

勉強会の概要

PythonでWebアプリを作ろう [女性対象/男女コーチ◎] 2019.3 - connpass

Django Girls のチュートリアルを使って、一緒にWebアプリケーションをつくります。
コーチ・メンターが、躓いたところや、分からないところはサポートします。

レベル別にチームを分けて勉強するので、 はじめてプログラミングに挑戦する方も、焦ることなくイチから学ぶことができます。

Django Girlsにはチュートリアルの翻訳やワークショップでのコーチで関わっています。
予定が合ったので、数カ月ぶりにコーチ参加しました。

解決した質問

もしよろしければ以下の観点でお読みください。

  • 「もしこういうエラーが出たらここを見ればいいのか」とFAQ的に読む
  • Djangoをご存知の方はどこが原因か考える(全3題のクイズ形式)

1. 作ったblog/urls.pyについてModuleNotFoundError

この中で発生:Django URL · Django Girls Tutorial

エラーメッセージはNo module named 'blog.urls'(mysite/urls.pyのpath('', include('blog.urls')),で発生)
チュートリアルに沿って作ったblog/urls.pyが見つからない?🤔

作成したblog/urls.py

from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

どうやらrunserverした状態でblog/urls.pyを作成(新規追加)しても、反映されないようです(runserverは落ちたまま)。
Ctrl+Cでrunserverを終了し、再度runserverすると解決しました。
(runserverでは既存のファイルの変更は反映されますが、新規追加ファイルが反映されないことがあると理解しています)

2. migrateしたらModuleNotFoundError

この中で発生:Djangoモデル · Django Girls Tutorial

エラーメッセージを見ると、staticfilesblog がインポートできないとのこと
staticfilesblog?🤔

原因箇所(mysite/settings.py)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
    'blog'
]

原因:INSTALLED_APPSの'django.contrib.staticfiles'の後ろにカンマがない
そのため、後続のblogという文字列と連結して扱われていた。

文字列の要素からなるリストでカンマを忘れると、連結した文字列として扱われます(bcに注目ください)。

>>> ['a', 
...  'b'
...  'c']
['a', 'bc']

3. published_dateを更新しないpublishメソッド

この中で発生:Django ORM(クエリセット) · Django Girls Tutorial

前提:published_dateに値を持つ記事がない状態

>>> post = Post.objects.get(title="Sample title")
>>> post.publish() # published_dateを設定しているはず
>>> Post.objects.filter(published_date__lte=timezone.now())
<QuerySet []> # 現在時刻以前のpublished_dateを持つ記事がない→値が設定できていない?

原因箇所(blog/models.py)

    def publish(self):
        self.published_date = timezone.now()
        self.save

原因:self.saveの後ろにカッコ())がない
そのため、saveメソッドが実行されていない

Anacondaでの環境構築

AnacondaでPythonをインストールした方が、Django Girls Tutorialをやる場合、conda install読み替えDjangoをインストールすることをオススメ1します。
参考:Djangoハンズオンの環境構築で書いた記事:環境を分離してDjangoの開発環境を作る(Python3系・Django2.1系) - Qiita
Anacondaの方は、 Djangoのインストール · Django Girls Tutorial にあるrequirements.txtやpip install無視してください

Django Girls Tutorialの手順

  1. python.orgからPythonをダウンロードしてインストール
  2. venvモジュールで仮想環境を作成
  3. requirements.txtを用意して、Djangopip install

AnacondaでPythonを入れていて、venvモジュールで仮想環境を作るとエラーが発生することが多い印象です。
この日、私が知る限りで2件ありました。(一例:sqlite3用のモジュールが読み込めないというエラーが出た)

エラーの内容が同一ではないので、Anacondaとvenvモジュールが原因かは断定できない2のですが、conda installでDjangoをインストールして進めていただいたところ、エラーは解消したようです。

「データ分析からPythonを始めてDjangoへ」という方が増えている印象なので、Django Girls TutorialにAnaconda向けの環境構築方法は必要そうですね。(言い出しっぺの法則で提案してみようかな。まずはIssue探しから)

Anacondaに関してこの日学んだこと

関連情報

私が関わっているものも宣伝させていただきました。

感想

やはり人に教えることは自分の学びにもなりますね。

Django Girlsでお世話になっているkaizumakiさんから、刺激的なIssueを共有していただきました。
(今後ハンズオンを開く機会があったら試してみたいです)

終わったあとの懇親会も盛り上がり、楽しいひと時でした。
(コーチ参加者同士で「どう教えるか」というトピックになると、すごく盛り上がりますね!)

参加者、コーチ、運営の皆さま、ありがとうございました。

この記事のアイキャッチは以下から利用しました。魅力的な写真素材をありがとうございます:
Photo by Startup Stock Photos from Pexels


  1. 参考情報:Conda コマンド - python.jp

  2. sqliteのエラーのケースは、python.orgからインストールしたPythonとAnacondaでインストールしたPythonが共存していました(Windows 10)

イベントレポート | #WEBエンジニア勉強会12 に参加。知っている世界の拡張、ホットなトピック「ブラウザ拡張」

はじめに

いつも心は虹色に! nikkieです。
3/29開催のWEBエンジニア勉強会のイベントレポートをお送りします。

勉強会の概要

WEBエンジニア勉強会 #12|IT勉強会ならTECH PLAY[テックプレイ]

第12回目になる、WEBエンジニア初心者でも参加できることを心がけ・気軽に発表できるWEBエンジニアのための勉強会コミュニティです。初心者の方でも、一人でも、SIerの方も、学生の方も、みなさんお気軽にご参加ください。
今回もビアバッシュ形式の勉強会です。 ピザ・飲み物・おつまみを用意する予定です。 飲み食いしながらワイワイとやりましょう!

昨年11月の10回目から2月の11回、そして今回と3回目の参加です。
前回感じたのですが、広大なWebという領域をサーバサイド、フロントエンド、インフラといろいろな切り口で聞けるのが魅力だと思っています。

また、普段サーバサイドが多い身としては、フロントエンドにキャッチアップできる機会でもあり、ありがたいです。

発表振り返り

特に聞きたかった2つを中心に振り返ります。

WEBサイトを HTTP/2 に移行した話

実際の案件の事例を元に、HTTP/2について知ることができました。

HTTP/2 移行で期待できること

訪問者の体感的な待ち時間を減らす

  • HTTP/1.xのHead of Line Block(HoLブロック)を回避
    • ファイルを一つずつ順番に取得
    • 前のリクエストが終わるまでの待ち時間が発生
    • 開発者ツールのNetworkタブが階段状
  • HTTP/2のストリーム多重化の恩恵にあずかる
    • 複数リソースを並行してダウンロードできる

具体的にやったこと

  • Apache httpdを最新化(HTTP/2対応バージョン)
  • httpd.confのProtocolsにh2を指定(その後、apache 再起動)
  • 動作確認:開発者ツール→Network→Protocol h2という表示を確認

簡単な操作で効果が出るHTTP/2対応、機会があったらやってみたいですね。
(HTTP/2はまだ30%台の普及だそうなので、今後経験する人が増えそうな印象です)

1人で開発したWEBサービスが500社に導入されるために採用した3つの技術とたった1つの考え方

「個人開発の成功事例かな」と楽しみにしていました。
フルスタック+Bizもできるというめちゃくちゃすごいエンジニアの方でした。

3つの技術

  1. Extension:自由度が高い!
  2. AWS
    • ALB(Application Load Balancer)
      • ルール(ユーザ操作とAPIからの呼び出しを振り分ける)
    • Dynamo
      • 容量無制限
      • インデックスは設計が重要
      • ページングはまじめにやらないほうがよい
  3. Terraform:コードベースで見られるのはやや興味(AWS以外でもいけるかな?)

Railsは惜しくも取り上げられませんでした。次点扱い?)

1つの考え方:"正しいもの"を最速で作る

  • 最速:ベンチャーは存続に関わるのでスピード感が大事(←激同)
  • 正しいもの:ユーザが欲しているものを作る

他の発表について簡単に振り返ります。

スポンサーセッション:「心理的安全性」が組織をRe:Designする

チェックイン(今の自分の気持ちの共有)とペアトーク/シェアトーク(ペアで他己紹介)で、勉強会の雰囲気が和らぎました。

11回目でも取り上げられた「心理的安全性」(セーフティ!)。
2000年代初頭にドラッカーも言及していたというのは、すごいですね。

React Nativeで作るiOSアプリケーションの環境構築設計

2年くらい前に、ハマりまくりながら、Swift2系でiOSアプリ開発したのを思い出しながら聞いていました。
Clean Architectureをアレンジして採用(Layered(データの流れ)やOnionを採用)というのが興味深かったです。
Nativeは未経験なのですが、「NativeからiOSアプリを開発するのはどんな感じなんだろう」と気になるところです。

Dark Side of the Web

恐怖でまだゾクゾクしている話。

  • 全員に同じようにWebサイトが見えている時代は終わった
  • ユーザが閲覧環境の嗜好をOSに設定し、それをCSSで設定する
  • ダークモードは、対応しなくても影響ないので、簡単な部類。ハイコントラストモードは対応しないと、ユーザにはネガポジ反転したコンテンツが見えてしまう

メディアクエリは現在も増加中とのことで、設定する手間が結構かさみそうな印象。
簡単に設定できるライブラリはニーズがありそうです。

React+TypeScript+vte.cx で在庫管理システムを作った話

事例から vte.cx|サーバ構築ゼロでフロントエンドが主役の開発を の紹介でした。

  • ビジョン:HTMLとJSの知識だけでWebサービス作れる
  • 納品書のPDF作成(サーバサイドをReactで書き、SSRでPDF表示)
  • 売りはKVSを使ったパフォーマンス(例:ページネーション)
  • 開発向けは無料で使えるようなので、JSから始めた方は使ってみてもいいかも

悪意あるブラウザ拡張への対策方法

悪意あるブラウザ拡張への対策方法 - [2019/03/29] WEBエンジニア勉強会 #12 LT

ブラウザ拡張でできること

対策方法

  1. 権限の少ない拡張を選ぶ
  2. Chromeを使う(権限の制約が可能)
  3. 自作 ※悪意ある外部ライブラリに注意

拡張は何でもできてしまうので、技術で縛れず、ポリシーで縛っているという印象です。

感想

参加するたびに感じていますが、JSの存在感は大きいですね。
vte.cxの話(JSだけでWebアプリ)やNativeの話(JSでiOSアプリ開発)など、JSが登場しました。
JSが特別というよりも、何の言語から始めてもサービスが作れる状況が整いつつあるという印象です。

今回特徴的なトピックはブラウザ拡張だと思います。
500社導入されるまでの話や悪意あるブラウザ拡張の話で取り上げられました。
「こんなツールあったらな」を実現できる技術だと思うので、触ってみたくなりました。

次回は5月中旬〜下旬予定だそうで、楽しみにしています。
発表者、運営者、参加者の皆さま、どうもありがとうございました。

LT報告 | #jawsdays で機械学習を組み込んだPython製アプリのデモLTをしました

はじめに

いつも心は虹色に! nikkieです。
2/23のJAWS DAYS 2019に参加し、懇親会でLTしてきました。
デモアプリを使ったLT(いわゆるLT駆動開発)をして思うところをまとめます。

勉強会の概要

About | JAWS DAYS 2019

JAWS-UGによる全国規模の交流イベントを開催いたします!
AWS初心者から上級者までのエンジニア、経営者や人事、マーケティングエンタープライズからスタートアップ、中小企業など職種や業態・会社規模を問わず、たくさんの方に参加いただけるイベントです。

今年のテーマは「満漢全席」
海外UGのセッションも含め、多岐にわたるテクニカルセッション、ビジネスセッション、ランチセッション、OpenMic、LTも含めて「100以上のセッション」を用意します。

AWSの情報収集がしたくてJAWS DAYSに参加しました。1
今回が初めてのAWS関連のイベントです。

LT駆動開発の動機

1月くらいに「懇親会LT募集」が告知され、「Amazon MLについて話せそうだし、AWSを触ってみるLT駆動開発をやってみよう」と応募しました。
LTをすることで、

  • 聞き手(AWS経験豊富な方々):機械学習Amazon MLを使用)が選択肢に上がるようになる
  • 私(AWS初学者):Amazon ML以外のAWSサービスを触ってみる

という狙いがありました。

LT: Amazon Machine Learningで機械学習始めませんか?

懇親会を盛り上げるため、デモを中心に構成しました。(デモ→理論の順)
このレポートでは、本来想定していた講義形式(理論→デモ)で説明していきます。

伝えたかったこと

手元にたまったデータをもとに、未知のデータを予測する推論のルールを作るのが、機械学習で可能なことの一つです。
デモアプリの例では、手元にタイタニック号の乗客データがたまっています。(26歳・男性は死亡、28歳・女性は生存、といったデータが800〜900あります)
乗客データから推論のルール(=モデル)を作ることで、生存/死亡が不明のデータ(28歳・男性)についてモデルで予測できます
そして、モデルをAPIにすることで、モデルの推論結果をプログラムから利用しやすくできます。
28歳・男性という属性情報をAPIに送ると、APIは生存または死亡という予測結果を返します。

モデルの作成〜API化までをウィザード操作で可能にするのが、Amazon Machine Learning(以下Amazon MLです)
ウィザード操作ですのでコーディングは不要ですし、APIにまでしてくれるので、得意な言語から呼び出して、モデルの推論結果を利用できます。
Amazon MLで作ったモデルの使い方がイメージしてもらえるよう、「あなたがタイタニック号に乗っていたら助かるでしょうか?」というデモアプリを用意しました。

タイタニック乗客の生死の予測では、現実にアプリに機械学習を組み込む場面を想像しにくいかもしれません。
ビジネス面に即せば、例えば、優良顧客の判定といった事例が考えられます。
(年齢・性別などの顧客属性と優良顧客か否かというデータからモデルを作り、属性から優良顧客か判定する機能を実現します)

使った技術

AWSサービス

機能について補足します。
生存/死亡を予測するモデルには、入力として属性情報(年齢・性別など)が必要です。
学習した際に使ったデータと丸々同じデータをモデルに入力しなければエラーとなってしまいます。
ですので、手元のデータから作ったモデルでは、顔写真から生死を予測することはできません。

顔写真から年齢・性別情報を取り出せば、今回のモデルで生死を予測できます。
顔写真から年齢・性別情報の取り出しにRekognitionを使いました。 Rekognitionで取り出した年齢・性別情報2を手元のモデルに渡すと、生存/死亡が予測されます。

f:id:nikkie-ftnext:20190224004329p:plain

Pythonパッケージ

  • Flask
  • boto3
  • zappa

パッケージの所感はこちら:イベントレポート | #pyhack にてAmazon MLの機械学習モデルを組み込んだFlask製アプリをzappaでLambdaにデプロイしました - nikkie-ftnextの日記

顔写真から助かるかどうかを予測する機能について解説します。(boto3を使って、Amazon MLやRekognition、S3を呼び出しています)

アップロードされた顔写真を画面に表示する(imgタグ)ため、まずS3に画像をアップロードしています。

  1. S3の画像を指定してRekognitionを叩く
  2. S3の画像について制限時間付きで有効なURLを取得(imgタグに使う)

当初はアップロードされた画像を(バイナリで)Rekognitionへ送り、その後S3へアップロードし、imgタグ用のURLを取得の順で考えていました。
ところが、Rekognitionへ送った段階でファイルがクローズしてしまうようで、Rekognitionへ送るかS3へアップロードするか一方しかできないと認識しました。
S3の画像指定でRekognitionが呼び出せたので、後者を選択して上記の流れになりました。

なお、ソースコードはこちらです

フロントエンドに挑戦

サーバサイドに比べて経験が少ないのですが、デモできるくらいには見た目を整えることに挑戦しました。

懇親会ではスマホでデモアプリにアクセスしてもらう想定でしたので、Bootstrapを採用しました。
exampleを真似してモバイルでも崩れない表示にすることはできました。
Checkout example · Bootstrap

f:id:nikkie-ftnext:20190224004403p:plain

顔写真から予測する処理は処理時間が長く、処理中ということをユーザにフィードバックする必要がありました。(連打されて同一画像が複数回アップロードされるのは望んでいません)
jQueryフォーム送信時(formのsubmitイベント)に、ボタンをdisabledにすることにして対応しました。

やろうとしてできなかったこと

期間内に実装が終わらなかったアイデア一覧です。

  • 画像アップロード処理のスレッド化
    • Rekognition呼び出しとimgタグ指定用のURLの指定は並列化できると考えています(処理時間がどれだけ変わるかわからないですが)
    • Amazon MLで作ったモデルの呼び出しをJSで実装してみたいです
  • ローディング表示(ajax?)
  • 利用データのDB保存
    • loggingでCloudWatchに流しています3が、DynamoDB4にためて分析の余地を用意しておきたいです
  • zappaでdebug=TrueのFlaskアプリのデプロイは、ベストプラクティス?

ネタバラシ

繰り返しになりますが、今回はモデル(推論のルール)を手元にたまったタイタニック乗客データから作っています。
つまり、モデルは手元のデータの傾向を反映します。
実はタイタニックの乗客の生存と死亡には、性別と年齢が大きく関わっています。(チケットのクラスと乗船した港は寄与が小さいです)
救命ボートの数が足りず、「女性と子供優先」という方針が取られたため、生存者には女性と子供が多いです。
つまり、女性(でかつ、低い年齢)として情報を送れば、生存と予測されます。

f:id:nikkie-ftnext:20190224004444p:plain

終わりに

LT駆動開発してよかった」この一言につきます。
決して現在のアプリに満足しているわけではありません。
フロントエンドはまだまだですし、サーバサイドは試したいことが多々あります。
それでも作りたいものを時間内で実現するため、通勤時間で必死に調べ、睡眠時間を少し削って実装時間を確保し、「これでいけるだろう」という案が動いたときの高揚感!
資料を作って登壇するという経験とは別種の学びがありました。
不完全なアプリでもアウトプットするのは重要ですね。
自分のスキルアップのために、機能の追加(ブラッシュアップ)に挑戦していきます!

AWSを触ってみたところ、Lambdaへのzappaでのデプロイは非常に快適で5、Lambdaを触れたのがとりわけ大きいと思っています。

最後になりますが、初参加のJAWS DAYSで、AWS初学者にLT駆動開発の機会をくださった運営の皆さまにお礼申し上げます。
LTを聞いてくださった皆さま、デモアプリで遊んでくださった皆さま(50名超!)、Twitterでツイートしてくださった方々、誠にありがとうございました。
ここまでお読みいただき、ありがとうございました。


  1. これまでAzureメイン、k8s体験をGCPといった感じで触ってきています。Python界隈では「Azureでハマっている人」という認識もされているようです。

  2. 説明中は年齢と性別に代表させていますが、データにはチケットのクラスと乗船した港も含まれています。「ネタバラシ」で述べますが、年齢と性別が予測への寄与が大きいです

  3. loggingで書くだけでCloudWatchに記録されるのは驚きです。ref: Python の AWS Lambda 関数ログ作成 - AWS Lambda

  4. サーバレスで実装するアプリはRESTで叩けるNoSQL DBがプラクティスとのことです(初心者ハンズオンより)。RDBだとConnection Poolがないので同時に大量のConnectionが張られてしまう

  5. かつて WebAppsにデプロイは難しい というLTをしたことがあります

イベントレポート | #pyhack にてAmazon MLの機械学習モデルを組み込んだFlask製アプリをzappaでLambdaにデプロイしました

はじめに

いつも心は虹色に! nikkieです。
2/16開催 (第96回)Python mini Hack-a-thon のイベントレポートをお送りします。

勉強会の概要

(第96回)Python mini Hack-a-thon - connpass

基本的に毎月開催です。スプリントのゆるい版みたいな感じで各自自分でやりたいことを持ってきて、勝手に開発を進めています。参加費は無料です。 初めての方も常連さんもぜひご参加ください。

冬山合宿ぶりのpyhack。
参加者数が定員に収まり、こぢんまりとした雰囲気の2月回でした。
(エンジニア界隈としてはデブサミ明け、かつ、裏番組ららこんだったようです)

取り組んだこと

  1. Amazon Machine Learning(以下、Amazon ML)でタイタニック号乗客の生死を予測するモデルを作り、APIにする
  2. 1で作ったAPIをFlaskのアプリから呼び出して使う(入力フォームと結果表示ページを用意)
  3. 2のFlaskアプリをAWS Lambdaにデプロイする
  4. 入力フォーム以外に顔写真のアップロードでも生死が予測できるように機能追加(Rekognitionで顔写真から年齢・性別推定)

これは来週のJAWS DAYS 2019の懇親会LTの仕込みです。
Amazon Machine Learningで機械学習始めませんか? | JAWS DAYS 2019
エンジニア界隈デファクトAWSをどこかで触ってみたかったので、今回LT駆動開発をしています。

達成したこと

上記の1〜4は一通り達成しました。
今回のアプリは #大晦日ハッカソン の成果物をベースにしており、新規で開発する部分は少なかったためです。
(むしろ、LambdaからAmazon MLを呼び出すなど設定周りで苦心しました)

▼現状のデモアプリ(入力フォーム)
f:id:nikkie-ftnext:20190217001742p:plain
▼現状のデモアプリ(顔写真アップロードフォーム)
f:id:nikkie-ftnext:20190217001755p:plain

    return render_template(
        'predict.html',
        prediction=PREDICTION[predict_index],
        input_data=input_data
    )

他の方の取り組みから

感想

LambdaでLT用のデモアプリを作るという目的は達成できたので大満足です。
CSS設定やアップロードされた画像の表示機能(成果発表でのフィードバック)など、時間が許す限り準備していきます。(まずはスライドを作ろう)
AWSのロールまわりは脳内が整理しきれていませんが、引き続き触って理解を進めていきます。(当日猛者に質問してもいいな)

成果発表やお昼・懇親会の場で興味深い話が聞け、最近アウトプットが多かった身としては、「まだまだこんなに知らないことがあるのか!」と燃料が再チャージされた感覚です。
参加者の皆さま、1日ありがとうございました & お疲れさまでした!

イベントレポート | #azuremoku2 にてAzure ML Serviceのクイックスタート・チュートリアルを触りました

はじめに

いつも心は虹色に! nikkieです。
2/9開催の 第三十回 Azureもくもく会 のイベントレポートをお送りします。

勉強会の概要

第三十回 Azureもくもく会 @ 品川 - connpass

Azureに関する作業をもくもく行う会です。 XamarinでAzure連携を試してみる、WebAppsのGitを利用した自動デプロイをSlackに通知してみるのを試す等々、やりたかったこと研究したいことをもくもく作業できる場所です。 初心者の方から既にAzureを利用している玄人の方まで幅広くご参加いただける事を楽しみにしております。

2018年3月以来の約1年ぶりの参加でした。
先日以下のウェビナー1を聞き、Azure Machine Learning Service(以下Azure ML Serviceと略)で手を動かしてみたくなり、今回久しぶりに参加しました。

Connect(); 徹底解説シリーズ!~ AI 編 ~ 最新の環境が最短の開発だ! Azure Machine Learning update 2019年1月版 [ウェビナー]

取り組んだこと

以下3点で手を動かしました。2

達成したこと

手を動かしてわかったことを書いていきます。

前提

  • Workspaceの作成はAzure Portalを操作しています(azコマンドは今回使っていません)
  • Azure NotebookにてPythonコードを実行しています(Python3.6のノートブックを使用)3

※Azure ML ServiceはAzure Notebookからだけでなく、手元のPCのJupyter Notebookからでも扱えそうなので、今後試してみます

クイックスタート

Azure portal を使用したクイック スタート - Azure Machine Learning service | Microsoft Docs

  1. Azure PortalからWorkspaceを作成
  2. WorkspaceのリンクからAzure Notebookを開き、「Getting started」プロジェクトをクローン
  3. Azure NotebookからWorkspaceに接続し、Pythonコードを実行(後述のRun)

モンテカルロ法で円周率を推定しました。
2回実行しての結果がWorkspaceで確認できます。

f:id:nikkie-ftnext:20190209194010p:plain

現時点の理解を書き留めておきます:

  • Workspace:Azure ML Serviceの単位(コンテナレジストリやストレージがラップされている)
  • Experiment:Runを集めたもの。クイックスタートでは2つのRun(2回の推定結果)をもたせた
  • Run:Pythonのコードを実行、機械学習のタスクに対応。クイックスタートでは、1回の円周率の推定

チュートリアル1(MNIST)

イメージの分類チュートリアル:モデルをトレーニングする - Azure Machine Learning service | Microsoft Docs

ロジスティック回帰でMNIST(手書き数字の分類)に取り組みました。
円周率の推定の例との違いは、AzureにVM(CPUマシン)を立てていることです。

  • 円周率の推定:ローカル(Azure Notebook)で実行
  • MNIST:リモート(Azure Machine Learning コンピューティング=AzureのVM)で実行

リモートで実行するために、データや学習に使うPythonコードを送っています。
リモートでどのコードをどのデータに対して実行するかを指定(Runについて指定)したあとは、Azure Notebook上で状況が確認できました。
途中経過からリモートではDockerイメージのプルや途中経過の保存などが行われており、Workspaceがラップしているコンテナレジストリ、ストレージが関わってくるようです。

f:id:nikkie-ftnext:20190209194934p:plain

チュートリアル2(機械学習の自動化)

回帰モデルのチュートリアル: 自動化された ML - Azure Machine Learning service | Microsoft Docs

タクシーの料金を予測する回帰モデルを自動化して作成しました。
dataprep SDKでデータの前処理をしたあと、回帰モデルを自動で作成します。
Azure NotebookのFree CPUだと1イテレーションに1-2分かかったので、泣く泣く5回のうちから選抜しました。

f:id:nikkie-ftnext:20190209194958p:plain f:id:nikkie-ftnext:20190209195009p:plain f:id:nikkie-ftnext:20190209195020p:plain

今後調査したいこと

  • Azure NotebookのFree CPUよりスペックが高い環境で実行する(手元のPC上で実行、または、Azure NotebookからDSVMへ接続)
  • MNISTの例のようにリモート(AzureのVM)で自動化された機械学習を実行するにはどうすればいいのか?(データをまとめて送ればいい?)
  • dataprepを使った前処理が自分で書ける気がしないので、チュートリアルをやる https://docs.microsoft.com/ja-jp/python/api/overview/azure/dataprep/intro?view=azure-dataprep-py
  • または、pandasでタクシーデータを扱ってみる(dataprepがpandasライクに使えないことで、学習コストが上がってしまっている印象です😫)

他の方の取り組みから

感想

Azure ML Service、クイックスタートとチュートリアルでどんな感じのものかはつかめました。
個々のリソースの関係性を言語化するためにも、もう少し触りたいところです。
Kaggleのデータセットなどで使ってみようかな。(ログや性能の管理が楽になることを体感したい)

資格試験が刷新されたなど、Azure周りの情報収集もでき、作業環境も快適(VIP会議室で特に椅子が快適)で大満足です。
運営者、参加者の皆さま、半日ありがとうございました & お疲れさまでした。


  1. https://github.com/aldente-dev/aldente-dev.github.io/blob/master/connect2018/webiner.md より。2/13にDevOps、2/20にk8sとウェビナーは続くようです

  2. ウェビナーで教えていただいた https://docs.microsoft.com/ja-jp/azure/machine-learning/service/ からクイックスタート→チュートリアルの順で取り組んでいます。

  3. クイックスタート用のプロジェクトをクローンすると、チュートリアルソースコード込みで自分のアカウントにコピーされました

イベントレポート | #WEBエンジニア勉強会11 にていろいろな話が聞けて世界が広がりました

はじめに

いつも心は虹色に! nikkieです。
2/1開催の #WEBエンジニア勉強会 のイベントレポートをお送りします。

勉強会の概要

WEBエンジニア勉強会 #11 (東京都, 渋谷) - connpass

第11回目になる、WEBエンジニア初心者でも参加できることを心がけ・気軽に発表できるWEBエンジニアのための勉強会コミュニティです。初心者の方でも、一人でも、SIerの方も、学生の方も、みなさんお気軽にご参加ください。
今回もビアバッシュ形式の勉強会です。 ピザ・飲み物・おつまみを用意する予定です。 飲み食いしながらワイワイとやりましょう!

昨年11月の10回目に続いて2回目の参加です。
初参加の10回目が楽しかったので、今回も楽しみにしていました。
アウトプットに結びつけるために今回はブログ枠での参加です。

10回目の私の様子はこちらのツイート一覧から観察できます。
また、いわしまんさんのブログに10回目の様子がまとまっています!
【イベント】WEBエンジニア勉強会#10にお邪魔してきた話 - Rのつく財団入り口

発表振り返り

冒頭の『「みてね」を推す理由』には残念ながら間に合わず(無念)、決済の仕組みの話から参加となりました。
Web開発に限らず、開発一般に共通する話が多かった印象です。
今回はどんな発表があったかを数行でまとめます(リンクからスライドをご覧いただけます)

11回目の私のツイート一覧はこちら
発表を聞いて考えたことや手を動かしたことを今後アウトプット予定です。

感想

10回目よりも多様なテーマの話が聞けた回でした(同じ卓で「色んな話が聞けていいですね」という話になりました)。
アウトプットのネタをたくさんいただいたので、少しずつになるかと思いますが、今後消化していきます。
発表者、運営者、参加者の皆さま、ありがとうございました。