アーカイブ
‘Tech’ タグのついている投稿
\r\nのファイルが混じっているので\nに直すワンライナー
2012 年 5 月 9 日
コメント 2 件
newgemで生成したgemのテンプレートに改行コードが\r\nのものと\nのものが混じっているのが気持ち悪いので、全部\nに統一した。
find * | xargs -n1 ruby -e 'lines = open(ARGV[0]).read.gsub(/\r\n/, "\n"); open(ARGV[0],"w+").write lines'
実行したディレクトリの中のファイルの改行コードが\nになる。
Bundler.requireがエラー出すので、プロジェクトローカルにgemを入れた
2012 年 5 月 9 日
コメントはありません
とある環境でbundle installしてsystemにインストールされたrubygemを使う様にしたら、Bundler.requireがエラー出すようになった。
bundler-1.1.3/lib/bundler/runtime.rb:77:in `require': private method `gsub' called for nil:NilClass (NoMethodError)
プロジェクトローカルにインストールしたらエラーが出なくなった。
bundle install --path gems
■Bundler
最近はbundlerというgemの管理機構が使われている。
Gemfileというテキストファイルを作って、プロジェクトで使用するRubygemsを書いておく。
Gemfile
source :rubygemsバージョン指定ができる。
gem 'sinatra', '>=1.3'
gem 'twitter'
gem 'oauth', '0.4.5'
gem 'json'
bundle installrubygemsに公開されていないgitリポジトリを指定したりもできるし、一発で全てのgemがインストールできるので開発環境から本番環境にデプロイするのに便利。
メジャーバージョンアップで仕様が大きく変わったgemがあっても問題ない。
require 'rubygems'これでGemfileに書かれたgemがrequireされる。
require 'bundler/setup'
Bundler.require
require 'yaml'
yamlみたいな標準で入ってるgemは自分でrequireしないとならないっぽい。
簡単なon memory cacheを作った
2012 年 5 月 8 日
コメントはありません
tmp_cacheというgemを作った。
■インストール
gem install tmp_cache
■使い方
cacheなので、memcacheのように有効期限を指定できる。
60秒間生きるキャッシュの場合、61秒後はnilになる
#!/usr/bin/env rubyTmpCacheはグローバルにどこからでも読めるので便利
require 'rubygems'
require 'tmp_cache'
TmpCache.set('name', 'shokai', 60) # expire 60 sec
puts TmpCache.get('name') # => 'shokai'
sleep 61
puts TmpCache.get('name') # => nil
■利用例
skype-chat-gatewayや、Herokuで秋月電子のRSSを作るで使ってる。
skype-chat-gatewayにHTTPアクセスがあるたびに、何百回もAppleScriptを呼び出してSkype.appと通信させるとひどいことになるのでcacheさせている。
秋月のほうも、新着商品の個別ページ100個以上を見に行っているのでcacheを使わなければ大迷惑になってしまう。
Herokuは無料でmemcachedが使えるけどそれだけの為に(無料なのに)クレジットカードを登録するの嫌だし。
例えば、webページを読みに行くのを1200秒cacheする場合はこんなふうにする。
#/usr/bin/env ruby
require 'rubygems'
require 'open-uri'
require 'tmp_cache'
def get_page(url, expire=1200)
TmpCache.get(url) || TmpCache.set(url, open(url).read, expire)
end
url = 'http://shokai.org'
puts get_page(url)
puts get_page(url) # 2回目はcacheから読まれる
UTF-8-MACをUTF-8に変換する
2012 年 5 月 7 日
コメントはありません
Twitterをterminalで見ていると、ごく稀に変な文字が入っているtweetがあって、それがUTF-8-MACだとgeta6に教わった。
Macだと「ぱぴぷぺぽ」など一部の日本語をファイル名にすると変な事が起こるのだが、それの原因がUTF-8-MACらしい。
そういう文字をDBに保存するとのちのち良くないので、Rubyで変換した。
Iconv使ったら簡単だった。
■例
touch ぱぴぷぺぽとなる。
echo は<309a>ひ<309a>ふ<309a>へ<309a>ほ<309a>
ただし、TerminalやiTerm2で「ぱぴぷぺぽ」をechoやlsしてもふつうに「ぱぴぷぺぽ」になってしまって、Rubyに渡して変換を試せない。
GNU Screen上でechoやlsするとUTF-8-MACの文字を出力できる。
■Rubyで変換
インストール
brew install iconv
gem install iconv
標準入力を全て普通のUTF-8に変換する
convert-macutf.rb
require 'rubygems'
require 'iconv'
ARGF.each do |line|
puts line
puts Iconv.iconv("UTF-8", "UTF-8-MAC", line)
end
screen起動してから
touch ぱぴぷぺぽ結果
ls | ruby -Ku convert-macutf.rb
convert-macutf.rb
convert-macutf.rb
ぱÿぴÿぷÿぺÿぽÿ
ぱぴぷぺぽ
iconv単体で使う時はこう
ls | iconv -f UTF-8-MAC -t UTF-8
Skype Chat Gatewayと、WebブラウザからSkypeチャットできるやつ作った
2012 年 5 月 4 日
コメントはありません
半年ぐらい前に作って、書くのを完全に忘れてた。
Skype Botの類が簡単に作れるようになるし、スマホの重いSkypeクライアント起動しなくてもチャット読めたりしてなかなか便利です。skype-socket-gatewayは捨てましょう。
Mac版とLinux版がある。Mac版はchatの読み書きができるけど、Linux版はAPIがよくわからなくて書き込みしかできない。
起動するとHTTPサーバーがport 8787で立ち上がる。
自分のプログラム <--(HTTP)--> Skype-Gateway <--(AppleScript)--> Skype.appという感じで通信する。
HTTP-POSTでchatに発言できるので、bot等が作りやすい。
例えばcurlで発言する
curl -d 'hello!!' http://localhost:8787これでchatにhello!!と投稿される。
Mac版にはLaunchAgentに登録する.plistファイルも付けておいたので、Mac起動と同時にskype-chat-gatewayも自動起動させれる。
ついでにMac版には “WebUI” というディレクトリが同梱されている。
Webブラウザ上でチャットが使える。
SinatraアプリがMac版skype-chat-gatewayと通信している。
スマホ版Skypeが重すぎて常時起動してられないのでちゃちゃっと作ってみた。
ChromeやSafariで開いておくとWebkit NotificationでGrowlのような通知が出るので、本格的にSkype起動して無くても良くなってくる。
Linux版はチャットが読めないのでWebUI付けてない。

最近のコメント