こっそり quickutil を使ってみた

トラブってたのを一つ前の記事に書いたわけですが、今度は調査メモです。

ネットを彷徨っていたところ quickutil の記事を見付けまして、色々試してみたんですよ。
まあ、公式サイトの http://quickutil.org/ の方で「under maintainance」って書いてあるので駄目元だったんですが。
なんとなく動いた感じなので方法をコッソリと書いておこうかと。
もちろん、やる場合には自己責任です。っていうかメンテ明けまで待つのが正しい態度ですよね…

使うだけなら次のようにすればいいです。
あらかじめ quicklisp を使えるようにしておいて下さい。
使いたいユーティリティは :shuffle だとします。適宜、置き換え願います。
リストを渡すので、一度に複数でも大丈夫のようです。

;; 準備
(ql:quickload 'quickutil)
;; 利用のための宣言(引数はキーワードのリストらしい)
(qtlc:utilize-utilities '(:shuffle))

;; 利用は "qtl:ユーティリティ名" で呼び出す模様
(qtl:shuffle '(3 2 1))

なお、ユーティリティのリストは以下で見られました。

;; 準備
(ql:quickload 'quickutil-utilities)

;; 全部
(qtl-utl:all-utilities)
;; カテゴリの一覧
(qtl-utl:all-categories)
;; カテゴリ内にあるユーティリティの一覧(例では integers カテゴリ)
(qtl-utl:utils-in-category :integers)

Use at your own risk!

暗号化とか署名とかハッシュとか

まずは、ざっくりとした一覧です。

こうしてまとめてみると、思っていたよりも色々ありますね。

特に Windows に certutil コマンドがあって、エンコードとハッシュ計算ができるのには驚きました。

それと、暗号化ファイルを元に戻す時には(大抵の場合)同じソフトが必要になります。 渡す相手には何のソフトで暗号化したか伝えておきましょう。

バッチの find | xargs では -r オプションを付けること > 未来の自分

今回は短いです。ライトニングな感じです。

xargs なんですが、結構 find と組み合わせて使いますね?
…使いますよね?
…ここは空気読んでウソでも「使う」って言う所ですよ?

で、パイプした find の出力が空だった場合でも xargs の部分が実行されてしまうんですよ。
衝撃の事実ですね。ええ、インパクトありますよ。rm -rf とか食わせてると特に…
まあ、今回はテストで echo 付けてあったので死なずに済みましたが。

というわけで、crontab とかのバッチ処理の時は xargs -r の使用を考慮しましょう。
こうすると、入力が空の時には xargs に食わせたコマンドが実行されません。
バッチ利用(大抵は cron)の時は付けた方がいいと思います。

VirtualBox に CentOS 6.7 を入れた後で NAT にした時の設定

例によって忘れた時用のメモです。

タイトル通りなんですが、VirtualBox で CentOS 6.7 を使った時に困った話です。
状況としては下のようになります。

  1. ネットワーク設定で最初に NAT以外(ホストオンリー等)のネットワークアダプタを選んだ
  2. そのアダプタを後から NAT にした

この場合、VM を起動しても NAT からインターネットへのアクセスができません。
とりあえず下のように設定したら NAT を通って外へ出られました。

  • /etc/sysconfig/network ファイル
    • GATEWAY の行をコメントアウト(先頭に「#」を追加)する
  • /etc/sysconfig/network-scripts/ifcfg-eth0 を下の内容にする(NIC の数によっては eth0 の「0」を別の数字に読み替えます)
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp

ちなみに、NAT が動いた時の IP が「10.0.5.15」で、デフォルトルートは「10.0.5.2」でした。
このパラメータを利用して手動設定ができるかもしれません。どなたか試したら教えてください。

今回は短い(当社比)ですが、以上です。

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 に記録されていました。

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

仮想 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」部分に実行時引数を渡す方法をご存知でしたら、ぜひご教示いただきたいです。

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

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

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

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

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

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

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

コミPo! からキャラ絵を切り出す方法

またまた、お久し振りです。

今回は死蔵してあった コミPo! を利用して、ゲームの立ち絵などに使えるキャラ絵を切り出す方法をメモします。

コミPo! は、本来マンガ作成ソフトなのですが、作成した絵の二次利用(制限あり:詳細は 公式サイト参照)ができます。
そこで、様々なポーズ・表情のキャラ絵を作成してゲーム内で表示するために、何とか指定サイズで簡単に切り出せないか試して、とりあえず以下の方法に落ち着きました。
(ちなみに、今のところコマンドラインから操作するため、マウスクリックでホイホイというわけではありません)
続きを読む