ぬけラボ

φ(..)メモメモ

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に入れてみよう。

スマフォアプリ開発

AndroidアプリとiPhoneアプリを同じコードで作るには
どうしたら良いか色々調べてみました。

・Titanium Mobile
→ IOSは問題ないが、Androidで動作に問題多数
・PhoneGap
→ 速度、メモリ的な問題
・Flash Professional
→ 金銭的な問題、アニメーション速度が遅い
・Flash Builder + Flex
→ 速度、メモリ、ファイルサイズ、金銭的な問題


やはり現時点だと情報、速度、などなどの面からネイティブコードが一番らしいです。

ネットワークのスループット調査ツール

ギガビット対応のスイッチを買ったのでスループットを調べてみました。

  • 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 Methods

それでは、Streaming APIを使ってツイートを検索してみましょう。
プログラミング言語PHPJavascriptを使用します。

実行環境 : 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を使って、タブのスピナーが表示されないようにしましょう。
ついでに表示も最新のツイートが一番上に挿入されるように変更します。
改良にはJavascriptjQueryを使用します。

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で読込みます。

AjaxXmlHttpRequestのステータスが3(読込んだデータを解析中)の時にツイートを表示するようにしています。
こうすることで、サーバからレスポンスを受け取るためのクライアントリクエストが発生しません。
クライアントからのリクエストが無くてもサーバからレスポンスを受け取れます。

通常のAjaxだとステータスが4(通信完了)でレスポンスを受け取ります。
ステータスが4になるにはクライアントからサーバへのリクエストとサーバからクライアントへのレスポンスのやり取りが完了した時です。
このようなクライアントからのリクエストが無くてもサーバからレスポンスを得られる手法をComet(ストリーミング)と言うそうです。


これを利用してニコニコ動画の右から左へ流れるコメント的なのを近いうちに作ってみたいと思います。

関数とメソッドの違い

PHPで関数とメソッドの違いが良く分からなかったので調べてみた。

関数とは

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。*1

メソッドとは

オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。*2

どういうこと?

↓ こういうこと。

<?php
//関数
function kansuu($hikisuu){
	echo $hikisuu, PHP_EOL;
}

class Test
{
	//メソッド
	static public function method($hikisuu) {
		echo $hikisuu, PHP_EOL;
	}
}

//関数
kansuu('kansuu');

//メソッド
Test::method('method');

*1:http://e-words.jp/w/E996A2E695B0.html

*2:http://e-words.jp/w/E383A1E382BDE38383E38389.html

NewSQL

データベース技術は、
SQL → NoSQL → NewSQL
という流れで来てるらしい。

元サイボウズラボの奥さんの
MyCachedというNewSQLを発表したという記事を見つけた。
http://www.publickey1.jp/blog/10/nosqlmysqldenamemcached75.html

最初に発表されたのはMyCachedぽいけど、
DeNAが大々的にHandlerSoketを使うものだから、
知名度は圧倒的にHandlerSoketの方が上みたいですね。


ちなみに...

知り合いのスーパーエンジニア曰く、
NoSQLが早くてSQLより良い!と言ってる人はまだまだらしい。
SQLもちゃんと設計してハイパフォーマンス化を考えればメチャ速いと教わった。
Cとかで直接コード叩くのが一番早いとのこと?それがNewSQL?