Logical Rabbit.

さくらのVPS

備忘

PHP関連のメモ。

仕事でのメイン開発言語がPHPになったので。今までPHPをメインに使うことは無かったので(敢えて選択する理由が無かった)。お約束的な部分が色々分からんので自分用にメモ。

MySQL(MariaDB)に接続できないとき

  1. Socketが見つかっていない可能性を疑う
  2. php --ri mysqli とか php --ri pdo_mysql でパラメータをチェック
  3. Socketが設定されていない、もしくは正しくない場合は php.ini を確認
  4. そもそも何処の php.ini を見ているのか、と言う点を疑う
  5. 何処の php.ini を見ているかは、 php -i | grep php.ini とでもすれば分かる
    • 自分しか使わないマシンだったらとりま /etc/php.ini を設定していけば良いのだけど、ソースコンパイルしたPHP (php.7.1.1)だとそもそも <インストールディレクトリ>/lib/php.ini を見ていましたとさ。どっとはらい。
    • sudo ln -s /etc/php.ini <インストールディレクトリ>/lib/php.ini としたところ、/etc/php.ini を見るようになりました

CentOS 7でBB無線ルータを組んだ時、無線LANから有線LANへWoL信号を飛ばしたい。

CentOSでイチからBB無線ルータを構築した際、ポートを越えてWoL(Wake on LAN)信号を飛ばす方法がようやく分かったのでメモ。…これでいいんだよ…ね?

前提条件

  • CentOS 7を2ポート有線LAN+無線LANのマザーボード(MSI製 Z97I AC)にインストールしてBBルータを構築
  • 有線LANの1つ目をインターネット側光ケーブルのOSUに接続、有線LANの2つ目と無線LANはイントラネットとして設定
  • イントラネットは基本的にdhcpdによるIP払い出し、主要なマシンのみIP固定
  • 有線LAN(イントラ)と無線LANは同一セグメント

方法

  1. /etc/dhcp/dhcpd.conf にて、DHCPにおいてMACアドレスとIPアドレスを固定で紐づける
  2. arp -s <IP address> <MAC address> としてARPテーブルにおいてMACアドレスとIPアドレスを固定で紐づける
  3. firewall-cmd --add-port=9/udpとしてWake on LANが使用するポート番号9(UDP)を解放する
  4. Wake on LANするときは対象マシンのIPアドレスとポート番号を指定して送信する(同一ポート上で実行する場合はブロードキャストモードで送信するか、IPアドレスとしてブロードキャストアドレスを指定して送信している筈)。

firewalldでMACアドレス指定の信号をポート間で通すとか、ブロードキャストを通すとかできれば済むような気はしていたのだけど、私の実力じゃ調べきれず、結局この方法で解決できたのでまあ良しとしたい。ポート9(UDP)がフル解放されている気がしないでもないが…うぅむ?

arpテーブルに気付いたのは、対象マシンを止めた直後であればWOLが通るので、もしかしてIPアドレスが誰に割り振られているのか分からなくて迷子になってるんぢゃね? と。マシン停止直後だとDHCPのリースとか生きてるだろうから、その辺を固定化してやればいいんぢゃね? という具合。

なおCentOS 7だとarpではなくip neighを使うべきらしいのだけど、Blogに纏めるにあたり試してみたもののこちらのコマンドでテーブルに追加する方法がうまくできず断念したなど。

本当はWake on LANのマジックパケットの仕組みとかから調べ始めていたのだけど(うまく通過できないから専用のサーバ立ててしまえばいいんじゃね、とか思った)、この辺りって軽くググった程度だとうまく見つかりませんね…? まあ結局無駄なこと調べていたっぽいけど。

購入検討中の書籍メモ (2016.09)

…という名目のアフィリエイトリンク集。実際に買うか、いつ買うかは未定だけど気になっている本。全て電子版あり。実際に買ってレビューする気になったら別記事に分けると思われ。

ユーザーストーリーマッピング

実装技術というよりその1段上、ハンドリングとかディレクション系の本と理解。個人事業もしくは零細企業規模の職場でシステム開発をすると、どうしても発注主の意図を汲みつつ方向性をまとめたり調整したりする必要が発生するので、たぶんまとめて全体を把握した後、後々まで読み返すような使い方になるんじゃないかなー、と期待してます。

未購入(物理書店で軽く内容把握)、AmazonのほかオライリーのEbook Storeで販売中。

開眼!JavaScript

発行はかなり前なんだけどそういえば未読だったし、JavaScriptはどうしても「なんとなく」で使って覚えてしまっている部分が多いので、たまに基本を読み返すのに良いかな、と思った次第。ページ数も少なく、気になるところだけ流し読みするのにも良さそうだし。詳細は「JavaScript」とかをあたることにして、全体の復習はこちらで随時行う方向で。

未購入(物理書店で軽く内容把握)、AmazonのほかオライリーのEbook Storeで販売中。

現場でかならず使われているjQueryデザインのメソッド

個人事業やるようになって、やはりjQuery等でお手軽かつ見目良くWebサイト開発する需要は高いなぁと思うと同時に、自分自身のデザインバリエーションが少ないことを痛感してます。なにせ今まで「動けばよい」の世界というか「チェックマトリックスでテストできることが最優先のデザイン」の世界だったので「画面幅によってデザインが変わる」ような一般的な設計とは縁遠かったわけで(設計書どおりのデザイン配置にならないのはバグなので、画面幅を強制固定するのが正道、TABLEレイアウトこそ至高、の世界)。

デザイン(動き)さえ分かれば技術的には自分で考えて実装できると思うのですが、まあ使えるスペアタイヤがそこに転がっているのに使わない手も無いだろうと。

ということでサンプル集的な用途を期待。Webで色々見つけてくるのも、技術検証とか著作権確認とかが面倒になってきたから。

未購入(物理書店で軽く内容把握)、Amazon kindle版あり。

DELLの25インチモニター U2515H を購入した。

購入してから10日、概ね安定してきたようなのでレビューを書いてみるなど。結論としては、もう一枚買っても良いかもなー、的な。

ディスプレイ モニター U2515H。通称ゆーちゃん(違う)

スペックとしては25インチIPSノングレア、WQHD(2560x1440)、sRGB99%です。これで5万円弱なのでかなり安い印象。27インチフルHD超になると10万円くらい見ておかないといけないので、ちょっと二の足を踏んでいたところなのでした。

非DELLの汎用モニターアームで使っていますが、標準装備のディスプレイスタンドもかなり使いやすそうではありました。ただ今の机環境だと、机にスタンドで置いてしまうと画面と顔との距離が近すぎてしまうので…。

解像度は十分です。Teraterm + tmuxで使っていますが、フォントサイズ14ptで縦70行(プラスviのステータス行+tmuxのステータス行)表示できます。フォント10ptだと流石に少し見づらいか。また、Windowsキー+横キーで画面半分に寄せても、tmuxの縦2列で77桁出てます。普段はフル画面縦2列を基本にしていますが。

ハード面の機能も使い勝手が良いです。まず背面のディスプレイスタンドは工具なしで付け外しが可能。ツメで止まっているので、斜めに差し入れて垂直に戻すと自動的にロックされ、外すときはボタンを押して斜めにすれば外れます。

スタンドを止める場所は一段くぼんでいて、その中にVESAマウントのネジ穴が、ネジ付で収まっています。ネジを外してモニターアームを取り付ければ完了。しかしアーム側に付いていたネジが余ったぞ(汗) 写真を見る限りDELL純正のモニターアームならばスタンドと同様に工具レスで取り付け・取り外しできるようなので、そちらを買ったほうがまとまりが良かったかも知れませぬ。うちには既にモニターアームが3つ転がっていたので、純正品を買うのは止めたのですが…。

入力端子はHDMI×2、DisplayPort×1、mini DisplayPort×1、その他USB 3.0 HUBが付いています。D-SUBとかDVIが無いのはまあ致し方なし。DP-MiniDPのケーブルが同梱されているので、DisplayPort対応のビデオカードだと最強の組み合わせかもですね。うちはHDMI出力なのでHDMIに入れていますが。

当初モニタがノイズ出まくったりブラックアウトで点滅したり、特にMikuMikuDanceとかをフル画面で出すと頻繁にブラックアウトするのでビデオカードへの高負荷が原因、買い替えかなぁと思っていたのですが、ビデオドライバを最新に更新し、HDMIも切り替え機を通さず直結したら安定稼動になりました。おそらく最大の原因はHDMI切り替え機と思われ。先代はHDMIが1ポートだけだったので切り替え機を通していたけど、今回は2ポートあるので切り替え機が使えなくても特に困ることは無いでしょう。

なおビデオカードはNVIDIA GeForce GTX750 DDR5 2GBです。これをHDMI(WQHD)、DVI(UXGA)、D-SUB(フルHD)の3画面出力で使用中。

DELLが基本的にネット直販で現物を見ることが出来ないのと、公式ストアでも海外からの発送になって衝動買いに向かないところなのですが、Amazonにプライム対応即納品があったので(しかも公式ストアより安い)、こちらでポチることにしました(事前に横浜ヨドバシカメラのDELL売り場行ったのだけど、該当品が無かった…)。

CentOS 7 でコマンドラインからBluetooth接続を操作する

bluetoothctl を使えばイイっぽい。root権限が必要っぽい?

コマンド自体はbluezパッケージに入っています。特にインストール指定した記憶は無いので、X Windowとか入れてやれば入ってくるもの、かも。ところでこのパッケージ名、なんかトイレに置くだけのアレを連想するのはあたしだけですかね…?(ヤメロ)

$ yum info bluez
インストール済みパッケージ
名前                : bluez
アーキテクチャー    : x86_64
バージョン          : 5.23
リリース            : 4.el7
容量                : 3.7 M
リポジトリー        : installed
提供元リポジトリー  : base
要約                : Bluetooth utilities
URL                 : http://www.bluez.org/
ライセンス          : GPLv2+
説明                : Utilities for use in Bluetooth applications:
                    :         - hcitool
                    :         - hciattach
                    :         - hciconfig
                    :         - bluetoothd
                    :         - l2ping
                    :         - rfcomm
                    :         - sdptool
                    :         - bccmd
                    :         - bluetoothctl
                    :         - btmon
                    :         - hcidump
                    :         - l2test
                    :         - rctest
                    :         - start scripts (Red Hat)
                    :         - pcmcia configuration files
                    :
                    : The BLUETOOTH trademarks are owned by Bluetooth SIG, Inc.,
                    : U.S.A.

例えば MCO TK-BT01 キーボードを接続すると以下のような感じ。MACアドレスは各々XXとYYの羅列にマスク、hostnameはログインしている機体のホスト名が出ますが、一応マスクで。

$ sudo bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX hostname-0 [default]
[NEW] Device YY:YY:YY:YY:YY:YY MCO TK-BT01
[bluetooth]#
[bluetooth]# devices
Device YY:YY:YY:YY:YY:YY MCO TK-BT01
[bluetooth]# connect YY:YY:YY:YY:YY:YY
(ここでBluetooth機器側も接続待機にしませぅ)
Attempting to connect to YY:YY:YY:YY:YY:YY
[CHG] Device YY:YY:YY:YY:YY:YY Connected: yes
Connection successful
[bluetooth]#

connect <MAC ADDRESS> の時点でBluetooth機器側が接続待機になっていないと、以下のような感じになります。

[bluetooth]# connect YY:YY:YY:YY:YY:YY
Attempting to connect to YY:YY:YY:YY:YY:YY
Failed to connect: org.bluez.Error.Failed
[CHG] Device YY:YY:YY:YY:YY:YY Connected: yes
[CHG] Device YY:YY:YY:YY:YY:YY Connected: no
(以下yesとnoの繰り返し)

このコマンドmanがインストールされてないし --help してもろくな内容が出てこないのだけど、基本コマンド名だけで起動、対話的に操作するものっぽい。取り合えず [bluetooth]# help とやればサブコマンド一覧が出るので、それを見ながらやれば良さげ。

[bluetooth]# help
Available commands:
  list                             List available controllers
  show [ctrl]                      Controller information
  select <ctrl>                    Select default controller
  devices                          List available devices
  paired-devices                   List paired devices
  power <on off="">                Set controller power
  pairable <on off="">             Set controller pairable mode
  discoverable <on off="">         Set controller discoverable mode
  agent <on off="" capability="">  Enable/disable agent with given capability
  default-agent                    Set agent as the default one
  scan <on off="">                 Scan for devices
  info <dev>                       Device information
  pair <dev>                       Pair with device
  trust <dev>                      Trust device
  untrust <dev>                    Untrust device
  block <dev>                      Block device
  unblock <dev>                    Unblock device
  remove <dev>                     Remove device
  connect <dev>                    Connect device
  disconnect <dev>                 Disconnect device
  version                          Display version
  quit                             Quit program
[bluetooth]#

無線LANの感度を上げるために部屋の天井近くに配置した機体、基本はssh操作なのだけどたまーにコンソール(X Window)ログインする必要があって、BluetoothがあるからBluetoothキーボードで操作すればいいいや…と思っていたら再起動するとBluetoothのペアリングが消える? ので面倒くさかったのですが、これならまずsshでログインしてキーボードをペアリング、その後コンソールログインすれば良さげな感じ。

と言うわけでキーボード的にはミヨシのTK-BT01がおススメです。テンキーの無いコンパクトキーボードながら、トラックボールとホイールまで付いており、PC、Mac、Android、iOSのフルサポートという逸品。前機種にあたる専用ワイヤレスアダプタのときは不可能だった、トラックボールの取り外し掃除も簡単になりました…っ(これは嬉しい)

PRIMERGY MX130 S2にCentOS 7を入れたらハマった。

AMD CPUのPRIMERGY MX130 S2 にCentOS 7をいれてyum upgradeしたら microcode: failed to load file amd-ucode/microcode_amd.bin などと言う謎のエラーを吐いて起動しなくなっているお話(現在進行形) (解決したのでオチを追記)。

古の激安サーバー()であるPRIMERGY MX130 S2が職場に2台あるわけですが、うち1代のHDDがS.M.A.R.T.エラーを噴いて撃沈したのをいいことに、CentOS 7で再構築を始めたわけですよ。とりま、 yum upgrade でまるっと更新かけたわけですよ。 kernel が更新リストに入っていたから、何も考えずリブートしたわけですよ。

…カーネルパニックみたいな状態になって起動どころかCTRL+ALT+DELすら受け付けない状態になったわけですよ(汗)

電源断して起動時に1つ前のkernelを指定したところ無事起動したので、dmesg.oldを見たところ、最後のメッセージが冒頭の “microcode: failed to load file amd-ucode/microcode_amd.bin”。

で、このメッセージでGoogle検索してみると、以下のバグトラックが出てきた。どうも同じ現象っぽい。

0007331: Failed to load file microcode_amd.bin

実際、 /lib/firmware/ の中に amd-ucode/ というディレクトリ自体が存在しないのでそりゃファイルのロードもできないよね、という状態ではあるのだけど、今一つ分からないのが、今回の現象が意図的に行われたのか誰かのミスなのか、というところ。

英文なんで斜め読みで取り敢えず解決方法だけ探してる状況なのですが、解決方法自体はまあ、バグトラックに言及があるURLからmicrocode一式をダウンロードして入れてしまえば良さげです。

ただ仮に今回の現象が意図的なもので、今後kernelにはこのファイル群が入らないとなると、このサーバー機はCentOS 6止まりにしておくとか、運用終了も考えたほうが良い気がします。ただ、意図的な足きりならば、この手のバグトラックは割と早い段階で開発当事者の人が出てきて「そいつはもうサポート外だ」で 終わると思うんですよね。なにやら話題は継続している様子だし、足りないファイル入れておしまいなら早々にバグフィックス版が出てもよさそうなのに、1年以上もスレッドが続いている。

そして何より気にかかるのが、PRIMERGY MX130 S2を買った、CentOS入れたという日本語記事はわりとGoogle検索にひっかかるのに、このバグに遭遇したという日本語記事が出てこない。みなさんなんで大丈夫なの??

ともあれ、明日(というか今日)出勤したら、問題のファイル群を押し込んで経過観察する予定。

[2015.12.29 追記]

いや本当は12/17に解決していたのだけど、記録する暇が無くて…。

結論。microcodeは関係なかった。つか然るべきファイルを置いてみても「ファイルが無い」というエラーは出ていないもののフリーズする現象は止まらず。再度ググったところ、以下と同じ現象だった模様。

Kernel 3.10.0-327 issue on AMD Neo processor

同じ方法で対策してみたところ、安定稼働するようになりました。その後本格的なシステム構築を始めて仕事納めの12/25まで24時間動作続けています。

しかしclocksource_done_bootingってなんだろう…。名前から察してタイマー割り込み系かしら。

ruby-2.1.7 の make test で TestException#test_machine_stackoverflow_by_define_method が出たときの対処。

TestException#test_machine_stackoverflow_by_define_method でググって見つけた issue の修正内容を適用してみたら改善できたのでメモ。

ruby 2.1.7 で見つかって ruby 2.2.0 で対策されていたので、今出ているruby 2.1.7パッケージには反映されていない、と言うことなんだろう、多分。

問題のissueは Bug #9739 。以下は修正個所の転記(何かの拍子に原典が消えてしまうと困るので)。

diff --git a/configure.in b/configure.in
index f52e0ba..078f9ba 100644
--- a/configure.in
+++ b/configure.in
@@ -2782,7 +2782,7 @@ if test "$with_dln_a_out" != yes; then
            rb_cv_dlopen=yes],
    [cygwin*|mingw*], [
            : ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
-           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
+           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x01200000,--enable-auto-import"
            DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
            : ${LIBPATHENV=""}
            rb_cv_dlopen=yes],

修正後、念のため make clean ; ./configure ; make までやったら make check でエラーが無くなった。

CentOSを使用したリモート操作についての備忘。

CentOSで他のマシンをリモート操作することに関するメモ。必要に応じて追記されていると思われ。

コマンドプロンプトから他のマシンを起動する (Wak on LAN)

ether-wake <MAC address>

実行にはroot権限が必要。

CentOS 7 だと標準で導入されているっぽい? うちでは主要マシン向けに以下のようなシェルスクリプト書いてあります。(sudoで実行して機動確認のためにpingを打ちつづける)

#!/bin/sh

sudo /usr/sbin/ether-wake <MAC address>
ping <IP address>

リモートデスクトップ接続

EPELの xrdp パッケージ ( http://xrdp.sourceforge.net/ ) を導入します。

xrdp.x86_64 : Open source remote desktop protocol (RDP) server

以下のようなシェルスクリプトを書いておくと便利。この例ではフルHDモニタいっぱいに表示します。また、起動後コンソールを占拠されるのが嫌なのでバックグラウンドに回しています。

ポート番号は標準のままならば指定不要。うちの場合ブロードバンドルーターを介してINTERNETから繋ぐので、アタック対策も兼ねてポート番号を適当に割り当てています。としてINTERNET側のIPアドレスを指定、として割り当て済みの番号を指定すると、ルーター内でイントラ側の特定Windowsマシンに転送する次第。

#!/bin/sh

rdesktop -g 1920x1080 <IP address>:<port> &

FPDFで日本語を含むPDFファイルを作成する

PDFを扱うライブラリはいくつかあるのですが、PHP言語単体で外部ライブラリを必要としないものとしてはFPDFが有名らしく、日本語対応もされているので使い方を試してみました。なお、今回は「既存のPDFを加工する」のではなく「データからPDFファイルを新規に作成する」のが目的です。

基本的には座標を指定してごりごり書いていくようです。生のテキストをPDFに落とすというよりは、固定レイアウトの帳票とかを作成する用途に向いていそう。実際には方眼紙でレイアウト組んで、座標系で管理していく戦闘スタイルになると思われ。

各種画像も読み込んで貼り付けられるので、画像ファイルをまとめたPDFを作る用途にも使えそうです。

PHPによるメール処理(POP3編)

PHPでメールを送受信する処理について調べ始めたので、サンプルコードをGistに投稿しました。まずはPOP3から。

大雑把に以下の処理をしています。基本的に動作検証のためなので、エラーチェックはしないし取ってきたメールへの処理も雑極まりない感じですが。

実行にあたっては ./server_setting.ini を適当に用意してください。パスワードとか書く必要があるので、扱いは慎重に。また、メールサーバーにアクセスするため万が一の場合メールを破壊する可能性もあるかと思います。そのあたりは自己責任でお願いします。

…最大の難点は「取り敢えず最新メールを取ってくる」仕様なので、その時何が届いているか賭けになるということだな…。試験実行したらSPAMを拾ってきたこともあったし(汗)

  1. POP3サーバーにログインする
  2. メールの一覧を取得する
  3. メールの一覧から最後の1件(=最新のメール)を取り出す
  4. 取り出したメールのbodyをMIMEデコードする
  5. (この辺りから雑な実装になる)メールがtext/plainの、ふつーのメールだった場合デコード結果が単品になるので、そのままprint
  6. メールのパートごとにContent-Typeをチェックし、text/plainだったらそのままprint
  7. Content-Typeがtext/plainでないなら、連番を振ってファイル保存(面倒くさいのでファイル名の取得は省略している)

メールのリストを取得したあたりからプログラムの目的によってやることが変わってくると思うので、適宜調整すればいいと思われ。