Archive for 5月, 2008

30
2008

4480064257
3年で辞めそうな若者には3年で辞めた若者シリーズよりこっちのがお勧めな気がする。
対話形式なんだけど、これって話している様子をYouTubeに流してくれたら面白いかもと思った。適当に広告とか出せばお金になるかもしれないし(印税が目的じゃないかと思うが)。
自分は本は何冊か読んでるけど何故か梅田さんのブログは読んだことがない。もともと本を買うとき、読むとき、誰が書いているかあまり気にしていない自分が居る。人の名前を覚えるのも苦手だし。
でもYouTubeに対談があってそこにブログのリンクがあったら確実に読むと思う。本の中にもblogのURLがあるけどそれをわざわざ手で打つのはしんどい。というか、こんなこと書いてる暇があればググれよと言われるかもしれない。その通りだけどここでググったら負けなのでググらない。
本の内容だと”「好きな仕事」でないとサバイバルできない”のくだりが特に興味深く読んだ。
「好きなことを仕事にする」
「本当に好きなことは仕事にしない」
結構よく考えてるのだけど、この相反するテーマに対してどう向き合うかについてまだ自分なりの結論がでない。スキのレベルがどこまでかにもよるのを先に決めないといけないのかもしれない。
広い意味で考える物を作るのが好きだから仕事ができるってのは確かにある。ただ好きなことを仕事にしているように見えて本当にやりたいことは実は趣味でコードを書いていたりする。それを考えると会社はスキルアップやお金だけを目当てにして本当にやりたいことは帰ってからやればいいじゃんという考えがでてくる。もうそうなってくるとこの業界辞めてもいいやって考えすらでてくるし、いまだに答えが出ない。
そういえば前にテレビで若者が会社をすぐ辞めることに関して、誰かが「仕事に過度な期待を求めてはいけない。仕事なんて本来つまらないもの、仕事で自分らしさなんてものを最初から期待しなければ楽になれる」的なことを言っていたことがあった。
確かに過度な期待をするからがっかりするのであって半分は理解したのだけど、仕事なんてつまらないもの。と認めるのはかなり勇気が要る作業です。多くの人は仕事をしないと生きていけないわけでその作業がつまらないなら、仕事以外に好きなことがあってもやっぱり人生としては半分くらいは損してるんじゃないかなぁと思う。
やっぱりスキのレベルにもよるけどある程度仕事は好きじゃないといけなくて、その上で本当に好きなこと、やりたいことを仕事以外にも見いだせる行動力が必要。というところを今日の答えにしておこう。
そうこう考えてるうちに負けた。望田さんのブログをググってしまった。くやしいからトラックバック貼ってカウンターや。

30
2008

Google Earth APIにてGoogle Earthがブラウザにはれるようになったらしいので使ってみる。
http://code.google.com/apis/earth/
http://labs.makotokw.com/s/sandbox/gearth
APIドキュメントがどこにあるかわからなかったがCOMのAPIを見れば良いだろうか。

29
2008

我那覇選手ドーピング問題でスポーツ仲裁裁判所(CAS)が点滴を「正当な医療」と認めた。つまり我那覇選手の勝利である。
早いものでもう一年経っていたらしい。もう一度問題を振り返ってみよう。
1) Jリーグでは2007年から静脈注射を正当な医療行為として行う場合以外は禁止することを決めていた
2) 体調不良の我那覇選手に対して治療の一環(疲労回復が目的?)としてクラブの医師が「にんにく」の静脈への注射をした
3) Jリーグは我那覇選手の件を正当な医療行為と認めず、ドーピングに当たるとしてクラブに1000万円の罰金・我那覇選手への6試合の出場停止を制裁として与える
このあと各チームのドクターがJリーグに説明を求めたり、日本スポーツ仲裁機構の仲裁をJリーグが認めず選手側に負担の大きいスポーツ仲裁裁判所(CAS)に対応してもらうことになり、ようやく今回の結果がでたという流れ。
我那覇選手勝利 -> Jリーグが悪い。の流れになりかねないのだが冷静に振り返ってみるとこの問題は繊細で難しいと思う。ドーピングに厳しい制裁を加えるのは当然だ。しかし、どこからがOKでどこまでがNGなのかの線引きは難しい。ある意味疑わしきは罰するというやり方も多少は仕方がないと思う。
今回の件は柔軟さがあれば良かったんじゃないかと思う。2007年にルールが変わって悪気があるわけじゃないのもわかるんだし、ドーピングを問題にするのではなく周知徹底していなかった点についてクラブにのみ罰則を与えて、次からは厳罰にいきますよ。という感じにしておけば選手がここまで後ろ指さされることも無かった気がする。
Jリーグとしては我那覇選手の行動はKYだったと思ってるかもしれない。日本スポーツ仲裁機構を認めなかったあたり、「こんなことに時間かけてるならサッカーに集中しなさいよ。我那覇クン」という思惑がどうしても見え隠れしてしまう。
第3者から見ても我那覇選手の行動に疑問視する人も居ると思う。彼はサッカー選手としてそれなりに良い年齢での一年をこの問題とつきあってしまった。勝ったとはいえその一年は戻ってこない。いまさら出場停止処分が取り消されたとしてもプレーが戻るわけじゃない。だったらわかってくれる人はわかってくれるから良いよ。とどこ吹く風でサッカーに集中してれば良かったんじゃないという考えもある。
ただサッカー選手の前に一人の社会人でもあるので個人的には我那覇選手が決めたことならどちらを選んだとしても味方をしてあげたいと思う。
この件は、にんにく注射の正当性を認めるか否かははっきり言って問題ではないと思う。それよりも結論を出すまでにこれだけの労力と時間をなぜ選手側に課さなければいけなかったかを考えないといけないんじゃないか。そうならないと今回の我那覇選手の行動は報われない気がする。Jリーグはドーピングの判断を間違えたことよりも、我那覇選手の貴重な現役期間をサッカーに集中させられなかったことについて反省すべきだろう。

27
2008

YouTube Data APIで取得したデータをWPFのリストで表示する の続きです。
宣言通り、ItemsControlとListViewについて。
前回、ListBoxを使って動的に項目を並べることをやりましたが、ListBoxはあくまでListBoxなわけで並んだ項目はListBoxItemの中にあり、ListBoxItemが選択できます。別に選択する必要もなく、ただ単に画像を並べたいということもあると思います。そのやり方に少し悩みました。StackPanelのChildrenにコードで追加すればできるのですが、ListBoxに配列をBindしたようにスマートにやりたいものです。
ItemsControlでそれができると知りました。ListBoxやListViewの継承関係は下記のようになっています。

System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Media.Visual
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Control
System.Windows.Controls.ItemsControl
System.Windows.Controls.Primitives.Selector
System.Windows.Controls.ListBox
System.Windows.Controls.ListView

ItemsControlには項目の配列を並べることが選択機能なしにできるので単に項目を並べるときに使えました。ListBoxのXAMLを書いたときに値を変更したItemsSource、ItemTemplate, ItemsControl.ItemTemplateなどはまさにItemsControlのものなのでListBoxのXAMLをそのまま流用できます。(その逆もしかり)

        <ItemsControl Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" ItemHeight="100" ItemWidth="100"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>

またListViewでも同じようにXAMLが書けます。ListViewのReport形式の表示をGridViewつかって表示してみます。

        <ListView Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ListView.View>
<GridView ScrollViewer.VerticalScrollBarVisibility="Visible">
<GridViewColumn Header="Thumbnail">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Path=Thumbnail}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Title">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Title}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Author">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Author}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>

こんな感じで、GridViewでもカラムの中でどういうコントロールで表示するかをGridViewColumn.CellTemplateを使って表現できます。
同じCollectoinデータをListBox, ItemsControl, ListViewに設定して並べて表示してみました。
WPFYouTube200805240.jpg


最終的なXAMLは以下の通りです。このサンプルプログラム(VS2008)を実際に動かしてみたい人はWPFYouTube.zipをダウンロードしてください。

<Window x:Class="WPFYouTube.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:me="clr-namespace:WPFYouTube"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<CollectionViewSource Source="{DynamicResource VideoItems}" x:Key="VideoItemCollection"/>
<DataTemplate x:Key="VideoOnItemsControl">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Path=Title}"/>
<Image Source="{Binding Path=Thumbnail}"/>
<TextBlock Text="{Binding Path=Author}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="200"/>
<RowDefinition Height="200"/>
<RowDefinition Height="200"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="60"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" x:Name="tbxKeyword" Text="ドラゴンボール"/>
<Button Grid.Row="0" Grid.Column="1" Content="Search" Click="Button_Click"/>
<ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" ScrollViewer.VerticalScrollBarVisibility="Visible"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ListBox>
<ItemsControl Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" ItemHeight="100" ItemWidth="100"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<ListView Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ListView.View>
<GridView ScrollViewer.VerticalScrollBarVisibility="Visible">
<GridViewColumn Header="Thumbnail">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Path=Thumbnail}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Title">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Title}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Author">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Author}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
27
2008

キリンカップ結果は日本優勝だけど、親善試合の結果に一喜一憂してもしょうがない。内容を見てみよう。
コートジボアール戦のフォーメーションなら遠藤out、俊輔inかな。と単純な予想をしていたら、なんと逆に中盤より前の選手はその遠藤以外が入れ替わっていて驚いた。とはいえ、そのメンバーも基本オシムジャパンのレギュラー選手達なのでどっちメインなの?いまさらテストしてる場合じゃねーだろと思ったりもしたが試合終了時点のメンバーは玉田->高原、中澤->寺田以外は当初予想したメンツになっていたのでやはりコートジボアール戦のメンバーが中心メンツなような感じだ。
ここに稲本や中田浩が入るので、フォワード、ボランチあたりは調子の良い選手やバランスを考えて変えていきそうだ。あと微妙なのはサイドバックだけど阿部右サイドバックなんてみてると、中田浩 トゥーリオ 中澤 阿部の守備固め、博打的な安田 トゥーリオ 中澤 内田なんて極端な組泡見あるけどまぁここまでの代表戦を見る限り攻守考えて駒野、長友が無難かな。
海外経験者を重視するなら
    高原  大久保
 俊輔         松井
    稲本  長谷部
中田浩 トゥーリオ 中澤 駒野
      楢崎
だけど・・・海外組ベースにしてもキリンカップ見てる限り攻めの形すら見えないからなぁ・・・DFに関しては本職CBと楢崎がいるだけで妙な安心感があるのがある意味異常。バーレーン戦はオシムだったら負けなかったという人もいるだろうけど、そのたらればが許されるなら川口には悪いが監督以前に楢崎だったら負けてなかったと思うし。CBについてもまぁ中澤がいなくてもというテストがパラグアイ戦でできたのは収穫だと感じる。
DFがしっかりしていて強いボランチがいれば3次予選レベルではそうは点はとられないだろうから、あとはどう点を取るか。正直パスが全然回せなくなってたから先は長そうな気がする。日本の決定力不足ってのはシュートは打てるけど枠に飛ばないってイメージだったんだけど岡田ジャパンになってからまだまともに攻めの形が見えないし、イメージすらわかないのでもう個人で打開してもらうしかないかも。とりあえず3次予選はそれでもなんとかなるだろうと楽観している。
まぁぎりぎりだけど羽生、山岸どころか、遠藤、憲剛、山瀬、啓太がいないメンバーでもチームが構成できるというのが確認できたのは岡田監督しても良かったんじゃないかと思う。
中田じゃないけど、個人的にはやっぱり代表は個性のある選手を集めてチームを作って欲しいなと思うし、代表監督なんてのはいかにその時の世代のトッププレーヤーで良いチームを作るかが仕事だと思うんだけどな。そのあたりはオシムジャパンはちょっと微妙だったし、走るっていうのは共通してたけど中田とオシムは合わなかったかもね。いまさか妄想しても意味ないけど。

27
2008

自宅サーバでSubversionを立ち上げてるので、会社でもこっそり趣味のプログラミングをしてコミットしたりできる。
eclipseを使うときはそのまま使えるのだが、Visual Studioを使うときはVisual StudioにはVSSに関連づけておきたいのでRapidSVNを使っていたりする。
あるマシンにRapidSVNを入れたのだが既存のリポジトリを追加する方法がよくわからなかった。
メニューに「リポジトリ(R)」というのがあるのだが、「作成」を選ぼうとするとsvnadminがないとなんとやら、「インポート」も「エクスポート」もちょっとニュアンスが違う。
あきらめてヘルプを見た。
既存のリポジトリをブラウズする方法
1.「ブックマーク」メニューの「既存のリポジトリに追加」を選択
2. URLをタイプしOKを押す
なんと、「リポジトリ」メニューじゃなくて「ブックマーク」メニューからだった。毎回困惑しそうなので備忘録としてブログに残すことにした。

26
2008

中田のインタービューがあると知ったのでNumberをコンビニで買った。
日本での露出が少なかったのもあるだろうが、引退して2年も経つ選手にこれだけの扱いをさせるというのはまだまだ存在感があるということだろうな。
ドイツで日本代表が期待とは裏腹な結果になってしまったので、その批判が中田に対して向けられた面もあったと思うけど、こうして時間がたってみると彼がヨーロッパで残した実績というのは日本という国の選手においてはより際だって見えてしまう。
中田以降、世界3大リーグには、イタリアには名波、俊輔、柳沢、大黒、森本、小笠原。イングランドには稲本、戸田、川口。スペインには城、西沢、大久保。と多くの選手が渡ったが(誰か忘れてたらごめん。戸田・川口思い出したスマン5/27追記)、大黒も契約更新されないようなので現在では3大リーグの一部リーグでプレーするのは森本だけになってしまった。
その代わりと言ってはなんだが、スコットランド、トルコ、ドイツ、フランス、オランダといった欧州リーグに選手が移籍するようになったのは日本選手の評価がある程度落ち着き、また選手も自分に妥当なリーグが選択できるようになった結果なのではないかと思う。
ただ3大リーグに日本の多くの選手が移籍した当時は、中田のように他の選手も通用するのではないかと思ったし、何より選手自身もそういった自信や希望も持っていたと思う。しかし現実は厳しかった。それ故に今もなお中田が3大リーグのどこかでプレーしていたのであれば、日本の王様的扱いをまだ受けていただろうし、アテネ以下の世代には一目置かれる存在としてWBCのイチロー的ポジションに入れたのではないかと妄想する。
キリンカップで長友は初代表ですばらしいプレーを見せてくれたが、彼と同じ年齢のときすでに中田はセリエAでレギュラーを張っていたわけだから今思うと、スケールが全く違う選手だったんだなぁと思う。当時は黄金世代がいたから日本も若い選手がどんどんトップリーグに出ていくんだと思ってたから、ある意味中田は日本からは正当な評価を受けていないのではないかとすら思えてしまう。
Numberの記事だが、世界を回ったこともあるだろうが第一線を退いて客観的にサッカーをみれているなと感じた。当事者のころのようなこのままじゃ日本は通用しないといった厳しい言葉もなく、世界と日本の差を体験者として説得力のある言葉で伝えてくれている。
軽く抜粋すると・・・
「サッカーの中心から離れて、サッカーがどれだけ影響力のあるスポーツかを認識した」
「日本サッカのイメージはあきらめが早いように思う」
「もう少し頑張れば、もう少し厳しくいけば、もう少し走れば、というように『もう少し』が結構多い。それはあきらめている場合が多いからなのではないか」
「環境が良くなってそれが当たり前になると、どれだけ自分を追い込んでいけるかが大事になる」
「日本人の特徴は勤勉さ。言われたことはきっちりできるが、言われないことはできない。応用が利かない。はまったときは強いが、はまらないともろい」
「日本人は集中して物事を続けられる。うまくないけどやだなと言われるチームを目指すと良い思う。技術は放っておいても向上していくだろう」
「若い選手に戦える選手が少ないのは選手だけでなく指導者や環境の問題もあると思う」
「自分のカラーが出せないとやってる意味がないし、同じことをやらされるなら他のやつでいい。自分はこれができるからという人間がもっと出てこないといけない」
「いろんな特徴ある選手が集まり、どうにかバランスをとるのがチームだったのに、今はチームがあってそこに当てはまる選手がいいんだというように見える」
「チーム戦術は大事だけど、選手の方も歯車のひとつでいいやと思っている感じがする」
「自分の個性を出せないチームにいるのがわからない。何のためにサッカーをやっているかわからなくなる。最終的な目標は自分がどれだけ結果を残せるかであってどのチームにいるかではない」
「海外だと10回のうち1回成功すれば誉められるが日本だと失敗の方を責められる。失敗を恐れず泥臭くやるところが根っこにないといけない」
「日本代表を見ても自分で考えてプレーすることが根付いてない。ジーコよりトルシエのやり方のが楽だったと思う」
「イタリアでもクラブの人気より代表の人気が低かったりする、日本代表の人気がJリーグより落ちているのもサッカーの地域文化が根付いてきたことなら良いことだと思う。ただ人気がなくなっていると聞くと寂しい」
「98年まで出られなくて当然だったのにサッカーは何があるかわからないという経験が日本にはまだないからワールドカップに出れるのが当たり前と考えているかもしれない」
「97年の最終予選ではホームの引き分けで卵や石を投げられた、今は全部が丸まっている感がする。どっちがいいとは言わない」
「サッカーは応援してくれる人あってのスポーツ」
「Jリーグも以前よりも内容より試合に勝たないといけないという意識が強くなっている気がする」
「海外移籍は門戸は狭まっているけど、距離は近づいている気はする。いろんなリーグでやってみるのもおもしろいなと思う」
「サッカーが全体に広がってどこもレベルが高くなり選択肢が多くなった、Jリーグもレベルが高くなって急いで海外にという必要もない」
・・・軽くじゃなかった。ほとんど書いてしまった。
印象に残ったのは急いで海外にいく必要はないというニュアンスの発言をしたところかな。自分が海外に渡ったときと今の状況をちゃんとわけて考えているようだ。自分が生きるチームでプレーすることを目的とすることが言いたいのかもしれない。確かに結果論かもしれないが、中田のように何でも自分で考えて納得して動くようなタイプは世界に出た方が活きる選手だろう。
まぁこんな感じで、日本サッカー界に関して選手やらサポーターやら指導者やら海外移籍やらかなり客観的に俯瞰して見ているなと感じた。
最後に自分の意見に関して「(日本サッカー界が)それをどう受け止めてもらえるかというのもありますよ」と言ってるのは現役時代、あまり他人を寄せ付けないで我を通してやってきたことがまだひかかっているんだろうな。このあたりが取り除かれればもっとサッカー界に貢献してくれると思うんだけどな。

25
2008

家の近くにスーパーがあるが(まだ一度も行ったことがない)、通りがかったときにみんなエコバッグを持っていてビニールにレジ袋を持っている人がいない。格安スーパーらしいなのでコスト削減でレジ袋は配っていないのかもしれない。
かくしてインターネットの世界でエコバッグ探しの旅に出たわけなのだが、
img55471540.jpg


これが欲しいのに売り切れている。http://item.rakuten.co.jp/world-chara/1237-2285290/
カーズのも見つけたがちょっとかさばりそう。
そんななか西友のエコバッグが欲しくなった。西友でしか売ってないので現実世界での旅に出かけることにした。
今日ヒルズに行ったついでに西友 フードマガジンに行ってきた。しかし、トイ・ストーリーのが見あたらなかった。
こうなったら近くの西友は全部回るしかない。一番欲しいのはリトルグリーンメン黒バージョンです。これを見つけた人教えてください。
cutico01.jpg

24
2008

kwLogには自作のTwitter Badgeを貼り付けています。何で自作しているかというとデザインを自分流にしたいからです。
自宅サーバを経由する方法もありますが、jsonpを使って表示しています。blogのhtmlのソースを見ると丸わかりですが、

<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/makoto_kw.json?callback=twitterCallback2&amp;count=1"></script>

を入れています。
twitterの自分のtimelineは

http://twitter.com/statuses/user_timeline/{アカウント名}.json

で取得できます。callbackパラメータを指定すればjsonpになります。発言一つだけを表示するのでcount=1をパラメータで指定しています。
実際のところ、jsonpで使うcalbackもtwitterで用意されているblogger.jsのtwitterCallback2で処理しています。
twitterCallback2で何をしているかというと、自分の発言を

<li><span>'+twitters[i].text+'</span> <a style="font-size:85%" href="http://twitter.com/'+username+'/statuses/'+twitters[i].id+'">'+relative_time(twitters[i].created_at)+'</a></li>

のようにliにしてid=twitter_update_listの要素に書き込んでくれます。
なので

<ul id="twitter_update_list"></ul>

を置いておけば、その場所に更新されます。
デザインはcssでul#twitter_update_list, ul#twitter_update_list liなどを指定して変更できます。
ただkwLogではtwitterの表示のところにjavascriptをimportしてたので、

<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/makoto_kw.json?callback=twitterCallback2&amp;count=1"></script>

のところでメニューの表示が止まったりしてました。
そこで、このimportはhtmlの一番下に入れることにしました。twitter badgeはMTのテンプレートモジュールにしていたので、その中に

<MTSetVar name="use_twitter_widget" value="1">

を入れて、フッターのテンプレートモジュールにて

<MTIf name="use_twitter_widget">
<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/makoto_kw.json?callback=twitterCallback2&amp;count=1"></script>
</MTIf>

を入れました。
これでbadgeを表示するときだけフッターに上記javascriptがインポートされるようになります。

24
2008

ようやくWPFもわかってきたのですが、なかなか情報が少ない状況です。.NET 3.0がリリースしてしばらく経ったと思うのですがあまり流行っていないような気もします。さんざん苦労したので調べてわかったことなどを書いてみようと思いました。
別にWPFに限ったことではないのですが、新しいプラットフォームでアプリをつくるときに必ずといって悩むことがあります。
特にUI系のサンプルプログラムはUIコントロールの説明を重視するために静的なデータを表示することがほとんどです。コードの中に表示する文字列や画像のパスが入っていることも珍しくありません。
ところが実際にアプリを作るときは、実行時には表示するデータはまだわからず、何からのアクションに伴いデータを取得して表示するということがよくあります。しかし、表示する項目が動的に変わるようなサンプルはまだ少ないように思います。
WPFを使ったときに複数のアイテムを表示する方法にかなり悩んだので、今回は、YouTube Data APIで検索した結果をいくつかのコントロールで表示するサンプルプログラムを書いてみることにします。
1. データのカプセル化(モデルの作成)
何かしらのデータを表示する際に単にその名前だけを表示することは少なく、複数のメタデータを並べて表示することが多いと思います。たとえばRSS Readerの記事の項目で言えば、タイトルだけじゃなく、作者や、公開日時も表示しますし、YouTubeなどの動画系の項目なら名前だけじゃなく、サムネイルやタグなんかを表示すると思います。
ますはこういったデータの固まりをモデルとしてクラスを用意します。今回はGoogle Data API SDKを使うので、Google.GData.Client.AtomEntryをモデルとして使います。(名前のとおりAtomEntryは基本的なモデルクラスでYouTube用のVideoデータのプロパティ、たとえば動画のサムネイルなどはとれないようです)
2. UI用Adapterクラスの作成
モデルとUI用のクラスを別に分ける必要がないのですが、クラスの再利用を考えるとデータの管理する箇所がUIのフレームワークに依存するのを避けるために別ける方が良いと思います。(そもそも今回はモデル用のGoogle.GData.Client.AtomEntryは変更できないのだが)
具体的にはSystem.ComponentModelにあるINotifyPropertyChangedを継承したUI用のクラスを作ります。名前の通りプロパティの変更をUIコントロールに通知することができ、あとはXAMLでプロパティをBindするだけになるので非常に楽ちんです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using Google.GData.Client;
using Google.GData.Extensions;
namespace WPFYouTube
{
public class UIVideoItem : INotifyPropertyChanged
{
public UIVideoItem(AtomEntry entry)
{
Title = entry.Title.Text;
}
public string Title { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string info)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}

ますは名前だけ返すクラスにしておきます。
3. Collectionの用意
リストにはUI用のクラスの配列を渡します。ここのやり方を知るのに時間がかかりました。配列の内容の変更を通知してくれるObservableCollectionを使ってXAMLでBindをします。
ちなみにこれから説明する例が素直なやり方なのかはよくわかっていません。
Windowのクラス側にてObservableCollectionのテンプレートを使いUIVideoItemの配列を定義します。

private ObservableCollection<UIVideoItem> videoItems = new ObservableCollection<UIVideoItem>();

XAMLの方でCollectionViewSourceを定義して、SourceにWindowの”VideoItems”というリソースを動的リソースとして指定します。(ObservableCollection<UIVideoItem>のXAMLでの書き方がわからなかったのでこうしてます)

    <Window.Resources>
<CollectionViewSource Source="{DynamicResource VideoItems}" x:Key="VideoItemCollection"/>
</Window.Resources>

動的リソースの”VideoItems”は、Windowクラスのプロパティではありません。従ってpublicのメンバでVideoItemsを定義しても意味がありません。Resourcesメンバに指定する必要があります。

        public Window1()
{
this.Resources["VideoItems"] = this.videoItems;
InitializeComponent();
}

上記によって、動的リソースの”VideoItems”にObservableCollection<UIVideoItem>を指定します。
最後にXAMLの方に戻って、CollectionViewSourceをListBoxのItemsSourceにBindします。これでC#側でmediaItemsを変更するだけでリストの内容が変えることができます。

<ListBox ItemsSource="{Binding Source={StaticResource VideoItemCollection}}"/>

実行してみましょう。(XPクラシックモードです)
WPFYouTube200805230.jpg


なんじゃこれは?ですが、正しい挙動です。ListBoxは項目のToStringの結果を表示するのでこうなります。
4. ItemTemplateの用意
UIVideoItemに下記のようなToStringを実装すればリストボックスにタイトルが並ぶようになります。

        public override string ToString()
{
return Title;
}

しかし、これだけならCollectionViewSource にstringの配列を渡すだけでもできてしまうので、モデルやUIクラスを作った意味があまりありません。そこでリストの項目に複数のプロパティをそれぞれ別のコントロールを使って表示するようにします。
とりあえずAuthorプロパティをUIVideoItemに用意します。

public UIVideoItem(AtomEntry entry)
{
Title = entry.Title.Text;
Author = (entry.Authors != null && entry.Authors.Count > 0) ? entry.Authors[0].Name : "";
}
public string Title { get; set; }
public string Author { get; set; }

ListBoxはデフォルトでは項目のToStringを単にテキストラベルで表示するだけですが、表示方法をItemTemplateで指定できます。

<ListBox ItemsSource="{Binding Source={StaticResource VideoItemCollection}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Title}"/>
<TextBlock Text="{Binding Path=Author}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>

これを実行すると、TitleとAuthorがStackPanelで水平に並べられて表示されます。
WPFYouTube200805231.jpg


水平に並べたためあまり効果は見えませんが、TItleとAutorが別々のTextBlockになっているのでTitleだけ太字にしたり、Authorだけ色を変えるなどスタイルの変更が柔軟に対応できます。
なお項目の表示方法を共通化したい場合などは、リソースとしてあらかじめ宣言しておくことができます。

    <Window.Resources>
<CollectionViewSource Source="{DynamicResource VideoItems}" x:Key="VideoItemCollection"/>
<DataTemplate x:Key="VideoOnItemsControl">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Title}"/>
<TextBlock Text="{Binding Path=Author}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>

上記のように用意しておくと、ListBoxのところは

<ListBox ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}"/>

で済むようになります。
5. コンテナのTemplateの変更
表示方法を変更できるのは項目だけではありません。項目を入れている箱、コンテナも変更することができます。通常リストボックスは垂直方向に項目が並びますがこれを水平方向に変えることがWPFでは簡単にできます。

            <ListBox ItemsSource="{Binding Source={StaticResource VideoItemCollection}}" ItemTemplate="{StaticResource VideoOnItemsControl}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ListBox>

と書くと、、、
WPFYouTube200805232.jpg


のようになります。
だいぶ長くなってしまいました。今日はここまでにします。次回はItemsControlとListViewについて書いてみたいと思います。