2008年01月19日

公開しました。

新たに公開したのは、↓です。
■スレッド操作クラス(C/C++)Windows,Linux共用
一応継承して使うことを思って作りました。本当は、JavaのThreadのように使うものを作りかったのですが、そうにはできませんでした。残念猫

Windowsでは、_beginthreadex(CRT)
Linuxでは、pthread
を使っています。

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。
posted by 台北猫々 at 23:06| Comment(0) | TrackBack(0) | 日記

2008年01月18日

こりゃ、あかんわ ぱ〜と2

先日公開したSocketStreamクラスですが、まずい処理がありました。

Windowsでなのですが、ソケットハンドルを高水準入出力用のストリームハンドルに変換するために以下のようにしています。

ソケットハンドル
↓(_osfhandle)
ファイルハンドル
↓(_fdopen)
書き込み用ファイルポインタ
読み込み用ファイルポインタ

どれか1つをクローズすると、残りの3つも自動的に閉じるようなので、とりあえず読み込み用ファイルポインタをクローズしていたのです。

が、どうもDebugモードで動作させるとWSACleanup()でAbortしてしまうようです。よくは分からないのですが、WSACleanup()で開放されるべきところまで、先に開放してしまっているのかと。

対応としては、元にしているソケットハンドルを閉じることにすれば、問題はないようです。

はよ、なおさんと猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 23:31| Comment(0) | TrackBack(0) | 日記

2008年01月17日

こりゃ、あかんわ

先日、公開したSocketクラスですが、「こりゃ、あかんわ」という作りになっていました。

Windows用にコンストラクタで、
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);

を行って、デストラクタで、
WSACleanup();

を行うようにしたのですが、

2重初期化(WSAStartup)は、まあ大丈夫なのですが、2重クリア(WSACleanup)は、abortしてしまいますね。複数のSocketインスタンスを扱ったりする場合にピンチですね。

はよ、なおさんと猫
posted by 台北猫々 at 22:21| Comment(0) | TrackBack(0) | 日記

正規表現で「英数字」の存在チェック

String s = "あいうえおかきaくあけ";
String reg = ".*[A-Za-z].*";
System.out.println("「英数字」はあるか?"+(s.matches(reg)?"はい":"いいえ"));

「はい」
と、なります。

パターンの前後の".*"がないと、期待通りにならないのですよね。PHPの正規表現とは違うようですね。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:58| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年01月16日

公開しました。

新たに公開したのは、↓です。
■文字列分割クラス(C/C++)
JavaのStringTokenizerみたいなものです。

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。
posted by 台北猫々 at 21:02| Comment(0) | TrackBack(0) | 日記

スレッドプログラム訂正

昨日書いたスレッドプログラムで誤りがありました。

_beginthreadexでは、スレッドの切り離しはできないと書いたのですが、できます。親スレッドで、子スレッドのハンドルをCloseHandleしても、子スレッドの動作には影響ないようです。

不勉強でした。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 18:56| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)

2008年01月15日

スレッドプログラム

_beginthread (Cランタイム:CRT)
_beginthreadex (Cランタイム:CRT)
CreateThread (WindowsAPI)

MFCを使わない場合、以上の3種類の選択肢があるわけですが、MSDNでCreateThread の説明を見ると、
===================================================
C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_createthread.asp
===================================================
とか書かれているので、つまり、C標準関数を使用するスレッドでは使えませんということですよね?相当、使用する場面が限られるような。。。

で、_beginthreadを見ると、
===================================================
_beginthread よりも _beginthreadex を使用した方が安全です。_beginthread によって生成されたスレッドの終了が早すぎると、_beginthread の呼び出し元に返されるハンドルが無効になる可能性や、別のスレッドを指す可能性があります。
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx
====================================================
と書かれているので、つまりは_beginthreadexを使いなさいということになるのかなと。

で、_beginthreadexですが、これの特徴は、スレッド内で_endthreadexを呼んで終了した後に、親スレッドでスレッドハンドルをCloseHandleをしないとメモリリークするので、スレッドを切り離せません。これってたまに不便な気がします。
→すいません。。。早とちりです。スレッド終了(_endthreadex)前にを呼ぶ前にCloseHandleしても、スレッド処理は続行されるようです。結果として、切り離すことはできますね。猫

なんか種類はあるんですけどね。ややこしくしているだけのような気もします。

良かったらクリックお願いします→banner_01.gif







posted by 台北猫々 at 22:54| Comment(0) | TrackBack(1) | 技術メモ(Windows C/C++)

2008年01月14日

神社

気づくと、

山の上の神社の入り口にいました。
左を見ると朝日が昇っていました。
右を見ると夕日が落ちていました。
正面を見ると、朝焼けと夕焼けに照らされた石畳で女の子が手毬をついて遊んでいました。

私は「早くお参りしなくちゃ」と思って進みましたが、いつのまにか行列ができていました。

私は「ああ、どこも混んでいるんだなあ」と思いました。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 00:58| Comment(0) | TrackBack(0) | 夢日記

2008年01月13日

公開しました。

新たに公開したのは、↓です。
■プロパティファイル読み込みクラス

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 12:25| Comment(0) | TrackBack(0) | 日記

2008年01月12日

ソケットの高水準入出力

昨日公開しましたSocketStreamクラスですが、機能としてはソケットの対して、fgetsやfputsのような高水準仕様での入出力を可能にします。

Linuxだとソケット記述子をfdopenするだけなのですが、Windowsの場合は、工夫が必要で、

ソケットを作成する前に、
int sockopt = SO_SYNCHRONOUS_NONALERT;
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&sockopt, sizeof(sockopt));
を行って、

さらに作成したソケットハンドルについて
int sock_osfhandle = _open_osfhandle(socket, _O_RDONLY);
を行ってファイルハンドルに変換してからfdopenしなければなりません。

この辺は、Rubyのソースなどを参考にして組んでみましたが、setsockopt関数の"OPENTYPE"や"SO_SYNCHRONOUS_NONALERT"は、MSDNを見ると非推奨のようなことが書いてあるのですよね。。。まあ、モウマンタイでしょう。
posted by 台北猫々 at 21:14| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)

2008年01月11日

VisualC++とEclipse

最近、この2つを良く使っているのですが、
殊、リファクタリングに関してはVisualC++はEclipseに対して
相当、水を空けられていますね。

VisualC++でちょっとクラス名を変えようとすると、まあ〜
面倒なこと!リファクタリングする気が失せるほどです。

10年ぐらい前は、viと比べてVisualC++の使いやすさに感動
すら覚えていたのですが。。。

もうちょっと時流を考えて、MSの技術者にも頑張って欲しいと
思う今日このごろです。

と思うとともに、オープンソースであるEclipseのレベルの高さ
に感心感心の毎日です。
posted by 台北猫々 at 22:40| Comment(0) | TrackBack(0) | 日記

公開しました。

高精度数値計算クラス(Java)を公開しました!

その他、C++クラスをいくつか公開しました。遊び心なんですが、VisualC++のExpress Editionでも使えるようにMFCやATLを使わない方針でやっていこうかなと。それと、可能なものは、Linuxでも共用して使えるようにしていきたいと思います。

現状公開したのは、↓です。
■TCPのSocketクライアントクラス
■ミューテックスクラス
■ディレクトリ内のファイルリスト取得クラス
■Socketストリームクラス

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。
posted by 台北猫々 at 22:26| Comment(0) | TrackBack(0) | 日記

2008年01月10日

アライグマ

昨日、ふと思ったのですが・・・で書いたのですが、

本当は野生のアライグマは、洗わないそうです。「洗う」という行動は、動物園など特殊な環境下における「転移行動」だそうです。

つまり、「なんかストレスたまるなあ〜むしゃくしゃするなあ〜よし!洗っとけ!」ということなのです。

洗わないのに、「アライグマ」。。。
そんな、自己矛盾を抱えながら、生きているのですね猫
posted by 台北猫々 at 20:49| Comment(0) | TrackBack(0) | 日記

2008年01月09日

ふと思ったのですが・・・

洗わないアライグマという、アライグマとしてのアイデンティティを失ってしまったアライグマというのはいるのでしょうか?
posted by 台北猫々 at 22:17| Comment(0) | TrackBack(0) | 日記

高精度数値計算(固定小数点演算)

なんとか、とりあえず完了といっていい状態になりました。
どんな感じになったかというと、JUnitで表すとこんな感じ
になります。

"1+2*(3+2)"のような演算式の文字列を渡すと演算結果を返す
クラスです。内部では浮動小数点演算を行っていないので、
例えば小数点以下50桁まで精度保証なんてこともできます。

ソースの方は、ホームページの方に、近々アップします。猫


import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {

@Test
public void testExecCalculate() {
Calculator c = new Calculator();
assertEquals("+0", c.execute("+0", 0));
assertEquals("+18", c.execute("(1+2)*2*(1+2)", 3));
assertEquals("+18", c.execute("(((1+2)*2*(1+2)))", 3));
assertEquals("+1.0000", c.execute("((1+2)/(1+2))", 3));
assertEquals("-1.6000", c.execute("((3+4+2*5)/5)+3-(2+2)*2", 3));
assertEquals("+6.6234311111222223333344444", c.execute("3.1111111111222223333344444+3.51232", 10));
assertEquals("+0.012895213625", c.execute("0.2345*0.2345*0.2345", 3));
assertEquals("+0.41666666666666666666666666666666666666666666666666", c.execute("5/12", 50));
assertEquals("+1299", c.execute("((1+2*2*(1+2))*100)-1", 0));
assertEquals("+1300", c.execute("(1+2*2*(1+2))*100", 0));
assertEquals("-1300", c.execute("-(1+2*2*(1+2))*100", 0));
assertEquals("+1299.9999", c.execute("((1+2*2*(1+2))*100)-1*0.0001", 0));
assertEquals("+1299.9999", c.execute("((1+2*2*(1+2))*100)-(1*0.0001)", 0));
assertEquals("+0.01234567901234567901234567901234567901234567901234", c.execute("1/3/3/3/3", 50));
assertEquals("+0.00000", c.execute("0/(((1+2*2*(1+2))*100)-(1*0.0001))", 0));
}

}


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:44| Comment(0) | TrackBack(0) | 日記

2008年01月08日

カウンターを付けてみました。

今日見ていた別な人のブログに、カウンターが付いていたので真似して付けてみました。

以前に一回探したのですが、前に見つけたサービスサイトでは、配布されたカウンターのHTMLの中に何故かエロサイトへのリンクがそっと埋めこまれていたりしたので、止めておいたのです。

今日見つけたサイトのカウンターは、真っ当な感じなので、まあいいかなと。
posted by 台北猫々 at 22:27| Comment(0) | TrackBack(0) | 日記

dateコマンドの出力を整形

正規表現で、dateコマンドの出力結果を整形します。
前0詰有りを、無しにします。

date +"%d" | sed 's/^\(0\)\([1-9]\)$/\2/'

01 → 1
12 → 12
となります。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 00:06| Comment(0) | TrackBack(0) | 技術メモ(シェル)

2008年01月07日

ふと、思ったのですが。

(1)法律や宗教など、規律からの自由
(2)生物としての寿命や物理法則など、自然からの自由
(3)偏見やプライドなど、自己からの自由

「自由」というものには3種類あるんだなあ。
一番欲しい自由は(3)です。猫
posted by 台北猫々 at 23:31| Comment(0) | TrackBack(0) | 日記

2008年01月06日

ソケット処理〜ホスト情報の取得


#include <winsock2.h>

/**
* 名前もしくはIPアドレスからホスト情報を獲得する.
* @param const char* lpszHostName : ホスト名 or IP.
* @return 成功:ホスト情報構造体のアドレス 失敗:NULL.
*/
struct hostent* getHostByName(const char* lpszHostName)
{
struct hostent* lpWorkHost=NULL;

::in_addr in;
in.s_addr = ::inet_addr(lpszHostName);
if (in.s_addr == INADDR_NONE) {
lpWorkHost = ::gethostbyname(lpszHostName);
} else {
lpWorkHost = ::gethostbyaddr(reinterpret_cast<char *>(&in), sizeof(in), AF_INET);
}
return lpWorkHost;
}

返却領域がstaticのためマルチスレッドセーフではありません。


↓で構築したVisualC++ 2005 Express Editionでコンパイルしました(ただし、Ws2_32.libを追加しています)。
http://winter-tail.sakura.ne.jp/nmap/setup.html

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:31| Comment(0) | TrackBack(0) | 技術メモ(Windows C/C++)

フレームワークのMapleでクラス名をPascal形式

フレームワークのMapleでは仕様上、アクションクラスの名前を複数の単語を組み合わせたPascal形式で命名できません。
(例:GetCustomerInfoとしてたくてもGetcustomerinfoとしないと駄目)
※Windowsならファイル名に大文字小文字の区別がないので、"GetCustomerInfo"としても大丈夫ですが。
※ちなみにPHPはクラス名の大文字小文字を区別しません。

これって、ちょっと後で見づらいのですよね。なので、ちょっと改造してみました。

ActionChain::makeNamesの177行目付近以降を以下のように
書き換えます。

if (!@file_exists($filename)) {
$filename = MODULE_DIR . "/${actionPath}/${className}.class.php";
if (!@file_exists($filename)) {
//modify start by 台北猫々
//$className = null;
//$filename = null;
$className = join("_", $pathList);
$actionPath = join("/", $pathList);
$basename = $pathList[count($pathList) - 1];
$filename = MODULE_DIR . "/${actionPath}/${basename}.class.php";

if (!@file_exists($filename)) {
$className = null;
$filename = null;
}
//modify end
}
}
return array($className, $filename);

これにより、
例えば、Taiwan_GetCustomerInfoというアクションクラスならば、以下のようなディレクトリ構成とファイル名でいけるようになります。
$WEBAPP_DIR/$MODULE_DIR/Taiwan/GetCustomerInfo/GetCustomerInfo.class.php

ちなみに元の仕様では、↓のようにします。
$WEBAPP_DIR/$MODULE_DIR/taiwan/getcustomerinfo/Getcustomerinfo.class.php


Pascal形式:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconcapitalizationstyles.asp

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 09:42| Comment(0) | TrackBack(0) | 技術メモ(PHP)