長野市ごみ収集カレンダーを新年度版データに入れ替えた
現在10人もの方々にお使いいただいているこのアプリのデータを2018年度版に入れ替えました。お待たせしました。待ってませんかそうですか。
一年ぶりにアプリをビルドしようとしたらビルドできず、いろいろ試行錯誤して最終的にこれで直ったっぽい。
c# - Error executing task XamlCTask- Xamarin - Stack Overflow
分かるわけない。Xamarinのつらみを感じる、というかフロント界隈は片手間ではできないことを再確認したのでありました。
残課題として、
- 前日の夜にも通知を送ってほしいと要望をいただいている
- 月末になると通知を消してもすぐに通知が出てきてしまう
というものがあります。後者は謎で、以下のコードなんだけど
謎です。気が向いたら調べる。
あと、Google Assistantアプリの方も対応しないと。。
第一回「Linuxのしくみ」読書会参加記録
読書会の新シーズンが始まりました。いつもはネタ本を決めるのにアンケートを取るのですが、今回は仲間内で決めてしまいました。これまでとうって変わって低レイヤの話です。
いつもどおり@tmtmsさんに加えて、@tatsushi_dさんも有識者として大いにウンチクを語ってもらいました。
cdコマンドだけでこれだけウンチクを語れるとは。。。 #nseg #glnagano
— Kouichi Nishizawa(19 (@koty) 2018年4月11日
- strace コマンド使ったことなかった。。。実際の障害調査では処理系固有のものだったりもっと高レイヤのツールを使うことがほとんどでしょうけど、こういった手段も覚えておくと良いですね。
- 参加者は11名でした。すごい。このまま減ることなく続けられると良いのですが。
- おひと方は関西からの参加でした。リモートでもROMなら問題なさそう。むこうの音声が聞き取りづらかったので読んでもらうのはちょっと厳しいかも
- 次回からは参加する方は仮想マシンか何かでLinuxを動かせる環境を用意しておいた方が良い。「Linuxのしくみ」を学ぶんだし。。
昨シーズンは後半仕事が忙しくて全然出られませんでした。今回は皆勤したいです。
CloudFront+ALB+nginxで静的ファイルをserve という構成におけるtrailing slashのリダイレクト問題
メモ書き。
構成としてはタイトルの通り、CloudFront + ALB + EC2 + nginx。そしてnginxで静的ファイルをクライアントに返す、という構成。
このとき、 /hoge
というリクエストに対し、 /hoge/index.html
を返したい場合、 nginx はいったん 301 を返して、 クライアントを/hoge/
にリダイレクトさせる。このときCloudFrontを使っていない場合は、
www.example.com/hoge → www.example.com/hoge/
というリダイレクトになる。
ところが、CloudFrontを使っていると、
www.example.com/hoge → www-example-com-xxxxxxx.ap-northeast-1.elb.amazonaws.com/hoge/
のように、ALBのURLにリダイレクトがかかる。nginx視点で見た場合、 ALBのURLで動いているように見えるためと思われる。
仕方がないので、明示的にリダイレクトを書いた。
if ($request_uri ~ ^([^.]*[^/])$) { return 301 https://www.example.com$request_uri/; }
もっと良い方法があるように思うが。。。
追記:HostヘッダをCloudFrontで通すようにすれば良さそう。
書籍「SQLアンチパターン」読書会スペシャル を開催しました
こちらでもレポートしているので、ご覧ください。
参加者は12名と、講師の豪華さを考えるともう少し集客したかったところです。私の宣伝が足りませんでした。。一方で、発表前後で講師も含め雑談が多く出来たのは少人数ならではだと思います。
@t_wadaさんは日本におけるテスト駆動開発の第一人者でもあります。昨秋に書籍が出たことで約10年ぶりにTDDの盛り上がりを見せています。同じ盛り上がりでも10年前との違いを聞いてみましたところ、テストコードを書く組織、書かない組織に二分されている。テストコードを書いている組織はテストコードの負債化が悩みになっている。ということでした。
和田さんはTDDのイベントも乗り気だったので、今年どこかでぜひ開催したいです。
- 作者: Bill Karwin,和田卓人,和田省二,児島修
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/01/26
- メディア: 大型本
- 購入: 9人 クリック: 698回
- この商品を含むブログ (46件) を見る
- 作者: KentBeck
- 出版社/メーカー: オーム社
- 発売日: 2017/11/13
- メディア: Kindle版
- この商品を含むブログを見る
謹賀新年2018
あけました。
昨年の振り返り
私については年末に風邪を引いてしまったものの、一年を通して見ると おかげさまで家族みんなが大きな病気もせず、一年を過ごせました。それだけで他に言うこともないのですが、強いて振り返ります。
子供中心の毎日
相変わらず子供中心の日々です。日々家事や育児の一端を担えてとても充実しています。長時間勤務が常態化した職場だとこうはいきません。
息子はだいぶ言葉を覚えて、会話が楽しいです。たぶん今が一番かわいいんだろうと思います。
転職三年目だった
引き続きPython, Django, AWS の案件が主でしたが、曲がりなりにも管理職を拝命し手を動かす時間はこれまでよりも減ってしまいました。その分、メンバーにいかに成果を挙げてもらうかを考えるようになりました。
担当案件は、後輩君とペアで彼にスキトラする感じで進めました。乾いたスポンジのように吸収してくれるので一緒に仕事をしていて楽しいです。
秋以降は、ちょっとだけかじったことのあるだけのvue.jsの案件に*1突っ込まれて、泣きそうになりながら圧倒的成長を遂げることができました。
勤労に!圧倒的感謝!!圧倒的成長!!!
— Kouichi Nishizawa(19 (@koty) 2017年11月23日
何かしらのSPAフレームワークを使えるようになりたいとずっと思っていましたが、良い機会になりました。
input/output
相変わらず本はほとんど読みませんでした。4,5冊くらいだろうか。。。読書会があったのは良かったです。
ブログ記事は、発信を強化するという会社の方針にも推されて、前年までよりは割と書きました。
ポートフォリオは増えました!
長野市unofficialごみカレンダー
xamarin製のアプリです。ゴミ出し担当なので、自分用に便利に使っています。これを公開して満足して、xamarin熱は冷めてしまった。。。
長野市ゴミカレンダー
↑のアプリでも使っているデータを使った、google assistantアプリです。google home は勢いで買いました。これのhackはもう少しやりたいです。
そのた
- 初めてプルリクを作ってmergeしてもらった。 - @kotyのブログ
- pypiデビューした - @kotyのブログ
- GitHub - geeklabnagano/glnagano-lambda-bot
- https://www.slideshare.net/kkotyy Lambda+Serverless Frameworkはいろいろやってみた。
それとvue.jsでりんごの伝票印刷アプリも作り始めたけど、進捗5% くらいで全然。。。
しかしこういったプライベートでの素振りが非常に大事だなと痛感します。いつ打席に立てと言われるか分からない。
今年の抱負
引き続き、家庭優先になる予定。。
input/output
トレンドを追うのは辛いですが、歯を食いしばって追う所存。
k8sとデータ分析の勉強に力を入れたいです。(ぼんやり)
英語もがんばります。当面はTOEIC700点が目標。
水泳関係
昨年は旅行も兼ねて佐渡のOWSに出ました。衰えは感じますが環境の良いジムに移って良い練習ができているので、何かしらの大会には出たい。今年は南の方に行きたいな~。
ことしもよろしくお願いします
健康第一で。
*1:経験者扱いで
セパレートキーボードを使い始めて8ヶ月くらい経った
同僚がキーボードを探しているらしいので、あからさまなアフィ記事を書いてみました。すんません。
amazonの購入履歴を見ると今年の4月に買っていました。
MiSTEL BAROCCO MD600 分離式 メカニカルキーボード 英語配列 62キー CHERRY 赤軸 PBTキーキャップ ブラック MD600-RUSPLGAA1
- 出版社/メーカー: MiSTEL
- 発売日: 2016/10/27
- メディア: Personal Computers
- この商品を含むブログを見る
私は以下の記事を見て、買うことにしました。
もともとHHKBを使っていたので、functionキーやカーソルキー、テンキーが無いことに違和感はありません。
胸元が開いて快適に使っています。
キーレイアウトは、スペースの横にcmdを来るようにしたのと、backspaceと\キーを入れ替えるという2点のカスタマイズをしています。
ctrl-Y(emacsの貼り付け)が片手で出来ないのが悩みです。
現場からは以上です。
AWS Lambda+Serverless FrameworkでDjangoを使う
この記事は Django Advent Calendar 2017 - Qiita の17日目の記事です。
ここ数年サーバーレスアーキテクチャが盛り上がっているものの、Djangoと組み合わせた事例がググってもあまりないので書いてみました。ググっても出てこないということは需要が無いということかもしれませんが。。。みなさんFlaskといった軽量なwebフレームワークとDynamoって組み合わせで使ってるんですかね。
私はLambda+Djangoという組み合わせで本番投入した経験はありません。本記事は、運用に使えそうか?という観点で検証しました。
本記事のサンプルコードは以下に置いてあります。各種バージョンはgithub内のrequirements.txtを参照してください。
GitHub - koty/dj-lambda-sample: A sample of Django app on AWS Lambda using severless framework.
Djangoプロジェクトの作成
適当な名前でDjangoプロジェクトを作ります。プロジェクト構成は前述のgithubリポジトリをご確認ください。標準的なものだと思います。
Serverless Frameworkの導入
Lambdaを運用するにはこれがないとやってられません。各種リソースをzipにまとめてLambdaにdeployしてくれます。またAPI Gatewayなどの周辺リソースの設定もできます。pythonアプリを作るのにnpmモジュールを導入するのはどうなんだとも思いますけども。
serverless コマンドを使うために -g つきでinstallします。
npm install -g serverless
VPCやIAM role等の設定が必要ですが、serverless framework自体は情報が多くありますので、ここではこれ以上触れません。
serverless-wsgi の導入
Djangoを使うにはwsgiという規格に沿う必要があります。普段EC2等で動かす場合はuwsgiやgunicornを使えばwsgiに沿うことができますが、Lambdaの場合は以下を使います。
npm install serverless-wsgi --save-dev
serverless.ymlに以下のように追記します。
functions: api: events: # この記述により、ルーティングをwsgi側(Django)に移譲できる。 {proxy+} の意味は不明。。documentにそう書いてある。 - http: ANY / - http: ANY {proxy+} plugins: - serverless-wsgi custom: wsgi: # appにはwsgi.py へのパスを記述。 serverless-python-requirementsにパッケージングを任せるため packRequirements: false を記述 app: dj-lambda-sample.wsgi.application packRequirements: false
serverless-python-requirements の導入
EC2互換のdockerコンテナ上でpip install〜deployパッケージを作ってくれます。lxml等のpip install時にコンパイルをするパッケージを使っていてもEC2で問題なく動くようパッケージできます。
npm install serverless-python-requirements --save-dev
serverless.ymlには以下のように設定します。
plugins: - serverless-python-requirements custom: pythonRequirements: dockerizePip: true
Djangoの設定
DB の設定
使うRDBMSはPostgreSQLです。MySQLはよほどの理由がない限りは使わない方が良さそうです。
事前にRDSを立てておきます(EC2上に立てても当然OK)。検証が済んだら落としておくのを忘れずに。。
serverless.env.ymlを以下のように作ります。
SECURITY_GROUP_ID: 'sg-xxxxxxx' SUBNET_ID1: 'subnet-xxxxxxx' SUBNET_ID2: 'subnet-xxxxxxx' DATABASE_NAME: 'xxxxx' DATABASE_USER: 'xxxxx' DATABASE_PASSWORD: 'xxxxxx' DATABASE_HOST: 'xxxxxx.xxxxxxxx.ap-northeast-1.rds.amazonaws.com' DATABASE_PORT: 5432
環境変数を作るために、serverless.ymlに以下のように設定します。外部ファイルから読み込むわけです。
provider: environment: DATABASE_NAME: ${file(./serverless.env.yml):DATABASE_NAME} DATABASE_USER: ${file(./serverless.env.yml):DATABASE_USER} DATABASE_PASSWORD: ${file(./serverless.env.yml):DATABASE_PASSWORD} DATABASE_HOST: ${file(./serverless.env.yml):DATABASE_HOST} DATABASE_PORT: ${file(./serverless.env.yml):DATABASE_PORT}
Djangoのsettings.pyに以下のように記述します。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('DATABASE_NAME'), 'USER': os.getenv('DATABASE_USER'), 'PASSWORD': os.getenv('DATABASE_PASSWORD'), 'HOST': os.getenv('DATABASE_HOST'), 'PORT': os.getenv('DATABASE_PORT'), }, }
最後にEC2等から ./manage.py migrate
します。EC2を用意するのが面倒だったので、
class MigrateView(APIView): def get(self, request): from django.core import management management.call_command('migrate') return Response({})
というviewでmigrateしました。。。現実的にはVPC内に立てたEC2からmigrateするってもんでしょう。
そのた
このへんで力尽きてきました。Lambdaでは静的ファイルはホストできないので、S3を使います。django-storageを使って、S3に向かってcollectstaticします。
まとめ
簡単なAPIであればこの構成で運用できそうです。Lambdaのスケーラビリティは魅力です。バッチ処理が入ってくるとEC2がほしくなりそうですが。。。繰り返しますが、使うRDBMSはMySQLはやめた方が良いです。職場で私の斜め前の人が、どハマりしてました。
残課題
- デプロイ時に接続が切れるか?
- Lambdaのパッケージ容量制限はどうする?site-packagesの容量が増えるとどうなる?
もっとcoolな方法があるぜ!という方はぜひ教えてください。。
Two Scoops of Django 1.11: Best Practices for the Django Web Framework (English Edition)
- 作者: Daniel Roy Greenfeld,Audrey Roy Greenfeld
- 出版社/メーカー: Two Scoops Press
- 発売日: 2017/10/11
- メディア: Kindle版
- この商品を含むブログを見る
Vue.js 2 Cookbook: Build modern, interactive web applications with Vue.js
- 作者: Andrea Passaglia
- 出版社/メーカー: Packt Publishing
- 発売日: 2017/04/28
- メディア: Kindle版
- この商品を含むブログを見る