<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>橋本商会 &#187; shokai</title>
	<atom:link href="http://shokai.org/blog/archives/author/shokai/feed" rel="self" type="application/rss+xml" />
	<link>http://shokai.org/blog</link>
	<description>なんか作ったりした記録を忘れないうちに書くblog</description>
	<lastBuildDate>Sun, 20 May 2012 10:50:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>NFCタグサーバーもJavaScriptだけで使えるようにした</title>
		<link>http://shokai.org/blog/archives/6021</link>
		<comments>http://shokai.org/blog/archives/6021#comments</comments>
		<pubDate>Sun, 20 May 2012 10:42:37 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=6021</guid>
		<description><![CDATA[NFCタグサーバーにもクロスドメインでAjaxできるようにするためにHTTP HeaderにAccess-Control-Allow-Originを追加した。 JavaScriptだけでNFCタグリーダーを使える。 これ [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="https://github.com/shokai/nfctag-server">NFCタグサーバー</a>にもクロスドメインでAjaxできるようにするためにHTTP HeaderにAccess-Control-Allow-Originを追加した。<br />
JavaScriptだけでNFCタグリーダーを使える。<br />
<br />
これ → <a href="http://shokai.org/blog/archives/5687">IO-DATAのNFCタグリーダーをHTTP、WebSocket、Socketから使えるようにした</a><br />
<br />
<a href="https://github.com/eventmachine/evma_httpserver">Eventmachine HttpServer</a>が軽量で使いやすいので、sinatraを使うほどでもないプロジェクトでよく使っている。<br />
<pre class="prettyprint">
class NfcHttpServer  &lt; EM::Connection<br />
  include EM::HttpServer<br />
  <br />
  def process_http_request<br />
    res = EM::DelegatedHttpResponse.new(self)<br />
    puts &quot;* http #{@http_request_method} #{@http_path_info} #{@http_query_string} #{@http_post_content}&quot;<br />
    res.headers['Access-Control-Allow-Origin'] = '*'<br />
    res.headers['Access-Control-Allow-Headers'] = 'Content-Type'<br />
    res.headers['Access-Control-Allow-Methods'] = 'PUT,DELETE,POST,GET,OPTIONS'<br />
    res.status = 200<br />
    res.content = @@tag.to_s<br />
    res.send_response<br />
  end<br />
end<br />
</pre>
Eventmachine HttpServerはドキュメント全然書かれてないけど、コードが読みやすいのでどうにでもできる。<a href="http://shokai.org/blog/archives/5712">comet</a>とかもできるし。<br />
<br />
<br />
■参考にした<br />
<a href="http://d.hatena.ne.jp/yuya_lush/20110628/1309280632">Ajaxのクロスサイト通信をJSONPを使わないでやってみよう &#8211; Back yard : yuya_lush’s report</a></p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/6021/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML+JavaScriptをArduinoに直結できるシリアルポートサーバーを作った</title>
		<link>http://shokai.org/blog/archives/6009</link>
		<comments>http://shokai.org/blog/archives/6009#comments</comments>
		<pubDate>Sat, 19 May 2012 13:06:31 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SerialPort]]></category>
		<category><![CDATA[serialport-server]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[WebSocket]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=6009</guid>
		<description><![CDATA[SerialPort Serverを使うと、HTMLとJSをArduinoに直結できる。JavaScriptを少し書くだけでArduinoに「カーテン開けろ」とか「部屋の明るさよこせ」とか命令を送れるわけだ。 Web系の [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://shokai.github.com/serialport-server">SerialPort Server</a>を使うと、HTMLとJSをArduinoに直結できる。JavaScriptを少し書くだけでArduinoに「カーテン開けろ」とか「部屋の明るさよこせ」とか命令を送れるわけだ。<br />
Web系の技術とハードウェアの技術を同時に使うには、間に「つなぎ」が必要なので、必要な機能を全部入れたサーバーを作ってみた感じです。<br />
（github pagesでプロジェクトページ作ってみたんだけど楽でいいですね）<br />
<br />
<br />
こういうこと。<br />
<img src="http://shokai.org/archive/file/ca9e3cdad29aa43e8ba8247acc212ee1.png">
<br />
<br />
シリアルポートサーバーはrubygemsでインストールできる。<br />
<pre>
gem install serialport-server<br />
which serialport-server<br />
serialport-server --help<br />
serialport-server /dev/tty.デバイス名<br />
</pre>
&#8211;helpでヘルプが出る。デバイス名を引数にして起動できる。<br />
Macならsudo gem installで一発でインストールできるはず。<br />
<br />
起動するとHTTPサーバー(http://localhost:8783)、WebSocketサーバー(ws://localhost:8784)、TCP Socketサーバー(localhost:8785)の3つが同時に起動する。<br />
<br />
HTTPのサーバーはajaxのクロスドメイン制限を超えてデータのやりとりができるようにしてある。シリアルポートサーバーを動かして、HTMLとJavaScriptを書けばArduinoとJavaScriptが直接通信できるというわけだ。<br />
（response headerにAccess-Control-Allow-Originを付ければ良いとyuisekiのはてブを見ていて知ったのでやってみた。）<br />
<br />
<br />
■デモ<br />
<a href="http://shokai.github.com/serialport-server/">SerialPort Server</a>のページにも英語で書いたが、簡単なサンプルプロジェクトを日本語でも解説しておく。<br />
<br />
<br />
1. Arduinoに<a href="https://github.com/shokai/serialport-server/blob/master/sample/arduino/arduino.ino">プログラム</a>を書き込む<br />
<br />
2. ArduinoのDigital13番ピンにLEDを、Analog0番ピンにCdSと10kΩの抵抗を接続する<br />
<a href="http://www.flickr.com/photos/shokai/7222512264/" title="SerialPort Server sample by shokai, on Flickr"><img src="http://farm8.staticflickr.com/7071/7222512264_16c5af2a46.jpg" width="500" height="388" alt="SerialPort Server sample"></a><br />
<a href="http://www.flickr.com/photos/shokai/7222512488/" title="SerialPort Server sample by shokai, on Flickr"><img src="http://farm8.staticflickr.com/7090/7222512488_827f032963.jpg" width="500" height="392" alt="SerialPort Server sample"></a><br />
<br />
3. SerialPort Serverを起動する<br />
<br />
4. <a href="http://shokai.github.com/serialport-server/sample/ajax/index.html">Ajax版サンプル</a>を開いて試してみる<br />
<br />
5. <a href="http://shokai.github.com/serialport-server/sample/websocket/index.html">WebSocket版サンプル</a>を開いて試してみる<br />
<br />
<br />
WebブラウザからLEDを点灯消灯したり、CdSの明るさの値がリアルタイムにスライダーに反映されているはずだ。<br />
実際に<a href="http://shokai.github.com/serialport-server/sample/ajax/main.js">AjaxサンプルのJavaScript</a>のコードを見てみると簡単さがわかると思う。17行でLEDとCdSを制御できている。<br />
<br />
<img src="http://shokai.org/archive/file/4f9335910d8e39b6cbebab667328eb92.png">
<br />
<br />
もちろんWebサーバーなので、複数のWebブラウザがSerialPort Serverから同時にデータを読み出そうとしても大丈夫。<br />
増井研で1年以上、遠隔操縦ロボットの制御に使っていたプログラムを元に使っているのでプロセスを起動してたぶん3ヶ月ぐらい放置していても動き続けるぐらいに安定していると思う。<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/6009/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Juliusで音声認識したのだが、精度が低い</title>
		<link>http://shokai.org/blog/archives/6002</link>
		<comments>http://shokai.org/blog/archives/6002#comments</comments>
		<pubDate>Wed, 16 May 2012 14:35:43 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Julius]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[音声認識]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=6002</guid>
		<description><![CDATA[Julius動かしてみたけど、なんだか認識精度が低くてどうしょうもないのですが、何か間違っているのでしょうか・・？ ■まずMacにインストールした sudo port install julius homebrewにはパ [...]]]></description>
			<content:encoded><![CDATA[<p>
Julius動かしてみたけど、なんだか認識精度が低くてどうしょうもないのですが、何か間違っているのでしょうか・・？<br />
<br />
<br />
■まずMacにインストールした<br />
<pre>
sudo port install julius</pre>
homebrewにはパッケージはない。<br />
<br />
<br />
<a href="http://julius.sourceforge.jp/">http://julius.sourceforge.jp/</a>からソース持ってきてコンパイルしても使えるらしいが、juliusは32bitでしか動かないし、Lionではcoreaudioではなくportaudioを使わなければならないらしいのでportaudioも32bitでインストールして・・と色々面倒だ。<br />
homebrewのportaudioをuniversal binaryでインストールできなかったので、自分でjuliusをビルドしてインストールはあきらめた。<br />
<br />
<br />
音声認識する<br />
<pre>
which julius_demo<br />
julius_demo<br />
</pre>
でしばらく待つと、<br />
<pre>
&lt;&lt;&lt; please speak &gt;&gt;&gt;<br />
</pre>
となってMacのマイクから音声認識できる。<br />
でも大体間違ってる。<br />
<br />
<br />
wavファイルから認識してみる。<br />
QuickTimePlayerで[ファイル]→[新規オーディオ収録]で録音できる。<br />
m4aで保存されるので、<a href="http://julius.sourceforge.jp/juliusbook/ja/desc_adin.html">juliusが認識できるフォーマット</a>(モノラル16kHzのwav)にffmpegで変換した。<br />
<pre>
ffmpeg -i test.m4a -ac 1 -ar 16000 test.wav<br />
</pre>
<br />
<pre>
julius_demo -input stdin < test.wav<br />
</pre>
wav入れたらテキストになってでてきた。でもやっぱりあまりうまく認識してくれない・・<br />
<br />
<br />
julius_demoの中身はshell scriptだった。<br />
<pre class="prettyprint">#!/bin/sh<br />
/opt/local/bin/julius -C /opt/local/lib/julius/fast.jconf "$@"</pre>
<br />
<br />
■Ubuntuにもインストールした<br />
<pre>sudo apt-get install julius libjulius-dev</pre>
<br />
<a href="http://julius.sourceforge.jp/index.php?q=dictation-kit.html">ディクテーションキット</a>が別に必要になる。<br />
ダウンロードする。<br />
<pre>
mkdir ~/tmp<br />
cd ~/tmp<br />
wget "http://sourceforge.jp/frs/redir.php?m=jaist&#038;f=%2Fjulius%2F51158%2Fdictation-kit-v4.1.tar.gz"<br />
tar -zxvf dictation-kit-v4.1.tar.gz<br />
</pre>
<br />
<br />
さっき録音したファイルを認識させる<br />
<pre class="prettyprint">
julius -C ~/tmp/dictation-kit-v4.1/fast.jconf -charconv EUC-JP UTF-8 -input stdin < test.wav<br />
</pre>
やっぱり精度が悪い・・どうすれば・・・<br />
<br />
<br />
-moduleを付けて起動するとTCP port 10050でサーバーが起動する。</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/6002/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache+Passengerでenvironmentの設定</title>
		<link>http://shokai.org/blog/archives/5998</link>
		<comments>http://shokai.org/blog/archives/5998#comments</comments>
		<pubDate>Mon, 14 May 2012 21:05:03 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[Rack]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5998</guid>
		<description><![CDATA[いままでsinatra使う時にconfig.ruに set :environemt, :production とか set :environemt, :development って書いてたんだけど、httpd.confに [...]]]></description>
			<content:encoded><![CDATA[<p>
いままでsinatra使う時にconfig.ruに<br />
<pre class="prettyprint">
set :environemt, :production<br />
</pre>
とか<br />
<pre class="prettyprint">
set :environemt, :development<br />
</pre>
って書いてたんだけど、httpd.confに<br />
<pre class="prettyprint">
RackBaseURI /app_path<br />
RackEnv production<br />
</pre>
って書けばいいのだった。</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5998/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>twitterの発言をskypeに投げる</title>
		<link>http://shokai.org/blog/archives/5992</link>
		<comments>http://shokai.org/blog/archives/5992#comments</comments>
		<pubDate>Sun, 13 May 2012 09:05:50 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[skype-chat-gateway]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5992</guid>
		<description><![CDATA[研究会のskype chatで存在感がない人を忘れないために、研究会のtwitterアカウントでfollowしている人の最近の発言をランダムに投稿するようにしている 3時間ごとに投げる。 ここにコードおいてある http [...]]]></description>
			<content:encoded><![CDATA[<p>
研究会のskype chatで存在感がない人を忘れないために、研究会のtwitterアカウントでfollowしている人の最近の発言をランダムに投稿するようにしている<br />
<img src="http://shokai.org/archive/file/cb1e912e67fe5c961e0508d9afa1dbf0.png">
<br />
3時間ごとに投げる。<br />
<br />
<br />
ここにコードおいてある<br />
<a href="https://github.com/shokai/skype-chat-gateway-mac/tree/master/tools/twitter">https://github.com/shokai/skype-chat-gateway-mac/tree/master/tools/twitter</a><br />
<br />
<br />
skypeへの投稿は<a href="http://shokai.org/blog/archives/5943">Skype Chat Gatewayと、WebブラウザからSkypeチャットできるやつ作った</a>に書いたskype-chat-gatewayを使っている。HTTPでskype chatが使えるスゴイ奴だよ<br />
<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5992/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>args_parserを使うとRubyでコマンドラインアプリ作るのにとても便利</title>
		<link>http://shokai.org/blog/archives/5981</link>
		<comments>http://shokai.org/blog/archives/5981#comments</comments>
		<pubDate>Fri, 11 May 2012 06:27:25 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[args_parser]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5981</guid>
		<description><![CDATA[args_parserというgemを作りました。 2年前に作ったArgsParserをバージョンアップしていたら互換性が無くなってきたので名前を変えた。 optparseよりもすっきり書けると思う。 ■インストール ge [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://rubygems.org/gems/args_parser">args_parser</a>というgemを作りました。<br />
2年前に作った<a href="http://shokai.org/blog/archives/5096">ArgsParser</a>をバージョンアップしていたら互換性が無くなってきたので名前を変えた。<br />
optparseよりもすっきり書けると思う。<br />
<br />
<br />
■インストール<br />
<pre>
gem install args_parser<br />
</pre>
<br />
<br />
■使い方<br />
試しに、「webページのURLを指定してダウンロードする」アプリを作ってみる。<br />
こういう風に使えるのを作る。<br />
<pre>ruby download_webpage.rb -url http://example.com -o out.html</pre>
<br />
<br />
download_webpage.rb<br />
<pre class="prettyprint">
#!/usr/bin/env ruby<br />
require 'rubygems'<br />
require 'args_parser'<br />
<br />
parser = ArgsParser.parse ARGV do<br />
  arg :url, 'URL', :alias =&gt; :u<br />
  arg <img src='http://shokai.org/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utput, 'output file', :alias =&gt; <img src='http://shokai.org/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> , :default =&gt; 'out.html'<br />
  arg :verbose, 'verbose mode'<br />
  arg :help, 'show help', :alias =&gt; :h<br />
end<br />
<br />
if parser.has_option? :help or !parser.has_param?(:url, <img src='http://shokai.org/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utput)<br />
  STDERR.puts parser.help<br />
  STDERR.puts &quot;e.g.  ruby #{$0} -url http://example.com -o out.html&quot;<br />
  exit 1<br />
end<br />
<br />
require 'open-uri'<br />
puts 'download..' if parser[:verbose]<br />
data = open(parser[:url]).read<br />
puts data if parser[:verbose]<br />
<br />
open(parser[:output], 'w+') do |f|<br />
  f.write data<br />
end<br />
puts &quot;saved! =&gt; #{parser[:output]}&quot;<br />
</pre>
<br />
<br />
こんな感じで実行できる。<br />
<img src="http://shokai.org/archive/file/8ab68ae2053e301960591dc6b13a9d64.png"></p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5981/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>\r\nのファイルが混じっているので\nに直すワンライナー</title>
		<link>http://shokai.org/blog/archives/5973</link>
		<comments>http://shokai.org/blog/archives/5973#comments</comments>
		<pubDate>Wed, 09 May 2012 14:03:49 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[oneliner]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5973</guid>
		<description><![CDATA[newgemで生成したgemのテンプレートに改行コードが\r\nのものと\nのものが混じっているのが気持ち悪いので、全部\nに統一した。 find * &#124; xargs -n1 ruby -e 'lines = open( [...]]]></description>
			<content:encoded><![CDATA[<p>
newgemで生成したgemのテンプレートに改行コードが\r\nのものと\nのものが混じっているのが気持ち悪いので、全部\nに統一した。<br />
<br />
<pre class="prettyprint">
find * | xargs -n1 ruby -e 'lines = open(ARGV[0]).read.gsub(/\r\n/, "\n"); open(ARGV[0],"w+").write lines'<br />
</pre>
<br />
実行したディレクトリの中のファイルの改行コードが\nになる。</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5973/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bundler.requireがエラー出すので、プロジェクトローカルにgemを入れた</title>
		<link>http://shokai.org/blog/archives/5968</link>
		<comments>http://shokai.org/blog/archives/5968#comments</comments>
		<pubDate>Tue, 08 May 2012 18:04:44 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5968</guid>
		<description><![CDATA[とある環境でbundle installしてsystemにインストールされたrubygemを使う様にしたら、Bundler.requireがエラー出すようになった。 bundler-1.1.3/lib/bundler/r [...]]]></description>
			<content:encoded><![CDATA[<p>
とある環境でbundle installしてsystemにインストールされたrubygemを使う様にしたら、Bundler.requireがエラー出すようになった。<br />
<pre class="prettyprint">
bundler-1.1.3/lib/bundler/runtime.rb:77:in `require': private method `gsub' called for nil:NilClass (NoMethodError)<br />
</pre>
<br />
<br />
プロジェクトローカルにインストールしたらエラーが出なくなった。<br />
<pre>
bundle install --path gems<br />
</pre>
<br />
<br />
■Bundler<br />
最近は<a href="http://gembundler.com/">bundler</a>というgemの管理機構が使われている。<br />
<br />
Gemfileというテキストファイルを作って、プロジェクトで使用するRubygemsを書いておく。<br />
<br />
Gemfile<br />
<pre class="prettyprint">
source :rubygems<br />
<br />
gem 'sinatra', '>=1.3'<br />
gem 'twitter'<br />
gem 'oauth', '0.4.5'<br />
gem 'json'<br />
</pre>
バージョン指定ができる。<br />
<br />
<pre class="prettyprint">
bundle install<br />
</pre>
rubygemsに公開されていないgitリポジトリを指定したりもできるし、一発で全てのgemがインストールできるので開発環境から本番環境にデプロイするのに便利。<br />
メジャーバージョンアップで仕様が大きく変わったgemがあっても問題ない。<br />
<br />
<br />
<pre class="prettyprint">
require 'rubygems'<br />
require 'bundler/setup'<br />
Bundler.require<br />
require 'yaml'<br />
</pre>
これでGemfileに書かれたgemがrequireされる。<br />
yamlみたいな標準で入ってるgemは自分でrequireしないとならないっぽい。<br />
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5968/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>簡単なon memory cacheを作った</title>
		<link>http://shokai.org/blog/archives/5960</link>
		<comments>http://shokai.org/blog/archives/5960#comments</comments>
		<pubDate>Tue, 08 May 2012 07:07:01 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[tmp_cache]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5960</guid>
		<description><![CDATA[tmp_cacheというgemを作った。 ■インストール gem install tmp_cache ■使い方 cacheなので、memcacheのように有効期限を指定できる。 60秒間生きるキャッシュの場合、61秒後は [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://rubygems.org/gems/tmp_cache">tmp_cache</a>というgemを作った。<br />
<br />
<br />
■インストール<br />
<pre class="prettyprint">
gem install tmp_cache<br />
</pre>
<br />
<br />
■使い方<br />
cacheなので、memcacheのように有効期限を指定できる。<br />
60秒間生きるキャッシュの場合、61秒後はnilになる<br />
<pre class="prettyprint">
#!/usr/bin/env ruby<br />
require 'rubygems'<br />
require 'tmp_cache'<br />
<br />
TmpCache.set('name', 'shokai', 60) # expire 60 sec<br />
<br />
puts TmpCache.get('name') # => 'shokai'<br />
sleep 61<br />
puts TmpCache.get('name') # => nil<br />
</pre>
TmpCacheはグローバルにどこからでも読めるので便利<br />
<br />
<br />
■利用例<br />
<a href="http://shokai.org/blog/archives/5943">skype-chat-gateway</a>や、<a href="http://shokai.org/blog/archives/5931">Herokuで秋月電子のRSSを作る</a>で使ってる。<br />
<br />
skype-chat-gatewayにHTTPアクセスがあるたびに、何百回もAppleScriptを呼び出してSkype.appと通信させるとひどいことになるのでcacheさせている。<br />
秋月のほうも、新着商品の個別ページ100個以上を見に行っているのでcacheを使わなければ大迷惑になってしまう。<br />
Herokuは無料でmemcachedが使えるけどそれだけの為に（無料なのに）クレジットカードを登録するの嫌だし。<br />
<br />
<br />
<br />
例えば、webページを読みに行くのを1200秒cacheする場合はこんなふうにする。<br />
<pre class="prettyprint">
#/usr/bin/env ruby                                                                                                                                                           <br />
require 'rubygems'<br />
require 'open-uri'<br />
require 'tmp_cache'<br />
<br />
def get_page(url, expire=1200)<br />
  TmpCache.get(url) || TmpCache.set(url, open(url).read, expire)<br />
end<br />
<br />
url = 'http://shokai.org'<br />
<br />
puts get_page(url)<br />
<br />
puts get_page(url) # 2回目はcacheから読まれる<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5960/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF-8-MACをUTF-8に変換する</title>
		<link>http://shokai.org/blog/archives/5953</link>
		<comments>http://shokai.org/blog/archives/5953#comments</comments>
		<pubDate>Mon, 07 May 2012 07:53:53 +0000</pubDate>
		<dc:creator>shokai</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://shokai.org/blog/?p=5953</guid>
		<description><![CDATA[Twitterをterminalで見ていると、ごく稀に変な文字が入っているtweetがあって、それがUTF-8-MACだとgeta6に教わった。 Macだと「ぱぴぷぺぽ」など一部の日本語をファイル名にすると変な事が起こる [...]]]></description>
			<content:encoded><![CDATA[<p>
Twitterをterminalで見ていると、ごく稀に変な文字が入っているtweetがあって、それがUTF-8-MACだとgeta6に教わった。<br />
Macだと「ぱぴぷぺぽ」など一部の日本語をファイル名にすると変な事が起こるのだが、それの原因がUTF-8-MACらしい。<br />
<br />
そういう文字をDBに保存するとのちのち良くないので、Rubyで変換した。<br />
Iconv使ったら簡単だった。<br />
<br />
<br />
■例<br />
<pre>
touch ぱぴぷぺぽ<br />
echo は<309a>ひ<309a>ふ<309a>へ<309a>ほ<309a><br />
</pre>
となる。<br />
<br />
<img src="http://shookai.org/face/f/9217841ff59e205151fc10371c5b5396.png">
<br />
ただし、TerminalやiTerm2で「ぱぴぷぺぽ」をechoやlsしてもふつうに「ぱぴぷぺぽ」になってしまって、Rubyに渡して変換を試せない。<br />
GNU Screen上でechoやlsするとUTF-8-MACの文字を出力できる。<br />
<br />
■Rubyで変換<br />
インストール<br />
<pre class="prettyprint">
brew install iconv<br />
gem install iconv<br />
</pre>
<br />
<br />
標準入力を全て普通のUTF-8に変換する<br />
convert-macutf.rb<br />
<pre class="prettyprint">
require 'rubygems'<br />
require 'iconv'<br />
<br />
ARGF.each do |line|<br />
  puts line<br />
  puts Iconv.iconv("UTF-8", "UTF-8-MAC", line)<br />
end<br />
</pre>
<br />
<br />
screen起動してから<br />
<pre>
touch ぱぴぷぺぽ<br />
ls | ruby -Ku convert-macutf.rb<br />
</pre>
結果<br />
<pre>
convert-macutf.rb<br />
convert-macutf.rb<br />
ぱÿぴÿぷÿぺÿぽÿ<br />
ぱぴぷぺぽ<br />
</pre>
<br />
<img src="http://shookai.org/face/f/3586641b9e919a8c3bb5a2863b40b81c.png">
<br />
<br />
iconv単体で使う時はこう<br />
<pre>
ls | iconv -f UTF-8-MAC -t UTF-8<br />
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://shokai.org/blog/archives/5953/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

