日別アーカイブ: 2015-06-19

今日という日に

今日という日に何が

wikipedia

過去の今日という日に何が起きたかを調べるにはWikipediaを検索すれば明らかになります。Wikipediaを検索するAPIが用意されています。

URLアドレスhttp://ja.wikipedia.org/w/api.phpに検索する日付を付加してapi.phpを呼び出す方式です。たとえば以下のように指定します。 http://ja.wikipedia.org/w/api.php?action=query&export&format=txt&titles=2月9日

APIとはApplication Programming Interfaceの略でアプリケーションを作成する場合、すべて一から作り上げるのは骨が折れます。そこで既存の公知の事実を集大成して標準の技術を呼び出し確実にそして簡便にAPI効果を引き出せるような手続きのことを言います。APIはライブラリ、関数、ファンクション、DLL、サブルーチンなどの呼称と大差ないでしょう。但し、今ではアプリケーション作成に限定されません。

例にたとえるAPIによってその人の年齢や経験が推しはかられることになりますが、古い人間にはサイン関数などを挙げることができます。

この回で今日は何の日に関する記事はおしまいです。

参考資料

今日は何の日A

「今日は何の日」APIを作成しましたさんがわかり易く解説しています。 ソースコードをダウンロードし、日付を指定する部分を本日の日付が自動的に設定されるように修正しました。

また、コードの先頭にini_set(‘display_errors’, 0);を指定して Warning: Cannot modify header information ? headers already sent by (xxx)のエラー出力を抑制します。Warningエラーが出ないようにする根本解決策は見つからず、出力されても実行結果が正しいようなのでエラー非表示にしました。

今日は何の日

検索結果では、グレゴリオ暦で年始からの通算日Today’s Elementと1差、異なります。元日を0にするか1にするかの違いから生じます。 無料で使わせていただいて恐れ多いことではありますが、今年がうるう年かどうかは自明であり(閏年では〇〇日目)という文面を改訂していただければありがたかったです。

以下の検索結果は毎日、毎日、異なる結果になります。

“; echo “☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

“; $url = sprintf(‘http://ja.wikipedia.org/w/api.php?action=query&export&format=txt&titles=%s’, $mmdd); //echo $url.”

“; // 今日のトピックを取得 $dayTopicText = file_get_contents($url); // 今日のトピックXMLを作成 createDayTopicXML($dayTopicText, getMonthDayArgs(urldecode($_GET[‘monthday’]))); // 月日の引数を取得します function getMonthDayArgs($args) { // 引数が設定されていない場合 if(!isset($args)) { return date(‘n月j日’); } // 月日の形式ではない場合 if(!preg_match(‘/(\d+).+?(\d+)/’, mb_convert_encoding($args, “UTF-8”, “ASCII,JIS,UTF-8,SJIS-win,eucJP-win”), $matches)) { return date(‘n月j日’); } if($matches[1] < 1 || 12 < $matches[1]) { return date('n月j日'); } switch($matches[1]) { case '2': if($matches[2] < 1 || 29 < $matches[2]) { return date('n月j日'); } break; case '4': case '6': case '9': case '11': if($matches[2] < 1 || 30 < $matches[2]) { return date('n月j日'); } break; default: if($matches[2] < 1 || 31 < $matches[2]) { return date('n月j日'); } } return $matches[1] . '月' . $matches[2] . '日'; } // 今日のトピックXMLを作成します function createDayTopicXML($dayTopicText, $monthday) { // SimpleXMLをインスタンス化 $rootNode = new SimpleXMLElement('‘); // 今日のトピックを改行でスプリット $dayTopicArr = explode(“\n”, $dayTopicText); // 説明ノードを作成 $i = createDescriptionNode($dayTopicArr, $monthday, $rootNode); // 出来事ノードを作成 $i = createEventsNode($dayTopicArr, $i, $rootNode); // 誕生日項目を作成 $i = createItem($dayTopicArr, $i, $rootNode->addChild(‘birthday’), ‘忌日’); // 忌日項目を作成 $i = createItem($dayTopicArr, $i, $rootNode->addChild(‘anniversary’), ‘記念日・年中行事’); $dom = new DOMDocument(‘1.0’); $dom->loadXML($rootNode->asXML()); $dom->formatOutput = true; echo $dom->saveXML(); } // 説明ノードを作成します function createDescriptionNode($dayTopicArr, $monthday, $rootNode) { // 配列の数を取得 $arrCount = count($dayTopicArr); for($i = 0; $i < $arrCount; $i++) { // 月日の説明ではない場合 if(!preg_match(sprintf("/\'%s\'/", $monthday), $dayTopicArr[$i])) { continue; } // ルートノードに説明ノードを追加 $descriptionNode = $rootNode->addChild(‘description’); // 説明ノードに項目を追加 $descriptionNode->addChild(‘item’, removeExtraItems($dayTopicArr[$i])); break; } return $i; } // 出来事ノードを作成します function createEventsNode($dayTopicArr, $startIndex, $rootNode) { // 配列の数を取得 $arrCount = count($dayTopicArr); for($i = $startIndex; $i < $arrCount; $i++) { // できごとではない場合 if(!preg_match('/\=\= できごと \=\=/', $dayTopicArr[$i])) { continue; } break; } return createItem($dayTopicArr, $i, $rootNode->addChild(‘events’), ‘誕生日’); } // 項目を作成します function createItem($dayTopicArr, $startIndex, $node, $exitTitle) { // 配列の数を取得 $arrCount = count($dayTopicArr); for($i = $startIndex; $i < $arrCount; $i++) { // 終了条件のタイトルの場合 if(preg_match(sprintf('/\=\= %s \=\=/', $exitTitle), $dayTopicArr[$i])) { break; } // 有効な行ではない場合 if(!preg_match('/^\*.+/', $dayTopicArr[$i])) { continue; } $node->addChild(‘item’, removeExtraItems($dayTopicArr[$i])); } return $i; } // 余計な項目を削除します function removeExtraItems($item) { // 出典を削除 $result = preg_replace(‘/\{\{.+?\}\}/’, ”, $item); // マルチワードを削除 $result = preg_replace_callback(‘/\[\[(.+?)\]\]/’, removeMultiWord, $result); // < ~ >を削除 $result = preg_replace(‘/\&lt\;.+?\&gt\;/’, ”, $result); // 「en:」を削除 $result = preg_replace(‘/en\:/’, ”, $result); // 先頭の「* 」を削除 $result = preg_replace(‘/^\* ?/’, ”, $result); // 記号を削除 $result = preg_replace(‘/[\’\[\]]/’, ”, $result); return $result; } // マルチワードを削除します function removeMultiWord($m) { return preg_replace(‘/.+\|/’, ”, $m[1]); } ?>