2012年 1月 17日 はてなブックマーク -
タグ: #PHP

Goutte(グート)とは

Goutteは必要十分な機能を持ったWebスクレイピングライブラリです。そもそもWebスクレイピングというのは、外部Webページから必要なデータを取ってくるくらいの意味です。つまり、GoutteはWebスクレイピングを簡単に行う道具だと考えればいいでしょう。

具体的には、GoutteはWebクローラとHTMLパーサを組み合わせたようなものです。Cookieやフォームの扱いなどWebブラウザとしての機能は一通り揃っていますし、CSS風の要素指定もできるなど、機能面では他のライブラリと遜色ないように感じます。

Goutteの実行例

Webスクレイピングのサンプルとして有名な、はてなキーワード「紺野あさ美」から数個のテキストを抜き出してみましょう。

use Goutte\Client;

$client = new Client();
$crawler = $client->request(‘GET’, ‘http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE’);
list(list($title, $url)) = $crawler->filter(‘div.keyword-container a.title’)->extract(array(‘_text’, ‘href’));
$furigana = $crawler->filter(‘div.keyword-container span.furigana’)->text();

var_dump($title, $url, $furigana);


上記を実行すると次の結果が得られます。

string(15) “紺野あさ美”
string(39) “/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE”
string(18) “こんのあさみ”

WebスクレイピングライブラリGoutteで遊んでみる - hnwの日記

1ヶ月前 | | 2012年 1月 17日 | このエントリーを含むはてなブックマーク
2011年 12月 1日 はてなブックマーク -
タグ: #MySQL #PHP #PDO

プリペアドステートメントにはパフォーマンスの利点(同じクエリを何度も発行するときにDBサーバーがクエリの解析を繰り返さないでもすむ)というものと、SQLインジェクション対策になる(正しくSQLを実行できる)という利点がありますが、特にPHPではWebアクセスの度にプリペアし直すのでパフォーマンスの利点は殆ど無くて、基本的には正しくSQLを実行するために使ってることが多いのではないでしょうか?

変数を含むSQLを正しく実行するのに、別にプリペアドステートメントを使う必要はありません。変数の値を、正しくエスケープ処理して、SQLに埋め込めば良いのです。そして、 PDO::ATTR_EMULATED_PREPARE を利用すると、PDOのプリペアドステートメントを普通に使うだけで、PDO内部で正しくエスケープされたSQLを構築してMySQLに投げてくれるので、クエリ実行時に発行するコマンドが1つですむようになり、DBサーバーのCPU,ネットワーク帯域、パケット数を全て削減できます。この設定をするには、PDOのオブジェクトに対して次の1行を実行するだけです。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

DSAS開発者の部屋:MySQL を PDO で使うときは ATTR_EMULATE_PREPARES を設定しよう

注意しないといけない点として、この設定を使うと一部挙動が変わる可能性があります。たとえば、 “…LIMIT ?” というクエリに ->execute(array(…, 3)); とすると、 “…LIMIT ‘3’” (シングルクォートに注目) に展開されてしまってSQLが不正になってしまうので、型を指定して bindParam() を利用するなり、整数型と判っている部分だけ通常の ($limit が正の整数として “…LIMIT $limit” のような) 文字列処理をする必要があります。


2ヶ月前 | | 2011年 12月 1日 | このエントリーを含むはてなブックマーク
2011年 10月 3日 はてなブックマーク -
タグ: #PHP #グラフ
[PHP] pChartの使い方 - 棒グラフとレーダーチャートを描いてみる|A Day In The Boy’s Life

前回の「ノンプログラミングでも利用可能!PHPで多様なグラフを作れるpChart 」で、pChartの概要を書いてみましたが、多種多様でおまけにスタイリッシュなグラフを簡単に書くことができます。

前回はプログラムについて深く突っ込みませんでしたが、今回はpChartのライブラリを使ってPHPからグラフを描き出す方法について書いてみたいと思います。


pChartのライブラリを使うための準備

pChartのサンプルやサンドボックスを見たい場合は、pChartのソースをそのままドキュメントルート以下に設置するというやり方でも問題ありませんが、クラスライブラリだけを使いたい場合は、ドキュメントルート外におくだけでなく不要なファイルも消しておいたほうがよいでしょう。

まず、pChartのソースの中でクラスライブラリとして利用するにあたって必要なディレクトリは下記のものです。

.
`— pchart
    |— cache
    |— class
    |— data
    `— fonts


各フォルダの中身のファイルはそのままにしておきます。

前回書いたように、日本語フォントを使い他場合は、fontsディレクトリに使いたいフォントのttfファイルを格納しておきましょう。

これらのディレクトリを、php.iniで定義されているinclude_path内に設置しておけば、プログラム側の呼び出し方も簡略化できます。

[PHP] pChartの使い方 - 棒グラフとレーダーチャートを描いてみる|A Day In The Boy’s Life

前回の「ノンプログラミングでも利用可能!PHPで多様なグラフを作れるpChart 」で、pChartの概要を書いてみましたが、多種多様でおまけにスタイリッシュなグラフを簡単に書くことができます。

前回はプログラムについて深く突っ込みませんでしたが、今回はpChartのライブラリを使ってPHPからグラフを描き出す方法について書いてみたいと思います。


pChartのライブラリを使うための準備

pChartのサンプルやサンドボックスを見たい場合は、pChartのソースをそのままドキュメントルート以下に設置するというやり方でも問題ありませんが、クラスライブラリだけを使いたい場合は、ドキュメントルート外におくだけでなく不要なファイルも消しておいたほうがよいでしょう。

まず、pChartのソースの中でクラスライブラリとして利用するにあたって必要なディレクトリは下記のものです。

.
`— pchart
|— cache
|— class
|— data
`— fonts


各フォルダの中身のファイルはそのままにしておきます。

前回書いたように、日本語フォントを使い他場合は、fontsディレクトリに使いたいフォントのttfファイルを格納しておきましょう。

これらのディレクトリを、php.iniで定義されているinclude_path内に設置しておけば、プログラム側の呼び出し方も簡略化できます。

4ヶ月前 | | 2011年 10月 3日 | このエントリーを含むはてなブックマーク
2011年 7月 3日 はてなブックマーク -
タグ: #php #pcntl_fork

PHPにはマルチスレッドっていう概念がないのか?じゃあC#でBackgroundWorkerにやらせていたような非同期処理はいったいどうやってやればいいんだ?とかいう疑問があったけど、プロセス制御のPCNTL関数を使えば似たようなことができるそうだ。

並列処理の実装

PHP5.3.0 CLI + CentOS 5.4で検証した。eclipseで実行すると、なぜか途中で処理が終了する。コンソールから実行するとちゃんと動いた。ソースからインストールする場合は、configureオプションに—enable-pcntlを付けないと、実行時に関数が見つからなくて、エラーになる。

PHPでの並列処理について - With-No-Parachute D-side

サンプルコード付きで紹介されています。


7ヶ月前 | | 2011年 7月 3日 | このエントリーを含むはてなブックマーク
2011年 7月 3日 はてなブックマーク -
タグ: #php #pcntl_fork

PHPのpcntl_fork() を使用してping監視スクリプトの並列処理をやってみました。

結果、同時に起動する子プロセスの数にほぼ比例して実行時間が短縮されました。

ここではPHPのPEAR、及び Net_Ping を使用します。

以下は 並列処理と順次処理で実行した場合の処理時間の比較です。list.txtに登録したホスト数は57(テスト時はすべて疎通OK)

# time php ping.php
2009/05/16 11:15:58
real 0m12.355s
user 0m0.413s
sys 0m0.476s

# time php ping-nopcntl.php
real 3m48.298s
user 0m0.103s
sys 0m0.132s

firebird » 大量ホストのping監視をPHPスクリプトの並列処理でやってみる

7ヶ月前 | | 2011年 7月 3日 | このエントリーを含むはてなブックマーク
2011年 6月 22日 はてなブックマーク -
タグ: #php #pear #mecab

Packages

gdextra - The PHP extension which extends GD image functions.

The PHP extension which extends GD image functions.

  • Package name: gdextra
  • License: MIT License
  • Maintainers: Ryusuke SEKIYAMA, (as lead)
  • Releases: 0.4.0 (beta)
  • Install command: pear install opendogs/gdextra

mecab - The PHP bindings of the MeCab.

The PHP bindings of the MeCab.

  • Package name: mecab
  • License: MIT License
  • Maintainers: Ryusuke SEKIYAMA, (as lead)
  • Releases: 0.4.1 (beta)
  • Install command: pear install opendogs/mecab

qr - QR Code generator extension.

QR Code generator extension.

  • Package name: qr
  • License: MIT License
  • Maintainers: Ryusuke SEKIYAMA (as lead)
  • Releases: 0.4.0 (beta)
  • Install command: pear install opendogs/qr

tokyocabinet - The PHP bindings of the Tokyo Cabinet.

The PHP bindings of the Tokyo Cabinet.

  • Package name: tokyocabinet
  • License: MIT License
  • Maintainers: Ryusuke SEKIYAMA, (as lead)
  • Releases: 0.4.2 (beta), 0.4.1 (beta), 0.4.0 (beta)
  • Install command: pear install opendogs/tokyocabinet

unichar - The Unicode Character Utility Extension for PHP.

The Unicode Character Utility Extension for PHP.

  • Package name: unichar
  • License: MIT License
  • Maintainers: Ryusuke SEKIYAMA (as lead)
  • Releases: 0.4.0 (beta)
  • Install command: pear install opendogs/unichar

OpenDogs PHP extension channel

以下手順で利用できるそうです。
$ pear channel-discover pecl.opendogs.org
$ pear install opendogs/mecab


8ヶ月前 | | 2011年 6月 22日 | このエントリーを含むはてなブックマーク
2011年 5月 15日 はてなブックマーク -
タグ: #Linux #CentOS #php

Apacheの場合、さまざまな機能を「モジュール」という形で用意しています。
モジュールを増やせばたくさんの機能を利用できますが、その反面メモリを大きく消費してしまうという問題があります。
CentOSのデフォルト状態では、ほぼ全てのモジュールが有効になっているため、必要以外のモジュールを除外する必要があります。

例えば、一切モジュールを消さないデフォルトの状態だと、1プロセスあたり5MB程度のメモリを消費していることが分かります。

# ps aux|grep -v Ss|grep ‘[h]ttpd’|head -1
apache 22523 0.0 0.4 257548 5036 ? S 12:27 0:00 /usr/sbin/httpd

これを適切に設定しなおすと、4MB程度まで減らせます。
1プロセスあたり1MB省略できれば、200プロセスで200MB削減できることになりますし、実際にリクエストを受け付けているプロセスの場合はさらに消費メモリの差が出ることになります。

# ps aux|grep -v Ss|grep ‘[h]ttpd’|head -1
apache 24715 0.0 0.4 161716 4228 ? S 19:46 0:00 /usr/sbin/httpd

とはいえ、どのモジュールが必要なのかが分かりにくいので、モジュールの一覧と、私の勝手な重要度をまとめました。
重要度は、◎、○、△、+、の4種類で分類しており、一覧にある重要度のタイトルをクリックすると、フィルターすることも可能です。
◎=必須
○=あったほうが良い
△=必要ならあればよい
+=必要性なし



モジュール名コメント
mod_auth_basicベーシック認証
mod_auth_digestダイジェスト認証
mod_authn_file認証にテキストファイルを利用する
いわゆる.htpasswdを使う場合は必要
mod_authn_alias
mod_authn_anon匿名ユーザを認証する
mod_authn_dbm認証にDBMファイルを利用する
mod_authn_default
mod_authz_hostホスト/IPアドレスでのアクセス制限
Orderや、Allow from ?? を使う場合は必須
mod_authz_userユーザ名でのアクセス制限
mod_authz_ownerファイル所有者でのアクセス制限
mod_authz_groupfileグループでのアクセス制限を行う(テキストファイル)
mod_authz_dbmグループでのアクセス制限を行う(DBMファイル)
mod_authz_default
mod_ldapLDAP用の基本モジュール
mod_authnz_ldapLDAPでのアクセス制限
mod_includeSSIを提供
SSIを利用する場合は有効にする
mod_log_configログ保存
アクセスログをとるためには必須
mod_logio送受信バイト数のログ保存(このモジュールがなければ保存できない)
mod_envCGIやSSIでの環境変数を設定する
必要なければ無効でかまわない
mod_ext_filterデータ返送時に外部プログラムを経由させる
mod_mime_magicファイルの内容をベースにMIMEタイプ決定
mod_expiresExpireヘッダをセットする
mod_deflateデータ返送時に圧縮する
mod_headersリクエスト、レスポンスヘッダを制御する
必要なければ無効でかまわない
mod_usertrackクッキーでユーザ追跡を行う
mod_setenvif環境変数の制御を行う
無効でもかまわないが、標準の設定ファイルで利用されており、有効にするのが無難
mod_mime拡張子をベースにMIMEタイプを決定
mod_davWebDAVを提供
mod_status/server-statusにてサーバ状態を表示する(URLは変更可能)
mod_autoindexディレクトリへのアクセス時にファイル一覧を作成する
mod_info/server-infoにてサーバ設定を表示する(URLは変更可能)
mod_dav_fsWebDAVを提供
mod_vhost_aliasバーチャルホストを簡単に生成
mod_negotiationクライアントに適したファイルを自動判別する(.jaなど)
mod_dirディレクトリの取り扱いを行う(index.htmlの取り扱いなど)
mod_actions特定の拡張子へのリクエストに応じてCGIを実行する
mod_speling大文字小文字を同じように扱えるようにする
mod_userdirユーザのホームディレクトにアクセスできるようにする(チルダ形式など)
mod_aliasAliasやRedirectを利用できるようにする
mod_rewriteRewrite機能を提供する
mod_proxyProxyを提供する
mod_proxy_balancerProxy時に負荷分散機能を提供
mod_proxy_ftpProxy時にFTP接続機能を提供
mod_proxy_httpProxy時にHTTP接続機能を提供
mod_proxy_connectProxy時にCONNECT機能を提供
mod_cacheキャッシュを提供
mod_suexecsuexecを提供
mod_disk_cachecache_moduleにおいて、ディスクキャッシュを提供
mod_file_cache静的ファイルをメモリにキャッシュさせる
mod_mem_cachecache_moduleにおいて、メモリキャッシュを提供
mod_cgiCGIを提供
mod_versionクライアントへのレスポンスにApacheバージョンを挿入する


※注意点
以下のモジュールを無効にすると、標準の設定ファイル(/etc/httpd/conf/httpd.conf)のまま起動するとエラーとなります。

  • mod_authz_hostを無効にした場合には、OrderやAllowなどの項目(例えば332行目など)をコメントアウトする必要があります
  • mod_proxyを無効にした場合には、以下ようにコマンドを実行し拡張設定ファイルを無効化する必要があります
  • # mv /etc/httpd/conf.d/proxy_ajp.conf /etc/httpd/conf.d/proxy_ajp.conf.stop
  • mod_autoindexを無効にした場合には、IndexOptionsから始まる関連項目(例えば592行目?657行目)を全てコメントアウトする必要があります
    もしくは以下のとおり、<IfModule>で括ってしまう方法もあります
  • vi /etc/httpd/conf/httpd.conf
    <IfModule mod_autoindex.c>
    IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable
    ・・略・・
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
    </IfModule>

ちなみに、私はいつも以下のモジュールを有効にしています。
なお、mod_autoindex と mod_proxy を無効化していますので、前述のとおり設定を変更しなければエラーとなって起動しません。

LoadModule authz_host_module modules/mod_authz_host.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule status_module modules/mod_status.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so


ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編) - さくらインターネット創業日記

9ヶ月前 | | 2011年 5月 15日 | このエントリーを含むはてなブックマーク
2011年 5月 4日 はてなブックマーク -

『preg_match』 — 正規表現によるマッチングを行う

ヒント:
ある文字列が他の文字列内に含まれているかどうかを調べるためだけに
preg_match() を使うのは避けた方が良いでしょう。
strpos() か strstr() 関数を 使う方が速くなります。
だってさ。

preg_match(“/パターン/”, 調べる文字列);

  • ”/パターン/”        //文字列の1行目のみを調べる
  • ”/パターン/s”   //改行文字を無視し、1行とみなして調べる
  • ”/パターン/i”       //文字列の大文字・小文字を区別しない
  • ”/パターン/is”      //大文字・小文字を区別せず、1行とみなして調べる

『”/パターン/g”』は「複数行を調べる」という記述を発見したが、これは実際にはエラーになるらしい。
g修飾子を使うためには『preg_match_all』を使わなければならないそうだ。

『preg_match』 は、pattern がマッチした回数を返す。
つまり、0回(マッチせず)または 1回となる。
これは、最初にマッチした時点で『preg_match』は検索を止めるため。
逆に『preg_match_all()』は、subject の終わりまで検索を続けます。
『preg_match』 は、エラーが発生した場合にFALSEを返します。

『preg_match』の何たらかんたら:humming bird

9ヶ月前 | | 2011年 5月 4日 | このエントリーを含むはてなブックマーク
2011年 4月 30日 はてなブックマーク -
ちょっとしたコードを試すならやっぱり『Codepad』が便利だなぁ | IDEA*IDEA

様々なプログラミング言語の実行結果をブラウザ上で確認できるサイトです。
もちろん使えない命令なんかもあるのですが、ブラウザでワンクリックで使えるというのは便利ですね。

» codepad
http://codepad.org/

対応言語:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl

ちょっとしたコードを試すならやっぱり『Codepad』が便利だなぁ | IDEA*IDEA

様々なプログラミング言語の実行結果をブラウザ上で確認できるサイトです。
もちろん使えない命令なんかもあるのですが、ブラウザでワンクリックで使えるというのは便利ですね。

» codepad
http://codepad.org/

対応言語:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl

9ヶ月前 | | 2011年 4月 30日 | このエントリーを含むはてなブックマーク
2011年 4月 20日 はてなブックマーク -

NULL文字無効化

PHP 5.3.4で導入されたNULL文字の無効化は,サンプルコードのような脆弱なスクリプトの問題の主要な部分を解決します。分かりやすくするためにファイル名はスクリプト中に記述します。

<?php
$filename = "/etc/passwd\0.png";
if (preg_match('|\.png$|', $filename)) {
  echo readfile($filename);
}
?>

このコードをPHP 5.3.4以前で実行すると

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[省略]

のようにパスワードファイルをダンプしてしまいます。PHP 5.3.4以降で実行するとreadfile関数がFALSEを返すため何も表示されません。

なぜPHPアプリにセキュリティホールが多いのか?:第41回 PHP 5.3.4におけるセキュリティ上重要な仕様変更|gihyo.jp … 技術評論社

PHP本体はC言語で記述されているため,ファイルを開く場合,最終的にはC言語のライブラリにファイル名が渡されます。C言語の文字列はバイナリセーフではなく,NULL文字(\0)は文字列の終端を表す文字になっています。一方,PHPの文字列はバイナリセーフであるためNULL文字は特別な意味を持ちません。

このPHP言語とC言語の文字列型変数の仕様の違いにより,脆弱なスクリプトが存在するとNULL文字を利用した強制ブラウズが行えるようになっていました。

サンプルコード1

if (preg_match(‘|.png$|’, $_GET[‘png_file’])) {
echo readfile($_GET[‘png_file’]);
}
?>


10ヶ月前 | | 2011年 4月 20日 | このエントリーを含むはてなブックマーク
2011年 4月 19日 はてなブックマーク -
<?php
// IP アドレス ‘192.168.0.100’ でインターネットに接続する
$opts = array(
‘socket’ => array(
‘bindto’ => ‘192.168.0.100:0’,
),
);


// IP アドレス ‘192.168.0.100’ とポート番号 ‘7000’ でインターネットに接続する
$opts = array(
‘socket’ => array(
‘bindto’ => ‘192.168.0.100:7000’,
),
);


// ポート番号 ‘7000’ でインターネットに接続する
$opts = array(
‘socket’ => array(
‘bindto’ => ‘0:7000’,
),
);


// コンテキストを作成し…
$context = stream_context_create($opts);

// …そしてデータを取得するためにそれを使用する
echo file_get_contents(‘http://www.example.com’, false, $context);

?>

PHP: ソケットコンテキストオプション - Manual

複数のインターフェース(NIC)があるサーバ等のマシンから外にリクエストを送る際、利用する経路を指定する方法。


10ヶ月前 | | 2011年 4月 19日 | このエントリーを含むはてなブックマーク
2011年 4月 14日 はてなブックマーク -
タグ: #php #pecl #pear

PEAR・PECLでproxyを越えてインストールする方法

proxyサーバを設定(PECLも以下のコマンドを実行することでproxy越えが可能となります)
認証が不要な場合

# pear config-set http_proxy http://proxyサーバ名:ポート番号

認証が必要な場合

# pear config-set http_proxy http://ユーザ名:パスワード@proxyサーバ名:ポート番号

設定を解除

# pear config-set http_proxy none

PHP/PEAR・PECLでproxyを越えてインストールする方法 - PukiWiki

http_proxy=ではなく、空スペースです。


10ヶ月前 | | 2011年 4月 14日 | このエントリーを含むはてなブックマーク
2011年 4月 14日 はてなブックマーク -
タグ: #php #pecl #pear

PHP のモジュールを追加するときに使う pear や pecl は、プロキシ対応を独自でやっているので設定しなくてはいけません。

設定するには次のようにします。

% pear config-set http_proxy=http://foo:[email protected]:8080

ちなみに、これで設定すると pecl にも反映されるので pear だけ設定すれば OK です。
試しに確認してみましょう。

% pecl config-get http_proxy
http://foo:[email protected]:8080

ricollab Web Tech Blog » Blog Archive » プロキシ認証の通し方まとめ その2

10ヶ月前 | | 2011年 4月 14日 | このエントリーを含むはてなブックマーク
2011年 4月 5日 はてなブックマーク -
タグ: #php #jQuery #youtube #flash
Custom YouTube Player Reload ? Scripts and Code

Youtube動画埋込みを独自デザインにしたい場合に使えるjQueryプラグイン「Custom Youtube Player」
Youtubeの通常のembedタグを埋めこむと、再生ボタンやらなにやらが付いていたりしますが、次のように、再生ボタンなしに出来ます。
これだけでも、デザインされたサイトには馴染みそうですね。バーがあるとデザイン全体が台なしというケースもありそう。



更に、カーソルを合わせると次のようにカスタマイズされたコントロールバーが現れます。



このコントロールバーは、JavaScript + CSS + 画像でデザインされており、ファイルをいじれば好きにカスタマイズすることも可能です。



サイトに動画を埋め込みたい、でも一目見ただけで、Youtubeとわかるあのインタフェースはちょっと・・・、という方はこちらを試してみるとよさそうですね。

JavaScript と CSSさえいじってしまえば、あとは、 $(element).customYtPlayer() ってやるだけで初期化が完了します。

また、こちらのチュートリアルでもカスタマイズ方法について触れられています。動画の上にオーバーレイしている再生ボタンもカスタマイズ出来るみたいです。



関連エントリ

Youtube動画埋込みを独自デザインにしたい場合に使えるjQueryプラグイン「Custom Youtube Player」:phpspot開発日誌

実は、ニコニコ動画も初期はこのようなAPIを組み合わせてyoutube上に字幕を流していました。


10ヶ月前 | | 2011年 4月 5日 | このエントリーを含むはてなブックマーク