<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>lab.naoki.sato.name &#187; perl</title>
	<atom:link href="http://naoki.sato.name/lab/archives/category/programming/perl-programming/feed" rel="self" type="application/rss+xml" />
	<link>http://naoki.sato.name/lab</link>
	<description>lab for naoki.sato</description>
	<lastBuildDate>Sun, 20 Mar 2011 06:02:24 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://naoki.sato.name/lab/archives/category/programming/perl-programming/feed" />
		<item>
		<title>MacでTwitterのタイムラインを読み上げさせる</title>
		<link>http://naoki.sato.name/lab/archives/27</link>
		<comments>http://naoki.sato.name/lab/archives/27#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:27:04 +0000</pubDate>
		<dc:creator>naoki</dc:creator>
				<category><![CDATA[mac]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[aquest]]></category>

		<guid isPermaLink="false">http://naoki.sato.name/lab/archives/27</guid>
		<description><![CDATA[Twitterは便利で楽しいものですが、タイムライン(TL)を追うのはなかなか大変です。
TLはすべて追えなくても気にするべきではない、とはよく言われるものの、他の作業をしていてもTLが気になったり&#8230;
そこで [...]]]></description>
			<content:encoded><![CDATA[<p>Twitterは便利で楽しいものですが、タイムライン(TL)を追うのはなかなか大変です。<br />
TLはすべて追えなくても気にするべきではない、とはよく言われるものの、他の作業をしていてもTLが気になったり&#8230;</p>
<p>そこで、他の作業をしながらTLも追いかけられるように、Macで自分のTLを読み上げる仕組みを作ってみました。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/rnxqroTJJ-I&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/rnxqroTJJ-I&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
こんな感じで読み上げられます。<br />
動画では写していませんがGrowlを準備しておけばつぶやきも表示されます。</p>
<p>以下、今回作成した仕組みの詳細です。<br />
Perlやコマンドラインは使いますが、おそらく1時間-2時間で構築できると思いますので、よろしければ試してみてください。<br />
質問、コメント等は <a href="http://twitter.com/naokisatoname" target="_blank">@naokisatoname</a> まで。</p>
<p><span id="more-27"></span></p>
<h3>利用したツール等</h3>
<ul>
<li>Mac OSX 10.6 (Leopard)</li>
<li>Xcode (MacPortsインストール用)</li>
<li><a href="http://www.macports.org/" target="_blank">MacPorts</a></li>
<li>nkf (MacPortsからインストール)</li>
<li>kakasi (MacPortsからインストール)</li>
<li>Perl 5.10 (Mac標準)</li>
<li>Net::Twitterモジュール (CPANからインストール)</li>
<li>Lingua::JA::Regular::Unicodeモジュール (CPANからインストール)</li>
<li>sayコマンド (Mac標準)、<a href="http://www.a-quest.com/aquestalk/saykana/" target="_blank">AQUEST SayKana</a></li>
<li><a href="http://growl.info/" target="_blank">Growl</a> (※必要な場合)</li>
</ul>
<h3>手順詳細</h3>
<ol>
<li>Xcodeをインストールします。</li>
<li><a href="http://www.macports.org/" target="_blank">MacPorts</a>をダウンロード、インストールし、最新情報に更新します。<br />
(※MacPortsの使い方については <a href="http://blog.asial.co.jp/371">MacPortsの基本的な使い方とコマンド</a> 等に詳しく解説されています)</li>
<li><a href="http://www.macports.org/" target="_blank">MacPorts</a>からnkf、kakasiをインストールします。<br />
<code></p>
<pre>sudo port install nkf
sudo port install kakasi</pre>
<p></code></li>
<li>CPANを利用してPerl用のモジュール Net::Twitter と Lingua::JA::Regular::Unicode をインストールします。<br />
<code></p>
<pre>sudo perl -MCPAN -e shell
install Net::Twitter
install Lingua::JA::Regular::Unicode</pre>
<p></code><br />
すこし時間がかかります。</li>
<li><a href="http://growl.info/" target="_blank">Growl</a>を利用する場合、ダウンロード、インストールします。<br />
.dmgに同梱されているgrowlnotifyをインストールします (growlnotify/growlnotify を /usr/local/bin にコピーします)。</li>
<li><a href="http://www.a-quest.com/aquestalk/saykana/" target="_blank">SayKana</a>をダウンロード、インストールします。</li>
<li>次のような内容で、任意の名前のPerlスクリプトを作成します (ここでは <code>saytwitter.pl</code> とします)。<br />
<code>USERNAME</code>をユーザ名に、<code>PASSWORD</code>をパスワードに置き換えます。<br />
<code></p>
<pre>#!/usr/bin/perl

use strict;
use utf8;
use Encode;
use Net::Twitter;
use Lingua::JA::Regular::Unicode;

my $twitter = Net::Twitter-&gt;new (
	#USERNAME → ユーザ名に置き換え
	username =&gt; "USERNAME",
	#PASSWORD → パスワードに置き換え
	password =&gt; "PASSWORD"
);

#TLを取得
my $array_ref = $twitter-&gt;friends_timeline();

foreach my $ref( @$array_ref ) {
	my $username = $ref-&gt;{'user'}{'name'};
	my $line = $ref-&gt;{'text'};

	#Growlにつぶやきを表示させる場合、コメントを外す
	#qx{ growlnotify -m \"\@$username: $line\" };

	&amp;say($username);
	&amp;say($line);
}

sub say {
	my $line = $_[0];

	print encode('utf-8', $line) . "\n";

	#全角 → 半角
	$line = alnum_z2h($line);
	#シングルクォート、ダブルクォートを削除
	$line =~ s/[\"\']//g;
	#http, httpsから始まる単語を"URL"に変換 (うまく読み上げられないので)
	$line =~ s/(http:\/\/\S+)|(https:\/\/\S+)\s/URL/ig;
	#コロンを削除
	$line =~ s/[:]/,/g;
	#@ユーザ名を単に"at"に変換  (うまく読み上げられないので)
	$line =~ s/\s*[@＠][0-9a-zA-Z]+\s*/ at /g;
	#ハッシュタグを"hash"に変換  (うまく読み上げられないので)
	$line =~ s/\s*\#\w+\s*/ hash /g;
	#各種カッコを半角(に変換
	$line =~ s/[\(\[\{\&lt;（「｛【]/(/g;
	#各種カッコを半角)に変換
	$line =~ s/[\}\]\}\&gt;）」｝】]/)/g;

	#漢字をひらがなに変換し、分かち書きにする
	my $line_mod = qx{ echo \"$line\" | nkf -e | kakasi -w | kakasi -JH -KH | nkf -w };

	#半角英数字、ひらがな、および特定の記号のみ抽出する
	my $text = "";
	for(my $i = 0; $i &lt; length($line_mod); $i++) {
		if(substr($line_mod, $i, 1) =~ m/[0-9a-zA-Z@!?().,_ \/\n]
			|[、。ー！？・…　]
			|\p{Hiragana}/) {
			$text = $text . substr($line_mod, $i, 1);
		}
	}

	if($text =~ m/(\p{Hiragana}|\p{Katakana}|\p{Han})/){    #名前、つぶやきに日本語が含まれている場合
		#漢字からひらがなへの変換で"っ"が重なる場合があるので修正
		$text =~ s/っ+/っ/ig;

		#読み方の調整
		#SayKanaの仕様書を参考に、ご自由に調整してください
		$text =~ s/at/あっと、/g;
		$text =~ s/hash/はっしゅ。/g;
		$text =~ s/ ([,.、。!?！？ー])/$1/g;
		$text =~ s/([!！])/。/g;
		$text =~ s/([?？])/？/g;
		$text =~ s/ /\//g;
		$text =~ s/[・…]/、/g;
		$text =~ s/[\(\)]/,/g;
		$text =~ s/\/は\//\/わ\//g;
		$text =~ s/は\//わ\//ig;
		#英単語・固有名詞の読み方設定
		$text =~ s/Windows/うぃんどうず/ig;
		$text =~ s/Mac/まっく/ig;
		$text =~ s/Linux/りなっくす/ig;
		$text =~ s/Twitter/ついったー/ig;
		$text =~ s/Google/ぐーぐる/ig;
		#数字の読み方設定 (例えば、"10"を「いちまる」ではなく「じゅう」と読ませるようにしている)
		$text =~ s/([0-9]+)//ig;

		#SayKanaで読み上げ
		system("echo \"$text\" | SayKana");
	} else {    #名前、つぶやきに日本語が含まれている場合
		#sayで読み上げ
		system("say \"$text\"");
	}

	#1秒待機
	sleep(1);
	return;
}</pre>
<p></code></li>
<li>作成したPerlスクリプトに実行権限を与え、任意の場所にコピーします (ここでは<code>/usr/local/bin</code>にコピーします)。<br />
<code></p>
<pre>chmod a+x saytwitter.pl
sudo cp saytwitter.pl /usr/local/bin/</pre>
<p></code><br />
このPerlスクリプトを実行すれば、自分のTLから直近20件分のつぶやきが、ユーザ名・つぶやき内容の純に読み上げられるはずです。<br />
Growlを設定している場合は同時に表示されるはずです。</li>
<li>定期的に読み上げられるように、cronに登録します。<br />
cron登録用のShellスクリプトを作成します (ここでは saytwitter とします)。<br />
<code></p>
<pre>#!/bin/sh

export PATH=/usr/local/bin:/opt/local/bin:$PATH
/usr/local/bin/saytwitter.pl</pre>
<p></code></li>
<li>作成したShellスクリプトに実行権限を与え、任意の場所にコピーします (ここでは<code>/usr/local/bin</code>にコピーします)。<br />
<code></p>
<pre>chmod a+x saytwitter
sudo cp saytwitter /usr/local/bin/</pre>
<p></code></li>
<li>作成したShellスクリプトをcronに登録します。<br />
実行のタイミングはご自分の環境に応じて調整ください (<a href="http://twitter.com/naokisatoname" target="_blank">@naokisatoname</a> の場合、5分間隔に実行しています)。<br />
<code></p>
<pre>crontab -e</pre>
<p></code><br />
<code> </code></p>
<p><code></p>
<pre>*/5 * * * *  /usr/local/bin/saytwitter</pre>
<p></code></li>
<li>以上で定期的に自分のTLが読み上げられるようになります。<br />
読み上げを停止する場合は、登録したcronのJobを削除します。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://naoki.sato.name/lab/archives/27/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://naoki.sato.name/lab/archives/27" />
	</item>
		<item>
		<title>PerlからTwitterを簡単に利用するNet::Twitter</title>
		<link>http://naoki.sato.name/lab/archives/24</link>
		<comments>http://naoki.sato.name/lab/archives/24#comments</comments>
		<pubDate>Thu, 17 Dec 2009 13:18:48 +0000</pubDate>
		<dc:creator>naoki</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://naoki.sato.name/lab/archives/24</guid>
		<description><![CDATA[TwitterはAPIが公開されているので容易にそのデータを利用することができるが、PerlからTwitterにログインしてTL等の情報を利用するにはNet::Twitterモジュールを活用すると良い。
インストールはC [...]]]></description>
			<content:encoded><![CDATA[<p>TwitterはAPIが公開されているので容易にそのデータを利用することができるが、PerlからTwitterにログインしてTL等の情報を利用するにはNet::Twitterモジュールを活用すると良い。</p>
<p>インストールはCPANから可能。</p>
<p><code>sudo perl -MCPAN -e shell<br />install Net::Twitter</code></p>
<p>Snow Leopardの環境では、比較的時間はかかったものの、正常にインストールすることができた。</p>
<p>実際にPerlで利用するには、以下の様にコーディングする。</p>
<p><code>my $twitter = Net::Twitter-&gt;new (<br />username =&gt; "username", #ユーザ名<br />password =&gt; "password" #パスワード<br />)</p>
<p>my $ref = $twitter-&gt;friends_timeline();</code></p>
<p>この様にすると、<code>$ref</code>に自分のTLの情報が格納される。<br />格納されたTLの情報から、以下の様にしてユーザの名前やつぶやきの内容を取得できる。</p>
<p><code>$ref-&gt;{'user'}{'name'}; #ユーザの名前<br />$ref-&gt;{'text'}; #つぶやきの内容</code> </p>
]]></content:encoded>
			<wfw:commentRss>http://naoki.sato.name/lab/archives/24/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://naoki.sato.name/lab/archives/24" />
	</item>
		<item>
		<title>Mac OSX 10.6 (Snow Leopard)のPerlでImage::Magickを使う</title>
		<link>http://naoki.sato.name/lab/archives/23</link>
		<comments>http://naoki.sato.name/lab/archives/23#comments</comments>
		<pubDate>Sun, 13 Dec 2009 02:16:29 +0000</pubDate>
		<dc:creator>naoki</dc:creator>
				<category><![CDATA[mac]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[imagemagick]]></category>

		<guid isPermaLink="false">http://naoki.sato.name/lab/archives/23</guid>
		<description><![CDATA[Mac OSXにはImageMagickがインストールされていない。ImageMagick自体はmac portやfinkからインストールできるが、Snow Leopard用のPerlモジュール(PerlMagick)が [...]]]></description>
			<content:encoded><![CDATA[<p>Mac OSXにはImageMagickがインストールされていない。<br />ImageMagick自体はmac portやfinkからインストールできるが、Snow Leopard用のPerlモジュール(PerlMagick)が用意されておらず、CPANからのインストールもエラーが発生する(らしい)ため、PerlでImage::Magickを使うにはソースから &#8211;with-perl オプションをつけてコンパイルする必要がある。</p>
<p>コンパイル、インストール自体は</p>
<p><code>./configure --with-perl<br />make<br />sudo make install</code></p>
<p>で可能。<br />モジュールも自動的にインストールされる。</p></p>
]]></content:encoded>
			<wfw:commentRss>http://naoki.sato.name/lab/archives/23/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://naoki.sato.name/lab/archives/23" />
	</item>
	</channel>
</rss>

