フォードのブログ

理系大学院生のブログです。

2020年09月の読書記録

今月は諸事情でReact+TypeScriptでのフロントエンド開発にほとんどの時間を費やした.おかげで作りたいと思っていたものをほぼ実装できた一方であまり本を読めなかった.そんな9月の読書記録.

技術書編

NumPyによるデータ分析入門

B3の頃からpythonは触っていて研究でnumpyはよく触っていたのでデータ分析という観点では特に目新しいことはなかった.最後のBLASの話とベンチマークの話が個人的にはためになった.

作りながら学ぶReact入門

作りながら学ぶ React入門

作りながら学ぶ React入門

  • 作者:吉田裕美
  • 発売日: 2017/09/16
  • メディア: 単行本

2017年の本だがもう内容が古く感じるのがフロントエンドの発展スピードの速さを感じて恐ろしい.内容的にはコンポーネントの基本やJSXが紹介されているもののReduxなどのデータ管理にほとんど触れられていないのである程度の規模のアプリを作るには少し厳しいのではないかと感じた.今は関数コンポーネントを使うだろうしReact.Hookも使うだろうしTypeScriptで書くこともあるのではないだろうか.

プログラマーのためのコンピュータ入門

アセンブラの話からデータベース,ネットワークの話題など幅広く取り上げられているもののそれぞれのトピックの深さはどうしても浅くなってしまっている.概論を知るにはいいかも.

React入門

Amazonの評価は悪いが個人的にはReduxが詳しめに紹介されていて助かった.この本を読んだ時はある程度Reactでコードを書いていたので雰囲気が分かっていたからというのはあると思う.

Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書

SAAの資格を取るときに勉強したのでこの本に書いていることはほとんど知っていた.しかしGameLiftやAmplifyなどの最近のサービスがおさえられているのは驚いた.

その他

日本の統治構造

日本は議院内閣制だから首相の権限が弱くアメリカは大統領制だから権力が集中している,というふうに言い切れないということが書いている.結局国ごとに歴史的経緯があって政治制度が成立しているのでどの制度が一番いいとかはないのだろうと思うが,少なくとも時代の変化に応じて変化できるしなやかな制度である必要はあるのではないかと感じた.

経済政策で人は死ぬか

ソ連崩壊後拙速な民営化によって潰れた工場が多くあってその街で働いていた若年男性がアルコール中毒になってその年代の死亡率が急増したということが書いてある.経済危機のたびに各国それぞれ違った政策が取られていわば比較実験が行われているわけだがそうした実験に振り回される国民はたまったものではない.今までの歴史的なデータに基づいて政策を決めてほしいと思った.

幸福な監視国家・中国

街中に監視カメラが溢れて信用スコアというブラックボックスによって個人が評価されるのはディストピアだと思うが,そのように一面的に断言することには慎重になるべきだなとこの本を読んで反省した.ただ中国の巨大IT企業だけでなく外資プラットフォーマーにしても一度制度として動き始めたものを修正するのは大変そうなので安全めに考えて制度設計した方が良さそうだとは感じた.

2020年08月の読書記録

今月は夏休みも特に外出せず今までと変わらない日々を過ごし,月末に安倍首相が辞意を表明して政治が動き始めた月だった.そんな8月の読書記録.

技術書編

PythonによるWebスクレイピング

PythonによるWebスクレイピング 第2版

PythonによるWebスクレイピング 第2版

  • 作者:Ryan Mitchell
  • 発売日: 2019/03/26
  • メディア: 単行本(ソフトカバー)

タイトル通りpythonのライブラリ(Beautiful Soup)を使ってWebスクレイピングを行う方法がまとめられている.エラー処理をどうやるかなどの話はwebサイトに対してスクレイピングをやる場合考慮しないといけないことなので参考になった.自分が昔webサイトのスクレイピング(というかクローリング)を行うときはscrapyを使っていてその時に読んだ方が良かったなと思った.今は特にスクレイピングのタスクがないので.

HTML+JavaScriptによるプログラミング入門

HTMLを今までほとんど書いてこなかったのでこの本のようにそれこそタグや属性とは何かといったレベルから解説してくれるのはありがたかった.HTML要素をJavaScriptで変更する方法も書かれていて,こうした方法を学ぶことでウェブフレームワークの勉強もスムーズにいっている.

はじめてのHTML+CSS

TM はじめてのHTML+CSS HTML5対応 (TECHNICAL MASTER)

TM はじめてのHTML+CSS HTML5対応 (TECHNICAL MASTER)

  • 作者:大藤幹
  • 発売日: 2018/04/28
  • メディア: 単行本

HTML5対応ということでHTML5前後の変更点が書いていてありがたい.HTML, JavaScriptについて何冊か読んだ後見栄えを良くするためのCSSの勉強をしようということでこの本を読んで,おかげてwebアプリを作るときのイメージが湧いてきた.最後のサーバーでの公開の部分ではレンタルサーバーを勧めているのは何か理由があってのことなのかが気になった,出版された頃はGitHub pagesなどはまだなかったからか.

データ分析基盤構築入門

Fluentdの紹介からElasticsearchにログを流し込みKibanaで可視化するまでのデータ分析基盤を構築する方法が紹介されている.Elasticsearchの勉強をしたくて読み始めたのだがFluentdを知ることができて良かった.ElasticsearchのマネージドサービスとしてAWSはElasticsearch Service(ES)を提供していて,ログの分析はESのユースケースの一つだと思うが,その場合はFluentdではなくCloudwatch agentでも使うことになるのかなと思った.

リファクタリング

既存のコードを安全に改善するリファクタリングのいくつかのパターンが書かれている.テスト駆動開発と被る部分もあるもののテストを書いて振る舞いが変わらないようにしつつ,例えば変数を関数呼び出しに抽出するなどのいくつかのパターンに基づいてリファクタリングしていくらしい.自分は開発職でコードをガンガン書いているわけではないもののこういったリファクタリングの方法を知っておくことで保守しやすいコードをかけるのではないかなと思っている.そういう意味では再びリーダブルコードを読もうと思った.

その他

ワーク・スマート

Google東京オフィスで初期から働いている女性がワーキングマザーの働き方をより良くしていった事例が紹介されている.Googleの価値観なども紹介されていて面白いと思ったが,会社が働き方改革を進めていく文脈で考えると面白いだけでは済まない気がしていて,トップの人間がどれだけ真剣にやるかがメインファクターになるのではないかと感じた.こういう働き方や組織論の話を読むにつけ結局トップの人間のやる気次第だなと思ってしまう.

満願

満願(新潮文庫)

満願(新潮文庫)

タイトル通り願いが叶う系の短編集.願いが叶うというと明るい話のように感じるが実態はどちらかというと人間の怖さなどが明らかになるサスペンス的な短編集で夏に読むとちょうど涼しくて良かった.

歴史とは何か

歴史とは何か (岩波新書)

歴史とは何か (岩波新書)

歴史家E.H.カーの本.大学での講義を文字起こししたもので,歴史の記録は当時その記録を残すべきと考えられたものの集まりに過ぎず現存している史料はそういったバイアスが含まれていることなどが書かれている.

日本軍兵士

旧日本軍の軍靴が粗悪品で壊れやすいものだったというエピソードや日中戦争の時期と太平洋戦争末期の時期で兵士の平均身長や平均体重が小さくなっているという統計データひとつひとつが日本軍の生産力の低さを表しているなと感じた.餓死者の割合などを考えても先の戦争は戦う以前の問題だったのではないかと暗澹たる気持ちになる.

香港

最近香港で制定された法律が気になって香港に関するこの本を読んだ.政治的自由はないものの市民生活の自由は充実しているのが香港の特徴のようだ.中国の一地方都市とはひと味違って独自の通貨やパスポートを発行できるなど既存の枠組みにはめ込めない香港の独自性がよくわかった.

アルゴリズムフェアネス

全体的に技術を信じ過ぎているのが気にかかった.Libraのような仮想通貨を問題が起きてから対処法を考えようというのは金融システムに対してあまりにも適当すぎる態度だと思う.

2020年07月の読書記録

今月はコロナ感染が拡大し,台風が発生しないイレギュラーな月だった.そんな7月の読書記録.

技術書編

試して学ぶDockerコンテナ開発

試して学ぶ Dockerコンテナ開発

試して学ぶ Dockerコンテナ開発

今の時代コンテナは避けて通れないのでこの本でDockerの勉強をすることに.RailsやJupyterコンテナを起動しているが,JupyterはともかくRailsを一度動かした経験がないので一つ一つのコマンドの意味が理解できずに詰まってしまう.それでもコンテナはポータビリティの意味で便利だなと再確認.

スターティングGo言語

スターティングGo言語

スターティングGo言語

マイクロサービスだとGo言語で実装されることも多いかなと思いGOの入門書的な本を読んでみた.最初にパッケージにおけるディレクトリ構成やテストに触れられているのがありがたい.Go言語は仕様がシンプルなので次に勉強するときはAPIを作ることを想定して範囲を絞って勉強しようと思う.

みんなのGo言語

以前読んだときは最後まで読みきれなかったのだけど,今回は一番最後のデータベースに接続するところが一番ためになった.データベースに接続するAPIにGo言語が採用されることが多いのかは定かではないけれど.

初めてのGraphQL

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

本当に初めてGraphQLにこの本を通じて触れた.REST APIですらしっかり作りきったことはないというのにいきなりGraphQLに挑んだので読み進めるのが遅いこと遅いこと.本の中ではjavascriptのサンプルコードがあるけれど自分はpythonのgrapheneというライブラリを使って勉強していたので苦労した.javascriptでやれという話ではあるけれどわからないのがjavascriptの文法的な部分かGraphQLの部分かを分けたかったのでいっそ慣れたpythonでやってみようと思ったわけである.いくつか動くコードはかけて雰囲気も掴めてきたので次はデータベースとつなげて複雑なクエリにも対応できるようにしたい.

分散システムデザインパターン

コンテナを使ったデザインパターンのインデックスを作っておこうと読んでみた.Kubernetesのサンプルコードもあって便利.一通り読んでコンテナで例えばバッチ処理を実装しようと思った時に立ち戻ろうと思った.

その他

ストーリーとしての競争戦略

たまたまとった一見非合理な戦略が実は競争力の源泉になることがあり,その戦略は外部から見ると非合理なので真似されず中途半端に模倣した他の会社が自滅していくというパターンは読んでいて面白かった.ただ成功した企業のストーリーを後から聞いたら確かにもっともらしく感じるが,実際は最初からストーリーを固めて事業を始めているものでもないと知り成功する法則を見出すことはできないのだろうなとも思った.

選挙制を疑う

選挙制は民主主義と同義語ではなく時に民主主義にとって有害にすらなりうるというのが基本的考え.古代ギリシャでは市民のみが政治的に平等で選挙で選ばれた市民が入れ替え制で政治を行っていたらしいが現代では現実的ではなさそう.

議院内閣制

イギリスの議院内閣制でも首相のリーダーシップが突出する形に変貌しているらしい.国の数だけ政治制度はあるわけで日本の政治制度の問題点が外国にはないわけではないのだなと感じた.

ファーウェイ と米中5G戦争

ファーウェイと米中5G戦争 (講談社+α新書)

ファーウェイと米中5G戦争 (講談社+α新書)

Googleが中国から撤退してくれたおかげで今中国は5G戦争を戦えているという中国政府高官のコメントが印象的だった.この本の中のフランス人が言っているように結局世界の国々はアメリカに情報を取られるか中国に情報を取られるかを選ぶだけだなと.

ヘルダーリン詩集

ヘルダーリン詩集 (岩波文庫)

ヘルダーリン詩集 (岩波文庫)

世の喝采と人生の半ばが印象的だった.古代ギリシャや自然を礼賛している詩が多いが日本語訳だといまいち雰囲気がわからないのか原文を読んでもこんな感じなのかがわからなかった.

日本社会のしくみ

日本の労働習慣(終身雇用制,年功序列制など)が明文化されずに社会に根付いているしくみだとしてその歴史的経緯を明らかにしている.これはおすすめの本だと思う.戦前の職員がある種特権階級で戦後の混乱期に職員と職工が同じように生活苦に陥る中で会社単位の労働組合が作られた(外国では職能別に労働組合が組織されることが多いらしい)というのが歴史的経緯らしい.この会社別の労働組合があるが職能別の労働組合がないことが転職が一般的でなかったり会社に忠誠を誓って退職金を人質にとられながら年功制の賃金をもらったりするという日本の労働慣習につながっている.この本にも書かれているが社会の仕組みを変えるのは大変そう.

ソフトウェアファースト

ソフトウェア・ファースト

ソフトウェア・ファースト

なぜ日本のITエンジニアがSIerに多いかの仮説が個人的に腑に落ちた.簡単に労働者を解雇できない日本だと自社にITエンジニアを抱え込むのはプロジェクトが終わった後余計な人員を抱えることになって企業的には避けたくて,経営層はIT部門を単なる効率化の手段としか考えず競争力の厳選だと思わないからあまり投資したがらないので外部のSIerに外注していたと.この本に書かれているようなソフトウェアファーストを掲げる企業になるには経営層の強力なコミットが必要そうだなと思った.

終わりに

夏休みも外に出歩けそうにないので読書が捗りそう.

2020年06月の読書記録

入社して90日経った.依然として出社できておらずあまり社会人になったという感覚がない.新型ウイルスに関しては気が滅入るニュースばかりだけれど今月から図書館が再開して本を読めるようになるなどいいこともあった.そんな今月読んだ本たちをまとめておく.

技術書編

ビッグデータを支える技術

ビッグデータという言葉が広まって久しい.この本はビッグデータの処理を支える技術(HadoopとかApache Sparkとか)がどのようなタスクをどのようにして処理しているかを解説している.新卒同期の間でもお勧めされていて,クラウドのサービスが色々ある中でそれぞれのサービスがApacheのどのフレームワークのサービスなのかを理解することで自分の中で整理された気がする.クラウドサービスを使うということは大体の場合タスクを分割して分散処理するということが多いので,クラウドを触る人は読んでおいて損はない気がする.

1から始めるJuliaプログラミング

1から始める Juliaプログラミング

1から始める Juliaプログラミング

薄い本なのにJuliaの内容がぎっしり詰まっている.数年Juliaを触っていても新しい発見があって読んでいて楽しかった.Juliaはいいぞ

データ指向アプリケーションデザイン

分厚くて読むのが大変だった.データベースなどデータを中心に据えて信頼性やスケーラビリティの高い分散システムを設計するにはどのようにすればいいのかということを解説している.データベースエンジンの実装などをしたことがないのでしっかり理解し切れているかは怪しいが,きちんと低レイヤのアルゴリズムなども理解したいなと思える本だった.

Rustプログラミング入門

Rustプログラミング入門

Rustプログラミング入門

  • 作者:酒井 和哉
  • 発売日: 2019/10/13
  • メディア: 単行本(ソフトカバー)

まったくの初心者を対象としたRustの解説書.Rustは型安全性やメモリ安全性などの特徴を持つがその分勉強が大変だなと感じていて.プログラミング初心者を対象にする本だとちょうどいいかなと思って読み始めた.所有権システムなどについてなんとかついていくことができた(と思う).Rustを勉強していて思うのは文法などをある程度勉強した後どうするかということ.システムプログラミングでちょうどいい題材はないのだろうか.

その他

空飛ぶクルマ

空飛ぶクルマ (電動航空機がもたらすMaaS革命)

空飛ぶクルマ (電動航空機がもたらすMaaS革命)

  • 作者:根津 禎
  • 発売日: 2019/04/27
  • メディア: 単行本

空飛ぶクルマについて世界各国の事例が紹介されているのだけれど,個人的には燃費などを考えると空飛ぶ車は採算が取れるか怪しいと考えていてそこらへんの議論がないままに事例だけ並べられている印象を受けた.まあ今のコロナの影響で旅客需要は激減しているだろうから実際に運行されるにしても数年先になりそう.

没落の東京マーケット

バブルの頃は東京に外資金融が結構投資していた時期もあったのだなという発見があった.金融に関していうと東京は世界はおろかアジアでも主要市場というわけではないという事実が印象的だった.食くらいしかアピールポイントがないのは悲しいので明文化されていない規制などを撤廃してかつての勢いを取り戻してほしいと思うが,シンガポールなどに追いつくこともなくこのままずるずると地盤沈下していくのだろうなと思ってしまった.同じ著者の以下の本も興味深かった.

金融失策 20年の真実

金融失策 20年の真実

  • 作者:太田 康夫
  • 発売日: 2018/09/20
  • メディア: 単行本(ソフトカバー)

コルチャック先生

ポーランドユダヤ人のための孤児院を運営し,ナチスポーランドが占領されてゲットーに押し込められても子供たちによる自治を続け,収容所行きの貨物列車において収容所から逃れることもできたのにそれを拒み子供たちと主に収容所行を選んだコルチャック先生の伝記.夜と霧を読んだ時も思ったがこのような時代が数十年前にはあったのが信じられない.

英語の質問箱

この二冊は英語に関する質問が2ページで解説されていて読み物として面白かった.自分も気になる類義語や口語表現,単語の語源など読んでいて楽しい.

終わりに

図書館が再開して読みたい本をある程度読めるようになったことが嬉しい.あまり読書に時間を裂けないのが残念ではあるがなんとか時間を捻出したい.

AWS Solutions Architect Associate に合格した

タイトル通りAWSの認定試験AWS Solutions Architect Associate(以下SAA) に合格した.

f:id:sford:20200621224758p:plain
証明書

合わせてCloud Practitionerにも合格したけれど,ここではSAAについて主に書いていく.

はじめに

なぜSAAを受験したかというと仕事でAWSを触っているからの一言に尽きる.個人的には資格試験の勉強でテキストを読むよりもマネコンやCDKをいじっているほうが楽しいが,そうするとどうしても扱う範囲が狭くなってしまい全体的な視点を見失ってしまうのではないかと感じていた.SAAの勉強を通じて普段触らないサービスについても知ることができたので良かったと終わってみて思った.

勉強方法

ネット上の記事にはいくつも○日の勉強でSAAに合格したという内容のものが存在するが,個人的にはこういった資格勉強に限らず勉強するのにかけた時間はあまり関係がないと考えている(時間は測りやすく比較しやすいので勉強時間を載せる気持ちはわかる)ので勉強方法について簡単に書いておく.

勉強に使ったのは以下の二つ

Cloud GuruのSAA対策講座を見て細かいところは公式ドキュメントやFAQを読み,マネコンで適宜手を動かした後最後にCloud GuruとLinux Academyの模擬試験を受けた状態で本試験を受けた.

試験本番

日本橋の試験センターで受験した.トラブルもなく最後まで問題を解いて一度見直してから提出.自信がない問題が15,6問あったので合格できてほっとした.難易度的にはCloud GuruとLinux Academyと同じくらいだったと思う.

終わりに

次は残りのAssociate系の試験か専門系の試験を受けたいと思うがAWSのサービスにもっと詳しくなりたいので時間が足りない.

2020年05月の読書記録

入社して2ヶ月が過ぎた.リモートワークが続いている中で緊急事態宣言が解除されて来月からどうなるのだろうか.まだ先のことはわからないのでいつも通り読んだ本をまとめておく.

技術書編

日本語入力を支える技術

今もキーボードから日本語でブログを書いている.この日本語入力の技術を解説した本で,日本語変換に適したデータ構造や機械学習アルゴリズムが面白かった.なので日本語入力の本と言うよりもアルゴリズムやデータ構造の応用例として読んだらいいと思う.

Vue.js & Nuxt.js超入門

Vue.js&Nuxt.js超入門

Vue.js&Nuxt.js超入門

研修でWebアプリを作る時にとても役立った.Vue.jsの本を何冊か読んでいたので独特の章構成にもついていけたと思うので他にもっと簡単めな本を読んだ方がスムーズにいくかもしれない.とはいえこの本でVue.jsの導入からNuxt.jsへのステップアップができてさらにaxiosを使って外部APIを呼ぶところまでできるようになるのでWebアプリを作るのに必要な機能は網羅されていると思う.

その他

日本語の作文技術

日報などを書く時に伝わりやすい日本語の文章をどのように書けばいいのかと思って読んだ本.改めて意識し始めると文章を書く難しさを痛感する.

EXTREME TEAMS

Netflixやホールフーズ,パタゴニアなどの企業文化が紹介された本.Netflixは成果を重視する企業文化で今まで貢献してきた従業員であってもこの先貢献できなそうなら容赦無く首を切る企業として有名で,一方ホールフーズは家族のような人間関係を構築する企業として対照的に見えるが,どちらも共通して結果を出している企業という点は共通している.山の登り方は複数あっても頂上は一つだけなのだなと思った.

ユーザインタフェース開発失敗の本質

iPhoneユーザインタフェースは引き算で考えられていて素晴らしいといった話が流れていたりするが,もちろん引き算の重要性はあるものの,アルゴリズムやハードウェアに偏重せずお客さんのアンケート結果よりもお客さんが製品を使っている様子からフィードバックを得ることが重要だといった内容が書いている.

終わりに

振り返ってみると今月はほとんど本を読んでいないことがよくわかる.早く図書館で貸出できるようになって新しい本を読みたい.

EC2上にRuby on Rails+MariaDBの環境構築

はじめに

このGWはデータベースを使ったAPIを作成する勉強をしていた.検索するとlocalhostに環境を作ったりdocker-composeを使って環境を作ったりしている記事が多いが,今回はAWS EC2上にRails ServerとMariaDB Serverを立てることにした.ここにRuby on Railsの環境構築をしたログを残しておく.

Ruby環境の構築

以下EC2 Amazon Linux 2上にRuby環境を構築していく.簡単のためユーザーデータに以下のスクリプトを渡しておく.

#!/bin/bash
yum update -y
yum install -y git

amazon-linux-extrasを使ったインストール(失敗)

Amazon Linux 2にはExtras Libraryというパッケージ群が存在していくつかのプログラミング言語の実行環境をインストールできる.しかしこれを使ってruby2.6をインストールするとruby 2.6の実行環境は作れるのだがRailsのインストールで詰まった.

$ sudo amazon-linux-extras install -y ruby2.6
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
$ gem install -N rails -v 5.2.2
~~省略~~
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    current directory: /home/ec2-user/.gem/ruby/gems/nokogiri-1.10.9/ext/nokogiri
/usr/bin/ruby -I /usr/share/rubygems -r ./siteconf20200506-3653-17qqnkp.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

extconf failed, exit code 1
$ sudo yum install -y ruby-devel rubygem-devel gcc
$ gem install -N rails -v 5.2.2
~~省略~~
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

nokogiri関連でエラーが出ていて色々調べたが結局Railsのインストールはできなかった.

rbenvを使ったインストール

そこでrbenvを通してRubyをインストールする.Qiitaの記事の通りにコマンドを叩くとRubyがインストールできる(最初はコンパイルができなくてインストールに失敗するのでopenssl-devel, readline-devel, zlib-develをインストールしてからrubyをインストールするようにする).

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
# rbenvがインストールできているか確認
$ rbenv -v
rbenv 1.1.2-30-gc879cb0
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh
# ruby2.7.0のインストールを試みる
$ rbenv install 2.7.0
~~省略~~
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/ruby-build.20200506122520.3754.5vaAE7/ruby-2.7.0':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
$ sudo yum install -y gcc
$ rbenv install 2.7.0
BUILD FAILED (Amazon Linux 2 using ruby-build 20200401-9-g3ef704e)

Inspect or clean up the working tree at /tmp/ruby-build.20200506122719.4083.RKzjEW
Results logged to /tmp/ruby-build.20200506122719.4083.log
$ less /tmp/ruby-build.20200506122719.4083.log
~~省略~~
*** Following extensions are not compiled:
-test-/cxxanyargs:
        Could not be configured. It will not be installed.
        /tmp/ruby-build.20200506122719.4083.RKzjEW/ruby-2.7.0/lib/mkmf.rb:471: The compiler failed to generate an executable file.
        You have to install development tools first.
        Check ext/-test-/cxxanyargs/mkmf.log for more details.
dbm:
        Could not be configured. It will not be installed.
        Check ext/dbm/mkmf.log for more details.
gdbm:
        Could not be configured. It will not be installed.
        Check ext/gdbm/mkmf.log for more details.
openssl:
        Could not be configured. It will not be installed.
        /tmp/ruby-build.20200506122719.4083.RKzjEW/ruby-2.7.0/ext/openssl/extconf.rb:97: OpenSSL library could not be found. You might want to use --with-openssl-dir=<dir> option to specify the prefix where OpenSSL is installed.
        Check ext/openssl/mkmf.log for more details.
readline:
        Could not be configured. It will not be installed.
        /tmp/ruby-build.20200506122719.4083.RKzjEW/ruby-2.7.0/ext/readline/extconf.rb:62: Neither readline nor libedit was found
        Check ext/readline/mkmf.log for more details.
zlib:
        Could not be configured. It will not be installed.
        Check ext/zlib/mkmf.log for more details.
~~省略~~
/tmp/ruby-build.20200506122719.4083.RKzjEW/ruby-2.7.0/lib/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- openssl (LoadError)
$ sudo yum install -y openssl-devel readline-devel zlib-devel
# 必要なものをインストールしてからrubyのインストールをやり直す
$ rbenv install 2.7.0
$ $ rbenv global 2.7.0
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]

ここまででRuby 2.7.0の実行環境ができた.

MariaDB Serverの用意

Amazon Linux 2のAMIから立ち上げたインスタンスにはMariaDBが標準でインストールされている.最初mysqlをインストールしようとしていたがうまくいかなかったのと,検証用の簡単なものなのでMariaDBを使うことにした(ちゃんとするならRDSを使えばいいはず).

こちらもQiitaの記事に従ってMariaDB Serverを立てる.

# インストール
$ sudo yum install -y mariadb-server
# 起動
$ sudo systemctl start mariadb
# 有効化
$ sudo systemctl enable mariadb
$ sudo systemctl is-enabled mariadb
# セキュリティ設定
$ sudo mysql_secure_installation

MariaDB Serverを立てたときremote accessを許可する必要がある.そこでMariaDBにログインしてから以下のコマンドを入力してVPC内部のRails Serverインスタンスからアクセスできるように設定する.

$ mysql -u root  -p
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.compute.internal' 
                                IDENTIFIED BY 'some_characters' 
                                WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

Rails Serverを起動

rails newでAPIを作成

APIモードでRailsをセットアップする.

$ sudo yum install -y mysql mysql-client mysql-devel
# railsのインストール
$ gem install -N rails -v 5.2.2
# APIを作成
$ rails new <api-name> --api -d mysql --skip-turbolinks --skip-test
# proxyのためnginxをインストールする.
$ sudo amazon-linux-extras install -y nginx1.12
$ sudo vi /etc/nginx/nginx.conf
$ sudo systemctl start nginx.service
$ rails s

nginxの設定はQiitaの記事を参考にする.

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
-       root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
+           proxy_pass http://localhost:3000;
+           proxy_http_version 1.1;
+           proxy_set_header Upgrade $http_upgrade;
+           proxy_set_header Connection 'upgrade';
+           proxy_set_header Host $host;
+           proxy_cache_bypass $http_upgrade;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
  }

この状態でRails ServerのパブリックIPにアクセスしてもMysql2::Error:ConnectionErrorが出ている.これはデータベースに接続できていないからなので設定を編集する.

Rails configの設定

/config/database.ymlのdefault部分のusername, password, hostを設定する.hostはMariaDB ServerのIPアドレスでusername, passwordはMariaDB Serverの用意のところで作成している.この状態でrails db:createコマンドを使うとdevelopment, testのdatabaseが作成される.この後でrails sコマンドでサーバーを起動してRails ServerのパブリックIPをブラウザで開くとRailsのページが表示されている.

おわりに

ここまででRails Serverが無事起動するようになっている.この後はモデルやコントローラを作成し,マイグレーションしてデータベースの初期データを渡してロジックを書いていけばAPIサーバーとして使えるようになる.