2012/08/04

... has come

Image: IMG_1963.JPG

MAZDA CX-5

2012/08/03

Coming soon ...

Image: CX5.png

Zoom-Zoom!

2012/08/01

キーボードショートカットのカスタマイズ

Mac では システム環境設定キーボードキーボードショートカット から アプリケーション毎、もしくはシステム全体で有効な キーボードショートカットが独自に作成できる。
この機能を利用するとメニューに項目があるが ショートカットキーが定義されていない機能に 独自のショートカットキーが簡単に定義できるので非常に便利だ。
但し登録できるショートカットキーに制限があり スペースやバックスペースなどは登録できないので、 KeyRemap4MacBook を組み合わせて利用する事で任意のショートカットが利用できる様に設定する。

例えば プレビュー では ツール メニューから 水平方向に反転垂直方向に反転 などの機能が利用できるが、 これらの機能には標準ではショートカットが定義されていない。
そこで前述の キーボードショートカット 機能を利用して プレビュー水平方向に反転のショートカットや、 垂直方向に反転のショートカットを コントロールやシフトなどとの組み合わせで指定する。
ここでは 水平方向に反転コマンド+シフト+H垂直方向に反転コマンド+シフト+V を登録したとする。
ショートカットが登録できたら プレビュー を起動して 指定したショートカットが正しく動作するか確認しておく。

次に KeyRemap4MacBook でスペースを コマンド+シフト+H に、 バックスペースを コマンド+シフト+V に置き換える設定を行えば、 スペースやバックスペースなどでショートカットが実行可能になる。 この時、キーの置き換えは特定のアプリケーション (今回は プレビュー)だけに限定すると良いだろう。
そのためには KeyRemap4MacBook の Misc & Uninstall から Open private.xml をクリックして以下の設定を追加する。

  1<?xml version="1.0"?>
  2    <root>
  3        <!-- アプリケーション "プレビュー" の定義 -->
  4        <appdef>
  5            <appname>PREVIEW</appname>
  6            <equal>com.apple.Preview</equal>
  7        </appdef>
  8
  9        <!-- "プレビュー" に対するキーマッピングの定義 -->
 10        <item>
 11            <name>Preview Key</name>
 12            <identifier>private.PreviewKeys</identifier>
 13                <only>PREVIEW</only>
 14                <!-- スペースはコマンド+シフト+H に置換 -->
 15                <autogen>--KeyToKey-- KeyCode::SPACE, KeyCode::H, ModifierFlag::COMMAND_L | VK_SHIFT</autogen>
 16                <!-- バックスペースはコマンド+シフト+V に置換 -->
 17                <autogen>--KeyToKey-- KeyCode::DELETE, KeyCode::V, ModifierFlag::COMMAND_L | VK_SHIFT</autogen>
 18        </item>
 19    </root>
    
これらの設定を追加する事で プレビュー 上では スペースは コマンド+シフト+H に置換されてアプリケーションに 通知されるので、 登録したショートカット(水平方向に反転)が実行される事になる。

2012/07/27

シェルスクリプトで便利な小技

シェルスクリプトを作成するときに知っておくと便利な小技集。

exec > ファイル
以降の標準出力を全て ファイル に出力するので この設定をしておくと簡単な実行ログが取得出来る。
同様に exec 2> ファイル とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。
当然 exec > ファイル 2>&1 とすれば 標準出力も標準エラー出力も取得できる。
ファイル/dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、 cron (8) から実行される場合などでは便利な場合もある。
  1#!/bin/sh
  2
  3exec 2> ${TMP:-/tmp}/myname.log
  4    :
            
set -e
スクリプト実行時に制御文以外でエラーが発生した場合に スクリプトを終了させる。
スクリプト中で実行すべきコマンドを typo した場合などで、 以降の処理が実行されると困る場合などに特に役立つ。
  1#!/bin/sh
  2    :
  3echo "call myfunc ..."
  4mtfunc                                          # 関数名を typo している
  5echo "end myfunc ..."
  6    :
            
この様なコードの場合 set -e されていると、 mtfunc がエラーになった時点でスクリプトが エラー終了するので以降の処理が実行されない。
当然 ifwhile&&|| などでコマンドの結果が評価される場合は エラーにはならない。
set -u
スクリプト中で値が設定されていない変数を参照した場合に エラーメッセージを表示してスクリプトを終了させる。
シェル変数や環境変数を typo した場合など、 変数に値が設定されていない事で発生する問題が回避できる。
  1#!/bin/sh
  2tempdir=/var/tmp/
  3mynam=myname
  4    :
  5rm -rf ${tmpdir}/${myname}                      # 変数名を typo している
  6    :
            
この様なコードの場合、 変数名 ${tempdir}${mynam} を それぞれ typo しているので、 結果として rm -rf / に展開されてしまうが、 set -u されていると実行が防げる。
set -n
こちらはどちらかと言うとスクリプトの開発時に有効な設定で、 コマンドは実行されないのでスクリプトの文法チェックに最適。
set -x
こちらも開発時に有効な設定で、 コマンドが実行される前にコマンドを stderr に出力する。
上の exec と組み合わせると 詳細な実行ログが取得できるのでデバッグに便利
  1#!/bin/sh
  2
  3exec 2> ${TMP:-/tmp}/debug.log
  4set -x
  5    :
            

2012/07/23

英辞郎の辞書をコマンドラインから参照してみる

英単語の意味を調べるのに man(1) を使ってしまう人に贈る1行 という記事を拝見して、 自分の FreeBSD マシンで英辞郎の辞書を参照している方法を記事にしてみる。
要は英辞郎の辞書を EPWING 型式に変換して ndt サーバ経由で ndtpc コマンドから検索しているだけで、 検索コマンド自体は 1 行だが多少準備が必要となる。

英辞郎、和英辞郎、略辞郎、音辞郎の辞書を変換する。
英辞郎の辞書を EPWING 型式に変換するのは ports を利用すれば 何の問題もなく可能だ (若干ディスク容量が必要だが、 今となっては問題とならない容量だと思う)。
作業は英辞郎の CD-ROM をマウントした状態で実施すれば良いのだが、 CD-ROM は I/O が遅いのでローカルのファイルシステムに 辞書ファイルをコピーして実行しても良い。
ローカルにファイルをコピーした場合は DICT_PATH で 英辞郎の辞書ファイルのパスを指定すれば良い。
# cd /usr/ports/japanese/eijiro-fpw
# make DICT_PATH=辞書ファイルのパス install clean
# cd /usr/ports/japanese/waeijiro-fpw
# make DICT_PATH=辞書ファイルのパス install clean
# cd /usr/ports/japanese/ryakujiro-fpw
# make DICT_PATH=辞書ファイルのパス install clean
# cd /usr/ports/japanese/otojiro-fpw
# make DICT_PATH=辞書ファイルのパス install clean
            
この変換作業は結構時間が必要である。

ndtpd をインストールする
ndtpd は EB や EPWING などの辞書型式に対応している辞書サーバで、 FreeBSD では ebnetd という ports から導入可能である。
ports から導入すると ndtpd 以外に ebnetd、ebhttpd が インストールされるが今回は ndtpd のみ利用する。
# cd /usr/ports/japanese/ebnetd
# make install clean
# vi /usr/local/etc/ebnetd.conf
# cat << EOF >> /etc/rc.conf
> ndtpd_enable="YES"
> EOF
# chown nobody:nobody /var/run/ebnetd
# /usr/local/etc/rc.d/ebnetd.sh start
            
ebnetd.conf はコメントを参照にすれば簡単に設定できる。 今回はローカルサーバの自分しか利用しないので、 接続ホストや接続数を制限した。
### Port number `ndtpd' binds.
ndtp-port       ndtp

### Owner of the server process.
user            nobody

### Group of the server process.
group           nobody

### How many clients can be connected to the server at the same time.
max-clients     1

### Which hosts can or cannot connect to the server.
hosts           127.0.0.1

### Timeout seconds until the server disconnects an idle connection.
timeout         900

### Path to a working directory.
work-path       /var/run/ebnetd

### How many hit entries the server tries to find at a search.
max-hits        50

### The maximum size of text the server may send as a response to a client.
max-text-size   32768

### Syslog facility
syslog-facility local0

###
### Book entry
###
begin book
    ### Name of the book.
    name        eijiro

    ### Title of the book.
    title       eijiro

    ### Path to a top directory of the book.
    path        /usr/local/share/dict/eijiro-fpw

    ### How many clients can access the book at the same time.
    max-clients 1

    ### Which hosts can or cannot access to the book.
    hosts       127.0.0.1
end

begin book
    #
    # 以下 waeijiro の設定
    #
end

begin book
    # 
    # 以下 ryakujiro の設定
    #
end

begin book
    #
    # 以下 otojiro の設定
    #
end
            

作成された辞書を ebzip で圧縮する
EB ライブラリで使用されている圧縮方式で、 辞書のためのディスク容量を多少なりとも削減するために辞書を圧縮する。
# cd /usr/local/share/dict/eijiro-fpw
# ebzip --level 5
# cd /usr/local/share/dict/waeijiro-fpw
# ebzip --level 5
# cd /usr/local/share/dict/ryakujiro-fpw
# ebzip --level 5
# cd /usr/local/share/dict/otojiro-fpw
# ebzip --level 5
            

ndtpc をインストールする
ndtpc は perl で書かれた NDTP クライアントで、 こちら で公開されているので利用する。
今の所 FreeBSD の ports にはなっていない様なので、 ソースを取得してインストールする。
$ fetch http://www.tanu.org/~sakane/download/ndtpc-20050323a.tgz
$ tar -C /usr/local/src -zxvf ndtpc-20050323a.tgz
$ ./configure
# make install
            

これで以下のコマンドラインで辞書検索が可能になる。

$ ndtpc hello
DICT: 英辞郎
<4c33:560>hello
hello
【発音】helo'u 【変化】《複》hellos
[間投] こんにちは, あのう, やあ
<4c33:5f0>hello
Hello
[人名] エロ
DICT: 和英辞郎
DICT: 略語辞典
DICT: 音辞郎
    
ちなみに jvimkeywordprgndtpc を登録すると 単語の上で 'K' をタイプする事で辞書を検索できるので便利。

2012/07/12

久々の迷惑メイル

先ほど携帯に届いた迷惑メイル。
やりくちがあまりにも下衆なので修正なしで晒す。

From: info@wu30oa22rs81rr.info
To: XXXX@docomo.ne.jp
Date: 2012/ 7/12 18:30
Subject: ※レターバック※宛先不明により集中センター保管中※受け取り先ご確認をお願い致します

現在、お客様宛のレターメールをお預かりしております。
配送先のご確認が必要となっておりますのでお手数ではございますが、下記よりアクセスの上、配送確認をお願い致します。
本メール配送便に関しまして、お届け先不着の状態ですとお届けが出来ませんのでご注意下さいませ。
http://wu30oa22rs81rr.info/XXXXXXXXXXXXXXXXXXXXXX/1307240/sagawa/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
From アドレスや本文に書かれているの URL のドメイン部分が 怪しさ満点な wu30oa22rs81rr.info だったり、 URL の中に無理矢理入れた sagawa の文字だったり、 レターバック 等という低脳としか思えない間違いだったり etc. … 普通の人は引っかかる事はないと思いますが 注意喚起の意味をこめて公開します。
そもそもレターパック(バック?)を騙るなら sagawa じゃなくて japanpost だろうと思うのだが…、 というかレターバッグって郵便配達の方が持っている鞄か?。
一生懸命にそれっぽく作ろうとしている努力は認めなくもないが、 文章の端々からにじみ出す本当の意味での頭の悪さを思うと 人ごとながら同情を禁じ得ない。

最近のドコモの携帯はメイル表示画面から迷惑メイルの報告ができる様なので、 勿論通報しておいた。

2012/06/27

shebang

スクリプトの先頭行に書かれている #!/bin/sh の事を shebang (シェバング) と呼ぶ。
古くはプログラムが実行された際にローダがファイルの先頭 2 バイトを参照して ファイルの形式を調査した事に由来しているらしく、 例えば FreeBSD や Linux の最近の実行可能ファイルであれば 7f45(16) になっている (その後 4c46(16) と続いているので、 ファイルをダンプすると ELF と読める)。
ファイル先頭のこの値の事を magic number とも呼び、 初期の file (1) コマンドはこの magic number を読み取って ファイルの種類を報告していた (今の file (1) も基本は magic number を利用している)。

shebang は通常はスクリプトを実行するインタプリタのパスを記述するのだが、 実は実行可能なプログラムであればインタプリタ以外も記述できるので、 あるプログラムの設定ファイルの先頭にプログラム名自身を書いておくと その設定でプログラムが実行できて実は便利である。

例えば sshd/usr/local/etc/sshd/mysshd.conf を設定ファイルとして起動したい場合、通常はこの様に起動する。

# /usr/sbin/sshd -f /usr/local/etc/sshd/mysshd.conf
    
ところが設定ファイル /usr/local/etc/sshd/mysshd.conf の 先頭の shebang に #!/usr/sbin/sshd -f を追加して /usr/local/etc/sshd/mysshd.conf に実行権限を与えると、 設定ファイルを実行する事で sshd が起動できるので便利だ。
# cat /usr/local/etc/sshd/mysshd.conf
Port        20022
Protocol    2
    :
# ex -s !$ <<- EOF
ex -s /usr/local/etc/sshd/mysshd.conf <<- EOF
>  0i
>  #!/usr/sbin/sshd -f
>  .
>  w!
>  EOF
# head !$
head /usr/local/etc/sshd/mysshd.conf
#!/usr/sbin/sshd -f
Port        20022
Protocol    2
    :
# chmod 755 !$
chmod 755 /usr/local/etc/sshd/mysshd.conf
# !$
/usr/local/etc/sshd/mysshd.conf
# netstat -anf inet | egrep '^Active|^Proto|\.20022'
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  *.20022                *.*                    LISTEN
    
実行例で利用している "!$" は GNU bash (1) の コマンドライン履歴機能で直前に実行したコマンドの最後の引数に展開される。
GNU bash (1) には他にも 色々な履歴の参照機能 があるので、 覚えておくとコマンドの入力が格段に便利になる。

2012/06/26

Bloxsom プラグイン

先日のコーディング晒しでソースコードを表示する際、 当初は <pre> タグにファイルの中身を貼り付けたり、 直接ソースコードを記述した後で、 手作業でタブの展開や特殊キャラクタの置換の作業をしていたのだが、 あまりにも面倒に感じたのと、 折角ソースコードを表示するならせめて行番号は表示したいので 結局プラグインをでっち上げた。
似たような機能では SyntaxHighlighter が有名だが、

  • JavaScript を利用している
  • 普段から Syntax による色づけは大嫌いなので使っていない
  • 表示するコードの種類が複数ある場合に使い方が煩雑
などの理由で使いづらく感じたので blosxom 用のソースコード/コマンドライン表示用プラグイン を作ってみた。

慣れない perl で適当に書いたのであまり自慢できる代物ではないのだが、 Bloxsom を利用している人の役に立てば嬉しいので公開してみる。 例によって動作に関しては全くの無保証だが、 もしも問題や改善案などがあれば是非連絡して欲しいと思う。

2012/06/25

太陽のたまご♪

すでに毎年恒例の家内行事となった完熟マンゴー。

Image: RIMG0617.JPG

太陽のたまご

今年も 4 個です。
素晴らしく甘く美味しい自然の恵みです。

2012/06/21

シェルスクリプトでの排他処理

業務系のシステムでシェルスクリプトを使用している場合など、 多重起動の防止などで排他制御が必要な場合が多々ある。
その様な場合に役に立つ(と思われる) シンボリックリンクを利用したシェルスクリプトでの排他制御方法。
ただし、あくまでもシェルスクリプトによる処理なので、 厳密な意味での排他制御にはなり得ないために タイミングによってはどうしても多重起動してしまう危険性がある事は 考慮しておく必要がある。

この処理では自分自身のプロセス ID をロックファイルとして シンボリックリンクして利用しているので、 排他制御を実施したプロセス ID が簡単に確認できる様にするとともに、 何らかの理由で不正にロックファイルが残ってしまった場合に プロセス ID を確認する事で簡単にリカバリ可能としている。
なお、プロセス確認のために /proc を参照しているので、 Linux など /proc が存在する システムのみで利用可能となっているが、 ps (1) などを利用してプロセスを特定すれば /proc が無いシステムでも利用可能だろう。

  1# ロックファイル
  2lockfile=${TMP:-/tmp}/${0##*/}
  3
  4# 多重起動防止のために symbolic link を作成する
  5# link が作成できたら trap を設定し終了時に link を自動削除する
  6# synbolic link が存在しても /proc/${PID} がない場合は
  7# ロックファイルが不正に残っているので削除して処理を続行する
  8while true
  9do
 10    if ln -s $$ ${lockfile} 2> /dev/null
 11    then
 12        # ロック取得できた
 13        break
 14    else
 15        # ロックファイルが既に存在している場合
 16        # ロックファイルから作成元の PID を取得する
 17        if [ -d /proc/`ls -l ${lockfile} | sed 's!.* !!g'` ]
 18        then
 19            # プロセスが存在する場合
 20            echo "${0##*/}: exist another instance" 1>&2
 21            exit 1
 22        else
 23            # プロセスが存在しない場合はロックファイルを削除してリトライ
 24            rm -f ${lockfile}
 25        fi
 26    fi
 27done
 28
 29# 終わる時は必ず lockfile を削除する
 30trap 'rm -f ${lockfile}; exit' 0 1 2 3 11 15
 31
 32# 実際の処理
 33    :
    


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.