C++11用のクラスひな形生成スクリプトを作ってみた
2014 年 8 月 20 日 水曜日C++ で開発する上で、クラスを一つ一つ実装するたびに毎回同じようなことを書かされるのは冗長なので、だいたいこんな感じになるよねという範囲のひな形を生成するスクリプトを perl で記述してみました。
Getopt::Compact モジュールを使用しています。ご利用の際にはそちらも合わせてインストールしてあげてください。
(さらに…)
C++ で開発する上で、クラスを一つ一つ実装するたびに毎回同じようなことを書かされるのは冗長なので、だいたいこんな感じになるよねという範囲のひな形を生成するスクリプトを perl で記述してみました。
Getopt::Compact モジュールを使用しています。ご利用の際にはそちらも合わせてインストールしてあげてください。
(さらに…)
Perl で、
my @cap = $uri{$mkey} =~ /$ex_item->{match}{$mkey}{pattern}/ or next EX_MATCH_LOOP; @vars{@{$ex_item->{match}{$mkey}{vars}}} = @cap if exists $ex_item->{match}{$mkey}{vars} && ref $ex_item->{match}{$mkey}{vars} eq 'ARRAY';
なんてコードを書いていて (何をやろうとしているのかは想像にお任せします… 別にプロプライエタリなコードじゃないし、いちいち擬似コード的に書き直すのも面倒なのでそのまま持って来ちゃいましたw)、ふと、ここでやっている正規表現のパターンにキャプチャが含まれていなかった場合、マッチするのに or
の後に処理が流れてしまうことはないのかと疑問に思いました。
(さらに…)
ブログがあまりにもほったらかしすぎなので、今後は極力些細な内容でも積極的にエントリを上げていこうと思います。
Perl での開発で、自分で作っているモジュールのファイルと同じ場所にあるファイルを設定ファイルとして読み込みたい場合があります。その設定ファイルも Perl モジュールとして書いてしまうのはやり方としては悪くないのですが、単なる定数値の羅列としてではなく、 YAML などで書きたくなるような若干複雑な構造のファイルもあるので、その場合、ファイルの場所を特定する方法が必要になります。
(さらに…)
あけましておめでとうございます。またしてもブログがおざなりになってしまいました… orz
直接お金になる仕事ではないのですが、ここしばらく、某所の BBS を開発するため、 Perl をいじっております。正直、 .NET や JavaScript 、ケータイアプリの開発なんてことばかりやっておりますと、たまにいじる Perl が楽しくて楽しくて、ついついこっちばかりやってしまう、という日々がしばらく続いております。いかんですな。
で、こちらの開発がとりあえずキリの良いところまで進んだので、一旦お蔵入りにしようと思うのですが (といっても年単位で寝かせるわけではないですが)、その前にこれに関連する技術的なメモをしたためておこうかと思うのであります。
作っているのは、さくらの共有レンタルサーバーサービス上で動作する CGI なのですが、レンタルサーバの性質上、 CPAN から最新のモジュールを引っ張ってくることが出来るので、割とモダンチックなスタイルで開発できるのが強みだったりします。
ただ、レンタルサーバ上で動作確認する場合、 500 エラーになってもエラーログをすぐには参照できないので (さくらにメールで問い合わせすることは可能らしいですが…)、弊社サーバー上にも設置し、動作確認するようにしました。
弊社サーバーはさくらの VPS を利用しており、 CentOS5 で動いています。基本的にはソフトウェアの導入は yum から行っているのですが、その場合、 DBD::mysql を始めとした多くの CPAN モジュールが、かなり古いバージョンで導入されることになります。特に、 DBD::mysql は 3.0007 と極めて古く、Unicode を扱うのに必要不可欠な接続時オプション mysql_enable_utf8 が使えないといった弊害がありました。他にも、 DateTime がタイムゾーンを理解できないなど、いろいろと弊害があったため、 CPAN から最新版をインストールしようかと試みたのですが、そのままではほとんどのモジュールについてコンパイルが通らないなど、cpan コマンドからではインストールが出来ませんでした。
(さらに…)
Windows 環境で Boost ライブラリをセットアップしてみました。明日は Linux 環境でもセットアップを行い、技術メモとしてまとめる予定です。
で、せっかくなので、試しに簡単なサンプルを作って動作確認をしてみました。
#include <iostream> #include <fstream> #include <string> #include <boost/regex.hpp> using namespace std; using namespace boost; void escapeHtml(const string &src, string &modified); int main(int argc, char* argv[]) { for (int i = 1; i < argc; i++) { ifstream fin(argv[i]); if (fin.bad() || fin.fail()) { cerr << argv[0] << ": Can't open " << argv[i] << "." << endl; continue; } while (!fin.eof()) { string line; getline(fin, line); string modified; escapeHtml(line, modified); cout << modified << endl; } } return 0; } void escapeHtml(const string &src, string &modified) { modified.clear(); sregex_iterator last_it; for (sregex_iterator it(src.begin(), src.end(), regex("[<>&\"]")); it != sregex_iterator(); it++) { modified += it->prefix().str(); string sub = (*it)[0].str(); switch (sub[0]) { case '<': modified += "<"; break; case '>': modified += ">"; break; case '&': modified += "&"; break; case '"': modified += """; break; default: assert(0); break; } last_it = it; } modified += last_it == sregex_iterator() ? src : last_it->suffix().str(); }
Boost.Regex の regex_iterator を用いたテストです。よーするに、コマンドに指定したファイルの HTML エスケープ処理を施してコンソールに書き出すプログラムです。
上記のプログラムを test.cpp などのファイル名で保存し、そのまま Visual Studio 2008 コマンドプロンプト上で
cl test.cpp
とやってみましたが、これだけではコンパイルできませんでした。どうやら、 Visual Studio のオプションダイアログでヘッダーファイルやライブラリの参照先ディレクトリを設定しても、その設定が参照されるのは Visual Studio の IDE からビルドを実行した場合のみのようです。あるいは、環境変数 INCLUDE や LIB を設定してあげればこれでコンパイルできるのかも知れません。その辺はまた追々調べてみますが、最終的には .configure
に --boost-prefix
といったようなオプションを設ける、といった形の対応になるのではないかとも思います。
ちなみに、これと同等の (しかもより確実に動作する) プログラムを Perl で記述すると、以下の通りになります (この書き方はしかし Unix 風環境限定ですが)。
#!/usr/bin/perl -p s/[<>&"]/'&'.{qw(< lt > gt & amp " quot)}->{$&}.';'/eg;
うあー、やっぱりスクリプト言語は便利だなー (汗。
egtra 様、ご指摘感謝です。仰る通り、 string::getline()
を使った方がスマートなので、その通りに修正させて頂きました。
自社開発で作ろうとしていた物が実は mod_perl に対応した Web アプリなのですが、そういえば mod_perl ってまともに弄ったこと無かったなぁとか思ったので、風邪も引いて頭も回らないことだし少し脱線するかとばかりに遊んでみました。
世間一般においてはちっともはやらない mod_perl 。かろうじて拾う話題もせいぜい Apache::Registry を用いた既存 CGI の高速化とかその程度の話で、本格的に Perl で Apache モジュールを作ろうみたいな話になると本を買うか英語で情報を探すしかなかったりするのが現状のようです (あるいはおいらの探し方が悪いのかも知れませんが…)。参考にしたのは mod_perl の公式サイトにあるドキュメントでした。
これ全体をぼえ~っと眺めてみても何から手をつければいいのかよくわからないのですが、この辺を見てみるとサンプルを見つけることができたので、これを参考に作ってみることにします。