phpMyAdminの環境保管領域が完全に設定されていない… エラー

おひさしぶりです。
不定期開催の今回のネタは phpMyAdmin on Ubuntu 14.04 LTS です。

とりあえずパッケージ入れてみたんですよ。
そしたら、ログインすると「phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。」と表示されたわけです。
コマンドラインから見てみると、環境保管領域に使われる phpmyadmin データベースが無かったので CREATE TABLE して…ダメ。
中身を入れればいいのかと /usr/share/doc/phpmyadmin/examples/create_tables.sql.gz を流し込んでみても…ダメ。
権限の問題かと CREATE USER と GRANT を駆使しても…ダメ。

…結局、/etc/phpmyadmin/config.inc.php の中身で環境保管領域用のテーブル名を定義している部分で「_」(下線、アンダースコア)が一つ不足していたのが原因でした。
直接そのファイルを直すかわりに /etc/phpmyadmin/conf.d/env-storage.php を以下の内容で作りました。
ほとんどは /usr/share/doc/phpmyadmin/example/config.example.inc.php からコピーしたものです。


<?php // ここから

$i = 1; // インデックスを 1 に戻して(1-ベースなので最初が 1)
/* Storage database and tables */
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['designer_coords'] = 'pma__designer_coords';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
/* Contrib / Swekey authentication */
// $cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf';
?> // ここまで

それから、試行錯誤している時に /etc/phpmyadmin/config.inc.php を見ていたところ、設定ファイルは次のような順序で読み込まれるようでした。(後ろにある内容が優先)

  1. /var/lib/phpmyadmin/config.inc.php (phpMyAdmin/setup で変更されるファイル)
  2. /etc/phpmyadmin/config-db.php
  3. /etc/phpmyadmin/config.inc.php (今回の悪の元凶)
  4. /etc/phpmyadmin/conf.d/*.php (設定を追加した場所)

…以上で今回のレポートを終わります。

ufw によるファイアウォール

今回は ufw です。
以前からパッケージにあるのは知っていたのですが、VPS の Ubuntu 14.04 LTS に標準で入ってるのを触るまでスルーしてました。

ファイアウォールと言えば設定した途端に SSH が使えなくなって、泣きながら実マシンのコンソールまで駆け付けるハメになる、というのはよく有る話です。
今回はクラウドの VPS を使っており、何故か Web の管理画面からコンソールが見られないという、危険が危ない状態だったので細心の注意を払いました。

ドキュメントと man を読み漁り、iptables の一番上に作業マシンの IP 許可設定を突っ込み、ufw にも IP の許可と SSH の許可を設定した上でドキドキしながら「ufw enable」を実行しました。

結果的には ufw の設定だけでも十分でしたが、iptables に書いておいた設定が上に残っているのを見て、転ばぬ先の杖は大事だと実感しました。

ちなみに ufw の使い方は、設定を ufw コマンドで行い、準備ができたら「ufw enable」で有効化するという手順になります。とりあえず、次のコマンドを設定しておけば SSH が切れる心配は少ないと思います。


ufw allow 22/tcp
ufw allow from 作業マシンのIPアドレス

指定内容は「ufw status」で見られます。
詳細な形式は(私の所では) /lib/ufw/user.rules に記録されていました。

以上。いつものように備忘メモでした。

Emacs キーバインド その3 矩形リージョン・レジスタ

さて、第3回です。
今回は、使う場面が限定されるけど、使いこなすとスゴいシリーズです。

いろいろ
「消去」は「キル」と違って、内容を覚えずに消します。

  • M-SPC :カーソル前後の空白文字をまとめて消去
  • C-x o :前後の空行を 1行だけ残して消去
  • C-h w COMMAND :コマンド COMMAND を実行するキーバインドを表示

矩形リージョン
通常のリージョン(カーソルとマークの間の文字全て)ではなく、カーソルとマークが左上と右下に来るような矩形(四角形)の中の文字だけを対象とします。
よって、カーソル・マーク間の行に含まれていても、矩形の外側の文字は対象になりません。

  • C-x r k :矩形をキルして右側の文字列を左へ(詰めるように)移動
  • C-x r y :最後にキルした矩形を、カーソル位置を左上としてヤンク(ヤンク矩形範囲内の文字列は右へ(逃がすように)移動)
  • C-x r d :矩形内を消去して右側の文字列を左へ(詰めるように)移動
  • C-x r c :矩形内を空白で上書き(範囲外への影響は無し)
  • C-x r o :矩形サイズの空白を挿入して、矩形内の文字列を右へ(逃がすように)移動

レジスタ
レジスタとは 1文字の名前(a、b、x、y など)が付いた保管場所です。
新しい物を入れると、前に入っていた物は消えてしまいます。

以下の REG_CHAR はレジスタを表す 1文字の名前とします。

  • C-x r s REG_CHAR :リージョン内容をレジスタにコピー
  • C-x r i REG_CHAR :レジスタ内容をカーソル位置に挿入
  • C-x r C-SPC/C-@ REG_CHAR :カーソル位置をレジスタに記録
  • C-x r j REG_CHAR :レジスタに記録されている位置へカーソルを移動
  • M-x list-register :空でないレジスタの内容を一覧表示

Emacs キーバインド その2 ヘルプ・リージョン・キーマクロ

続けての投稿です。

第2回はちょっと慣れてきた人向けのシリーズです。
ヘルプ、範囲選択と切り貼り、+α を書いています。

ヘルプ

  • C-h b :キーバインドの一覧を表示
  • C-h k KEY :キーバインド KEY の説明を表示
  • C-h m :現在のモードに関する説明を表示
  • C-h a STRING :文字列 STRING を含むコマンドのリストを表示

マーク

  • C-SPC/C-@ :カーソル位置にマークを設定してリージョン指定を開始
  • C-u C-SPC/C-@ :一つ前のマーク位置に移動
  • C-x C-x :カーソル位置とマーク位置を入れ替え(と同時にリージョンに設定)

「リージョン」とはマークとカーソルに挟まれている部分です。
リージョンを対象にするコマンドや、リージョン設定中に実行するとリージョン内だけで動くコマンドがあります。

キルとヤンク
「キル」は「切り取り(カット)」の、「ヤンク」は「貼り付け(ペースト)」の Emacs 版です。

  • C-w :リージョンをキル
  • M-w :リージョンの内容を残したままキル(いわゆる「コピー」)
  • C-y :カーソル位置へヤンク(キルしてあった内容を挿入)
  • M-z CHAR :文字 CHAR まで(CHAR も含めて)キル

いろいろ

  • C-x C-n :カーソルのある桁位置を行移動(C-n,C-p)の目標桁に設定
  • C-u C-x C-n :上で設定した目標桁を解除
  • C-x = :カーソル位置の情報(文字コード、文字位置、桁位置)を表示
  • M-( :かっこの対「()」を挿入して、その中にカーソルを移動
  • C-x n n :表示(と編集)をリージョン内のみに限定(ナローイング)
  • C-x w :ナローイングの解除

キーボードマクロ
記録開始から終了までの操作を覚えておいて再利用します。

  • C-x ( :マクロの記録を開始
  • C-x ) :マクロの記録を終了
  • C-x e :最後に記録したマクロを実行
  • M-x insert-kbd-macro ENTER :最後に記録したマクロの内容をカーソル位置に挿入

設定ファイル(.emacs など)にマクロ内容を保存しておく事で、次回以降の Emacs 起動時でも利用できます。
ただし、名前を付けてキーバインドを設定(global-set-key などを利用)しないとダメですが。

Emacs キーバインド その1 カーソル移動

ふと思い立って Emacs マニュアルを片手にキーバインドをまとめ直したので記録します。

第1回はカーソル移動についてです。…一部検索も含みますが。

言うまでもありませんが「C-x」は Ctrl キーを押しながら x を押すという意味です。
同様に「M-x」は Alt キーを押しながら(あるいは ESC を押してから) x を押します。
あと「C-x n」は「C-x」の後に(Ctrl を放してから) n を押します。

以下で使用している「a/b」は独自表記で a または b を意味します。
そのキーバインドの説明で【上、下】のように書いてあれば、a の時が「上」で b の時は「下」と考えてください。

単位ごとの移動

  • C-p/C-n :【後方(上)、前方(下)】の行へ移動
  • C-b/C-f :1文字【後方(左)、前方(右)】に移動
  • M-b/M-f :1単語【後方(左)、前方(右)】に移動
  • M-a/M-e :文 1つだけ【後方(左)、前方(右)】に移動
  • M-[/M-](角括弧の開き/閉じ) :1段落【後方(上)、前方(下)】に移動
  • C-x [/](角括弧の開き/閉じ) :1ページ(^L文字で区切られている)【後方(上)、前方(下)】に移動

先頭と末尾への移動

  • C-a/C-e :行の【先頭、末尾】へ移動
  • M-</M-> :バッファの【先頭、末尾】へ移動

スクロール・位置指定

  • C-v :1画面進む(下)方向にスクロール
  • M-v :1画面戻る(上)方向にスクロール
  • C-l :現在行が画面中央に来るようにスクロール
  • M-g M-g :指定する行番号へ移動
  • M-r :画面中央の行へカーソル移動

検索(インクリメンタルサーチ)
文字を入力しながら検索します。1文字入れるごとに候補を絞り込みます。

  • C-s :前方(画面下)へサーチ、サーチ中なら前方の次候補へ移動
  • C-r :後方(画面上)へサーチ、サーチ中なら後方の次候補へ移動

現在位置で検索を終了したければ ENTER か、カーソル移動コマンドを使えばいいです。
検索開始位置に戻りたい場合には C-g を利用します。


特殊:プログラムのソースファイル向け

  • C-M-b/C-M-f :式 1つ分だけ【後方(左)、前方(右)】に移動
  • C-M-p/C-M-n :リスト 1つ分だけ【後方(左)、前方(右)】に移動
  • C-M-a/C-M-e :最上位のまとまり(関数定義など) 1つ分だけ【後方(上)、前方(下)】に移動
  • C-M-u/C-M-d :リスト階層で 1つ【上(外)、下(中)】へ移動
  • M-m :現在行の先頭の非空白文字(字下げした行頭)へ移動

とまあ色々とありますが、とりあえず下の 3パターンだけ覚えておけば何とかなります。

  • C-p/C-n/C-b/C-f :1つ【上、下、左、右】へ移動
  • C-s/C-r :【前方(下)、後方(上)】へ検索開始・次候補へ移動
  • C-v/M-v :1画面【前方(下)、後方(上)】へスクロール

余裕があれば 単語移動の M-b/M-f、行頭 C-a、行末 C-e、バッファ先頭/末尾 M-<、M-> も覚えておくと便利です。

仮想 IP アドレスをフェイルオーバーする方法

お久しぶりです。
相変らず不定期更新で、作業メモばかりのブログです。

今回は (Debian系)Linux で、仮想 IP アドレスをフェイルオーバーする方法のメモです。
簡単に言うと、サーバ 2台の状態で片方がコケた時に残ってる方でサービスを継続したい時に使う手法です。って、全然簡単じゃないですね…

では下準備からです。
■材料

  • サーバ 2台(もちろん仮想マシンでも可)
  • ネットワーク 2個(つまり NIC 2枚ずつとハブ 2個)
  • クライアントマシン 1台(切り替え状況をチェックします)

■準備手順

  1. サーバに Debian系OS(最近だと Ubuntu が多いですかね)を入れます
  2. サーバに fake パッケージをインストールします(send_arp コマンドが入ります)
  3. サーバに arping パッケージをインストールします
  4. サーバを 2つのネットワークに接続する設定をします(/etc/network/interfaces ですね)
    便宜上それぞれを WAN と LAN と呼びます。また、サーバ名は srv1、srv2 とします。

    • LAN(eth0):192.168.1.0/24, srv1(192.168.1.11), srv2(192.168.1.12)
    • WAN(eth1):10.0.0.0/24, srv1(10.0.0.11), srv2(10.0.0.12)
  5. クライアントマシン(名前:cli)を WAN に接続します(IP:10.0.0.20)

それで、実際に切り替える操作です。

  • 仮想 IP アドレス($VIP)を 10.0.0.1 とします
  • WAN側デバイス($DEV = eth1)の MAC アドレス($MAC)を次だとします
    • srv1(000011110000)
    • srv2(222200002222)

■メイン側サーバ(srv1)へ仮想 IP を付けます

srv1> ip addr add $VIP/24 dev $DEV

■クライアント側からチェックします

  • IP アドレス:「cli> ping $VIP
  • ARP キャッシュ:「cli> arp」(10.0.0.1 が 000011110000 になるはずです)

■仮想 IP をフェイルオーバーするコマンドです
ここでは仮想 IP の存在チェックを繰り返して、失敗したら 仮想 IP の設定と ARP キャッシュの更新通知を行います。

  1. 仮想 IP の存在チェック:「srv2> arping -q -c 1 -I $DEV $VIP
  2. 仮想 IP の設定(srv1 の時と同様):「srv2> ip addr add $VIP/24 dev $DEV
  3. ARP キャッシュの更新通知:「srv2> send_arp $VIP $MAC 255.255.255.255 ffffffffffff $DEV $MAC ffffffffffff reply

たぶん、実際には下に書いたようなスクリプトを実行することになります。

■srv1 の仮想 IP を外します
srv1> ip addr del $VIP dev $DEV

■クライアント側からチェックします
前と同様に ping と arp を実行します。
arp の表示で 10.0.0.1 が 222200002222 に変わっているはずです。


仮想 IP フェイルオーバー用スクリプト


#!/bin/bash

VIP="10.0.0.1"
DEV="eth1"
BCAST_IP="255.255.255.255"
BCAST_MAC="ffffffffffff" # f x 12

health_check() {
arping -q -c 1 -I $DEV $VIP
return $?
}

ip_failover() {
MAC=`ip link show $DEV | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}' | head -1 | tr -d \:`
ip addr add $VIP/24 dev $DEV
send_arp $VIP $MAC $BCAST_IP $BCAST_MAC $DEV $MAC $BCAST_MAC reply
}

while health_check; do
echo "health check ok!"
sleep 1
done
echo "fail over!"
ip_failover

もちろん、実際に使う時には echo の部分はコメントアウトする事になるでしょう。


また、作業中に気付いた点は以下の通りです。

  • 仮想 IP のチェックは 「arping -q -c 1 -I $DEV $VIP」 の方が 「ping -c 1 $VIP >/dev/null」 よりも早くダウンに気付きました
  • Web でクライアント(実際には WAN のルータ)に 「echo 1 > /proc/sys/net/ipv4/conf/all/arp_accept」 を設定した方が良いと書いてありましたが、今回は設定値が 0 でも期待通りに動きました
  • ARP キャッシュ更新に使う send_arp コマンドですが、Web で調べた 「send_arp $VIP $MAC $BCAST_IP $BCAST_MAC $DEV」 では期待する ARP Reply ではなく ARP Request になってしまいました

CraftLaunch から あふw を操作する件

いつも通りの不定期更新です。

今回は「CraftLaunch」(Ver3系列)からファイラーの「あふw」を操作するお話です。
つまるところ、CraftLaunch のパス補完を使って あふw の作業フォルダを一気に移動したいという事なんですが、無駄に苦労したのでメモしておくことにしました。

まずは結論ですが、config.py の window.launcher.command_list に以下の設定を追加すればいいです。
( u"afxr", command_ShellExecute(None, u"D:/tools/afxw64/afxwcmd.exe", u'&EXCD -r%param%', u"") ),
これで指定パスを右窓で開きます。

途中、紆余曲折(ソース見たり、print() でデバッグ表示したり…)がありました。
一番苦労したのは、「%param%」が処理の内部でダブルクォート(「”」です)を前後に追加していた点でした。

ええ、普通に「-r”%param%”」と書いていましたとも。
そこから苦難の旅路が始まったと言えます。
最終的にソースコードから command_ShellExecute の定義をコピーしてきて print() を埋め込んで表示を調べたら解決できました…

ちなみに、当初トライした command 定義のパラメータでゴニョゴニョする方法は挫折したままです。
どなたか「&EXCD -r”%1″」の「%1」部分に実行時引数を渡す方法をご存知でしたら、ぜひご教示いただきたいです。

オーケストレーションツールと愉快な仲間たち

間に何か挟まりましたが、連投です。というか、投稿するのは私だけなので、間隔の多少はあれど常に連投と言えなくもないです。
なんか寂れた掲示板とか購読者の居ないメルマガを彷彿とさせますね。

そんなブルー入った気分で始まる今回のネタは、前回に引き続きツールまとめです。

さて「オーケストレーション」が耳慣れない方もいらっしゃるでしょうから参考リンクを。
wikipedia オーケストレーション
wikipedia: プロビジョニング
…分かりにくいですね、はい。
個人的には「デプロイとかサーバ群の設定とかをまとめて自動化できるツール」みたいに考えています。(急募:ツッコミのできる有識者)
続きを読む

vimperator でデフォルトの検索エンジンを変更する

エフセキュア株式会社がサーチエンジンを提供していると小耳に挟んだので、デフォルトの検索エンジンをそちらに変更することにしました。

Firefox、Chrome、IE それぞれについて、手順通りに行って問題は出ませんでした。

が、Firefox で使っている Vimperator で URL を開くと、以前の google で検索されます。

まあ、どこかに設定があるんだろうという事でヘルプを読んで見付けました。
備忘録として投稿しておきます。

設定したい検索エンジンのキーワードが「f-secure」であるとします。
叩くコマンドは「:」でコマンドモードに入ってから「setglobal defsearch=f-secure」です。
「setglobal defsearch」だけだと、現在の設定が表示されます。

以上で無事に設定変更が完了しました。これで一安心です。

各言語のライブラリ管理ツールまとめ 他

雪降る朝にお届けしております。
最近、微妙に更新が多い感じですが、多分気のせいでしょう。

というわけで、なんとなく情報を集めたので紙からデータに起こしておこうかと思います。

■ ライブラリ管理ツール

出てくる言語の順序に他意はありません。思い付いた順です。経験と検索結果を焼いて砕いて粉にして、スプーン一杯すりきりにしてから載せております。

「コレが無いってどゆこと!」とか「こんなのはライブラリ管理ツールじゃねぇ」といったツッコミ大歓迎です。その熱い思いをコメント欄にぶつけて下さい。
続きを読む