puma-devとwebpackerを使ってHTTPSで開発する

OneSignalを利用してブラウザPush通知機能を追加した際に、HTTPSでのみ使用する前提のJSライブラリを入れたのが原因で、開発環境でもHTTPSを利用する必要が出た。

前提として、

  • Mac OSX
  • puma-dev
  • webpacker

を利用している。puma-devはHTTPSに対応していて、自動でオレオレ証明書を作ってくれる。

webpack-dev-serverもHTTPSに対応している。次のようにconfig/webpacker.ymlのhttpsをtrueにするとhttps://example.com:8080/packs/application.jsといったURLでwebpackがコンパイルしたjsにアクセスできる。

development:
  <<: *default

  dev_server:
    host: example.com
    port: 8080
    https: true

問題はオレオレ証明書の認証。chromeであれば毎回https://example.com:8080/packs/application.js直接アクセスして認証する必要がある。認証しないとJS読み込みでエラーになる。毎回やるのは大変面倒*1

chromeでwebpack-dev-serverが生成した証明書を見ると「Subject Alt Nameが設定されていない」というエラーが出ていて、これにも対応する必要がありそう。puma-devはこのエラーは出ていなかった。

解決方法

次のコマンドで証明書を生成する

openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.pem \
    -new \
    -out server.pem \
    -subj /CN=savanna.dev \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:savanna.dev')) \
    -sha256 \
    -days 3650

config/webpack/server.pem など適当な場所に置く。

キーチェーンへこの証明書を登録し、「常に信頼」の設定にする。

次のようにしてwebpack-dev-serverを起動する

./bin/webpack-dev-server --cert ./config/webpack/server.pem --key ./config/webpack/server.pem

オプションを毎回つけるのがダルいのであればconfig/webpack/development.jsを次のようにしておく

const fs = require('fs');
// 省略
devServer: {
  clientLogLevel: 'none',
  https: {
    cert: fs.readFileSync('./config/webpack/server.pem'),
    key: fs.readFileSync('./config/webpack/server.pem'),
  },
  // 省略  

余談

ドメインがlocalhostでよければ chrome://flags/#allow-insecure-localhost を有効にすれば大丈夫そう(未確認)。

参考

*1:とりあえずの回避策として該当のJSライブラリを開発環境で読み込まないようにしようかとも思ったけど、バグの温床になりそうなのでやめた

jquery-ujsからrails-ujsへの移行で気をつけること

  • jquery-ujs だと data, status, xhr
  • rails-ujs だと event だけ
    • レスポンスの情報がほしいときは event.detailの中をみる
document.body.addEventListener('ajax:success', function(event) {
  var detail = event.detail;
  var data = detail[0], status = detail[1],  xhr = detail[2];
})

参考

jquery-ujs/rails.js at master · rails/jquery-ujs rails/ajax.coffee at 896ee2b679462e7bcaa6890c6f5fdbd3b2e2fccb · rails/rails rails/remote.coffee at 896ee2b679462e7bcaa6890c6f5fdbd3b2e2fccb · rails/rails rails/event.coffee at 896ee2b679462e7bcaa6890c6f5fdbd3b2e2fccb · rails/rails Working with JavaScript in Rails — Ruby on Rails Guides

2017年にruby1.8.6をビルドする

ruby 1.8.6を使ってみようと思い、mac sierraでビルドしてみようとしましたがだいぶハマりました。

まずは公式のgccを使わないといけないと怒られる。指示の通り入れようとするともうそんなのないと言われる。こちらのブログを参考に無理やり入れてみようとしましたがだめでした。

Sierraでruby-buildで1.8.7をビルドする - 福島餃子Ruby親方

ここで、macをそのまま利用することを諦め、docker越しにインストールすることを試みます。検索すると各種Rubyのバージョン用のDockerfileをを取り揃えたリポジトリがありました。

abevoelker/docker-ruby: Dockerfiles for lots of MRI Ruby and JRuby interpreters

これを利用して1.8.6のイメージを作成しようとしましたがエラー…。どうやら依存しているopensslのバージョンが問題な模様。最終的にこちらのブログを参考にして、古いopensslを入れてbuildすることに成功しました。

Ubuntu 16.04 に Ruby 1.8.5 をインストールする - Qiita

最終的な成果はこちら。

あんまりいないと思うけど、必要な方がいたらどうぞご利用ください

追記

現状Rubyは動くのですが、gemでgem install rails -v 2.0.0などとgemをインストールしようとするとsegfaultになって死にます><

更に追記

segfaultは次の記事を参考にRubyのビルドを修正したら解消しました。

rbenv、rvmのruby 1.8.7, 1.8.6で timeout.rb: [BUG] Segmentation faultというエラーの対応|DIGITAL SQUADブログ

しかし依然gem install rails -v 2.0.5などとするとエラーになります(buffer overflow)。どうやら Ruby 1.8.6では最近のgemはインストールできない模様です。Rails の 2.0.5 は rake の 0.7.2 以上に依存しており、そのままだと最新の rake 12.0.0 をインストールしようとしてエラーになります。先に gem install rake -v 0.7.2 としておき次に gem install rails -v 2.0.5 とするとうまくインストールできました。

はー。疲れた :astonished:

会社設立支援系のサービスは便利だけどまだまだなところもあるという話

株式会社ウィルネットを設立した - おもしろwebサービス開発日記の関連エントリ。作る過程のメモ書きです。

僕は普段の記帳にMFクラウド会計を使っていたので、まず関連サービスであるMFクラウド創業支援サービスを試しました。正確にはMFクラウド創業支援サービスと提携している無料登記ドットコムです。

しかし定款の認証で電子認証をしようとしてハマりました。定款の認証形式は電子と紙があり、紙だと4万円、電子だと0円(ただし道具を揃えたり色々めんどくさい)という感じです。代理で数千円から電子認証の面倒な部分をやってくれる業者があるのでそれが一番コスパがよいのではと考えました。

しかし無料登記ドットコムは基本的に紙の認証しか想定してないようで、電子の認証については公式リンクへの参照があるのみ。電子認証をしてくれる業者をいくつか探しましたが、定款のファイル形式がテキストファイルやExcelファイルしか取り扱っておらず、無料登記ドットコムで生成されるPDFの定款ではどうしようもなくなりました*1

そこで会社設立 freeeに切り替えました。会社設立freeeは行政書士と提携していて、電子認証のサポートを5000円でやってくれます。あとは大体freeeの書いてある通りにやったら登記までたどり着けました。freeeべんり。

しかし幾つか躓いたところもあって、freeeで自動生成された箇所に物言いが2回(公証役場で1回、法務局で1回)つきました。僕の場合は大した手戻りなく進められたので良かったのですが、場合によっては手直しを要求されることもありそうです。

また、登記に必要な書類と場所の説明はあるのですが、細かい説明がなく混乱しました。例えば

  • 登記に必要な書類は、まず15万円分の収入印紙を購入し貼ってから提出する
  • 登記後はまず印鑑カードを入手してから、登記証明書と印鑑証明書を入手する

みたいな説明があると良かったです。freeeの説明は「書類を法務局に持っていく」だけしかない><

あと気づいた点は

  • 厚生年金の手続きを行う期限が、必要書類を入手できるようになる日付より前になっている
  • 厚生年金の手続きをするための書類が足りない(これ辛かった)

など。登記のサービスで会社設立はかなり便利になったとは思いますが、現状ではまだまだ自分で調べたり人に聞いたりしないといけない箇所が多いなという印象です。後続の人のためにより一層の改善お願いしますm(__)m > money forwardさん、freeeさん

*1:たくさん探せばPDFでも対応してくれるところはありそうですが、その前にfreeeに切り替えてしまった

CircleCI でデプロイのタイムアウト時間を延長する

  • デプロイのデフォルトは10分
  • 伸ばす場合は次のようにする
  • bundle exec ... の次はインデント2つにしないとダメ
deployment:
  production:
    branch: master
    commands:
      - bundle exec cap production deploy:
          timeout: 1500

Note that YAML is very strict about indentation each time you add a new property. For that reason, modifiers must be indented one level from their command. In the following example, we treat the bundle install command as a key, with timeout, environment, and pwd as the command's hash values.

Configuring CircleCI - CircleCI

sendgrid でメール受信することができる

  • sendgrid はメール受信系の機能を提供していないと思っていたけど、どうやら出来るっぽい。
  • 公式のドキュメント だと、lite プラン以外で使えます!って書いてあるので heroku の free なやつでは使えないかな?と思ったけど設定画面開けたので使えそう

sendgrid/sendgrid-parse-api-example - Buttons - Heroku Elements