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

There's an echo in my head

日々のメモ。

capistrano-bundlerでデプロイしたときにbinstubがどうこうという警告が出る件の対応

bundlerでbinstubしたrailsコマンドやrakeコマンドを使っていると、次のような警告がbin/rails cしたときなどに表示される: Looks like your app's ./bin/rails is a stub that was generated by Bundler. In Rails 4, your app's bin/ directory contains …

Gemfileを分割すればbinstubしたコマンドがもっと早く起動するかと思ったけどそんなことはなさそう

経緯 Gemfileのなかでrailsとcapistranoの両方を書いていたら、capコマンドを実行するたびにrailsを読み込んで無駄じゃないのか?せっかくbinstubしたスクリプトのなかでGemfileを指定してるんだから、それをcapistrano用に分割すればcapコマンドがもうちょ…

`knife solo clean`でキャッシュをクリア

時々knife solo cookを叩いても、ローカルのレシピへの変更が反映されないことがある。 そういうときはknife solo cleanを叩いて以前リモートに転送したレシピを削除し、それから再度knife solo cookを叩くと直ったりする。 $ knife solo clean HOSTNAME $ k…

MySQLでUPDATE+INNER JOIN

UPDATE foo INNER JOIN bar ON bar.id = foo.bar_id SET foo.col1 = bar.col1 WHERE foo.id < 1000; こんな感じ。 ぱっと調べるとFROM句を付けて説明してるページがヒットしたけど、MySQL 5.6では構文エラーになって悩んだ。

natsortというgemを作った

自然順ソートするやつ。 require "natsort" %w(a 02 1).natsort #=> ["1", "02", "a"] PHPからRubyに移ってきた頃にこことか見ながら適当にmixinしてたものをちゃんとgemにしたんだけど、最近はnturallyとかあるのでそっちを使ったほうがよさそうな気もして…

bootstrap_form-datetimepickerというgemを作った

gem

http://rubygems.org/gems/bootstrap_form-datetimepicker Twitter Bootstrap 3.x、bootstrap_formと組み合わせてbootstrap-datetimepickerを使うときのヘルパを提供する。 たとえば、 <%= bootstrap_form_for(@item) do |f| %> <%= f.datetime_picker :avai…

zshでCtrl-Wで/(スラッシュ)までを削除する

zsh

Re: backward killを見て、~/.zshrcにこんな感じで設定した: tcsh-backward-delete-word() { local WORDCHARS="${WORDCHARS:s#/#}" zle backward-delete-word } zle -N tcsh-backward-delete-word bindkey "^W" tcsh-backward-delete-word

capistrano-pendingというgemを作った

http://rubygems.org/gems/capistrano-pending Capistrano 2で使えていたdeploy:pendingというコミットの差分ログを表示するレシピが3になってから使えなくなっていたので、同じ動作をするものを作った。 Capistranoは3.2.0以上が必要。このバージョンからre…

ActiveDecoratorと組み合わせてJbuilderのpartial!を使うとnil?というキーができる

ActiveDecoratorと組み合わせてJbuilderのpartial!を使ったら、次のようにnil?というキーで空のハッシュができていた。 { "nil?": {}, // .jbuilderに書いた通りのキー } これは、partial!したときに裏で呼ばれるrenderメソッドの:localsオプションにjsonオ…

Mavericksでrails-erdが動かない

OS X 10.9 Mavericksに上げてからrails-erdが動かなくなった。エラーも出さずにハングアップする。 対処方法はGitHubのissueに上がってた。一度dot形式で出力してから変換したところ動いた: rake erd filetype=dot dot -Tpdf erd.dot > erd.pdf Generation h…

accepts_nested_attributes_forを多段で使う

複数の関連を跨いでaccepts_nested_attributes_forを使う場合の話。 たとえば Organization has_many Groups Group has_many Employees というモデルに対して、1度にまとめてこれらのレコードを作成したい場合には次のようにする。 まずはクラスの定義: clas…

capistrano-ec2_taggedというgemのv0.1.0をリリースした

以前Capistranoでデプロイ対象のEC2インスタンスをタグで指定するものを書いているという記事で紹介した、capistrano-ec2_taggedというgemをリリースした。 capistrano-ec2_tagged (0.1.0): http://t.co/Bn9FSwBrgb Get ip addresses of AWS EC2 instances f…

Immutable Infrastructure Conference #1に行ってきた

メモ程度。 @naoya_ito 開発プロセスのはなし https://speakerdeck.com/naoya/immutable-infrastructuregakai-fa-purosesuniyu-eruying-xiang-jia-number-immutableinfra (DBも2つのインスタンスにクエリを投げ続けて、片系ずつマイグレートしていくってで…

Rack::Session::Abstract::IDのsecureオプションをリクエストごとに変えられるようにしてみた

a2ikm/rack-dynamic_session_secure RailsのセッションストアではRack::Session::Abstract::IDに渡される:secureオプションの値によってCookieのsecure属性を付けたり外したりできるんだけど、基本的にベタの値*1しか受け付けていない。 これをリクエストに…

WebMockでスタブしつつSSLのOpenID認証を使う

結論からいうと WebMockでHTTP通信をスタブしつつとSSLのOpenID認証を使う場合には次のようにWebMockを設定する必要がある: WebMock.allow_net_connect!(net_http_connect_on_start: true) どういうことかというと ruby-openidはidentifierがSSL(https://か…

OmniAuthでの動的なパスとOpenID認証

とりあえずメモ。 :request_pathオプションと:callback_pathオプション OmniAuthでproviderを宣言する際に:request_pathオプションにProcを渡すことで、デフォルトだと/auth/:providerとなっているリクエストフェーズ開始のパスを動的に設定できる。 たとえ…

Capistranoでデプロイ対象のEC2インスタンスをタグで指定するものを書いている

capistrano-ec2_taggedというgemを作った。まだrubygems.orgには上げていない。 これはCapistranoで指定タグのEC2インスタンスにデプロイのようなことをやるためのもので、次のようにして使う: # Gemfile gem "capistrano-ec2_tagged", require: false, gith…

Rails.loggerのタグで使っているuuidを取得する方法

config.log_tagsで設定できるuuidの値は、ActionDispatch::Request#uuidもしくはレスポンスヘッダのX-Request-Idで取得できる。 この値はRackミドルウェアのActionDispatch::RequestIdで設定されているので、取得するならそれ以降のタイミングである必要があ…

form_forでprefixを指定する

ActionView::Helpers::FormBuilder#form_for(record, options = {}, &block)では:asオプションを指定することで各種フィールドのname属性に付けられるprefixを指定できる。 たとえば@person = Person.newに対して、デフォルトだと = form_for @person do |f|…

2013年を振り返ってみる

モテキは映画版の長澤まさみ派。 1月 千葉で開催された東京Ruby会議10にスタッフとして参加してきた。 見事に大雪で中止…。当日はテンションが上がってて流れに身を任せていたんだけど、あのときこしばさんの下した中止の決断は素晴らしいと今になってわかる…

aws_configというgemを作った

先日*1書きかけだった~/.aws/configをパースしてくれるものをとりあえず動くものにしてgemにした。 http://rubygems.org/gems/aws_config これを使えば次のようにaws-sdkを初期化できる。 require "aws-sdk" require "aws_config" AWS.config(AWSConfig.defa…

30歳になった

30歳になったらなにか変わるのかなあと思っていたけど、特に変わった様子もない。*1 カレーを作ろうと玉ねぎを切っていたら目がしみて「目が、目がぁ!」とムスカを思い描いてほくそ笑んだり、ハチミツとクローバーを読み返していて「修ちゃん、かっこいいな…

StringScannerでAWS_CONFIG_FILEをパースしてくれるものを書いている

書き途中だけどGitHubに上げておいた。a2ikm/aws_config aws-sdkと組み合わせれば適当なツールがかけるようになるかなあと思ったけど、結局aws-cliとjqの組み合わせのほうが早いのかも?

Railsでオフの状態のcheck_boxの値が送信される仕組み

ActionView::Helpers::FormBuilder#check_boxに書かれている内容。 checkboxのチェックがオフの状態だとブラウザはその値を送信しないため、そのままcheckboxがオフになったことをサーバに伝えることができない。 そこでRailsのcheck_boxメソッドは <input name="post[validated]" type="hidden" value="0" />

サブモジュールでgit pullする直前のHEADを知る方法

git

commitするまえなら.git/modules/<MODULE_NAME>/ORIG_HEADに書いてある。 commitしたあとは…まだわからない。</module_name>

iterm_windowでRubyからiTermのタブを開く

iterm_windowを使うとRubyからiTermのタブを開くことができる。 require "iterm_window" ItermWindow.open do open_tab "opened_by_iterm_window" do write "echo 'Hello from iterm_window'" end end iTermはShell > Broadcast Input > Broadcast to All Pa…

lsyncdのstatusファイルからファイル数とかを集計するコマンド

lsyncdの吐き出すstatusファイルをいちいち目で見てどれぐらいdelayしてるか見るのが手間になったので、適当にスクリプトを書いた。 $ lsyncd_status <サブコマンド> サブコマンド 出力内容 delayed キューに残っている全タスク数 active active(実行中)な…

sorceryのcurrent_userにはご注意

2つコントローラで名前空間をわけてそれぞれでcurrent_userを使っている場合には要注意。 sorceryは ActionController::Baseでincludeされてる ログイン中のユーザはcurrent_userヘルパメソッドで呼び出す。このメソッド名の変更はできない ユーザのクラスで…

認証処理を行うsorceryを試してみた

deviseの主にルーティング周りがなんだかよくわからないので、sorceryを試してみた。ソースはgithubにあげたけど参考になるかは微妙。 sorceryはだいたい モデルで認証処理を行うメソッドを提供する 登録時にsalt値の生成とそれによるパスワードの暗号化 Use…

pow+rbenv+bundlerでエラーが出た

"You have already activated json 1.8.0, but your Gemfile requires json 1.8.1. Using bundle exec may solve this."というエラーが出た。 Powのwikiを見ると、config.ruでBundler.setupを呼び出すよう書いてあったけど、それでは直らなかった: # config.…

OSX 10.9 Mavericksへのアップデートでやったこと

osx

Xcodeのアップデートとかはダイアログが出たので、それ以外の個別に細々とやったことのメモ。これはたしかにBoxenとか欲しくなる。 TerminalCopyOnSelectの更新 EasySIMBL 1.5.1に更新 ソースはこちら u-minor/terminalcopyonselectからソースを落としてきて…

RDSの容量減少をSNSでメールを使って通知する

ざっくりとした手順 SNSでトピックを作り、Create Subscriptionから通知先を追加する 通知先には確認のメールアドレスが届くので、Confirmなんちゃらをクリックしておく CloudWatchからCreate Alarmする メトリクスはRDS: Database Meticsを選択 DBInstanceI…

hub pull-requestを楽にするラッパー

ブランチ名を{issue}_hogeってフォーマットにしてる前提で、 使い方: $ pull-request $ pull-request -h develop

yumのリポジトリを追加する

/etc/yum.repos.dにリポジトリの設定ファイルを作れば、その場で有効になる。 例えばTreasureDataのリポジトリ用の/etc/yum/respos.d/td.repoだったら: [treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgch…

rpmファイルの中になにが入っているか確認したり展開したり

一覧を表示する $ rpm -qlp foo.rpm 展開する $ rpm2cpio foo.rpm | cpio -id カレントディレクトリに展開されるので、一つ階層をほったほうがいい。 yumでrpmをインストールして管理させる # yum localinstall foo.rpm もしくはURLを指定して、 # yum insta…

rakeタスク実行時のrails_adminの警告を出力させない

rails_adminをインストールした状態でrakeタスクを実行すると [RailsAdmin] RailsAdmin initialization disabled by default. Pass SKIP_RAILS_ADMIN_INITIALIZER=false if you need it. というログが標準出力に出力される。 何度も表示されるのも煩わしいし…

Homebrewで入れたmysqlを再起動するにはLaunchAgentのKeepAliveをfalseに設定しておく

~/Library/LaunchAgents/homebrew.mxcl.mysql.plistのKeepAliveがtrueになっていると、mysqlのプロセスが止まった時点でlaunchctlが頑張って起動しなおそうとする。 で、mysqlを再起動しようとmysql.server restartするとうまくいかない。stop/startもだいた…

MySQLでインデックスを使っていないクエリをログに書き出す

[mysqld] slow_query_log=1 long_query_time=0.01 slow_query_log_file=/usr/local/var/mysql/slow.log log-queries-not-using-indexes

delayed_job + Rails4 + Capistrano + rbenv

Rails 4(ActiveRecord)でdelayed_jobを使いつつ、それをCapistranoでデプロイする方法のメモ。基本的に本家のWikiに従う。 キューの機能を使う まず必要なgemをインストールしてマイグレーションファイルと実行ファイルを作成する。 # Gemfile gem "delaye…

今更ながらSPDYとWebSocketのServer Pushについて調べてみた

ログの見れないSkypeやっぱ不便だよね→Hubotとかあるし自分でチャット作ったら面白そう→そういやLINEってSPDYなんだっけ→WebSocketってSPDYに乗るんじゃなかったっけ。 というわけでSPDYとWebSocketのServer Pushについてざっくりと調べてみた。 SPDY と Web…

Keychain Accessに登録した鍵付き証明書をp12で書きだす

osx

複数人で一つのApple IDに紐づく証明書を持っていたいときとか。 Keychain Accessの欲しい鍵付き証明書の左にある矢印"▶"をクリックして展開する 証明書に含まれる鍵が表示されるので、展開元の証明書と展開された鍵の両方を選択し、右クリックからExportを…

APNS用の証明書(cerファイル)からパスフレーズ無しのpemを作る

APNS(Apple Push Notification Service)用に発行した証明書(cerファイル)をサーバ側で保持しておく際にはパスフレーズを外したpemにしておきたい。というわけでその手順を毎回忘れるのでメモっておく。 以下はDistribution用の証明書(aps_production.ce…

nginxにreloadシグナルを送っても設定を再読み込みしてくれなかったりなかなかKILLされなかったり

nginxはreloadシグナルを送れば設定だけを再読み込みしてくれる。 # /usr/sbin/nginx -s reload ただ今回は何度実行しても再読み込みをしてくれなかった。仕方がないのでstop/startで再起動しようとした。 # /usr/sbin/nginx -s stop # ps -ef | grep nginx …

Capistrano2でsharedにシンボリックリンクするディレクトリを追加する

Capistranoではリリース間でファイルを共有するためにいくつかのディレクトリがshared/以下にコピーされ、そちらにシンボリックリンクをはるようになっている。たとえばpublic/assetsとかlogとか。 この仕組は任意のディレクトリに対しても使うことができる…

callの返り値とRack::Response.newの引数の順序

callの返り値の順序とRack::Response.newの引数の順序が違ったのでメモ。*で展開できたら楽だったのになあ。 class GreatMiddleware def initialize(app) @app = app end def call(env) result = @app.call(env) response = Rack::Response.new(result[2], r…

UIBarButtonItemに独自の画像を使う

目的の画像をmyButton.png、1x1透過pngをtransparent.pngとする。 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"myButton"] style:UIBarButtonItemStylePlain target:aTarget action:anAction]; [item setBackgro…

Homebrewでmkpasswd

パスワードを生成するならmkpasswd、ということでHomebrewで入れた。mkpasswdはexpectのなかに入ってる。 $ brew tap Homebrew/homebrew-dupes $ brew install expect --with-brewed-tk --with-brewed-tkを付けないとエラーが出る。 $ mkpasswd 6oGLnjf8= 英…

Homebrewで入れたFFmpegでaifをoggに変換する

まずインストール。色々オプションをつけてるけど、--with-libvorbisだけでいけるはず。 brew install ffmpeg \ --with-fdk-aac \ --with-freetype \ --with-libvo-aacenc \ --with-libvorbis \ --with-libvpx \ --with-opencore-amr \ --with-openjpeg \ --…

64bitの符号なし整数型uint64_tをObjective-Cで扱う

Tweetのidが64ビットになってたので。 NSNumberから取り出すにはunsignedLongLongValueを使う: uint64_t tweetId = [tweetIdNumber unsignedLongLongValue]; 逆にNSNumberに変換するにはnumberWithUnsignedLongLong:もしくはinitWithUnsignedLongLong:を使う…

PostgreSQLでシーケンスオブジェクトを最大IDに合わせて更新する

PostgreSQLについてよくわかってないので、間違っている可能性も否めない IDを指定してINSERTした場合にはシーケンスオブジェクトが更新されないっぽい。 たとえばfixtureなどから初期データをseedしたときなんかにIDがベタ書きされていると、あとあとレコー…

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。