R26

DBArrayObject

PHPにおいて、$_SESSIONとまったくおなじ感覚で、データベースにアクセスできるDBArrayObjectクラスを作りました。簡単に"PHPらしい"方法でデータベースを使うことができます。

I have developed a PHP class that you can access to the database with the same style like $_SESSION.
This DB wrapper enables you to access to the DB in pure PHP way.

$_DB = new DBArrayObject();

主キーの設定

//デフォルトは"id"。idを主キーにしたテーブルの場合は、設定の必要なし。

$_DB["users"]->setkey("username");

Select

//絞り方の順序は自由に。
$users["ryuuji"];
$users->filter(array("city"=>"gifu","age"=>20));
$users->sort(SORT_CREATE);
$users->filter(array("city"=>"gifu"))->sort(SORT_CREATE)->limit(0,20);
$users->column("id,location")->filter(array("city"=>"gifu"))-> sort(SORT_CREATE)->groupby("hoge")->limit(0,20);
$users->get(SORT_CREATE, array("city"=>"gifu"),0,20);

//もちろんこうかいても同じ:
$_DB["users"]["ryuuji"];
$_DB["users"]->filter(array("city"=>"gifu","age"=>20));


//Loop
foreach($users as $row){
print $row["name"];
}

foreach($users->limit(10,20) as $row){
print $row["name"];
}

//Count
count($users);
$total = $users->filter("age"=>20)->limit(0,20)->get_total_count(); //limitがないときの全体数を取得

Insert

$_DB["users"] = array("name"=>"ryuuji","age"=>26,"location"=>"gifu");
$id = $users->get_insert_id(); //直前にinsertされた行のキーの値を取得

//もちろんこうかいても同じ:
$users = $_DB["users"];
$users = array("name"=>"ryuuji","age"=>26,"location"=>"gifu");

Update

$users["ryuuji"]["email"] = "ryuuji@test.com";
$users["ryuuji"] = array("age"=>27,"city"=>"tokyo") //ageとlocationのみ更新
$users->filter("age"=>">30")->update(array("city"=>"gifu"));

Delete

unset($users["ryuuji"]);
$users->filter(array("city"=>"gifu","age"=>20))->delete();

注意点

//以下の場合、$ryuujiの値を変更すると、DBが実際に更新されます。
//データを別の配列に収納したい場合は、array型にキャストしてください。

$ryuuji = $users["ryuuji"];
$ryuuji["email"] = "ryuuji@test.com"; //DBが更新される

$ryuuji = (array)$users["ryuuji"];
$ryuuji["email"] = "ryuuji@test.com"; //DBは更新されない

//注意点2
実際にSQLが発行されるタイミング

foreach ($users as $user){  //一回だけ発行される
print $user["email"];
}

foreach ($users as $user){  //発行されない
print $user["city"];
}

print count($users); //発行されない

$users->filter(array("city"=>"gifu"))->sort(SORT_CREATE); //一回だけ発行される

print $users["ryuuji"]["email"] //一回だけ発行される
print $users["ryuuji"]["title"] //発行されない


If you want to learn more, leave comments below.

Flash AS3のガベージコレクションを攻略する4つのTips

Flash AS3でCPU負荷の高い処理、多くのメモリを使う処理、アニメーションを長時間連続して再生する処理を行う場合には、メモリの管理をすることが必須です。

Flash AS3においてメモリ管理について知っておくべきTipsをまとめました。

その1 ガベージコレクションについての基本知識を仕入れましょう

リファレンス(参照)、メモリスコープ、メモリ空間におけるアドレスとデータについて、ガベージコレクションがなにをしているのか知る必要があります。

hoge = null;
delete hoge;
の二つの違いも重要です。C, C++とは、これらの意味が異なりますので、押さえておきましょう。

ガベージコレクションにおいて一番難しい概念は「参照回数」でしょう。C++などのクラス設計においても参照回数という概念はありましたが、計測方法が異なります。

参考URLは

その2 Tweenを連続して使用するとときどき「かくっ」とアニメーションが止まるのを防ぐ

Tweenは決してノンストップで使えないわけではありません。ノンストップでTweenを使ったときにアニメーションがカクカクするのはGCが効き過ぎるために生じる現象です。具体的に説明します。

function loop(){
var foo:Tween = new Tween(test,100,10,,,);
}

というコードにおいて、loop関数をTimerで回して、testオブジェクトをノンストップで動かしています。これを実際に動かすと、ときどきTweenの動きがカクカクとして止まることがあるはずです。
それは、Tweenをローカル変数で参照しているために、関数を抜けると参照回数が0にセットされ、次回のGCのタイミングで、オブジェクトが削除され、その瞬間にアニメーションが止まるからです。単発でTweenを使うとアニメーションが止まらないのは、単に「Tweenの動きが終わるまでにGCが発動する確率が低い」からであって、止まる可能性は現実にあります。

Tweenと同様に、Loader, Sound, Timerなどのオブジェクトで同様の問題が起きる可能性があります。
回避のポイントは変数の参照を消さないことです。つまり上記のコードは以下のようにすることで修正できます。

var foo:Tween;
function loop(){
foo = new Tween(test,100,10,,,);
}

しかし、このようにグローバル変数を使うとコードが読みにくくなります。
また、今度は逆に、参照が消えないために、GCの対象にならず、メモリリークを発生させる原因になります。
気をつけましょう。

この問題に対処する現実的な方法は、

  • 上記の動作を認識した上で、動作完了後に参照回数をゼロにするようなコードを自分で書く
  • GCに対応するようにカスタマイズされたTweenクラスを使う

の二つです。

その3 メモリがどんどん肥大化していってFlashが死ぬ問題に対処する

これは使わなくなったオブジェクトの参照がどこかで残っているために、GCが発動してもデータが削除されないことによって発生します。
一つ一つのオブジェクトの参照を調べていき、バグをつぶしていくしかありません。
しかし、これらを防ぐためのテクニックはあります。
- 変数のスコープを限定するようにする。(ただしこれを実践しすぎると、上述の「その2」の罠にはまる可能性があります。バランスが大事です)

- イベントハンドラに気をつける。addEventListnerを使うと、そのときに対象オブジェクトに対して、参照関係が作られ、参照カウントが増加します。この参照カウントは適切にremoveEventLisnerしてやるまで減りません。しかし、作成したEventを一つ一つ追っていくのは非常に面倒ですので、現実的には、addEventListnerしても参照関係を作らない「弱参照」というテクニックを使うのが有効です。

その4 任意のタイミングでGCを発動するテクニック

Flashのデフォルトの動作では、GCFlashによって自動的に発動し、開発者が任意のタイミングでGCを発動することはできません。また、描画負荷の高いときはFlashのアニメーションをなるべく止めないように、GCの発動が自動的に止まります。すなわち、コードの設計が適切でない場合は、
負荷があがる->GCが発動しない->ますます負荷があがる->死ぬ
という悪循環をたどることになります。
では、負荷が高くないすきを狙って、手動でGCを強制発動する方法があるのかどうか。

以下のサイトに、LocalConnectionを用いて、任意のタイミングでGCを発動させるバッドノウハウが載っていますが、あやしいです。


system.gc();
この方法は、公式ですが、デバッグモードのときとAIRアプリのみ動作します。

結論としては、開発者が任意のタイミングでGCを発動することは難しいといえます。その1,その2、その3のTipsを活用して、適切なコードを書いていくしかありません。

私見

個人的な感想を述べるなら、Flash Action Scriptはメモリ管理なぞ考えなくてよいところが利点だったのに、その時代は終わったと感じています。そして、ガベージコレクションの登場によって、メモリ管理は一見、C++の時代にくらべて易しくなったように見えて実はブラックボックス化が進み、泥沼にはまると問題を発見しにくい構造になったと感じています。
「ポインタを制するものがCを制す」はそのまま
ガベージコレクションを制するものがAS3を制す」に置き換えることができ、メモリ管理はいまも昔もプログラミング学習の最大の難関です。

資本主義と人間性 - ビジョンと人情、どっちが大事?

資本主義が牙をむいている。
失業が広がり、暗いニュースが伝えられ、不安と不満が社会全体を覆う。
景気が悪くなると、資本主義は、合理性を盾に人情を蹴散らしていく。こういうときに共産主義や人情もののストーリーに人気が集まるのもおもしろいことだ。歴史は繰り返す、と思う。

人間は超合理的な資本主義マシーンにはできていない。働く意味を見いださないといけない。それが家族のためであれ、仕事がおもしろいと感じるからであれ、野望のためであれ、だ。金は手段でしかない。

僕は、大学で半分体育会系のクラブに属していたので、人情による人間組織というものがわかる。人間関係は、お互いにクラブ員に対して与えあう恩とその恩返しの情によって結ばれる。新米は、飯をおごってもらったり、失敗をフォローしてもらったり、技術を教えてもらったり、先輩の世話になりっぱなしで、年長になるとお世話になったクラブのために、何かしなければならないという思いに駆られる。そこは人情の世界だ。しかもお金が絡むビジネスじゃない。OBとも世代を超えて強い紐帯で結ばれる。だから、学生時代の人間関係というのは打算のない、無垢で純粋なよい思い出として記憶に残っている。

一方、僕はよく、シリコンバレーのソフト開発の会社では、たとえば、ソフトの開発言語をPerlからRubyに変えるとき、社員を再教育することを考えずにPerl部隊を全員首にして、Rubyの人材を募集すると言って賞賛する。しかし、それは非人間的というより、どんな手段よりも速く変革を成し遂げるシリコンバレー流のやり方で、かつ社会がそれを許容する「強い個人」によって構成されているからこそ実現できると思っている。

大学時代のクラブの人間関係に望郷の念をいだきつつ、シリコンバレー流も正しいと思う。
シリコンバレー流が、米国社会の合意を得られる理由は、なんだろうか。それは、「ビジョンとミッションの達成」のためということになるだろう。理想を掲げ、使命を達成することが会社の目的であり、そこに共感して集まってきたのが社員である。だから自分自身がその目的完遂のじゃまになるなら、去らなければならない、ということである。米国は、理想(独立宣言・合衆国憲法)を掲げてそれに共感するものが集まってできた「国」であり、国家全体がその哲学のもとに動いている。

日本人はそういうメンタリティはい。極端にいえば会社がどんな理想をかかげて、なにが目的かなんて興味がない。しかし、いまの上司には世話になっているし、会社には飯を食わせてもらっているのだから、それに値する奉公をするのが正しい道と考える人が多いのではないだろうか(一生奉公すべきか、もらった分だけ返せばいいと考えるかは意見が分かれるところだろうが)。また経営陣はそんな社員を養う義務がある。

ここで、米国は合理的で、日本は人情=非合理的と考えるのは間違っていると最近思うようになった。
むしろ、あえて正反対であるという論を掲げてもよい。
まず米国流が非合理的である理由を述べる。それはこの「ビジョンとミッション」それ自体にある。米国では「ビジョンとミッション」を作り、実行に移す起業家が尊敬を集めるが、じつはビジョンとミッションとは単なる個人の身勝手で、実はなんの合理性もない。ビジョンとミッションにこだわり抜き、社員全員でそれを共有することが大事であると経営学MBAなど)は説くが、その「こだわり」ようは合理性のかけらもない。たとえば、The Body Shopは、創業者が「環境と人体にやさしい化粧品」にとことんまでこだわり、全社員、全店舗でそれを徹底させたことが成功の秘訣であるとか、Apple社は、ユーザーの立場に常にたった技術革新を先導するというこだわりを持っていてブレがないとか。ブレがないのは、すわなち創業者の信念だからだ。そして、このビジョンに合理性があるかは「検討されてはならない」。市場調査をして後付けされたビジョンは、安っぽいものであり、組織が困難に直面したとき、ばけの皮がはがれるからだ。ビジョンとは、それくらいみなが「心から信じられるもの」でなければならない。

ビジョン自体に客観性は必要ない。そしてそれを検討しないのは、独立宣言にも見て取れる。
「私たちは以下の事実を自明のものとみなす。それは生命、自由、幸福の追求・・・」
自明=Self Evident、すなわち、証明の必要がない、とね。

アメリカ国家のビジョンであるFreedom(ブッシュによって乱用されネガティブイメージがついたか)、Hope(オバマがつかった)、ともに合理性はない。だから強いし、怖い。日本人がアメリカの組織のやり方に対してなにかしら「胡散臭さ」を感じるとすれば、正体はこのあたりにあると考える。いいビジョンは多くの人に受け入れられる可能性を秘めているが、「すべての」行動基準を、そのビジョンにゆだねる姿勢が日本人には理解できない。

アメリカでは、ビジョンとミッションの達成こそが、組織の求心力になる。しかし、それを日本に持ち込むのはむずかしいだろう。

だら見 - ブログがテレビを食う日

新しくなった「はてなブックマーク」が気にいっている。カテゴリーをクリックして複数のカテゴリーをだらだらと見てしまう。ブログやウェブ上のニュースも毎日見たくなると思わせるコンテンツがこんなに増えたんだなと感慨深い。もちろん、人力を使い、うまいアルゴリズムを駆使して並べて見せるはてなもすごいが。

ブログをつい何時間もみてしまう。はてなをひとしきり見ると、その次にDiggを見る。YouTubeは単体では見にいかないがブログに埋まっているとたいがいは見る。

テレビは見ない。持っていない。テレビってYouTubeにアップされているテレビ動画、あれをテレビ局がおすすめする順番で流しているだけだよね。朝にニュースやさわやかな番組、夜にはエンターテイメント性のあるものというふうに時間帯に合わせた番組を選んではいるけれど、それ以上のものはない。
ドラマやドキュメンタリーは好きな時間にみたい。ニュースは気になるが何度も同じのを聞かされるとうんざりする。

テレビは電源を入れるだけでだらだら見れる。ブログは考えてクリックしないといけないから心理的な負荷が高い。これがテレビの利点だとおもってその点のみにすがりついていると世界はすぐに変わるだろう。

アメリカ人に響く英語表現 - こそあど言葉と、You I We

どの言語にも「キラーセンテンス」が存在する。直訳すると「殺し文句」であるが、ここでは「簡単な単語で、幅広い場面で使える便利な表現」と「非常に合理的かつ例外のない美しい文法構造をもっており、かつ便利な表現」の二つのことについて述べる。

たとえば、前者に該当する日本語「すみません」をあげてみよう。
「すみません」は、実にいろんな場面で使える。謝るだけでなく、町中で知らない人に声をかけたり、感謝を伝えることもできる。外国人が「ありがとう」や「こんにちは」の代わりに、ちょっとお辞儀しながら「すみません」を使っていたら、「むむ、できるやつ」と思われるに違いない。とても日本らしい表現だと思う。

さて、本稿の本題は、後者のほうである。日本語の「こそあど」言葉は、日本語のなかでもその文法的な美しさが際だっている。これを学んだときは、ほれぼれした。他の言語にも似たようなものがあるのはどうかは知らないが、この便利さ、文法的な美しさは並大抵ではない。コソアドだけで会話は成り立つ。
「あれ、あれだよ」
「え、どれ? あ、あれね? これがねえ」
「うん、それそれ」
みたいな感じ。
コソアドを整理してみる。
こ 近称  自分が指さす範囲のもの
そ 中称  相手が指さす範囲のあるもの
あ 遠称  第3者の範囲にあるもの
ど 不定称 範囲が分からないもの

指示 形容 場所  人        方向  態様   感情?
これ この ここ  こいつ(こなた) こっち こんな  こら 
それ その そこ  そいつ(そなた) そっち あんな  そら 
あれ あの あそこ あいつ(あなた) あっち あんな  あら 
どれ どの どこ  どいつ(どなた) どっち どんな  どら 

コソアドが、指示、形容、場所、人、方向、態様の距離感を表すのに便利で合理的な構造を持つことは明らかである。また、上記の会話のようにうまく使うことで日本人にさまざまな想像をかき立てる。
じつに奥の深い言葉だ。梅田望夫氏が、Web2.0を「あちら側」、それ以外を「こちら側」と呼んで物議を醸したのも、この言葉が明確な帰属意識を聞く人に与えるからに他ならない。「おまえはあっち」というのはいじめの常套句だ。たぶん、梅田氏の中ではいままで、Web2.0は、「どっち側」か分からなかったのだが、最近はっきりして「あっち」であることが明らかになってきたので、本を書いたんじゃなかろうか。しかし、Web2.0がすでに「こっち」にある人にとってはこの本は意味がなく、「あっち」にある人はいつまでたっても「あっち」であり、「そっち」にある人には、「こっち」にいくか「あっち」にいくか判断を迫ることになっただろう。

次に具体的事例を見てみる。たとえば、ビールの宣伝。
「やっぱりこの味アサヒスーパードライ
「いつも飲んでるあのビール、家には常備しておきたい」
「やっぱりこれからの季節はスーパードライだなっ!!」

「この味」、「あのビール」「これからの季節」などコソアドが大活躍している。ここでのコソアドは、続く名詞の想像をかき立てる役割をしている。しかし、特に意味がないことは明らかだ。「これからの季節」なんて、一年中通用する。「この味」も他社のビールだって「この味」がするだろう。コソアドの魔力である。


本題に戻そう。コソアドは、文法が美しいだけでなく、便利であり、この言葉が日本人の生活や価値観と強く結びついていることは想像に難くない。
さて、わたしはこのコソアドにかわる語感をもつ表現を英語に探していた。それが「WeとYouとI」である。なんだそんなことかと思われるかもしれないが、これに気がついて私は目から鱗が落ちた。ぱあっと自分の中の英語の言語空間が豊かになって、より愛着が沸いた。

いままで、英語のWeとYouとI(とくにYouとI)は省略できず、意味もなくつけないといけないという点に、堅苦しく、無味乾燥な印象をもってきた。しかし、いま、WeとYouとIは人称代名詞であるが、ほとんど日本語の指示詞(コソアド)のように使えばよいということが分かった。さらにWeとYouとIをコソアドに対訳するとぴたっと当てはまる。
これに気がついたきっかけは、マーケティングの用語として、アメリカ人からやたらと「You」を使えと言われてきたからである。「You」があると言葉が力強くなる、と。確かに事例はいくらでもある。
「Your potential, Our passion」 Microsoft
「Broadcast yourself」 YouTube
「Drive your dreams」 TOYOTA

これを私の考案した対訳を当てはめるとこうなる。
I か We : こ 近称  自分が指さす範囲のもの
You :  そ 中称  相手が指さす範囲のあるもの もしくは
     あ 遠称  第3者の範囲にあるもの

たとえば、マイクロソフトのキャッチはこう訳す
「あの理想、この情熱」
Youtubeなら
「あの放送を自分自身で」
TOYOTAなら
「あの夢に乗ろう」
だ。
「あの理想」と言われると、昔抱いていた大きくて甘酸っぱい夢が喚起されるだろう。「あの放送」と言われれば、テレビの放送のような大手の立派な放送が想起させる。それが「You」の力である。「想像喚起力」と言ってもいい。

これを
「あなたがたの理想、私たちの情熱」
「自分自身を放送しよう」
「あなたの夢に乗ろう」
では、残念ながら不合格。先のアサヒビールのキャッチコピーを思い出してほしい。

結論。英語の人称代名詞の語感は、日本語のコソアドのそれを重なる。すなわち、どちらも、話者と対象の距離感を表すための言葉である。しかし、ここでさらに雑な議論をするならば、コソアドは4段階であり、英語のWe You Iはほぼ2段階しかないということ。このあたりは、英語の善悪史観や、世界をWeかYouにわける発想にもつながっているのかもしれない。

たとえば、Bushの悪名高きイラク戦争の宣戦布告演説
"You're either with us or against us."
は「こっちにつくのか、あっちにつくのか」であり
Obamaの勝利演説
"We are , and always will be , the United States of America"
は「ここは、これからもずっと合衆国だ」
が適当となる。この先は暴論となるのでこのあたりでやめておこう。

なお、Youには、一般的な事柄について語るとき使う"Geeric You"というものがある。Youがより広い意味を持つことがわかる。
http://en.wikipedia.org/wiki/Generic_you


念のため、本稿は、どんな場合でもYou I Weをコソアドで訳せということを述べているわけではない。
またおそらく多くの訳者はすでにこのように訳していると思うので、なにを今更という人もいるだろう。ただ、英文に欠かせないこれらの人称代名詞の語感を日本語のコソアド(とくに、人、方向以外)に対応させる文献が見あたらなかったので、書いてみた。

追記

翻訳訳語辞典(http://www.dictjuggler.net/yakugo/data/000/796/f75.html)で、
you're wrong: それは違う
という訳を見つけた。そうそう、that's wrong とyou're wrongはほとんど同じなんですよね。「君は違う」じゃなくて、「それは違う」と訳すのが適当ですね。

アメリカ人に響く英語表現 - 動詞に気をつけろ

言語の違いに興味がある。土地が人に影響を与え、人が言語を作り、言語が人に影響を与え、文化が創られる。

アメリカに住んで一年がたち、それなりに英語も身に付いてきた。ある言語を習得するさいに一番苦労する点にこそ、その言語の本質があると思う。言語の習得には段階がある。ある点に苦労し、それを突破すると次のレベルでまた苦労する。

たとえば日本語では、そもそもしゃべるのに苦労した記憶はないが、小学生のころからずっと「漢字の読み」に苦労している。いまでも読めない単語に出会う。次に、「文章をどういう語尾で終わるか」相手によって、またそのときの雰囲気によってあわせるのに苦労している。敬語や丁寧語を使いつつも、ときどき「〜ですよね」や「ではでは」などといった軽い表現も組み合わせて使うことは日常的によくある。そういうときに困る。
この二点は、いまでも苦労しているが、英語では困ったことがない。


ドイツ語だとどうか。最初のころはあまり覚えていない。ある程度上達してから苦労したのは、①過去分詞(口語で過去のことをいうときはほぼ、過去分詞を使う)が、seinをとるか、habenをとるか、②目的語を第3格でとるか第4格か、③名詞は男性か女性か中性かの三点である。しゃべりながら、その選択が近づくと、脳の別のメモリ空間(辞書アプリケーションといってもいい)を使って別に演算処理し、結果をメインスレッド(言葉の流れ)のなかに結果を入れてあげないといけない。

名詞の性はなんども使っているうちに意識しなくてよくなるが、それは頭の中に名詞の性の辞書が常駐するようになり、強化されただけであり、やはり脳のCPU(演算処理装置)はつかっているものと思われる。そういう意味でドイツ語は名詞を強く意識する言語だと言える。


英語はどうか。ちかごろ一番意識していることは、「動詞の選択」である。何を表現するにせよ、「動詞」を絶対的に文書の最初のほうにもってこないといけない。これがきつい。ドイツ語は、動詞は文の最後でよかったといまさらながら気がついた。日本語もまたしかり。
ドイツ語がおもしろいのは、動詞を前にもってはくるのだが、とりあえず、主語に「sein(be動詞)」か「haven(have動詞)」をつけておいて、肝心の動詞は文末にくっつければいいことである。これはあたかも日本語で、主語にとりあえず
「(主語)は〜〜」と「は」をくっつけておいて、最後に動詞をもってくればいいのに似ている。実際に、日本人の英語を聞いているとなんでもかんでも「〜 is 〜」 と主語のうしろにbe動詞をつけてしまっている人が多い。しかし、英語ではこれは許されない。主語のすぐ後ろにくる動詞が、その文のすべてのニュアンスを決するといいきってしまってもいい。

英語のキャッチコピーを見ていると、いい文は動詞が最初にくる。これは見た人にActionを促すからだそうである。「Just do it」「Broadcast yourself」などがそれである。

Be動詞を意識的に使わないようにし(特にbe動詞+形容詞を使わない)、「get, have, give, come, make」などの基本的な動詞の使い方をマスターし、さらに他の動詞の語感を学んでをうまくつかいこなすことが英語上達の早道であると思う。

次に気をつけるべき点として、否定をなるべく文の最初にもってこないといけない。これも精神的にこたえる。僕の脳の言語構造はそういう風にできていない。

たとえば、「喫煙は健康によくないと思う」というときに正しくは
「I don't think that smoking is good for health」となる。
つい、
「I think that smoking is not good for health」
と言いたくなり、頭が混乱する。結果、よく間違って
「I don't think that smoking is not good for health」
と言ってしまう。

ドイツ語なら
「Ich glaube nicht」
だったわけで、わずかな差と思うかもかもしれないが、いまだに慣れない。
否定を先にもってくることをうまく活用すれば、「Don't 〜」の構文は英語として強いメッセージを発するいい文章になる。