Rubyでarray.each_index.injectしたときの括弧は配列展開
こういうやつ
animals = { a1: { name: '犬', type: '哺乳類' }, a2: { name: '猫', type: '哺乳類' }, a3: { name: '蜥蜴', type: '爬虫類' } } mammals = animals.reduce([]) do |arr, (id, animal)| # <- ここの丸括弧 (animal[:type] == '哺乳類') ? (arr << animal) : arr end
実用例
「プレイヤーID」と「スコア」を持つハッシュがあるとして
player = { id: 1, score: 100 }
あるチームに所属する「プレイヤー毎のスコア」の合計値を独自に算出して「チームのスコア(≒チームの強さ)」を表したい。スコアの計算方法は、Clash of Clan のクランポイント計算と同様に、チーム内で1〜10位は各プレイヤーのスコアの50%、11〜30位は25%といった感じで係数が変わる。
これを Ruby で実装すると配列をイテレートしながら計算するために inject
を使うことになるが、プログラムを書く上で配列のインデックスが必要な場合は each_with_index
を挟むことになる。
# スコアが高い順にソート players.sort_by { |player| -player[:score] } # チーム内で上位にあるほどスコアを高く評価、51位以下は無視 players.each_with_index.inject(0) do |sum, (player, i)| sum += case i + 1 when 1..10 then (score * 0.50).round when 11..20 then (score * 0.25).round when 21..30 then (score * 0.12).round when 31..40 then (score * 0.10).round when 41..50 then (score * 0.03).round end end
このとき引数に sum, (player, i)
という謎の丸括弧がでてくるが、これは配列を意味する。
players.each_with_index.inject(0) do |sum, arr| sum, player = arr
このコードと同じ意味となり、引数内で展開してくれているだけ。
Macの環境構築自動化 2016年10月版
概要
Mac の環境構築するときに大半の時間を占めるインストール作業を半自動化する系の話。
- Homebrew - Mac用パッケージ管理ツール
- Homebrew Cask - Homebrew を使ってソフトウェアを一括インストールするための拡張
- Homebrew Bundle - 依存関係を Brewfile に書き出し/読み込みできるツール
- mas-cli - App Store のアプリを一括インストール
macOS Sierra を入れるタイミングでクリーンインストールしたいので改めて整理した。
歴史的な流れ
- 2013年末〜2014年初夏にかけて homebrew-cask と homebrew-bundle による自動化が流行る
- 2014年7月に homebrew-bundle が
Warning: brew bundle is unsupported
と出て使えなくなる - オワコンと叫んだり、シェルスクリプトに退化したり、血迷って Ansible 使う人が増える
- 2015年4月に homebrew-brewdler となって帰ってきた
- 2015年7月に mas-cli が産声をあげる
- 2016年初頭、brewdler は bundle という名前に戻った
- 世界に平和が訪れた
構成管理ツールのAnsible は仕事でつかってたけど、わざわざ Mac セットアップのために設定ファイルの書き方思い出したり、調べなおしたりして構築していくのは想像しただけで目眩がする。無駄な苦労を楽しめる人にはいいかもだけど、一般人はついていけない。
これから自動化はじめたい人
brew 自体はすでに入ってるなら tap で homebrew-bundle を使えるようにする
$ brew tap Homebrew/bundle
App Store 経由でインストールしたアプリも管理したいので mas-cli もいれる
$ brew install mas
dump
で現在インストールされているパッケージを Brewfile として書き出すことができる
$ brew bundle dump
ただし、100%全部は書き出せないようなので、/Applications フォルダとにらめっこしながら漏れがないか確認して Brewfile に手動で追記していく。
tap 'caskroom/cask' tap 'homebrew/bundle' tap 'homebrew/core' brew 'go' brew 'mas' brew 'rbenv' cask 'atom' cask 'docker-toolbox' cask 'google-chrome' cask 'google-drive' cask 'google-japanese-ime' mas 'Alfred (1.2)', id: 405843582 mas 'Slack (2.0.3)', id: 803453959 mas 'Xcode (8.0)', id: 497799835
brew search chrome
とか brew search sourcetree
とかすれば記述すべき homebrew-cask 上の正式名称がわかる。AppStore のアプリの場合は、mas list
するか、AppStore のアプリのページのリンクをコピーすれば URL に id が含まれてるのでわかる。
完成した Brewfile は自分の GitHub リポジトリの dotfiles にでも置いておけばいい。 dotfiles/Brewfile at master · jnst/dotfiles · GitHub
Mac で環境構築する手順
新品の MacBook を買ったりクリーンインストールしたら、とりあえず Homebrew をインストールする。次に Safari から自分の GitHub リポジトリにアクセスしてクローンなりコピペなりして Brewfile を持ってくる。Brewfile が存在するディレクトリに移動し brew bundle
も使えるようにして実行する。
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ git clone git@github.com:jnst/dotfiles.git $ cd dotfiles $ brew tap Homebrew/bundle $ brew bundle
あとはインストールを待つだけ。
最近の homebrew-cask
- デフォルトで
~/Applications
ではなく/Applications
にインストールされる - パッケージのインストール先が
/opt/homebrew-cask/Caskroom
から/usr/local/Caskroom
に変わった
メンテナンス作業
- TODO:
brew bundle dump --force
brew bundle cleanup
brew bundle check
El Capitanでgolang 1.7.1の環境構築
インストール
Homebrew からインストール
$ brew update && brew install go
以前はクロスコンパイル用に -with-cc-all
とか --cross-compile-all
というオプションがあったけど今はないみたい
$ brew info go go: stable 1.7.1 (bottled), HEAD (略) ==> Options --without-cgo Build without cgo --without-godoc godoc will not be installed for you --without-race Build without race detector
ワークスペースつくる
Go 言語は単一のワークスペースを使って開発する必要があり go get
をしたときのパッケージも同じ場所に展開される
ユーザディレクトリ直下に go ディレクトリ作るのがベターと思う
$ mkdir ~/go $ vi ~/.bashrc
環境変数とパス
$GOPATH
の定義が必須で、加えて便宜上 PATH
にも追加する
~/.bashrc
に追記
# golang export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
確認
$ go version go version go1.7.1 darwin/amd64
IDE
IntelliJ IDEA の Community エディションをインストールGo Plugin for IntelliJ をいれるCmd + ,
-> Plugins -> Browse repositries -> Go をインストールgofmt
も最初からつかえるCode -> Go Tools -> Go fmt file
goimports
も$GOPATH
にあればつかえる$ go get golang.org/x/tools/cmd/goimports
ファイル保存時に自動適用
Debugger は [delve](https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md) を入れると使える
↑IntelliJ IDEA で Go 言語つかうのは設定がいろいろ必要で面倒くさいから使わない方がいい。
初学者にオススメなのは Visual Studio Code - Code Editing. Redefined で Go プラグインさえインストールすれば自動フォーマットや自動インポートも導入してくれるので使いやすい。
あとは Jetbrains 社が Go 用 IDE を本気でつくったのが JetBrains Gogland: Up and Coming Go IDE で、現在はメールアドレスの登録が必要だけどすぐダウンロードできる。機能的にはこれが最強になると思われる。