2008-07-14

さあいこう!

http://coderepos.org/share/browser/events/phpframework/piece_framework/trunk

機能をすべて実装したものの、まだまだチューニングや見えざる敵(bug)との戦いが控えています。
俺たちの戦いはこれからだ!



r15761 号をもってコミットメントは終了です。
ご愛読ありがとうございました。

2008-03-26

PHP Simple HTML DOM Parser

PHP Simple HTML DOM Parser

これ面白い。

require_once 'html_dom_parser.php';

$dom = file_get_dom('http://www.google.co.jp/search?q=%E3%83%94%E3%82%AB%E3%83%81%E3%83%A5%E3%82%A6&lr=lang_ja&ie=utf-8&oe=utf-8');

foreach ($dom->find('a') as $node) {
    $node->innertext = str_replace('ピカチュウ', 'オプーナ', $node->innertext);
    $node->href = 'http://www.opoona.com/index.htm';
}

foreach ($dom->find('b') as $node) {
    $node->innertext = str_replace('ピカチュウ', 'オプーナ', $node->innertext);
}

print $dom->save();


なんか色々思いついたので、暫らくの間これで遊びます。

室内整頓中

ごちゃーっとしていることに嫌気が差した2008年、思い立って自宅室内にところ狭しと並べられていた家電、パソコン類を整頓することにしました。

手始めに、既に使っていないくせに何故か部屋の中に留まり続けていた小型のブラウン管TVや CRT ディスプレイを処分。
驚くべきことに4台にもなっていた自作パソコンも、機能面や用途面を含めてえいやと一台に集約して残りを排除。
うちに遊びにきた人は必ず反応していた3面もの液晶ディスプレイも、ワイド24型を1つだけを残して残りは排除。
テレビに接続されていた各種プレイヤも、HDDレコーダ1つを残して残りは排除。


と、ここまで一気に進めて室内スッキリし始めたところで、PC からアナログ線で繋いで利用していた古いステレオアンプ+スピーカーx2が何故か気に入らなくなり、デスクトップPC向けのエレガントな2.1chサラウンドシステムを IYH!(イヤッッホォォォオオォオウ!の意ですなわち衝動買い)。調整も済んでいい音を楽しんでますが、思い切りやってしまった感が。

家電はこんなところで、後日は本類に着手する予定。

2008-03-19

Piece_ORM で簡単データベース+PHPプログラム

Piece_ORM を使えば、だれでも簡単にデータベースを使ったPHPプログラムを書くことができます。(任天堂のCM風に。)

1. フォルダの作成

Piece_ORM を動作させるには、プログラムのファイルとは別に3つのフォルダを使います。
プログラムファイルを作成するフォルダ内に、次の3つのフォルダを作成します。
  • config
  • cache
  • mappers


2. データベース情報を準備する

次に Piece_ORM から接続するデータベースサーバの情報を設定します。
仮にデータベースの情報が

データベース: PostgreSQL
ホスト名: localhost

database : example
username : example_user
password : example_password

以上のようなものなら、先ほど作ったフォルダのうちの1つ、config フォルダの中に「piece-orm-config.yaml」という名前のファイルを作成し、次のように記述します。
- name: database1
  dsn: pgsql://example_user:example_password@localhost/example


3. テーブルを準備する

続いて、実際にプログラムから読み込みや書き込みを行おうとするテーブルを準備します。

データベース内の実際のテーブルは予め作成しておきます。ここでは「person」という名前のテーブルを作成したとします。

先ほど作ったフォルダのうちの1つ、mapper フォルダの中に「Person.yaml」という名前のファイルを作成します。中身は何も必要ありません。


4. プログラムを書く

最後にプログラムを書きます。書くプログラムは非常に短くて簡単です。

SELECT 文の SQL は次のようなコードを準備します。SELECT した結果のレコードがオブジェクトとして簡単に参照が可能です。

<?php

// Piece_ORM を読み込む
require_once 'Piece/ORM.php';

// Piece_ORM を設定する
Piece_ORM::configure('config', 'cache', 'mappers');

// person テーブルを対象にする
$mapper = Piece_ORM::getMapper('Person');

// select * from peron where id = 1;
$person1 = $mapper->findById(1);
echo $person1->name;    // name カラムを表示

// select * from peron where name = 'foo';
$person2 = $mapper->findByName('foo');
echo $person2->name;



INSERT, UPDATE, DELETE も簡単です。

<?php

// Piece_ORM を読み込みと設定
require_once 'Piece/ORM.php';
Piece_ORM::configure('config', 'cache', 'mappers');

// person テーブルを対象にする
$mapper = Piece_ORM::getMapper('Person');

// 新しいレコードとして INSERT
$person = new stdClass();
$person->name = 'foo';
$mapper->insert($person);

// name カラムを変更して UPDATE
$person->name = 'bar';
$mapper->update($person);

// DELETE
$mapper->delete($person);




詳しくはこちら

Piece_ORM のインストール
Piece_ORM のより詳細なチュートリアル

2008-03-13

iTunes ライブラリのデータ共有&バックアップ環境の最も簡潔な方法

音楽や動画などのデータを保存しているストレージ用のマシンとHDDがヘタれたので、ひとまず新しいHDDを買ってきたんですよ。この手のPCパーツを買うのは2年ぶりほどですけど、相変わらず暫らく遠ざかっているだけで性能アップと価格ダウンの進展が大きくて驚くばかりですよ。HITACHI の省電力仕様のHDD 500GB が 9000円でした。

で、タイトルにあるように iTunes ライブラリ(音楽データ、アートワーク、楽曲再生リスト)を新しい HDD に移しつつ、既存の再生環境でも正しく再生されるようにしないといけないなあと思ったんですね。気をつけないと「データが見つかりません」とか言われてデッドリンクが大量発生しちゃうし。
そこで、ふと気づいたんですよ。なんで今までこの方法が思いつかなかったんだろうと。google で調べても同じことやってるケースが一杯ヒットしているくらいだし。

iTunes ライブラリ用って1つのフォルダにまとめられているんで、そこをシンボリックリンクにすれば、参照先がどこに移動したって再生環境側は気にする必要がないんですよね。仮に再生側で再インストールしたとしても、ストレージ側の iTunes ライブラリをシンボリックリンクしなおせばすぐ元通りだし、今回のようにストレージ側が変わっても、これまた同じようにシンボリックリンクしなおせばすぐ参照できるようになる。

まずは現行の再生側の iTunes ライブラリフォルダをバックアップなどに移して、iTunes から認識できるライブラリフォルダが存在しないようにしときます。Windows ならば「マイミュージック」内に iTunes がない状態に。一方、実際の iTunes ライブラリフォルダがどこか別のところにある状態にします。ここでは仮に d:\music\iTunes あたりとします。

Windows 環境では通常シンボリックリンクをはる手段がないものの、MS の TechNet でシンボリックリンクを作る junction コマンドのプログラムが配布されているようなのでコレを使うとOK。windows フォルダや system32 フォルダあたりの実行パスが通っているところにコピーしたあと、コマンドプロンプトを立ち上げて以下のように junction コマンドを発行してあげればOK。

c:\Documnets and Setting\username> cd "My Documnets\My Music"
c:\Documnets and Setting\username\My Documnets\My Music > junction iTunes d:\music\iTunes


ちなみに Cygwin 環境があれば ln コマンドで同じことができます。

これで、見かけ上はマイミュージックに iTunes フォルダがあるように見えるものの、実際その中身は d:\music\iTunes という状況に。

再生側は全般的に c:\Documnets and Setting\username\My Documnets\My Music\iTunes として見えているので、これのシンボリックリンク先がネットワーク越しの異なるマシンなんてこともOKでしょう。複数マシンが1つの iTunes ライブラリを参照する状態になるので、どのマシンでもライブラリへの楽曲追加ができるし、共通の再生リストも利用できますね。

2008-02-20

Movable TypeにおいてSQLiteからMySQLへ手動でデータ移行する

うちの Blog で利用している Movable Type は SQLite でデータ保存を行っていたのですが、どうもその SQLite データファイルが、利用しているホスティングであるさくらサーバの容量に対して到底無視できない割合(1/4)を利用しているということが判明。事実、容量の空きが非常に苦しいものとなってきていました。
その一方、さくらでは別途 MySQL も用意されており、ユーザは www 用サーバとは別に準備されたいくつかの MySQL サーバのうちの1つを選択し利用できるというサービス体系になっています。

そんな利用状況なさくらサービス、ひょっとすると使用可能なホスティングデータ量ってば、利用可能なサーバ容量の範囲とは別でないかという甘い考えが思いついたことはさておき、そもそも SQLite よりも MySQL サーバを利用するほうが保持するデータ容量は少なくなるであろうという考えの元、SQLite から MySQL へデータ移行することにしました。

その際、当方の SQLite におけるデータ構造や SQL 内容の理解がないので、1つ1つ確認しながら出来るよう、大よそを手動で事を進めていきました。今回のケースは Movable Type におけるお話ですが、他のものにもある程度流用できるのではないでしょうか。なおデータベース、および SQL についての若干ながらの知識が必要になるかもしれません。(SQL エラーが発生した場合に対応できるとか。)


0. 環境

参考までに、今回の環境は以下のとおり。
なお作業はオーソドックスにすべて CLI ベースのクライアントで進めました。
  • MySQL 4.0.27
  • SQLite 3.3.17
  • Movable Type 4.0


1. Movable Typeのデータスキーマを MySQL 側に作成

まず MySQL 上に Movable Type のデータが格納できるよう、スキーマを作成します。
MT の設定ファイル(mt-config.cgi)内に記述されたデータベース接続設定を SQLite から MySQL のものへ変更し保存します。MT はかつて SQLite 環境で動いていたもので問題ありません。むしろこのまま MySQL へ移行しようとするので、へたに新しい MT の管理ページを作成する必要はありません。

続けて MT の管理ページへアクセスします。すると MT は MySQL 上に MT 用データが存在しないため、新規作成を行おうとしますので、これを進めていきます。MTユーザ登録などもあわせて行う流れとなりますが、内容を覚えておく必要はありません。

作成が完了した後、MySQL クライアントを使って、MT 用テーブルのデータを全て消去します。MT 用テーブルは、テーブル名の先頭すべてに「mt_」という接頭辞がついているものです。
テーブルの削除ではなく、データの削除であることに注意しましょう。データ削除コマンドは「truncate テーブル名」です。またその他のテーブルデータも消えぬことのないように…。

これで MySQL 側の受け口ができました。


2. SQLite のデータダンプ

続いて SQLite データをダンプします。

SQLite データは1つのファイルにまとめられている状態となっています。sqlite のコマンドツールはこのデータファイルを指定して実行する仕組みとなっています。またデータダンプは、sqlite の「.dump」コマンドで行います。たとえば SQLite データファイル example.db に対してのデータダンプは、CLI より以下のように実行します。

$ echo '.dump' | sqlite example.db > sqlite.dump.sql

SQLite データファイルの指定、および sqlite コマンドの違いに気をつけましょう。(さくらの場合、「sqlite3」コマンドでした。)

このコマンドの実行で、sqlite.dump.sql というテキストベースの SQL データが出来ました。


3. SQL データを MySQL 向けに編集

SQLite のダンプデータは、SQL 文によるデータベースの情報や操作が記載されています。
SQL は色々なデータベースで利用されているものですが、今回ダンプした直後の内容では一部 MySQL で利用できないものが含まれているので、これを編集します。
  • 一行目の「BEGIN TRANSACTION;」を削除
  • 最終行の「COMMIT;」を削除
  • その直前の「CREATE INDEX~」行をすべて削除

まず以上のことを行うことで、データ内は「CREATE TABLE~」と「INSERT INTO~」のみのものとなります。

本来ならば、ここから「CREATE TABLE~」のSQLもすべて削除し「INSERT INTO~」のみにすることで MySQL への投入準備が整うのですが、私の場合はここから「INSERT INTO~」文を編集する必要がありました。このままデータを INSERT してしまうと、MySQL 上では目的のデータ構造とは異なるものになろうとしていたからです。

例えば、ダンプデータ内の CREATE TABLE 文が
CREATE TABLE mt_placement (
  placement_id integer not null primary key,
  placement_blog_id integer not null,
  placement_category_id integer not null,
  placement_entry_id integer not null,
  placement_is_primary boolean not null
);

というものに対し、実際のこのテーブルへの INSERT 文は

INSERT INTO "mt_placement" VALUES (4,2,2,4,1);

となっていたとします。データベースに対して CREATE TABLE を行った後にこの INSERT を実行すると、以下のようなレコードができます。

mt_placement テーブル
---------------------
placement_id = 4
placement_blog_id = 2
placement_category_id = 2
placement_entry_id = 4
placement_is_primary = 1

一方、既に MySQL 上で準備されている mt_placement テーブルは、先ほどの CREATE TABLE のものと同じとは限りません。同じテーブル内容なものの、カラム順が異なるケースが実際にありました。(以下は一例)

CREATE TABLE mt_placement (
  placement_id int(11) not null auto_increment,
  placement_entry_id int(11) not null,
  placement_blog_id int(11) not null,
  placement_category_id int(11) not null,
  placement_is_primary tinyint(4) not null,
  PRIMARY KEY(id)
)
type = MYISAM;

この場合、同じ INSERT 文を行った mt_placement テーブルはこうなります。

mt_placement テーブル
---------------------
placement_id = 4
placement_entry_id = 2
placement_blog_id = 2
placement_category_id = 4
placement_is_primary = 1

カラム名を指定した INSERT 文ではないため、テーブル定義を行った順に INSERT が行われてしまい、結果違うレコードに仕上がってしまいます。

これを回避すべく、ダンプデータ内に記述されている CREATE TABLE 文のカラム順序どおりに、INSERT 文を編集していくのです。(説明長い!)


先ほどの、

INSERT INTO "mt_placement" VALUES (4,2,2,4,1);

これは、こうします。

INSERT INTO mt_placement
(placement_id, placement_blog_id, placement_category_id, placement_entry_id, placement_is_primary)
VALUES (4,2,2,4,1);

ついでにテーブル名のダブルクオートも排除。なお複数行でなくても一行でOK。

全ての INSERT 文において、対応するテーブルの CREATE TABLE 文で示されているカラム順に従った形で INSERT 文を書き換えていきます。

INSERT 文のすべてを書き換え終わった後に、CREATE TABLE 文をすべて削除します。
 


4. MySQL へデータを投入

編集後のファイルを MySQL へ投入します。
例えば MySQL のデータベース「my_database」に対して投入する状況において、3. のセクションで sqlite.dump.sql ファイルを編集後 mysql.import.sql として保存したのであれば、以下のようなコマンドを実行します。

$ mysql my_database < mysql.import.sql
必要に応じて -u, -p などのオプションをつけて、SQL が正しく実行できるようにしましょう。 またエラーが発生した場合は原因を良く確かめて import ファイルを編集し、truncate でもう一度リセットした上で再投入しましょう。 5. Movable Type 管理へアクセス
投入後再び Web で MT 管理ページへアクセスします。SQLite 環境で稼動していたものと同じものが参照、利用できるはずです。

2008-02-07

大乱闘スマッシュブラザーズX

1/31の発売からおよそ一週間たったWii用ゲーム「大乱闘スマッシュブラザーズX」、スマブラX。恥ずかしながら発売後ずっと遊んでます。

どんなゲームかというと、かつて「マリオブラザーズ」とか「アイスクライマー」とか「バルーンファイト」の2P協力プレイのモードを使って対戦をしていた人に直撃する、ポコポコと4人まで同時に遊べる大乱闘アクションゲームなのです。
また任天堂ゲームのいろんなキャラクターたちが集まって操作できるというのも1つのポイント。

ゲームの中で動くキャラクターやフィールドこそ3Dモデルなものの、昔ながらの2Dゲームのように左右キーで移動して上キー(もしくはボタン)でジャンプしてボタンで攻撃というシンプルな操作はもはやお馴染みなものだからすぐ慣れる。

「面白いよ!」といって初めての人にコントローラを渡してしばらく触っていると、すぐに大よその基本的な操作ができるようになるのは良いですねえ。そのまま4人でワーワープレイできて面白いです。
 
 
このスマブラXは今回で3作目なんですが、今回は「これまでの任天堂ゲーム」を匂わすギミックがこれでもかというほど多数盛り込まれていて、かつて任天堂のゲームで遊んだ数が多ければ多いほど、より楽しめるという仕組みになってます。なつかしい演出やフィールド、キャラクタそして音楽が、記憶の奥に沈みきっていた子供のころのゲームの思い出を呼び起こしてきます。

特に音楽は新旧あわせて約250もの曲が準備されているらしく凄いボリューム。任天堂ゲームの名作のなかの名曲がアレンジされて流れてきます。あまりに懐かしすぎ+出来が良すぎて涙腺が危なかったのはいよいよ歳ということかなあ。しかしファミコン、スーパーファミコン、ニンテンドー64くらいまでは分かるんだけども、最近のポケモンとかのゲームがよー分からんのが悔しい。
 
 
また今回はネットワークを通じて対戦できるというモードもあって、知ってる人とも知らない人とも遊べます。やってみた感じ、発売直後は(恐らくアクセスが殺到しすぎて)全然遊べなかったのですが、今週になってボチボチと乱闘できるようになりました。アクションゲームのネットワーク対戦って大抵の場合キャラクターがワープしたりとかいきなり攻撃を受けたりとかあるんですが、このスマブラはネットワークを介して遊んでいるとは思えないほどの滑らかさで遊べてしまうのがまた凄い。(なぜ今までの通信対戦ゲームと違うのかが知りたい。)

Wii持ってる知り合いは買ってないのかなあ。フレンド対戦やりたいなあ。集まった結果「じゃあ今日は2グループに分かれて遊ぼうぜ!」とかやりたいなあ。

2008-02-05

HTML_Template_Flexy 1.3.xx

1/31 に開催された勉強会in大阪でも一部の人には話をしていたんですが、その後少しだけ動きがあったので。

勉強会の前日である 1/30 に HTML_Template_Flexy のバージョン 1.3.0 がリリースされ、いくつかの小さな新機能が実装されたということになってます。
このパッケージ、実は DB_DataObject と同じ作者が開発、管理しておりまして。(実際、同日に DB_DataObject のバグフィックスとしてマイナーバージョンがリリース)
で、去年の9月東京で開催されたPHPカンファレンスで私の「ネタ」をご覧になった方はお分かりかと思いますが、この方のパッケージをリリースする際に「ちょっとした落とし穴」みたいなミスをすることがたまにあったりして、あるバージョンのリリース後にも細かなFixバージョンUPを短時間で積み重ねてしまうということがあります。

さて今回の Flexy 1.3.0 にて、少し魅力的な機能を試してみたく Ver.UP して動かしてみたのですが、何やらエラーが発生。どういうことだとメッセージをチェックしたりファイル構成や中身を確認してみると、なんと新機能を利用するため新規に追加された(であろう)クラスファイルが存在しないため require に失敗し、結果 new class できず Fatal が発生している。

「AKまたやらかしやがった!」(rsky へ送ったメールより)

どうやら CVS には新クラスファイルが存在しているものの、PEAR パッケージを作成するための package.xml 内にそのクラスファイルを記述していなかったため、結果 1.3.0 パッケージ内にファイルが含まれない状況になっていたのです。

多分、CVS にコミット済みのものやらローカルに存在しているソースやら何やらが分散したり、時間が経ったことで混在しているオープン・クローズなソースの状況を忘れてしまっていたりしてるんじゃないかと思います。(今回ファイルを忘れていた分に関しても、機能的な部分の実装は数ヶ月前でした。それでも一部ミスがあったようですが。)

なお、現在出ている 1.3.2 では、1.3.0 リリース時に提示した機能の一部をカットしているようです。現在リリース分のものと CVS 上のソースの内容が異なっているのを見る限り、恐らく再実装しなおして次バージョンがリリースするのではないかと思います。
いまのところ 1.3.2 では問題は特に出ていません。(PHP5 で動かすと「is_a 使うのやめろ」という要求が出るものの、エラーではないです。) flexy:include 内の src 指定に変数が使えるのは地味に便利だし(ちょうど目前の案件で必要そうなシチュエーションだったのでワロタ)、あと radio エレメント内で id 要素を指定しないと怒られてしまうというのもこのバージョンからなくなります。ただし、いくつかの radio で同 name 要素を持つエレメントに対し 同 id 要素を持たせるというのは相変わらず NG。なので今後も変わらずマークアップ担当者には別 id を使うか class を使ってもらうようにしよう!

そしてがんばれ AK!!

2008-01-25

ファミコン復活

年越し実家に帰った際、自分の部屋に残していっていたものをあれこれ物色していると、ファミコンの本体やらカセットやらを発見。ゲーム自体は最近では Wii のバーチャルコンソールで一部が遊べるものの、そういえば「ゲームセンターCX」で有野課長が実際にプレイしているのもこの旧来の赤白ファミコンだなあと思っていると、ふと今住んでいるところでこの赤白ファミコンが「現役で動いている」という環境であれば非常に Cool なのではないかという錯覚に陥ってしまい、実は持ってかえってきていたのでした。

この赤白ファミコン、実際に使っていた人は承知でしょうが、テレビと接続する際にはテレビの後ろにつなぐアンテナ線の間にファミコン用の白いアダプタのようなもの(RFスイッチというのだ!)をかまさなければならなかったんですね。でも頑張れば黄色線やら白線といったおなじみの「ビデオ端子接続」ができるらしいとのこと。インターネットって偉大だなあ。

日本橋にいってパーツを購入してきて、久々に半田ごてを使っての電子工作。学生時分に得た能力を遺憾なく発揮!




こんな感じで映像用の黄色線と、音声用の白線があり得ないところからにょきっと。
あとは AC アダプタもあわせて繋いで、「ビデオ」にチャンネルあわせてスイッチONすると、ファミコンが映る!「1チャン」ではなく!





左画面に赤白ファミコン、右画面に Wii のバーチャルコンソールで同じゲームを映すという、昔ではできないアホなシチュエーション。見た目の色の違いのほか Wii のほうが D 端子で映しているため綺麗に見える一方で、拡張音源を乗せたグラディウスII、実機のほうが音の出が良い印象(スネア音とか)。
これ、両画面にマリオを映して二人よーいドンでどっちが先にクリアできるかとかできるなあ。


あ、ちなみに、家から持って帰ってきたファミコンが元々調子が悪い上、調査中にショートしちゃったみたいで何も映らなくなってしまい、実はこれ日本橋で買ってきた2台目だったりします。

2008-01-24

Meadow での日本語取り扱い

普段使っているテキストエディタは相変わらず Meadow (Meadow3) なんですけど、実は密かに日本語の取り扱いが完全ではない状態で使い続けていました。

日本語の取り扱いに問題がないとは以下のようなもの。

(a) 通常の日本語文字群に加えて、NEC 特殊文字や NEC 選定 IBM 拡張文字といった拡張文字群が表示、編集できる。

(b) Shift_JIS, EUC-JP, ISO-2022-JP, UTF-8 などの日本語を取り扱う一通りの文字コードをすべてカバーし、表示、編集できる。また相互変換できる。編集後他のエディタで開いたときに弊害が出ない。

普通は当たり前の機能のような気もするんですけどこれがうまくいっていなくって、UTF-8 では拡張文字が正しく表示できないとか文字コードを変換して保存した際にマッピングが変になったりとか、これを Meadow2 に移行して以後3年以上は目を瞑りながらやってたのでした。不具合に出くわすとしても数が知れているほどなので(書くのはアルファベットばっかりだし)…。

とはいってもやっぱり気持ち悪いのでちゃんと調べてみたところ、以下の2点で記述されている utf-translate-cjk-mode 対策で無事クリアできました。拡張文字だけでなく「~」とか「×」とかの文字も地味~に「豆腐」や違うものに置き換わっていたりしてたのも解決!

utf-translate-cjk-mode
JIS X 0208 Extension

ちなみに元々は Mule-UCS での対応を目指していたんですが、拡張文字関連が設定次第であっちが豆腐になったりこっちが豆腐になったりでうまくいかなかったので断念。まあ元々 Unicode 関連はもう Mule-UCS に頼らなくても大丈夫だったはずだしね。

2008-01-22

1/31 PHP勉強会 at 大阪が Apple Store であるようです

1月31日 PHP勉強会 at 大阪を開催します

去年行われたPiece Network 1の懇親会でも話が出ていたんですが、ついに「PHP勉強会 at 大阪」として開催されるようです。しかも予定どおり Apple Store 内の施設!発表者募集中とのことで、ここはひとつ昨年の PHP カンファレンスのLTでだだスベリしたAlan Knowles漫談を関西初披r

そういうことはありませんが、参加したいと思います。

2008-01-04

2008年のごあいさつ

新年あけましておめでとうございます。2008年もどうぞ宜しくお願いします。
2007年の年末は自宅のNASが動かなくなったりとか何かとバタバタしていてあったんですが、今年も相変わらずな状態っぽいです。精一杯がんばります。

大晦日から年越し、そして元旦と実家で過ごすものの、元旦の夜に一人で生田神社に初詣し、本日は一人で鍋を堪能しました。うどんまでいきました。