<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3"
	xml:lang="ja"
	xmlns="http://purl.org/atom/ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">
	<title>SimpleBoxes</title>
	<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/" />
	<modified>2012-03-04T21:42:27+00:00</modified>
	<tagline><![CDATA[]]></tagline>
	<generator url="http://serenebach.net/">Serene Bach</generator>
	<entry>
		<title>Objective-C / ARC で unsafe_unretained 利用時のインスタンス破棄タイミングについて</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid221.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid221.html</id>
		<issued>2012-03-04T18:30:00+09:00</issued>
		<modified>2012-03-04T09:30:00Z</modified>
		<summary>ここ最近のコーディングでは iOS5 SDK と同時に登場した ARC (Auto Reference Counting) を利用しています。ARC の導入と注意点については、iOS 開発ブログ Nat...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>mac</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p><img src="http://serennz.sakura.ne.jp/sb/img/file387_xcode4_icon.png" width="128" height="128" alt="" class="pict-tail" />ここ最近のコーディングでは iOS5 SDK と同時に登場した ARC (Auto Reference Counting) を利用しています。</p>
<p>ARC の導入と注意点については、<a href="http://blog.natsuapps.com/">iOS 開発ブログ Natsu&apos;s note</a> さんの一連の記事がとても参考になります。</p>
<ul>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">[iOS5] ARC (Automatic Reference Counting) : Overview</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-property.html">[iOS5] ARC : プロパティ属性と使い方</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-weakproperty-for-outle.html">[iOS5] ARC : Outletにはweakプロパティを使おう</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-strong-reference-cycle.html">[iOS5] ARC : 循環参照</a></li>
<li><a href="http://blog.natsuapps.com/2011/11/ios5-arc-autorelease-bridge-xcode.html">[iOS5] ARC : Autorelease, キャスト, 環境設定</a></li>
</ul>
<p>C++ with boost に慣れた人なら、ARC はスマートポインタ (SmartPtr, AutoPtr) に近い動作をするという認識でよいと思います。</p>
<p>代入 (アサイン) 動作で参照カウンタが加算 (インクリメント) され、スコープを抜ける段階で release が呼ばるようなイメージで動作します。参照カウンタが 0 になった時点でオブジェクトが破棄されるのはこれまでの retain / release を使った従来の手法 MRC (Manual Retain-Release) と同様です。</p>
<p>明示的に retain / release を呼び出す必要がなくなり、巡回参照さえ気をつければ、メモリリークも軽減できる ARC はとても便利です。</p>
<p>そんな便利な ARC ですが、unsafe_unretained / weak 関連で不思議な動作をするのに気づいたので、忘れないようにメモしておきます。</p>
<h3>Delegate 時の参照</h3>
<p><a href="http://blog.natsuapps.com/2011/11/ios5-arc-overview.html">[iOS5] ARC (Automatic Reference Counting) : Overview</a> で触れられている通り、Cocoa プログラミングで多用される Delegate パターンでは「弱い参照 (weak reference)」を使って巡回参照によるメモリリークを防ぎます。</p>
<p>ただし、<code class="objective-c">weak</code> 修飾子は iOS5 以降でしか利用できません。iOS4 でも動作するアプリケーションにするためには、<code class="objective-c">weak</code> 修飾子を利用するところで <code class="objective-c">unsafe_unretained</code> 修飾子を使う必要があります。</p>
<p><code class="objective-c">unsafe_unretained</code> 修飾子を使った場合、MRR で assign を利用したときと同様にアサインしたオブジェクトを適切なタイミングで <code class="objective-c">nil</code> 化してあげる必要があります。</p>
<p>しかしながら、<code class="objective-c">unsafe_unretained</code> 修飾子を利用する場合、<em>ある条件</em>下でオブジェクトが不用意に解放されてしまう場合があります。この場合、適切と思われる箇所で <code class="objective-c">nil</code> 化していても <code>EXC_BAD_ACCESS</code> の要因になりうるので注意が必要です。</p>
<h3>多段 Delegate</h3>
<p>さて、その「<em>ある条件</em>」について考察していきます。</p>
<p>以下は私が見つけたパターンですが、他にも同様なケースがあるかもしれません。</p>
<ol>
<li><p>ある Object A が Object B を作成し、その Delegate として動作します。</p></li>
<li><p>Object B は内部で Object C を作成していて、その Delegate として動作していて、Object C からの通知を起点に Object B から Object A にメッセージが送信されます。</p></li>
<li><p>Object A は Object B の Delegate メッセージを受け取り次第、Object B を利用しないので、Object B を破棄します。</p></li>
</ol>
<p>文章にすると若干ややこしい感じがしますが、例えば、</p>
<blockquote><p>ネットワーク越しのデータを処理するあるクラス (Object B) は内部で <code class="objective-c">NSURLConnection</code> (Object C) を利用していて、データ受信終了を起点に Object B でデータ処理を行い、Object A に通知する</p></blockquote>
<p>というケースなどが該当します。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file391_objc-multi-delegate-sample-diagram.png" width="467" height="81" class="pict" title="多段 Delegate の基本パターン" alt="[図]多段 Delegate の基本パターンダイアグラム" /></p>
<p>コードで表現すると、</p>
<blockquote><pre><code class="objective-c">@class SampleClassA;
@class SampleClassB;
@class SampleClassC;

@protocol SampleDelegateB &lt;NSObject&gt;

- (void)callFromClassB:(SampleClassB *)object;

@end

@protocol SampleDelegateC &lt;NSObject&gt;

- (void)callFromClassC:(SampleClassC *)object;

@end

#pragma mark -

@interface SampleClassA : NSObject &lt;SampleDelegateB&gt;

@end

@interface SampleClassB : NSObject &lt;SampleDelegateC&gt;

@property (nonatomic, unsafe_unretained) id&lt;SampleDelegateB&gt; delegate;

@end

@interface SampleClassC : NSObject

@property (nonatomic, unsafe_unretained) id&lt;SampleDelegateC&gt; delegate;

@end</code></pre></blockquote>
<p>というような形で、<code>SampleClassB</code> では <code>SampleDelegateC</code> のデリゲートメソッド <code>callFromClassC:</code> 内で <code>SampleDelegateB</code> デリゲートメッセージを通知します。</p>
<blockquote><pre><code class="objective-c">- (void)callFromClassC:(SampleClassC *)object
&#123;
  NSLog(@&quot;  -&gt; started  [%p] with '%@'&quot;,self,self.message);
  [self.delegate callFromClassB:self];
  NSLog(@&quot;  -&gt; endded   [%p] with '%@'&quot;,self,self.message);
&#125;</code></pre></blockquote>
<p>つまるところ、オブジェクト C からのメッセージをフォワードするような感じのイメージ。</p>
<h3>多段 Delegate のワナ</h3>
<p>この形だけでは特になんてことはないのですが、</p>
<blockquote><p>Object A は Object B の Delegate メッセージを受け取り次第、Object B を利用しないので、Object B を破棄します。</p></blockquote>
<p>という条件が加わると、オブジェクトが破棄されるタイミングが実装によって変わってきます。</p>
<ul>
<li><p>weak 参照を利用している</p></li>
<li><p>unsafe_unretained 参照を使っていて、プロパティ (メソッド) を通してデリゲートにアクセスしている</p></li>
<li><p>unsafe_unretained 参照を使っていて、メンバ変数でデリゲートにアクセスしている</p></li>
</ul>
<p>オブジェクトが破棄されるタイミングが weak 参照をつかっているか、unsafe_unretained 参照を使っているか……さらにはプロパティを使っているかなどの条件で変わってきます。</p>
<p><a href="https://github.com/takkyun/TestingARC">サンプルコードを github に上げた</a>ので、それを元に挙動を確認することができます。</p>
<p>以下の実行結果は、Xcode 4.3 / iOS5 SDK を利用して行なったものです。</p>
<h4>weak 参照を利用</h4>
<p><a href="https://github.com/takkyun/TestingARC/blob/master/TestingARC/SBSampleDelegate.h">SBSampleDelegate.h</a> において</p>
<ul>
<li><em>kUsingWeak 1</em></li>
<li>kAsseccingViaProperty 0</li>
<li>kUsingRetainAutoreleaseHack 0</li>
</ul>
<p>のように設定した場合。</p>
<blockquote><pre>[A]===&gt; initialized [0x6a67830]
[C]  -&gt; initialized [0xXXXXXXX]
[B]  -&gt; initialized [0xXXXXXXX] with 'msg0'
[C]  -&gt; started     [0xXXXXXXX]
[B]  -&gt; started     [0xXXXXXXX] with 'msg0'
[A]===&gt; called      [0xXXXXXXX]
[A]===&gt; removed     [0xXXXXXXX]
[B]  -&gt; endded      [0xXXXXXXX] with 'msg0'
[C]  -&gt; ended       [0xXXXXXXX]
[B]  -&gt; destroyed   [0xXXXXXXX] with 'msg0'
[C]  -&gt; destroyed   [0xXXXXXXX]</pre></blockquote>
<p>C → B と作成され、逆に B → C と破棄されています。期待通りの動作と言えそうです。</p>
<h4>unsafe_unretained 参照を使っていて、プロパティ (メソッド) を通してデリゲートにアクセス</h4>
<p><a href="https://github.com/takkyun/TestingARC/blob/master/TestingARC/SBSampleDelegate.h">SBSampleDelegate.h</a> において</p>
<ul>
<li>kUsingWeak 0</li>
<li><em>kAsseccingViaProperty 1</em></li>
<li>kUsingRetainAutoreleaseHack 0</li>
</ul>
<p>のように設定した場合。</p>
<blockquote><pre>[A]===&gt; initialized [0xXXXXXXX]
[C]  -&gt; initialized [0xXXXXXXX]
[B]  -&gt; initialized [0xXXXXXXX] with 'msg0'
[C]  -&gt; started     [0xXXXXXXX]
[B]  -&gt; started     [0xXXXXXXX] with 'msg0'
[A]===&gt; called      [0xXXXXXXX]
[A]===&gt; removed     [0xXXXXXXX]
[B]  -&gt; endded      [0xXXXXXXX] with 'msg0'
<em>[B]  -&gt; destroyed   [0xXXXXXXX] with 'msg0'</em>
<em>[C]  -&gt; ended       [0xXXXXXXX]</em>
[C]  -&gt; destroyed   [0xXXXXXXX]</pre></blockquote>
<p>C → B と作成され、逆に B → C と破棄されていますが、分かるでしょうか、<q>[B]  -&gt; destroyed</q> と <q>[C]  -&gt; ended</q> の呼び出される順番が逆になっています。</p>
<p><code>SampleClassC</code> からデリゲート B を呼び出しているメソッド <code>callDelegate</code> のスコープにまだいる最中に <code>SampleClassC</code> のデリゲートである <code>SampleClassB</code> のインスタンスが破棄されています。</p>
<p>これですぐに問題になるケースはぱっと思いつきませんが、ちょっとだけ不安な感じ。</p>
<h4>unsafe_unretained 参照を使っていて、メンバ変数でデリゲートにアクセス</h4>
<p><a href="https://github.com/takkyun/TestingARC/blob/master/TestingARC/SBSampleDelegate.h">SBSampleDelegate.h</a> において</p>
<ul>
<li><em>kUsingWeak 0</em></li>
<li><em>kAsseccingViaProperty 0</em></li>
<li>kUsingRetainAutoreleaseHack 0</li>
</ul>
<p>のように設定した場合。</p>
<blockquote><pre>[A]===&gt; initialized [0xXXXXXXX]
[C]  -&gt; initialized [0xXXXXXXX]
[B]  -&gt; initialized [0xXXXXXXX] with 'msg0'
[C]  -&gt; started     [0xXXXXXXX]
[B]  -&gt; started     [0xXXXXXXX] with 'msg0'
[A]===&gt; called      [0xXXXXXXX]
[A]===&gt; removed     [0xXXXXXXX]
<em>[B]  -&gt; destroyed   [0xXXXXXXX] with 'msg0'</em>
<em>[B]  -&gt; endded      [0xXXXXXXX] with '(null)'</em>
[C]  -&gt; ended       [0xXXXXXXX]
[C]  -&gt; destroyed   [0xXXXXXXX]</pre></blockquote>
<p>明らかにおかしい挙動になります。</p>
<p>まだ C からのデリゲート <code>callFromClassC:</code> のスコープにいるのにも関わらず、<code>dealloc</code> が呼び出されています。</p>
<p><code>SampleClassB</code> のインスタンスが破棄された後、<code>callFromClassC:</code> のメンバである <code>mMessage</code> にアクセスしているので、<code>(null)</code> と表示されています。場合によっては <code>EXC_BAD_ACCESS</code> の要因になります。</p>
<h3>retain-autorelease ハック</h3>
<p>という訳で unsafe_unretained 参照を利用すると、weak 参照とは異なった挙動になってしまいます。</p>
<p>これは MRR で assign を利用した場合でも起こりうる現象です。MRR ではこれに対して、</p>
<blockquote><pre><code class="objective-c">[[obj retain] autorelease]</code></pre></blockquote>
<p>retain と autorelease を併用することで、当該オブジェクトを autorelease プールに登録して、少なくともスコープ内はオブジェクトが破棄されないようにすることができました。</p>
<p>ご承知の通り、ARC では retain / autorelease メソッドの呼び出し自体が禁止されているので、同じハックは利用できません。</p>
<p>ただ、ローカルな変数に対しては、__autorelesing 修飾子を利用することによって autorelease プールを利用することを明示できます。</p>
<blockquote><pre><code class="objective-c">__autorelasing id temp = obj;</code></pre></blockquote>
<p>これでスコープ内では temp を利用すると、インスタンス obj に対して retain-autorelease で呼び出したのと同じような効果が得られます。</p>
<p><a href="https://github.com/takkyun/TestingARC/blob/master/TestingARC/SBSampleDelegate.h">SBSampleDelegate.h</a> において</p>
<ul>
<li>kUsingWeak 0</li>
<li>kAsseccingViaProperty 0</li>
<li><em>kUsingRetainAutoreleaseHack 1</em></li>
</ul>
<p>のように設定した場合、SampleClassA において retain-autorelease ハックを利用します。</p>
<blockquote><pre>[A]===&gt; initialized [0xXXXXXXX]
[C]  -&gt; initialized [0xXXXXXXX]
[B]  -&gt; initialized [0xXXXXXXX] with 'msg0'
[C]  -&gt; started     [0xXXXXXXX]
[B]  -&gt; started     [0xXXXXXXX] with 'msg0'
[A]===&gt; called      [0xXXXXXXX]
[A]===&gt; removed     [0xXXXXXXX]
[B]  -&gt; endded      [0xXXXXXXX] with 'msg0'
[C]  -&gt; ended       [0xXXXXXXX]
[B]  -&gt; destroyed   [0xXXXXXXX] with 'msg0'
[C]  -&gt; destroyed   [0xXXXXXXX]</pre></blockquote>
<p>weak 参照と同様に C → B と作成され、逆に B → C と破棄されています。</p>
<p>ログでは同じように見えていますが、こちらの実装では、B は autorelease プールのタイミングで破棄されているので、内部的には異なる挙動になっています。ただ、不用意な破棄がなくなり、アクセスバイオレーションはなくなります。</p>]]></content>
	</entry>
	<entry>
		<title>SBPullToRefreshHeaderView - 「引っ張って更新」を再実装してみる</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid220.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid220.html</id>
		<issued>2012-02-25T10:00:00+09:00</issued>
		<modified>2012-02-25T01:00:00Z</modified>
		<summary>HMDT さんから開発者向け電子書籍がリリースされています ([本] HMDT JOURNAL 創刊 | Cocoaの日々情報局 経由)。早速、Vol.001 と Vol.002 を購入してみました...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>mac</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p><img src="http://serennz.sakura.ne.jp/sb/img/file390_hmdt-journal.jpg" width="190" height="145" class="pict-tail" title="HMDT JOURNAL Vol.001" alt="" />HMDT さんから<a href="http://hmdt.jp/blog/?p=434" title="HMDT BOOKS登場、およびHMDT JOURNAL創刊！ | HMDT Blog">開発者向け電子書籍</a>がリリースされています (<a href="http://cocoadays-info.blogspot.co.nz/2012/02/hmdt-journal.html">[本] HMDT JOURNAL 創刊 | Cocoaの日々情報局</a> 経由)。</p>
<p>早速、Vol.001 と Vol.002 を購入してみました。木下さんらしい読みやすい文体で、かなり丁寧に書かれています。</p>
<p>……特定の連載記事だけをバラで購入できたら嬉しいなぁ……なんて。ともあれ、今後の展開が楽しみです。</p>
<h3><code class="objective-c">EGOTableViewPullRefresh</code></h3>
<p>さて、この <a href="http://hmdt.jp/products/books/journal_001.html">HMDT JOURNAL Vol.001</a> で紹介されている <a href="https://github.com/enormego/EGOTableViewPullRefresh"><code class="objective-c">EGOTableViewPullRefresh</code></a> は、いわゆる「引っ張って更新」を実現するクラスで、Facebook 謹製のライブラリでも採用されていたりする有名なライブラリです。</p>
<p>組み込みも簡単で、コードも分かりやすく記述されているライブラリなのですが、導入にあたってコントローラ側で <code class="objective-c">UIScrollViewDelegate</code> のメッセージをフォワードする必要がある点がちょっと不満。</p>
<p>例えば、<code class="objective-c">UIButton</code> ではボタンのハイライトのためにタッチイベントをコントローラ側からフォワードしなくても、ボタン側で勝手に処理してくれるように、<code class="objective-c">EGOTableViewPullRefresh</code> もスクロールイベントを勝手に処理してくれたらなぁと思うわけです。</p>
<h3><code class="objective-c">SBPullToRefreshHeaderView</code> - yet another &quot;pull-to-refresh&quot;</h3>
<p>……そこで自分で「引っ張って更新」するクラス <a href="https://github.com/takkyun/SBPullToRefreshHeaderView"><code class="objective-c">SBPullToRefreshHeaderView</code></a> を自作してみました。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file389_SBPullToRefreshHeaderView-reload.jpg" width="338" height="110" class="pict" title="SBPullToRefreshHeaderView の実装例" alt="[図] SBPullToRefreshHeaderView の実装例" /></p>
<p>ARC 対応で <code class="objective-c">__weak</code> 修飾子を使っているので、iOS5 以降でお使いいただけます。</p>
<p>他に <code class="objective-c">EGOTableViewPullRefresh</code> から微妙に変わっている部分に「離して更新」の時にリロード用画像を使っています。OS X 向け Twitter アプリケーションのような感じ。</p>
<p><a href="https://github.com/takkyun/SBPullToRefreshHeaderView/blob/master/Demo/SBViewController.m">サンプルデモのコード</a>にある通り、コントローラ側では <code class="objective-c">SBPullToRefreshHeaderView</code> の初期化メソッドにターゲットとなるスクロールビューを渡すと、あとは <code class="objective-c">SBPullToRefreshHeaderView</code> 側でよしなにしてくれます……はずです。</p>
<blockquote><pre><code class="objective-c">mRefreshHeaderView = [[SBPullToRefreshHeaderView alloc] initOnScrollView:self.tableView
                                                            withDelegate:self];</code></pre></blockquote>
<p>デリゲート <code class="objective-c">SBPullToRefreshHeaderViewDelegate</code> のメソッドはふたつ。</p>
<blockquote><pre><code class="objective-c">@protocol SBPullToRefreshHeaderViewDelegate &lt;NSObject&gt;

/// 「引っ張り更新」の発動 (ユーザが更新するためにスクロールビューを離した) を通知します。
/// @param headerView - 関連する SBPullToRefreshHeaderView のインスタンス
<em>- (void)didTriggerRefresh:(SBPullToRefreshHeaderView *)headerView;</em>

/// ターゲットが「ローディング」状態がどうかを確認します。
/// @param headerView - 関連する SBPullToRefreshHeaderView のインスタンス
/// @return ローディング状態にある場合、YES をそうでない場合 NO を返します
<em>- (BOOL)isRefreshStillProcessing:(SBPullToRefreshHeaderView *)headerView;</em>

@end</code></pre></blockquote>
<p>コントローラ側では基本的にはこのふたつのデリゲートメソッドを実装して、ローディングが終了した後に「<code class="objective-c">resetView:</code>」メソッドを送信します。</p>
<h3><code class="objective-c">SBPullToRefreshHeaderView</code> の実装</h3>
<p><code class="objective-c">SBPullToRefreshHeaderView</code> ではスクロールイベントを処理するために <a href="https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html">KVO (Key-Value Observing)</a> を使っています。</p>
<p>スクロールが発生すると、<code class="objective-c">UIScrollView</code> の <code class="objective-c">contentOffset</code> が変化することに着目して、そこでスクロール時に処理する内容を記述しています。</p>
<blockquote><pre><code class="objective-c">- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
&#123;
  if (object == mScrollView &amp;&amp;
      [keyPath isEqual:@&quot;contentOffset&quot;])
  &#123;
    [self scrollViewDidScroll:mScrollView];
    if (mIsDragging != mScrollView.isDragging)
    &#123;
      if (!mScrollView.isDragging)
      &#123;
        [self stopDragging];
      &#125;
      mIsDragging = mScrollView.isDragging;
    &#125;
  &#125;
&#125;</code></pre></blockquote>
<p>ユーザーがターゲットのスクロールビューから指を離したかどうかの判定もここで行っています。スクロールの変化で判定しているので、実際のタッチリリースとは異なるタイミングになりますが、動作させてみた感じ特に違和はない感じ。</p>
<p>オブザーブを開始・終了するタイミングが少しハック的な実装になっています。</p>
<p>……というのもオブザーブを開始した時点で参照カウンタがインクリメントされてしまうため、どこか適当なタイミングでオブザーブを終了してあげないといつまで経ってもオブジェクトが解放されなくなってしまいます。</p>
<p><code class="objective-c">SBPullToRefreshHeaderView</code> の実装では、ターゲットとなっているスクロールビューの子ビューとして追加されたときにオブザーブを開始、親ビューがターゲットから外れた時点でオブザーブを終了するようにします。</p>
<blockquote><pre><code class="objective-c">- (void)didMoveToSuperview
&#123;
  if (self.superview == mScrollView)
  &#123; // The view has been added into the target scroll view so it starts 
    // observing contentOffset changes.
    [mScrollView addObserver:self 
                  forKeyPath:@&quot;contentOffset&quot; 
                     options:NSKeyValueObservingOptionNew 
                     context:nil];
  &#125;
  else
  &#123; // The view has been removed from the target scroll view so it stops 
    // observing contentOffset changes.
    [mScrollView removeObserver:self
                     forKeyPath:@&quot;contentOffset&quot;];
  &#125;
&#125;</code></pre></blockquote>
<p><code class="objective-c">UIView</code> の 「<code class="objective-c">didMoveToSuperview</code>」メソッドで親ビューの変化をキャッチできるので、そこでオブザーブの開始・終了を制御しています。</p>
<p>GitHub にサンプルデモと一緒に<a href="https://github.com/takkyun/SBPullToRefreshHeaderView" title="takkyun/SBPullToRefreshHeaderView - GitHub">置いてみましたので</a>、もしよろしければお使いください (MIT-License)。</p>]]></content>
	</entry>
	<entry>
		<title>Xcode 4.3 リリース</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid219.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid219.html</id>
		<issued>2012-02-18T14:00:00+09:00</issued>
		<modified>2012-02-18T05:00:00Z</modified>
		<summary>二月になってしまいましたが、2012 年もよろしくお願いします。Xcode 4.3 がリリースされました。Mac App Store との親和性を高めるため、Xcode 4.3 から...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>mac</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>二月になってしまいましたが、2012 年もよろしくお願いします。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file387_xcode4_icon.png" width="128" height="128" alt="" class="pict-tail" />Xcode 4.3 がリリースされました。</p>
<p>Mac App Store との親和性を高めるため、Xcode 4.3 からはインストール先が変更されています。</p>
<ul>
<li>Xcode 4.2 まで : <em>/Developer</em></li>
<li>Xcode 4.3 から : <em>/Applications</em></li>
</ul>
<p>インストール方法も変わりました。Xcode 4.2 までは何らかの方法で Xcode のインストーラを起動する必要がありました。</p>
<p class="note">Xcode 4.2 では Mac App Store からダウンロードされるものは「Xcode Install」で Xcode そのものではありませんでした。</p>
<p>Xcode 4.3 からはインストーラは目に見えては存在しません。App Store からダウンロードして、そのまま他のアプリケーションと同じように起動するだけです。</p>
<p>Xcode 4.3 はインストールされる場所が最大の違いで、機能的な違いはほとんどない印象です。</p>
<h3>Xcode に付録されるユーティリティ</h3>
<p>Xcode 4.2 まで /Developer/Applications の中にあった Instruments や Icon Composer, FileMerge といったユーティリティは Xcode 4.3 から Xcode アプリケーション内に内包されています。</p>
<p>Dashcode, Quatz Compozer などこれまで Xcode に付録 (?) として付いてきたいくつかのアプリケーションは Xcode 4.3 には含まれていません。</p>
<p><a href="http://developer.apple.com">developer.apple.com</a> の<a href="https://developer.apple.com/downloads/">ダウンロードセンター</a>から別途ダウンロードする必要があります。</p>
<ul>
<li>Dashcode → Dashcode for Xcode - February 2012</li>
<li>Quartz Composer → Graphics Tools for Xcode - February 2012</li>
</ul>
<p>Instruments など Xcode 4.3 に内包されているアプリケーションを起動するには Xcode を立ち上げて、Xcode メニューより「Open Developer Tool」を利用します。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file384_xcode43_developer_tools.jpg" width="508" height="250" alt="[図] デベロッパツールメニュー。" class="pict" /></p>
<p class="note">Xcode に内包されているアプリケーションでも起動させた状態で Dock に保持するようにすれば、Dock から (Xcode を通さずに) 立ち上げることができます。Xcode に内包されているアプリケーションは Spotlight では拾ってくれないようです。</p>
<h3>コマンドラインツール</h3>
<p>Xcode 4.3 にはもちろんコンパイラは付いてきますが、Xcode 4.2 まで /Developer/usr/bin に含まれていたいくつかのツールは含まれていません。前述の<a href="https://developer.apple.com/downloads/">ダウンロードセンター</a>からダウンロードするか、設定画面の「Downloads」より「Command Line Tools」をダウンロードします。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file385_xcode43_downloads.jpg" width="506" height="358" alt="[図] Xcode 4.3 設定内のダウンロード。" class="pict" /></p>
<p class="note">Xcode 4.3 からの仕様変更により OS X のパッケージマネージャ Homebrew は Developer Preview の時には動作しなくなってしまいましたが、Command Line Tools をちゃんと入れれば、大丈夫な様子。</p>
<h3>以前の Xcode との共存</h3>
<p>Xcode 4.3 はこれまでの Xcode と同様、以前のバージョンの Xcode と共存が可能です。一番最初に Xcode 4.3 を立ち上げたときにインストールされている Xcode をゴミ箱に移動するかどうか聞かれます。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/file386_xcode43_new_launch.jpg" width="508" height="331" alt="[図] Xcode 4.3 最初の起動時に表示されるダイアログ。" class="pict" /></p>
<p>該当するディレクトリを単にゴミ箱に移すだけのようで、/Developer/Library/uninstall-developer-folder は実行されない様子。</p>
<p class="note">ヘルプでは「(古い Xcode は) 後からでもいつでもゴミ箱に入れられます」とあって、uninstall-developer-folder の実行には触れられていません。ゴミ箱に移して削除すればアンインストールされるんでしょうか。</p>]]></content>
	</entry>
	<entry>
		<title>転職しました</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid218.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid218.html</id>
		<issued>2011-12-05T02:30:00+09:00</issued>
		<modified>2011-12-04T17:30:00Z</modified>
		<summary>先日、私がニュージーランドに移住して初めて就職し、八年間勤めた会社 (ポータブルナビゲーションデバイス、いわゆる「カーナビ」のソフトウ...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>life</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>先日、私がニュージーランドに移住して初めて就職し、八年間勤めた会社 (ポータブルナビゲーションデバイス、いわゆる「カーナビ」のソフトウェア開発) を退職しました。</p>
<p class="image"><img width="500" alt="[写真]" src="http://serennz.sakura.ne.jp/sb/img/file383_leaving_company_2011.jpg" class="pict" title="[写真]退職時にもらった寄せ書き" height="375" />退職の際にもらったカード。皆からの寄せ書きです。</p>
<p>退職時のメールは以下の通り。</p>
<blockquote><p>Dear All,<br />
<br />
It's my last working day here at &lt;company name&gt;.<br />
I would like to thank you all for your great support.<br />
<br />
I have been working here over 8 years; it's long long and really exciting journey.<br />
I will miss all such comfortable environment - <em>great people</em>, <em>great products</em>, and <em>walking distance from home</em>.<br />
<br />
Please keep in touch.<br />
<br />
I can be reached :<br />
<br />
via email : &lt;email address&gt;<br />
on LinkedIn : &lt;LinkedIn url&gt;<br />
on Facebook : &lt;Facebook url&gt;<br />
on Skype : &lt;Skype account&gt;<br />
via mobile : &lt;mobile phone number&gt;<br />
<br />
I wish you all the best for the future.<br />
<br />
Best regards,<br />
Takuya</p></blockquote>
<p>およそ九年前にもニュージーランド移住にあたって、日本で五年間勤めた某大手電機メーカーを辞めました。その時と比べると私の中で感じる「重み」が違います。</p>
<p>九年前、日本で退職したときはニュージーランド移住がまず念頭にあり、ほぼ何もない状態からスタートする、いわば「リセット」的な意味合いが多分にありました。</p>
<p>不安も一杯でしたが、失うものもないという意識もあって「すっきり」「心機一転」という気持ちが強かったと思います。世間知らずであまり後先考えていなかったというのもあったと思います。</p>
<p class="note">世間知らずなのは、今も大して変わっていない気もしますが。</p>
<p>八年前、ソフトウェアエンジニアとして就職。</p>
<p>シニアソフトウェアエンジニアとしてテクニカルリーダーなどを経験し、最終的にはソフトウェアチームリーダーとして、ソフトウェア開発ばかりでなくマネージメントも含め、たくさんの貴重な経験を積むことができました。</p>
<p>会社自体も、山あり谷あり。</p>
<p>飛ぶ鳥を落とす勢いの時……新社屋落成セレモニーに時の首相が訪問しました……もあれば、大規模なリストラが敢行されたこと……人数削減のため同ポジションの人の間で点数をつけて上位数名だけ残る……もありました。</p>
<p>そのような過程を経た八年間。</p>
<p>職場はとても快適で、上司・部下に限らず皆からの信頼も感じていて、自信もつきました。……正直なところ「去りがたい」「怖い」という気持ちも少なからずあります。</p>
<p>一方で、あまりにひとつの会社に依存しすぎるのもリスクとも思っていたのも確かです。</p>
<p>ポータブルナビゲーションデバイスのソフトウェア開発がどこまで「保つ」ものなのかという面の不安もあります。</p>
<p>八年間の経験を通して、技術面でもコミュニュケーション面でも英語圏で十分に通用するという自信はつきましたが、一社でのみの経験で、それが他所でも通用する保証はありません。</p>
<p>色んなオプションを検討した末、今回転職に踏み切りました。</p>
<p>不安がないと言えば嘘になりますが、全く異なる分野でのソフトウェア開発ということで新鮮な気分もあります。</p>
<p>自分のスキルを生かすという点ではこれまでと変わりありません。とりあえず、頑張ってみようと思います。</p>]]></content>
	</entry>
	<entry>
		<title>ハーフマラソンに挑戦してみた</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid217.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid217.html</id>
		<issued>2011-11-21T19:30:00+09:00</issued>
		<modified>2011-11-21T10:30:00Z</modified>
		<summary>先日行われたオークランドマラソンにて、ハーフマラソン完走しました→結果は 1 時間 42 分。目標としていたタイムは 1 時間 45 分で、それを上回...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>life</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p><img src="http://serennz.sakura.ne.jp/sb/img/thm381_auckland_marathon_2011_record.jpg" width="192" height="200" alt="" class="pict-tail" />先日行われたオークランドマラソンにて、ハーフマラソン完走しました→結果は <a href="http://tiktok.biz/aucklandmarathon/2011/11204/">1 時間 42 分</a>。</p>
<p>目標としていたタイムは 1 時間 45 分で、それを上回ることができました。初ハーフマラソンとしては上出来だと自画自賛。</p>
<ol>
<li><a href="#eid217-trigger">きっかけ</a></li>
<li><a href="#eid217-aim">年始目標</a></li>
<li><a href="#eid217-training">トレーニング</a></li>
<li><a href="#eid217-marathon">オークランドマラソン</a></li>
</ol>
<h3 id="eid217-trigger">きっかけ</h3>
<p>もともと身体が小さくて筋力がない方なのですが、それに加え 30 歳過ぎまで喫煙をしていたせいもあり、全体的な持久力の低下も少し心配していました。</p>
<p>それで、二年前の誕生日頃から、体力づくりというか体力維持を目的としてジョギングを始めました。</p>
<p>仕事が終わってから夕食の前に自宅の周辺 3km ほどのコースを走ります。</p>
<p>理想的には毎日走りたいところですが、仕事や天気の状況次第で週に二、三日ぐらい走れるという感じのペース。</p>
<p>とにかく続けることが目標という感じで始めたのですが、ある程度の強制力がないと続かないという嫁さんの進言で、<a href="http://www.beachseries.co.nz/">ビーチシリーズ</a>という地元のローカルレースにも参加しはじめました。</p>
<p><a href="http://www.beachseries.co.nz/">ビーチシリーズ</a>は 11 月から翌年 3 月にかけて毎週火曜日、地元のビーチで行われるローカルレースです。ランの他にもスイムやパドルボードなどの種目があります。</p>
<p>ビーチシリーズのランは 5km。文字通り浜辺を走ります。潮の満ち引きの加減でコースの状態や長さが安定していないのが難点ですが、レースという形式で走るのが刺激になります。</p>
<p>参加し始めた当初は 5km で 25 分程度だったのですが、段々と慣れてきたせいか、昨年度は 21 分程度まで縮めることができました。</p>
<h3 id="eid217-aim">年始目標</h3>
<p>とりあえず 5km 程度ならばそこそこ走れる、という自信がついてきたので、もう少し長い距離に挑戦してみようと思いたったのが、今年の始め。</p>
<p>長距離ランの代表格はなんと言っても「マラソン」になると思いますが、いきなりマラソンはキツいかもと思い、「今年中にハーフマラソンを完走する」という目標を立てました。</p>
<p>最初は地元で行われる <a href="http://www.northshoremarathon.co.nz/">North Shore Marathon</a> に参加しようかなと思っていたのですが、たまたま会社の同僚に話したところ、「おぉ、そいつはグッドアイデアだ。俺も参加しよう」ということになりました。</p>
<p>折角なら一番大きな大会にしようということで<a href="http://www.aucklandmarathon.co.nz/">オークランドマラソン</a>に参加することに……。</p>
<p class="note">オークランドマラソンの方が開催時期が二ヶ月遅く、その分、準備期間を取れるという要因もありました。</p>
<p>もちろん完走が目標で、できれば二時間を切るタイムで完走したいというのが、とりあえず参加を決めた当初の目標。</p>
<h3 id="eid217-training">トレーニング</h3>
<p>会社の同僚も巻き込んで、いよいよ後に引けなくなりました。</p>
<p>五月頃から普段 (3km) よりも長めの距離を走れるように意識し始めます。</p>
<p>ざっくりトレーニングの方法を調べてみましたが、単純に長い距離走ればよいというものではないみたいで、短距離ダッシュなども取り入れる必要がある感じです。</p>
<p>そこで実際、短距離ダッシュもやってみたのですが、そうするといかにも「練習」っぽくなってしまい、長続きしそうにありません。</p>
<p>あくまでも長く続けることが第一なので、トレーニング方法を参考にしつつ、自分なりに以下のように決めました。</p>
<dl class="shortlist">
<dt>平日</dt>
<dd>短い距離 (3km) を早めのペース (1km 4 分 30 秒を切るペース)。</dd>
<dt>休日</dt>
<dd>長い距離 (10km 以上) をゆっくりペース。余裕があれば、さらに中距離 (5km 〜 8km) を別の日に走る。</dd>
</dl>
<p>平日は 30 分未満、休日は 1 時間以上走るという感じです。</p>
<p>これまで 10km を超える長距離は走ったことがありませんでしたが、ここ二年間走っていたおかげで 1km 5 分ペースであれば、結構走れる感触。</p>
<p>ただ、実際走ってみると……</p>
<ul>
<li>最初の 4km が少しキツい。おそらくウォームアップ不足。</li>
<li>10km 過ぎたあたりから膝に負担を感じるようになる。</li>
<li>15km 過ぎたあたりから股関節に負担を感じるようになる。</li>
</ul>
<p>心肺よりもむしろ関節への負担が想像以上にありました。スクワットやストレッチなどを都度きちんとやるようにして、膝や股関節への負担に備えます。</p>
<p>ストレッチなどは走る前にはもちろんですが、家でぼーっとしているときや<a href="http://serennz.sakura.ne.jp/sb/log/eid201.html">プリンを作っている合間</a>などスキマ時間も利用します……といえ、無理にしているわけではなく、気づいたら都度ストレッチなどをするという感じ。とにかく練習っぽくせずに「日常の延長」でできれば、という感覚で。</p>
<p>同僚に誘われて、<a href="http://www.dailymile.com/">dailymile</a> というオンラインサービスにも登録してみました。走った記録は手元にも残していましたが、<a href="http://www.dailymile.com/">dailymile</a> ではペース計算や週毎・月毎の集計などを自動でやってくれますし、 <a href="http://www.facebook.com">facebook</a> との連携もあったりして、便利なツールです。</p>
<h3 id="eid217-marathon">オークランドマラソン</h3>
<p>九月・十月のトレーニングの内容から、1km 5 分のペースを基本にして、21km x 5 分 = 105 分 = 1 時間 45 分を最終的な目標タイムにします。</p>
<p>オークランドマラソンは交通機関への影響を配慮してか、早朝にスタートするのが特徴です。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img372_auckland_marathon_2011_devonport.jpg" width="600" height="450" alt="[写真]スタート周辺の様子" class="pict" /></p>
<p>日が上がる前からスタート地点である「デボンポート」に集合します。早朝なので、公共の交通機関はなくて、臨時フェリーと臨時バスが出ます。</p>
<p>最寄りのバス停まで 4km 弱もの距離があるのがちょっとやっかいでしたけど、結果的にはちょうどよいウォーミングアップになりました。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img373_auckland_marathon_2011_sunrise.jpg" width="600" height="450" alt="[写真]日の出をスタート地点から望む" class="pict" /></p>
<p>フルマラソンとハーフマラソンは同じ地点からスタートします。フルマラソンが先にスタートして、その後ハーフがスタート。フルマラソンのスタート後、ハーフのスタートを待っている間に日の出を迎えました。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img374_auckland_marathon_2011_start.jpg" width="600" height="450" alt="[写真]スタートゲート" class="pict" /></p>
<p>スタートゲート。「Elite」のカンバンが見えるでしょうか。速い人はゲート前に並んで遅い人はゲートから離れた位置でスタートします。人が並び始める前にちょっと様子見。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img375_auckland_marathon_2011_northcote.jpg" width="600" height="450" alt="[写真]ノースコートにて" class="pict" /></p>
<p>スタート地点からおよそ 10km あたりで嫁さんと娘が応援してくれました。自作の横断幕を持つ娘と走り過ぎる私 (後ろ姿)。まだこの頃は余裕が……。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img376_auckland_marathon_2011_bridge1.jpg" width="600" height="450" alt="[写真]ハーバーブリッジを登る" class="pict" /></p>
<p>スタート地点からおよそ 15km あたり、オークランドマラソンの (フルマラソンなら前半の) クライマックスとも言える「ハーバーブリッジ」に差し掛かります。</p>
<p>ここは上り始め。ここからおよそ 1km 弱ほどそこそこキツい上り坂……。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img377_auckland_marathon_2011_bridge2.jpg" width="600" height="450" alt="[写真]頂上 (?) が見えてくる" class="pict" /></p>
<p>はためくニュージーランドの国旗。ちょっと旗の真下がブリッジの頂上にあたります。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img378_auckland_marathon_2011_bridge3.jpg" width="600" height="450" alt="[写真]ハーバーブリッジからシティを望む" class="pict" /></p>
<p>ハーバーブリッジは通常、車でしか通行できず、また基本的に停まることができません。車から降りて渡る機会などそうそうないので、ハーバーブリッジを渡っているときには写真は撮ってやろうと思ってました。</p>
<p>ハーバーブリッジでの写真は走りながら撮っています。幸い十分明るかったので、思ったよりブレもなく撮れました。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img379_auckland_marathon_2011_goal.jpg" width="600" height="450" alt="[写真]ゴール地点" class="pict" /></p>
<p>続々とゴール。ゴール地点には給水だけでなく、バナナの配布もしてました。風船をつけた人はペースメーカー。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img380_auckland_marathon_2011_finishing.jpg" width="267" height="400" alt="[写真]ラストスパート" class="pict" /></p>
<p>私もなんとかゴール。</p>
<p>オークランドマラソンはフルマラソン前半部分 (つまり、ハーフマラソン全コース) のコースの起伏が激しいのが特徴で、ハーバーブリッジがそのクライマックスになるんですが、それが終わった後がキツかったです。起伏での消耗が起伏が終わった途端にどっと来る感じ。</p>
<p>ハーフを無事に完走し、次はフル？とも聞かれたんですが、フルマラソンを走るにはもう少しトレーニングが必要かも。</p>
<p class="note">ちなみにその日の午後は爆睡。どうにか次の日、会社には出勤することができましたが……。</p>]]></content>
	</entry>
	<entry>
		<title>Re: Excel列名変換問題で第２回社内プログラミングコンテストを開催してみた(前編)</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid216.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid216.html</id>
		<issued>2011-11-04T03:00:00+09:00</issued>
		<modified>2011-11-03T18:00:00Z</modified>
		<summary>JunichiIto さんによる「Excel列名変換問題で第２回社内プログラミングコンテストを開催してみた(前編)」という記事を見かけて自分でもやってみる...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>web</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>JunichiIto さんによる「<a href="http://d.hatena.ne.jp/JunichiIto/20111102/1320253815">Excel列名変換問題で第２回社内プログラミングコンテストを開催してみた(前編)</a>」という記事を見かけて自分でもやってみる。</p>
<p>正確に時間を測ったわけではありませんが、問題 1 と問題 2 あわせて一応 90 分で解けたと思います。</p>
<blockquote><dl>
<dl>
<dt>問題1: Excel列名変換問題</dt>
<dd>
<ul><li>仕様
	<ul>
	<li>入力されたアルファベットを数字に変換する。</li>
	<li>変換ルールはExcelの列名と同等。</li>
	<li>例) A=1、B=2、Z=26、AA=27、XFD=16384</li>
	</ul>
</li></ul>
<ul><li>起動時引数
	<ul>
	<li>[0] アルファベット (A〜ZZZZ...[上限なし])</li>
	</ul>
</li></ul>
<ul><li>実行例
	<ul>
	<li>ExcelColConv.pl A → 1</li>
	<li>ExcelColConv.pl AA → 27</li>
	</ul>
</li></ul>
</dd></dl>
</dl></blockquote>
<p class="source">[→<cite><a href="http://d.hatena.ne.jp/JunichiIto/20111102/1320253815">Excel列名変換問題で第２回社内プログラミングコンテストを開催してみた(前編)</a></cite>]</p>
<p>→ <a href="#eid216-answer1">問題 1 に対する私の回答</a></p>
<blockquote><dl>
<dl>
<dt>問題2: Excel列名変換問題(逆変換)</dt>
<dd>
<ul><li>仕様
	<ul>
	<li>入力された数字をアルファベットに変換する。</li>
	<li>ただし、問題1で作ったプログラムを拡張すること。</li>
	</ul>
</li></ul>
<ul><li>起動時引数
	<ul>
	<li>[0] 0=数字へ変換、1=アルファベットへ変換</li>
	<li>[1] 変換する数字またはアルファベット(どちらも上限なし)</li>
	</ul>
</li></ul>
</dd></dl>
</dl></blockquote>
<p class="source">[→<cite><a href="http://d.hatena.ne.jp/JunichiIto/20111102/1320253815">Excel列名変換問題で第２回社内プログラミングコンテストを開催してみた(前編)</a></cite>]</p>
<p>→ <a href="#eid216-answer2">問題 2 に対する私の回答</a></p>

<h3 id="eid216-answer1">問題 1 回答</h3>
<blockquote><pre><code class="perl">#!/bin/perl

if ($ARGV[0] =~ /[A-Za-z]+/)
&#123;
&nbsp;&nbsp;print &amp;convert(uc($ARGV[0])) . &quot;\n&quot;;
&#125;
else
&#123;
&nbsp;&nbsp;&amp;usage();
&#125;
exit 0;

sub usage
&#123;
&nbsp;&nbsp;print 'Usage: ',$0,' input',&quot;\n&quot;;
&#125;

sub convert
&#123;
&nbsp;&nbsp;my $input  = shift;
&nbsp;&nbsp;my $output = 0;

&nbsp;&nbsp;my $rank = 0;
&nbsp;&nbsp;foreach my $char ( reverse(split(//,$input)) )
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;my $num = index('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $char) + 1;
&nbsp;&nbsp;&nbsp;&nbsp;$output += $num * (26 ** $rank++);
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;return $output;
&#125;</code></pre></blockquote>
<p>アプローチとしては、3 位の方と同等ですね。一応、入力パラメータチェックしてます。</p>

<h3 id="eid216-answer2">問題 2 回答</h3>
<blockquote><pre><code class="objective-c">#!/bin/perl

if ($ARGV[0] eq '0' and $ARGV[1] =~ /[A-Za-z]+/)
&#123;
&nbsp;&nbsp;print &amp;convert(uc($ARGV[1])) . &quot;\n&quot;;
&#125;
elsif ($ARGV[0] eq '1' and $ARGV[1] =~ /[0-9]+/ and $ARGV[1] &gt; 0)
&#123;
&nbsp;&nbsp;print &amp;rev_convert($ARGV[1]) . &quot;\n&quot;;
&#125;
else
&#123;
&nbsp;&nbsp;&amp;usage();
&#125;
exit 0;

sub usage
&#123;
&nbsp;&nbsp;print 'Usage: ',$0,' dir input',&quot;\n&quot;;
&nbsp;&nbsp;print '       dir 0 : alpha to num [input must be alphabet]'.&quot;\n&quot;;
&nbsp;&nbsp;print '       dir 1 : num to alpha [input must be number greater than 0]'.&quot;\n&quot;;
&#125;

sub convert
&#123;
&nbsp;&nbsp;my $input  = shift;
&nbsp;&nbsp;my $output = 0;

&nbsp;&nbsp;my $rank = 0;
&nbsp;&nbsp;foreach my $char ( reverse(split(//,$input)) )
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;my $num = index('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $char) + 1;
&nbsp;&nbsp;&nbsp;&nbsp;$output += $num * (26 ** $rank++);
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;return $output;
&#125;

sub rev_convert
&#123;
&nbsp;&nbsp;my $input  = shift;
&nbsp;&nbsp;my $output = '';
&nbsp;&nbsp;my @chars = split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
&nbsp;&nbsp;my $base = @chars;

&nbsp;&nbsp;my @stack = ();
&nbsp;&nbsp;while ($input &gt; $base)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;my $num = $input % $base;
&nbsp;&nbsp;&nbsp;&nbsp;push(@stack, $chars[$num - 1]);
&nbsp;&nbsp;&nbsp;&nbsp;$input = int($input / $base);
&nbsp;&nbsp;&nbsp;&nbsp;# Needs to decrement $input if $input value is in multiple of $base
&nbsp;&nbsp;&nbsp;&nbsp;if ($num == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$input--;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;# Now handles within $base case
&nbsp;&nbsp;push(@stack, $chars[$input % $base - 1]);

&nbsp;&nbsp;return join('',reverse(@stack));
&#125;</code></pre></blockquote>
<p>入力数値が基数にあたる 26 の倍数の時、桁を正しく処理する必要があるのがトリッキーな部分になるでしょうか。</p>
<p>一応、ざっくり確認したつもりですが、間違っていたらごめんなさい。</p>

<p class="note">[2010.11.04 03:30 追記] perl の場合、配列に対して負のインデックスを指定すると、配列の後ろからアクセスするという仕様があります。なので、<code class="perl">$input % $base</code> の結果が 0 になる場合、<code class="perl">@stack</code> には &quot;Z&quot; が格納されます。</p>]]></content>
	</entry>
	<entry>
		<title>十歳になった娘へ</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid215.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid215.html</id>
		<issued>2011-10-10T20:00:00+09:00</issued>
		<modified>2011-10-10T11:00:00Z</modified>
		<summary>先日、あなたは十歳の誕生日(たんじょうび)を迎(むか)えました。十歳。あなたの眼には世界はどのように映っているでしょうか。私が十歳、つま...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>life</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p><img src="http://serennz.sakura.ne.jp/sb/img/img371_borthday_cake.jpg" width="600" height="389" alt="十歳の誕生日、おめでとう！" class="pict" /></p>
<p>先日、あなたは十歳の<ruby><rb>誕生日</rb><rp>(</rp><rt>たんじょうび</rt><rp>)</rp></ruby>を<ruby><rb>迎</rb><rp>(</rp><rt>むか</rt><rp>)</rp></ruby>えました。</p>
<p>十歳。</p>
<p>あなたの眼には世界はどのように映っているでしょうか。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img370_manmarukun.jpg" width="136" height="102" alt="" class="pict-tail" />私が十歳、つまり小学四年生だった<ruby><rb>頃</rb><rp>(</rp><rt>ころ</rt><rp>)</rp></ruby>、とても<ruby><rb>仲</rb><rp>(</rp><rt>なか</rt><rp>)</rp></ruby>の良い友だちがいて、毎日のように<ruby><rb>一緒</rb><rp>(</rp><rt>いっしょ</rt><rp>)</rp></ruby>にマンガを描いていました。</p>
<p class="note">右のカービィの<ruby><rb>亜種</rb><rp>(</rp><rt>あしゅ</rt><rp>)</rp></ruby>みたいなキャラクターは、その頃描いていたマンガのメインキャラクターの一人。フェルトで作ったものですが、今でも手元にあるのがびっくり。</p>
<p>マンガもそうだけど、自分でストーリーを考えるのが好きだったので、星新一のショートショートなんかを<ruby><rb>真似</rb><rp>(</rp><rt>まね</rt><rp>)</rp></ruby>た短編小説 (ショートストーリー) みたいなものを書いたりもしていました。</p>
<p>マンガも小説もあまりに<ruby><rb>拙</rb><rp>(</rp><rt>つたな</rt><rp>)</rp></ruby>く、とても見せられるようなものではなかったけれど、<ruby><rb>漠然</rb><rp>(</rp><rt>ばくぜん</rt><rp>)</rp></ruby>と「<ruby><rb>漫画家</rb><rp>(</rp><rt>まんがか</rt><rp>)</rp></ruby>」か「<ruby><rb>小説家</rb><rp>(</rp><rt>しょうせつか</rt><rp>)</rp></ruby>」になりたいと思っていました。</p>
<p>その夢がガラリと変わったのは、誕生日に買ってもらった<ruby><rb>任天堂</rb><rp>(</rp><rt>にんてんどう</rt><rp>)</rp></ruby>のファミリーコンピュータ、いわゆる「ファミコン」のせい。</p>
<p>ファミコンを始めとするビデオゲームには、それこそ朝から<ruby><rb>晩</rb><rp>(</rp><rt>ばん</rt><rp>)</rp></ruby>までずっとゲームをしていたと言っても言い<ruby><rb>過</rb><rp>(</rp><rt>す</rt><rp>)</rp></ruby>ぎでないくらい、のめり<ruby><rb>込</rb><rp>(</rp><rt>こ</rt><rp>)</rp></ruby>みました。</p>
<p>最近はほとんどプレイすることもなくなってしまったけれど、ニュージーランドに来る<ruby><rb>直前</rb><rp>(</rp><rt>ちょくぜん</rt><rp>)</rp></ruby>あたりまで、ビデオゲームばかりやっていたぐらいです。ウソだと思うならあなたのお母さんに聞いてごらんなさい。</p>
<p>ゲームを<ruby><rb>上手</rb><rp>(</rp><rt>じょうず</rt><rp>)</rp></ruby>にプレイできれば<ruby><rb>嬉</rb><rp>(</rp><rt>うれ</rt><rp>)</rp></ruby>しいけれど、<ruby><rb>残念</rb><rp>(</rp><rt>ざんねん</rt><rp>)</rp></ruby>ながら「ゲームをうまくプレイする」才能にはあまり<ruby><rb>恵</rb><rp>(</rp><rt>めぐ</rt><rp>)</rp></ruby>まれませんでした。その分、ゲームを<ruby><rb>創造</rb><rp>(</rp><rt>そうぞう</rt><rp>)</rp></ruby>する方に<ruby><rb>興味</rb><rp>(</rp><rt>きょうみ</rt><rp>)</rp></ruby>が向いてました。……「ゲームデザイナー」になりたいと思うようになります。</p>
<p>それが<ruby><rb>実現</rb><rp>(</rp><rt>じつげん</rt><rp>)</rp></ruby>するかはどうかはともかく、私が十歳に<ruby><rb>描</rb><rp>(</rp><rt>えが</rt><rp>)</rp></ruby>いていた「漫画家」「小説家」「ゲームデザイナー」という夢は、私に大きく<ruby><rb>影響</rb><rp>(</rp><rt>えいきょう</rt><rp>)</rp></ruby>しました。その頃に描いた夢が<ruby><rb>違</rb><rp>(</rp><rt>ちが</rt><rp>)</rp></ruby>ったものであれば、私は<ruby><rb>確実</rb><rp>(</rp><rt>かくじつ</rt><rp>)</rp></ruby>に違った人生を歩んでいたであろうと思います。</p>
<p>私が十歳の頃、「ニュージーランド」という十歳の頃には知りもしなかった場所で生活しているとは夢にも思いませんでした。</p>
<p>夢に思っていること・夢にも思わなかったこと、これからあなたの<ruby><rb>将来</rb><rp>(</rp><rt>しょうらい</rt><rp>)</rp></ruby>に起こるであろうことは<ruby><rb>誰</rb><rp>(</rp><rt>だれ</rt><rp>)</rp></ruby>にも分かりませんが、あなたの目の前には果てしない可能性が広がっていることだけは確かです。</p>
<p>あなたの人生が<ruby><rb>素晴</rb><rp>(</rp><rt>すば</rt><rp>)</rp></ruby>らしいものであると胸をはって言えるよう、私も (そして、あなたのお母さんも) <ruby><rb>精一杯</rb><rp>(</rp><rt>せいいっぱい</rt><rp>)</rp></ruby>のサポートをしていこうと思っています。</p>]]></content>
	</entry>
	<entry>
		<title>ルンバがうちにやってきた</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid214.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid214.html</id>
		<issued>2011-10-03T15:00:00+09:00</issued>
		<modified>2011-10-03T06:00:00Z</modified>
		<summary>新製品が先日発表されたばかり Roomba (ルンバ) ですが、うちに現行モデル (530) がやってきました。購入したのは、530 というスタンダードモデル。...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>life</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p><a href="http://www.irobot-jp.com/special/700series/index.html">新製品</a>が先日発表されたばかり Roomba (ルンバ) ですが、うちに現行モデル (530) がやってきました。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img367_roomba530_01.jpg" width="600" height="422" alt="[写真]Roomba 530 パッケージ" class="pict" /></p>
<p>購入したのは、530 というスタンダードモデル。ベースに自動的に戻る機能があります。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img368_roomba530_02.jpg" width="450" height="600" alt="[写真]Roomba 530 開封の儀" class="pict" /></p>
<p>パッケージには</p>
<ul>
<li>Roomba 本体</li>
<li>替えフィルタ</li>
<li>ベースステーション</li>
<li>AC アダプタ</li>
<li>バーチャルウォール</li>
<li>ブラシクリーニング用ツール (赤いやつ)</li>
<li>取扱い説明書</li>
</ul>
<p>が同梱されていました。日本で売っているモデルとは同梱品の内容などが異なる感じです。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img369_roomba530_03.jpg" width="600" height="450" alt="[写真]Roomba 530 内容物" class="pict" /></p>
<p>AC アダプタは Roomba 本体に繋いで充電することもできますが、通常はベースステーションに繋いでおき、ベースステーションから充電するという形になります。</p>
<p>早速利用してみましたが、評判通りすこぶる便利。</p>
<p>猫が家族の一員になってから、フロアが埃っぽくなりがちでしたが、隅々まで (ソファーの下も入り込んで) 綺麗にしてくれます。</p>
<p class="image"><object width="420" height="315"><param name="movie" value="http://www.youtube.com/v/JtqstRmuEHU?version=3&amp;hl=ja_JP&amp;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/JtqstRmuEHU?version=3&amp;hl=ja_JP&amp;rel=0" type="application/x-shockwave-flash" width="420" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>障害物にぶつかった際、赤外線センサーで周囲の状況を確認しながら、回転して次のルートを決定する様子。デジタルカメラで撮影すると、赤外線センサーが某モビルスーツのモノアイのごとく光る様子が確認できます。動画では音をなくしてしまいましたが、それなりに大きな音がします。</p>
<p>うちはほぼ全面的にフローリング (板の間) で、マットなども敷いていません。埃っぽいとザラザラした感触がありますが、Roomba が掃除した後だと、そうしたザラザラ感が明らかになくなります。人がざっと掃除機をかけるよりはるかに丁寧に掃除してくれる印象です。</p>
<p>Roomba を導入した人のレポートを見ると「Roomba のおかげで床にモノを置かないようになる」と記述が見受けられましたが、うちでも同様に Roomba 導入以降、心なしかうちの中がすっきりしたような気がします。</p>]]></content>
	</entry>
	<entry>
		<title>Presario CQ57 と Windows 7</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid213.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid213.html</id>
		<issued>2011-10-02T11:30:00+09:00</issued>
		<modified>2011-10-02T02:30:00Z</modified>
		<summary>PC 代替えの年今年は自宅で使っている PC の厄年 (?) なのか、使っていた三台を立て続けに代替えしました。左から Presario CQ57、ThinkPad Edge 14、MacBook ...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>mac</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<h3>PC 代替えの年</h3>
<p>今年は自宅で使っている PC の厄年 (?) なのか、使っていた三台を立て続けに代替えしました。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img361_all_pcs_closed_2011.jpg" width="600" height="358" alt="[写真]PC 勢揃い。" class="pict" />左から Presario CQ57、ThinkPad Edge 14、MacBook Pro、MacBook</p>
<p>実のところ、<a href="http://serennz.sakura.ne.jp/sb/log/eid203.html">MacBook Pro</a> は最後に代替えしたマシンになります。</p>
<ul>
<li>Thinkpad R52 → ThinkPad Edge 14 [嫁さん用]</li>
<li>Thinkpad T43 → Presario CQ57 [娘用]</li>
<li>MacBook → MacBook Pro 13 [私用]</li>
</ul>
<p>学校で課題が出たりするので、娘用にも PC を用意しています。</p>
<p>会社から型落ちマシン (Thinkpad T43) を購入して、それを娘用に使っていたのですが、今年になって絶不調。起動してもマウスカーソルを動かした途端にフリーズする謎の現象に見舞われます。</p>
<p>リカバリユーティリティを使って OS の再インストール、内蔵ハードディスクドライブの換装、メモリの挿し直しなど試せることは大概やってみましたが、それでも症状は改善されず、やむなく新規機種の購入を検討することに……。</p>
<ul>
<li>場所を選ばずに利用できる利点がやはり大きいので、ラップトップが前提。</li>
<li>できるだけコストを抑えたい。</li>
<li>コスト面では、ネットブックが有利だけど、
<ul>
<li>DVD/CD を利用する機会が多い娘の利用用途では、DVD ドライブ非搭載な機種は向いていない</li>
<li>娘は視力が若干弱いので、できるだけ大きな画面がよい</li>
</ul>
という点で、ネットブックは候補から外れる。</li>
<li>たまたま会社からもらった商品券が手元にあって、それが利用できるお店。</li>
</ul>
<p>という諸々の条件を加味した結果、Compaq Presario CQ57-104TU というマシンを購入することに。</p>
<p class="note">販売価格で 4 万円弱でしたが、商品券を使ったので、実費で 1 万円も払わずに購入しました。その後若干値上がりしたりもしたので、結果的には底値のタイミングで購入できました (これからまた下がるかもしれませんが……)。</p>
<p>HP との統合で、コンパックのプレサリオというブランドは、日本では新規では扱っていないようですが、ニュージーランドではエントリー向けブランドとして認知されているせいか、まだ扱われている様子。</p>
<h3>スペック比較</h3>
<p>先にも述べたとおり、日本では扱っていない機種なので、参考になるかどうか怪しいですが、スペックを大まかに比較すると以下の通り。</p>
<table>
<!-- === -->
<tr>
<th>機種</th>
<th>MacBook Pro 13</th>
<th>ThinkPad Edge 14</th>
<th>Presario CQ57</th>
</tr>
<!-- === -->
<tr>
<th>CPU / 動作周波数</th>
<td>Intel Core i5 2.3GHz</td>
<td>Intel Core i3 2.13GHz</td>
<td>Intel Celeron T3500 2.1GHz</td>
</tr>
<!-- === -->
<tr>
<th>システムバス周波数</th>
<td>1333MHz</td>
<td>1066MHz</td>
<td>800MHz</td>
</tr>
<!-- === -->
<tr>
<th>搭載メモリ</th>
<td>8GB DDR3 SDRAM<br />PC3-10600</td>
<td>3GB DDR3 SDRAM<br />PC3-8500</td>
<td>2GB DDR3 SDRAM<br />PC3-8500</td>
</tr>
<!-- === -->
<tr>
<th>グラフィックス</th>
<td>Intel HD Graphic 3000</td>
<td>Intel HD GMA</td>
<td>Intel GMA4500MHD</td>
</tr>
<!-- === -->
<tr>
<th>ディスプレイ</th>
<td>13 インチ 光沢<br />1280 x 800</td>
<td>14 インチ 非光沢<br />1366 x 768</td>
<td>15 インチ 光沢<br />1366 x 768</td>
</tr>
<!-- === -->
<tr>
<th>内蔵 HDD</th>
<td>320GB 7200rpm SATA</td>
<td>250GB 5400rpm SATA</td>
<td>320GB 5400rpm SATA</td>
</tr>
<!-- === -->
<tr>
<th>重さ</th>
<td>2.04kg</td>
<td>2.25kg</td>
<td>2.5kg</td>
</tr>
<!-- === -->
<tr>
<th>大きさ</th>
<td>32.5cm x 22.7cm x 2.41cm</td>
<td>34.4cm x 23.3cm x 3.70cm</td>
<td>37.6cm x 24.7cm x 3.58cm</td>
</tr>
<!-- === -->
<tr>
<th>バッテリー</th>
<td>63.5Wh (公称 7 時間)</td>
<td>57Wh (公称 4.5 時間)</td>
<td>47Wh</td>
</tr>
<!-- === -->
<tr>
<th>入出力 I/F</th>
<td>USB2.0 x 2<br />SD カードスロット<br />Thuderbolt<br />Firewire 800</td>
<td>USB2.0 x 3<br />SD カードスロット (7 in 1)<br />VGA<br />HDMI</td>
<td>USB2.0 x 3<br />SD カードスロット<br />VGA</td>
</tr>
<!-- === -->
<tr>
<th>新品販売価格<br />(当時@NZ)</th>
<td>約 13 万円</td>
<td>5 万円後半</td>
<td>3 万円後半</td>
</tr>
<!-- === -->
</table>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img362_all_pcs_opend_2011.jpg" width="600" height="450" alt="[写真]開けた状態で並べてみました。" class="pict" />図らずも全てラッチレス構造のマシンになりました。</p>
<h3>使い心地</h3>
<p>Presario CQ57 は、格安エントリーモデルという位置づけになります。</p>
<p>プラスティック (ポリカーボネート?) の外装はシンプルで、ゴテゴテしがちな底面も思っていた以上にすっきりしていました。</p>
<p>ThinkPad Edge 14 / MacBook Pro 13 と同様、Presario CQ57 もラッチレスな構造になっています。</p>
<p>Presario CQ57 は大きさの割に軽く、モニターを閉じる強さがそれに比べて強いので、モニターを片手で開こうとすると、それにつられて本体側も持ち上がってしまうことがままあります。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img363_presario_cq57_opening.jpg" width="600" height="337" alt="[写真]CQ57 のモニターを開ける。" class="pict" />モニターだけを持って開こうとすると、本体側も持ち上がってしまう。</p>
<p class="note">余談になりますが、ThinkPad Edge 14 は ThinkPad では珍しい (?) ラッチレス構造ですが、モニターがぴったりと閉じてくれない (閉じた時に若干隙間ができる) のが少々不安……。</p>
<p>キーボードは、Enter や Backspace キーの右側に、さらに一列 Home や End などのキーが並んでいるタイプのもので、ちょっと苦手。</p>
<p>トラックパッドは段差のないユニークなもので、マルチタッチにも対応しています。ボタン部分は「パコパコ」という打鍵感がチープな感じなのは否めません。使い勝手は決して悪い方ではないと思うのですが、MacBook Pro のそれと比較するとやはり劣ります。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img364_presario_cq57_keyboard.jpg" width="600" height="337" alt="[写真]CQ57 のキーボードとトラックパッド。" class="pict" />トラックパッド部は段差がなく、埃などが溜まらない構造。</p>
<p>現状で利用頻度の高い順から</p>
<ol>
<li>ウェブサイト閲覧 (含 Flash)</li>
<li>オンライン動画鑑賞</li>
<li>DVD 動画鑑賞</li>
<li>Microsoft Word / Excel</li>
<li>リモートデスクトップ</li>
<li>簡単な画像編集 (トリミングやリサイズ)</li>
<li>他</li>
</ol>
<p>という感じになります。特に最初の二つが八割以上を占める利用になっています。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img366_presario_cq57_score.jpg" width="508" height="371" alt="[イメージ]CQ57 の Windows エクスペリエンスインデックス" class="pict" /></p>
<p>Windows エクスペリエンスインデックス は 2.8。やはりハードウェアは性能的に「それなり」と感じる時もまれにありますが、上述の利用傾向であれば、必要十分という感じです。</p>
<p class="note">ちなみに ThinkPad Edge 14 はプロセッサ：6.5・メモリ：5.5・グラフィック：4.3・ゲームグラフィック：5.1・ハードディスク：5.8 でした。</p>
<p>ディスプレイの品質自体は MacBook Pro / ThinkPad Edge と並べて比べると若干見劣りするかもしれませんが、大きくて十分に見やすく、やはり大きなモニターにして正解でした。</p>
<h3>Windows 7</h3>
<p>これまでは XP 止まりでしたが、ThinkPad Edge / Presario CQ57 共に Windows 7 がインストールされています。</p>
<p>Windows Vista はほとんど触ったことがありません。<a href="http://serennz.sakura.ne.jp/sb/log/eid85.html">セットアップを頼まれたり</a>したので、全くなかったわけではありませんが、会社でも導入されていなかったこともあって、日常的に触れる機会はありませんでした。ですので、実質的に Windows Vista はスキップして Windows XP から Windows 7 へ切り替えたことになります。</p>
<p>Aero と呼ばれるアピアランスは悪くないです。Windows XP の Luna は、常用するにはビビッドすぎましたが、Windows 7 の Aero はそんな印象は感じません。</p>
<p class="image"><img src="http://serennz.sakura.ne.jp/sb/img/img365_presario_cq57_desktop.jpg" width="608" height="345" alt="[イメージ]Windows 7 のデスクトップ。" class="pict" />私が利用するときはブラウザ動作検証が多いので、主要ブラウザがタスクバーに追加されています。</p>
<p>タスクバーは「クイック起動」と統合されて、Mac OS X の Dock に近い動作をするようになっていますね。これは Vista からでしょうか。</p>
<p>アプリケーション単位でのグループ化も XP よりも強化されて、ラベルを非表示にすることで、縦表示に切り替えても不自然でなくなりました。</p>
<p>それほどヘビーに使い込んでいるわけではないので、例えば、コントロールパネルの構成がまだよく分かっていなかったりしますが、とりあえずこれまでのところ、XP よりも使いやすいという印象です。</p>]]></content>
	</entry>
	<entry>
		<title>ラグビーワールドカップ 2011 日本 vs フランス</title>
		<link rel="alternate" type="text/html" href="http://serennz.sakura.ne.jp/sb/log/eid212.html" />
		<id>http://serennz.sakura.ne.jp/sb/log/eid212.html</id>
		<issued>2011-09-11T20:00:00+09:00</issued>
		<modified>2011-09-11T11:00:00Z</modified>
		<summary>いよいよラグビーワールドカップ 2011 が始まりました。ちょっとしたお祭り雰囲気になっています。昨年の 6 月にラグビー日本代表とニュージー...</summary>
		<author>
			<name>takkyun</name>
		</author>
		<dc:subject>life</dc:subject>
		<content mode="escaped" type="text/html" xml:lang="ja"><![CDATA[<p>いよいよ<a href="http://www.rugbyworldcup.com/">ラグビーワールドカップ 2011</a> が始まりました。ちょっとしたお祭り雰囲気になっています。</p>
<p>昨年の 6 月にラグビー日本代表とニュージーランド・ノースハーバー州代表の対抗試合を<a href="http://serennz.sakura.ne.jp/sb/log/eid184.html">観戦しました</a>が、今回本命 (?) の日本代表対フランス代表を観戦してきました。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img355_rwc_jpn_vs_fra_1.jpg" width="648" height="368" alt="[写真1]ノースハーバースタジアム・試合前" class="pict" /></p>
<p>会場は日本代表とノースハーバー州代表の試合と同じ<a href="http://www.stadium.co.nz/">ノースハーバースタジアム</a>。前回は正面に見えるグランドスタンドで観戦しましたが、今回は反対側のオープンスタンドより観戦。屋根がない席のため、天気が心配でしたが、ご覧のとおり、快晴でした。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img356_rwc_jpn_vs_fra_2.jpg" width="648" height="488" alt="[写真2]日本代表、試合前アップ" class="pict" /></p>
<p>試合前の練習風景。中央に見えるスーツ姿の男性は、おそらく日本コーチで元オールブラックスのジョン・カーワンだと思うのですが……。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img357_rwc_jpn_vs_fra_3.jpg" width="648" height="488" alt="[写真3]試合直前" class="pict" /></p>
<p>試合直前。両チームが円陣を組んでいます。日本は赤いユニフォームで、フランスは白いユニフォーム。日本のユニフォームは昨年見たときから少し変わっています。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img358_rwc_jpn_vs_fra_4.jpg" width="648" height="488" alt="[写真4]ラックからボールを出す日本" class="pict" /></p>
<p>前半は (フランス) 25 - 11 (日本) で折り返します。前半だけ見ると、やはりフランスは世界ランク 4 位だけあって力の差がある印象で後半このままずるずると離されるのかと思ったりもしたんですが……。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img359_rwc_jpn_vs_fra_5.jpg" width="648" height="488" alt="[写真5]アレジ選手のコンバージョン" class="pict" />
<p>後半、二度に渡るピンチをどうにか凌ぐと日本の猛攻が始まります。アレジ選手大活躍!!日本の全得点は彼によるもので、マン・オブ・ザ・マッチにも選出されたのも納得の活躍でした。</p>
<p><img src="http://serennz.sakura.ne.jp/sb/img/img360_rwc_jpn_vs_fra_6.jpg" width="648" height="488" alt="[写真6]4 点差!" class="pict" /></p>
<p>あと 4 点、1 トライで逆転というところまで追い詰めます。フランスも焦ったのかハンドリングミスを連発したり、完全に流れが日本という感じに……。</p>
<p>残念ながら、その後地力を差が出て最終的には 47 - 21 という差になってしまいましたが、内容的にはとても良い感じで、ワールドカップの雰囲気を味わうこともできたし、私的にはかなり楽しめました。よかったよかった。</p>
<p>日本代表には是非とも結果を残してもらいたいです。</p>]]></content>
	</entry>
</feed>

