2017年2月 開発PC環境
12月にMacbook Pro 2016(Lately) が届いて以降、今までの環境を抹消しゼロから環境構築を始めた。
2ヶ月ほど経ったのでそろそろ環境に慣れ/落ち着いてきたのでメモ程度にまとめようと思う。
基本思想としては、「なるべくシンプル且つモダンな方に寄せる」です。ギークなエンジニアのコンソールとか見てると「すげー」となるけど、そのためにあれやこれやとスクリプトを導入してメンテをするのも面倒なので。
シェル
zshを使用。以前はoh-my-zsh使ってたけど、やたらめったら重いのと、どのツールがどの挙動に影響を及ぼしているのか追うのもめんどくさいくらいもりもりに色々入っていたので、zplugに移行した。
移行に際して、主に以下の記事を読めば概要をつかめる。
fishへの移行も頭をよぎったけどzshに不満はないしエコシステムもzshは豊富なので保留。
CLI
汎用
peco
インタラクティブでインクリメンタルなフィルタリングツール。CLI弱者だけどこれはもうかなり重宝している。 後述するghqとの連携、プロセスのkill, コマンド履歴操作、ブランチの削除などなど使っているものは幅広い。
この記事を書く直前までpeco中の移動に矢印キーを使っていたのだけど、不便なのでvimライクなキーバインドで操作できるように~/.peco/config.json
に以下を記述したのでCtrl+j
とかで操作できるようになった、便利。
"C-j": "peco.SelectDown", "C-k": "peco.SelectUp", "C-q": "peco.Finish", "C-l": "peco.ScrollPageDown", "BS": "peco.ScrollPageUp"
ghq
リモートレポジトリ管理ツール。 まんまこの記事をそのままの設定で使っている。便利すぎか。
gitmoji
一時期前に「commit messageの頭に絵文字をつけよう」という話がバズり、各社/個人ルールで絵文字を定義する記事が乱立した。
atomの開発で絵文字を推奨しているのがことの発端なのかな?
/.git/template
でプロジェクト単位のテンプレ作ったりしてるのが現状だと思うんだけど面倒なのでgitmoji
に任せている。(とはいえ絵文字の選択にもにょりを感じたりはある)
tig
git commit log見たり中身見たり。
web
httpie
curlの代替としてのhttp request client。
hey
パフォーマンスチェック用。以前はboomって名前だったのにheyってなんだheyって。ネームスペース被ってググラビリティを優先したんだろうか
mattn/memo
3日前くらいから使い始めた。
今までmarkdownでちょろっとメモをとりたいときとかは、文章量が多い順にatom, vimを使っていた。
atomはプレビュー見ながら書けるけど起動が重い、vimは起動早いけどプレビュー見れない。
また他のメンバーに共有したい場合、slackにpostするかqiita teamにはるか、何かシェアする手段が必要だった。
mattn/memo
は起動が早く(エディタにvimを使用)、memo serve
で気軽にプレビュー/シェアできる(ローカルサーバー建ててURL共有する)ので重宝しそう。
エディタ
使用頻度で rubymine > vim > atom 。 vimをIDE並の機能にするまでメンテする気が起きなかったのと、gemのソース見るのとかさくっとできるので金の力で解決。JetBrain社に圧倒的感謝。
という状態だったんだけど、2日前にneovim環境を構築し始めた。 今まで vim + neobundle だったんだけどneovim + dein.vimに移行中。Shougoさんは神(使うOSSで一通りShougoさんが登場して本当に足を向けて寝られない)
音楽プレーヤー
iTunes or play music desktop player or vlc。 apple music会員なので洋楽のジャケ買いというかジャケ借りでひたすら好きなジャンルをあさりつつ、高校生までTSUTAYAに通い集めたJ-ROCKなどは全てgoogle musicにアップしているのでplay music頼り、最近flacで取り込むようになってからはvlcで対応している(統一したい)。
仮想OS
pararrel desktop for macが半額くらいでセールで買えたので稀に使う。今日(2/12)もゲリラセールやってて¥5,000しないで買えるようだ。
その他mac用GUIツール
Shiftit
ウィンドウの位置と大きさをシュッと変えるやつ。
alfred
もはやデファクトといえるランチャー。 alfred2時代にPower Support買ってたけど使う機会少なかったのでalfred3では無料の範囲内で使っている。
その他は以下
reizist ~ $ brew cask list 1password cheatsheet licecap shiftit vivaldi alfred dash origin skitch vlc appcleaner duet rstudio slack xquartz atom google-japanese-ime rubymine steam bettertouchtool java sequel-pro the-unarchiver
Amazon Echo Dotが来た
amazon echo dotがやってきたので試した。
何者なのかは
とか
とかを見るとわかる。
一言で表すと凄い音声認識技術付きIoTbluetoothスピーカーという感じで、
「Hey Alexa, play today"s hit on Pandora」と言って音楽を再生させたり「Wake me at 6 am」と言ってアラームをセットしたり、
amazon dash buttonと同じように 「音声」をスイッチャーとしてAmazon lambdaと連携して好きなイベントを発火させることができる。
もちろん普通のbluetoothスピーカーとしても動作するので、iphoneとbluetoothで接続しiphoneから音楽を再生することもできる。
音声認識技術の精度が凄くて、英語ならほぼほぼ認識してくれてよしなに何かしてくれる。 予めサービス連携しておくと接続したサービス内の処理をしてくれるので、iphoneがなくても唐突に音楽を聞けるという体験は最高に未来感がある。 amazon iot buttonと同様、設定を行う方法としてはweb or アプリがあるが、 iosアプリは米国appleアカウントが必要なので手間がかかる。
しかしweb dashboardからでも
連携サービスの設定ができたり、
インターネット上に落ちている「能力」を得ることができたり、
音声認識のフィードバックが送れたりと必要十分感がある。
今はオフィスに一台あるのだけど、音声認識の精度が凄く凄いので家にも一台欲しい。
とはいえ日本での入手はまぁまぁ困難で、メルカリに1st gen が転がっていたりするくらいで、
amazon.co.jpでも在庫切れが続いている状態。
完全にスマートハウス化している各位は買うと捗るんじゃないかな。
macbook airにarch linuxを焼いてデュアルブートする
macbookpro2016が届いてmacbook airが不要になってしまったので、売ろうとも思ったけど大した価格にもならないだろうし、おもちゃにしてみる。 手順はqiitaの記事そのまま行うので都度参照する。
デュアルブートするにはHDDのパーティション等の設定も手動で行わなくてはいけないので、まずはsierraをクリーンインストールしHDDの初期化をする。
- sierraを通常通りインストールし、
- リカバリモードで起動(
⌘ + R + 電源
) し、 - ハードディスクをフォーマットし、
- sierraの新規インストール
の手順で行う。
手元のPCではインストールに30分かかるようだったので、インストールしている間にmacbookproを使ってarch linuxのUSBローダを作った。
公式サイトより最新のISOを落とし、ddで焼く。
sudo dd if=/Users/reizist/Downloads/archlinux-2017.01.01-dual.iso of=/dev/disk2 bs=1m
なお対象USBは diskutil list
で検索し、必要であれば diskutil unmount /Volumes/<name>
しておく。
OSのインストールに時間がかかっているので途中。
低音調理器具ANOVA買った
昨今流行っている低温調理を行うベストプラクティスとして知られるANOVA(The Anova Precision Cooker)を買った。 一言で言うと水温をあげつつ撹拌してくれる物体で、今まで低温調理というとヨーグルト作成機や炊飯器を使って逐一温度を確かめる方法が主流で、各々の工夫が試されていた。 2万程度でその手間が解消されるということで、買わない手はないと話題に。
本日二度目の開封の儀です pic.twitter.com/I1MiCLrRDL
— 夜ご飯 (@reizist) 2016年12月22日
ANOVAには二種類あって、bluetoothだけでスマホ連携するやつ
お料理用 水温制御クッカー/サーキュレーター(スマホと連動して水の温度をコントロール) [並行輸入品]
- 出版社/メーカー: ANOVA
- メディア:
- この商品を含むブログを見る
と、wifiも繋げられる上位互換のやつ
がある。ちなみに2nd gen というのは最新のやつで、ワット数が800W->900Wにあがっているので多少水温を温める能力が上がっている。 とはいえANOVAは「温度調整」にステ振りしてあるので、「温度上昇」はそこまで得意ではない。 自分の場合は温めたい温度-5℃くらいまで普通にコンロで温めてからANOVAを投入し調整をする方法をとればいいかというのと、wifiで接続できることにそこまで魅力を感じなかったのでbluetoothの方を買った。
ちなみに電源部は3Pとなっていて、そのままでも使えると言われているものの電源タップなどの導入が面倒だったので
サンワサプライ 3Pプラグを2Pに変換用アダプタ トラッキング火災予防付きTAP-AD3LT
- 出版社/メーカー: サンワサプライ
- 発売日: 2003/02/01
- メディア: Personal Computers
- 購入: 3人 クリック: 18回
- この商品を含むブログ (1件) を見る
を買って2Pにして使っている。
ANOVAを買って一回目の調理としては、低温調理の代名詞・ローストビーフをやることにした。 美味しい肉の火の入れ方などはぐぐって調べるとして、一旦寝ている間の動作検証も含めて12Hやってみた。
家で肉の表面だけ155℃にするベストプラクティス知りたみ / 絶対に失敗しない肉料理のコツ!「火入れの科学」-[知識編] - Cooking Maniac https://t.co/T9hUO3KsGb
— 夜ご飯 (@reizist) 2016年12月28日
様子です pic.twitter.com/k17LJpKgph
— 夜ご飯 (@reizist) 2016年12月28日
出来上がりとしては最初はこんなものか、という感じで、手間なく今まで手動で作っていたものと同じかそれ以上の肉が作れた、程度の感情。 多分12hが長すぎたというのと、オーストラリア産の雑な肉作ったのでもう少しいい肉で試したい。 次は鶏ハムかなんか作ろうかなー
引っ越してから最高に作業が捗る
引っ越す前は自分の部屋は無くリビングに座椅子が一つあるのみで開発環境としては底辺だった。
今や一人の部屋でソファーやテーブルがあり開発したい時に開発ができて最高、良い習慣はまず環境から
apache drillが凄い
apache drillというツールが凄いので雑に使ってみました。
一言でいうと Treat your data like a table even when it's not なんですけど、もっというと jsonに対してsql実行できたりします。
公式のインストール方法の通りにできますが、
reizist@reizist ~/apache-drill-1.5.0 $ brew search apache-drill [2.3.0] apache-drill
の通りbrew経由でも落とせるみたいですね。
ちょっとサーバーのアクセスログの解析が必要だったんですけど、 気軽にやる方法ないかなーと思って(もっぱら最近はfluentd + kibanaとかBigQueryとかそこらへんが主流ですが)検討した結果、 「ltsv出力してあるnginxログをjsonに変換してapache drillに流す」ことをしてみようと思いました。 awkとか使いこなせる人にはあまり要らないのかな。
まず
gem install ltsv2json ltsv2json production_access_log.log > production_access_log.json
などとしjsonを生成したあとおもむろにapache drillを起動します
reizist@reizist ~/apache-drill-1.5.0 $ bin/drill-embedded [2.3.0] Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0 3 16, 2016 8:36:58 午後 org.glassfish.jersey.server.ApplicationHandler initialize 情報: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26... apache drill 1.5.0 "a drill is a terrible thing to waste" 0: jdbc:drill:zk=local> select * from dfs.`/tmp/production_lb_access.json` where uri='/'; +-----------------------------+-----------------+---------------+-------+---------+------+---------+-------+--------------------------+----------------------------------------------------------------------------------------------------------------+----------+--------+-----------+----------+--------------------+ | time | host | forwardedfor | user | method | uri | status | size | referer | ua | reqtime | cache | runtime | apptime | vhost | +-----------------------------+-----------------+---------------+-------+---------+------+---------+-------+--------------------------+----------------------------------------------------------------------------------------------------------------+----------+--------+-----------+----------+--------------------+ | 14/Mar/2016:05:42:24 +0900 | 111.11.11.111 | - | - | GET | / | 302 | 96 | - | Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 | 0.110 | - | 0.107515 | 0.110 | [censored] | | 14/Mar/2016:06:02:17 +0900 | 111.11.11.111 | - | - | GET | / | 302 | 96 | - | Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) | 0.011 | - | 0.008270 | 0.011 | [censored] | | 14/Mar/2016:06:47:02 +0900 | 111.11.11.111 | - | - | GET | / | 302 | 194 | - | Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12F70 | 0.055 | - | 0.051819 | 0.055 | [censored] | +-----------------------------+-----------------+---------------+-------+---------+------+---------+-------+--------------------------+----------------------------------------------------------------------------------------------------------------+----------+--------+-----------+----------+--------------------+
おぉ凄い便利。
例えば実アクセスログから処理時間がかかっているリクエストを調べたい場合は以下のようにできますね。
0: jdbc:drill:zk=local> select * from dfs.`/tmp/production_lb_access.json` order by runtime desc limit 10; +----------+--------+---------------+------------------+---------+----------+----------+-----------+-------+---------+-----------------------------+----------------------------------------------------------------------------------------------------------------+------------------------+-------+------------------+ | apptime | cache | forwardedfor | host | method | referer | reqtime | runtime | size | status | time | ua | uri | user | vhost | +----------+--------+---------------+------------------+---------+----------+----------+-----------+-------+---------+-----------------------------+----------------------------------------------------------------------------------------------------------------+------------------------+-------+------------------+ | 9.935 | - | - | 111.111.11.11 | POST | - | 9.979 | 9.932773 | 5666 | 200 | 14/Mar/2016:05:12:42 +0900 | Dalvik/1.6.0 (Linux; U; Android 4.4.4; 305SH Build/S0114) | /path/action | - | [censored] | | 9.914 | - | - | 111.111.11.11 | POST | - | 9.963 | 9.911458 | 9185 | 200 | 14/Mar/2016:12:34:58 +0900 | Dalvik/1.6.0 (Linux; U; Android 4.4.2; F-01F Build/V10R22A) | /path/action | - | [censored] | | 10.472 | - | - | 111.111.11.11 | GET | - | 10.472 | 9.910428 | 3611 | 200 | 14/Mar/2016:14:14:02 +0900 | Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 | /path/action | - | [censored] | | 9.901 | - | - | 111.111.11.11 | POST | - | 9.901 | 9.897920 | 8154 | 200 | 14/Mar/2016:14:13:03 +0900 | Dalvik/2.1.0 (Linux; U; Android 5.0.2; SC-05G Build/LRX22G) | /path/action | - | [censored] | | 14.933 | - | - | 111.111.11.11 | POST | - | 14.956 | 9.888321 | 3377 | 200 | 14/Mar/2016:14:39:21 +0900 | Dalvik/1.6.0 (Linux; U; Android 4.4.2; LGV31 Build/KVT49L.LGV3110f) | /path/action | - | [censored] | | 9.884 | - | - | 111.111.11.11 | POST | - | 9.884 | 9.881206 | 5225 | 200 | 14/Mar/2016:13:19:43 +0900 | hoge/1.0.10 CFNetwork/758.2.8 Darwin/15.0.0 | /path/action | - | [censored] | | 9.910 | - | - | 111.111.11.11 | POST | - | 9.910 | 9.869544 | 4398 | 200 | 14/Mar/2016:03:35:00 +0900 | Dalvik/1.6.0 (Linux; U; Android 4.1.2; SBM203SH Build/S0026) | /path/action | - | [censored] | | 10.186 | - | - | 111.111.11.11 | POST | - | 10.215 | 9.869021 | 4168 | 200 | 14/Mar/2016:03:40:30 +0900 | hoge/1.0.10 CFNetwork/758.2.8 Darwin/15.0.0 | /path/action | - | [censored] | | 9.862 | - | - | 111.111.11.11 | POST | - | 9.862 | 9.859476 | 2938 | 200 | 14/Mar/2016:12:30:27 +0900 | Dalvik/2.1.0 (Linux; U; Android 5.1; KYV35 Build/103.0.2e00) | /path/action | - | [censored] | | 9.851 | - | - | 111.111.11.11 | POST | - | 9.871 | 9.847916 | 8592 | 200 | 14/Mar/2016:05:11:59 +0900 | Dalvik/2.1.0 (Linux; U; Android 5.1; KYT31 Build/100.0.1c10) | /path/action | - | [censored] | +----------+--------+---------------+------------------+---------+----------+----------+-----------+-------+---------+-----------------------------+----------------------------------------------------------------------------------------------------------------+------------------------+-------+------------------+
ちなみに上記クエリは3GBのjsonファイルに対して実行しかかった時間は 74.361 seconds
でした。
上記程度であれば例えばNewRelicのようなものがあればこんなことをせずにすみますが、使い慣れたSQLでさらさらと手元で調べられるのは小回りがきいていいですね。
rails+unicornで特定のサーバーだけ異なる設定でunicornを起動する
production環境においてappサーバーと管理画面を同居させていた場合、unicornやnginxの設定を同一のものにしなくてはいけない制限が生まれてしまう。
今携わっているプロジェクトで、通常のappサーバーでタイムアウトを30秒に設定しているため管理画面から行う特別重い処理がタイムアウトが発生して満足に使えない状況が発生した。
このため管理画面を別サーバーに切り出す対応を行ったが、unicornの設定に少しだけ手こずったのでメモ。
task :set_unicorn_config_path do roles(:admin) do |host| set :unicorn_config_path, -> { File.join(current_path, "config", "unicorn", "admin.rb") }' end end before 'unicorn:start', :set_unicorn_config_path
対応内容は上記のみなのだけど、 capistrano3_unicorn
の unicorn.rake
における unicorn:start
にフックしてproductionのみ set_unicorn_config_path
タスクを実行するようにした。 role :admin
に指定したインスタンスは、別のunicornの設定ファイルをつかうことができる。
unicorn:restartからもinvokeされるので、結果 deploy:restart
からでも実行され、
cap deploy
でも cap unicorn:restart
でも上記タスクは実行される。助かる。