読者です 読者をやめる 読者になる 読者になる

2016年を(いまさら)振り返る

1年の約20%が経過しましたが、皆様いかがお過ごしでしょうか?

今年の目標も20%ほど達成しましたか?

私といいますと、これから今年の目標を定めるために2016年を振り返ろうと思います…!

去年の振り返り

kasei-san.hatenablog.com

Keep

副業はじめました

sugi511.hatenablog.com

  • afri-inc にて、パートタイム&リモートで参加
    • ウガンダ/ケニアの流通市場向けB2Bアプリを作っているスタートアップ
    • 今まで縁が無かったアフリカの生の情報が聞けるのが面白い!
    • やっていること : Rails、ElasticBeanstalk
  • 始めたきっかけ
    • 去年の振り返りで書いた「自分の市場価値」の不安解消のため
    • 当時、自社プロジェクトの内容がレガシーで最新のRailsをさわりたかった
    • そんな時に上記blog記事をtwitterで偶然発見して応募して無事採用していただく
  • やってみてどうだった?
    • それぞれの仕事で得られた知見や文化を、別の仕事に持っていけるのが非常によい!
    • 複数のキャリアを持っているという安心感
      • ノーリスクでスタートアップのお仕事に関われる
    • リモートで好きな時間働くという自由さを知れた
      • 100%リモートのお仕事は無理そう、ということも分かった(仕事をする場だいじ)
    • Rails4やElasticBeanstalkの知見を得られた
    • お小遣いげっと
      • 金銭的余裕 = 心理的余裕 であることを理解

ニンジャ学会続いています

  • ニンジャスレイヤーの論文形式の同人誌「ニンジャ学会誌」を2016年の冬コミから頒布しています
  • 今年の活動
  • やってみてどうだった?
    • 同人活動たのしい!!
      • 自分が欲しい本ができていくというアンソロ主催の楽しさよ…!
      • 自分の本を楽しみにサークルに来ていただいたり、twitterで感想をいただけるとやはりテンションが上がる
      • サークル経由で知り合いが増えた! すごい能力を持った人ばかりで楽しい!
    • 自分自身の理解が深まった
      • 自分の取り柄の一つに「実現能力」があることに気づく
        • 誰かが言った面白そうなアイデアを気軽に実現する
        • みんなが思うほどハードルは高くない
        • 「やってから考える」と思ってやると結構色々実現できるなと気づく
      • 「欲しいものを100%自分自身で作ること」には執着が無いことに気づく
        • 自分は、創作の喜びも知っているが、自分が欲しいものが手に入るという結果の方がだいじ
        • 仕事についても 「とにかく自分で作りたいエンジニア」ではなく、結果が得られればそれで良いタイプなのだと自覚
        • しばらくはそういうタイプのエンジニアとして生きていきます

丘マイル活動はじめました

f:id:kasei_san:20170317175744p:plain

  • 一応閑散期エコノミーで2人でハワイに行ける額溜まった…
  • クレジットカードを10枚くらい作った
  • やってみてどうだった?
    • クレジットカード、色々特典があって楽しい!
      • 特にアメリカンエクスプレスのゴールドカード
        • 初年度無料
        • 複数人で行くと1人が無料になるレストラン予約サービスが良い
    • 気楽に月1程度でカードを作るだけで、結構貯まる
      • 資料請求は電話応対があるので面倒だった…(もうやらない

見た目が改善されました

  • ファッションの組み合わせの悪さや、髪型にについて妻とよく喧嘩になっていた
  • 服装を1種類に絞ることで解決
    • 春秋冬はこれ www.uniqlo.com
    • 夏物はこれのUネックの白 iyec.omni7.jp
      • もう在庫ないのか…
    • ボトムスはジーンズ
    • 春秋用にbeamsできれいめのジャケットを購入
    • 靴下も1種類にして、不揃いで悩むことをやめた
  • 美容院もうまいことやってくれるところが見つかった
    • 2ヶ月に1回訪れて、何も考えず「いつもの感じで」と注文
    • 4ヶ月に1回白髪を染める
  • 考えることが減った

筋トレはじめました

  • もともと痩せ型で、Tシャツとかを着るとガリガリ感が強かった
    • 178cmの63kg
  • 会社にワンダーコアが来たのをきっかけに体型改善のため始める
  • 筋トレポモドーロ
    • 45分仕事をしたら、筋トレ
    • 仕事の途中に体を動かすと頭がスッキリ!
    • 体型も改善されてきた
  • 筋トレを開始したところ、最初痩せた

全体を通して

  • 仕事と趣味の境界がどんどんなくなってきた
    • 余暇で仕事をしたり、趣味での発見を仕事に活かしたり
    • この調子でどんどんなくしていきたい
  • 知り合いが増えた
  • 不必要なことに脳のリソースを割かないように意識するようになってきた
    • 今年はよりそうしていきたい

Problem

英語できない

  • 実家にホームステイしていたオーストラリア人の結婚式に参加したが、コミュニケーションに苦労した…
  • アフリカのビジネスとか、東南アジアではこうとか言ってる割に英語できないの超かっこ悪い

エンジニアとしての能力

  • RailsAWSはできるけど他に知見がない
  • とはいえ最新情報に精通しているわけでもない
  • キャリアが1つという危機感
  • 経験で解決しようとしてしまい、そこに理論が乗っていない

内面の弱さ

  • 自信はついてきたがまだまだ…
  • 高ストレスや高プレッシャー時によろしくない反応をしてしまう

Try

  • オンラインで英語の人相手のプログラムのお仕事にトライしてみたい
    • できたらRails以外で
  • 認知行動療法の本を読む(去年もそう言っていた…
  • 空手やりたい
    • 自信をupさせつ、体型の改善ができそう
  • 考えることを減らしていきたい
    • 定期購入サービス
    • 副業の時間を固定する
    • 得られた時間をよりくだらないこと/頭のおかしいことに使う

数値記録

  • blog: 18記事 : 154ブクマ
  • Qiita : 12記事 : 27いいね

おもったより記事書いていた…

Railsを動かしているElasticBeanstalkにpuma_worker_killerを入れる方法

AWS Elastic Beanstalk Rails

経緯

  • Railsを動かしているElasticBeanstalkでメモリの消費量が増大している
  • 定期的/一定量のメモリを消費したらアプリをリスタートしたい

注意事項

まずはRailsやpumaなどを最新にして、自アプリ以外が原因のメモリリークをなくしましょう

  • っていうか自アプリのメモリリークも無くせるならなくしましょう!

puma_worker_killerって?

schneems/puma_worker_killer: Automatically restart Puma cluster workers based on max RAM available

  • pumaのworkerを定期的/一定量のメモリを消費したらkillしてくれるgem
  • メモリリーク対策によく使われる

方法

1.Gemfilesに追加

group :production do
  gem 'puma_worker_killer'
end

2.設定ファイル(.ebextensions)にて、puma_worker_killerの設定をElasticBeanstalkに入れる

ElasticBeanstalkでは、設定ファイル(.ebextensions)により環境のカスタマイズができる

.ebextensions ディレクトリに、configファイルを置くと、それを読み込んでファイルの追加やコマンドの実行などをしてくれる

なので、ElasticBeanstalkのpumaの設定ファイルに、puma_worker_killer 用の設定を追加するコマンドを書く

  • ./ebextensions/00_add_puma_extend_conf.config
files:
  '/opt/elasticbeanstalk/support/conf/puma_extend_conf.rb':
     mode: "000644"
     owner: root
     group: root
     content: |
       before_fork do
         require 'puma_worker_killer'
         PumaWorkerKiller.config do |config|
           config.ram = 2048 # メモリ量(MB)
           config.frequency = 5    # forkされたpumaのリスタートの時間差(多分
           config.percent_usage = 0.98 # メモリを何%使ったら再起動する
           config.rolling_restart_frequency = 24 * 60 * 60 # 何秒に1回再起動するか(← 24Hに1回)
           config.reaper_status_logs = true #ログ出力(デバッグ用
         end
         PumaWorkerKiller.enable_rolling_restart
         PumaWorkerKiller.start
       end

container_commands:
  00_add_puma_extend_conf:
    command: |
      cat /opt/elasticbeanstalk/support/conf/puma_extend_conf.rb >> /opt/elasticbeanstalk/support/conf/pumaconf.rb
    test: "test ! -e /home/ec2-user/add_puma_extend_conf_done"
  01_add_puma_extend_conf_done:
    command: "touch /home/ec2-user/add_puma_extend_conf_done"
    test: "test ! -e /home/ec2-user/add_puma_extend_conf_done"

解説

files:

container_commands:

  • デプロイ後に実行されるコマンド群を設定
  • ソート順に実行される
  • /opt/elasticbeanstalk/support/conf/puma_extend_conf.rb は、ElasticBeanstalk で参照されるpumaの設定ファイル
    • そこに、files: で追加した、puma_worker_killerの設定を書いたファイルの内容を追加する
    • その後に、空ファイル /home/ec2-user/add_puma_extend_conf_done を作成
  • test: オプションは、戻り値が0以外の場合実行しなくするオプション
    • 空ファイル /home/ec2-user/add_puma_extend_conf_done があったら実行しない
    • 1回puma_worker_killerの設定が追加されたら、もう実行しないようにするため

デプロイ後、ログを見てみる

[30959] PumaWorkerKiller: Rolling Restart. 1 workers consuming total: 99.34765625 mb out of max:  mb. Sending TERM to pid 13411.
[30959] PumaWorkerKiller: Consuming 99.34765625 mb with master and 1 workers.

適当なタイミングで再起動したり、メモリの残量をチェックしてくれている!

「入門 考える技術・書く技術」読んだ

読書メモ

入門 考える技術・書く技術

入門 考える技術・書く技術

この本で何を解決したくて読んだの?

「伝わりやすい」文章を書きたい

どんな本なの?

「論理的に伝わりやすい文章」を書く方法を教えてくれた本

どうすれば、判りやすい文章が書けるの?

以下の方法に従って文章を作れば良い

  1. 読み手が欲しい、主メッセージを探す
  2. 主メッセージから、文章構造を組み立てる
  3. 文章構造をロジックでつなぐ
  4. ロジックでつないだ文章構造から、文章を作り上げる

読み手が欲しい、主メッセージを探す

  • OPQ分析 を使って、読み手の課題を明確にする
    • Objective : 望ましい状況 ( 例 : 相手に伝わる文章が書ける! )
    • Problem : 問題点、現状 ( 例 : 文章が相手に伝わらない )
    • Question : 読み手の疑問 ( 例 : 何か良い方法はないか? )
  • OPQを元に、Questionに忠実で具体的な回答( Anser )を書く (例 : 以下の方法に従って文章を作れば良い )
  • O→P→A を結びつける同一の尺度( レール )を決める
    • 同じ問題でもレールが異なれば、異なるAnserになる。 読み手が求めているレール、OPQをヒアリングすること
    • 「不良資産が見つかった」というPの場合、レールは「不良資産」なのか、「監視体制」なのか?
  • Anserはこの時点では、仮のものでよい

主メッセージから、文章構造を組み立てる

  1. Anserの直接支持するメッセージ( キーライン ) を探す
  2. リストアップした キーライン を元に、Anser を調整する
  3. 逆に、調整したAnser を支持する キーライン を追加/調整する
  4. さらにキーラインを支持する 段落メッセージ を作っていく
    • もし、キーラインが決まらない場合、段落メッセージ を先に列挙し、それをグループ化する方法もある

ポイント : 「so what(それで何が言いたいの?)」を繰り返す

文章構造をロジックでつなぐ

帰納法を使う

  • 帰納法 : 複数の前提から結論を導くロジック展開
    • 例 : 馬Aの心臓は1つ、馬Bの心臓は1つ、馬Cの心臓は1つ → 馬は心臓が1つであろう
    • ビジネス文書のロジック展開の8割は帰納法
    • 前提は 同じ種類の考え であること
    • 主部が同じ、述部が同じ、意味が同じ
    • ピラミッドの上下に「なぜならば」「具体的には」を入れて、しっくり来る文章になるか

演繹法を使う

  • 帰納法 : 前提が正しければ、結論は必ず正しいロジック展開
    • 例 : 馬は哺乳類→哺乳類は心臓が1つ→馬は心臓が1つ
    • 前提が正しいかチェックする

ロジックでつないだ文章構造から、文章を作り上げる

  • ここまでに作ったピラミッドのメッセージをそのまま形にする
  • 文章に置き換えられない場合は、ロジックがおかしいか、メッセージが絞りきれていないか
  • 文章の最後に 次にとるべき行動 を書く

要約メッセージを文章にする時のコツ

「体言止め」「名刺表現」の禁止

  • 見出しではなく、何を言いたいのか?をハッキリさせる
  • ✕「アジアの経済成長率の推移」◯「東南アジア各国はここ5年20%近く経済成長している」

曖昧な表現の禁止

  • ✕「商品の価格が問題である」◯「商品の小売価格にばらつきがありすぎる」

「 しりてが」言葉の禁止

  • メッセージは基本的に1主語、1述語の短文
  • 2つの文をつなげたい場合は、文の論理的な関係が曖昧になってしまうので、英語では「and」は使わない
  • 日本語の場合、「〜し」「〜であり」「〜だが」
  • ロジカル接続詞 を使う
    • 「〜する時に」「〜である一方」「〜であるがゆえに」など

この本を読んだ気づき

  • 自分の文章は
    • 「誰に何をして欲しくて書くか? 」が明確ではなかった
    • 主メッセージと、段落メッセージの列挙で終わっており、キーラインや論理展開が無く、ぼんやりした文章だった

この本を読んだ後どうするの?

  • 上記を意識しながら、ピラミッドを使って文章を書いてみる

かせいさんの開発環境2017

会社で新しいMacBookPro頂いたので、環境構築がてら最近の自分の開発環境を記録してみます

あんまり珍しいものは入れてないですね

GUIアプリ

Vivaldi

  • Chromeベースのwebブラウザ
  • Vimperator に慣れすぎてFireFoxから出れなかった自分を動かしてくれた神ブラウザ
  • cmd-E で開いているタブ、履歴、ブックマークからインクリメンタル検索ができるクイックコマンドが便利すぎる!!
  • 日本語入力がこなれていなかったり、ショートカットキーと、form入力が干渉したりするのが欠点
    • 今後に期待

機能拡張

  • 1Password : パスワード管理
  • Create Link : 現在開いているタブのマークダウンリンクを作れる機能拡張
  • Tab Nullpo+ : タブのopen/close時の挙動をカスタマイズできる機能拡張。新しいタブを今のタブの隣に出したいので使用

Dropbox

  • 定番すぎる
  • 開発では dotfiles の共有がメイン

Evernote

  • こちらも定番
  • 自分用メモに

1Password

  • パスワード管理ツール
  • 思い切って有料版を購入!
    • 買うならAppStoreより、直接オフィシャルサイトで買ったほうがライセンスの取り回しが良いですよ!!
  • lastpassから転向
  • lastpassbasic認証も保持してくれるけど、それ以外の使い勝手は1passwordが上だった

Alfred

  • 普通にランチャーと、クリップボード管理ツールとして使用中
  • 特に凝ったことはしてない

Skich

Iterm2

  • ターミナルエミュレータ
  • 賛否あるけどマウス選択で出力をコピーしたいので使用中
  • 最新版を入れたら長音符 を入力すると勝手にバックスラッシュに変えられてしまうので、 再現しない2.1.4 を使用中

Shiftit

  • ショートカットでwindowを上下左右に寄せたり、別のモニターに移してくれるユーティリティ
  • 主に右をターミナルにして、左をブラウザやSlackにしている場合が多い

KeepingYouAwake

  • スリープしないようにしてくれるユーティリティ -最近は caffeine よりこっちのほうが良いという噂を聞いて移行

CUI

homebrew

  • 楽なのでbrew
  • brew cask は未使用

macvim

brew install macvim --with-lua --with-override-system-vim
  • neovimに移行するかもしれない

vimプラグイン

  • 検討中

rbenv

ついでに nokogiri インストール用メモ

brew install libxml2
brew link --force libxml2
bundle config build.nokogiri --use-system-libraries

direnv

  • .envrc にある環境変数を自動的に読んでくれる
  • bundler--binstubs を使っている場合、以下のようにすると bundle exec が不要になる
PATH_add #{binstubsで指定したPATH}

参考 : mgi.hatenablog.com

ricty

  • 読みやすいフォント
  • オフィシャルのインストール手順がめんどいので、 homebrew でなんとかする
$ brew tap sanemat/font
$ brew install ricty
$ cp -f /usr/local/Cellar/ricty/**/fonts/Ricty*.ttf ~/Library/Fonts/ 
$ fc-cache -vf

参考 : github.com

percol

  • 標準入力で来たものをインクリメンタルに絞り込むツール
  • vimmerだと Unite が感覚的に近い感じ
$ brew install pyenv
$ xcode-select --install
$ pyenv install 3.6.0
$ pyenv global 3.6.0
$ python  —version
$ pip install percol
  • 以下のリンクを参考に、 ^R で history をインクリメンタル検索するようにした

blog.zoncoen.net

autojump

  • j で、最近移動したpathにインクリメンタル検索で移動できる
  • こちらも、上記リンクを参考に設定

tree

  • ディレクトリ構造を樹木図的に表示してくれるコマンド。何かと便利

macに入っている標準をそのまま使っているGUIアプリ

  • git
  • screen

Amazon Elastic Beanstalk でデプロイ時に database.yml に database.example.yml をsymlinkする方法

AWS Elastic Beanstalk Rails

database.yml をgitにcommitしたくないよね... そんな時に

先に方法

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_symlink_database_yml.sh":
    mode: "000777"
    content: |
      #!/bin/bash
      cd /var/app/ondeck/config
      ln -sf database.example.yml database.yml
  • ~/.ebextensions/20_symlink_database_yml.config

概要

デプロイ処理の途中で、database.ymldatabase.example.yml をsymlinkしている

どうやっているの?

~/.ebextensions について

  • Elastic Beanstalkでは、コードの ~/.ebextensions/ に、のデプロイ前後に実行するコマンドや、ファイルを追加するための設定を格納できる
    • ただし、デプロイの途中に何かを挟むことはできない
  • files: は、コードが展開される前に、指定したpathに、content の内容のファイルを設置する

/opt/elasticbeanstalk/hooks/appdeploy/pre/01a_symlink_database_yml.sh について

  • /opt/elasticbeanstalk/hooks/appdeploy/ は、デプロイ時に実行されるシェルが格納されているディレクト
  • 辞書順にシェルが実行されるので、適切な名前のシェルを追加することで、任意の処理をデプロイ処理の途中に紛れ込ませることができる
  • pre/01a_symlink_database_yml.sh の場合、コードを展開した後に実行される
  • /var/app/ondeck は、コードが最初に展開されるディレクト
    • デプロイ処理に成功すると、 /var/app/current に mv される
  • 上記方法は、オフィシャルなドキュメントに明示されている方法ではないので、今後の更新で使えなくなるかも

雑記

  • Elastic Beanstalk的には、 database.yml をcommitして欲しい様子
  • heroku だと、heroku環境用の database.yml を生成してくれる

参考

ロードバランシングしている場合、サーバまたいでもRailsのcookie sessionって保持されるか不安になった時に見るページ

Rails

いつもはkey-valueストアでやっているので、cookie sessionを使うとなった時に心配になったのでメモ

先に結論

sessionは保持される

理由

cookie sessionは、ブラウザ側でsessionの情報を保持して、サーバ側に情報を持たないから

cookieおさらい

cookie : webサーバと、ブラウザ間で情報を管理するプロトコル(RFC6265)

  • key=value で情報を保持
  • リクエスト/レスポンスヘッダでやりとりする
  • 適用範囲 : path, domainを指定可能
    • domain 未指定の場合、発行したdomain上でだけ受信可能
  • 有効期限 : 未指定の場合ブラウザを閉じたら終了

session

webサーバとブラウザで情報を管理する仕組み ログイン情報とか、カートに何が入っているかとか

cookie session

  • sessionの情報をcookieを使って管理する
  • railsでのsessionの管理方法のデフォルト
  • valueは暗号化されて格納される

欠点

  • cookieのサイズ上限は4Kbyte(safariの場合)
  • 大量のデータを保持した場合、通信量が増える
  • ブラウザ側でデータを改変できる

cookie以外のsession管理方法

(やや別件) ロードバランシングした場合、複数サーバを跨ると困るところは?

  • /tmp ディレクトリに一時ファイルを生成して、そのpathをcookieに入れて処理している場合
  • メモリにsession情報を入れている場合(cookieにはsession idのみ)

参考リンク

Amazon Elastic Beanstalk で t2.micro で Rails をデプロイすると、gem install に失敗する件

Rails AWS Elastic Beanstalk

先に結論

原因

bundle install 時に メモリが不足が原因で native extension のビルドに失敗している

エラーメッセージ

An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.

eb-activity.log

  Installing nokogiri 1.6.8.1 with native extensions

  Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

      current directory: /opt/rubies/ruby-2.3.1/lib/ruby/gems/2.3.0/gems/nokogiri-1.6.8.1/ext/nokogiri
  /opt/rubies/ruby-2.3.1/bin/ruby -r ./siteconf20161205-3296-zuwti1.rb extconf.rb 
  Cannot allocate memory - /opt/rubies/ruby-2.3.1/bin/ruby -r ./siteconf20161205-3296-zuwti1.rb extconf.rb 2>&1

swap を大きくするとか回避する方法もあるけれど、お金を惜しんで手間を掛けるのは、PaaS の精神に反しているとおもったので、お金で解決