漢字ROM代わりにnode.jsのCanvasで字形を取得
Qiitaのほうで、Raspberry Piのnode.jsで画像加工するためにnode-canvasを入れるっていうのを書いた。
なので、今後はインストールのところはすっ飛ばしコードばかり書く。
せっかくなので、Qiitaのほうで書いた漢字をバナーとして描画するコードに改良を加え、任意のフォントが指定できるようにしてみます。
作例に使ったmigu-1mは
より入手のこと。コンソール表示用日本語等幅フォントです。
'use strict'; // kanji.js: // node.jsでテキストバナーを表示します。 // use libs; var Canvas = require('canvas'); // Const var WIDTH = 80; var THRESHOLD = 0; // 描画 var Image = Canvas.Image; var canvas = new Canvas(WIDTH, 16); var ctx = canvas.getContext('2d'); ctx.antialias = 'none'; ctx.textBaseline = 'top'; //ctx.font = '16px Sans-serif'; var Font = Canvas.Font; var myFont = new Font('MyFont', 'migu-1m-regular.ttf'); ctx.font = '16px MyFont'; ctx.fillText("漢字ROM", 0, 0); ctx.stroke(); // ピクセル走査 var imageData = ctx.getImageData(0, 0, WIDTH, 16); for (var y = 0; y < 16; y++ ) { var text = ''; for (var x = 0; x < WIDTH; x++) { // RGBa text += (imageData.data[(x + y * WIDTH) * 4 + 3] > THRESHOLD ? '0' : ' '); } console.log(text); }
実行例はこちら。
pi@raspberrypi ~/test3 $ node kanji.js 0 0 00 0 0000000000 00000000000000 000000 0000 0 0 0 0 0 00 00 0 000 00 00 00 00 0000000000 00 00 0 0 00 00 00 00 0 00 00 00 00000000000000 0 0 0 0 000 000 00 00 00 00 00 0 0 00 00 000 000 000000000000 00 0 0 00 00 0 0 0 0 00 0 000000 00 00 0 0 0 0 0000000000 00000000000000 0 00 00 00 0 00 0 0 00 00000000000000 0 0 0 0 0 00 0 000000000000 0 0 00 00 00 0 0 0 0000 0 0 0 00 00 0 0 0 00 00 0 0 0 000000 0 0 0 00 00 00000 pi@raspberrypi ~/test3 $
Qiitaに書いたときの出力よりローマ字の形がよい。
指定するフォントファイルですが、鬼のようにセンシティブな取り扱いである商用DTPの世界のOpenTypeフォント群をしり目に、フォント・ドライバともに謎発展しているので、ともかく手持ちの日本語フォントで表示できるかどうか指定してみて、その後ライセンスを確認してがっかりしたりうれしがったりするって感じになると思います。
ピカリ館の単色LEDマトリクスパネルをRaspberry Piで光らす
akibaLEDピカリ館のLEDマトリクスパネルが2,380円で割とでかいのですが、
これをRaspberry Piを使って光らす。(前回のArduinoでやったやつはこちら。)
使ったRaspberry Piは、Raspberry Pi B+、プログラミング環境はnode.jsです。ほら、node.jsにしておけば、サーバにしたりWebSocketで通信したりしやすいでしょ……
ハードウェア
注意ですが電源はしっかりアンペアの大きい5Vスイッチング電源を用意して、電源からRaspberry Piの5Vとパネルの5Vに分岐させるように。一応Raspberry PiをUSBにつないだときの5V端子からパネルにつないでもパネル1枚くらいなら光るけれども、パネル3枚全点灯でテストしたら、5V・4.6A位になったので、マジにやるなら30W級の5Vスイッチング電源を用意しましょう。パネル自体は全点灯時の消費電力は公称10Wで、パネル3枚の点灯時は5V/50Wのスイッチング電源を推奨しています。
仮配線にはこちらが便利。
akizukidenshi-ogp-injector.dtpwiki.jp
akizukidenshi-ogp-injector.dtpwiki.jp
akizukidenshi-ogp-injector.dtpwiki.jp
3.3V→5Vレベルシフトについて(後日談:このパネルではいらないことが判明)
あと、信号線がRaspberry Piから出る分は3.3V、LEDマトリクスパネルの仕様は5Vなので、途中に汎用ロジックICの74HC4050を入れて電圧を合わせてあげましょう(レベルシフタ)。ちょうど3.3Vの信号線が6本なので都合がよい。74HC4050は秋葉原に行ける人なら、鈴商とかマルツにあります。単一方向の電圧レベルシフタでいいのなら、74HC4050が便利です。(追記:鈴商の店舗が2015/11末に閉まると エルミタージュ秋葉原 – 電子部品パーツの老舗、「鈴商」が11月末に閉店)
akizukidenshi-ogp-injector.dtpwiki.jp
- NXP 74HC4050 Hex non-inverting HIGH-to-LOW level shifter /datasheet(PDF)
- TI CD74HC4050 High-Speed CMOS Logic Hex Buffers, Inverting and Non-Inverting/datasheet(PDF)
(後日談)パネルを入手して一度光らせてから、あらためて実装部品のラインを追っていったところ、コネクタのすぐ後に74HC245(Octal bus tranceiver; 3-state)が入っていることに気づきました。これはパネルを連結したときに信号線の電圧が下がっている場合電圧を上げてあげるためのものですが、結局低電圧→5Vへのレベルシフタとしても動作します。 データシートでは入力の電圧は最大Vccまでを入れても良いとなっているので、Raspberry Piの3.3VのGPIO出力をそのままパネルの入力に入れてみましたがちゃんと光るし、次のパネルの接続用端子の出力も5V近くまで上がっていましたので、正直74HC4050は不要でした。 74HC4050は、今回のパネルに使われていた74HC245などのバスバッファのような低電圧系→高電圧系の機能に加え、高電圧系の信号ピン出力から低電圧系の入力へ橋渡しすることができるので、単一方向レベルシフタとしては使いまわしが効く便利なICです。
ピカリ館単色LEDマトリクスパネル(HUB12規格)について
このパネル、まずはA
,B
,LAT
,CLK
,DAT
,OE
が汎用ロジックICの74HC245(8チャンネルトランシーバ)を通ります。
コネクタのA
とB
のラインが(74HC245を通った後)汎用ロジックICの74HC138(3 to 8 デコーダ)の入力につながり、出力側でソースドライバのFETを駆動するのに利用されています。また、DAT
ラインとCLK
とLAT
が74HC595(シフトレジスタ)につながっていて、シンクドライバとして利用されています。入力データはDAT
(仕様書では/DAT
と書いてある)と負論理になっているのは、74HC595の端子が0Vになった時に、ソースドライバ側との電位差により吸い込みが発生し、LEDが点灯するからなのでした。
- NXP 74HC138 3-to-8 line decoder/demultiplexer; inverting /datasheet(PDF)
- NXP 74HC595 8-bit serial-in, serial or parallel-out shift register with output latches; 3-state /datasheet(PDF)
Raspberry Piで3線式シリアル通信(DAT
,CLK
,GND
)をする場合、SPIインタフェースを利用できます。DAT
⇔MOSI
,CLK
⇔SCK
に割り当てます。また、高級言語での実装を生かし多bitのデータ送信が一気にできる場合があります。今回利用したnode.jsのpi-spiは、node.jsの組み込みオブジェクトのBuffer
オブジェクトに構築したbit列をまとめて同期出力することが可能です。
パネルの表示シーケンスとしては、node.jsのpi-spiのコールバックにピン操作を固める都合上、
init {
OE: L // パネル消灯
}
loop {
SPI転送(DATとCLKを使い128個データを転送)
OE: L // パネル消灯
A :L
B :L // A=0, B=0 →ライン0を指定
LAT:H // ラッチ解除(シフトレジスタの出力ピン電圧反映)
OE :H // パネル点灯
LAT:L // ラッチ(シフトレジスタの出力ピン電圧固定)
SPI転送(DATとCLKを使い128個データを転送)
OE: L // パネル消灯
A :H
B :L // A=1, B=0 →ライン1を指定
LAT:H // ラッチ解除(シフトレジスタの出力ピン電圧反映)
OE :H // パネル点灯
LAT:L // ラッチ(シフトレジスタの出力ピン電圧固定)
SPI転送(DATとCLKを使い128個データを転送)
OE: L // パネル消灯
A :L
B :H // A=0, B=1 →ライン2を指定
LAT:H // ラッチ解除(シフトレジスタの出力ピン電圧反映)
OE :H // パネル点灯
LAT:L // ラッチ(シフトレジスタの出力ピン電圧固定)
SPI転送(DATとCLKを使い128個データを転送)
OE: L // パネル消灯
A :H
B :H // A=1, B=1 →ライン3を指定
LAT:H // ラッチ解除(シフトレジスタの出力ピン電圧反映)
OE :H // パネル点灯
LAT:L // ラッチ(シフトレジスタの出力ピン電圧固定)
}
こんな感じ。
ソフトウェア
OSとしては、Raspbian(wheezy)、プログラムは、node.jsで作りましたので、事前にraspi-config
でSPIが使えるkernelドライバを有効にしておくこと、node.jsをインストールすること、npm
でpi-spiとonoffをインストールすること、更にrootでの実行が必要となります。
node.jsのインストールは、OSのものはv0.6なので古すぎで、最低でもv0.10が欲しいところです。node.jsのサイトでは、v0.10がパッケージされて置いてあり、nodebrewとかnodeenvとかでインストールできるわけですが、せっかくなのでnode-armから入手できるv0.12.6(node_archive_armhf.deb)を入れます。
pi@raspberrypi ~ $ curl -LO http://node-arm.herokuapp.com/node_archive_armhf.deb pi@raspberrypi ~ $ sudo dpkg -i node_archive_armhf.deb (データベースを読み込んでいます ... 100% (データベースを読み込んでいます ... 現在 77859 個のファイルとディレクトリがインストールされています。) (node_archive_armhf.deb から) node を展開しています... node (0.12.6-1) を設定しています ... man-db のトリガを処理しています ... pi@raspberrypi ~ $ node -v v0.12.6 pi@raspberrypi ~ $
ライブラリのインストールはこんな感じ。
pi@raspberrypi ~ $ mkdir test pi@raspberrypi ~/test $ cd $_ pi@raspberrypi ~/test $ npm install onoff pi-spi \ > pi-spi@1.0.0 install /home/pi/node_modules/pi-spi > node-gyp rebuild make: Entering directory '/home/pi/node_modules/pi-spi/build' CXX(target) Release/obj.target/spi_binding/spi_binding.o SOLINK_MODULE(target) Release/obj.target/spi_binding.node COPY Release/spi_binding.node make: Leaving directory '/home/pi/node_modules/pi-spi/build' > epoll@0.1.13 install /home/pi/node_modules/onoff/node_modules/epoll > node-gyp rebuild make: Entering directory '/home/pi/node_modules/onoff/node_modules/epoll/build' CXX(target) Release/obj.target/epoll/src/epoll.o SOLINK_MODULE(target) Release/obj.target/epoll.node COPY Release/epoll.node make: Leaving directory '/home/pi/node_modules/onoff/node_modules/epoll/build' pi-spi@1.0.0 ../node_modules/pi-spi └── nan@1.9.0 onoff@1.0.2 ../node_modules/onoff └── epoll@0.1.13 (bindings@1.2.1, nan@1.8.4) pi@raspberrypi ~/test $
プログラムはこちら。
んで、node.jsなんですが、非同期処理・シングルスレッドがウリのnode.jsで同期処理やるためにコールバックで自分自身を再帰呼び出しするように作ってみましたが、Raspberry PiのOS自身の処理とかネットワークIO処理とかに巻き込まれループが一定の間隔で動くわけがなく、4ライン毎のダイナミック点灯の間隔が一定にならないのでした。
ピカリ館の単色LEDマトリクスパネルをArduinoで光らす
akibaLEDピカリ館のLEDマトリクスパネルが2,380円で割とでかいのですが、
これをArduinoを使って光らす。
使ったArduinoは、Arduino Duemilanove、Arduino IDE は1.0.6です。うちはArduinoは基本的にあとでATmega328Pで動かせるようにするので割と古いArduino使っています……
ハードウェアについて
注意ですが電源はしっかりアンペアの大きい5Vスイッチング電源を用意して、電源からArduinoの5Vとパネルの5Vに分岐させるように。一応ArduinoをUSBにつないだときの5V端子からパネルにつないでも光るけれども、LEDが最大128個同時に点灯する可能性があり(ダイナミック点灯だから512個全部は点灯しない)、最悪時は数字的に無理をしているのでやめよう。
仮配線には以下があると便利です。
akizukidenshi-ogp-injector.dtpwiki.jp
akizukidenshi-ogp-injector.dtpwiki.jp
ピカリ館単色LEDマトリクスパネル(HUB12規格)について
このパネル、コネクタのA
とB
のラインが汎用ロジックICの(74HC245 を通った後)74HC138(3 to 8 デコーダ)の入力につながり、出力側でソースドライバのFETを駆動するのに利用されています。また、DAT
ラインとCLK
とLAT
が74HC595(シフトレジスタ)につながっていて、シンクドライバとして利用されています。DAT
(仕様書では/DAT
と書いてある)と負論理になっているのは、74HC595の端子が0Vになった時に、ソースドライバ側との電位差により吸い込みが発生し、LEDが点灯するからなのでした。
- NXP 74HC138 3-to-8 line decoder/demultiplexer; inverting /datasheet(PDF)
- NXP 74HC595 8-bit serial-in, serial or parallel-out shift register with output latches; 3-state /datasheet(PDF)
Arduinoで3線式シリアル通信(DAT
,CLK
,GND
)をする場合、SPIインタフェースを利用できます。DAT
⇔MOSI
(pin11),CLK
⇔SCK
(pin13)に接続します。ArduinoのSPIは、1回につき8bitの転送が可能で、それ以上のビット列を送る必要がある場合は、複数記述、またはループで実現します。ビット列が細切れに送信されることになりますが、3線式シリアル通信はSCK
(クロック信号)による同期式なので問題はありません。
ソフトウェアについて
LAT
下げておいて、シフトレジスタに8bit値を16回転送してOE
下げてLAT
上げてOE
上げてLAT
下げる。
4ライン毎のダイナミック点灯になっているので頑張って切り替えるっつーかんじでした。
akibaLEDピカリ館で買ってきた単色LEDパネルな、うちのMicrosoftArcKeyboardよりもデカい
コントローラも1000位で売ってたが仕様書あったのでArduinoでとりま表示 シフトレジスター式 pic.twitter.com/9uLMEmsZVF
— CL (@CLCLCL) 2015, 8月 5
シャッタースピード適当だったのでご覧の有様だよですが人間の目レベルの動画では普通に均一に光りました。
当然次に進むのは表示部をタイマ割り込みにしてVDP化するっていうことだと思うけれどもVRAM操作時ちらつかないようにするために裏VRAMとかいう話になるし、回転とかいうとアフィン変換の話になって深みにはまりそう。
なお、お店に行けばWindowsで制御できるコントローラ基板売っているのでそっちの方がArduino買うより安い。まあなあ。
実は、アリババに鬼のように安価でたくさん同じ規格のLEDパネルが出ているのだけれども($5とか)、中国通販で買う手間と時間を考えると、ピカリ館に行ける人はお店で買えばいいし、国内でも通販で買えるので、急にLEDをペカペカしたくなった場合、思い立ったが吉日なのでいいのではないかと思います。中国通販だと、外国の方と英語でクレーム伝えて処理してもらうのけっこう疲れるし、香港で謎の渋滞とかわけわからんしな。
Adobe Creative Cloudオンライン販売は2015年10月から消費税課税になると思うよ
Amazon Kindle電子書籍の消費税不課税が2015年10月より課税になると今年初めにニュースが出ていたやつがどうなったのかなーと探していたがおそらくこのPDF資料で国外企業のデータ販売ビジネスにおける徴税のガイドラインが出ている。
ということで、法律だから平等に適用されるとすると、アドビストアのオンライン販売は、アイルランド法人が販売するってことで、パッケージ製品は消費税課税、ダウンロード販売製品は消費税不課税っていう現状から2015年10月以降は両方とも課税に切り替わると思われます。
実はアドビに消費税上乗せで振り込んじゃって不課税ってなにねっていうことで調べた。
(2015-07-27 23:57追記)
アドビに不課税の根拠をメールで聞いたら、上記の資料と、アドビの「特定商取引に関する法律に基づく表示」のページのURLをつけて、丁寧な説明をしていただきました。
2015年10月になったら改訂されそうなので、改訂前はこうだったんだよ、ていう資料になると思うので画像で置いておきます。
Pentium G3258とH81/H87/H97チップセットマザーボードでWindows 10 Insider Preview 10162がブートできない
追記:正式版までには修正されたようです(うちの環境では直ってる)
普段使いのマシンのダウンサイジングを画策していて、とりあえずMicroATXでH87マザーボード+Pentium G3258で組んだシステムをMiniITXのH81マザーボード+Pentium G3220にしたのですけれども、もとのマシン(つまりH87+Pentium G3258)に折角だからWindows 10を入れてみようと思ったら、Windows 10 Insider Preview ビルド 10162 ISOだとUSBフラッシュからブートしない。CD-Rからもブートしない。
しゃーないので、MiniITXのマシンのほうでUSBフラッシュとHDDをつなぐと、普通にブートして、インストールできる。このHDDをMicroATXのマシンにつなぐと、ブートしない。
「ありゃあ、マザボ壊したかな?」と思い、ドスパラからH97マザーボードを調達して、MicroATXの筐体に組み込んだのだけど、ブートしない。
「???」となって、UbuntuとかCD-Rに焼いてブートさせると、普通に起動する。
ここで、海外のサイトをあたると、どうもブートできないといっている人たちがみな「Pentium G3258」を使っているっぽい印象を受ける。マザボじゃないのか!
これを受けて、MiniITXのマシンのPentium G3220をひっぺがして、MicroATXのH97マザーボードに組み込みなおしたら、ブートした!
マザーボード | チップセット | CPU | Win10 10162ブート可 |
---|---|---|---|
ASRock H81-ITX | H81 | Pentium G3220 | ○ |
ASRock H81-ITX | H81 | Pentium G3258 | - |
ASRock H87M | H87 | Pentium G3220 | ○ |
ASRock H87M | H87 | Pentium G3258 | × |
ASRock H97M-Pro4 | H97 | Pentium G3220 | ○ |
ASRock H97M-Pro4 | H97 | Pentium G3258 | × |
○:ブート可 ×:ブート不可 -:試してない
マザボ買わなくてもよかった。メモリスロット増えたのでそういう方向で納得しよう。
それにしても、Adobe Creative Suite CS4の開発途中でPentium 4以降でしか動かなくなって、PentiumIIIのマシンだとベータ番号の途中でベータテストに参加できなくなったとかいう聞いた話を思い出した。
今回のWindows 10とPentium G3258の組み合わせは、定格周波数で使っていてブートしないっていうのだから、さすがに直ってくれるとは思います。
G3258(Anniversary Edition 3.20GHz) LGA1150
- 出版社/メーカー: インテル
- 発売日: 2014/06/28
- メディア: Personal Computers
- この商品を含むブログを見る
追記:
Windows 10 TH build 10240でもG3258で動かなかった
— CL (@CLCLCL) 2015, 7月 18
追記:
LGA1150対応H81/H87/H97/B85チップセットのマザーボードでは、通常は倍率変更可能CPUのオーバークロックができないのですが、一部の製品では、メーカー独自機能としてオーバークロックができるようになっています。この機能が、「Windows 7 for x64-Based Systems 用更新プログラム (KB3064209) 」により無効になるとのことです。Windows 10 IPでの更新では、ブートアップ中にリスタートの動作になるということのよう
ソースは2ch
コメントでいただいた情報の通り、ASRock H97M-Pro4マザーボードで、Pentium G3258のコア使用を1にすることで起動できています。
タイトルを変更 「Pentium G3258(オーバークロック用CPU)でWindows 10 Insider Preview 10162がブートできない」→「Pentium G3258とH81/H87/H97チップセットマザーボードでWindows 10 Insider Preview 10162がブートできない」
(2015-07-28 01:21追記)
Windows 10 TH 10240にいくつかのhotfixが適用された状態(msinfo32では"10.0.10240.16392"となっている)で、G3258での2コア&オーバークロック設定でブートできてます。正式版までに直ったね!
Linuxの/tmpディレクトリをリアルタイム監視(Perl使用)
Linuxの /tmp ディレクトリには様々なアプリケーションやデーモンが一時ファイルを格納する場所として使うわけで、ここへの書き込みや読み取りが頻繁だとシステムのスループットが下がったりします。
いまどきは、/tmpをLinuxのRAMディスクファイルシステムであるtmpfsに割り当てたり、システムディスク自体をSSDの様な高速なストレージにするみたいな方法でアプリケーション側の改変をせずに高速化できたりしていますが私の目の前にあるのはメモリ的に余裕がなく、なおかつディスクのIOPSがあまりよくない残念なサーバだったりするわけで、あろうことか/tmp に300MBも一気に書き込む奴がいるのでそのタイミングでシステム全体のパフォーマンスが落ちてヤバイ、ていうことになり、犯人捜しをするための、/tmp を監視するスクリプトを作りました。
実行すると、こんな感じになります。
$ carton exec perl watchtmp.pl 2015-06-28T06:46:44 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:46:44 access /tmp/#sql_4da_0.MYD 43410900 41.400MB 2015-06-28T06:46:46 access /tmp/#sql_4da_0.MYD 33128 32.352KB 2015-06-28T06:46:51 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:46:51 access /tmp/#sql_4da_0.MYD 929760 907.969KB 2015-06-28T06:46:51 access /tmp/zbxTMP21327 2384 2.328KB 2015-06-28T06:47:01 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:01 access /tmp/#sql_4da_0.MYD 39427836 37.601MB 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYD 2097152 2.000MB 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYD 1351680 1.289MB 2015-06-28T06:47:05 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:06 access /tmp/#sql_4da_0.MYI 1024 1024.000B 2015-06-28T06:47:06 access /tmp/#sql_4da_0.MYI 1024 1024.000B ...
PHPのイベント駆動よくわからんかったので慣れたPerlで作ってしまった……
一時ファイルは、生成されてから消えるまでが鬼のように短時間なので、/tmp を watch -n 1 ls -al /tmp
で1秒ごと監視していてもテンポラリファイルが観測されることが稀ですが、今回作ったのは、Linuxのinotifyでファイルシステムの変更時にイベントを取るようにしているので、割と引っかかってきます。
アプリケーションによっては、テンポラリの生成のアルゴリズムが違うので調整が必要。具体的にはmodifyで徐々にファイルサイズが成長してきた直後にaccessがくるタイミングを見て表示しています。ですが他のタイミングで見たいならスクリプトの中でいじればいいと思います。
今回は、MySQLが巨大テンポラリファイルを生成しているのが観測されました。そのタイミングでMySQLのPROCESSLISTで怪しいSQL文が特定できたので、それを修正することで対応ができたとさ。
それにしても、巨大テンポラリをHDDのようなストレージに書き出すとどんだけストールするか実感してもらいたいと思って具体的な数字をもって見せてみたのですが、今どきの子は、パソコンを自作していないからHDDの転送速度に関する規模感を持っておらず、何も効果が無かったのでした。
Chefのntp cookbook使っている人はpull&再適用しなくていいんですかね
前回のうるう秒挿入があった2012年7月1日は、私はまだ失職中(失業保険切れる寸前)だったため「うるう秒かぁ、NTPとかでなんとかなるのかなー」とか眺めていたら全国あちこちでサーバ不調が出てきてビビった。
で、今回は2015年7月1日9:00なんですが、ntpdの設定って割と簡単なのでさすがに自分でやることもあるまいとChefのopscode-cookbooksのntp Cookbookを使っていた人もいるかもしれません。
さて、ntp Cookbookには、「うるう秒ファイルが内包されている」っていう問題がありまして、これは原子時計由来の時刻と地球の運動との誤差を測定した結果その都度新しく配布されるものだからさすがに勝手に更新してくれないファイルなので、うるう秒ファイルが更新されたCookbookを調達して再適用しなくてはならないのです。
もっとも、CentOSの標準のntpdインストール時のデフォルトのconfだとleapfile指定は書いていないし、
ConfiguringNTP < Support < NTP
によればNTPサーバがうるう秒フラグを配信してくれない場合の予防線のような気がしますけれども、兎に角、opscode-cookbooksのCookbookとして提供されていたリポジトリでは2015年5月15日にntp.leapsecondsが更新されているっつーのは事実ですね。
ntp/ntp.leapseconds at master · gmiranda23/ntp · GitHub
ところで、その2012年のうるう秒から1か月後に入社した会社は、サーバ管理者が夜逃げしちゃった会社だったのですが、残された管理者メモには割と作業ログが詳しく書かれていたのに2012年7月1日の出来事には何も書かれていなかった……
2015年7月1日 9:00を何とか乗り切ろう!