Windows8CP版
Windows8のコンシューマープレビュー版がダウンロード可能になったようですね。
詳しい情報は以下のサイトから
http://blogs.msdn.com/b/b8_ja/archive/2012/02/29/windows-8-consumer-preview.aspx
ダウンロードは以下のサイトから
http://windows.microsoft.com/ja-JP/windows-8/consumer-preview
とりあえずVirtualboxに入れてみよう。
ネットワークのスループット調査ツール
ギガビット対応のスイッチを買ったのでスループットを調べてみました。
- BUFFALO LSW3-GT-5SN/BK
ネットワークスループット調査ツール
PC と server の間でスループットを調査するには以下のようなツールがあります。
- iperf
- jperf
- netperf
- ethtool
- mii-tool
今回はiperfを使ってPCからServerへのスループットを確認してみました。
IX2015のビルドインスイッチ
まずは、ルータのビルドインスイッチで測定
[ネットワーク構成] Internet | router(IX2015) | +------------+ | | PC(1G) server(100M)
bin/iperf.exe -c 192.168.0.254 -P 1 -i 1 -p 5001 -f k -t 10 ------------------------------------------------------------ Client connecting to 192.168.0.254, TCP port 5001 TCP window size: 8.00 KByte (default) ------------------------------------------------------------ [248] local 192.168.0.2 port 21196 connected with 192.168.0.254 port 5001 [ ID] Interval Transfer Bandwidth [248] 0.0- 1.0 sec 9600 KBytes 78643 Kbits/sec [248] 1.0- 2.0 sec 9592 KBytes 78578 Kbits/sec [248] 2.0- 3.0 sec 9192 KBytes 75301 Kbits/sec [248] 3.0- 4.0 sec 9760 KBytes 79954 Kbits/sec [248] 4.0- 5.0 sec 9792 KBytes 80216 Kbits/sec [248] 5.0- 6.0 sec 9736 KBytes 79757 Kbits/sec [248] 6.0- 7.0 sec 9704 KBytes 79495 Kbits/sec [248] 7.0- 8.0 sec 9496 KBytes 77791 Kbits/sec [248] 8.0- 9.0 sec 9856 KBytes 80740 Kbits/sec [248] 9.0-10.0 sec 9752 KBytes 79888 Kbits/sec [248] 0.0-10.0 sec 96488 KBytes 79019 Kbits/sec Done.
ギガビットスイッチ
ギガビットスイッチを間に挟んで測定。
[ネットワーク構成] Internet | router(IX2015) | switch(LSW3-GT-5SN) | +------------+ | | PC(1G) server(100M)
bin/iperf.exe -c 192.168.0.254 -P 1 -i 1 -p 5001 -f k -t 10 ------------------------------------------------------------ Client connecting to 192.168.0.254, TCP port 5001 TCP window size: 8.00 KByte (default) ------------------------------------------------------------ [248] local 192.168.0.2 port 21371 connected with 192.168.0.254 port 5001 [ ID] Interval Transfer Bandwidth [248] 0.0- 1.0 sec 11096 KBytes 90898 Kbits/sec [248] 1.0- 2.0 sec 11192 KBytes 91685 Kbits/sec [248] 2.0- 3.0 sec 11200 KBytes 91750 Kbits/sec [248] 3.0- 4.0 sec 11168 KBytes 91488 Kbits/sec [248] 4.0- 5.0 sec 11096 KBytes 90898 Kbits/sec [248] 5.0- 6.0 sec 11104 KBytes 90964 Kbits/sec [248] 6.0- 7.0 sec 11200 KBytes 91750 Kbits/sec [248] 7.0- 8.0 sec 11048 KBytes 90505 Kbits/sec [248] 8.0- 9.0 sec 11192 KBytes 91685 Kbits/sec [248] 9.0-10.0 sec 11104 KBytes 90964 Kbits/sec [248] 0.0-10.0 sec 111408 KBytes 91247 Kbits/sec Done.
結果として、ギガビットの方が早いです。
ニコニコストリーム
ニコニコストリーム( ゚д゚)!
前回の記事で試してみたTwitter Streaming API + Cometに変更を加えてニコニコ動画っぽくしてみました。
正直見難いです。。
何かイベントとかで使えたら良いけど。
コードもデザインももう少しどうにかした方が良いと思います。
コードはgithubにて公開します。
https://github.com/hiro-su/twitter-nicost
Twitter Streaming API + Comet(ストリーミング)
今更ながらTwitter Streaming APIを使ってみます。
Twitter Streaming APIとは
サーバにリクエスト投げて要求したXMLとかJSONファイルが返ってくるREST APIと違って、
Twitterのサーバにコネクション張りっぱなしの繋ぎっぱなしのStreaming API。
1時間あたりのアクセス数によるAPI制限などは無いようですが、
1IPアドレスに1コネクションという制限があり、複数のブラウザで同時に扱うことは出来ないようです。
それでは、Streaming APIを使ってツイートを検索してみましょう。
プログラミング言語はPHPとJavascriptを使用します。
実行環境 : Windows7_64bit, PHP5.3.5, Chrome or Firefox
Streaming APIへのアクセスはhttpsオンリーなので、
php.iniにopenssl.dllの設定が必要です。
XAMPPだとphp.iniに一行書き足すだけで良かった気がします。
php.ini
extension=php_openssl.dll
macの人はこちらを参照
http://jaspan.com/openssl-support-php-under-mamp
今回はハッシュタグに#nicovideoが設定されているツイートだけを表示するようにします。
注)現時点だと検索ワードに日本語は設定できないようです。
Streaming APIではBasic認証を使用します。usernameとpasswordは適切に設定してください。
stream.php
<?php //タイムアウトをしないように設定 set_time_limit(0); tweetStream('username', 'password', '#nicovideo'); /** * @param string $user Twitterのログイン名 * @param string $password Twitterのパスワード * @param string $keyword 検索キーワード **/ function tweetStream($user, $password, $keyword){ $keyword = urlencode($keyword); $url = "https://{$user}:{$password}@stream.twitter.com/1/statuses/filter.json?track={$keyword}"; if($stream = fopen($url, 'r')){ while(!feof($stream)){ $tweet= json_decode(fgets($stream), true); $user = $tweet['user']['screen_name']; $text = $tweet['text']; if(!empty($user)){ $timeline = '<strong>'.$user.'</strong> : '.$text.PHP_EOL; echo $timeline; ob_flush(); flush(); sleep(1); } } fclose($stream); } }
stream.phpでob_flush(); flush();を設定しているため、通信が完了しなくてもバッファをどんどん表示してくれます。
しかしながら、Streaming APIの仕様上、Twitterのサーバとコネクションを張りっぱなしな訳で、
タブのスピナーが回りっぱなしです。。。
Ajaxを使って、タブのスピナーが表示されないようにしましょう。
ついでに表示も最新のツイートが一番上に挿入されるように変更します。
改良にはJavascriptとjQueryを使用します。
js/stream.js
$(function(){ var ajax = $.ajaxSettings.xhr(); ajax.open('post', 'stream.php', true); $('#tweet').html('Loadig...'); ajax.send(null); ajax.onreadystatechange = function(){ if(ajax.readyState == 2){ $('#tweet').html(''); }else if(ajax.readyState == 3){ var data = ajax.responseText; var lines = data.split("\r\n"); var line = lines[lines.length-2]; if(line){ $('<li>'+line+'</li>').prependTo('#tweet').hide().fadeIn('slow'); } }else if(ajax.readyState == 4){ $('#tweet').prepend('接続が切れました。リロードしてください。').css('color', 'red'); } } });
index.html
<!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> </head> <body> <h2>Twitter #nicovideo Stream</h2> <ul id="tweet"></ul> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load("jquery", "1.7");</script> <script type="text/javascript" src="js/stream.js"></script> </body> </html>
最後にツイート中のリンクをクリック出来るようにaタグを自動生成したり、
ユーザの画像なども表示するようにstream.phpを修正してみます。
stream.php
<?php //タイムアウトをしないように設定 set_time_limit(0); /** * ハッシュタグに#nicovideoが設定されているツイートだけ表示 * usernameとpasswordは適切に設定してください **/ tweetStream('username', 'password', '#nicovideo'); /** * @param string $user Twitterのログイン名 * @param string $password Twitterのパスワード * @param string $keyword 検索キーワード **/ function tweetStream($user, $password, $keyword){ $keyword = urlencode($keyword); $url = "https://{$user}:{$password}@stream.twitter.com/1/statuses/filter.json?track={$keyword}"; if($stream = fopen($url, 'r')){ while(!feof($stream)){ //tweet data $tweet= json_decode(fgets($stream), true); //user name $user = $tweet['user']['screen_name']; //user image $userImage = $tweet['user']['profile_image_url']; //tweet text $text = $tweet['text']; if(!empty($user)){ $timeline = '<img src="'.$userImage.'">'.' <strong>'.$user.'</strong> : '.makeLink($text).PHP_EOL; echo $timeline; ob_flush(); flush(); sleep(1); } } fclose($stream); } } /** * リンク作成 * @param string The url string * @return string **/ function makeLink($string){ /*** make sure there is an http:// on all URLs ***/ $string = preg_replace("/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2",$string); /*** make all URLs links ***/ $string = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</A>",$string); /*** make all emails hot links ***/ $string = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<A HREF=\"mailto:$1\">$1</A>",$string); return $string; }
サンプルコードはgithubにアップロードしました。
https://github.com/hiro-su/twitter-streaming-api-test
stream.jsですが、stream.phpの表示データをAjaxで読込みます。
AjaxのXmlHttpRequestのステータスが3(読込んだデータを解析中)の時にツイートを表示するようにしています。
こうすることで、サーバからレスポンスを受け取るためのクライアントリクエストが発生しません。
クライアントからのリクエストが無くてもサーバからレスポンスを受け取れます。
通常のAjaxだとステータスが4(通信完了)でレスポンスを受け取ります。
ステータスが4になるにはクライアントからサーバへのリクエストとサーバからクライアントへのレスポンスのやり取りが完了した時です。
このようなクライアントからのリクエストが無くてもサーバからレスポンスを得られる手法をComet(ストリーミング)と言うそうです。
これを利用してニコニコ動画の右から左へ流れるコメント的なのを近いうちに作ってみたいと思います。
関数とメソッドの違い
PHPで関数とメソッドの違いが良く分からなかったので調べてみた。
関数とは
関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。*1
どういうこと?
↓ こういうこと。
<?php //関数 function kansuu($hikisuu){ echo $hikisuu, PHP_EOL; } class Test { //メソッド static public function method($hikisuu) { echo $hikisuu, PHP_EOL; } } //関数 kansuu('kansuu'); //メソッド Test::method('method');
NewSQL
データベース技術は、
SQL → NoSQL → NewSQL
という流れで来てるらしい。
元サイボウズラボの奥さんの
MyCachedというNewSQLを発表したという記事を見つけた。
http://www.publickey1.jp/blog/10/nosqlmysqldenamemcached75.html
最初に発表されたのはMyCachedぽいけど、
DeNAが大々的にHandlerSoketを使うものだから、
知名度は圧倒的にHandlerSoketの方が上みたいですね。
ちなみに...
知り合いのスーパーエンジニア曰く、
NoSQLが早くてSQLより良い!と言ってる人はまだまだらしい。
SQLもちゃんと設計してハイパフォーマンス化を考えればメチャ速いと教わった。
Cとかで直接コード叩くのが一番早いとのこと?それがNewSQL?