PHPで今日の0時のunixタイムを取得する

PHPで記事の投稿日時などを処理する時、その日時が今日なのか、昨日あるいはそれ以前なのかを判定したい場合があります。
そこで、今日の0時0分0秒のタイムスタンプを取得・比較することで判定する方法を考えてみます。

strtotime()で今日の0時0分0秒のUnixタイムスタンプを取得

strtotime('today') で今日0時のタイムスタンプを取得して、その前後を if()で比較判別する。
取得した値に 3600*24*n を加減算すれば n日前などの判別も可能。

strtotime()では他にも、'yesterday' で昨日、'tomorrow' で明日など、相対的な書式指定で様々なUnixタイムスタンプを取得できる。
また、月末の日を取得する 'last day of' も便利。

mktime()で上記と同じUnixタイムスタンプを取得

mktime(0,0,0) でも strtotime('today') と同じ結果が得られる。
mktime(8,0,0) で今日の8時丁度を取得する等、任意の時間を取得することも可能。
文字列の変換が無いので、たぶん一番軽い。

パラメータは mktime(時, 分, 秒, 月, 日, 年) で全て省略可能、省略時は現在の日時になる。

今日かどうかだけを判別する

タイムスタンプを使わずに、date()で今日現在の日付と $unix_timeの日付を比較して判定。
簡易的だが、2回date()で変換するので多少重いかもしれない。

if( date('Ymd') == date('Ymd', $unix_time) ){ ... }

Windows版PHPで日本語ファイル名が正しく扱えない問題について

Windows版のPHP(5.3~7.0)では、日本語等の全角文字(非ASCII文字)を含むファイル名の取得や指定に失敗することがあります。
例えば glob()や scandir()、RecursiveDirectoryIteratorなどのイテレータを使ってファイル名一覧を取得した時、一部のファイルが抜け落ちてしまいます。

原因

原因はどうやら二つあるようです。
一つは、Windows版PHPはShift_JISでファイル名を扱うようで、Unicodeを含むファイル名を無視してしまう為です。
もう一つは、いわゆる5c問題です。Shift_JISでは全角文字の2バイト目が \記号(16進の0x5c, バックスラッシュ)を含むことがあり、これがエスケープ文字やディレクトリ名の区切りと誤認識されてしまう事に起因する不具合です。

解決策

これに対する解決策はないかと、様々試行錯誤してみたのですが解決できませんでした。
glob()を使ってもイテレータを使ってもダメだったので、setlocale(LC_ALL, 'Japanese_Japan.932')や mb_internal_encoding('CP932')等で5c問題だけでも解決するかもしれないと思い試してみましたが、こちらもダメでした。
よって、Windows版PHP(5.3~7.0)では非ASCII文字のファイル名を全て正しく扱うことは残念ながら出来ないというのが結論です。

ただ、色々調べていて解ったことがあります。
実は、PHP5.2までは(恐らく5c問題については)大丈夫だったようなのです。
つまりこれは、PHP5.3以降、PHP7.0までに固有のバグだということです。
更にこちらの記事によれば、このバグはPHP7.1で遂に修正され、喜ばしいことにShift_JISの0x5cやUnicodeを含むファイル名もUTF-8で正しく扱えるようになるとの事です!やったー(´;ω;`)ウッ…

サーバ運用では日本語ファイル名をどうしても扱わなければならないケースというのはあまり無いとは思いますが、やはり正しく扱えれば有り難い事ですね。

テスト環境

PHP 5.6.15
Windows 10

参考


Firefoxの「最近のブックマーク」を非表示にする

Firefoxの最近のバージョンから、ブックマークメニューの最上位に「最近のブックマーク」が表示されるようになりました。
その為、他のブックマークの表示位置が下がってしまい、また見た目にもごちゃごちゃして邪魔だなぁということで、最近のブックマークの表示を消す方法をご紹介します。

実はとても簡単です。ブックマークメニューの中のどこでも良いので右クリックして、右クリックメニューの一番下にある「最近のブックマークを隠す(H)」を選択するだけで消えます。
もしも再表示したくなったら同様の操作で「最近のブックマークを表示(H)」を選択すれば元通りになります。

簡単にカスタマイズできるFirefoxは素晴らしいブラウザですね!( ー`дー´)

地震予測は不可能だと理解しなければならない

熊本地震で被害に遭われた方々に、心よりお見舞い申し上げます。
不安な日を過ごされている事と思います。早く穏やかに過ごせる日が来るよう願っております。

5年前の東日本大震災のことが、今でも忘れられません。人間の力は極めて弱く、自然の営みに抗うことはできません。しかし、被害を最小限に食い止めることは出来ます。人災は起こしてはならないのです。
この記事は拙い文章ではありますが、一人の方でも考えるきっかけにして頂ければと願います。


地震の予測は、ほぼ不可能です。
そう理解しなければなりません。

地震発生の予測(予知)が可能かどうかは、地震大国である日本ではとても重要で、よく議論される問題です。人命に直結する問題であり、できることなら可能であって欲しいのは勿論のことです。
しかしながら、知られている事実をよく考えてみれば、精度の高い地震予測を行うにはあまりにも情報が不足していることが判るのです。
(緊急地震速報は地震発生直後の地震波を捉え警報を出すシステムで、地震発生の予測ではなく地震波の到達予測です。従って信頼性が高い警報です。)

一点は、現在知られている地球の内部構造が、推測でしかないという事実です。
地球内部物理学が示す通り、人間が実際に地質を確認している範囲は掘削によるものです。それは半径約6371kmの地球の表面10km前後ほどでしかなく、それ以上深部の内部構造は地震波の伝播の違いなどによる科学的な推測でしかありません。
つまり私たちは、この地球の内部について、明確な事をほとんど何も知らないのです。

そしてもう一点は、地震予測に必要なデータが著しく不足していることです。
46億年という地球の長い歴史とくらべて、人間の歴史は極めて僅かな期間でしかなく、地震について詳細なデータを取るようになったのは更にごく僅かな期間です。
Wikipedia地震予知の「研究と政策の歴史」によれば、近代地震学の始まりは19世紀後半で、その歴史は百数十年です。人間の感覚では長いとも思えますが、仮にそれが150年としても、地球の歴史の3000万分の1の期間でしかないのです。

現在では、断層で起こるにせよ火山活動により起こるにせよ、プレートの変動が地震の発生に大きな影響を与えていると考えられていますが、その根拠となる理論プレートテクトニクスが発展したのは1960年代後半以降です。また、コンピュータによる詳細で正確な地震データを取れるようになったのは、コンピュータの発展の歴史から考えてやはりここ数十年のことでしょう。
何億年、何十億年という単位で活動を続けている地球の変化が、どのようなパターンで発生するかを知るには、あまりにも短すぎる期間であることは明らかです。
現在、一箇所の大地震の周期は百年から数万年とも言われていますが、一回の周期にすら満たない年数の情報で、そのパターンをどうやって推測できるでしょうか。

公的には、地震予測に使われる予算は多いですし、また心情的にも「現状では地震予測は不可能である」とは明確に言えないのだろうと思います。
ですが、本当は解らないにも関わらず出された、曖昧な予測に頼るとどうなるでしょうか。

熊本地震においては、震度6弱程度の余震が起こる可能性があると予測された直後、それを上回る地震が起こりました。更に翌日には、前日の本震を大きく上回る規模の地震が発生し、前日の地震は「前震」で、こちらが本震であるとされました。
例えば、6弱程度なら耐えられると考えられた建物があったとすると、前述の予測を信じ行動することはどんな結果に繋がるでしょうか。

地震の予測は、現在の知識と技術では不可能なのです。
プレート境界が多数集中している日本では、いつでもどこでも、大地震が起ってしまう可能性があるのです。大地震の発生の直後にも、更なる大地震が起こる可能性があるのです。ですから私たちは、地震予測に頼ることなく、必要な対策をしなければなりません。

予測が不可能である以上、まず必要なのは家屋の制震、免震、耐震性の向上でしょう。火災や津波に対する対策や避難対策も必要で、これは公的なレベルでも取り組まなければならない事です。そして大地震が起こった直後は、連鎖して大地震が発生する可能性が非常に高いですから、予測に頼らず最大の警戒をしなければなりません。
様々議論のある原発も、安全性を保証できない以上、やはり稼働させるべきではないのです。社会は経済的合理性の為ではなく、そこに生きる者の幸せの為にあるのです。

テーマ: 地震・天災・自然災害 - ジャンル: ニュース

JavaScriptで配列の文字列をsuffix付きで連結

前回記事の応用で、複数の文字列の末尾に同じ文字列(suffix)を付けて連結する場合を考えてみます。

var array = ['#aaa', '#bbb'];
var string = array.join('_suffix, ') + '_suffix';

結果(string)
#aaa_suffix, #bbb_suffix

前回の応用ですから、これは簡単ですね。ついでに配列の各要素の前後に文字列を付ける場合も考えてみます。

var array = ['aaa', 'bbb'];
var string = '#' + array.join('_suffix, #') + '_suffix';

結果(string)
#aaa_suffix, #bbb_suffix

やや見苦しいですが(^_^;)ループ文を使わないで済みますので、これで良しとしましょう。
配列が不変ならば全て文字列で書いてしまったほうが早いですが、配列内容や要素数が不定だったり、後で追加する可能性がある場合にはこの方法が便利です。

テーマ: プログラミング - ジャンル: コンピュータ