nDiki : API
API - Application Programming Interface / Application Program Interface
スポンサード リンク
Related term
2004年2月19日 (木)
■ [ Perl ] PDL::PP で C extension を書く

PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。
@ .pd ファイルを書く
とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。
@ Makefile.PLを修正する
Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。
がどうもうまくいかない。 PDL::PP の Makefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 Perl の XS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。
@ 子Makefile.PLを作る
Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。
Foo-Bar-x.xx | +- Makefile.PL | +- lib | | | +- Foo | | | +- Bar.pm | | | +- Bar | | | +- Math.pm | | | +- MathNoEx.pm | | | ... | | +- blib/... | +- MathEx | | | +- Makefile.PL | | | +- MathEx.pd ...
パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。
全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。
@ XSが使えない環境との両対応
XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。
use vars qw($IMPLEMENT_CLASS $AUTOLOAD);
BEGIN {
$IMPLEMENT_CLASS = 'Foo::Bar::MathEx';
eval "use $IMPLEMENT_CLASS";
if ($@) {
warn "Can't load $IMPLEMENT_CLASS: $@";
$IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx';
eval "use $IMPLEMENT_CLASS";
die $@ if $@;
}
}
sub AUTOLOAD {
my $name = $AUTOLOAD;
$name =~ s/.*://;
my $implement = $IMPLEMENT_CLASS . '::' .$name;
no strict "refs";
*{$name} = \&{$implement}; # ここでシンボルテーブル設定
return &{$implement}(@_);
}
最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。
@ ActivePerl 5.6 + Visual C++ 6
使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。
PPM化までここで済ませば、他のPCにも持っていけるはず。
@ さて
これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。
- PAR::Repository でビルド済み Perl モジュールをネット... (2006-12-12)
- ActivePerl で Ming (2005-02-23)
- nmake で毎回 pl2bat されるのを何とかしたい (2004-11-25)
- PAR を ActivePerl 5.6.1 build 638 に (2004-07-20)
- 自前 PPM リポジトリの管理 (2006-07-03)
2004年4月20日 (火)
■ Java Advanced Imaging (JAI) API

素の J2SE 1.4.2 だと BMP とか読めないので JAI 1.1.2 をインストールしておく。
で今晩も、昨日とは別の社内向けミニツールの開発を。 スタッフに「いつぐらいにできますか? 間に合わないなら手でやりますので。」という挑戦状を叩きつけられたので頑張る。
- JAI と Java Web Start (2004-04-21)
- 今日のさえずり - 首なし犬 (2008-03-26)
- [ お仕事 ] サーバ構築開始 (2003-12-09)
- DynaBook SS 3440を再セットアップして里子に (2004-03-06)
- bundle を作成して Perl モジュールをまとめてインストール。 (2004-10-21)
2004年6月5日 (土)
■ Cache::Memcached 1.13 の Perl 5.005_03 対応

WiKicker で使用しているキャッシュシステム Memcached 用の Perl API Cache::Memcached が新しくなっていたので、入れ換え。
1月に入れた時と同様、Perl 5.005_03 ではそのまま動かないので一部を修正。 前回はCVSスナップショット(Memcached.pm revision 1.8)に対する修正だったので手元で修正しただけだったが、今回はパッチも作っておく。
修正点は
- our を使わないようにする。
- fields::new を代替コードに。
- IO::Handl::blocking を代替コードに。
- use bytes を使わないようにする。
といったところ(WiKicker で使っているところのみ修正)。
以前は Use of uninitialized value がかなり出ていたのだが、 Cache::Memcached のコード自体が綺麗になったのかこれらも出なくなっていい感じ。
- Cache-Memcached-1.13-5.005_03-20040605.diff
- Cache-Memcached-1.13 ディレクトリのある場所で patch -p0 < パッチ
- [ Perl ] Memcached を使ってみる (2004-01-12)
- 他の Web サイトの情報を URI::Fetch でキャッシュ付き取得 (2005-10-29)
- Cache::Memcached 1.14 の Perl 5.005_03 対応 (2004-07-31)
- 私的10大ニュース2004 [ comp ] (2004-12-31)
- WiKicker の Makefile.PL を Module::Inst... (2006-02-10)
■ Memcached 1.1.11

Perl API (Cache::Memcached)のアップデートのついでに、Memcached 自体もアップデート。
cd /tmp wget http://www.monkey.org/~provos/libevent-0.8.tar.gz tar zxvf libevent-0.8.tar.gz cd libevent-0.8 ./configure make cd .. wget http://www.danga.com/memcached/dist/memcached-1.1.11.tar.gz tar zxvf memcached-1.1.11.tar.gz cd memcached-1.1.11 CFLAGS='-L../libevent-0.8 -I../libevent-0.8' ./configure --prefix=$HOME/local/memcached-1.1.11 make make install
- Cache::Memcached 1.13 の Perl 5.005_03 対応 (2004-06-05)
- [ Perl ] Memcached を使ってみる (2004-01-12)
- 他の Web サイトの情報を URI::Fetch でキャッシュ付き取得 (2005-10-29)
- はてなダイアリーキーワード自動リンクAPI (2004-02-05)
- MAILPIA による Twitter リプライチェック (2008-11-18)
2004年7月23日 (金)
■ Wx::GLCanvas で OpenGL

wxWidgets + wxPerl 上で OpenGL を使うためのモジュール。
一応3D屋に勤務しているし、入れてみる(Debian GNU/Linux に)。 サンプルの動作を確認。
しかし OpenGL の API (と wxWidgets も) についてまだ全く知らないので、何かをするにはまず学習から。
- wxWidgets + wxPerl (2004-07-20)
- wxPerl + ActivePerl 5.6.1 build 638 (2004-07-21)
- 古い Crypto++ は古い GCC で (2006-02-07)
- 私的10大ニュース2004 [ comp ] (2004-12-31)
- Twitter への書き込みを自動的に Skype ムードメッセージに設定する (2008-02-25)
2005年9月8日 (木)
■ Flickr::Upload のために Flickr API 用アプリケーションキーを取得

Flickr::Upload のバージョンを上げたら、Flickr API 用のキーがないとアップロードできなくなってしまったようだ。 Flickr::Upload 1.20 あたりから Flickr::API を使うようになったからかな。 取得しておく。
- Flickr::UploadでLinuxから画像アップロード (2005-04-22)
- Twitter を使い始めて1年 (2008-04-06)
- デジカメ写真管理ソフトウェア digiKam (2006-03-10)
- Flickr Pro Account (2005-05-04)
- VQ1005 の画像をケータイで閲覧 (2008-03-20)
2005年10月29日 (土)
■ 他の Web サイトの情報を URI::Fetch でキャッシュ付き取得

WiKicker や DiKicker でうまく他のサイトの情報を取り込んで利用できるようにしたい。 相手サイト・自サイトともに負荷をかけないように処理するには、うまくキャッシングする必要がある。
キャッシュ機能のあるPerl用HTTPユーザエージェントには
- WWW::Mechanize::Cached
- LWP::UserAgent::WithCache
- URI::Fetch
などがある。
@ WWW::Mechanize::Cached 1.32
WWW::Mechanize::Cached は1度取得したレスポンスを無条件に1日間キャッシュする。 WWW::Mechanize のサブクラスで、便利な機能が利用できるが、キャッシュは適当。
キャッシュは Cache::FileCache決め打ち。
@ LWP::UserAgent::WithCache 0.03
LWP::UserAgentのサブクラス。 Expires、Last-Modified、Etag ヘッダを考慮して処理する。
キャッシュは Cache::FileCache決め打ち。
@ URI::Fetch 0.04
fetch サブルーチンのみを提供するシンプルなモジュール。
キャッシュは Cache 系APIのモジュールを指定する。実際には Cache::Cache 系でもOK。 Last-Modified、Etag を考慮して処理する。
前回のアクセスから一定時間はキャッシュを返すようにする機能があり、RSS や Atom フィードを取得して利用するのに便利。
@ 今回は
URI::Fetch をチョイス。 our を使っているのでそのままでは Perl 5.005_03 では動かないが、use vars に書き換えれば問題なく動く。
- [ Perl ] Memcached を使ってみる (2004-01-12)
- Twitter ステータスを nDiki サイドバーに表示 (2007-11-09)
- Perl CGI プログラムのテストには WWW::Mechanize::... (2006-02-18)
- Cache::Memcached 1.13 の Perl 5.005_03 対応 (2004-06-05)
- さらにサーバ負荷状態悪化。対応に追われる。 (2006-03-04)
2005年11月15日 (火)
■ JAI と ColorModel と SampleModel

BufferedImageオブジェクトをコンストラクタで生成して JAI (1.1.2_01) に渡すと
java.lang.IllegalArgumentException: The specified ColorModel is incompatible with the image SampleModel.
が出て困る。結局(今回の場合) TYPE_INT_ARGB だと駄目で TYPE_3BYTE_BGR だと OK だった。
API仕様書をみてもよくわからん。
- Java Advanced Imaging (JAI) API (2004-04-20)
- MAILPIA による Twitter リプライチェック (2008-11-18)
- 古い Crypto++ は古い GCC で (2006-02-07)
- 今日のさえずり - 昭和通り側に鯛焼き屋あり (2008-09-30)
- JAI と Java Web Start (2004-04-21)
2006年2月7日 (火)
■ 古い Crypto++ は古い GCC で

Crypto++ を使用しているかなり以前に書いた C++ プログラムを動かそうと思ってコンパイルしたら、あっさりエラー。
もともと Crypto++ 4.2 用のコードなので、Debian GNU/Linux sid の libcrypto++-dev (5.2.1c2a-2) では API が変わりすぎていて駄目。
ということで Crypto++ 4.2 のソースを取ってきてビルドしようとしたら、こちらは GCC が新しすぎて駄目 (4.0.2-8)。入れてあった GCC 3.3 でも駄目 (3.4.5-2)。
結局 GCC 2.95 (2.95.4-24) を入れてコンパイルしてようやく通った。
Debian は各バージョンの GCC を共存させてインストールできるので、こういう時は大変助かる。
- Debian Linux kernel 2.6.23 をビルドする。 (2007-12-23)
- [ Debian ] GRUB でソフトウェアRAID1 ブート設定 (2004-01-05)
- Debian GNU/Linux sid 環境を新 HDD へ (2006-07-29)
- sid の CinePaint がプラグイン読み込みでエラー (2006-04-15)
- DBD::Oracle 1.16 を Debian GNU/Linux s... (2005-05-19)
2006年7月23日 (日)
■ JavaScript でのプログラミングやっぱり面倒くさい

JavaScript の勉強がてら「お互いに URL でリンクしている XML ファイルセットの簡易ブラウザ」を書き始める。
この間使い始めた Prototype を使って多少楽ではあるものの、それでもやっぱり面倒くさい。 コードを修正するたびに Web ブラウザで動作確認をするという流れが問題だな。
単体テストコードを書いて SpiderMonkey でテストできるかなと思ったが、document オブジェクトとかないし。
やはり JsUnit でテストを書くのが一番かな。
それと JavaScript (Web ブラウザ)の DOM API の情報がまとまっているものないかな。 Perl の XML::DOM の気分で書くといろいろ名前が違っていてうまく動かず、切ない。
- 早速 reStructuredText から LaTeX へのコンバータを書く (2005-11-24)
- Google Analytics から TSV エクスポートしてキーワード... (2007-11-18)
- SpiderMonkey の素のインタプリタでは CGI プログラムには役立たず (2006-12-11)
- MAILPIA による Twitter リプライチェック (2008-11-18)
- Twitter ステータスを nDiki サイドバーに表示 (2007-11-09)
2007年4月7日 (土)
■ 携帯電話(iモード)から Twitter を更新する

Twitter をいろいろ遊んでみて「やはり携帯電話から更新できないと」と思えてきた。
携帯電話からメールを送る事で Twitter にアップデートをかけてくれるゲートウェイを設置できれば一番いいのだけれど、そのようなメールアドレスを作る場所が今はない(さすがに会社のサーバはまずい)。
ということでiモードから更新をかけられるように短い CGI プログラムを書くことにした。 CPAN には Net::Twitter という Perl モジュールがあるのだが、JSON::Any (と JSON::XS / JSON / JSON::DWIW / JSON::Syck のどれか)が必要で、ちょっと大げさなので今回は使用は見送り。 普通に CGI.pm と LWP::UserAgent で書いた。
#!/usr/bin/perl -w
use 5.005_03;
use strict;
use CGI qw(-no_xhtml);
use Jcode;
use LWP::UserAgent;
my $query = CGI->new;
my $user_name = $query->param('u');
my $password = $query->param('p');
my $status = $query->param('s');
$user_name = '' unless defined $user_name;
$password = '' unless defined $password;
$status = '' unless defined $status;
my $message = '';
if ($user_name ne '' && $password ne '' && $status ne '') {
my $ua = LWP::UserAgent->new;
Jcode::convert(\$status, 'utf8', 'sjis');
$ua->credentials('twitter.com:80', 'Twitter API', $user_name, $password);
my $request = $ua->post('http://twitter.com/statuses/update.json',
{status => $status . ' '});
if ($request->is_success) {
$message = '<p>OK</p>';
}
}
print $query->header(-type => 'text/html', -charset => '');
print '<html><head><title>Twitter update</title></title><body>';
print '<form method="post" action="twitter">';
print 'ユーザ名:', $query->textfield('u'), '<br>';
print 'パスワード:', $query->password_field('p'), '<br>';
print 'ステータス:', $query->textfield('s'), '<br>';
print '<input type="submit">';
print '</form>';
print $message;
print '</body></html>';
とりあえずこれで、iモードから送信できることを確認。 パスワードの入力が面倒だけれども、サーバ側に書いておくのも嫌なので毎回送ることにした。FOMA 端末側には定型文として保存しておく以外にいい手はないのかな。
最初うまく送れなくてなんだろうと思ったが、あきやん氏の「Twitterで日本語を入力する方法 (akiyan.com)」の記事にある
- 全て全角文字で入力して、最後に半角スペースをいれる
- 半角全角を混在させるときは、半角文字と全角文字の間にスペースをいれる
といった日本語を入力する際の注意点がらみだったようである。 とりあえず CGI プログラムの方で最後に必ずいわゆる半角空白を追加するようにしておいた。
文字数チェックとか Twitter API の返り値チェックとか、改善すべきところはいろいろあるけれど、自分用にはまずこれでいいかな。
気が向いた時に外出先から更新かけます。
- 携帯電話からの Twitter 投稿に tmitter を使ってみることにした (2007-07-26)
- MAILPIA による Twitter リプライチェック (2008-11-18)
- ケータイ用にプライベート Wiki を設置 (2008-01-07)
- Twitter を使い始めて1年 (2008-04-06)
- 半分は Twitter のためにパケ・ホーダイを契約 (2007-08-01)
スポンサード リンク
■よく検索されるキーワード
perl(62) torrent(54) linux(48) 提案書(47) windows(43) 書き方(41) 使い方(29) アジェンダ(26) x31(25) 充電式カイロ(25) cvs(22) インストール(20) サンプル(20) thinkpad(19) アジェンダとは(19) f-01a(18) wiki(17) c#(16) 感想(16) カイロ(16) usb(16) java(16) 秋葉原(15) debian(15) ヨドバシカメラ(15) subversion(15) 壁紙(15) 作り方(15) 静電気(14) apache(14) グッズ(14) デロンギ(13) フリー(13) sh-01a(13) ganttproject(13) 修理(13) ssh(12) svn(12) ヨドバシ(12) truecrypt(12) ダイソー(11) 手帳(11) activeperl(11) ubuntu(11) ほぼ日手帳(11) firefox(10) mew(10) mp980(10) ドラマ(10) 日本語(10) n-01a(10) google(10) tc-1(10) 評判(10) ツール(10) djunit(9) cgi(9) 動画(9) mp3(9) オイルヒーター(9) docomo(9) rcs(9) 除去(9) centos(9) メモリ(9) エネループ(9) 設定(9) p-01a(9) tortoisesvn(9) 無印(8) ケース(8) 口コミ(8) ミノルタ(8) メール(8) インストーラ(8) 会議(8) xampp(8) 加湿器(8) af(7) 値段(7)■注目キーワード
購入 買った 発売日 フリー 無料 価格 値段 作り方 選び方 使い方 方法 設定 サンプル ダウンロード 限定 在庫 予約 穴場 比較 検証 レビュー 感想 評価 評判 使用感 使ってみた 口コミ 噂 最新 MP3 動画 意味 お薦め お勧め おすすめ 便利 Blog ブログ mixi 修理 デザインProcess Time: 15.108299s / load averages: 0.09, 0.34, 0.50
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)




スポンサード リンク