「あなくつ」のおもちゃばこ

Blog

Apacheモジュール開発

Free Pascal最近はPHPをやめて、ウェブシステムをネイティブコードのApacheモジュールで開発しています。

まぁネイティブコードと言ってもPascalですけどね!! しかもFree Pascal (笑)。みんなにバカにされるんだろうなぁ、そんなもんで開発すんな!ってね。まぁほら、使わないと発展しないどころか廃れちゃうじゃん? 世の中ネイティブコードがC/C++だけとか面白くないし。ちゃんとメジャーなプラットフォームでコンパイルできるし、64bitも吐けますから。Object Pascalって軽く使うだけならメモリとか意識しないですむし、オブジェクトとかスコープの概念が理解しやすいなど、メリットもあると思うんだよね。このあたりは言語宗教だね。

ま、いずれにせよ、もうかなりの時間かけて環境とかライブラリ作っちゃってるし、後戻りできないよねー。

で、肝心の性能。単純にHello World返すだけならPHPとネイティブコードだとあまり動作スピード変わらないんだけど、オブジェクトとかガリガリ使ってくるとやっぱりネイティブの方が速いみたい。

個人的にはメモリ管理が出来るのがよい。どこでメモリを開放する/されるか知っているのでなんか安心。開放し忘れのリスクはあるけれど、try..finally使ったり生成と破棄のコードを同時に書くなど注意するようにしている。あ、そうそう、文字列処理とかリストの処理はメモリ管理ができたほうが実行速度速いね。基本的に文字列やリストの操作ってのは内部的にはメモリの再確保なんで、ネイティブなら先にガバッとメモリ確保するなどそのあたりでメリットがある。

あとは、変数の宣言と型指定があるのが良い。PHPのようにどこでも変数が現れて、何でも入るってのはなんか気持ち悪い。Integerの変数ならDBに問い合わせるときにエスケープする必要がないって保証できるじゃん? コードや変数は必然的に長くなるけどねぇ、個人的精神衛生のために我慢。

あれ、Apacheのモジュール作るときの覚え書き書こうと思っていたのに、思ったことを適当に書いちゃったな。マネージドやインタプリタもいいけれど、それのベース作ってるのはだれ?ネイティブじゃないの?と思う。プログラムが全部ネイティブである必要はないけれど、ネイティブも操れるくらいの方ができることの幅も広がると思うんだよね。

タグ : Apache,Free Pascal

2010/08/14 06:45:42 | Trackbacks (0) | Comments (0) | Technology

FreePascalでクロスコンパイル (再来)

いやぁ結局Linuxはダメだったんだけどね。書いておかないと忘れちゃうので。

FreePascalでクロスコンパイル (再来)」の続きを読む

タグ : 32bit,64bit,FreePascal,Lazarus,Linux,クロスコンパイル

2010/07/26 05:45:52 | Trackbacks (0) | Comments (0) | Technology

Delphiについていろいろ考え中

最近はLazarus使ってFreePascalでプログラム書いているのだけれど、せっかくクラスとか書いたら公開したいなぁと思うわけです。ところで、時代はDelphi 2010なわけで、Delphiで扱う文字列がUnicodeになっているわけです。そこで気にしたいのは、バイト単位で文字列を操作する部分はUnicodeとAnsiどちらでも動くようにするということ。

まぁぶっちゃけるとMIMEの処理を行いたいわけだけど、ISO-2022-JPの文字列をstringに突っ込むとどうなるんだろうとか、Base64のエンコード・デコードをしたときにデータを格納すべき変数のデータ型は?とかが、いろいろ分からないのです。データを全部TStream系とかarra of Byteか何かで処理すれば気にしなくていいんだけれど、そうすると文字列検索なんかが面倒になる。ちなみにIndyとかはarray of ByteをTBytesとして宣言して使っているっぽい。

まぁこんな感じで悶々と考えたわけだけれど、結論としてDelphi 2009以降がないとわからん!ってことであきらめました。とりあえずstringはすべてAnsiStringとして考えておくことにします。

タグ : Base64,Delphi,FreePascal,Lazarus,MIME,Unicode

2009/11/05 03:21:01 | Trackbacks (0) | Comments (0) | Technology

FreePascalがMySQLでLIMITするとき

MySQLはSELECT文にLIMITが入っていればどんな時も結果件数を制御できた気がするんだが。例えばこんなSQL文は実行できるはず。

SELECT user_name WHERE user LIMIT 5

この文をphpMyAdminから発行してもちゃんと結果が返ってくるのに、FreePascalからデータベースドライバ経由でこれを発行しても結果が返ってこない。ってかエラーをRaisすらしない。こういう場合はどうするか。

SELECT user_name WHERE user ORDER BY user_id LIMIT 5

ORDER BY句をつけなければいけないらしい。まぁ普通はLIMITを使うときは何らか並べ替えがあって、それを一定数取り出したいときだから特に問題になることでもない。しかしながら、並び順はなんでもいいから(普通はMySQLのデータ格納順)、とりあえず一定数取り出したいなんて時はそれが使えないことになる。

タグ : FreePascal,LIMIT,MySQL

2009/10/22 17:38:51 | Trackbacks (0) | Comments (0) | Technology

クロスコンパイルあきらめモード

もう諦めて、ターゲットOSにLazarusインストールしちゃった。あぁ結構いいところまで行っていたと思うんだけどなぁ...。

FPCのライブラリで完結するプログラムなら前回の記事までの方法でコンパイル可能。デバッグをWindowsでやってLinux向けにコンパイルってことも可能なわけです。が、Lazarusのライブラリがうまくクロスコンパイルできないので、IndyやMySQLなどの便利なコンポーネントが使えないわけです。

コンパイル中にエラーが出るんだけれど、単純にリンクエラーとしか出ないから何のライブラリが足りなくてエラーになっているのかがわからん。コンパイラのメッセージを全部出力してみても、Linuxライブラリを読み込んでいるプログラムの内部でエラーが起こっているようで、具体的なエラーが分かんなかった。

とりあえず今回は納期があるので、クロスコンパイルはまた後日チャレンジしてみよう。本家のコミュニティー関係で質問でもしてみようか...。

タグ : FreePascal,Indy,Lazarus,MySQL,クロスコンパイル

2009/10/15 20:54:33 | Trackbacks (0) | Comments (0) | Technology

FreePascalでクロスコンパイル(続)

FreePascalは日本語の資料が非常に少ないから大変。

この前できなかったクロスコンパイルができるようになったー。これでDelphianがLinuxを制する日も近くなる。参考にしたのは公式サイトからリンクされているBuildFAQとググってでてきたBuildFAQ。後者の方がどちらかというと分かりやすい。

  • FPCのFTPサイトからbinutilsを取ってくる
  • 取ってきたファイルを展開し、fpc\[Version]\bin\i386-win32にコピー(これであっていた!)
  • fpc\[Version]\bin\i386-win32フォルダにPathを通す(Rad Studioなどの製品をインストールしている場合は、製品に付属しているmakeを使用しないように順序に注意)
  • FPCのCVSからFreePascalのソースコードをダウンロードして適当に展開
  • コンソールを起動し、展開したフォルダに入る
  • make clean
  • make OS_TARGET=linux all
  • make OS_TARGET=linux install INSTALL_PREFIX=<fpcbindir (fpc\[Version]\binなど)>

とりあえずこれでWindowsでコンパイルしたHello WorldがLinux上で動くようになった。LCLは試していないので分からないけれど、こちらもクロスコンパイル用にコンパイルが必要になりそうな予感。

タグ : FreePascal,Linux,クロスコンパイル

2009/10/14 23:05:17 | Trackbacks (0) | Comments (0) | Technology

FreePascalでクロスコンパイル

をどうやればできるのかわからん!

とりあえずBuildFAQ(リファレンス)から分かったこと。

  • FPCのFTPサイトからbinutilsを取ってくる
  • 取ってきたファイルを展開し、中身をppc386コンパイラライブラリのあるフォルダ(これがまずよくわからん、fpc\[Version]\bin\i386-win32でいいのかな?)にコピー
  • クロスコンパイル用のコンパイラをコンパイル(ココから未知の領域)

ん~、いい線まで来ていると思うんだけどなぁ。もう少しからかってみます。

タグ : FreePascal,クロスコンパイル

2009/10/09 03:25:59 | Trackbacks (0) | Comments (0) | Technology

FreePascalでSkRegExpを使う

正規表現が使えないと文字列処理が面倒です。Perl・PHPを使っていると当たり前のように正規表現を使うので、それに慣れてしまっていますね。

Delphiでプログラム書いていたころ、SkRegExpという正規表現コンポーネントを使っていたので、それをFreePascalで使えるようにしてみました。FreePascalの方が文法が厳格なので、ポインタ関連の処理で少々修正が必要です。具体的には、オブジェクトの代入時にはクラスのキャストを行う、関数変数の代入時には関数へのポインタを代入するようにする、で動くようになります。あ、あとUnitファイルをUTF8で保存し直しておかないと日本語が文字化けします。

コンパイルしながらエラーになったところ(ほとんどポインタ関連)を修正していけばいいと思います。MPLなので修正したものを再配布しようかと思いましたが、そんなに難しいことではないので自力でガンバ!ってことで。

タグ : Delphi,FreePascal,正規表現

2009/10/09 03:01:47 | Trackbacks (0) | Comments (0) | Technology

FreePascal + MySQL

今日はFreePascalからMySQLへの接続をがんばってみた。

MySQLへの接続は、データベースドライバをラッピングしているコンポーネントがLazarusに付属しているので、それを利用することにする。簡単な使用方法は公式Wikiに載っているので、それ通りに実装すれば最低限は動作する。以下は若干気をつけなければいけない点。

  • 現在サポートされているのはMySQL 5.0.x。現状最新の5.1.xは接続してくれない。
  • 実行ファイルと同じディレクトリに(パスが通っているディレクトリもOKかも)libmysql.dll(Linux系ではlibmysql.soかな)をコピー
  • 日本人ならSET NAMESをしないと文字化けする。

とりあえず昨日のExtPascalと今日のMySQLを組み合わせてExtJS-FreePascal-MySQLがつながった。あとはプログラムを組んでいくだけだが、この先は世界的に見ても明らかに資料が少ない...。

と、とりあえずここまでやって、夜28時から作業し始めて(←そもそもこれが大間違い)朝が来た。

タグ : ExtJS,ExtPascal,FreePascal,Lazarus,MySQL

2009/10/05 06:10:05 | Trackbacks (0) | Comments (0) | Technology

ExtPascalへの道のり

ExtJS + FreePascalを使うためのメモ。環境はWindows Vista 64bit + FPC 2.2.2 + Lazarus 0.9.26.2 beta + ExtJS 3.0.0。

基本はオフィシャルページのGettingStartedページWebServer_Embeddedページを参考にしている。

  • lazarusをインストール(Free Pascalもインストールされる)
  • とりあえずApacheをインストールして、適当に設定
  • ExtJSをダウンロードして遊んでみる
  • [ドキュメントルート]/extディレクトリを作成し、その中へダウンロード及び展開したExtJSのファイルをコピー
  • サーバー統合型ExtPascalを構築するならIndy10をインストール
    • ダウンロード及び展開したIndyのファイルのうち、fpcディレクトリの中身をlazarusディレクトリにコピー
    • [Lazarusルート]/components/indyディレクトリを作成し、lazarusディレクトリ内のファイルをコピー
    • indylaz.lpkをダブルクリックでLazarusを起動
    • 「Package」ウィンドウの「Compiler Option」ボタンをクリックして「Other Unit Files」項目に「./」を追加(良く分からないけど、これしないとコンパイルエラーになる)
    • 「Install」ボタンをクリックしてコンパイル&インストール
    • コンポーネントタブにIndyが追加されていればOK
  • ExtPascalをダウンロードし、適当に展開
  • ExtToPascal.dprをコンパイル(このときコード内で定数(const)に代入しようとしているコードがあるので、これを変数(var)に置き換える)。コンソールアプリケーションとしてExtToPascal.exeができる
  • ExtToPascal.exeにコマンドライン引数として「[ドキュメントルート]/ext/docs/output」を渡して実行(ここでExtJSのバージョンにあったUnitファイルが作られるのかな)
  • ExtPascalSamples3.dprをコンパイルしてみる(embeddedの場合はリポジトリにあるExtPascalSamples3_embedded.lpiをダウンロードしてdprと同じフォルダにコピー&コンパイル)。
    • embeddedの場合はTIdExtApplication.Createをしているところで待ち受けポートを変更できる
  • コンパイルして出力されたExtPascalSamples3.exeを[ドキュメントルート]ディレクトリ内(extディレクトリと同じ階層)へコピーして実行してみる(embeddedの場合はhttp://[サーバー]/Home)
  • ExtJSのサンプルが表示されればOK

と、とりあえずここまでやって、夜11時から作業し始めて朝が来た。

タグ : ExtJS,ExtPascal,FreePascal,Indy

2009/10/04 07:25:17 | Trackbacks (0) | Comments (0) | Technology

Copyright © 2004-2010 Ana-Kutsu All Rights Reserved.