2009年3月5日木曜日

Win32APIでDLLの関数を呼ぶ

DLL
extern "C" {
struct P3 {
char* a;
char* b;
wchar_t* c;
};

void __declspec(dllexport) study2(P3* ptr)
{
ptr = ptr;
ptr->c[0] = L'希';
}
}
Ruby
#!/usr/local/bin/ruby -Ku
# -*- encoding: utf-8 -*-
require 'Win32API'
require 'nkf'

def sjis(x)
NKF.nkf('-m0 --ic=utf8 --oc=cp932', x)
end

def utf16le(x)
NKF.nkf('-m0 --ic=utf8 --oc=utf-16le', x)
end

fn_study2 = Win32API.new('Study.dll', 'study2', %w(p), 'v')
x = [ sjis("hello"), sjis("world"), utf16le("あかさた") ]
fn_study2.call(x.pack("ppp"))
puts(NKF.nkf('-m0 --ic=utf-16le --oc=cp932', x[2]))

2009年3月2日月曜日

RubyのWin32APIとUNICODE

Ruby-1.9.1でWin32APIを使ってUNICODE文字列を渡す例。
#ほとんどRubyリファレンスマニュアルのコピペ。

#!/usr/local/bin/ruby
# -*- encoding: utf-8 -*-

require 'iconv'
require 'Win32API'

class Win32API
MB_OK = 0

@@messagebox = nil

def self.MessageBox(wnd, text, caption, type = MB_OK)
@@messagebox ||= Win32API.new('user32', 'MessageBoxW', %W(p p p i), 'i')
@@messagebox.call(wnd, text, caption, type)
end
end

a = Iconv.iconv('utf-16le', 'utf-8', 'やぁ')[0]
b = Iconv.iconv('utf-16le', 'utf-8', 'うあは??')[0]
Win32API.MessageBox(0, a, b)

2009年2月16日月曜日

MacFUSE + NTFS-3G で起動ディスクからWindowsが消えた!

結論を先に書くと、起動ディスクのリストに表示されないだけで起動することは可能。

NTFSを読み書きできる!と喜んでいたのもつかの間、さてWindowsで起動しようと環境設定から起動ディスクを選択しようとしたところ・・・

あれ?

Windowsのパーティションが起動ディスクに表示されていない?

NTFS-3Gをインストールした直後だったのでこれ以外に邪魔しているものはいないだろう。
うむぅ。

起動ディスクの選択肢に表示されるための条件はよくわからないが、パーティションのブート情報が書き換えられてしまったのかも・・・と最悪の状況も覚悟しつつ、とりあえずNTFS-3GをDisableにしてMacを再起動する。

しかし表示されない。

あぁぁぁ

幸いMacでマウントは可能なので必要そうなファイルをバックアップして、Windowsのインストールメディアを探して・・・

そうしている間にふと気がついた。iMacを起動するときに起動するOSを選ぶ機能があったはず!
コントロールキー押しながら起動だっけ?コマンドキー押しながら?オプションキー押しながら?
あー覚えてない。

一通り試してみたけど全部だめ。だめというのは起動できないのではなくて、選択画面にならないだけ。
Bluetoothがだめなのか?と疑って、たまたま机の上にあったUSBのキーボードを接続して再挑戦。
Altキー押しながらで成功。やったWindowsを選べる。という流れで無事Windowsを起動することができた。

さてApple Wireless Keyboardではだめだった理由はわからないが、iMacを再起動するのではなく、Mac OS Xを完全にシャットダウンした状態で、Optionキーを押しながらiMacの電源を入れると起動ディスクの選択ができた。再起動ではだめだったのね。知らなかったよ。

WindowsからはタスクトレイのBootcampでMacで再起動が普通に機能する。
MacからWindowsに変えるのは一手間かかるようになったけれど、NTFSを読み書きできる便利さをとることにした。

いや~よかった。

Lenovo IdeaPad S10e はじめました

衝動買いに近いけど、ついに買いました。49800円。

それでもEeePCがリリースされた頃からリサーチしてきたし
ネットブックの中でも最後発と言われるS10e
そろそろネットブックの第1世代が出そろったのでは?と思う。

ネットブックのCPUがAtomに集約されてきたことで、ベンダーはハードウェア構成の選択肢がほとんどないらしい。だからどのネットブックもほとんど同じ。

その中でIdeaPadを選んだ理由は
  • デザインが気に入ったこと
  • 6セルバッテリーが標準で約5時間稼働すること
  • キーボードに慣れられるとおもったこと
  • QuickStartを触ってみたかったこと
  • Lenovoというブランド
そんなところかな。

バレンタインデーに発売された新色のブルーとホワイトで迷ったけれど、運良く(逆か?^^)川崎のビックカメラにはホワイトしか在庫がなかったのでホワイト。パンフレットやWebの画像で見るよりも綺麗だなという印象。

さてどうカスタマイズしていこうかな~
しばらく楽しめそう。

2009年2月10日火曜日

MacFUSE + NTFS-3G

Bootcampを使ってインストールしたWindowsのNTFS領域を読み書きするために試してみた。
ダウンロードしたソフトは次の2つ。
  1. MacFUSE-2.0.3,2.dmg
  2. NTFS-3G_2009.1.1u1-stable-catacombae.dmg
両方ともインストーラ(.pkg)をクリックしていくだけでインストール完了。
NTFS-3Gのインストールの後に再起動を求められた。
再起動のあと、システム環境設定に2つのアイコンが表示されている。
Windowsのドライブも通常通り表示されているのだが、情報を見たところNTFS-3Gの表記が!
試しにフォルダを作成してみたところ問題なく作成できた。
想像していたよりも簡単だった。
さすがMac。

MacFUSE
http://code.google.com/p/macfuse/

NTFS-3G for Mac OS X
http://macntfs-3g.blogspot.com/

2009年1月28日水曜日

boost::lambdaで引数なしのラムダ関数を作る

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

clsss DefineCleanup
{
public:
DefineCleanup(const boost::function<void()>& finalizer)
: finalizer_(finalizer) { assert(finalizer_); }
~DefineCleanup() { finalizer_(); }
private:
const boost::function<void()> finalizer_;
};

void test()
{
static bool someone_is_inside = false;
if(someone_is_inside){ return; }
someone_is_inside = true;
DefineCleanup set_guard_false_later(boost::lambda::var(someone_is_inside) = false);

// ....
}


これは再帰呼び出しを防ぐ例。
スレッドセーフじゃないとか問題はいろいろあるだろうけれど、そこは主題じゃないから無視。


AIRアプリのウィンドウを動かす方法+ウィンドウをリサイズする方法

systemChromeをnoneにして、半透明ウィンドウを作り、タイトルバーを自作するようなときに、ウィンドウを自力で動かす必要があるのだけれど・・・どうすればよい?

わかってみれば時間がもったいなかったなと思えるほど簡単。ウィンドウを動かすのは、
nativeWindow.startMove();
これだけ。

同様に必要になるであろうウィンドウのリサイズは
nativeWindow.startResize(NativeWindowResize.TOP);
これでできる。