@kotyのブログ

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

なつかしのtypist

中学でFM-TOWNSを使う機会があったけど、本格的にコンピュータを使うようになったのは大学のUNIX端末だった。そこで最初にtypistというコンソールアプリで練習をしてタッチタイピングができるようになっていった。今思えば驚きの地味さ加減なアプリケーションだ。

ということをふと思い出して今使うのはどうすればいいのだろうと調べたら、homebrewで入るらしい。

brew install gnu-typist

f:id:kkotyy:20170727131000p:plain

タッチタイピングできてない人はこれで練習したら良いと思う。

以上おっさんの昔話でした。(もっとまともな記事を書かないと。。。)

let's encryptで証明書を取得する際はIP制限を外しておく必要がある

メモ書き。

EC2(Amazon Linux)でlet’s encryptからSSL証明書を取得した。基本的には以下の記事の通りにやればOK。 tkuchiki.hatenablog.com

certbot-auto を実行する際、最初セキュリティグループでhttpをアクセス制限していたのでスクリプトが失敗していたが、外したら成功した。 apacheのログには以下のようなものが記録されていた。

66.133.109.36 - - [08/Jun/2017:00:52:18 +0000] "GET /.well-known/acme-challenge/ランダム文字列 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)"

考えてみれば当たり前なんだろうけど。。ググると、アクセス元の66.133.109.36 は固定されたIPのようなので、次回からはこのIP指定でアクセス制限しても良いかもしれない。

pypiデビューした

Pythonistaなら誰もがあこがれる(よね?)、pypiパッケージへのデプロイをビクビクしつつやってみた。

pypi.python.org

諸事情でStackPathのAPIを叩きたかったのだけどPythonAPIがなかったのでやってみた。実際にはStackPathの前身であるMaxCDNのAPIをForkするだけだったので胸を張ってパッケージオーナーとは言いづらい。。。お手軽さとしてはpypiデプロイ初体験として最適だったと思う。

ところでStackPathはフリープランが無くて試用期間が2週間しかないので、それ以降は自腹を切らんとメンテできない。どうしようかな。

実際のpypiへのデプロイ手順はこちらのとおりなので特に書くことはございません。。。(ぉぃ qiita.com

初めてプルリクを作って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を入れた。