taisablog

taisa's engineer blog

デベロッパー月次LT.018

投稿日:

-

執筆者:

関連記事

PyCon JP 2017にスタッフとして参加してきた

ようやく落ち着いてきたのでだいぶ今更ながらPyCon JP 2017の参加レポートを書く PyCon JP 2017 in Tokyo | Sep 7th – Sep 10th はじめに まずはじめに、自分にとってのPyCon JPを簡単に振り返って見る。最初は2014年に一般参加者として参加したのがはじまりだった。そして翌年はじめてスタッフとしてジョインした。ただこの年は開催数日前にこどもが産まれ、当日の参加はできなかった。そしてその翌年の2016年は絶望的な業務の忙しさによりスタッフになることさえもできずに終わってしまった。そして今年、例年のような忙しさがありつつも無理やり時間を作ってスタッフとして準備・当日参加を果たすことができた。 スタッフとして スタッフとしては今年、2015年と同様にプログラムチームというチームで活動をした。プログラムチームはプログラムといってもPythonを書くわけではなく、スピーカーを募集したり当日のスケジュールを組んだりとカンファレンスのコンテンツを決めていくような活動がメイン。その中で今年はキーノート担当として活動した。今年のキーノートは海外1名・国内1名だったが、それぞれのスピーカーとコミュニケーションができたのは非常に有意義だった。また、今年やりきれなかったこととしては、システムも少し触ろうとしていたけどキャパオーバーにつき並行で進めることは全くできなかった。 参加者として 今年はスタッフとして参加したので、セッションのチェアマンをしたりともろもろやることがあったので基本セッションを見ることはできず、未だ動画でもみることもできておらず、セッションはまだほとんど聞けてないけど「Keynote」「スポンサーブース」、昼休憩にやった「メディア会議」「ジョブフェア」、「Youth Coder」「1日目のParty」「2日目の関係者パーティ」とセッション以外のところだけでもめちゃめちゃ楽しむことができた。特に1日目のPartyは食事豪華で酒の種類も多く、いろんな人と話しすることができてめちゃめちゃ楽しめた。気づけば2014年以降一度も参加できていなかったPyCon JPだったけど、スタッフをはじめて苦節3年、ようやく最初から最後まで参加することができて本当によかった。 来年は 来年はどこまでコミットできるかわからないけどもちろんスタッフとして参加するし、場所はまだ決まっていないけどPyCon APACも必ず参加しようと思う。もはや気づけばこのカンファレンスが1年間のモチベーションの1つにもなっていたりしてコミュニティってすげーとひしひしと感じている次第。 2014年一般参加した時の写真 (この時一緒に参加した人も翌年からスタッフになっている) 当日の写真は以下にまとめて沢山あがっているので大変ありがたい https://www.flickr.com/photos/pyconjp/albums/ 主にPyConについての話をしたPyLadies TokyoでLTした時のスライド

no image

2017年の振り返り ~活動報告~

2017年のインプットとアウトプットを整理しながら振り返る。 読書 大体以下の本を読んだ。今年は書評ブログも書こう。 SCRUM BOOT CAMP THE BOOK ジョイ・インク 役職も部署もない全員主役のマネジメント スクラム実践入門 ── 成果を生み出すアジャイルな開発プロセス (WEB+DB PRESS plus) JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス JavaScriptパターン ―優れたアプリケーションのための作法 JavaScript Ninjaの極意 まつもとゆきひろ 言語のしくみ ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践 Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術 みんなのGo言語[現場で使える実践テクニック] SQLアンチパターン ブログ 合計17本書いた。1、2月は外したけど概ね月1ペースは保てたのでよかった。今年も最低同じペースか月2本ペースで書きたい。 外部LT そもそも外部でLTをすることが目標だったからできてよかった。実際にはもう一つやったけど SlideShip じゃなかったから資料がみれなくなった。SlideShip最高! コミュニティ活動 PyCon JP 2017 in Tokyo スタッフ 去年活動できなくて残念だったから今年はコミットできたし当日参加もできたから最高だった。 カンファレンス参加 PyCon APAC 2017 – PyCon in Malaysia and python in general AWS Summit Tokyo 2017 Day2、Day3 PyCon APAC は行きたくて行けてなかったイベントだったから行けて本当によかった。 今年もなんとか参加したい。 英語 Talk Python To Me DMM英会話 海外ドラマ・映画 Walking Dead メンタリスト プリズン・ブレイク なんとか英語に触れられた一年になった。今年はもう少し比重を多くする予定。 ライブ Perfume FES!! 2017 Perfume×電気グルーヴ@幕張 5th ANNIVERSARY SILENT SIREN LIVE TOUR 2017 『新世界』@武道館 Яealライブ@渋谷www SILENT …

Python Bottleのソースを読む プラグイン編

Pythonの軽量WebフレームワークBottleのソースを読む プラグイン編Bottleを触ってみると通常のWebフレームワークには用意されているであろう機能がなかったりします。これはマイクロフレームワークであるが故であり、すべてがそろってない状態がむしろ正しい状態と言えます。Bottleではそういったものを補うためにプラグインが用意されていてある程度の機能はそちらでまかなうことができます。また、Plugin Development Guide を参考にしてプラグインを自作することも可能です。 Class Hierarchy plugin用クラスはなくインターフェースが定義されているのでそれにしたがって実装します。 プラグインの使い方 公式ドキュメントに簡単な使い方が乗っているのでこちらを参考にすれば簡単に導入することができます。以下がサンプルコードで、簡単な流れとしてはinstall()で任意のプラグインをインストールするリクエスト時にプラグイン実行となります。サンプルコードでは、プラグインでkwargsにdbをセットされている為ルートのアクションでdb変数が利用できるようになってます。 from bottle import route, install, template from bottle_sqlite import SQLitePlugin install(SQLitePlugin(dbfile=’/tmp/test.db’)) @route(‘/show/<post_id:int>’) def show(db, post_id): c = db.execute(‘SELECT title, content FROM posts WHERE id = ?’, (post_id,)) row = c.fetchone() return template(‘show_post’, title=row[‘title’], text=row[‘content’]) @route(‘/contact’) def contact_page(): ”’ This callback does not need a db connection. Because the ‘db’ keyword argument is missing, the sqlite plugin ignores this callback completely. ”’ return template(‘contact’) プラグインの作り方 プラグインの作り方も公式ドキュメントにもっともシンプルな形のサンプルがあります。これは実行速度をレスポンスヘッダーにつけて返す処理ですが、サーバ起動時にstopwatchをインストールし、リクエストが来た際にデコレータを実行(表現あってるか分からない)することでリクエストの処理時間は計測できるようになっています。 from bottle import response, install, route import time def stopwatch(callback): def wrapper(*args, **kwargs): start = time.time() body = callback(*args, **kwargs) end = time.time() response.headers[‘X-Exec-Time’] = …

PyCon APAC 2017 in マレーシア 参加レポ

PyCon APAC 2017に参加してきたのでその参加レポ。自分にとっては初めての海外カンファレンスだったのでとても有意義な旅行になった。 PyCon APACって? 毎年開催されているアジア太平洋のPythonカンファレンスで去年は韓国だったが、今年はマレーシアのクアラルンプールで開催された。 PyCon APAC 2017 クアラルンプールへ 前日の朝に到着 クアラルンプール着いた (@ Kuala Lumpur International Airport 2 (KLIA2) – @my_airports) https://t.co/JIqLhzUfdR pic.twitter.com/upaHiQ6QPT — たいさ (@taisa831) 2017年8月24日 とりあえずチェックインまで軽く街を散策 夜 PyConAPACに参加している日本メンバーで食事会をした。マレーシアはご飯おいしいしツインタワーすごいしでとてもよいところだった。 PyCon APAC 2017 in マレーシア 前夜祭楽しかった。飯うまだしツインタワー凄いしいいところ。 たいささん(@taisa831)がシェアした投稿 – 2017 8月 25 8:02午後 PDT カンファレンス初日 キーノート スピーカーはLuis Miguel Sanchez キーノート始まった #pyconapac pic.twitter.com/eeselKrgZB — たいさ (@taisa831) 2017年8月26日 Tea Break 30分のTea Break。Tea Breakといいつつ食事も提供された。 ティーブレイク pic.twitter.com/QylXOliBqZ — たいさ (@taisa831) 2017年8月26日 Understanding The World With The Help Of Python Understanding The World With The Help Of Python pic.twitter.com/68QWCaCREZ — たいさ (@taisa831) 2017年8月26日 Data Mining of News (Intermediate) Data Mining of News pic.twitter.com/2I6CdLHgjs — たいさ (@taisa831) …

Firebase Cloud Firestore 使い方の勘ドコロ

FirebaseのCloud Firestoreを扱う際、本家ドキュメントが充実していて検索すればすぐに出てくるのでそれほど困ることはありません。ただ、最初の入りとしてFiresotreのDocumentって何? となったり、doc、docRef、cityRef、cityDocRef、snapShot、docs など、本家ドキュメントの中でも若干変数名の書き方が異なっていたりします。その為、慣れてくれば大丈夫ですが、慣れるまで毎回どう書くんだっけ?と検索することが多かったので、自分なりに解釈して整理してみました。Firestoreを扱える言語は様々用意されていますが、ここでは、JavaScript(Nuxt.js)を例に進めていきます。(セットアップは省きます) 参照元:https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja Firestoreの基本的な考え方 基本的な考え方は、正にこの図にあるように「フォルダ(collection)」「ドキュメント(document)」「データ」という構成になっています。 参照元:https://firebase.google.com/docs/firestore/data-model これをFirestoreの管理画面でみるとこのようになります。 これを「フォルダ(collection)」「ドキュメント(document)」「データ」に当てはめてみるとこのようになります。イメージとしては、本棚にフォルダが並んでいてフォルダを選択するとフォルダの中のファイル一覧がみることができ、あるファイルを選択するとそのファイルに書かれている内容をみることができるという感じです。 ◯◯Refとは 本家ドキュメントをみると、◯◯Refという変数がよく出てきます。これはその名の通り「参照」です。つまり本棚にあるフォルダ(collection)やフォルダ内のドキュメントを選択した状態です。この時点ではまだ参照なので取得はしていません。usersコレクションを選択した状態であればuserRef、usersコレクションのドキュメントを選択した状態であればuserDocRefといった変数をつけると分かりやすいと思います。(本家ドキュメントではそのようなルール決めはありません。) userRef = db.collection(‘users’) userDocRef = db.collection(‘users’).doc(‘YLu7bG7PcRNYhAg3F6MY’) これらを踏まえて、実際にデータの取得、追加、更新、削除のコードを書いてみます。ここではあえて◯◯Refのように変数を使っています。 コレクション配下のドキュメントデータをすべて取得する usersコレクションを参照した状態で、get().then()を呼び出すとその時点のドキュメント一覧(snapShot)が取得できます。ドキュメントは1つしか存在しない可能性もありますが、ドキュメント一覧なのでforEachでループすることで全データを取得することができます。ユーザIDはデフォルトでドキュメントに振られるIDです。 const db = firebase.firestore(); let userRef = db.collection(‘users’) userRef.get().then((snapShot) => { snapShot.forEach((doc) => { this.users.push({ user: doc.data(), user_id: doc.id }) }) }) ユーザID ユーザ名 ユーザメールアドレス {{user.user_id}} {{user.user.name}} {{user.user.email}} 参考:https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja コレクション配下のドキュメントデータをフィルタして取得する フィルタするのにwhereを利用することができます。whereで対象を絞った後、同様にget().then()を呼び出すとフィルタしたドキュメント一覧が取得できます。 const db = firebase.firestore(); let userRef = db.collection(‘users’) userRef.where(‘name’, ‘==’, ‘山田太郎1’).get().then((snapShot) => { snapShot.forEach((doc) => { this.filteredUsers.push({ user: doc.data(), user_id: doc.id }) }) }) ユーザID ユーザ名 ユーザメールアドレス {{user.user_id}} {{user.user.name}} {{user.user.email}} 参考:https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja 単一のドキュメントデータを取得する 単一のドキュメントデータを取得するには、doc()にIDを渡し、get().then()を呼び出すと指定したドキュメントのデータが取得できます。この場合、doc()で単一のドキュメントを指定しているので、取得できるのは一覧ではなく指定したドキュメントの値となります。 const db = firebase.firestore(); let userRef = db.collection(‘users’) userRef.doc(‘YLu7bG7PcRNYhAg3F6MY’).get().then((doc) => { this.user = doc.data() this.user.user_id …