リリースビルド時にNSLogをきれいさっぱり消す方法

でらうま倶楽部 : iPhone リリースビルド時に余計なコードをまとめて省く、Objective-Cなりの書き方。
http://blog.livedoor.jp/tek_nishi/archives/3449727.html

でらうま倶楽部 : Objective-C プロトコルを最短で理解するプログラム例 の記事を参考にさせて頂いたの、御礼がてら。

C言語の定番として、マクロを使うという手がありますね。以前、業務で良く使っていました。

#ifdef _DEBUG
#define NSLOG(_x) NSLog _x
#else
#define NSLOG(_x)
#endif

と定義しておいて、

void Main()
{
	// 通常の実行
	Calc *calc = [Calc alloc];
	int ans = [calc add:10 at:20];
	NSLOG(([NSString stringWithFormat:@"ans: %d", ans ]));

	// nilの場合の実行
	calc = nil;
	ans = [calc add:10 at:20];
	NSLOG(([NSString stringWithFormat:@"ans: %d", ans ]));
}

のようにログを書きます。「NLOG(( … ));」のように、括弧を2重に重ねるのが気持ち悪いですが、こうすると綺麗さっぱり消えます。まあ、ログなので括弧が2重になってもokかなと。
これの派生バージョンで、C++ では、__FILE__, __LINE__ を使って簡易的にログ出力できるようなマクロを組んだりします。

~ 追記

… が、最近の vc++ では、__VA_ARGS__ が使えるんですね。知らんかった。gcc は使えるのですが、昔の vc++ は使えなかったもので。

#ifdef _DEBUG
#define NSLOG(...) NSLog(__VA_ARGS__)
#else
#define NSLOG(...)
#endif

としておいて、

	NSLOG(@”debug message");

とかで十分。

カテゴリー: Objective-C | リリースビルド時にNSLogをきれいさっぱり消す方法 はコメントを受け付けていません

対google 用 SEO ロボットの製作メモ

ちと問題があれば、消すのですが、妄想&メモ書きということで、参考まで。

■前提

google のランキング対策として、キーワードや文章校正、タイトルタグなどの調節があるが、基本「人力」で行われている(と思われる)。それぞれ SEO 会社(あるいは Web サイトの製作会社)のノウハウがあるだろうから、そのあたりは企業秘密ということ、にしておく。

で、まともに人力でSEO対策をしても面白くないし、労力がかかるので(イコール人件費がかかる)SEO 対策自体を「自動化」する。

この「自動化」に際して、いくつかの前提条件(仮定も含む)があって、

  • google のランキングは、ロボットで行われている。
  • ランキング アルゴリズムは、多変数解析に解ける、という仮定をする。

とする。複雑な(実は単純かもしれない)と言われる、google のランキングアルゴリズムを直接解くワケではなく、「多変数解析」として未知ものを解析するように動く、という方法である。

■変数と評価関数

変数は、一般的に言われているものを含めてみる。もちろん、適当な隠れ変数を入れても ok なのだが、HTML タグなどで表しにくいので、表現しやすいものがよい。ただし、「自動化」を目指すので、人力で HTML のタグ打ちや、文章校正をするのではなく、ノウハウ自体を自動化させて、文章自体を自動生成する。

文章の自動生成は、対 google ranking アルゴリズムになる、イコール ロボットとなるので、文章の「文法が正しいかどうか」は問題ならない(と思われる)。人が見たら明らかに「文章ではない」ものであっても、google アルゴリズムに対しては、「ランキングアップに値する文章のようなもの」であれば ok というこだ。

変数の候補としては、

  • キーワードの挿入
  • キーワード同士の近さ
  • キーワードの頻度
  • 被リンクの数
  • 外部リンクへの数
  • 更新頻度
  • HTML 的な正しさ
  • H1 等の利用

となる。被リンクに関しては、後述する、複数のドメインを確保して実験をする。

評価関数は、純粋に google のランキングとなる。ログインをしない様にしてランキングを調べる。商用化する際には、yahoo のランキングも含めるとよいかもしれない。

■検索キーワード

最終目的としては、ビックキーワードと呼ばれる検索キーワード(「化粧品」や「ダイエット」など)での、ランクアップを目指す(自動化でねw)のであるが、最初の試行錯誤としては、2語ぐらいのキーワードの組み合わせがよかろう。

全く、独自のキーワードで実験をすることも可能であるが、実用性が低くなる可能性が高いので、実際のキーワードを使う。

■実験環境

多変数解析と、遺伝子アルゴリズム(単に変数を少し変えて実験を繰り返すという方式)を組み合わせるので、検索対象となる独自ドメインは最低10以上は欲しい。最終的には、100ぐらいのドメインで実験するのがよいのだが、金額的に 1,000円 x 100 = 10万円程度になるので、ちょっと遊びで出すには痛いかなぁと。投資的にはこれぐらいやってもいいんですけどね。

当面は、20 ドメインを取得して評価関数で、上位2,3までを抽出(上位10%を抽出)するのがよかろう。

実験ドメイン自体は、使い捨て(1年で廃棄)なので、gmo で、.com を 480円で取得するか、.info を 180円で大量に買うという方法もある。ただし、.com のほうが、google に有利ではないか(という仮定)があるので…と思ったけど、いいかなぁ、.info でも。

サブドメインを使う方法もあるのだが、google の場合、サブドメインはまとめられてしまう傾向にあるので、独自ドメインで実験をしたい。

お名前.comとロリポップとGoogle Appsで格安サーバ構築 | ひろぶろぐ(Hiro Blog)お名前.comの独自ドメインをロリポップサーバーで使う: アフィリエイトで月10万円計画 僕と『こびっと』とIRCモバイル無料塾の365の物語 にあるように、お名前.com で安いドメインを取得して、ロリポップで運営というのがよさそうだ。そうすると、100 ドメイン使っても、.info の 180円ならば、18,000円で、ずっと経済的である。実際は、ロリポップのチカッパ 月額515円が加わるので、 年間 3万円というところ。ホスティングを別途借りるのは、googleからのアクセス数も含めて、自前のホストには影響を与えたくないから。

さて、これで机上の空論ではないことは確認できたので(金額的に)、ちとアルゴリズムを考えますか。

カテゴリー: 仕事 | 対google 用 SEO ロボットの製作メモ はコメントを受け付けていません

Umbacro 5 をローカル環境で試してみる

一応、ExpressWeb にサイト Verifiable Plan Language を持っているのですが、面倒臭くて wordpress を入れています。慣れているというのもあるのですが、いまいち asp.net 系にするメリットが感じられなかったのです。

が、Umbraco – The open source ASP.NET CMS というのがあって、この ver.5 のほうは、asp.net mvc ベースで書き変えられているということなので、これはいいかなぁと思って、ひとまずローカルの IIS にインストールしてみましょう…ってのインストール記録ですね。

Umbraco 5 の特徴は、

  • ヨーロッパで人気のある CMS である。
  • ver.5 から asp.net mvc ベースになっている(それ以前は、web form)

ブログというよりも、コンテンツを整理してアップ、というの主力みたいですね。エクスプローラーのようにコンテンツを操作できるってのが売りのようです。

 

# ちなみに、現時点では Web Platform Installer を使って入れると、ver.4.7 が入るので、web form ベースのものがインストールされるので注意が必要です。ひとまず簡単にインストールしたい場合は、Umbraco の5分間インストール を参照すると良いです。

■デプロイ版をダウンロード

まずは、ソースをダウンロードします。

image

上の「download」ボタンをクリックして、

image

http://umbraco.codeplex.com/SourceControl/list/changesets へジャンプします。

Download のタブをクリックして、

image

のいずれかをダウロードします。違いがいまいち分からないのですが、以下は、「Umbraco 5.0 WebDeploy Package」のほうで説明します。

ダウンロード後、zip を展開すると、Umbraco というフォルダーができます。

image

この Umbraco フォルダを適当なところにコピーします。

ここでは、「d:\site\Umbraco」にコピーしました。

■IIS で仮想フォルダを設定する

inetpub\wwwroot 以下にコピーしても良いのですが、wwwroot 以下はユーザー権限が違ったりして制限が厳しいので、仮想フォルダを設定します。

IIS マネージャを立ち上げて、仮想ディレクトリの追加

image

名前は「umbraco5」にしておきます。

image

出来上がったフォルダを右クリックして、「アプリケーションへの変換」をしておきます。

image

これで、asp.net が動くようになります(web.configが作られます)。

image

■セットアップの開始

ブラウザで、「http://localhost/umbraco5」にアクセスするか、IIS マネージャで「*:80(http)参照」をクリックします。

image

「Install Umbraco 5.0.0 RTM」をクリックします。(click here も同じ)

image

Lets get started! をクリック

image

データベースを、「SQL Server 2008 R2」にするか、「SQL CE」にするか選択します。

「SQL CE」は、SQL Server Compact Edition の略で、SQLite のようにファイルベースでデータを扱えます。いつもの、asp.net のログインデータが、app_data 内に作られるのと同じデータベースです。

最初は手軽なので、「SQL CE」のほうを使ってみてください。

image

データベースができあがると、100% になります。

そして、「Continue」をクリック

image

管理者ID を入れます。ユーザー名は「admin」のままでもいいですし、適当に変えても OK。

wordpress とかと同じで、後で管理者のユーザーは追加できます。

image

いまのところ、テンプレートはひとつしかないので、このまま Install します。

image

image

Starter kit がインストールされたので、「Continue」をクリック。

image

「preview your new site」をクリックすると、作成したサイトが見れます。

「set up your new website」をクリックすると、管理画面を開きます。

image

サイトの外観

image

管理ページは、admin ユーザーを入れて、ログイン

image

こんな風に、エクスプローラ風にページを増やすことができます。

image

image

 

■Visual Studio で、コードを覗いてみる。

Visual Studio 2010 でサイト(d:\site\Umbraco5 など)を覗いてみます。

「ファイル」→「開く」→「Web サイト」を選択して、

image

「Web サイトを開く」から、該当するフォルダを選択します。

image

すると、なかなか asp.net mvc な感じのフォルダ構成になっていることが分かります。

image

Views/Umbraco/BookPages.cshtml を開くと、Razor で書かれていることが分かります。

image

試しにタイトルとかを変えてみてデバッグ実行してみると、

image

ビルドエラーがでるので…(多分、ASP.NET MVC 4 が入っているためと思われ)

image

直接、ブラウザで url を入力します。

こんな風に、テンプレートを書き換えることが簡単にできます。まぁ、それなりに試行錯誤が必要ですが。

image

■WebMatrix 2 で実行してみる

WebMatirx を使って編集することもできます。

image

この場合は、Run でデバッグ実行するとうまくいくんですけどね。何故か、Visual Studio 2010 ではビルドエラーになる。

image

 

という訳で、ローカル環境のインストールは出来そうという訳で、中身を弄るのは後日。

カテゴリー: 開発, ASP.NET | Umbacro 5 をローカル環境で試してみる はコメントを受け付けていません

アリスはvoid*がお嫌い

久々の「アリプラ」シリーズです(自分も忘れていたよ)。

void*にdeleteしてもデストラクタが呼ばれない!? – かずきのBlog@Hatena
http://d.hatena.ne.jp/okazuki/20120204/1328323854

というのを見つけて、一瞬「?」と思ったのですが、確かにそうですね。delete するときに void* を渡すと型情報が失われる…というか、delete が型情報を判別できないので、メモリとしか解放されなくてデストラクタが呼び出されません、という現象です。

配列を new したときに、「delete [] ポインタ」 で解放しないといけません。ってのと同じ話だと思います。

#include <iostream>
using namespace std;

// アリスクラス
class Alice
{
public:
	Alice() {
		cout << &quot;in constractor&quot; << endl;
	}
	~Alice() {
		cout << &quot;in destractor&quot; << endl;
	}
};

class Person
{
public:
	Person() {
		cout << &quot;in Parson::Parson&quot; << endl;
	}
	virtual ~Person() {
		cout << &quot;in Parson::~Parson&quot; << endl;
	}
};
// ロリータクラスは、Person クラスを継承する
class Lolita : public Person
{
public:
	Lolita() {
		cout << &quot;in Lolita::Lolita&quot; << endl;
	}
	virtual ~Lolita() {
		cout << &quot;in Lolita::~Lolita&quot; << endl;
	}
};

// アリスはvoid*がお嫌い
int main(int argc, char *argv[] )
{
	{
		cout << &quot;自動で解放&quot; << endl;
		Alice alice;
	}

	{
		cout << &quot;自前で解放&quot; << endl;
		Alice *alice = new Alice();
		delete alice;
	}

	{
		cout << &quot;void*で解放&quot; << endl;
		void *alice = new Alice();
		delete alice;
	}

	{
		cout << &quot;継承あり&quot; << endl;
		Lolita *lolita = new Lolita();
		delete lolita;
	}
	{
		cout << &quot;継承あり Person&quot; << endl;
		Person *lolita = new Lolita();
		delete lolita;
	}
	{
		cout << &quot;継承あり void*&quot; << endl;
		void *lolita = new Lolita();
		delete lolita;
	}
	{
		cout << &quot;継承あり void* から Lolita へキャスト&quot; << endl;
		void *lolita = new Lolita();
		delete (Lolita*)lolita;
	}
	{
		cout << &quot;継承あり void* から Person へキャスト&quot; << endl;
		void *lolita = new Lolita();
		delete (Lolita*)lolita;
	}
	return 0;
}

/* 実行結果
D:\work\blog\src\alice>alice015
自動で解放
in constractor
in destractor
自前で解放
in constractor
in destractor
void*で解放
in constractor
継承あり
in Parson::Parson
in Lolita::Lolita
in Lolita::~Lolita
in Parson::~Parson
継承あり Person
in Parson::Parson
in Lolita::Lolita
in Lolita::~Lolita
in Parson::~Parson
継承あり void*
in Parson::Parson
in Lolita::Lolita
継承あり void* から Lolita へキャスト
in Parson::Parson
in Lolita::Lolita
in Lolita::~Lolita
in Parson::~Parson
継承あり void* から Person へキャスト
in Parson::Parson
in Lolita::Lolita
in Lolita::~Lolita
in Parson::~Parson
*/

普通に void* のまま delete してしまうと、デストラクタが呼び出されませんが、delete 時に元の型(Lolita)に戻してやると、正常にデストラクタが呼び出されます。継承元の Person* に戻してもきちんと Lolita のデストラクタが呼び出されるのは、デストラクタが virtual になっているためです。

カテゴリー: C++ | アリスはvoid*がお嫌い はコメントを受け付けていません

ひと目でわかる Windows Azure アプリケーション開発入門 発売です

image

去年の夏から長々と書いてきましたが、やっとこさ、完成いたしました。お疲れ様です > 日経BP の編集の方

執筆途中に、Azure SDK が 1.4 から 1.6 まで上がってしまったり、色々風邪をひいたりして大変だったのですが、まぁ、それなりに詰め込まるものは詰め込めたかと思います。ざっとした前哨戦は、先月の .NETラボ 勉強会 2012年01月 でお話ししたので、ここでは中身の紹介をざっと。

■Windows Azure & SQL Azure の開発者向け

タイトルの通り、システム管理者向けではなくて「開発者向け」です。なので、セッティングの細かいところは飛ばして、先頭からプログラミングができるような作りにしてあります。実運用をする場合には、いくつか Azure 自身のチューニングポイントがあるのですが、そこは省略しています。

拙著の ひと目 Visual C++ や ひと目 ASP.NET MVC のように、先頭からプログラムを作って完成させていくという作りになっています。

■3つのアプリを順番に作る

Azure で開発するパターンとして最も使われる(と思われる)、3つのストレージを使ってアプリを作っていきます。

  • ブロブストレージ(XML ファイル)
  • テーブルストレージ
  • SQL Azure

という3パターンで、「どこでも蔵書管理システム」を作っていきます。

インターフェースとしては、蔵書データの一括アップロード、一括ダウンロード、新規追加や修正などの、CRUD の機能を作っています。それぞれのストレージでのデータの扱い方の違いがわかると思います。

■Web フォームを使って学習する

これは執筆前に「かなり」悩んだのですが、ASP.NET MVC ではなくて、Web フォームでアプリを作っています。理由としては、ASP.NET MVC で作ってしまうと、MVC 自体の解説も含めることになってしまい、Azure の本筋がずれてしまうこと。後、ストレージの利用の比較をするには、Web フォームのグリッドを使ったほうが違いが分かり易いということです。

なので、旧来の Web フォームで作ってありますので、MVC が分からないても大丈夫です。ええ、MVC のほうは「ひと目 ASP.NET MVC」を立ち読みして頂けるとよいかと。

連載! コードで学ぶ ASP.NET MVC アプリケーション開発入門 | Code Recipe | MSDN で学ぶのもアリです。

■開発言語は C#

これも悩んだのですが、C# で書いてあります。巷のサンプルプログラムが C# だったので、それにあわせてということで。

付録に Visual Basic 版も入れる予定だったのですが、ページ数が多くなったのと、私の体調が…ってことで、断念しております。「強い」要望があれば、Visual Basic のサンプルを作りたいと思いますので、その時は日経BPさんに要望して頂けると助かるかと。

という訳で、総ページ数 400 ページ、値段が 3,200 円(税抜)ということで、本屋さんへ go !!! … しても、まだ amazon でも予約みたいですね。発売日は 2/9 だそうです。

カテゴリー: Azure, C# | ひと目でわかる Windows Azure アプリケーション開発入門 発売です はコメントを受け付けていません

4年以内にM7級の地震が 70% の確率で発生する、を検算する

M7級首都直下地震、4年内70%…東大地震研 : 科学 : YOMIURI ONLINE(読売新聞)
http://www.yomiuri.co.jp/science/news/20120122-OYT1T00800.htm

「検算」します(笑)。

昨年3月11日の東日本大震災をきっかけに、首都圏では地震活動が活発化。気象庁の観測によると12月までにM3~6の地震が平均で1日当たり1・48回発生しており、震災前の約5倍に上っている。

同研究所の平田直(なおし)教授らは、この地震活動に着目。マグニチュードが1上がるごとに、地震の発生頻度が10分の1になるという地震学の経験則を活用し、今後起こりうるM7の発生確率を計算した。

という情報から、

  • M3の地震が 1.48回/日 以上
  • マグニチュード(M)が1上がるごとに、発生頻度が1/10 になる。

ということは、M7 の発生頻度は以下になる。

1.48 x 0.1^4 = 0.000148回/日

4年間(365×4)= 1460日間に1回以上発生する確率は、

1.0 – (1460 日間に1度も発生しない確率)

に等しいので、

1.0 – (1 – 0.000148)^1460

となる。

1.0 – 0.805657962 = 0.194342038 = 20% 弱

おいおい…確率が小さすぎますね。

ここで「M3からM6」の確率なので、中間のM5.5の場合に1.48回/日 以上として検算し直すと、

1.48 \times 0.1^1.5 = 0.0468回/日
1.0 – (1-0.0468)^{1460} = 限りなく1に近い(笑)

ので、もうちょっと1日の地震確率が低くないと駄目ですね。

今度は、70% という確率から逆算してしまいます。

0.7 = 1.0 – ( 1 – x )^1460

の方程式を解けばよいので、

(1-x)^1460 = 0.3
1460 \times log(1-x) = log 0.3
log(1-x) = log(0.3)/1460 = -0.000358136
1-x = 10^-0.000358136 = 0.999175701
x = 0.000824299

ということで、1日あたりのM7の地震を

0.00082回/日

という想定で計算していることになります。

これがどれくらいの頻度かというと、「震災前の約5倍」という表現から、震災前は、0.000164回/日となるので、M3の地震が1.48回/日 以上という、最初の初期値と同じになります。そうなると、震災前って、1日に1回はM3の地震って起きていたっけ?ってことになるのですが…ないですね。変ですねw、おそらく計算の前提が間違ていると思われます。

この、4年以内にM7の地震が起こるとか、30年以内にM7の地震が起こるという根拠も実は、同じ計算法から出されているもので、

3月11日以降の首都圏の地震活動の変化について | 東大地震研 広報アウトリーチ室
http://outreach.eri.u-tokyo.ac.jp/eqvolc/201103_tohoku/shutoseis/

なんだかねぇ、マスコミ報道も報道ですが、地震研も地震研ですね。大雑把すぎます。

まず、科学的な比較法としての

  • 震災前のM3以上の地震確率、その後のM7以上の地震の確率の統計情報
  • 経験則で1つマグニチュードが上がると確率が10%になる根拠(経験上のデータ)
  • 現状の日単位のM3の地震の確率、ばらつき

が必要なわけで、統計学的に駄目駄目かと(苦笑)。

ま、兎も角、東大地震研の試算でいえば、日単位でM7の地震が起こる確率は、「0.00082回/日」とのことです。1000分の1弱の確率なので結構高い見積といえば見積もりですが、毎日1000回サイコロを廻して、1が出る確率が200回に1回ぐらいだと思えば、それほどびくびくするこはありませんね。

ちなみに「地震研」の発表が大ざっぱというのは、

  • M3地震の確率からM7と拡大させるときに、震災後の余震と前兆との区別ができていない。
  • よって相関はあっても、因果関係がないので、論理的思考ができていない。論理的な手順を踏んでいない。

ということです。

■補記

3月11日以降の首都圏の地震活動の変化について | 東大地震研 広報アウトリーチ室
http://outreach.eri.u-tokyo.ac.jp/eqvolc/201103_tohoku/shutoseis/

ブログを書いた後にアップされたので、追記。

「誘発地震」と「余震」を区別せずに推測値を出しているので、誤差が大きいかなと。去年の9月で出した計算だそうなので、再度今年に入った数値で計算し直して、推測値の推移を示してほしいものです…と思った。

定点による経過観測をしていないので、増減が分からないのが問題かと。震災前との直接比較だと、震災時の余震の影響度が分からないので、震災後からの数回の観測値から推移を計算するのがベターかと。まあ、地震に関しては、素人なのでこれまで。確率に関してはセミプロですが。

カテゴリー: 雑談 | 4年以内にM7級の地震が 70% の確率で発生する、を検算する はコメントを受け付けていません

Entity Data Model のテーブル/カラム名を一括で変更 ModifyEdmx

LINQ to Entities で扱う Entity Data Model のテーブル名やカラム名を変更するツールです。
用途としては「wordpress のデータベースを mysql から読み込んだんだけど、wp_ なにやらというテーブル名がいやらしいし、post_id とかじゃなくて PostId がいいんですッ!!!」という時に使います。非常にピンポイントですねw

のように、テーブル名とカラム名を変更できます。Visual Studio 上でちまちまとやってもいいのですが、一気にできるということで。テーブル名のマッピングは *.edmx ファイルを直接弄らないと駄目なので、ツールを使う価値はあるかと。

左上の「一律変更」ボタンをクリックすると、.NET 標準の upper camel calse に変換します。「post_id」だったら「PostId」という具合ですね。カラム名をひとつずつ変換することもできます。

保存先は元の *.edmx ファイルで良いのですが、保存した後に Visual Studio に認識させるのがちょっと面倒で。保存しただけでは、*.Designer.cs ファイルが書き換えられないので、保存した後に *.edmx ファイルを開いて、テーブルの位置なんかをずらします。そうすると、Visual Studio が更新を認識してくれるので、*.Designer.cs が更新されるという具合です。このあたり、edmgen.exe で変更できるのかと思うのですが、ちょっとわからないので、そのままで。

実行ファイルは、こちら。 ModifyEdmx.0.1.zip
ソースコードは、ModifyEdmx at master from moonmile/etc – GitHub からダウンロードしてください。

カテゴリー: ツール, C# | Entity Data Model のテーブル/カラム名を一括で変更 ModifyEdmx はコメントを受け付けていません

LINQ で使う Entity Data Model を編集する(前哨戦)

LINQ to MySQL を使って wordpress のデータベースを弄ろうとするときに障壁になるのが、Entity Data Model の自動マッピングです。

のように、自動でマッピングしてくれるのですが、「wp_」のプレフィックスが邪魔だったり、「post_author」のように命名規則が.NET風ではなかったり(C# だったら「PostAuthor」と書きたいところ)。だから、このテーブル名やリスト名を変更したいと思うわけです。

Visual Studio 上でちまちまと名前を変えることもできるのですが、実は *.edmx ファイルを直接書き換えても、マッピングするときの名称を変えることもできます…と言いますから、デザイナ自体がこの *.edmx ファイルを参照しています。

そのまま *.edmx ファイルをエディタで修正してもいいのですが、どうせならば、ざっと効率よいやり方で編集したい、と思う訳です。

こんな風に、データグリッドを使って編集できればよいかなと。

手元の ExDoc を使って XML ファイルを操作すると、こんな感じです。

string _filename = @&quot;Model1.edmx&quot;;
EXDocument _doc = null;

/// <summary>
/// 読込ボタン
/// </summary>
/// <param name=&quot;sender&quot;></param>
/// <param name=&quot;e&quot;></param>
private void button1_Click(object sender, EventArgs e)
{
	_doc = new EXDocument();
	_doc.Load(_filename);

	// リストにテーブル名を表示
	EXElements tables = _doc * &quot;EntitySet&quot; % &quot;store:Type&quot; == &quot;Tables&quot;;
	listBox1.Items.Clear();
	foreach (var el in tables)
	{
		Debug.Print(&quot;table: {0}&quot;, el % &quot;Name&quot;);
		listBox1.Items.Add(el % &quot;Name&quot;);
	}
}

/// <summary>
/// リスト選択
/// </summary>
/// <param name=&quot;sender&quot;></param>
/// <param name=&quot;e&quot;></param>
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
	if (listBox1.SelectedIndex == -1) return;
	string name = (string)listBox1.SelectedItem;
	EXElement el = _doc * &quot;MappingFragment&quot; % &quot;StoreEntitySet&quot; == name;
	var items = from t in el / &quot;ScalarProperty&quot;
				select new ScalarProperty
				{
					Name = t % &quot;Name&quot;,
					ColumnName = t % &quot;ColumnName&quot;
				};
	dataGridView1.DataSource = items.ToList();
}

/// マッピングクラス
/// </summary>
public class ScalarProperty
{
	public string Name { get; set; }
	public string ColumnName { get; set; }
}

手前味噌ですが、XML ファイルを直感的に扱えるのでコーディングが結構楽かなと。あと、返す値が List なので、実はそのまま LINQ が使えます。これは結構便利かも。
と言いつつ、ExDoc の Save 機能はあまりきちんと実装していないんですよね。この機会に少しテストをしますか。

カテゴリー: C#, EXDoc | LINQ で使う Entity Data Model を編集する(前哨戦) はコメントを受け付けていません

ほむほむzip内検索のメモ書き

「残念、さやかちゃんでした」…じゃなくて、zip 内比較をしようと思って C# で扱える zip ライブラリを探してみる。

J’s Memo: C#でZIPファイルの生成
http://beginnerdiver.blogspot.com/2009/01/czip.html

GZipStream クラス (System.IO.Compression)
http://msdn.microsoft.com/ja-jp/library/system.io.compression.gzipstream.aspx

gzip を扱うのであれば、標準で用意されている GZipStream クラスを利用すればよいかな、と思っているわけですが、私がやりたいのは

  • windows 上で圧縮された zip 内を検索
  • zip 圧縮はいらない。
  • zip 解凍はメモリ上でやりたい。

ので、GZipStream クラスでは駄目なのかなぁ。解凍すればよいだけなので、

DotNetZip Library
http://dotnetzip.codeplex.com/

あたりが候補になります。

Ionic Zip Library v1.9.1.6 – Table of Content
http://cheeso.members.winisp.net/DNZHelp/

にあるサンプルコードを見ると、以下のように foreach で ZipEntry オブジェクトを列記できる模様。

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(TargetDirectory);
  }
}

次のように、OutputStream が使えるので、MemoryStream に渡せばメモリ上で操作可能

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(OutputStream);
}

■おまけ

プログラミング言語「ほむほむ」 – ゆろよろ日記
http://d.hatena.ne.jp/yuroyoro/20110601/1306908421

というのがあるそうです。「ほむ」だけじゃなくて「ほむ~ん」とか「ほむほむ」とか、色々混ぜると面白いカモ。

カテゴリー: 開発, C# | ほむほむzip内検索のメモ書き はコメントを受け付けていません

電王戦 ボンクラーズの勝利ッ!!!

A級リーグ指し手1号
http://aleag.cocolog-nifty.com/

電王戦リアルタイム実況 by やねうらお – やねうらお-よっちゃんイカを食べながら、息子語録を書き綴る
http://d.hatena.ne.jp/yaneurao/20120114#p1

電王戦観戦記 ほかではあまり語られない舞台裏
http://weekly.ascii.jp/elem/000/000/072/72605/

将棋、囲碁とあまりに弱い(でも普通ぐらいには強い…かな。いや、弱いかも)ので、電王戦にはいまいち興味が持てずにいるのですが、ちと古い記事ですが、

ボンクラーズが勝った。そうです。

vlcsnap-2012-01-31-09h16m49s147

ええ、正式名称は「bonkras」なんですが、どうやら名称元は↑らしい。実に「爽快」ですね。

将棋とか囲碁、オセロもそうですが、時間があれば必ず解ける(勝てる)問題なので、アルゴリズム自体と高速化に頭を費やせる解決可能な問題です。これはこれで面白そうなので、4年ほど前から考えてはいたのですが、いや、先人が多くて無理、というのと私自身が弱くて無理。開発者の伊藤英紀氏はどうなんでしょう?そこそこ強いのだと思いますが。

名前が痛快ですね(イタイという意味でもw)はさておき、

ブレードサーバーを6枚使わないと米長名人に勝てないのか、そうなると、米長名人の頭の中のアルゴリズム(らしきもの、直感も含めて)はどうなっているんでしょう?ということになるわけで、実は棋士一般に云えることで、

  • 将棋盤のパターン化で覚える(月下の棋士のように?)
  • 膨大な棋譜(記憶にある棋譜)から、似たようなパターンを思い描く。
  • 似たようなパターンと、違いを見出す。
  • 先読みをする。

といういくつかのパターン化と、アルゴリズム化(決定論という意味で)が混じっています。ボンクラーズなどの将棋アルゴリズムがやることをは、最後の「先読み」を膨大に進めることで、その他の「パターン化」を補っている、と考えられます。ええ、考えられます、ってのは、ボナンザなどなどアルゴリズムを覗いたわけではないので、想像です。

逆に言えば、パターン化を進める、パターン化による省略化、省力化によって、人や動物は変化に瞬時に対応するわけでそのあたりお「いい感じ」(via 岸和田博士)にしてしまうのが、最近の私の目標かなぁと。ちと、他に頭が廻っていますが、また opencv に頭を戻していきます。そうそう、特徴点抽出による物体認識も、初手はテンプレート検索になってしまうので、このあたり認識スピードや卵と鶏の関係っぽいですね。もうちっと、大ざっぱにやりたいと思い直しています。

余談ですが、中村太地五段がボンクラーズの代理をして指しているのを、ロボットが指すと、痛さ倍増かもと思ったりして。このあたりが目標ですね。

カテゴリー: 雑談 | 電王戦 ボンクラーズの勝利ッ!!! はコメントを受け付けていません