かしこくもなりたいし、女の子にもなりたかった。

とってもガーリーなゆるふわ愛され何でも屋を目指す、30代男性がお送りするファビュラスなブログ。

0時過ぎに「ベイマックス」観てきた。

久々に映画観てきた。

Big Hero 6(邦題:ベイマックス)ね。

原作を読んだわけでないけど、いろいろ見る限りは骨の本当に一部を残して綺麗に作り直しちゃった感じですな。

  • サンフランソウキョウってなによ、とか思ってたけど、サンフランシスコに東京を加えたような感じで、まあなんとなく受け入れられちゃう感じ。まあありがちな、「おまえらアジアの文化を混同しすぎ」感はあるっちゃ有るけどそこはご愛敬。サンフランソウキョウの漢字表示としてさりげなく「奏京」という表記が出てきてたりするのは細かいなぁ、とかおもた。

  • キャラ名をタイトルにしたがるデゼニーの日本のローカライズチームのせいで、ベイマックスというタイトルにされてしまってる。まあ確かに重要なキャラではあるんだけど。「ドラえもん」の主人公が「のび太」みたいなもんかね。

  • すっげー不安になったのは、字幕版のエンディングもAIだったことよ。これ、作中の映像ももしかしてローカライズ後のだったりとかしないよな...?

  • このためにRendermanから新設計のレンダラに変えたという、ビニール感のある質感は確かに素晴らしかった。

  • まあ細かい文句とか言ってしまうものの、全体としては満足感の高い作品だった。ディズニーのチームがディズニー的に作ったマーベル作品、になってる。ちゃんと。

  • そしてまさかたぁ思ってたけど、マーベル作品らしくちゃっかりスタン・リーが出てくる。

そんな訳で深夜の映画鑑賞終了。寝る。

Apple Store Lucky Bag 2015 レポート

突入。 - Spherical Image - RICOH THETA

あー疲れた。 とりあえずレポしときますね.....


LuckyBag、それは宗教行事。

毎年鬱袋と言われてるけど、なんだかんだで金額ベースでは倍程度の価値を提供してくれる。それが、我らが愛する宗教法人Apple.Incである。

かれこれもう7年。うち最初の2年は買えず、その後今年含めて5年連続の購入となるけど、この行事が僕の中では良い感じのリズムになってて、毎年通勤鞄をLuckyBagの鞄に変える(さすがにトートの時はやめたけど)ようにしてる。

新しい鞄と、Appleなガジェット。これでまあちょっとばっかし自分にお年玉をプレゼントした気になると同時に、別に頼まれてもいない徹夜の行列という恐らく年中でもトップクラスにしんどい行事を先にこなしておくことでその年の仕事を前向きに取り組もう、とまあ、僕の中ではそういう行事になっているのです。縁起物ですね。


今回の行列

今回は表参道に並ぶと決めていたものの、例年と違い非常に情勢が読みにくく、

  • Omotesandoの追加
  • 昨年のGinza列のヒートアップっぷり(前日始発が既に交番前より後だった)
  • 昨年のShibuyaの世紀末っぷり

以上からから、

  • 表参道に人が流れてくる可能性(なにせ今回が初のLuckyBag)
  • 渋谷組の流入
  • 総数の分配

など非常に心配事が多い行列となりました。

我々は12/31という例年「それは人間捨ててる感じあるしやめとこ?」と言っていた言わば禁断の日と位置づけていたのですが、上記からそのタブーを捨て12/31の正午に現地集合と相成りました。

ええ、初の先頭集団入りです。
先頭から8人目になりました。

こんなに嬉しいことはない。

とはいえ、ざっと44時間という○チガイじみた待ち時間、禁止された椅子の使用、挙げ句の果てには余りに寒すぎて、モバイルバッテリーからの給電でまったく充電出来なくなったiPad、極めつけは突如発生した凄まじい突風で、列整理用のパイロンが激しく吹っ飛ばされるなど、想像もしていなかった困難が目白押し。

まあ幸い先頭集団の高校生組達をはじめとした一団と和気藹々と出来たこともあり、AppleStore前で信者的にアウトな映画である「JOBS」を観たりと、なんだかんだで楽しみながら過ごせました。

ちなみに僕はこんなのを作ってました。例年作ってるLuckyBagカウントダウンの今年版です。

f:id:takustaqu:20150102113335j:plain


中身

さて、お待ちかねの中身の紹介です。

iPod touch 16GB (RED)

f:id:takustaqu:20150102111910j:plain

ここ2年連続でnanoだったので、どうせnanoだとおもってたのですが、ちょっと奮発してtouchになってました。正月らしく赤色。


Mophie Powerstation 4000mAh

f:id:takustaqu:20150102111922j:plain

これもまた定番。2年前にも同じくpowerstationが入ってましたが、その時にはプリント無しの白。今回はAppleStore限定のグラフィックつき。ちなみにいい値段します。


AppleTV

f:id:takustaqu:20150102111930j:plain

実は家のもう1台のテレビに付けたいと思ってたので、丁度ほしかったのです。嬉しいですな。割と持たないとありがたみが判らないガジェットなので、是非とも試していただきたい。


Power beats2 wireless

f:id:takustaqu:20150102111937j:plain

これも予想通りのbeats。ただヘッドホンだと思ってたので、イヤホンだったのはちょっと意外。これは譲っちゃおうかなとおもってたんですが、何気に防水らしいので、お風呂イヤホンにしたいなーとちょっと思ってます。


iTunesカード(1000円)

f:id:takustaqu:20150102111947j:plain

金額はランダムらしいですが、今のところ1000円という報告しか聴けてないです。


Incase ICON Slim Pack Backpack

f:id:takustaqu:20150102111958j:plain

そしてこれが一番大事。鞄です。Incaseらしい構造ですが、今年のは両サイドにもポケットがあり非常にナイス。これはそのまま通勤鞄にします。


実のところ持ったときに物すごく軽く感じたので、「当たりか?!」と思ったんですが、全体的に軽くコンパクトなもので構成されていたというのが実際の所でした。

少々残念だったのが、恒例のTシャツが今回無かった事。円レートの影響ですかね...何気に毎度楽しみにしてるんですが。


まあ例年以上の長丁場で、いろいろ苦労はあったものの、今回はじめてハイタッチで迎えて貰える位置に付けたことから非常に楽しめました。これが次からのデフォになると考えると非常に辛いですが、今後もOmotesando(or Ginza?)に並ぶと思います。少なくとも僕は。

誰にでも勧めるものじゃ無いけど、何だかんだで楽しめますよ。 そんなわけで僕のお正月は終了です。明日から通常営業致しますー。

僕は、スイカという果物が苦手だ。

タイトルの通りである。僕はスイカという食べ物が苦手だ。 確かに食ったら美味い。甘いし、塩味を付けると尚更だ。

食うと美味いのは知ってる。でも最後には、皮のあたりの味のない部分を食う事になる。

人は面白いもので、第一印象が肝心という割に、記憶に残るのは最後の印象なのだ。

僕はスイカが嫌いだ。そして、故に人も苦手だ。これは今後も変わらない。 そして私自身も、そういった理由で良い印象を持たれていないかもしれない。後味を良くする努力なんてするつもりないしね。人生は短いのだ。自分のリソースは、最大限自分の思うべき事に注ぐべきなのだ。人との関係性を取り繕うリソースなどない。人なんてそんなもん。後味気にしてられるか。

これが持論、そして行動原則だ。
これは何があっても変わらない。変えるつもりも無い。 人にも押しつけない。だから人の後味も気にしない。

そしてもう一つ、私の人生観に一つ大きな影響を及ぼした物がある。 それは、「違和感には必ず原因がある。注意深くそれを探し続ける事」そして「自分の納得」という事の尊さを教えてくれた、古い友人の死だ。

これからするのは、そんな話。
生きてりゃ起きる、そんな話。

続きを読む

Web Music ハッカソン#3に実は行ってたって話。

f:id:takustaqu:20141115034528j:plain

またハッカソンいかへん?という話はエンジニアの松尾君(通称niuやん)と度々話をしていたものの、なかなか都合がつく良いイベントが見つからず...と、そんなときに出会ったのが、このWeb Music Hackathonでした。

しかも会場は情報産業界の憧れとも言えるGoogleの日本オフィス。行くっきゃない!

と、最近の話のようにいってますが、実はこれ9月の話ですorz でもこれを書かないで、次のハッカソンには行けないしね!


イデア

いうまでもない話としてハッカソンは当日作ってなんぼなイベントである故、当日何が(APIとか、ガジェットとか)用意されているか?でやはり本番作るものは決めたいところですが、この辺は前回同様に松尾さんとのアイデア出しをあらかじめ行いました。

事前にある程度公開されていた機材類の他に意表をつく飛び道具が出てくることは幸い無かったので、事前ブリーフィングでのアイデアをほぼそのまま持ち出すことになります。。

イデア出し

  • WebAudio APIとWeb MIDI APIを使いたい。
    • 「そういやGetUserMediaでマイクの音ひろって、スペアナ表示してるデモ見たことある。」
    • 「WebMIDIあればポケットミクとかさくっと使えますな。」
  • 何かしらの飛び道具を持ち込みたい。

上記のアイデア出しから、以下のようにまとまっていきます。

オーディオケーブル1本でMIDI化できるとしたら、
それはクールと呼べるのではないだろうか?

それが、今回のオタマトーンをPCのライン入力に繋ぐだけで、MIDI化されるWebアプリケーション」です。非常にシンプル、そして誰の目に見てもクールです。多分。

が!

このアイデア、俺のやる事があんまりないんですよね.... そんなわけで、スマートフォン用UIを作るという私の仕事の創出を目的とした機能が付いたわけです。


開発

実行環境

なぜnode.jsではなくnode-webkitだったのか

node-webkitとは、簡単に言うとChromiumの中に入ってるJavaScriptエンジン(V8)を、同じV8派生であるnode.jsに置き換えた奇跡の融合物です。しかも1つのパッケージに纏めて、あたかも単体のアプリケーションのように振る舞うことも出来ます。

我々はデモマシンにnode.jsをインストールしたり、などの手間がないので単なるnodeなアプリケーションの実行にも使う事がありますが、今回の最大の目的は、WebMIDIやピッチ解析をnode-webkit内蔵のWebkitで行えば、アプリケーションを立ち上げて、そのアプリケーションが提供するWebサーバーにスマートフォンで繋ぎに掛かればスマートじゃん!という発想からでした。

まあ肝心のWebMIDI周りの実装が今のChromeに追いついていない事もあったので、結局node-webkit内での実行をあっさり諦めて単なるWeb+socket.ioなサーバーとなったのですが、単なるnode.jsでの実行としなかった理由はこういった経緯があったためです。(まあ動かせなくもなかったんでしょうが、その辺のスマートさよりも一通り動く事を優先する必要がありましたし、確実な方法を取ったと)


UI周り

ぶっちゃけ処理周りは専門外なので書いた奴のエントリー読んで頂くとして、私は前述の通りデザイナなので、スマートフォン上で展開されるUIを書いていました。

f:id:takustaqu:20141115034556j:plain

タイトルバーに出ていたYAYANEは、kirinsan.orgの名誉総教祖であるヤヤネヒロコ神からいただいています。(こう書くといつも本人に怒られるんですけどね!)

UIとエンジン部は前述の通りSocket.io越しで叩いています。この構造、まるでフォトカプラ越しにやり取りをするMIDIのような感じで素敵じゃん?とよく判らない事を考えて居たのですが、意外とこういう開発をするときにUIと内部の処理を切り分ける手法としては有りなのかもしれません。(ケースバイケースですし、ローカルで完結するようなもんであればはっきりいってお行儀は良くないですが)

感覚を与えるUI

ダイレクトな反応は、学習性の高いUIに必須だと思っています。そのため、今どの音なのか?ということの表示の仕方は、入力デバイスとしてのオタマトーンを扱う上での「感覚」を養うために非常に重要だと考えました。

これが、画面レイアウトの一番目立つ箇所に検出したノートを表示するようにした根拠です。

アニメーションの持つ情報

ピッチ変化はリニアな移動、もしくは時間と変化の2軸グラフで表現できるでしょう。ギターのチューナのようなものも考えましたが、今回は文字が上下に移動して切り替わるシンプルな物としました。ダイレクトに結果をきびきびかえても良いんでしょうが、変化に合わせてアニメーションするのは、自分の行動がどういう結果をもたらしているのか?を体感出来るようにする意図があります。

このあたりはほんとはもっと精密な制御をするべきなのかもしれませんが、シンプルにCSSのみでおこなっています。

f:id:takustaqu:20141115034612j:plain


プレゼンテーション

幸いな事に今回は日本語話者が中心だったため、プレゼンテーションは素直に日本語で行いました。

例によってゲラゲラ騒がしく作業していた事と、割と周りになにをやっているか理解されていた感があったものの、オタマトーンから銃声がするというだけで笑いが取れるのはなかなかに爽快です。芸人冥利に尽きます。

正直あとから見直すと不手際が目立つのも確かなので、このあたりどれだけスムーズに見せるか?は本当に以降気を付けたいところ。


反省点

  • 事前にある程度スライドで準備しておけるところは準備しておこう...
  • 落ち着いて話そう、
  • 2人ともgitによるチームでの作業に不慣れ故Dropboxの共有で済ませてたので、次回からはちゃんとやろう、
  • 食わず嫌いせずにそろそろ生産性向上に強めよう。Scss使えよ、
  • 音色のプリセットの組み替えとショートカットボタンの実装はやりたかった。正直デモの時にそのあたり非常に無様だと自分で思ってしまったので、どうにかしないとな、

終わってみて

まあ改めてこう思い返すと、我々kirinsan.orgの良い点は、目標設定が上手く行ってるという点かもしれないと思いました。作りたいと思った完成形になんだかんだ到達出来てますからね。実はこれって結構難しい事なんでないかな?と思う訳です。

そして我々2人のもう一つの良い点としては、「お互いを笑わせに掛かってる」という点かもしれません。

今回なかなかカルチャーショックだったのは、Chromeの中の人たちから日々変わるWebMIDIの実装、そして変わった結果、で、必要あらばできたてのビルドまで用意しているというまさに最前線の方々がそこにいたという点。これ感動でした。

そして肝心の結果は、総合3位!ありがとうございます。Tシャツもらっていきました。壁に飾ってます。

次回はもう明日に迫ったTechCrunch Tokyo Hackathon 2014です。正直まだなにをするのか、今まで以上に見当も付きませんが、今度も変わらずのスタンスで、kirinsan.orgらしい事が出来れば良いですね。

JIRAとかStashとかConfluenceとか突っ込んでみた時のメモ

殆ど自分用メモですが、実際に使ってるの見せられたこともあり、自分で試してみようとAtlassianのConfluence,JIRA Agile,StashをさくらたんのVPSに導入してみた時の注意点をば。 切っ掛けは某所でタスク管理に使うのにJIRA Agileがよさげだなぁ、と思ったのと、個人的に使ってみたかったので、10クライアントのライセンスがお安かったことを良いことにまずは自分で使ってみる事にした次第です。

前提

  • 私はLinuxを言うほどしりまへん。
  • すぐWebminに頼りたくなる系男子
  • もっと言えば、バグトラッカーの類使うのもコレが初

環境

  • みんな大好きさくらたんさくらインターネット)のVPS。プロジェクトをいろいろ突っ込む事考えて少々ストレージに余裕が欲しいこともあるので、2Gプランにしてみました。
  • 実は別に借りてる1Gプランの環境では先にJIRAを突っ込んでみた地点で妙に遅かったのもあり、多分全般的にそれなりにヘビーなものなのではないかと思う。
  • OSは標準のCentOS。先項で試した1GプランはUbuntuだったけど、まあCentOS触ったことないし、良い機会だと思って。

引っかかったりした点

  • 本質的には関係ないと思うんだけども、ConfluenceにしてもStashにしても、ユーザー管理をJIRAから引き継げるので、なににしてもとりあえずJIRAから準備するとスッキリできるっぽい。
  • DBは後から簡単に移行できるっていってもやっぱり面倒なので、最初から素直にPostgreSQLで構築するのが吉。
  • CentOS由来の問題として、yumで入るGitは古いままなので、Gitは自分でmakeする必要アリ。
  • インストーラーで突っ込んだ場合は勝手にTomcat突っ込んで、各アプリケーション毎に環境作ってくれるんですが、コンソール用の管理ツール(config.sh)がOpenJavaだとスネるので、素直にOracleのJavaSEを突っ込む必要がある。
  • ConfluenceはDBをUTF8で作らないと怒られた。
  • 実際使うわけでないにしろ、非推奨の内蔵DBはインメモリ型故か、こっちで動作させてると少ないメモリのVPSが一気に亀化した。

と書くとたったこれだけなんですが、まあ何度かポカをしつつもどうにか3アプリケーションともに動くようになりました。

まあまだ善し悪しが分かるほど使っていないので、使ってみての感想はまた今度ということで。

退職エントリーからのどうしてこうなった。

f:id:takustaqu:20141017000711p:plain

前回の退職ポストから半年。なぜか無職になってからの方が忙しくなるという不思議現象に頭を抱えつつも、無職ライフをそれなりにエンジョイし、外でプレゼンする機会の度に「こんにちわ、無職です!」と挨拶する自分をどこか楽しんでいた半年。

あまりに無職無職連呼するせいでわざわざ仕事を作ってくれるクライアントの皆様には本当に頭が下がる思いでしたが、なんだかんだで食えてしまっている自分というこれ以上ない自信を与えてくれたのは他ならぬ皆様です。改めてこの場で感謝申し上げます。

ええ、その通り。
無職終了ポストです。

Web業界での実務経験がないだけに1度でもそういった実務経験が欲しいのもあり、職探しをしたいなと思っていた事が理由Aだった筈なのですが、じゃあ何故半年も無職をしていたかと言えば、先述通り「思いのほか仕事が貰えてしまった」というのが最大の理由で、何だかんだでホソボソと食いつなぎながらハッカソンにでたり(この辺また書きます)、久々にバイク触ったり、まあいろいろしてたわけです。

そんなこんな重い腰を上げて当初の目的通りバイト探すかぁ、といろいろ調べていた矢先に丁度連絡があったのです。
(注:あくまで当方フリーランスをやめるつもりが無いため、基本的にはバイトになるのです)

古巣から。

有休消化に1.5ヶ月掛かってたので契約上の離職から4ヶ月少々、前職からなにやらメールが飛んできていたのでちょっと話を聞きに行ってきました。まあ話は予想通りの「もう一度来ませんか?」だったので、素直に離職の経緯と現在の状態を話して、その上でこちらから条件を色々提示してその日はとりあえず帰ってきました。

上場企業らしい理由で「評価」に非常に腑に落ちない部分が大きかったことと、自分の時間を確保しないと次のステップに進めないこともあった故の離職、流石に前と同じ状態では受けれない事を強調したのは勿論ですが、後日まるでかぐや姫のワガママを書き記したような要求のうち半数以上がクリアされ、多くの特例を得た事もあり、素直に首を縦に振ることと相成りました。

結果としてかつて離職したときの不満を離職したことで勝ち取った格好です。まあここまで譲歩されると私としてもNoと突っぱねる理由はありません。

会社との契約が変わったこともあり非常に「お上に楯突きやすくなった」こともあり、今度こそは多くを変えていけると確信が持てています。ええ、よく判らない理由で変えることが許されなかった多くを、私の手で正すチャンスを得れたのです。素晴らしいですね!

そんなわけで、また会社員っぽい格好することにもなりますが、基本的にはフリーランスです。 この復職にあたって、複数のクライアント様のご理解を求める事になりましたが、快く承諾をいただけた事に改めて感謝。

まあなんとか上手くやってきます。

JavaScriptのifのとか()の知らなかった話

事の切っ掛け

事の始まりはこれ。とあるコードをOnline YUI Compressorに通そうとしたときに新しいツールを紹介されたので、そっちに通して見たときの事。ちなみにそっちの圧縮サービスはこれ。-> Refresh-SF - Online JavaScript and CSS Compressor

if(a=="foo"||b=="bar") console.log("Bazinga!");

たとえばこんな箇所が、以下のようにされていた。

("foo"==a||"bar"==b)&&console.log("Bazinga!");

この結果を見て不思議に思ったのでconsoleでちょこちょこ触ってみたところ「ぁー成る程、こう書けるのか」と妙に納得した。


一行ifを&&で代用する?

このカラクリは、&&は左側の値がfalseの地点で評価を進めないという事故。従って、左側の中身の括弧内の評価がそもそもtrueにならない限り&&右側の関数の戻り値を評価しない為、結果として関数も呼び出されない、という事のよう。

ではこのminifyツールで同じく今度は普通の{}囲みのif文を与えたらどうなるのか試してみた。

if("foo"==a){
    console.log("Bazinga!");
    console.log("Bazinga,again!");
}

"foo"==a&&(console.log("Bazinga!"),console.log("Bazinga,again!")));

こうしたら無名関数で囲まれるのかな、と思ったら違った。

勿論私のようなヘッポコの想像したとおり、無名関数にしても通る。

"foo"==a&&(function(){
    console.log("Bazinga!");
    console.log("Bazinga,again!");
})();

この何もないところの()のカンマ区切りがホントの所どういう意味なのか? この辺についてそもそもどうしらべたものか分からないので適当にコンソールでつついていると、以下のようになるのが分かった。

  • ()とは、直前に指定されているfunctionオブジェクトに引数を渡すためのものである。
  • なにも指定されていない場合の()は、functionに渡している時同様引数の評価を行う。
  • その場合の戻り値は、一番最後の引数の結果が戻ってくる。

例えば、何気なく即時関数を以下のように書いているけど、これは最初の()にfunctionオブジェクトを渡して評価する事で戻り値にそのまま戻ってくるfunctionに引数を渡す()を与える事で関数として実行される、という流れが見えてくる。

(function(){ console.log("bazinga!");})()

ここまで来るとなぜfunction(){}を()で囲むのか、とかが何となく見えてくる。

要するに、単なる()は関数への引数としての処理と同様に中身が評価され、その末端の結果が戻り値である為、それは変数の中身に収めた関数の参照と等価であり、()を付ける事でそれが関数として実行される、という事か。成る程、納得した。

(function(){ console.log("ready?");},function(){ console.log("bazinga!");})()
// >bazinga!

故に無意味ではあるがこういう事も出来るわけだ。

面白い。何気なく使ってたコード中の()だったり、即時関数の理屈がなんかかなりスッキリ理解出来た気がする。


三項演算子とかboolとかの扱い

そしてもう1箇所。実は某お題の解答を書いていたときのコードを試しに同じようにminifyしてみた時の結果。処理は1桁の素数かどうかの判定をするだけの関数。

//Original
function isPrime(a){
    if (a%2==0||a%3==0||a%5==0||a%7==0) return true;
    return false;
}

//Minified
function isPrime(r){return r%2==0||r%3==0||r%5==0||r%7==0?!0:!1}


//あれ?もしかしてこれでよくね?
function isPrime(r){return r%2&&r%3&&r%5&&r%7?!1:!0}

まずはそもそも 三項演算子を使えばスマートでしたね....と。ハズカチ。問題はその後の式。true,falseじゃなく0,1の否定を行ってる。これはなるほどなーと思った。確かにこうすれば確実に動作出来る上に、true,falseと書くより遥かに少ない文字数でスッキリ書ける。

false === false  //true
false == 0       //true
false === 0      //false
false === !1     //true
false == !1     //true

でもこれ1度否定で評価する故処理コストとしては増えそうな気がしないでもないけど、その辺はベンチしても微々たるさしか出てこない気も。実際の所はよくわからんです。(ベンチしろ?ごもっとも) 少なくとも単に0を渡すのは厳密比較をパスしないので×。

その点言えばこの方法は非常にスマート。ただこの記法が可読性に繋がるか?というと正直全く逆行はしてるとは思う。1バイトでも小さくする事を求められているときに有用はのは確かだけども。 ちなみに文字数は変わらないものの、こういう書き方も出来ますな。

function isPrime(r){return !(r%2)||!(r%3)||!(r%5)||!(r%7)?!0:!1}

個人的にはこの書き方好き。これも応用ですな。0との比較なので、そのまま%したときに戻ってくる数値を!で否定してしまい、0ならtrueになる....とここまで書いていて気づきました。

function isPrime(r){return r%2&&r%3&&r%5&&r%7?!1:!0}

0をtrueとして、trueが最低1つという条件なのであれば、別にfalseの存在が1つでもあればパスできなくなる&&で結んでしまえば良い。結果は反転してしまうけど、それは結果の処理の中身を反転してしまえば良いだけ。じゃこう書けばいいぢゃん!すっげー!可読性なんてクソ食らえ! オリジナルと改行抜きで30バイト短いし、無駄な評価(0を否定、とか)が減った分理屈上でも処理がシンプルになった筈。読みにくいけど、得体の知れ無さがアップして好み。

そんなわけで、minifyツールに色々気づかされた次第。まだまだ知らない事だらけだけど、JavaScriptは面白いですね。