大学の授業で自宅のネットワークのトポロジ図を書けという課題が出たので、Visioの試用版を使い、見よう見まねで書いてみました。ちゃんとした書き方は教わっておらず、「思うように書け」ということだったので、おかしなところも多いでしょうが。。
こうしてみると、結構充実してますね。。 ここ一年ぐらい、自室の機器の増設にバイト代のかなりを注いでいて、気がついたこんな状態でした。
最近の変更としては、FreeNASを入れたNEC Express5800/GT110aを追加し、iSCSI Targetとして動かし始めたことでしょうか。また、それにあわせてGbE対応スイッチを無線イーサネットコンバータの下に設置し、自室内での通信をギガビット化しました。NEC Express5800/GT110aは、NEC製の激安PCサーバー。ほんと安いですねぇ、一万円台とは。NICがGbEに対応しているファイルサーバーが必要だっただけなので、これで十分です。これを買うに当たっては、ML115にも心惹かれたのですが、その時たまたまNTT-Xで品切れだったことから、今回は見送り(泣)。とまれ、これに1TBのHDD*2をRAID1を組むために増設し、FreeNAS 7.0RC1を入れれば立派なiSCSI Targetの出来上がりです。ZFSもサポートされているので、よくZFSはわかっていないのですが、使ってみています。
FreeNASでiSCSIターゲットを作って何に使っているかというと、先日構築したVMware ESXiのDataStoreとしています。VMware ESXiはハイパーバイザ方式で動作が軽いので、ついついVMを追加してしまうのですが、そうやってVMをたくさん作っていると、あっという間にHDDが食いつぶされていきます。もともと500GBのHDDを内蔵させて自作したマシンなのですが、ケースがShuttleのCube型ベアボーンなので、HDDを増設する余裕がありません。そこで、熱源を少しでも外に出す意味でも、またRAIDを組むためにも作ってみました。
ちなみにGbE対応スイッチは、NETGEARのGS2108A。折角iSCSI Targetを構築したのに、100BASE-TXでリンクアップしているのでは、USB接続のドライブにも劣る!ということで購入。金属筐体の方が良いとは聞きますが、8portで\4000切ってますし、三年保証さえついているので、アタリだったかなと考えています。
Windows 7発売記念プロモーションの一環としてBURGER KINGから期間限定で発売されたWindows 7 WHOPPER食べてきました。
これ、隣に置いてあるのiPod Touchなんだぜ…。どんだけ大きいんだ。
完食した自分偉い。よく頑張った。。
良い良いと巷で人気のiPhone/iPod Touch。いったいどれほどのものかということで、つい新iPod Touch 32GB買ってしまいました。いやホント良いですねコレ。Windows Mobileのもっさり感に慣らされた身としては、どうしてこれほどヌルヌルUIが反応するのか不思議でなりません。これがGPUのサポートの威力なのでしょうか。。
本当に生活スタイルを変化させるシロモノで、移動中はほぼiPod Touchを弄っています。様々なアプリの中でも、一番気に入っているのはBylineというRSSリーダー。Google Readerと同期が可能なRSSリーダーで、エントリのパーマリンクが紐付けられたページのキャッシングにも対応しているタイプのものです。朝、家を出るまでにWifiにぶら下がって新着のエントリをダウンロードしておき、通学中にバシバシRSSの消化を行い、大学に着いたら、同じくGoogle Readerと同期させているFeed DemonというRSSリーダーで残りや、詳しく読み込む必要のあるエントリを消化するというサイクルを確立することが出来ました。
一応E-Mobile版Touch Diamondの方にはWifi Routerという、Windows Mobile端末を無線LANのAP化するアプリを入れ、移動中もネットが使えるようにしているので、カメラがない以外はiPhoneっぽいことが出来るようにしているので中々快適です。
ただ、不満もないわけではなく、例えば、マルチタスクをサポートしていないのは残念な点です。上でBylineのキャッシングについて述べましたが、Bylineがキャッシュを作成している間にも、並行して他のアプリにキャッシュを作らせるというようなことが出来ないのが不便です。Bylineの同期作業が終わるのを待って、GNReaderなり、他のアプリを起動しなければならないわけですから。この点では、Androidの方が自分の好みに合ったつくりになっていると聞いているので、期待したいものです。
みんな大好きWordPress。だからこそ、データが飛んでしまうのはなんとしても避けたいもの。そのためには、常日頃からデータのバックアップを取っておくのが重要なのですが、いちいち手動でバックアップするのは手間なので、なるべく自動化しておきたいものです。バックアップしたいのは次の二つ:アップロードしたファイルとMySQLのダンプ。そこで、UNIX環境の勉強がてら、今このブログが設置されているXREAのサーバーから、ローカルに立てたサーバへ自動的にバックアップする体制を整えてみることにしました。今回のエントリではその方法をまとめてみました。
処理の流れ
今回XREAのサーバーに設置したWordPressのデータをバックアップするにあたっては、まず、XREAのサーバー側で、MySQLのデータをダンプし、圧縮をかけてファイルとして保存する、という処理を行います。その上で、ローカル側に設置したサーバーで、ryncという差分コピー可能なコマンドをつかい、SSHを通じてサーバーからMySQLのダンプしたデータや、アップロードした画像、WordPressの本体やプラグイン、テーマをひっくるめて同期します(Pull)。そして同期したディレクトリを元に、pdumpfsを使い世代別バックアップを作成します。この処理をcronで毎日実行してやるという流れです。
このように今回はcronやrsyncを使うために、ローカル側に、毎日その時間に起きているUNIXなマシンが必要になります。そのため今回のエントリは、ファイルサーバーにするなどで自宅サーバーを運用している人以外にはハードルが高いかも知れません。ただ、起きっぱなしのサーバーが家に一台あれば、前述のようにファイルサーバーに出来るなど何かと便利ですので、これを機に、自宅サーバー構築に手を出してみるのもおススメです:D 遊んでいるマシンがあるなら、それにLinuxを入れてしまうとか、遊んでいなくても常時起こしておけるWindowsマシンがあれば、VirtualBoxを入れてその中でLinuxを動かすとか、色々方法はあります。
バックアップ手順
まずは下ごしらえ。ローカルのサーバーからリモートのサーバー(XREA)に対して操作を行うわけですが、そのためにはSSHで接続できるようにしなければなりません。XREAへのSSHでの接続については、こちらのhiromasaさんの記事を参照。但し、今回は、バックアップの自動化が目的なので、そのプロセスで手動でのパスワードの入力を求められるのは困るので、パスフレーズを空にした鍵による公開鍵認証を使います。ssh-keygenを使ってローカルのサーバーで鍵ペアを作り、公開鍵をリモートのサーバー(XREA)に配置しましょう。鍵ペアの作り方についてはssh にてパスワードを使用しないでログインする方法を参照。
次にMySQLのダンプと圧縮。と言っても、難しいことは何もありません。これについてもhiromasaさんが既にサーバー側のcronで定期的にMySQLをダンプする方法についての記事を書かれています。これを使わせてもらいましょう。今回は、pdumpfsで世代別バックアップを取っているので、日付別に保存しないように改変したものを以下に示します。
#!/bin/sh
# 設定(ここを自分に合わせる)
DATABASE=
DBUSERNAME=
PASSWORD=
XREAUSERNAME=
BACKUPDIR=
KEEPDAY=14
# 初期化(XREA/CORESERVER用)
PREFIX=mysql
SERVER=localhost
NOWDATE=`date +%Y%m%d`
DESTDIR=/virtual/$XREAUSERNAME/$BACKUPDIR
# DUMPFILE=$PREFIX.$NOWDATE.dump
DUMPFILE=$PREFIX.dump
# TARFILE=$PREFIX.$NOWDATE.tar.gz
TARFILE=$PREFIX.tar.gz
OLDDATE=`date "-d$KEEPDAY days ago" +%Y%m%d`
# MySQLダンプ/圧縮
cd $DESTDIR
/usr/local/mysql/bin/mysqldump $DATABASE --host=$SERVER -u $DBUSERNAME --password=$PASSWORD > $DUMPFILE
tar zcvf $TARFILE $DUMPFILE
# 処理判定
if [ $? != 0 -o ! -e $TARFILE ]; then
echo "backup faild -- ($DUMPFILE)"
exit 1
fi
# 圧縮前ファイル削除
rm -f $DUMPFILE
# n日ローテートを削除
#rmfile=$DESTDIR/$PREFIX.$OLDDATE.tar.gz
#if [ -e $rmfile ]; then
# rm -f $rmfile
#fi
cronの設定をしない以外は、記事の通りにXREAのサーバーに配置し、設定を書き換えてやれば大丈夫です。では、試しにSSHを通じてコマンドを発行し動かしてみましょう。ローカルのサーバーで以下のコマンドを実行してみましょう。
ssh -i <秘密鍵へのパス> <XREAのユーザー名>@<サーバ名> <hiromasaさん製スクリプトへのパス> #ウチの環境だと以下のようになります。 ssh -i ./nopass sharplab@s333.xrea.com /virtual/sharplab/backup-mysql/mysqlbackup.sh
動きましたか?動かない?SSHの接続が拒否された?それはもしかすると、XREAのサーバーにホスト情報を登録し忘れているせいかもしれません。hiromasaさんの先ほどの記事を参考に登録を行ってみましょう。
さて、とりあえず手動で登録すればよいことは分かりましたが、登録の有効期限は30日間だけに限られています。また、出先でSSHで繋ぐために別のIPアドレスを登録した場合、上書きされてしまい、再度登録しないと繋がらなくなってしまいます。そのため、ホスト情報の登録も自動化する必要があります。そこでこんなスクリプトをPythonで書いてみました。
#!/usr/bin/env python
# vim:fileencoding=utf_8
import sys
import urllib
import re
#ここを書き換えてください
server = ''
username = ''
password = ''
ipaddressResponder = ''#'http://scripts.sharplab.net/ipaddress.php'//←ウチの場合
adminURL = 'http://%s/jp/admin.cgi' % server
try:
ipRes = urllib.urlopen(ipaddressResponder)
ipaddress = ipRes.read()
except:
print u'Failed'
sys.exit()
pattern = re.compile('\d+\.\d+\.\d+\.\d+')
if pattern.match(ipaddress) == None:
print u'Failed'
sys.exit();
values = {'id':username, 'pass':password,'remote_host':ipaddress,'ssh2':'SSH登録'}
data = urllib.urlencode(values)
print u'Registing ipaddress(%s)...' % ipaddress
response = urllib.urlopen(adminURL,data)
try:
response.read().decode('shift_jis').index(u'データベースに追加しました。反映には5〜10分程度掛かります。')
print u'Complete!'
except ValueError:
print u'Failed.'
まず、前もって接続してきたホストのIPを返すPHPのページをサーバーに設置し(ipaddressResponder)、そこにアクセスすることでホストのIPアドレスを調べています。PHPのページのソースはこう。
<?php
echo getenv("REMOTE_ADDR");
?>
その上で、調べたホストのIPとユーザー名、パスワードをホストの登録ページにPOSTするだけの簡単なお仕事です。Cookieとか憶えないといけないかなと思ってPython Mechanize使おうとしたのですが、必要なかったです(笑)
さて、ここまでで、SSHを通してサーバー側でMySQLをダンプする処理と、SSHのためにホストを自動登録するスクリプトの準備が出来ました。では次はいよいよ本題、rsyncによるファイルのバックアップです。rsyncによるリモートバックアップは、リモートとSSHで繋げ、リモートにもrsyncが入っていれば使えると記憶していますが、XREAはどちらも満たしています。他のレンタルサーバーでも、SSHで繋げるところなら使えるところはあるかと思います。
ではrsyncのコマンドを。
<rsyncへのパス> -avz --delete -e 'ssh -i <秘密鍵へのパス>' <XREAのユーザー名>@<サーバー名>.xrea.com:<バックアップしたいディレクトリへのパス> <同期先へのパス> #ウチの環境だと以下のようになります ./rsync/rsync -avz --delete -e 'ssh -i ./nopass' sharplab@s333.xrea.com:/virtual/sharplab/ ./sharplab/workspace
これでXREAのサーバーとローカルのサーバーの中身を同期させられます。rsyncは更新のあった差分のみをやり取りするので二度目以降は効率が上がるのが嬉しいですね!
そしてpdumpfs。同期したフォルダをソースに、世代別バックアップを作ってやります。pdumpfsはハードリンクを活用しているので、毎日世代別バックアップを取っても、更新がかかったファイル分位しか必要とする領域が増えないので使うのに気が楽ですね。
pdumpfs <ソースディレクトリ> <バックアップ先ディレクトリ> //ウチの環境だと以下のようになります pdumpfs ./sharplab/workspace/ ./sharplab/backup/
ではこれらをまとめた上でcronに登録してみましょう。
まずバックアップ処理手順をまとめたスクリプトを作成します。
#サーバーに配置したMySQLのダンプ&圧縮スクリプトを起動 ssh -i <秘密鍵へのパス> <XREAのユーザー名>@<XREAのサーバー名>.xrea.com <hiromasaさん作のスクリプトへのパス> #サーバー全体をworkspaceディレクトリと同期 <rsyncへのパス>/rsync -avz --delete -e 'ssh -i <秘密鍵へのパス>' <XREAのユーザー名>@<XREAのサーバー名>.xrea.com:<バックアップ対象としたいディレクトリへのパス> <一時保存先のディレクトリへのパス> #pdumpfsで世代別バックアップ pdumpfs <一時保存先のディレクトリ> <バックアップ先>
そしてこれを毎日呼び出すようにcronを設定します。
HOME=<registHost.pyやbackup.shを配置したディレクトリ> #毎日午前四時 SSHを使うにあたり、ホスト情報をXREAに登録 0 4 * * * <registHost.pyやbackup.shを配置したディレクトリ>/registHost.py #毎日午前四時十分 XREAのバックアップの本処理 10 4 * * * <registHost.pyやbackup.shを配置したディレクトリ>/backup.sh
さて、最後に忘れちゃいけない作業があります。
それはバックアップのリストア作業のテスト。バックアップをとったは良いけど、実はうまく取れていなくて、いざ必要になった時に使い物になりませんでしたでは悲しすぎます。忘れずにリストア出来るか確認しておきましょう。お疲れ様でした!
以前あげたC# .NETアプリケーション開発 徹底攻略 Listing2.26への疑問 – SharpLab.というエントリに対して、なちゃさんから、
なちゃ 09-09-23 09:15:19 JST
本来、デリゲートでBeginInvokeした場合は、必ずEndInvokeする必要がありますね。
リソースリークなども発生する危険があります。
※デリゲート以外でもBegin~系は基本的には同じですがEndInvokeさえすれば、きちんと発生した例外がスローされてきます。
けして例外が握りつぶされているのではなく、正しく使っていないために握りつぶされているように見えているだけですね。
ちょっと書籍の記述がまずいと思います。
という指摘がありました。なるほど!指摘の通り、Begin EndパターンなのでEndInvokeを必ず呼び出す必要がありました。恥ずかしながらすっかり失念していました。。というわけでEndInvokeを使うように修正。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;
namespace SharpLab.ThreadExceptionTest {
static class Program {
static Form form;
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main() {
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form = new Form();
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
MessageBox.Show(e.Exception.Message);
}
static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
Exception ex = (Exception)e.ExceptionObject;
MessageBox.Show(ex.Message);
Application.Exit();
Environment.Exit(0);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace SharpLab.ThreadExceptionTest {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private delegate void SampleDelegate();
private void button1_Click(object sender, EventArgs e) {
SampleDelegate a = new SampleDelegate(ThreadMethod);
a.BeginInvoke((asyncResult) => {
a.EndInvoke(asyncResult);
}, null);
}
private void ThreadMethod() {
//意図的に起こした例外
Thread.Sleep(5000);
throw new Exception("非同期スレッドで起こった例外です。");
}
}
}
こんな感じでしょうか。ちゃんとサブスレッドで例外が発生した時にUnhandledExceptionが呼び出されるようになりました!これで正しく確実な終了処理ができそうです。サブスレッドの処理内容をすべてtry~catchで括って必要に応じて例外をリスローする必要があると憶えていたのですが、そうではなかったのですね。いつもtry~catch書きながらなんかおかしい気がしていたのですが、これですっきりしました。なちゃさん、ありがとうございました。
前のエントリで紹介したWebkit.NETはまだC#などのコードからDOMにアクセスする方法は実装中であるため、正式には提供されていません。提供されているのは基本的なナビゲーションなどに限られています。そのため、出来ることは相当制限されています。がしかし、表示されているページの中でJavaScriptのコードを実行させる方法がForumに上がっていましたので紹介します。これがあれば多少の助けにはなりそうです。
ソースコードはこんな感じ。
private void button1_Click(object sender, EventArgs e) {
FieldInfo fi = typeof(WebKitBrowser).GetField("webView", BindingFlags.NonPublic| BindingFlags.Instance);
WebView webView = (WebView)fi.GetValue(this.webBrowser1);
webView.stringByEvaluatingJavaScriptFromString(@"document.body.innerHTML = 'Hello Webkit DOM!';");
}
リフレクションを使っています。WebKitBrowserにはwebViewというprivateなメンバがあり、それはWebViewインターフェイスを実装しています。このwebViewをリフレクションで取得し、そのメンバにstringByEvaluatingJavaScriptFromStringというJavaScriptコードを引数として渡してやると実行してくれるメソッドがあるので、これを利用するという方法です。このメソッドの戻り値の型はstringなのですが、実行結果を取得することはどうもできないようです。 WebViewの他のメンバの実装がどれぐらい進んでいるかはまだ試していないのでわからないのですが、WebViewについては、Webkitですし、Cocoaのリファレンスを参照するとよさそうな感じがします。
「C#凄い使いやすくて良い言語なんだけど、WebBrowserコントロールは残念だよなー、Trident最近頑張ってるんだけどWebkitとかに比べるとまだまだだよなー」とか常日頃から感じていたのですが、ふと「WebkitをC#から扱うためのラッパーとか探せばあるんじゃね?」という思いつきで「Webkit .net」とググってみると、ありましたありました、「Webkit.NET」というまんまなタイトルのプロジェクトが。オープンソース恐るべし。コンパイル済みのバイナリと共に、サンプルアプリがあったので実行してみました。
・・・なにこれ凄い。日本語も全く普通に通りますし、普通に使えそうです。というわけで自分でもテスト用にWinFormsプロジェクトを作って動かすテストをしてみたので、メモを残しておきます。
まず、WebKit.NETライブラリをWebKit .NET | Get WebKit .NET at SourceForge.netからDLしてきます。その中のbinフォルダ内のファイルがライブラリを構成しています。WebKitBrowser.dllがC#から参照するラッパーです。
まず、WebKitBrowserをツールボックスに追加してやります。ツールボックスのコンテキストメニューの「アイテムの選択」という項目をクリックします。
この際、ダイアログが表示されるまで、めちゃ重たいかもしれませんが、ぐっとこらえましょう。
そして参照ボタンをクリックして、WebKitBrowser.dllを選択してやれば、ツールボックスにWebKitBrowserが追加されます。
あとは普通にコントロールをポトベタしておわり…でもありません。。
まず、プロジェクトのプロパティから、プラットフォームターゲットをx86に設定します。Webkitは、現在、x86版のみ提供されているそうです。 ![]()
続いて、デバッグのタブにある、「Visual Studio ホスティング プロセスを有効にする」という項目のチェックを外します。Visual Studioホスティングプロセスは、Visual Studioでのデバッグを効率化させるためのもののようですが、今回のようにアンマネージドコードを連携する場合は上手く働かず、エラーの原因になることがあるようです(Visual Studioホスティングプロセスの解説:VSホスト・プロセス(*.vshost.exe)とは何か?[VS 2005のみ、C#、VB] - @IT)。これが原因のエラーにぶつかって、@JZ5さんに助けを求めたところ、このオプションを教えていただけました。ありがとうございました。
こうしてビルドした上で、最後に仕上げに、ビルドして出来た実行ファイルやWebKitBrowser.dllと同じディレクトリに、Webkit本体であるWebkit.dllや、その依存するdll群を放り込みます。ビルド後のイベントでコピーするコマンドを発行してやると良いようです。
というわけで出来ました。よいよい。素晴らしい。DOM周りのメンバの実装が未だらしく、出来ることは結構限定されていますが、Monoでも動かせるようにしたいよねー、とREADMEに書かれていたりと、これからの進展に期待したいプロジェクトです。
涼しくなってきましたね。秋です。物欲の秋です!
夏にしていた頼まれ仕事が落ち着いて、普段しているバイトとあわせて財布に結構余裕が出てきたので、物欲がどんどん膨らんできている今日この頃です。
ラップトップ
今買いたいなぁと思っているのはまずラップトップ。何しろ10/22にWindows 7が一般向けにリリースされますし、Visual Studio 2010はWPF化されてやたら重くなりそうなので、そろそろラップトップを買い替えたいなぁと思っています。買い換える上で基準としたいのは、処理速度、堅牢性、携帯性、適度な画面サイズです。
今気になっているのはThinkPadのX200とVAIO Type Z。ThinkPadは大学の研究室に結構あり、触れてみる限りでは確かに噂通り頑丈で良さそうな印象を持っています。逆にVAIOは、現在使っているVAIO Type SZから判断するに、結構軟弱です。機嫌よく動いていてくれている時は良い機種なのですが、故障が多く、かなり修理に出費を強いられたのは苦い思い出です。まぁSonyは延長保証(\15,000程)さえ入れば3年間無償修理をしてくれるので、今度はそれに入っておけば問題にならないかなぁと。。
ちなみに筐体で言えば、MacのUnibodyは正直無いなぁと思っています。結構周りでぶつけた拍子にMBPの角が凹んでしまった人を見かけますし、Airは筐体が歪んで机に置いたときにがたつく様になったという話も聞きます。その上延長保証サービスであるAppleCare Protection Planは¥31,500もしますし(そんなに故障率が高いのか?)。。表面的なカタログスペックや見てくれは立派なんですが、ちょっとMacBookは、ねぇ。。
話をThinkPadに戻すと、やはり携帯性を考えると、モバイル最重視のXシリーズっていいなぁと。画面サイズで言えばX301が13.3インチで1.5kg程と一番望ましく感じられるのですが、CPUが低電圧版なのが気にくわないところです。低電圧版はバッテリの持ちは良くなりますが、値段が跳ね上がり、処理性能は落ちます。自分はたとえバッテリの持ちが悪くなっても通常電圧版CPUであってほしいと考えるタイプなので、やはり画面の小ささは我慢してX200なのかなぁと。
頑健さでいえばLet’s Noteがありますが、こちらは全てのモデルのCPUが低電圧版、超低電圧版に限られているので、これも自分的にはないなぁと。
一方VAIO。Type Z、以前は30万越えは普通というとてつもなく高いシリーズというイメージがありましたが、最近はSSD他の値段の下落に応じてか、20万半ば頑張って捻出すれば十分すぎる性能のモデルが手に入るようになってきたようで、心惹かれるものがあります。画面サイズは13.1インチあり、重量は1.6kg、CPUは通常電圧版と、カタログスペックは非常に素敵です。
ただ、じゃあType ZかX200を買うかというと、まだ迷っていて、というのはコードネームCalpellaとかいうモバイル向けCPUが出てくるそうですし、それにあわせたモデルチェンジをまってみるのもいいかなぁと考えています。なかなか、腹が括れません。。
ハンディデバイス
それより、いま一番買おうかと悩んでいるのがiPod Touch。自分はApple教信者じゃないので、iPhoneは買わずにきました(アプリ開発にMacが要るのが気にくわなかった)。ですが、これだけiPhone/iPod Touchのアプリが揃ってくると流石に興味が出てくるもので、アプリは書けないものの、おもちゃとして買ってみようかなぁと考えています。本当はiPhone 3GSがGPSやカメラなど各種機能が一番統合されていて便利なのでしょうが、今手持ちのTouch DiamondにE-Mobile公認の機能としてあるラップトップとのテザリング機能を手放す気にはなれないので、iPhoneを買うのではなく、iPod Touchを買い、Touch DiamondとiPod TouchをWifiかBTで結んで使ってみるという絵図を描いています。
Appleが出すと噂のタブレットも気になって入るのですが、登場時期が早くとも年明け以降と予測されていて、結構まだ時間が空いていること、出たとしても結構値が張りそう、タブレットだと片手で歩きながら弄れるサイズではない、ということを理由にiPod Touchの方が自分には合っているのだと自分に言い聞かせています(笑)。(しかし、タブレットが出たとして、通信モジュールはどうなるんでしょうね?Touch以上にインターネットへの接続が重要なデバイスになりそうですが、Expressカード型などの通信カードに頼るのか、WiMAX/Wifiモジュールを内蔵するのか、3Gを内蔵するのか、結構興味があります。USBドングルやExpressカード型の通信カードをぶっさすスタイルは見てくれがスマートじゃないのでJobsが嫌いそうなものですが。。)
まぁ、というわけで、これから数カ月は節制生活に入ります。。買ってやるぞー!