2007年11月27日火曜日

Ubuntu NAS

噂のPC Japan 2007年 12月号付録のUbuntu 7.04 PCJapan NAS Editionを古くて使わなくなったPCに入れてみました。
Osはlinuxだけど、インストールは簡単でした。インストール後の設定もwebブラウザで行えて、ま~ま~簡単(雑誌に書いてあるとおりの事をやるだけの場合)

マシンスペックは
CPU : Athlon 700MHz
Mem : 128MB
HDD : 40G
Video : AGP
LAN : 100Base
Power : 140W


NASは他に使ったこと無いのでスピードは早いか遅いか?良くわからないです。どうせLANが100Baseでクライアントは54Mbpsの無線LANなので関係ないと思いますが
Ubuntuベースですが、ウィンドウシステムとかは入ってないので128MBのメモリーでもOK?かもって思います

それよりも消費電力が気になりました。NASだけに常時電源をOnにしておくものだと思いますが、ちょっと常時Onは厳しいような。GeodeNxみたいな省電力CPUとマザーを用意したくなりましたが、手持ちのパーツを流用するという趣旨から離れていくので止めときました。

そんなことより一番の問題は、筐体が無い事でした。ケースだけは中身が入れ替わっても使い続けられるので、余りパーツには筐体が無いのですよね。
ケースだけ買っても5~6千円はするので、無駄な出費というか、そこまでする気にはなれないので、今のところとりあえずベニヤ板に裸俗っぽくネジ止めしてます。ちゃんとケースに入れないと音がうるさいです。

電源は500円で売っていたアウトレット品を買いました
ベニヤ板400円で総額900円ってとこです

遊ぶにはいい感じでした、ちょっとした日曜大工的な工作も楽しめたし

2007年11月21日水曜日

ファイナル・カット

ブレードランナー ファイナル・カットが上映中らしい

学生の頃にディレクターズ・カットを当時どうしても見たくて、誘った友人皆に断られたので一人寂しく見にいったのを思い出しました。それでも、劇場で見ることができて感動したものです。

その後DVDでディレクターズ・カットは購入しましたが、たしかパッケージには最終版と書かれていたはずだけど、ファイナルカットってどういう事?なんでしょう

ファイナル・カット見に行きたいけど、見に行くのは無理だろうなと
いろんな障害を乗り越えてでも見に行く価値があるか?微妙な気がしてます。いったい何が違うのだろうか?そこが判らないと見に行けないし、判ってしまうと見に行かない様な気もするし

さらにDVDボックスが発売される
【10,000セット限定生産】『ブレードランナー』製作25周年記念 アルティメット・コレクターズ・エディション・プレミアム(5枚組み)
フィギュア はいらないけど欲しい。DVD5枚組といっても殆ど同じ内容のものが5枚なんでしょと思う、でも欲しい。マニアじゃないけど欲しい。多分買わないけど...

そんな余裕ないしねぇ。どっかからお金が降ってこないかなぁ

2007年11月19日月曜日

晩御飯

今日は嫁さんが仕事で名古屋まで行ってしまって、明日まで帰ってこないので、ひさしぶりに晩御飯を作りました。
チョッと前に「鶏皮せんべい」を10分以内に60円で作る記事を見て以来、鶏皮せんべいが気になって仕方なかったので実践してみました。鳥皮だけは売ってなくてモモ肉を買ってきて皮と肉を分離して作ったら、ちょっぴりしか出来なかった。でも、旨かったです。子供も美味しいといってくれた。最初は脂が出てくるか心配したけどびっくりするくらい油がとれました
その後、あまった鶏肉と脂でチャーハンを作りました。
お父さんはチャーハンだけは上手だね、と子供に言われたけど喜んでいいのやら
これからは嫁さんが家を空けることが多くなりそうなので、チャーハン以外に作れるようにならなきゃいけないなぁと思いましたとさ

10分で作れるナントカ~ みたいなのをもっと探さねばなぁ

2007年11月13日火曜日

ワンセグ見るならgigabeat

TOSHIBA gigabeatV MEV30E(W)

これってWindowsMobileベースのOSなんですよね Portable Media Centerだとか

あっちこっちで投売り状態ですね

今 amazon で60%off 19800円は買いだ!!と言う気持ちを抑えてます。
落ち着け!!ワンセグなんて見ないだろ?TVだって殆ど見てないじゃないか!
2月に買ったTOSHIBA gigabeatP5も、GREEN HOUSE USB2.0 1SEG TV TUNER W-one ブラック GH-1ST-U2Kだって引き出しに閉まったままだし

”gigabeat買うぐらいならiPod touchを買えっ”て悪魔の囁きが聞こえてきた

そういえばgigabeatは初代のPCMCIAカードが刺さる奴も持ってたりします
当時はPCMCIAカードのHDDが凄いと思って。Jornada720に挿せるぞ!とか考えて買ったんだけど、挿してからどうするって所までは考えてなかった。

2007年11月11日日曜日

既読マークの更新

GoogleリーダーからRSSフィードをuGNoteで読んだ場合に、”読んだよ”ってラベルを付ける様にGoogleリーダーのサーバーに要求を出してます。

要求を出す処理は出来ていますが、いつ要求を出すか?を思案してます。とりあえずRSSフィードのアイテムを開いたらすぐに要求を送信していますが、オフラインブラウズ中は要求を出すわけにはいかないです

オンライン中はすぐに要求を出して、オフライン中なら次にリロードしたときにまとめて既読マークを送信する。

と、すれば良いかなぁと考えてます。が、オンライン中かオフライン中か?はどうやって知るのだろうか?

一週間プログラムをしてきて、なんだか気力が続かなくなってきました....

最初はこんなこと出きるかも?ってアイデアというか考えからスタートするので、初期のアイデアが実現された時ぐらいからペースダウンしちゃいます

というのは、多分計画性が無いからだと思いますが

2007年11月10日土曜日

データ構造

uGNoteにGoogleReaderの閲覧機能を追加しています。
だいたいの基本機能は出来ていていますが、今更ながらノートとリーダーでのデータの扱い方の違いに頭を悩ませてます。

基本的にノートもリーダーもXML(Atom)形式のデータを処理するので、受信と表示に関してはuGNoteの元のプログラムと殆ど変わりません。
違いは、ノートは受信データをただ読むだけなのに対して、リーダーは既読済みマークやスターマークの追加等の情報をサーバー側に反映させたい、と言う所と、取得するデータサイズが大きくなりがちな事です。受信するデータが大きいと、パケット代や受信速度が気になってくるので、無線lanで一気にデータを取得してオフラインで読むか、読む記事毎の小さなデータをそのつど取得する様な運用方法になると思う

ノートは、もとはオンラインのデータを表示するだけのつもりだったので、オフライン処理のプログラムは、ユーザー単位で一気に複数のブックのデータを受信する単純なものでした。
このままでは、googleリーダーには向かないかなぁ、と今頃になって思い始めてます

オフライン用ファイルの保存もユーザー毎に1ファイルにまとめて保存してしまっていますが、フィードサイト毎に分けたほうが良いかも?

色々考えていると、今のままコードを書き加えていくのは無理があるかな、データ構造から考え直さないとダメなんじゃないだろうか?多分そういうことはプログラムする前に考えておくことなんだと思う

あとはオフラインで閲覧した結果(既読やスター)を何時サーバーに返すのか?が問題です

メタバグ

自作の電脳メガネをかけてTVを見ている小学校1年生の娘に聞いてみました

(父)メタバグって何?
(娘)お菓子みたいな、細かいの

(父)??ふーん、じゃあキラバグって何?
(娘)集めると通が開くの

(父)開くって?
(娘)アッチに行く

(父)アッチって何?死後の世界か?
(娘)違う!!

娘に聞いたのが悪かった....おにいちゃんに聞いてみよう

(父)メタバグって何?
(兄)知らない

(父)じゃぁ、キラバグって?
(兄)知らない

(父)あっそ....

バグに怯えながら暮らす父には、とっても気になる事なのでぜひ教えてもらいたい

2007年11月9日金曜日

HD DVDレコーダ

昔から使っていたHDDレコーダが最近調子悪いので買い換えようと思ってる
HDDレコーダは前々から買い換えたいと思いながら、HDDレコーダは買い時が難しくて購入する踏ん切りがつかなかったけど、いよいよダメになってきた

コピー制限の問題が解決するまでは、正直今は買い時ではないと思うけどしょうがないかな~と

それでチョッと調べてみたら、HD DVD レコーダが意外と安くてびっくりした。VARDIA RD-A300で105,000円。ハードディスク容量が300GBで少し足りないかなと思うのでRD-A600129,000円のほうが良いかも。とか考えてたら、年末に新機種が10万円以下で出るらしい

新機種出るまで待つか~

でも、HD DVDってどうなんだろう?ブルーレイの方が主流になるのか?ブルーレイは高いし、とか考え出したら、ますます買い替えできなくなりそう

とか思ったら、ブルーレイも安くなってたのねSONY ブルーレイディスクレコーダー BDZ-T50 が、99,800円


ただ、新機種で使えるようになるHD Recはブルーレイ陣営のAVCRECより使えそうな気がする。HDDVDもBDもメディアが高い間はDVDメディアへの録画が使いやすい方がいいと思う。ただ、メディアの値段は今後急激に下がってくるんじゃないかな?もう最安値で600円ぐらいみたいだし

迷うなぁ....

2007年11月6日火曜日

Http Requestを自前で処理する 続き

昨日の続きで、TcpClientを使って書き直してみた
というのもTcpClientとStreamReader,Writerを使えば文字列処理が楽に出来ると思ったから。
結局あまりスッキリしなかった

コードを書き換えて試験した結果、StreamReaderはChunkedデータを処理すできなかった。
Chunkedデータはbyte単位で処理しなきゃいけないのに、StreamReaderを使うと文字数単位の処理になってしまう

でもまあ目的は果たせたので、これで進めようと思う

これで一応Feedの処理は出来てきた、後はオフラインブラウズの処理とユーザーインターフェイスをどうするか....



public String HttpGet(String url,String param)
{
url = url.Substring(url.IndexOf("://")+3);
String server = url.Substring(0,url.IndexOf("/"));
url = url.Substring(server.Length);
IPHostEntry ipInfo = Dns.GetHostEntry(server);

IPEndPoint hostendp = new IPEndPoint(ipInfo.AddressList[0], 80);

String reqMsg = "GET " + url + " HTTP/1.1\r\n"
+ "HOST: " + server + "\r\n"
+ "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n"
+ "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
+ "Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n"
+ "Accept-Charset: utf-8;q=0.7,*;q=0.7\r\n";
if (param != null)
reqMsg += param + "\r\n";
reqMsg += "Connection: Close\r\n\r\n";


TcpClient client = new TcpClient();

client.Connect(hostendp);

NetworkStream ns = client.GetStream();

StreamWriter clientWriter = new StreamWriter(ns, Encoding.ASCII);
clientWriter.Write(reqMsg);
clientWriter.Flush();

// ヘッダの解釈
String[] resHdr = ReadLine(ns).Split(' ');
if (!resHdr[0].StartsWith("HTTP/")
|| !resHdr[1].StartsWith("200"))
{
throw new ArgumentException("Http Response Error");
}

// ヘッダの終わりまで読み飛ばす
bool Chunked = false;
while (true)
{
String hdr = ReadLine(ns);
if (hdr.StartsWith("Transfer-Encoding:"))
{
if (hdr.Substring("Transfer-Encoding:".Length).Trim().ToLower() == "chunked")
Chunked = true;
}
else if (hdr == "")
break;
}

// 本文を取得する(Chunkedの場合)
string resMsg="";
if(Chunked)
{
while (true)
{
String lens = ReadLine(ns).TrimEnd(';');
int len = 0;
if (lens != "")
len = Int32.Parse(lens, System.Globalization.NumberStyles.AllowHexSpecifier);
if (len == 0)
break;

byte[] buffer = new byte[len];
int offset = 0;
while (offset<len)
{
int rslt=ns.Read(buffer, offset, len-offset);
if (rslt == -1)
break;
offset += rslt;
}


resMsg += Encoding.UTF8.GetString(buffer, 0, len);
// 改行を捨てる
ReadLine(ns);
}
}
else
{
StreamReader clientReader = new StreamReader(ns, Encoding.UTF8);
resMsg = clientReader.ReadToEnd();
}

//閉じる
client.Close();

return resMsg;

}

2007年11月5日月曜日

Http Requestを自前で処理する

.NETアプリでGoogleReader からfeed情報を取り込む場合、Googleのサーバーにリクエストするurl中にfeedアドレスが含まれます。
例えば以下の様なアドレスでGET要求を送信します
http://www.google.com/reader/atom/feed/http://blog.atelierlune.com/atom.xml?xt=user/-/state/com.google/read

これが、.NETのHttpWebRequestを使って処理すると、内部処理でリクエストアドレスに含まれる"//"が"/"となってしまいます。コレは相対アドレスを絶対アドレスに変換しようとしてるのかも知れませんが、Googleのサーバへの要求としては不適切となってしまいます

この問題がどうしても解決する方法がわからないので、Http Requestを自前で処理するようにしてみました。


なんだか無駄な事をしている様に思います
本来ならサーバーからxmlデータを取得するだけなら

XmlDocument.Load(url);

を使用するだけで済みます。
今回はGoogleへのユーザー認証済みのCookie付きでアクセスするために、HttpWebRequestを使ってきましたが、更にHttp Requestまで自前で書くことに....

とりあえず目的のFeed情報は取得できるようになったけど、
自前で記述したHttpRequestはSSL通信は無理だろうなぁ...


とりあえず試験的に書いたソース。どっかの解説ページそのまんま+Chunked Encodingの解除
TcpClientクラスを使うともう少しスッキリ書けるのかな?
public String HttpGet(String url,String param)
{
url = url.Substring(url.IndexOf("://")+3);
String server = url.Substring(0,url.IndexOf("/"));
url = url.Substring(server.Length);
IPAddress hostaddr = Dns.GetHostByName(server).AddressList[0];
IPEndPoint hostendp = new IPEndPoint(hostaddr,80);

String reqMsg = "GET " + url + " HTTP/1.1\r\n"
+ "HOST: " + server + "\r\n"
+ "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n"
+ "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
+ "Accept-Language: ja,en-us;q=0.7,en;q=0.3\r\n"
+ "Accept-Charset: utf-8;q=0.7,*;q=0.7\r\n";
if (param != null)
reqMsg += param + "\r\n";
reqMsg += "Connection: Close\r\n\r\n";

byte []reqBytes = Encoding.UTF8.GetBytes(reqMsg);

System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(
System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
sock.Connect(hostendp);
sock.Send(reqBytes,reqBytes.Length,System.Net.Sockets.SocketFlags.None);

byte [] resByte=new byte[1024];
System.IO.MemoryStream mem = new MemoryStream();

// 受信
while (true)
{
int rsize = sock.Receive(resByte, resByte.Length, System.Net.Sockets.SocketFlags.None);
if (rsize == 0)
break;
mem.Write(resByte, 0, rsize);
}
mem.Seek(0, SeekOrigin.Begin);

// ヘッダの解釈
String [] resHdr = ReadLine(mem).Split(' ');
if (!resHdr[0].StartsWith("HTTP/")
|| !resHdr[1].StartsWith("200"))
{
throw new ArgumentException("Http Response Error");
}

// ヘッダの終わりまで読み飛ばす
bool Chunked=false;
while(true)
{
String hdr = ReadLine(mem);
if(hdr.StartsWith("Transfer-Encoding:"))
{
if(hdr.Substring("Transfer-Encoding:".Length).Trim().ToLower() =="chunked")
Chunked=true;
}
else if(hdr=="")
break;
}

// 本文を取得する(Chunkedの場合)
string resMsg="";
if(Chunked)
{
while (true)
{
String lens = ReadLine(mem).TrimEnd(';');
int len = 0;
if (lens != "")
len = Int32.Parse(lens, System.Globalization.NumberStyles.AllowHexSpecifier);
if (len == 0)
break;
resMsg += Encoding.UTF8.GetString(mem.GetBuffer(), (int)mem.Position, len);
mem.Seek(len, SeekOrigin.Current);
// 改行を捨てる
ReadLine(mem);
}
}
else
{
resMsg = Encoding.UTF8.GetString(mem.GetBuffer(), (int)mem.Position, (int)mem.Length);
}
mem.Close();

//閉じる
sock.Shutdown(System.Net.Sockets.SocketShutdown.Both);
sock.Close();

return resMsg;

}


2007年11月4日日曜日

Url中の//

uGNoteではGoogleの提供する.NET用ライブラリを使っています。
NoteBookにアクセスするための処理はそれほど難しくは無いので、Googleのライブラリを使わないで自前で処理をすることにしました。

この作業自体は昨日完了したのですが、欲張ってGoogle Readerのfeedも持ってこれるように機能追加をしてハマリ中です。
今のところは100歩後退って感じです

公開設定されたアイテムはNoteBookと殆ど同じ扱いなので簡単でした
登録フィードのリストを取得する事も出来ました

問題は登録フィードから内容を読み込む事が何故か上手くいきません

例えば、登録フィード"blog.atelierlune.com"の既読アイテムを取得するには

http://www.google.com/reader/atom/feed/http://blog.atelierlune.com/atom.xml?xt=user/-/state/com.google/read

こんなurlに"GET"をリクエストします

webブラウザ上ではこれでバッチリxmlが取得できます
これをc#でプログラムにすると
指定したurlが何故か

http://www.google.com/reader/atom/feed/http:/blog.atelierlune.com/atom.xml?xt=user/-/state/com.google/read

に変わってしまいます

Uri uri = new Uri("http://www.google.com/reader/atom/feed/http:/blog.atelierlune.com/atom.xml?xt=user/-/state/com.google/read");

この違い分かりますか?パッと見では同じですが
.../feed/http://blog.atelie....
.../feed/http:/blog.atelie....

// が / に勝手に書き換えられてます

気持ちが分からなくも無いけど、おかげでまともなリストが得られません

これが解決できないと登録先がごっちゃ混ぜの既読リストしか得られない、どーしたら良いのかわかりません