2013年11月28日木曜日

AC法をJavaで実装

文献[1]で紹介されているAC法をJavaで実装してみました.

AC法はテキスト内に出現する複数のキーワードを1回走査しただけで検出することができるアルゴリズムです. トライの部分はダブル配列法を使いたいところですが,コード量が多くなるので,今回はTreeMapで済ませました. テストケースの件数が少ないので,もしかするとバグっているかもしれません.

[1] 伊藤 直也, 田中 慎司: Web開発者のための大規模サービス技術入門, 技術評論社, 2010-08

2013年11月17日日曜日

VB CodeをJavaで実装

文献[1]で紹介されているVB CodeをJavaで実装してみました.

また,圧縮の効果も調べてみました. 以下がその結果(一例)です. 140万エントリのID列を想定してランダムに生成した整数列をギャップ列に直して,VC Codeでエンコードしています. 元の整数列が密になる(整数列の長さが増す)ほど,圧縮率が良くなっています. 密になればなるほど,整数間のギャップが小さくなるので,期待通りの結果になりました.

整数列長圧縮前(B)圧縮後(B)圧縮率
1441.00
1040320.80
1004002600.65
1000400019550.49
1000040000140790.35

[1] 伊藤 直也, 田中 慎司: Web開発者のための大規模サービス技術入門, 技術評論社, 2010-08

2013年9月9日月曜日

[読了]MAKERS

「MAKERS」を読みました.

Chris Anderson: MAKERS, NHK出版, 2012-10

本書についてのメモを以下に記しておきます.

本書は,ビットの世界で起きた変革がアトムの世界でも起きつつあることについて述べられている.それは,経済規模で捉えると,ビットの世界と比べて少なくとも5倍大きい世界での変革であり,21世紀版産業革命と呼ばれるものになるであろう変革である.

ビットの世界で起きた変革は,デジタル技術とネットワーク技術の融合によって生じたものである.それらが,広大なスペースを持つ棚と際限なくそこに並ぶモノをサイバー空間の中に登場させたおかげで,我々は従来より自分の嗜好にあったモノを供給したり消費したりすることが可能になった.そして,個人の嗜好に従ったモノの供給と消費は,ビットの世界に様々なロングテールを出現させた.さらに,ビットの世界では,モノのフリー化も進展している.サイバー空間にある棚に無償のモノが供給されるケースが多くなっているのである.

アトムの世界で起きつつある変革は,先の二つの技術に加え,3Dプリンタに代表される新たな製作技術の登場によって生じている.これらは,モノの製作に必要なツールを企業の工場から個人の工房へと移し,また,個人のアイデアを補強したり,集約したりする場を提供する.これにより,ツールを使いこなすスキルは必要になるものの,自分の嗜好にあうモノを自分自身で製作できるようになる.もう自分が欲しいモノを気長に待つ必要はなくなる.さらに,気が向けば,自分と同じ嗜好の持ち主のためにそれをサイバー空間の棚に置くこともできる.

モノを製作するツールの大衆化とそれを並べる棚の存在がビットの世界で起きた変革をアトムの世界にもたらしている.アトムの世界では,ロングテールの真ん中の部分がごっそり抜け落ちていた.極端に言うと,工場で大量生産されたモノがある頭と,オーダメイドのモノがある尻尾の先は存在するものの,胴と尻尾の大部分にモノは存在しなかったのである(デジタルの世界ではこの部分の売上は全体の3分の1程度あるそうだ).しかし,アトムの世界で起きつつある変革は,この部分にもモノを供給するようになる.それは,大量でもなく,少量でもなく,小回りの効く中規模なチームが生きていくのに必要な利益を生み出せる量のモノが存在する場所である.そして,自分だけでなく同じ嗜好の持ち主を満足させることができるやりがいのある場所である.

このような新天地が我々のすぐ目の前にある.まだ人が少ないうちに見物だけはしておいたほうがよいかもしれない.とりあえずAutodeskの123Dはダウンロードしてみた.3Dプリンタはどうしようか.

2013年4月11日木曜日

[読了]モチベーション3.0

Daniel H. Pinkのモチベーション3.0を読みました.

Daniel H. Pink: モチベーション3.0―持続する「やる気!」をいかに引き出すか, 講談社, 2010-07

本書についてのメモを以下に記しておきます.

本書は,現代の仕事において良い成果を残すための秘訣について述べられている.それは行動を引き起こすための心の働きの一つであり,内発的動機づけと呼ばれるものである.

動機づけは,生理的動機づけ,外発的動機づけ,そして,内発的動機づけに大別される.生理的動機づけは生き残るための行動を引き出すものであり,外発的動機づけはアメとムチとして周囲から与えられるものである.そして,内発的動機づけは,活動自体からもたらされる満足感によって自身から沸き起こるものである.

生活水準が一定のラインを超えると,生理的動機づけはなりを潜め,人の行動は外発的動機づけと内発的動機づけの影響を受けるようになる.外発的動機づけは,単純あるいは定形的な仕事に効果を発揮する動機づけであり,その比率が高かった近代社会においては十分機能してきた.一方,内発的動機づけは,クリエイティブな仕事に効果を発揮する動機づけであり,その比率が高まる傾向のある現代社会に適している.

動機づけには,種類によって向き不向きがあり,その性質に応じて使い分ける必要がある.例えば,生活水準がある閾値を越えない状況では,生理的動機づけが支配的になり,外発的動機づけや内発的動機づけは機能しなくなる.また,クリエイティブな仕事に外発的動機づけを行うと,内発的動機づけで行うよりその成果は低下する.

先に記したとおり,現代社会はクリエイティブな仕事の比率が高まっている.したがって,今後は外発的動機づけより,内発的動機づけのほうが有効な手段となる場合が多くなることが予想される.

内発的動機づけは,自律性,熟達,目的を拠り所にしている.自らの意志で行動を決め(自律性),意義のあることに打ち込み(熟達),自分以外の利益に貢献する永続的な指針をもつ(目的)ことにより,内発的動機づけのエネルギーを生み出すことができる.

2012年12月13日木曜日

[読了]パブリック

Jeff Jarvisの『パブリック』を読みました.

Jeff Jarvis: パブリック, NHK出版, 2011-11-25

本書についてメモしておきます.

本書は,個人や社会のパブリックな領域が拡大する中で,その状況とどのように付き合っていけば良いのかについて述べられている.本書を読んで得た知見を私見を交えながら以下に記す.

テレビ,ラジオ,新聞,出版,広告など,旧来のメディアからの情報を単に消費する存在であった大衆が,インターネットというパブリックな圏域に向けて気軽に情報をプッシュできる時代が到来している.

情報をパブリックな場所に置くと,集合知の形成に寄与したり,セレンディピティやコラボレーションを引き起こすきっかけになったりする.一方,そうすると,周囲の人をハラハラさせたり,ときには何らかのトラブルを引き起こしたりする.情報をパブリックな場所に置くことは,良い面だけでなく,悪い面もある.

大衆の一人としては,良い面より悪い面のほうが気になるし,そのことを声高に叫ぶ識者もいる.だから,情報をプッシュするのに及び腰になるのも当然のような気がする.しかし,情報をプッシュすることで何かしらのメリットを受けられるなら,積極的にそれを活用し,自分を拡張していけばよい.すでにそれを実践して,その恩恵を受けている先駆的な大衆はいるのだから,彼らの仲間入りを果たせばよい.

そこで,必要となるのが,パブリックとプライベートの境界線を見出すことである.パブリックとプライベートの境界線は,個人の価値観や環境で決まるので,万人に共通するものは存在しないようだ.したがって,その線を見出すには,実践しかない.パブリックな場所に情報をプッシュし,周囲の人の反応を見極めながら,自分が居心地のいい境界線を見つけるしかない.この境界線を見出す力は,これからの時代に必要なリテラシーになるような気がする.

2012年10月11日木曜日

JSONとオブジェクトを相互に変換する方法

JSONとオブジェクトを相互に変換する方法についてメモしておきます.

JSONオブジェクトのparseメソッドを使えば,JSONをオブジェクトに変換できます.

var json = '{"server_side": "Java", "client_side":"JavaScript"}';
var object = JSON.parse(json);
console.log(object);

JSONオブジェクトのstringifyメソッドを使えば,オブジェクトをJSONに変換できます.

var object = {"server_side": "Java", "client_side":"JavaScript"};
var json = JSON.stringify(object);
console.log(json);
参考資料
[1] JSONについて
[2] ネイティブJSONを使う

2012年9月24日月曜日

インスタンスイニシャライザを利用したMapの初期化方法

インスタンスイニシャライザを利用したMapの初期化方法をメモしておきます.

インスタンスイニシャライザという仕組みを使えば,初期化されたマップを宣言できるようです.例えば,"a","b","c"というキーに対してそれぞれ1,2,3を値とするマップを宣言する場合は,以下のようなコードとなります.

Map map = new HashMap() {{
    put("a", 1);
    put("b", 2);
    put("c", 3);
 }};

一見文法違反のように見えますが,無事コンパイルできます. HashMapを継承した匿名クラスのインスタンスイニシャライザ内で,HashMapから継承したputメソッドを呼び出しているからOKということなんでしょうか(適当に書いているので間違っているかもしれません). Javaでこんな書き方ができるなんて,知らなかった〜.

参考資料
[1] イニシャライザ
[2] [Java] インスタンスイ二シャライザで初期化したMapのシリアライズで