Wednesday, December 30, 2009

win7に触った

電車の中でのメモ用にネットブック購入。
さっそく使い倒してます。

今回初めてのwindows7にはとまどいっぱなしです。
とくに、タスクバーの変わり方は激しい・・・
通知アイコンもすっきりしすぎて、最初は物寂しい感じに見えます。
ウィンドウ最小化表示も、これまでよりだんぜんすっきりさっぱり。
同じアプリケーションの複数ウィンドウは最初っから1個のタブにまとまっていて、
あれ?あのウィンドウどこ?
1個にまとまってるけど、わざわざ開けてまた探すの?
という感じでした。
でも、使っていたら、違和感なくなってきます。
つまりは、これまでのwindowsがいかに無駄なものを画面に出しっぱなしにしていたか、
ということだと思います。
少し非力なCPUでもaeroの動きはまったく問題ありません。

ネットブックの種類はいろいろ考えました。
最終的には、AcerのAspire one AOD250-bp18
決め手はキーボード。
108キーボードでばりばり打ち込むためには、
キーボードサイズは小さすぎてはだめ・・・
工人舎のPAやシャープのnetwalkerも機能面で
要件を満たしていたが、最後はキーボードサイズでした。
重さは、持ち運びにはぎりぎりの1.2kgです。

ちょっと試したことを列記しておきます。
・win7の提供機能はvistaとほぼ同じ。
 ・キーマップの変更も同じレジストリいじる感じ
 ・firefoxやら秀丸で動きをチェック。vistaとまったく変わらない。
・ユーザの権限管理が厳しくなった気がする


また気づいたことを報告します。

win7ni

Monday, November 23, 2009

windowsでプログラミング(makeで・・・

java関連で、windows環境のmakeについて、些事。

makeをしたいだけなのにcygwinのmakeがうまくいかなかったです。
どうやら、cygwinはmakefileに書かれた、もしくは環境変数に設定された
ドライブの文字(C:, D:, etc)を読めないらしいです。
[GNU make w32 v3.81]
$(realpath)と言う関数を使いなさいという、リファレンスあり。
しかし、自分の技術力と理解力が足りないので、できませんでした。

裏技、っていうか、タダ強引に、MinGW+MSYS(最小パッケージを謳う
windows上のコンソール環境)をダウンロード、インストールしてmakeしました。
MinGWについてくるmakeはうまくうごかないので、
MSYSのmakeを換わりに使いました。
具体的には、環境変数を書き換えて、MSYS直下を優先的に参照するようにします。
そうしたら、やっとmakeが通りました。
・・・
cygwinとmake勉強しなおそう。

Java備忘録 Rを使う

JavaプログラミングでR(統計ソフト)を使う
→JRIをインストールする・もしくはRserveをインストールする
(Rserveが簡単、おすすめ)
JRIでR
Java から R の機能を呼び出し (Rserve を使用)
BugTrack-R備忘録/14 - Rのお部屋::あーるのおへや

Saturday, November 21, 2009

相模run I

Tuesday, September 01, 2009

閑話:javascriptは読みやすいのか

プログラムのソースコードを読む作業は、はっきり言って地引網を手繰るようなものだとおもう。
ソースコードは漁場で、読む人の能力は地引網だ。

ソースコードなんてものは、作った人が「あー、あーしてこーして」って気ままに書いたメモのようなもんだとおもう。
もちろん、書き方をちゃんと知ってる人が書けば、誰でも読めるものにはなる。
手入れをしっかりした養殖場で地引網を引けば、だれでも獲物を引っ掛けられる。

読む人によっては、網がとっても広いので、たくさんの情報を一気に得られる。
どんな漁場でも、網を操る人がすばらしければ、それなりの勘で獲物を引っ掛けちゃうもの。
でも、普通の人はねぇ。

javascriptのソースコードってのは、なんていうか、膨大な海全体なようです。
どこを狙えばいいのかわかんないよ。
ヒントがないんですよ。

ぐちってもしょうがないな。firefoxのプラグインかなんかに読みやすくしてくれるツールあったりすんのかな?

jQueryプラグイン勉強II

さらにjQueryプラグイン作成の勉強。
というよりJavaScriptの勉強。

JavaScriptは、どんな形のオブジェクトも、宣言なしで作れるようです。
オブジェクト初期化子(Object Initialiser) {} - bnote

JavaScriptには、少し変わった式がある。オブジェクト初期化子を使用することで 指定した名前のプロパティに初期値を持つオブジェクトを返します。

var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}

上記例では、{}で囲まれたCreateプロパティの部分が該当します。



「いきなり定義もしていないクラスのインスタンスを作るのか?」
と、C++とJavaを経験してきた私としてはかなりびっくりな初期化ですね。
多くのプラグインの中で多用されています。


なんでこんなことができるのか、はこちらを参照したほうがよさそうです。
JavaScriptは、オブジェクトというものに、とても自由度を持たせているようです。

JavaScript: オブジェクト指向の手法によって高度な Web アプリケーションを作成する
JavaScript オブジェクトはディクショナリである
C++ や C# では、オブジェクトというとクラスや構造体のインスタンスを意味します。オブジェクトにはプロパティやメソッドが含まれていますが、それらはオブジェクト がどのテンプレート (クラス) からインスタンス化されたかによって異なります。このようなことは JavaScript オブジェクトにはありません。JavaScript では、オブジェクトは名前と値のペアの集まりに過ぎません。

jQueryプラグイン

jQueryのプラグイン作成のため、javascriptの勉強中。
なぜプラグインのソースが
(function($){....})(jQuery)
で始まるのかがなぞだった。
下記サイトを参照して解明。

1.無名関数の仮引数に実引数を代入する方法↓
(function(str){alert(str)})("hoge")

2.これを使ってjQueryのプラグインをセキュアに作成する。
jQueryは、$という変数をjQueryのエイリアスとして用いる。

でも$はprototypeでも使用するエイリアス。
だから、混同するのを回避するため、プラグイン内だけでも
"$ = jQueryなんですよ"と明示したい。
そのとき、1.の無名関数が使える。
コードブロック内で$を規定して、混同を回避しちゃうのだ。
jQueryと他のライブラリを同時に使用する方法 [ jQuery ] - StackTrace

また、無名関数の引数に jQuery を渡し、仮引数に $ を使用すれば「(function($) { ... })(jQuery);」、そのコードブロック内で jQuery の $ 関数を使用することが可能です。(そのコードブロック内では、他のライブラリの $ 関数は使用できなくなります。)

Sunday, August 30, 2009

python <-> c

pythonからcのdllを呼べるらしい。

C/C++で作成したDLLのテストをPythonで行う - ベイダー日記

windows vistaのファイルパーミション変更(CLI)

icaclsコマンドを使うらしい。
参考:http://pasofaq.jp/windows/command/other.htm#nameicacls

Wednesday, August 19, 2009

mebius has good touch pad

im looking forward to Mebius's next version.
Lighter, please. (1.47kg seems heavier than other netbooks)
And Windows 7 compatibility.

from twitter

Tuesday, July 28, 2009

コアになるプログラミング言語って

最近、趣味と実益を兼ねた日曜プログラミングを続けている。
会社ではJava、うちではC言語系列を使っている。
その過程で、一つ一つ解決していくたびに、人間とはしょうがないもので、
欲がどんどん出てきて、あれもこれも機能を搭載したくなる。
そうすると、プログラミング言語の限界を感じ、次の言語へと移っていく。

①6月:(プロトタイプのコア) C言語で実装
   ↓
②7月:コアをC++/CLIへ移行
   ↓
③7月中旬:ビューをC#で作成、C++/CLIのコアと連携させる
   ↓
④7月下旬:コア全体をC++/CLIに任せるのをあきらめる。
     薄いラッパーをC++/CLIで作成。コアをNative C++に移行。
     Native C++→C++/CLI→C#の連携を実現。
     (連携方法は下記を参照した)
Vista到来。既存C/C++資産の.NET化を始めよう! - @IT

なんと、③→④で性能が体感速度2~5倍に向上した。
なんでなんだろう。多分C++/CLIはメモリ管理処理が重いんかな。
それか、inline関数などを多用して性能チューニングしていた結果が、
Native C++環境で始めて発揮されたのかもしれない。

.NET環境というハブを通して、RubyやPythonなど多言語が連携できる時代。
Lispを書いてる人の隣で、Railsを書いてる人もいる。
会社の先輩の言葉を思い出す。
「コアは生き残る言語で書け!」
大学時代から使ってきたNative C++に戻ってきたのは、運命かとも思えるこのごろ。

Friday, July 03, 2009

Dave Kees Teach English In China: Google vs British National Corpus

Dave Kees Teach English In China: Google vs British National Corpus
英語を勉強するのに、コーパスを使うのはいいのか悪いのか。
Daveはひとつの答えを出している。
「BNC(イギリスの有名なコーパス)は、
Telegramなんていう昔の言葉のほうが、Emailっつー今当たり前の言葉より
多く出てくるんだよ。使えないね。Googleのほうがまし」
確かに。

コーパスは使い方次第でよくも悪くもなる。
たとえば下の問題なら、コーパスは得意だ。

「「条件を満たす」を英訳→"xxxx the condition"
xxxxに入る動詞を探したい!」

すぐさまsatisfy the conditionが出てくるはずだ。
Googleさんの単語クラスタリングの判断基準は、
「同じ文に出てくるもの」ってな感じなので、広すぎます。
コーパスのほうが狭いが厳密。

皆さん、使い分けましょう!

Thursday, July 02, 2009

dream theaterがやりました

Mikeのサイト
DT cracks the US Top 10!!!!

最高です。
もうかれこれ15年ほど前からかなり好きな
Dream Theaterっていうプログレメタルバンドが
25年目の10枚目アルバムでbillboard top10入りしました。
リーダーのMike Portnoyも言ってるとおり、
6曲しか入ってない、しかも12分を超える曲が4曲もある、
くそ変なアルバムが、トップ6なんて!

眠れません。
今回のアルバムは良すぎて涙が出てきます。

こんなことは日本のchartでは絶対にありえないでしょう!
ライブ行きてー。早く日本に来い。

Sunday, May 31, 2009

9月まで

9月の結婚式まで、なんだか忙しい日が続きそうです。
でも、階段を上がって息がちょっと上がった感じ。
立ち止まって上を見れば、新生活の切符を切る日が近づいています。
周りを見れば、見通しがいい、景色のいい場所まで登ってきました。
横に見れば、いるのは紛れもなく、かけがえのない人です。
あとは前を見るだけです。

Sunday, May 17, 2009

C#でxiを解く方法


趣味の延長で、xiを解くC#プログラムを作成しました。

趣味で囲碁をやり始めてますが、
それとは別に、もう半年ほどやっているパズルが
xiと呼ばれるアクションパズルです。
さいころを転がして、同じ目のさいころを目の数だけくっつけると
そのさいころを消すことができる、というルールしかないパズルです。

シンプルなルールなので、全数検索的な解法探索プログラムは
・さいころを1回転がすアクションの関数
・くっついたさいころの目が一緒か判定する関数
・解法を探すという再帰的な関数
・解法という再帰的なオブジェクト
を作ればよいです。

ただ作るのは面白くないので、オブジェクト指向のC#に挑戦しました。
LIB6 stage3に挑戦させた結果、ちゃんと解法が3つ出ました。

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

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int DICEMAX = 100;
AnswerList al1, al2;
Answer a1;
Move m;
Map map, map2;
static Dir[] dirs;

public Form1()
{
InitializeComponent();
this.init();
}
public void init() {
//Graphicsオブジェクトの作成
dirs = new Dir[] { Dir.up, Dir.right, Dir.down, Dir.left };
m = new Move(1,Dir.up);
a1 = new Answer(m);
al1 = new AnswerList();
al2 = new AnswerList();
map = new Map();
map2 = new Map();

map.AddDice(new Dice(new Pos(1, 0), 4, 5, 6));
map.AddDice(new Dice(new Pos(0, 1), 6, 2, 4));
map.AddDice(new Dice(new Pos(1, 1), 5, 1, 3));
map.AddDice(new Dice(new Pos(2, 1), 4, 5, 6));
map.AddDice(new Dice(new Pos(1, 2), 3, 2, 6));
map.AddDice(new Dice(new Pos(0, 3), 6, 2, 4));
map2.AddDice(new Dice(new Pos(0, 0), 6, 1, 3));
map2.AddDice(new Dice(new Pos(1, 0), 6, 1, 3));
map2.AddDice(new Dice(new Pos(0, 1), 6, 1, 3));
map2.AddDice(new Dice(new Pos(0, 2), 6, 1, 3));
map2.AddDice(new Dice(new Pos(1, 2), 6, 1, 3));
map2.AddDice(new Dice(new Pos(0, 3), 6, 1, 3));
// map.AddDice(new Dice(new Pos(
// map.ApplyMove(new Move(0, Dir.down));
// al1.Print();
this.label1.Text = al1.GetValue();
}

private void button1_Click(object sender, EventArgs e)
{
Console.Write(map.Finished());
al1 = Search(5, map, map2, 2);
this.label2.Text = al1.GetValue();
Graphics g = pictureBox1.CreateGraphics();
//Penオブジェクトの作成(幅1の黒色)
//(この場合はPenを作成せずに、Pens.Blackを使っても良い)
Pen p = new Pen(Color.Black, 1);
//(10,20,100,80)の長方形を描く
g.DrawRectangle(p, 10, 20, 100, 80);
//リソースを開放する
p.Dispose();
g.Dispose();
}

public class AnswerList : List
{
public AnswerList() {
}
public void Extend(Move m) {
foreach (Answer ans in this) {
ans.Extend(m);
}
}
public void New(Move m) {
this.Add(new Answer(m));
}
public void Plus(AnswerList o) {
foreach (Answer ans in o) {
this.Add(ans);
}
}
public void Print() {
foreach (Answer ans in this)
{
Console.Write("{\n");
ans.Print();
Console.Write("}\n");
}
}
public String GetValue() {
String str_ = "";
foreach(Answer ans in this) {
str_ += ans.GetValue();
}
return str_;
}
}

public class Answer : List
{
public Answer(Move m) {
this.Add(m);
}
public void Extend(Move m) {
this.Insert(0,m);
}
public void Print() {
foreach (Move move in this)
{
Console.Write("{\n");
move.Print();
Console.Write("}\n");
}
}
public String GetValue() {
String str_ = "";
foreach (Move move in this)
{
str_ += move.GetValue();
}
str_ += "(end)\n";
return str_;
}
}

public class Move : Object
{
public int dice_;
public Dir dir_;

public Move(int dice, Dir dir) {
dice_ = dice;
dir_ = dir;
}
public void Print() {
Console.Write("{0},{1}\n", this.dice_, this.dir_);
}
public String GetValue() {
return String.Format("({0},{1})->", this.dice_, this.dir_);
}
}

public class Map : List {
int xmax_;
int ymax_;
Dictionary AddressDict;
public Map()
{
xmax_ = ymax_ = 4;
AddressDict = new Dictionary();
}
public bool Equals(Map o) {
int tmpdice;
foreach(Pos pos in AddressDict.Keys) {
if(!o.AddressDict.TryGetValue(pos, out tmpdice)) {
return false;
}
if(!o[tmpdice].Equals(this[AddressDict[pos]])) {
return false;
}
}
return true;
}
public bool AddDice(Dice dice)
{
if (FeasiblePos(dice.pos_))
{
this.Add(dice);
AddressDict.Add(dice.pos_, this.Count - 1);
return true;
}
return false;
}
public void Plus(Map o)
{
foreach (Dice dice in o)
{
this.Add(new Dice(dice));
}
foreach (Pos pos in o.AddressDict.Keys)
{
this.AddressDict.Add(pos, o.AddressDict[pos]);
}
xmax_ = o.xmax_;
ymax_ = o.ymax_;
}

public bool FeasiblePos(Pos pos)
{
return pos.x_ >= 0 && pos.y_ >= 0 && pos.x_ < xmax_ && pos.y_ < ymax_ && !AddressDict.ContainsKey(pos);
}

public bool Finished()
{
List checklist = new List();
List tmpdicearound = new List();
Dictionary facecount = new Dictionary();
int tmpcount = 0, tmpface = 0;
for(int i = 0; i < this.Count; i++)
checklist.Add(i);
while (checklist.Any())
{
tmpdicearound.Clear();
DiceAround(checklist.First(),tmpdicearound);
foreach (int dice in tmpdicearound)
{
tmpface = this[dice].GetFace();
if (facecount.ContainsKey(tmpface))
facecount[tmpface]++;
else
facecount.Add(tmpface, 1);
checklist.Remove(dice);
}
foreach (int face in facecount.Keys)
{
if (facecount[face] < face)
{
return false;
}
}
}
return true;
}
public bool ApplyMove(Move move)
{
bool outbool = true;
Pos nowpos, nextpos;
nowpos = this[move.dice_].pos_;
nextpos = nowpos.AddDir(move.dir_);
if (outbool = FeasiblePos(nextpos))
{
this[move.dice_].Turn(move.dir_);
this.AddressDict.Remove(nowpos);
this.AddressDict.Add(nextpos, move.dice_);
}
return outbool;
}
public bool DiceAround(int dice, List list)
{
Pos tmppos;
int tmpdice;
bool outbool = true;
if (dice >= this.Count)
return false;
if (!list.Contains(dice))
list.Add(dice);
else
return true;
foreach (Dir dir in Form1.dirs)
{
tmppos = this[dice].pos_.AddDir(dir);
if (AddressDict.TryGetValue(tmppos, out tmpdice))
{
outbool &= DiceAround(tmpdice, list);
}
}
return outbool;
// PosToDice(
}
// public Dice
}

public class Dice : Object {
int[] face_ = {0,1,2,3,4,5};
public Pos pos_;

public Dice() {
pos_ = new Pos();
}
public Dice(Pos pos, int i1, int i2, int i3)
{
pos_ = new Pos(pos);
face_[0] = i1;
face_[1] = i2;
face_[2] = i3;
face_[3] = 7 - i3;
face_[4] = 7 - i2;
face_[5] = 7 - i1;
}
public Dice(Dice dice)
{
pos_ = new Pos(dice.pos_);
dice.face_.CopyTo(face_, 0);
}
public int GetFace() {
return face_[0];
}
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType()) return false;
Dice dice = (Dice)obj;
bool outbool = this.pos_.Equals(dice.pos_);
foreach(int a in new int[]{0}) {
outbool &= (this.face_[a] == dice.face_[a]);
}
return outbool;
}

public override int GetHashCode()
{
return face_[0] ^ face_[1] ^ face_[2] ^ face_[3] ^ face_[4] ^ face_[5];
}
public void Turn(Dir dir)
{
int tmp;
switch (dir)
{
case Dir.up:
tmp = face_[0];
face_[0] = face_[1];
face_[1] = face_[5];
face_[5] = face_[4];
face_[4] = tmp;
break;
case Dir.down:
tmp = face_[0];
face_[0] = face_[4];
face_[4] = face_[5];
face_[5] = face_[1];
face_[1] = tmp;
break;
case Dir.right:
tmp = face_[0];
face_[0] = face_[3];
face_[3] = face_[5];
face_[5] = face_[2];
face_[2] = tmp;
break;
case Dir.left:
tmp = face_[0];
face_[0] = face_[2];
face_[2] = face_[5];
face_[5] = face_[3];
face_[3] = tmp;
break;
}
pos_ = new Pos(pos_.AddDir(dir));
return;
}
}

public class Pos : Object {
public int x_;
public int y_;
public Pos() {
}
public Pos(int i1, int i2)
{
Set(i1, i2);
}
public Pos(Pos pos)
{
x_ = pos.x_;
y_ = pos.y_;
}

public void Set(int i1, int i2) {
x_ = i1;
y_ = i2;
}
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType()) return false;
Pos pos = (Pos)obj;
return (this.x_==pos.x_)&&(this.y_==pos.y_);
}

public override int GetHashCode()
{
return x_ ^ y_;
}

public Pos AddDir(Dir dir)
{
switch (dir)
{
case Dir.up:
return new Pos(x_, y_ + 1);
case Dir.down:
return new Pos(x_, y_ - 1);
case Dir.right:
return new Pos(x_ + 1, y_);
case Dir.left:
return new Pos(x_ - 1, y_);
}
return null;
}
}

public AnswerList Search(int limit, Map map, Map lastmap, int dice_) {
AnswerList outList = new AnswerList();
AnswerList tmpList = new AnswerList();
Move tmpmove;
Map tmpmap;
List dicelist = new List();
map.DiceAround(dice_, dicelist);
foreach (int neighbor in dicelist)
{
foreach (Dir dir in dirs)
{
tmpmap = new Map();
tmpmap.Plus(map);
if(tmpmap.ApplyMove(tmpmove = new Move(neighbor, dir))) {
// if(tmpmap.Equals(lastmap)) {
if(tmpmap.Finished()) {
// Console.Write(tmpmap.Finished());
outList.Add(new Answer(tmpmove));
return outList;
}
if(limit == 1)
continue;
// if((tmpList = Search(limit - 1, tmpmap, lastmap, neighbor)) != null)
tmpList = Search(limit - 1, tmpmap, lastmap, neighbor);
tmpList.Extend(tmpmove);
outList.Plus(tmpList);
}
}
}
return outList;
}

public enum Dir { up, right, down, left }
}
}

Tuesday, May 12, 2009

囲碁にはまっています I -igowin-

igowinという囲碁ソフトウェアがあります。
フリーでダウンロードでき、そこそこのAIを搭載しているところが売りのようです。
そういうことから、初心者におすすめだそうです。
Igowin software for download
ubcgoclub / Beginners Training Schedule

ということで2週間ちょいちょい遊んで、4kyuというレベルをクリアできました。
4kyuでは、AIに2子置かせて9路盤で戦います。
(AIは最初に対面の三三に2子置です。)
かなり無茶をしながら、勝つことができました。
上記囲碁上達法では、これ以上igowinは無用らしいので、別の囲碁ソフトウェアで頭を鍛えることとします。
とりあえず次はGnuGoの予定。

Tuesday, May 05, 2009

英語合宿に使った本 1: 1100 words you need to know

Amazon.com: 1100 Words You Need to Know: Murray Bromberg, Melvin Gordon: Books

語彙力の強化にお薦めの本。
今、英語合宿と題してGWに引き篭もり、これを使って勉強中です。
$10にしては充実の1100語で、一語あたり1円となります(笑)

【内容】
20行程度の例文に5つの新語が入っています。
週ごとに4つの例文を読めるように準備されています。
これを1年、50週続けます。
200程度の例文で1100語をカバーするわけです。
ネイティブの高校生や大学生が勉強するためのもので、
例文は難しすぎません。でも簡単でもないです。
Wall Street Journalなどの新聞よりもちょっと簡単、と言った程度です。

【いいところ】
索引、例文サマリーあります。
前に学習した単語が後でも多用されていて復習になります。
(しかも、前に出た単語は印がついている)

【悪いところ】
プランが長い・・・一回頓挫しました。でも再挑戦中。
しかも、結構関係ない単語がばらばらに出てくる。
etymologyかなんかでまとめてくれるとうれしいんだが・・・

Wednesday, January 07, 2009

PKC:関連サイトの記述

Paroxysmal kinesigenic choreoathetosis - WrongDiagnosis.com

海外の医療情報ポータルサイトにおけるPKCの記述。

・NIH(アメリカの国立衛生研究所)は、アメリカ国内で20万件以下しか見られない希少病であるとしている
・症状は、以下の2種類
 ○意図しない運動
 ○不定期で起こり、ねじるような筋肉運動
・PKCは、外見では判らない患者だけの知りうる症状、のことも含んだりするが、
 主には、医者が外見で判定できる症状を指すらしい