起動したプログラムが終了するまで待機するには
執筆:2007.01.22
編集:2007.01.22
起動したプログラムが終了するまで待機するには
System.Diagnostics.Process
Start(command)
Start(command, コマンド ライン引数)
WaitForExit()
WaitForExit(最大指定したミリ秒間待機) |
[VB.NET] |
|
Dim p as System.Diagnostics.Process
p = System.Diagnostics.Process.Start("notepad.exe")
p.WaitForExit() |
|
|
[C#][C++] |
|
System.Diagnostics.Process p;
p = System.Diagnostics.Process.Start("notepad.exe");
p.WaitForExit(); |
|
|
[Delphi .NET] |
|
uses System.Diagnostics
// ..
var p : System.Diagnostics.Process;
begin
p := System.Diagnostics.Process.Start('notepad.exe');
p.WaitForExit(); // 終了するまで待機します
end; |
|
|
WshShellオブジェクト
[Delphi 32] |
|
uses comobj;
procedure TForm1.Button1Click(Sender: TObject);
var WshShell , oExec : Variant;
begin
try
WshShell := CreateOleObject('WScript.Shell');
oExec := WshShell.Exec('notepad.exe');
// [Status] WshRunning : 0 , WshFinished : 1
while oExec.Status = 0 do Sleep(100);
except
WshShell := Unassigned;
end;
end; |
|
|
[VBScript] |
|
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("notepad.exe")
Do While oExec.Status = 0
WScript.Sleep 100
Loop
' msgbox "OK?" |
|
|
参考
起動したプログラムの終了を待たない関数は
ShellExec関数(Win32API)
などがあります。
バージョン管理 win編 Subversion(Quick Start)
執筆:2007.01.10
忘れっぽいので、覚え書きです。
※ Windowsで使う用途で記述していますが、Linux系なら標準で利用できるようです。
※ インストール後、試用20分間程度のまとめです。
インストールした経緯:
StarTeamだと比較的最新のDelphi(BDS)以外管理できないし
Winのソフトなどをcvsでバージョン管理しようとおもっていたのですが、
cvsサイトにいっても、うまくファイルを揃えることができませんでした。
そして偶然、Subversionという類似品を発見し、インストールしました。
下記の3つをそろえると、とても操作性がいいです。very good!
の3つをダウンロードします。
インストール直後の要点 |
環境変数の設定 |
インストーラーだと自動設定されていると思います。
手動の場合は。
マイコンピューター:プロパティから設定しましょう。
SET APR_ICONV_PATH="C:\Program Files\Subversion\iconv" |
|
tortoisesvnのヘルプを見ながらテストしてみます。
日本語パックをインストールしてからのほうがいいと思います。
基本的に、tortoisesvnのヘルプを読むだけで操作できるようです。
データが消えると困るので
テストは、フラッシュメディアでやってみました。
同一PCで、管理と両方使う場合
1. |
リポジトリの root フォルダとして SVN という空のフォルダ (例: D:\SVN\) を作成します。 |
2. |
D:
cd D:\SVN
svnadmin create --fs-type bdb MyNewRepository |
クライアント用途の場合は、ここからはじめます。
ここから下は、
使い方を誤ると、悲惨なことになりますので
消えても痛手を受けないような
フラッシュメディアなどのディスクでテストすることをお勧めします。
よーく 付属の説明書を読んでからにしましょう。 |
3. |
フラッシュメディアなどに
適当?にフォルダを作成します
MyProject\trunk
MyProject\branches
MyProject\tags
5.2.1. リポジトリレイアウトを参照のこと |
4. |
MyProjectフォルダを右クリックして、
インポート をクリックします。
file:///D:/svn/MyNewRepository/MyProject
リポジトリブラウザでみてみましょう。
しっかりできていますね? |
5. |
適当な作業フォルダで
フォルダを右クリックして、
SVNチェックアウト
をクリックします。
作業フォルダにファイルがでてきましたか?
(.svnフォルダが隠し属性で作られています。) |
|
あとは、
付属の説明書をみながら、
楽しく、試用します。
そして、保存する構造を決定して運用します。 |
[tT]humbs.db */[tT]humbs.db
*.[tT][mM][pP] */*.[tT][mM][pP]
は共通の除外ファイルに設定していた方がいいでしょう?
Linux系にアクセスする場合は、大文字小文字を区別するので注意しましょう。
|
リポジトリのコピーの仕方。(バックアップ)
svnadmin hotcopy path/to/repository path/to/backup --clean-logs
詳しくは、説明書を参照。 |
|
|
【Tios】
・ |
誤登録などのデータの完全削除
tortoisesvnでは、できないそうです。
(B.4.3. svndumpfilter の使用)
svndumpfilter を利用します。
svnadmin dump
svnadmin load
を使います
:後述 |
【ここがいまいち】
・ |
変更差分を表示するで、EUCだと文字化けする
(ブラウザみたいに表示する文字コード変更がない)
SJISとutf8でテストした限りは大丈夫っぽかった。 |
・ |
一度登録すると、削除しても変更履歴として残り 閲覧可能。
保護する面では、ある意味そうあるべきですが、
指定したリビジョンの完全削除くらいほしいところ |
・ |
無視リストにファイルを入れて更新した後、
無視リストから削除をしても コミットできない。
(バグかもしれない)
ほかの更新と合わせると適用される。 |
|
変更単位は、リビジョン毎(コミット単位)
従って、不要なリビジョンを削除した時に
更新チェック時の問題が発生します。
ファイル単位でやって欲しい気が・・・ |
|
リポジトリブラウザの
右クリックメニューに
ここを 圧縮して保存が欲しい!!
自分で作ってもいいが・・・
機能要望にだそうヨ!! |
【最後に】
古いバージョンも同時に、修正したりしたかったので
いいツールが無料で見つかってよかったです。
自動バックアップは、.vbsに処理を書くからいいとして
いままで、古いプロジェクトをlzhかzipに圧縮してたので、
いままでどうり、
ソースとかを zip,lzh,gzのどれかで、自動保存もしてくれると非常にありがたいのですが・・・
イベントが登録できるようなので
やり方は、おぉおぃ探すことにしましょう。
【削除と再構築編】
完全に消したいデータが、でてきた場合には避けられない。
手順 |
完全削除には、リポジトリの作り直しが必要? |
|
パイプ | でつなげるのも可。
リダイレクト ><
(詳しくはヘルプ MSDOSを参照)
?作業がおわるまで、ロックする?。
svnadmin dump D:/svn/oldrepo > repos-dumpfile
上記のでは、infile-dumpfileには、repos-dumpfileを指定します。
注意:後述の説明をみましょう。
svndumpfilter exclude --drop-empty-revs "/削除するパス" < infile-dumpfile > outfile-dumpfile
svnadmin create --fs-type bdb D:/svn/newrepo1
svnadmin load D:/svn/newrepo1 < outfile-dumpfile
D:/svn/oldrepoフォルダの名称変更または、削除します。
次にnewrepo1の名称を変更します
newrepo1をoldrepoに名称変更
rename D:/svn/newrepo1 D:/svn/oldrepo
|
|
構築後の問題
--drop-empty-revs を指定すると ・リビジョン番号の番号詰めが行われます。
・バグツールと連携している場合、番号が照合しなくなる可能性があります。
一般公開している場合は、--drop-empty-revs は指定しない方が無難でしょう。
作業フォルダの更新でエラーの場合は、
作業フォルダ内の
必要なファイルを別の所に移動して、チェックアウトからやり直し。 |
予期しないデータの破損をするおそれが高いので
・バックアップを忘れない。保存しておく。
・説明書をよく読み理解しておく
・ |
Indyの最新版のインストールの仕方[Delphi2005]
執筆:2007.01.05
編集:2007.03.19
編集:2007.07.09
編集:2007.07.18
編集:2007.11.24
編集:2009.10.16
編集:2015.11.21
編集:2017.04.07
記事の内容が古いので注意してください。 最新の内容ではありません。
10.0.52は、かなり古いので
cookieのドメインの最初が .で始まっていると処理できずエラーになります。
(IdCookie、IdCookieManager)
(10.1.6でも直っていませんでした。:2007.3、2007.7)
(10.2.3でも直っていませんでした。:2007.10)
(10.5.7 IndyTiburon.zipで修正されているようです。:2009.10)
(10.6.2.0 svnid:5315 : 2015-11 修正が必要でしたがDelphi2005にインストールできました)
(10.6.2.0 svnid:5412 : Delphi2005にインストールできました)
最新版のインストール方法
最新版の入手先
» 続きを読む
Win Apacheでperlを1行目無視でcgi実行するには
執筆:2006.12.27
編集:2007.01.04
普通に実行するには、httpd.confに
Options +ExecCGI
AddHandler cgi-script .cgi
を書くだけで使えるでしょう。
そういう人は、これを読んでも意味がありません。
私のような、開発はWin 、サーバーはunix系だと
困ったことになるのです。
・Cygwin(Win上で動くLinux)のApache
・Anhttpdサーバー
・仮想OSを使ってApache
・Win Apacheで無理矢理変換
などの選択がありますが、ここでは、無理矢理変換をやってみましょう。
Winでは、
CygwinのApacheやAnhttpdサーバー
を使えばなんの苦労もなく実行できるのですが
Win Apacheを使うと スクリプトの最初が
#!/usr/local/bin/perl
#!c:/prog..../perl.exe
と指定の仕方がちがうのでーす
※CygwinのApacheつかえって つっこみは抜きでお願いします。
それで 、直接ハンドラを変更してみると 内部エラー・・・・
unix系で できるのになぜ?
Anhttpdサーバー的な使い方をしたいのですよ!!
いろいろ条件を変え、試して、
どうもWinのperl.exeは、環境変数をよんでくれない?
という結論にいたりました
直接perl.exeにおくらず
仲介ソフト+リダイレクトを通すことにしました。
やっていることは、
カレントディレクトリを変更して
STDINをファイルに書き出して
PATH_INFO
PATH_TRANSLATED
から
単に、コマンド実行させて結果をファイルに保存して、
そのファイルをコンソールにはきだすだけです。
ここで問題になるのが実行の同期問題です。
コマンド実行がくせもので、Win32アプリですと
言語はなんでもいいのですが
Shellexecでは「実行待ち無し」にしかできないので
「実行待ちができる」Shellコマンドを使うのですが、なぜかVBにしかないのです。
VBはもっていないので
Delphi2005でコンパイルできる VB.netで作ってみました。
(ShellがないためにDelphi → Delphi.net → VB.net という経過をたどりました。)
つい慣れている環境で作ろうとしてしまうので・・・おもわぬところでつまづきました。
VB.netはコード支援が働かないのでヘルプを見ながらコピペでペタペタと・・・
実行ファイルも7KBと小さいので、問題なしです。
本気でWin運用するには、
Win apacheではなく、仮想OSかCygwin上の方が
全角文字問題やmodrewriteの動作異常につきあわずに済みます。
またそのほうがセキュリティ的にいいと思います。
しかし、記憶容量やメモリや、実行速度の問題で
テストにしか使わないのに、いちいちそんなことできませんよー
というときに この技は 便利なんです。
ScriptAlias /perl_MyCgi/ "c:/。。。/Perl/bin/"
Action cgi-script "/perl_MyCgi/perl.exe"
これで 動けば一番いいのですが動かないのです。
※この方法で最近のphpは、動くようです。(php-cgi.exe)。
※perl.exeが馬鹿なので仕方がないです
そこで
※CygwinのApacheつかえって つっこみは抜きでお願いします。
やり方は、非常に簡単です。
●ハンドラのオーバーライト(httpd.conf)
ScriptAlias /perl_MyCgi/ "c:/。。。/Perl/bin/"
AddHandler perl_cgi .cgi
Action perl_cgi "/perl_MyCgi/perl_cgi_vb/perl_cgi_vb.exe"
●仲介ソフトの設置(ここでは、perl_cgi_vb.exe)
(※パスの全角文字は壊れるようなので、全角を含む場合は、Cygwinを検討しましょう)
ついでに、スクリプト内でのOSの確認は
if (index($^O,'Win')>=0) { }
みたいな感じで分岐できます。MSWin32
わぁ。やったぁ・・・
そ の ま ま
う ・ ご ・ い ・ た
しつこいですが、
※CygwinのApacheつかえって つっこみは抜きでお願いします。
※本気で使う場合は、CygwinのApacheか、仮想OS上で普通に使うほうが安全です。
仲介ソフト |
のコード(一部)
VB.net (Shellを利用するため) |
PerlのPath |
dim rk as Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Perl")
if Not(IsNothing(rk)) then
Perl_exe_Path = rk.GetValue("BinDir","")
End if |
環境変数
の取得 |
PATH_INFO = Environment.GetEnvironmentVariable("PATH_INFO")
PATH_TRANSLATED = Environment.GetEnvironmentVariable("PATH_TRANSLATED") |
コマンドの
エスケープ用 |
Function QuotedStr(S as String)
Dim c as Char
c = """" ' ややこしくなるので単純化
Return c + S.Replace(c, c+c) + c
End Function |
|
Sub MakeStdinFile()
dim AFileStream as FileStream
Dim standardInput as Stream
dim b as byte
dim i as integer
' STDIN の内容を書き出す
Temp_IN_FileName = getTempFileName()
AFileStream = new FileStream(Temp_IN_FileName,FileMode.Create)
standardInput = Console.OpenStandardInput()
' Seekをサポートしていないので 最後にきたかを判定。
' ReadByte() 終わりだと -1
Try
i = standardInput.ReadByte()
While (i>-1)
if (i = -1) then exit While
b = Cbyte(i)
AFileStream.WriteByte(b)
i = standardInput.ReadByte()
End While ' Wend
Finally
AFileStream.Flush()
AFileStream.Close()
End Try
End Sub |
作成関数 |
Sub MakeStdinFile()
Sub DeleteStdinFile()
Sub DeleteTempFile()
Function getTempFileName() as string
Function cmd() as string
Function QuotedStr(S as String)
Sub ExecCGI() ' shell |
その他
使用したクラス |
FileStream
Console.OpenStandardInput()
Console.OpenStandardOutput()
|
概要
Stdinの内容をstandardInput.ReadByte()でファイルに納め、
コマンドとともにリダイレクトし、
結果ファイルを、FileStreamでreadbyteで読み込みながら
Console.OpenStandardOutput()へwitebyteで出力します。
CygwinやLinuxの場合。
普通に、
httpd.confに
Options +ExecCGI
AddHandler cgi-script .cgi
を書くだけで使えるでしょう。
/usr/bin/perl
と
/usr/local/bin/perl
の場合に対応できるように
perlが入っていることを確認して
/usr/binと/usr/local/binにシンボリックリンクがあるか確認しましょう。
Cygwinの場合、ln -s /usr/bin/perl /usr/local/bin/ perl
で、リンクを追加しておけば、特に困ることはないと思います。
OpenOffice2を試してみる2006
※ この記事の内容は古くなっています
執筆:2006.12.26
OpenOffice2の実力を試してみる。
まずは、他形式の読み込みから
|
結果 |
ファイル形式 |
フィルタ名 |
備考 |
一太郎10 |
× |
一太郎10。
たんなる小さな平凡な表 |
Ichitaro 8/9/10/11 |
一般的なIOエラー |
word2000 |
○ |
簡単な表 |
Excel2000 |
○ |
表:ちっぽけな簡単な計算式 |
lotus123 2000 |
△ |
グラフ付きの簡単な表。
グラフが消滅。 |
|
|
|
|
|
という感じで、これ以上
試す気力を失いました。
Wordに関しては、OpenOffice1の時よりは、マシになっている気はします。
HTML編集機能も、操作性・機能からすると使いにくそうで
使う気にはなりません。
どちらにしても
マクロがVBAではなくBasicを採用している時点でこのソフトおわっています。
マクロBasicは、難解なので キ・ラ・イ
xml編集機能以外、office2000よりいいと思う点がなにもないので
OpenOffice3に期待して
OpenOffice2はアンインストール。 さらばOpenOffice
$ /usr/sbin/apachectl2 start
/usr/sbin/apachectl2: line 78: 4072 Bad system call $HTTPD -k $ARGV
cygrunsrvを入れる。
cygserver-config
net start cygserver
/usr/sbin/apachectl2 start
うごかないのであきらめる・・・
apache1をいれapache2を削除指定
/usr/sbin/apachectl start
うごいたのでヨシとしよう。
» 続きを読む