トップ(最新) | <前

nDiki : PAR

PAR - Perl Archive Toolkit

Perl プログラムから実行形式 (Windows であれば exe 形式)ファイルを作成することのできる Perl モジュール

  • 実行形式を作成する機能
  • PAR ファイルとしてスクリプト、モジュールをアーカイブする機能
  • ネットワーク経由で PAR ファイルを取得する機能

などの機能がある。

PAR 0.970 から PARPAR-Packer に分離した。

簡単な使い方

hello.pl から hello.exe を作成する。

 pp -o hello.exe hello.pl

Tips

自分自身がPARでアーカイブしたものかどうかを調べる。

もし明示的に PAR モジュールを use していない場合、 $INC{'PAR.pm'} が真かどうかをチェックすることで判定できる。 真の場合はPARでアーカイブされたものであるので、PAR::read_file 等を実行してアーカイブの中のファイルにアクセスすることができる。

pp で作成した実行可能ファイルライセンスについて

The Artistic License の下にあるライブラリを使用しているだけであれば、第8条に従い任意のライセンスを設定できる。

(pp のマニュアルより)

関連情報

スポンサード リンク

Related term

2005年3月7日 (月)

UPX実行可能ファイルを小さく このエントリーを含むはてなブックマーク

PARのチュートリアルで UPX (the Ultimate Packer for eXecutables)というツールが紹介されていたので使ってみる。 実行可能なファイルを、実行可能のまま圧縮するというもの。 MS-DOSの時代の伝説のプログラム DIET を思い出す。

PAR で実行可能形式に変換したPerlスクリプトを UPX 1.25 で圧縮したところサイズが小さくなった。 しかし PAR で作った実行可能バイナリは実行時に自身を展開するため、圧縮によってフォーマットが変わってしまっていることを検知して警告が出てしまう。 ちょっとよろしくない。

それにNSISインストーラを作ってしまえばかなり高圧縮がかかるし、そういう意味では出番がないか。

いや USB メモリにいろいろ実行可能ファイルを詰め込みたい時にはいいかもしれない。

スポンサード リンク


[ 3月7日全て ]

2005年3月8日 (火)

「依存関係検査のしにくいモジュール」に依存するスクリプトをPARで実行形式化する このエントリーを含むはてなブックマーク

PAR を使うとPerlスクリプトを単独の実行可能形式ファイルに変換することができる。 この際、自動的に依存するモジュールも探し出して追加してくれるのだが、eval の中で use するものや lib 以下に配置された通常のファイル等は自分で追加する必要がある (pp の -a, -A, -M オプション等で)。

開発しているモジュールに含まれるスクリプトをexe化するルールは、Makefile.PL でいろいろ処理をしてこれらを指定するようにしておけば比較的簡単にビルドできる。

しかしそれが今開発対象となっているモジュール/スクリプトではなく、その依存モジュールがそのようになっていると面倒くさい。 ということで依存モジュール側で必要なモジュール・ファイル一式を PAR ファイル化し、それを作業中のモジュール/スクリプトで取り込むようにしてみた。

PAR の pp コマンドは(1つのPAR ファイルから実行形式ファイルを作る時以外)直接 par ファイルを取り込む事ができないようなので、展開してあらためて追加する必要があるのでちょっと面倒。

@ 依存モジュールをまとめた par を作る

例えばそのモジュールに myscript.pl が含まれており、これをexe化するにはいくつか手動で追加するファイルを指定する必要があるとする。

またそれらのファイルは、現在作ろうとしているスクリプトをexe化する際にも必要だとする。

 pp -p -o all.par \
    -I blib/lib -I blib/arch \
    -A ... \
    -M ... \
    blib/script/myscript.pl

myscript.pl に必要なモジュールを含んだ PAR ファイル all.par ができる。

ちなみに parl -p でもモジュールからPAR ファイル化でき blib 以下をごっそりアーカイブできるのだが、そのモジュールが依存しているモジュールを含ませることができないので、今回の用途には×。

@ PAR ファイルを展開する

all.par を展開する。 ここでは c:\tmp\all 以下に展開するものとする。

@ 作成したいスクリプトのPAR ファイルをいったん作る

スクリプトのあるモジュールのディレクトリに移動し、make。 その後

 pp -p -o newscript.par \
    -I blib/lib -I blib/arch -I c:\tmp\all\lib \
    -a c:\tmp\all\lib;lib \
    blib/script/newscript.pl

newscript.par が出来上がる。この中には -a オプションの指定と、newscript.pl の依存関係検査による抽出で c:\tmp\all\lib 以下のファイルが2回含まれているものがある(大抵)。 無駄なので除去する。

(面倒ならば重複するファイルを含んだままではあるが、ここで -p オプションを指定しないで直接 exe を作る事も可能である)

@ 除去するスクリプト(例)

 #!/usr/bin/perl -w
 use strict;
 use Archive::Zip qw(:ERROR_CODES);
 my $zip_name = shift || die 'must provide a zip name';
 my $zip = Archive::Zip->new;
 $zip->read($zip_name) == AZ_OK || die "Can't read $zip_name:\n";

 my %names;
 for my $member ($zip->members) {
   my $file_name = $member->fileName;
   if (exists $names{$file_name}) {
     print "Remove $file_name ...";
     if (defined $zip->removeMember($member)) {
       print "OK.\n";
     }
     else {
       print "NG.\n";
     }
   }
   $names{$file_name}++;
 }

 exit($zip->overwrite);

@ PAR ファイルを実行可能形式ファイルに変換する

 pp -o newscript.exe newscript.par

[ 3月8日全て ]

2005年3月15日 (火)

PAR で作った実行可能ファイルを殺せない このエントリーを含むはてなブックマーク

PARWindows実行可能ファイル(exe)にしたプログラムを、別のプログラムから起動・終了させるプログラムを書いていたところ困った事態。

今まで気がつかなかったのだが、PARで作った実行可能ファイルを実行するとプロセスが起動される。片方がブートストラップで、もう一方がPerlインタプリタのようだ。

プログラムから起動した時に取得できるのはブートストラップの pid で、これを TerminateProcess してもPerlインタプリタの方は以前として動き続ける。 止める方法がわからん。

自爆機能とかつけて対処するしかないか。

@ --pidfile

結局 --pidfile オプションをつけて、pid をファイルに書き出せるようにした。 $$ の値はPerlインタプリタ側のプロセスIDで、こちらを kill するとまとめて落ちてくれる。


[ 3月15日全て ]

2005年3月16日 (水)

wxPerl + PAR ではDLL追加指定の必要あり このエントリーを含むはてなブックマーク

メモPAR (0.87) では DLLが使用するDLLまでは自動的に検出できないので、明示的に指定する必要あり。

wxPerl だと Wx.dll 以外に wxmsw24.dll が必要になるので、pp の -l オプションで指定しなければならない。 この際見つからなくてもエラーにならないようだ。 見つからない場合はフルパスで指定しなければならない。

 $Config{sitelib} . "\\auto\\Wx\\wxmsw24.dll"; # with use Config;

あたりにあるはず。


[ 3月16日全て ]

2005年3月31日 (木)

Wineを入れてみる このエントリーを含むはてなブックマーク

Linux 上で Win32 用の ActivePerl を動かして、PPM パッケージの作成や PAR による実行可能ファイルの作成をできるようにしたい。

調べたところ Wine 上でも ActivePerl が動くらしい。 さっそく Debian GNU/Linuxsid 環境にインストールしてみる。

debパッケージは以下をインストール

  • wine
  • wine-utils
  • winesetuptk
  • wine-doc
  • msttcorefonts

winesetup を実行して ~/.wine 以下を作成。 winesetup が古いのか wine を実行すると

Please use the registry key HKEY_CURRENT_CONFIG\Software\Fonts\LogPixels to set the screen resolution and remove the "Resolution" entry in the config file

という警告がでるので、[fonts] の中の

 "Resolution" = "96"

をコメントアウト。

次に msi 形式になっている ActivePerl インストーラを動かすために、Windows Installerインストールする。

失敗。設定がうまくいっていないのか、何かが足りないのか。

usr/share/wine/wineinstall で ~/.wine 以下を作っても駄目。

要調査。


[ 3月31日全て ]

2006年2月9日 (木)

ActivePerlPAR PPM パッケージは合わせる必要あり このエントリーを含むはてなブックマーク

以前 ActivePerlインストールした PARWindows 実行形式ファイルに変換しておいたプログラムが実は動かなかった事に気がつく。

プログラム名 - エントリポイントが見つかりません。

プロシージャ エントリ ポイント PL_memory_wrap がダイナミックリンク ライブラリ perl58.dll から見つかりませんでした。

おや。

どうやら ActivePerl 5.8.7 Build 813 上で、 ActivePerl 5.8.6 Build 811PPM パッケージ化しておいた PAR を使ったのがまずかったようだ。

ActivePerl は 5.8 系の間ではバイナリ互換だったと思うが(5.6系とは駄目)、PAR に限ってはそうはいかないらしい。まぁ、考えてみればそうなってもおかしくない。

ということで PAR PPM パッケージを作り直してインストールし、こちらであらためて exe ファイルを作成。 うまく動くようになったことを確認。


[ 2月9日全て ]

2006年6月16日 (金)

PAR に関する ActivePerlライセンス このエントリーを含むはてなブックマーク

確認したら ActivePerl Community License v2.1 (ActivePerl 5.8.8.817 はこれ) には PAR (や PerlAppPerl2Exe など) で ActivePerl に含まれているファイルをラッピングしてアプリケーションに含めることができると書いてあった (一部条件あり)。

今まで見落していたよ。

ActivePerl」 + 「The Artistic License 下な CPAN にあるモジュール」 + 「自作コード」を PAR でバイナリ化して配布しても OK ということが分ってちょっとすっきり。


[ 6月16日全て ]

2006年7月3日 (月)

自前 PPM リポジトリの管理 このエントリーを含むはてなブックマーク

Windows Perl アプリケーション用に PPM リポジトリを久しぶりに整理。

自分が使用する PPM パッケージは以下の理由から、以前より基本的に自前でビルド/保存し PPM リポジトリをローカルに作成するようにしている。

  1. 後でオフラインインストールできるようにする。
  2. 「公開リポジトリが無くなった」あるいは「公開リポジトリに欲しいパッケージが無くなった」時に困らないようにする。
  3. 動作確認された組み合わせでの PPM パッケージセットを作成・保持できるようにする。
  4. ライセンス的にクリアなものだけを含むリポジトリを用意する。 (芋蔓式インストールで、ライセンス的にクリアでないパッケージが入ってしまうのを防ぐ)。

@ 手元では以下のように管理

 PPM
  |-- <category>
  |   `-- 8xx
  |       |-- <projects A> [ 公開 / export ]
  |       |   |-- module1.ppd -> (A)
  |       |   |-- module1.tar.gz -> (B)
  |       |   `-- ...
  |       `-- ...
  `-- pool
      |-- module1-x.yy
      |   |-- module1.x.yy.tar.gz
      |   |-- some documents...
      |   `-- build817
      |       |-- module1.ppd (A)
      |       `-- module1.tar.gz (B)
      `-- ...
@ pool
  • pool ディレクトリに「[モジュール]-[バージョン]」ディレクトリを作成する。同じバージョンでも、異なるバージョンは両方とも別々にキープしておく。
  • その下にソース tarball を置く。
  • ライセンス情報ファイルなども置く (touch Perl-License 等空のファイルを作成しておく)
  • PPM パッケージPPM::Make で作成し、その時に使用した ActivePerlビルド番号別にサブディレクトリを作って .tar.gz と .ppd を置く。
@ リポジトリ
  • ActivePerlビルド番号別にリポジトリを作成する。基本的には 6xx 系、8xx 系それぞれの中ではバイナリ互換性がある (PAR などは、ビルド番号に1対1でしか互換性がない)。
  • 必要に応じてカテゴリ別サブディレクトリを用意 (アクセス制限の都合などにより)
  • 必要に応じてプロジェクト毎にサブディレクトリを用意 (プロジェクト毎にパッケージセットを作るため)
  • リポジトリディレクトリからは pool 内の .ppd、.tar.gz へシンボリックリンクを張る。欲しいモジュールのバージョン、ビルド番号を選んでリンクする。
@ 公開
  • SambaApache などで、PPM ディレクトリ全部あるいは特定のリポジトリ部分を公開する。
  • 必要なら export して別サーバに置く。rsync や cp の -L オプションでシンボリックリンクを実ファイルに置き換えてアーカイブを作成する。

[ 7月3日全て ]

2006年12月12日 (火)

PAR::Repositoryビルド済み Perl モジュールをネットワーク配信 このエントリーを含むはてなブックマーク

@ 実行可能ファイル作成としての PAR

PAR といえば Perl スクリプトを実行可能ファイル(Windows なら EXE 形式ファイル)に変換するモジュールとして有名である。

ちなみに実行可能ファイルを作成する部分はは PAR 0.97 より PAR-Packer パッケージに分けられ、PAR 自体はインストールしやすい pure Perl なパッケージになっている。

@ PAR モジュールアーカイブからのローダとしての PAR

PAR が提供するもう一つの(こちらが本来はメイン?)機能は、プログラムの実行時に必要な Perl モジュールPAR ファイルと呼ばれる Perl モジュールアーカイブファイルからロードする機能である。 XS モジュールなどもコンパイルすることができるどこかの環境で1度ビルドして PAR ファイルにしておけば、同じアーキテクチャのホスト上でそのまま利用することができる。

@ PAR リポジトリ

ロードしたい PAR ファイルはファイルパスだけではなく URL でも指定することができ、必要な時にオンデマンドでフェッチさせることができる。 これを使えば Perl プログラムの集中管理可能だ。

PAR 0.951 からは PAR リポジトリというコンセプトが追加され、パッケージ毎に作った PAR ファイルをサーバ上(あるいはローカル)のリポジトリに蓄積してオンデマンドでロードできるようになった。

個別に PAR ファイルを指定する従来の方式に比べてかなり便利そうである。 ということで試用してみた。

まずは

あたりをインストールし準備 OK。

@ 1. PAR リポジトリを作成する

最初に PAR-Repository に含まれている parrepo で。

 parrepo create -r /tmp/PAR

PAR リポジトリファイルの中にはデータベースファイルが作成されるが、これは DBM::Deep というアーキテクチャ非依存のものを使っているので、Linux でも Windows でもどちらからでもアクセス可能である (つまり Linux 上でリポジトリをメンテできるということだ)。

@ 2. Perl パッケージを PAR ファイル化する

次に必要な PAR ファイルを作成する。 作成したいパッケージを展開してビルドし、blib ができている状態で PAR::Dist を使ってパッケージ化する。

 perl Makefile.PL
 make
 make test
 perl -MPAR::Dist -e blib_to_par

例えば ActivePerl*1 上で WWW-Mechanize-1.20 を PAR ファイル化すると

 WWW-Mechanize-1.20-MSWin32-x86-multi-thread-5.8.8.par

というファイルが作成される。

普段から ActivePerl で必要なライブラリは基本的に自前で PPM パッケージ化して、動作確認した上で PPM リポジトリに蓄積するようにしているので、合わせて次の手順でパッケージを作ることになる。

 perl Makefile.PL
 nmake
 nmake test
 perl -MPAR::Dist -e blib_to_par
 make_ppm

*1ここでは Windows 上の

@ 3. PAR リポジトリPAR ファイルを登録する

PAR ファイルができたら parrepo でリポジトリに登録する。

 parrepo inject -r /tmp/PAR -f xxx.par

@ 4. PAR リポジトリ上のライブラリを使用してみる

例えば先ほどの WWW::Mechanize がリポジトリに登録されている状態で

 #!/usr/bin/perl
 use PAR { repository => 'file:///tmp/PAR/' };
 use WWW::Mechanize;
 my $mech = WWW::Mechanize->new;
 $mech->get('http://www.example.com');
 print $mech->content;

というスクリプトを書いて実行すると、PAR リポジトリから WWW::Mechanize がロードされて正しく実行される。

ここでリポジトリを Web サーバアップロードして、repository のところに URL を指定するようにすることもできる。 例えばリポジトリを http://www.example.com/PAR/ に配置したとすると

 #!/usr/bin/perl
 use PAR { repository => 'http://www.example.com/PAR/' };
 use WWW::Mechanize;
 my $mech = WWW::Mechanize->new;
 $mech->get('http://www.example.com');
 print $mech->content;

と書き換えることで、インストールしていない WWW::Mechanize を使用できるようになる。

@ Perl プログラムを実行形式化する

先ほどの Perl スクリプトを get_top_page.pl という名前で保存して pp で実行可能ファイル化する。

 pp -o get_top_page.exe -M PAR::Repository::Client get_top_page.pl

とすれば get_top_page.exe という実行可能ファイルが作成される。 WWW::Mechanize はオンデマンドで http://www.example.com/PAR/ からフェッチされるので、アップデートが必要な場合は新しい PAR ファイルを作成してリポジトリを更新するだけでよい。 EXE ファイルを作成しなおして利用者に配付しなすといった作業も不要だ。

@ スクリプトもリポジトリにおく

さらには実行するスクリプトをも PAR リポジトリに置いておくことが可能だ。

例えば WWW-Mechanize に含まれている mech-dump をオンデマンドにフェッチして実行する実行形式ファイルは以下のコマンドで作成できる。

 pp -o mech-dump.exe -M PAR::Repository::Client \
   -e "use PAR { repository => 'http://www.example.com/PAR/', \
                 run => 'mech-dump' }"

@ まとめ

ActivePerl では PPM があるとはいえ、普通のユーザにちょっとしたプログラムを使ってもらうのに「ActivePerlインストールして、PPM パッケージインストールして、……」というのは手間すぎる。

pp で プログラムに必要なものを全てバンドルした実行形式化ファイルにするという方法ももちろんあるのだが、頻繁にアップデートするようなスクリプトの場合には、起動のための部分だけ pp で作成しておいてあとは PAR リポジトリで集中管理するというのもちょっと魅力的である。


[ 12月12日全て ]

2008年2月21日 (木)

今日のさえずり - 4C-0.4 芯って予想以上に細い このエントリーを含むはてなブックマーク

@ 2008年02月20日

@ 2008年02月21日

  • 00:07 P3 を 2.37 から 2.50 に上げて久しぶりに起動。しばらく見ない間にさらに改良されている。
  • 00:10 @lynmock Linux ユーザとしては設定ファイルが ~/.P3_PeraPeraPrv に入ったのが嬉しいですね。
  • 10:12 4C-0.4 芯って予想以上に細い。滲みがないからハイテックCより細い字が書けるな。ただ髭が出る。
  • 12:10 久しぶりに SquidRed Hat Linux 8.0 BOX に Squid 2.6 をソースからインストール。すんなりはいった。
  • 12:32 アトレ大井町、今日は休館日か。
  • 17:19 先週の金曜日にかっちゃんが死んだので、明日のタッチは見逃せない (TOKYO MX)。
  • 19:45 SO905iCSiアプリモバイル Google マップダウンロードできるようになった。現在位置取得も OK。[mb]
  • 22:30 3日前にケータイ保障 お届けサービス申し込んだので、ドコモプレミアムクラブガイドブックが郵送されてきた。

[ 2月21日全て ]

Related web page

Six Apart - Docs: Mobile Link Discovery 仕様
このページでは XHTML/RSS/Atom においてモバイル版 URL へのリンクをメタデータに埋め込む仕様: Mobile Link Discovery について解説します。 (See English version of this page.) サマリ モバイル端末に最適化されたウェブページをもつサイト(Publisher と呼びます)は、link タグにその URL を以下のように記述します。 &lt;link rel=&quot;alternate&quot; media=&quot;handheld&quot; href=&quot;...&quot; /&gt; こうすると、サ
http://www.sixapart.jp/docs/tech/mobile_link_discovery_ja.html
Google Map Parameters - Google Mapki
Here&#39;s a list of some of the prameters that can be passed to maps.google.com. You might want to pass such <strong>par</strong>ameters if you want to get Google Maps to display driving directions, which are not available under the API. q= Query - anything passed in the q <strong>par</strong>ameter is treated as if it had been typed into the query box on the maps.google.com page. In <strong>par</strong>ticular: a precise address is looked up and a marker and info box is displayed at the specified point a town name, or the first half of a postcode causes the r
http://mapki.com/wiki/Google_Map_Parameters
nDiki: PAR::Repository でビルド済み Perl モジュールをネットワーク配信
http://www.naney.org/diki/d/2006-12-12-PAR-Repository.html
PAR モジュール - miau's blog?
ってのは、大雑把に言うと Perl スクリプトを EXE 形式に変換するモジュール。 無駄にインストールに手間取ったんだけど、役に立つこともあるかもしれないのでメモ。 ちなみに環境は ActivePerl 5.8.8.819。 ■CPAN からのインストール(挫折) 普段インターネットに接続できない環境で作業してるので、CPAN から tar.gz を落として自分で make ってのがいつもの流れ。 今回も初めはその方
http://miau.s9.xrea.com/blog/index.php?itemid=561
Six Apart - Tech Talk Blog: 分散ファイルシステム MogileFS について
初登場になります、酒井といいます。 今回は Six A<strong>par</strong>t のサービスで使われている MogileFS というファイルシステムを紹介したいと思います。MogileFS については、日本語の情報はあまり…、というかほとんどない状況ですので参考にしていただければと思います。では早速。。。 MogileFS とは MogileFS とは、Perl で記述されているオープンソースな分散ファイルシステムです。 プロジェ
http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html
Free Vector Cliparts
Download these vector graphics and feel free to use for your projects, personal or commerical. These graphics are in .pdf format, support most graphic application like
http://www.ndesign-studio.com/resources/vector-cliparts/
a Black Leaf:台湾実写版北斗の拳 part1 「北斗之拳」
史上最凶の実写版 台湾版北斗の拳 <strong>par</strong>t1 こんばんは、ゲド戦記レビューのお時間です。 ・・・まあウソなんですけど。今回は台湾実写版の北斗の拳をご紹介しようと思うのです。以前当サイトでは、ハリウッド版、韓国版などの実写版北斗の拳を取り上げてまいりましたが、この台湾実写版だけはレビューすることについて躊躇していたため今までご紹介できずにおりました。 な
http://blog.livedoor.jp/textsite/archives/50240306.html
Six Apart - Tech Talk Blog: Movable Type の開発
こんにちは。Movable Type 製品開発チームの吉松です。そのうち登場する真打ちがやたらに深い技術の話をしてくれると思うんで、その前にまずは前座ということで、Movable Typeの開発チームの生態をさらしてみようと思います。 Movable Typeの開発チームは、サンフランシスコの本社にいるプロダクトマネージャ、エンジニア、QAリード、インタラクションデザイナ、および東京オフィス
http://www.sixapart.jp/techtalk/2006/08/movable_type.html
【コラム】あの素晴しいトイをもう一度 第1回 博品館TOY PARK(1) - 銀座のおもちゃ屋さんの意外なお得意様とは? (MYCOMジャーナル)
http://journal.mycom.co.jp/column/toyagain/001/
partman
「ディスク全体を使う」メニューを選ぶと、指定のディスク全体にある既存のパーティション(OSやデータを含む)を削除して1、ガイドによるパーティショニングの手順に進みます。新しいディスクや既存のデータを削除してもかまわないディスクであれば、これを選ぶのがよいでしょう。 「手動でパーティションテーブルを編集」メニューを選ぶと、現時点のパーティション構
http://kmuto.jp/debian/partman/

■よく検索されるキーワード

perl(52) 使い方(36) 提案書(35) windows(35) ドラマ(33) 書き方(30) cvs(28) サンプル(22) linux(21) torrent(20) debian(19) x31(19) 壁紙(19) 作り方(19) アジェンダ(18) 画像(17) 手帳(17) thinkpad(17) tc-1(17) 動画(15) rcs(15) アジェンダとは(15) ナースのお仕事(15) java(15) 桑田佳祐(14) ganttproject(14) 修理(14) gtd(13) 冷蔵庫(13) ほぼ日手帳(13) 桜井華子(12) wiki(12) google(12) 設定(12) tortoisesvn(12) ダイソー(11) ssh(11) apache(11) usb(11) 影舞(11) ウォーターボーイズ2(11) ノート(10) インストール(10) svn(10) ボールペン(9) so905ics(9) cgi(9) 無印(9) 方眼(9) xp(9) バッグインバッグ(9) subversion(9) 市原隼人(9) ヨドバシ(9) centos(9) djunit(8) c#(8) activeperl(8) ミムラ(8) 東京総合車両センター(8) 無印良品(8) make(8) ubuntu(8) 深浦加奈子(8) 写真(8) junit(7) 本名(7) (7) thinkingrock(7) ケース(7) 生年月日(7) 口コミ(7) 山川レイカ(7) チェックリスト(7) 例文(7) つけ麺(6) eclipse(6) web(6) 秋葉原(6) httpd.conf(6)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.111564s / load averages: 0.65, 0.46, 0.42
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)