0

Herokuで同じアプリに2つ目のサーバーを登録する

tiqav-chatを別URLでもう一つ動かした。


ローカルのアプリのディレクトリに移動して、
新しいアプリを作る。(仮に名前をnew_appとする)

% heroku create --stack cedar new_app
Creating new_app... done, stack is cedar
http://new_app.herokuapp.com/ | git@heroku.com:new_app.git


自分が管理してるアプリ一覧を確認。new_appが増えている
% heroku apps


gitにnew_app追加してデプロイ
% git remote add new_app git@heroku.com:new_app.git
% git push new_app master


以後、このローカルgitリポジトリにはサーバーが2つ紐付けられているので、herokuコマンドは–appオプションを付けて対象を指定して実行する。
アドオンを追加したりして1つ目のサーバーと同じ設定にする
% heroku addons:add mongolab:starter --app new_app
% heroku config --app new_app


必要無ければ古いやつを消す
% heroku apps:destroy old_app

1

ターミナルで使うtwitterクライアント作った

1年以上前に作ってずっと使ってた奴を、少し直してrubygemにした。

くわしい使い方はhttp://shokai.github.com/twに書いた。

何か要望あればtwittergithubのissueかblogのコメントでください。

※活用方法をTwのレシピに書きました


インストール

特別なライブラリは使っていないのでMacならすぐインストールできるはず
gem install tw
tw --help



機能

すぐ使えるように名前が短い、インストール・セットアップが楽
表示がカラフル
複数のユーザやリストをマージして表示できる
DM読み書き
public timelineの検索
user stream、filter stream読める。なんかよく切断されるので自動再接続するようにしといた
複数アカウント使える
UNIX pipeからもtweetできる


作った経緯

フルスクリーンのターミナルでプログラミングしてる途中で、たまにtwitterが見たいのだがブラウザを開くと集中力が切れてしまう。
そこでターミナルのままtwitterを見たくなった。
tやtermtterでもいいんだけど複数のlistをまとめて見るのが面倒だった。
俺はlistが見たい。
tw @shokai/arr @shokai/masuilab @shokai/homu @ahokai @shokai_log
のように複数のlistとユーザのtweetをマージしてぱっと見て、すぐ作業に戻るというのをやりたかった。
terminalだと履歴にコマンドがたまるので、ctrl+rしてtwで検索すぐ実行できる。

あとbotにしゃべらせるのにも使いたかった。小さなbotに毎回twitterの機能をつけるのが面倒なので、
echo 'hoge' | tw --user=shokai_log --pipe
で、ユーザを一時的にbotに切り替えつつUNIX pipeでtweetできる。pipeの場合は140文字以上だったら複数回に分けてtweetするようにした。

streamはむかし音声読上げさせたら面白かった(3つのイベントのハッシュタグを同時に把握できた)のでそのうち使いそうだから実装した。

手元だけでなくサーバーにインストールして使うことも想定しているので、インストール・セットアップ・アカウント追加が楽だと良い。
twitterのアプリ毎に10万アカウントしか使えないようになってるけど、一応自分でoauthのアプリ登録してconsumer_keyとsecretを設定ファイルで入れ替えるのも簡単なようにしておいた。
(そもそもそんなに使う人がいるとも思えないけど)


args_parser

複数アカウント使い分けつつもわかりやすいコマンド体系にするためにargs_parserを作った。


json出力モードがあればbot作るのに汎用的に使える物になるかも。

0

DSLでコマンドライン引数をparseできるargs_parserをアップデートした

まずgithub pagesでサイトを作った。

args_parser for Ruby
くわしくは上を見ればわかる。


アップデート内容

コマンドライン引数をparseした後に、validationやfilterをかけれるようになった。
parser側で入力値がチェックできるので、アプリ側でめんどうくさい処理をしなくて済む。

parseスタイルが増えた。
% rackup config.ru --port 5000 --env development
のような–key valueの他に、
% gem install twitter --version=3.7.0
みたいなイコールでつなぐスタイルも選択できる。
自分でスタイルを追加する事もできるようになってる。

順に解説する。

Validator / Filter

filterとvalidatorを追加した。こう書く。

require 'args_parser'
parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u, :default => "http://shokai.org"
arg :help, 'show help', :alias => :h

filter :url do |v|
v.to_s.strip
end

validate :url, "invalid URL" do |v|
v =~ /^https?:\/\/.+$/
end
end
parse後にvalidateブロックが走って引数がチェックされる。
上の例だと引数 –url が正規表現に合わない時にエラーを起こす。


filterは、文字列を小文字にするとか、小数だったら整数に丸めるみたいな下準備に使う。
validateとfilterは何個でも書ける。


validator内のエラーはデフォルトでは
Error: invalid URL (--url hasadfttp://shokai.org)
がSTDERRに表示されて、exit 1される。


これはon_validate_error や on_filter_error を書いておけば横取りできる。exit 1されたくない時にどうぞ。

require 'args_parser'
parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u, :default => "http://shokai.org"
arg :help, 'show help', :alias => :h

filter :url do |v|
v.to_s.strip
end

on_filter_error do |err, name, value|
STDERR.puts "filter error : #{err.class} #{name}=#{value}"
end

validate :url, "invalid URL" do |v|
v =~ /^https?:\/\/.+$/
end

on_validate_error do |err, name, value|
STDERR.puts "validate error : #{err.class} #{name}=#{value}"
end
end

横取り結果
validate error : ArgsParser::ValidationError url=hasadfttp://shokai.org


Style

ArgsParser#parseを呼び出す部分、ブロックしか渡さないと:defaultのstyleが使われる。

parser = ArgsParser.parse ARGV do
しかしコレだとハイフンが頭に付く文字列を引数として渡せない(負の数とか)
そういう時は別のスタイルを選べる。

:style => :equalを渡すとスタイルが変わる。

parser = ArgsParser.parse ARGV, :style => :equal do

2種類のスタイルは
https://github.com/shokai/args_parser/tree/master/lib/args_parser/styles
に入っている。

自分でスタイルを作るときは、parse_style_スタイル名(argv)を定義したArgsParser::Parserを読み込んでからArgsParser#parseを呼べばいい。

0

ピーマン肉詰め

ハンバーグを作ろうとしてたら、間違えて卵の白身を入れてしまった。普通は黄身だけ入れるらしい。
そこでツナギを強化するためにチーズを投入し、ピーマンに詰めたらこれはこれでウマかった(むしろこっちのほうがうまい)

ピーマン肉詰め


材料

ピーマン4個 半分に切る、中の種取り出す

具を作る
ひき肉80g
卵1 白身も入れる
玉ねぎ半分 みじん切り
ピザ用のチーズ 1握り
ネギの青い部分 適当に
にんにく1欠片 みじん切り
パン粉 1握り
オリーブオイル

コショウ
醤油 少し
全部まぜる


焼く

ピーマンに詰めて、肉の面を下にして焼く。フライパンに油はいらない。
厚いのでちゃんと火が通るように中火でゆっくり焼いた。
ピーマン肉詰め

0

Rubyで文字列のレーベンシュタイン距離を計算する

文字列同士がどれだけ似ているかを計算できると便利。
例えば “uri” と “url” の距離は1というふうに計算できるので、名前を間違えた時の候補のサジェストとかに使える。
編集距離とかでググるとみんながんばってRubyで計算してるけど、levenshteinというgemを使ったら簡単だった。

gem install levenshtein

require 'rubygems'
require 'levenshtein'

p Levenshtein.distance("erik", "veenstra")
p Levenshtein.distance("shokai", "shokai")
p Levenshtein.distance("ahokai", "shokai")
p Levenshtein.distance("shokai", "ahokai")
p Levenshtein.normalized_distance("shokai", "ahokai")
p Levenshtein.normalized_distance("mmm", "uiasdfasdfasdfjsklfjasdkljalskdjflk")

7
0
1
1
0.16666666666666666
1.0