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

Blog

FreePascal での httpd の優先順位

FreePascalでApacheモジュールを開発するときに利用するユニットにhttpdがあります。このhttpdユニットはApacheのバージョンに合わせて、1.3用・2.0用・2.2用が用意されています。

普通にhttpdをusesするとファイル名の順番から1.3用が利用されてしまいます。いまどきは2.2以上なので、2.2用を使ってコンパイルしなければなりません。

今まではコンパイラオプションのユニット検索パスで、2.2用が入っている/units/$FPCTARGET/httpd22のディレクトリを指定することで回避していました。

が、先ほどfpc.cfgを見ていたらhttpdの振り分けが記述してありまして...。シンボルとして「FPCAPACHE_2_2」を設定してあげれば2.2用を読みに行ってくれるようです。Lazarusなら、プロジェクト>コンパイラオプション>その他タブ>カスタムオプションで「-dFPCAPACHE_2_2」を追記しておけばオッケーです。

まぁ自分でパスを追加しても問題はおこらないのですが、シンボル定義して勝手に切り替えてもらったほうがエレガントだとおもうので。ってゆーか、fpc.cfgとか読まないし、ドキュメント皆無みたいなもんだし、マイナーな言語は大変ですね(笑)

タグ : Apache,FreePascal,モジュール

2010/12/16 00:22:37 | Trackbacks (0) | Comments (0) | Technology

FreePascalでクロスコンパイル (その後)

はい、またやってました、クロスコンパイル。ってかこれ今やるべきことじゃないんだけど、FreePascalのメーリングリストで同じように悩みを持っている人がいて、それ見たらなんかやってた(笑)。

過去の戦歴

今回は64bitのLinuxがターゲット。過去の失敗経験をもとにCygwinBinutilsのコンパイルからやってみたら、なんとかうまく行ったので手順を書き記しておく。

binutilsをつくる

  1. Cygwin入っていなければインストールする。インストール方法はネット上にいっぱいあるのでググッてね。
  2. Binutilsのコンパイルに必要と思われるCygwinのパッケージは、「make」「gcc」「cpp」「libiconv」かな。他にもあるような気もするけれど、覚えていないのでエラーになったら適宜追加する感じで。
  3. Cygwinのコンソール立ち上げて、コンパイルで使うディレクトリへ移動
    mkdir -p /usr/local/src/
    cd /usr/local/src/
    
  4. Binutilsのソースを拝借してきて、展開、移動
    wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.gz
    tar xvzf binutils-2.20.1.tar.gz
    cd binutils-2.20.1
    
  5. x86_64-linuxをターゲットにしてconfigureする
    ./configure --target=x86_64-linux
    
  6. お決まりのコマンドを実行する。ま、これが大体エラーになるから大変なんだけどね。
    make clean
    make all
    make install
    
  7. うまくコンパイルできれば「[Cygwin Dir]\usr\local\bin」においしそうなファイルが!

エラーが起こるとすればconfigureとmakeなので、エラー内容をよく見て必要なパッケージやライブラリを入れていけばいずれはコンパイルできるようになると思われる。

Free Pascalコンパイラを64bit用にコンパイル

コンパイラをコンパイルするんです。(じゃぁそのコンパイラは何でコンパイルされたんでしょう。コンパイラ?じゃぁそのコンパイラは...なんてね)

  1. 「[Cygwin Dir]\usr\local\bin」に生成された下記のファイルを「[Lazarus Dir]\fpc\[FPC Ver]\bin\i386-win32」へコピー
    • x86_64-linux-ar.exe
    • x86_64-linux-as.exe
    • x86_64-linux-ld.exe
    • x86_64-linux-objdump.exe
    • x86_64-linux-strip.exe
  2. 「[Lazarus Dir]\fpc\[FPC Ver]\bin\i386-win32」にパスを通す
  3. FPCのリポジトリからソースコードをダウンロードして適当に展開
  4. コンソールを起動し、展開したフォルダに入る
  5. コンパイルしてインストール
    make clean
    make OS_TARGET=linux CPU_TARGET=x86_64 all
    make OS_TARGET=linux CPU_TARGET=x86_64 \
    	INSTALL_PREFIX=[Lazarus Dir]\fpc\[FPC Ver] install
    
  6. 64bitコンパイラがうまく作成できれば、LazarusのコンパイラオプションからOSとCPUを64bit Linuxにしてコンパイルできるはず

これでWindowsで作成したHello Worldが64bit CentOSで動くようになった! 今回のステップを踏めば別のプラットフォーム向けもできそうだね。

あ、ちなみにLCL(Lazarus Component Library)のクロスコンパイルは試してません。とりあえず今のところ使ってないから、なくていっかな。過去の経験より手をつけるとはまるので。

タグ : 64bit,Binutils,Cygwin,FreePascal,Linux

2010/11/04 06:20:21 | Trackbacks (0) | Comments (0) | Technology

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

現在進行中の開発案件

いま、こんな感じです。

画面

完成したら見せてもいいのだけれど、まだ見せれない部分もあるので。ぼかしつつ...。

やっとExtJSにも慣れてきた感じ。ExtJSのドキュメント見たり、ExtPascalのヘルプ見たりとあっちこっちを見ながら実装するという結構大変な作業だわ。サーバー側をPHPにしておけばよかったと何度思ったことか(笑)。

しかーし、その代わりレスポンスはめっちゃ早い!まだローカルでの接続しかしていないけれど、データベース接続してデータ読みだしたりしながらインターフェースのJavaScriptを構築してブラウザに送出するまで20msくらい(Core2 Duo 2.66Ghz / Memory 4GB / Windows Vista)。ext-all.jsを読みだすのでも10msくらいかかっているから、それの倍ちょっとで処理できている感じかな。

まだ若干マスターしきれていないのがDataStoreのあたりかな。ExtPascalでラッピングされているので、DataStoreの非同期通信をどう受け取ればいいのか調査中。

タグ : ExtJS,ExtPascal

2009/10/21 21:53:34 | Trackbacks (0) | Comments (0) | Technology

ExtPascalでオブジェクトの属性を変更するとき

ずっと2週間くらい悩まされてきたことがやっと分かりましたよ。

ExtPascal内で動的にオブジェクトの属性を設定するときは、プロパティを参照するのではなく、メソッドで設定を行わなければならない。例えばボタンの有効状態を無効にしたければ、Button.Disabled := Trueではなく、Button.disable()を呼ばなければならないということです。

まぁよく考えてみれば、純粋にJavaScriptでExtJSを使うときもメソッド経由にしないと状態を設定することができないから当然と言えば当然なんです。Delphiのようにプロパティが暗黙にセッター・ゲッター関数になったりしていないから、動的に属性を変更するときはメソッドを呼ばなければいけないんですね。

基本的にExtPascalでは生成したオブジェクトのJavaScript内での名前しか覚えていないようです。そのためExtPascal内でpublicな変数でも、直接属性を設定するとアクセスエラーになるようです。

それにしてもコードでコンポーネントを配置していくのは面倒だなぁ。DelphiのフォームビルダがどれだけUIを設計する作業を簡便化しているかよく実感できる。

タグ : Delphi,ExtJS,ExtPascal,JavaScript

2009/10/20 20:48:24 | Trackbacks (0) | Comments (0) | Technology

ExtJS 3.0のAPIドキュメント日本語版が公開されたらしい

今ハマり中のExtJS3.0の日本語APIドキュメントが公開されたようです。いやぁ本当助かります。

公開したのはxenophyという会社で、xFrameworkPXというPHPのフレームワークを開発した会社でもあります。この会社のしゃちょーさんは、僕がPHPの高速化について調べているときにたまたま見つけたブログの執筆者で、PHPやDelphiなど似たような言語を使っているというだけで、(勝手に)ちょっと注目している方です。

ということで引き続きExtPascalがんばって使い倒しますか。

タグ : API,ExtJS,ExtPascal

2009/10/17 23:55:51 | Trackbacks (0) | Comments (2) | 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

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

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

  • Top
  • Software
  • Blog
  • Laboratory
  • Profile
Search
Feeds of Blog
Archives

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