ブログが続かないわけ

この日記のはてなブックマーク数
Webエンジニアが思うこと by junichiro

[PHP]カレンダーの左上と右下の日付を取得する

このエントリーを含むはてなブックマーク hateb

カレンダーの左上と右下は、それぞれ前月と翌月の日付でうっすらと埋められているじゃないですか。あれ、表現しようと思うとなかなか面倒ですよね。というか、面倒でした。どこかにロジックが転がっているだろうと思いながらも、探す手間と書く手間を天秤にかけ、書くほうを選びました。

カレンダーの左上の日付を取得する。

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' みたいな書式は便利ですよね。

[追記]コメントで教えて頂いたDateTime版

カレンダーの左上の日付を取得する。

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 じゃん!

12月はひとつも記事を書けませんでした

このエントリーを含むはてなブックマーク hateb

12月はひとつも記事を書けませんでした。ごめんなさい。

このブログは投稿のない月にアクセスすると、Not Found になってしまうので、ダミーでひとつ記事をあげておきます。

Train Base.

リフレクションってなかなかいいですね。もっと使ってみますね。

11月はひとつも記事を書けませんでした

このエントリーを含むはてなブックマーク hateb

11月はひとつも記事を書けませんでした。ごめんなさい。

このブログは投稿のない月にアクセスすると、Not Found になってしまうので、ダミーでひとつ記事をあげておきます。

京浜東北線と山手線。小さいころはなんとも思っていませんでしたが、どうしてなかなか、かっこいいですよね。上にいる小さい車両は300系新幹線です。

PostgreSQL でCSV に出力する

このエントリーを含むはてなブックマーク hateb

ECCUBE でPostgreSQL とやりあう

久々にPostgreSQL と格闘しなければいけなくなりました。ECCUBE は管理画面でできることはとても限られていて、複雑なことをやろうとしたら、直接SQL を書いてしまうのが手っ取り早いということがよくあります。

結果をExcel などで使う

結果をただながめるだけでなく、Excel などでいろいろと加工したいこともあると思います。そういうときにはCSV で出力してしまうのが手軽でいいです。

psql [dbname] [username] -c '[SQL]' -A -F,

これでできます。(最後の「,」も誤植じゃないです)

オプションの説明

-c より手前は接続に必要な各種情報が必要になります。-c はcommand の略で、postgresql のコンソールに入らずに、その場で指定したSQL を実行します。

-A はpostgresql の出力のフォーマッティング(桁揃え?)を抑制します。

-F は続く指定で、区切り文字を指定できます。-A オプションだけですと、カラムの区切りは|(パイプ)ですが、-F, とすることでその区切りを「,」にすることができます。

これで出力が綺麗なCSV になりました。必要であれば適宜ファイルにリダイレクトして、Excel などで加工すると良いと思います。

以上、10月はなにも書いていなかったので、埋め草的なエントリでした。

一筆書きはたった2つの法則で誰でも簡単に解けます

このエントリーを含むはてなブックマーク hateb

昔は一筆書きの問題が結構好きだったので、もし以前の僕であれば、こういうのにはすごく食いついたと思います。

【ネタ】あなたはこの問題解ける!?一筆書き画像まとめ - NAVER まとめ

でも、一筆書きはトポロジーの考え方を使うと、簡単に法則が導きだせ、少なくとも「それが一筆書きできるのか」と「どの点」で書き始めて「どの点」で書き終えればいいのかはあっという間にわかります。

一筆書きの問題としての線画がありましたら、まずその線画の、「交差点」及び「行き止まり」を探してください。

例えば「一」という形なら両端が「行きどまり」で「交差点」はありません。 例えば「田」という形ならT字路のような「交差点」が4つで十字路が1つ「行き止まり」はありません。 同様に「由」という形ならT字路3つ十字路2つ「行き止まり」はひとつです。 参考に「日」もやっておきましょう。T字路2つ「行き止まり」なしですね。

で、みつけた「交差点」と「行き止まり」を見て、そこから道路が何本でているか数えてください。「行き止まりは」は簡単です。もちろん1本です。T字路なら3本ですし十字路なら4本です。これはもっと複雑になっても、単に数えるだけでいいです。

そして、ここでちょっと専門的なやつらが登場します。その名も「偶点」と「奇点」。察しの良い方はこいつらの名前だけでピンときたかもしれません。さきほど見つけた交差点や行き止まりから出ている道路の本数が、偶数ならそこを「偶点」と言い、奇数ならそこを「奇点」と言います。

topology

ようやく法則です。

  1. 奇点が無い、または2個の場合一筆書きが可能である。
  2. 奇点が2個の場合、その一筆書きの解は、いずれかの奇点から始まり、もう一方の奇点で終わる。奇点が0個の場合、どこから始めても良く、始めた位置で終わる。

「一」はやるまでもないですが、右か左、いずれかの奇点からはじめて、もう一方の奇点で終われば一筆書きができます。 「田」はT字路(奇点)が4つもあるので、できません。 「由」も無理ですね。 「日」は奇点が2つなので、いずれかのT字路で始めてもう一方のT字路で終えれば一筆書きできます。

とても簡単でしょう。

これじゃあ、始点と終点がわかるだけで、まだまだ一筆書きの解答までは遠いと思うかもしれません。しかし、実際にやってみるとわかると思いますが、始点と終点がわかれば、あとは結構適当に書いてもすぐ解答に至るものです。上記を踏まえたうえで、さきほどの問題集をまた解いてみてはいかがでしょうか。

【ネタ】あなたはこの問題解ける!?一筆書き画像まとめ - NAVER まとめ

で、この法則を知った直後は、一筆書きの問題がすごく楽しくなりますが、おそらく、しばらくすると、まったく興味がなくなりますw

トポロジーに興味を持ったかたはこちら