DC4

社内ISUCONに参加した。

そろそろISUCONの時期ですね!

今年は諸事情で参加できそうにないのですが...。

その変わりに(?)とある御縁からこちらの社内ISUCON(通称:ISHOCON)にお邪魔させて頂きました!

http://blog.mmmcorp.co.jp/blog/2016/08/05/ito-time-management/blog.mmmcorp.co.jp

やったことをざっくりと振り返りたいと思います。

言語選択はRuby。 環境は c3.xlarge。

開発環境の整備

  • AWSの構築 / sshの設定
  • ソースのGit管理
  • nginx/MySQLの設定バックアップ
  • vimの設定

アプリケーションの動作確認 (score : 104)

  • 機能の把握
  • 構成の把握

解析ツールの整備

  • kataribe
  • pt-query-diges
  • rack-lineprof
  • slow.logの出力設定
  • ログ退避したりミドルウェアを再起動したりするシェルを作成

準備していた設定ファイルの置き換え(score : 165)

アプリケーション修正 (score : 5569)

  • N+1の修正
  • 事前にJOIN出来る箇所を修正
  • OFFSETを使用している箇所の修正
  • nilを想定していない箇所の修正
  • 未使用カラムの削除

インデックスの追加 (score : 37908)

  • ベンチマークを実行しながら各種追加。
  • インデックスに合わせてクエリを修正。

キャッシュ戦略 (score :51319)

既にredis で実装している方が居たので今回は memchached でやってみることにしました。

ベンチマーク実行前に呼ばれる /initialize 内で必要な集計結果をどんどん乗せて、 最終的にベンチマークが集計時に必要としている特定テーブル以外のクエリ発行を無くしました。

sysctl.confの修正

ISUCON定番ネタですね。
ISUCON4 予選でアプリケーションを変更せずに予選通過ラインを突破するの術 - Hateburo: kazeburo hatenablog

css/imageの非同期読込み

こちらで紹介されていたテクニック。
#isucon 4に参加して予選2日目暫定1位になりました - 酒日記 はてな支店

最終調整

  • nginx, unicorn のプロセス数、workload数の調整
    • unicorn : 9, nginx worker_processes:4 / worker_connections=10240, workload: 10

足掻く (score :52403)

  • テンプレートから空白と改行の除去
  • String.freezeする

結果

f:id:Yasun:20160831175706p:plain

GitHub - yassun/ISHOCON1

反省点

memchached の方がクエリ発行より速いと決めつけてどんどん乗せたのですが、 最終的にボトルネックになってしまいました...。 DBとキャッシュのバランスをとりながら実装するべきでした。

あとはリダイレクトは点数加算されないという点をレギュレーションから見落としていました。

Nginxでセッション操作ができるので、そちらで完結出来るものがあると気が付きませんでした。

自分としてはこれ以上は厳しいと思ったのですが、まだまだやれることが沢山ありました。

ISUCON4 予選 参考解答(Redis版) : ISUCON公式Blog

まとめ

こういったイベントがあると実践的に楽しみながら勉強できるので良いですね。 出題を担当したshowwinさんに感謝です!

今回参加させて頂いたMMMさんではにエンジニアを募集中です!
リモートワークに興味がある方は是非! www.wantedly.com

TOEIC200点台だった僕が600点になるまでにやったこと。

先日3ヶ月間の英語留学が終了しました。

無事目標としていたTOEIC600点を達成する事ができたので、これまでの勉強を振り返ろうと思います。

英語学習を始めた理由

自分は昔からずーっと英語から逃げ続けてきたので勉強開始時の英語力は、中学生以下のレベルでした。

新卒からエンジニアとして働き始め、英語の必要性を常々感じてはいましたが、具体的な勉強は特にやっていませんでした。

当時在籍していた会社でTOEICを受ける事になり、人生で初めて受けたところ、250点くらいでした。

TOEICは4択形式で990点満点です。全部Aで回答しても確率的には同じくらいの点数が取れるので、実質0点ですね。

今後もエンジニアを続けていくに辺り、このままではマズいのでは…?と思ったのが学習を始めたキッカケです。

目標

勉強開始時に漠然と設定した目標は以下のようなものでした。

  • 開発に関連する英語の記事やドキュメントが読めるようになること。
  • GitHubやStackOverflow等で海外の開発者とコミュニケーションがとれるようになること。
  • コンテキストが解っている状態で英語で会話ができること。

ですが、どれくらい勉強すれば上記を満たせるのか解らなかったので、 こちらの記事で「英会話、英文解釈などのスタートライン」と書かれていたTOEIC600点を数値目標にすることにしました。

TOEIC600点レベルに届く最短勉強法(TOEIC600点への道)

やったこと

単語さえ読めればなんとかなるんじゃないのかなーと思い、しばらくは通勤時間にiKnowを使って単語だけを勉強していました。

200時間くらいやった辺から少し変化が感じられ、 以前は英語ドキュメントを見つけるとすぐさまGoogle翻訳を開いていたのですが、 知っている単語を拾いながら読める事が少しずつ増えてきました。

ですが、ある日GitHub上に公開されているライブラリのバグを踏んでしまい、修正後した後にプルリクを出そうとしたのですが、そこで完全にフリーズしてしまいました。

この経験から単語だけではこれ以上先に踏み込めないんだなーということを痛感し、文法の勉強を開始する事にしました。

最初に着手したのはこの本でした。

  • くもんの中学英文法―中学1?3年 基礎から受験まで (スーパーステップ)

中学時代に英語をちゃんとやっていた人ならきっとスラスラ読めると思うのですが.... この時点の私は「三単現のs」さえよく理解できておらず、全然進みませんでした...。

なので以下の書籍に変更しました。

  • ひとつずつ すこしずつ ホントにわかる 中1英語
  • ひとつずつ すこしずつ ホントにわかる 中2英語
  • ひとつずつ すこしずつ ホントにわかる 中3英語

名前の通りとても丁寧で解りやすかったです。

その後、少しだけ詳細に説明されている以下の書籍を読みました。

  • 基本にカエル英語の本 英文法入門 レベル1
  • 基本にカエル英語の本 英文法入門 レベル2
  • 基本にカエル英語の本 英文法入門 レベル3

このタイミングでくもんに再度チャレンジしたところ、スラスラと読むことができました。

その後、理解度の確認&復習するために以下のドリルを2周しました。

  • 【「話せる」ための音声(MP3)DLプレゼント付】 Mr. Evine の中学英文法を修了するドリル (Mr. Evine シリーズ)

中学英文法については大体理解できたと感じていたのでオンライン上で受けられるCASECという試験を受けた所、 TOEIC換算で340点という結果でした。

現実はとても厳しかったです。

この時点で勉強開始から1年以上が経過しており、英語へのモチベーションが途切れそうになっていました。

このタイミングで諦めてしまっては次はないと感じ、色々タイミングが重なったこともあり、会社を辞めてセブへ語学留学することにしました。

セブ島留学

セブは英語留学のメッカと言われるだけあって、たくさんの語学学校があります。 色々サイトを見て探し、良さそうな学校をいくつかピックアップして、留学先を決める前に一度現地訪問することにしました。

フィリピンへ下見に行った。 その1 - こころんだより。

留学中は平均1日/10Hくらいやってました。 今まで開発以外の勉強を長時間するという習慣がなかったので、最初の2週間はとてもきつかったです。

カリキュラムの内容については書くことが出来ないので割愛します。 カリキュラム以外では Rebuild: 122: The Metal Is Dead (tenderlove) のTranscriptを印刷して読んだりしていました。

留学1ヶ月目で受けたTOEICが前回から全然変わっておらず、かなり追い込まれながら勉強していたのですが、

留学2ヶ月目のTOEICでようやく変化が現れ、600点越えを達成する事ができました。

あとフィリピンのTOEIC試験環境は日本に比べるとかなりハードモードです...。

自分が受けた際は以下の様なことがありました。

  • 自分の席が用意されてない。
  • 試験開始が2時間以上遅れる。
  • リスニング音源が音割れしている。
  • リスニングパート中に平気でスタッフがドアの開け閉めをする。
  • 年に一度の盛大なお祭りの日と重なっているにも関わらず、試験日は変更されない。パレードの音がすごい。

まとめ

Rebuild: 125: Toothbrush Can Be Exciting (N, naan) の中で

「日本人で普通に中学、高校と行けば6年間は学ぶ訳ですからね...」

という発言があります。

その貴重な期間を無駄にしてしまった僕は、聞く度に「うわーーーーーー!!!!」と叫びながら枕に顔を突っ伏したくなる衝動に駆られていました。

きっと同じような心境の人は他にも居るのではないでしょうか。

ですが、今回の経験からお金と時間を使えば大人になってもその期間の勉強を取り戻すことが、少なくともTOEICの数字上では可能だという事がわかりました。

学年別TOEIC平均スコアは何点?(高校・高専・大学・大学院)

そしてTOEIC600点を取ったら目標にしてた項目は達成できたのか?という点なのですが、 まだまだ全然足りていないです。 当初に比べると遥かにマシになりましたが、英語坂、まだまだ遠いです...。

今後

今まではTOIECを題材に勉強を行っていたのですが、3月の受験でTOIECからは一度離れよう思います。

その後は技術系の分野と上手く繋げながらの勉強法を模索していきたいと考えています。

おすすめの方法等がありましたら是非教えて下さい。

それでは。

2015年を振り返る。

あけましておめでとうございます。

本来なら振り返っている場合ではないのだけど、
せっかく毎年やっているので今年も振り返ることしました。

Ruby

昨年から引き続きRubyをメインで書いていました。

yasun.hatenablog.jp

yasun.hatenablog.jp

400日くらい休まずコード書いた。

yasun.hatenablog.jp

留学するまで毎日コードを書いてました。

まさかここまで続くとは自分でも思っていなかったです。

Webサービス

今年もネタ的なやつから、

yasun.hatenablog.jp

yasun.hatenablog.jp

実用的なサービスまで色々作りました。

yasun.hatenablog.jp

特にSttendは気合入れて開発したつもりです。
一人で作るのは大変でしたが、学びが多かったです。

ふとももは突貫工事で作ったにもかかわらず瞬間的なPVがSttendより遥かに多く複雑な気持ちになりました。

色々な言語を入門しては放置した。

かなり迷走していました。

色々手を出してみましたが、継続して書いてるのはGoだけです。

ISUCON。

yasun.hatenablog.jp

予選敗退(またもや)。

Backbone.js / Marionette.js なお仕事。

1~2ヶ月程度ですが、jsメインなお仕事を初めて経験しました。

光から闇まで学びが多かったです。

英語と向き合うことにした。

英語を本腰を入れて学ぶことを決めました。

それについての詳細は後でまとめようと思っているので割愛します。

現在フィリピンのセブ島へ移住し、英語留学中です。

毎日暑いです。

退職した。

上記を理由に約4年お世話になった会社を退職しました。

本当に多くの事を学ぶことができました。感謝。

結婚した。

結婚して無職になって海外へ行こう!と申し出を快諾し、

夫より先に海外で就職をしてしまうアグレッシブな奥さんに感謝です。

まとめ。

技術勉強とサービス開発についてバランスよく活動できたと思っています。 技術の勉強と同じくらいにサービスを作る事も好きなので、 今後もこのバランスを大切にしたいです。

去年の今頃からキャリアについて悩むことが多かったのですが、 その結果がまさか異国で年を越すとは思ってもいませんでした。

今年やりたいこと。

仕事と英語学習を両立できる環境を作る。

英語学校を2月中旬に卒業予定なので、3月中頃からお仕事を再開する予定です。 しばらくセブ島に居る予定なのでリモート可能な仕事を中心に探す予定です。

仕事をしながら学校に通ったりと継続して英語学習を行える環境を作りたいと考えています。

もし仕事が見つからなければ、異国でヒモというよくわからない状況になってしまいます...。

深掘りしてみる。

前職で求められていたポジションと、新しい事を学習するチャンスが多かったので、 インフラからフロントまで色々な分野を広く経験することができた一年でした。

一方で、特定の分野を深掘りするという事が少なかったなと感じてます。 来年は特定の分野に集中してしっかり深掘りしてみるのもいいのかなと考えています。

WEBサービス開発している会社/スタートアップにジョインする。

イケてるサービス作りたいです。

今年もよろしくお願いします。

ISUCON5に参加した。

前回

今回も言語はGoを選択しました。

やったこと

開始直後はとりあえずアプリを動作させて、仕様を把握。

その後はツール系の準備やnginxのアクセスログの調整とかをしました。

  • GoAccess
  • htop
  • dstat

前回参加時はGoを全然使ったことがない状態でしたが、 最近バッチ処理を書いたりする際に使用していたので実装を読んだり、クエリをexplainしたりしてました。

感想

前回はミドルウェアやDBのチューニングがスコアを左右し、アプリケーションはシンプルな印象でしたが、 今回はアプリケーションがやや複雑で実装に手を入れなければスコアが伸びないように感じました。

自分のGo経験値が低いので読む事はできるのですが、気の利いた実装がとっさにできなくてもどかしさを感じました。

手に馴染む言語*1の重要性を改めて感じました。

諸事情により来年は出れるか分かりませんが、またリベンジしたいです。

1年間毎日コード書いた。

365日を達成したので振り返り。

エビデンス

f:id:Yasun:20150823181327p:plain f:id:Yasun:20150823181333p:plain

始めたキッカケ

1年前に仕事でRubyを扱う事になり、プライベートでの勉強時間を毎日作るためのキッカケ作りとして始めました。

主にやっていた内容

前半

中盤

後半

全期間

  • その時話題だったり興味があったりした言語、ライブラリ等のハンズオン

継続するために工夫した事

やることを常にメモしておく

PC立ち上げて今日は何をやろうかと考えるのはかなり時間を消費しました。

毎日それをやるのはしんどいのでネット上で興味を持った技術記事等を常に草メモへストックしておきました。

やる時間を決める

日々の業務もあるので、時間を作ることに一番苦労しました。

やる時間をルール化しておくことで、少し強引にでも時間を作り続けることが必要でした。

毎朝のゴミ捨てとおなじ感覚でできるよう、日々の生活の中に組み込むことを心がけました。

感想

全然やる気がない日も当然あって、そんな日でも「とりあえず何かコミットして寝るか」という気持ちでコードを書いているといつのまにかやる気が復活していました。

「やらないとやる気は出ない」ってのは本当でした。

始めた理由にも書いたキッカケ作りとしてはとても有効だと思います。

ただ、旅行中とかお酒飲んだ日とかは結構キツかったです。

得たこと

やる前まではここまで続けられると思っていませんでしたが、 やってみると継続することがそこまで苦痛ではなく、自分の新たな一面を見つけることが出来ました。