pluckをto_hする

products = Product.pluck(:name, :price).to_h

みたいに書くと:nameと:priceのハッシュが作れる。

products[items.name]

でpriceが取れる、pluck便利ですねー。

ハッシュのキーでソートしたい

[1] pry(main)> days = {'2014-05' => 2, '2014-04' => 3, '2014-06' => 1}
=> {"2014-05"=>2, "2014-04"=>3, "2014-06"=>1}
[2] pry(main)> days.sort
=> [["2014-04", 3], ["2014-05", 2], ["2014-06", 1]]
[3] pry(main)> days.sort.values
NoMethodError: undefined method `values' for [["2014-04", 3], ["2014-05", 2], ["2014-06", 1]]:Array
from (pry):3:in `__pry__'

お、valuesが使えない?

[4] pry(main)> days.sort.class
=> Array

sortしたらArrayになってる

[5] pry(main)> days.sort.to_h
=> {"2014-04"=>3, "2014-05"=>2, "2014-06"=>1}
[6] pry(main)> days.sort.to_h.class
=> Hash

to_hでハッシュに戻して

[7] pry(main)> days.sort.to_h.values
=> [3, 2, 1]
[8] pry(main)> days.sort.to_h.keys
=> ["2014-04", "2014-05", "2014-06"]

はい、ソートできてますねー

guardの結果をtmuxに通知する

f:id:kanetann:20140701181646p:plain

Guardfile

notification :tmux,
  display_message: true,
  default_message_color: 'black',
  color_location: %w[status-left-bg pane-active-border-fg pane-border-fg]

default_message_colorがwhiteになってて、見づらいのでblackに変更した。

もちろん、いままでどおり別windowでguardを起動しておく必要はあるけど、tmuxで左右分割しなくてもguardの結果がその場で確認できるのがいい。

terminal-notifier-guardはたまに通知されないので辞めた。

iPhone5s(iOS7.1.1)の電池の減り具合がヤバすぎる件

朝9時頃は100%なのに夕方17時頃になると20%になってたりする。

iPhone6が発売されたら機種変更するつもりだし、設定内容を残しておく。

  • iPhoneの自動ロックを1分に
  • Wi-Fiをオフに
  • Bluetoothをオフに
  • 明るさの自動調節をオフに
  • 明るさを30%くらいに設定
  • メールのプッシュをオフに
  • 位置情報サービスを必要最小限に
  • Appのバックグラウンド更新をOFFに
  • 視差効果を減らすをオンに
  • AirDropをオフに
  • Spotlight検索をオフに
  • 壁紙をダイナミックから静止画に
  • システムサービスを必要最小限に(この近くで人気などをオフに)

linediff.vimに感動した話

AndrewRadev/linediff.vim · GitHub https://github.com/AndrewRadev/linediff.vim

def one
  two
end

def two
  two
  three
end

こんなコードがあってdiffを取りたいときは、それぞれをコピーしたold.rb、new.rbのように2ファイル作ってvimdiffしてました。

linediffなら

def oneから3行分visual選択して:Linediffを実行すると

f:id:kanetann:20140514160602p:plain

このように左端に"1-"が表示され

def twoからendまで4行分visual選択して:Linediffを実行すると

f:id:kanetann:20140514160606p:plain

このように新しいタブが開かれてdiffが見れます、痒いところに手が届いて便利です。

MavericksでCommand + Control + Space

絵文字の候補がでてくるんですね、知らなかった。😄

oh-my-zshでZSH_THEME="random"にしてたけどcandyに戻した話

oh-my-zshを導入して、~/.zshrcに

ZSH_THEME="random"

って書くと起動するたびにランダムでテーマが設定される。

最初はtmuxでpaneを開くたびにテーマが切り替わって、いろんなテーマになるし、カラフルになってテンションあがってたとこもあったけど、

rvmのエラーのようなテーマごとに前提としてるライブラリが導入されてないことによるエラーメッセージがいろいろでてうざかったり、

テーマの組み合わせによってはtmuxの画面描画がおかしくなったりすることがあるのでcandyに戻した。

個人的に2段シェルとgitのブランチが見れれば十分だった。

warning: LF will be replaced by CRLF

git diffするとwarning: LF will be replaced by CRLFと表示され、同じ内容なのに全部変更されてるように見える。

git commitしたファイルがCRLFになっていて、git pullすると手元のmacではLFになっている。

git config --global core.autocrlf
git config -l --global | grep cr

しても何も出力されない。

git checkoutしても、rmしてgit pullしてもmodifiedのままっていう状況に陥ったときは、

  • 元のファイルをLFにしてgit commit > git pushして、問題が起きているPCでgit pull
  • 問題が起きているPCでgit config --global core.autoCRLF falseする

などで対応すればいい。

LFで統一したいがWindowsはCRLFで扱うので、Windowsだけgit config --global core.autoCRLF trueを設定するといい。

robomonogo + SSH多段ポートフォワーディング

多段をよく忘れるのでメモ。

robomongoで踏み台ホストを経由してstaging/productionのmongodbに接続したいときに使う場合の例。

ssh -t user@    ladder.example.com -L 37017:localhost:27017 ssh user@staging.example.com -L 27017:localhost:27017

robomongoでlocalhost:37017で接続。

capistrano-unicornでハマった話

productionで

Mongoid::Errors::NoSessionConfig (
Problem:
  No configuration could be found for a session named 'default'.
Summary:
  When attempting to create the new session, Mongoid could not find a session configuration for the name: 'default'. This is necessary in order to know the host, port, and options needed to connect.
Resolution:
  Double check your mongoid.yml to make sure under the sessions key that a configuration exists for 'default'. If you have set the configuration programatically, ensure that 'default' exists in the configuration hash.):

こんなエラーがでて

  Double check your mongoid.yml to make sure under the sessions key that a configuration exists for 'default'. If you have set the configuration programatically, ensure that 'default' exists in the configuration hash.):

というのでmongoid.ymlが間違ってないか色々見てたけど解決せず。

たまたまunicornのプロセスみてたら

 6143 ?        Sl     0:01 unicorn_rails master --path /dashboard -c /home/kanetann/dashboard/current/config/unicorn.rb -E deployment -D

あれ?-E deployment?productionじゃなくて?

cap production unicorn:show_vars

# Environments
rails_env          "production"
unicorn_env        "production"
unicorn_rack_env   "deployment"

unicorn_rack_env?

sosedoff/capistrano-unicorn https://github.com/sosedoff/capistrano-unicorn

Environment parameters

unicorn_env - Set basename of unicorn config .rb file to be used loaded from unicorn_config_path.
Defaults to rails_env variable if set, otherwise production.

unicorn_rack_env - Set the value which will be passed to unicorn via the -E parameter as the Rack environment.
Valid values are development, deployment, and none. Defaults to development if rails_env is development, otherwise deployment.

unicorn_rack_envが追加されて-Eはそれを使うようになったと

cat config/deploy/production.rb

set :domain,           "foo.example.com"
set :rails_env,        "production"
set :unicorn_env,      "production"
set :unicorn_rack_env, "production" # とりあえず追記してみる
set :app_env,          "production"

role :web, domain
role :app, domain
role :db,  domain, :primary => true

set :deploy_to,   "/home/#{user}/#{application}/"
set :current_path, File.join(deploy_to, current_dir)

これで動いたけど、Valid values are development, deployment, and none. なんだよなあ。。

wildfire.vimをrubyに対応させる

wildfire.vimVim力を下げる - Weblog - Hail2u.net http://hail2u.net/blog/software/vim-wildfire.html

この記事見て感動して、gitlabのapp/controllers/dashboard_controller.rbで試したけどうまくいかなくて、

Doesn't work with vim-textobj-rubyblock · Issue #5 · gcmt/wildfire.vim https://github.com/gcmt/wildfire.vim/issues/5

wildfire.vimのIssue発見して、

.vimrc

NeoBundle 'gcmt/wildfire.vim.git'
NeoBundle 'nelstrom/vim-textobj-rubyblock.git'
NeoBundle 'vim-scripts/matchit.zip.git'
NeoBundle 'kana/vim-textobj-user.git'

runtime macros/matchit.vim

let g:wildfire_objects = {
    \ "*" : ["i'", 'i"', "i)", "i]", "i}"],
    \ "html,xml,mustache" : ["it", "at"],
    \ "ruby" : ["ir", "ar"],
    \ }

こんなかんじで書いたら無事動いた。 いままでやたらvip、vipしてたけど選択範囲拡張する方法わかんないし、Enter, Enterで済んでマジ捗る。

f:id:kanetann:20140304235522j:plain

carrierwaveメモ

carrierwaveuploader/carrierwave https://github.com/carrierwaveuploader/carrierwave

Gemfile

gem 'carrierwave'
gem 'mini_magick'

via console

bundle install --path vendor/bundle
rails g uploader Image
rails g migration add_image_to_photos image:string
rake db:migrate

app/models/photos.rb

class Photo < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

app/uploaders/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  # include CarrierWave::RMagick # アップロード時にstack level too deepエラーがでるのでMiniMagickにした
  include CarrierWave::MiniMagick
  storage :file
  permissions 0666
  directory_permissions 0777
  def extension_white_list
    %w(jpg jpeg gif png)
  end
  version :thumb do
    process :resize_to_fill => [200,200]
  end
end

app/views/photos/_form.html

<%= form_for @photo, :html => {:multipart => true} do |f| %>
  <p>
    <label>My Images</label>
    <%= f.file_field :image %>
    <%= f.hidden_field :image_cache %>
  </p>
  <p>
    <label>
      <%= f.check_box :remove_image %>
      Remove Image
    </label>
  </p>
<% end %>

app/views/photos/show.html(に適当に追加)

    <%= image_tag(@photo.image_url) if @photo.image? %>

その他、strong parametersのpermitted parametersでハマったりして時間かかった。

app/uploaders/***_uploader.rbに設定書くだけで、画像のリサイズやfog経由でs3とかrackspaceに保存できるのが便利そう。

tmuxでcurrentのpaneをズームする

.tmux.confに

bind C-m resize-pane -Z

を書いておくと、ズームのON/OFFをトグルできます。

左paneにvim、右paneにguardを起動してて、guardのログが折り返してて見づらいから、

  • vim落として > 左pane閉じて > ログ見終わったら > pane作って > vim開いて

とか

  • 別windowにguard起動すると、そっちとvimのウィンドウを行ったりきたりしなきゃいけないし一覧性がなくてだるい

といったかんじのひとは、わりと幸せになれるんじゃないでしょうか。

mongoidのCriteria#incでwrong number of arguments (2 for 1)

Mongoid: Querying http://mongoid.org/en/mongoid/docs/querying.html#query_plus

マニュアルのincのところを見ると

Band.where(name: "Photek").inc(:likes, 123)

と書いてあるのでそのまま試すと

ArgumentError:
    wrong number of arguments (2 for 1)

というエラーが出る。

mongoid/contextual/atomic.rbのincを見ると

  # Perform an atomic $inc operation on the matching documents.
  #
  # @example Perform the atomic increment.
  #   context.inc(likes: 10)
  #
  # @param [ Hash ] incs The operations.
  #
  # @return [ nil ] Nil.
  #
  # @since 3.0.0
  def inc(incs)
    query.update_all("$inc" => collect_operations(incs))
  end

って、incsっていうhashを受けてるだけですね、マニュアルが間違ってるっていうワナでした。

Band.where(name: "Photek").inc(likes: 123)

とかけばOK。

factorygirlの変更が反映されない

guard-rspec + springな環境でfactorygirlを編集しても反映されない

guard再起動しても治らなくて、前にもこの問題あった気がする。。と思ってたら、

spring stop

springを一回落とさないとダメっていう。

rails4だとspring使わなくても十分早いので削除した。

たまーにrailsに戻るとハマるパターンでした、言語のスイッチコストってバカにならない。