drilldripper’s blog

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

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

どのタイミングでどんな本に出会えるかというのは、人生に強い影響を与えると思う。 「モモ」を小学生のころに読んでいなければ「うわー説教臭い話だな…」ぐらいに思っただろうし、「ライ麦畑でつかまえて」を中学生の頃に読んでいなければ、あんなに反抗的な学生時代を過ごさなかったような気がする。

涼宮ハルヒの憂鬱」を中学生の頃に読んでいなければ、15 歳というタイミングで自分の人生を情報工学に賭けることはなかったと思う。

というわけで、2018 年というタイミングで読んで印象に残った本の感想を残しておく。 このタイミングでしか、心に響いた作品があるはずだから。

サピエンス全史

サピエンス全史 上下合本版 文明の構造と人類の幸福

サピエンス全史 上下合本版 文明の構造と人類の幸福

人類の歴史は、虚構の物語をどれだけたくさんに人に信じさせるかの歴史だった、という論調で話が進んでいく。 物語 (宗教、国家、有限責任会社、資本主義 ) の存在を信じる人が増えれば、やがてその物語は現実に強い影響を与えるようになる。

そして社会を維持している秩序(=物語)は、神々や自然法則によって生み出された客観的事実であると主張し続けることによって、多くの人に信じさせている。 この物語を盲目的に信じる人がたくさんいることで、世界は成立している。

この解釈は僕にとっては救いで、『なんだ、物語の影響を受けまくってる「世界」って小説やアニメの影響を受けまくってる「僕」と何もかわらないじゃん。たいしたことないな』みたいな気持ちにさせてくれる。清々しい。

また、この本では人類の幸せとは何かという点に多くのページを割いている。

私たちは中世の祖先よりも幸せで、また彼らも石器時代よりも幸せであるという価値観は間違っていると主張する。 幸せは、愛情やお金や社会的地位の向上によって生まれるわけではない。セロトニンドーパミンなどのホルモンが分泌されることで幸せになるらしい。

人類が宇宙に行けるようになったって、インターネットで 24 時間コミュニケーションができるよになったって、それが幸せにつながるとは限らない。

だから、人類が幸せになることを目的とするなら、幸せになるためのホルモンを分泌を促進する薬の開発を行うべきなんじゃないかという主張が続く。

僕はこの主張に強く賛成する。毎日幸せになれるお薬を摂取して、平和で穏やかに暮らすことより幸せなことってあるだろうか。

サピエンス全史を読み終わったあと、僕は「しあわせの理由」と「すばらしき新世界」を読み返した。

しあわせの理由 (ハヤカワ文庫SF)

しあわせの理由 (ハヤカワ文庫SF)

すばらしい新世界 (光文社古典新訳文庫)

すばらしい新世界 (光文社古典新訳文庫)

やっぱり幸せというのはコントローラブルであるべきなんだよな、という認識を強くした。 たとえそこに自由意志がなくても(しあわせの理由)、社会制度がディストピア的であっても(すばらしき新世界)、幸せになれるのであれば、そんなに悪い選択じゃないように思える。

フリーランチの時代

フリーランチの時代

フリーランチの時代

現在の社会制度は、当然のことながら人間が死ぬことを前提として作られている。 そんな中、突然なんらかの形で死を克服することができるようになったら…というお話がまとめられた短編集。

やっぱり、技術によって社会の有り様が変わっていくのは、やっぱり SF の醍醐味なんだなとあらためて実感した。 一番おもしろかったのは「Live me ME」という短編。以下の文章ががすごく印象に残っている。

人間は想像力を、いくらでも捨ててしまえるのだ。画面に映っただけの虚像に、強い思い入れを抱いてしまえるほど。

これって、バーチャル YouTuber ブームにつながるところがあると思いませんか? 少なくとも、僕は彼ら彼女らのぎこちない動きを豊かな想像力で補っているというよりも、想像力を捨て去ることで感情移入をしているようだった。みなさんはどうですか?

この短編集が気に入ったので同作者の本を何冊か読んでみたが、老ヴォールの惑星もすごく面白かった。

老ヴォールの惑星

老ヴォールの惑星

特にこの中に収録されている「漂った男」は SF 史に残る名作。おすすめ。

無職転生

壮大な人生の物語。全力で生きなかった前世に対する後悔と、その後悔をバネにした転生後の努力。 信仰、家庭、老後、間違いなくそこに一人の人生がある。

また、作品として一人の人間がここまでの作品を、編集などに頼らずまとめ上げたという事実に衝撃を受けた。

「早く行きたいなら一人で行け、遠くへ行きたいならみんなで行け」

この有名な格言は、きっと一人で遠くまで行けない人が生み出した言葉なんだと思う。 みんなで遠くに行こうとすると、きっと鈍ってしまうものがある。

僕は一人で遠くまで行けないけれど、一人で遠くまでいける人を絶対に邪魔しちゃだめだな。

最後にして最初のアイドル

オタク文化の想像力が宇宙を侵食する。 ああそうか、百合っていうのは実存主義で、そして宇宙なんだな、ということに気付かされる。

そう、世界は百合だったんだ。

所感

振り返ってみると、今年は虚構が人生を変えるというテーマに強く惹かれた一年だった。 新卒として慣れない仕事を覚えながら、現実と折り合いをつけるために選ばれた本なんだと思う。 学生の頃のセレクションとはやっぱり少し傾向が違うようにも思う。

2017年に読んで印象に残った本 - drilldripper’s blog

来年も面白い物語が読めると良いな。

格安シングルボードOrange Pi One Plusで高速なNASを構築する

Raspberry Piと外付けハードディスクを使って構築するNASは、Raspberry Piの定番の活用方法として人気があります。

windvoice.hatenablog.jp

Raspberry Pi 3は安定した公式のOSが提供されており、かつBluetoothWifiが標準で搭載された素晴らしいシングルボードです。 しかしコストカットの影響なのか内蔵のLANとして100Base-TXを採用しているという弱点があります。 100Base-TXの理論値は100Mbpsで、これは12.5MB/sに相当します。実際にNASを構築してみると11MB/s程度の速度となり、LANがボトルネックになっていることがわかります。*1 これは実用的に使えるものの、少し遅い印象です。

これを解決するために、Raspberry Pi 3のUSBにギガネットイーサのアダプタを付けることで、転送速度の改善を行う方法があります。

Raspberry Pi 3のUSBはUSB2.0ですのでそこがボトルネックになります。実は既に下のLANアダプタによるギガビットLANの転送を試していますが、結論から言えば20MB/秒程度の速度です。

Raspberry PiにSambaをセットアップ!NASは実用レベルで使えるか?: ゆるガジェCHANNEL

この方法でも良いのですが、せっかく安価なRaspberry Piを使うのに1500円もするギガビットLANアダプタを買うのは悔しい感じがします。*2

そこで今回は標準でギガビットLANを標準で搭載したOrange Pi One Plusというシングルボードを使って、NASを構築してみたいと思います。

Orange Pi One Plus - Orangepi

Orange PiシリーズはRaspberry Piによく似たシングルボードで様々なシリーズが展開されています。Orange Pi One Plusは2017年12月に発売された最新のボードです。AliExpressから購入できます。

https://ja.aliexpress.com/item/one-plus-h6-1-android7-0-pc/32848891030.html

Orange Pi One Plusの特徴

メリット
  • 安い

    • 20ドルで購入できます。
  • 高性能

    • 理論上は4k60fpsの動画を再生できます。(未検証、ただ十分な熱対策を行う必要があると思います)
    • 1GbpsのLANを標準搭載している
  • 技適を回避できる WifiBluetoothを搭載しておらず、電波を発しないため技適に違反しません。法を守って使用できます。

デメリット
  • USBポートが2.0

    • USB3.0に対応していれば、NAS構築ボードとして完璧だったので少し惜しいです。
  • OSが不安定

    • OSはベータ版のUbuntu ServerとAndroidのみの提供です。
      • ただしUbuntu Serverはそこまで問題になっていません。
  • 情報量が少ない

    • Raspberry Piと比較してコミュニティが小さいので、情報量が少なくなります。

NASの構築

というわけで、このボードを使ってNASの構築を行います。NASの構築はRaspberry Piの方法と同様に、定番のSambaを用います。調べれば多数情報が出てくると思うので詳細は割愛しますが、以下の記事などを参考にすれば良いでしょう。

www.terabo.net

ただし、Orange Pi One Plus特有の注意点があります。 それは起動時に入力デバイスを外して置かないとエラーでOSのブートに失敗するという問題点です。*3

Orangepi系 – OSAKANA TAROのメモ帳

ハードディスクを起動時に接続しておくのは問題ありません。

f:id:drilldripper:20180308162901j:plain

上の画像はOrange Pi One PlusとTrancendの外付けハードディスクです。

公式のケースがなかなかかわいくていいですね。

f:id:drilldripper:20180308161013p:plain

上の画像は実際に速度を計測した結果です。

Writeが43MB/s、Readが25MB/sとなりました。 Raspberry Pi 3でNASを構築したときに比べて、Writeが約4倍、Readが約2倍です。体感速度もRaspberry Piに比べて圧倒的に速いです。 20ドルで購入できるボードでこの速度が出せるのは、なかなかコスパがいいんじゃないかと思います。

*1:Raspberry Pi 3ではNASとしては十分な速度のCPUを搭載しているため、CPUパワーの影響による頭打ちは発生しません。

*2:USB2.0の限界値もでないですし、劇的に高速化されるというわけでもないので…

*3:2018年3月8日時点で、Ubutu Serverはベータ版なので仕方ないのかもですが…

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

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

フィクション

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

悪童日記シリーズ

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

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

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

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

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

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

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

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

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

夜と霧 新版

夜と霧 新版

日の名残り

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

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

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

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

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

あなたの人生の物語

あなたの人生の物語

あなたの人生の物語

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

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

人はなぜ苦しまなくてはいけないのか、という宗教的で古典的テーマをヨブ記を下敷きにして現代風にアレンジした作品として読むこともできる。ドストエフスキーヨブ記からカラマーゾフの兄弟を構想したように、神と不条理の関係は永遠のテーマなのかもしれない。

カラマーゾフの兄弟1 (光文社古典新訳文庫)

カラマーゾフの兄弟1 (光文社古典新訳文庫)

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

人類は衰退しました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