SlideShare a Scribd company logo
1 of 64
1
Takayuki Shimizukawa
おまえ誰よ / Who are you
@shimizukawa (清水川)
 BeProud co, ltd.
 Sphinx committer
 一般社団法人PyCon JP理事
Board member of PyCon JP committee
株式会社BeProud所属
3
Hello, Здравствуйте,안녕하세요, 你好
niche, not just tech
仕事で使うちょっとしたコードを
OSSとして公開しよう
The person who want to know …
以下のことを知りたい方
 Sharing them source code for job as a OSS.
仕事で使うコードをOSSとして公開すること
 Structure of Django database backend
Djangoのdatabase backend周りの構造
 How to bring up your code.
コードを育てていく方法
Target attendees
 You can get some benefit if you open your (tiny) code
ちょっとしたコードでも公開しておくと良いことが
あるよ
 「良いこと」って? / What is benefit?
 誰かがバグを見つけれてくれたり / Somebody find
bugs
 誰かがバグを直してくれたり / Somebody fix bugs
 誰かが機能を追加してくれたり / Somebody add
features
動機 / Motivation
 こんなコードだれも使わないから公開しても無駄だよ
Waste my time because nobody want to use such code
 公開するの面倒くさいし..
publishing is messy work..
 ライセンスとかよく分からない
I have no knowledge about license
 会社やお客さんからどうやって許可をもらうの?
We must to get permission papers from business customer
 いろんな人にコードがダサイとかバグだとか言われちゃ
う
I don’t want to hear somebody criticize my code
反論 / Objection
Mar, 2015. Version 0.1
Published on only Github
 Djangoアプリケーションの保守を仕事で引き継いだ
 DjangoアプリのDBをMySQLからRedshiftに移行するお仕事
 DjangoとRedshiftを接続する
First Motivation – Why I created a backend
Amazon Redshift
LIKE THIS?
©「いらすとや」
 Open Source Software (OSS)
 Web Application Framework
 Monolithic
 Full documented
 Support several databases
 SQLite, MySQL, PostgreSQL
and Oracle
 Django ORM
 Django Admin
 Useful data management web console for Database
What is Django ?
 Petabyte-scale data warehouse service
on Amazon Web Service
 The complicated query for which it
takes several hours in MySQL will be
completed in tens of seconds.
 Alternatively the query issuing cost is expensive.
 Compatible with PostgreSQL-8.0.4
 Many incompatibility also available…
 Use identity instead of sequence, No INDEX, No ALTER
COLUMN, No SET TIME ZONE, No RETURNING, No
SELECT FOR UPDATE, …
What is Redshift ?
Amazon Redshift
 DjangoからDatabaseへは、こ
んな感じで繋がっている
First Motivation – Why I created a backend
Django ORM
Django AdminYour Code (View)
Django Database Backend
Database Driver
Database
 DjangoからDatabaseへは、こ
んな感じで繋がっている
 RedshiftというやつはPostgres
互換らしい
 既存のDriverでうまく動いた
First Motivation – Why I created a backend
Django ORM
Django AdminYour Code (View)
Django Postgres Backend
psycopg2 Driver
Redshift
 DjangoからDatabaseへは、こ
んな感じで繋がっている
 RedshiftというやつはPostgres
互換らしい
 既存のDriverでうまく動いた
 Django Admin で行を追加した
らクラッシュした
 !?
First Motivation – Why I created a backend
Django ORM
Django AdminYour Code (View)
Django Postgres Backend
psycopg2 Driver
Redshift
CRUSH!!
 DjangoからDatabaseへは、こ
んな感じで繋がっている
 RedshiftというやつはPostgres
互換らしい
 既存のDriverでうまく動いた
 Django Admin で行を追加した
らクラッシュした
 !?
 Django uses “RETURNING”
SQL statement for model.save()
 Redshift doesn’t support
“RETURNING”.
First Motivation – Why I created a backend
Django ORM
Django AdminYour Code (View)
Django Postgres Backend
supports postgresql 9.x or later
psycopg2 Driver
Redshift
based upon postgresql 8.0.2
CRUSH!!
 PostgreSQL supports RETURNING from 8.2.
 Redshift based upon PostgreSQL 8.0.2.
(´・ω・`)
おしい
near-miss
First Motivation – Why I created a backend
Anyway, I googled
 A few questions on StackOverflow are found
 SO: “Redshift is compat with PostgreSQL-8.0.2,
so you can use postgresql_psycopg2 backend”
 (sigh) ..it’s not true
 SO: “There is django-redshift repository on Github!”
 /shrug Oh yes, it’s using `RETURNING` ..
First Motivation – Why I created a backend
(´・ω・`)
じゃあ作るか…
OK, I’ll do it…
First Motivation – Why I created a backend
 ORM は、アプリケーションが
やりたいデータ処理をSQLを
書かずにオブジェクト操作で
実現する層
 Django Database Backendは
ORMの処理をSQLに変換して
Driverに伝える中間層
 Driver は、データベース接続
します。
Django database backend
Django ORM
Django AdminYour Code (View)
Django Database Backend
Database Driver
Database
 ORM は、アプリケーションが
やりたいデータ処理をSQLを
書かずにオブジェクト操作で
実現する層
 Django Redshift Backendで
ORMの処理をRedshift用の
SQLに変換してDriverに伝え
る
 Driver は、Postgresql用の
psycopg2をそのまま使用
Postgresql用を参考に、新しい
Database Backend を作るのはそ
んなに難しくなさそう?
Django Redshift database backend
Django ORM
Django AdminYour Code (View)
Django Redshift Backend
psycopg2 Driver
Redshift
 No documentation for “How to
create new Django Database
Backend”
 StackOverflow says “SQLite
backend is quite simple if you’re
looking to go that road.”
 Djangoライブラリのどこかにあ
るpostgresql_psycopg2 Backend
の一部を変更して、Redshift用
のSQLに変換すればよさそう
 なんだかたくさんあるけど、必
要なのは “RETURNING” を使っ
ている部分の変更だけ
 ということで。
Based upon postgresql_psycopg2
1. from django.db.backends import (
2. BaseDatabaseValidation,
3. )
4. from django.db.backends.postgresql_psycopg2.base import (
5. DatabaseFeatures as BasePGDatabaseFeatures,
6. DatabaseWrapper as BasePGDatabaseWrapper,
7. DatabaseOperations as BasePGDatabaseOperations,
8. DatabaseClient,
9. DatabaseCreation,
10. DatabaseIntrospection,
11. )
12.
13.
14. class DatabaseFeatures(BasePGDatabaseFeatures):
15. can_return_id_from_insert = False
16.
17.
18. class DatabaseOperations(BasePGDatabaseOperations):
19.
20. def last_insert_id(self, cursor, table_name, pk_name):
21. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name, table=self.quote_name(table_name)))
22. return cursor.fetchone()[0]
23.
24.
25. class DatabaseWrapper(BasePGDatabaseWrapper):
26. vendor = 'redshift'
27.
28. def __init__(self, *args, **kwargs):
29. super(DatabaseWrapper, self).__init__(*args, **kwargs)
30.
31. self.features = DatabaseFeatures(self)
32. self.ops = DatabaseOperations(self)
33. self.client = DatabaseClient(self)
34. self.creation = DatabaseCreation(self)
35. self.introspection = DatabaseIntrospection(self)
36. self.validation = BaseDatabaseValidation(self)
Source Code v 0.1 (2015-03-24)
Importing names to override
default behavior of
postgresql_psycopg2
Replacing attributes to override
default behavior of
postgresql_psycopg2
Replacing SQL statement
“RETURNING” …
with “SELECT MAX(pk)”
1. index 1fd9e51..c4ad661 100644
2. --- a/django_redshift_backend/base.py
3. +++ b/django_redshift_backend/base.py
4. @@ -20,6 +20,7 @@ from django.db.backends.postgresql_psycopg2.base import (
5.
6. class DatabaseFeatures(BasePGDatabaseFeatures):
7. can_return_id_from_insert = False
8. + has_select_for_update = False
9.
10.
11. class DatabaseOperations(BasePGDatabaseOperations):
12. @@ -28,6 +29,9 @@ class DatabaseOperations(BasePGDatabaseOperations):
13. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name,
table=self.quote_name(table_name)))
14. return cursor.fetchone()[0]
15.
16. + def for_update_sql(self, nowait=False):
17. + raise NotImplementedError('SELECT FOR UPDATE is not implemented for this
database backend')
18. +
19.
20. class DatabaseWrapper(BasePGDatabaseWrapper):
21. vendor = 'redshift'
Source Code v 0.1.1 (2015-03-27)
Disable SELECT FOR UPDATE
If used, raise NotImplementadError
Why do I open my code?
 NEEDS for Django Redshift Backend?
 YES, but little.
 WRONG information are there.
 EXPOSED to the public eye
 GIVE the code to next someone like me
 個人でOSSとして実装して公開した
 会社のコードにするとどうしても気にするべき事が増
える
 公開されたOSSを仕事で使う
 ←いつもやっている
 仕事で使いやすいApache Software Licenseを採用
 バグがあったら修正してOSSにコントリビュートす
る
 社内に業務中にOSSにコントリビュートする文化があ
る
 結果的に仕事のコストが下がる
ライセンスは?許可は?
 よかったこと
 Githubだけで公開したので身軽
 この段階ではテストコードを書かなかった
 今後やりたいこと
 SET TIME ZONE を発行しない(設定で回避してい
た)
 Django migration をサポートしたい
Summary of First Motivation
June, 2015. Version 0.1.2
First Pull-Request
Second Motivation - First Pull Request
First Pull Request (2015-06-02)
1. index c4ad661..1d91bb4 100644
2. --- a/django_redshift_backend/base.py
3. +++ b/django_redshift_backend/base.py
4. @@ -5,9 +5,13 @@
5. """
6. from __future__ import absolute_import
7.
8. -from django.db.backends import (
9. - BaseDatabaseValidation,
10. -)
11. +try:
12. + from django.db.backends.base.validation import (
13. + BaseDatabaseValidation,
14. + )
15. +except ImportError:
16. + # for django < 1.8
17. + from django.db.backends import BaseDatabaseValidation
18. from django.db.backends.postgresql_psycopg2.base import (
19. DatabaseFeatures as BasePGDatabaseFeatures,
20. DatabaseWrapper as BasePGDatabaseWrapper,
Second Motivation - First Pull Request
Django-1.8
Django-1.7
Django-1.7
Second Motivation - First Pull Request
このコードは使えそう。Django-1.8対
応の修正したForkを自分で管理した
くないから、修正取り込んでもらお
う(想像)
Django-1.8を将来使うかもしれないし、
対応しておくことでこの人が1.8上で
バグ出ししてくれるかも?
Second Motivation - First Pull Request
6/2 23:13
6/2 23:30
6/2 23:30
6/2 23:30
6/2 23:36
6/2 23:37
Merged!
Second Motivation - First Pull Request
6/2 23:13
6/2 23:30
6/2 23:30
6/2 23:30
6/2 23:36
6/2 23:37
Tagging advice
Second Motivation - First Pull Request
6/2 23:13
6/2 23:30
6/2 23:30
6/2 23:30
6/2 23:36
6/2 23:37
Live!Live!
Second Motivation - First Pull Request
6/2 23:13
6/2 23:30
6/2 23:30
6/2 23:30
6/2 23:36
6/2 23:37
 続けたいこと(よかったこと)
 ソースコードの公開
 知らない誰かとライブ感ある開発
 ニッチでもニーズがあることが(公開したから)分
かった
 こうしたらよさそう(変えたいこと)
 PyPIに公開したら使ってくれる人が増えるかも
Summary of Second Motivation
Feb, 2016. Version 0.2.1
Published on PyPI
 Django-1.7.x のサポートが2015/12末で終了
 Django-1.8にバージョンアップしたら、 “SET TIME
ZONE” SQLを発行して落ちた
 1.7:
settings.TIME_ZONE=None で SET TIME ZONE 抑止
 1.8:
settings.TIME_ZONEとDBの実際の値を比較して違っ
ていたらSET TIME ZONE!
 ドキュメント化されていない(´・Д・)
Third Motivation – Django-1.8
 0.2 (2016-01-08) SET TIME ZONE に対応
 0.2.1 (2016-01-28) ちょっと修正
当初課題だった3つの問題が解決
1. RETURNING
2. SELECT FOR UPDATE
3. SET TIME ZONE
人目に付くところに置いて、もっと広く使って貰って
もらう時期が来た気がした。
Third Motivation – Django-1.8
django-redshift-backend, PyPI debut
First PyPI release (2016-02-01)
 よかったこと
 Django-1.8 対応しておいてよかった
 1年ぶりの更新だったけど、おかげでPyPIに出せた
 今後やりたいこと
 いよいよ、Django migration をサポートしよう!
Third Motivation のまとめ
Migration対応PR ~ やるき低迷 ~ 復活
Fourth Motivation – migration support
PR for migration support (2016-03-07)
• Use CustomSchemaEditor to support sqlmigrate
• Map DateTimeField to “TIMESTAMP”
• Map AutoField to “identity” to support sqlmigrate
Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Merged!
Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Thanks!
Fourth Motivation – migration support
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Plz Release
0.3 to PyPI?
Motivation NOT FOUND
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
OK
Motivation NOT FOUND
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Thx
Motivation NOT FOUND
Mar 7
Mar 7
Mar 10
Mar 23
Apr 8
Apr 8
May 14
Done
 django migration に対応 (2016/3/5)
 自分でもmigration周りをそれなりのコード量実装
 実装をGithubに置きっぱなしでリリースはしなかっ
た
 使ってバグだししよう ~ 2ヶ月放置
 検証が重たかった
 自動テストが必要な規模へ
Motivation NOT FOUND
重たいのは一旦おいといて…
自分が楽しいことをやろう!
 Flake8でコーディング規約を自動チェック
 テストコードを書いてDjango-1.7, 1.8, 1.9でテスト
 ToxでPython-2.7, 3.4, 3.5 と Django-1.7, 1.8, 1.9 の
マトリックステスト
 Travis-ci で自動テスト
Resume -環境整備しよう
一番の難所
 Django database backendのテストってどうやって書
くの
 Django自体のテストコードを読み始める
 それっぽいテストを真似て必要十分になるまで調整
 Travis-ciで自動テストさせよう
 Travis-ciでpsycopg2のビルドがこける
 manylinux1 wheel(linux用バイナリパッケージ)を
作成してリポジトリに同梱して解決
 その後、migration対応も終えた
Testing for django-redshift-backend
manylinux1 wheel についてはこちら
 反省点
 「あれをやってからこれをやろう」は停滞する
 時間が経ってからリリースするのは気が重い
 PRを放置すると仲間が離れていく
 よかったこと
 各バージョンでのテストがあると安心できる
 PRが自動テストされているとチェックが楽
 今後の改善点
 完全でなくても小さい単位でリリースしていく
Fourth Motivation のまとめ
社内の1プロジェクトで持ってても良いことがなさそ
う
 お荷物化(謎技術化する、更新されなくなる)
 社内のプロジェクト外の人に使ってもらえない
 1つのニーズでバグ出しできる範囲は狭い
社内ライブラリにする?
 ニーズがニッチすぎてやはりお荷物化しそう
OSSを使って仕事をしてるのだから、OSSに還元した
い
OSS公開する時に考えたこと
 自分が困ったなら、他にも困った人がいるかも
 運良くバグ報告をもらえたら、潜在的な問題を直せ
るかも
 自分より詳しい人が良いアドバイスをくれるかも
OSS公開に期待したこと
 同じ課題をもった仲間が数人見つかった
 狭い要件にひっぱられても引き戻された
 VARCHAR3倍 -> settingsにしようぜ
 回帰テスト環境が必要になった
 リリースに対する責任を持つことになった
 リリースは自分だけができる
 リリースしないとForkが乱立する
OSS公開して起きたこと
 こんなコードだれも使わないから公開しても無駄だよ
Waste my time because nobody want to use such code
 自分より先に誰かが作って公開してくれてたら嬉しかったよね?
 公開するの面倒くさいし..
publishing is messy work..
 素振りだと思ってやってみたら?
 ライセンスとかよく分からない
I have no knowledge about license
 やってればそのうち分かるよ
 会社やお客さんからどうやって許可をもらうの?
We must to get permission papers from business customer
 伝え方は色々あるよ
 いろんな人にコードがダサイとかバグだとか言われちゃう
I don’t want to hear somebody criticize my code
 だれかが自分の代わりにバグを見つけてくれるならラッキーだよね
反論への反論 / Objection to Objection
 素振りの良い機会
 Django, Travis-ci, マトリックステスト 等
 詳しく知るきっかけになった
 次の自分のために、ソースコードを公開しておく
 OSSに還元、と言うとハードルが高い気がするけど
 困っているもう一人の自分に、解決方法を用意してお
く感じ
 気負わずに、小さく少しずつやるのがよい
OSS公開を振り返って
Questions?
@shimizukawa
Glab me anytime :)
Break, Party, Sprint
61
“オープンソースソフトウェアの育て方” 第1章より
製作著作 © 2005-2013 Karl Fogel, 高木正弘, Yoshinari Takaoka(a.k.a mumumu)
http://producingoss.com/ja/ CC BY-SA 2.1
Thanks :)
64

More Related Content

What's hot

EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017hirokiky
 
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockJJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockNobuhiro Sue
 
SEOとJava Script。 〜文書構造とチームと、時々、闇〜
SEOとJava Script。 〜文書構造とチームと、時々、闇〜SEOとJava Script。 〜文書構造とチームと、時々、闇〜
SEOとJava Script。 〜文書構造とチームと、時々、闇〜Yuki Minakawa
 
concrete5デザインカスタマイズに必要なPHPの知識
concrete5デザインカスタマイズに必要なPHPの知識concrete5デザインカスタマイズに必要なPHPの知識
concrete5デザインカスタマイズに必要なPHPの知識Hishikawa Takuro
 
The master plan of scaling a web application
The master plan ofscaling a web applicationThe master plan ofscaling a web application
The master plan of scaling a web applicationYusuke Wada
 
WordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでWordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでTakashi Uemura
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解する
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解するWordPress初心者からの脱出! カスタムなんとかをちゃんと理解する
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解するTakashi Uemura
 
Launch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPressLaunch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPressKite Koga
 
ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門muracchi
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1Nishida Kansuke
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会Mugen Fujii
 
101210 supreme web adobe seminar Nagoya
101210 supreme web adobe seminar Nagoya101210 supreme web adobe seminar Nagoya
101210 supreme web adobe seminar Nagoyatamotsu toyoda
 
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1Nishida Kansuke
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)Masanori Machii
 

What's hot (20)

EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
 
Pyramid入門
Pyramid入門Pyramid入門
Pyramid入門
 
WordPress と Bootstrap
WordPress と BootstrapWordPress と Bootstrap
WordPress と Bootstrap
 
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and SpockJJUG CCC 2011 Fall / Web test automation with Geb and Spock
JJUG CCC 2011 Fall / Web test automation with Geb and Spock
 
SEOとJava Script。 〜文書構造とチームと、時々、闇〜
SEOとJava Script。 〜文書構造とチームと、時々、闇〜SEOとJava Script。 〜文書構造とチームと、時々、闇〜
SEOとJava Script。 〜文書構造とチームと、時々、闇〜
 
What makes Geb groovy?
What makes Geb groovy?What makes Geb groovy?
What makes Geb groovy?
 
concrete5デザインカスタマイズに必要なPHPの知識
concrete5デザインカスタマイズに必要なPHPの知識concrete5デザインカスタマイズに必要なPHPの知識
concrete5デザインカスタマイズに必要なPHPの知識
 
The master plan of scaling a web application
The master plan ofscaling a web applicationThe master plan ofscaling a web application
The master plan of scaling a web application
 
WordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまでWordPress実践 導入からカスタマイズまで
WordPress実践 導入からカスタマイズまで
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解する
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解するWordPress初心者からの脱出! カスタムなんとかをちゃんと理解する
WordPress初心者からの脱出! カスタムなんとかをちゃんと理解する
 
WordPressとjQuery
WordPressとjQueryWordPressとjQuery
WordPressとjQuery
 
Launch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPressLaunch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPress
 
ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門ブログの枠を超える?ためのWordPressカスタマイズ入門
ブログの枠を超える?ためのWordPressカスタマイズ入門
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1
 
第5回勉強会
第5回勉強会第5回勉強会
第5回勉強会
 
101210 supreme web adobe seminar Nagoya
101210 supreme web adobe seminar Nagoya101210 supreme web adobe seminar Nagoya
101210 supreme web adobe seminar Nagoya
 
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 

Viewers also liked

Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
 
世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015Takayuki Shimizukawa
 
素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集いTakayuki Shimizukawa
 
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Takayuki Shimizukawa
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組みTakayuki Shimizukawa
 

Viewers also liked (6)

Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015
 
素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い
 
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 

Similar to 仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016

Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...Shotaro Suzuki
 
Mongo db使ってみよう
Mongo db使ってみようMongo db使ってみよう
Mongo db使ってみようOda Shinsuke
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验Ryan Poy
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Yohei Sasaki
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Daisuke Hiraoka
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)akira6592
 
Tech lounge gcp_20190313
Tech lounge gcp_20190313Tech lounge gcp_20190313
Tech lounge gcp_20190313yutaka_baba
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressAkinari Tsugo
 

Similar to 仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016 (20)

Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Mongodb
MongodbMongodb
Mongodb
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
Mongo db使ってみよう
Mongo db使ってみようMongo db使ってみよう
Mongo db使ってみよう
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
 
Tech lounge gcp_20190313
Tech lounge gcp_20190313Tech lounge gcp_20190313
Tech lounge gcp_20190313
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 

More from Takayuki Shimizukawa

Navigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsNavigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsTakayuki Shimizukawa
 
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようDjango ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようTakayuki Shimizukawa
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
 
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022Takayuki Shimizukawa
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由Takayuki Shimizukawa
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころTakayuki Shimizukawa
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後Takayuki Shimizukawa
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWayTakayuki Shimizukawa
 
Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Takayuki Shimizukawa
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Takayuki Shimizukawa
 
Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Takayuki Shimizukawa
 
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015Takayuki Shimizukawa
 
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...Takayuki Shimizukawa
 
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93Takayuki Shimizukawa
 

More from Takayuki Shimizukawa (20)

Navigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsNavigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential Reads
 
IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023
 
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようDjango ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
 
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
 
Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015
 
Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015
 
Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015
 
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
 
Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015Easy contributable internationalization process with Sphinx @ pyconsg2015
Easy contributable internationalization process with Sphinx @ pyconsg2015
 
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)
Sphinx autodoc - automated API documentation (PyCon APAC 2015 in Taiwan)
 
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ...
 
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
 

Recently uploaded

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016

  • 2. おまえ誰よ / Who are you @shimizukawa (清水川)  BeProud co, ltd.  Sphinx committer  一般社団法人PyCon JP理事 Board member of PyCon JP committee 株式会社BeProud所属
  • 6. The person who want to know … 以下のことを知りたい方  Sharing them source code for job as a OSS. 仕事で使うコードをOSSとして公開すること  Structure of Django database backend Djangoのdatabase backend周りの構造  How to bring up your code. コードを育てていく方法 Target attendees
  • 7.  You can get some benefit if you open your (tiny) code ちょっとしたコードでも公開しておくと良いことが あるよ  「良いこと」って? / What is benefit?  誰かがバグを見つけれてくれたり / Somebody find bugs  誰かがバグを直してくれたり / Somebody fix bugs  誰かが機能を追加してくれたり / Somebody add features 動機 / Motivation
  • 8.  こんなコードだれも使わないから公開しても無駄だよ Waste my time because nobody want to use such code  公開するの面倒くさいし.. publishing is messy work..  ライセンスとかよく分からない I have no knowledge about license  会社やお客さんからどうやって許可をもらうの? We must to get permission papers from business customer  いろんな人にコードがダサイとかバグだとか言われちゃ う I don’t want to hear somebody criticize my code 反論 / Objection
  • 9. Mar, 2015. Version 0.1 Published on only Github
  • 10.  Djangoアプリケーションの保守を仕事で引き継いだ  DjangoアプリのDBをMySQLからRedshiftに移行するお仕事  DjangoとRedshiftを接続する First Motivation – Why I created a backend Amazon Redshift LIKE THIS? ©「いらすとや」
  • 11.  Open Source Software (OSS)  Web Application Framework  Monolithic  Full documented  Support several databases  SQLite, MySQL, PostgreSQL and Oracle  Django ORM  Django Admin  Useful data management web console for Database What is Django ?
  • 12.  Petabyte-scale data warehouse service on Amazon Web Service  The complicated query for which it takes several hours in MySQL will be completed in tens of seconds.  Alternatively the query issuing cost is expensive.  Compatible with PostgreSQL-8.0.4  Many incompatibility also available…  Use identity instead of sequence, No INDEX, No ALTER COLUMN, No SET TIME ZONE, No RETURNING, No SELECT FOR UPDATE, … What is Redshift ? Amazon Redshift
  • 13.  DjangoからDatabaseへは、こ んな感じで繋がっている First Motivation – Why I created a backend Django ORM Django AdminYour Code (View) Django Database Backend Database Driver Database
  • 14.  DjangoからDatabaseへは、こ んな感じで繋がっている  RedshiftというやつはPostgres 互換らしい  既存のDriverでうまく動いた First Motivation – Why I created a backend Django ORM Django AdminYour Code (View) Django Postgres Backend psycopg2 Driver Redshift
  • 15.  DjangoからDatabaseへは、こ んな感じで繋がっている  RedshiftというやつはPostgres 互換らしい  既存のDriverでうまく動いた  Django Admin で行を追加した らクラッシュした  !? First Motivation – Why I created a backend Django ORM Django AdminYour Code (View) Django Postgres Backend psycopg2 Driver Redshift CRUSH!!
  • 16.  DjangoからDatabaseへは、こ んな感じで繋がっている  RedshiftというやつはPostgres 互換らしい  既存のDriverでうまく動いた  Django Admin で行を追加した らクラッシュした  !?  Django uses “RETURNING” SQL statement for model.save()  Redshift doesn’t support “RETURNING”. First Motivation – Why I created a backend Django ORM Django AdminYour Code (View) Django Postgres Backend supports postgresql 9.x or later psycopg2 Driver Redshift based upon postgresql 8.0.2 CRUSH!!
  • 17.  PostgreSQL supports RETURNING from 8.2.  Redshift based upon PostgreSQL 8.0.2. (´・ω・`) おしい near-miss First Motivation – Why I created a backend
  • 18. Anyway, I googled  A few questions on StackOverflow are found  SO: “Redshift is compat with PostgreSQL-8.0.2, so you can use postgresql_psycopg2 backend”  (sigh) ..it’s not true  SO: “There is django-redshift repository on Github!”  /shrug Oh yes, it’s using `RETURNING` .. First Motivation – Why I created a backend
  • 19. (´・ω・`) じゃあ作るか… OK, I’ll do it… First Motivation – Why I created a backend
  • 20.  ORM は、アプリケーションが やりたいデータ処理をSQLを 書かずにオブジェクト操作で 実現する層  Django Database Backendは ORMの処理をSQLに変換して Driverに伝える中間層  Driver は、データベース接続 します。 Django database backend Django ORM Django AdminYour Code (View) Django Database Backend Database Driver Database
  • 21.  ORM は、アプリケーションが やりたいデータ処理をSQLを 書かずにオブジェクト操作で 実現する層  Django Redshift Backendで ORMの処理をRedshift用の SQLに変換してDriverに伝え る  Driver は、Postgresql用の psycopg2をそのまま使用 Postgresql用を参考に、新しい Database Backend を作るのはそ んなに難しくなさそう? Django Redshift database backend Django ORM Django AdminYour Code (View) Django Redshift Backend psycopg2 Driver Redshift
  • 22.  No documentation for “How to create new Django Database Backend”  StackOverflow says “SQLite backend is quite simple if you’re looking to go that road.”  Djangoライブラリのどこかにあ るpostgresql_psycopg2 Backend の一部を変更して、Redshift用 のSQLに変換すればよさそう  なんだかたくさんあるけど、必 要なのは “RETURNING” を使っ ている部分の変更だけ  ということで。 Based upon postgresql_psycopg2
  • 23. 1. from django.db.backends import ( 2. BaseDatabaseValidation, 3. ) 4. from django.db.backends.postgresql_psycopg2.base import ( 5. DatabaseFeatures as BasePGDatabaseFeatures, 6. DatabaseWrapper as BasePGDatabaseWrapper, 7. DatabaseOperations as BasePGDatabaseOperations, 8. DatabaseClient, 9. DatabaseCreation, 10. DatabaseIntrospection, 11. ) 12. 13. 14. class DatabaseFeatures(BasePGDatabaseFeatures): 15. can_return_id_from_insert = False 16. 17. 18. class DatabaseOperations(BasePGDatabaseOperations): 19. 20. def last_insert_id(self, cursor, table_name, pk_name): 21. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name, table=self.quote_name(table_name))) 22. return cursor.fetchone()[0] 23. 24. 25. class DatabaseWrapper(BasePGDatabaseWrapper): 26. vendor = 'redshift' 27. 28. def __init__(self, *args, **kwargs): 29. super(DatabaseWrapper, self).__init__(*args, **kwargs) 30. 31. self.features = DatabaseFeatures(self) 32. self.ops = DatabaseOperations(self) 33. self.client = DatabaseClient(self) 34. self.creation = DatabaseCreation(self) 35. self.introspection = DatabaseIntrospection(self) 36. self.validation = BaseDatabaseValidation(self) Source Code v 0.1 (2015-03-24) Importing names to override default behavior of postgresql_psycopg2 Replacing attributes to override default behavior of postgresql_psycopg2 Replacing SQL statement “RETURNING” … with “SELECT MAX(pk)”
  • 24. 1. index 1fd9e51..c4ad661 100644 2. --- a/django_redshift_backend/base.py 3. +++ b/django_redshift_backend/base.py 4. @@ -20,6 +20,7 @@ from django.db.backends.postgresql_psycopg2.base import ( 5. 6. class DatabaseFeatures(BasePGDatabaseFeatures): 7. can_return_id_from_insert = False 8. + has_select_for_update = False 9. 10. 11. class DatabaseOperations(BasePGDatabaseOperations): 12. @@ -28,6 +29,9 @@ class DatabaseOperations(BasePGDatabaseOperations): 13. cursor.execute('SELECT MAX({pk}) from {table}'.format(pk=pk_name, table=self.quote_name(table_name))) 14. return cursor.fetchone()[0] 15. 16. + def for_update_sql(self, nowait=False): 17. + raise NotImplementedError('SELECT FOR UPDATE is not implemented for this database backend') 18. + 19. 20. class DatabaseWrapper(BasePGDatabaseWrapper): 21. vendor = 'redshift' Source Code v 0.1.1 (2015-03-27) Disable SELECT FOR UPDATE If used, raise NotImplementadError
  • 25. Why do I open my code?  NEEDS for Django Redshift Backend?  YES, but little.  WRONG information are there.  EXPOSED to the public eye  GIVE the code to next someone like me
  • 26.  個人でOSSとして実装して公開した  会社のコードにするとどうしても気にするべき事が増 える  公開されたOSSを仕事で使う  ←いつもやっている  仕事で使いやすいApache Software Licenseを採用  バグがあったら修正してOSSにコントリビュートす る  社内に業務中にOSSにコントリビュートする文化があ る  結果的に仕事のコストが下がる ライセンスは?許可は?
  • 27.  よかったこと  Githubだけで公開したので身軽  この段階ではテストコードを書かなかった  今後やりたいこと  SET TIME ZONE を発行しない(設定で回避してい た)  Django migration をサポートしたい Summary of First Motivation
  • 28. June, 2015. Version 0.1.2 First Pull-Request
  • 29. Second Motivation - First Pull Request First Pull Request (2015-06-02)
  • 30. 1. index c4ad661..1d91bb4 100644 2. --- a/django_redshift_backend/base.py 3. +++ b/django_redshift_backend/base.py 4. @@ -5,9 +5,13 @@ 5. """ 6. from __future__ import absolute_import 7. 8. -from django.db.backends import ( 9. - BaseDatabaseValidation, 10. -) 11. +try: 12. + from django.db.backends.base.validation import ( 13. + BaseDatabaseValidation, 14. + ) 15. +except ImportError: 16. + # for django < 1.8 17. + from django.db.backends import BaseDatabaseValidation 18. from django.db.backends.postgresql_psycopg2.base import ( 19. DatabaseFeatures as BasePGDatabaseFeatures, 20. DatabaseWrapper as BasePGDatabaseWrapper, Second Motivation - First Pull Request Django-1.8 Django-1.7 Django-1.7
  • 31. Second Motivation - First Pull Request このコードは使えそう。Django-1.8対 応の修正したForkを自分で管理した くないから、修正取り込んでもらお う(想像) Django-1.8を将来使うかもしれないし、 対応しておくことでこの人が1.8上で バグ出ししてくれるかも?
  • 32. Second Motivation - First Pull Request 6/2 23:13 6/2 23:30 6/2 23:30 6/2 23:30 6/2 23:36 6/2 23:37 Merged!
  • 33. Second Motivation - First Pull Request 6/2 23:13 6/2 23:30 6/2 23:30 6/2 23:30 6/2 23:36 6/2 23:37 Tagging advice
  • 34. Second Motivation - First Pull Request 6/2 23:13 6/2 23:30 6/2 23:30 6/2 23:30 6/2 23:36 6/2 23:37 Live!Live!
  • 35. Second Motivation - First Pull Request 6/2 23:13 6/2 23:30 6/2 23:30 6/2 23:30 6/2 23:36 6/2 23:37
  • 36.  続けたいこと(よかったこと)  ソースコードの公開  知らない誰かとライブ感ある開発  ニッチでもニーズがあることが(公開したから)分 かった  こうしたらよさそう(変えたいこと)  PyPIに公開したら使ってくれる人が増えるかも Summary of Second Motivation
  • 37. Feb, 2016. Version 0.2.1 Published on PyPI
  • 38.  Django-1.7.x のサポートが2015/12末で終了  Django-1.8にバージョンアップしたら、 “SET TIME ZONE” SQLを発行して落ちた  1.7: settings.TIME_ZONE=None で SET TIME ZONE 抑止  1.8: settings.TIME_ZONEとDBの実際の値を比較して違っ ていたらSET TIME ZONE!  ドキュメント化されていない(´・Д・) Third Motivation – Django-1.8
  • 39.  0.2 (2016-01-08) SET TIME ZONE に対応  0.2.1 (2016-01-28) ちょっと修正 当初課題だった3つの問題が解決 1. RETURNING 2. SELECT FOR UPDATE 3. SET TIME ZONE 人目に付くところに置いて、もっと広く使って貰って もらう時期が来た気がした。 Third Motivation – Django-1.8
  • 40. django-redshift-backend, PyPI debut First PyPI release (2016-02-01)
  • 41.  よかったこと  Django-1.8 対応しておいてよかった  1年ぶりの更新だったけど、おかげでPyPIに出せた  今後やりたいこと  いよいよ、Django migration をサポートしよう! Third Motivation のまとめ
  • 43. Fourth Motivation – migration support PR for migration support (2016-03-07) • Use CustomSchemaEditor to support sqlmigrate • Map DateTimeField to “TIMESTAMP” • Map AutoField to “identity” to support sqlmigrate
  • 44. Fourth Motivation – migration support Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 Merged!
  • 45. Fourth Motivation – migration support Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 Thanks!
  • 46. Fourth Motivation – migration support Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 Plz Release 0.3 to PyPI?
  • 47. Motivation NOT FOUND Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 OK
  • 48. Motivation NOT FOUND Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 Thx
  • 49. Motivation NOT FOUND Mar 7 Mar 7 Mar 10 Mar 23 Apr 8 Apr 8 May 14 Done
  • 50.  django migration に対応 (2016/3/5)  自分でもmigration周りをそれなりのコード量実装  実装をGithubに置きっぱなしでリリースはしなかっ た  使ってバグだししよう ~ 2ヶ月放置  検証が重たかった  自動テストが必要な規模へ Motivation NOT FOUND
  • 51. 重たいのは一旦おいといて… 自分が楽しいことをやろう!  Flake8でコーディング規約を自動チェック  テストコードを書いてDjango-1.7, 1.8, 1.9でテスト  ToxでPython-2.7, 3.4, 3.5 と Django-1.7, 1.8, 1.9 の マトリックステスト  Travis-ci で自動テスト Resume -環境整備しよう
  • 52. 一番の難所  Django database backendのテストってどうやって書 くの  Django自体のテストコードを読み始める  それっぽいテストを真似て必要十分になるまで調整  Travis-ciで自動テストさせよう  Travis-ciでpsycopg2のビルドがこける  manylinux1 wheel(linux用バイナリパッケージ)を 作成してリポジトリに同梱して解決  その後、migration対応も終えた Testing for django-redshift-backend
  • 54.  反省点  「あれをやってからこれをやろう」は停滞する  時間が経ってからリリースするのは気が重い  PRを放置すると仲間が離れていく  よかったこと  各バージョンでのテストがあると安心できる  PRが自動テストされているとチェックが楽  今後の改善点  完全でなくても小さい単位でリリースしていく Fourth Motivation のまとめ
  • 55.
  • 56. 社内の1プロジェクトで持ってても良いことがなさそ う  お荷物化(謎技術化する、更新されなくなる)  社内のプロジェクト外の人に使ってもらえない  1つのニーズでバグ出しできる範囲は狭い 社内ライブラリにする?  ニーズがニッチすぎてやはりお荷物化しそう OSSを使って仕事をしてるのだから、OSSに還元した い OSS公開する時に考えたこと
  • 58.  同じ課題をもった仲間が数人見つかった  狭い要件にひっぱられても引き戻された  VARCHAR3倍 -> settingsにしようぜ  回帰テスト環境が必要になった  リリースに対する責任を持つことになった  リリースは自分だけができる  リリースしないとForkが乱立する OSS公開して起きたこと
  • 59.  こんなコードだれも使わないから公開しても無駄だよ Waste my time because nobody want to use such code  自分より先に誰かが作って公開してくれてたら嬉しかったよね?  公開するの面倒くさいし.. publishing is messy work..  素振りだと思ってやってみたら?  ライセンスとかよく分からない I have no knowledge about license  やってればそのうち分かるよ  会社やお客さんからどうやって許可をもらうの? We must to get permission papers from business customer  伝え方は色々あるよ  いろんな人にコードがダサイとかバグだとか言われちゃう I don’t want to hear somebody criticize my code  だれかが自分の代わりにバグを見つけてくれるならラッキーだよね 反論への反論 / Objection to Objection
  • 60.  素振りの良い機会  Django, Travis-ci, マトリックステスト 等  詳しく知るきっかけになった  次の自分のために、ソースコードを公開しておく  OSSに還元、と言うとハードルが高い気がするけど  困っているもう一人の自分に、解決方法を用意してお く感じ  気負わずに、小さく少しずつやるのがよい OSS公開を振り返って
  • 61. Questions? @shimizukawa Glab me anytime :) Break, Party, Sprint 61
  • 62.
  • 63. “オープンソースソフトウェアの育て方” 第1章より 製作著作 © 2005-2013 Karl Fogel, 高木正弘, Yoshinari Takaoka(a.k.a mumumu) http://producingoss.com/ja/ CC BY-SA 2.1

Editor's Notes

  1. コードの公開から起きたこと 各段階でなにを考えてどうやってきたか 事例として紹介します
  2. MySQLで20msくらいの1行取り出すクエリに1秒かかる
  3. DjangoのRedshift用データベースバックエンドを実装したのは、仕事で必要だったからです。 最初はSELECTでのみ動作確認していて、使える使える~と思ってたんですが、Django Adminでレコードを追加しようとしたら問題が起きました。 Djangoが発行するSQLにRedshiftが対応してなかったんです。 もうプロジェクトは進んでいて、そこ確認してなかったのかよ!状態。 さてどうする? ということで、DjangoのRedshift用バックエンドを実装しました。
  4. DjangoのRedshift用データベースバックエンドを実装したのは、仕事で必要だったからです。 最初はSELECTでのみ動作確認していて、使える使える~と思ってたんですが、Django Adminでレコードを追加しようとしたら問題が起きました。 Djangoが発行するSQLにRedshiftが対応してなかったんです。 もうプロジェクトは進んでいて、そこ確認してなかったのかよ!状態。 さてどうする? ということで、DjangoのRedshift用バックエンドを実装しました。
  5. DjangoのRedshift用データベースバックエンドを実装したのは、仕事で必要だったからです。 最初はSELECTでのみ動作確認していて、使える使える~と思ってたんですが、Django Adminでレコードを追加しようとしたら問題が起きました。 Djangoが発行するSQLにRedshiftが対応してなかったんです。 もうプロジェクトは進んでいて、そこ確認してなかったのかよ!状態。 さてどうする? ということで、DjangoのRedshift用バックエンドを実装しました。
  6. Django のDatabase Backendってどうなってるの?
  7. ということで、DjangoのRedshift用バックエンドを実装しました。 それくらいなら、と思って作ってみたらコメント空白行除いて30行程度でした。 しかもほとんど元コードのコピペです。
  8. 「知らないことをどうやって調べ、実装したのか」
  9. それくらいなら、と思って作ってみたらコメント空白行除いて30行程度でした。 しかもほとんど元コードをimportしていて、変更箇所は2,3行。 (クリック) RETURNING を無効化。 Django Adminが、最後にインサートした行のIDを使うので、代わりの実装として、SELECT MAX(pk) を使うように。 SOで提案されてて、調べたところ、これしか方法がなさそうなことが分かった。 INSERTが連続したときに別のID取れそうでこわいけど、これしかなかった
  10. 3日後には、SELECT FOR UPDATEを使わないように修正したバージョンを用意しました。 Redshiftが対応してなかった これもDjango Adminから使われていたため気づくのが遅れた
  11. 2周目の自分が残念な気持ちにならないように Django Redshift Driverに秘伝の価値はない 間違った情報しか見つけられなかった 一人でも多くの目に触れることで、問題や課題を見つけたい。無ければ無いで良い 次の自分に正しい情報を届ける 数ヶ月前の自分に向けて
  12. Githubだけなので身軽。気軽に修正して最新を使っていける この段階でのテストコードは身軽さを失わせる。 何をテストしていいのかも分かっていない状態。 settings.TIME_ZONE=None で回避できるので、とりあえずこれで回避していた DMLよりDDLの違いの方が大きい。 マイグレーションできないので、手元のpostgresqlにマイグレーションしてDDLはき出させて変換してたのがとても面倒 この頃は、0.1.1ということもあって、必要最小限のサポートのみ。したいことはあったけど、ニーズもないし完全対応のモチベーションもなかった。
  13. Django 1.8 support のPRが来た ソースコード公開から2ヶ月後
  14. Djangoのモジュールパスが変わったのでtry/exceptで新旧コードに対応する数行の差分
  15. マージした それぞれの思惑(モチベーション) * 有用だからパッチやForkせずに使えるようにしたい * 将来使う1.8に対応しておくことでこの人がバグ出ししてくれる
  16. ライブ感
  17. ライブ感
  18. ライブ感
  19. ライブ感
  20. postgresql_psycopg2のSET TIME ZONE関連の実装が変わってしまった Django-1.7: Noneを設定しておけばSET TIME ZONEが発行されない Django-1.8: 設定した値と、DBのTIME ZONEが違ったら SET TIME ZONEを発行する! Django-1.8 の非互換の変更としてドキュメント化されていない
  21. 半年ぶりにバージョンアップ
  22. 約1年
  23. PyPI公開から1ヶ月で、migration対応の足がかりとなるPRが来た! マイグレーションは自分もやりたいと思っていたところなので、テンションがあがった
  24. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  25. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  26. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  27. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  28. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  29. ただしGithubでタグ打っただけでPyPIに出さなかった (3/10) PyPIに出さない? (4/8) OK (5/14) 出したよ
  30. wheelは、Pythonのバイナリ配布フォーマットです。
  31. MacやWindows用はしばらく前から使えたんですが、最近 manylinux1 という仕様がPEPで決まって、Linuxでも使えるようになりました。 バイナリパッケージについては、次の3時半から、ちょうど良い発表があるので、興味があればそちらへ参加してみてください。
  32. すでにOSSを仕事で使っている場合
  33. コードの公開から起きたこと 各段階でなにを考えてどうやってきたか 事例として紹介します