カレンダーの左上と右下は、それぞれ前月と翌月の日付でうっすらと埋められているじゃないですか。あれ、表現しようと思うとなかなか面倒ですよね。というか、面倒でした。どこかにロジックが転がっているだろうと思いながらも、探す手間と書く手間を天秤にかけ、書くほうを選びました。
カレンダーの左上の日付を取得する。
function getCalendarStartDate($date = null, $format = 'Ymd') {
if (!$date) $date = date('Ymd');
return date(
$format,
strtotime(
sprintf(
"%d01 -%d days",
date('Ym', strtotime($date)),
date('w', strtotime(date('Ym', strtotime($date)).'01'))
)
)
);
}
カレンダーの右下の日付を取得する。
function getCalendarEndDate($date =
null, $format = 'Ymd') {
if (!$date) $date = date('Ymd');
return date(
$format,
strtotime(
sprintf(
"%d +%d days",
date('Ymt', strtotime($date)),
6 - date('w', strtotime(date('Ymt', strtotime($date))))
)
)
);
}
strtotime とdate を使い過ぎなような気もしますが、パッと思いついたのはこの程度でしたし、とりあえず動いているので問題ないです。それにしても、strtotime の、'+2 days' とか '-3 days' とか '4 days ago' みたいな書式は便利ですよね。
カレンダーの左上の日付を取得する。
public static function getCalendarStartDate($date = null, $format = 'Ymd') {
if ($date instanceof DateTime === false) {
$date = new DateTime($date);
}
$date->modify('first day of');
if ($date->format('w')) {
$date->modify('last sunday');
}
return $date->format($format);
}
カレンダーの右下の日付を取得する。
public static function getCalendarEndDate($date = null, $format = 'Ymd') {
if ($date instanceof DateTime === false) {
$date = new DateTime($date);
}
$date->modify('last day of');
if ($date->format('w') != 6) {
$date->modify('next saturday');
}
return $date->format($format);
}
こっちのほうが全然Cool じゃん!
久々にPostgreSQL と格闘しなければいけなくなりました。ECCUBE は管理画面でできることはとても限られていて、複雑なことをやろうとしたら、直接SQL を書いてしまうのが手っ取り早いということがよくあります。
結果をただながめるだけでなく、Excel などでいろいろと加工したいこともあると思います。そういうときにはCSV で出力してしまうのが手軽でいいです。
psql [dbname] [username] -c '[SQL]' -A -F,
これでできます。(最後の「,」も誤植じゃないです)
-c より手前は接続に必要な各種情報が必要になります。-c はcommand の略で、postgresql のコンソールに入らずに、その場で指定したSQL を実行します。
-A はpostgresql の出力のフォーマッティング(桁揃え?)を抑制します。
-F は続く指定で、区切り文字を指定できます。-A オプションだけですと、カラムの区切りは|(パイプ)ですが、-F, とすることでその区切りを「,」にすることができます。
これで出力が綺麗なCSV になりました。必要であれば適宜ファイルにリダイレクトして、Excel などで加工すると良いと思います。
以上、10月はなにも書いていなかったので、埋め草的なエントリでした。
昔は一筆書きの問題が結構好きだったので、もし以前の僕であれば、こういうのにはすごく食いついたと思います。
【ネタ】あなたはこの問題解ける!?一筆書き画像まとめ - NAVER まとめ
でも、一筆書きはトポロジーの考え方を使うと、簡単に法則が導きだせ、少なくとも「それが一筆書きできるのか」と「どの点」で書き始めて「どの点」で書き終えればいいのかはあっという間にわかります。
一筆書きの問題としての線画がありましたら、まずその線画の、「交差点」及び「行き止まり」を探してください。
例えば「一」という形なら両端が「行きどまり」で「交差点」はありません。 例えば「田」という形ならT字路のような「交差点」が4つで十字路が1つ「行き止まり」はありません。 同様に「由」という形ならT字路3つ十字路2つ「行き止まり」はひとつです。 参考に「日」もやっておきましょう。T字路2つ「行き止まり」なしですね。
で、みつけた「交差点」と「行き止まり」を見て、そこから道路が何本でているか数えてください。「行き止まりは」は簡単です。もちろん1本です。T字路なら3本ですし十字路なら4本です。これはもっと複雑になっても、単に数えるだけでいいです。
そして、ここでちょっと専門的なやつらが登場します。その名も「偶点」と「奇点」。察しの良い方はこいつらの名前だけでピンときたかもしれません。さきほど見つけた交差点や行き止まりから出ている道路の本数が、偶数ならそこを「偶点」と言い、奇数ならそこを「奇点」と言います。
ようやく法則です。
「一」はやるまでもないですが、右か左、いずれかの奇点からはじめて、もう一方の奇点で終われば一筆書きができます。 「田」はT字路(奇点)が4つもあるので、できません。 「由」も無理ですね。 「日」は奇点が2つなので、いずれかのT字路で始めてもう一方のT字路で終えれば一筆書きできます。
とても簡単でしょう。
これじゃあ、始点と終点がわかるだけで、まだまだ一筆書きの解答までは遠いと思うかもしれません。しかし、実際にやってみるとわかると思いますが、始点と終点がわかれば、あとは結構適当に書いてもすぐ解答に至るものです。上記を踏まえたうえで、さきほどの問題集をまた解いてみてはいかがでしょうか。
【ネタ】あなたはこの問題解ける!?一筆書き画像まとめ - NAVER まとめ
で、この法則を知った直後は、一筆書きの問題がすごく楽しくなりますが、おそらく、しばらくすると、まったく興味がなくなりますw
トポロジーに興味を持ったかたはこちら
![]() |