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

Takayuki Shimizukawa
Takayuki ShimizukawaWeb Developer at BePROUD Inc.
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 のまとめ
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
社内の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
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
“オープンソースソフトウェアの育て方” 第1章より
製作著作 © 2005-2013 Karl Fogel, 高木正弘, Yoshinari Takaoka(a.k.a mumumu)
http://producingoss.com/ja/ CC BY-SA 2.1
Thanks :)
64
1 of 64

Recommended

Djangoによるスマホアプリバックエンドの実装 by
Djangoによるスマホアプリバックエンドの実装Djangoによるスマホアプリバックエンドの実装
Djangoによるスマホアプリバックエンドの実装Nakazawa Yuichi
25.2K views97 slides
DjangoでさくっとWeb アプリケーション開発をする話 by
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話Nakazawa Yuichi
23.7K views76 slides
Djangoのススメ by
DjangoのススメDjangoのススメ
DjangoのススメAlisue Lambda
19.1K views58 slides
Django 1.5 における効果的な MTV 設計 & ネイティブApp by
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppYikei Lu
5.5K views82 slides
Djangoフレームワークの紹介 by
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
7.2K views42 slides
Djangoアプリの実践的設計手法 by
Djangoアプリの実践的設計手法Djangoアプリの実践的設計手法
Djangoアプリの実践的設計手法Ian Lewis
6.8K views14 slides

More Related Content

What's hot

EC-CUBEプラグイン講義 by
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
16.9K views48 slides
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017 by
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017hirokiky
13K views78 slides
Pyramid入門 by
Pyramid入門Pyramid入門
Pyramid入門Atsushi Odagiri
13.7K views54 slides
JJUG CCC 2011 Fall / Web test automation with Geb and Spock by
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
2.7K views22 slides
SEOとJava Script。 〜文書構造とチームと、時々、闇〜 by
SEOとJava Script。 〜文書構造とチームと、時々、闇〜SEOとJava Script。 〜文書構造とチームと、時々、闇〜
SEOとJava Script。 〜文書構造とチームと、時々、闇〜Yuki Minakawa
3.4K views111 slides

What's hot(20)

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

Viewers also liked

Pythonはどうやってlen関数で長さを手にいれているの? by
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
38.1K views56 slides
世界のSphinx事情 @ SphinxCon JP 2015 by
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015Takayuki Shimizukawa
3.4K views22 slides
素振りのススメ at Python入門者の集い by
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集いTakayuki Shimizukawa
8.6K views26 slides
JUS関西 Sphinxワークショップ@関西 Sphinx紹介 by
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介Takayuki Shimizukawa
8.8K views71 slides
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016 by
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
3.1K views66 slides
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み by
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組みTakayuki Shimizukawa
28.1K views62 slides

Viewers also liked(6)

Pythonはどうやってlen関数で長さを手にいれているの? by Takayuki Shimizukawa
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
Takayuki Shimizukawa38.1K views
素振りのススメ at Python入門者の集い by Takayuki Shimizukawa
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い
JUS関西 Sphinxワークショップ@関西 Sphinx紹介 by Takayuki Shimizukawa
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016 by Takayuki Shimizukawa
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で作る貢献しやすい ドキュメント翻訳の仕組み by Takayuki Shimizukawa
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Takayuki Shimizukawa28.1K views

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

Pycon2014 django performance by
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
12.4K views59 slides
Inside mobage platform by
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
3K views58 slides
Djangoフレームワークの紹介 by
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
73K views47 slides
Head toward Java 16 (Night Seminar Edition) by
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
537 views32 slides
React Native GUIDE by
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
1.3K views85 slides
Ec cube開発合宿 プラグインセミナー by
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
1.5K views15 slides

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

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

More from Takayuki Shimizukawa

IKEv2-VPN PyHackCon2023 by
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023Takayuki Shimizukawa
21 views23 slides
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう by
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようDjango ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようTakayuki Shimizukawa
199 views52 slides
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022 by
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
1.5K views46 slides
Webアプリを並行開発する際のマイグレーション戦略 by
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
4.8K views49 slides
『自走プログラマー』 が我々に必要だった理由 by
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由Takayuki Shimizukawa
743 views22 slides
エキスパートPythonプログラミング改訂3版の読みどころ by
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころTakayuki Shimizukawa
1.8K views23 slides

More from Takayuki Shimizukawa(20)

Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう by Takayuki Shimizukawa
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けようDjango ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022 by Takayuki Shimizukawa
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
Webアプリを並行開発する際のマイグレーション戦略 by Takayuki Shimizukawa
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
『自走プログラマー』 が我々に必要だった理由 by Takayuki Shimizukawa
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由
エキスパートPythonプログラミング改訂3版の読みどころ by Takayuki Shimizukawa
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
RLSを用いたマルチテナント実装 for Django by Takayuki Shimizukawa
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
Takayuki Shimizukawa11.1K views
【修正版】Django + SQLAlchemy: シンプルWay by Takayuki Shimizukawa
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
Takayuki Shimizukawa11.3K views
Sphinx customization for OGP support at SphinxCon JP 2018 by Takayuki Shimizukawa
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 by Takayuki Shimizukawa
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 by Takayuki Shimizukawa
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 by Takayuki Shimizukawa
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) by Takayuki 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)
Easy contributable internationalization process with Sphinx @ pyconsg2015 by Takayuki Shimizukawa
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) by Takayuki 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)
Easy contributable internationalization process with Sphinx (PyCon APAC 2015 ... by 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 ...
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93 by Takayuki Shimizukawa
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 - BPStudy93
PyPro2の読みどころ紹介:Python開発の過去と現在 by Takayuki Shimizukawa
PyPro2の読みどころ紹介:Python開発の過去と現在PyPro2の読みどころ紹介:Python開発の過去と現在
PyPro2の読みどころ紹介:Python開発の過去と現在
Takayuki Shimizukawa11.9K views

Recently uploaded

定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
135 views64 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
66 views12 slides
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...NTT DATA Technology & Innovation
158 views42 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
101 views26 slides
SNMPセキュリティ超入門 by
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
479 views15 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
27 views17 slides

Recently uploaded(12)

PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda479 views
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga27 views
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.78 views
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4405 views
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka90 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)

仕事で使うちょっとしたコードを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 のまとめ
  • 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
  • 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. コードの公開から起きたこと 各段階でなにを考えてどうやってきたか 事例として紹介します