Windows

2013年11月23日 (土)

Delphiで正規表現(Onigumo)

パクりシリーズの第3弾です。鬼雲版です。鬼雲 (Onigumo)というのは鬼車 (Oniguruma)を改良したエンジン(Oniguruma-mod)とのことで、Ruby 2.0の正規表現エンジンとして使われているそうです。まぁ、自分としてはどちらでも良かったので、最初は鬼車を使う前提でしたが、64bit環境でビルドすると、64ビットから32ビットへの縮小変換の警告??が大量に出るので、鬼雲を使うことにしました。こちらの方はヘッダファイルを見ると、64bit環境も考慮してるようです。

ということで、RegExPackを更新しておきました。

まず、プラットフォームはWin32/Win64に対応してます。現状は動的リンクのみですが、いずれ静的リンクに可能なら対応しようと思ってます。動的リンクする場合は、各プラットフォーム毎のフォルダ(Win32、Win64)内の、onig.dllを実行時にこれらが見つけられるように、パスを通すか適切な位置に配置して下さい。自分で鬼雲をソースからビルドする場合。詳しいビルド方法は鬼雲のドキュメントを参照ということにしますが、エクスポートされた変数をDelphiから参照できるようにするために、一部ソースを修正する必要があります。詳しくはreadme.txtを・・

鬼雲というより元の鬼車が正規表現の文法を切り替えられるようになってるのですが、これにも対応しておきました。

文法を引数に取るコンスタクタを追加しておきました。指定しない場合は、デフォルトのrsPerlです。

ちなみに、当初はOSXにも対応しようとしてて、libonig.dylibをビルドしたのですが、これをダンプして中身を見ると、libonig.dylibが依存してる他のライブラリの相対パスなどではなく自分の環境依存の絶対パスが含まれていて、ちょっと、OSXの事がまだよくわかってなく、これを配布しても他の環境で動くのか不明なので、現状は自分でビルドして・・dashdash

 

2013年11月 4日 (月)

Delphiで正規表現(VBScript)

Delphiで正規表現とか今さら感がありますが・・

Delphiで正規表現というと、新しいものではDelphi XEでPCREを使った正規表現が使えるようになり、また、日本人でネットでDelphiのライブラリ等を公開してる人はほぼ全滅してて、その中でも公開している希望の星のSkRegEx があります(後、もちろん鬼車も) が、今まで自分は正規表現が必要な時は、だいたい、 ライセンスの問題に煩わされないVBScriptのRegExpオブジェクトを使ってきました。

で、今回、また、正規表現を使う必要があり、また、VBScriptのRegExpオブジェクトを使うつもりですが、せっかくなので、Delphi XEで導入された.NETライクな正規表現ライブラリ風に使えるように、脱線してRegularExpressions.pasをパクってみました。

System.RegularExpressions.VBScript.pasです。

ダウンロードはSkyDriveから。使用は各自の責任で・・



ちなみに、ラップしたVBScript.RegExpオブジェクトが貧弱なので、一部の機能はサポートしていません。詳しくは同梱のreadme.txtを・・また、ラップしたVBScript.RegExpはCOMオブジェクトなので、使用する前にCoInitialize(Ex)などで初期化してださい(メインスレッド以外で使う場合)。

Delphi XE以降が必要です。

後、更に脱線してOSX/iOS?向けにCocoaのNSRegularExpression をラップしたSystem.RegularExpressions.NSRegularExpressesion.pasも作成中なのですが、間に合わなかったので、次回・・・?dash

まぁ、特定のプラットフォーム向けのソフトウェアを作成する場合はこのように特定のプラットフォームに依存したエンジンを使ってもいいですが、クロスプラットフォーム向けのソフトウェアを作成する時に、プラットフォーム毎に正規表現エンジンを切り替えると、エンジン毎の正規表現の文法も違うことですし、おとなしく、エンジンがクロスプラットフォームなPCREを使っているDelphi標準のを使うか、Pure PascalなSkRegExを使った方が身のためですねdashdash

ここまでくると、次は、鬼車をラップして同じことをやりたくなってきたが、誰か代わりにつくってdashdash

ちなみに、Delphiの正規表現で使われてるPCREですが、去年のバージョン当たりから、UTF-16のエンコーディングに対応し始めて、これを使えば現状のUTF-8<->UTF-16の変換オーバーヘッドがなくなりますねup

2013年10月 6日 (日)

CryptoAPI and CNG for Delphi

ヘッダ移植シリーズdashdashの続きです。
前から気が向いた時にちょくちょく進めてたのがとりあえず公開してもいいかなと言うレベルに達したので、公開します。

WindowsのCryptoAPICNG(Cryptography API:Next Generation)です。 まぁ、いつも通りMPL/LGPLのデュアルライセンスなJEDI Windows API の方にもありますが・・・

CryptoAPIからは

  • Winapi.WinCrypt.pas(wincrypt.h)

CNGからは

  • Winapi.BCrypt.pas(bcrypt.h)
  • Winapi.NCrypt.pas(ncrypt.h)
  • Winapi.NCryptProtect.pas(ncryptprotect.h)
  • Winapi.SslProvider.pas(sslprovider.h)

で、あとはおまけでSSPI(Security Support Provider Interface) から

  • Winapi.Sspi.pas(sspi.h)
  • Winapi.Schannel.pas(minschannel.h,schannel.h)

いつも通りdelayedディレクティブを使っているのでDelphi 2010以降が必要です。JEDIのヘッダは更新止まってると思いますが、こっちはWindows 8 SDK相当です。移植ミスは勝手に修正して、使用は自己責任でdashdash

ダウンロードはSkyDriveから。

2013年2月 9日 (土)

libarchive for Delphi

ZIP以外でよく見かける拡張子TAR、7z、RARのファイルを解凍できるライブラリが必要になったので、色々調べてました。

まず、RARの解凍なら本家のUnRar.dll があります。暗号化やマルチボリューム化されたRARの解凍にも対応してるのですが、解凍元としてファイルしか指定できず、メモリを解凍元として解凍とかそういうことはできないので、すごいしょぼーんですdashdash。解凍先はファイル以外にもメモリに解凍できるように自由にカスタマイズできます。

次に、TARの解凍なら統合アーカイバプロジェクトのTAR32.dll があります。で、これも使ってみたのですが、まず、これも解凍元としてファイルしか指定できず、しかも、Unicodeのファイル名を与えられないので、速攻使う気失せましたcrying。Delphi専用ならTurboPower abbrevia とかいうのがあるが・・

7zの解凍は本家のLZMA SDK を使って解凍できます。LZMA SDKには7zのみならず、RARやTARなど様々な種類のフォーマットのファイルを解凍できるライブラリが含まれてます。このライブラリは暗号化やマルチボリュームにも対応してて、しかも、解凍元・解凍先をファイルやメモリなど自由にカスタマイズできます。で、実際いろいろ使ってみたのですが、なんか、動きが怪しい部分がある・・・gawk。例えば、パスワードで暗号化されたファイルを解凍しようとすると、パスワードを要求するコールバックが呼ばれたりするんですが、解凍するファイルによってなぜか複数回コールバックが呼ばれたりうむむ・・・・

このライブラリの作者は一人?でLZMA SDKから、圧縮・解凍ソフトの7Zip自体の開発をしてて品質を維持するのきびしいんじゃと邪推・・

他に.NET用としてSharpCompress などよさそうなものを発見したのですが、ネイティブで自分の要件に合うよさそうなのはあんまいいものがないんだな・・・

と、思ってたのですが発見しました。libarchive ですhappy02happy02。ZIP、TAR、7z、RARはもちろんLHA、CABなどのフォーマットやCOMPRESS、GZIP、BZIP2、LZMAなどの圧縮・伸長にも対応してます(GZIPに対応するにはzlib、BZIP2はlibbz2などのようにさらに他のライブラリが必要になりすますが)。もちろん、解凍元・解凍先をファイルやメモリなど自由にカスタマイズできます。ただ、現状、暗号化には対応してないようです。マルチボリューム(例えばRARなど)には対応してるようですが、APIの使い方が微妙・・とはいえ、実際使ってみると、やっぱいい感じです。複数人で開発されてるっぽいし、テストケースもしっかり用意されてるので、安心感があります。

ただ、1点気になるのは、パスにUnicodeな文字を含むエントリを含むファイルを解凍するには、iconvというライブラリが必要という・・・残念・・・Windows環境にまでiconv持ち出されるとうざすぎる・・・weepweep

うーん。

ということで、とりあえず、Delphi用のヘッダ(LibArchive.pas)だけでも・・

実際に使うにはlibarchiveを自分でビルドしてください・・Delphi用のヘッダはとりあえずMicrosoft Visual C++に合わせてあります。他の環境で使う場合は、LibArchive.pasのsize_tやtime_t、wchar_tなどの定義を各自変更して下さい。

2012年12月15日 (土)

HTTP Server API for Delphi

今度はHttp Server API と遊んでましたdashdash。なんで、突然こんな事をやってたかというと、最近遂に、へぼパソコン をパワーアップさせました。

Corei5_3470_5

  • CPU:Core i5 3470
  • メモリ:8GB(だけど、Windows 7 32bit版・・・)
  • マザーボード:GA-B75M-D3H
  • HDD:計2.5TBくらい

うぉぉぉぉdash

で、せっかくなので、CPUパワーを活かす動画?絡みのネタをやりたいということで、DLNA(Digital Living Network Alliance)というものに興味を持ち、DLNAの技術的な事を調べると、UPnP,HTTPだのSOAPだの色々出てきて、たとえば、DLNAのDMS(Digital Media Server)とか実装する場合、HTTPのサーバー側の機能が必要なので、Http Server APIで遊んでたのですdashdashdash。まぁ、そもそもUPnP APIs とかWindows Media Streaming API とかよりダイレクトなものがありますが・・・・happy02

ということで、Delphi用のヘッダ。

  • Http.pas(http.h)


delayedディレクティブを使ってるのでDelphi 2010以降が必須です。レコードのアライメントがな謎・・なので問題あれば各自修正してください。つうか、自分はヘッダの移植マニアではありませんweepweep。後、ついでに、かなり前に公開したMicrosoft Windows HTTP Services (WinHTTP) のDelphi用のヘッダ もWindows 8 SDKに合わせて更新しておきました(Web Sockets絡みが追加)。

2012年7月27日 (金)

Microsoft Media Foundation for Delphi

BITS(Background Intelligent Transfer Service)と遊んでたかと思えば、今はMicrosoft Media Foundation で遊んでいます。飽きっぽさは天下一だな・・dashdash

ということで、Microsoft Media Foundation関連のCのヘッダをDelphiに移植しました・・
まぁ、関連ヘッダがいっぱいあり、どこまで含めていいのか微妙だが・・とりあえず、この中

  • Dxva2Api.pas(dxva2api.h)
  • DxvaHd.pas(dxvahd.h)
  • Evr.pas(evr.h)
  • Evr9.pas(evr9.h)
  • MfApi.pas(mfapi.h)
  • MfCaptureEngine.pas(mfcaptureengine.h)
  • MfMp2Dlna.pas(mfmp2dlna.h)
  • MfError.pas(mferror.h)
  • MfIdl.pas(mfidl.h)
  • MfMediaCapture.pas(mfmediacapture.h)
  • MfObjects.pas(mfobjects.h)
  • MfPlay.pas(mfplay.h)
  • MfReadWrite.pas(mfreadwrite.h)
  • MfTransform.pas(mftransform.h)
  • WmContainer.pas(wmcontainer.h)

とおまけ

  • MMReg.pas(mmreg.h)

delayedディレクティブなどを使ってるのでDelphi2010以降が必要です。たしか、Windows8 SDK相当です。いくつかの関数やインターフェースを使ってるだけなので、移植ミスあったら各自頑張って修正してくださいdashdash

ダウンロードはSkyDriveから。

もういやだDelphi。ちょっと遊ぶだけなのに、ヘッダ移植させんなよ・・生産性悪すぎDelphi。もう、我慢の限界。

つうか、いずれ、ここ で他の人の移植がダウンロードできるらしい・・・

2012年6月16日 (土)

Background Intelligent Transfer Service for Delphi

あいからわず、飽きっぽいな俺dashdash

まぁ、とりあえず、BITS (Background Intelligent Transfer Service)と戯れるためにヘッダを移植したので。JEDIで既に移植されてるかもしれんけど、MPLにしろライセンスの事考えるとダルイので、自前で・・

ダウンロードは下のSkyDriveのリンクから。


2012年4月 9日 (月)

Windows 8 API List

Windows 7購入したので、Windows 8は購入しないけどdashdash

Windows 8に追加される予定のAPIを眺めててWindows Runtime以外の自分的に気になるものを・・。

まず、インターネット絡みだと、Web Sockets。

WinHttp でも、WinHttpWebSocketで始まる一連のAPIが追加されるようです。WinHttpは、後はWPAD(Web Proxy Auto-Discovery)絡みも拡張されて新たなAPIが追加されるっぽい。

後は、COMオブジェクトでネイティブから利用できるXML HTTP Request 2 略してXHR2?。

WinInetやWinHttpを直接扱うと、だるいんですdash(WinHttpにはCOMラッパーも用意されてるが)。XML HTTP Request 2というぐらいだから、その前のバージョンもあるんですが、大きな違いは、IXMLHTTPRequest2::SetCustomResponseStream 。これで、レスポンスを特定のストリームに受信できるようになるわけで、以前はこの仕組みがなかったので、巨大なファイルをダウンロードする時に、直接ファイルに保存とかできなかったのですが、これで解決happy02

インターネット以外だと、今更感があるが、Rich Edit 。OS付属のRich Editコントロールはずっとバージョンが4.1のままだったんだが、どうもRich Edit 8.0とパワーアップするっぽい。

TOM(Text Object Model) がバージョン2になって、ネイティブイメージサポートなど、画像の挿入やRichEdit Friendly Name Hyperlinks の扱いが楽に。

ちなみに、Twitter APIの変更などで動かなくなって、放置しているPiyotter は、タイムラインの描画にRich Editコントールの機能つかって描画してました。

Rich Editコントロールの各バージョンの機能については

これぐらいしかおもしろそうなのないdashdash

2012年4月 8日 (日)

Delphiで非同期プログラミング・・・おまけ

前回 簡単な固定スレッド数のスレッドプールを実装してみたが、自分で実装する事はバグの温床になりかねないわけで、最初はWindows Vistaで追加された新しいスレッドプールAPIを利用して実装しようとして、断念してましたが、せっかくなので。

まず、Vistaで追加された新しいスレッドプールAPIについては、

を参考に。

新しいスレッドプールAPIはプロセスに複数のスレッドプールを作成できたり、ペンディングの操作をキャンセルできたり、何より天下のマイクロソフト様が実装してるので、使わない手はないのですが、ちょっと、問題が・・・

Delphiでは、サブスレッドとGUIスレッドであるメインスレッドを簡単に同期するための仕組みとしてTThread.Synchronizeメソッドがあるわけですが、メインスレッド側で待機操作をする場合、定期的にClasses.pasのCheckSynchronize手続きを呼ばないと、サブスレッド側でTThread.Synchronizeされてた時に、デッドロックが発生しますが、Vistaで新しく追加されたスレッドプールAPIの、例えば、ワークコールバックが完了するまで待機するWaitForThreadpoolWorkCallbacks APIを見ると・・・

タイムアウトを指定できません。要するに定期的にCheckSynchronize手続きを呼べないわけで、あぼーんdashdash

TThread.SynchorizeはDelphi独自のメカニズムで同じような事を直接WinAPIのSendMessageでやっても、デッドロック(これからは、TThread.Queue(PostMessage)の時代?)。

単純に1対1にマッピングはできなくてある程度自分で作り込む必要あるっぽいねweep

まぁ、とりあえず、Vistaで追加された新しいスレッドプールAPIのヘッダだけでも


2011年12月12日 (月)

Microsoft Sync Framework for Delphi

Microsoft Sync FrameworkのSDKだけをDelphiに移植しました。

バージョンは2.1です。SyncFramework SDK自体のダウンロードはMicorosoftのサイトから。

  • WinSync.pas(winsync.h)
  • Synchronization.pas(synchronization.h)
  • SynchronizationErrors.pas(synchronizationerrors.h)
  • Metastore.pas(metastore.h)
  • MetastoreErrors.pas(metastoreerrors.h)
  • FeedSync.pas(feedsync.h)
  • FileSyncProvider.pas(filesyncprovider.h)
  • FileSyncErrors.pas(filesyncerrors.h)
  • FullEnumerationProvider.pas(fullenumerationprovider.h)
  • AnchorEnumerationProvider.pas(anchorenumerationprovider.h)
  • SimpleProviderErrors.pas(simpleprovidererrors.h)

です。移植ずっこけてるかもしれんませんがdash。使用は各自の責任でgawk

より以前の記事一覧

自作ソフトウェア

無料ブログはココログ

メモ