2009年6月27日土曜日

BP Study22 memo

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
走り書き
scala/lift関係はtwitterで#BP22をどうぞ。

発表者:佐藤一憲(スティルハウス)
事実上フリー。

http://www.sth.co.jp


アジェンダ
ご都合ドットコム
GAEのサーバ構成とスケーラビリティ
BigtableとDatastore

おまけ
- Smalltable


tmatsuoさんが会場にいる。

GAEのすごいところ。
無償で使える。
bigtableが簡単に使える
サーバ構築不要、デプロイ簡単


GWにご都合どっとこむを作った。
2000UU


FLEXクライアント
GAE/J
BlazeDS <- AirとJavaをつなぐミドルウェア
ビジネスロジックのクラス
Entity クラス

5日間で作れた。設計・実装テスト・ドキュメント


BlazeDSを動かすには?
iMartinzoldano.blogstop.com 200904 appengine-adboe blazeds


ki
gaenogennjou
8万人以上がしよう

140M PV/day

GAEの特徴
スケーラブルなアプリを構築するための慣習を促すための制限
ここのリクエストが使える処理時間(30秒)とリソースは制限されている。
statelessが強要される
Datastoreによるパーティション化されたデータモデルの利用

スケーラビリティをもつクラスタ環境を利用できる。
アプリ間の隔離性を維持。

使い手ががんばらなくていい。


GAE Stack の構成
[絵]

App Master
deploy managment,version managment


FrontEnd
HTTP req/res
clientにいちばん近いgoogle DCに到着
リクエストは10MBまで
コンテンツは、スタティックとダイナミックは別途ハンドルされる。

App Server
隔離性


APIのサーバ、DataStore Memcache, Mail, URL Fetch, Image, Taskqueue, Users, XMPP(To be added)

Queueはparallelに処理することもできる。workerしだい。


Client VM

App Server
Stateless, fieldをもてない。
make distributed and fail over easy.

session info are shared in DataStore
need to clean up with cron or TaskQueue

state
maybe we can put it into memcache. they will spill (LRU) or expire.
memcache is coherent cache, not storage.


API Proxy ThreadLocal
API callをフックしている。

30<


Dependency Injection
Aspect J Sprint AOP

Web frameworks
google web toolkit, tapestry, Blaze DS(Flex)
Grails

Alternate JVM Lang


GAE Scale out
On High load longed around 50min, new App server will be added.
even very light weighted app are distributed in 2 or 3 instances

There are safety limit. Ask for unlimit


Open For Questions
google moderator.
100k questions 3.6 million
700 queries per second

out of box GAE google has no work for it.

around deadline there are 700 submissions/second.
(queries to datastore)

Java. vs. Python
not big difference

No comet, no steaming

Bigtable

distributed datastore for structure data
able to handle PByte.

7manyear to build it.
production from 2005

Google uses more than 60

distributed multi dimension sorted map.
each cell is versioned, but not used in datastore.

bigtable is HUUUGe key-value store

kys are sorted in dictinary order

single low is atomically changed.
multi lows are not atomically changed.


key based crud
key based scan(prefix or/adn range)
they are sorted.

value based can NOT be done.

bigtqble cluster:
388 cluster
24500 tablet server(slave)


shceduler master
chubby (distributed lock server)
GFS master
bigtable master


Tablet 100~200MB
single server hold 100 tablets
they are replicated

bigtable master controls load balance among tablet server.


it is like DNS hiarchy
chubby file -> root tablet -> Meta data tablet -> tablet

they are cached, in ave 100ms < to find tablet

memcache -> commit log
||
\/
cache (mem table)
||
\/
SSTable (on disk, GFS)

on dist data are sorted immutable map
major compaction, GC.

GFS
more than 2 server folds (replication)
local GFS chunk server + non local lack.


Why need to have counter?


What is Datastore?
GAEにおけるデータ保存用API、ビッグテーブルで保存
エンティティグループ単位でACID
クエリ JDOQLまたはGQL

GAE/JでのAPI
JDO 永続化API (一番ドキュメントされている
JPA ORMなAPI
低水準API (Java doc only) Performanceがほしいとき使う。
JDOだとbatchのputができない(matsuo)

DataNucleausベース

PersisitenceManagerをcloses

kind
entity
propery
key


entity table
read/write with key
entity has property(s)
properys are serialized in single column



キー
アプリID、パス、エンティティID

パス
entity group のルートエンティティまでのパス

/Grandparent:Alice/Parent:Sam
~~~~~~~~~~~~
kind

protocol bufferでserializeされている。

property
entityごとにpropertyがもてる。schema less
entityごとに

クエリ
name="Foo"
とすると、プロパティ内にマッチするものがあればヒットする。

max 1000items to retrieve

range requestして1200-1500はできない。
1200番目がわからない。

1000番目のkeyを覚えておいて、そこから1000個とるとか。
先にproperty上に連番を振ってしまう。


python pagingではuserland paging できる

100件ずつ表示では100+1とってくる。
1は次のhead keyにつかう。

user landのpropertyでは注意が必要。
#キーとproperty

query is implemented with index and scan
need to create index on property


query つかったら負け?
crudがおそくなる。リストプロパティは要注意

index explosion
list with 1000item in property
query にlistが含まれているとだめ。

5000 index per entity (quota)


composit index.


entity group and transaction

entity has hiarchy. this hiarchy is NOT class hiarchy.

JDO "owned" relation <-- not eq --> Relation(RDB)


CAP theorem
Consistency
Availablity
Partition

optimistic lock
time stamp based check

in race
auto matic retry(python)
Java : user must implement it for loop


make small entity group
... lock size

a. message index root entity
b. timestamp + userid + message hash etc.

Entity
Entity update : 1~ 10 times/sec

distributed entity group

no table join
de normalize , prejoin them

no aggrigation function.
there is no group by, count, max, min,

function, stored proceedure.

no full text search
pre-process text


big application.
open social
buddy poker
giftal?


だめだということはない。

off by one error

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Python~組み込みデータ型①より

a[○:□] で、○と□の指定の仕方をインデックスに統一しないのか?が疑問・・・です。


off by one errorというやつです。

2009年6月26日金曜日

DualHead(写真)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
送信者 DualHead

VRARXR

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

私がなぜPythonを使うか?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

私がなぜPythonを使うか?



私にとってプログラムを書くことは手段なので、効率がよく作業負荷が少ないものがよい。



3つの評価軸



プログラミング言語の方向性は3つあると思っている。



  • ハードウエアに優しい。

  • 計算に優しい。

  • 人に優しい。



「ハードウエアに優しい」とは



一言でいうと、アセンブリが該当します。これがうれしい状況は、コンピュータが起動した直後でなにも初期化されていない状況、ハードウェアの性能を極限まで引き出す必要な状況でしょう。
具体的には、boot loaderの実装とか、DSPでcodecのdecoderを実装しているときとか、CPUパワーが極端に制限されているとき、callスタックを直接操作してセキュリティホールを突きたい時、などでしょう。



「計算に優しい」とは



Lisp系の言語とか、純粋関数型言語とか、です。
メリットは計算そのものを表現する能力が高いこと、計算を表現するときに特殊な制限をかけることで自動変換可能になることなどが挙げられます。



「人に優しい」とは



まず、抽象度がそれなりに高いことが必須で、というのは「一定時間でかけるコードの行数は言語によらず一定である」という知見の存在があげられます。次にPEPの中にも出てきますが、コードはかかれる回数よりも読まれる回数が多いという点です。また、言語としてのコーディングスタイルが定まっているという点もあげられます。
「コーディングスタイルが定まっている」が何を指しているかというと、そうでなくて無為に使われた時間を挙げるとわかってもらえると思います。C系の言語の{}をどうindentするかという宗教論争にどれだけの時間が割かれたか?とか、C++のメンバ関数の中でメンバ変数にアクセスするときにthisを省いてよいがメンバ変数のm_をつけるとか何とかでしょう。



もっともミクロな項目を挙げるなら、メモリ破壊・メモリ管理だろう。うっかりでぶっ壊したメモリがめぐりめぐって引き起こすバグの原因を特定するのにかかる時間と労力、メモリをリークしないように気にしながら書く労力と時間、メモリリークのデバッグによって消耗される労力と時間を想像してみよう。それだけでぞっとする。



それから標準的な環境を構築するために必要なコスト、実際に作業するために必要なライブラリの入手コストも挙げられるだろう。Linuxのディストリビューションにどれだけ標準で入っているか?、Mac OS Xに入っているか?、windowsでbinaryのインストーラがあるか?などだ。後者はPerlでCPANの中からライブラリを適切に選ぶことはちょっと難があるケースがあるが、Pythonなら標準ライブラリがあるし、PyPI や setuptools / easy_install もある。



すぐに試せるinteractive shellがあることも大事だ。objectとの会話が許されない系はちょっとどうかと思う。
サプライズがないことも挙げられるだろう。phpの==やsortの話とか検索すれば山盛り出てくる。C++で純粋仮想関数を定義するときの構文、void foo() = 0;とかもどうかと思う。



どの評価軸を重要視すべきか?



用途限定されていればその状況をみればよいのですが、もうちょっと高い視点で考えてみましょう。Mooreの法則によりどんどん性能は上がってきました。これからもマルチコア等によって上がり続けるでしょう。何らかの企画から始まって最終的に消費者に届くまでの過程を考えると、プログラムを設計する過程はしゃれにならないコストがかかっていて、一番生産性の向上が低い部分だろう。ネットワークもCPUもメモリもディスクも常に進歩し続けていて、対数グラフでプロットされるわけだから。
とはいえ、AWSやGAEのおかげで、一人で世界を相手にするサービスを作ることは可能になっている。パワーを稼ぐことに労力をかけることよりも潜在的な競争相手に先んじて何かを作り上げることが大事で、その場合はスピードが肝になり、それは人に対する優しさに行き着くと思う。もちろんこれからもアセンブリ等の需要はなくなることはないし、計算すること自体が大変なジャンルは存在し続けるだろう。この辺はどこに強みをおくかと、だれとくむか(ハードウェア製造業者か?AWSか?)ということにかかってくる。



よくある意見に対する私の見解



indentでブロックはキモイ



code golferの方ですね、わかりますよ。というのは冗談として、pythonがstatemnetな言語である以上ブロック構造を作らなければならず、インデントが宗教論争を引き起こしてきたことを考えれば、reasonableな落としどころだと思っています。なにかうまい方法があるなら教えてください。きっと住めば都です、いい意味で。



''.joinキモイ



どこぞで盛り上がっているらしいですが、ぶっちゃけどうでもいいかな、というのが私の意見です。
ただ+=でつなぐのだけはない。パフォーマンスが理由ではないです(Jythonだと遅くなるらしい)。
",".join(xs)をforと+=を使って書くと「植木算」をすることになりますが、これがよくない。joinを使って書けば、どのようにつなぐかを記述する必要がない。命令的な何かを減らすだけでバグは減る。こんなコードにバグを入れるなという人もいるかもしれないが、それはマッチョだと思う。手段としてのプログラミングは、「ひろゆき」的低きに流れるにあるべきだ。
「低きに流れる」は悪いことだとは思わない。上善水の如し。とはいうものの、泳げるくらいにきれいな水であってほしい。



個人的には",",join(xs)ではなくてstr.join(",", xs)でもいいのだが、Array.join(",", xs)はできてくるobjectのtypeと作り手のtypeがマッチしないのが好きじゃない。str.joinだとタイプ量が多いので横着したととらえれば許せる範囲かな。str.joinだと思っている理由はstrのコンストラクタだととらえているからだ。

2009年6月15日月曜日

ISBN

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
wikipediaを参考にvalidatorを書いてみた.感想としては画面が広いと作業しやすい.コードが一度にたくさん見ることができるのは有利.参考資料もすべて開いておける.しかし,やってみると,使いきることができるものだ.もう広さを感じなくなりつつある.


import sys
import re

class ISBN:
pass


class ISBN10(ISBN):
pattern = re.compile('\d{9}(\d|X)')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN10.isvalid('foobar')
False
>>> ISBN10.isvalid('4101092052')
True
>>> ISBN10.isvalid('4101092053')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:9]):
parity += int(d) * (10 - i)
return s[9] == ('0123456789X'[(11 - parity % 11 )])

class ISBN13(ISBN):
pattern = re.compile('\d{13}')
@classmethod
def isvalid(cls, s):
"""
>>> ISBN13.isvalid('foobar')
False
>>> ISBN13.isvalid('9784101092058')
True
>>> ISBN13.isvalid('9784101092057')
False
"""
mo = cls.pattern.match(s)
if mo is None:
return False
parity = 0
for i, d in enumerate(s[:12]):
parity += int(d) * (1+2*(i%2))
return (10 - parity % 10 ) == int(s[12])


def main():
for line in sys.stdin:
pass

if __name__ == '__main__':
import doctest
doctest.testmod()


追記:
既存のものにはこういうのがある.JANコードの意味とかが分かるらしい.

DualHead configuration

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
I'm using one geforce 7600 gs video card and two BenQ G2220HD displays. Here is my xorg.conf.

# Xorg configuration created by system-config-display

Section "ServerLayout"
Identifier "Multihead layout"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" rightOf "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
Option "Xinerama" "on"
Option "Clone" "off"
EndSection

Section "Files"
FontPath "unix/:7100"
EndSection

Section "Module"
Load "dbe"
Load "extmod"
Load "type1"
Load "freetype"
Load "glx"
EndSection

Section "InputDevice"

# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"

# generated from data in "/etc/sysconfig/keyboard"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
EndSection

Section "Monitor"

### Comment all HorizSync and VertSync values to use DDC:
### Comment all HorizSync and VertSync values to use DDC:
Identifier "Monitor0"
VendorName "BenQ"
ModelName "LCD Panel 1920x1080"
### Comment all HorizSync and VertSync values to use DDC:
HorizSync 31.5 - 67.0
VertRefresh 56.0 - 65.0
Option "DPMS"
EndSection
Section "Monitor"

### Comment all HorizSync and VertSync values to use DDC:
### Comment all HorizSync and VertSync values to use DDC:
Identifier "Monitor1"
VendorName "Monitor Vendor"
ModelName "LCD Panel 1920x1080"
### Comment all HorizSync and VertSync values to use DDC:
HorizSync 31.5 - 67.0
VertRefresh 56.0 - 65.0
Option "dpms"
EndSection

Section "Device"
Identifier "geforce7600gs0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "nVidia Corporation G70 [GeForce 7600 GS]"
BusID "PCI:1:0:0"
Screen 0
EndSection

Section "Device"
Identifier "geforce7600gs1"
Driver "nvidia"
VendorName "Videocard Vendor"
BoardName "nVidia Corporation G70 [GeForce 7600 GS]"
BusID "PCI:1:0:0"
Screen 1
EndSection

Section "Screen"
Identifier "Screen0"
Device "geforce7600gs0"
Monitor "Monitor0"
DefaultDepth 16
SubSection "Display"
Viewport 0 0
Depth 16
Modes "1680x1080"
EndSubSection
SubSection "Display"
Viewport 0 0
Depth 16
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "geforce7600gs1"
Monitor "Monitor1"
DefaultDepth 16
SubSection "Display"
Viewport 0 0
Depth 16
Modes "1680x1080"
EndSubSection
EndSection

2009年6月7日日曜日

starting zope/plone on CentOS

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ラーニングカーブを改善するブログエントリを目指します。

特にバージョンをこだわらないなら、

yum install plone

とすればOK。ただしrepositoryにepelを追加する必要アリ。ちょっとでかいので待たされます。


/var/lib/zope/bin

にrunzopeがはいるので、

%sudo /var/lib/zope/bin/runzope

をやると、Zopeが実行され、ブラウザでhttp://localhost:8080を見に行くとZopeの管理画面(ZMI)が見える。

少しでもサーバ運用している人なら、unix root以外で実行したいと思うのは当然で、そのためにはzopeの設定をいじる必要がある。(yumから入れるとuser zopeが作られ、その権限で実行するようにconfが書かれる)

/var/lib/zope/etc/zope.conf

の中で

# effective-user chrism

effective-user zope

が設定されていると、権限がuser zopeに落ちる。

さてploneだが、pull donwからPlone Siteを選んでidを適切に選んでAdd Plone Siteするとplone instanceが作られる。このとき/に居ないとinstanceを作れないので注意。作れられるとZMIのlistの中にploneのiconとともにつけたidのitemが現れる。そしたら

http://localhost:8080/

にアクセスすると、ploneの画面が表示される。メデタシ。

この先、何か間違えてやり直したくなったら、zopeのデータを蓄えているデータベースの実体であるData.fs(/var/lib/zopev/varにある)を消すのでは無くZMIからPlone instanceを消すのが正解。

注意事項としては、スキンはパッケージが壊れていると、ただしく消せない(!)のでploneのインスタンスを消してやり直すことになる。

この辺はrpmとは違うらしい。rpmだとfilesセクションがあるからまあまずやり直しが利く。
rpmと違って困ったところ。eggじゃなくてrpmじゃいけない理由はあまりないだろうが、eggにしておけば、プラットフォームを選ばないのだろう。zopeに限ったことではないが、pythonのpackage管理とplatformの提供するpackageの関係が微妙に思えることはよくある。

ploneで日本語がいい人はploneのページの右上の設定から変更すればメニューが日本語表示になります。フォルダーとかを新規作成して慣れましょう。publishするのも忘れずに。キモとしてはフォルダーがネストできる、イベントを貼るとカレンダーがクリックできるようになる、ニュースを作るとナビゲーションに追加されるなどでしょうか。


Productsを入れる。
大抵はdlして解凍したものを/var/lib/zope/Productsに入れればよい

pixiをいれてみた
http://nagosui.org:8080/Nagosui/COREBlog2/plone-skin-pixi-0.5
レイアウトが破壊されて操作ができない・・・壊れているので入れないように。

適切なproductを選ぶのが肝のようだ

次回は「ZClassを作って何か表示するまで」がやりたい。勉強用のproductがあったはずなのでそれをいじってみようと思います。

2009年6月6日土曜日

zope をipythonで触る。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
あー、IPythonはインストール済みだとします。
CentOS 5.2でyum installしたZope/Ploneのお話です。(epelからインストールされるはず)

http://wiki.zope.org/zope2/DebuggingWithIPythonAndOtherTips
を参考に。
Centos 5.2でyumを用いてinstallすると、~zopeは/usr/lib64/zopeになる。
まずはzope userでipythonが動くようにするために~zopeに.ipythonを作る。適当にコピーで可。ただしownershipに注意。zopeで読み書きできること。

nori@asama]~zope% ls -ltra
total 96
drwxr-xr-x 3 root root 4096 Jun 6 17:08 lib
drwxr-xr-x 2 root root 4096 Jun 6 17:08 bin
drwxr-xr-x 127 root root 69632 Jun 6 17:08 ..
drwxr-xr-x 10 root root 4096 Jun 6 17:08 skel
drwxr-xr-x 6 root root 4096 Jun 6 23:41 .
drwxr-xr-x 3 zope zope 4096 Jun 6 23:42 .ipython
[nori@asama]~zope% pwd
/usr/lib64/zope

こんな感じ。

sudo -u zope -H zopectl debug

して、ずらずらずら~といろいろ出るが、最後にpythonのプロンプトになるので、あとはリンクにあるのと同じようにimport IPythonして立ち上げればよし。

さて何をみていけばいいのかな?

2009年6月2日火曜日

google wave bof memo

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
google wave bofに行ってきた。

まだサービスとして形が見えていない。

waveはプラットフォームであって、アプリではない。

ターゲットは微妙。現状ではgeek対象。
少数がコラボレーションするにはよいツールになるのではないだろうか。
#中の人が便利に使っている?
IRCとwikiを使っているグループが該当するだろう。

twitterのもっているいい加減さは持っていない。
#一方的にfollowするとか

以下、メモ:

wave自体が不安定なので待つかもしれない。
くる直前にversionがあがったらしい

3カラム構成
左 navigation
中央 list
右 コンテンツ

wavesandbox.com
アカウントが足りていない。リソースの問題と思われる

編集モードと閲覧モードをC-eで行き来
C-6でitemize key bindはappsと同じ。

C-rで返信
1つはblipといってC-Rで

閲覧モードでC-Rすると文に対して返信ができる
ドキュメント自体の構造がちょっと違う

イメージをdrag & dropすると張り込むことができる
アップロードは非同期的に行われる(バーが絵の下にでる)

クリックするとスライドショー
またされる→ビーチボールを表示

すぐにあきらめる。ブラウザが固まることはない。
・・・Safari固まる。ということはマシン自体が固まる

参加者(participants)を追加すると、追加された人は編集可能になる
同時に編集されて気持ち悪い。カーソルに名前がつく。
→推敲が全部見える。
draftボタンがあるがまだ実装されていない。
#実装されていないものだらけ

ごみ箱から元に戻せない

UIの競合がある
リストから拾って捨てようとしたときに新itemがくると、新着itemが

線形にしか履歴が持てない。
branchできるがマージできない。
diffはとれない。

なんか落書きしている。これはなに?

サーチ結果を貼り付けることができる
地図を出すこともできる。→他人のスクロールが見える。
#マップを消せない
ある種のマルチポインタ環境

操作性はよいとはいえない。荒削り。

gmailのcontactsと共有されている。
google apps
wave側には編集インターフェースがない。

オンラインマーク
グループアドレスが作れる

gmailでも複数のメールを見ながらかきたいときがあるが、
ただクリックすると右のpaneの中身が変わってしまう
cmd keyを押しながらクリックするとと複数見ることができる。

マップをはるとめちゃくちゃ重い
メールを送るとgmailにいってしまう
現状はgatewayは自作するしかない

spam対策もすでにある。
navigationはgmailと同じ
tagがあるがsearchの対象にならない・・・

deleteもすぐに反映される。


API編
documentがあるので参照のこと

2つカテゴリがある
Extension
- Robot/Gadget
Embeded

wave participants

wavelet
Blip
Creatro
Contributors
Annotation
Blip
Blip

root blipが存在する
# private blip == wavelet ?

viewerがほしいなぁ

Eventlist
変化を拾う。
waveletができた、keyがおされた、blipがどうのこうの。


robotのデモ

botは1 domain 1 bot .c.f. app engineは10個

インスタンスはみんなが使える。セキュリティ的に・・・


rosy (rosetta stoneから)
リアルタイム翻訳、値域の言語を指定する
ボットが起動するとそのblipが登場する

結構まとも、インクリメンタル翻訳する

日本語を入力するにはsafariは問題あり

iconはpathが指定できる。


tweety(twitter robot)
検索

andoさんのガジェット
キーボード押すと音がでる。複数人で演奏できる。

wave.getState().submitDelta({...)
が肝。
音も再現できる。
js. css. htmlでできる。

何人でshareできるのかな?
60人は大丈夫だが・・・

遅延はたくさんのる。音楽の演奏は不可能
格闘ゲームはどうなっているのか?
共同編集シーケンサも存在

フラッシュを埋め込むこともできる

waveはossでサーバを建てることができる。
自分で専用サービスも可能


bloggy
appspot(中身django)
waveの中身を編集すると、blogger上のwidgetに反映される(動的に書き換わる)

絵を貼ることもできる

逆も可能


disconnectedすると編集した内容は現状では消えてしまう。
application名のスクワッティングが可能?

deploy


Debug bot
発生したイベントが見える。

blip単位で既読になる?
削除でもversionがあがる


iconがないとだれがだれだかわからん
3つじゃないとコラボじゃない


ブラウザに負荷がかかるのでは?
CPUはそんなにかかってない→100%


20人以下のコラボレーションではハッピー。
IRCをreplaceできそう。

gmailのかわりになる面はある。新しい人に教えるには作ったものを共有すればいい。
新しい人はplay backすればいい。

細かいセキュリティは自分でがんばる

iPhoneアプリは?
いちおう見ることができる。

$は?
速いサーバを提供する。現状中央サーバがある。
課金
「コミュニケーションを集約したい」

polly
投票・アンケートボット

blipに関しては権限管理がない。

2009年6月1日月曜日

fdatasync

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今月のカーネルウオッチでfdatasyncが出てきたのでpythonでどうなっているか見てみることにした。

そもそもfdatasyncってなにさ?

man page of fsyncより

fsync() は、ファイル記述子 fd で参照されるファイルの内部で持っているデータ (つまりバッファキャッシュページ) のうち修正されたデータを、そのファイルが属するディスクデバイス (またはその他の永続ストレージデバイス) に転送 (「フラッシュ」) する。この呼び出しは転送が終わったとデバイスが報告するまでブロックする。またファイルに結びついたメタデータ情報 (stat(2) 参照) もフラッシュする。

fsync() の呼び出しは、ファイルが存在しているディレクトリのエントリがディスクへ書き込まれたことを保証するわけではない。保証するためには明示的にそのディレクトリのファイル記述子に対しても fsync() する必要がある。

fdatasync() は fsync() と同様であるが、メタデータの扱いが異なる。 fdatasync() は、それ以降のデータ読み込みを正しく扱うためにそのメタデータが必要にならない限り、変更されたメタデータをフラッシュしない。例えば、 st_atime や st_mtime (それぞれ最終アクセス時刻、最終修正時刻; stat(2) 参照) の変更はフラッシュを必要としない。なぜならこれらはそれ以降のデータ読み込みを正しく扱うために必要ではないからである。一方、ファイルサイズ (ftruncate(2) では st_size) の変更はメタデータのフラッシュが必要である。 fdatasync() の狙いは、全てのメタデータをディスクと同期する必要のないアプリケーションに対して、ディスクアクセスを減らすことである。


データベースを作っている人は気にするし使います。


まずは標準ライブラリだが、osモジュールにはちゃんとfdatasyncがある。posixmodule.cを覗くとなかで読んでいるのがわかる。

fdatasync(fd)
ファイル記述子 fd を持つファイルのディスクへの書き込みを強制します。メタデータの更新は強制しません。利用できる環境: Unix

かなり昔からあるみたいで、2.3のときにfsyncとfdatasyncは別々に調べなきゃ駄目よbugがあった。


で、次にどんなアプリが使っているか?なのだが、ソースコード検索してみる。

mved-1.0
mved - An editor-focused multiple file move utilityだ、そうな。

tmpfd, tmpfilename = mkstemp()
try:
for name in oldnames:
write(tmpfd, '%s\n' % name)
fdatasync(tmpfd)
except IOError, e:
giveup("%s: %s", (tmpfilename, str(e)))

なにやらfile systemを読み書きするものらしい。

def fsync(self, isfsyncfile):
self._fflush()
if isfsyncfile and hasattr(os, 'fdatasync'):
os.fdatasync(self.fd)
else:
os.fsync(self.fd)

あまり引っかからない。file objectのflushでも読んだほうがいいのだろうか?そう思ってObjects下をgrepするも成果なし。

とまあ、ほとんどのpython userには縁がなさそうでした。大体os.fsyncとか使わないだろうし。fobj.flushはよくあるだろうけど。

あとはdbを使うときに間接的に影響を受けるケース。

MySQLのinnoDBの設定とか。

nnodb_flush_method

もし fdatasync (デフォルト)に設定すると、InnoDB はデータとログ ファイルの両方をフラッシュする為に fsync() を利用します。もし O_DSYNC に設定すると、InnoDB はログ ファイルをオープン、フラッシュする為に O_SYNC を利用しますが、データ ファイルをフラッシュする為には fsync() を利用します。もし O_DIRECT が指定されると(GNU/Linux バージョン上で有効)、InnoDB はデータ ファイルをオープンする為に O_DIRECT を利用し、データとログ ファイルの両方をフラッシュする為に fsync() を利用します。InnoDB は fdatasync() の代わりに fsync() を利用する事、また様々な種類の Unix 上で問題があった為、デフォルトで O_DSYNC は利用しないという事に注意してください。この変数は Unix に対してだけ関連があります。Windows 上では、フラッシュの方法は毎回 async_unbuffered で、変更する事はできません。

この変数の異なる値は InnoDB performance 上で著しい影響を持ちます。例えば、InnoDB データとログ ファイルが SAN 上に位置するいくつかのシステム上では、innodb_flush_method を O_DIRECT に設定する事は、3つの要因によってシンプルな SELECT ステートメントの性能を劣らせる可能性があるという事が発見されました。

なんか変だと思うのは気のせい?

先日読んだheystack話もメタデータがNFS上にあっておせーというのがモチベーションでしたね。

remember the milk

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
smart listを多用してプロジェクト単位にtaskを切り分けた。2つのプロジェクトに所属するtaskも作れる。日程管理はgoogle カレンダーでの連携でこなす。取りあえずスケジュールが破綻するかどうかこれで様子を見る。