<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
  <title>MASATOの開発日記</title>
  <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/" />
  <modified>2011-01-29T14:59:02Z</modified>
  <tagline>ソフト開発のTipsや自作ソフトウェアのリリース案内。</tagline>
  <id>tag:www.sutosoft.com,2006:/room//2</id>
  <generator url="http://www.movabletype.org/" version="3.2-ja-2">Movable Type</generator>
  <copyright>Copyright (c) 2011, MASATO</copyright>
  <entry>
    <title>リアルタイム組込みシステム</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001475.html" />
    <modified>2011-01-29T14:59:02Z</modified>
    <issued>2011-01-29T23:58:16+09:00</issued>
    <id>tag:www.sutosoft.com,2011:/room//2.1475</id>
    <created>2011-01-29T14:58:16Z</created>
    <summary type="text/plain">リアルタイム組込みシステム という本を読みましたので感想を書いておきます。 </summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>書評</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=wwwsutosoftco-22&o=9&p=8&l=as1&asins=4798112097&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>
<a href="http://www.amazon.co.jp/gp/product/4798112097?ie=UTF8&tag=wwwsutosoftco-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4798112097">リアルタイム組込みシステム</a><img src="http://www.assoc-amazon.jp/e/ir?t=wwwsutosoftco-22&l=as2&o=9&a=4798112097" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
という本を読みましたので感想を書いておきます。
</p>]]>
      <![CDATA[<p>
本書はリアルタイム組込みシステムの基礎、特にマルチタスクについて体系的に取り扱った本です。
<br />
OSを使わないマルチタスクの話も結構あって、全449ページ中、セマフォの話が始るのが168ページ目からでした。
つまりセマフォ以前の話にそれだけページ数を費やしているのです。
<br />
マルチタスクシステムの開発において、OSを乗せた場合と乗せない場合で何がどう違うのか、大変参考になりました。
<br />
またタスク分割のガイドラインも豊富で、すぐに設計に役立てるアドバイスはたくさんありました。
</p>

<p>
OSを乗せるかどうか悩むような世界の組込みシステムを開発している人にはお勧めの一冊です。
</p>

<p>
残念な点としては、英国の研究者が書いた本なので、uItronを扱っていないことです。日本の組込みシステム書籍でこれはどうかと思います。
<br />
また、難解な用語が多く、読み解くには苦労しました。すんなり読める本ではありません。
<br />
ちょっと気合いが必要な本です。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>iOS3.1.3でJpeg画像を読みだしたときにEXC_BAD_ACCESSが起きる問題</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001462.html" />
    <modified>2011-01-16T07:26:19Z</modified>
    <issued>2011-01-16T16:22:29+09:00</issued>
    <id>tag:www.sutosoft.com,2011:/room//2.1462</id>
    <created>2011-01-16T07:22:29Z</created>
    <summary type="text/plain">インターネットからJpeg画像をダウンロードして表示するアプリケーションを開発していたとき、
特定のJpeg画像を読みだしたときにiOS SDK側でEXC_BAD_ACCESSが起きて困ったことがありましたので、
解析結果と対策を書いておきます。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>iOS(iPhone) SDK 4.0</td>
<tr><td>実行環境</td><td>iOS 3.1.3</td>
</table>

<p>
インターネットからJpeg画像をダウンロードして表示するアプリケーションを開発していたとき、
特定のJpeg画像を読みだしたときにiOS SDK側でEXC_BAD_ACCESSが起きて困ったことがありましたので、
解析結果と対策を書いておきます。
</p>
]]>
      <![CDATA[<p>
iOS SDK 4.0で開発したコードを古いiPodのiOS 3.1.3で動かしたときにEXC_BAD_ACCESSが起きました。
iPhone Simulatorでは起きませんでした。
<br />
Jpeg画像については依存性があり、いくつかのJpeg画像(確認した範囲では4つ)で高確率で問題が起きておりましたが、
それらのJpeg画像以外では問題は起きませんでした。
<br />
EXC_BAD_ACCESSが起きている所はコードの以下の場所でした。
</p>

<pre>UIImage *image = [UIImage imageWithContentsOfFile:@&quot;***&quot;];</pre>

<p>
デバッガからバックトレースを取ってみたところ、以下のようになっていました。
</p>

<pre>(gdb) bt
#0  0x3407c2f4 in readCanon1DMKIICustomFunctions ()
#1  0x340653d4 in readProps ()
#2  0x34064d78 in readProps ()
#3  0x34064d78 in readProps ()
#4  0x34064910 in readTiffPropsFromData ()
#5  0x34064828 in readExifData ()
#6  0x34060fd8 in initImageJPEG ()
#7  0x340607bc in _CGImagePluginInitJPEG ()
#8  0x3404e174 in makeImagePlus ()
#9  0x3404dff0 in CGImageSourceCreateImageAtIndex ()
#10 0x331b7438 in _UIImageRefAtPath ()
#11 0x331b71b4 in -[UIImage initWithContentsOfFile:] ()
#12 0x332267f8 in +[UIImage imageWithContentsOfFile:] ()
#13 0x000201a8 in -[ImageFrameView layoutSubviews] () at /***/***.m:110
#14 0x331fa2d8 in -[UIView(CALayerDelegate) _layoutSublayersOfLayer:] ()
#15 0x324ba1c0 in -[CALayer layoutSublayers] ()
#16 0x324b9edc in CALayerLayoutIfNeeded ()
#17 0x324b9844 in CA::Context::commit_transaction ()
#18 0x324b9474 in CA::Transaction::commit ()
#19 0x324c15dc in CA::Transaction::observer_callback ()
#20 0x32407830 in __CFRunLoopDoObservers ()
#21 0x3244f346 in CFRunLoopRunSpecific ()
#22 0x3244ec1e in CFRunLoopRunInMode ()
#23 0x342e91c8 in GSEventRunModal ()
#24 0x331b5c30 in -[UIApplication _run] ()
#25 0x331b4230 in UIApplicationMain ()
#26 0x000029ec in main (argc=1, argv=0x2ffff5c0) at /***/main.m:14</pre>

<p>
なんぞこれ・・・という感じですが、
readExifDataの中で問題が起きていたので、念のためJpeg画像のExifデータを確認してみました。
<br />
結果、特に問題は見つかりませんでしたが、Canon EOS 7D で撮影したJpeg画像であることが分かりました。
</p>

<p>
Canonの画像特有の問題かと思い、Exif編集ソフトでCanonのMakerNoteを取り除いてみたところ、EXC_BAD_ACCESSは起きず
問題は起きなくなりました。CanonのMakerNote読み出しに関するiOS 3.1.3の不具合ではないかと思っています。
</p>

<p>
iOSアプリの方で、imageWithContentsOfFileにデータを渡す前に、Exif編集ソフトがやるようにCanonのMakeNoteを取り除く処理を追加して、
この問題を回避しました。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>組込み開発現場のプロジェクトマネジメント&amp;プロセス改善</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001452.html" />
    <modified>2011-01-10T16:10:53Z</modified>
    <issued>2011-01-11T01:09:59+09:00</issued>
    <id>tag:www.sutosoft.com,2011:/room//2.1452</id>
    <created>2011-01-10T16:09:59Z</created>
    <summary type="text/plain">組込み開発現場のプロジェクトマネジメント&amp;プロセス改善 という本を読みましたので感想を書いておきます。 </summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>書評</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=wwwsutosoftco-22&o=9&p=8&l=as1&asins=4774142212&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>
<a href="http://www.amazon.co.jp/gp/product/4774142212?ie=UTF8&tag=wwwsutosoftco-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4774142212">組込み開発現場のプロジェクトマネジメント&プロセス改善</a><img src="http://www.assoc-amazon.jp/e/ir?t=wwwsutosoftco-22&l=as2&o=9&a=4774142212" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
という本を読みましたので感想を書いておきます。
</p>
]]>
      <![CDATA[<p>
本書は組込みソフトウェアの開発管理に関する課題を取り扱った本です。
<br />
あるべき姿を説くというより、混沌とした開発現場を今よりマシにするための実践的な内容が多く参考になりました。
</p>

<p>
プロセス改善を進めている部門の人は読んでおいても良いのではないかと思います。
改善のヒントが色々書いてありますし。改善を進めていく中で何が大切なのかが良く分かります。
<br />
特に改善目標を設定する人にはお勧めの一冊です。
CMMIレベル3を目指すとか言い出して現場の顰蹙を買わずに済みます。
</p>

<p>
なお、本書を読んで私が次にやってみようと思った取り組みは、
「ソフトウェアの上流設計段階で定めた設計思想を、プロジェクトメンバー全員に理解させること」です。
<br />
私が某事例で上流設計を担当したときは、仕様書は書いたのですが、思惑までは共有できないまま先に進めてしまいました。酷いですね。
その結果、下流設計のあちこちで判断ミスが発生し、余分な工数が突如発生しまくって管理困難な状態になってしまいました。だいぶ反省しました。
<br />
次からは考えを共有する場を設けて進めて行こうと思います。仕様書も思惑が伝わるようにしておいた方が良いですね。
やることたくさんありそうです。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>UINavigationController使用時にフルスクリーン表示する方法</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001434.html" />
    <modified>2010-12-26T05:13:35Z</modified>
    <issued>2010-12-26T14:06:48+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1434</id>
    <created>2010-12-26T05:06:48Z</created>
    <summary type="text/plain">UINavigationControllerを使うと、Viewのサイズが勝手にリサイズされてしまいます。
普段は便利なのかもしれませんが、
ナビゲーションバー(UINavigationBar)やツールバー(UIToolbar)を透明にしたとき、
その裏に描画できなくて困ります。
これを避けて、以下のように画面全体に描画する方法を調べましたので書いておきます。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td>
</table>

<p>
UINavigationControllerを使うと、Viewのサイズが勝手にリサイズされてしまいます。
<br />
普段は便利なのかもしれませんが、
ナビゲーションバー(UINavigationBar)やツールバー(UIToolbar)を透明にしたとき、
その裏に描画できなくて困ります。
<br />
これを避けて、以下のように画面全体に描画する方法を調べましたので書いておきます。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20101226_fullscreen.png" width="414" height="770" alt="フルスクリーン表示" />
</p>
]]>
      <![CDATA[<p>
UIViewControllerにwantsFullScreenLayoutというプロパティがあるので、
それをYESに設定すれば完了です。
</p>
<pre>- (void)viewDidLoad {
  [super viewDidLoad];
  self.wantsFullScreenLayout = YES;
}</pre>

<p>
UIViewControllerがnibに登録されている場合は、以下のようにInterface Builderから設定することもできます。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20101226_wantsfullscreen.png" width="301" height="141" alt="フルスクリーン表示設定" />
</p>

<p>
以上です。
知っていれば簡単ですが、知らないとハマるところではないかと思います。
</p>

<p>
(参考リンク)
<br />
<a href="http://akisute.com/2009/07/iphonephotos.html">A-Liaison BLOG: iPhone付属のPhotos（写真）アプリのような、回転可能な全画面表示ビューを作る方法</a>
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>平成22年度 秋期 システムアーキテクト試験 成績照会</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001430.html" />
    <modified>2010-12-20T13:58:50Z</modified>
    <issued>2010-12-20T22:57:37+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1430</id>
    <created>2010-12-20T13:57:37Z</created>
    <summary type="text/plain">平成22年度 秋期 システムアーキテクト試験 成績照会
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>感想</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
平成22年度 秋期 システムアーキテクト試験 成績照会
</p>
]]>
      <![CDATA[<p>
受験番号 SAXXX-XXXX の方は，合格です
</p>

<table border="1">
<tr><td>午前Ⅰ得点</td><td>***.**点(免除)</td></tr>
<tr><td>午前Ⅱ得点</td><td>88.00点</td></tr>
<tr><td>午後Ⅰ得点</td><td>72点</td></tr>
<tr><td>午後Ⅱ評価ランク</td><td>A</td></tr>
</table>

<p>
2回目の受験にして合格。
<br />
<a href="001150.html">プロジェクトマネージャ試験</a>に次いで2つ目の論文試験合格になります。
<br />
残りの論文試験は、ITストラテジスト試験、ITサービスマネージャ試験、システム監査技術者試験の3つ。
<br />
私の専門領域と被っていたこれまでの試験と違い、これらの試験はほぼ専門外。さてどうしたものか・・・。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>NSString+Geometry</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001423.html" />
    <modified>2011-06-13T14:34:06Z</modified>
    <issued>2010-12-15T01:25:28+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1423</id>
    <created>2010-12-14T16:25:28Z</created>
    <summary type="text/plain">UIViewのframeの状態をコンソールに出力するのが結構面倒でしたので、
以下のようなクラスを作って対応することにしました。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td>
</table>

<p>
UIViewのframeの状態をコンソールに出力するのが結構面倒でしたので、
以下のようなクラスを作って対応することにしました。
</p>
]]>
      <![CDATA[<p>以下がヘッダファイルです。</p>
<pre>//NSString+Geometry.h
#import &lt;Foundation/Foundation.h&gt;

@interface NSString (Geometry)

+ stringWithPoint:(CGPoint)point;
+ stringWithSize:(CGSize)size;
+ stringWithRect:(CGRect)rect;
+ stringWithAffineTransform:(CGAffineTransform)affineTransform;

@end</pre>

<p>以下がソースファイルです。</p>
<pre>//  NSString+Geometry.m
#import &quot;NSString+Geometry.h&quot;

@implementation NSString (Geometry)

+ stringWithPoint:(CGPoint)point {
  return [NSString stringWithFormat:@&quot;%f,%f&quot;, point.x, point.y];
}

+ stringWithSize:(CGSize)size {
  return [NSString stringWithFormat:@&quot;%fx%f&quot;, size.width, size.height];
}

+ stringWithRect:(CGRect)rect {
  return [NSString stringWithFormat:@&quot;%g,%g:%gx%g&quot;,
          rect.origin.x, rect.origin.y,
          rect.size.width, rect.size.height];
}

+ stringWithAffineTransform:(CGAffineTransform)affineTransform {
  return [NSString stringWithFormat:@&quot;[%g %g 0][%g %g 0][%g %g 1]&quot;,
          affineTransform.a, affineTransform.b,
          affineTransform.c, affineTransform.d,
          affineTransform.tx, affineTransform.ty];
}

@end</pre>

<p>
これでUIViewのframeは以下のようなコードで出力できます。
</p>

<pre>UIView *view = ...
NSLog(@&quot;view = %@&quot;, [NSString stringWithRect:view.frame]);</pre>

<p>
もっと簡単な方法はないのですかね・・・。
</p>

<p>
(2010/12/31追記)
<br />
SDKの以下の関数を使うことにより同じことが実現できることが分かりました。
</p>
<ul>
<li><code><em>NSStringFromCGPoint</em><code></li>
<li><code>NSStringFromCGSize<code></li>
<li><code>NSStringFromCGRect<code></li>
<li><code>NSStringFromCGAffineTransform<code></li>
</ul>
<p>
あるものを使った方が良いので上記のNSString+Geometryは使わないことにしました。
</p>

<p>
(2011/06/13追記)
<br />
関数名が一部間違えていたので修正しました。
</p>

]]>
    </content>
  </entry>
  <entry>
    <title>GTMLoggerクラス</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001419.html" />
    <modified>2010-12-13T17:09:33Z</modified>
    <issued>2010-12-13T17:06:00+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1419</id>
    <created>2010-12-13T08:06:00Z</created>
    <summary type="text/plain">Google Toolbox for Macに入っていたロギング用のGTMLoggerクラスを使ってみました。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td></tr>
<tr><td>ライブラリ</td><td>Google Toolbox for Mac 1.6.0</td></tr>
</table>

<p>
<a href="http://www.sutosoft.com/room/archives/001417.html">Google Toolbox for Mac</a>に入っていたロギング用のGTMLoggerクラスを使ってみました。
</p>
]]>
      <![CDATA[<p>
GTMLoggerはNSLogの強化版のようなものです。
</p>

<pre>@implementation XXXAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  GTMLoggerDebug(@&quot;GTMLoggerDebug&quot;);
  GTMLoggerInfo(@&quot;GTMLoggerInfo&quot;);
  GTMLoggerError(@&quot;GTMLoggerError&quot;);
  GTMLoggerAssert(@&quot;GTMLoggerAssert&quot;);
  // 以下略</pre>

<p>
とすると、Debug構成ではコンソールには以下のように出力されます。メソッド名などが付加されています。
</p>

<pre>[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerDebug
[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerInfo
[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerError
[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerAssert</pre>

<p>
なお、Debug構成かどうかはDEBUGマクロで判断しているようですので、以下のようにDebug構成ではプリプロセッサマクロにDEBUGを追加しておきましょう。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20101213_debugsetting.png" width="645" height="633" alt="Debug設定" />
</p>

<p>
Release構成では以下のように出力されます。
</p>

<pre>[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerError
[XXXAppDelegate application:didFinishLaunchingWithOptions:] GTMLoggerAssert</pre>

<p>
DebugとInfoが出力されません。
<br />
Infoについては、以下のように環境変数を書き換えることにより出力することができるようになります。
</p>

<pre>setenv(&quot;GTMVerboseLogging&quot;, &quot;1&quot;, 1);</pre>

<p>
ファイル出力などもサポートされており、デバッグに活用できると思います。
<br />
自前でも似たようなものを作ることはできると思いますが、
こういうものを使っておくと車輪の再発明を避けることができます。
品質も自分が作ったものより高いでしょうから。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>Google Toolbox for Macの使い方</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001417.html" />
    <modified>2010-12-13T17:09:09Z</modified>
    <issued>2010-12-11T18:00:28+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1417</id>
    <created>2010-12-11T09:00:28Z</created>
    <summary type="text/plain"><![CDATA[XMLやHTMLを扱うとき、"&amp;amp;"といった実体参照文字列を、"&amp;"に置き換えたい場合があったので、適当なライブラリがないか調べてみました。
Google Toolbox for Macのgtm_stringByUnescapingFromHTMLを使うのが良さそうだったので、これを導入してみることにしました。
導入手順を参考までに残しておきます。 ]]></summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td></tr>
<tr><td>ライブラリ</td><td>Google Toolbox for Mac 1.6.0</td></tr>
</table>

<p>
XMLやHTMLを扱うとき、"&amp;amp;"といった実体参照文字列を、"&amp;"に置き換えたい場合があったので、
適当なライブラリがないか調べてみました。
<br />
<a href="http://code.google.com/p/google-toolbox-for-mac/">Google Toolbox for Mac</a>のgtm_stringByUnescapingFromHTMLを
使うのが良さそうだったので、これを導入してみることにしました。
<br />
導入手順を参考までに残しておきます。
</p>
]]>
      <![CDATA[<h4>ソースコードの取得</h4>

<p>
インストールパッケージは無いようですので、Subversionを使って直接ソースコードを取得します。
<br />
まずは<a href="http://google-toolbox-for-mac.googlecode.com/svn/tags/">リポジトリのtagsディレクトリ</a>を見て入手するバージョンを決めます。
<br />
私は現時点で最新の1.6.0にしました。
<br />
次はsvnを使ってダウンロードを行います。
<br />
<pre>svn export http://google-toolbox-for-mac.googlecode.com/svn/tags/google-toolbox-for-mac-1.6.0/</pre>
</p>

<h4>プロジェクトへの追加</h4>
<p>
気の利いたやりかたはないようですので、一般的な手順でやることになります。
<br />
最初にソースコードのコメントを読んで必要そうなソースコードを見繕っておきましょう。
GTMDefines.hなど内部的に#importしているソースコードもあるので注意して下さい。
<br />
あとはXcodeのメニューから、プロジェクト→プロジェクトに追加 でソースコードを選択すれば追加できます。
</p>

<p>
以上でお終いです。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>Objective-C@iOSの例外処理</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001413.html" />
    <modified>2010-12-13T17:09:03Z</modified>
    <issued>2010-12-08T23:29:32+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1413</id>
    <created>2010-12-08T14:29:32Z</created>
    <summary type="text/plain">最近Objective-CでiOSのアプリケーションを書いているのですが、ライブラリ的な役割をするコードで異常を検出した際、
呼び出し元への通知に例外処理を使ってよいのかどうかで良く悩みます。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td></tr>
</table>

<p>
最近Objective-CでiOSのアプリケーションを書いているのですが、ライブラリ的な役割をするコードで異常を検出した際、
呼び出し元への通知に例外処理を使ってよいのかどうかで良く悩みます。
</p>
]]>
      <![CDATA[<p>
Objective-Cは例外処理をサポートしていて、構文やサンプルコードは<a href="http://www.google.co.jp/search?q=Objective-C+%97%E1%8AO">ググれば</a>簡単に見つかります。
しかしながら、具体的にどのような異常に例外処理を適用するべきかが良く分かりません。
</p>

<p>
私はこういうときは、標準的なライブラリの挙動を参考にするのですが、
iOS SDKのライブラリを使っていてもあまり例外に遭遇しないので、参考になりません。
</p>

<p>
例えば<a href="http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSString_Class/Reference/NSString.html">NSStringクラス</a>の
文字列を整数に変換するメソッドであるintValueは、整数に変換できない文字列を受けても0を返すだけです。
</p>

<p>
Javaで似たようなことをする<a href="http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Integer.html">Integerクラス</a>のparseIntは、
整数に変換できない文字列を受けてNumberFormatExceptionを投げます。
</p>

<p>
そもそもObjective-Cの仕様として、<a href="http://developer.apple.com/jp/documentation/cocoa/conceptual/objectivec/Articles/chapter_2_section_3.html">nilのメソッドを呼び出しても何もエラーがおきません。</a>
最近はこれを頼りにコードを書いてしまっているので、Javaに移ったらNullPointerExceptionの嵐に悩まされそうでちょっと怖いです。
</p>

<p>
という感じで、例外を受け取ることがあまりないので、どんなときに例外処理を使えば良いのか分からないでおります。
私の書くコードは、メソッドの戻り値でエラーを返すコードばかりです。
さてどうしたものやら。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>HTTPモニタFiddler</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001412.html" />
    <modified>2010-12-04T16:19:47Z</modified>
    <issued>2010-12-05T01:16:08+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1412</id>
    <created>2010-12-04T16:16:08Z</created>
    <summary type="text/plain">HTTPを扱うアプリケーションを開発するとき、 HTTPの生データをモニタするために横取り丸とInetSpyというソフトを使っていました。 </summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
HTTPを扱うアプリケーションを開発するとき、
HTTPの生データをモニタするために<a href="http://www.sutosoft.com/room/archives/000136.html">横取り丸とInetSpy</a>というソフトを使っていました。
</p>
]]>
      <![CDATA[<p>
ところがこれらのソフトはHTTPSをサポートしていないようでしたので、
HTTPSをサポートしている<a href="http://www.fiddler2.com/fiddler2/">Fiddler</a>に切り替えました。
<p>
<a href="http://www.sutosoft.com/room/archives/images/20101205_fiddler.png"><img src="http://www.sutosoft.com/room/archives/images/20101205_fiddler_thumb.png" width="508" height="409" alt="Fiddler" /></a>
<br />
(HTTPSの通信内容を確認しているところ。もちろんコンテンツまでは取れませんが、通信先は分かります。)
</p>

<p>
このソフトはPROXYとして機能しますので、横取り丸とInetSpyの組み合わせと似たような感じで使えます。
<br />
今のところはトラブルはなく便利に使っております。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>UIViewControllerのframe設定</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001411.html" />
    <modified>2010-12-13T17:08:56Z</modified>
    <issued>2010-12-04T02:39:56+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1411</id>
    <created>2010-12-03T17:39:56Z</created>
    <summary type="text/plain">Window-based Applicationプロジェクトを作成して、initWithNibName:bundle:を使ってUIViewControllerを追加して表示しようとすると、
以下のようにInterface Builderの表示とiPhone Simulatorの表示がStatusBarの分ずれることがあります。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td></tr>
</table>


<p>
Window-based Applicationプロジェクトを作成して、initWithNibName:bundle:を使ってUIViewControllerを追加して表示しようとすると、
以下のようにInterface Builderの表示とiPhone Simulatorの表示がStatusBarの分ずれることがあります。
</p>

<table border="1">
<tr align="center">
<td>Interface Builder</td>
<td>iPhone Simulator</td>
</tr>
<tr>
<td><img src="http://www.sutosoft.com/room/archives/images/20101204_interfacebuilder.png" width="200" height="291" alt="Interface Builder" /></td>
<td><img src="http://www.sutosoft.com/room/archives/images/20101204_simulator1.png" width="207" height="385" alt="iPhone Simulator" /></td>
</tr>
</table>

<p>
initWithNibName:bundle:を使った場合はViewの再配置をしてくれないためこうなります。
<br />
(「<a href="http://d.hatena.ne.jp/ryota_ku/20091022/1256239504">Resize View From NIBの意味</a>」に分かりやすく書いてあります)
</p>

<p>
以下のように、UIViewControllerのview.frameを変更することにより、
Interface Builderの表示と合わせることができます。
</p>

<pre>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // ViewControllerはUIViewControllerのSubclass、contorllerは(ViewController *)型のインスタンス変数
  controller = [[ViewController alloc] initWithNibName:@&quot;ViewController&quot; bundle:nil];
  controller.view.frame = [UIScreen mainScreen].applicationFrame;
  [window addSubview:controller.view];
  [window makeKeyAndVisible];
  return YES;
}</pre>

<table border="1">
<tr align="center">
<td>Interface Builder</td>
<td>iPhone Simulator</td>
</tr>
<tr>
<td><img src="http://www.sutosoft.com/room/archives/images/20101204_interfacebuilder.png" width="200" height="291" alt="Interface Builder" /></td>
<td><img src="http://www.sutosoft.com/room/archives/images/20101204_simulator2.png" width="207" height="385" alt="iPhone Simulator" /></td>
</tr>
</table>

<p>
なお、UINavigationControllerを使っているときは、UINavigationControllerが勝手にViewを再配置してくれるようですので、この問題は発生しません。
</p>
]]>
      
    </content>
  </entry>
  <entry>
    <title>libxml2でHTML Parse</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001410.html" />
    <modified>2010-12-13T17:08:51Z</modified>
    <issued>2010-12-03T22:58:27+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1410</id>
    <created>2010-12-03T13:58:27Z</created>
    <summary type="text/plain">iOSでHTML(not XML)を解析(Parse)するコードを書く機会がありましたので、トラブル情報や解決策などをまとめておきます。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS(iPhone) SDK 4.0</td></tr>
</table>

<p>
iOSでHTML(not XML)を解析(Parse)するコードを書く機会がありましたので、トラブル情報や解決策などをまとめておきます。
</p>
]]>
      <![CDATA[<p>
ライブラリはNSXMLDocumentとNSXMLParserとlibxml2あたりを考えてみましたが、
NSXMLDocumentはiOSには無いみたいですし、NSXMLParserは壊れたHTMLを最後までパースできないようでしたので、
消去法でlibxml2を使うことにしました。
</p>

<p>
「<a href="http://ameblo.jp/xcc/entry-10367265989.html">iPhoneアプリ開発、その(143)　libxml2を使ってみる</a>」を参考にプロジェクトにlibxml2を追加し、
<br />
Googleを活用しつつコードを書いていったところ、問題が起きました。
<br />
エラーを無視して解析を続けるオプションで解析しても、途中で解析が止まるのです。
以下のサンプルコードで問題を確認することができます。
<br />
libxml2のバージョンは2.7.3でした。
</p>

<pre>static void startElementHandler(void *ctx, const xmlChar *name, const xmlChar **atts) {
  NSLog(@&quot;startElement name=%s&quot;, name);
}
static void endElementHandler(void *ctx, const xmlChar *name) {
  NSLog(@&quot;endElement name=%s&quot;, name);
}

- (void)test {
  NSData *data = [@&quot;&lt;html&gt;&lt;body&gt;&lt;![if !(lt IE 7.0)]&gt;&lt;![endif]&gt;&lt;/body&gt;&lt;/html&gt;&quot; dataUsingEncoding:NSUTF8StringEncoding];
  xmlParserCtxtPtr parserContext;
  xmlSAXHandler saxHandlerStruct = {0};
  parserContext = xmlCreatePushParserCtxt(&amp;saxHandlerStruct, NULL, NULL, 0, NULL);
  saxHandlerStruct.startElement = &amp;startElementHandler;
  saxHandlerStruct.endElement = &amp;endElementHandler;
  int options = xmlCtxtUseOptions(parserContext, XML_PARSE_RECOVER | XML_PARSE_NOERROR | XML_PARSE_NOWARNING);
  int result = xmlParseChunk(parserContext, (const char *)[data bytes], [data length], 1);
  // ここでresult == 1 (XML_ERR_INTERNAL_ERROR) になる
  // startElementHandler, endElementHandlerは呼び出されない。
  xmlFreeParserCtxt(parserContext);
}</pre>

<p>
以下のようにdataを設定すると、問題はおきません。
</p>

<pre>  NSData *data = [@&quot;&lt;html&gt;&lt;body&gt;&lt;!--[if !(lt IE 7.0)]--&gt;&lt;!--[endif]--&gt;&lt;/body&gt;&lt;/html&gt;&quot; dataUsingEncoding:NSUTF8StringEncoding];</pre>

<p>
HTMLデータの方に問題があるということになるのでしょうが、XML_ERR_INTERNAL_ERRORが起きる理由は良く分かりません。
私のユースケースではHTMLデータを修正できないので、別の方法を探してみました。
<br />
結果、libxml2にあるHTML 4.0 non-verifying parserを使うことで解析できることを確認しました。
<br />
サンプルコードを以下に示します。
</p>

<pre>- (void)test {
  NSData *data = [@&quot;&lt;html&gt;&lt;body&gt;&lt;![if !(lt IE 7.0)]&gt;&lt;![endif]&gt;&lt;/body&gt;&lt;/html&gt;&quot; dataUsingEncoding:NSUTF8StringEncoding];
  htmlParserCtxtPtr parserContext;
  htmlSAXHandler saxHandlerStruct = {0};
  saxHandlerStruct.startElement = &amp;startElementHandler;
  saxHandlerStruct.endElement = &amp;endElementHandler;
  parserContext = htmlCreatePushParserCtxt(&amp;saxHandlerStruct, NULL, NULL, 0, NULL, XML_CHAR_ENCODING_UTF8);
  int options = htmlCtxtUseOptions(parserContext, HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING);
  int result = htmlParseChunk(parserContext, (const char *)[data bytes], [data length], 1);
  // ここでresult == 68 (XML_ERR_NAME_REQUIRED)になる。
  // startElementHandler, endElementHandlerは正常に(それぞれhtmlとbodyで2回ずつ)呼び出される。
  htmlFreeParserCtxt(parserContext);
}</pre>

<p>
htmlParseChunkが返すエラーをどのようにハンドリングすれば良いのか良く分かりませんが、
解析が止まるわけではないので、エラーを無視すれば特に問題は起きないようです。
この方向でしばらくコードを書いてみることにします。
</p>

<p>
しかしC言語業界のHTML Parserの定番って何になるんでしょうね。
XML Parserは実装も情報もたくさんあるのですが、HTML Parserは実装も情報も少なく、調べるのに苦労しました。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>NSURLResponseのexpectedContentLengthの使い方</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001400.html" />
    <modified>2010-12-13T08:11:10Z</modified>
    <issued>2010-11-23T02:59:34+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1400</id>
    <created>2010-11-22T17:59:34Z</created>
    <summary type="text/plain">NSURLConnectionを使ってデータをダウンロードするとき、
ダウンロードデータを格納するNSMutableDataの容量をダウンロードデータのサイズと合わせておこうと思って
NSURLConnectionのdelegateを担うクラスに以下のようなコードを書きました。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>環境</td><td>iOS SDK 4.0</td></tr>
</table>

<p>
NSURLConnectionを使ってデータをダウンロードするとき、
ダウンロードデータを格納するNSMutableDataの容量をダウンロードデータのサイズと合わせておこうと思って
NSURLConnectionのdelegateを担うクラスに以下のようなコードを書きました。
</p>

<pre>- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  long long length = response.expectedContentLength;
  receivedData = [[NSMutableData alloc] initWithCapacity:length];
}</pre>

<p>
そうしたところ、NSMutableDataのinitWithCapacity:が例外で落ちました。
response.expectedContentLengthに-1が入っているようです。
<br />
HTTP Responseからサイズを取得できないときはそうなるようですが、
今時サイズを取得できないようなResponseを返すサーバがあるのかなと思って調べてみました。
</p>
]]>
      <![CDATA[<p>
HTTPのRequestとResponseをキャプチャしたかったので、<a href="http://hide.maruo.co.jp/software/ydm.html">横取り丸 1.98</a>と
<a href="http://hide.maruo.co.jp/software/inetspy.html">InetSpy 1.1</a>を使って、HTTPをモニタできる環境を整え、
iPodのプロキシ設定を変更してRequestとResponseをキャプチャしてみました。
<br />
なお、iPhone Simulatorでプロキシ設定を変更する方法は分からなかったので、実機でしか確認できませんでした。
</p>

<p>
結果、Responseに以下のEntityがあることが分かりました。
</p>

<pre>Content-Encoding: gzip</pre>

<p>
そりゃ圧縮されていたらサイズ分かりませんね・・・。
今時のサーバでは圧縮はよくある話なのでresponse.expectedContentLengthに-1が入るのは納得しました。
</p>

<p>
connection:didReceiveResponse:は以下のように書き直しました。
</p>

<pre>- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  const int MAX_INIT_SIZE = 100 * 1024 * 1024;
  long long length = response.expectedContentLength;
  if (length &lt; 0 || length &gt; MAX_INIT_SIZE) {
    length = MAX_INIT_SIZE;
  }
  receivedData = [[NSMutableData alloc] initWithCapacity:length];
}</pre>

<p>
response.expectedContentLengthに-1が入ってきた場合にも対応し、
さらに上の方も100KBで制限をかけることにしました。いきなり大きなサイズにするのも気がひけたからです。
<br />
これでデータのダウンロードもスムーズになるのではないかと思います。(本当になるかどうかは確認できませんでしたが)
</p>

<p>
以下はおまけですが、InetSpyでは、gzipで圧縮されたファイルしか取れないため、展開後のデータを確認できません。
<br />
確認するためにPerlスクリプトを作成しましたので、参考までにコードを置いておきます。
</p>

<pre># 参考コード: http://www.tohoho-web.com/perl/encode.htm
use strict;
use Compress::Zlib;

die &quot;Usage: gzip [IN_FILE] [OUT_FILE]\n&quot; if ($#ARGV &lt; 1);
my $infile = $ARGV[0];
my $outfile = $ARGV[1];
my $indata;
my $outdata;

open(IN, $infile) || die &quot;Can't open $infile.\n&quot;;
binmode(IN);
read(IN, $indata, (lstat(IN))[7]) || die &quot;Can't read $infile\n&quot;;
close(IN);

open(OUT, &quot;&gt; $outfile&quot;) || die &quot;Can't open $outfile.\n&quot;;
binmode(OUT);
print OUT Compress::Zlib::memGunzip($indata);
close(OUT);</pre>
]]>
    </content>
  </entry>
  <entry>
    <title>新PCを購入</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001234.html" />
    <modified>2010-08-24T18:13:33Z</modified>
    <issued>2010-08-25T03:07:02+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1234</id>
    <created>2010-08-24T18:07:02Z</created>
    <summary type="text/plain">先日壊れたサーバPCとして今のゲーム用PCを割り当て、
ゲーム用PCは新しく組み立てることにしました。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>感想</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<a href="http://www.sutosoft.com/room/archives/001181.html">先日壊れたサーバPC</a>として今のゲーム用PCを割り当て、
ゲーム用PCは新しく組み立てることにしました。
</p>
]]>
      <![CDATA[<p>
<img src="http://www.sutosoft.com/room/archives/images/20100825_parts.jpg" width="320" height="213" alt="パーツ" />
<br />
大体こんなパーツを買って来ました。
</p>

<p>
<img src="http://www.sutosoft.com/room/archives/images/20100825_pc.jpg" width="320" height="213" alt="完成品" />
<br />
組み立てました。
</p>

<p>
新PCのHDBENCH結果。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20100825_hdbench_new.png" width="546" height="318" alt="新PCのHDBENCH" />
<br />
いまどきのベンチマーク事情を良く知らなかったのでとりあえず知っている奴を使いました。

<p>
こちらは旧PCのHDBENCH結果(参考)
<br />
<img src="http://www.sutosoft.com/room/archives/images/20100825_hdbench_old.png" width="546" height="315" alt="旧PCのHDBENCH" />
<br />
これよりだいぶ速くなったようです。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>2TB HDD</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/001216.html" />
    <modified>2010-08-14T02:11:40Z</modified>
    <issued>2010-08-14T11:07:47+09:00</issued>
    <id>tag:www.sutosoft.com,2010:/room//2.1216</id>
    <created>2010-08-14T02:07:47Z</created>
    <summary type="text/plain">パソコンの内蔵HDDの容量が足りなくなってきましたので、ST32000542ASという新しい2TBのHDDを買いました。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>感想</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<img src="http://www.sutosoft.com/room/archives/images/20100814_hdd.jpg" />
<br />
パソコンの内蔵HDDの容量が足りなくなってきましたので、ST32000542ASという新しい2TBのHDDを買いました。
</p>
]]>
      <![CDATA[<p>
記念にHDBENCHで性能比較をしましたので結果を書いておきます。
</p>

<p>
HDBENCH Ver 3.30 100MB設定で新しい2TBのHDDとこれまで使用していた古い500GBのHDD(ST3500630AS)の性能を測定。
</p>

<table border=1>
<tr><th>機種</th><th>Read</th><th>Write</th><th>Copy</th></tr>
<tr><td>ST32000542AS(新しい2TBのHDD)</td><td>125953</td><td>102296</td><td>5342</td></tr>
<tr><td>ST3500630AS(古い500GBのHDD)</td><td>46779</td><td>33772</td><td>2696</td></tr>
</table>

<p>
新しいHDDが3倍位速いようです。
カタログスペックでは、回転速度は新しい2TBのHDDが5900 rpm、古い500GBのHDDが7200 rpm と落ちていますが、性能差は記録密度の違いから来ているんでしょうかね。
</p>

<p>
<img src="http://www.sutosoft.com/room/archives/images/20100814_capacity.png" />
<br />
実容量は2,000,396,288,000バイト。
<br />
1TB=1024x1024x1024換算だと1.81TBになってしまうのは若干損した気分ですが、
1TB=1000x1000x1000バイト換算でぎりぎり2Tに到達できているのはメーカの容量ターゲットがそこなのだからでしょうね。
</p>
]]>
    </content>
  </entry>

</feed>
