Django! Django! Django!

この投稿は PyLadies Advent Calendar 2018 の9日目の記事です。

このタイトルにピンと来た方、さては村上春樹ファンですね。(一応元ネタ

ではなく、今年はまさにDjangoの年でしたね(個人的見解)。

PyLadiesもくもく会や合宿でも「今日はDjangoの勉強します!!」という方がとても多かったです。

その中でも、Django Rest Fremewark(以下DRF)を学びたい方が多く、どうやって勉強すればいいか聞かれる機会が増えましたので、超ざっくりDRFの全体像と自分が勉強した方法を紹介したいと思います。

※ ここで紹介する例は、Django REST framework Quickstartで作成したプロジェクトを元にしています。5分程度で、さくっとDRFのプロジェクトが作成できますので、ぜひお試しください。

Django REST framework(DRF)

RestfulなAPIということは、モデルと1対1で結びつくようにAPIを作っていくイメージだと思います。 1モデル内のリソースに対して一覧を問い合わせたり、モデルの各レコードに対して追加・更新・削除を行いますので、それをDRFで実現するためには、最小限下記の設定が必要です。

f:id:electricSheep:20181209132626p:plain

(1) URLConf

プロジェクト作成時に自動生成される urls.pyは 、あるURLに対してリクエストが送られた場合、レスポンスを返すビュー関数を指定するための設定を行うためのものです。

Quickstartの例では、URLConf(urls.py)にRouterを使用して設定しています。

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

## Router

  • RouterにはSimpleRouterとDefaultRouterの2つが用意されています。
  • ネストしたエンドポイントを対応可能にするpackagesもあります
  • Routerに登録できるのはViewSetのみで、APIView / GenericAPIViewでは利用できませんが、ViewSetをルータクラスに登録するだけで、APIのURLconfを自動的に生成できます。
  • ViewSet以外では、urlpatterns にURLのパターンとそれに紐付けるビュー関数を追加します。

(2)View

  • 役割としては、Webリクエストを引数にとり、 Webレスポンスを返します。
  • Viewは下記種類があります。

    • ViewSets
    • Views
      • Function view:関数ベースのビューを扱うための@api_viewデコレータを使用して定義する
      • Class based view:クラスベースのビューを扱うためのAPIViewクラスを継承して定義する
    • Genericviews
  • リクエストパースをサポートするRequestオブジェクトが提供されていて、下記により、POST, PUT, PATCH メソッド のリクエストの場合にリクエストボディを解析したものが辞書形式で取得することができます。

request.data

※なんと、この1行でファイルおよび非ファイル入力を含む、すべての解析されたコンテンツを取得することができる。parser_classesを指定すれば、勝手に解析してエラーを返してくれたりもする。

  • DRFはResponseオブジェクトも提供します。
  • ResponseはWebページ(HTML)やエラー、jsonドキュメントやPNGJPEGといった画像など、何でも返す事ができます。

(3) Serializer

  • HTTPResponseで返すために、modelのインスタンスjson などの出力可能な形式に変換するための手段を提供します。
  • また、Requestで受け取ったストリームをPythonで扱えるデータ型にパースして、オブジェクトインスタンスに復元します。(デシリアライズ
  • serializersは4つ用意されています。
    • serializers.Serializer
    • serializers.ModelSerializer
    • serializers.ListSerializer
    • serializers.HyperlinkedModelSerializer
  • ネストしたモデルの作成・更新に便利なthird-party packagesもあります  - https://github.com/beda-software/drf-writable-nested
  • バリデーションはSerializerで、決まったルールによって実行されます。コード上は簡潔にかけるのですが、内部で行われいてる実行順序などを把握していないと、???になりますので、最後に記載した参考ページを参考にするとよいと思います。ここでは詳細を省きます。

勉強法

ここまで見てわかったように、Router、View、Serliarizerごとに、いろいろな種類が存在するので最初混乱しがちです。(少なくとも自分は混乱した。。) これに加え、DRFでは例えば以下のような便利機能がたくさん提供されていて、そういった機能を把握するも大切です。

  • (例)特定のビューにアクセスできるユーザを制限するのに便利なパーミッションクラス
from rest_framework import permissions
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

viewにたったこの2行を記述するだけで、認証されたユーザーに対しては完全にアクセスできるようにし、認証されていないユーザーには読み取り専用アクセスを許可するという設定をすることができます。 最初、あまりにも少ない記述でいろいろ実現できていて、いったいそれらの処理はどこに書かれているんだ!とこれまた混乱しました。

ここではざっくりと概要だけ書きましたが、詳細に関しては、下記参考になるページ、本を列挙しましたので、そちらを参照してもらうとすっきりわかると思います。

それぞれたくさん種類がありますが、用法によって使い分けができると思いますので、まずはそれぞれで何ができるのか・できないのか、どんな機能が提供されているのかを把握するのが近道かと思います!

また、自分がやりたいことを実現できそうなものを見つけたら、先に説明したQuickstartのようなシンプルなプロジェクトを作成して、django-rest-framework の内容をもとに1つずつ動きを確かめる方法が自分はわかりやすかったです。

Let's enjoy DRF !

参考ページ

PyLadies Tokyo 合宿 in 沖縄にいってきました!

今年もPyladies Tokyoの合宿に参加してきたのでそのレポートです。

Pyladies合宿も今年で4回目になります。私は今年で3回目の参加です。 年に1回、2泊3日で行なっているこのイベント、conpassに公開すると同時にすぐうまる人気イベントです。 毎年、PyLadies初です!という方も参加してくれ、今年も何人か初参加してくれました^^

なぜ沖縄だったのか

毎年近場で行っていた合宿ですが、初代PyLadiesTokyo代表の@a_macbee ‏さんが、会社設立と共に沖縄に戻ってしまたこともあり、昨年の合宿で「来年は沖縄でやるのもいいかもねー」などと話していたのですが、本当に実現しました。 これは、@maaya8585さんの力によるところが大きい!

沖縄と遠いこともあって、流石にそんなに人が集まらないかなーと思いましたが、結果13人の人が集まり、ワイワイ楽しむことができました

決めていたこと

  • 集合時間 沖縄空港に12:30
  • 宿(Airbnbで一軒家を手配)
  • レンタカーを2台手配(+沖縄在住の @natsukoa333 ‏ の車1台)
  • 夜ごはんは1日目、2日目とチームを2つに分けて、それぞれが買い出し& 作り&後片付けを担当する
  • 3日目のチェックアウト後は観光したい人で観光

という感じで、飛行機は各自手配という感じでした。

1日目

朝10時半についたメンバーとまずは沖縄のorion ビールで乾杯!

f:id:electricSheep:20181117163108j:plain:w300

その後続々と沖縄に降り立ったメンバーも合流し、その都度ビールで乾杯。最高ですね。

宿は、13人泊まれる一軒家。外国人住宅街ということで、とても雰囲気ある素敵エリアでした。 また、海までは徒歩10歩、ダイビングスポットで有名な綺麗な海が広がっていました。

しかし、まずは皆PCを広げ始め、もくもく開始。pyladiesらしい。

夕食は、 @Yuryu ‏さん のおかげで、google スポンサーということもあり豪華!! 作ったソーキそばと、もずくスープもとても美味しかったー。正直あんなに美味しいソーキそばを食べたのは初めてです。お代わりした。

f:id:electricSheep:20181117174122j:plain:w200

夕ご飯時に、自己紹介タイム。皆、合宿ではDjangoをやる、という人が多かったです。 夜は、温泉に行く人たちもいれば、もくもくする人、お酒を飲みつつ各自自由に楽しみました。

2日目

台風が近づいている?こともあって大荒れの天気。一歩も外に出れない状況で、まさに黙々日和でした。 私は、@akiyoko さんがかいた Django本のデプロイの章をもくもく。 自分はインフラの知識があまりないので、nginx、mysqlのインストールからサーバーの設定など、丁寧に説明が書いてあってとっても勉強になりました。 本当は、本を一通りやってレビューブログを書くところまで合宿でやりたかったのですが、たどり着けず・・・。

その他、Pyladiesスタッフ業などやりました。

夕方になって奇跡的に晴れて、海に行きたい人たちで海へお散歩。 大雨が降ったあととは思えない、綺麗な海で、沖縄を堪能!CDジャケットに使えそうな写真を量産しました(笑)

f:id:electricSheep:20181117163908p:plain:w500

  • PyLadiesのSlackで #onair というチャネルがあり、イベント時にはそのチャネルで実況中継を行なっています。 写真を@kananが流したところ、@kame-chanによるこのツッコミ(笑。

散歩から帰ってくると、もくもくしていたチームは色々捗ったとのことでよかった。

皆自由に好きなことができるのが、Pyladies合宿の良いところです^ ^

夜はまた豪華! スパム入りのゴーヤチャンプル、人参しりしり海ぶどう、お肉、魚、その他恐ろしい量が並んでいました。 ちゃっちゃとつくって、皆すごいなー。

ご飯も、お酒も買いすぎ疑惑で、この量どうしたらいいんだ感あったのですが、さすが、Pyladies。 余ったお肉などを次の日の朝に焼いたりして、美味しく食べきりました。 お肉があれば、とうぜんお酒も飲みたくなるので、美味しく朝からビールをいただきました。

3日目

沖縄の北と南に観光するチームに別れて観光。 私は、以前行った美ら海水族館にもう一度行きたかったので、北チームに合流。 普通、帰る日などは、北方面への観光は断念しそうなものですが、旅慣れている人が多く、全く適当な予定だったにも関わらず、その場その場で判断して、結局観光を大満喫することができました。

f:id:electricSheep:20181117165258j:plain:w500

  • 私は、骨とか標本が好きなので、この展示にかなりテンション上がりました!

道の駅、美ら海水族館、いるかショーの鑑賞、古宇利島まで行って、飛行機のる時間のちょっと前に空港へ到着。 私は早い方の飛行機(19:15発)だったのですが、21時くらい発のメンバーが多かったので、そのあと美味しいステーキを食べに行った模様。

私は楽しかったなーと旅の余韻に浸りながら、帰りの飛行機で沖縄名物?のスパム入りおにぎりを美味しくいただきました。

f:id:electricSheep:20181117172647j:plain:w200

感想

  • 沖縄ということもあってふわふわしてしまい、もくもくはあまり捗らなかった ^^;
  • 沖縄在住の方も参加してくれ、沖縄のPythonやコミュニティ事情を知ったり、Pyladiesキャラバンも色々進んだのでよかった。
  • 参加者の方のいろんな話が聞けて楽しかった。
  • 今回、レンタカー、ご飯等、googleさん( @Yuryu ‏ )がスポンサーとして提供してくれました。本当にありがとうございます!!
  • 現在、沖縄で仕事をしている @natsukoa333 ‏が色々沖縄の文化のこと教えてくれたり、ランチの手配してくれたりでとても助かった。感謝!!
  • 皆、好き勝手やっているようで、ちゃんとやることやって楽しめて素敵。本当に今回参加してくれた皆に感謝、感謝です。

とにかく今年も楽しかったーー!!

PyLadie Tokyo は来月12/1にもくもく会をやる予定です。

pyladies-tokyo.connpass.com

皆さまの参加お待ちしていますー。

PyCon JP 2018 に参加しました!

9/17-18でPyCon JP2018 に参加しました!!

pycon.jp

聞いたトーク 1日目

Why you should care about types: Python Typing in the Facebook Backend


資料

実は、[DjangoではじめるPyCharm実践入門]の部屋に行ったら満員とのことで、こちらのセッションに急遽変更。Python における型に関してあまり詳しくなかったので、きちんと理解するいい機会になった!

Django REST Framework におけるAPI実装プラクティス


www.slideshare.net

  • ページネーションの話。相対位置指定と絶対位置指定の比較
  • APIのRate limitingの実装、トークン認証とJWT、その他の設計プラクティス

ページネーションの話はかなり詳細に話してくれたので、それぞれのメリット・デメリットを理解することができた。 また、他のTipsもDjango REST Framework を使う上でかなり実践的な内容でとにかく参考になった! 部屋に入った時点で立ち見&床席しかなかったが、どうしても聞きたかったので床席を選択。聞けてよかった。

Interactive Network Visualization using Python 〜 NetworkX + BokehでPEPの参照関係を可視化する


speakerdeck.com

  • PEPとは?というところから、PEPの参照関係をNetworkXとBokehを組み合可視化する方法の紹介

可視化されたPEPの参照関係を眺めているだけでもおもしろい。
FurukiさんはPyLadiesのメンバーでもあり昨年のPyLadies合宿にも参加してくれたのですが、とにかくガチ!ひたすらもくもく取り組んでいて好きなんだなーと思っていたけど、軽快なトークで冒頭から自分の話に皆を引き込み、話術にもびっくりだった!
BokehへのPRもちょうどPycon前日(9/16)にマージされたということですごい!&めでたい!

Pythonで解く大学入試数学


  • 数学系ライブラリの紹介・説明
  • ライブラリの使い方とあわせて数学についての説明
  • 数学の問題を実際に解いてみる

sympy便利!となったり、 集合はset で解けるなど、なるほどーと目から鱗の情報がおおかった。
ホールを2つあわせた一番大きな会場で8割以上は埋まっていたと思うが、「数学嫌いな人!」との質問に対して手をあげたのは数人?しかいなかった・・。元気よく手をあげた私っていったい・・・(笑)
数学よく考えたら嫌いではなく、好きではないというだけなので、久しぶりに勉強したくなった。Python 使うとあまりにも簡単に解けるからかな。。データ分析にも最近興味がでてきたので、とりあえず復習してみよう。学生の時はUnixSASでデータ解析をずっとしていたはずなので、今はすっかり忘れているだけ!(思い出せるはず!)と信じたい。

聞いたトーク2日目

Integrate Full-text Search service with Django


  • Elasticsearch を活用した全文検索サービスを既存の Django プロジェクトに導入する際に設計・検討するべきポイント

とても聞きたい内容だったので早めに行って席を確保。立ち見が結構でていたので早めにいって正解だった。 (1日目の床席がちょっと辛かったので) 自分は、Elasticsearch 自体の理解は乏しいけど、設計よりの話で丁寧に順を追って説明してくれたので、十分理解できて面白かった。また実際Djangoのプロジェクトに組みこむ際にどのように実現したか等、かなり詳細な内容をコードを交えて聞くことができ実践的だった。 同期に関して、Signal を使った方法の検討など、なるほどーと思ったが、会場からの質問や、こうすればいいかも?的な提案もあって色々な意見を聞くことができたのもおもしろかった。こういった議論ができるのもよいですね。

Make a Drone using RaspberryPi and Google VoiceKit by Python


www.slideshare.net

  • RaspberryPi と Google VoiceKitを使ってドローンを動かす

昨年に引き続きの発表!昨年はブラシレスモーターを使ってプロペラを1つ回すところに留まったが、今年は見事4つのプロペラを回して、上昇&前進に成功しておぉーとなった。(デモでは会場の都合?で実際には飛ばせなかったですが) RaspberryPi & VoiceKit はとても身近なものだし、ぜひドローンを簡単に飛ばせる仕組みを作って欲しい!

Pythonで「お絵描きパズル」を解いてみた


speakerdeck.com

  • Jupiter Notebook を使ってPythonコードを使ってお絵描きパズルに挑んだ話

お絵描きパズルが確かにDataFrame、Seriesにみえてきた(笑)。パズルを解くロジックを考えるのはちょっと大変そうだけど、それをPythonコードに落とすとかなりシンプルなコードで書けることに驚いた。 ipywidgets を使ってパラメータを変えるスライダーが作成できるの便利そうだった。試したい。

コミュニテイでの関わり

PyLadies コミュニティブース


今年はコミニティブースがポスターセッションの形式でできたので、資料作り&当日説明を担当。 他のブースはA3なのに、自分はA4で印刷していまい、あー(; ̄□ ̄)ガーン. となったが、「唯一後ろのすだれを生かしているよ!」というお言葉をいただき、なるほど、そう考えればいいか。となった(笑)

今年は一人で参加している女子に声をかけて、いろいろお話したり、コミュニティブースに誘ったりと、たくさんのPython女子たちと関われたのでよかったな!と。 結構遠方から来ている方が多くてびっくり。皆、Python好きなんだなー。

みなさん、遊びにきてくれてありがとうございましたー! 4周年記念パーティ、女性枠、男性枠ともにまだ空きがありますので、是非是非ご参加おまちしています!

pyladies-tokyo.connpass.com

Python Boot Camp


Python Boot Campとは日本各地での初心者向けPythonチュートリアルイベントです。

9/16日に各地域の参加者で集まって盛り上がりましょう!!ということで、前夜祭的な感じで「Python Boot Camp ミートアップ」という名の飲み会が開催された。

私は、昨年、埼玉で開催した Boot Camp の現地スタッフとして関わったので、このミートアップに参加。全国から集まった関係者の方々と美味しいお肉とビールでわいわいできてとても楽しかった!  

そして、そこでなんと!!

MicroPython Advent Calendar 2017 - Qiita で間接的にしっていた micro:bitチュートリアルの翻訳をされた@inachi さんとお会いできた!!私が昨年アドベントカレンダーで書いた、その当時MicroPythonで扱っていなかった光センサに関して、今はできるようになったよ!との情報を教えてもらい感激。ひょんなところで繋がってうれしい出来事でした!

Python Boot Camp に、スタッフ、TAなど2回以上参加すると、この水色のTシャツがもらえるらしい。欲しい。

全体としての感想

  • 「ひろがるPython」がテーマだった今年のPycon JP。自分は業務でDjangoを使っていることもあり、Djangoトークを抑えつつ、業務とはあまり関係ないけど興味あるトークが聞けたことで、かなり自分の中のPython世界が広がったと思う。色々試したいこともできた。
  • 今回聞きたいトークが結構重なってしまって聞けないものがたくさんあったので、このあとYouTubeでみる予定。YouTubeありがたい。
  • LT面白かった!!
  • コミュニティ活動で、人と人をつなぐことができたり、自分自身も交遊が広がったのでよかった。
  • 1日目のパーティでMarc-Andréさんを紹介して頂いたが、私の英語力・・(T T) ・・・。stapyのトークめちゃよかった!と伝えるだけが精一杯だった・・・。英語がんばりたい。@akucchan_worldがフォローしてくれた。ありがとうございます。
  • 1年に1回、こういった大きなイベントで盛り上がるのは自分にとってとても大切&楽しいので来年もまた参加したい。来年は何かに応募したい。
  • そういえば、1日目おやつをゲットできずしょんぼりしたが、2日目は無事ゲットできたのでよかった!!(そこ?)
  • おやつ大事。Pyconのおやつ毎回テンションあがるフォルムなんですもの。

今回1000人近くの参加者ということで、規模がかなり大きくなってスタッフの方も大変だったと思います。が、今年もPython最大のお祭りとして楽しむことができました!本当にありがとうございました!

【Stapy x MUFG共催】Python Global Meetup に参加しました!

9/14(金)に開催された【Stapy x MUFG共催】Python Global Meetup (同時通訳あり)に参加してきたので、そのレポートになります。

startpython.connpass.com

Python界のすごい方達からめちゃめちゃディープな話が聞けて、かなりテンションあがりました!
※どのくらいすごいかというのは、connpassのページに紹介があります

聞いた話、新しく得た知見など

  • Talk1、Talk2ともにUnicodeにまつわる話だったが、多くの苦労があって今に至った経緯の話がきけた。ふんわり理解していたUnicodeだったが、内部の動きを知ることができて理解が深まった。 メモリ上に文字を展開する時間を考慮する必要などもあったりと、とにかく深い・・・。
  • PEP538によって、printで文字列出す時にOSによって文字化けが起こるのが解消された
  • PEP3138 でインタプリンターで表示する文字をユニコード
  • Python3.6 から実装された dict の順を保持する話では、メモリー効率などを考慮して、ハッシュテーブルにindexキーだけ保持してテーブル自体を小さくしたことによる副産物としてうまれた
  • Googleの最初のweb serverはpythonのmedusa (かもしれない)?
  • 最初のpythonにはガベージコレクションがなかった。ガベージコレクションが入った時 安心して使えるようになった。
  • 面白い話は日本語ではかかれていない。python.dev のメールリングリストをながめるのもよい
  • コントリビュートするにはPSFメンバーになることでもできる www.python.org

パネルディスカッション・質問タイム

  • 随所に質問タイムを入れてくれて、PEPとは?という質問から、OSSに企業が絡むことをどう思うか?等、多岐にわたる質問がでておもしろかった。
  • パネルディスカッションのモデレーターの @hirokiky さんが、ちょっとわかりにくいところなどを補足してわかりやすく説明してくれたので、置いてきぼりにならずとても楽しめた。
  • 途中時間が押しているということだったが、延長してくれてありがたかった。

全体としての感想

  • 会場豪華だった
  • 同時通訳もありがたかった。結構専門的な話だったけどきちんと通訳されていたと思う。
  • @akucchan_worldの司会盛り上がった。
  • Pycon JPを前に素敵なセッションに参加することができて気持ちが高まった!

今回登壇した人たちがものすごくコア&豪華なメンバーで直接話を聞くことができて本当に楽しかった。こういった素敵なイベントを開催して頂いたStapy x MUFGの方達に感謝感謝です!ありがとうございました!

おまけ

  • 2次会で6人といって入った店に結局14, 5人で押しかけお店の人にちょっと迷惑がられた;(受け入れてくれてありがとうございます。)けど楽しかった!

Django もくもく会に参加しました!

7月7日(土)七夕の日にDjnagoもくもく会にスタッフとして参加したのでそのレポートです。

Djangoもくもく会とは

mogumogu-django.connpass.com

もくもく会とは言っても,しーーっんとしているもくもく会ではなく,質問や分からないところがあったら,その場で聞くことができる環境にしたい!と思っています.

主催者の@shinseitaroさんの意向で「もぐもぐ会」とサブタイトルのついたこの会。 実は、開催にあたっていろいろな出来事が連鎖したことによるものでした。

今回会場提供して頂いたSQUEEZEさんが毎月開催している「Pythonもくもく会」に参加した際に、業務でDjnagoを使っているという方に、Django本なら、@akiyokoさんの「現場で使える基礎Django」 の本がよいですよ!と教えていただきました。お値段1,300円で送料700円でしたが、業務でちょうどDjangoを使うことになったため、購入しました。これが本当に大変役にたったのです!

mokupy.connpass.com *1

その後、Pyladiesもくもく会にこの本をもっていったところ、参加者の方もDjangoをやっている方や、これから始めたいという人が何人かいたので、「送料払ってでも買う価値ありますよ!」とおすすめしたところ、同じく参加者の@shinseitaro さんが 著者の@akiyokoとお知り合いということで、その場で頼んで手渡しする手はずを整えてくれたのです。

pyladies-tokyo.connpass.com

その後、@shinseitaroさんの方で、@aliyokoさんにDjango教えてほしいという話から、それなら皆でやろうか!という流れになったようです。 (shinseitaroさんの行動力半端ない!)

色々なコミュニティを経てのこの開催、こんなつながりもあっておもしろいなーと。 そして、SQUEZZEさんに会場提供をお願いしたところ、快諾していただき無事開催するはこびとなりました。

当日のようす

まずはもぐもぐタイム

皆で持ち寄ったおやつを食べながら、自己紹介タイム。 Django初めての方から強者の方まで色々な方が参加してくれました!

和んだところで、もくもくタイム。

実際、もくもくタイムが始まると、皆集中して取りくんでいました。

ただ、その間にも著者のakiyokoさんや、詳しい方に皆いろいろ質問したりしていたようです。 私も、Pycharmやdockerのことなど色々教えていただきました(あまりDjangoと関係ない!ようで関係あるところです笑。)

そしてもくもくタイム中についにDjangoGirlsのチュートリアル最新版の翻訳が100%完了したようですー!わいわい!レビュー者募集中とのことです!

成果発表タイム

プロジェクターを借りるの忘れ、ゆるくお酒を飲みながらやる形式に; でも、そのゆるさがよかったのか(都合よく解釈しすぎ)、Django のDB周りから、環境構築、ツールの話、Django Girlsの話などなど、いろいろな意見交換ができて楽しかったです!

「DjangoGirlsチュートリアルを進めていてHerokuへのデプロイがうまくいかなかった」という方がいて、「そこはうまくいかないところ!今後Python Anywhereに置きかわる予定(?)です!」という中の方も貴重な意見も聞くことができました。私も以前DjangoGirlsチュートリアルのHeroku の部分でつまずいて、結局Heroku の公式ページをみてやった覚えが。そうだったのね(笑)。

あとはDjango-rest-framework + Vue.js を使っているor 試している方が多かった印象でした。

反省会

終わった後にスタッフ3人で反省会タイム(という名の飲み会)。 この日、akiyokoさんに持ってきて頂いた著書のDjang本、たくさん売れてなくなってしまい、結局奥様が追加で本を届けてくれたようです!ありがたやー。 akiyokoさんは、この日のためにDjango質問箱など作って質問を受け付けてくれたり、当日も皆の質問に答えてくれたりといろいろ尽力して頂いたので、願いがかなってよかったです!

この日akiyokoさんとは初めてお会いしたのですが、twitter上ではスタッフとしていろいろお話していて、お笑い系の人なのかなーと思っていましたが、当日、汗だくの私をみて、さっとビオレ汗拭きシート的なものを渡してくれる大変紳士な方でした笑。素敵。

おわりに

今回、いろいろな方が参加してくださり、大変楽しい会とすることができました。 参加してくださった皆さん、ありがとうございました!

こんな素敵な感想&ブログも書いてくださりありがたい限りです。

また、会場提供していただいたSQUEEZEさん、ありがとうございました! 9月にはSQUEEZEの中の人が書いたDjango本が発売される予定!と もくもく会でも話題になり楽しみです。

次回は9月に神田(?)で第2回目が開催される予定とのこと。 また、よろしくお願いします!

*1:私がakiyoko さんのDjango本を教えてもらったPython もくもく会。なんと後からしったのですが@akiyoko本人も参加していたとのこと!気づかなかった!

Raspberry Pi に設置したローカルサーバー(Flask-Ask + ngrok)でAlexaスキルを動かす

これまでAlexaスキルのバックエンド処理をAWS Lambdaで作成していましたが、Flask-Ask + ngrok を使って、 Raspberry Pi 上に設置したローカルサーバーでAlexaスキルを動かすことを試したので、そのメモになります。

ローカルサーバーだと身近なデータを簡単に利用することができるので便利かも!!

1.Alexa Skills Kit で Skill作成

Alexa Skills Kit (ASK) を使ってフロント側を作成します。

Alexaのスキルを自作しよう! - slideship.com

以前こちらの資料にまとめましたが、2018年3月の時点でBeta版だったものが正式リリースされていて、新しいUIになっていました。 古いUIでスキル作成していれば理解できると思うので、詳細は割愛。

1点だけ、エンドポイントの設定が、今回AWS Lambdaではないので、バックエンド側の処理を作成して動作させてから設定します。 => 4. 参照

2. Flask-Askでバックエンド処理を実装

Flask-Askとは

Python製のWebフレームワークFlaskを拡張して作成された、Alexaスキルの開発用フレームワークです。

github.com

$ pip install flask-ask

pipでインストールしてバックエンド処理をかくだけ! 使い方の詳細は上記のgithub上に書かれています。

処理を書いたらローカルでサーバーを立ち上げます。

$ python3 alexa_skill_calc.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

3. ngrok を使って外部からRaspberry piのローカルサーバーにアクセスできるようにする

ngrokとは

ローカルで動いているサーバーを、LANの外からアクセスできるようにできるツール

使い方

1) ngrok のダウンロード https://ngrok.com

2) 任意のディレクトリにLinux(ARM)版をダウンロードして、解凍します。

$ mkdir ngrok
$ cd ngrok/
$ mv ~/Downloads/ngrok-stable-linux-arm.zip .
$ unzip ngrok-stable-linux-arm.zip

3) 無料枠があるので、アカウント登録します。 - 「Get Started for free」ボタンをクリックしてアカウント作成

4) 作成したアカウントログインすると、下記ページにアカウントに紐づけられたAuthトークンが記載されているのでコピーします。

f:id:electricSheep:20180418152000p:plain

Raspberry pi上でページに書かれているコマンドを実行します。

$  ./ngrok authtoken MpRxwKGG7Hn(省略)

5) ngrok を起動します

上記2のflask-askの実行 python3 alexa_skill_calc.py により、現在ローカル環境(localhost)のポート5000番でWebアプリケーションが動作している状態で実行します。

$./ngrok http -region=ap 5000
ngrok by @inconshreveable                                       (Ctrl+C to quit)
                                                                                
Session Status                online                                            
Account                       masako sugita (Plan: Free)                        
Version                       2.2.8                                             
Region                        Asia Pacific (ap)                                 
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://54f4263f.ap.ngrok.io -> localhost:5000     
Forwarding                    https://54f4263f.ap.ngrok.io -> localhost:5000    
                                                                                
Connections                   ttl     opn     rt1     rt5     p50     p90       
                              0       0       0.00    0.00    0.00    0.00     
  • 上記コマンドにて、 ポート5000を指定すると、ngrokが提供するURL(http(s))を通してローカル上のWebアプリケーションにアクセスすることができます。
  • コマンドラインのオプションで、リージョン Asia Pacific (ap) -region=ap を指定することができます。
  • ngrokの停止は、Ctrl + C で行います。

4. Alexa Skills Kit でエンドポイントを設定する

f:id:electricSheep:20180418163157p:plain

上記設定したら「エンドポイントを保存」する

で、再度「モデルをビルド」します

5.Alexaシュミレータでテスト!

が、なんかエラーになった;;;

flask-askを実行しているところで、スキルを呼び出すと下記エラーが・・・。

;;(省略)
 File "/home/pi/.local/lib/python3.5/site-packages/OpenSSL/crypto.py", line 740, in _subjectAltNameString
    method = _lib.X509V3_EXT_get(self._extension)
AttributeError: module 'lib' has no attribute 'X509V3_EXT_get'

とりあえず、stackoverflowに同じような問題があったので、pyOpenSSLを一旦削除して再インストール。

$ pip3 freeze
pyOpenSSL==17.0.0

$ pip3 uninstall pyOpenSSL
$ pip3 install pyOpenSSL

cryptography==2.2.2
pyOpenSSL==17.5.0

で、再度テスト!

f:id:electricSheep:20180418161236p:plain

できた!

感想など

  • ngrok、無料枠でもhttps にも対応していて便利すぎる!
  • ローカルのサーバーで動かせると手軽に身近なデータ使ってスキル作れるのでよい。
  • ちょっと前まで音声認識にJulius使って一つ一つ辞書登録していた頃を思うと、Alexaの発話認識+合成音声を無料で簡単に使えてすばらしい。
  • しかし、Juliusはスタンドアロンで動作するので、それはそれで素敵です。
  • stackoverflow ありがたい。エラーつらい。

HerokuへPythonアプリ(Django)をデブロイする方法

HerokuへPythonアプリ(Django)をデブロイする方法を試したので、メモ。

最初、Django Girls Tutorial にあったHerokuへのデブロイ方法を試したのですが、Herokuの公式ドキュメント をみると、pipenvを使用したアプリのデブロイ方法で更新されていたのでそちらで試してみました。

Djangoの理解は、下記2つのページが大変役に立ちました。

Herokuとは


  • PaaSを提供する事業者、および提供サービスであるPaaSの1つ
  • PasS(Platform as a Service)は、アプリケーションを実行するためのプラットフォームをインターネット越しに使えるサービス

Herokuにアプリを公開するための準備


  • Herokuアカウントのサインアップ => a free Heroku account
  • Heroku Toolbeltのインストール  => Heroku CLI
  • Pipenv をインストール (pythonアプリの場合)
  • Postgres をインストール(ローカルでアプリを動かしたい場合)
    • Heroku 上でsqllite3 は使えないようです

Herokuを使うにあたり必要な知識


Herokuにデブロイする方法


Python on Heroku

  • 上記チュートリアルを一通りやると、DjangoのアプリをHerokuにデブロイする方法を一通り体験できます
  • 英語ですが、とてもわかりやすいので、最初にここをみるのがオススメです!
  • Python のpipenvを使った方法でかかれています

◆Heroku へデブロイする流れ

1. Herokuへのログイン、メールアドレスとパスワードを入力

$ heroku login 

一度heroku loginを行うと、明示的にheroku logoutコマンドでログアウトしない限り、以降のコマンド実行はそのアカウントとして実行されます。

2. サンプルアプリのクローン(Djangoアプリ)

今回Heroku公式ドキュメントに沿ってサンプルアプリを使用したので、とりあえずクローン

$ git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started

3. Herokuへデプロイ

$ heroku create
$ git push heroku master 
  • heroku create [APPNAME]
    • [APPNAME]を省略するとHerokuが自動生成してくれる
    • URLが作成される (https://[APPNAME].herokuapp.com/)
    • 「git@heroku.com:[APPNAME].git」というgitリポジトリが用意される
    • ローカルのgit remoteに「heroku」という参照名が追加される
  $ git remote -v
    heroku  https://git.heroku.com/stark-dusk-55796.git (fetch)
    heroku  https://git.heroku.com/stark-dusk-55796.git (push)
    origin  https://github.com/heroku/python-getting-started.git (fetch)
    origin  https://github.com/heroku/python-getting-started.git (push)
  • リポジトリのmasterブランチにアプリケーションをpushすることで、それがコンパイルされHerokuアプリケーションとしてリリースされる
  • origin は、cloneに使用したリポジトリ

4. 確認

$ heroku open                     #URLをデフォルトブラウザで開く
$ heroku logs --tail             #ログを確認
$ heroku ps
  === web (Free): gunicorn gettingstarted.wsgi (1)

たったこれだけ!!

◆ローカルでコードを変更してHerokuにデプロイ

1. ローカルでコードを修正する

下記、pipenvで作成した仮想環境上で動作させる

$ pipenv --three   #python3を指定
$ pipenv install     #仮想環境を作成し、依存関係をインストール
$ pipenv shell       #仮想環境への切り替え
$ python manage.py collectstatic  #Djangoで必要処理(静的ファイルを一カ所に集める)

2. ローカルで確認する

$ heroku local 

http://localhost:5000 にアクセスしてローカルで変更を確認

3. 修正のgitリポジトリへの反映

$ git add .
$ git commit -m "Demo"

4. 修正のHerokuへの反映

$ git push heroku master

5. 確認

$ heroku open

Herokuに必要なファイル


Procfile

  • Dynoがアプリケーションを起動する際の起動コマンドを指定するファイル
  • Dynoとは作成したプログラムを動かすLinuxコンテナ
  • Procfileは、アプリケーションのルートディレクトリに置く
web: gunicorn gettingstarted.wsgi
  • 最初の「web:」はDynoの種別の指定で、Httpリクエストを受け付けるWebアプリケーションの場合は「web」を指定する。
  • それに続くコマンドがアプリケーションの起動コマンド

Pipfile または requirement.txt 

  • Pipfile または requirement.txt のどちらかのファイルがある場合、Pythonと判断されるらしい。

Heroku Postgres


$  heroku addons # アプリに追加されているAdd-onの一覧を表示
Add-on                                           Plan       Price  State  
───────────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-horizontal-81279)  hobby-dev  free   created
 └─ as DATABASE
  • heroku-postgresql のaddons はデフォルトで追加される
  • ローカル環境にpsqlコマンド(PostgreSQLコマンドラインクライアント)がインストールされている場合には、「heroku pg:psql」コマンドでデータベースにアクセスすることが可能

感想など


  • アプリのデブロイはgit pushするだけ!
  • 今回pipenvを使用しましたが、最初brew コマンドでpipenvをインストールしようとしてエラーになりそこではまりました…. (Herokuへのデプロイとは全く関係なし...)

最初から素直に下記でインストールすればよかった…。

$ pip3 install pipenv 
  • こんな簡単にWEB公開できるとは知らなかった。よいです。