2008年10月31日金曜日

 

【Javascript】イベントハンドラ

onclickとかをタグに書くよりソースがすっきりする。Ajax時代の主流。
以前、JS入門から派生して議論になってたけど。タグに直接書く方が簡単でイベントが指定されてるのが分かり易いのはある。

/* イベントリスナー */
var obj = document.getElementById('element');
if(window.addEventListener){
/* Firefox 用 */
  obj.addEventListener("click", myfunc, false);
}else{
/* IE 用 */
  obj.attachEvent("onclick", myfunc);
}

で、addEventListener()の第3引数useCaptureってのがある。IEには関係ない。
イベント処理の順番が変わるみたいで詳しくは以下リンク参照。サンプルスクリプトもあるので試してみたら良いと思う。

JavaScript addEventListener() - とみぞーノート
addEventListenerのuseCapture true/false時の動作比較

関数化したしたのが以下。リンク先には三項演算で記述したコードとかもある。

[JavaScript]addEventListenerを手軽に使おう - 文系大学的IT系の悲哀
function observe(target, type, listener) {
  if (target.addEventListener) target.addEventListener(type, listener, false);
  else target.attachEvent('on' + type, function() { listener.call(target, window.event); });
}
addEventListenerで渡した無名関数の中でremoveEventListenerする - 今日覚えたこと

無名関数はarguments.calleeで行う。

ラベル:


 

【Javascript】ライブラリを使わないフォームチップ

Useful tips to enrich your HTML Forms - Woork
DEMO:Ajax Form samples - tryzoom
inputフィールドにフォーカスされるとメッセージが表示される
/* HTML ソース */
<label for="email" >Email</label>
<input type="text" id="email"
  onFocus="javascript:toggleMsg('msg')"
  onBlur="javascript:toggleMsg('msg')" maxlength="20"/>
<span id="msg" class="msg" style="visibility:hidden;">※必須項目です</span>
/* Javascript コード */
<script type="text/javascript">
  function toggleMsg(idElement){
    element = document.getElementById(idElement);
    if(element.style.visibility!='hidden'){
      element.style.visibility='hidden';
    } else {
      element.style.visibility='visible';
    }
  }
</script>

入力フィールドがフォーカスされてる時に『※必須項目です』が表示される。

入力文字数制限チェック
/* HTML ソース */
<label for="text">Write something here</label>
<input type="input" id="text"
  onKeyUp="javascript:countChars('counter_number')" />
残り<spam id="counter_number">20</spam>文字
/* Javascript コード */
<script type="text/javascript">
  function countChars(idElement){
    max_chars = 20;
    counter = document.getElementById(idElement);
    field = document.getElementById('text').value;
    field_length = field.length;
    // 入力可能な文字数を計算
    remaining_chars = max_chars-field_length;
    // 入力可能な文字数を表示
    counter.innerHTML = remaining_chars;
    // 残り文字数が5文字以下になったら色を変える
    if(remaining_chars<=5){
      counter.style.color="#CC0000";
    }
  }
</script>
/* HTML ソース */
<input type="radio" name="newsletter" value="1" id="newsletter-1"
  onclick="javascript:toggle(1)" />
<label for="newsletter-1">Yes</label>
<input type="radio" name="newsletter" value="1" id="newsletter-0"
  onclick="javascript:toggle(0)" />
<label for="newsletter-2">No</label>
<div id="email-field" style="display:none;">
  <input type="text" id="email" />  E-mailアドレス
</div>
/* Javascript コード */
<script type="text/javascript">
  function toggle(status){
    idStatus = status;
    element =document.getElementById('email-field');
    if(idStatus==0){
      element.style.display='none';
    } else {
      element.style.display='block';
    }
  }
</script>

Javascriptが有効でない場合も考慮して使いやすいフォームを心掛けたい。

ラベル:


2008年10月29日水曜日

 

【Javascript】Web制作会社が作ったJSライブラリ - MJL

MJL — MITSUE-LINKS JavaScript Library - MITSUE-LINKS
マニュアル

使ってみたよ。
用意するのは、ライブラリ本体の「mjl.jp」とライブラリを使ったスクリプトと設定を記述する「run.js」の二つ。

mjl.js
run.js

こんな感じで読み込むよ。

<script type="text/javascript" src="mjl.js"></script>
<script type="text/javascript" src="run.js"></script>

MJLに関するコードは以下の関数内に記述するよ。

/* MJL - run.js サンプル */
MJL.event.add(window, "load", function(event) {
  // MJL に関係するコードはこの中に記述

MJLが提供する機能・関数は以下の6つのみ。とてもシンプルだね。

/* MJL の機能 */
MJL.enable.rollover:        ロールオーバー
MJL.enable.flash:           Adobe Flash オブジェクトの追加機能
MJL.enable.window:          新規ウインドウ
MJL.enable.tab:             タブインターフェイス
MJL.enable.styleSwitcher:   代替スタイルスイッチ
MJL.enable.heightEqualizer: 対象要素群の高さ揃え

使いたい機能の関数にクラス名を与えて実行させるよ。

/* MJL - run.js サンプル */
MJL.event.add(window, "load", function(event) {
  // MJL に関係するコードはこの中に記述
 MJL.enable.rollover("roll");
 MJL.enable.flash("flash");
 MJL.enable.window("window");
 MJL.enable.tab("tabs");
 MJL.enable.styleSwitcher("styleSwitcher");
 MJL.enable.heightEqualizer("equalize"); }, false);

MJL.enable.rollover - img要素・input要素にロールオーバー効果

MJL.enable.rolloverにクラス名「roll」を与えると、「roll」内のimginput要素にロールオーバーが出来るよ。
ロールオーバー用の画像は「img.jpg」に対して「img_o.jpg」を一緒に作成しておいてね。

/* ロールオーバー効果 MJL.enable.rollover の run.js サンプル */
MJL.event.add(window, "load", function(event) {
 MJL.enable.rollover("roll");
 }, false);

次の様に<ul>要素にクラス名「roll」をつけると全てのimg要素・input要素がロールオーバーするんだね。
この場合、用意する画像は「image/」内に「foo.png、bar.png、baz.png」と一緒に「foo_o.png、bar_o.png、baz_o.png」だね。

/*  ロールオーバー効果 MJL.enable.rollover の html サンプル */
<ul class="roll">
 <li class="foo" ><img src="media/foo.png" alt="Foo" /></li>
 <li class="bar" ><a href="index.html"><img src="media/bar.png" alt="Bar" /></a></li>
 <li class="baz" ><input type="image" src="media/baz.png" alt="Baz" /></li>
</ul>

ロールオーバーさせたくない要素がある時は「{disable}」でクラス名を指定するんだ。
次の様にするとクラス「roll」の要素の中でクラス「foo」だけロールオーバーしないよ。

/* ロールオーバー効果 MJL.enable.rollover の run.js サンプル */
MJL.enable.rollover("roll", {disable:"foo"});

他にも使い方やオプションがあるから詳しくはマニュアルを見てね。

ラベル:


2008年10月28日火曜日

 

PHP4.xでPHP5.xの関数を使うライブラリ - upgrade.php

これは便利。以下から取得。

upgrade.php

使い方はファイルを読込だけ。

<?php
  if (PHP_VERSION <"4.4.0") {
    include(".../upgrade.php");
  }
?>

get_include_pathset_include_pathfile_put_contentsscandirやmimetype関連、array関連は便利そうだ。fputcsvは日本語使い物ならないかな。

  json_encode
  json_decode
  strptime
  gzdecode
  htmlspecialchars_decode
  fputcsv
  ob_get_headers
  xmlentities
  stripos
  strripos
  str_ireplace
  get_headers
  headers_list
  fprintf
  vfprintf
  str_split
  http_build_query
  convert_uuencode
  convert_uudecode
  scandir
  idate
  time_nanosleep
  strpbrk
  php_real_logo_guid
  php_egg_logo_guid
  get_declared_interfaces
  array_combine
  array_walk_recursive
  substr_compare
  spl_classes
  class_parents
  session_commit
  dns_check_record
  dns_get_mx
  setrawcookie
  file_put_contents
  count_recursive
  file_get_contents
  fnmatch
  glob
  array_key_exists
  array_intersect_assoc
  array_diff_assoc
  html_entity_decode
  str_word_count
  str_shuffle
  get_include_path
  set_include_path
  restore_include_path
  str_rot13
  array_change_key_case
  array_fill
  array_chunk
  md5_file
  is_a
  fmod
  floatval
  is_infinite
  is_nan
  is_finite
  var_export
  strcoll
  diskfreespace
  disktotalspace
  vprintf
  vsprintf
  import_request_variables
  hypot
  log1p
  expm1
  sinh
  cosh
  tanh
  asinh
  acosh
  atanh
  mhash
  mhash_count
  mhash_get_hash_name
  mhash_get_block_size
  array_udiff_uassoc
  array_udiff_assoc
  array_diff_uassoc
  array_udiff
  array_uintersect_uassoc
  array_uintersect_assoc
  array_uintersect
  array_intersect_uassoc
  dc___exec
  bcscale
  bcadd
  bcsub
  bcmul
  bcdiv
  bcmod
  bcpow
  bcpowmod
  bcsqrt
  bccomp
  bc___scaledown
  gettext
  gettext___plural_guess
  ngettext
  dngettext
  dcngettext
  dcgettext
  dgettext
  textdomain
  bindtextdomain
  gettext___load_mo
  gettext___load_po
  bind_textdomain_codeset
  _
  mime_content_type
  image_type_to_mime_type
  image_type_to_extension
  exif_imagetype
  array_filter
  array_map
  is_callable
  array_search
  array_reduce
  is_scalar
  localeconv
  call_user_func_array
  call_user_method_array
  array_sum
  constant
  is_null
  pathinfo
  escapeshellarg
  is_uploaded_file
  move_uploaded_file
  strncasecmp
  wordwrap
  php_uname
  php_sapi_name
  posix_mkfifo
  posix_getcwd
  posix_kill
  posix_uname
  ctype_alnum
  ctype_alpha
  ctype_digit
  ctype_xdigit
  ctype_cntrl
  ctype_space
  ctype_upper
  ctype_lower
  ctype_graph
  ctype_punct
  ctype_print
  odbc_connect
  odbc_pconnect
  odbc_close
  odbc_exec
  odbc_do
  odbc_prepare
  odbc_execute
  odbc_fetch_array
  odbc_fetch_row
  odbc_fetch_object
  odbc_fetch_into
  odbc_free_result
  odbc_next_result
  odbc_num_fields
  odbc_num_rows 

参考

PHP4.xでPHP5.xの関数を使いたい場合に。upgrade.php - S-page

ラベル:


2008年10月25日土曜日

 

【ZenCart】インストールしてみる【XREA】

ZenCartインストール参考サイト - さぼてん(2008年7月10日記事)

リアルに記していこう。

ダウンロード - ファイル取得

ZenCart 1.3.8a 日本語版ダウンロードページ - 有限会社ビッグマウス
- Zen Cart 基本機能一覧

ユーザ登録が必要。URLがメールに届きます。

2008/10/25 11:41

アップロード

解凍したディレクトリ内の「zencart/」ディレクトリをXREAにアップ。

2008/10/25 12:44

インストール - セットアップ

「http://www.example.com/zc_install/」にアクセス。インストール開始。
この場合は「http://username.sXXX.xrea.com/zencart/zc_install/」。

こんなステップ。

   -  ようこそ
   -  ライセンス規約
   -  システム検査
   -  データベース設定
   -  システム設定
   -  phpBB設定
   -  店舗設定
   -  管理者設定
   -  完了

ようこそ

インストーラ画面の最初。スルー。

ライセンス規約

同意する。

システム検査

「システム検査」で「admin/includes/configure.php」「 includes/configure.php」の二つのファイルに書き込み権限がないとインストールできないので「0777」に変更し、再検査ボタンをクリック、インストールに進む。
メッセージが出るので、以下のディレクトリにも書き込み権限を後で与えるようにする。

     cache = 書き込めません   (chmod 777 read/write/execute)
     images = 書き込めません   (chmod 777 read/write/execute (INCLUDE SUBDIRECTORIES TOO))
     includes/languages/japanese/html_includes = 書き込めません   (chmod 777 read/write (INCLUDE SUBDIRECTORIES TOO))
     media = 書き込めません   (chmod 777 read/write/execute)
     pub = 書き込めません   (chmod 777 read/write/execute)
     admin/backups = 書き込めません   (chmod 777 read/write)
     admin/images/graphs = 書き込めません   (chmod 777 read/write/execute)

データベース作成待ち。

2008/10/25 14:50

やっと通った。

データベースの設定
    サーバ : localhost
    ユーザ : ユーザアカウント名
    パスワード : 設定したパスワード
    データベース名 : ユーザアカウントと同じ
2008/10/25 14:55

システム設定

インストールされたディレクトリとかを確認しつつスルー。XREAだしSSLは"いいえ"にしておく。「configure.php」で後から変更できるよう。

phpBB設定

スルー。

2008/10/25 15:10

店舗設定

「Zen Cart; 初期設定 - 店舗設定」を入力。

管理者設定

「Zen Cart設定 - 管理者アカウント設定」を設定。

完了

完了。おしまい…一応。

2008/10/25 17:01

セキュリティ

あなたのZen Cartによるショップをセキュア(安全)にするためのステップ - Zen Cart.JP 開発Wiki

「zc_install/」を削除、「configure.php」を二つとも属性を戻す、「admin/」ディレクトリ名を変更(合わせて設定ファイルも)…。

カスタマイズ

Zen-Cart Modules
Zen-Cart 日本語版用のモジュールやテンプレートなどのダウンロード/登録 サイト
フリーテンプレート
「Zen Cartによるオンラインショップ構築・運用テクニック」:デザインテンプレートセットを公開
2008/10/30 9:50 ZenCartモジュール - mobiby.com
ZenCart設置・カスタム専門会社。モジュール・テンプレート販売。Ajax対応タブインターフェース、新着表示モジュール、イプシロン決済モジュール(PC版・携帯版)は無料。

ラベル:


2008年10月23日木曜日

 

【Perl】CGIクラス - CGI.pm

現在、PerlでCGIを利用するときによく使われるライブラリは、Perl5のオブジェクト指向スタイルでCGIを書ける、CGI.pmです。
以前の主流は、Perl4、5で動作するcgi-lib.pl。ポストとかクエリを配列に直してくれたりするスクリプトが入ってるとか。

Part1 正しいPerl/CGIの書き方(3) - ITpro
PerlとCGI ※「CGI.pmとテンプレートを組み合わせる」参照
フォームの開始と終了

start_form()または新しいメソッドstart_multipart_form()。
※参考:フォームの開始と終了

print $query->start_form(-method=>$method,
                                        -action=>$action,
                                        -enctype=>$encoding);
  /*  フォーム内容  */
print $query->endform;
#  または
print $query->start_form($method,$action,$encoding);
  /*  フォーム内容  */
print $query->endform;
ファイル・アップロード・フィールド

filefield()を使う。
※参考:ファイル・アップロード・フィールドの作成cgi(perl)でアップロードされたファイルを保存する方法について - 教えて!goo

 title="CGI - 簡単なCGI(Common Gateway Interface)クラス"
print $query->filefield(-name=>'uploaded_file',
                                    -default=>'starting value',
                                    -size=>50,
                                    -maxlength=>80);
# または
print $query->filefield('uploaded_file','starting value',50,80);

ファイル名の取得は以下の様に。ブラウザ依存。

$filename = $query->param('uploaded_file');

アップしたファイルを保存。ファイル情報の取得はuploadInfo()

# ファイル取得
my $fH = $query->upload('filename');
# MIMEタイプ取得
my $mimetype = $query->uploadInfo($fH)->{'Content-Type'};
# ファイル保存
open (OUT, ">Savefile") || die "Can't open Savefile!";
binmode (OUT);
while(read($fH, $buffer, 1024)){
    print OUT $buffer;
}

ラベル:


 

モダンにパール

モダンなPerl入門 - perl-users.jp
メールを送信する
モダンなPerl入門のメールの送信スクリプトのモダンさ具合が分からない - M.C.P.C.
サポートしないのでMIME::Liteを使わないのがモダンらしい(ブックマークコメントから)。
Part1 正しいPerl/CGIの書き方 - ITpro
Perlモジュールの書き方。

ラベル: ,


 

ブログパーツを作るために

withD(ウィズ・ディー)
フローティングブログパーツの作り方、こっそり教えます(前編)
フローティングブログパーツの作り方、こっそり教えます(後編)
ryow.net Blog
ブログパーツの作り方(Flash)
ブログパーツの作り方(2)~フローティングパーツ
embedを書かないobject(flash)の設置方法。
CREAMU
ブログパーツの作り方『How to make blog parts』
widgetown(ウィジェッタウン)
第1回 今すぐブログパーツ編
Web Artisan Blog - ウェブ アルチザン ブログ
PHP:JS(JavaScript)からPHPを呼び出しHTML上に出力する方法
PHP言語とWebAPIを利用した自作ブログパーツの紹介
http://kommy.s254.xrea.com/parts/
JavaScriptで作る!簡単ブログパーツ
http://ww9dlo41.s227.xrea.com/blogparts/

ラベル: , ,


2008年10月22日水曜日

 

Iterator(イテレータ) - デザインパターン

「iterate」という英単語には「繰り返す」という意味があり、iteratorは日本語で「反復子」と呼ばれる。
何かが沢山集まっているときに、それを順番に指し示していき、全体をスキャンしていく処理を行うためのデザインパターン。
データが何であるか、どういうデータか、ということを知らずにすべてのデータを順番に取得できる、繰り返し処理が出来るようにする、と勝手に解釈します。
for文とかの代わり。何回繰り返すかとか$iを進めて配列ならそれをセットして…といったことをデータ・オブジェクトの方で設計する。
データ総数もオブジェクトで持って、アクセスするたびに次のデータが取得できるようにする。

参考

Iteratorパターン - koshigoewiki:php:デザインパターン
Iteratorパターンはfor文じゃダメなの? - dTblog | design and programming
Javaで。
1. Iteratorパターン - TECHSCORE
Iteratorパターン - 吉田誠一のホームページ
デザインパターン編 第1章 Iteratorパターン - Programming Place Plus
Iterator パターン - Wikipedia

ラベル: ,


 

デザインパターン

デザインパターン編 トップページ - Programming Place Plus
デザインパターンとは、プログラミングを行っていく上で、一般的に よく起こり得るような問題点と、それを解決する手段とをまとめ上げたものです
C++による実装例。
何が良いのか
多くのプログラマに、デザインパターンは受け入れられていて、それは実作業の中で発生した問題点(またはこれからも出くわすであろう問題点)と、それに対する答えだから。
デザインパターンには、1つ1つに対して名前が付けられており、各パターンをソースコード中でどのように記述するのかは言語によってまちまち。
しかし各パターンの目的は明確に定まっており、それぞれに名前があるので開発者同士がデザインパターンについての知識を持っていれば、パターン名を挙げるだけで相手の言いたいことが伝わるという利点
デザインパターン入門 - HIJK's HomePage
デザインパターンを“喩え話”で分かり易く理解する。 オブジェクト指向に立脚する優れた設計ノウハウである “デザインパターン”。 喩え話や、クラス設計のポイントだけ記載した、 本格的な勉強の前の入門編。
簡単で短い文章での説明。
具体例で説明するデザインパターン - てっく煮ブログ
ここでは、GoF本の順番に沿って、以下の11個のパターンを取り上げる。
「具体例で説明するデザインパターン」はかなり間違ってる - disり用。
具体例で説明するデザインパターンが半分以上、しかも全然違う説明をしているので、念のためツッコんでおきます。
間違いから学ぶ。
ハタさんのブログ
PHP開発者のためのデザインパターン。Delegate
PHP開発者のためのデザインパターン。Controller
デザパタ(GoFとかのヤツ)ではControllerパターンなんてものは存在しないのですが、よく見掛けるパターンなので紹介します。
デザパタ本には載らないデザパタ
簡単に書けるHook OperationパターンとNullObjectパターンをPHP5で書いてみます。

ラベル: ,


2008年10月11日土曜日

 

【Wordpress】独自ドメインの設定に失敗した場合

Wordpressを独自ドメインで運営する。 - 徒然草:remix
設定間違いでアクセス不能時の対処方法… - blog.plastik.jp
「管理画面 -> 一般設定 -> ブログのURL・WordpressのURL」でのURLの設定に失敗して、間違ったURLにリダイレクトされてアクセスできなくなった場合、phpMyAdminで直接修正。
そういうこともありえるので念のため、注意。

ラベル:


 

【SQLite】GUIで管理 SQLite Manager

SQLiteをGUIで管理する便利なソフト。
XREAへのSQLite Managerのインストール。 - 酔生夢死
アップしてブラウザでアクセするだけ。デフォルトではアップしたディレクトリ直下にSQLiteファイルを作ろうとする。任意のディレクトリに属性変更してパスを与えるとそこに作る。(XREAだと「/virtual/ユーザ名/public_html/app/db/data.sqlite3」とか)
注意点はセキュリティ。リンク先を要参考。
画面上で操作したDBファイル以外は認識しないので既に存在するSQLiteファイルもFTPでアップしたり削除したファイルは画面で反映されない(存在しない場合は警告が出る)。「include/config.db」にファイルのパスとか保存してるのかも。
日本語UTF-8も問題なく出来たが、今後何かあれば以下を参照。
UTF-8でSQLiteManagerを使う - よくきたblog

ラベル:


2008年10月8日水曜日

 

【PHP】PEAR::XML_RPC【API】

クライアントおよびサーバを実装するための XML-RPC を扱うPEARパッケージ。XMLをやりとりしてごにょごにょ。
XML_RPC - PEAR

関連

XML-RPC 仕様書 - Discreet Blog
XML-RPC HOWTO
PHPとPEARでXML-RPC - Suns & Moon Laboratory
PHPを用いたXML-RPCの基礎 - Intelligent Systems Design Laboratory Research Reports ( ISDL Reports )
PEAR::XML_RPCで「はてなダイアリーキーワード連想語API」
PEAR::XML_RPC から,はてなダイアリーキーワード連想語 API を使う方法 - cl.pocari.org
XML_RPC(PEAR)を利用@PHP - PHPのお勉強

参考書

PEAR入門 PHP標準ライブラリを極める!
PEAR入門 PHP標準ライブラリを極める!

ラベル: , ,


2008年10月3日金曜日

 

【WP】自由度が高いカスタマイズできるフォームのプラグイン

複雑なお問い合わせフォームを作成するプラグイン cforms II - WordPressで企業ウェブサイト作成・商用ホームページ制作 WordPress Go Go
複雑なくらいカスタマイズできる。ありがたや。
以下の配布先から「cforms II 9.0」をダウンロード。解凍して出来た「cforms/」ディレクトリをそのまま「plugins」ディレクトリにアップ。結構ファイル多い。
日本語ファイルは上記サイトで配布されてるもの。
カスタムの詳細も上記リンク先から。
cforms II » delicious:days - delicious:days
cforms II 日本語翻訳ファイル

関連リンク

cforms IIで送信失敗する時。 - WordPressカスタマイズメモ

ラベル:


 

【WP】ホームページをWordpress以外のページに設定する

インストールしたディレクトリとは別のディレクトリにホームページを設定する - tenkaoのはてなダ…メモ
http://example.com/wordpress/ にインストールしたWordPressを http://example.com/ で表示させる方法のメモ。環境は WordPress Me 2.2

ラベル:


 

【WP】特定カテゴリの投稿一覧

特定のカテゴリーの記事一覧を表示したい。 - WordPress フォーラム

<?php
 $posts = get_posts('numberposts=0&category=5');
 global $post; ?>
 <?php if($posts): foreach($posts as $post): setup_postdata($post); ?>
 <?php the_title(); ?>
 <?php endforeach; endif; ?>
numberposts=100」だと最新の100件からってことかな。「category」はカテゴリID。
カテゴリ名、投稿リスト、とかComments - tenkaoのはてなダ…メモ

<?php
 function get_posts_by_category_id($cat_ID) {
   $cat_ID = (string) $cat_ID;
   $myargs = 'numberposts=0&orderby=ID&order=asc&category='.$cat_ID;
   global $post;
   $myposts = get_posts($myargs);
   foreach($myposts as $post) :
     echo '<li><a href="';
     echo the_permalink();
     echo '">';
     echo the_title();
     echo '</a></li>';
   endforeach;
 }
?>
他にも「指定したカテゴリIDのカテゴリ名を出力する」「親カテゴリをもつ場合(子カテゴリの場合)のみ、カテゴリ名を出力する」「親カテゴリ名を出力する」「現カテゴリの投稿一覧を出力する」があるのでリンク先参照。

ラベル:


 

【WP】テンプレートタグ - wp_list_categories


<?php wp_list_categories('option=value'); ?>
オプション複数指定は'&'で続ける。

参考

テンプレートタグ/wp list categories - ps*wiki
wp_list_categories (Version2.1) - Wordpress Document

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google