taisablog

taisa's engineer blog

「 Python 」 一覧

no image

カンファレンスを最大限に楽しむ方法

2018/07/30   -カンファレンス
 

Talk Python To Me という PodCast を聞いている中で興味深い話があった。 Talk Python To Me Podcast Talk Python To Me is a podcast for developers who are passionate about Python. Learn about the language and related technologies. Episode #161: Django 2.0 の 00:58:20〜のトーク内容で「カンファレンスを最大限に楽しむ方法は?」という質問に対する回答 まず第一に参加できるなら参加しましょう。もし US や北アメリカのカンファレンスに行けない場合は、ローカルで開催されているカンファレンスに参加しましょう。そしてもし参加したら友達とくつろぐのはやめて新しい友だちをつくりましょう。自分の視野を広げるために参加しているのだから。それが簡単でないことはわかります。でもそうすることで新しいアイデアやコネクションをつくることができて新しい視野がひろがります。そして、それができた場合でも自分の知識をみせびらかすようなことはやめて、そのかわりに質問をしましょう。そして私は、カンファレンスに参加してハイヤリングをした立場として分かりますが、知識があるひとよりもむしろ、新しいことを見つけ出して熱心に学ぼうとしている人を雇おうとします。 以前にカンファレンスに参加したことがある人もそうでない人も、カンファレンスのボランティアをやるのもよいです。ボランティアをする中で関係ができあがり、新しいコネクションができます。私はボランティアをすることで自分のキャリアの中で大きな変化を得ることができ、とても良い人で出会うきっかけになりました。恥ずかしいとか思うかもしれませんが、そんなことは誰も気にしてはいません。自分もとても恥ずかしいことをした経験があるけど誰も覚えてはいませんよ。 ソース:https://talkpython.fm/episodes/transcript/161/django-2.0 内容は意訳してる箇所や多少省略してる箇所があるので詳しく知りたい方はソースを見てください。この内容はトークする側ではなく単純に参加する側へ向けた話。 そしてある意味当たり前のような話ではある。ただ、恥ずかしがるとかそういった考えはなんとなく日本的もしくはアジア的なところがあるのかなと思っていたので、アメリカでもこういったことが話されてるんだなっていうところに興味が持てた内容でした。 話し手はこの方 Daniel Roy Greenfeld (@pydanny) | Twitter The latest Tweets from Daniel Roy Greenfeld (@pydanny). Co-Author Two Scoops of Django (https://t.co/h98NETIALQ), open source coder, husband of @audreyr, former NASA coder. Los Angeles, CA

「PyCon APAC 2018 in Singapore」参加レポートを寄稿した

2018/07/10   -未分類
 , , , ,

PyCon APAC 2018 in Singaporeに参加してgihyo.jpさんにてレポートを寄稿した。 今年のレポートはPyCon JPのスタッフと元スタッフメンバーで書いた。カンファレンスのセッションレポートだけでなくカンファレンス参加に関連するコラムも盛り込んでいてめちゃくちゃ読み応えのある内容になったと思う。 Day1レポート 目次 Day1 PyCon APACとは シンガポールと今年のカンファレンス会場 Keynote ~ Tell me your secrets – Privacy in machine learning systems セッション Build a Data-Driven Web App That Everyone Can Use TeaTeaching Computers ABCs: A Quick Intro to Natural Language Processing Better Care and Feeding of Machine Learning Model コラム APACで発表者をしてみて PyCon APACミーティング 終わりに Day1:プライバシーを機械学習でどう守るか?/機械学習の基礎と応用 こんにちは, taisaです。2018年5月31日(木)~6月2日(土)にかけて行われた「 PyCon APAC 2018 in Singapore 」に参加してきました。本レポートでは最後の2日間に行われたカンファレンスデイの様子やセッション以外の現地滞在の様子などを2回に分けて,当日参加したPyCon JPスタッフや元スタッフのメンバーがお届けします。 PyCon … Day2レポート 目次 Day2 keynote セッション Concurrency vs Parallelism Elements of Programming Interviews in Python Streaming data processing pipelines with Apache Beam in Python, naturally! コラム PyCon APACの開催国となったシンガポールについて 海外カンファレンスに参加してみて 2日目の夜について 終わりに …

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した時のスライド

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) …

FlaskをBottleと比較した雑感

2016/12/05   -Python
 ,

以前Bottleのソースをチェックしてみた流れでFlaskも見てみた。結論から言うとBottleと大して変わらん。もちろんFlaskのほうがコード量が多く多少リッチではあるもののざっくり機能ベースで言うと大して変わらんのです。そもそも両方ともマイクロWebフレームワークが売りなので当たり前といえば当たり前ですが、歴史的にもBottleが2009年リリースでFlaskが2010年4月1日(エイプリルフールのネタとして)リリースと、名前もBottleに対抗してFlask(フラスコ)という名前をつけたということなので、もともとがBottleっぽいフレームワークを遊びで作ってみたという感じなんだと思います。それっぽいことはwikiに書かれています。 [Bottle Wiki](https://en.wikipedia.org/wiki/Bottle_(web_framework)Flask Wiki クラス構成に関しては以下にある通りで、Bottleが1ファイル構成でFlaskは機能にファイルが分かれてる構成という違いはあるものの、機能自体にほとんど違いはありません。ただFlaskはBlueprintという大規模アプリ対応の機能があります。なお、使い方については公式ドキュメントとサンプルコードも複数用意されているのでアプリの構成や使い方が確認しやすいです。

Python Bottleのソースを読む ユニットテスト編

2016/12/05   -Python
 ,

Python Bottleのソースを読む テスト編前回までで一通りメインの機能は確認できました。ではいよいよコード追加してプルリクを投げましょうというところですが、テストは?ということでユニットテストとカバレッジ状況をチェックしてみます。また自作アプリに対してのテスト方法もチェックしてみます。 Bottleのユニットテストとカバレッジ状況 GitHub上のBottleをクローンすると直下にtestディレクトリがあります。ここにずらーっとテストがありますが、よくよく見てみるとtestall.pyという全実行のエントリポイントが用意されているのでそれを実行します。 # noseを入れてない場合はインストール pip install nose # こんな感じに実行 nosetests –with-coverage –cover-html testall.py でました。bottle.pyだけを見てみると76%しっかりテストが書かれてるのがわかります。 bottle.py 2277 485 849 79 76% そしてhtmlをチェックコードのカバレッジ状況が一目瞭然。あとは足りないとこテストしたり自分で処理追加してテストしたり。これでいろいろ安心。 BottleでつくったWebアプリのテスト方法 せっかくなのでWebアプリのテスト方法も見てみます。これは公式ドキュメントにしっかり書かれているのでそこをみればだいたい分かると思います。noseインストール pip install nose テスト対象コード import bottle @bottle.route(‘/’) def index(): return ‘Hi!’ if __name__ == ‘__main__’: bottle.run() テストコード単純にindex()を実行して結果をassertする import mywebapp def test_webapp_index(): assert mywebapp.index() == ‘Hi!’ テスト実行 nosetests test_app.py Ran 1 test in 0.014s OK 上記は直接関数をテストする方法ですがwebtestを使ってwebベースでアクセスしてテストする方法もあります。ただこの方法をやってみたところ明示的 app = Bottle()を宣言しないとうまく実行できませんでした。ここら辺はもう少しwebtestの使い方がわかればなんとかなるかもしれません。webtestインストール pip install webtest テスト対象コード from bottle import Bottle # アプリを明示的に作成 app = Bottle() @app.route(‘/’) def index(): return ‘Hi!’ if __name__ == ‘__main__’: run(app=app) テストコード公式ドキュメントではログイン・ログアウトのテストが書かれてましたがここでは省略 from webtest import TestApp import mywebapp def test_index(): app = TestApp(mywebapp.app) assert …

Python Bottleのソースを読む ルータ編

2016/12/05   -Python
 ,

Pythonの軽量WebフレームワークBottleのソースを読む ルータ編 Class Hierarchy ここの部分 Bottleのルータについて bottleのルータは特に継承関係はなくRouteとRouterクラスで構成されている Routerの役割 A Router is an ordered collection of route->target pairs. It is used to efficiently match WSGI requests against a number of routes and return the first target that satisfies the request. The target may be anything, usually a string, ID or callable object. A route consists of a path-rule and a HTTP method.The path-rule is either a static path (e.g. `/contact`) or a dynamic path that contains wildcards (e.g. `/wiki/`). The wildcard syntax and details on the matching order are described in docs:`routing`. RouterはRoute情報のコレクションを保持する。 Routeの役割 This class wraps a route callback along …

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

2016/12/05   -Python
 ,

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’] = …

Python Bottleのソースを読む リクエスト・レスポンス編

2016/12/05   -Python
 ,

Pythonの軽量WebフレームワークBottleのソースを読む リクエスト・レスポンス編   Class Hierarchy ここの部分 リクエスト受付からレスポンスまで 前回、サーバの立ち上げ時にルーティングが読み込まれるところまでを確認したので今回はリクエスト受付からレスポンスを返すまでを見てみる。 まずリクエストが来るとwsgiref/handlers.pyのrunが呼ばれ、Bottleの__call__が呼び出される wsgiref/handlers.py self.setup_environ() # リクエストを処理しレスポンスを取得する self.result = application(self.environ, self.start_response) # レスポンスを返す self.finish_response() bottle.py def __call__(self, environ, start_response): “”” Each instance of :class:’Bottle’ is a WSGI application. “”” return self.wsgi(environ, start_response) リクエストを処理する際に、LocalRequestのbindを呼び出しBaseRequestのコンストラクタにてenvironとLocalRequestをセットする。これでBaseRequestのラッパーからパラメータを取得可能になる。レスポンスも同様にLocalResponseのbindを呼び出す。 try: out = None environ[‘bottle.app’] = self request.bind(environ) response.bind() try: self.trigger_hook(‘before_request’) except HTTPResponse: return _e() # ここでリクエストの主処理を実行する out = _inner_handle() return out; finally: if isinstance(out, HTTPResponse): out.apply(response) self.trigger_hook(‘after_request’) BaseRequestのコンストラクタ self.environ = {} if environ is None else environ self.environ[‘bottle.request’] = self リクエスト情報は以下のように取得可能になる def index(): request.forms.get(‘test’) return ‘TOP’ LocalRequestは以下の通りマルチスレッドに対応している #: A thread-safe instance of :class:`LocalRequest`. If accessed from within a #: request …

Python Bottleのソースを読む 起動編

2016/12/01   -Python
 ,

Pythonの軽量WebフレームワークBottleのソースを読む 起動編 Bottleとは Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library. Pythonの軽量Webフレームワークで、特徴はシンプルで早く、Pythonの標準ライブラリにも依存していないWebフレームワークであることとフレームワーク本体が1ファイルで構成されていることである Class Hierarchy Doxygenを使って出力した図Bottleは1ファイルながら中でそれぞれのクラス、主にServer、Templateが継承関係にあるのがわかる(コード量は4000行位)。ServerやTemplateクラスはたくさんあるが実際はその中のどれかを選択して利用する形となる 起動 Bottleの起動はrun()を呼び出す方法とコマンドラインインターフェースを使う方法が用意されている run()を使う方法 以下のように記載し起動することでサーバが立ち上がる from bottle import run, route @route(‘/’) def index(): return ‘Hello World’ run(host=’localhost’, port=8000, debug=True) コマンドラインインターフェースを使う場合 以下のコマンドで起動可能 # コントローラを指定 python -m bottle ‘package.controller’ # 説明は省略するが明示的にアプリを指定することも可能 python -m bottle ‘package.controller:app’ controller.py # runは不要 from bottle import ,route @route(‘/’) def index(): return ‘Hello World’ 起動処理を確認する コマンドラインインターフェースを使う場合 mainが2箇所あるが、これはサーバアダプダに必要なライブラリを必要としているからで、1つ目のmainでまずサーバアダプタに必要なライブラリを読み込み2つ目のmainでサーバが起動される仕組みになっている run()でサーバを起動する run()では、渡された引数の値をそれぞれ読み込んだあと最後にServerAdapterのrun()を呼び出している。Bottleでは多くのサーバをServerAdapterを継承することでサポートしており、指定されたサーバを起動するようになっている。指定しない場合はwsgirefがデフォルトで呼ばれる。また、appパラメータは特別指定しなければ、内部で自動的にdefaultが使われるので特別指定する必要はない。 サーバをロードするまで処理を追ってみる まず、Bottleでサポートしているサーバは以下のように宣言してある。 server_names = { ‘cgi’: CGIServer, ‘flup’: FlupFCGIServer, ‘wsgiref’: WSGIRefServer, ‘waitress’: WaitressServer, …