drilldripper’s blog

ソフトウェア開発と人生をやっていきます

2017年に読んで印象に残った本

今年読んだ本の中で印象に残ったもの感想を残しておく。

フィクション

あまり意識したつもりはなかったが、振り返ると生き方に関する本を多く読んだ一年だった。修士2年生ということもあり、就職活動などで今後の身の振り方を考えていたので、無意識にそのようなテーマを選んでいたのかもしれない。

悪童日記シリーズ

悪童日記 (ハヤカワepi文庫)

悪童日記 (ハヤカワepi文庫)

ふたりの証拠 (ハヤカワepi文庫)

ふたりの証拠 (ハヤカワepi文庫)

第三の嘘 (ハヤカワepi文庫)

第三の嘘 (ハヤカワepi文庫)

辛い現実に直面したとき、人はどのように現実に対処していくのか。悪童日記に登場する双子の兄弟は、自分に嘘をつくという選択をとった。

悪童日記」のエピソード中に「痛みを消す練習」というものがある。お互いを拳やナイフで傷つけ合い、その痛みを無視できるように訓練する。痛みを感じているのは自分ではなく、「別の誰か」であるというように認知をすり替える。辛く悲しい現実を変えるのが難しいときは、自分の認知を変えていくしかない。

読んでいるうち心理学者がナチス強制収容所の経験を書いた「夜と霧」と少し重なった。悪童日記は極限状態にある人々の心理を巧みに描いたフィクションだったが、夜と霧はノンフィクションならではの凄みがある。合わせて読むと良いかもしれない。

日の名残り

日の名残り (ハヤカワepi文庫)

日の名残り (ハヤカワepi文庫)

カズオ・イシグロノーベル文学賞を受賞したことと、ジェフ・ベゾスの愛読書ということで読んだ。「わたしを離さないで」がいまいちだったのであまり期待せずに読んだが、今年読んだ中でも1位2位を争う良い本だった。

英国の執事が長年勤めた屋敷から休暇をもらい、旅に出ながら過去を振り返る。失われていく伝統や過去の選択を振り返り、行動を起こさずに歳をとってしまったと回顧する姿を見て、自分の頭を殴られたような気分になった。

どんな結果になろうとも、選ばなかった後悔を最小化できるように生きていきたい。*1

あなたの人生の物語

あなたの人生の物語

あなたの人生の物語

恐ろしく出来の良いSF短編集。オールタイム・ベストSFに選ばれている理由がわかった。21世紀のモダンなSFという感じで、科学、数学、言語学、宗教と様々なテーマを絶妙なバランスで成り立っている。

お気に入りは「地獄とは神の不在なり」。神の降臨によって病気や怪我が治癒する人がいる一方、降臨時の災害によって命を落とす人がいる、神が日常的に顕現する世界。降臨に法則性はなく、ほとんど不条理としか思えない神の降臨に人間はどう折り合いをつけていくかという話。

人はなぜ苦しまなくてはいけないのか、という宗教的で古典的テーマを(おそらく)ヨブ記を意識して書いた名作。

人類は衰退しましたシリーズ

人類は衰退しました1 (ガガガ文庫)

人類は衰退しました1 (ガガガ文庫)

人類が衰退を始め、人類よりも高度なテクノロジーを持った「妖精さん」が新たな人類として認められている世界で、旧人類と新人類とのコンタクトを描いたSF(?)作品

妖精さんのテクノロジーに引っ掻き回される旧人類のドタバタコメディ短編集という形をとっていながらも、全編を通してみると一つの大きな筋が通っていて、スゴイものを読んでしまった…という読後感だった。やはり田中ロミオは天才だった。あと「わたし」ちゃん腹黒かわいい。

私は人工知能の開発によって、人類の役割を人工知能に代替してもらい、人類は緩やかに衰退し地球の表舞台から去って欲しいという考えを持っている。このシリーズの妖精さん人工知能に置き換えて考えると、理想的な人類の老後の一つだと思った。

ところで未知の存在に人類が引っ掻き回される物として「幼年期の終わり」は傑作なので、合わせて読むと面白いかもしれない。

白と黒のとびら

魔法の世界で繰り広げられる師匠と弟子のハートフルストーリー、なのだがそこで登場する魔法が一味違う。魔法とはオートマトン形式言語である。オートマトンを呪文に置き換える比喩はものすごく上手く機能していて、全く違和感がない。

ファンタジーに登場する魔法に完璧な整合性を求める設定厨の人、コンピューターサイエンスを学びたい人、単純に面白いエンターテイメントが読みたい人、どの人にもおすすめできる。

素晴らしいストーリーと簡潔でわかりやすい説明のおかげで背景知識無しで読めます…が、私は大学でオートマトンコンパイラの講義を受けていたので、難易度を過小評価しているかもしれない。

ノンフィクション

今年読んだノンフィクションは経済に偏っていた。去年は宇宙や歴史などに凝っていたので、たぶんその反動なのだと思う。

あとは来年から社会人になるので、「社会をやっていくぞ!」という気持ちを高めるために読んでいた側面もたぶんある。

ジェフ・ベゾス 果てなき野望

ジェフ・ベゾス 果てなき野望

ジェフ・ベゾス 果てなき野望

ジェフ・ベゾスは大帝国の皇帝で、邪魔するものは全て叩き潰す冷酷な経営者というイメージがあったが、自分の資産をひたすら宇宙開発やロケット開発に注ぎ込み続ける少年のような心を持つ熱い人だという印象が付け加わった。ちなみに邪魔するものは叩き潰すというイメージは大きくは変わらなかった。

AWSKindle、プライムビデオ、どれもがベゾスのカリスマと異常な投資戦略によって生まれていて、世界の前進に必要なのは民主主義ではなく、クレバーな独裁者が必要なんだという確信が強まった。(スティーブ・ジョブズイーロン・マスク、DHH、etc...)

ゼロ・トゥ・ワン

ゼロ・トゥ・ワン 君はゼロから何を生み出せるか

ゼロ・トゥ・ワン 君はゼロから何を生み出せるか

起業するときは競争をせずに独占を目指せ、とPayPal創始者ピーター・ティールが主張する本。競争はアイデアを提案出来ない弱者の選択であると切り捨てる。独占ができれば大きな利益を得ることが可能で、それは世界に新しい価値をもたらす。(AppleiPhoneAmazonのeコマース、PayPalの決済など)

AmazonAppleは間違いなく世界を良い方向に変えたし、独占のインセンティブを活用して事業を拡大してよりユーザ体験を実現しているので、ピーター・ティールの主張は納得感はある…が、納得感があるとはいっても現状の独占が生む超格差社会が果たして正しい姿かと言われると疑問なところがあるので、彼の主張する市場原理に任せきった市場が正しいのかよくわからない。

イノベーションのジレンマ

イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)

イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)

ジェフ・ベゾス 果てなき野望で紹介されていたので読んだ。

大企業がスタートアップに負けてしまう理由「破壊的イノベーション」を説明した古典。既存の製品を改良するのに夢中になり、新しい特性を持った技術を採用できずに競合に遅れを取ってしまう。

読み終えた後破壊的イノベーションの例を考えてみたところ、意外と多くの場所で発生しているということに気づいた。私が真っ先に思いついたのは、マイクロソフトクラウド参入の遅れという例だった。クラウドが拡大すると既存のOSやサーバ事業が減益してしまうので、大きく方向転換を取るのが難しかったのだと思う(ここ数年のマイクロソフトOSSクラウドへの舵のとり方、本当にすごい)。

予想どおりに不合理

人間は経済的に合理的な判断をすることが出来ない、という例をこれでもかとぶつけてくる。「頼まれごとなら無償で引き受けるが、安い報酬では引き受けない」という例などは、言われてみれば確かに合理的じゃないな…という気づきがある。一通り読んでおくと、日常生活でハックできる点が見つかるかもしれない。

*1:やっていくぞ!!

Webページの英単語に日本語の意味を表示するChrome拡張「Read Ruby」を公開しました

f:id:drilldripper:20170930151630p:plain

Webサイト上の英単語の上に日本語を表示するGoogle Chrome拡張機能を作りました。単語にルビ(Ruby)を付けて読む(Read)ということで「Read Ruby」と名付けました。*1

Chromeウェブストアからインストールすることができます。

Read Ruby -Chrome ウェブストア

使い方

追記

GIGAZINEさんのレビューがわかりやすいので参考にしてください。

ウェブページの英単語に単語レベルを指定して日本語訳のルビをつけることが可能なGoogle Chrome拡張機能「Read Ruby」レビュー - GIGAZINE


ツールバーのアイコンをクリックすると英単語の上に日本語の意味が表示されます。さらにクリックをするとルビの表示を切り替えることができます。

github.com

下の画像は英語のWikipedia拡張機能を適応した結果です。

f:id:drilldripper:20170930150425p:plain Albert Einstein - Wikipedia

またアイコンを右クリックしてメニューからオプションを選択すると、表示する英単語のレベルを設定することができます。

f:id:drilldripper:20170930150220p:plain

英単語のレベル設定は定評のあるSVL12000を使用しています

レベル別語彙リストSVL12000|英単語・英文法|アルク

辞書

英日辞書に簡短英日辞典を使っています。この辞書がなければ拡張機能は実現できませんでした。語彙のレベルと出現頻度が付与されてい非常に使いやすい辞書でした。

参考

この拡張機能Kindleの「Word Wise」に影響を受けています。

Kindle ピンポイントレビュー:これで辞書いらず? Kindleの新機能「Word Wise」を使ってみた - ITmedia eBook USER

この機能は読者の英語レベルに応じて英単語を簡単な英語に言い換えるものです。これの日本語版がほしいと思ってRead Rubyを作りました。

Kindle Paperwhite Wi-Fi、ブラック

Kindle Paperwhite Wi-Fi、ブラック

*1:当然Google Chrome拡張なのでRubyではなくJavascriptを使っています。

OpenCV 3.2以下ではline()で長い線を描画した際の挙動にバグがある

OpenCVのline()関数は任意の2点を指定して線を描画する関数です。

OpenCV:Drawing Function

この関数は線の太さを指定する引数がありますが、長い線を描画しようとするとOpenCV 3.2以下のline()では線が塗りつぶされません。この挙動はバグとしてIssueに報告されています。

github.com

対策はOpenCVのアップデートです。2017年8月にアップデートされたOpenCV 3.3ではバグフィックスされています。

どうやらこのバグはOpenCV3.1から報告されていたようですが、安易に修正すると描画パフォーマンスに影響を与えるため修正に慎重になっていたようです。

特にRaspberry PiOpenCVを使うユーザが多いことを気にかけており、Raspberry Piの影響力が大きくなっていることが伺えます。

github.com

Hack U 2017 NAGOYAで最優秀賞とHappy Hacking賞をダブル受賞しました

f:id:drilldripper:20170823192542j:plainYahoo主催のハッカソン「Hack U 2017 NAGOYA」に@garicchi@yurafucaと僕(@drilldripper)の3人で、「ミラクル☆マジカル☆芋焼酎」というチーム名で参加しました。チーム名は語感で決めました。特に意味はないです。ちなみに僕は芋焼酎を飲めません。

hacku.yahoo.co.jp

僕たちのチームは最優秀賞とHappy Hacking賞(会場内投票1位)のダブル受賞で、最高の結果を残すことができました。*1

めちゃくちゃ嬉しいです。

プロダクト

今回のハッカソンのテーマは「UPDATE 夏休み!」でした。僕たちのチームは「美少女と一緒に海で水をかけあいたい!」という純粋な気持ちを叶えることで、夏休みをアップデートすることにしました。

具体的には水をかけあうオンラインスマホゲームを作成し、水がかかると霧吹きから水が噴出されるシステムを実装しました。タイトルは「みずかけメモリアル」です。*2

これがシステム全体の様子です。

f:id:drilldripper:20170822023122j:plain

女の子から水をかけられると…

www.youtube.com

霧吹きから水が噴出されます。

www.youtube.com

このように女の子に水をかけたりかけられたりすることで、夏をUPDATEします。

詳しく知りたい方はプレゼン動画を見てもらえると嬉しいです。

Hack U 2017 NAGOYA 作品発表会 - YouTube

技術スタック

クライアントのゲームはUnityで作成しています。キャラのモデルはドワンゴから提供されている「アリシア・ソリッド」さんを使用しています。

3d.nicovideo.jp

キャラモーションは配布されていないので、ゲームに合わせてたモーションを作成しています。

クライアント間の移動や攻撃の通信はWebsocketを使用しています。プレイヤーに水が当たった際はSocket通信を使ってRaspberry Piへとメッセージを送り、メッセージを受け取ったRaspberry PiはGPIOを通じてサーボモータを動かします。

ユーザの登録やスコアの更新、ランキング表示のAPIなどはRuby on Railsで作成しています。Railsはバージョン5からはAPI作成モードが標準で使用できるようようになっていたので、これを利用しました。

主にゲーム部分を@garicchi、Websocket通信を@yurafuca、サーボモータ制御、API実装を僕が担当しました。

モチベーション

開発期間が3週間と長かったので、モチベーションを保つための工夫をしました。

まずチームオリジナルキャラを作りました。

f:id:drilldripper:20170822021749p:plain

芋焼酎ちゃんといいます。かわいいですね。

次にチームTシャツを作り、一体感を高めました。

f:id:drilldripper:20170822020510j:plain

Tシャツはアイロンプリントです。Tシャツ屋さんごっこはめちゃくちゃテンションがあがって最高でした。

最後にプロダクトのホームページを作りました。

みずかけメモリアル –最高の夏、始まる

このページの構成とポエムは僕が一生懸命考えました。やっぱりポエムはいいですね。

これらの制作物はハッカソンの評価に直接は関係ありません。しかしモチベーションは有限のリソースです。 心がへたらないように、これらのエモーショナルなアイテムで自分たちの気持ちを高めていました。

デモ

僕たちのプロダクトは不調により、プレゼンでデモすることができませんでした。原因は電源を供給する電池ボックスの接触不良でした。やはり本番にはトラブルはつきものなので、失敗する前提で前提でを組んでおくことが大切なんだなあという気持ちになりました。

感想

初めてのハッカソン参加で高く評価されたのはすごく嬉しかったです。特に作品のフィードバックを貰える点が有意義だと思いました。

また副賞のドローンがすごく豪華でめちゃくちゃ驚きました。迷惑にならないようにぶん回して、次のプロダクトに繋げたいです。

やっていく気持ちが高まる楽しい大会だったので、またこういう機会があったら参加したいです。ありがとうございました!

チームメンバの参加記録

HackU Nagoya 2017にゲームを作って出場して最優秀賞とHappyHacking賞のダブル受賞をしました -garicchi.com

*1:チームは全20チームです

*2:ときめきメモリアルを意識しています

AWS Lambdaを使ってサーバレスにWebサイトを監視してSlackに通知する

Webサイトの状況を監視するためのスクリプトを動かしたいというシチュエーションが発生することがあります。典型的な例としてECサイトの在庫監視などがあると思います。この文章を読んでいる人の中には、Nintendo Switchの在庫状況を監視して通知するスクリプトを動かしている人もいるもいるのではないでしょうか。*1

在庫確認のようなシチュエーションでは常時起動しているPC、すなわちサーバに相当するものを用意しなければなりません。VPSを借りる人も多いと思いますが、スクリプトを動かすだけに使用するには少々オーバースペックです。

そこで今回はAWS Lamdaを使って安価にサーバレスでサイトの在庫状況を監視するシステムを構築します。例としてNintendo Switchの在庫状況を通知するシステムを作ります。

おそらく無料枠内で収まると思いますが、無料枠を超えたとしてもAWS Lambda自体がかなり安価なので、VPSを借りるよりも安価になることが多いはずです。

構成

AWS Lambda上で実行することができる言語の一つ、Pythonスクリプトを記述します。スクリプトの中に通知をとばす処理を記述しておきます。今回はSlackに通知します。

その後スクリプトを使用するライブラリを含めてアップロードを行い、Cloud Watchをトリガーにして一定間隔でAWS Lambdaを実行します。

構成図は以下のようになります。 f:id:drilldripper:20170708210908p:plain

スクリプト

スクレイピングが明示的に禁止されているサイトは実行しないでください。*2

最初に使用するライブラリをpip installでインストールします。

pip install requests -t .
pip install beautifulsoup4 -t .
pip install slackweb -t .

AWS Lambdaではライブラリを含めたフォルダをzipでまとめてアップロードする必要があるので、-tオプションでカレントディレクトリを指定しています。

次に実行したいスクリプトを書きます。

import requests
import slackweb
from bs4 import BeautifulSoup


def buy_bot(event, context):
    # Camouflage User Agent
    user_agent = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko"
    }

    # merchandise URLs
    # Example: Checking Joshin switch stock
    joshin_url = [
        "http://joshinweb.jp/game/40519/4902370535716.html",  # Neon Blue
        "http://joshinweb.jp/game/40519/4902370535709.html",  # Gray
    ]

    # Incoming Webhook API key
    slack = slackweb.Slack(url="INCOMING WEBHOOKS API KEY ")
    # slack.notify(text="From Python to Slack") # DEBUG

    # Joshinサイトの監視
    for url in joshin_url:
        html = requests.get(url, headers=user_agent)
        html.encoding = html.apparent_encoding
        html = html.text
        soup = BeautifulSoup(html, "html.parser")
        detail = soup.find("form",{"name":"cart_button"}).text
        if not ("販売休止中です" in detail):  # Check stock messages
            slack.notify(text="Joshin: Nintendo Switch is available now. \n" + url)

Beautiful Soupでスクレイピングを行い、販売が休止していないときにIncoming WebhooksのAPIを使って在庫が存在していることをSlackのチャンネルへ通知します。Incoming Webhooksの仕様は公式ドキュメントを参考にしてください。

api.slack.com

また関数がdef buy_bot(event, context)のように宣言されていますが、このeventcontextAWS Lambdaのイベントをハンドルするために必要な引数となります。

AWS Lambdaの設定

ハンドラ

スクリプトをzipで圧縮し、AWS Lambda上にアップロードします。アップロードが終わったら関数がハンドラを受け取れるように設定を変更します。

f:id:drilldripper:20170708210839p:plain ハンドラは<ファイル名><メソッド名>で記述します。例で使用したスクリプトであればbuybot.buy_botとなります。ロールはlambda_exec_roleにします。

タイムアウトとリソース

デフォルトの設定ではリソースが足りずにタイムアウトしてしまうので、設定でメモリを増やしてタイムアウトの時間を長くします。

f:id:drilldripper:20170708211012p:plain

なおAWS Lambdaはメモリを増やすことでCPUの性能が増加する仕様になっています。

よくある質問 - AWS Lambda | AWS

トリガー

次にAWS Lambdaを動かすためのトリガーを設定します。Lambdaを一定間隔で実行するためにCloudWatch Eventsを使用します。ここではおなじみのcron式を使うことができます。

f:id:drilldripper:20170708211037p:plain スクレイピングを行う場合、サイトに迷惑がかからないように十分な間隔を開けましょう。

今回のスクリプトは1分間に1回だけ実行するようにしました。次のようなcron式になります。

cron(*/1 * * * *)

まとめ

とても簡単にサーバレスな監視システムを作ることができました。EC2やVPSなどを使って1からシステムを作る場合はサーバーの構築などを行わないといけないので、それに比べると気軽に動かすことができていい感じですね。

参考

switchが入荷したらLINEで通知するプログラムを作った - Qiita

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

*1:ちなみに私はSwitchをまだ持っていません。欲しいです。

*2:例えばAmazonスクレイピングが禁止されています

https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201909000

分離式キーボードと最高の開発環境

分離式のキーボードMiSTEL BAROCCO MD600を購入しました。

MD600はキーボードの軸を選ぶことができます。私は赤軸を選択しました。

以下は購入に至った心の動きです。

  • 分離式のキーボードが欲しい
  • Ergodoxは良さそうだけど高い*1
  • 比較的安価なMD600の存在を知る(16000強)
  • Ergodoxの半額近い値段で購入できる。コスパ最強で間違いなく買い!

冷静なると16000超えのキーボードに対してコスパが良いという感想を持つのは、暑さに頭がやられてた可能性があります。

デスクの様子

デスクではキーボードをノートPCのサイドにおいて使用しています。 f:id:drilldripper:20170610183824j:plain

このとき付属のUSBでは長さが足りないので適当な長さのケーブルを購入する必要があります。

この方法ではノートPCの画面を下、外付けディスプレイを上にする運用が可能になり、Retinaディスプレイトラックパッドを有効に活用することができます。

また写真を見て分かる通りこのキーボードは厚みがあるので、リストレストを使って段差を軽減しています。私はマウス用のリストレストを2つ使用しています。

キーボードの感想としては肩を開いて姿勢良くタイピング可能で、メカニカルキーボードの小気味よい打鍵感と相まって最高です。

最高の開発環境

追加アイテムを購入することで、開発環境をさらなる高みに導くことができます。

これです。

これが組み上がった状態です。 f:id:drilldripper:20170610183630j:plain

これにPCを載せてサイドにキーボードを起きます。

f:id:drilldripper:20170610183633j:plain

f:id:drilldripper:20170610183636j:plain

f:id:drilldripper:20170610183638j:plain

人間としては終わっている感じが強いですが、最高にリラックスして作業することができます。

参考

プログラマーの三大美徳 - Mercari Engineering Blog

Ruby on Railsチュートリアルを軸にしてWeb周辺技術を勉強した

最近まとまった時間ができたので、Web開発手法の勉強をしていました。

Ruby on Railsチュートリアルが体系的に学べて良いという話を聞いていたので、これを軸にしながら自分のWeb知識の穴を埋めていくことにしました。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

一区切りついたのでまとめておきたいと思います。

前提知識

以下は勉強を始める前の私の知識です。

  • Webフレームワークを使ったことがない

    • PHPなどで開発をしたことはある
    • MVCモデルは一応理解している
      • Java Servletを使った講義を受けたことがある
    • DB Migrationなどの言葉は聞いたことがある
  • Rubyを一行も書いたことがない

    • 普段はPythonC++を書いている
    • 趣味でJSも少し書く
  • CS的なインフラの基本技術は知っているが、IaaSやPaaSなどにはあまり明るくない*1

参考書

Railsチュートリアルをやる前に、参考書でWeb技術に基礎を固めました。

最初にWebを支える技術を読みました。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

RESTの基本を学ぶのに非常に役立ちました。またステートレスやリソースなど、「なんとなく意味はわかるけど正確には知らない」知識を得ることができたり、実践的なAPI設計などが書かれていたりして非常に良い本だと思います。途中microformatsAtomなど、今ではあまり使われていない技術に多くのページが割かれているので、興味がない人は適当に読み飛ばせばいいと思います。(Webの栄枯盛衰を感じる歴史としては面白いと思います。)

次にマスタリングTCP/IP 入門編を読みました。*2

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

名著だと言われていますが、教科書的で結構退屈です。また既に知っている知識が多かったので、私は適当に読み流しました。

低レイヤーを学んだので、次は高レイヤーのIaaSやPaaSを学ぶことにしました。今回はAWSを選択しました。

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)

評判が良くて比較的出版が新しかったのでこの本を選びました*3スクリーンショットなども多く、手を動かしながらサービスを満遍なく学習できて面白かったです。無料枠で十分遊べます。

AWSRailsチュートリアルにはあまり関係ないかと思っていましたが、一部ストレージサービスのS3を使う部分などがあり、学んだ知識を生かすことができました。

Rubyの学習

RailsチュートリアルではRubyの前提知識を求めていませんでしたが、さすがにHello Worldも書けない状態で特攻するのは嫌だったので、簡単に言語仕様をさらいます。

まずは公式ドキュメントを読みました。

20分ではじめるRuby

他言語からのRuby入門

公式ドキュメントは量が少なく、あまりにもあっさりとしているので他の資料にあたりました。

[Ruby]他言語使用者のためのRuby入門知識まとめ - Qiita

便利なRubyイディオム - Qiita

ASCII.jp:Ruby超入門(前編)|Rubyで学ぶRuby

特にRubyで学ぶRubyは面白かったです。(Rubyで自作インタプリタを作る連載で、正直文法やイディオムの書き方を学ぶのには適していないと思います)

Ruby on Railsチュートリアル

ここまでやった段階でRuby on Railsチュートリアルに取り掛かりました。基本的には演習問題に取り組み、erb(HTML)とCSS以外はコピペしない方針で進めました。

Twitterライクなアプリを作る中でGitの使い方からマイグレーション、PaaSへのデプロイ、テスト駆動開発などを実践的に学ぶことがでます。 思っていたよりもにWebの広範囲な知識が得られてやってよかったと思います。

またGitのコミットの粒度やコメントの書き方などは普段の開発にも活かせる部分があり、Masterブランチ一本で開発していた自分のプロジェクトを見直すきっかけにもなりました。

たくさんのことが学べる素晴らしいチュートリアルですが、それは裏を返せば非常に長大なチュートリアルであるということです。 電子書籍版のPDFに換算すると800ページ以上あるので*4、結構挫折感は強いです。個人的には勢いに任せて一気にやるといいと思います。

補足:Ruby on Railsチュートリアルのメモ

以下はチュートリアルを進めながらのTipsやエラー回避、感想です。

進めながらメモをとっているので、適当なことを言っている可能性があります。

1章

  • Cloud9が推奨されているが、小回りがきいて便利だと思ったのでローカル環境を作成
    • JetBrainsのIDEが使いたいというモチベーションが大きい
  • nokogiriでインストールエラーが発生
    • Command Line Toolsをいれておく必要がある

2章

  • Viewを表示しようとしたらArgumentError: key must be 32 bytesのエラー

  • RailsはRESTfulを採用した先駆者らしい

    • Webを支える技術を読んでおいてよかった感ある

3章

  • コミットの粒度や命名規則のあたりがいい話
  • .erbはhtmlを書ける
  • テスト駆動開発
    • 知識として知ってたけど、実際にこのプロセスをやるのは初めてだ

4章

  • 言語仕様
    • ここはサラッと流せそう
    • Railsの拡張も結構ある

単なるRubyのコードを書くのであれば、モジュールを作成するたびに明示的にインクルードして使用するのが普通ですが、Railsでは自動的にヘルパーモジュールをインクルードしてくれるので、include行をわざわざ書く必要がありません。 つまり、このfull_titleメソッドは自動的にすべてのビューで利用できるようになっている、ということです。

  • メソッドが破壊的かどうかを表現するために!をつけるルール、すごく良さそう
  • 必ずしも守られているわけではなさそうだけど http://qiita.com/tadsan/items/7baab2605a4d8ac1858e

  • pythonのスライスとrubyのスライスは仕様が違うので注意

    • [0..7]としたときに、7自体も含まれる

5章

  • CSSを書くのが結構めんどくさい

    • 自分が普段書かないからサラサラかけなくてストレスなのかも
  • HTTP技術の話

    これは、HTTP標準では技術的にリダイレクト後に完全なURLが要求されるためです。ただし、ほとんどのブラウザではどちらの方法でも動作します。

  • Webを支える技術にそんなようなことが書いてあったなあ

6章

  • 名前だけ知ってたActive Recordの概念が出てきた
    • SQLの操作を抽象化している
  • ここでRails console内で生成されるTime Stampの値がおかしいことに気付く

  • 正規表現がでてきた

    • 読むのがめんどくさくて、たぶんあってるだろうと思ってコピペする
      • 普段から正規表現に対してはこのスタンス。良くない癖だ…。
  • passwordはハッシュ化して保存する

7章

  • RESTに従ってデータベースを取得したサービスを設計し始めた

    • Resourceとしてデータを扱う
  • debuggerメソッド、とても便利。ブレイクポイントだ

  • POSTで送ることのできる要素を限定させる(Strong Params)
    • すべての要素を送ろうとするとエラーが発生する
  • pluralize
    • 英語を複数形にするメソッド。言われてみればめっちゃ需要ある
  • configを一行変更するだけで簡単にSSL通信ができてすごい
    • というよりもHerokuが簡単にSSLを無料で扱えるのが使えるのがすごい

8章

  • rails routesでルーティングが表示できる

    • コンソールで対話的にwebアプリを作れるメリットを感じる
  • 残念ながらヘルパーメソッドはテストから呼び出せない

    • これ少しめんどくさい

9章

  • XSSの対策をしなくていいの?と思いながら進めていたけど、railsが自動的にやっていたみたい
    • やっぱり標準で対応するべきだよなー
    • PHPだと明示的にescapeしないといけないし、世の中を良くするためにはデフォルトで対策したほうがよい
  • 記憶トークンの使用はセッションハイジャックの対策にもなって一石二鳥
  • PythonのselfとRubyのselfは似たような感じ?
  • 署名と暗号化を同時に行う。合理的

  • 0も1もRubyの論理値ではtrue

    • if文を書くときに他言語に慣れてると罠に嵌りそう
  • チェックボックスとかの分岐のテストはなかなか大変

10章

  • そういえばテストではpostじゃなくてpatchが使われている機会が多いことに気づいた
  • has_secure_passwordはオブジェクト生成時に存在性を検証する
    • ユーザ登録時にnilが有効にならない
  • log_in_asヘルパーがすごく強力であることがわかってきた
  • unless @user == current_userよりもunless current_user?(@user) のほうがわかりやすいという説明、いまいちピンとこない
    • 前者のほうが何をしているか明確でいいと思う
      • Python的な考え方かもしれない
  • Cookieをユーザが手動で削除してフォームを送信する場合を考慮してテストされてて、なかなか細かい
  • ブラウザはネイティブではDELETEリクエストを送信できないらしい
    • 知らなかった…。

11章

  • このへんでようやくedit_account_activation_urlの意味がわかってきた
    • @がURLで使えないということを初めて知った
  • どうやってメール受信のテストをやるのかなあと思いながら読み進めていたけど、簡単にプレビューする方法がRailsで提供されているらしい。

    • この仕組、テストが行いやすくするための工夫だよなあ
      • これがないとTDDはしにくそう
  • assert_matchめっちゃ便利

  • メタプログラミング

  • テストがあるとリファクタリングしたときの安心感があって良い

    • ところでコントローラからモデルに操作を移したい理論的な動機について書かれていないんじゃないか?
      • 感覚としてなんとなくわかるけど
  • 本番環境でメールのテストを行うためのプラグインをHerokuで使うためにクレジットカード登録が必要

    • 先延ばしにしていた登録をここで終わらせる
    • Vプリカが使えるのでセキュリティ的にも安心
  • 本番環境でメールがなかなか届かなくて失敗してるかと思ったけど、時間がかかっているだけだった。

12章

  • この章の序盤は本当に11章とやっていることの本質は変わらないっぽい
  • チュートリアルで一番難しいのは、漏れがないようにテストを書く演習な気がしてきた
  • ようやくこの章でログインの管理が終わった。結構しんどかった。

13章

  • PostgresQLではStringとTextではパフォーマンスの差が出ないのは初めて知った
  • Reference型よい
    • 今自分は間違いなくmigrationのメリットを享受している
  • 状況に応じて生のSQLが読み書きできないと処理ができない部分がまだたくさんある
  • pluralizeがまた出てきた
    • 中身は泥臭いルールベースのコードなのかな
  • if object.errors.any?objectにするだけで抽象度が高くコードが書けて楽しい
  • 文字列をescapeする必要がなくても、とりあえずescapeしておく癖をつける
  • 画像のファイル名にはStringを使うのか
    • 全部Textにするのはだめなのか?
  • この章で初めてvalidationのメソッドを自分で書くことになった
    • railsの機能が豊富なのか、それともいままでの課題が基礎的なものだったのか
      • たぶん両方だと思う

14章

  • 冒頭のデータベース設計、すごく参考になる
    • データベース正規化を実際のサービスに当てはめて、パフォーマンスと保守性を考慮しながら設計している
  • foreign_key: "follower_id"という記述
    • ActiveRecordはDBを操作しているということを思い出させてくれる
  • HTMLを構造的にテストしていくのは複雑で難しい
    • 現実ではさらにデザイナーとバックエンドを書く人が別れているケースもあるから、もっと難しくなりそう
  • RailsにおけるAjax、JSを意識せずに使える

各行の末尾にセミコロン ; があることに注目してください。 これはプログラミング言語によくある文法で、古くは1950年代中ごろに開発されたALGOLまで遡ります。

  • ;を使わない言語をはじめに使う人達も増えてきたんだろうな…。(老害感)

  • アプリ完成

    • 長かったけどすっごく面白かった

*1:情報科学を専攻しています

*2:すごい昔に買った本を引っ張り出してきた

*3:AWSは進化が速く、陳腐化しやすいので比較的新しい参考書を選んだほうが良いと思います

*4:https://gumroad.com/l/railstutorialjp_ebook