読書インフラエンジニアとして、AWSくらいちゃんと触れるようになっておこうかなあと思って手に取った一冊。結果として、とりあえずAWSで簡単な環境を作って動かしてみるという目的にぴったりな一冊でした。書かれていることAWSにおける基本的な機能である、VPC、サブネット、ルートテーブル、EC2、NATなどの知識が一通り学べます。流れとしては、VPC内にパブリック用サブネットとプライベート用サブネット作成し、それぞれにWEBサーバとDBサーバのノードを構築。WEBサーバにApache、DBサーバにはMySQLをインストールして、最終的にはWordpressの環境を構築してインターネットに公開するまでが行えます。ハンズオン形式になっていて、作業自体は半日もあれば終わってしまうと思います。所々に、TCP/IPやDNSといったインフラ周りの説明も盛り込まれていますが、インフラの知識が少ないフロントエンジニア向けの内容なので、既にわかっているというインフラエンジニアの方であれば読み飛ばして問題無いと思います。全体通してAWSの無料枠で試せる内容になっているので、まさに初めてAWSを触ってみるといった人にお勧めできる本です。書かれていないこと実際にシステムを運用する上で必要になるパフォーマンスや構成の考え方、ELB、Route53、VPNなどの話は書かれていません。実践でAWSを活用するためには本書で得た知識を元に追加で勉強が必要になると思います。まとめ個人的にはとりあえずAWS触ってみたい、という目的には非常にあった本だったと思います。本書の内容とは直接関係ないですが、クラウドになることで、これまでのようにサーバ、ネットワークなど個々の専門家といった区切りでは無く、インフラ全体の知識が求められるようになると感じました。Ruby以前にradikoのタイムフリー&エアフリーを保存するする手順を書きましたが、今回はRuby版です。以前、radikoのタイムフリーを保存する方法を書きましたが、今回はエリアフリー対応版です。PassengerでのRails本番環境を作成する手順についてまとめました。centos/7Vagrantfileの以下の部分のコメントアウトを外し、ホストOSの8080番ポートをゲストOSの80番ポートにフォワードするようにします。"127.0.0.1"仮想環境を起動してログインします。sshCentOS7.5の構成OSを更新します。updateSELinuxを無効化します。/etc/selinux/configのSELINUXをdisabledにします。SELINUX=disabledOSを再起動します。インストールまずはrbenvのインストールに必要な各種パッケージをインストールします。gcc-c++続いて、rbenvをインストールします。1.1.1-39-g59785f6rbenvがインストールできたら、Rubyをインストールします。バージョンは、公開しようとしているRailsアプリケーションが指定しているバージョン(2.5.3)に合わせます。[x86_64-linux]bundlerもあわせてインストールします。43e950846)ApacheのインストールApacheをインストールし、自動起動の設定を行います。必要なJavaScriptランタイムとしてnode.jsをインストールします。node.jsはEPELリポジトリから取得するため、Passengerのインストールの最初に実施しているepel-releaseのインストールが前提となっていますので注意してください。nodejsMysqlのインストールMysqlをインストールします。本番環境用のデータベースと接続ユーザを作成します。以下の情報はRailsアプリケションのconf/database.yamlの内容と合わせます。OPTION;Rails環境を構築いよいよ、Railsの環境を構築します。ここでは、github等のリモートリポジトリからファイルを取得する前提としています。アプリケーションのディレクトリを/var/www配下に移動します。Railsと必要なgemをインストールします。ここではpathを指定して、gemをローカルにインストールすることにします。5.2.2Credential情報の管理に使うキー情報をconfig/master.keyに設定します。keyはリモートリポジトリに含まれません。config/master.keyconfig/database.yamlの内容を先ほど作成したmysqlの環境と合わせます。Passwordマイグレーションを行い、本番環境のデータベースを作成します。RAILS_ENV=productionアセットのプリコンパイルを行います。</Directory></VirtualHost>設定を反映させるために、httpdを再起動します。アクセスし、railsアプリケーションにアクセスし正常に動作すれば成功です。エラーが発生した場合は、Apacheのエラーログ(/var/log/httpd/error_log)等を確認して切り分けていくことになります。online.atcoder.jp解法ワーシャルフロイド法をベースにしてその考え方を応用することで解けます。問題を「道路の構造が存在するかどうか」と「存在する道路の長さの和が最小となるようなもの」の二つに分けて考えます。道路の構造が存在するかどうか表Aが「都市間の道路に沿った最短距離を表した表」なので、表Aに対してワーシャルフロイド法を適用し、表内の値が更新されることがあった場合に表Aは矛盾することになります。(iからkへの距離)+(kからjへの距離)のような場合に、表Aはそもそも矛盾することになります。よってそのような組み合わせが一つでもあれば、’-1’を出力して終了すれば良いです。存在する道路の長さの和が最小となるようなものどのような場合に道路が存在しないといけないかを考えます。(iからkへの距離)+(kからjへの距離)のようなkが存在した場合、k経由で迂回しても距離は変わらないので、iからjへの道路は不要ということになります。よって、表のサイズと同じ表を用意しておき、道路が必要か不要かをtrue/falseなどで記憶しておき、最後にtrueな経路の距離だけ加算すればよいです。質量の合計の最大値が3000gに対して、水は100g単位、砂糖は1g単位です。全ての組み合わせを試したとしても間に合います。よって、4重ループで全探索すれば解けます。競技プログラミング今度こそは水色へ、と意気込んだABC113。C完でDも解法はある程度わかったのですが、実装で手間取って例題を通す前に時間切れとなりました。うーん、水色目前で停滞中です。各Hi毎に平均気温とA度との差の絶対値を計算し、それが最小の時のiを出力すればよい。各市を読み込みながら、各県に誕生年を振り分けていく。全て読み込んだら、各県毎の誕生年をソートして各市の順番(x番目)を決定する。最後に各市毎に認識番号を出力していく。いうことで、考え方自体はそんなに難しくないが、誕生年の順番をどのように知るかにちょっと工夫が必要。実装としては、配列とハッシュを使って以下のようにした。各県ごとに誕生年を配列に格納してから最後にソートする。その後、配列を先頭から見ていき、誕生年をキー、順番を値とするハッシュに格納する。認識番号を決める際はこのハッシュを使って誕生年から順番を取得するようにする。online.atcoder.jp解法あと一歩で解けなかったD問題。取りかかってから10分ぐらいで動的計画法を使うっていうのは分かったんだけど、実装に手間取って例5を通すことが出来なかった。この問題のポイントは、動的計画法の漸化式をどうたてるか、と、各縦線の数に対して有効な横線の引き方が1段について何通りあるか、です。漸化式の考え方i番目の行まで横線が引き終わっている時にj列目に存在するときの組み合わせをDP[i][j]とします。(jとj+1の間に線を引くときの組み合わせ)で求められます。例を使って説明します。i+1番目で4列目にいけるのは、i番目で3列目、4列目、5列目にいる場合です。3列目にいる場合は、3列目と4列目の間に横線を引く必要があります。この場合、それ以外の場所については、左側は1、2列目の間、右側は5、6列目の間の横線の引き方の組み合わせとなります。4列目にいる場合は、3列目と4列目、及び、4列目と5列目の間に横線を引いてはいけません。この場合、それ以外の場所については、左側は1、3列目の間、右側は5、6列目の間の横線の引き方の組み合わせとなります。5列目にいる場合は、4列目と5列目の間に横線を引く必要があります。この場合、それ以外の場所については、左側は1、3列目の間、右側はこれ以上横線は引けません。有効な横線の引き方では、あみだくじとして有効な横線の引き方をどう算出するかです。これも漸化式の考え方で求めることが出来ます。縦棒の数がi本の時の一行分の線の引き方をSiとします。このとき、漸化式は以下のようになります。これは、i列目とi+1列目に横棒を引く場合はi-1列目とi列目に横棒は引けないのでそれより左側の組み合わせはSi-1通りとなり、i列目とi+1列目に横棒を引かない場合はそれより左側の組み合わせはSi通りになるためです。ちなみにこれはフィボナッチ数列になります。今回の問題は縦棒は8本までしかないので、数列はハードコードしてしまってます。以下の実装では、左端と右端は場合分けしていますが、両端に0の列を追加すればもう少し綺麗なるかも。MOD結果Cまでは順調だったんですが、Dで躓いてしまいました。Dは動的計画法の漸化式まではある程度思いついたんですが、結局実装しきれませんでした。いえ、動的計画法は苦手分野だったので、途中まで書けただけでも成長したかなという感じです。いずれにせよ、水色手前でなかなか上がれません。400点問題は確実に解けるようにしたいところですね。各数字を1に書き換えるコストが最小になるようにし、その合計を出せば良い。「1に書き換える最小コスト」=「1への最短距離」と考えることが出来るので、事前にワーシャルフロイド法などで最短距離を求めておけば、あとは各Aijについて加算していけばよい。演算子の場所は3カ所で+-の2通りしかない。全パターン試す実装はビット演算で実施。競技プログラミングABCやARCと違うコンテストに参加するのは今回が初でした。KLabさん主催とのことですが、ほぼいつもの問題の感じと同じでしたね。今度こそは水色に、と意気込んだのですが、Cの考察不足で最後までWAが残ってしまいまたもや撃沈でした。整数の数Nはなので、全て列挙する方法だとぜんぜん間に合いません。よってどういう並びが適切かを考えることになります。1、3、5という3つの整数を並べる場合を考えます。なるため、真ん中に3を入れる意味が無くなります。これは降順についても同じです。よって、並べ方のうち3つ以上が昇順(または降順)で現れるものは最適ではありません。ような凸凹の並びになります。この際、整数の数が偶数か奇数かで分けて考える必要があります。そこで実際にNが偶数の場合として6を考えてみます。それぞれの計算結果はとなりますが、両者は並び順が異なるだけなので同じとみなせます。前者を最大にすることを考えた場合、2倍で加算されるやにはなるべく大きい値、2倍で減算されるやにはなるべく小さい値を当てはめるべきです。よって、事前に与えられた整数をソートしておき、大きい方の半分は2倍して加算、小さい方の半分は2倍して減算していけばよいことがわかります。中央値の2つの数については1倍のままにする必要があります。次にNが奇数の場合として5を考えてみます。