Ruby Prize 2018にノミネートされた

るびま」ことRubyist Magazineの運営・編集・リリース管理などを数年やっていたら、Ruby Prize 2018にノミネートされました。ありがとうございます。

RubyPrize2018|候補者決定

発行ペースが落ちているのですが、これからも色々と記事を集めてるびまを続けていきたいと考えています。

Rails 5からbelongs_to associationを書くと親はデフォルト必須になった

はじめに

Rails 5(Rails 5.1?)からbelongs_to associationを書くと親が必須になっていました。これに今日はドハマリした...

具体的には、

class Post < ApplicationRecord
  belongs_to :article
end

というmodelがあったとして、rails consoleなどでPostインスタンスsaveしようとするとvalidationエラーが出ます。

> Post.new.save!
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
Traceback (most recent call last):
        1: from (irb):3
ActiveRecord::RecordInvalid (Validation failed: Article must exist)
>

経緯

Rails 5.0から5.1にアプリをあげてテストを流していたときに大量にテストが落ちたことがきっかけです。解決に至ったのは、次のブログ。

48n.jp

回避

上記のブログにあるように、belongs_tooptional: trueをつければOKです。ソース全体を書くと

class Post < ApplicationRecord
  belongs_to :article, optional: true
end

と言った感じになります。

実際にrails consoleで確かめてみます。

> Post.new.save!
   (0.1ms)  begin transaction
  Post Create (0.5ms)  INSERT INTO "posts" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2018-09-25 11:29:33.968321"], ["updated_at", "2018-09-25 11:29:33.968321"]]
   (1.3ms)  commit transaction
=> true
>

無事、生成できました。

Web App for Containers + PostgreSQLでコンテナ対応したRailsアプリを作ってみた

概要

Microsoftが提供しているパブリッククラウドサービス「Azure」の「Web App for Containers」を使ってRailsアプリを動かしてみました。Railsアプリと言っても、scaffoldで自動生成させたもので非常に単純なものです。Azureが提供しているPostgreSQLも合わせて使ってみたいと思い、ちょっとやってみました。

元ネタ

元ネタは「Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう! 」というSlideShare上にあったスライド。これをもとにRDBMSPostgreSQLに変更しただけです。

ハマったところ

  • Web App for ContainersがPortalにない
    • Web App on Linuxであった。
    • 言語設定が日本語版だからかもしれない。
  • Azure DB for PostgreSQLファイアウォールの設定に何を設定していいかがわからない
    • スライドでは、すべてのIPレンジを許可しているけど、さすがにそれはどうかなと
    • よくよく見てみたら、Web App for Containersの送信元はプロパティから見ることができるのでそこで制限すればできる。
  • PostgreSQLへの接続用環境変数設定漏れ
    • 環境変数の設定が漏れていて、ずっと「could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 」が表示されて困った困った。
    • ホスト、ユーザ名、パスワードを環境変数として設定すればOK。

結果

development環境としてまずは動かすことができました。

ソースは以下においてあります。

github.com

production環境で動かすためには、

をすればできそうですが、やってません。今後の課題ということで。

今後は

今後は、

  • Production環境で動かすこと
  • Application Insightsを試してみる

ことがもっぱらの目標です。いつになるか分かりませんが、ゆっくりとやっていきます。

Ruby Business Users Conference 2018に参加してきた

今年も開催されたRuby Business Users Conference 2018に参加してきました。

Ruby Business Users Conference 2018

Ruby Business Users ConferenceはRubyを活用しているビジネス事例が紹介される場として、Rubyアソシエーションが毎年2月頃に開催している場です。

今回は、

  • Matzの基調講演
  • 金川 祐太郎さんが「モバイル決済アプリ開発における動的・静的型付け言語の比較と考察」と題してPixiv Pay開発を通して感じたRuby/Rails開発の考察
    • 2ヶ月ほどでサービスリリースのスピード感がすごい。
    • Rubyではリファクタリングで名前変更するのが難しい。JavaだとIDEで一発変換。RubyMine頑張って欲しいとのこと。
  • 高宮 知弘さんが「コミュニケーションデザインRubyRubyで繋がる~」と題してWeb接客システムON SKYの紹介
    • チャットシステムはコミュニケーションの最初のステップとしてハードルが低い。
    • 完璧を目指すのではなく、最初のフィルタリングとしてのWeb接客システム。だが、効果は高い。
  • 角 幸一郎さんが「Rubyを使ったシステム開発における様々なコードレビュー」と題してコードレビューの広がりとその観点・取り組みについて
    • ここ数年でコードレビューがかなり浸透してきた感じ。開発のスピードが上がってレビューの頻度も増えてきた。
    • Pull Requestがコードレビュー手段として一気に台頭。
    • どの観点でレビューをするかをキチンと決めておくこと。
      • 個人的には、いわゆるインデントとかは機械で自動フォーマットしたい。
  • Tomoya Kawanishiさんが「Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法」と題してエネチェンジ社におけるWebサービスの設計について
    • 将来の変更とサービス対応を見越してどのようにシステムを組んでいくか。ひとつが疎結合
      • 料金計算ロジックのライブラリ化やVueJSの取り込み方針など
  • 深谷 篤生さんが「esa.ioの育て方」と題してesa.ioにおけるシステム設計について
    • まさしく要望を受けてからの対応完了までのスピードが段違い。
    • コンテナ化とかマイクロサービス化など、言葉では知っているものが非常に自然に取り込まれている感じ。

という内容。どの発表も各社、各人のサービスの考えや設計を詳細に語っていただき、大変勉強になりました。

今年は基調講演が40分枠、その他の講演が20分枠。20分枠だと発表内容をかなり絞り込む必要があり、もっと話を聞きたいという思いが残りました。懇親会でフォローできればよかったのですが、ちょっと今回は参加できず。こういう場はスライドを見るだけではなく講演者と話をして理解が深まるものと思っていますので、ちょっと無理してでも参加すればよかったかな。

第56回愛媛マラソンを走ってきました

第56回愛媛マラソンを走ってきました。

f:id:miyohide:20180204145609j:plain

タイムは、グロスタイムで3:59:41、ネットタイムで3:55:42。自己ベストより7分ほど遅く、サブ4達成とは言えちょっと残念なレースとなりました。

気候としては最悪に近い状況。今季最強寒波が西日本を襲う中、普段は温暖な愛媛県もかなり冷え込み、スタート時点で気温1.5度、最高でも3度に届かず、常時5メートル程度の風が吹くというコンディション。寒いのが苦手な自分にとって悪条件が揃いましたが、それでもやるのがマラソンです。

そのため普段は半袖Tシャツにアームウォーマーという格好で走っていますが、この日に限っては寒さ対策で長袖シャツの下にアームウォーマーをつけるという感じで走りました。それでもちょっと寒い感じで、止まったら低体温症が待っていると半分恐怖を感じながら走りました。

5キロごとの結果は、以下の通り。例によって前半飛ばしすぎです。トイレに駆け込んだのをリカバリーしようとしたのが駄目だったのかなぁ。

距離 ラップタイム 備考
スタート〜5km 27:39 スタート地点の混雑は1kmすぎたあたりで抜けることができた。
5km〜10km 28:40 途中でトイレに駆け込む。
10km〜15km 26:17 順調に走れる。ちょっと早い感じ。
15km〜20km 26:06 ちょっと早い感じ。止まらない感じ。
20km〜25km 26:15 ちょっと早い感じ。止まらない感じ。
25km〜30km 26:38 ようやくいい感じに走れる。これからの坂が怖い。
30km〜35km 30:01 34キロ過ぎに急にハムストリングスに違和感。ちょっと歩く。
35km〜40km 32:46 走ったりジョグしたり。平田の坂を降りた後から徐々にスピードを上げる。
40km〜ゴール 11:20 声援とペースメーカーを見つけて元気が出る。

とりあえず、今シーズンはこれでおしまいです。これからどうやって次のシーズンまでトレーニングをつもうか色々と思案中です。が、全然整理できないでいます。何したらいいかよく分かっていない。まずは決められたペースを守って走るってことかなぁ。

第37回つくばマラソンを走ってきた

第37回つくばマラソン(42.195km)を走ってきました。

タイムは、3時間48分29秒(ネットタイム)。去年出した自己ベスト3時間52分15秒(ネットタイム)を約4分ほど更新する好成績。我ながら出来過ぎの結果です。

f:id:miyohide:20171126132722j:plain

5キロごとのラップタイムは、

距離 ラップタイム 感想
スタート - 5km 31:04 スタート時の混雑。あとちょっと右脇腹に痛みを感じていた。
5km - 10km 27:02 右脇腹の痛みも徐々に引いてきた
10km - 15km 27:26 目標とする5:30/kmのペースに慣れだす
15km - 20km 27:15 4時間のペースメーカーとともに走る。ちょっとだけおしゃべりして楽しむ。
20km - 25km 26:38 途中でテンション高めのランナーと出会う。なんだか元気が出た
25km - 30km 27:03 正念場。ちょっと痛みが出てくるが気のせいということにする。
30km - 35km 26:07 名物のおしるこは今年もスルー。ちょっともったいない。
35km - 40km 26:29 ここまで来たら後は耐える。
40km - ゴール 11:44 1キロが長い...ゴールって本当にあるのか?と思うほど。

という結果。前半抑えて後半勝負が上手く行った形です。こういうレースをずっとしたかった。

今回も多くのボランティアさんに助けてもらいました。いつもありがとうございます。

f:id:miyohide:20171126070259j:plain
朝早くから集合するボランティアさん達。ありがとうございます。

f:id:miyohide:20171126071044j:plain
ゆるキャラに励まされる

f:id:miyohide:20171125200000j:plain
個人的な勝負服。レースのときに必ず着ます...がそろそろ痛みが激しくなってきた。

『RubyでつくるRuby ゼロから学び直すプログラミング言語入門』を読み終わった

f:id:miyohide:20171107215659j:plain

RubyでつくるRuby ゼロから学び直すプログラミング言語入門』を読み終わりました。

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門

本書は、@tatsuosakurai さんが主催しているオンライン読書会で題材となった本。コードが出てきたら写経をしつつ、あれこれとみんなで意見を言いながら読んでいたので時間はかかりましたが、しっかりと中身を理解して読了することができました。みんなで読み進めると脱落しづらくなるので良いですね。

昔、『ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み』を読もうとしてそのページ数(600ページあまり)に挫折したのですが、『RubyでつくるRuby』は130ページあまり。このコンパクトさも魅力です。

これをきっかけに『ふつうのコンパイラをつくろう』も読めちゃうのでは?とちょっと思ったり。

概要

「はじめに」を読むと、本書は

Rubyの中で特に重要な言語機能だけを抽出した言語MinRubyを使ってMinRubyのインタプリタを作ります。

とのことで、これだけを読むとなんだか難しそうですが、1章から3章ぐらいまでは「変数とは?」とか「if文とは?」みたいなことから書いてあって非常に丁寧に書かれています。

4章の電卓の実装から徐々に難易度が上る感じですが、ときどき出てくる挿絵キャラクターの可愛さに癒やされながら読み進めることができました。

f:id:miyohide:20171107215742j:plain
私のお気に入りキャラクタであるミドリロボ(と勝手に名付けている)。実はこの子、本書を読み進めるにつれて劇的な変化が...

これから

インタプリタを作成することが130ページあまりの書籍で実装できた理由の一つに、第4章から出てくるライブラリ「minruby」があります。本書では「minruby」の内部実装については一切触れていませんでしたが、1ファイル170行で実装ですし実装を読んでみようかと思っています。