<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/ME2.1.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>7bitlog</title>
	<link>http://nanabit.net/blog</link>
	<description>Programming</description>
	<pubDate>Sat, 09 Aug 2008 04:21:31 +0900</pubDate>
	<generator>http://wordpress.xwd.jp/?v=ME2.1.3</generator>
	<language>ja</language>
			<item>
		<title>US/JISキーボードで片手(左手)入力 RibbitPad [AutoHotKey]</title>
		<link>http://nanabit.net/blog/2008/08/09/ribbitpad-100/</link>
		<comments>http://nanabit.net/blog/2008/08/09/ribbitpad-100/#comments</comments>
		 <pubDate>Sat, 09 Aug 2008 13:21:31 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[AutoHotKey]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/08/09/ribbitpad-100/</guid>
		<description><![CDATA[普通のUS配列かJIS配列のキーボードを使い、左手だけで入力を可能にするAutoHotkeyスクリプト、RibbitPad v1.00を公開しました。
RibbitPad
コンパイル済みexeとahk...]]></description>
			<content:encoded><![CDATA[普通のUS配列かJIS配列のキーボードを使い、左手だけで入力を可能にするAutoHotkeyスクリプト、RibbitPad v1.00を公開しました。

RibbitPad [1]
コンパイル済みexeとahkが入手可能です。

スペースバーと右Altキー(または変換キー)を2種の修飾キーとして用います。
配列図は以下の通り。



[1] http://nanabit.net/blog/softwares/autohotkey/ribbitpad/]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/08/09/ribbitpad-100/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SIMDで画像スケール変換 (bilinear) [雑記,プログラミング,C++]</title>
		<link>http://nanabit.net/blog/2008/07/29/simd-image-scaling-bilinear/</link>
		<comments>http://nanabit.net/blog/2008/07/29/simd-image-scaling-bilinear/#comments</comments>
		 <pubDate>Tue, 29 Jul 2008 00:03:59 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[雑記]]></category>

		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/29/simd-image-scaling-bilinear/</guid>
		<description><![CDATA[引き続きSIMDの練習。
モノクロやネガのようにリニアに読み書きすればいい処理と違って、y方向近傍を読まざるを得ない座標変換が入ると、キャッシュミスによる遅延が効いてきそうですが、避けて通るわけにも行...]]></description>
			<content:encoded><![CDATA[引き続きSIMDの練習。

モノクロやネガのようにリニアに読み書きすればいい処理と違って、y方向近傍を読まざるを得ない座標変換が入ると、キャッシュミスによる遅延が効いてきそうですが、避けて通るわけにも行かないので挑戦してみます。
まずは画像のスケール変換を書いてみました。

static wxImage ResizeImage(wxImage &#38;src_image, double size) {
　int src_real_w = src_image.GetWidth();
　int src_real_h = src_image.GetHeight();
　int dst_real_w = src_real_w*size;
　int dst_real_h = src_real_h*size;
　// 実際のビットマップの大きさ
　int dst_w = std::min&#60;int&#62;(src_real_w, src_real_w*size);
　int dst_h = std::min&#60;int&#62;(src_real_h, src_real_h*size);
　int src_w = dst_w*src_real_w/dst_real_w;
　int src_h = dst_h*src_real_h/dst_real_h;
　
　if (dst_w*dst_h&#60;=4)
　　return wxImage();

　unsigned char* src = src_image.GetData();
　unsigned char* src4 = (unsigned char*)malloc(src_w*src_h*3*4);

　int aligned_dst_size = dst_w*dst_h*3;
　aligned_dst_size += 3-(aligned_dst_size+3)%4;
　unsigned char* dst = (unsigned char*)malloc(aligned_dst_size);
　unsigned char* dst4 = (unsigned char*)malloc(dst_w*dst_h*3*4);
　// byte =&#62; DWORD
　for (int v=0; v&#60;src_h; v++)
　　for (int u=0; u&#60;src_w; u++) {
　　　int p_s = (v*src_real_w + u)*3;
　　　int p_s4 = (v*src_w + u)*3*4;
　　　src4[p_s4 + 0] = src[p_s + 0];
　　　src4[p_s4 + 4] = src[p_s + 1];
　　　src4[p_s4 + 8] = src[p_s + 2];
　　}
　switch (0) {
　　case 0: {
　　　// bilinear
　　　// 参照先srcを越えない範囲
　　　int v_to = std::min&#60;int&#62;(dst_h-1, (src_h-1)*size);
　　　__m128 xmm_dummy;
　　　float dummy = 0;
　　　/* 水平用 */
　　　xmm_dummy = _mm_load1_ps(&#38;dummy);
　　　// RGB一括ロードのマスク
　　　__m128i xmm_mask;
　　　xmm_mask.m128i_i32[0] = 0x000000ff;
　　　xmm_mask = _mm_shuffle_epi32(xmm_mask, 0);
　　　xmm_mask.m128i_i32[3] = 0;
　　　
　　　char *buf = (char*)_mm_malloc(16, sizeof(__m128i));
　　　for (int v=1; v&#60;v_to; v++) {
　　　　　long l = v/size;
　　　　　long l1 = l+1;
　　　　　double wv = v/size - l;
　　　　　double wv1 = 1 - wv;
　　　　　// プリフェッチ
　　　　　_mm_prefetch((const char*)(src4 + l*src_w*3*4), _MM_HINT_T2);
　　　　　_mm_prefetch((const char*)(src4 + l1*src_w*3*4), _MM_HINT_T2);

　　　　　// 参照先srcを越えない範囲
　　　　　int u_to = std::min&#60;int&#62;(dst_w-1, (src_w-1)*size);
　　　　　for (int u=1; u&#60;u_to; u++) {
　　　　　　long k = u/size;
　　　　　　long k1 = k+1;

　　　　　　double wu = u/size - k;
　　　　　　double wu1 = 1 - wu;
　　　　　　long p_s_0_0 = (l*src_w + k)*3*4; /* (k, l) */
　　　　　　long p_s_0_1 = (l*src_w + k1)*3*4; /* (k+1, l) */
　　　　　　long p_s_1_0 = (l1*src_w + k)*3*4; /* (k, l+1) */
　　　　　　long p_s_1_1 = (l1*src_w + k1)*3*4; /* (k+1, l+1) */
　　　　　　long p_d = (v*dst_w+u)*3*4;
　　　　　　/*
　　　　　　dst4[p_d + 0] = (src4[p_s_0_0 + 0]*wu1 + src4[p_s_0_1 + 0]*wu)*wv1
　　　　　　　+ (src4[p_s_1_0 + 0]*wu1 + src4[p_s_1_1 + 0]*wu)*wv;

　　　　　　dst4[p_d + 4] = (src4[p_s_0_0 + 4]*wu1 + src4[p_s_0_1 + 4]*wu)*wv1
　　　　　　　+ (src4[p_s_1_0 + 4]*wu1 + src4[p_s_1_1 + 4]*wu)*wv;

　　　　　　dst4[p_d + 8] = (src4[p_s_0_0 + 8]*wu1 + src4[p_s_0_1 + 8]*wu)*wv1
　　　　　　　+ (src4[p_s_1_0 + 8]*wu1 + src4[p_s_1_1 + 8]*wu)*wv;
　　　　　　*/
　　　　　　__m128 xmm_dst, xmm_wu, xmm_wv;

　　　　　　// DWORD転送 xmm_src_all_d: 0 [b] [g] [r]
　　　　　　__m128i xmm_all_tmp;
　　　　　　__m128 xmm_src_all_0, xmm_src_all_1, xmm_src_all_2, xmm_src_all_3;
　　　　　　xmm_all_tmp = _mm_loadu_si128((__m128i *)(src4 + p_s_0_0));
　　　　　　xmm_all_tmp = _mm_and_si128(xmm_mask, xmm_all_tmp);
　　　　　　xmm_src_all_0 = _mm_cvtepi32_ps(xmm_all_tmp);
　　　　　　xmm_all_tmp = _mm_loadu_si128((__m128i *)(src4 + p_s_0_1));
　　　　　　xmm_all_tmp = _mm_and_si128(xmm_mask, xmm_all_tmp);
　　　　　　xmm_src_all_1 = _mm_cvtepi32_ps(xmm_all_tmp);
　　　　　　xmm_all_tmp = _mm_loadu_si128((__m128i *)(src4 + p_s_1_0));
　　　　　　xmm_all_tmp = _mm_and_si128(xmm_mask, xmm_all_tmp);
　　　　　　xmm_src_all_2 = _mm_cvtepi32_ps(xmm_all_tmp);
　　　　　　xmm_all_tmp = _mm_loadu_si128((__m128i *)(src4 + p_s_1_1));
　　　　　　xmm_all_tmp = _mm_and_si128(xmm_mask, xmm_all_tmp);
　　　　　　xmm_src_all_3 = _mm_cvtepi32_ps(xmm_all_tmp);
　　　　　　
　　　　　　// 色ごとに集める xmm_rtmp: r3 r2 r1 r0
　　　　　　__m128 xmm_colors_tmp[3]; // r, g, b
　　　　　　xmm_colors_tmp[0] = _mm_shuffle_ps(xmm_src_all_0, xmm_src_all_0, SHUFFLEBITS(3, 3, 3, 0)); // 0 0 0 r0
　　　　　　xmm_colors_tmp[0] = _mm_or_ps(xmm_colors_tmp[0], _mm_shuffle_ps(xmm_src_all_1, xmm_src_all_1, SHUFFLEBITS(3, 3, 0, 3))); // 0 0 r1 0
　　　　　　xmm_colors_tmp[0] = _mm_or_ps(xmm_colors_tmp[0], _mm_shuffle_ps(xmm_src_all_2, xmm_src_all_2, SHUFFLEBITS(3, 0, 3, 3))); // 0 r2 0 0
　　　　　　xmm_colors_tmp[0] = _mm_or_ps(xmm_colors_tmp[0], _mm_shuffle_ps(xmm_src_all_3, xmm_src_all_3, SHUFFLEBITS(0, 3, 3, 3))); // r3 0 0 0
　　　　　　xmm_colors_tmp[1] = _mm_shuffle_ps(xmm_src_all_0, xmm_src_all_0, SHUFFLEBITS(3, 3, 3, 1));
　　　　　　xmm_colors_tmp[1] = _mm_or_ps(xmm_colors_tmp[1], _mm_shuffle_ps(xmm_src_all_1, xmm_src_all_1, SHUFFLEBITS(3, 3, 1, 3)));
　　　　　　xmm_colors_tmp[1] = _mm_or_ps(xmm_colors_tmp[1], _mm_shuffle_ps(xmm_src_all_2, xmm_src_all_2, SHUFFLEBITS(3, 1, 3, 3)));
　　　　　　xmm_colors_tmp[1] = _mm_or_ps(xmm_colors_tmp[1], _mm_shuffle_ps(xmm_src_all_3, xmm_src_all_3, SHUFFLEBITS(1, 3, 3, 3)));
　　　　　　xmm_colors_tmp[2] = _mm_shuffle_ps(xmm_src_all_0, xmm_src_all_0, SHUFFLEBITS(3, 3, 3, 2));
　　　　　　xmm_colors_tmp[2] = _mm_or_ps(xmm_colors_tmp[2], _mm_shuffle_ps(xmm_src_all_1, xmm_src_all_1, SHUFFLEBITS(3, 3, 2, 3)));
　　　　　　xmm_colors_tmp[2] = _mm_or_ps(xmm_colors_tmp[2], _mm_shuffle_ps(xmm_src_all_2, xmm_src_all_2, SHUFFLEBITS(3, 2, 3, 3)));
　　　　　　xmm_colors_tmp[2] = _mm_or_ps(xmm_colors_tmp[2], _mm_shuffle_ps(xmm_src_all_3, xmm_src_all_3, SHUFFLEBITS(2, 3, 3, 3)));

　　　　　　/* wu1 wu wu1 wu */
　　　　　　xmm_wu.m128_f32[0] = wu1;
　　　　　　xmm_wu.m128_f32[1] = wu;
　　　　　　xmm_wu = _mm_shuffle_ps(xmm_wu, xmm_wu, SHUFFLEBITS(1, 0, 1, 0));
　　　　　　/* wv1 wv1 wv wv */
　　　　　　xmm_wv.m128_f32[0] = wv1;
　　　　　　xmm_wv.m128_f32[2] = wv;
　　　　　　xmm_wv = _mm_shuffle_ps(xmm_wv, xmm_wv, SHUFFLEBITS(2, 2, 0, 0));

#define BILINEAR_LINE_N(COLORINDEX) { \\
　　　　　　/* 積 */ \\
　　　　　　xmm_dst = _mm_mul_ps(xmm_colors_tmp[COLORINDEX], xmm_wu); \\
　　　　　　xmm_dst = _mm_mul_ps(xmm_dst, xmm_wv); \\
　　　　　　/* 水平 */  \\
　　　　　　xmm_dst = _mm_hadd_ps(xmm_dst, xmm_dummy); \\
　　　　　　xmm_dst = _mm_hadd_ps(xmm_dst, xmm_dummy); \\
　　　　　　/* 結果を非テンポラルに書き込む */ \\
　　　　　　xmm_all_tmp = _mm_cvtps_epi32(xmm_dst); \\
　　　　　　_mm_stream_si128((__m128i*)(buf), xmm_all_tmp); \\
　　　　　　dst4[p_d + COLORINDEX*4] = buf[0]; \\
　　　　　　}
　　　　　　BILINEAR_LINE_N(0);
　　　　　　BILINEAR_LINE_N(1);
　　　　　　BILINEAR_LINE_N(2);
#undef BILINEAR_LINE_N
　　　　　}
　　　}
　　　_mm_free(buf);
　　} break;
　}

　// DWORD =&#62; byte
　for (int v=0; v&#60;dst_h; v++)
　　for (int u=0; u&#60;dst_w; u++) {
　　　int p_d = (v*dst_w + u)*3;
　　　int p_d4 = p_d*4;
　　　dst[p_d + 0] = dst4[p_d4 + 0];
　　　dst[p_d + 1] = dst4[p_d4 + 4];
　　　dst[p_d + 2] = dst4[p_d4 + 8];
　　}
　
　free((void*)src4);
　free((void*)dst4);

　wxImage result = wxImage(dst_w, dst_h);
　result.SetData(dst);
　return result;
}

とりあえず動くことは動く。絶望的に遅いので特に評価はしていませんが…
プリフェッチ命令とか非テンポラルストアとか、意味があるのか分からないものの使ってみました。
命令とコストの対応が分かってないので、何をやるにしても方針が立ちません。やはり一度真面目に勉強するべきか。

追記: float(ps)は遅そうなので、ふつうのCでSSE使わずに、256倍して整数で書いてみました。結果は2倍以上高速に…
やはり命令の使い方の前にコストを知る必要がありそうです。]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/29/simd-image-scaling-bilinear/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SIMD (MMX) [プログラミング,C++]</title>
		<link>http://nanabit.net/blog/2008/07/28/simd/</link>
		<comments>http://nanabit.net/blog/2008/07/28/simd/#comments</comments>
		 <pubDate>Mon, 28 Jul 2008 00:36:10 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/28/simd/</guid>
		<description><![CDATA[カラーホイールを回すとCPUに負荷が掛かるようなので、彩度・輝度空間の描画部分にSIMD命令を使って高速化を図ってみました。
MMXとかSSE2を使うのにはインラインアセンブラしかないと思いこんでいた...]]></description>
			<content:encoded><![CDATA[カラーホイールを回すとCPUに負荷が掛かるようなので、彩度・輝度空間の描画部分にSIMD命令を使って高速化を図ってみました。
MMXとかSSE2を使うのにはインラインアセンブラしかないと思いこんでいたが、
#include &#60;emmintrin.h&#62;
#include &#60;xmmintrin.h&#62;
#include &#60;mmintrin.h&#62; 
これらのヘッダファイルをインクルードすることで、イントリンシック記法が使えるそうです。(参考:SIMD命令セットの記述方法 [1])

高速化する前のコード
for (unsigned long i=0; i&#60;svw; i++)
	for (unsigned long j=0; j&#60;svw; j++) {
		unsigned long s = (i*0xff)/svw;
		unsigned long v = (j*0xff)/svw;
		unsigned long vff = v*0xff;
		unsigned long vffff = vff*0xff;
		unsigned long vs = v*s;
		unsigned long vsff = v*s*0xff;
		unsigned long fvs = f*vs;
		unsigned long P = (vff-vs)&#62;&#62;8; // v*(0xff-s)
		unsigned long q = (vffff-fvs)&#62;&#62;16; // v*(0xff-f*s)
		unsigned long t = (vffff-vsff+fvs)&#62;&#62;16; // v*(0xff-s+f*s)
		unsigned long rgbmap[6][3] = {
			{v, t, P},
			{q, v, P},
			{P, v, t},
			{P, q, v},
			{t, P, v},
			{v, P, q},
		};
		unsigned long svpos = (svw2-j*svw-svw+i)*3;
		sv_data[svpos] = rgbmap[modh][0];
		sv_data[svpos + 1] = rgbmap[modh][1];
		sv_data[svpos + 2] = rgbmap[modh][2];
	}

XMMレジスタにおいてワード整数のMMX命令セット PMULLW, PSUBW, PSRLWを使って高速化したコード
#define COLORWHEEL(RR, GG, BB) {\\
	__m128i m_f; \\
	m_f.m128i_i32[0] = 0;		m_f.m128i_i32[1] = 256;		m_f.m128i_i32[2] = f;		m_f.m128i_i32[3] = f1; \\
	for (unsigned long c=0,p=0; c&#60;svw2-1; c++,p+=3) { \\
		unsigned long i = c%svw; \\
		unsigned long j = svw-1-c/svw; \\
		__m128i  m_a, m_b, m_v, m_s; \\
		unsigned long s = (i*256)/svw; \\
		unsigned long v = (j*256)/svw; \\
		m_v.m128i_i32[0] = v; /* - v v v */ \\
		m_v = _mm_shuffle_epi32(m_v, 0); \\
		m_a = _mm_slli_epi32(m_v, 8); \\
		m_s.m128i_i32[0] = s; /* - s s s */ \\
		m_s = _mm_shuffle_epi32(m_s, 0); \\
		m_s = _mm_mullo_epi16(m_s, m_f); \\
		m_s = _mm_srli_epi32(m_s, 8); \\
		m_s = _mm_mullo_epi16(m_v, m_s); \\
		m_b = _mm_sub_epi16(m_a, m_s); \\
		m_s = _mm_srli_epi32(m_b, 8); \\
		unsigned long P = m_s.m128i_i32[1]; \\
		unsigned long q = m_s.m128i_i32[2]; \\
		unsigned long t = m_s.m128i_i32[3]; \\
		sv_data[p] = RR; \\
		sv_data[p + 1] = GG; \\
		sv_data[p + 2] = BB; \\
	}}

	switch (modh) {
		case 0: COLORWHEEL(v, t, P) break;
		case 1: COLORWHEEL(q, v, P) break;
		case 2: COLORWHEEL(P, v, t) break;
		case 3: COLORWHEEL(P, q, v) break;
		case 4: COLORWHEEL(t, P, v) break;
		case 5: COLORWHEEL(v, P, q) break;
	}

PMULLW(ワード単位の積)に相当するダブルワードの演算がSSE4.1にならないと使えない(多分)らしく、
E6300までしか持っていないので、計算を2回に分けてワード単位に納めました。

しばらくデバッグし、なんとかMMXでも前と同じものが描画できるようになりました。
喜び勇んでホイールをくるくるすると…

変わらない。
CPUが50% (2コア中1コアのmax)近くまで使われます。配列部分のストアが悪いのか、とおもって描画サイズを上げてみると、驚愕の事実が。
どれだけ大きくしてもCPU負荷変わらず。しかも前のコードでもほぼ同じくらい。SV空間描画部分は実はたいして重くなかったようです。

別の箇所を切り離して、カラーピッカーだけで動かすと、

このくらいのサイズでCPU20%以内くらいでした。

[1] http://www.icnet.ne.jp/~nsystem/simd_tobira/simd_cording.html]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/28/simd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>時々落ちるwxAUI… [プログラミング,ソフトウェア,C++]</title>
		<link>http://nanabit.net/blog/2008/07/27/wxaui/</link>
		<comments>http://nanabit.net/blog/2008/07/27/wxaui/#comments</comments>
		 <pubDate>Sun, 27 Jul 2008 01:06:14 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[ソフトウェア]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/27/wxaui/</guid>
		<description><![CDATA[引き続きwxWidgets 2.8.8を弄っていますが、妙なマクロを多用したり、移植性を高めるためのトリックを駆使しているらしく、綺麗にカスタムドローできない。
まあいざとなればWindows専用(w...]]></description>
			<content:encoded><![CDATA[引き続きwxWidgets 2.8.8を弄っていますが、妙なマクロを多用したり、移植性を高めるためのトリックを駆使しているらしく、綺麗にカスタムドローできない。
まあいざとなればWindows専用(wxMSW～)に限定して、WindowsAPIを生で叩けばいいんですが。

そのwxWidgetsを使う大きな利点の一つ、ドック/分離自在なwxAUIが時々落ちます。分離は問題無いものの、ドック時がやや弱いらしい。

さて、前回色相環とSV平面によるカラーピッカーを作りましたが、今回はRGBスライダ、混色スライダ、前景背景色セレクタ等を追加し、それらを連動出来るようにしてみました。

非Observerのリスト破棄なんかは呼び出しが何度も往復して頭が痛くなりそうです。

今はテストということで、マルチレイヤのファイルとしてはwxImageとそのラッパーをwxFileStreamで繋げただけのフォーマットを自作していますが、最終的にはPSDを扱いたい。しかしどうもWebにサンプルコードや最新のPhotoshopの資料が少なく、やっと見つけたMyPSD [1]を試してみたところ複数のレイヤを別々に読むのは無理そうです。

そろそろ実際に描画するところを真面目に書くべきなんでしょうが、Undoとかマウス/タブレットの併存、過去のサンプリング点を用いた手ブレ補正など、かなり設計を練り込まないとあとで酷いことになりそうです。

そんな訳で久しぶりにデザインパターンの本を復習したりしていました。いつまで経ってもFactoryとかTemplateとつくようなパタンの名前が覚えられない。
使えれば良いという気もしますが、名付けることで構造を発見しやすくもなるはずで、記憶力のなさに辟易します。

[1] http://www.codeproject.com/KB/graphics/MyPSD.aspx]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/27/wxaui/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WinTabの練習 [プログラミング,ハードウェア,C++]</title>
		<link>http://nanabit.net/blog/2008/07/25/wintab/</link>
		<comments>http://nanabit.net/blog/2008/07/25/wintab/#comments</comments>
		 <pubDate>Fri, 25 Jul 2008 05:00:44 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[ハードウェア]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/25/wintab/</guid>
		<description><![CDATA[タブレットのAPI, WinTabを使ってみました。
あまりまとまった資料がなく、

PC Sample Files and Downloads includeやlibの配布
Kondoh MH HO...]]></description>
			<content:encoded><![CDATA[タブレットのAPI, WinTabを使ってみました。

あまりまとまった資料がなく、

PC Sample Files and Downloads [1] includeやlibの配布
Kondoh MH HOME PAGE PG tips - WinTab [2] WM_PACKETモードとマウスモード(ポーリング)の例
H.E.R.M. Web Site Index [3] WinTabドキュメント

などを参考に、試行錯誤しました。

クワッドディスプレイの上、システムの座標原点が中央にあるという、まるでテスト用にわざわざ作ったかのような環境で開発しているので、初っぱなから座標の関係が分からなくて苦労しました。

一応、簡単なポーリングモードのラッパー(C++)を置いておきます。tablet_20080725.zip [4]

Favoしか持っていないので、傾きやら方向やらは未テスト。

ついでに(というかこちらが主目的?)作っている、ペイントアプリの概観。筆圧が効いています。
C++ + wxWidget. wxAUIというのがDock周りを全てやってくれるので、こういうソフトを書くのに向いていそう。


このカラーピッカー作るのには骨が折れました。C++の範囲では高速化したものの、MMXとかSSEの拡張命令は使っていないので、ホイール回すとSV空間の描画に少しもたつきます。

[1] http://www.wacomeng.com/devsupport/ibmpc/downloads.html
[2] http://homepage3.nifty.com/kondoumh/pgtips/wintab.html
[3] http://www9.plala.or.jp/herm/Pages/Localized/WinTab/
[4] http://nanabit.net/blog/x/dl/dl.php?dl=tablet_20080725.zip]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/25/wintab/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AutoHotkeyでウィンドウ移動・サイズ変更 [AutoHotKey]</title>
		<link>http://nanabit.net/blog/2008/07/16/ahk-window-move/</link>
		<comments>http://nanabit.net/blog/2008/07/16/ahk-window-move/#comments</comments>
		 <pubDate>Wed, 16 Jul 2008 17:50:00 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[AutoHotKey]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/16/ahk-window-move/</guid>
		<description><![CDATA[AutoHotkeyでWin + カーソルでウィンドウ移動、Win+Shift+カーソルでウィンドウサイズ変更するスクリプト。

; ---------------------------------...]]></description>
			<content:encoded><![CDATA[AutoHotkeyでWin + カーソルでウィンドウ移動、Win+Shift+カーソルでウィンドウサイズ変更するスクリプト。

; --------------------------------------------------
; Window Move
WinMoveStep(XD,YD) {
	WinGet,win_id,ID,A
	WinGetPos,x,y,,,ahk_id %win_id%
	Step := 24
	x := x + (XD * Step)
	y := y + (YD * Step)
	WinMove,ahk_id %win_id%,,%x%,%y%
	return
}
#Left::WinMoveStep(-1,0)
#Right::WinMoveStep(1,0)
#Up::WinMoveStep(0,-1)
#Down::WinMoveStep(0,1)

; --------------------------------------------------
; Window Size
WinSizeStep(XD,YD) {
	WinGet,win_id,ID,A
	WinGetPos,,,w,h,ahk_id %win_id%
	Step := 24
	w := w + (XD * Step)
	h := h + (YD * Step)
	WinMove,ahk_id %win_id%,,,,%w%,%h%
	return
}
+#Left::WinSizeStep(-1,0)
+#Right::WinSizeStep(1,0)
+#Up::WinSizeStep(0,-1)
+#Down::WinSizeStep(0,1)]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/16/ahk-window-move/feed/</wfw:commentRss>
		</item>
		<item>
		<title>HHKB Pro Lite拡張モード [ハードウェア,AutoHotKey]</title>
		<link>http://nanabit.net/blog/2008/07/15/hhkb-pro-lite-ext/</link>
		<comments>http://nanabit.net/blog/2008/07/15/hhkb-pro-lite-ext/#comments</comments>
		 <pubDate>Tue, 15 Jul 2008 17:45:43 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[ハードウェア]]></category>

		<category><![CDATA[AutoHotKey]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/07/15/hhkb-pro-lite-ext/</guid>
		<description><![CDATA[今までHHKBはHHKモード(SW1, SW2 OFF)で使っていて、余った右◇キーを
AutoHotkeyでRWinにして
vkFFsc079::RWin
使っていました。
CraftLaunch起...]]></description>
			<content:encoded><![CDATA[今までHHKBはHHKモード(SW1, SW2 OFF)で使っていて、余った右◇キーを
AutoHotkeyでRWinにしてvkFFsc079::RWin使っていました。

CraftLaunch起動に割り当てているWin+Aとか、標準のWin+EとかWin+Lでは問題ないんですが、
Win+Sでウィンドウシェードするスクリプト [1]を入れたら問題発生。
◇+S -> シェード -> S離す -> ◇離す
でスタートメニューが開くんですね。ほかのキーでも試してみたところ、
どうやらRWinが本物ではないのが悪いようです。

どうしたものかと調べていると、Lite Ext.モードに行き当たりました。
これはFnキー押下時に細々とした違いが出るくらいのものと思っていたのですが、
◇をWinにするという重要な差違が。

これで解決。ついでに、間違ってWinを押してメニューが開くのは気持ち悪いので、
RWin::return
RWin & RWin::returnで単独Winを殺します。

今までの妙なWin Lock現象も起きないし、少し快適になりました。

[1] http://lukewarm.s101.xrea.com/test/read.cgi/bbs/1092315194/7]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/07/15/hhkb-pro-lite-ext/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows SDK for Windows Vistaを入れた(失敗) [雑記]</title>
		<link>http://nanabit.net/blog/2008/05/24/windows-sdk/</link>
		<comments>http://nanabit.net/blog/2008/05/24/windows-sdk/#comments</comments>
		 <pubDate>Sat, 24 May 2008 17:01:43 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/05/24/windows-sdk/</guid>
		<description><![CDATA[cygwinやMinGWにpdh.hが含まれていないらしいので、Windows SDKを入れてみました。
WinSDK-x86.msi
WinSDKBuild-x86.msi
WinSDKDocWin...]]></description>
			<content:encoded><![CDATA[cygwinやMinGWにpdh.hが含まれていないらしいので、Windows SDK [1]を入れてみました。
WinSDK-x86.msi
WinSDKBuild-x86.msi
WinSDKDocWin32-x86.msi
WinSDKWin32Tools-x86.msi

なぜpdh.hが必要かといえば、Windowsタスクマネージャの代わりにコンソールでCPU使用率順のプロセス一覧を表示させたいから。試しにC#で書いてみたら、それ自体が2%もCPUを使うので本末転倒。仕方なくネイティブで書くことになりました。

…と思ったら、なぜかv6.0Aがすでにインストールされていました。(v6.0が今回入れた物)

しかもcygwinでmakeしてもエラーばかりで全然通らない。仕方ないのでVisual C++ 2008 Express Editionに切り替えてみた。普通にWin32コンソールアプリケーションがある…
pdh.hもpdh.libもある…

ということでcygwinを捨ててVC++になりました。前は.NETじゃないとセットアップが面倒だった気がしますが、最近のMSは粋なことをしてくれます。

IDEが重いしviキーバインドにならないのと、非マネージドのインテリセンスがあまり便利じゃないのが玉に瑕ですが。

遊んでいる暇は無いのに…最近コーディングしてないので、雨模様ということもあって土日を使ってしまいそう。

とりあえず400プロセス以内、2コアに対応し、PIDとCPU使用率、イメージ名を1秒おきに書き続けるtopもどきが出来ました。
LLになれるとC++でソートとか面倒すぎる…

一応zip置いておきます。wintop.zip [2]
Cygwin等の\fで画面クリアが効く端末でないと使えません。

[1] http://www.microsoft.com/downloads/details.aspx?FamilyID=7614FE22-8A64-4DFB-AA0C-DB53035F40A0&displaylang=ja
[2] http://nanabit.net/blog/x/dl/dl.php?dl=wintop.zip]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/05/24/windows-sdk/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Qt4.4.0 + MinGWを試してみた [プログラミング,C++,メモ]</title>
		<link>http://nanabit.net/blog/2008/05/14/qt440-mingw/</link>
		<comments>http://nanabit.net/blog/2008/05/14/qt440-mingw/#comments</comments>
		 <pubDate>Wed, 14 May 2008 08:57:28 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[C++]]></category>

		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/05/14/qt440-mingw/</guid>
		<description><![CDATA[TrollTechのGUIツールキット、Qt4.4.0 (GPL版)を試してみました。
最終的には
Eclipse CDT + Cygwin(-mno-cygwin) + OpenGL + ODE +...]]></description>
			<content:encoded><![CDATA[TrollTechのGUIツールキット、Qt [1]4.4.0 (GPL版)を試してみました。
最終的には
Eclipse CDT + Cygwin(-mno-cygwin) + OpenGL + ODE + Qt
で開発しようかなと思っていましたが、QtをCygwinで扱うのが面倒そうだったので、とりあえずついでにセットアップされたMinGWを使ってみました。

1. test.cppを作成

#include &#60;QApplication.h&#62;
#include &#60;QFont.h&#62;
#include &#60;QTextCodec.h&#62;
#include &#60;QLabel.h&#62;

int main(int argc, char* argv[]) {
	QApplication app(argc, argv);
	QTextCodec::setCodecForCStrings(QTextCodec::codecForName(&#34;UTF-8&#34;));
	
	QFont font(&#34;Meiryo&#34;, 12);
	QLabel label(&#34;Qtのテスト&#34;, NULL);
	label.setFont(font);
	label.resize(100, 50);
	label.show();
	return app.exec();
}


2. Makefile作成
qmake -project
qmake test.pro

3. make
make release

4. 実行
release\\test.exe


まあ日本語も通ることが分かったので、しばらく色々弄ってみよう。

参考:
http://calmlight.s2.zmx.jp/Qt4Examples/Japanese.html [2]
http://doc.trolltech.com/4.1/designer-using-a-component.html#the-single-inheritance-approach [3]

[1] http://trolltech.com/products/qt/
[2] http://calmlight.s2.zmx.jp/Qt4Examples/Japanese.html
[3] http://doc.trolltech.com/4.1/designer-using-a-component.html#the-single-inheritance-approach]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/05/14/qt440-mingw/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Qwerty -&gt; Dvorak化AHK script 20080430 [AutoHotKey]</title>
		<link>http://nanabit.net/blog/2008/05/11/qwerty2dvorak-20080430/</link>
		<comments>http://nanabit.net/blog/2008/05/11/qwerty2dvorak-20080430/#comments</comments>
		 <pubDate>Sun, 11 May 2008 05:29:14 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[AutoHotKey]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/05/11/qwerty2dvorak-20080430/</guid>
		<description><![CDATA[QWERTYとDvorak間で切り替えを可能にしました。
Ctrl+Alt+A -> Toggle Mode
Ctrl+Alt+D -> Dvorak Mode
Ctrl+Alt+F -> QWERT...]]></description>
			<content:encoded><![CDATA[QWERTYとDvorak間で切り替えを可能にしました。
Ctrl+Alt+A -> Toggle Mode
Ctrl+Alt+D -> Dvorak Mode
Ctrl+Alt+F -> QWERTY Mode
起動時はDvorak Modeです。

ダウンロード: dvorak_20080430.zip [1] (.ahk)
dvorak_exe_20080430.zip [2] (.exe)
詳細: AutoHotKey @ 7bit [3]

[1] http://nanabit.net/blog/x/dl/dl.php?dl=dvorak_20080430.zip
[2] http://nanabit.net/blog/x/dl/dl.php?dl=dvorak_exe_20080430.zip
[3] http://nanabit.net/blog/softwares/autohotkey.html]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/05/11/qwerty2dvorak-20080430/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ニコニコ動画DL dlnico 2.72 [Python,ソフトウェア]</title>
		<link>http://nanabit.net/blog/2008/04/27/dlnico-272/</link>
		<comments>http://nanabit.net/blog/2008/04/27/dlnico-272/#comments</comments>
		 <pubDate>Sun, 27 Apr 2008 01:19:54 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[ソフトウェア]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/04/27/dlnico-272/</guid>
		<description><![CDATA[サムネイルも併せて保存するオプション-tを新設。
詳細・ダウンロードはこちらから。dlnico
例によってWindows exeバージョンはdlnico 2.72から。
]]></description>
			<content:encoded><![CDATA[サムネイルも併せて保存するオプション-tを新設。

詳細・ダウンロードはこちらから。dlnico [1]
例によってWindows exeバージョンはdlnico 2.72 [2]から。

[1] http://nanabit.net/blog/softwares/python/dlnico/
[2] http://nanabit.net/blog/softwares/python/dlnico/dlnico-2.72]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/04/27/dlnico-272/feed/</wfw:commentRss>
		</item>
		<item>
		<title>着色svn diff [プログラミング,ソフトウェア,Linux]</title>
		<link>http://nanabit.net/blog/2008/03/30/svn-diff-colored/</link>
		<comments>http://nanabit.net/blog/2008/03/30/svn-diff-colored/#comments</comments>
		 <pubDate>Sun, 30 Mar 2008 06:19:13 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[プログラミング]]></category>

		<category><![CDATA[ソフトウェア]]></category>

		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/03/30/svn-diff-colored/</guid>
		<description><![CDATA[#!/bin/sh
# svndiff: colored svn diff
# ref: http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.ht...]]></description>
			<content:encoded><![CDATA[#!/bin/sh
# svndiff: colored svn diff
# ref: http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html
mod=&#34;echo -e \e[1;37m&#34;
del=&#34;echo -e \e[1;31m&#34;
add=&#34;echo -e \e[1;32m&#34;
new=&#34;echo -e \e[1;35m&#34;
nor=&#34;echo -e \e[0m&#34;

echo &#34;Newly created (but not 'svn add'ed):&#34;
svn st &#124; grep &#34;?&#34; &#124; sed -r -e &#34;s/^(.*)$/`$new`\\1`$nor`/&#34;
echo `$mod`&#34;___________________________________________________________________&#34;`$nor`

svn diff &#34;$@&#34; &#124; sed -r -e &#34;s/^(-.*)$/`$del`\\1`$nor`/g;s/^(\+.*)$/`$add`\\1`$nor`/g;s/^([@=_].*)$/`$mod`\\1`$nor`/g&#34;
echo `$nor`
svn diffに色を付ける。削除:赤 追加:緑]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/03/30/svn-diff-colored/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PuTTYで複数行ペースト前に警告するAHKスクリプト [AutoHotKey]</title>
		<link>http://nanabit.net/blog/2008/03/21/putty-clipboard/</link>
		<comments>http://nanabit.net/blog/2008/03/21/putty-clipboard/#comments</comments>
		 <pubDate>Fri, 21 Mar 2008 22:25:48 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[AutoHotKey]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/03/21/putty-clipboard/</guid>
		<description><![CDATA[PuTTYを使っていて、何かの間違いで大量のテキストをクリップボードに抱えたまま右クリック→運悪くsudo rm -rf /が含まれていたという事態を回避するためのAutoHotKeyスクリプト。
;...]]></description>
			<content:encoded><![CDATA[PuTTYを使っていて、何かの間違いで大量のテキストをクリップボードに抱えたまま右クリック→運悪くsudo rm -rf /が含まれていたという事態を回避するためのAutoHotKeyスクリプト。

;-----------------------------------------------------------
; PuTTYで複数行の貼り付け前には確認する
on = 0
$RButton::
CoordMode,Mouse,Screen
MouseGetPos, x, y, win
WinGetClass, cls, ahk_id %win%
If(cls=&#34;PuTTY&#34;) {
	If (on=0) {
		StringSplit, strout, clipboard, `n
		If(strout0&#62;1 or InStr(clipboard, &#34;sudo&#34;)&#62;0) {
			MsgBox, 308, PuTTY貼り付け警告, ---------------------`n%clipboard%`n---------------------`n`nを貼り付けますか?
			IfMsgBox, Yes
			{
				on = 1
				MouseClick, RIGHT, %x%, %y%, 1, 0
			}
		}
	} else {
		MouseClick, RIGHT, %x%, %y%, 1, 0
		on = 0
	}
} else
	MouseClick, RIGHT, %x%, %y%, 1, 0
return

クリップボードにsudoの文字列、もしくは改行が含まれる状態でPuTTYを右クリックすると警告ダイアログを表示します。]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/03/21/putty-clipboard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ニコニコ動画DL dlnico 2.71 [Python,ソフトウェア]</title>
		<link>http://nanabit.net/blog/2008/03/06/dlnico-271/</link>
		<comments>http://nanabit.net/blog/2008/03/06/dlnico-271/#comments</comments>
		 <pubDate>Thu, 06 Mar 2008 13:01:58 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[ソフトウェア]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/03/06/dlnico-271/</guid>
		<description><![CDATA[リスト保存の順番を保持、ニコニコ動画の仕様変更(20080305)に対応
詳細・ダウンロードはこちらから。dlnico
例によってWindows exeバージョンはdlnico 2.71から。
]]></description>
			<content:encoded><![CDATA[リスト保存の順番を保持、ニコニコ動画の仕様変更(20080305)に対応

詳細・ダウンロードはこちらから。dlnico [1]
例によってWindows exeバージョンはdlnico 2.71 [2]から。

[1] http://nanabit.net/blog/softwares/python/dlnico/
[2] http://nanabit.net/blog/softwares/python/dlnico/dlnico-2.71]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/03/06/dlnico-271/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Stage6終了 [Python,ソフトウェア]</title>
		<link>http://nanabit.net/blog/2008/02/26/stage6/</link>
		<comments>http://nanabit.net/blog/2008/02/26/stage6/#comments</comments>
		 <pubDate>Tue, 26 Feb 2008 14:58:37 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[Python]]></category>

		<category><![CDATA[ソフトウェア]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/02/26/stage6/</guid>
		<description><![CDATA[2/28にStage6がサービス終了するそうですね。保存し忘れた動画のためのDL補助スクリプト書きました。st6.zip
&#62; st6.py output_file stage6_url [ma...]]></description>
			<content:encoded><![CDATA[2/28にStage6がサービス終了するそうですね。保存し忘れた動画のためのDL補助スクリプト書きました。st6.zip [1]
&#62; st6.py output_file stage6_url [max_page_no]
のようにして検索結果やユーザVideoのURLを渡すと、&#34;Next&#34;を辿って全ての.divxを列挙してIrvineリスト(irv)形式で保存します。


[1] http://nanabit.net/blog/x/dl/dl.php?dl=st6.zip]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/02/26/stage6/feed/</wfw:commentRss>
		</item>
		<item>
		<title>非インタラクティブ高速タスク切替 uts 0.24β [ソフトウェア]</title>
		<link>http://nanabit.net/blog/2008/02/18/uts-024b/</link>
		<comments>http://nanabit.net/blog/2008/02/18/uts-024b/#comments</comments>
		 <pubDate>Mon, 18 Feb 2008 09:14:23 +0900</pubDate>
		<dc:creator>7bit</dc:creator>
		
		<category><![CDATA[ソフトウェア]]></category>

		<guid isPermaLink="false">http://nanabit.net/blog/2008/02/18/uts-024b/</guid>
		<description><![CDATA[非インタラクティブ高速タスク切替ソフト、uts 0.24βをリリースしました。

ツールウィンドウを捕捉する設定
無駄なフックメッセージを無視

関係ないメッセージをDLLからEXEに渡さないようにし...]]></description>
			<content:encoded><![CDATA[非インタラクティブ高速タスク切替ソフト、uts [1] 0.24βをリリースしました。


ツールウィンドウを捕捉する設定
無駄なフックメッセージを無視


関係ないメッセージをDLLからEXEに渡さないようにしたので、大量のメッセージを送出する処理のもたつきが改善されました。

[1] http://nanabit.net/softwares/uts.html]]></content:encoded>
			<wfw:commentRss>http://nanabit.net/blog/2008/02/18/uts-024b/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
