nikkie-ftnextの日記

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

Event report | Python Web Day (additional track in #ploneconf2018 )

はじめに

いつも心は虹色に! nikkieです。
手伝っていたPlone Conf 2018併設イベント「Python Web Day」は全プログラム終了しました。
英語も織り交ぜてレポートブログに挑戦します。

Hello, Everyone! This is nikkie.
"Python Web Day" has finished all programs.
I try to write the report in Japanese and English.

前提(About nikkie)

  • ソフトウェアエンジニア3年目 (3rd year software engineer)
  • Pythonでは半年程度のWeb開発の経験あり (web development with Python about half of a year)
  • Ploneは未経験(先日vagrantで環境構築してみました)(novice about Plone. I tried creating an environment with vagrant)

  • 英語は読むことが多く、話そうとすると言葉に詰まりがちです。(I often read English. I do not speak and write much)

多くの方の力を借りて、併設イベントの手伝いをやりきれました。
深くお礼申し上げます。
With the help of many people, I was able to run Python Web Day.
Thank you very much, especially @terapyon, @takanory, @mamix1116, @kaizumaki.

イベントの概要 (About Python Web Day)

Python製のCMS Ploneについての国際カンファレンスです。
海外からの参加者に日本のエンジニアの活動を知ってもらい、交流するという狙いで併設イベントも開催されました。
Python Web Day」はWebについて話す併設イベントです。 @mamix1116さん(Django Girlsのオーガナイザー)のサポートとして、10月から手伝っていました。

#ploneconf2018 is an international conference about Plone.
We have additional tracks so participants from overseas can know activities of engineers in Japan and interact with each other.
Python Web Day is an additional Track on 7 Nov.
I was helping in the operation from October as a support of @mamix1116, the organizer of Django Girls in Japan,

オープニング

「どこから来ましたか」で盛り上がりました。
多くの方がヨーロッパから来られていて驚き!
また、多くの方が4回以上参加されているそうです。

It got excited at the topic "Where did you come from?"
So many people came from Europe!
And many people have participated more than 3 times!

Keynote: THE STATE OF PLONE

Zopeゴジラ、「Difficult to Kill」で会場大爆笑でした。
A huge laugh happened at the topic Zope = Godzilla, "Difficult to Kill".

バトンタッチしたPaulさん(Plone FoundationのChair)からPython Web Dayモデレータとして紹介いただくという素敵なサプライズもありました!
There was also a nice surprise that Paul introduced @mamix1116 and me as moderators of Python Web Day!

カンファレンス本編のトークは後ほどYouTubeに上がるそうです。
The conference talks will be uploaded to YouTube later.

以下、Python Web Dayのトークを紹介します。
I introduce talks of Python Web Day.

Build a RESTful API with the Serverless Framework

@masahitoさんによるトークです。

  • AWSではAWS API GatewayAWS LambdaでAPIを作れる(We can create a API in AWS with AWS API Gateway and AWS Lambda)
  • Serverless Frameworkを導入すると1コマンドでデプロイできる(We can deploy with 1 command using Serverless Framework)
  • プラグインを使うとデプロイしやすくなる(Plugins of Serverless Framework make deploy easier)

Azure Functionsで使ってみたいと思いました。
I want to try Serverless Framework with Azure Functions.

Building a REST API with Django and Django REST Framework

@checkpointさんによるトークです。

  • REST APIを一から作るのは大変なので、フレームワークを使う(It is hard to create a REST API from scratch, so we use a framework)
  • Django REST Frameworkを使いこなすにはSerializerが肝」と感じた(It seems for me that Serializer is important to master Django REST Framework)

Powerful geographic web framework GeoDjango

@omegaさんによるトークです。

GeoDjangoは聞いたことはありますが、触ったことはありません。
確かに地理情報を扱いやすそうです。
I have heard of GeoDjango, but I have never touched it.
It certainly seems easy to handle geographic information.

@mamix1116さんからも話を聞くことが多いので、この機に触ってみようと思います。
I will try the tutorial that I taught. (@mamix1116 loves GeoDjango)
GeoDjango Tutorial | Django documentation | Django

Sphinx customization for OGP support

@shimizukawaさんによるトークです。

Sphinx ExtensionでのOGPタグの生成ロジックを聞いて、少しOGPの理解が深まったと感じています。
I feel that my understanding of OGP has improved a bit, listening to the generation logic of OGP tags in Sphinx Extension.

Sphinxつながりで、LTにて紹介された:linenos:なども試してみたいです。
I'd like to try :linenos: introduced in LT about Sphinx.

How to make the fastest Router in Python

GitHub - kwatch/router-sample: sample Router classes in Python

@makotokuwataさんによるトークです。

  • Linear search is slow
  • Regex search is fast(ただし工夫は必要 But need some ingenuity)
  • State Machine approach is the fastest

ルータを早くするために、計算コストが小さい処理で実装するという観点は勉強になりました。
I was glad to hear about implementation with processing with a small calculation cost (for fastest router).

Micro Service Architecture with Machine Learning Application

GitHub - Swall0w/microservice-ml-demo: Micro service architecture using rest API

  • モデルをデプロイしやすくために、Flaskアプリケーションから切り出す(Separate a model from a Flask application to make deploy easier)
  • クライアントとFlaskアプリケーション間はREST API (REST API is used between a client and the Flask application)
  • FlaskアプリケーションとML Model間がgRPC (gRPC is used between the Flask application and the model)

終わりに

最後までお読みいただきありがとうございました。
今後トークのメモのリンクを追加します。(イベント準備総括ブログも書く予定です)
英語の表現に不自然なところがあったら教えていただけると嬉しいです。

Thank you for reading.
I will add a talk note link later. (I'm also planning to write an event preparation summary blog.)
I would be happy if you could tell me if there are unnatural English expressions.

イベントレポート | 第93回 #pyhack にて #ploneconf 併設イベント準備を進めました

はじめに

いつも心は虹色に! nikkieです。
定期的に参加している #pyhack で、Plone Conf 併設イベント Python Web Day の準備に取り組みました。

勉強会の概要

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

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

今回はいつもより人数が少なめでこぢんまりとした雰囲気でした。
常連が少ないのと対照的に初参加の方が多かったです。

なお、裏番組としてオープンソースカンファレンスがありました。(Plone Confのアピールも行われたそうです)
オープンソースカンファレンス2018 Tokyo/Fall - オープンソースの文化祭!

Plone Conf 情報まとめ

2018/10/14からのアップデートをまとめておきます。

カンファレンスの併設イベントは

  • 11/7:Python Web Day
  • 11/8:Database Day
  • 11/9:Frontend Day

です。
「ちょっと興味あるかも」という方、国内開催のまたとない機会です!
ぜひご来場ください。

11/5のイベントのトピックの一つ、ヘッドレス(頭がない)からGuillotina(ギロチン)だそうです。(一本取られた)

取り組んだこと

併設イベントについて、海外からの参加者に周知するためのスライドのドラフトを作成しました。
(pyhackで作成したものを別リポジトリに切り分けました。10/29-週でアップデートしていきます)

キーノートの後に少し時間をいただいて併設イベント「Python Web Day」についてお知らせします。
内容は

  • 併設イベントがあることを紹介(11/7はPython Web Day)
  • Python Web Dayの狙いを共有
  • Python Web Dayのトークラインナップを紹介

です。
私自身英語でのトークはほとんど経験がないのですが、可能な限り準備して臨みます。

移動時間に部屋の前で呼び込みに使うスライドや、タイムキープに使うスライドのドラフトも準備しました。

他の方の取り組みから

感想

今回も非常に楽しい時間でした。
今回は懇親会まで参加したのですが、笑い話から考えさせられる話まで盛りだくさんであっという間でした。
転職して感じていることには別の見方があるということを、懇親会という思いもよらないタイミングで気づいたのが一番の収穫です。
1日ありがとうございました!

Plone Con併設イベント(Python Web Day)の準備を手伝っています #ploneconf

はじめに

いつも心は虹色に! nikkieです。
先週くらいからPlone Conの併設イベント準備を手伝っています。
イベントが盛り上がることを願って、準備のプロセスをブログに残します。

Plone Conとは?

Ploneとは、Python製のCMSと理解しています。
WordPressPython版というイメージ)
詳しくは知らないので、今後触ってみます。

Ploneの国際カンファレンスが今年は日本で開催されます。
https://2018.ploneconf.org

11/5(月)〜11(日)の1週間、東京でPlone Conferenceが行われます。

  • 11/5-6:Training
  • 11/7-9:Talks
  • 11/10-11:Sprint

会場はpyconjpと同じ「大田区産業プラザPiO」です。
(注意:Sprintは会場が違うようです。詳しくはPlone Conのページでご確認ください)

11/7(水)〜9(金)のTalkの裏で、併設イベントが企画されています。

  • 11/7:Python Web Day
  • 11/8:Database Day
  • 11/9:Frontend Day

私が手伝っているのが、11/7のPython Web Dayです。
Frontend Day担当の方の情報発信に触発され、私も発信することにしました。
Frontend Day ビルドダイアリー を始めます|Kazuhiro Hara.|note

併設イベント:Python Web Day

併設イベントの狙いは、「日本からの参加者を呼び込み、Plone Conを盛り上げる」ことです。
カンファレンス自体は1週間ですが、併設イベント用に1Dayチケットが用意されます。
併設イベントに惹かれた方は是非ご参加いただければと思います。
(参加はWeb Dayでなくても構いません。Plone Conが盛り上がるのが何より嬉しいです)

カンファレンス本編のトークに併設イベントのトークトラックを追加するイメージです。
(カンファレンス本編と併設イベントを行き来できるようにする)

私は「Webって広いなー」と感じているので、Webの広がりをお届けできるようにスピーカー候補の方にお声がけしています。
こんなトークが聞けるように準備しています。

併設イベントのトークは「Ploneを扱っていなくてもOK!」です。
海外からPlone Conに来られた方に、日本のPythonistaの活動のありのままを知っていただこうという意図です。
(そこから何か新しいものが芽生えたら素敵ですね)
スピーカー候補の皆さま、お力をお貸しいただけると大変助かります!

動いているメンバー

  • @takanoryさん(pyhackでお世話になっています)
  • @mamix1116さん(Django Girlsでお世話になっています)
  • nikkie

登壇者募集中!

話したいことがある方はお気軽にご連絡ください。
トークにあたって、以下のお願いがありますので、連絡前にご確認ください。

  • スライドは英語でお願いします
  • トークは英語で挑戦していただけると嬉しいですが、日本語でもOKです
  • 恐れ入りますが、Plone Con 1日分の参加費が発生します。(1万円程度の1Dayチケットが用意されると聞いています)

トークは20分枠(6枠予定)と40分枠(2枠予定)で用意しています。
(40分の枠が5つあり、40分枠をいくつか分割することにしました)

日本にいながらにして国際カンファレンスで登壇できる機会です。
英語での登壇に挑戦してみたいという方いらっしゃいましたら、私宛にTwitter DMでお気軽にお問い合わせください。

最後までお読みくださりありがとうございました。
この記事を読んで併催イベントに登壇してくださる方やPlone Conにいらしてくださる方がいたら、それ以上に嬉しいことはありません。
国際カンファレンスの準備に関われるなんてめったにないことだと思うので、準備を楽しんでいきます!

イべントレポート | 横浜のDjango Girls Workshopでコーチデビューしました #djangogirlsyokohama

はじめに

いつも心は虹色に! nikkieです。
2018/10/06に横浜のDjango Girls Workshopでコーチをしてきました。
とても楽しい一日だったというのと、Django Girlsの取り組みがますます広がることを願って、イベントレポートを残します。

勉強会の概要

これからWebサイトの作り方を学びたい、プログラミングを学びたいと思っている女性のみなさん、初心者向けの1-Dayワークショップを開催します!

このブログでもたびたび取り上げていますが、2018年5月からDjango Girls Tutorial翻訳に参加してきました。
Tutorialを数周したことで、「次は教えるという形で手伝えるんじゃないか」と考え、コーチに手を挙げました。

上記サイトの会場までの地図が非常にわかりやすく、方向音痴な私は大変助かりました!

イベントレポートお品書き

  • コーチをやってみて
  • Pythonを始める方に伝えたいこと
  • コミュニティに関わるということ

コーチをやってみて

  • はじめてプログラミングされる方のコーチをした
  • 意外なつまづきポイント:エディタ
  • 私の理解が進んだこと:関数とメソッド

はじめてプログラミングされる方のコーチをした

はじめてプログラミングされる島(3名)を担当しました。(コーチは2人体制)
夕方はコーチを増員して1:1の体制を取り、全員Djangoに触ることができました!
プログラミング未経験で、1日で以下の3つをやりきるというのは本当に素晴らしいです。
チュートリアルにもある表現ですが、「自分で自分を褒めてあげて」ください!

  1. コマンドプロンプトに慣れる(普段はマウス操作)
  2. Pythonに入門する
  3. DjangoでWebサイトを動かす(開発用Webサーバを動かし、管理画面から記事を書くところまでは全員進められたと思います)

意外なつまづきポイント:エディタ

Python入門でエディタからインタプリタに切り替えるところで難しく感じることがわかりました。
Python入門 「保存しよう!」
エディタでの開発に慣れている身にとっては新鮮な気づきでした。

AtomPythonを書いて保存し、コマンドプロンプトでファイルを実行するのですが、腹落ちするのが難しい箇所のようです。

コマンドプロンプトの役割が「Pythonを書くところ」から「Pythonを実行するところ」に変わり、Atomという「Pythonを書く」役割の新しい登場人物が出てくるからかと思います。

私の理解が進んだこと:関数とメソッド

Python入門 「文字列」から

「関数とメソッドはどう違うんですか?」という質問、回答がなかなか難しかったです。

  • 関数は「異なるタイプのオブジェクトに」適用できる(=複数のオブジェクトに適用できる)
    • len()関数はstrlistに適用できる(適用できないオブジェクトもある:例えばint
    • str()関数はintfloatに適用できる
    • 一番わかりやすいのはprint()でしょうか
  • メソッドは特定のオブジェクトに限って適用できる
    • "Ola".upper()のようにオブジェクト.メソッド名()という書き方になる
    • intオブジェクトのメソッドには、例えば、int.bit_length() というものがある

答えにくかったのは、オブジェクトの理解が甘いためと考えられるので、次回までにPythonチュートリアルを確認します。

Pythonを始める方に伝えたいこと

10/5のインストールDayの交流タイムから、「Pythonをはじめたときに作ったものを紹介できるのでは」と気づき、再演という形でLTさせていただきました。

伝えたいこと

  • Python(プログラミング)はWebサイトを作る以外にもいろいろなことができる
  • 私の場合、どんなことができるか知る上で『退屈なことはPythonにやらせよう』が役に立った(画像処理のほか、PythonからExcelを触るようなことも紹介されている)

公開されている原文をGoogle翻訳することで、日本語でも読めると思います。
Automate the Boring Stuff with Python

11月の東京開催に向けて、「プログラミングを始めた方に共有したいこと」としてLTを準備してみます!
始めた後はいかに継続するかだと思うので、継続する上で私が学んだこと・大切にしていることを共有予定です。

コミュニティに関わるということ

「コミュニティに関わってよかった」と感じたすばらしい1日でした。

ワークショップでは、初めてプログラミングされる方が、1日でDjangoを触る姿を見て感銘を受けました。
翻訳したTutorialに目の前で取り組んでいただき、直接フィードバックもいただけて感無量でした!

懇親会はさまざまな年代の方が入り混じり、たくさんの興味深いお話が聞けました。
今後の展開などさまざまなアイデアがうごめいていて、「なんだか素敵なことが始まろうとしている」という高揚感でいっぱいでした。
コミュニティ活動をしてみて、「カイゼン・ジャーニーで言うところの『1人の限界を超える』ってこういうことでもあるのかな」と感じました。

また、コーチのミヤモトさんのお知り合いが私に興味を持ってくださっているそうです!
Django Girlsとは別なのですが、「あにべん!」でアニメから学んだことLTをしたのがきっかけで、興味を持ってくださったと知り、大変うれしく思います。
もしこの記事を読んでくださっていたら、遠慮なくDMなど飛ばしていただければ、お会いする時間を設けたいなと思います。

終わりに

私自身はすごく素敵な1日を過ごすことができ、参加者、コーチ、運営の皆さまに心からお礼申し上げます。
素敵な1日をありがとうございました。
そして、参加された他の方にとっても素敵な1日だったのであれば、こんなにも嬉しいことはありません。

知識を補い、LT準備をし、次回の東京ワークショップに備えます。

最後までお読みいただきありがとうございました。
Django Girls Tutorial 日本語版へのフィードバックや、Django Girlsの活動への参加やご支援をいただけましたら、幸甚に存じます。

Django Girls Tutorial修了者が投票アプリチュートリアルでDjangoの理解を深めました(その1, 2編)

はじめに

いつも心は虹色に! nikkieです。
先日の #pyhack で、Django公式ドキュメントのチュートリアル(投票アプリ)に取り組みました。
手を動かしてみて気づいたことをアウトプットしていきます。
今回はその1(最初のビュー)とその2(モデルの作成)です。

チュートリアルの概要

はじめての Django アプリ作成、その 1 | Django documentation | Django から始まる7回構成のチュートリアルです。
作るアプリの名前をとって「投票アプリチュートリアル」と呼ぶことにします。
なお、私のDjangoレベルは「Django Girls Tutorial修了」です。
Django Girls Tutorialを終えてから投票アプリチュートリアルに取り組んだことで、Djangoへの理解が深まったと感じています。

それでは早速アウトプットしていきましょう。
最後までお付き合いいただけますと幸いです。(長めなので拾い読みも推奨します)

その1:プロジェクトとアプリケーション作成

はじめての Django アプリ作成、その 1 | Django documentation | Django

動作環境

以下の環境でチュートリアルを進めました。

(env) $ python -m django --version
2.1.1
(env) $

仮想環境のディレクトリenv/と同じ階層でdjango-admin startproject mysiteを実行したところ、env/と同じ階層に「外側のmysiteディレクトリ」ができました。

  • ├ env/
  • └ mysite/
    • ├ manage.py
    • └ mysite/
      • ├ __init__.py
      • ├ settings.py
      • ├ urls.py
      • wsgi.py

django-admin startproject mysiteは、現在のディレクトリ内にmysiteディレクトリを作り、その中にmanage.pyとmysiteディレクトリを作るようです。
Django Girls Tutorialではdjango-admin startproject mysite .1と現在のディレクトリを指定しているため、フォルダ構成が異なります(外側のmysiteディレクトリがありません)。

プロジェクトとアプリケーション

mysiteプロジェクトの中にpollsアプリケーションを作成して進めていきます。

違いについて、チュートリアルより引用。

  • 「プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたもの」
  • 「アプリケーションとは、実際に何らかの処理を行う Web アプリケーション」

mysite/urls.pyとpolls/urls.py

以下の例から、mysite/urls.pyは確かに「目次」だと納得しました。

URLをpolls/からfun_polls/にしたければmysite/urls.pyを変える。

urlpatterns = [
    path('fun_polls/', include('polls.urls')), # 変更
    path('admin/', admin.site.urls),
]

f:id:nikkie-ftnext:20180929171501p:plain:w400
path('content/polls/', include('polls.urls')),に変えると。。 f:id:nikkie-ftnext:20180929171502p:plain:w400

その1についての疑問点

  • mysite/settings.pyのINSTALLED_APPSのリストにpollsを書き加えていないが、Djangoの動作に支障はないのか?
    • Django Girls Tutorialではblogアプリ作成後に書き加えている2
    • 最初のビューは問題なく表示できている
    • その2に進んだら解決した
  • アプリケーションを複数のプロジェクトで使う例が知りたい

その2:モデル(QuestionとChoice)

はじめての Django アプリ作成、その2 | Django documentation | Django

データベースはデフォルトのsqliteを使っていきます。
mysite/settings.pyのTIME_ZONE にはDjango Girls TutorialにならってAsia/Tokyoを指定。3

モデル作成

  • モデルのフィールドの最初の引数は「人間可読な名前を与え」るために用いる
    • 例:pub_date = models.DateTimeField('date published')
  • mysite/settings.pyのINSTALLED_APPSに追加してアプリケーションをプロジェクトに含める(=マイグレーション対象にする
    • 指定の仕方:polls.apps.PollsConfig4
    • polls/(アプリケーション)の下のapps.pyの中のPollsConfigクラスを指定している
class PollsConfig(AppConfig):
    name = 'polls'
  • モデル変更実施の3ステップ
    1. models.py変更
    2. マイグレーション作成(makemigrations)
    3. データベースに変更適用(migrate)
  • 覚えておきたいmanage.py関連コマンド
    • python manage.py sqlmigrate polls 0001: migrateで適用されるSQLの確認
    • python manage.py check:プロジェクトに問題がないかの確認

データベースAPI

インタラクティブシェルで遊んでORMに慣れる。

  • 存在しないidを指定したとき、getはError(DoesNotExist)を上げるが、filterでは[](空のリスト)が返る
  • get(id=1)の代わりにget(pk=1)がよく使われる
  • ForeignKeyはChoiceに設定しただけ(polls/models.py)だが、Question側からも結びつくChoiceを確認できる(choice_set)

管理画面

polls/admin.pyにadmin.site.register(Question)を追加したところ、管理画面からPollsが操作できるようになった。
f:id:nikkie-ftnext:20180929171629p:plain

その2についての疑問点

  • 内省機能とは?(原文確認する)
    • 「このフィールド名(引用者注:モデルのフィールドの最初の引数のこと)は Django の二つの内省機能で使う他、ドキュメントとしての役割も果たします。」
  • DjangoRailsとは思想が違うという点をもっと詳しく知りたい。
  • インタラクティブシェルで遊ぶ中で日時がUTCのところがあった
    • 管理画面で見たDate publishedは日本時間で一致した(レコード作成時はJSTに合わせなくてもいいということ?)
>>> q.pub_date
datetime.datetime(2018, 9, 29, 4, 44, 5, 602909, tzinfo=<UTC>)

今回はここまでです。
次回、その3(ビュー)からのアウトプットでお会いしましょう。
最後までお読みいただきありがとうございました。


  1. プロジェクトを作成しよう! · Django Girls Tutorial より。「コマンドの最後にピリオド . を入力したことを確認してくださいね。」

  2. Djangoモデル · Django Girls Tutorial より。「アプリケーションを作ったら、Djangoにそれを使うように伝えないといけません。 」

  3. プロジェクトを作成しよう! · Django Girls Tutorial

  4. Django Girls Tutorialではblogアプリケーションをblogとして指定しています(Djangoモデル · Django Girls Tutorial )。ここはblog.apps.BlogConfigとも指定できると理解しました。

  5. 例: rails generate model User name:string email:stringRuby on Rails チュートリアル:実例を使って Rails を学ぼう より)

イベントレポート | 第92回 #pyhack にてDjango投票アプリチュートリアルを進めました

はじめに

いつも心は虹色に! nikkieです。
定期的に参加している #pyhack で、Django公式ドキュメントのチュートリアル(投票アプリ)に取り組んできました。

勉強会の概要

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

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

pyhackのイメージは「猛者の集まるもくもく会」です。
Pythonの経験豊富な方ばかりで、聞こえてくる会話に耳を傾けていると学びがあります。

取り組んだこと

朝の時点での目標は「Django公式ドキュメントのチュートリアル(その1〜その7)を通してやる」でした。
はじめての Django アプリ作成、その 1 | Django documentation | Django から始まる7回構成のチュートリアルです。
1日でその1〜その4まで進めることができました。
なお、私のDjangoレベルは「Django Girls Tutorial修了」です。

作った投票アプリはこんな感じです。

  • 質問(Question)の一覧画面
    f:id:nikkie-ftnext:20180929170927p:plain:w400
  • 質問には選択肢(Choice)が結びついています。質問詳細画面で確認し、選択肢に投票できます f:id:nikkie-ftnext:20180929170938p:plain:w400
  • 投票結果の表示画面
    f:id:nikkie-ftnext:20180929170948p:plain:w400

感想

Djangoがはじめての人には、投票アプリチュートリアルよりもDjango Girls Tutorialがオススメ」という意見をよく目にするのですが、そのとおりだと感じました。

逆の見方をすると、Django Girls Tutorialを終えた後に取り組むと、深いところが説明されているために「こういうことだったのか!」という気づきが多々ある内容だと思います。
Django Girls Tutorialは初めてプログラミングをする方が対象者なので突っ込んだ説明ができないのでしょう。 投票アプリチュートリアルはプログラミング経験者向けに説明がされています。(例えば、mysite/urls.pyとpolls/urls.pyの違い、ビューはHttpResponseか例外を返す、など)

投票アプリチュートリアルでは、リスト内包表記(その3の質問一覧ビュー)や、try ... except ... else ... (その4の投票機能ビュー)といった文法を説明なく使っています。
このあたりはわかっている(または自力で調べられる)方が対象なのでしょう。
Django Girls Tutorialからスムーズに接続するには一工夫必要そうです。

チュートリアルのポイント

気づきを記事に盛り込んでいたら長くなってきたので、気づきは別の記事としてアウトプットします。

  • その1:プロジェクトとアプリケーション作成
    • プロジェクトとアプリケーションの違い、mysite/urls.py と polls/urls.py の違いについて理解が深まった
  • その2:QuestionとChoice、2つのモデルを作成(インタラクティブシェルでORMをみっちり練習)
  • その3:ビューとテンプレート
    • ビューはHttpResponseなるものが肝。これはDjango Girls Tutorialでは意識してこなかった。
  • その4:汎用ビューに書き直し
    • その3までに作成したビューのコードをほとんど書き直した。polls/views.pyのメソッド定義がなくなり、コードが削減されたのは衝撃。「Djangoにこんなの用意されていたのか!」

今回手を動かして、Django Girls Tutorialの知識が補完されたと感じています。
10/6にワークショップのコーチで活かしてみます。

他の方の取り組みから

感想

毎回言っている気がしますが、非常に楽しい時間でした。
今回懇親会は泣く泣く諦めたので、次回リベンジ狙います。
何人かの方には来週のPyLadiesのパーティー(LT会)でお会いできそうで楽しみです^ ^
1日ありがとうございました!

登壇報告 | #stapy にて機械学習モデルをDockerでデプロイする方法について話しました

はじめに

いつも心は虹色に! nikkieです。
9月の「みんなのPython勉強会」(参加者100人規模)に登壇しました。
機械学習モデルをDockerでデプロイする方法について10分で話しました。
このエントリで登壇報告をします。

勉強会の概要

みんなのPython勉強会#38 - connpass

「Stapy秋祭り第1弾:秋の夜長のショートトーク会」
9/15~18にPyCon JP 2018が開催されます。年に一度のPythonのお祭りに合わせて、Stapyでも秋祭りを開催します!第1弾として、「秋の夜長のショートトーク会」と題し、Python好きなGeekのみなさんに、自分の好きなテーマについて自由に語ってもらうショートトークをしていただきます。LTよりは長いけど、通常の講演(GT: General Talk)より短いトークを7件、ご用意しました。秋の夜長の季節です。Pythonの楽しい話で盛り上がりましょう。

2月くらいから「LT駆動学習」に勤しんでいたところ、大変ありがたいことに、今回登壇の機会をいただきました。

登壇:Entrance of Docker for Pythonista 〜Dockerではじめる機械学習モデルのデプロイ〜

「好きなテーマで」と言っていただけたので、「大好きなDockerを他の方にも知ってもらおう」というモチベーションで登壇しました。
聞いた方にDockerを使ってみていただきたかったので、機械学習モデルをDockerでデプロイする流れを紹介しました。

伝えたかったこと

開発環境と本番環境の双方でDockerを用いることで、動作するアプリケーションを本番環境へ持ち運べるようになります。

Dockerを使って機械学習モデルをAPIとしてデプロイする流れは、次の通りです。

  1. モデルを用意する
  2. FlaskでAPI
  3. アプリケーションをコンテナ化(Dockerfileを書いてビルド)
  4. VM(またはPaaS)にデプロイ

あやめの分類器をGCPの仮装マシンにデプロイし、この手順(仮説)を得ました。
今後他のモデルでも検証し、必要に応じてアップデートします。

テーマに至った経緯

当初は環境構築の話をしようとしていたのですが、参加者の方が聞きたいトークにするため、機械学習を絡めました。
詳しくはこちらにあります:イベントレポート | Pythonもくもく自習室 #13 あやめの分類器をAPIに組み込み、Dockerイメージ作成 #rettypy - nikkie-ftnextの日記

テーマを決める上で、こんな図を作って整理しました。
f:id:nikkie-ftnext:20180921072300j:plain

質疑より

1週間ほど前の出来事を記憶ベースで書いているので、認識違いにはご容赦ください。

Dockerのメリットの体験談

私がDockerのメリットを体験したのは、環境構築のしやすさです。
協調フィルタリングをPySparkで行う際、Dockerを使ったところ、PySparkの環境構築が手短に済みました。1
他にもデータ分析環境構築に役立つノートブックが公開されています:https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html:html

会場では話していませんが、デプロイのしやすさもあります。
VPSにDockerをインストールして、docker-compose up -dでデプロイしたところ、手動デプロイに要していた時間が劇的に短縮されました。2

Dockerの普及について

主催の @akucchan_world さんから。
アカデミックな領域ではDockerの普及が進んでいないという情報共有がありました。

私の知っている以下の情報を共有しました。

  1. DockerはGUIで使えるようにアップデート予定
  2. Kubernetesは意識しなくてよくなる方向へ向かっている(Knative)

1点目は以下の情報をベースにしています。
[速報]次期Docker for Win/Mac、GUIの数クリックで簡単にアプリケーションのコンテナ化と実行が可能に。DockerCon 2018 - Publickey
3ヶ月毎にリリースされるので、10月リリース版からはGUIで使えると期待しています。

2点目ですが、Kubernetesとは本番環境でコンテナを動かす際に使う「オーケストレーションツール」のデファクトスタンダードです。
これがクラウドで抽象化されていき、デプロイする側はKubernetesを意識しなくてよくなると理解しています。

なお、Dockerの普及が進んでいないという点に関しては、時間的な制約もあるそうです。

宿題事項

興味を持った方向けに詳細な説明を用意したいと思っています。

また、Dockerfileやソースコードについては正常系で最低限動作する状態です。
以下のアップデート項目があります。

  • アプリケーション実行ユーザを用意する(現状rootユーザ)
  • POSTしたJSONにwidth, height両方のキーがないと、FlaskのAPIは実行中にエラーを吐き、500を返す点の修正
  • APIの動作確認ができるビューがあるとよかった
  • WebAppsで動かない件のデバッグ3

アウトプットしたことの周りを固めていくことが、PyCon登壇という目標につながるんじゃないかと、今の時点では考えています。

感想

ショートトークは、懇親会のLTと景色が違いました(皆さん着席されていてまさに「講義」という感じでした)。
登壇の機会を与えてくださった、@akucchan_world さんをはじめとするstapyスタッフの皆さまに感謝します。
また、聞いていただいた参加者の方、懇親会でフィードバックをくださった方々、ありがとうございました。

stapy LT王子4代目の称号をいただいたので、引き続きLT駆動で取り組んでいきます。

実は、今回の準備は全部Dockerでやりました。4
ここまでいくとやりすぎ感もありますが、さまざまな環境を立てられるDockerは本当に便利です。
皆さまがDockerで幸せになれることをお祈りしつつ、筆を置かせていただきます。
Happy Docker Life!

脚注


  1. HadoopやMesosなどDockerを使わずに環境構築できたか、あまり自信がありません。

  2. 手順に慣れる目的なのでdocker-composeを使いました。本番環境では、Kubernetesなどのオーケストレーションツールを使うべきである点にご注意ください

  3. ENTRYPOINTやCMDの組合せが問題ではないかとご指摘いただきました。ありがとうございます。ご指摘参考に切り分けてみます。

  4. あやめの分類器作成のjupyter環境、ローカルでのFlaskアプリ作成、本番環境(GCPVM)へのデプロイ、いずれもDockerを使っています。Dockerという金槌を気に入ったことで、なんでも釘に見えている状態かもしれません。持ち歩かないちょっとした環境なら、仮想環境を使ったほうがベターだと思います。(pypro3によると、仮想環境はファイルサイズが小さいそうです)