FC2ブログ

ものの見方 ことばの能力

新たにふみをしたためる元気がないので、
とある場所でつぶやいたことを、
加筆修正のうえ、ここに書き出します。



いつも思うけど、

乗り物が人の命と人生を運んでいるという話は
大抵すっぽり抜け落ちてるよね。

一番考えるべき大事な話ってどこなんだろうと、
一度遠い目で見つめ直してみると、
ものの見方が変わるかも。

2年前の秋、人身事故の瞬間を見てしまった。
特急が人を轢いて、
しばらくして緊急車両のサイレンが鳴って、
辺りがにわかにざわつく。
子どもが大泣きしている。
あの瞬間を目撃したら、
その後の記憶に残らないわけがない。

ましてや、
事故そのものに巻き込まれた人のことを思うと、
胸が詰まる。

事故防止は目的ではない。
事故が惹起する人身傷害を食い止めることにある。
誰も乗り物に乗って
死んだり怪我したりを願っているわけはないのだから。



今はテレビニュースの中でも
ツイートの中身をどんどん報じるようになった。

双方向メディアを目指してここまで来たけど、
果たしてそれは本当に正しかったのか。
コミュニケーションの質を高めることになったのか。

いろいろな人とメールをやりとりしていると、
文章を組み立てて主張を人に伝える能力が、
またある程度の長さを持つ文章から内容を理解する能力が、
明らかに落ちていることを強く実感する。




【英国見聞録 No.9】カレドニアン・スリーパー

亀のようにのんびりと続くこの連載、もしもお付き合いいただいている読者の方がいらっしゃいましたら、誠にありがとうございます。
カープは見事に3連覇してくれましたが、鷹の鉄壁はどうしても破れなかったのが悔しいところ。夢というものは簡単には叶いません。丸と長野が入れ替わるという大ニュースが流れたのも記憶に新しいですが、盤石の布陣で次のシーズンも楽しみなところです。



島国イギリスでは、現在でも2つの寝台列車(スリーパートレイン)が運転されています。
ひとつは、ロンドンと西部のペンザンスを結ぶ「ナイト・リビエラ」、そしてもうひとつが、今回旅行記でご紹介する、ロンドンとエディンバラ・グラスゴー・インヴァネスなどを結ぶ「カレドニアン・スリーパー」です。

今回私が乗車したのは「ロンドン・ユーストン駅発、エディンバラ・ウェイヴァリー駅行」の便…のはずでした。列車には「グラスゴー・セントラル駅行」も併結されています。


Caledonian Sleeper
ユーストン駅で発車を待つ「カレドニアン・スリーパー」。
眼鏡がお似合いの女性の車掌さんが乗務。日本ではまず目にすることのなかった光景だ

使用される客車は、1964年登場の「マーク2」型と1975年登場の「マーク3」型です。
そのドアは昔ながらのイギリス客車のスタイルを継承し、ドアは手動式となっています。ドアノブは車外側にしか取り付けられていないため、車内から開ける場合にはドア窓を降ろしてから手を車外側に回し、車外側のノブをひねる必要があります。

なお、2018年春から客車を新形式に置き換える計画がありましたが、予定より遅れて今年2019年春からの投入予定となっています。ドアノブひねりを体験するのなら、ぜひお早目に。


列車は、1等・2等の寝台車と座席車で構成されています。
1等寝台車は1人用個室、2等寝台車は2段ベッドの2人用個室(1人利用の場合は相室)となっていますが、2等寝台車を1人で利用してもほかの利用者がいなければ実質的には個室になり、大変快適に利用することができます。


Caledonian Sleeper

Caledonian Sleeper
2等寝台車の個室。筆者は下段を予約したが、当日はガラガラで上段に客がおらず、実質的には2人用個室を独占することになった。
各寝台には、ミネラルウオーター・石鹸・耳栓・アイマスクなどのアメニティが無料でつく。
なお、窓際のスペースは洗面台を兼ねている


Caledonian Sleeper
寝台車の廊下。その狭さは今はなき日本の寝台客車と似たようなものだ

列車にはラウンジカーが連結されており、食事や飲み物を注文することができます。スコットランド料理を基本として、ビールやウイスキーも充実したメニューです。利用は1等寝台の利用者が優先となり、ラウンジが満席の場合には注文の品を自室まで届けてもらう形での利用が可能です。

Caledonian Sleeper
高級感あふれるラウンジカー

さて、目を覚まして車掌さんに用意してもらったコーヒーを楽しんでいると、小さな駅で列車が止まり、なぜか車掌さんに個室をノックされました。
車掌さん「エディンバラに行くなら今降りて。乗換よ。この列車はエディンバラには行かないわよ」
(窓の外のホームを見ると確かに乗客がぞろぞろ降りていく)
私「あれ、エディンバラまでの寝台券を買ったはずなのですが?」
車掌さん「今日は都合で全車両がグラスゴーに行くのよ…」
(少し考えて)
私「(もうちょっと寝台車に揺られたかったので)わかりました。ならこのままグラスゴーまで乗っちゃってもいいですか」
そんなやりとりをして、車掌さんもここで下車。
もともとその日はエディンバラとグラスゴーの両方を巡るつもりで、その日の晩までにリヴァプールに着ければ十分だったので、咄嗟の判断で巡る順序を入れ替えることにしたのでした。

さて、イギリスの乗車券には日本の鉄道のような「乗車券の運賃と特急列車の特急料金」の別はありませんが、寝台列車の寝台料金については、運賃とは別建ての設定となっています。
乗車する際は、運賃と寝台料金のセット料金を支払うか、我々外国人旅行者のようにレールパスを所持している身であれば、別途寝台券のみ購入するだけで乗車できます。
日本ではすっかり希少になった寝台列車での夜汽車旅、海の外に目を向ければ、まだまだ存分にお楽しみいただけますよ。ぜひ。



くわしいことは: カレドニアン・スリーパー 公式サイト (英語)


【英国見聞録 No.8】自動改札機

カープ連覇。
黒田のいない今年はどうなるかと思いましたが、投げても打っても皆が力を発揮し、
終わってみればダントツの一位でした。
今年こそは、日本シリーズで胴上げを目にしたいものです。

さて英国見聞録。

まさかこの原稿を書いてから1年放置しているとは思っていませんでした。
完全に失念しておりました…



イギリス国内の交通の主役はなんといっても鉄道ですが、その改札業務を省力化するために、こちらにもやはり自動改札機が設置されています。

世界で初めて現行方式の自動改札機を開発したのが日本の立石電機(現在のオムロン)であることはあまりにも有名ですが、それを端緒にして世界の鉄道駅には数多くの自動改札機が設置運用されています。

そもそも自動改札機導入前の日本では、旅客が立ち止まることなく通過できるように、改札係には改鋏の空打ち技術(改札掛は常に一定のリズムで鋏をカチカチと鳴らしながら客を待ち、客が乗車券を手渡すとそのリズムの中に乗車券を挟んで切符を切る…というもの)が発達するなど、とにかく短時間で多くの旅客をさばくことが求められてきました。
それを機械化するために開発された日本の自動改札機は、大量の旅客の流れを妨げぬよう、手前で投入した乗車券が奥の取り出し口で放出される形とし、旅客は歩いたまま改札を受けることができます。
その分どうしても機械が大型になってしまいます。
1台当たりの価格も、機能を絞ったタイプでも数百万円、高機能なものでは1千万円を超えるといわれています。

イギリスでも、都市の地下鉄の駅や、ナショナル・レール(旧国鉄)の主要駅の改札には自動改札機が導入されて運用されています。
ところが、当地の自動改札機は、オフィスビルの入館ゲートにあるような機械に似たような小型のものとなっています。
機械の下部に投入した乗車券は上部の取り出し口から放出され、それを取り出してからでないと改札の扉は開きません
それゆえ、改札を通過する際は一度、歩みを止めなければなりません。
そのため、どちらかといえば輸送量が中規模の鉄道に向いている改札システムであるといえます。

Ticket Gate
グラスゴー駅の自動改札機。
機械の手前に券を差し込むと、上部から放出される

Ticket Gate
ロンドン地下鉄の自動改札機。
黄色の部分はICカード用。磁気券も使用できる両用型だ

さて、日本では、自動改札機は基本的に「あるか、ないか」です。
先述のとおり、自動改札機を設置するとなると、人の流れを止めないよう工夫された日本発祥の大掛かりな装置を入れるということになります。
しかし、自動改札機を導入したい国内の駅が、どこも新宿駅のような膨大な利用者を抱えているわけではありません。
それなのに、新宿駅あるのと同じような装置が、地方に行っても当たり前のように設置されています。オーバースペックの装置を使っていることが少なくないのです。
確かに、同じ設計の装置を大量生産することでコストが下がる一面もありますが、実際のところは、輸送量に見合うスペックの装置が運用されているとはいいがたいのではないでしょうか。
むしろ、イギリス式の「取り出さないと通れない」装置にすることで、乗車券の取り忘れリスクも軽減できるかもしれません。

公的補助なく鉄道が運営できる世界的にも稀な国と評される日本ですが、少子高齢化の中にあってさらなる合理化と人件費削減は不可避な状況となっています。
完成されたシステムをなかなか変えたがらない文化が根付いていたりしますが、一度「改札の目的」に立ち返って、より効率的なシステムを考案することは難しくないと思います。



【英国見聞録 No.7】ロンドンのバス

Twitterのつぶやきは、なぜか他人からの伝聞調で書くとRTを多く集めるのですね。
そんなことを、先日参加した路線図ナイト3でも言っていましたが、実際その通りですから不思議なものですね。
ただ、Twitterという媒体が怖いのは、140字の字面を見た目のとおり受け止めて、その行間に筆者の主張をみること、その本文の主旨を考えることが疎かになりがちということだと思います。
大量のツイートが流れるタイムライン上でのつぶやきは、一目見て主張がわかるように書くことも必要な場面はあるわけですが、それにしても本来の主張が伝わりにくく感じることがあるのは残念に思います。
もっと本を読みたいと思う今日この頃です。


さて、前回の「英国見聞録」から長い時間が経ってしまいましたが、旅の記憶が失われないうちに続きをしたためたいと思います。
今回はロンドンを走るバスのお話です。

Big Ben
ロンドン名所・ウェストミンスター橋を渡るバス

チューブと並んで市民の足として親しまれているバスは、市内を縦横無尽に駆け巡り、しかも運行本数もとても多いことから、市内観光の移動手段として大変重宝します。

一部路線では24時間運行を行っており、チューブの終電を気にすることもありません。ロンドンが不夜城と呼ばれる一つの所以になっていたりもします。

オイスターカード利用の場合の運賃は、地下鉄ゾーン1一乗車2.40ポンド(執筆時点のレートで約340円)に対してバスは1.50ポンド(約210円)とお手頃価格に設定されています。
また、オイスターカードのキャップシステムの上限額も、バスのみ利用の場合には地下鉄より安く4.50ポンド(約640円)に設定されているため、バスを駆使して市内を回れば移動を安上がりにすることができます。
ちなみに、バス車内では現金の取扱を行いません。ICカードや定期券などの利用が必須となります。

Routemaster - ルートマスター
ロンドンバスの代名詞的存在、ルートマスター。
現在も動態保存車として数両が残存しており、通常系統の中に組み込まれて運転されている

ロンドンバスの特徴といえば、なんといっても2階建て(ダブルデッカー)であることです。
ロンドンバスの代名詞的存在であるルートマスター車時代からの伝統であるこのダブルデッカーは、EUが求めたバリアフリー規制の流れの中で一時は消滅の危機に瀕しました。
しかし、1階部分をノンステップにするなどして新型車両にも受け継がれることになりました。

Double Deckers
2階席の先頭部座席は、ロンドンの街並みを見下ろしながら巡るまさに特等席。
一度乗ればやみつきに

あるバスに乗車したときのこと。その2階席先頭部に乗り合わせたおじいさんと。

私「ここはとても楽しいですね」
おじいさん「そうだろう。だから私もここに乗るんだ。ロンドンの移動は地下鉄よりバスが一番だよ」

ちなみにそのおじいさん、以前日本に訪れ、箱根の温泉などを巡ったことがあると話していました。
遠い異国の地のバスの階上で、日本の話に花を咲かせる。なんと素敵なことだろうと思いました。



日本のバスでもICカードの導入は進んでいますが、未だに現金併用を廃止した例を聞いていません。
収受システムの二重化は交通機関の負担となり、それはそのまま利用者の運賃となって帰ってきます。
鉄道でもIC専用自動改札機の導入で効果を上げていますし、そろそろバスも現金廃止の流れが起きないものかと思うものです。

また、ロンドンでは成功しているバスの24時間運行、
東京でも時の猪瀬知事の主導のもと、2014年に渋谷~六本木間で試験運行が行われましたが、あっけなく失敗。
あれはどう考えても、深夜の東京人の動線を無視したものだったからに他ならないと思っています。
例えば、池袋~新宿~渋谷の副都心を結ぶ路線を作れば、深夜の飲み明けの初電前にそれぞれのターミナルに移動できるなど、いろいろの需要が考えられます。

さて、この街が3年後、世界にどのように映るでしょうか。



JSON勉強記

スマホ全盛、呼吸するようにTwitterをするという時代、正直、ホームページへのアクセス数など日に数十PVあればいいものです。
そのために日々デザインに凝ることは正直時間と労力の無駄遣いでしょう。

今はむしろ、自身のITスキルの勉強の題材として活用していることも多いです。
社会人1年目の私は、実はある会社で乗換案内のプログラムを作っていたりします。
「KR鉄道館」を運営する中で、HTMLからCSS、JavaScriptくらいは一通り経験していますが、C言語でさえ就職して初めて触ったもの。
なにぶんにもIT技術に関する専門教育を受けてきたわけではないため、実務のためには自分でいろいろ勉強してみる必要があります。

今回はサイトの情報をデータベース管理するため、JSONを導入してみました。
そもそも今ほとんどホームページを更新できていないのですが、たまに更新するときにいつも行っているルーチンワークで、こんな悩みがありました。

  • 更新情報の作成に、細かい作業が多く、煩雑である。
  • 更新情報をトップページと更新情報ページのそれぞれに同一内容を表示させているのに、それぞれ手作業で更新していたため、面倒である。

そこで今回、次のような仕様で、更新作業を簡略化すべく考えました。

  • 更新情報データはデータベース化して、複数のページから同じファイルに情報を呼びにいく。
  • HTMLを自動生成する際、トップページ用と更新情報ページ用で、生成方法を分ける。
  • トップページ用:データベースのうち最新の5件を表示する。
  • 更新情報ページ用:指定された年の情報をすべて表示する。
  • 見た目はJSON導入前後で変化しないよう配慮する。

「てつたのアルバム」も、各アルバム情報(タイトル、キャプション、作成日等)のデータベースを作り、そこから各ページを接続させて構築しているのですが、JSONをまともに知らなかった時分、JavaScriptの配列を使ってこれを実現していました。
しかし、JavaScriptの配列をそのままデータベースとして使うのはあまりスマートとはいえないため、もっときれいに作りたいと考えていました。

そこで今回は、JSONを使ってデータベースを作り、そのデータを基に自動でページ内容が更新できるようにしました。

1.データベースの作成


JSONでデータを作ります。今回はこんな感じにしてみました。

data.json
{
	"data" : [
		{
			"ymd"	:	20170218,
			"mark"	:	"a",
			"url"	:	"album/",
			"text"	:	"「増毛の記憶~2016」ほかアルバム3点を公開しました。"
		},
		{
			"ymd"	:	20160522,
			"mark"	:	"o",
			"url"	:	"selfintro.html",
			"text"	:	"「管理人紹介」を更新しました。"
		},
		{
			"ymd"	:	20160604,
			"mark"	:	"o",
			"url"	:	"link.html",
			"text"	:	"リンク集を更新しました。"
		},
		{
			"ymd"	:	20160529,
			"mark"	:	"o",
			"url"	:	"selfintro.html",
			"text"	:	"「管理人紹介」を更新しました。"
		},
		{
			"ymd"	:	20160405,
			"mark"	:	"o",
			"url"	:	"selfintro.html",
			"text"	:	"「管理人紹介」を更新しました。"
		},
		{
			"ymd"	:	19001231,
			"mark"	:	"m",
			"url"	:	"",
			"text"	:	"JSONテストデータ3"
		},
		{
			"ymd"	:	19001101,
			"mark"	:	"s",
			"url"	:	"",
			"text"	:	"JSONテストデータ2-1"
		},
		{
			"ymd"	:	19001031,
			"mark"	:	"si",
			"url"	:	"",
			"text"	:	"JSONテストデータ2"
		},
		{
			"ymd"	:	19000101,
			"mark"	:	"b",
			"url"	:	"index.html",
			"text"	:	"JSONテストデータ1"
		}
	],
	
	"markdef" : {
		"a" : "アルバム",
		"b" : "BVE",
		"s" : "駅",
		"m" : "動画・音",
		"si": "サイト",
		"o" : "その他"
	}

}

{ }(大かっこ)を使うと連想配列:オブジェクトを作成でき、「"key" : "value"」の形で値が設定できます。
また、[ ](角かっこ)を使うことで、0番から始まる各種プログラム言語でおなじみの配列をつくることができます。

今回はこれを組み合わせて、"data"のキーに各更新情報の配列をつくり、その中にそれぞれオブジェクトを作りました。
"ymd":更新日。データの整理に最も重要。
"mark":行頭のジャンルマーク。
"url":リンク先URL。ルートディレクトリを基準に相対パスで記述しています。
"text":更新情報文の本文。

最初の5件は実際に使うデータ、残りの1900年を指定したデータはテスト用のダミーデータです。

なお、"markdef"キーには、各ジャンルマークの記号に対する日本語名を定義しています。ジャンルマーク画像の代替テキストとして使用します。

2.JavaScriptコードの作成


そして、このJSONを呼び出すために書いたソースがこちらです。

updates.js
// HTTP通信用、共通関数
function createXMLHttpRequest(cbFunc)
{
	var XMLhttpObject = null;
	try{
		XMLhttpObject = new XMLHttpRequest();
	}catch(e){
		try{
			XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
		}catch(e){
			try{
				XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
			}catch(e){
				return null;
			}
		}
	}
	if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;	//ファイルの読み込み完了時の動作
	return XMLhttpObject;
}

// document.getElementById
function $(tagId)
{
	return document.getElementById(tagId);
}

function writeData(position, mode)	//ファイル名、表示するID、動作モード
{
	fName = 'updates/data.json'
	httpObj = createXMLHttpRequest(function(){displayData(position, mode)});	//クロージャにすると引数を収められる
	if (httpObj)
	{
		//リクエストのタイプを設定
		httpObj.open("GET", fName, true);
		//キャッシュは読みに行かせない
		httpObj.setRequestHeader('Pragma', 'no-cache');   
		httpObj.setRequestHeader('Cache-Control', 'no-cache');                    
		httpObj.setRequestHeader('If-Modified-Since', 'Sat, 01 Jan 2000 00:00:00 GMT');
		//リクエストを送信
		httpObj.send();
	}
}
function displayData(position, mode)
{
	if ((httpObj.readyState == 4) && (httpObj.status == 200))	//読み込み完了
	{
		$(position).innerHTML = parseJSON(httpObj.responseText, mode);
	}
}
// JSONのデータを解析して表示
function parseJSON(jsData, mode)
{
	var data = JSON.parse(jsData);
	var resultData = "";
	for(var i=0; i<data.data.length; i++)
	{
		//データを変数に収める
		var ymd		= 	data.data[i].ymd;	// 日付
		var mark	= 	data.data[i].mark;	// マーク記号
		var url		= 	data.data[i].url;	// URL
		var text	=	data.data[i].text;	// 情報内容
		
		var hit = false;
		
		if(mode >= 1900){	//年指定モード
			if(Math.floor(ymd / 10000) == mode){
				hit = true;
			}
		}
		else{				//表示数指定モード
			if(i < mode){
				hit = true;
			}
			else{
				break;
			}

		}
		
		if(hit){
			var showymd = (("0" + Math.floor(ymd / 10000) % 100).slice(-2)) + '.' + Math.floor(ymd / 100) % 100 + '.' + ymd % 100;
			resultData += '<p><img src="m_' + mark + '.gif" width="50" height="15" alt="' + data.markdef[mark] + '" class="umark">'
					+ showymd + ' ';
			
			//URL指定がないときはリンクを外す
			if(url != ""){
				resultData += '<a href="' + url + '">';
			}
			
			resultData += text;
			
			if(url != ""){
				resultData += '</a>';
			}
			
			resultData += '</p>';
		}
	}
	return resultData;
}



ページには次のようにしてコードを埋めました。

(<head>~</head>内)
<script type="text/javascript" src="updates/updates.js"></script>

(トップページ:<body>~</body>内)
<div id = "jsondata"></div>
<!-- JSON化 2017.2.18 -->
<script type="text/javascript">
	writeData('jsondata', 5)
</script>

(更新情報ページ:<body>~</body>内)
<div id="u_body2">
</div>
<script type="text/javascript">
	writeData('u_body2', 2017)
</script>

各ページから、writeData関数で指定したIDの位置に情報を出力します。
引数として、第一引数に出力先のID、第二引数に出力モードを設定しました。
第二引数の出力モードは、1900以上の時はその年の全データを出力、1900未満の時は最新のデータから指定した件数のデータを出力させることとしました。

writeData関数から呼び出すcreateXMLHttpRequest()関数で、まずAjaxのXMLHttpRequestオブジェクトを作成します。
このとき、引数に、JSONファイル(data.json)の読み込みが終了したときに行う処理を記載するのですが、関数を記載する際、そのまま「関数(引数)」と記述すると、指定した関数の実行前に引数の内容が評価され実行されてしまいます。
そうではなくて、ちゃんと必要な時にその引数を伴って関数が実行できるようにするために、クロージャの形を使って、処理させたい関数をもう一度"function(){}"の形で包んであげると、中身を実行させないで引数として渡すことができました(31行目)。

無事にXMLHttpRequestオブジェクトが作成できれば、このオブジェクトのhttpObj.onreadystatechangeの中に先の関数名を埋め込みます(18行目)。

ブラウザはJSONデータについて、結構キャッシュを利用してしまいます。
更新情報は常に最新のものを使用したいので、ブラウザのキャッシュは使用せず、都度ファイルを読みにいくように設定しています(37~39行目)。

さて、data.jsonが読み込まれると、関数displayData()が実行されます。
onreadystatechangeはreadystateが変化するたびに呼び出されますが、
readystate=4、status=200のときがロード成功を指すそうなので、このときに関数parseJSON()を呼びます。
この第一引数のhttpObj.responseTextに、data.jsonの文字列が入っています。

まず54行目で、eval()関数JSON.parse()がdata.jsonの内容を解釈してJavaScriptで使うオブジェクトの形に変換します。
「この関数一つでJSONを解釈できる、だからとても扱いやすい!」が標榜されているのですが、JSONの記述法は結構厳しめで、ここでちゃんとエラーなく変換できるまでに時間がかかりました。
現在eval()関数は推奨されていないということで、記法を訂正しました。ご指摘いただきました竹麻呂さま、ありがとうございました。(2/19 4:30)

更新情報データの一つ一つがオブジェクトとその配列で構成されているので、for文をぶん回して項目ごとに内容を解釈していきます(59~62行目)。
ここでやっと、HTMLから引き継いできた引数modeを使います。
modeが1900以上なら年指定モードとみなし、指定した年のデータのみを使うように処理します。
また、modeがそれ未満なら表示数指定モードとし、ループカウンタ変数iの値を利用して指定個数だけデータを抽出します。

抽出したデータだけを変数resultDataに蓄積して返り値としてリターンします。
$(position).innerHTMLを使って、positionに指定したIDの位置にデータを書き出します。
document.getElementByldという長ったらしいオブジェクト名を省略するために、$()という関数の形に括って出力しているそう。jQueryでよく使う記法らしいです。

こうして一日かけて更新情報データベースのJSON化が完成しました。
実際のところ、この工数にペイできるほど今後の更新があるのか未知数ですが(笑)、現在様々な分野で導入が進むJSONを学ぶいい機会になったと思います。

ITは目的ではなく手段でなければなりませんので、やりたいことを確実に実現させる方法として、必要なものはこれからも吸収していきたいと思っています。

参考文献



プロフィール

てつた

Author:てつた
KR鉄道館

元駅員さん。
社会人4年目の、法学部卒
へっぽこ新米プログラマー。
たまには旅に出たい。

カレンダー
09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
QRコード
QR