2010年1月31日日曜日

「フリー~〈無料〉からお金を生みだす新戦略」を読んだ

 今頃、「フリー~〈無料〉からお金を生みだす新戦略」を読みました。

 題名からすると、世界的金融危機を発端とする未曽有の状況がデフレを誘発し、フリー(無料)ビジネスが勃興しているような事が書かれてあるのかな?と勘違いしかねません(いまどき、そんなやつはいないか…)。本書は情報革命が引き起こした現象としてのフリーに関する考察が書かれています。

 フリービジネスの現象を肌では実感していても、消化しきれていないというのが本音な人は、私も含めてたくさんいると思います。「フラット化する世界」等にも書かれているように、通信インフラが発達した事により場所の概念が変わり、真の機能競争・価格競争に突入しました。そして、半導体の集積度がムーアの法則により年々上がっているおかげで、1サービスあたりのコストが年々下がっています。そして、この事実が、フリービジネスを引き起こしているというのです。

 様々な角度から、フリービジネスに関する考察が書かれており、中でも面白いと思ったのが、ブラジルにおける音楽ビジネスの例です。この例では、インターネットによるフリー化の現象とは関係なく、テクノロジー(CDをコピーするコストが安く簡単になった)の進化によるフリー化がビジネスの形態を変えています。

 テクノロジーの進化で言えば、3D-printer があげられます。こうしたものは、どんどんと、ビジネスを変えていくでしょう。

 本書でフリーについて、かなり考察されていますが、現実は、まだ底を見せていないのではないか?という疑念が湧いてきました。ムーアの法則は、一般的には18ヶ月とされています。この期間を 1 mi として、単純に規模の差が、どの程度あるのか考えてみます。個人所有のパソコンを基礎として


個人所有のパソコン
   差:2^5 = 5 mi -> 7.5 年
サーバーラック 個人所有のパソコン×32台
   差:2^2 = 2 mi -> 3 年
企業内データ・センター(小)
サーバーラック×4セット
   差: 2^3 = 3 mi -> 4.5 年
中型データセンター
サーバーラック×32セット
   差: 2^5 = 5 mi -> 7.5 年
大型データセンター
サーバーラック×1024セット
   差: 2^4 = 4 mi -> 6 年
大企業データセンター
大型データセンター×16


という感じになります。ハードディスクの容量や、通信回線速度などは、18ヶ月とは異なる進歩になるため、だいぶ乱暴な推論ではありますが、28.5 年後には、個人の手に google がある勘定になります。そうなった時には、どんな時代が到来しているのか、ちょっと想像できません…。

 本書は、IT産業に関わる人なら必読の書と言えるでしょう。

2010年1月29日金曜日

Chrome ブックマークを同期

 GoogleChrome が新バージョンになって、いろいろとエクステンションが増えたみたい。その中にブックマークを同期なんて機能がありまして、クラウドなデータベースに自分のブックマークを保存する訳です。暗黙のうちにブックマークの情報を提供する事になるんです。
 便利なんだけど…、ま、気にしないのが今の流儀なんですかねぇ。素直に使いたくないですね…。

php メタメタ継承


<?php

class Base {
public function __construct() {
printf( "Base::Base()\n" );
}
}

class Deliver extends Base {
public function __construct() {
parent::__construct();
printf( "Deliver::Deliver()\n" );
}

public function __destruct() {
printf( "Deliver::~Deliver()\n" );
printf( "Open the gate.\n" );
parent::__destruct();
}
}

$p = new Deliver();

?>



わろた・・・

追記: bug report しようとしたら、すでにされていた…。1回 submit したら、AI的に似たreport を検索するあたりが、すごい…。と、妙なところに感心した

2010年1月27日水曜日

php で動的関数


<?php

class Foo {
public static function a() {
echo( "Foo::a()\n" );
}

public static function by_name() {
echo( "Foo::by_name()\n" );
}

public static function by_column(
$column,
$param
) {
echo( "Foo::by_column_" . $column . "(" . $param . ")\n" );
}

function __call( $name, $params ) {
$names = split( '[_]', $name );
if( $names[0] && $names[0] == "find" && $names[1] && $names[1] == "by" && $names[2] ) {
Foo::by_column( $names[2], $params[0] );
}
}

}

$cname = "Foo";

$cname::a();

$bname = "by_";

$dname = $bname . "name";

//$cname::$bname . "name"();
$cname::$dname();

$inst = new Foo;

$inst->find_by_session( "hoge" );

?>


 こうやってみれば、スクリプトはオモロイかも…。

2010年1月25日月曜日

石狩市のデータセンター

 本日は、全国SaaSベンダー連合会のワーキンググループ3の会合でした。札幌市情報産業振興部様の粋な取り計らいにより、懇親会が用意され、大変有意義な情報を得る事ができました。その中で、宣伝も兼ねてフラットな世界におけるフラットでないデータセンター構想の話をしたいと思います。
 石狩市にデータセンターを構築するという構想があり、着々と進行しています。グリーン・コンピューティングが叫ばれ、弊社でもグリーン・コンピューティングを実践しております。何のことは無い、サーバ室に冬場は冷房の替りに換気扇を取り付けて外気を取り込むだけの話です。
 冬場の排雪を無料でデータセンターまで運んでくれるか?との問いかけに応えてくれた自治体が石狩市だったという事が判明しました。他の自治体は、排雪をわざわざデータセンターまで運ぶという意思を示してくれなかったそうです。そして、この石狩市のデータセンターなのですが、東京の大手町から遅延する事 10 mmsec 以内という、とんでもない仕様を満たす予定らしいのです。
 フラットな世界において、フラットでないモノのひとつに政治・法律があります。例えば、データセンターからのデータ流出事件が海外であった場合、盗難の捜査すらできない可能性もあります。また、香港では中国が電力の供給をストップすれば手も足もでませんし、シンガポールもマレーシアへの依存が高くて怖い状況です。政治が安定しているという面では、日本はダントツです。(しかし、クラウド・RAID5で、リスクは分散できるかもしれません)

2010年1月23日土曜日

CookieとSession

 ふと閃いたので、記録しておく。
ウェブ・プログラミングの世界において、Cookie がサイトごとに保存されるのは承知の事です。で、Cookie の使い方には、二種類あって、
  1. Session を越えて永続的な状態の保存
  2. 認証をバイパスするためのチケットの保存
という使い方になっているのではないでしょうか?(1)の使い方に関しては、ブラウザでも読み出しが必要で、この状態を元に JavaScript で処理をします。(2)の使い方は、サーバ・サイドでチケットを確認して不正なチケットならログイン・ページへ飛ばすという使い方です。
 現在、Cookie はドメイン・レベルを絞る形でセキュリィティを確保していますが、(2)のタイプに関しては、ブラウザ(JavaScriptなど)から取得する手段を一切失くしてしまえば、少なくともクロス・サイト・スクリプティングの問題は無くなるのではないか?と思ったわけです。
 つまり、Cookie を二種類にするような規格化すればいいじゃねーの?

2010年1月21日木曜日

phpでアイコン作成

 いい加減、php 飽きてきたけど、ボリュームが多くて終わる気がしないし、ツール選択の余地もない。という状況ですが、みなさん、いかがお過ごしでしょうか?これを C++ で書いたら、しんどいです。アイコン作成…ゆりかごから墓場まで…どんだけー。


<?php

$width = 30;
$height = 20;
$basename = 'r_';
$n = 400;

$top_x = 5;
$top_y = 3;


for( $i = 1; $i < $n; ++$i ) {
$img = imagecreate( $width, $height );
$wkc = imagecolorallocate( $img, 255, 0, 0 );
$bkc = imagecolorallocate( $img, 255, 172, 172 );
$wmc = imagecolorallocate( $img, 255, 255, 255 );
$fmc = imagecolorallocate( $img, 0, 0, 0 );
imagefilledrectangle( $img, 0, 0, $width-1, $height-1, $bkc );
imagesetthickness( $img, 3 );
imagerectangle( $img, 0, 0, $width-1, $height-1, $wkc );
$str = sprintf( "%3d", $i );
for( $x = 0; $x < 3; ++$x ) {
for( $y = 0; $y < 3; ++$y ) {
imagestring( $img, 3, $top_x + $x - 1, $top_y + $y - 1, $str, $wmc );
}
}
imagestring( $img, 3, $top_x, $top_y, $str, $fmc );
imagegif( $img, $basename . "{$i}.gif" );
imagedestroy( $img );
}


?>

2010年1月19日火曜日

visual studio 2010 の include path

 プロジェクト毎に、GUIで追加の include パスと、library パスを記述しろってか???
イジメだろ…。
 つか、イジメだろ…。
   やっぱ、イジメでしょ?
     誰も、なんとも思わないの???
      どう考えても、イジメだよね???

2010年1月14日木曜日

話題になってるアレ

 アレですが、問題をよく読んでいなくて、入力テキストが長方形と保証されていないものとして、とっかかって25分ほど費やしてやめた。長方形と保証されていなければ、とても3時間で解ける代物では無さそうだからだ。グラフ構造に落とし込んでも、元のテキストに復元する事まで考えると、結構難しい。
 結局、ポイントは、二次元配列で扱える事なのだろう。後は、スタート位置から進行可能な上下左右位置に1歩づつ訪問済みのマークを付けて、訪問済みの位置は壁として扱い、進行可能な限り上下左右を再帰していけば解けるのだろう。
ただし、1歩づつ再帰しないといけないので、ここも難しい。一歩づつでなければ最短経路を見つけるのは難しい。結局グラフ構造に落とし込まないといけない。
 という訳で、あんたすげーよ。

2010年1月13日水曜日

php でシングルトン


<?php

class Foo {
private function __construct() {
$this->t = 'initialized Foo';
}

public $t;

public static function &getFooInstance() {
static $foo_instance;
if( !isset( $foo_instance ) ) {
$foo_instance = &new Foo;
}
return $foo_instance;
}

}

$f = Foo::getFooInstance();

echo $f->t . "\n";

/*
$g = new Foo;

echo $g->t . "\n";
*/

?>


php の引数の型がクラスの場合は、値?参照?


<?php

class Foo {
function Foo() {
$this->t = "Foo";
}

function test() {
$this->t = "Bar";
}

function test2( $foo ) {
$foo->t = "fuga";
}

var $t;
}

function test1( $foo ) {
$foo->test();
}


function test2( $foo ) {
$foo->t = "Boo";
}

$f = new Foo;

echo $f->t . "\n";

test1( $f );

echo $f->t . "\n";


test2( $f );

echo $f->t . "\n";

Foo::test2( $f );

echo $f->t . "\n";

$f->test();

echo $f->t . "\n";

$g = new Foo;

$g->test2( $f );

echo $f->t . "\n";


?>


結果、引数の型がクラスの場合は、参照 値渡しのポインタ(追記:というよりも、ポインタというべきか…)



Foo
Bar
Boo
fuga
Bar
fuga


うーん、基本的な記述がマニュアルで見つけられない…

2010年1月12日火曜日

php 入れ子関数と変数の関係

phpのマニュアル等に基本的な事が書かれていないので、スクラッチにより仕様を確認した。


<?php

define( 'INTERNAL_FUNC_TESTCASE', 1 );

function hoge( &$a, $b ) {
if( INTERNAL_FUNC_TESTCASE == 1 ) {
function hoe() {
$a = $a . ' ' . $b;
}
hoe();
} else {
function hoe( &$a, $b ) {
$a = $a . ' ' . $b;
}
hoe( $a, $b );
}
}

$c = 'hello';
$d = 'world';

hoge( $c, $d );

echo $c;

?>


INTERNAL_FUNC_TESTCASE 1 では、'hello'

それ以外では、 'hello world'


変数のスコープは、関連が無いようだ。

2010年1月10日日曜日

儲かる農業 感想

 「働かざるもの、飢えるべからず」を読んで、単純に考えるに、かの兼好法師も「農を勸めば、下に利あらむこと疑ひあるべからず」とおっしゃっていた事から、まず、日本の食料自給率を上げる事から始めるべきだろう…と思いました。
 という訳で、「儲かる農業」なのだ。
 どんな事が書いてあるか?というと、営業さんが契約栽培の仕事を取ってきて、その取引量に応じて野菜等を生産するというビジネスモデル。
 下地になっているのは、今の農産物・流通システムに対する疑問です。今やネット・広告で、どの農産物が安い値段で売っているか?は、誰でも簡単に調べられます。そんな訳だから、スーパーも安売り競争を仕掛ける。バリュープライス!なんて標語を掲げて、どんどん安く売る。そのしわ寄せは、最終的には農家へ来ます。そんなんでいいんですか?売り方、ひいては、作り方も考えようよ!という提言です。
 私自身、春先に真狩村へ嫁さんとグスベリ向かいの農家さんの「にんじん」堀を申し訳程度に手伝いに行って、商品価値の無い「にんじん」を分けてもらったりしてます。その手伝いの中で感じるのが、食べても美味しいものが捨てられる現実…。JAに出荷するのに、商品価値の無いものが混ざっていると、JAで選別されて、後から廃棄料金を請求されるから仕方が無いようなのです。ちょっと傷があったり、サイズが大きすぎたり、小さすぎたりしているだけなのです。本書では、この辺の事情についても、売り先のニーズという視点で書かれています。
 本書の視点は、規制が強かった今までの農業ビジネスを再考するもので、ありきたりかもしれませんが、面白いと思います。
 情報時代は、コンテンツを握っている者(コンテンツを売っている者ではない)が有利なんです。そんな意味では、一次産業の時代が来ていると思うのです。

2010年1月8日金曜日

またベタだ

ネタもと
書くだけなら4分ぐらい…。ubuntu 上でやったので、コンパイルとかにちょっと手間取って6分ぐらいかかった。


#include <iostream>
#include <string>

int sum_kakui( const char* str, size_t len ) {
int result = 0;
for( size_t i = 0; i < len; ++i ) {
result += (str[i] - '0');
}
return result;
}

int main( int argc, char* argv[] ) {
std::string str;
std::cin >> str;
std::cout << sum_kakui( &str[0], str.size() ) << std::endl;
return 0;
}

2010年1月7日木曜日

php と static 変数 とスレッド

ふと、次のような php のコードを見て、激しく不安を覚えた


static $db;

if( !isset($db) ) {
$db = &new FooDatabase;

if( $db->is_connected() ) {
... 接続処理
}
}



 どこに気持ち悪さがあるか?というと、データベースへの接続は、スレッド|プロセス毎に接続するのが普通だからである。これを解き明かすには、apache2 と php の実装を理解していないと、どうにもならない。

 apache2 では、prefork, thread, event の3タイプがあるようで、一般的な構成は prefork である。
なるほど、それならば、上記コードでも問題は無さそうである。HTTP/1.1 で Keep-Alive が効いている間はセッション毎に static $db を利用しているので継続性がある。Kepp-Alive でも一時的にTCPのセッションが切断されれば、!isset($db) が true となるぐらいである。
 event については、よくわからないのでパスするとして、thread では、大問題となる。そもそも、スレッド毎に接続しなければならないのに、php の static 変数は、プロセスが保有する領域である。これに対処するには、TLS(スレッド・ローカル・ストレージ)が必要になる。もしくは、mutex で保護されたグローバル・リソース・マネージャのようなものが必要になると思う。

 ここで大いに疑問を感じるのだが、大規模サイトでは Apache2 の構成を thread にしてるんじゃないか?と思うのだが、データベースの接続は、リクエスト毎にでもしてるんですか?うーん・・・ php は小規模向きか・・・。。

2010年1月3日日曜日

2010元旦(不明なタイトル)

 新年明けましておめでとうございます。
温泉&スキーという予定だったのですが、もの凄い雪に閉じ込められて温泉&温泉&温泉正月でした。
一日で、車が埋没…
FFじゃなくて四駆を借りれば良かった…と…本気で後悔しました。
まじ、帰れないかと思いました…。
温泉三昧


xpmode 使いづらい

 正月の出来事をポストしようと思っているのだが、思わぬところで躓いている。携帯からのデータを転送するのに x64 のドライバがないから、XPmode を利用して携帯電話と接続してデータをパソコンに取り込んでます。ここまでは、XPmode マンセーなんだけども、ここからがいかん。仮想マシンから、リアルマシンへデータを転送する手段が難しい。ワークグループを統一して共有フォルダを作成し、一時期、仮想マシンが見えたのだが、いざ接続しようとするとエラーで繋がらない。そして、日を改めてチャレンジしてみたが、どうにも繋がらない。
 よくよく、ネットワークアドレスを調べてみると、繋がらなくて当然であった。リアルマシンは、ルータからの DHCP アドレスで 192.168.0.1/24 なのに対して、仮想マシンは、DHCPアドレスで 192.168.131.1/24 であるようだ。これじゃブロードキャスト・アドレスが違うから NB over TCP/IP は役に立たない。
 更にごちゃごちゃとネットワークをいじってると、ドメイン・ワークグループの他に、ホームグループなんてものがあり、Windows7 Professional 以上だと、プチ・アクティブ・ディレクトリのようなものになるらしい。つか、ワークグループの意味がわかんねーよ。
 結論として、クラウドを利用するのが一番の近道という、なんとも皮肉な結果となりました。

   仮想マシン
     近くにありて
       遠きもの