2010-06-23
muninでニコ生の放送中の枠数と枠待ち数のグラフ作った
ニコ生の枠数の推移が知りたかったので、muninのプラグインを書いたよ。
配信数はニコニコ生放送のトップページから、枠待ち数はちくわちゃんのとこのニコニコ生放送 リアルタイムランキングから、それぞれ正規表現で適当に取得してます。
ソースは以下のとおり。これをmuninのプラグインのディレクトリにつっこんで、ユーザーをmuninにchownしたりとかchmod +xとかすればたぶんいける。
#!/usr/bin/php <?php if(strcmp($argv[1],"autoconf")==0){ echo "yes\n"; exit; } if(strcmp($argv[1],"config")==0){ echo "graph_title nicolive_wakusu\n"; echo "graph_args --base 1000 -l 0\n"; echo "graph_scale no\n"; echo "graph_vlabel nicolive_wakusu\n"; echo "graph_category etc\n"; echo "graph_info This graph shows the number of wakusu in the nicolive\n"; echo "nicolive_wakusu.label wakusu\n"; echo "nicolive_wakusu.draw LINE2\n"; echo "nicolive_wakusu.info The current number of wakusu\n"; echo "nicolive_wakumati.label wakumati\n"; echo "nicolive_wakumati.draw LINE2\n"; echo "nicolive_wakumati.info The current number of wakumati\n"; exit; } $wakusu = getWakusu(); $wakumati = getWakumati(); echo "nicolive_wakusu.value $wakusu\n"; echo "nicolive_wakumati.value $wakumati\n"; exit; function getWakumati(){ $url = "http://www.chikuwachan.com/live/"; $html = file_get_contents($url); // <span style="color:#FF0000;font:bold 12pt 'Arial';">1</span> preg_match('|<span style="color:#FF0000;font:bold 12pt \'Arial\';">(.*?)</span>|u', $html, $match); if(!empty($match)){ return $match[1] ; } else { return "0"; } } function getWakusu(){ $url = "http://live.nicovideo.jp/"; $html = file_get_contents($url); $html = mb_convert_encoding($html, "UTF-8"); preg_match('|<span>(.*?)</span>|u', $html, $match); return $match[1]; } ?>
2010-02-23
いつの間にかyoutubeの動画ファイルのダウンロードが楽になってた
以前、youtubeの動画をダウンロードするPHPのスクリプトの例ってのを書いてたんだけど、前はgoogleのAPIから取って来てて、なんか仕様変わってたみたいでURL取れなくなってた。
調べてみると、今はもっと簡単に動画ファイルのURLが取れるようになってるというか、フツーに動画を見るページのHTMLの中にURLが書いてあったのでちょこちょこっとphpすればいいだけみたい。
ってことで、動画のページにアクセスしてそのHTMLの中から動画ファイルのURLを持ってくるPHPスクリプトの例を書いてみたよ。
$ cat test.php <?php $url = "http://www.youtube.com/watch?v=2N1XGtYXPrc"; $html = file_get_contents($url); preg_match('#"fmt_url_map": "(.*?)",#', $html, $match); $fmt_urls = split(",", urldecode($match[1])); foreach($fmt_urls as $fmt_url){ $t = split("\|", $fmt_url); $fmt = $t[0]; $url = $t[1]; echo "$fmt : $url\n"; } ?>
$ php test.php 34 : http://v15.lscache5.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=903103%2C904704&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1266948000&key=yt1&signature=3F82D7DE305A4678E96DA859914165CCECF0CF98.7B738D97CEF4445AB8505A49DB56D1D6D13C39DF&factor=1.25&id=d8dd571ad6173eb7 5 : http://v23.lscache1.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=903103%2C904704&algorithm=throttle-factor&itag=5&ipbits=0&burst=40&sver=3&expire=1266948000&key=yt1&signature=06FFEAFE03A9B7F403CB23AE44545357303000D8.D19916967550EB1EE883653EE7A90AB312D8F4F1&factor=1.25&id=d8dd571ad6173eb7
2010-02-19
画像に「!?」をつけて遊ぶWEBサービス作ったよ!
作ったサイト↓
作ろうと思った
いつものようにはてブのホットエントリーを開いて「あとで読む」タグをつける簡単なお仕事をしていたら、ASCII.jp:40分で覚える!jQuery速習講座ってのがあって、サブタイトルに”「あとで」読まずに今すぐ始める”とか書いてある訳で、「40分で覚えれるわけねーだろwwww」とか思って仕方なく実際にやって見ると意外にほいほい出来て楽しかった。
んで、カジ速Full Auto:画像に「!?」をつけて遊ぼうぜが面白かったのを思い出して、jquery使えばページ移動無しに画像に「!?」つけれるWEBサービスが簡単に作れるんじゃね?って事で、画像に「!?」つけた画像を作るジェネレータ、もしくは「!?」画像メーカーぽいの作ったよ。画像に「!?」をつけて遊ぶWEBサービスってことだけど、誰得なのかよくからん。
開発環境
いつもと同じように、windowsからpoderosaでdebianなサーバーにsshして入ってscreenで複数窓開いてvimして作ってる。
開発言語はPHPで、ちょこっとだけjquery使ってjavascript、DBはmysql、テンプレートエンジンはsmarty。
画像の取得はfile_get_contentsとかで適当実装で、文字の合成とかサムネ作成はGDさん。
開発中に飲んだ飲み物はホットコーヒー。
PHPとGDで文字を合成する
参考にしたサイトは、「php gd 文字」でググって出てきた以下のサイト。
GDで入力された文字列を画像で出力 - PHP入門(GD編 2) - イクケン
PHPで画像にGD使って文字を合成するにはimagettftext関数をつけばいいらしい。
例にならって、フォントはM+ WEB FONTSを使ってみた。
$font = "./mplus-2p-bold.ttf"; // フォントファイル
$image = @imagecreatefromjpeg("./test.jpg"); // ./test.jpgを読み込む
// フォントサイズが$font_sizeで、角度が0で、$fontを使用して、
// $textを表示する画像を作った場合の縦横の座標を取得する。
$r = imagettfbbox($font_size, 0, $font, $text);
$width = ($r[2] - $r[0]);
$height = ($r[3] - $r[7]);
$col = ImageColorAllocate($image, $red, $green, $blue); // RGBで色を作る
// $imageの($x - $width/2), ($y + $height/2)なところに、
// フォントが$fontでフォントサイズが$font_sizeで色が$colで
// 文字の角度が0な$textって文字を合成
ImageTTFText($image, $font_size, 0, ($x - $width/2), ($y + $height/2) , $col, $font, $text);
// jpeg出力
header("Content-type: image/jpeg");
Imagejpeg($image);
PHPとGDで画像のサムネイルを作る
参考にしたのは、「php gd サムネ」でググって出てきた以下のサイト。
【PHP】GDライブラリを使って画像のサムネイルを作成する。
サムネは縦横が128px以下にしたかったので、縦横のサイズの大き方を基準にして圧縮比を求めるようにした。
// make thumb
$width = ImageSX($image); //横幅(ピクセル)
$height = ImageSY($image); //縦幅(ピクセル)
if($width > $height){
$new_width = 128;
$rate = $new_width / $width; //圧縮比
$new_height = $rate * $height;
} else {
$new_height = 128;
$rate = $new_height / $height; //圧縮比
$new_width = $rate * $width;
}
$thumb = ImageCreateTrueColor($new_width, $new_height);
ImageCopyResampled($thumb,$image,0,0,0,0,$new_width,$new_height,$width,$height);
$save_filename = ".thumb.jpg";
Imagejpeg($thumb, "$save_filename");
マウスが画像をクリックした時の、マウスの画像上の座標を取得する
検索キーワード忘れたけど、ググったら出てきたサイトを参考にした。
やっぱりjquery使うと便利らしい。
例えば、↓みたいなHTMLがあった場合に、クリックした画像上の座標を取得するには、
<img id="preview_img "src="test.jpg">
↓みたいにjavascript書いておけばいいみたい。 Math.roundしてるのは、ブラウザの環境なのかよくわかんないけど、なぜか座標に小数が含まれていたので、四捨五入するため。
$("#preview_img").click(function(e){ var x = e.pageX - $('#preview_img').position().left; var y = e.pageY - $('#preview_img').position().top; x = Math.round(x); y = Math.round(y); alert("x=" + x + "y=" + y); });
今回作った「!?」画像ジェネレーターで実際にどうやってるかは、http://sdkt.info/bikkuri/bikkuri.jsがソースなので、それを参考に。
私的まとめ
2010-02-11
LM358でオーディオミキサー作ったら音割れし過ぎた
PCとかラジオとかテレビとかいろいろ配線あって、それをまとめてヘッドホンで聞きたかったので、入力4つをまとめるオーディオミキサーを自作してみた。入力側の個別の音量調整はなし(入力機器側で調整する)で、出力側にボリューム調整できるようにした。入力側にもそれつけようとしたら入力系等分だけ可変抵抗要るので、適当に安く作るのが難しいくなるので。
参考にしたサイトは↓。
オーディオミキーサーのキットとかもWEBを探せばあるけど、とりあえず安く作ろうと思ってオペアンプとかコンデンサは汎用品。超安い。だいたい1500円ちょいで作れた。
とりあえず、マルツパーツ館博多千代店で買ったもの。
- 赤い線 1m @21 x1 \21
- 黒い線 1m @21 x1 \21
- オペアンプLM358(2回路入り) @63 x2 \126
- ステレオジャック @73 x5 \365
- DCジャック @84 x1 \84
- 2連式ボリューム 50kΩ Aカーブ @157 x1 \157
- 電解コンデンサ 10uF @42 x5 \210
- 積層セラミックコンデンサ 0.1uF @21 x4 \84
- ICソケット8pin(2個入り) @115 x1 \115
- スイッチ @115 x1 \115
- 抵抗 22kΩ @5 x10 \50
- 抵抗アレイ 4抵抗 22kΩ @52 x2 \104
回路図は、↓こんな感じ。
↑これが、ステレオの片方の回路なので、同じやつを2回路作らないといけない。
左側が加算演算で音をまぜまぜする回路。右側が音量を調整する回路。
LM358の4ピンはGNDで8ピンはVccに接続。
適当に家にあった基板で組み立てて完成。
ケースはダイソーで適当なやつ見つけてそれに入れた。
音質とかどうでも良いよねって思ってLM358でオーディオミキサー作ったら、音割れし過ぎてワロタ
せめて、LM358とピン配置の互換がある、ちょこっと高いNE5532P(\73)とか少し高いNE5532AP(\378)とか使ってたら音割れひどくなかったかも。出来れば負電源とかも作ってやるといいかも。
あと、なんかラジオが聞こえる。超受信してる。アルミホイルぐるぐる巻きすれば大丈夫そう。試してないけど。
2010-02-10
wine使ってlinuxでゆっくりボイス
wineすごい。↓こんなこともできるなんて。
ってことで、AquesTalkはひらがなしか受け付けないみたいなので、mecabに投げたりして漢字をひらがなにしたうえで、AquesTalkに渡すphp書いた。といってもphpからshellで呼んでるだけなので超適当。
# aptitude install mecab # aptitude install mingw32 $ mkdir yukkuri_test $ cd yukkuri_test $ wget http://www.a-quest.com/download/package/aqtk20090609.zip $ unzip aqtk20090609.zip $ cp AquesTalk?/lib/AquesTalk.lib . $ cp AquesTalk?/inc/AquesTalk.h . $ cp AquesTalk?/bin/AquesTalk.dll . $ ls AquesTalk AquesTalk.dll AquesTalk.h AquesTalk.lib aqtk20090609.zip $ vi main.c $ i586-mingw32msvc-gcc main.c AquesTalk.lib -o aqwrap.exe $ echo "わいんでも、ゆっくりしていってね。"|nkf -s > test $ wine aqwrap.exe test x.wav 80 $ ls AquesTalk AquesTalk.dll AquesTalk.h AquesTalk.lib aqtk20090609.zip aqwrap.exe main.c test x.wav
↓これが標準入力から与えられた文章をゆっくりボイスにするphp 変数名とか超適当。
test.php 1 <?php 2 3 $str = file_get_contents("php://stdin"); 4 5 $str = mecabru($str); 6 7 $id = "test"; 8 $speed = 100; 9 yukkuri($str, $id, $speed); 10 mkmp3($id) 11 12 13 exit; 14 15 function mecabru($str){ 16 $str = str_replace("'", "", $str); 17 $result = `echo '$str'|/usr/bin/mecab|awk '/[^EOS]$/ {print $1"\t"$2}'`; 18 $l = preg_split("#\n#", $result, -1, PREG_SPLIT_NO_EMPTY); 19 $r = ""; 20 foreach($l as $a){ 21 $t = preg_split("#\t#", $a, -1, PREG_SPLIT_NO_EMPTY); 22 $s = preg_split("#,#", $t[1], -1, PREG_SPLIT_NO_EMPTY); 23 24 if(!isset($s[8]) || strcmp($s[8],"*")==0){ 25 $c = $t[0]; 26 } else { 27 $c = $s[8]; 28 } 29 $r .= $c; 30 } 31 return $r; 32 } 33 34 function yukkuri($str, $id, $speed){ 35 $alpha = array("a", "b", "c", "d", "e", "f", "g", 36 "h", "i", "j", "k", "l", "m", "n", "o", 37 "p", "q", "r", "s", "t", "u", "v", "w", 38 "x", "y", "z"); 39 $hira = array("えー","びー","しー","でー","いー","えふ","じー", 40 "えいち","あい","じぇい","けい","える","えむ","えぬ","おー", 41 "ぴー","きゅー","あーる", "えす","てー","ゆー","ぶい","だぶる", 42 "えっくす","わい","ぜっと"); 43 $komoji = array("ぁ","ぃ","ぅ","ぇ","ぉ"); 44 $oomoji = array("あ","い","う","え","お"); 45 $str = mb_convert_kana($str, "KVa"); 46 $str = mb_convert_kana($str, "c"); 47 $str = mb_ereg_replace("ヴ", "ぶ", $str, "utf-8"); 48 $str = strtolower($str); 49 $str = str_replace($alpha, $hira, $str); 50 $str = str_replace($komoji, $oomoji, $str); 51 52 $str = mb_ereg_replace("[^ぁ-んー、。]", "", $str); 53 aqwrap($str, $id, $speed); 54 } 55 56 function aqwrap($str, $id, $speed){ 57 $str = str_replace("'", "", $str); 58 `echo '$str'|nkf -s >$id.txt`; //s-jis 59 `wine aqwrap.exe $id.txt $id.wav $speed`; 60 } 61 62 function mkmp3($id){ //wav->mp3 63 `/usr/bin/ffmpeg -y -ab 128k -ar 16000 -i $id.wav $id.mp3 &>/dev/null`; 64 } 65 ?>
↓こんな感じで、実行すると1秒くらいで、test.wavとかtest.mp3とかが出来る。
$ echo にゃんにゃん|php test.php
ちなみに、別にどうでもいいけど、フツーに読み上げるだけなので、SoftTalkとはアクセントが違ったりする。
twitterのタイムラインとかを取ってきて、↑を通してmp3作って、mpg123とかで再生すれば、twitterのゆっくりボイス化が出来るハズ。




