ブラウザウィンドウを9通りの位置と大きさにワンクリックで設定する “Window Bookmarklet” を Leopard の機能 “Spaces” と併用することが多くなったので、ここでその理由と手順を説明しようと思う。
アップル – Mac OS X Leopard – 新機能 – Spaces
さまざまな作業を同時にこなしてくれるMac。プロジェクトの数がどんどん増えても大丈夫。Spacesを使ってアプリケーションウインドウをグループ化すれば、デスクトップはいつもすっきり。余裕のスペースを実現するMac OS X Leopardの新機能、Spacesを使って、簡単にスペースを切り替えられます。
このエントリを思いついたのは Widget を開発中のことだった。ブラウザ上で JavaScript と JSON フォーマットで作ったブログパーツを検証中に Dashboard を起動したところ、Widget は雑用や事務という案件名を付けるにふさわしいという当たり前のことに気が付いた。

Dashboard はファンクションキーやマウスで簡単にデスクトップ環境と往来することができるが、Spaces ではショートカット “control + 左右矢印キー” を引き金として、プロジェクト、つまり事業計画や構想案毎にウィンドウを配置しておくことができるし、またこれは Dashboard で Widget を配置していることと同義となると考えたため Spaces の環境を整備することにした。
まず、初期状態ではアプリケーションを “コマンド + タブ” で切り替えると Space 番号も切り替わってしまうことがあるため、このヒントを参照して機能を変更しておくと良い。

次に、同じく初期状態において Spaces のデスクトップ環境が 2 by 2 のテーブル状に配置されているが、右方向への列が見慣れているためこのように横並びにした。そして Spaces を使って計画毎に使用するアプリケーションを配置するのだが、ここで Safari のウィンドウを制御するために Window Bookmarklet が登場する。

このようになってしまった場合には、ブックマークバーの左から9番目に Window Bookmarklet を保存しているので、”command + 9″ で起動する。Widget のように展開するのであれば矢印ボタンを、ウィンドウズ・スタイルで広げるなら中央のボタンを押す。

個人的には左端の Space を書き言葉について学ぶ場所とし、後は順にソフトウェア開発案件毎に並んでいる。G5 と Macbook を併用しているが、MacBook の方は Skype や iChat のような通信用ソフトウェアの使用も一つのプロジェクトとしている。加えて言うと Safari のホーム画面を RSS を使った Widget が並ぶ iGoogle にするとオンライン活動が活発な方には更に便利かもしれない。
今まではアプリケーション(Window で言えばタスク)、つまり PC 側のソフトウェアを切り替えることがオペレーティング・システムの最も上位層にあったが、Spaces の登場で人間側のプロジェクトも管理ができるようになったということは大変喜ばしいことである。ちょっとした不満点はメモリの上限というハードウェア的なことになるが、こちらも時間が解決してくれるだろうと期待している。
しかしこの発想は、MacBook の小さな画面で多くの(特にスイッチした人や初心者)ウィンドウズユーザーのような全画面表示に囚われていたならば気が付くことはなかったかもしれないと胸を撫で下ろしている。
最後に Window Bookmarklet はレンタルサーバーを使用しているため、もしお役に立てれば運用費として寄付をお願いしたい。「これは JavaScript だから、クライアントサイドでしょ?」と思われる方はぜひコードを参照してみてほしい。
// 50MB なんてあっという間だ…
Steve Jobs 氏が「Flashは動作が遅過ぎて実用的でない」と発言したそうだが、もう少し突っ込むと「(例え Flash Lite であったとしても)JavaScript と併用するには」という意図が含まれていると思う。クライアント・サイド(表示側)としてどちらかを選択せざるを得ない状況であるのは技術的な見解として納得できるものの、では何故日本の携帯業界のように Flash を採用しなかったのかについて妄想する。
一つは経理面から Adobe に対して使用料を払うことがある。これは日本の携帯の価格を高額なものにしている要因の一つであることでも有名だ。次に注目したのは営業面、つまり Adobe との関係について。それは Adobe の Flash に取って代わるとされている Flex の最新版の変更点を見て気が付いた。
【速報】RIA構築ツールFlexは最新版 Flex 3 でここが変わった:ITpro
1-5:HTMLレンダリング(内蔵 WebKit 使用)
AIRはWebブラウザSafari で利用されているHTMLレンダリングエンジン WebKit(WebKit についてはこちら)を内蔵します。これによってAIR アプリケーション内にブラウザのような機能をもたせることができます(AIR:HTML content のオンラインヘルプはこちら)。例えば,タブブラウザのような AIR アプリケーションを作成することも可能です。
今まで Adobe が開発するツールに頼らざるを得なかった Apple だったが、現在の状況は一変している。Premiere は Final Cut に置き換わり、ウェブオーサリングは手打ちの補助となり、管理はミドルウェアがデータと切り離したサーバー上で行うようになった。CSS の活用により PhotoShop でページ設計を作り込むことはなくなった(Keynote に移行した)し、アートディレクターはバイナリの素材や部品を iPhoto や Aperture で管理するようになりつつある。 そしてアダルトサイト時代の通例だった “JavaScript オフ” は都市伝説となり H.246 形式で Flash はすっかり後を追いかけている。もし iPhone が数年前に発表されていたならば Flash を搭載していたのではないだろうかと思ってしまう。唯一 After Effects が VFX で重宝されているというところだが、しかし今回の Flex による Webkit の搭載が多くを物語っている。
ここで気になるのは周りの状況だ。つい数年前には入校原稿を全て文字レイヤーに入れてデザインチェックをしていた熱狂的 PhotoShop のデザイナがいた(もちろん先に進まない)というのは笑い話だが、今月は出産前に仕事量を増やそうと営業活動を行っているが携帯 Flash や Flex 開発の案件が非常に多い。
Life is beautiful: スティーブ・ジョブズ、「Flashは重すぎて、Flash liteは使えない」と発言
Comments
述べられているようにモバイル向けのFlash LiteがFlashとは似て非なるもので、結局コンテンツベンダーはスクラッチでFlash Lite用コンテンツ・アプリを起こさないといけない、ってのがモバイルでFlashをやることの意味を喪失させるのに大きかったような。
Posted by: ぶらりん | 2008.03.07 at 15:29
ここで何故携帯 Flash 案件について、技術的には億劫になる反面、巷に仕事量が多いのかという矛盾に答えを見つけることができた。簡単に言えば、年度末に予算を使い切るような概念を持つ日本の企業に対して、白紙から制作する方が代理店の取り分が多くなるからである。一方、個人で開発していると Flash を採用したくないというのは先に述べた通りだ。しかし、開発費も利用費も高額請求の連鎖が続く日本の携帯業界というのは見ていると滑稽でもある。消費社会としては正しいのかもしれないが、それは個人の内面と企業組織の外面の差でしかないのだろうとも思う。
またこれから子供を持つ親の身としては、携帯でアバターやゲームといった Flash を開発することに少々疑問がある。というのは、これだけ子供を食い物にするビジネスが横行するのは日本が顕著ではないかと感じるからだ。確かに幼少の頃、任天堂に影響を受けたことは否定はできないが、大人になって体験談でしか他者と意思伝達ができないというのはとても勿体ないことだと、バックギャモンのような歴史あるゲームをしているとそう思うことが少なくない。最近は Wii を使った再販で消費させることは経済面で良いのかもしれないが、それでも大人(で || になって)も楽しめるプロリーグの構築とまでいかないことには世界が小さいと言わざるを得ない。ゲームが〜と失笑する、特にご年配の顔が目に浮かぶが、我々はサッカーという言語が既にその先にある “文化” を目指しているのを目の当りにしている。そういう意味で、電子ダンス音楽が文化になりつつある都市、ロンドンやベルリン、ニューヨークは体験したいし、ゲーム音楽が強い東京にも期待している。
文化の話は飛躍しすぎたが、最後に Flash を使いたい!と思う案件を考えるとそれは JavaScript が対応する前に XMLSocket を使うものということになるだろう。世界最大のバックギャモン SNS だった GamesGrid が終了する今、少しだけ構想しているものがある。時間が少ないのは承知しているが、無理と思うことが無理の始まり。老子とヨガから学んだ呼吸法と相対性理論を使ってゆっくりやる予定。全く関係はないが、GamesGrid for Mac OS X のプログラマは PhotoShop の作者でクレジットされている。ユニバーサル化まで開発が続かなかった(もちろんその後の CS3 はユニバーサルだ)というのは残念だったが、翻訳作業でお手伝いできたことはとても幸運で楽しい思い出だ。
さて付録のマッシュアップ企画のタイトルは “Youtube Mixer” だが、アクトビラを見ていると(Wii のポインタはリビングで使う距離に丁度良いが、それに比べマウスポインタは小さいことから)Tab キーによるオブジェクト移動とStage オブジェクトの扱いに気をつける必要がありそうだ。
// (仕事を回して頂く代理店向けに)断っておくと、金儲け主義を否定する意図はなく、お金という道具に対して加算法と減算法で考え行動される世界があるということです。;-)
参考:切込隊長BLOG(ブログ): 広告代理店の人と付き合ってて困ること10
妻の出産を記録に残そうと、Apple の QuickTime 担当者が来日時に持参していた三洋のムービーカメラも検討したが、結局手持ちの SONY Cyber-shot DSC-P150 で動画を撮ることに決めた。
というのは、分娩室でのシャッターチャンスが少ないと既に出産を終えている彼女の同僚が言っていたことがある。その理由も「KY」っぽさが滲み出ているのだが、助産婦さんや看護婦さんの視線が気になることだとか、何度もカメラを(しかも股間に)向けるのは気が引けるだとか。もっとも、自分が子供を抱くときには両手を使う訳だから誰かにお願いする羽目となるが。(抱くのはいつでも良いので、撮影を優先したいと考えている。)
もちろん一眼レフを持っておくことは最善策だが、新しい装置や道具をいきなり生本番で使えるほど自信家ではないし、固定カメラを良い位置(監視カメラのような45度角)で映像を記録することを考えていたが、分娩室を見学した妻によるとそんな場所はおろか電源も取れないだろうと言うので、首から下げた状態で回しっぱなしという方法が良さそうだ。
そこで、撮影時間を延ばすためメモリを最大限に増やすことを企画した。この機種の記録枚数および時間を調べたところ、規格内で最大の1GBは公称で約44:20、手元の1GB環境では46:15となっている。メモリースティックPROデュオの最大容量は “価格.com – SONY MSX-M8GS (8GB) 価格比較” によると8GBとなっているので単純に8倍にしてみると、記録時間は最大およそ354分となり5時間強に相当することとなる。それでも2GB毎に切れるのか、自動的にセグメントにしてくれるのか実験してみる必要がある。(実際の購入は工場元で低価格且つ高速なサンディスク製となる可能性が大きい。)
一方、バッテリ “NP-FR1″ は116分。キャンペーン期間に購入したため幸運にも2パック持っているので232分、3時間強となるが、もう一つくらい買っても良い気がしている。充電器と電池がセットになった “SONY アクセサリーキット ACC-CFR” を 8,000円前後で買うことができるようだ。
最後に “Sony Drive マイページ” が使いやすくなっていたのは発見だった。
F’s Garage:OpenIDが面白いのはWebサービス間の連携
RSSを近視眼的に「ただのブログの更新情報取得ツール」として捕らえると世界が狭くなる。
OpenID について、このように判断が曖昧なままだったので考えてみた。
hkitago.com blog: Re: ウェブを「匿名の卑怯者」の楽園から脱却させるには – 池田信夫 blog
OpenID に関しては面白い取り組みではあるが、これは全てではないし何よりもまだ歩き出したばかりだ。ディレクトリサービスと認証サービスに関してはプラットフォームを問わずいつも問題となることでもある。
使う側の視点で具体的に、コメント機能は Twitter で実装して欲しいと願う。タブ機能が付いたiChat から投稿できるという利点は捨てられない。しかし今のところ Jabber の対応を待つことになるのだが、それも時間の問題だろう。
参考:Jabber, OpenID And “teh shiny” [tail -f carlo.log]
“shiny” という単語が印象的ではあるが、以前に日本にシリコンバレーを作るには神風を起こして気候を変えるしかないと思っていたのは満更うそばかりでもなく、The Burning Man Project に参加した知人も飽きるばかりの太陽を浴びたと言っていたことを思い出す。そして海岸沿いで変化の小さい温度、適度な湿度環境があればハードにもソフトにも最高の環境が生まれることに間違いがない。(と、オレンジ色を妄想してみる。)
話を戻すと、組み込まれたサービスではあるが Youtube のコメント機能も Ajax を使った非同期投稿を可能にしているし、同様に Frickr の場合は編集作業に心地良さを覚える。
さて PHP を使ってもサービスを始めることができる OpenID について技術的に考えると、”I can’t find anything that is technically superior. ” なのかもしれない(開発以上に運用努力が必要になると予想している)が、発想を実行に移し保守と運用を行うという意志は素晴らしいことだと思うし、世界を変えることに繋がることを期待している。
そう言いつつも、未だアカウントを作成していないのは2つのドメインネーム、openid.com と openid.net の whois 結果が異なっていたからである。一方はドメイン保持目的のようなので特に気にはならないが、それでも心配であれば日本版でアカウントを取得した方が無難だろう。
結局のところ、まずサーバー構築を考えるのは性分としか言いようがない。丁度アカウント管理を導入したい案件があるのでやってみようと思う。
マスメディアによって世界最高と評価されている浦和のクルヴァを見て失笑したという話をしたことがある。
hkitago.com blog: Fans 2.0
というのは、ゴール裏を陣取るクルヴァ達を筆頭に個人やチームの応援歌(守勢の場合はブーイング)を時系列順に盲目的に続けるといった日本の野球に見られる応援方式に倣ったもので、試合の展開に存在する調子や速度に呼応し選手に伝えるといった観戦姿勢に到達しておらず、競技場で騒ぐという定義で言えば英国のフーリガンと、あるいは非日常的に大声を出して自己満足に浸るという定義で言えば日本のカラオケとその本質に何ら違いがないことにある。
“情熱が伝わる” という意味でその評価は正しいのかもしれない。しかし何故マスメディアがそのような評価になるのか、また、何故専門家と意見が食い違ってくるのかという疑問について現ブラジル代表監督で磐田に所属していたことのある Dunga 氏の言葉に答えを垣間見た。
FCKSA55 ドゥンガが感じた日本サッカーの欠点
日本人はボールと一緒にいるのが、好きだということだ。つまり、全体のなかでのポジショニングが、そっちのけになっているということだ。サッカーは足でプレーするものだが、どう動くかを考えるのは頭だ。早く考えて予想をした者、その瞬間に素早く判断した者が勝利を収める。
また日本の選手には、ミスをしたあとにプレーのスピードが上がる傾向が、あることも分かった。もう一つの欠点は、いつも同じリズムでプレーしようとすることだ。
前半部分はサッカーに無知な日本人が見た目で判断してしまっている結果であるとして、注目したいのは後半部分だ。つまり競技場内は選手もファンも単調であり、加えて単調気質の日本人メディアがそれを評価している、という具合である。
もう少し踏み込むと、ここにも無意識に植え付けられた日本の教育通念が潜んでいる。これは “非属の才能
” の言葉を借りれば “同調”、少し美化すると “日本人の和” ということになるのだろうが、これについて前日本代表監督の Philippe Troussier 氏が面白いことを言っていた。
日本人の和というのは、予め主張しないことだ。しかし、土壇場になると好き勝手な行動をし始める。
引用元が明確でないので状況を説明すると、例えば負けている試合に於いて残り時間が少なくなると、ドリブルが得意ではない選手が突然中央突破を図ろうとするようなことらしい。欧州の選手の持つ判断はこれと違い、形勢が悪くなると徐々に組織的な意識が高くなるそうだ。(現代フットボールで強豪と呼べるチームはほぼ当てはまることだろう。)
そういう意味でShunsuke Nakamuraがフリーキックを狙いにいくプレイ(@CL 1st leg ホームのバルサ戦)については議論の余地があると思うが、サポートが遅かったことを考慮すると仕方がないのだろうか。Gordon Strachan 氏やAiden McGeadyに聞いてみたいところだ。
サッカー談義は別の機会にしようと思うが、これは “チーム力” を考える上で役立つ。
【ウェブ時代 5つの定理】その2 チーム力 (1/3ページ) – MSN産経ニュース
「強い力を持った個」同士がスポーツ感覚で戦略的にチームを組んで疾走するイメージ。異分野の「その道のプロ」が組むことで相乗効果をたたき出す世界だ。
シリコンバレーにある精神は、欧州の意識を受け継いでいることは確かだ。
ここで日本人としてソフトウェア開発の今後を考えると、江戸時代に熟成していた “職人芸意識” の利点についてもう一度考えてみる必要がある。
良いところを吸収し学習することが人(プロパガンダ風に言うと、”島国日本人”)の長所であるとするなら絶対うまくやるよ!と考えるのは肯定的過ぎるだろうか。減算法で思考する日本人であってもそう考える価値があると思うし、そう考える方向の道には肯定的な世界があるからだ。肯定的に考えることでニートや少子化など現代になって取沙汰される社会問題が解決の方向へ向かうかもしれない、とまで思うのは行き過ぎかもしれないが。しかし何故そう言われることに “勘違い” だとする否定的な意識が反応するのか、それは体験や環境といった外的要因の影響が強いからだろう。つまり親を含めた教育環境にも一因があるということになる。
肯定的に考えることをもうすぐ産まれる子供に生き方の一つとして教えようと思う。もちろん否定感とのバランスやタイミングを忘れずに。
// 口伝律法がモットー
出産を迎え仕事量を増やそうと約7年分の制作物を整理していたところ、試作したものの企画が潰れ眠っていた ActionScript 2 コードを見つけたので MIT License の元に公開することにした。この例では読み込み毎にランダムに配色するという挙動になっているが、setTab関数を改変し外部SWFファイルを読み込めば実用性があるだろう。とは言え、これは Flash のアップグレードを止め、今回公開を決断した理由の一つでもあるのだが、JavaScript でも表現できる時代となっている。
要件:
- 横750px * 縦150px
- 各領域をマウスオーバーで最大値横450pxになるようスライドして表示
- マウスアウト時には5秒後に自動スライド開始
参考:
実例:
コード:ダウンロード
class Slidemenu
{
private var __tabs_num:Number;
private var __start_time:Number;
private var __ad_width:Number;
public function Slidemenu (tabs_num:Number, start_time:Number, ad_width:Number)
{
this.__tabs_num = tabs_num;
this.__start_time = start_time;
this.__ad_width = ad_width;
}
public function main (move_speed:Number):Void
{
var my_points:Array = getMyPoints ();
var out_points:Array = getOutPoints ();
var in_points:Array = getInPoints ();
setTabs (move_speed, my_points, out_points, in_points);
}
private function setTabs (move_speed:Number, my_points:Array, out_points:Array, in_points:Array):Void
{
var i:Number;
for (i = 0; i < this.__tabs_num; i++)
{
var tab_name:String = "tab" + i;
_root.createEmptyMovieClip (tab_name, i);
_root[tab_name]._x = my_points[i];
_root[tab_name].id = i;
setTab (_root[tab_name], 100);
_root[tab_name].onRollOver = function ():Void
{
_global.tab_id = this.id;
clearInterval (_global.intervalId);
};
var to_point:Number;
_root[tab_name].onEnterFrame = function ():Void
{
if (_global.tab_id == null)
{
to_point = my_points[this.id];
}
else if (_global.tab_id >= this.id)
{
to_point = out_points[this.id];
}
else
{
to_point = in_points[this.id];
}
var xrate:Number = (to_point - this._x) * move_speed;
this._x += xrate;
if (Math.abs (xrate) < 0.1)
{
this._x = to_point;
}
};
}
}
public function beginInterval ():Void
{
if (_global.intervalId != null)
{
clearInterval (_global.intervalId);
}
_global.intervalId = setInterval (this, "autoTabStart", this.__start_time);
}
private function autoTabStart ():Void
{
if (_global.tab_id == null || _global.tab_id >= this.__tabs_num - 1)
{
_global.tab_id = 0;
}
else
{
_global.tab_id++;
}
}
private function getInPoints ():Array
{
return new Array (0, 450, (450 + 75 * 1), (450 + 75 * 2), (450 + 75 * 3));
}
private function getOutPoints ():Array
{
var i:Number;
var points:Array = new Array ();
for (i = 0; i < this.__tabs_num; i++)
{
points[i] = ((Stage.width - this.__ad_width) / (this.__tabs_num - 1)) * i;
}
return points;
}
private function getMyPoints ():Array
{
var i:Number;
var points:Array = new Array ();
for (i = 0; i < this.__tabs_num; i++)
{
points[i] = (Stage.width / this.__tabs_num) * i;
}
return points;
}
private function setTab (clip:MovieClip, alpha:Number):Void
{
clip.beginFill (getrndColors (), alpha);
clip.lineStyle ();
clip.moveTo (0, 0);
clip.lineTo (Stage.width, 0);
clip.lineTo (Stage.width, Stage.height);
clip.lineTo (0, Stage.height);
clip.lineTo (0, 0);
clip.endFill ();
}
private function getrndColors ():Number
{
var rNum:Number = Math.round (Math.random () * 255);
var gNum:Number = Math.round (Math.random () * 255);
var bNum:Number = Math.round (Math.random () * 255);
var c:Number = rNum * 0x10000 + gNum * 0x100 + bNum;
return c;
}
}