Azure App ServiceでRailsアプリを動かしてみる

概要

Azure App ServiceのLinux版にてFree版が提供されました。

blogs.technet.microsoft.com

物は試しと先日のYokohama.rbにてRailsアプリを動かしてみました。

yokohamarb.doorkeeper.jp

ただ、SQLite3がロックされた状態になり、データの書き込みができない状態でしたので完全に動いたとは言えない状態です。

環境を作る

Azure PortalからApp Serviceを選択します。Rubyが2.3か2.4しかないのが寂しいところ。

f:id:miyohide:20190519100215p:plain

Free版はJapan Eastには無いみたいでApp Serviceを作成しようとするとエラーが発生して作成できませんでした。場所をEast Asiaにすると作成できました。

準備

ローカルのGitからApp Serviceにpushすることでアプリケーションのデプロイができます。「デプロイセンター」の画面から画面に従い操作をするとクローン先や認証情報が取得することができます(スクリーンショット取り忘れた...)

また、簡単のために環境変数RAILS_ENVdeploymentにします。「構成」の場所にて設定する場所があるので環境変数を設定します。

f:id:miyohide:20190519100740p:plain

他のページは日本語化されているのに、このページが英語なのはなんでなんだろう...

Railsアプリの作成

App Serviceで動いているRubyは2019年5月18日現在、2.4.5なので、それに合わせてRailsアプリを作ります。また、bundlerのバージョンも2.0.1ではなく、1.x系を使っています。このため、何も考えずに最新のRuby・bundlerでRailsアプリを作るとRubyやbundlerのバージョン不一致でgit pushしたときに異常終了してしまいます。rbenvを使っているのなら、

$ rbenv install 2.4.5
$ rbenv local 2.4.5
$ gem install bundler -v 1.17.3
$ gem install rails
$ rails new azure-app

といった感じでRailsアプリを作るのが良いでしょう。

また、アプリのルートにpackage.jsonがあるとRailsアプリとは認識されず、node.jsアプリとして認識されます。これを解決できなかったので、package.jsonファイルを消すことで対処しました。

App Serviceにpush

あとは

$ git remote add azure デプロイセンターで提示されたクローン先
$ git push azure master

とすると、App ServiceにRailsアプリがpushされ、自動的にbundle installが行われ、Railsアプリが起動します。App ServiceのURLにアクセスするとRailsの初期画面が表示されます。

f:id:miyohide:20190519101922p:plain

RDBMSへのCRUD操作

Railsscaffoldを使ってRDBMSへのCRUD操作をするアプリを自動生成させ、App Service上で動かしてみます。

$ rails g scaffold post title:string body:text
$ rails db:migrate

App ServiceにRailsアプリをpushしたとき自動的にdb:migrateは走らないのでとりあえずローカルでできたSQLite3ファイルをApp Serviceにpushするようにします。.gitignoreファイルを編集して/db/*.sqlite3ファイルをGitの管理対象外からGit管理対象とし、git pushします。

ただこの方法では、テーブルに値を書き込む際にロックが掛かってしまって書き込みができない問題が発生します。

f:id:miyohide:20190519102822p:plain

そもそもローカルで作ったSQLite3ファイルを無理やりApp Serviceに送っているのでこれは無理も無いことでしょう。

考察

ざっくりとAzure App ServiceでRailsアプリを動かすことをやってみました。短い間でのトライでしたが、とりあえず動かすことまでにたどり着けたのは一つの成果と思います。

あとで調べると、Azure App ServiceにRailsアプリをpushしたときに動く処理は以下のGitHubリポジトリに説明が書かれていました。

github.com

例えばpush時にdb:migrateをさせるには環境変数APP_COMMAND_LINEを独自に設定すれば良さそうです。

ただ、Rubyのバージョンが古いことやpackage.jsonと同居できないことから実際にはRailsアプリをDockerイメージ化して動かすのがよいのでは?とちょっと思っています。

JavaScriptコードレシピ集を読んだ

技術評論社から出ている『JavaScriptコードレシピ集』を読み終わりました。

gihyo.jp

紙版は600ページを超える厚さなので、電子書籍版で。

jQueryを使ったWebアプリはそれなりに書けるけど、thisの扱いがよくわからなかったり、最近の脱jQuery化の流れやES2015などの最近のJavaScriptについてはよく分からないなあと思っていたのですが、なかなか勉強するため のモチベーションが上がらず。そこで小難しい文法書よりもすぐ実践に結びつきそうなレシピ集で学んでみようと思い本書を手に取りました。

レシピ集なのでまずはパラパラとどのページに何が書かれているかを大雑把に把握。その後は必要に応じて写経するという読み方を取りました。

具体的にはWebアプリでのJavaScriptの利用が多いので、

  • 「Chapter 8 HTML要素の操作方法」
  • 「Chapter 9 フォーム要素の操作方法」
  • 「Chapter 14 さまざまなデータの送受信方法」

を中心に写経。

文法的な箇所としては、

  • 「223 非同期処理を行えるPromiseを使いたい」
  • 「267 thisが参照するものを固定したい(アロー関数)」
  • 「Chapter 19 JavaScriptをより深く知る」

が断片的な情報でしか把握してなかったので大変勉強になりました。

個人的には「JavaScriptのテスト」みたいな章が欲しかったところ。

しかしながら、当初の目的である最近のJavaScriptについてはなんとなく分かってきた感じ。手元において日々の開発に役立ちそうです。

File.openを使っているメソッドのテストを書く

軽めのネタ。例えば、次のようなread_dataというメソッドがあるとします。

class MyTest
  def read_data
    File.open("hoge.txt").read
  end
end

このread_dataのテストをRSpecで書くかというお話。なんとなくhoge.txtというものは用意したくない。

StringIOを使って次のように書きました。

require "rspec"
require_relative "my_test"

describe MyTest do
  context "read_data" do
    it "return test data" do
      file = StringIO.new("aaa")
      allow(File).to receive(:open).and_return(file)
      expect(MyTest.new.read_data).to eq("aaa")
    end
  end
end

環境は

で確認。

Yokohama.rbの開催回数が100回となった

ここ数年、運営しているYokohama.rb。昨日の開催が第100回目となりました。

yokohamarb.doorkeeper.jp

お祝いに@publichtmlさんがケーキを用意してくれました。ありがとうございます。

f:id:miyohide:20190316190729j:plain
yokohamarb 100回記念ケーキ

@dan5yaさんが始められて、色々あって私が運営しだして数年。主催者自身が特にコンテンツを用意することない中続けることができたのは、参加者の皆様のおかげです。

Rubyレシピブックを読み進めてくれた@igrepさんや@nabetaniさん。

Rubyレシピブック 第3版 303の技

Rubyレシピブック 第3版 303の技

今は「RubyでつくるRuby ゼロから学び直すプログラミング言語入門」を読み進めています。

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

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

場を盛り上げようと色々と話題を振ったり、運営の分散化を提案・実践してくれた@hamaknさん。今回ケーキを用意してくれたり、運営にご協力いただいている@publichtmlさん。などなど、多くの人々の協力があってこそ今回の100回目の開催を迎えることができ、感謝しています。

Yokohama.rbの参加者の多くは、会に参加されると近いうちに転職を経験される場でもあります。Rubyをはじめに様々なプログラミング言語に関する話題や今のIT業界に関する深い話が行われることもあり、そのような話から参加者が違う道に進むいいきっかけになっているのではないかなと思っています。

Yokohama.rbは会場や主催者の都合にもよりますが、基本毎月第3土曜日の17:30から開催しています。4月以降も毎月開催していきますので、ご興味ある方はぜひとも参加してみてください。

yokohamarb.doorkeeper.jp


これからもYokohama.rbをよろしくお願いします。

『人事の超プロが明かす評価基準』を読んで自分の強みを考えてみた

@hsbtさんの日記に感化され『人事の超プロが明かす評価基準』を読みました。

人事の超プロが明かす評価基準 (単行本)

人事の超プロが明かす評価基準 (単行本)

書籍の冒頭部で

「会社」というゲームのルール、つまり「評価基準」を知ることは、多くの人が気づいていない、最も大事な原理原則なのです。

と記されていています。会社のルールとして行われている評価制度を知るのではなく、どのように評価されてそれに向けてPRしていくのかを知るということを深掘りしており、大変面白かった。

@hsbtさんが書かれている「影響力」の件については、くり返し読んでみてなるほどと納得。どうしても目が行きやすい技術力というワードに考えが行くんだけれども、スカウターみたいなもので「技術力、1,080か...」って測れるもんじゃないですし技術力という概念から離れて自分の強みを分析・PRする必要性を感じました。

じゃ、技術力という概念から離れた自分の強みは何か。

  • 行動が早い
  • 既存のスキルセットにとらわれずになんでも面白がってやってみるチャレンジ精神
  • 長期的なメリットをもとに長い時間の改善活動に尽力する。

なんかがすっと思い当たるけれども、もうひと押し何かがほしいところ。

「Go言語でつくるインタプリタ」を読み終えた

概要

Go言語でつくるインタプリタを読み終えました。

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ

写経しやすい本だったので、写経してみました。

github.com

コミットメッセージに該当ページのページ番号をできるだけ書いてあるので、参考にできるかもしれません。

これまでGo言語については簡単なプログラムを中心に勉強していましたが、あまり身についたという実感はできないままでいました。もう少し大きなプログラムを作ってみたいなと思ったときに本書に出会い、Go言語の勉強ついでに写経しながら書いてみました。

感想

テストプログラムがきっちり書かれていて、写経しやすい一冊。テストが失敗して本処理のTypoとか実装誤りとか勘違いとかを適宜見直すことができて素晴らしい感じです。

Go言語の文法については特に説明はないので、別の書籍などで勉強しておく必要があります。私は、「スターティグGo」を読んで勉強しました。

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

「スターティングGo」が対象としているGo言語のバージョンは若干古いのですが、今回写経するうえでは問題ありませんでした。

著者が読者に対して語りかける形で説明や実装が進むので、好き嫌いは分かれるかと思いますが私は好きでした。

インタプリタの実装についてもちょっと詳しくなりました。だからといってすぐさま「おれが考えた最強の言語。miyohide」ができるとは思いませんが。昔、「Rubyのしくみ」って本を読んだことがあるのですが、個人的には自分で言語が作れる分、「Go言語でつくるインタプリタ」のほうが読了後の達成感は強かったです。

Rubyのしくみ Ruby Under a Microscope

Rubyのしくみ Ruby Under a Microscope

すると、「Rubyで作る奇妙なプログラミング言語」はRuby大好きな人にはおすすめな一冊と思います。

また、「RubyでつくるRuby」はコンパクトで読みやすい一冊かと思います。

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門(紙書籍+PDF版)www.lambdanote.com

2018年の振り返り

2019年になったけど、雑に2018年を振り返りたい。

骨折した

5月にランニング練習中、転倒して骨折した。はじめての手術も経験。いろいろな人に迷惑かけたけれども、色んな人の暖かさに触れた一年であった。

ラソン

骨折の影響がずっと響いて、横浜マラソン2018は28キロぐらいで足がつる。その後は歩いたり走ったり。めっちゃ情けなかった...。来シーズンにご期待ください。

f:id:miyohide:20181028131229j:plain

Yokohama.rb

治療のために1回Yokohama.rbをお休みしたら「運営できる人を増やそう」と @hamakn が呼びかけてくれて、色んな人が運営を手伝ってくれるようになった。おかげさまでまだ続けられています。次回は2019年1月19日(土)です。よろしくお願いします。

yokohamarb.doorkeeper.jp

Ruby Prize 2018 ファイナルノミネート

るびまのメンテを続けてきたことが評価されてRuby Prize 2018にファイナルノミネートされた。

f:id:miyohide:20181101234122j:plain

おかげさまで、RubyWorld Conferenceの場で「記事を書きますよ」というお話をいただき、次号に向けて作業中。2019年はもうちょっと発行ペースを上げたい。

Java(Spring Boot)

業務でJava(Spring Boot)を触ることが多くなって勉強し始める。アプリを実装するのはみんながやることなので、自分としてはテストをどうやって書くのかをいろいろと試してみたりした。表に出せる成果といえばWEB+DB PRESSの記事に載ってあったTodoアプリに対してテストを書いたりした(これも2019年だな)。

miyohide.hatenadiary.jp

普段Railsでアプリを書いているので、別のフレームワーク・言語でアプリを書くと色々と勉強になる。

Golang

これまでちょっとしか書いてなかったGo言語も、業務がきっかけでまじめに勉強するようになった。A Tour of Goをこなしたあと、『スターティングGo言語』を買って文法を学んだり、『みんなのGo言語』を読んだりして勘所を掴む感じ。

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

@tatsuosakurai さんと『Goならわかるシステムプログラミング』のオンライン読書会も進めている。

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

また、『Go言語でつくるインタプリタ』も写経をしながら読み進めている。

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ

断捨離

年明けすぐに引っ越しすることになって荷物の整理を始めたらいつの間にか断捨離っぽくなった。2年間開いていない本とかはもう読まないだろうということで古本屋に売ったり、ダラダラ続けていたウェブサービスも整理して解約した。こういうの、定期的にやりたい。