maaash.jp

what I create

県毎のiareaの数

memo

宮城: 4
茨城: 5
北海道: 32
福島: 4
岩手: 3
滋賀: 4
三重: 8
高知: 4
東京: 99
宮崎: 3
長野: 12
広島: 9
沖縄: 3
静岡: 15
山梨: 3
青森: 3
山形: 4
山口: 4
京都: 20
埼玉: 12
熊本: 5
福岡: 15
和歌山: 8
大阪: 27
徳島: 4
石川: 11
千葉: 10
愛媛: 4
奈良: 4
秋田: 3
兵庫: 22
神奈川: 31
富山: 5
新潟: 6
福井: 5
鹿児島: 7
岐阜: 6
大分: 5
佐賀: 2
岡山: 5
群馬: 6
島根: 6
鳥取: 3
長崎: 5
香川: 4
栃木: 6
愛知: 39

Hoppyいいよ

Hoppyいい
シリコンバレー行った時に参加した Flash Game Summit とかでも、FITC Toronto 2009でも、マルチプレーヤーFlash熱そうだったので自分の周りではきてる。
汎用的なXMLSocketサーバを書いた

POEとか使ったシングルプロセスシングルスレッドのデーモンでデータベース扱う時はどうするのがいいんだろう?
裏にDB扱うためだけにhttpサーバ置いてデーモンからはそれに非同期でhttpリクエストするという方法がある。

ということでまずはauthを非同期にしてみました。
http://github.com/mash/Hoppy/tree/master

$c->handlerってtcp周りのイベントのハンドラってことでいいのかな。

1
2
3
$c->regist_service(
auth => ‘MyApp::Auth’,  
);

ってやると $c->handler->{auth} に入るのは気のせいかと思いたかったので
s/handler/service/ してみました。めっちゃコアっぽいけどまぁいいか。

ごめんねColinちゃん。

FITC Toronto 2009 day 1,2

Some thoughts, memo of inspirations I got in these 2 days.
And also, thanks for the guys who came to our presentation.

### BEAUTIFUL ALGORITHMS: DESIGN FROM NATURE AND MATHEMATICS
ALEC COVE
WWW.COVE.ORG

人には効率よいことを美しいと感じる性質がある
keywords I got: “l-systems”, “reaction diffusion”, “harmonograph”, “buddhabrot”

### THE TINKERER’S BOX
MARIO KLINGEMANN
WWW.QUASIMONDO.COM

keywords “Stippling”
Mario looked very FUN!
When he was saying something like: “I can continue this for like,, 2minutes more”, while clicking on triangles and dividing them,
I was pretty sure FUN is the point.
If people just continue what they feel fun, that’s gonna take you to the top of the world.
Even if it starts with just dividing triangles :-)

### SPACE
JOSHUA DAVIS
WWW.JOSHUADAVIS.COM

That was not a presentation, it was entertainment.
I’m a big fan of him now.

### FLASHDUINO!
BRET FORSYTH
WWW.VFS.COM / BLOG.THESTEM.CA

I’m thinking about collaboration with these Flash interfacing hardware: Arduino, Gainer (in Japan), so this presentation gave me very much nice inspiration.
This has to be more easy.
And making things easy, is my job.
wonderfl makes creating Flash and collaborating between Flash developers easy, and I’m searching for something next.
Launching a local application to start accessing the hardware from Flash is too much complicated, we need direct access from Flash Player to USB, in case of security, just show a dialog box like Flash Player shows when accessing camera or microphone.
Maybe I’ll just start with something simple and easy to implement, but I think there’s pioneer-waiting-future in this area.
vimeo.com/groups/arduinoproject
liquidware

### IMMERSIVE ENVIRONMENTS AND INTERACTIVE CINEMA
DANIEL RILEY, RYAN ANDAL
WWW.LIVECAPTUREINC.COM

Knowledge: Make multiple flv, test user connection speed while loading, stream the appropriate vidoe for their speed.

### PROFESSIONALLY PUSHING PIXELS
RALPH HAUWERT
WWW.UNITZEROONE.COM

I remember somebody had a session in the last MAX Japan about “understand what Flash is good at, and not good at”,
and this time Ralph talked about these targeting Flash’s new features: Alchemy and PixelBender.
Alchemy uses C,C++ so Math using bytearray is superfast, but marshalling between Actionscript world and C world is dead slow.
PixelBender uses multi cpu cores, so……. I couldn’t understand….
But. I’m looking forward to seeing PapervisionX.

### FLASH PLAYER INTERNALS V2
JIM CORBETT
WWW.ADOBE.COM

New information was about the search player which Jim in Adobe developed and provided to Google.
Google has a AI, which acts like an user, pressing buttons in your swf and sees what happens in the displaylist, check for TextFields that appear in the list, and make those text searchable.
Everything only in the displaylist visible is collected, and non visible displayobjects, exists but not added to the displaylist is not.
Cool.
I can thing of like a hand full of ways to trick the crawler, for example showing a black rectanble over black colored text can’t be recognized by human, but mustbe collected by Google.
So I don’t thing this approach is good, Google should implement a OCR kind of client, maybe it’s just a matter of time.

### HARVEST
JAMES PATERSON
WWW.PRESSTUBE.COM

coooooooool animation.
Quote: “delegate the problem to subconscious by drawing”
That’s nice.
I delegate a problem to my subconscious by sleeping.

### CHECK. CHECK. IS THIS THING ON?
CHUCK FREEDMAN
WWW.CHUCKSTAR.COM/BLOG / DEVELOPER.RIBBIT.COM

Hey, I’m in!
http://bugs.adobe.com/jira/browse/FP-1766
Vote on it!!!
Yes, I also thinks it’s gonna be another breakthrough if I could just connect my electric guitar into my laptop and start making noise.

When is ribbit bringing one of their internet-phonenetwork bridge to Japan?
Because it must cost international phonecall fees to make a call from Flash to a number inside Japan.

### DAME JUDY DENCH COULD KICK MY MOTHERS ASS
MK12
WWW.MK12.COM

I don’t think the user interface in 007 is one of our possible future, but having a green room in our company might be fun!

yokohama.pm 4回目行ってきた&DI

いいまとめはこちら
http://d.hatena.ne.jp/hiratara/20090417/1239946298

DIがよくわからなかったなぁ
Bread::Boardの感じだと結局コンストラクタに引数与えるのを書き方かえるだけに見えるけど

外部のxmlファイルに記述したくない、って牧さんは言ってたけど、
フォーマットがxmlかどうかは別として、javaをちょいちょい使ってる時の認識では、
別ファイルであることがDIの本質なんじゃないのかなぁと思っていた。

javaはコンパイルの必要な言語で、
xmlを変えてもリコンパイルが必要無い、
ってメリットがjavaではある

使うときにオブジェクトを渡して、使う側ではインターフェースしか使ってない、
こういうのもDIっていうかな
これをいい感じに書けるのがBread::Boardなのかな

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package A;
use Moose;

has cache => ( isa => ‘Cache::Cache’, is => ‘rw’, required => 1, default => sub { new Cache::FileCache } );

sub fetch_something {
my ($self, $key) = @_;
my $ret = $self->cache->get($key);
if ( ! defined($ret) ) {
$ret = fetch($key);
$self->cache->set( $key, $ret );
}
$ret;
}
1;

飲み会行かれなくて残念

preventing cache stampedes

webサイトとかで、重いSQLを使ったページを快適に表示するために、重いSQLの結果をキャッシュするためにmemcachedとかをよく使います。
キャッシュの有効期限が切れた後に、大量のリクエストに対応して大量の重いSQLが走ると困るので、どうしよう。
これをthundering herd 問題といったり、cache stampede, database stampedeというそうです。
キャッシュ切れた後にががっとくるやつ、です。

  1. キャッシュの有効期限が切れる
  2. SQL発行
  3. SQLの結果を受け取る
  4. キャッシュにつっこむ

A-D.の間に大量のリクエストが来ると、重いSQLが走るので困ります。

Kazuhookuさんが書いています。
キャッシュシステムの Thundering Herd 問題

 対策としては、以下の2種類の手段があります。

  • バックエンドへの同一リクエストを束ねるような仕組みを実装する
  • エクスパイヤ以前の残存時間が一定以下となった段階で、キャッシュエントリのアップデートを開始する

昨日memcachedの勉強をしている時のFAQの資料にもいろいろ書いてあったのですが、
いくつか対策方法があるようです。

How to prevent clobbering updates, stampeding requests

The easiest answer is to avoid the problem. Don’t set caches to expire, and update them via cron, or as data is updated. This does not eliminate the possibility of a stampede, but removes it from becoming the norm.

最も簡単なのは、cronでキャッシュを更新してキャッシュに有効期限をもうけないこと。stampedeの可能性はなくならないが、標準的に起こる現象ではなくなる。

なくならないっていうのはどういうときに起こりえるんだろう?

他に、

If you want to avoid a stampede if key A expires for its common case (a timeout, for example). Since this is caused by a race condition between the cache miss, and the amount of time it takes to re-fetch and update the cache, you can try shortening the window.

First, set the cache item expire time way out in the future. Then, you embed the “real” timeout serialized with the value. For example you would set the item to timeout in 24 hours, but the embedded timeout might be five minutes in the future.

Then, when you get from the cache and examine the timeout and find it expired, immediately edit the embedded timeout to a time in the future and re-store the data as is. Finally, fetch from the DB and update the cache with the latest value. This does not eliminate, but drastically reduces the amount of time where a stampede can occur.

意訳すると、

  1. キャッシュには長めの有効期限を設定しておく
  2. キャッシュにつっこむ中身に、自前でつけるほんとの有効期限をいれておく
1
$cache->set( $key, { content => $content, expires => $real\_expire\_time }, $longer_expiry );
  1. キャッシュからデータをとってきて、自前でつけるほんとの有効期限をみて、
     有効期限切れだったら、すぐさまちょっとだけ有効期限を長くして(重いSQLをこなすのにかかる時間くらい)、
     キャッシュにつっこむ
1
2
3
4
my $dat = $cache->get( $key );
if ( $dat->{expires} < time() ) {
$cache->set( $key, { content => $dat->{content}, expires => time() + 5 }, $longer_expiry );
}
  1. 突っ込んだ後、重いSQLを発行
  2. 重いSQLの結果をキャッシュにつっこむ

これにより、最初の例ではA-D.の間が問題となっていたのに対して、
2.の中の、cache->getしてからexpiresを更新してcache->setするまでの間の時間だけが、問題になります。
この時間が十分に短いかは、環境によるでしょう。
自分の開発環境では0.01sec程度でした。

この仕組みは、Catalyst::Plugin::PageCacheにbusy_lockというオプションを設定することで使用可能です。

バックエンドへの同一リクエストを束ねるような仕組みを実装する

このやり方も、BradがGearmanでできるよ、的なことを書いています。深追いはしていません。

さらに、他のやり方として、
probabilistic timeout
というのもあるようです。
基本的にはキャッシュからとってくるんだけれど、キャッシュが切れそうになったら、
リクエストに対して確率的に、SQLを発行するリクエストを選択して、キャッシュを更新する。
有効期限に近づくほど確率が100%に増すようにする。

さらにkazuhookuさんがつくったKeyedMutexでは
ウェブサービスのためのMutex – KeyedMutex

1
2
3
4
5
6
7
8
until ($value = $cache->get($key)) {
if (my $lock = $km->lock($key, 1)) {
#locked read from DB  
$value = get\_from\_db($key);
$cache->set($key, $value);
last;
}
}

ロック機構を使うことでDBへのアクセスを排他できます。
でもこのサンプル例だと、cache stampedesは解消できる代わり、get_from_dbの間のリクエストは全部待たされますね。

これとbusy_lockの仕組みを併用するのがいいかもしれない、とか今思った。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $dat = $cache->get( $key );
if ( $dat->{expires} < time() ) {
$cache->set( $key, { content => $dat->{content}, expires => time() + 5 }, $longer_expiry );
if (my $lock = $km->lock($key, 1)) {
#locked read from DB  
$value = get\_from\_db($key);
$cache->set($key, { content => $value, expires => $real\_expire\_time }, $longer_expiry );
return $value;
}
else {
return $value;
}
}
return $dat->{content};

有効期限切れのデータを絶対返したくないのか、数秒ならいいのか、get_from_dbにはどれくらい時間がかかるのか、
状況によりそうです。

自分がやりたかったのは、
busy_lockのあるPageCacheもいいけどユーザー毎に違う内容を表示する場合に、scriptタグとかでもう1httpリクエスト増えるのもあれだなぁと思ったので
テンプレの一部のレンダリング結果をキャッシュする仕組みがほしくて
http://github.com/mash/catalyst-plugin-blockcache/tree/master
ここまで書いたけどそれってなんでCatalystプラグインなの?TTプラグインでは?
Template::Plugin::Cache??何それ今知った!
でもT::P::Cacheはbusy_lock無いもん!
Cache::なんとかにしてbusy_lockだけ共通化したい
うーん←今ここ

memcachedのメモリ確保について

実戦で使ってるmemcachedがいっぱいになってきてるっぽいので勉強中
自分の理解を整理する。

memcached-toolでstatsを見る。
1MB_pagesはその1MB単位がいくつあるか

[homepage@www scripts]$ ./memcached-tool *.*.*.*:11211
# Item_Size Max_age 1MB_pages Count Full?
2 136 B 443801 s 22 169620 yes
3 176 B 550195 s 22 131053 yes
4 224 B 538853 s 10 46810 yes
5 280 B 580837 s 23 86112 yes
6 352 B 725477 s 24 71471 yes
7 440 B 816043 s 14 33362 yes
8 552 B 650550 s 10 18989 yes
9 696 B 734238 s 6 9036 yes
10 872 B 776224 s 7 8414 yes
11 1.1 kB 652671 s 14 13384 yes
12 1.3 kB 747239 s 10 7619 yes
13 1.7 kB 712451 s 8 4872 yes
14 2.1 kB 764616 s 13 6331 yes
15 2.6 kB 547465 s 22 8532 yes
16 3.3 kB 603087 s 11 3410 yes
17 4.1 kB 893787 s 44 10909 yes
18 5.2 kB 492512 s 21 4158 yes
19 6.4 kB 409549 s 20 3160 yes
20 8.1 kB 436414 s 22 2794 yes
21 10.1 kB 435327 s 22 2222 yes
22 12.6 kB 437689 s 19 1539 yes
23 15.8 kB 415113 s 21 1344 yes
24 19.7 kB 421321 s 90 4590 yes
25 24.6 kB 21065 s 77 3157 yes
26 30.8 kB 31859 s 101 3333 yes
27 38.5 kB 528086 s 150 3900 yes
28 48.1 kB 413215 s 132 2772 yes
29 60.2 kB 197636 s 43 731 yes
30 75.2 kB 182637 s 15 195 yes
31 94.0 kB 208702 s 10 99 yes
32 117.5 kB 399556 s 7 54 yes
33 146.9 kB 943288 s 5 28 yes
34 183.6 kB 754818 s 2 10 yes
35 229.5 kB 571672 s 4 16 yes
36 286.9 kB 335096 s 2 4 yes
37 358.6 kB 755830 s 3 6 yes
38 448.2 kB 62570 s 1 2 yes
39 1024.0 kB 279955 s 11 11 yes

全部Full!!
びびる!
FAQ読む

http://code.google.com/p/memcached/wiki/FAQ

memcachedのメモリ確保の方法はこちら
How does memcached’s memory allocation work? Why not use malloc/free!? Why the hell does it use slabs!?
http://code.sixapart.com/svn/memcached/trunk/server/doc/memory_management.txt

メモリは1MB単位で確保され(→slab)、Item_Sizeのclassを単位に分割される(→chunks)。
memcachedへのsetの要求に対して、順に分割されたchunks個数分までつっこめる。
この個数分の中で、least recently used (LRU) のキューができる。

この例だと
1MB * 22 / 136Byte = 169620

136Byteのclassが22page(=169620chunks)確保されていて、全部Full
136Byteのclassに割り当てられるようなサイズのデータをsetしようとしたら、
最も過去に使われたchunkが開放されて、そこにつっこむ。
そのカウントがevictions(有効期限の切れていないvalidなデータが消された回数)

Max_ageが最低なところを見ると、
24.6kBのclassを3157個格納していて、その最長有効期限が21065sec=5時間程度
ここもFullになってるってことは、もっと長い有効期限を設定しているのに
evictionsとなって消えていっているのかもしれない。
各slab毎のstatsは見れるのかな?

1.25倍区切りでclassの分割数が決まっていて、setしようとしているメモリサイズを格納するのに必要十分な最低のclassを使う。
140Byteのデータをsetしようとしたら176Byteのclassを使う、というように。
管理用のデータは別換算のようだから次に大きなclassを使うのかもしれない。
管理用のメモリサイズは読み取れなかった。

起動後、setの要求に対して、当てはまるclassのchunksに空きがなければ、
また1つslab(1MB分)を確保して、そのclassに当たるByte数(136とか)で分割してchunksを増やす。
-m で指定する最大メモリサイズまで使い切るまで、早いもの順で1MB確保して、chunksを増やしていく。

その結果、この例では
38.5 kB のclassが起動後、最大メモリサイズが確保されるまでに一番多く使われたのでしょう。
150MB割り当てられて、
1MB * 150 / 38.5kB = 3989個(実際には3900個になっている残りが管理領域なのか?)
使っている。

早いもの順だと、起動直後からのmemcachedの使い方に比較して、使い方のモードが変わったら、
memcachedの動作中に、頻繁に使用されるclassを分析してclassに対するpageを再割り当てする、
というのが
which is the next feature being worked on
って書いてあるのは実装されたんだろうか。

この文書は Date: Fri, 5 Sep 2003 20:31:03 +0300 のメールらしい。

Silicon Valleyに来ています jtpa-conf編

もう帰ってきたんですが
JTPAカンファレンスメモ

聞いたことと考えたことをごっちゃに書いています。

■ 梅田望夫

自分の力と時代の力

・世界経済の好況不況
・日本の力
・自分の得意分野の成熟度合い

 日本は厳しいよ、自分に投資せよ
 マクロでは厳しい、ミクロでは景気いいとこもある
 マクロが見えることは大事か

 今だったらIT分野に進むか?否。

■ 大澤弘治

entrepreneurship?

1) 恐怖心に打ち勝つ精神力
2) クリエイティブ
3) インテリジェンス
  自分に投資
4) 諦めない
  「成功する秘訣は成功するまでやめないこと」松下幸之助
  「あなたはすぐ諦めていませんか?」
5) チームプレイ
6) 明るいこと

 質疑応答が印象深い。
 諦めないこと、というのとビジネス的な判断というのは別物
 信念みたいなものは諦めないが、ビジネスとして撤退すべきであればする
 というのは答えになってないんじゃないかなぁ

 判断する時に、情熱をどれくらい定量的に意識するか、ってことなのかなぁ。
 例えば月1億の赤字を情熱ではカバーできないけど
 月100万なら情熱でカバーできる、みたいな。

■ 金島秀人

23andMe
 個人に対する遺伝子解析サービス
 個人に提供することで遺伝子のサンプルを集めやすい
  BIOのCGM。。。
 どんどん情報が集まってくるビジネスモデル
  Googleが出資してる。。。なるほど

Googleのビジネスモデルとは情報の量を増やしていけばあるレベルから量が質に転換する
 わかっていたようで明言されると新鮮でわかりやすかった

シリコンバレースピリット
・個別の会社ではなく、その業界に就職しているというプロスポーツ選手の意識
・自分の好きなこと、得意なことを仕事にする
・他省略

日本の閉塞感に関するfact
 新しい産業が生まれにくい
  時価総額TOP100のうち、
  アメリカは50%が30年以内にできた会社
  日本では1社のみが30年以内にできた会社

今シリコンバレーで投資を受けている分野
・ヘルスケア
・新エネルギー

■ パネルトークとか

シリコンバレーでは起業ってのは人生かけるほどのものではないもっと気軽なもの
・つぶれても有限責任、再出発しやすい
・アウトソースがしやすい
 VCがお金をつっこむ
  自分のコア業務以外は積極的にアウトソース
   さまざまな業務のフリーランスがいる

リスクマネーの定義ができてる
 日本は銀行の考え方のVC
  担保に対してお金を出す
  =リスクをとっているわけではない
 アメリカのVC
  ビジネスモデルに対して価値を見出して「投資」する

「まず日本で始めて」という考え方を転換しよう
 日本は市場環境が悪
  要求仕様が高い
  市場が下降

エンジニアとマネージャーの給料はキャリアを比べてもほとんどいっしょ

■ 渡辺千賀, 海部美知

「わからないことは、わからない」
「どんなベンチャーが今儲かるか?」「わかってたら自分がやってるわ」
そうだよね

シリコンバレーっていう大きな範囲で、試行錯誤プロセスをしている。

2,3年後を見通すくらいはいいけど10年後なんてぜんぜんわからない
「自転車操業を繰り返しているうちに、
 この自転車意外と性能いいじゃん、って自信がつく」

Silicon Valleyに来ています UCBerkley編

メモ
聞いたことと感じたことをごっちゃに書いています

■ 人
* LarryWall,Sunの創始者 他いっぱい

■ Ph.Dをアメリカは評価する
 Ph.Dをとるというのは、問題解決のひととおりの流れを身につけていると考えられる。
 ※アメリカの大学を卒業するのは大変だからか
 専門分野が異なったとしても価値を持つと信じていい
 学歴社会ってのは悪いもんでもないんじゃないかなぁ
  もしそれがちゃんと実力を表すものなのであれば。
  これが日本とSiliconValleyの間で最もキーだと今感じている違い

■ 産学連携
基本企業からお金が出ている

■ なぜBerkley
 研究室
 州立、なのでお金が無い 装置とかがしょぼい しょぼいがゆえにコラボレーションが盛ん
  簡単に他の学科といっしょにやったりする

■ Ph.D1年目から給料っぽいものがもらえる
 学部生を教えたり、
 年間これくらいは給料がもらえるっていう額が最初にわかる
 学費は免除
 日本の学部卒から入れる
 5年プログラム
 flexible
 結果出せばいいでしょ

■ 使ってるサイトとか
 GoogleScholorと有料論文検索システム(無料化)が統合?

 Facebookで技術的な話題をすごくふかーくやってる
 論文レベルの議論をGoogleGroupsでやってたり

 日本のコミュニティには、知識が蓄積される、という面は少ないのでは

 研究者の考え方として、論文に書かなければ
 正式ではない?から自由にいろんな議論が行われる?