Welcome ぷろぐらむ

2005年02月12日

CPU の周波数っていくらだったかな..

RDTSC 命令を使って手っ取り早く、周波数を測定してみる...

unsigned __int64 rdtsc()
{
__asm { rdtsc };
}

void CCPUDlg::OnBnClickedButton1()
{
unsigned __int64 cycle_a,cycle_b;

CString text;

cycle_a = rdtsc();
Sleep(1 * 1000);
cycle_b = rdtsc();

text.Format( "%uHz" , cycle_b - cycle_a );
SetWindowText( text );
}

2390281768Hz と出て
あー 2.4GHzだった と手っ取り早くわかる

投稿者 kata : 11:48 | コメント (0) | トラックバック

ぷろぐらむ

2005年02月06日

VB シフト演算 DLL

Download file

まだこの言語は乗ってなかったか...?
VB2003には乗っている模様

一番手っ取り早いのは、掛け算でVBにて計算させる。しかし遅い(VB5現在)
a << b は a*(2^b)
a >> b は a/(2^b)

高速化のためVCで適当にDLLつくるのが良い(昔はそうだった いまは知らない)

/* VC DLL ... */
#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

// エクスポートされた関数

__declspec(dllexport) LONG __stdcall L_shift( LONG a , LONG b )
{
return a << b;
}


__declspec(dllexport) LONG __stdcall R_shift( LONG a , LONG b )
{
return a >> b;
}


__declspec(dllexport) BYTE __stdcall L_shiftB( BYTE a , BYTE b )
{
return a << b;
}


__declspec(dllexport) BYTE __stdcall R_shiftB( BYTE a , BYTE b )
{
return a >> b;
}

っとこうやって 適当にdefにexport かいとく

LIBRARY ktshift.dll

EXPORTS
L_shift @16
R_shift @8
L_shiftB @4
R_shiftB @2

VBから呼び出すにはー

Declare Function L_shift Lib "ktshift.dll" (ByVal a As Long, ByVal b As Long) As Long
Declare Function R_shift Lib "ktshift.dll" (ByVal a As Long, ByVal b As Long) As Long
Declare Function L_shiftB Lib "ktshift.dll" (ByVal a As Byte, ByVal b As Byte) As Byte
Declare Function R_shiftB Lib "ktshift.dll" (ByVal a As Byte, ByVal b As Byte) As Byte

変数の型はそろえてね。。

投稿者 kata : 14:41 | コメント (0) | トラックバック

ぷろぐらむ

2004年12月07日

あれ開発(あくまで趣味)

うひょー 010 メッセージがいつのまにやら実装されとるし^^;;
早速対応だな^^;

00:55.16 *** !!! irc.Tokyo.wide.ad.Jp [ サーバーが見つかりました ( 192.244.23.1 ) ]
00:55.16 irc.Tokyo.wide.ad.Jp [ 接続しました ]
00:55.34 ERROR Nickname is already in use. kata (unregist)
00:55.34 Auto regist NICK kata -> k4ta
00:55.35 [m_default] irc.Tokyo.wide.ad.Jp -010 -k4ta -irc.nara.wide.ad.jp -6668 -Please use this Server/Port instead
00:55.45 irc.Tokyo.wide.ad.Jp Error: Closing Link: k4ta[unknown@yourmoe.domein.moe] (Too many host connections (global))

00:55.45 !!! INFOMATION irc.Tokyo.wide.ad.Jp closing...

投稿者 kata : 01:03 | コメント (0) | トラックバック

ぷろぐらむ

2004年07月26日

セットアップ/デプロイトメント プロジェクト

セットアップ用のEXEをつくるためのウイザードが
VC.Net(?VS.NETか? に付属してきます。
これの基本的な使い方を簡単に解説してみましょう。

setup00.jpg
メニューの ファイル -新規作成 -プロジェクトより
セットアップ プロジェクトを作成します。

setup02.jpg

ファイル システム メニューより
(このダイアログは、ソリューションエクスプローラの右クリックメニュー - 表示より開けます。)
アプリケーションフォルダにファイルを追加していきます。

setup04.jpg

ディスクトップやプログラムメニューにショートカットを作りたい場合
ファイルを右ドラッグドロップでコンテキストメニューよりショートカットを作ります。
そして、ユーザのディスクトップ/ユーザのプログラムメニューにドラッグドロップで移動させてください。

setup11.jpg
右クリックメニューより ビルドを行い

setup18.jpg
インストールをクリックすることでテストできます。

setup14.jpg
C:\Program Files\既存の会社名\ほげら
となる 既存の会社名の設定は Manufacture プロパティを調整してください。

setup16.jpg
デフォルトのインストール先の
\既存の会社名を間に入れたくない場合、
アプリケーションフォルダのDefault Locationプロパティを
[ProgramFilesFolder][Manufacture]\[ProductName] を
[ProgramFilesFolder]\[ProductName] に変更することで実現できます。

setup27.jpg
アイコンは設定しないと、うまく表示できません。

※リビルドしても更新が適用されていない場合、正常にBuildできていないことが原因です。一度デバッグ イミディエイトを見てみましょう。

投稿者 kata : 00:43 | コメント (0) | トラックバック

ぷろぐらむ

2004年07月11日

なんか日付が出ないぞ!@VC

以下のコードを書いて見る
time_t t;
struct tm* ts;

time( t );
ts = localtime( &t );
if( ts ) printf( "%02i:%02i", ts->tm_hour, ts->tm_min );

日付が出ない(笑
ts に localtime がNULL をかえしているようだ。

んーなんでだろー。 不安定なのかなぁ。


ランタイム ライブラリ リファレンス
localtime、_localtime64
時刻値を現地のタイム ゾーンに合わせて変換します

ふむふむ。。 ん? 64 ?(;´Д`)


localtime 関数が世界協定時刻 (UTC) における
2038 年 1 月 18 日 19 時 >14 分 07 秒までを表すのに対し、
__time64_t 構造体を使用する _localtime64 関数では、
世界協定時刻における 3000 年 12 月 31 日 23 時 59 分 59 秒までを
表すことができます。

っていうことで時計を見てみる。 2088年1月1日。
いつだよオレ!!!
そして、localtime は 2038年以降はツカエネーのかよ!

つーことで書き直す
__time64_t t;
struct tm* ts;

_time64( t );
ts = _localtime64( &t );
if( ts ) printf( "%02i:%02i", ts->tm_hour, ts->tm_min );

めでたく 非ANSIコードが出来上がった 万歳

localtime
2038年問題

投稿者 kata : 00:17 | コメント (2) | トラックバック

ぷろぐらむ

2004年06月27日

t_jis2sjis::sjis 少し高速化

前からずっと気になってた半角かな送信前にJIS END 送ってくる人たち用の対策をしてみました。
ついでに、3文字目を無視してみました。少し高速化。
…律儀にきちんと解析するもんでもないしな(笑い

char* t_jis2sjis::sjis(const char* lpsz)
{
const char *p;
unsigned char *b;
int lenmx;
int jis = 0;

/* NULL の時は帰る */
if(lpsz == NULL)
{
trans_sjis_buffer[0] = '\0';
return trans_sjis_buffer;
}

/* 審査 */
p = lpsz; /* 検査Pointer */

b = (unsigned char*)trans_sjis_buffer; /* Result */
lenmx = MAX_CODEBUF; /* あふれ対策 */


while(( *p != '\0' ) && (lenmx > 0) )
{
/* ESC Entry
* (っつーか 3文字目みんなてきとーに入れすぎ(;´Д`)
* IRC では開始終端ともにB にするのが一般的
*/
if( p[0] == ESC )
{
if( p[1] == '$' ) jis=1;
if( p[1] == '(' ) jis=0;

/* skip */
p++, lenmx--;
if(! p[0] ) continue;

/* skip */
p++, lenmx--;
if(! p[0] ) continue;

/* skip */
/*3文字目は無視 (B|J|H|Q) */
p++, lenmx--;
continue;
}

/* if jis */
if( !jis )
{
/* normal copy */
b[0] = p[0];

/* skip */
p++, lenmx--;
b++;
}else{
/* copy after trans */
b[0] = p[0];
b[1] = p[1];

/* ...trans */
t_jis2sjis::sub(&(b[0]),&(b[1]));

/* skip */
p++, lenmx--;
b++;
if(! p[0] ) continue;

/* skip */
p++, lenmx--;
b++;
}
}

if(b) *b = 0;

return trans_sjis_buffer;

}

投稿者 rizel : 13:48 | コメント (0) | トラックバック