0

JSONシリアライズ方法を設定する

こういうjsonへのシリアライズ方法が書かれてないクラスを使って、to_jsonすると

#!/usr/bin/env ruby
require 'rubygems'
require 'json'

class User
attr_reader :id, :name
def initialize(id, name)
@id = id
@name = name
end
end

users = Array.new
['user1', 'user2', 'shokai'].each_with_index{|name,id|
users.push User.new(id, name)
}

puts users.to_json


クラス名が出てきてしまう
["#<User:0x007fc17b8bda50>","#<User:0x007fc17b8bda28>","#<User:0x007fc17b8bda00>"]


JSON implementation for Rubyに、to_json(*a)を定義しろって書いてあった
#!/usr/bin/env ruby
require 'rubygems'
require 'json'

class User
attr_reader :id, :name
def initialize(id, name)
@id = id
@name = name
end

## JSON作る
def to_json(*a)
{
:id => @id,
:name => @name
}.to_json(*a)
end
end

users = Array.new
['user1', 'user2', 'shokai'].each_with_index{|name,id|
users.push User.new(id, name)
}

puts users.to_json


ちゃんと出てきた
[{"id":0,"name":"user1"},{"id":1,"name":"user2"},{"id":2,"name":"shokai"}]

0

メールは滅んだほうがいい

SPAMとか送信元詐称とかじゃなくて、帯域食い過ぎ

0

Google NewsをMacに読み上げさせる

Googleニュース等のヘッドラインをMacに読み上げさせるやつ作った。最終的にMac以外でも動くようになった。



新聞の勧誘を「インターネットでニュース見てますので」と言って断ってるんだけどよく考えたら見てなかったから、新聞の人に申し訳なくて作った。
自分でインターネットにニュース見に行くの面倒くさいし、テレビとかラジオつけると余計な番組やっててウルサイからニュースだけ届けてほしい。

というわけで3ヶ月ぐらい前に作って、そこそこ良くてずっと使ってるから書いておく。


■使い方
詳細は上のgithubのREADMEを見るとよい。


面倒だったら
git clone git://github.com/shokai/speech-news.git
cd speech-news
gem install bundler
bundle install --path vendor/bundle
でインストールできて


読み上げる。
ruby -Ku speech_news.rb --help
ruby -Ku speech_news.rb

Mac/Linuxに喋らせるで書いた、MacのsayコマンドのKyoko化(日本語化)をやっておく必要あり。



■毎日決まった時間に読み上げる
crontab -e して
0 7 * * *  cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
0 12 * * * cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
0 19 * * * cd /Users/sho/src/ruby/speech-news && ruby -Ku speech_news.rb > /dev/null 2>&1
こう書いておくと、7時/12時/19時にニュース読んでくれる。朝はおはようって言うし夜はこんばんはって言う。
ちゃんと書けてるかは crontab -l で確認。


■Mac以外でも読み上げる
Mac/Linuxに喋らせるに書いたGoogle翻訳の声を使うgsayコマンドも一緒に入れておいた。
-sayオプションでgsayを使うようにすれば、Mac以外でも読んでくれる。声怖いけど。
ruby -Ku speech_news.rb -say "tools/gsay"


■Googleニュース以外も読み上げたい
pluginsディレクトリの中に.rbファイルを置けばニュースソースとして自動的に読み込むようになってる。
プラグインは読み上げるべき文字列を配列で返してくれるRubyプログラムならなんでも良い。
今はgoogle.rbだけが置いてある。


自分でプラグインを書くならgoogle.rbを参考にするとか、
a.rb
# プラグインのテストです
return ['うぽって微妙に古そうな銃ばかりでてくるし',
'あれは使われなくなった銃の行き着く精神世界なのでは',
'飛行機の墓場みたいな']
のような感じで、とりあえずStringのArrayを返すやつ書いてみると動く。

0

Mac/Linuxに日本語を喋らせる

喉が痛いのでなるべくしゃべらないようにしたい。


1. say

Macのsayを使う。
Lionから[システム環境設定]->[スピーチ]->[テキスト読み上げ]で「システムの声」にKyokoを指定すると日本語が読める。
たまに読みを間違えるが良い声だと思う。英語も読めるが、発音が日本人っぽくなる。


2. saykana

Mac用のゆっくり声。
http://www.a-quest.com/quickware/saykana/
インストールすると /usr/local/bin/saykana が使えるようになる。
漢字が読めない。ローマ字は「えーびーしー」のように発音する。


3. Google翻訳の声

前にしゃおさんにGoogle翻訳の声を取ってくる方法を教わった。


さすがGoogle、ほぼ漢字も読み間違えない。ただ声がちょっと怖い。

gsayというコマンドを作った

gsay はい
でしゃべる。

パラメータのjpをenに変えれば英語がしゃべれる。
ubuntuは先にmpg321をインストールしておく必要がある
sudo apt-get install mpg321


4. Open Jtalk

Macにインストールするのは面倒なので、これはUbuntu 12.04でしか使っていない。
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001
これでopen_jtalkコマンドでwavファイルを生成できるようになる

辞書は /var/lib/mecab/dic/open-jtalk/naist-jdic
音声は /usr/share/hts-voice/nitech-jp-atr503-m001
にインストールされる。


デフォルトの声がちょっと気持ち悪いので、MMDAgentの声をインストールする
mkdir ~/tmp/src
cd ~/tmp/src
wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.1/MMDAgent_Example-1.1.zip
unzip MMDAgent_Example-1.1.zip
sudo cp -R MMDAgent_Example-1.1/Voice/* /usr/share/hts-voice/


jsayというコマンドを作った。
jsay はい
みたいに使う。


参考

1

RANSおもしろい



正規表現にマッチしうる単語を全パターン生成したら順番が付けれるので、圧縮とかに使えるというもの


インストールした
brew install https://raw.github.com/sinya8282/homebrew/rans/Library/Formula/rans.rb --HEAD


SFCの学籍番号で試す
% rans "[ts]\d{5}[a-z]{2}" --text t03792sh
70163867
むしろ長くなった


戻す
% rans "[ts]\d{5}[a-z]{2}" --value 70163867
t03792sh



速い
% time rans "a*(c*|b*)" --value 100000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
rans "a*(c*|b*)" --value 100000 0.15s user 0.00s system 94% cpu 0.159 total


正規表現にマッチする正規表現
% rans ".+" --text "[ts]\d{5}[a-z]{2}"
31462101652614893842981046923104593130365
% rans ".+" --value 31462101652614893842981046923104593130365
[ts]\d{5}[a-z]{2}


日本語通る
% rans ".+" --text "RANSに日本語通るじゃん"
147105960411517028678017420574823136344237912645382197029890108076901827475
% rans ".+" --value 147105960411517028678017420574823136344237912645382197029890108076901827475
RANSに日本語通るじゃん


奇数
% rans "([1-9]+\d*)?[13579]" --value 0
1
% rans "([1-9]+\d*)?[13579]" --value 1
3
% rans "([1-9]+\d*)?[13579]" --value 2
5
% rans "([1-9]+\d*)?[13579]" --value 3
7
% rans "([1-9]+\d*)?[13579]" --value 4
9
% rans "([1-9]+\d*)?[13579]" --value 11
23