技術ネタとかの備忘録

最近の技術ネタとかの備忘録を書いていくブログです

DjangoアプリをHerokuへデプロイ

Pythonの勉強がてらDjangoアプリを作成して、Herokuへデプロイしてみました。

Djangoチュートリアル

こちらのチュートリアルに沿って作成したDjangoアプリをHerokuにデプロイします。

はじめての Django アプリ作成、その 1 | Django documentation | Django

Heroku向けの設定

DjangoアプリをHerokuへデプロイするために必要な設定がこちら。

Configuring Django Apps for Heroku | Heroku Dev Center

Heroku向けに以下のライブラリをインストールする必要があります。

  • dj-database-url(DBの接続先を環境変数から取得してくれる)
  • gunicorn(WSGIサーバ)
  • whitenoise(静的ファイルを配信してくれる)

なお、HerokuはSQLite3をサポートしていないため、Heroku上で動かす場合、他のDBを使う必要があります。 今回は無料で使えるPostgreSQLにしました。

Herokuへデプロイ

HerokuのGitリポにPushすれば問題なくデプロイできました。
あとは、DBのmigrateとDjangoのadminユーザを作って完了です。

$ heroku run python manage.py migrate
$ heroku run bash
Running bash on ...
~ $ python manage.py createsuperuser
...

簡単ですね。

ハマったこと

Djangoチュートリアルに沿って作成したアプリを動かして確認していたところ、日本語を入力すると"UnicodeDecodeError"が発生しました。

UnicodeEncodeError at /admin/polls/question/add/
‘ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128)

原因は、オブジェクトを出力するメソッドに__str__を使っていたことでした。 メソッドを__str__から__unicode__に変更することでエラーが解消されました。

class Question(models.Model):
    ...
    def __str__(self):
        return self.question_text

class Question(models.Model):
    ...
    def __unicode__(self):
        return self.question_text

Golang+AppEngineをCircleCIで自動デプロイ

CircleCIを使ってGolangアプリをAppEngineにデプロイしたときのメモ。

公式ドキュメント

公式のドキュメントはこちらです。
Authentication with Google Cloud Platform - CircleCI
Continuous Deployment to Google App Engine - CircleCI

ただ、外部ライブラリを使用しているアプリはエラーが出ます。
外部ライブラリが解決できずにコンパイルが通りません。

Updating service [default]...failed.
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
2017/01/31 06:00:04 go-app-builder: build timing: 1×compile (37ms total), 0×link (0s total)
2017/01/31 06:00:04 go-app-builder: failed running compile: exit status 1

article_controller.go:4: can't find import: "github.com/gorilla/mux"

circle.yml

最終的にデプロイが成功したcircle.ymlがこちらです。

machine:
  timezone:
    Asia/Tokyo

dependencies:
  pre:
    - curl -o $HOME/go_appengine_1.9.48.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.48.zip
    - unzip -q -d $HOME $HOME/go_appengine_1.9.48.zip
    - gcloud auth activate-service-account --key-file $HOME/$CIRCLE_PROJECT_REPONAME/gcloud-service-key.json
    - gcloud config set project $GCLOUD_PROJECT
    - go get github.com/gorilla/context

deployment:
  appengine:
    branch: master
    commands:
      - $HOME/go_appengine/appcfg.py update . --oauth2_access_token $(gcloud auth print-access-token 2> /dev/null)

やったこと

  • gcloudコマンドではなくappcfg.pyを使用する
  • [CircleCI]→[Environment Variables]→[Add Variable]でGCLOUD_PROJECT(設定値はデプロイ先のプロジェクトID)を追加する
  • [Google Cloud Platform]→[IAMと管理]でJSONキー(gcloud-service-key.json)を生成し、プロジェクト直下に配置する
  • gorilla/muxを使用する際はgorilla/contextをgo getする*1

*1:コンパイルエラーが発生します(github.com/gorilla/mux/context_gorilla.go:8: can’t find import: “github.com/gorilla/context")

BluemixでPostgreSQLエラーが発生する

Bluemix上でRailsアプリを動かしたときに以下のエラーが発生した。

502 Bad Gateway: Registered endpoint failed to handle the request.

ログを確認してみると、PostgreSQLでエラーが発生している模様。

2016-09-10T11:54:59.647+0900[App/0]ERRruby: symbol lookup error: /home/vcap/app/vendor/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/pg-0.18.4/pg_ext.so: undefined symbol: rb_thread_select

原因を調査してみるとStack Overflowの以下の記事がヒットしました。

stackoverflow.com

Rubyのバージョンが原因でした。Rubyのバージョンを"2.3.1"に変更して再度デプロイしようとしましたが、Bluemixが提供しているRubyランタイムに"2.3.1"は含まれていませんでした。

Starting app アプリ名 in org 組織名 / space スペース名 as メールアドレス...
-----> Downloaded app package (44K)
-----> Downloaded app buildpack cache (29M)
-------> Buildpack version 1.6.16
       Downloaded [file:///var/vcap/data/dea_next/admin_buildpacks/403dd09f-a098-4f46-b14f-cfb034fbe30a_202f38bad1a7c142025bb8b27976bf2fc80655c5/dependencies/https___pivotal-buildpacks.s3.amazonaws.com_ruby_binaries_shared_bundler-1.11.2.tgz]
-----> Compiling Ruby/Rails
       DEPENDENCY MISSING IN MANIFEST: ruby 2.3.1
       It looks like you're trying to use ruby 2.3.1.
       Unfortunately, that version of ruby is not supported by this buildpack.
       The versions of ruby supported in this buildpack are:
       - 2.3.0
       - 2.2.4
       - 2.2.3
       - 2.1.9
       - 2.1.8
       If you need further help, start by reading: http://github.com/cloudfoundry/ruby-buildpack/releases.
 !
 !     exit
 !
Staging failed: Buildpack compilation step failed


FAILED
BuildpackCompileFailed

TIP: use 'cf logs アプリ名 --recent' for more information

Finished: FAILED

そこで、ランタイムにコミュニティのビルドパックを使用しました。

Bluemixのダッシュボード上からランタイムは切り替える方法が分からなかったため、cfコマンドを使用してランタイムを変更しました。

cf push アプリ名 -b https://github.com/cloudfoundry/ruby-buildpack

これでエラーが解消されました。

格安MVNO「mineo(マイネオ)」に決めた理由

今まで、auiPhone5sを使ってきましたが、遂に2年縛りの更新月が来たので、最近流行りの格安MVNOに乗り換えようと思いました。

で、色々と探してたところ「mineo(マイネオ)」が良さげな感じでした。

SIMロック端末のiPhoneを使いまわせる

一番の決め手となった理由がコレです。今現在、開発用にAndroid端末(Zenfone2)と2台運用しています。 正直、Zenfone2は新し目なクセに、昔のiPhone5sよりもヌルヌル感があり、ASUS製の同梱ソフトが盛りだくさんでAndroid端末は使いたくありませんでした。 なので、iPhoneを使える格安MVNOを探していたところ、「mineo(マイネオ)」がヒットしました。 しかも、既存のSIMロック端末のiPhoneを使いまわせるので、新しく端末を買う必要もありません。 ただ、docomoauは問題ないのですが、softbanksimロック端末に対応してないみたいです。 (softbankからauに乗り換えておいて良かった・・)

年間契約等の縛りがない

大手キャリアは2年以上の縛りがあるので解約が面倒くさいです。 端末分割払いもあると、解約手数料だけでは済まされないので更に面倒くさいです。 「mineo(マイネオ)」ならいつやめても解約手数料がかかりません。 取り敢えず試せるとこが気に入りました。

料金が安い

僕は、基本的に外ではニュースを見るぐらいしかスマホを使わないので、データ容量は3GBもあれば十分なタイプです。 あとは、通話も自分からかけることはなく、受信できればいいので、電話かけ放題も不要です。 以上のケースで「mineo(マイネオ)」で見積もると、なんと「毎月1,510円」で運用できちゃいます。 auに毎月5,000円も払っていたのは何だったのか・・・。 契約手数料も、Amazonのエントリーパッケージを注文すれば「3,000円→909円」で済みます。

大手キャリアは今後どうするのか気になるところです。

Zenfone2の画面が勝手に動く現象の解決策

ネットで探すと同じ現象が起きている人が結構いるんですね。

Zenfone2の画面が勝手に動く - じじいタイフーン

僕が持っているZenfone2も前から画面が勝手に動く現象がちょくちょく起きていたのですが、最近は画面の操作ができないくらい酷くなってました。

色々と設定を弄っていたところ、「開発者向オプション」をオフったら現象が起きなくなりました。

以前、コチラの記事を参考に、Androidのもっさり感をなくすために設定を変えていたことが原因だったのでしょうか?

matome.naver.jp

取り敢えず、しばらくは様子見ですね。

2017/1/7 追記
上記方法でも再現してしまいました。
取り敢えず以下の方法を試したところ、今のところ現象は起きていません。

  • バイスを工場出荷状態にリセット
  • アンインスール可能なアプリを全てアンインストール
  • 無効化できるアプリを全て無効化(ただし、Andoridが正常に動かなくなるアプリはそのまま)

HerokuのPostgreSQLのデータをローカルDBへインポートする

HerokuのPostgreSQLのデータをローカルDBにインポートするメモ。

devcenter.heroku.com

以下のコマンドをシェルに書いて実行すると便利です。

#!/bin/bash

# PostgreSQLのバックアップを取得する
heroku pg:backups:capture --app アプリ名

# バックアップをローカルにダンプする
curl -o latest.dump `heroku pg:backups:url --app アプリ名`

# ダンプをローカルのDBにインポートする
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d ローカルのDB名 latest.dump

rm latest.dump

TUMIのカバンを修理に出しました

ショルダーの留め具が摩耗してしていたため、TUMIのカバンを修理に出しました。

2014年12月に購入したので、使用して2年が経ちます。
MacBook Air 13インチ(1.35kg)をカバンに入れて、ショルダーで使っていました。

この程度の重量で留め具が摩耗してしまうのか・・・と非常に残念です。
TUMIのカバンは丈夫で有名だったので、2年で修理に出すとは思っていませんでした。

f:id:bllinko:20170102151006p:plain:w280 f:id:bllinko:20170102151007p:plain:w280 f:id:bllinko:20170102151008p:plain:w280

修理は、見積りに2週間、修理に4週間、合計1ヶ月半程度かかるそうです。

保証期間内だったため、無償で交換してもらえるかもと担当者に言われましたが、
実際にTUMIに送って見てもらわないと分からないとのことでした。

ちなみに、保証が効かなかった場合、修理費用に2万円程度かかるみたいです。
日本のTUMIカスタマーセンターは、あまり評判が良くないみたいなので少し心配です。

TUMIのデザインはカッコ良くて気に入っていましたが、耐久性にはガッカリです。

2017/1/7追記
担当者から連絡があり、保証期間内のため無償で交換してくれるとのことでした。
また、鞄の表面に色落ちしている箇所が4箇所あるので併せて補修しますか?と言われました。
ただ、保証対象外のため別途35,000円掛かると言われました。
色落ちの補修に本体価格の半額以上も取られるとは・・・。
丁重にお断りました。