もちもち奮闘記

新卒3年目の田舎者エンジニア/思ったこととか、趣味の話とか、アウトプットしていく

ISUCONに初めて参加した話 〜事前準備編〜

はじめに

ISUCON10にチーム unselected childrenとして参加しました。

結果は予選敗退となってしまいましたが、個人的に反省点、学びの多く、準備期間も含め、良い時間だったと思います。

今年のISUCON参加にあたっての準備や当日を振り返ろうと思います。

参加までの経緯

会社に入社して3年目、ふと自分って他社と比べてどれくらいの実力なのかなと考える機会が多くなったように思います。

そのタイミングでISUCON10のアナウンスがあり、「面白そう」、「他のエンジニアとの力比べの良い機会かも」と思い、同期2名に声をかけて参加を決めました。

予選1ヶ月前

大体1ヶ月くらい前からゆるゆる始めました。

とはいえ初めて参加するイベント、右も左も分からないので、チームビルディング(みたいな何か)、情報収集を行い、どんな戦略で戦っていくかをチームで一旦考えました。

チームビルディング(みたいな何か)

Discordで通話し、Growiを使って議事をまとめてました。

話したこととしては下記です。 - ISUCONの目標 - 100万の使い道とか考えてました、理由は先を考えた方がワクワクすると思ったからです笑 - チーム名 - 一番時間使った気がしなくもないです。最終的に同期の昔のブログの名前から取りました(デジモン好きだし) - いつ集まって練習するかの確認 - 当日まで1ヶ月ほどしかないので、予め練習予定を立てておきました。 - 練習の仕方として、何度か模擬戦を回し、KPTにて振り返ってみて、次の模擬戦にTRYを実践する方針と定めました。

情報収集

模擬戦やっていくとなったものの、当日のフローも準備しておくべきことも分からなかったのが現状でした。

また僕らのチームは全員がWebアプリケーションメインのため、インフラ、DBに関してのチューニングスキルが足りていないことも認識していました。

そこで僕たちは、すぐには手を動かさず、過去の参加者のエントリーブログなどを読むことからはじめました。

得られたこととしては3つ - 競技開始後1時間をどう使うかが大事であるということ - いろんなチームの使っている便利なツールを知れたこと - 何より、事前にどれだけ準備をするのが大事かということ

どんな戦略で戦っていくかを考える

情報収集をしたのち、僕たちはチームでどう競技時間8時間を使っていくかのベースを考えました。

決めた上で手順化できる部分を手順化する、事前準備によって、当日改修にかける時間を増やせると思ったためです。

こんな感じで各メンバーの事前準備、当日の役割の割当てなどをざっくり行って、あとは練習していこーみたいな流れになりました。

予選1ヶ月前 ~ 残り1週間、模擬戦を通して見えてきた課題

個人練習もあまりやっている時間はないと思ったので、EC2でインスタンスを実際に複数台立てて、本番と同等の環境として過去問をみんなで解くようにしました。(過去問のリポジトリが公開されてるの、ありがたやー)

実際模擬戦を実施して得たもの、課題はそれぞれ下記に書いておきます。

得たもの

  • 事前にGitHubのプライベートリポジトリを用意しておき、事前にやることをISSUEにしておくことで、漏れを防げる。
  • DBとAPPの切り分け、APPの二台構成、その他DB、インフラ周りの簡単な設定方法。
  • LiveShareによる共同開発、個人の開発環境いったん要らないねという結論に
  • newrelicの使い方、ぐう便利でした。

見えてきた課題

  • 圧倒的アプリ側の改修時間の足りなさ
    • DB、インフラでできることは僕らのチームは限られてしまうと考え、基本みんなアプリ側の改修を優先度高く行うようにチーム方針を変更した。
  • 実力不足
    • 並列化や排他処理など、あまりこれまでやらなかったことを求められる場合に手が止まってしまっていた
  • マニュアルの読みこみの不足、コードを読むのに時間をかけてしまう

残り一週間になっても模擬戦のスコアはあまり上がらず、正直しんどかったのでチームで話し合い、残り1週間の練習の仕方を変えた。 - 同じ過去問内容でいったん時間を考えずどこまで上げられるかを試す(目標はその過去問の予選突破スコア) - 8時間の練習内でやりきれなかったこともあるので、いったん進めてみることをやってみた。 - やり方がわかれば、あとは手順かなり、考え方は身につくと思った

そんなふうに進め、前日には無事目標となるスコアを出すことができた。

今回はいったんここで切ります。

当日の振り返りは近いうちに。

2019年の目標宣言

はじめに

新年を迎えて、三が日家からほぼ出ることなく終わりました。寝正月最高、アニメ最高。

そんな自分の今年の目標を宣言して追っていけるようにしようかなと思って今書いてます。

技術的な部分と趣味的な部分の目標立てて公私共に満足出来る1年にしていきたい。

目標の立て方

立てる目標はSMARTである事で実現可能性やその目標を達成したあとの成長が具体的にわかるようになりモチベーション向上に繋がります。

SMARTとは、

  • Specific(具体的に)

    • なるべく抽象的な表現は避ける、「~を頑張るぞい」、何を頑張るの?ってなりますよね。
  • Measurable(測定可能な)

    • いわゆる定量的に評価出来るようにしてというもの。筆者の最も難しいと感じる部分。
  • Achievable(達成可能な)

    • 後に出てくる時間制約を鑑みて、どう考えても達成出来んでしょって目標もあると思います。そう感じてしまった時って焦るかモチベーション落とすかどちらかだと思っています。これなら背伸びして出来そうくらいの目標を考えます。コンフォートゾーンなどの考え方がこれに当たるでしょうか。
  • Related(経営目標に関連した)

    • 今回は会社で立てる目標ではありませんが、今後のキャリアを考えて、今の目標がそれに沿っているかは考える必要があります。
    • 長期的な目標を細かく分解してどこまで達成するかを考える手法を筆者よくします。
  • Time-bound(時間制約がある)

    • いつかやるは一生やりません()時間区切って考える。

技術的な部分

今年はruby、Vue、dockerにより注力していきたいです。またそれ以外の知見も蓄えていき、広い視野を持ったエンジニア目指していきたいです。

  1. ruby silverの取得(半年以内)

    • ruby基礎の習得
    • ruby goldの勉強を半年以内には開始して来年末には取得を目指す
  2. Vueに貢献出来るほどになりたい

    • Vueの基礎的な記述の理解
    • vuesaxなどのOSSコミット
    • 会社の勉強会などでVueの知見を広める。
  3. dockerでRailsの開発環境、ステージング環境、本番環境を作れと言われたら作れるレベルに昇華する

    • サイト見たりとかすれば開発環境を用意できるレベル←今
    • 実際に作ってインフラ詳しい上司にレビューもらいながら作っていく(まずは2ヶ月でコマンド覚えながら第1版作成)
  4. 読書によって得た知見をはてブで残す

    • 月一でアウトプットする

趣味的な部分

趣味の音ゲーに関しての目標をつらつらと(こっちのが定量的に考えれる)

現在 弐寺8段 ボルテ無枠暴龍天(VF9417)・・・暴龍天は最高段位、VFは戦闘力みたいなもの、9417は今の段位から考えると低い方と思います。 DDRレベル10程度

  1. 弐寺10段取る

    • 4月までに9段取得
    • そこから12月までに10段
  2. ボルテ金枠暴龍天目指す

    • 複数の暴龍天の試験全部合格する必要あり
    • VF9,700↑
  3. DDRレベルを上げる

    • レベル12以下で各レベルフルコンボ数を15以上
    • レベル15くらいまではクリアできるようになる
    • 進捗しだいではDPに足を出す

終わりに

目標設定の仕方に始まり、実際に目標宣言までしました。Vueの辺りがまだまだ曖昧部分が多いことが甘いところですね。 立てただけでなく実現のために3ヶ月ごとに進捗おっていきます。

Docker-composeでNuxtとRailsの環境を作った

はじめに

github.com

できたものに関してはgithubで公開しています。 正直これ以上どうすれば良くなるかがわからないのでもっとこうしたほうがいいよとかあれば教えてほしいです。

RailsのPJにwebpackerでVuejsを入れてerbだったりでごりごりフロント書いてみたのですが、

  • backend、frontendでの責務をきちんと分けたい。
  • 拡張性を考えたmicro service的な環境を用意しておきたい。
  • Nuxtjs触ってみたい。

ここを意識して作りました。

工夫

dev側

  • Gemfileやpackage.json書き換え(yarn addコマンドなど)の際、docker-compose buildのする必要が無いように

Dockerfileの書き方によっては、build後、Gemfileの書き換えなどが起こるたびにbuildし直す必要があると知って、開発にとって工数を取るなと感じました。そんな構成にはしたくない、dokcer-compose.dev.ymlに関してはvolumesを使ってlocalのファイルをマウントすることで、適宜コンテナ内のファイルを変更、以下コマンドを実行することでbuildし直すことはありません。

# Nuxtの側でpackage.jsonに変更が
docker-compose run --rm frontend yarn install

# Rails側でGemfileに変更が
docker-compose run --rm backend bundle install

prod側

  • なるべくコンテナのsizeを軽くする(multi-stage build)

Docker ver.17以降、Dockerfileに複数のFROM句を書けるようになりましたが、これが大変便利。 利点として、複数のイメージから必要なファイルだけをコピーしてきて、新たなイメージを作成することが出来る、これに尽きると思います。

NuxtjsのDockerfileを見てみるとわかります。

https://github.com/fussy113/NuxtRails/blob/master/frontend/Dockerfile

見るべきは、

FROM node:8.12-alpine as builder

FROM node:8.12-alpine

似たようなFROM句が2つ書いてあります。

  • (builder) ADD ./ ./ で必要なファイルを追加して、RUN yarn buildを実行している

  • 実行イメージには、以下コマンドで必要最低限のファイルのみ加えている。

ADD package.json ./
ADD nuxt.config.js ./

COPY --from=builder /var/www/node_modules ./node_modules/
COPY --from=builder /var/www/.nuxt ./.nuxt/
COPY --from=builder /var/www/static ./static/

これと同様のこともRails側で行い、それぞれ2/3程度のコンテナサイズにまで縮小できました。

multi-stage build対応前

変更前のコンテナサイズ

multi-stage build対応後

dbコンテナが一番大きくなるという結果に...

終わりに

docker-compose、dockerの勉強も兼ねて良いものができたと思っています。 dbサイズの縮小であったりとかdocker-sync使ってmount部分をもっと早めるとかはできそうですね

晦日に会社の同期とハッカソン的にものづくりしようかなと思っているので、これ使ってなにか作ろうかなと思います。 わくわく

AWSで小規模なwebサーバー環境を構築するための第一歩

やったこと

AWSで以下のRailsアプリのデプロイを目標に設計図を作成しました。

github.com

要件としては、

  1. ActionCableを使ったチャット機能

  2. 画像を投稿する

  3. Mysql(DataBase)を利用する

これらを考慮してAWSの設計図を作りたい。

完成した設計図

f:id:fussy113:20180510012652p:plain

作成した図

補足説明

AWSサービスの各役割

EC2
  • Webサーバー(Nginxをインストール)の役割を担っています。
  • インターネットに接続されています。
  • LocalからはSSH,Webブラウザを利用してアクセスが可能です。
    • ポート80番、22番を開ける必要があります。
RDS
  • DBサーバーとしての役割を担っています。
  • DBはインターネットから直接書き換えられるのは非常に困るので、インターネットからは接続できないサブネットに配置します。
    • Private Subnetと呼ばれます。これを利用することでDBサーバーなど、バックエンドシステムを隠しセキュリティを高めることができます。
  • ローカル環境からDBサーバーにアクセスするためには、

    1. WebサーバーにSSHでアクセス
    2. WebサーバーからDBサーバーにSSHでアクセス

    と、Webサーバーを踏み台にしてアクセスが可能です。

S3 Bucket
  • 写真などの静的コンテンツを保存するストレージとして利用しています。

今後やること

5月中に今回作った設計図を元にデプロイまでを行いたい所存であります。

"Team Geek ―Googleのギークたちはいかにしてチームを作るのか"を読んで

筆者、前回訳も分からぬままみたまま記法で書いたことによりコードの挿入の仕方とかどーすんの?ってなってしまった。 というわけで今回からMarkdownで書いてみますよ。

概要

  • 本を読む習慣をつけたい
  • 来年度から新卒エンジニアとして働く身、何か活かせる知識が欲しい

そんな理由から今回はオライリー・ジャパン出版、

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

を読みました。

(以下、Amazonのサイトから抜粋)


複数のプログラマが関わる場合、優れたコードを書くだけではプロジェクトは成功しません。

全員が最終目標に向かって協力することが重要であり、チームの協力関係はプロジェクト成功のカギとなります。

本書は、Subversionをはじめ、たくさんのフリーソフトウェア開発に関わり、その後Googleプログラマを経てリーダーを務めるようになった著者が、「エンジニアが他人とうまくやる」コツを紹介。

「チームを作る三本柱」や「チーム文化のつくり方」から「有害な人への対処法」まで、エンジニアに求められる社会性について楽しい逸話とともに解説します。


学び

読んでてなるほどなぁと特に思った部分を紹介します。

HRTを知る

  1. 謙虚(Humility)

  2. 尊敬(Respect)

  3. 信頼(Trust)

これらの頭文字をとってHRT

チームで働くときのコミュニケーションシップ、会議進行、マネジメントなどといった全てに対して意識すべき考え方の事です。

自分は優秀と考えすぎず常に向上心を持ち続ける、チームメイトのスキルを認める、チームメイトの行うことを信用する。

プロジェクトが円満に進むための重要なキーであると述べられています。

サーバントリーダーシップという考え方

将来的にエンジニアでありながらマネージャーを目指していきたいと考えていました。サーバントリーダーシップは筆者が目指すべきものの理想ではないかなと読んでて思ったのでまとめておきます。

リーダーと言われて何を想像するでしょうか ?

よく挙げられるのは"支配型"と呼ばれるリーダーですかね。権力のために他者と競争し、社内での地位を確立するために一方的な説明、命令を部下に対して下します。(よく見られるリーダーですが、筆者は未だ漫画上にしかいないんじゃねとか思ってる)

サーバントリーダーシップはこれとは異なるリーダーのあり方です。

奉仕の精神を意識しており、部下を中心に考えた組織運営を行う。

NRTの考え方のもと、高い目標に協力しながら目標を達成、失敗してもそれを学びに変える環境を整備していくのがミッションになります。聞くと素敵ですね。

長期的に見てリーダーは部下の信頼を得ることができ、部下は奉仕的な姿勢を身につけ、会社的にも利益や業務効率化につながる、まさにみんなで幸せになれるリーダーのあり方ではないでしょうか。

総評

全体的にすらすらと読める内容でした。実体験がふんだんに含まれた内容でとてもテンポよく読めました。

入社して2~3年後にもう一度読むとより面白いかも知れませんね。

EC2を利用してRails5アプリをデプロイする Part.1

これまでサーバーのセットアップなどしたことのないひよっこ学生エンジニアがいろいろまとめます。

以下目次です

事前知識

AWSって何?

AWS(Amazon Web Service)は、Amazonが提供する主に企業を対象とした IT インフラストラクチャサービスです。

クラウドコンピューティングの元に成り立っており、必要な時に、必要なだけ、低価格で IT リソースを提供することができることが売りとなっています。

個人契約も可能で手軽に様々なリソース(仮想サーバ、ファイルストレージ、管理ツールとか)を利用することができる。

目標

RailsアプリケーションをAWSを利用してデプロイするまで頑張るぞい。

今回はWebサーバーの構築、SSHでログインするところまで!

さぁやってみよう

AWSコンソールからEC2インスタンスを作成

以下URLでAWSコンソールへ(AWSへのログイン、新規登録は割愛します)

https://console.aws.amazon.com/console/home

 こんな画面が出ると思います。

f:id:fussy113:20180225003904p:plain

 

AWSサービスの下のテキストボックスに入力することでサービスの検索が出来ます。

今回はlinuxの仮想サーバ提供サービス、EC2を使います。

 

f:id:fussy113:20180225004340p:plain

EC2を検索してこんな画面になると思います。真ん中あたりの[インスタンスの作成]を押しましょう。

 

AWSからの質問

なんかいろいろこれから聞かれるのでどんどん答えていきましょう。

Q. OSどうする〜?

A. Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type が無難なのでしょうかね

 

Q. メモリとかCPUとかどうする〜?

A. 学生身分なので無料枠で行きます。

 

Q. 細かい設定して〜

A. はい。筆者はデフォルトで進みました。

 

Q. ストレージいくつ〜?

A. デフォルトで

 

Q. タグ追加して〜

A. 必要そうなら後で追加します。今回はスルー

 

Q. セキュリティ設定して〜

A. 以下画像のように(デフォルトでは上のSSHのみだと思います)

f:id:fussy113:20180225010401p:plain

 

Q. キーペア選んで

A. [新しいキーペアを作成] -> ダウンロードし、好きなディレクトリにおいてください。自分の場合は、Downloadディレクトリにmyaws.pemを落としたので、

mkdir AWS 
mv Download/myaws.pem ./AWS

こんな感じでAWSというディレクトリを作りその中に落としたキーペアを入れました。

ここまで来て[確認と生成]からインスタンスを作成しましょう(少し時間がかかります。)


さあ、起動

結果

f:id:fussy113:20180225013310p:plain

無事にsshで入ることが出来ましたとさ。

結び

インスタンスを無事に作ることができました。次は今回のものをセットアップしていくぞい。

こんな感じで今後も自分の作業の備忘録として挙げていきますので何卒お願いいたします〜