僕のための zsh の変数宣言とパラメータと test / let コマンドについてのメモ
*sh の local, typeset, decrare のそれぞれの違いと $@, $* のそれぞれの違いと [, [[, (, (( のそれぞれの違いとその他色々何回ググってもすぐ忘れるので健忘症の可能性がある
— 人間 (@mitukiii) 2014, 5月 3
毎回忘れてはググってというのを繰り返してるので書いとく
変数宣言について
declare local typeset の違いよく分かってない
— 人間 (@mitukiii) 2013, 10月 24
declare は typeset と同じ。local は -g と -f オプションがないこと以外は typeset と同じとのことです。(man zshbuiltins 参照)
— 人間 (@mitukiii) 2014, 5月 3
パラメータについて
$* と $@ は、セミコロンでエスケープした上で他の関数に渡した時に、$* の場合はスペース区切りの文字列となって渡り、$@ の場合は配列で渡るとのことです。エスケープしない場合はどちらも配列で渡るとのこと。
— 人間 (@mitukiii) 2014, 5月 3
test コマンド と let コマンドについて
shell の [[ cond ]] と [ cond ]、( expr ) と (( expr )) の違いよく分かってない
— 人間 (@mitukiii) 2013, 6月 5
@mitukiii '['は testコマンド相当ですが, '[['はそれに加えて &&, ||が使えるるようです。(testだと-a -oになる)。'('は式が書けるだけのようですが、'(('はlet相当のようです。letだと'$'なしで変数を参照できることができるみたいです。
— Syohei YOSHIDA (@syohex) 2013, 6月 5
Ruby で非同期処理をするライブラリ Sidekiq についてのメモ
Ruby で非同期処理をするのに Sidekiq を使い始めた
基本的な使い方については Rails - sidekiqの使い方 - Qiita を見れば分かる
上記記事に書かれてないことについてつらつらと自分用にメモを残しておく
いちいちワーカクラス書かないといけないの
ActiveRecord と ActionMailer に便利メソッドが自動的に生える
Delayed extensions · mperham/sidekiq Wiki
スケジューリングしたい
Scheduled Jobs · mperham/sidekiq Wiki
3時間後に実行したい場合こんな感じ
MyWorker.perform_in(3.hours, 'mike', 1) MyWorker.perform_at(3.hours.from_now, 'mike', 1)
どうせ Sidekiq のデーモン起動しっぱなしならその中で定期処理もさせたい
Sidetiq gem を使う
tobiassvn/sidetiq
毎日実行したい場合こんな感じ
class MyWorker include Sidekiq::Worker include Sidetiq::Schedulable recurrence { daily } def perform # 定期処理 end end
めちゃくちゃ重い処理するワーカがあるんだけど同時に同じ処理走らせたくない
例えばユーザが「最新の情報に更新」ボタンを押したら非同期処理するみたいやつ
連打されたら困る
SidekiqUniqueJobs を使う
mhenrixon/sidekiq-unique-jobs
同じ引数が渡された既に動いてるワーカがある場合無視してくれる
class MyWorker include Sidekiq::Worker sidekiq_options unique: true def perform(id) # めちゃくちゃ重い処理 end end MyWorker.perform_async(1) # 非同期処理 MyWorker.perform_async(1) # 無視される MyWorker.perform_async(2) # 非同期処理
その他便利なサードパーティライブラリ
Capistrano でデプロイ時に ChatWork に通知する拡張書いた
Capistrano でデプロイ時にデプロイの開始/終了/失敗を ChatWork に通知する拡張書いた
使用しているイメージ
使い方
Gemfile
にライブラリを追加
group :development do gem 'capistrano-chatwork', require: false end
config/deploy.rb
でライブラリを読み込み
require 'capistrano-chatwork'
ChatWork の API トークンと通知先の room_id を設定
set :chatwork_api_token, 'YOUR_API_TOKEN' set :chatwork_room_id, 'YOUR_ROOM_ID'
設定
以下の変数が使える
設定が必須の変数
chatwork_api_token
- ChatWork の API トークン
デフォルトはENV['CHATWORK_API_TOKEN']
chatwork_room_id
- 通知先の room_id
メッセージをカスタマイズするための変数
chatwork_deploy_started_message
- デプロイ開始時のメッセージ
デフォルトは"#{user} is deploying #{deployment_name} to #{rails_env}"
chatwork_deploy_finished_message
- デプロイ終了時のメッセージ
デフォルトは"#{user} finished deploying #{deployment_name} to #{rails_env}"
chatwork_deploy_failed_message
- デプロイ失敗時のメッセージ
デフォルトは"#{user} failed deployment of #{deployment_name} to #{rails_env}"
メッセージ内で使えるメソッド
メッセージをブロック(Capistrano 3.x 系の場合は Lambda)で設定すれば以下のメソッドをメッセージ内で使うことが出来る
user
- git の設定または環境変数から取得deployment_name
- capistrano の branch 変数と/あるいは application 変数から取得rails_env
- capistrano の rails_env 変数から取得
メッセージの設定例
Capistrano 2.x 系
set(:chatwork_deploy_started_message) { "#{user} が #{deployment_name} を #{rails_env} にデプロイ開始しました" } set(:chatwork_deploy_finished_message) { "#{user} が #{deployment_name} を #{rails_env} にデプロイ完了しました" } set(:chatwork_deploy_failed_message) { "#{user} が #{deployment_name} を #{rails_env} にデプロイ失敗しました" }
Capistrano 3.x 系
set :chatwork_deploy_started_message, ->{ "#{user} が #{deployment_name} を #{rails_env} にデプロイ開始しました" } set :chatwork_deploy_finished_message, ->{ "#{user} が #{deployment_name} を #{rails_env} にデプロイ完了しました" } set :chatwork_deploy_failed_message, ->{ "#{user} が #{deployment_name} を #{rails_env} にデプロイ失敗しました" }
その他
Capistrano 2.x 系でも 3.x 系でも動くようにするのに少し苦労した
capistrano-resque を参考にした