ブログ検索(仮2)

http://www.moonmile.net/blog/?p=239 の続き

にほんブログ村
http://www.blogmura.com/

からぽちぽちと手動で検索した結果をまとめたもの。

cci20090608_00000

 

ブログ検索の場合、2つの検索があって、

a) 新しいもの(流行りもの)を検索する場合
b) 過去の詳しいデータを検索する場合

がある。a) の新着記事の場合は、各ブロガーが書いた途端に ping サーバーに飛ばし、その時点で検索できる必要がある。アニメやらテレビの批評やらがそれ。あとニュースとか。

もうひとつは一人のブロガーがコツコツためた記事を検索する場合で、過去の書評とかプログラミングの記事とか、なんかのFAQとかがそれにあたる。

で、google とか他のブログ検索と似たようなことをやると、似たような結果しか出てこないので(社会学/資本主義としてはそれでいいのだが)、所謂ニッチなところ、所謂「進化の谷間」を狙わないとだめなので、google 検索やにほんブログ村の逆をやらないといけない。

ということは(仮定として)

1) ページランキングを付けない。
2) カテゴリ分けをしない。

ことになる。

ページランキングをすると、ランキングの上位に来るように SEO 対策を行われる。他からのリンクが多い(参照が多い)ほうが他の人は参照するだろう、というランキングは、たくさんのところからリンクされるようにするという手法が発生してしまう。なので、そもそもランキングを付けないのが正しい、と思われる。
仮定としてだが、検索結果をパッと見て100件あれば十分だろう。また具体的なものを探すのであれば、10件あれば十分。逆に言えば、10件以外は目的に沿わない、検索者にとってゴミデータということになる。

カテゴリ分けをしない、のは、カテゴリを分けると探すのが大変だから。また、カテゴリを分けるのであれば、大手のものをそっくり真似してしまうと良い。
たとえば、トップからのカテゴリを10個作って、その中にカテゴリを10個作ると、全体で100個のカテゴリができる。こんなに分けても検索者には覚えきれないし、最初に「カテゴリ」を見つけることは不可能。
ならば、逆に数で分けてカテゴリを分けるか(100個にならないとカテゴリに昇格しないとか)、そもそも「何故カテゴライズが必要なのか?」を考え直す必要がある。

で、それが2枚目の思考で。

ccf20090608_00001

・新刊が出たとき
・子育てでアトピーについて調べたいとき
・新しいパソコンが発表されたら

と3つ試してみると、それぞれ行き着きたいサイトが異なる。
# 日記ブログの場合は社会コミュニケーションの一環として行われるので、この検索には当てはまらない。

こうなると、google で書評を検索しようとして amazon や bk1 がトップに来るのは「困る」ってのはどうしてなのかが見えてくる(と思う)。それは、google や amazon に取っては、(当たり前だが)モノを売るという商業主義が前面に出てくるのに対し、検索する人の第一目的は「モノを買わない」という場合もあるためだ。

本を買うときは「書名 amazon」なんてやると大抵は一番最初に出てくる(site: を使ってもいいけど、面倒なので)。が、書評なんてのは難しい。価格.com を含めたい場合は「製品名 価格」なんかでトップに出てくるからいいけど、比較したりスペックを調べてるときはちょっと手間だ(最近は価格.com から仕様でジャンプするのが早いことが分かった)。

だから、モノを調べるときに、最終的にその人が「買う」のか「比較したい」のか「興味だけがあるのか」、「もっと安いものを知りたい」のか、「買いたくない」理由を探しているのか、あるいは、対処法を探しているのか、類書を探しているのか、なんて具合に、最終的に何がしたいのか?を思い遣らないと、うまく検索結果をその人にマッチさせることはできない。
という訳で単純な全文検索(マッチングとランキング)だけでは、目的に辿りつかないことが分かった(納得できた)ので、次の手を考える。

情報検索入門ハンドブック 

books.or.jp
http://www.books.or.jp/ResultDetail.aspx?IdString=0%2cMAIN%2cNODE%2c430687&scode=&searchtype=0&title=%8f%ee%95%f1%8c%9f%8d%f5%93%fc%96%e5%83n%83%93%83h%83u%83b%83N&writer=&syuppansya=&showcount=20&startindex=0&SyuppanCode=7621
amazon
http://www.amazon.co.jp/dp/4585071245
勉誠出版
http://www.bensey.co.jp/book/2036.html
bk1
http://www.bk1.jp/product/03036231
google ブログ検索
http://blogsearch.google.co.jp/blogsearch?hl=ja&ie=UTF-8&q=%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2%E5%85%A5%E9%96%80%E3%83%8F%E3%83%B3%E3%83%89%E3%83%96%E3%83%83%E3%82%AF&btnG=%E3%83%96%E3%83%AD%E3%82%B0%E6%A4%9C%E7%B4%A2&lr=lang_ja

な感じにまとめてくれるといい。
# ちなみに↑のリンク先に有用な情報は少ない…。

この本は図書館で借りてきた。結局のところ、検索技術ってのは図書館で館員に「こんな本がありますか?」と尋ねるのと同じなので、いくつか図書館に関する本を読んでいる。
この本は多少書籍検索に偏ってはいるけれど、特許の検索とか政府刊行物とか。
おまけ、
地図閲覧サービス(ウォッちず)
http://watchizu.gsi.go.jp/index.html
電子国土
http://portal.cyberjapan.jp/index.html

国土地理院が「試験的」に出しているサービスで、電子国土webシステムってのがある。
google map に押されている(って当たり前か)けど、電子国土ってのは、ロゴを表示すれば自由に利用できる模様。

# 地図の出来としては、google map に提供しているゼンリンのほうが格段に上。

カテゴリー: 雑談 | ブログ検索(仮2) はコメントを受け付けていません

Bug labs

今月のSoftware Design を立ち読みして、

オープンソース・ハードウェアのBug Labsから最初の写真
http://jp.techcrunch.com/archives/first-pics-of-bug-labs-open-source-hardware/
Bug LabsのモジュラーなデバイスでGoogleのAndroidが走るらしい
http://blog.browncat.org/2007/11/bug_labsgoogleandroid.html
Bug Labs: modular, open source hardware
http://www.buglabs.net/
BUGbase 先行出荷版はWiFiなし、「Hiro P」バージョン
http://japanese.engadget.com/2008/01/21/bugbase-wifi-hiro-p/
LEGOのような組立ガジェット「BUG」- 開発者向けの予約受付開始 | パソコン | マイコミジャーナル
http://journal.mycom.co.jp/news/2008/01/23/005/index.html
【ETech続報】まだまだ進化途上にある“オープンソース・ハードウエア”,効果はこれから… – 家電・PC – Tech-On!
http://techon.nikkeibp.co.jp/article/NEWS/20080311/148822/
Latest BUG Releases – BUG Wiki
http://bugcommunity.com/wiki/index.php/Latest_BUG_Releases
Showing posts » BUG Community | Bug Labs
http://community.buglabs.net/blog

2008年だから2年程前になるけど、レゴブロックみたいに組み上げるモバイルデバイスの話。

– 組み込み Linux で動作
– API は Java を使う。
– 主に Eclips 上で開発
– サイト http://www.buglabs.net/products に行けば日本でも買えるみたい。
 — Bugbase(必須)$249.00(値下げしている)
 — BUGview(ディプレイぐらいは必要?)$119.00 タッチスクリーン(320×240)だそうだ。

無線LAN(WiFi)が無い。初期バージョン「Hiro P」から2年程経っているが未だに次のバージョンが出ていない。

What About WiFi?
http://bugblogger.com/what-about-wifi-84/

のエントリーを読むと、無線LANのオープンソース化が難しいってのが書いてある。

In a pure, GPL, open source world, getting Wifi working is tricky. In fact, it’s almost impossible. Not because the hardware isn’t available, though getting a vendor to even talk to you as a small company is difficult, it’s the software drivers. Until recently, they simply haven’t existed in a form we could use. I won’t go into all the
technical reasons why (I’ll leave that to the forums) but suffice to say, we couldn’t get it ready in time for our first committed ship date while remaining true to our commitment to stay 100% open source.

BUGBase のスペックをみると、
http://www.buglabs.net/bugbase

USBは付いているのでUSBの無線LAN付きなら差し込めると思うし。

と思ったら、WiFiモジュールはあるみたい。

Bug Labs オープン・ソースハードウェア新5機種http://www.slashgear.jp/2009/01/post-3348/
# でも、Bug Labs Store では買えない…
組み込みLinux系の勉強にはちょうどいい機器だと思う。
API が Java なのがアレですが(私がJavaから遠いのが原因なんだけど)、Android USB化もうまく起動できない(たぶん、USBメモリへのインストールの仕方が問題なだけだろうけど)ので、お試し開発/練習用としては3万円で買うのはいいかもしれない。

カテゴリー: PDA | Bug labs はコメントを受け付けていません

メモリ&HDD増設完了

というわけで、インストールマニアックス参加賞の NEC Express5800/110Ge を増設。

NEC Express5800/110Ge まとめwiki
http://wiki.nothing.sh/page/NEC%20Express5800%A1%BF110Ge

を参考にして、

W2U800CQ-2GL5J を購入しました。non-ECC だけど、動作確認は取れている模様。
現在換装後、2GBを2枚差しで4GBで動作しています。ECCの半額なのでリスク込みで、ということで。HDD は日立の製品を買って1TBまで増設。
両方合わせてクレバリーで1万円ちょっとでした。
このサーバー機、外部のファンが2つ、電源が1つ、CPUのが1つついているわけですが、結構うるさい。試しに外部のファンを止めてみたのですが、それなりにうるさいのでCPUのファンがうるさいみたいですね。仕方がない。機会を見てファンを変えるか。マシンを変えるか(苦笑)。

さて、ブログ検索の計画でも立てよう。

カテゴリー: インストールマニアックス2009 | メモリ&HDD増設完了 はコメントを受け付けていません

ブログ検索(仮)

ブログ検索 http://www.moonmile.net/blog/?p=116 の続き。

perlのspideringを使ってブログ個別にクローリング、ってのを考えてみたものの、クローリング自体が重たい処理になってしまうので、ちょっと考える。

最近/当初も?ブログを登録すると当然のようにpingサーバーに通知するようになっている。大手のところに登録すると、検索ができたり、ランキングしたり、なんかカテゴリにまとめてくれたりする。普通はブログのアクセスアップに使われるのだが、これを利用する。
# 本当は ping を受け付けてもいいのだが、大手でもないし実験だし。なので大手のものを利用する。
日本ブログ村
http://www.blogmura.com/
Googleブログ検索 BETA
http://blogsearch.google.co.jp/
ブログ更新通知pingの送り先リスト(参考に)
http://vivablog.net/seo/kiji14/

この中から、
1.直近10~30分ぐらいの間隔で、新着エントリのURLを取得する。
2.指定URLへエントリを取りに行く。
3.データベースに貯め込み、検索用にごにょごにょする。

ってな感じでOK。
対象は日本語で書かれたブログがいいので、数は相当少なくなるはず。
検索に引っかからないブログやpingしていないブログがあるので、これは個別に取りに行く必要がある。が、当面はpingサーバーで取れるものだけで実験ができるだろう。

あと、私的には英語のプログラミング技術情報も押さえておきたいので、これは別途検討。
そう、新商品の発表なんかは昨今twitterが利用されている(のかな)らしいので、こっちも同時に拾うといいのだけど、手広くなってしまうので今のところパス。PDAでリーダーだけは作ってみたいな(iPhone風のインターフェースで)。Windows CE でも DirectX が使えるので、透過とかの真似はできるはず。できなかったらビットマップで切り替えればいいし。

カテゴリー: 開発 | ブログ検索(仮) はコメントを受け付けていません

インストールマニアックス予選落ち

「落ち」たので記録しておく。自分に対して(苦笑)。
さすがに30個ぐらいでは無理ね~。SQL Serverで動かそうとやっきになってしまい、ついつい数が御留守になってしまいました。50個ぐらいが予選のボーダーラインだと思ったのですが、もっと上っぽいですね。60個以上は入れないと駄目だったみたい。

まぁ、私としてはプログラマだけど
– 色々インストールすることができて他のOSSを見ることができた。
– PHPの設定は大丈夫になった(と思う。初心者だが)
– PHPは意外と(誤解していてごめん>PHP)使えることが分かった。
– 本格的にOSSを組み合わせようという気になった(かも)

ってなところです。

ひとまず、手持ちのサーバーは平日昼間運用に移行(ファンがうるさいし、電気代がもったいないし)することに決定。そして、メモリを増設する(4GB)ことに決定。HDDも増設(1TB)に決定。最初は CPU を変えて Hyper-V を動かそうと思ったけど、やめ。しばらくは、Windows Server 2008 Web Edision のまま運用。
今、考えている用途としては、

■ASP.NETの○意

これは数年前からやりたかったページで ASP.NET Quickstart Tutorial http://quickstarts.asp.net/QuickStartv20/aspnet/ のように ASP.NET のソースが眺められて、さらに動かして確かめられるという代物。○意は本でCD-ROM収録でもいいのだが、実際にブラウザで確かめられるほうがお手軽だし、インストールいらずなので。ASP.NET を動かせるところを借りてもいいのだが維持費が高いのでパスしていた。

■ブログ検索用のspidering

ブログ検索 http://www.moonmile.net/blog/?p=116 の続き。
考えてみたらブログの場合は、ping サイトに通知していることが多いので、ping サイトから最新のURLを引っ張ってくればよいことが分かった。そのあとは、どうやって数時間前のものを拾ってくるかはひと工夫必要なんだが、これは別に考察する予定。

■PHPの実験場

PHP自体はここの外部ホスティングでも動くので、その前の実験場として。
サーバーの管理や電源供給を考えると、外部サーバーのほうが手間もお金も掛からない。ただ、あれこれデバッグするとなると手元のマシンにあるほうがいい。拡張モジュールを試したりするとか。

なところ

カテゴリー: インストールマニアックス2009 | インストールマニアックス予選落ち はコメントを受け付けていません

PDAからPCへリモコン操作

PDAで無線LANを扱う(仮) http://www.moonmile.net/blog/?p=208 の続き

PDAがクライアント、PCがサーバーのパターンとして、PDAからPCをリモコン操作することを考える。つまりは、クラサバを作ってやれば良いわけで、作ってみたのがこれ。

09-06-01_11-07

09-06-01_11-08

PDA クライアントのソースはこちら

using System.Net;
using System.Net.Sockets; namespace RemoCon01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }         private void Form1_Load(object sender, EventArgs e)
        {
            this.pictureBox1.Size = this.Size;
            this.pictureBox1.Image = Properties.Resources.peorth;
        }         private string HOSTNAME = "192.168.0.7"; // "iomante-pc";
        private int PORT     = 9000;         private void pictureBox1_Click(object sender, EventArgs e)
        {
            int n =
                MousePosition.X / (pictureBox1.Width / 3) +
                MousePosition.Y / (pictureBox1.Height / 3) * 3;             //PCにコマンドを送る
            TcpClient tcp = new TcpClient();
            try {
                tcp.Connect(HOSTNAME, PORT);
                NetworkStream stream = tcp.GetStream();
                byte [] buffer =
                    System.Text.Encoding.ASCII.GetBytes(
                    string.Format("R{0}", n ));
                stream.Write( buffer, 0, buffer.Length );
                tcp.Close();                 MessageBox.Show(string.Format("送信 R{0}", n));             } catch ( Exception ex ) {
                MessageBox.Show( ex.Message );
            }
        }
    }
}

PC サーバのソースはこちら

using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace RemoCon01PC
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }         private void Form1_Load(object sender, EventArgs e)
        {         }         // ワーカースレッド
        private Thread work;
        private TcpListener server;         // サーバを開始する
        private void button1_Click(object sender, EventArgs e)
        {
            // ワーカースレッドの作成と開始
            work = new Thread(DoWork);
            work.Start();
        }
        // サーバを終了する
        private void button2_Click(object sender, EventArgs e)
        {
            server.Stop();
        }
        // ワーカースレッド
        private void DoWork()
        {             // リスナーを作成する
            server = new TcpListener(IPAddress.Any, 9000);
            // リスナーを開始する
            server.Start();
            textBox1.Text = "サーバー開始";
            try
            {
                while (true)
                {
                    // クライアントからの接続を受け付ける
                    TcpClient client = server.AcceptTcpClient();
                    NetworkStream stream = client.GetStream();
                    // 受信データの読み出し
                    byte[] data = new byte[100];
                    int len = stream.Read(data, 0, data.Length);
                    string str = System.Text.Encoding.ASCII.GetString(data, 0, len);
                    textBox1.Text = "受信データ:" + str;
                    client.Close();
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = "サーバー終了";
            }
        }
    }
}

本当は.NETリモートでやりたかったのだが、なんと!.NET Compact には.NETリモートが無い。ので、仕方がないので、TCP/IPで接続。IPが直書きになっているけど、気にせず。

TCP/IPで接続しているので、いろいろ送ることができるのだが、PDAの操作は決まっているので単純な(あまりにも単純な)コマンドを送っているだけです。PDAの画面を9分割して、タッチされたところの番号をPCに送ります。PCのほうは、コマンドを表示しているだけです。これに対応した「何か」を動かせばOK。
ブラウザの前/後へを考えたけど、画面をクリックしないと駄目なのでパス。DVDの出し入れとか、音量とか、なんかのアプリ起動に使えるだろう。

以下、エミュレータを使ったときの注意点。

最初、エミュレータでTCP/IP接続を確認していたのだが、

「エミュレータのネットワークを有効にする」

ことを忘れて、半刻ほど悶絶。

[ファイル]→[構成]で「エミュレータのプロパティ」を開いて「ネットワーク」タブで、ネットワークアダプタを有効にしないといけない。

09-05-28_11-202

後、エミュレータで直接Socketを使うと非常に遅い。Connect時にハングアップしたんじゃないかというほど遅く、1分ほどかかる。これは実機のPDAでやるとすんなり繋がるので、エミュレータの問題かな?

ボタンの位置を MousePosition で取得していのだが、エミュレータだと、本当のマウスの位置(笑)が取れる。エミュレータのウィンドウの左上ではなく、ディスプレイの左上からの位置が取れる。なので、マウスクリックを取る場合は、エミュレータの位置を左上にしないといけない。

カテゴリー: PDA | PDAからPCへリモコン操作 はコメントを受け付けていません

PDAでGoogle検索

Android 搭載ケータイでのGoogleモバイルサービス
http://www.youtube.com/watch?v=WJMMSCn2M64&eurl=http%3A%2F%2Fwww%2Egizmodo%2Ejp%2Fweb%2Fbrowser%2F&feature=player_embedded

Androidの売りは「指先で操作できる」とこにあると思う。指先で操作するためには、ある程度のボタンと画面の大きさが必要で、いままでの携帯電話の小さな画面だとちょっと扱いづらい。(日本独特の?)親指文化はそれはそれでいいので、このあたりは別ものとしてUIを扱う必要がある。

で、中古PDAでもInternet Explorerが付いているわけで、Google検索も当たり前のようにできる。が、何が使いづらいって、そりゃ、IEを立ち上げないとGoogle検索ができないのが面倒。

つまり、何か検索しようとすると

1.IEを立ちあげる。
2.お気に入りからGoogleを開く。
3.検索文字を入れて、検索!

ってな感じで3ステップが必要。だから、

1.Google検索アプリを立ち上げる。
2.検索文字を入れて、検索!

でもいいわけで、試しに実現したのがこれ。

09-06-01_10-23

09-06-01_10-31

09-06-01_10-126

09-06-01_10-261

ソースはこちら


namespace GoogleSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string SEARCH_NULL = "Google検索";

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        // 空白時の処理
        private void textBox1_GotFocus(object sender, EventArgs e)
        {
            if (textBox1.Text == SEARCH_NULL)
            {
                textBox1.Text = "";
                textBox1.ForeColor = Color.Black;
            }
        }

        private void textBox1_LostFocus(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                textBox1.Text = SEARCH_NULL;
                textBox1.ForeColor = Color.LightGray;
            }
        }

        private void picSearch_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != SEARCH_NULL &&
                 textBox1.Text != "")
            {
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo.FileName = "iexplore.exe";
                proc.StartInfo.Arguments = "http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=" + textBox1.Text;
                proc.Start();
            }
        }

        //ロード時
        private void Form1_Load(object sender, EventArgs e)
        {
            picGoogleLogo.Image = Properties.Resources.GoogleLogo;
            picSearch.Image = Properties.Resources.SearchIcon;
            picSearch.Focus();
            textBox1.Text = SEARCH_NULL;
        }
    }
}

特に何も難しいことはやっていなくて(やることすらできない)、Process クラスでIEを起動しているだけです。画像の貼り付けは、ボタンとかに付けられないのでリソースから明示的に。

問題点としては、

– 文字入力はスタライス入力が必須になってしまうので、別途大きなボタンが必要。
– テキストのコピー&ペーストは自前で作るらしい(iPhoneを笑っていられない)
– ブラウザが基本フルブラウザなので、横スクロールがあって読みづらい。Agentを書き換えて、携帯用のレスポンスを呼び出したほうがいいかも。

カテゴリー: PDA | PDAでGoogle検索 はコメントを受け付けていません

PDAで無線LANを扱う(仮)

アイデアノートとして。

ccf20090529_00000

中古でPDAを購入したときにクレードルは付いていない。ので、なんらかの形でPCと連携/通信する手段が必要。というか、クレードルに置かないと通信や同期ができないのは面倒だし、家や会社の両方にクレードルを置いて同期(?)をさせるのも、お金が必要だし(昔ThinkPadを使っていたときはクレードルを2台買ったが)。

# というよりも、中古PDAでも最新のwindows mobileでも動くようにするわけだから、このあたりは、通信手段としては無線LANかBluetoothが有用。

PDA同士のP2P通信は別に考えるとして、

■PDAがクライアント、PCがサーバーの時

– .NET Remote を使ってPCへ通信
– WEBサービスでも良いが、PC側にIISが必要(SQL Serverでも良いけど)になるので大袈裟。しかも業務アプリっぽい動きしかできないのでパス。

WEBサービスを利用すれば、Amazon API を叩くこともできるのですが、PDAからモデム通信をしないといけないので、ちょっと躊躇。お金が掛かるからね。

Amazon のサービスを呼び出すならば、

– 無線LANがあれば、PC経由でAmazon APIを叩いて、PDAで表示。
– 無線LANがなければ(戸外にいれば)、既に取得済みのデータベース(SQL Server Compact)を使って検索して表示。

な具合が課金的にはよろしい。google map とか他の検索機能も同じ。というか、その場で検索ってのはモデム通信をしないとできないので、課金的に得策とは言えない。別の使い方をしたほうがよい。

その点、PDAからPCをリモートで操作、ってのはお手軽にできる。
PCを使っているんだからキーボード/マウスは手元にあるはず(椅子に座っているはず)なのだが、

– 単に映画を見ているとき
– 単にゲームをしているとき
– ブラウザで閲覧

なんてときは、手元にキーボードは必要ないし、マウスぐらいでいい。実際、無線対応のマウスを使うとこの点は便利。

だが、もうちょっと細かい操作をしようと思うと、マウスだけでは足りないので、PDAで作った「リモコン」がいい(これは携帯でもok)。スタライスで文字をぽちぽち打つのはやめ!鬱陶しい!ので、ボタンは9個(iPhoneもそんな感じ)。切り替えて表示すればok。何をPCで動かすかは未定ではあるが。

今度は逆

■PDAがサーバー、PCがクライアントの時

PDAがサーバーの場合は、

– .NET リモート
– WEBサービスのサーバ
– TCP/IPのサーバ

と色々できる。無線LANを使っている間は電気を大量に食うのであるが、利用用途としては、

– PCのサブ画面

として使うことになるので、電源をコンセントに刺した状態で使う。使い方は、動画をサブ画面で流すことも考えられるが、これだけだとつまらない。単にTVを付けるか、サブ用の液晶ディスプレイを買えばOKなので。

もうちょっと凝った一案として、

1.サブ画面に「葉書」で来たようにメールの着信を表示する
2.サブ画面をタッチすると、裏面にメールの本文がある。
3.サブ画面の「詳細へ」ボタンを押すと、PCに本文が開く(ここはおまけ)

ってことができる。普通のサブ画面用液晶の場合タッチパネルではないので、2ができない。1はwindows mobile の携帯でもok。リアルっぽい「葉書」が良い(これは画像を貼り付けるだけでよいので簡単)。PDAのメーラなんてのは、業務的には本文をちまちま読むのが主流だけど、どうせPCと組み合わせるのだから、もっと単機能的に使うのがいい。音を出すのも簡単。

と、ここまでは自作できそう。
windows ce にサービスの概念があるかどうか調べていたのだけど、よくわからない。が、windows ce の場合、アプリケーションをユーザーが落とすことになるので、当面は通常アプリとして起動、でもいいかな。

カテゴリー: PDA | PDAで無線LANを扱う(仮) はコメントを受け付けていません

PDA で SQL Server Compact 3.5 を使う

PDA自体にデータベースを乗せる簡単な検証をしてみました。

極小SQL Server Compactでデータベース・アプリをお手軽作成
http://www.atmarkit.co.jp/fdotnet/joyofprogram/20080701devssce/devssce_01.html

利用方法としては、

– データベースをあらかじめ作成しておいて SD メモリに置く。
– アプリケーションからPDA上のDB(SDFファイル)を参照する。
– 無線LANなどが使えるときは、適宜DBをアップデートする。

ってな感じを想定しています。
DBのアップデートに関しては、地図や電話帳みたいな固定データは丸ごとPCからコピーしてもOK。
PDAで編集したメモ書きなんかは、適宜PCでマージしてやって(PDAでマージでもOK)、DBに書き戻すという方法がよいでしょう。

ActiveSync に関しては保留。中古でPDAを手に入れると大抵クレードルがありません(スタライスも無いことが多い)。なので、PDAとPCとのデータのやり取りは、

– SDメモリ経由
– CFカード経由
– 無線LAN
– Bluetooth

に限られます。赤外線でもいいけど、昨今のノートPCには赤外線が乗っていない機種が多いのでパス。
勿論、PDA自体に無線LAN/Bluetoothが乗っていない場合もあるわけですが、それはそれで(今時の)使い勝手を考えて現在保留。

さて、本題ですが、PDAでSQL Server Compact 3.5 を使うときは、System.Data.SqlServerCe 名前空間を使います。この中に SqlClient と同等のクラスが含まれています。
参照設定に「System.Data.SqlServerCe.dll」を追加します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;

namespace DBAccess01
{
    public partial class Form1 : Form
    {

        private SqlCeConnection m_cn;
        private string m_ConnectString = "";
        
        public Form1()
        {
            InitializeComponent();
            //DBの位置
            System.Reflection.Module[] modules =
                System.Reflection.Assembly.GetExecutingAssembly().GetModules();
            string path = System.IO.Path.GetDirectoryName(modules[0].FullyQualifiedName);
            m_ConnectString = "Data Source=" +
                path + "\\AppDatabase1.sdf";
        }

        // 接続
        private void button1_Click(object sender, EventArgs e)
        {

            //MessageBox.Show(m_ConnectString);

            m_cn = new SqlCeConnection(m_ConnectString);
            try
            {
                m_cn.Open();
                MessageBox.Show("接続完了");
            }
            catch ( SqlCeException ex )
            {
                MessageBox.Show(ex.Message);
            }
        }
        // 切断
        private void button2_Click(object sender, EventArgs e)
        {
            if (m_cn != null)
            {
                m_cn.Close();
                MessageBox.Show("切断");
                m_cn = null;
            }
        }

        // 検索
        private void button3_Click(object sender, EventArgs e)
        {
            SqlCeConnection cn = new SqlCeConnection(m_ConnectString);
            SqlCeDataAdapter da = new SqlCeDataAdapter(
                "SELECT * FROM t_product", cn);
            DataTable dt = new DataTable();
            da.Fill(dt);
            this.dataGrid1.DataSource = dt;
        }
    }
}

接続文字列は

Data Source=SDFファイル名

のように指定します。上のソースではアプリケーション(EXEファイル)と同じ場所にあるSDFファイルを指定しています。

あと、PDA には .NET Compact Framework 3.5 と Microsoft SQL Server Compact Edition v3.5 なるものが必要です。.NET Compact Framework 3.5 のインストールに関しては、http://www.moonmile.net/blog/?p=82 を参照して貰うことにして、SQL Server Compact の方は Visual Studio 2008 をインストールしたときには、

C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\

にあります。
# 2005 とか Express Edition の場合はよくわからないのですが、先の「極小SQL Server Compactでデータベース・アプリをお手軽作成」の記事を眺めると結構大変そうなので、これはまた別の機会に。

この中にあるCABをインストールします。これはPDAによってCABが決まっています。

– sqlce.ppc.wce4.armv4.CAB

をPDAにインストール。そしてリセット(リセットしないと駄目らしい)。

SDメモリにサンプルで作成したファイルを入れます。

– DBAccess01.exe: 実行ファイル
– AppDatabase1.sdf: DBのファイル
– System.Data.SqlServerCe.dll: CE用DLL

で、実行したときの結果がこちら↓

SDメモリから直接起動

09-05-28_11-20

DataGridView に表示しているところ。

09-05-28_11-201

メモリの使用率が気になるところですが、今は測定していないので無視。

ちょっと気になったのが、

– varchar, char は無く、nvarchar, nchar で置き換える必要あり。
– ストアドプロシージャは作れない。
– レプリケーション機能がある。
– 日付型がdatetimeしかない。date型やtime型がない。

など細かな違いがあります。個人的には nvarchar に変換するのが面倒なのと、ストアドが無いってところですかね。システム関数はどこまで対応しているのか分かりませんが。

カテゴリー: PDA | PDA で SQL Server Compact 3.5 を使う はコメントを受け付けていません

デジタルフォトミニアルバム(仮2)解析

デジタルフォトミニアルバム(仮)解析 の続き

SPTIによる制御法
http://azuco.smallnews.net/fao/doc/spti.html
DeviceIoControl-SCSI_PASS_THROUGH_DIRECT keeps giving Error 87
http://social.microsoft.com/Forums/en-US/Offtopic/thread/56529bff-ef02-4b67-8dae-bef7a7be0dfd
SCSI read disc structure C++ help
http://cboard.cprogramming.com/cplusplus-programming/113878-scsi-read-disc-structure-cplusplus-help.html
アーカイブ: USB ストレージ – ドライバおよびハードウェア開発者向けの FAQ
http://www.microsoft.com/japan/whdc/archive/usbfaq.mspx
Japan WDK Support Blog : アプリケーションからSCSIコマンドを発行する方法
http://blogs.msdn.com/jpwdkblog/archive/2009/04/15/scsi.aspx

DeviceIoControl と IOCTL_SCSI_PASS_THROUGH_DIRECT をキーワードにして探していくと↑なところに行きつきました。

最初は、SPTIによる制御法を参考にして、直接組んでいたのですが、やっぱり Windows Device Kit(WDK)が必要なようです。つーか、そこにサンプルがあります。

WDKをインストールして、

C:WinDDK6001.18002srcstoragetoolsspti

を見ると、spti.c なソースに IOCTL_SCSI_PASS_THROUGH や IOCTL_SCSI_PASS_THROUGH_DIRECT を指定したサンプルがあります。ちなみに _DIRECT あり/なしの違いを簡単に言うと、読み書きするときのバッファの取り方が違います。_DIRECT なしの場合は、いったんドライバー内部のデータに読み込んだ後にユーザーの指定バッファに転送、_DIRECT ありの場合は、ドライバー内部を経由せずに直接ユーザー指定のバッファに転送します。ってのが、spti.htm に書いてあります。

WDKの入手先は、Microsoft Connect Web サイト か MSDN サブスクリプションとなっています。が、私の見た限り MSDN サブスクリプションには WDK が無い(?) ので、Microsoft Connect Web サイトのほうでダウンロードしました。

ci090527105535

Alcohol 52% でマウントしたCDを以下のソースで読み取ることができたみたいです(データの解析をしていないので、本当に読み込んだかどうかは後日)。

    printf("            *****       READ DATA BUFFER operation         *****n");
 if ( dataBuffer == NULL ) {
      dataBuffer = AllocateAlignedBuffer(sectorSize,alignmentMask, &pUnAlignedBuffer);
 }
    ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));
    ZeroMemory(dataBuffer,sectorSize);</pre>
    sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
    sptdwb.sptd.PathId = 0;
    sptdwb.sptd.TargetId = 1;
    sptdwb.sptd.Lun = 0;
    sptdwb.sptd.CdbLength = CDB12GENERIC_LENGTH;
    sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN;
    sptdwb.sptd.SenseInfoLength = SPT_SENSE_LENGTH;
    sptdwb.sptd.DataTransferLength = 2352; // SPT_SENSE_LENGTH;
    sptdwb.sptd.TimeOutValue = 2;
    sptdwb.sptd.DataBuffer = dataBuffer;
    sptdwb.sptd.SenseInfoOffset =
       offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf);
//    sptdwb.sptd.Cdb[0] = SCSIOP_READ_DATA_BUFF;
//    sptdwb.sptd.Cdb[1] = 2;                         // Data mode
//    sptdwb.sptd.Cdb[7] = (UCHAR)(sectorSize >> 8);  // Parameter List length
//    sptdwb.sptd.Cdb[8] = 0;

    sptdwb.sptd.Cdb[0] = SCSIOP_READ_CD;
    sptdwb.sptd.Cdb[2] = 0;                        
    sptdwb.sptd.Cdb[3] = 0;                        
    sptdwb.sptd.Cdb[4] = 0;                        
    sptdwb.sptd.Cdb[5] = 0x10;    // どのセクタを読み込むか
    sptdwb.sptd.Cdb[8] = 1;   // 1セクタ分読み込む
    sptdwb.sptd.Cdb[9] = 0xF8;
    length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER);

    status = DeviceIoControl(fileHandle,
                             IOCTL_SCSI_PASS_THROUGH_DIRECT,
                             &sptdwb,
                             length,
                             &sptdwb,
                             length,
                             &returned,
                             FALSE);

肝心のデジタルフォトミニアルバムのほうは読み込めない。何故に?というか、CDB(Command Discripter Block)をきちんと設定していないので、まぁそりゃそうなんですが。このあたりのコマンド、どういうのを送るのかと言うのが良くわからん。「SPTIによる制御法」を読むとコマンド仕様については、以下を参照のこと、
Information Specification for ATAPI DVD Devices
ftp://ftp.seagate.com/sff/INF-8090.PDF

となるので、これを詳細に読むのかな?

カテゴリー: 開発 | デジタルフォトミニアルバム(仮2)解析 はコメントを受け付けていません