Perlのハッシュでキーの有無を調べる方法

March 19,2019 12:03 AM
Category:[Perl]
Tag:[Perl]
Permalink

Perlのハッシュでキーの有無を調べる方法を紹介します。

1.問題点

Perlで下記のようなハッシュを作成しました。

my $hash;
 
$hash->{orange} = 1;
$hash->{grape} = 1;
$hash->{apple} = 1;

このハッシュに"apple"というキーが存在するか調べたいのですが、方法がわかりません。

ということで、ハッシュにキーが存在するか調べる方法を紹介します。

2.ハッシュにキーが存在するか調べる

ハッシュにキーが存在するか調べるには、exists関数を使用します。

#!/usr/bin/perl
 
use strict;
 
my $hash;
$hash->{orange} = 1;
$hash->{grape} = 1;
$hash->{apple} = 1;
 
if ( exists $hash->{apple} ) {
    print "exist";
} else {
    print "no exist";
}

"apple"はキーに存在するので、実行結果は、

exist

となります。

if文に記述したハッシュキーを、存在しない任意の文字列に変更してみます。

#!/usr/bin/perl
 
use strict;
 
my $hash;
$hash->{orange} = 1;
$hash->{grape} = 1;
$hash->{apple} = 1;
 
if ( exists $hash->{abc} ) {
    print "exist";
} else {
    print "no exist";
}

"abc"はキーに存在しないので、実行結果は、

no exist

となります。

Comments [0] | Trackbacks [0]

Pythonのシングルクォーテーションとダブルクォーテーションの違い

March 13,2019 12:03 AM
Category:[Python]
Tag:[Python]
Permalink

Pythonのシングルクォーテーションとダブルクォーテーションの違いについて調べてみました。

1.はじめに

2.シングルクォーテーションとダブルクォーテーションの違い

シングルクォーテーションとダブルクォーテーションの違いは特にありません。

PHPなどでは変数を展開する場合にダブルクォーテーションで括る必要がありますが、Pythonはそのような仕様はないようです。

PHPの場合

$str = 'World';
echo "Hello $str";

またPythonでは下記の考慮が必要です。

シングルクォーテーション:文字列にシングルクォーテーションが含まれる場合、エスケープが必要

str = '\'Hello World\''

ダブルクォーテーション:文字列にダブルクォーテーションが含まれる場合、エスケープが必要

str = "\"Hello World\""

言い換えると、逆のパターンであればエスケープは不要です。

str = "'Hello World'"

または

str = '"Hello World"'
Comments [0] | Trackbacks [0]

Pythonで改行せずに出力する方法

March 12,2019 12:03 AM
Category:[Python]
Tag:[Python]
Permalink

Pythonで改行せずに出力する方法を紹介します。

1.問題点

Pythonで下記のスクリプトを書きました。

test.py

print "Hello World!"
print "Hello World!"

このスクリプトを実行させたところ

$ python test.py
Hello World
Hello World

という風に改行が含まれてしまいます。

改行せずに出力する方法が分かりません。

ということで、Pythonで改行せずに出力する方法を紹介します。

改行せずに出力する方法は2つあります。

2.改行せずに出力する(その1)

改行せずに出力する1つめの方法は、1行目のprint文の末尾にカンマを付与することです。

test.py

print "Hello World!",
print "Hello World!"

これを

$ python test.py

と実行すれば、

Hello World Hello World

が出力されます。

3.改行せずに出力する(その2)

改行せずに出力する1つめの方法は、sys.stdout.writeを用いることです。

2項の方法では文字列の間に空白が含まれてしまいます。

この空白も除去したい場合、sys.stdout.writeを用います。

test.py

import sys
 
sys.stdout.write('Hello World')
sys.stdout.write('Hello World')

これを

$ python test.py

と実行すれば、

Hello WorldHello World

が出力されます。

なお、最後の行に改行を含めたい場合、

test.py

import sys
 
sys.stdout.write('Hello World')
sys.stdout.write('Hello World\n')

とすればよいでしょう。

Comments [0] | Trackbacks [0]

WindowsでShiftキー/Ctrlキー/Altキー/Windowsキーを押しっぱなしにする方法

March 7,2019 12:03 AM
Category:[Windows]
Tag:[Windows]
Permalink

WindowsでShiftキー/Ctrlキー/Altキー/Windowsキーを押しっぱなしにする方法を紹介します。

1.問題点

Windowsの操作で英大文字だけを打ち込む作業が発生しました。

その際Shiftキーを押しっぱなしにしなければなりませんが、小指でShiftキーを押し続けるのは大変です。

小さいおもりをキーの上に置く方法もあると思いますが、他に良い方法はないでしょうか。

ということで、WindowsでShiftキー/Ctrlキー/Altキー/Windowsキーを押しっぱなしにする方法を紹介します。

2.Shiftキー/Ctrlキー/Altキー/Windowsキーを押しっぱなしにする

Shiftキー/Ctrlキー/Altキー/Windowsキーを押しっぱなしにするには、「固定キー」機能を利用します。

以下、固定キー機能の設定方法です。

Windowsキー+Uを押下(または「スタート」→「アクセサリ」→「コンピューターの簡単操作」→「コンピューターの簡単操作センター」をクリック)。

コンピューターの簡単操作センター

「コンピューターの簡単操作センター」が開くので「キーボードを使いやすくします」をクリック。

(クリックで拡大、以下同様)
キーボードを使いやすくします

「入力しやすくします」の中の「固定キーを有効にする」にチェック。

固定キーを有効にする

「固定キーのセットアップ」をクリック。

固定キーのセットアップ

上にある「固定キーを有効にします」をチェック。

固定キーを有効にします

「Ctrl、Alt、Shift、Windowsロゴキーを2回続けて押すとそのキーをロックする」をチェック。

Ctrl、Alt、Shift、Windowsロゴキーを2回続けて押すとそのキーをロックする

「2つのキーを同時に押すと固定キー機能を無効にする」のチェックを外す。これはCtrlキーを使ってエディタ操作をする場合に固定キー機能が解除されるのを防ぐためです。

2つのキーを同時に押すと固定キー機能を無効にする

「OK」をクリック。

「OK」をクリック

ひとつ前の画面に戻るので「OK」をクリック。

「OK」をクリック

これで設定完了です。

タスクバーに白い4つの箱のアイコンが表示されます。

タスクバーに白い4つの箱のアイコンが表示

それぞれの箱は、

上:Shiftキー
下左:Ctrlキー
下中:Windowsキー
下右:Altキー

に対応しています。

このアイコンの使い方は次項で説明します。

3.キーをロックする

Shiftキー/Ctrlキー/Altキー/Windowsキーをロックするには、ロックしたいキーを連続で2回押下します。

キーがロックされると黒に表示が変わります。

Shiftキーがロックされた状態
Shiftキーがロックされた状態

Ctrlキーがロックされた状態
Ctrlキーがロックされた状態

Windowsキーがロックされた状態
Windowsキーがロックされた状態

Altキーがロックされた状態
Altキーがロックされた状態

なお、ロックしたいキーを1回だけ押下すると1度だけロックされた状態になり、何かキーを押下した時点でロックが解除されます。

4.ロックを解除する

ロックを解除するには、ロックされているキーを1回押下します。

なお、ロックしたいキーを1回だけ押下してロックした場合(かつ他のキーを押下していない場合)、そのキーを2回押下すれば解除されます。

5.固定キー機能を解除する

固定キー機能を解除するには、4つの箱のアイコンをダブルクリックすれば設定画面が表示されるので、「固定キーを有効にします」のチェックを外して「OK」をクリックします。

Comments [0] | Trackbacks [0]

Pythonでshebang行を書く方法

March 5,2019 12:03 AM
Category:[Python]
Tag:[Python]
Permalink

Pythonでshebang行を書く方法を紹介します。

1.問題点

shebang(シェバンまたはシバンと読む)行は、そのスクリプトが使用するインタプリタを指定するためのものです。

例えば、Linuxのシェルスクリプトの先頭に次のように書きます。

test.sh

#!/bin/bash
 
echo "Hello World!"

これでファイルのパーミッションに実行権をつけて

$ ./test.sh

とすればシェルスクリプトとして実行されます。

が、Pythonでshebang行の書き方が分かりません。

ということで、Pythonでshebang行を書く方法を紹介します。

2.sheang行を書く

Pythonのshebang行は次のように記述します。

使用するバージョンによって異なるようです。

バージョン2の場合

test.py

#!/usr/bin/env python2
 
print "Hello World!"

バージョン3の場合

test.py

#!/usr/bin/env python3
 
print "Hello World!"

これでファイルのパーミッションに実行権をつけて

$ ./test.py

とすればPythonスクリプトとして実行されます。

Comments [0] | Trackbacks [0]

Pythonで改行を含む複数行データを代入する方法(ヒアドキュメント)

February 28,2019 11:55 PM
Category:[Python]
Tag:[Python]
Permalink

Pythonで改行を含む複数行データを代入する方法(ヒアドキュメント)を紹介します。

1.問題点

Pythonで、

aaa
bbb
ccc

という、改行を含む複数行のデータを変数に代入したいのですが、方法が分かりません。

ということで、Pythonで改行を含む複数行データを代入する方法を紹介します。

2.改行を含む複数行データを代入する

改行を含む複数行データを代入するには、クォーテーション(またはダブルクォーテーション)を3つ連結させたもので括ります。

いわゆる「ヒアドキュメント」です。

str = '''aaa
bbb
ccc'''

または

str = """aaa
bbb
ccc"""

サンプル

test.py

str = '''aaa
bbb
ccc'''
 
print str

実行結果

aaa
bbb
ccc

クォーテーション(またはダブルクォーテーション)開始の直後や終了の直前に改行をいれると、改行も文字列として含まれるので注意しましょう。

Comments [0] | Trackbacks [0]

Pythonで"Hello World"を出力する方法

February 27,2019 12:03 AM
Category:[Python]
Tag:[Python]
Permalink

Pythonで"Hello World"を出力する方法を紹介します。

1.はじめに

Pythonでプログラミングしてみました。

ということで、手始めに"Hello World"を出力する方法を紹介します。

2."Hello World"を出力する

"Hello World"を出力するにはprint文を用います。

test.pyというファイルを作成し、下記の1行を記述します。

test.py

print "Hello World!"

文末のセミコロンは不要です(セミコロンがあっても問題ありません)。

これで、

$ python test.py

と実行すれば、

Hello World!

が出力されます。

Comments [0] | Trackbacks [0]

MT7テンプレート作成画面に表示される「コンテンツタイプ」「コンテンツフィールド」の意味

February 21,2019 12:03 AM
Category:[テンプレート]
Tag:[MovableType, Template]
Permalink

MT7テンプレート作成画面に表示される「コンテンツタイプ」「コンテンツフィールド」の意味について調べてみました。

1.問題点

コンテンツタイプ関連のテンプレートモジュールを作成しようと思い、テンプレート一覧画面上部にあるプルダウンから「テンプレートモジュール」を選択し、「新規作成」をクリック。

右サイドバーに「コンテンツタイプ」「コンテンツフィールド」のフィールドがそれぞれ表示されます。

「コンテンツタイプ」フィールドには下記の情報が表示されます。

  • 名前
  • ID
  • ユニークID

「コンテンツフィールド」フィールドには下記の情報が表示されます。

  • 名前
  • ID
  • ユニークID
  • 種類

ユニークIDはワンクリックでコピーもできるようになっています。

が、この2つのフィールドの利用方法が分かりません。

プルダウンを選択したあとテンプレートを保存しても、元のデフォルト値に戻ってしまうようです。

この表示はシステムテンプレートやウィジェットテンプレートなどでも同様に表示されます。

ということで、テンプレート作成画面に表示される「コンテンツタイプ」「コンテンツフィールド」の意味について調べてみました。

2.テンプレート作成画面に表示される「コンテンツタイプ」「コンテンツフィールド」の意味

これらはテンプレート作成画面の設定情報ではなく、テンプレート作成時の入力情報として利用するものと思われます。

もしこの情報がないと、コンテンツタイプやコンテンツフィールドの設定内容を調べるために、コンテンツタイプ一覧を開く手間がかかります。

ここに表示されている情報があれば、それらの画面を別に開く必要がありません。

Comments [0] | Trackbacks [0]

gitのfetchとpullの違いについて

February 15,2019 12:03 AM
Category:[github]
Tag:[github]
Permalink

gitのfetchとpullの違いについて調べてみました。

1.ローカルブランチとトラッキングブランチ

fetchとpullの違いについて説明する前に、ローカルブランチとトラッキングブランチについて説明します。

gitのリポジトリには、

  • リモートリポジトリ
  • ローカルリポジトリ

の2つがあり、さらにローカルリポジトリには、

  • ローカルブランチ
  • トラッキングブランチ

の2つのブランチがあります。

トラッキングブランチはリモートブランチの変更に追従し、ローカルブランチとリモートブランチを結びつける役割を果たしています。

"origin/master"がトラッキングブランチに該当します。

図にまとめると次のようになります。

gitのリポジトリ構成

2.fetchとは

fetchは「トラッキングブランチの更新」です。

$ git fetch

を実行すると、更新されるのはトラッキングブランチのみです。

fetch

ローカルブランチにも変更を反映するにはmergeが必要です。

fetch

3.pullとは

pullは「トラッキングブランチの更新とローカルブランチのマージ」です。

$ git pull origin master

を実行すると、トラッキングブランチが更新され、ローカルブランチにマージされます。

fetch

まとめると、

  • fetch:トラッキングブランチの更新
  • pull:トラッキングブランチの更新とローカルブランチのmerge

ということですね。

Comments [0] | Trackbacks [0]

RPMをソースパッケージ(SRPM)からインストールする方法

February 11,2019 11:55 PM
Category:[Linux]
Tag:[Linux]
Permalink

RPMをソースパッケージ(SRPM)からインストールする方法を紹介します。

1.問題点

lvコマンドをLinuxにインストールしたいのですが、利用しているアーキテクチャのrpmパッケージが存在しません。

ということで、ソースパッケージからインストールする方法を紹介します。

2.RPMをソースパッケージ(SRPM)からインストールする

まず、ソースパッケージをダウンロードします。

今回利用したのはCentOS用の下記のパッケージです。

http://vault.centos.org/5.11/os/SRPMS/lv-4.51-8.1.src.rpm

ソースパッケージ(SRPM)からインストールするには、"rpmbuild"を利用します。

rpmbuildがインストールされていない場合は、yumでインストールします。

# sudo yum install rpm-build

rpmbuildコマンドでインストールを実行します。

# rpmbuild --rebuild lv-4.51-8.1.src.rpm

ちなみに初回は必要なパッケージが不足していて、下記のエラーになりました。

# rpmbuild  --rebuild lv-4.51-8.1.src.rpm
lv-4.51-8.1.src.rpm をインストール中です。
警告: lv-4.51-8.1.src.rpm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID e8562897: NOKEY
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
 :
警告: ユーザー mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: 9 行目: buildprereq は非推奨: BuildPrereq:        libtermcap-devel autoconf
エラー: ビルド依存性の失敗:
        libtermcap-devel は lv-4.51-8.1.ppc64 に必要とされています
        autoconf は lv-4.51-8.1.ppc64 に必要とされています

メッセージにしたがって、不足しているlibtermcap-develとautoconfをそれぞれyumでインストールし、lvを再インストール。

# rpmbuild --rebuild lv-4.51-8.1.src.rpm
lv-4.51-8.1.src.rpm をインストール中です。
 :
(中略)
 :
書き込み完了: /root/rpmbuild/RPMS/ppc64/lv-4.51-8.1.ppc64.rpm
書き込み完了: /root/rpmbuild/RPMS/ppc64/lv-debuginfo-4.51-8.1.ppc64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.6dAl8M
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd lv451
+ rm -rf /root/rpmbuild/BUILDROOT/lv-4.51-8.1.ppc64
+ exit 0
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.Y3IStn
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf lv451
+ exit 0

これで、

/root/rpmbuild/RPMS/ppc64/lv-4.51-8.1.ppc64.rpm

にRPMパッケージが配置されました。

あとはいつものrpmコマンドでインストールすればOKです。

# rpm -ivh /root/rpmbuild/RPMS/ppc64/lv-4.51-8.1.ppc64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:lv-4.51-8.1                      ################################# [100%]

これでlvコマンドがインストールされました。

# lv
# lv v.4.51.a (Oct.30th,2005)
# All rights reserved. Copyright (C) 1996-2005 by NARITA Tomio
# ABSOLUTELY NO WARRANTY; for details type `lv -h'
Comments [0] | Trackbacks [0]

MovableTypeの記事データをコンテンツデータに変換する「EntryConverterプラグイン」

January 31,2019 11:55 PM
Category:[コンテンツデータ]
Tag:[EntryConverter, MovableType, Plugin]
Permalink

MovableTypeの記事データをコンテンツデータに変換する「EntryConverterプラグイン」を公開します。

記事データからコンテンツデータへの変換イメージ(クリックで拡大、以下同様)
変換の状況

1.機能

MovableType 7で登場したコンテンツデータですが、今後のメジャーバージョンアップで、MT6までの基本データであった「記事」「ウェブページ」が廃止され、コンテンツデータのみになる可能性があります。

本記事の「EntryConverterプラグイン」を導入することで、記事データ(カスタムフィールド含む)をコンテンツデータに変換することが可能です。これにより、今後のMTのメジャーバージョンアップにも柔軟に対応できるようになります。

本当にそうなるかどうかは分かりませんが、コンテンツデータに移行させることで再構築時間の改善が見込まれるかもしれません。

2.プラグインについて

プラグインの詳細については下記のURLをご覧ください。

EntryConverterプラグイン
EntryConverterプラグイン

以下、ざっくりですがインストールおよび動作を紹介致します。

3.インストール

ダウンロードアーカイブを展開した、中にある「EntryConverter」フォルダをMovable Typeのpluginsディレクトリにアップロードします。

アップロード後、システム管理画面の「設定」→「プラグイン」で「EntryConverter」が表示されていればインストール完了です。

システム管理画面

4.コンテンツデータに変換

下記のような記事データが3件あります。これを変換してみます。

変換の状況

左メニューの「ツール」→「記事からコンテンツデータへの変換」をクリック。

記事からコンテンツデータへの変換

変換画面が表示されるので「実行」をクリック。

CSVのエクスポート画面

データ変換の状況が表示されます。

変換の状況

コンテンツタイプに「Entry」が作成されます。

変換の状況

コンテンツデータに「Entry」が作成されます。

変換の状況

カテゴリデータもカテゴリセットに移行されます。

Comments [0] | Trackbacks [0]

Finaleで弱起を設定する方法

January 15,2019 12:03 AM
Category:[Finale]
Tag:[Finale]
Permalink

Finaleで弱起を設定する方法を紹介します。

弱起

1.問題点

「弱起」とは、音楽用語で曲が1拍以外から開始することを指します。

ここに新規作成したFinaleの楽譜があります。

新規作成

これに弱起を設定したいのですが、方法がわかりません。

余談ですが、曲の最初が弱起の場合、最初の音の前に休符を書かないため、既定の拍数に満たない長さになります。

ちなみにこの弱起で開始する小節を不完全小節と呼び、小節数として数えません。

2.Finaleで弱起を設定する

Finaleで弱起を設定するには、「書類」→「弱起の設定」をクリック。

弱起の設定

ダイアログが表示されるので、弱起の音価を設定して「OK」をクリック。ここでは4分音符を選択します。

弱起の設定

これで弱起が表示されました。

弱起

Comments [0] | Trackbacks [0]

WindowsでExcelが強制終了する場合の対処

January 10,2019 12:03 AM
Category:[Excel]
Tag:[Excel, Office]
Permalink

WindowsでExcelが強制終了する場合の対処方法を紹介します。

1.問題点

Excelを開いて文字を入力した瞬間に強制終了されてしまいます。あるいは既存のExcelファイルを開いた瞬間に強制終了されてしまいます。

(クリックで拡大、以下同様)
コントロールパネル

この事象は2019年に入ってから発生しています。

2.原因

2019年1月2日にリリースされたMicrosoft Excel 2010の更新プログラム「KB4461627」が不具合を起こしているようです。

3.対処

問題を解決するには、下記の手順で更新プログラム「KB4461627」をアンインストールします。

「スタート」→「コントロールパネル」をクリック。

コントロールパネル

「プログラムと機能」をクリック。

プログラムと機能

「インストールされた更新プログラムを表示」をクリック。

インストールされた更新プログラムを表示

一覧から「KB4461627」を選択し、「アンインストール」をクリック。

アンインストール

確認ダイアログが表示されるので「アンインストール」をクリック。

アンインストール

アンインストールが実行されます。

アンインストール実行

これで「KB4461627」がアンインストールされました。

アンインストール完了

このあとExcelで正常に入力できるようになりました。Windowsの再起動は不要のようです。

4.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

MovableType 7のインストールで「必要なモジュールが見つかりません~HTML::Entities」というエラーになる場合の対処

December 27,2018 12:03 AM
Category:[インストール]
Tag:[MovableType, TroubleShooting]
Permalink

MovableType 7のインストールで「必要なモジュールが見つかりません~HTML::Entities」というエラーになる場合の対処方法を紹介します。

1.問題点

自宅のPCにMovableType 7をインストールしようとしたところ、下記のようなエラーに遭遇しました。

必要なモジュールが見つかりません
HTML::Entities
HTML::Entitiesは、CGI.pm の動作に必要です。
必須バージョン: 3.69

(クリックで拡大、以下同様)
必要なモジュールが見つかりません<

どうやら自分の環境にインストールされているHTML::Entitiesのバージョンが3.69より古いようです。

ということで、MovableType 7のインストールで「HTML::Entities」のバージョンエラーになる場合の対処方法を紹介します。

2.対処方法

CPANの「HTML::Parser」のページにアクセスして、「Download」をクリック(執筆時点のバージョンは3.72)。

CPANの「HTML::Parser」のページ

ダウンロードしたアーカイブを展開して、HTML-Parser-3.72/lib/HTML配下の下記のファイルを、MovableType 7のextlib/HTMLにアップロード。

  • Entities.pm
  • Filter.pm
  • HeadParser.pm
  • LinkExtor.pm
  • PullParser.pm
  • TokeParser.pm

extlib/HTML

これで再度インストールを実施すればエラーが解消します。

エラーが解消

3.参考サイト

参考サイトは下記です。ありがとうございました。

MTQ:Movable Type7 HTML::Entitiesのバージョンエラー

Comments [0] | Trackbacks [0]

MovableType 7のコンテンツタイプをCSVで管理する「CSVContentTypeImExporterプラグイン」

MovableType 7のコンテンツタイプをCSVで管理する「CSVContentTypeImExporterプラグイン」を公開します。

コンテンツタイプのインポート画面
CSVContentTypeImExporterプラグイン

これは「Movable Type Advent Calendar 2018」の23日目の記事です。

1.機能

MovableType 7で登場したコンテンツタイプですが、ひとつずつ手作業で設定を行うのは面倒です。

本記事の「CSVContentTypeImExporterプラグイン」を導入することで、コンテンツタイプをCSVで管理できるようになります。

2.プラグインについて

プラグインの詳細については下記のURLをご覧ください。

CSVContentTypeImExporterプラグイン
CSVContentTypeImExporterプラグイン

以下、ざっくりですがインストールおよび動作を紹介致します。

3.インストール

ダウンロードアーカイブを展開した、中にある「CSVContentTypeImExporter」フォルダをMovable Typeのpluginsディレクトリにアップロードします。

アップロード後、システム管理画面の「設定」→「プラグイン」で「CSVContentTypeImExporter」が表示されていればインストール完了です。

システム管理画面

4.コンテンツタイプのエクスポート

左メニューの「コンテンツタイプ」→「CSVのエクスポート」をクリック。

CSVのエクスポート

エクスポート画面が表示されます。

CSVのエクスポート画面

5.コンテンツタイプのインポート

左メニューの「コンテンツタイプ」→「CSVのインポート」をクリック。

CSVのインポート

インポート画面が表示されます。

CSVのインポート画面

インポートを実行すると状況が表示されます。

インポート時にコンテンツタイプ名および各コンテンツフィールド名を表示し、進捗がわかるようになっています。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages