プログラミング

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

Visual C++ でランタイム不要のDLLを作成する方法 [プログラミング]

2008年4月4日

備忘メモ:Visual C++ 2008でランタイム不要のDLLを作成する方法

Project
  -> Properties
    -> Configuration Properties
        -> C/C++
            -> Code Generation
                -> Runtime Library

この項目の中に、

・Multi-threaded (/MT)
・Multi-Threaded Debug (/MTd)
・Multi-Threaded DLL (/MD)
・Multi-Threaded Debug DLL

があるので、/MT もしくは、/MTd を選択する。

参考:MSDN

PHPで動的OOPもどき [プログラミング]

2008年3月26日

PHP5では、クラスで__call()メソッドが使えるので、JavaScriptみたいな動的オブジェクトが作れそう。

<?php

$obj=(object)$obj;
$obj->testfunc=create_function('$i','return $i+1;');
//echo $obj->testfunc(2);// Fatal Error
$f=&$obj->testfunc;
echo $f(2);// 3

$obj=new dynamic_obj;
$obj->testfunc=create_function('$i','return $i+1;');
$obj->testfunc2=create_function('$i','return $i+2;');
echo $obj->testfunc(2);// 3
echo $obj->testfunc2(2);// 4

$obj->__destruct=create_function('','echo "__destruct!";');//__destruct!

class dynamic_obj{
    public function __call($methodname,$args){
        return call_user_func_array($this->$methodname,$args);
    }
    public function __destruct(){
        if (isset($this->__destruct)) call_user_func($this->__destruct);
    }
}

実行結果

334__destruct!

どんなときに便利か、今は思いつかないけれど。

PHPでクロージャもどき [プログラミング]

2008年3月25日

クロージャとは何かと言う話。

これを知るため、Googleで『クローじゃ』もとい『クロージャ』で検索すると、最上位に出るのがこれ。

クロージャ - Wikipedia

これによると、

クロージャ (Closure) は、プログラミング言語において引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する関数のことである。

とのこと。ちなみに、『クローじゃ』で検索すると、次のものが出る。

PHPでクローじゃもどき - odz buffer

JScriptでinputBoxを使う [プログラミング]

2008年3月25日

マイクロソフトの新しいシェル、PowerShellについて色々と見ていて、私自身が一番分かりやすい説明だと思ったのが、次の記事。

Windowsスクリプティング環境比較:PowerShell vs WSH

PowerShell自身について何か書くのは別の機会に譲るとして、これを読んで面白いことに気がついたので、メモ。この記事の中から、マイクロソフトの次のページにリンクされている。

Converting VBScript Commands to Windows PowerShell Commands

VBScriptでできることは一通りPowerShellでできるらしい。で、思い出したのが、inputBox。これは、WSHにおいてはVBScriptにだけ実装されている機能で、JScriptでは使えない。PowerShellではどうかと、調べてみた。

SFC miniのインストールがWindows Vistaで失敗する件について [プログラミング]

2008年3月21日

現在配布中のSFC mini ver 1.0.1をWindows Vistaにインストールしようとすると、次のようなエラーが出てインストールできません。

the call to DLLRegisterServer failed with error code 0x80004005

このエラーを回避するためには、次に述べるいずれかの方法を用いてください。

1)管理者としてコマンドプロンプトを開き、SFC mini ディレクトリに移動した後に、install-AMD.vbsもしくはinstall-INTEL.vbsを実行する。
2)MakeExeを用いてinstall-AMD.vbsもしくはinstall-INTEL.vbsをexeファイルに変換した後、このexeファイルを管理者として実行する。

いずれの方法でもインストール可能なはずです。

また、Windows Vistaのバグだと思われること(下記参照)が原因で、サンプルプログラムのいくつかが動きません。VBSファイルを少し改変することで、この不具合を回避することができます。例えば、WinSockClient.vbsの場合だと、2行目あたりを次のように変更してください。

dim code
code=CreateObject("SfcMini.tools").Include("<Winsock.vbs>")
Execute code

WinForm等のライブラリを用いているスクリプトについては、ライブラリ自身のVBSファイルを変更する必要があります。これについては、時期配布バージョンで対応する予定です。

(参考)

1)この不具合についてですが、COMからの戻り値である文字列を直接Executeした場合に、Execute自体は成功するけれども、その直後に不具合が発生するという状況です。ガベージコレクタ周りの不具合では無いかと考えています。WSHのこのような利用の仕方はまれなケースなので、Windows側でこのことについて改善されるかどうかは分かりません。

2)Windows Vistaでは、wscript.exeに対してDEPを無効にすることはできないようです。WinForm等を利用するスクリプトを実行する場合は、install-AMD.vbsを利用してください。

PHPで、オブジェクトのメソッド内からスタティックメソッドを呼び出す [プログラミング]

2008年2月29日

PHP5の話。表題のことについて良く理解していない部分があったので、テストコードを実行してまとめてみた。

オブジェクトのメソッド内からスタティックにメソッドを呼び出しても、$thisオブジェクトは保存される。たとえ、呼び出すメソッドが、オブジェクト自身と何の関連の無いクラスに記述されていても。ただし、呼び出すメソッドが『static』指定されている場合は別で、$thisオブジェクトは使えない。

フリーなプログラミングツール [プログラミング]

2008年2月22日

改訂版。以前記事を書いた時と比べてずいぶん状況が変わっているようなので、改めて調べてみた。

Visual Studio 2008 Express Edition
Eclipse
Turbo JBuilder
C++ Explorer/Compiler
Turbo Delphi
SharpDevelop

マイクロソフトのフリーツールは、以前は期間限定だったが、最近はそうでもないようだ。VC++ 2008 をインストールしてみたが、以前はできなかったGUIアプリケーションもこれでできるようになっている。

EclipseはJava開発環境だが、PHP開発にも使えることを最近知って、インストールしてみた。現在、調整中。

ボーランドは、JBuilder, C++ Explorer, Turbo Delphi と出している。まだ試していない。

SharpDevelopもまだ開発が続いているようだ。マイクロソフトがフリーで出すようになってからは、こちらにお世話になる機会はなさそう。だが、このツールはVB.NET←→C#.NETの相互変換ができる(最新版は未チェック)ので、そういったことが必要な場合は便利かもしれない。

以前ダウンロードできたVB5は、今はリンク切れになっている。

PHP 5.2.4 [プログラミング]

2007年11月27日

Zend による PHP4 のサポートが年内で終了することに伴い、このサイト(kandk.cafe.coocan)で使用している PHP のバージョンを、5.2.4 に上げました。問題なく動くと思いますが、もし不具合を発見されましたら、e-mail か、Nucleus フォーラムのプライベートメッセージで連絡いただければ、嬉しいです。

CSRFとリファラについて [プログラミング]

2007年11月26日

ちょっと遅い情報なのだけれど。以前は多くのサイトで、リファラ(PHPでは、$_SERVER['HTTP_REFERER'])を利用したCSRF対策について有効とされていた。ところが最近(1年ほど前から)では、これが使えないということになっているようだ。

理由としては、Flashを用いると、リファラを偽装してサーバにアクセスできるため。Flashのどのバージョンからそうなのかは、調べていないので不明。いずれにせよ、リファラのみでのCSRF対策は出来ない。

当然であるが、リファラを調べたほうが、調べないよりもよっぽど良いのは確か。

自戒の意味で、メモ。
<<前の記事   後の記事>>