@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

初めてプルリクを作ってmergeしてもらった。

github.com

ショボい修正だけど嬉しいもんですね。django1.10からmiddlewareの書き方がちょっと変わった(正確には新しい書き方ができるようになった)ことに対応するためのプルリクを出しました。

しかしMiddlewareMixinはどうしてdeprecationモジュールに入っているんでしょう。このmix-inを使わずにメソッドを直接実装しろってことなんだろうか。

django-crequestというのは、requestオブジェクトを本来参照できない場所で参照するためのものです。modelとかutil的な関数でrequestを参照できるようになります。ASP.NETでいう System.Web.HttpContext.Current のようなやつ。ご利用はほどほどに。

追記:migrateをスキップすることでDjangoのunittestを高速化する

この続きです。

koty.hatenablog.com

結論を先に書くと、以下のsettingsでテストを動かす。テスト用のsqlite3ファイルは使わない。 *1

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }
}

# MIGRATION_MODULESは各installed_appsにある名前をkeyに、当該appのmigrationファイルのモジュール(既定ではmigrationsモジュール)をvalue指定した辞書。
# 以下のクラス、どんなキーを指定しても辞書に存在し、どんなキーを指定しても`nomigrations`を返す辞書を作っている。
# 'nomigrations'モジュールは存在しないので、既存のmigrationファイルは見つからずにmigration未済みという扱いになる。
class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        # return 'notmigrations'
        return False  # django 1.11にも対応するにはこちらで

MIGRATION_MODULES = DisableMigrations()

ドキュメントを見ると、

When using SQLite, the tests will use an in-memory database by default

とあるので、ファイルを指定しても :memory: で実行されるんだろうか。

また、core/management/commands/migrate.pydb/migrations/loader.pyを見るに、migrationファイルが見つからない場合はその場でmigrationファイルを作って実行してくれるようだ。

Two Scoops of Django: Best Practices for Django 1.8

Two Scoops of Django: Best Practices for Django 1.8

*1:ちゃんとdjangoのドキュメントやソースコードを読まないといかんですね。。。

長野市unofficialごみ収集カレンダーアプリを作った話(データ調達編)

突っ込みどころはありまくりだけど、アプリがどうにか実用レベルになったので記事を書きます。

初めてスマホアプリを作りました。

play.google.com

Xamarin製です。Xamarinにかんしてはまた別の記事で書きます。ここではアプリ内で使っているカレンダーデータをどう調達したかを書きます。

アプリを作るきっかけ

この記事を見たのがきっかけです。

ごみ分別アプリ(信州大学学生が作成しました。) - 長野市ホームページ

このアプリを使ってみると、通知機能がありませんでした。我が家では私がごみ出し担当なのでその日の朝に何のごみを出せる日なのかを通知してほしいのです。この記事に

長野市では、開発段階から行政情報を提供し

とあり、調べるとカレンダーはPDFで公開されていました。

http://www.city.nagano.nagano.jp/site/kateigomi/121416.html

これはプログラムでは扱いづらい。そこで生活環境課にメールしexcel形式での公開を依頼してみたところ、2ヶ月ほどして来年度平成29年度のデータを公開していただけました。ありがたや〜。

アプリで使っているカレンダーデータはこちら

アプリでデータを使うに至るまでの所感

ちょうど同じようなタイミングで、祝日データの公開について話題になりました。

最初このつぶやきを見たときは、ご多分に漏れずITリテラシーの低さを残念に思ったのですが

人間が印刷したりして扱う形式とプログラムが処理する前提で公開する形式は違うほうがいいわけで、その変換は自動化なりで効率化されてないと、担当者やってらんねーと思うんですよね。現場努力でどうにかするみたいなのはなんかおかしい

という指摘をしている方がいて、たしかにと納得しました。実際、市に公開いただいたxls形式のごみカレンダーはまだプログラムでは少し扱いにくいです。列が分かれていたり日付セルに◯があって日付型でなくなってしまっていたり。人間には見やすいのですけどね。

「変換は自動化なりで効率化」ここを誰がやるのか。今は我々コンピュータ屋の仕事なのでしょう。今回は、扱いやすいJSONにするためにparserを書きました。

GitHub - koty/nagano_gomi_calendar

でも将来的には現場の人が片手間にできるようになるといいなと思います。車だってたまにはタクシーを使うけど多くは自分で運転するじゃないですか。小学校でのプログラミング教育必修化に期待しています。

Happy Hacking Keyboard(PD-KB02)をSierraで使用する

El Capitanで、初代HHKBをPS2→USB変換アダプターをかませて使っている。

emacsキーバインドを実現すのにkarabinerを使っていたがSierraでは使えなくなるのでバージョンアップをちゅうちょしていた。そんなときにrebuild.fmで伊藤直也さんが、Hammerspoonを使えば良いようなことを言っていたのを聞き、以下を参考にしつつ年末年始休みに勢いでSierraに上げてみた。

qiita.com

これでおおむねやりたい挙動にはなったのだが、OSログイン時にSeilがエラーする。もしやと思ったら、やはりcmdキーが使えない。Seilは初代HHKBのcmdキーを有効化するために以下を参考にして使っていた。

qiita.com

しかしSeilもSierraでは使えなくなったようだ。

Seilのページを見ると、

Seilの機能はKarabiner-Elementsに統合されました。Karabiner-Elementsをお使いください。

とあるので、Karabiner-Elementsをインストールし、以下のように設定したところ、cmdが使えるようになった。

f:id:kkotyy:20170104093433p:plain

正直言って何でこれでcmdが使えるようになるのか分かっていないのだが。。。

というわけで、「初代HHKBでcmdキーを有効化する」ためだけにKarabiner-Elementsを入れた。

謹賀新年2017

あけました。一年前のエントリーとあまり変わらないな。

昨年の振り返り

おかげさまで家族みんなが大きな病気もせず、一年を過ごせました。それだけで他に言うこともないのですが、強いて振り返ります。

子供中心の毎日

直近の状況はひとつ前のエントリーに書いた通り。

だいぶ言葉を覚えて、完全に人間です。ひとりの人間として接しなければ、自分は親としてしっかりせねば、と身の引き締まる思いです。

転職二年目だった

引き続きPython, Django, AWS の案件が主でした。Django Rest FrameworkあとちょびっとASP.NET MVCも触れました。DRFの生産性には驚かされ、ここまでハードルが下がるとバックエンド屋の仕事がこの先なくなるんではと思ってしまいます。

input/output

本はほとんど読みませんでした。4,5冊くらいだろうか。。。読書会があったのは良かったです。

残念ながらポートフォリオは増えませんでした。

今年の抱負

引き続き、家庭優先になる予定。。仕事に100%注力できる人と競わねばならないという危機感があります。でも子供との時間は今しかないという割り切りが大事なんでしょうね。

input/output

  • Xamarinを使ってアプリを何かしら公開する
  • pypiにパッケージを登録する
  • Django,AWSを使った開発、運用である程度知見が溜まっているのでblogに書く

Xamarin, pypiに関してはネタはある。それぞれ一個くらいは取り組む時間はあるんでは。。。

水泳関係

去年は野尻湖トライアスロンに出ました。今年は旅行も兼ねてどこかOWSの大会に出たいなぁ。

ことしもよろしくお願いします

そして何より、健康第一で。

貯金生活という、エンジニアに子どもができたら悩むであろう話

このエントリーは子育てエンジニア Advent Calendar 2016 の12月15日分です。

みなさん有用なことを書いていらっしゃるなか、しがないアラフォーのポエムを書きます。貯金生活の話です。貯金といってもお金ではなくスキルの貯金。

家族構成

  • 私。40手前のプログラマー。普段はDjangoAWSを使って開発をしています。前職は地方のSIerで、今の会社に転職して2年経ちます。
  • 妻。会社員。非エンジニアかついちおう時短勤務のはずなんだけど残業も多い。もしかしたら自分よりも就労時間は多いかもしれない。
  • 息子。二歳半の保育園勤務。人の話を見聞きするに典型的な二歳児。 *1 都会ではよく聞く待機児童問題ですが当方地方在住のため、妻の育休からの復職時にすんなり入園に至る

一日のスケジュールと自由時間

一日のスケジュールは以下のような感じです。 f:id:kkotyy:20161212105947p:plain 家事の担当は食事が妻。私がそれ以外という感じで共働きの家庭だとこんなもんじゃないでしょうか。今は割と早く帰れる *2 ので、帰宅して夕飯を一緒に食べて息子をお風呂にも入れます。多くの場合寝かしつかは私の担当です。寝かしつけをしないときはその分自由時間は多くなりますが、自分が寝かしつけをすることが多いです。

スキルの貯金生活

息子が生まれる前は、平日夜に本を読んだり、サンデープログラミングをする時間がありましたが今は上図のとおりほとんどありません。一日1時間ほどです。それも妻との団欒の時間も含むので勉強時間はさらに少なくなります。

また自転車通勤なので、通勤時間を使って本を読むとか英語のヒアリングをするといったことも無理です。

みなさんどうやって勉強時間を捻出しているのでしょう。睡眠時間を削るんでしょうか。他の方のエントリーを見るに睡眠時間が5時間くらいの方もいらっしゃいますね。私は6時間寝ないと無理です。QoLを下げてまで勉強するのでは続きません。

息子は猛烈に可愛いですし今が幸せなのは間違いありません。ただ、ソフトウェアエンジニアとしては日常の業務以外で素振りをすることが非常に重要と思っており、その時間が取れないのは将来に対して不安を覚えます。スキルの貯金ができずに過去の貯金を使っているのです。

今のところの対策

学ぶターゲットを絞るというポリシーで、今年はXamarinの勉強を細々としています。イベントも開催しました。あとは30分とかいったスキマ時間をいかに使うか、なんでしょうか。。。

おしまい

根本的には、息子がもう少し大きくなれば自分の時間が取れるのかもしれません。そのときが待ち遠しくもあり、また手がかからなくなるのは親としては寂しくもあるのでしょうね。

とりとめのないポエムでしたが以上です。

*1:帰宅すると「ただいま!」と言ってくれる。そこは「おかえり」だろ

*2:のはずだったけど今月は忙しかった。

migrateをスキップすることでDjangoのunittestを高速化する

この記事には以下の追記がありますので、あわせてお読みください。

koty.hatenablog.com

modelが大きくなってきたり、migration ファイルが増えると、unit testの最初に流れるmigrationのせいでテストの実行に時間がかかるようになる。そこで高速化を試みた。

作戦としては、

  1. migrate済みのsqliteファイルを用意しておく
  2. テスト実行時にsqliteファイルをコピーする
  3. migrationをスキップしつつ、コピーしたファイルに対しテストを実行する

ということを考えた。

migrationのスキップ方法はここに書いてある通り。

simpleisbetterthancomplex.com

というわけで、以下のような設定を追記するとうまくいく。これで実行時間が半分になった。*1

import shutil
# あらかじめmigrate済みの空のファイルdb_test.sqlite3.template を配置しておく
shutil.copyfile(os.path.join(BASE_DIR, '../db_test.sqlite3.template'),
                os.path.join(BASE_DIR, '../db_test.sqlite3'))
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, '../db_test.sqlite3'),
    }
}


class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        # return 'notmigrations'
        return False  # django 1.11にも対応するにはこちらで

MIGRATION_MODULES = DisableMigrations()

modelに変更があったら、コピー元のsqliteファイルもmigrateする必要があるのがイマイチな点。もっと良い方法があれば教えてください。

ここ2年djangoを使っているが初めての記事になってしまった。もう少しアウトプットしたい。。

Two Scoops of Django: Best Practices for Django 1.8

Two Scoops of Django: Best Practices for Django 1.8

*1:‘notmigrations’ の意味がイマイチわからなかった。djangoのソースをgrepしても該当がないし。