起こりそうにないバグが起こるのはなぜか

落としたトーストがバターを塗った面を下にして着地する確率は、カーペットの値段に比例する

発生確率の非常に低いバグ。窓は狭いし、条件も複雑。
そんなものがよりにもよって、こんなタイミングで、こんなところで発覚するなんて。。。
いわゆるマーフィーの法則? どう考えても運悪すぎない?

・・・というようなこと、経験ないでしょうか。

そうそう起こるとは思えないような発生確率が低い、発生条件も非常に限定的な不具合が、よりにもよって、最悪の時、場所で見つかる。しかも、しょっちゅう。。自分自身も「なんて引きが悪いんだろう。。」って考えていたこともありますが、よく考えれば答えは簡単です。

『発生確率が低い不具合が、たくさん残っているから』

100万分の1の確率で発生するバグだって、そんなバグが100万個残っていれば、すぐにどれかにあたります。『下手な鉄砲も数撃ちゃ当たる』。いや、『ゴキブリを一匹見かけたら◯◯匹いると思え』ですかね。母数がたくさんあれば、当たりもひいてしまいます。

なので、こういったバグを引いた時は、単に「運が悪い」といって片付けるのではなく、まだ見ぬ低確率のバグがまだまだ残っている、言い換えると十分バグは収束していないという認識をもって、次にどういうアクションをとるべきか考えることが重要です。とりあえずの対症療法で済ませるのか、根本対策すべきかなど、その対応は開発ステップによってかわってくるでしょうが、品質のレベルを正しく認識、共有することは、結構、意識的or無意識的に無視orごまかされがちなので、注意したいところです。

4873114799

【関連記事】
このバグ直しますか? - 原因療法と対症療法
バグを潜伏させない工夫
デバッグと不確定性原理
デバッグ指向のススメ


【関連書籍】

高速ファイル検索ソフトEverythingの導入と設定

おまえ達のやっていることは検索で、思索ではない
伊坂幸太郎 - 『魔王』より

Windowのファイル検索ソフトの定番『Everything』。Windows標準機能の検索等と違って、あらかじめ作成したインデックスを使っての検索なので非常に高速です。正規表現が使えたり検索ツールとしても優秀なのですが、インクリメンタルサーチでとにかく動作が非常に高速なのが非常に便利。在処がわかっているファイルでも、Everything経由で開いた方が早いので、ファイルを開いたりという作業はほとんどEverythingだけで事足ります。

インデックスの作成もNTFSのインデックス情報を使っていて非常に早いのですが、それでもファイルが増えてくると結構重たくなってきます。起動後一回だけの話なのですが、たとえ10秒程度でも待ちが入ると、思考も中断されてしまうので、いまいちです。対策として、Optionに「システム起動時にEverythingを起動する」という設定があるのですが、Windows7ではUAC(ユーザーアカウント制御)にひっかかって、期待道理に起動してくれません。

対策としては、タスクスケジューラ経由の起動に登録すればOK。タスクスケジューラは、スタートメニューの「アクセサリ」→「システムツール」→「タスクスケジューラ」で起動可能です。詳しい手順等は、以下が参考になります。

うまくいけば、起動時にEverythingがバックグラウンド起動してくれるので、ファイル検索したい時には、瞬間的に検索結果が得られます。Everythingの起動をメニューやランチャーからすると、「本当に実行しますか」というUACの警告がまた出るので、起動ショートカットキーを定義(Option)しておいて、それ経由で起動するようにしておくと完璧です。

まだ、使ってない方は、この機会にぜひどうぞ。

【関連記事】
WindowsでCUI環境

【関連書籍】
ライフハッカー式整理のアイデア122―賢い人はなぜいつも机がきれいなのか? 小山 龍介
デスクワークを3倍効率化するテクニック―エクセルの3つの機能で仕事のスピードを加速する 奥谷 隆一

CygwinからPython for Windowsとpy2exeを使う

私は不得手なことは一切やらず、得意なことだけやるようにしている。
本田宗一郎

Windowsでpythonという場合、cygwin pythonかWindows python(Python for Windows)の選択肢があります。自分の場合、shell作業との相性からcygwin版のpythonを使っていますが、目的によってはWindows pythonを使いたい時もあります。ということで、WIndows pythonとcygwinの組み合わせ時の注意点などをメモっておきます。

Cygwin terminalからWindows Pythonを使うための設定

alias設定

Windows Pythonの標準インストールであれば、python本体はC:\Python27\python.exeがインストールされると思います(Python2.7の場合)。基本は、cygwin版pythonを使うので、ここにはパスを通さず.bashrcあたりにaliasだけ用意しておきます。
alias winpython='c/Windows/Python27/python.exe'

interactiveモードとprint問題

cygwin terminal (Mintty等)からWindows Pythonを使った時にまずハマるのが、出力問題DOSプロンプト以外からの起動だと、Windows Pythonはinteractiveモードとして認識してくれないのが原因のようです。

対策としては以下の方法があります。
  • interactive modeのoption(-i)付きで起動する。
    $ winpython -i
    
    [欠点] interactive実行の時はいいのですが、script指定で実行した後、プロンプトが残ってしまう

  • バッファリングを無効にする。
    (-uオプションをつけるか, 環境変数PYTHONUNBUFFEREDを設定する)
    $ export PYTHONUNBUFFERED=1
    $ winpython hoge.py
    
    または、
    $ winpython -u hogepy
    
    [欠点] interactiveモードには使えない

  • DOSプロンプト経由で実行する (cygstartを使う)
    $ cygstart /cygdrive/c/Windows/Python27/python.exe hoge.py
    
    [欠点] 実行すると終了するので、print内容確認したい時とかには向かない
全ての用途を満たすような解はなさそうなので、目的に応じてこのあたりを使い分けるのが良いかと思います。

(参考)

改行コードの違い

Windows Pythonとcygwin pythonを切り替えて使う際に、ひとつ注意点として改行コードの扱いの違いがあります。 Cygwin版がCR+LFとなるのに対して、Windows PythonはCRです。
print文等で自動付与される改行に加えて、明示的に'\n'で書いたものも違います。

・cygwin版の出力 (出力内容をodコマンドで確認)
$ python -c "print 'abc'" | od -c
00000000   a   b   c   \n
$ python -c "print 'abc\n'" | od -c
00000000   a   b   c   \n  \n

・Windows Pythonの出力 (出力内容をodコマンドで確認)
$ winpython -c "print 'abc'" | od -c
00000000   a   b   c   \r  \n
$ winpython -c "print 'abc\n'" | od -c
00000000   a   b   c   \r  \n  \r  \n

fileへwriteした時の改行の扱いも同じように違うので注意が必要です。

py2exeを使う

Cygwin pythonがあるのに、あえてWindows pythonを使う目的の一つ(個人的にはこれだけ)が、py2exeです。python scriptをexe形式に変換してくれる便利なしろものです。自分専用のscriptであれば、わざわざexe化する意味はないのですが、Windows用で、かつ、配布用のプログラムとなると、python環境不要なexeの方が何かと便利です。

上で書いたようなかたちで共存できているなら、py2exe使う時だけ、Windows Python呼び出すだけです。とはいえ、せっかくcygwin環境から使うので、Makefileも用意してあげましょう。

Makefile
PYTHON = /cygdrive/c/Python27/python.exe

TARGET = test.exe
SRC    = test.py
SETUP  = setup.py

dist/$(TARGET) : $(SRC) $(SETUP)
	$(PYTHON) $(SETUP) py2exe

clean:
	rm -rf dist build

setup.py
# -*- coding: utf-8 -*- 

from distutils.core import setup
import py2exe

option = {
    "compressed"    :    1    ,
    "optimize"      :    2    ,
    "bundle_files"  :    1
}

setup(
    options = {
        "py2exe"    :    option
    },
    console = [
        {"script"   :    "test.py"}
    ],

    zipfile = None
)

これらを対象のpyファイル(上の例ならtest.py)と同じディレクトリに置いてやればOKです。
py2exeの使い方やインストール等は以下あたりが参考になります。

ファイルが増えてくるとMakefile用意しておくとやっぱり便利です。

B009Z30HPG

【関連記事】
gnupackでCygwin導入した時に最初にすること
WindowsでCUI環境


【関連書籍】
GNU Make 第3版 Robert Mecklenburg 矢吹 道郎 (監訳)
エキスパートPythonプログラミング Tarek Ziade 稲田 直哉
初めてのPython 第3版 Mark Lutz 夏目 大
Dive Into Python 3 日本語版 Mark Pilgrim Fujimoto
Python クックブック 第2版 Alex Martelli Anna Martelli Ravenscroft David Ascher 鴨澤 眞夫

Linuxで簡易ネットワーク解析 - bridge, tc, netem

ロンドン橋がおちる おちる おちる
ロンドン橋がおちる さあどうしましょう
『London Bridge Is Falling Down』 - 高田三九三訳詞・イギリス民謡

Linuxを使ってパケットキャプチャや、パケットロスや通信遅延といった通信環境のシミュレーションを簡易的に実施するという話です。

本格的な評価のための通信レミュレーションとなると、専用の機材を使わないと難しいこともありますが、簡易的な確認であれば、ノートPCに入れたLinuxだけでできるようにしておくと、特別な機材準備もいらないので、結構便利だったりします。メモもかねて残しておきます。

やりたいこと

  • 有線ネットワーク上のパケットキャプチャ
  • 通信の遅延や瞬断、パケットロスのレミュレーション

準備


パケットキャプチャ用の接続と設定

パケットキャプチャのソフトの方は、Wiresharkやtcpdumpを使えばいいんですが、問題は接続方法。最近は安くてコンパクトやミラーリング対応のスイッチングハブ(以下ものもとか)もあるので、それを使うというのが基本的な方法です
実際、ものさえあればそれが一番手間いらずですが、あとで説明するネットワークエミュレーションもあわせて実施できるようにするため、ここではブリッジを作成した接続方法を説明します。

USB-Etherの接続

Linuxをブリッジにするために、まずUSB etherを2本USBポートに差します。挿した直後は、ホストOSの方で認識されてしまうので、virtualbox側で認識させます。何も問題なければ、ゲストOS側にeth3, eth4で認識されます。ifconfigで見えているか確認しましょう。
USB etherを2個さす理由は、bridgeの両端用です。通信キャプチャしたい機器と機器の間に準備したPCが挟まるような形でLANケーブルを接続します。

例) 機器Aと機器Bの通信をキャプチャしたい場合
 [元の接続]
 (機器A) ----- (ハブ等) ---- (機器B)

 [接続変更後]
 (機器A) ----- (ハブ等) --- [(USB Ether1) 解析用PC (USB Ether2)] ---- (機器B)


内蔵のetherポートやホストOSとの通信用の仮想ドライバを片方側に割り当ててもいいのですが、ここは独立性が高くなるよう専用ポートを用意するようにしています。これだと、既存のネットワークとの接続を維持したまま、ターゲットのネットワークを見れるというメリットもあります。

bridgeの設定

USB etherが認識できたら、これらを両端としたブリッジを構成します。ブリッジの作成は、brctlコマンドで行います。brctlはbridge-utilsのパッケージに含まれますので、入っていない場合はインストールしましょう。
先ほどのUSB etherがeth3, eth4とすると、以下一連のコマンドでeth3とeth4を中継するbridgeデバイスが作成できます。

brctl addbr br0
brctl addif br0 eth3
brctl addif br0 eth4
ifconfig eth3 0.0.0.0 up
ifconfig eth4 0.0.0.0 up
ifconfig br0 0.0.0.0 up

bridgeデバイスの状態は、brctl show br0で確認できます。
うまくいっていれば、これで通信がbridgeされているはずです。 試しに、br0を通るパケットをtcpdumpやwiresharkで見てみましょう。
tcpdump -i br0
機器Aから機器Bへのパケットが見えていればOKです。

大抵は、これでOKですが、マルチキャストパケットの場合、IGMP snoopingのために通信が中継されないことがあります。とりあえず全キャプチャしたいという時には、混乱のもとになるので、IGMP snooping機能は無効にしておいた方が安全かと思います。
bridge-utilsはまだ対応していないので、/sys/devices/virtual/net/brN/bridge以下のファイルを変更することで、設定を変更します。multicast_snoopingの内容を1から0に変更します。
echo 0 > /sys/devices/virtual/net/br0/bridge/multicast_snooping

その他、Linux bridgeの詳しい内容については、以下が参考になります。


通信環境のエミュレーション

パケットロスや、通信速度といったにはnetem (tcコマンド)を使います。
先の手順で機器Aと機器Bの通信は全て解析用PCがブリッジしているので、tcコマンドで中継しているデバイス (br0、又は、eth3やeth4)に設定することで、機器Aと機器B間の通信に対する遅延やエラーをエミュレートできます。

4797373512 eth0に100ms遅延
tc qdisc add dev eth0 root netem delay 100ms

eth0を100ms±10ms(ランダム)の遅延 (先にaddしたものを変更)
tc qdisc change dev eth0 root netem delay 100ms 10ms

パケットロス率を0.1%に変更
 tc qdisc change dev eth0 root netem loss 0.1%

bitエラー率を0.1%に変更 (ランダムなオフセットに対して1bit error)
tc qdisc change dev eth0 root netem corrupt 0.1% 

パケット重複 (1%)
 tc qdisc change dev eth0 root netem duplicate 1%

パケットリオーダリング (5パケット毎に10ms遅延して送信)
tc qdisc change dev eth0 root netem gap 5 delay 10ms

設定したフィルタを削除
tc qdisc change dev eth0 root

その他、netem, tcコマンドの詳細は、以下が参考になります。

警察の初動捜査と同じで、不具合や問題の解析も何か起こった時にすぐ解析できるかどうかは、結果や経過を大きく左右します。簡易的であっても、手軽に解析できる環境をもっておくというのはいざという時に強い味方になります。

4897977967
【関連書籍】
ルーター自作でわかるパケットの流れ 小俣 光之
Linuxネットワークプログラミングバイブル 小俣 光之 種田 元樹
実践 パケット解析 ―Wiresharkを使ったトラブルシューティング Chris Sanders 園田 道夫
パケットキャプチャ入門 第3版 (LANアナライザWireshark活用術) 竹下 恵
パケットキャプチャ実践技術―Wiresharkによるパケット解析 応用編 竹下 恵

Windowsのネットワーク設定を切り替えを便利に

あちこち旅をしてまわっても、自分から逃げることはできない。
ヘミングウェイ

ノートPCを持ち歩いて使うと、IPアドレス設定等を場所や目的にしたがって切り替えたい時が結構あります。大抵は、DHCPで事足りるかもしれませんが、固定IPが必要なことも結構あったりします。ノートPCだと、イントラやインターネットに接続するという以外に、ちょっとした調査や解析のためにローカルなネットワークに接続したい時なんかもあるでしょう。

Linuxであれば、ifconfigの設定scriptを準備しておくというのが常套手段かもしれません。一方、Windowsの方は、あんまりなじみがないかもしれませんが、netshコマンドでコマンドラインからネットワークアダプタの設定ができます。GUIでももちろんできますが、Windowsのアダプタ設定は階層が深いし、なんとも使いにくい。。。そこそこ切替頻度が高いのなら、バッチファイル用意しておくことをおすすめします。
例えば、「ローカルネットワーク接続」の設定を、固定IPやDHCP設定に切り替えるの次のようなバッチファイルを用意すればOK。

dhcp.bat
netsh interface ip set address "ローカル エリア接続" dhcp
netsh interface ip set dns "ローカル エリア接続" dhcp

fixedip.bat
netsh interface ip set address "ローカル エリア接続" static 192.168.1.10 255.255.255.0 192.168.1.1 1
netsh interface ip set dns "ローカル エリア接続" static 192.168.1.1 primary
netsh interface ip add dns "ローカル エリア接続" 192.168.1.2

もう少し細かいところは、以下あたりのページが参考になるかと思います。

なお、netsh interface dumpしたものをnetshに食わせればOKという説明もありますが、文字コードがsjis+CRLFになっている必要があるので、powershellやcygwinのターミナルからnetsh dump実行すると文字コードがUTF8になったりしてうまくいかない可能性があります。また、dump結果に「はい」とかの日本語が入ってエラーになるということもあるので、最初から、上記の例のように必要最低限の内容を書きだして、バッチファイルにした方が早いかと思います。その場合も、SJIS+CRLFでの保存は必要です。

なお、用意したバッチファイルは、管理者として実行する必要があります。ショートカットを作って、毎回管理者権限で実行する設定をしておくほうが良いです。

ちなみに、私の場合、設定ごとにショートカットを作って、作ったショートカットをLaunchyからキーボードショートカットで呼び出して使っています。

ちなみに、Let's noteにはネットワークセレクターという切り替えアプリが入ってますね。

4774149543

【関連記事】
WindowsでCUI環境


【関連書籍】
Clean Coder プロフェッショナルプログラマへの道
整理HACKS!―1分でスッキリする整理のコツと習慣
IDEA HACKS! 今日スグ役立つ仕事のコツと習慣

Excelでのcsvで扱う際のあるある対策 - 書式の自動設定

善意、純情の犯す悪ほど困ったものはない。第一に退屈である。
中野好夫 -「悪人礼賛

データベースやログのエクスポート時のフォーマットとしてよく使われるcsv。テキスト形式なのでエディタでも開けますが、Windows環境であればExcelで開いていると思います。Excelでcsv扱うのは、便利ではありますが、いろいろ不都合や不満点があります。
よくあるのは、次のようなもの。
  • 書式が日付や数値に勝手に変換されてしまう。
  • セルの横幅を内容にあわせて調整したい。
  • 大きな表の場合に、毎度オートフィルタとウィンドウ固定するのが面倒

例えば、以下のようなcsvを開こうとしたとします。
DATE,TIME,ID,ID2
2013/12/1,10:00:01,0-1,A
2013/12/20,12:20:00,1-1,01
2014/1/1,15:10:30,A-1,A1
これをExcelで開くと以下のような見え方になります。

csv-in-excel

特に、最初の書式変換がかなりやっかいです。単に表示の書式があっていないというだけならまだいいのですが、ファイルを読み込む段階でセルの値が変換されてしまっているので、あとから対象の列の書式を変更(例えば、文字列として指定)しても意図しない値になってしまいます。
日付の列の幅が足りずに「####」になっていたり、C3の"1-1"は1月1日になり、C4の"01"は"1"になっています。特に値が変わっているものは、読み込み時に変換されてしまっているので、ファイルを開いてから、書式設定を文字列にしても元の値にはなりません。。

特に、勝手に書式が変わる件は、csvをExcelで扱う時の定番問題なので、ググるといろいろヒットします。基本的な対策としてあげられているのは、外部データの取り込みのテキストファイルウィザードを使うというもの。

参考) ITPro :CSVファイルを読み込んだら「1-15」のような製品番号が「1月15日」に変わってしまった!

確かにこの方法で開けますが、非常に手間が多くなってします。そこで同じようなことをするラッパーを用意することにします。ついでに、オートフィルタやウィンドウ固定等、毎回ファイルを開く度に行う操作も自動化させます。

以下ような内容のVBScript(WSH)を用意し、csvを開く時は、このスクリプトにドラッグ&ドロップします。「送る(Sendto)」メニューに入れてもおけば便利かと思います。

Dim xlApp, WS, FS, Args, TempFile, I, Format(255)

Set Args = WScript.Arguments
If Args.Count <> 1 Then WScript.Quit
If LCase(Right(Args(0),4)) <> ".csv" Then WScript.Quit

Set WS = CreateObject("WScript.Shell")
TempFile = WS.ExpandEnvironmentStrings(WS.Environment.Item("Temp"))
Set WS = Nothing
Set FS = CreateObject("Scripting.FileSystemObject")
TempFile = FS.BuildPath(TempFile, FS.GetBaseName(Args(0)) & ".txt")
FS.CopyFile Args(0), TempFile

For I = 0 To 255
    Format(I) = Array(I + 1, 2)
Next

Set xlApp = CreateObject("Excel.Application")
With xlApp
    .WorkBooks.OpenText TempFile, , , , , , , , True, , , , Format
    .DisplayAlerts = False
    .ActiveWorkBook.SaveAs Args(0), 6
    .DisplayAlerts = True
    .ActiveWorkBook.Saved = True
End With
' テンポラリtxt削除
FS.DeleteFile TempFile

Set xlSheet = xlApp.Worksheets(1)
'オートフィルタ
xlSheet.Cells.AutoFilter(1)
'ウィンドウ固定
xlSheet.Activate
xlSheet.Range("C2").Select
xlApp.ActiveWindow.FreezePanes = True
'サイズ自動調整 
xlSheet.Cells.Select
xlSheet.Cells.EntireColumn.AutoFit

xlSheet.Range("A1").Select
xlApp.Visible = True

Set xlApp = Nothing
Set FS = Nothing

VBAの中身はこちらのやりとり(CSVファイルを読み込んだときに文字 列として読みたい - Google Groups)をベースにさせて頂きました。textとして読み込むと同時に、Window固定とオートフィルタ設定を追加しています。
これで先ほどのcsvを開くと以下の様になります。

csv-with-excel-2

データ化けもなくなり、オートフィルタやウィンドウ固定もプリセットされるようになりました。なお、ウィンドウ固定の位置や、文字列以外にしておきたい列がある場合は、スクリプトの該当箇所を修正する必要があります。必要ならファイル名等で場合分けもできますので、そのへんは各環境や目的のファイルにあわせてということで。

しかし、csvの書式問題ってずいぶんと昔からある不満点のはずなので、せめてExcelの設定で読み込み書式を選択できるようにする(例えば、自動検出と文字列固定とか)はあってしかるべきと思います。自動認識もうまくはまる時は便利ですが、それ以外の時は単なる迷惑以外の何者でもないです。ぜひ、改善してほしいものです。

【追記】テキストとして開くと、項目内改行がされないみたいです。上のvbsだと元ファイルまでおかしくなってしまいましたので、そういったファイルには残念ながら使えません。csvで開くと書式化け問題になるし。。もっといい方法ないものか。。

4873113474

【関連記事】
WindowsでCUI環境

【関連書籍】
Excel Hacks 第2版― プロが教える究極のテクニック140選 David Hawley Raina Hawley 羽山 博
Windows自動処理のためのWSHプログラミングガイド 五十嵐 貴之
最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応 結城 圭介
続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに! 立山 秀利

Ubuntu12.04でatftpdを使う時の設定

僕はつい見えもしないものに頼って逃げる
君はすぐ形で示して欲しいとごねる
Mr. Children - NOT FOUND

開発環境用のUbuntu12.04上でatftpd(Advanced TFTP server)を動そうとした時に、少しハマったのでそのメモです。

まず、atftpdはaptitudeでinstallしておきます。

$ sudo aptitude install atftpd

デフォルトでは、inetd(Ubuntu12.04だとrlinetd)経由での起動になっていますが、不要なので単独daemonとして起動するように/etc/default/atftpdを変更します。
USE_INETDをfalseに変更して、これでOKかと思ったのですが、実際にこれで起動するとatftpdの起動に失敗します。解決策としては、同じく/etc/default/atfpdで、OPTIONSにポート番号指定(--port=69)を追加してやればOKのようです。

(参考)
TFTP Server atftpd fails to start - Ask Ubuntu

(/etc/default/atftpd 設定例)

USE_INETD=false
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --port=69 --maxthread 100 --verbose=5 /srv/tftp"

変更後、atftpdを起動し直します。

$ sudo /etc/init.d/atftpd start

ps等で起動しているか見てみて、atftpdが起動していればとりあえず起動は成功です。

念のため、動作確認するために、別のマシンor自分自身からtftpしてみます。
自分自身からアクセスするならtftp localhostして、適当なファイルをputして成功すればOKです。 うまくいかない場合は、エラーログ等参考に、root directory(/tftpbootとか)のpermissionやiptable等のフィルタ設定を見直しましょう。


4873114225 【関連書籍】
Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック 池田宗広 大岩尚宏 島本裕志 竹部晶雄 平松雅巳 高橋浩和
リンカ・ローダ実践開発テクニック―実行ファイルを作成するために必須の技術 (COMPUTER TECHNOLOGY) 坂井弘亮
起動プログラム ブート・ローダ入門─クロックの初期化や外部メモリの設定からOSの起動まで TECH I シリーズ (TECH Iシリーズ) Interface編集部
組込みソフトウェア開発入門 ~組込みシステムの基本を‐ハードウェアとソフトウェアの両面から学ぶ! 星野香保子 並木秀明 菊池宜志 日比野吉弘

gnupackでCygwin導入した時に最初にすること

人生の半分はトラブルで、あとの半分はそれを乗り越えるためにある。
八月の鯨』より

Windowsにgnupackを使ってCygwin環境をセットアップした時のメモです。

gnupackについては、emacsとあわせてアーカイブ展開するだけで、ある程度設定済の環境がすぐに使えるということで、手軽にCygwinを構築するには非常に便利です。とはいえ、いくつか設定等変更しておくと便利な部分もあるので、そのあたりのメモです。ベースとしては、gnupack_devel-11.00.exeを使っています。


apt-cygの修正

今現在最新の11.00だと、ちょっと前にCygwinダウンロードサーバ側の変更に追従できていないためにエラーになります。とりあえず修正必要なのは二点。

  • mirrorサイトのディレクトリパス変更へ追従 (でないと、apt-cyg updateでsetup.iniがnot foundになり失敗する)
  • tar.xzへの対応 (元のapt-cygだとbzip2決め打ちになっているので新しいパッケージ解凍に失敗する)

apt-cygの公式版の更新は止まっていますが、forkしたものがいくつかgithubで公開されているので、それをとってきて、/app/script/apt-cygを置き換えるのが手っ取り早いです。
forkの状況等は以下のページが詳しいです。

apt-cyg - PIB

また、プロキシ環境でapt-cygで使いたい場合は、/etc/wgetrcを~/.wgetrcにコピーして、proxy設定部分を書き換えておきます。


Cygwinパスとの互換性

gnupackではwindowsフォルダのパスが標準cygwinと少し違います。とはいえ、cygwin環境用のスクリプトで、内部でWindowコマンドを呼び出しているものなどがあると、標準Cygwinスタイルのパス(/cygdrive/c/...)を期待している場合があります。いちいちスクリプトを変更するのもの何なので、互換性確保のためにsymbolic linkをはっておきます。

# mkdir /cygdrive/
# ln -s /c /cygdrive/c

minttyの文字コードをUTF-8に変更

gnupackの場合、windowsコマンド等との互換性優先のためか、minttyのデフォルト文字コードがsjis(cp932)になっています。他の環境やツールとの互換性を考えると、utf-8の方がいろいろ都合が良いので、設定を変更しておきます。gnupack展開先のトップディレクトリにあるconfig.iniを書き換えます。

(config.ini.diff)

18c18
<     LANG           = ja_JP.cp932
---
>     LANG           = ja_JP.UTF-8

また、.vimrcの設定も標準でsjisになっているのでこれも書き換えておきます。
(sjis設定で上書き設定している部分をコメントアウト)

~/.vimrc.diff

2c2
< set encoding=cp932
---
> "set encoding=cp932

Windowsコマンドの文字化け対策

minttyの設定をUTF-8に変更して困るのは、Windowsコマンド(ipconfig等)の出力の文字化けです。標準Cygwin環境もデフォルト文字コードがUTF-8なので同じことになります。対策として標準出力をUTF-8に変換するラッパーを通すようにします。
文字コード変換にはiconvを使えばいいのですが、gnupackのデフォルトでは入っていないので、予めapt-cygでlibiconvをinstallしておきます。その上で、.bashrcに以下のようなaliasを設定すればOKです。

(~/.bashrc)

function wincmd() {
    CMD=$1
    shift
    $CMD $* 2>&1 | iconv -f cp932 -t utf-8
}

alias ipconfig='wincmd ipconfig'
alias netstat='wincmd netstat'
alias netsh='wincmd netsh'
alias cscript='wincmd cscript'

他に、必要な物があれば同じような感じで追加すればOKです。
なお、netsh interface dumpのように、標準出力をファイル出力したものを、そのまま別コマンドの入力として使うような場合には、ダンプしたファイルの文字コードがUTF-8のためにエラーになってしまうことがあるので注意が必要です。(PowershellもUTF出力なので同じみたいですが)


pingの切り替え

Windows7で、minttyからping打とうとすると、実行権限がないというエラーがでて実行できません。

# ping 127.0.0.1
ping: socket: Operation not permitted

minttyを管理者として実行すればいいのですが、それも面倒なので、Windows版のping (C:\Windows\system32\PING.EXE)を使うようにします。(Windows版だとpermissionにひっかからない)
.bashrcにaliasをはればいいのですが、minttyの文字コードをUTF-8に変えていると、他のwindowsコマンドと同じく文字化けしてしまうので、その場合は、上述の例と同じく、.bashrcで文字コード変換のラッパーををかますようにalias登録しておきます。

(~/.bashrc)

alias ping='wincmd /c/Windows/system32/PING.EXE'

設定関係はこれくらいで、あとは、必要なパッケージを追加で入れていきます。ssh, mingw64-i686-gcc-core, git, pythonなどなど。その辺は、それぞれの目的に応じてということで。

なお、gnupackは便利なのですが、最近更新が止まっているせいか、新しいバイナリをあとから入れるといろいろ問題があるようです。詳しく見てませんが、gnuplotやgroffは動きませんでした。ソースからコンパイルすればいいのかもしれませんが、本格的に使おうという人は標準Cygwinの方が結局手間がないかもしれません。

4774149543

【関連記事】
WindowsでCUI環境


【関連書籍】
詳解 シェルスクリプト Arnold Robbins Nelson H. F. Beebe 日向あおい
Windows コマンドプロンプト ポケットリファレンス 山近 慶一
Windowsコマンドプロンプト スパテク242 Vista/XP/2000対応 (スパテクシリーズ) 飯島 弘文

WindowsでCUI環境

人は習慣を好む、なぜならばそれを作ったのは自分だから。
バーナード.ショー

最近、仕事環境がかわったことで、職場のPC(Windoes 7)と、ついでに自宅で眠っているPC(Vista)をクリーンインストールからやり直しました。どちらの環境でも本格的なコード書くことはないですが、ちょっとしたスクリプト書いたり、ソースコードを読んだりすることはあるので、そのための環境も整えています。Windows環境でも定番で入れるアプリはいくつかありますが、その中で、CUI環境、キーボード操作改善関連のものをいくつか紹介しておきます。


gnupack (cygwin + emacs)

Cygwin

WindowsでCUIといえば、やはりcygwin。最近はWindowsもPowershellになって以前より使いやすくなってるらしいですが、いろいろ覚えるのもの面倒だし、やはりUnixライクな環境というのは便利なので入れています。gnupackは、Cygwinとemacsをアーカイブ展開するだけで使えるようにパッケージ化されたもので、導入が手軽なので乗り換えてみました。
emacsの方は、以前はMeadow使ってましたが、最近進化も止まっているのと、こちらの方がWindowsカスタマイズ済なので導入もお手軽ということで同じく最近乗り換えました。日本語入力も問題ありません。

gnupack (cygwn + emacs package) - SourceForge.JP


Launchy

Launchy

コマンド入力型のランチャ。コマンド入力でアプリやURL、フォルダを開けます。Launchy自身もAlt+Spaceで簡単に起う動する上に、コマンド入力も補完が聞くので少ないキーストロークで目的のアプリを立ち上げられます。私の場合、ショートカットを集めた専用のフォルダを作って、それをカタログに追加して使っています。

http://www.launchy.net/


Nostalgy (Thunderbird Add-on)

thunderbird

メーラはThunderbirdを愛用していますが、いくつか入れているAdd-onの一つが、NostalgyというキーボードショートカットのAdd-onです。メールの移動や、タグ付けがマウスなしで手早くできて非常に便利です。

Nostalgy :: Add-ons for Thunderbird - Mozilla Add-ons


Ctrl2Cap

capslock

emacsユーザーでなくとも、キーボードショートカット多用する人ならCapsのCtrl化は必須ですよね。Microsoft Technetで公開されているドライバです。

Microsoft Technet : Windows Sysinternals : Ctrl2cap


F1ブレイカー

F1

個人的には、Caps Lockと並んで存在が悪としか思えないF1ヘルプ起動。ESCキーを押そうとしてうっかりF1を押してしまう人は、これを入れて無効にしてしまいましょう。しかし、F1でヘルプ開く人なんてほんとにいるんでしょうか。。

F1ブレイカー : Vector


他にも、おすすめはありますが、とりあえずここまで。


4873114020
【関連記事】
gnupackでCygwin導入した時に最初にすること
gdbを電卓として使う
Caps lockとCtrl


【関連書籍】
Clean Coder プロフェッショナルプログラマへの道
整理HACKS!―1分でスッキリする整理のコツと習慣
IDEA HACKS! 今日スグ役立つ仕事のコツと習慣

再開

ここしばらく放置状態にしていたこのblogですが、最近ちょっと時間もできてきたので再開しようかと思います。
しばらく放置していたので、長期間更新なしで出る広告がもりもり出てるし、Google AdSenseも何かの表紙に停止されていました。。しばらくアフィリエイトブログ状態だったからかな。。

退会しようとするユーザーをつなぎとめる仕掛け

クオリティを与えよう。それが最高の広告だ。
ミルトン・ハーシー (ハーシーチョコレートの創業者)

月定額で動画が見放題ということで、昨年日本上陸したHulu。iPadや携帯、お風呂テレビなんかでも見れるので結構便利なのですが、最近はあんまり見る時間もなく、ほとんど使えていません。

ここ二ヶ月くらいは全く見ていないので、解約しようとページを開くと、そこに、「アカウントホールド」なる設定があることに気づきまhした。どうやら、しばらく休止状態にして、その間は料金もかからないようにできる模様。期限がくると自動で再開されてしまいますが、それまでのあいだに再開や、解約は自由とのこと。解約すると二度と再加入しないだろうけど、こういうオプションを用意しておくと、「また気が変わっても面倒だし、とりあえずは休止にしとくか」というユーザーも多いのではないでしょうか。かくいう私がそうでした :-P

退会しないで下さいといっても無駄ですが、こういうさりげない形で、ユーザーの意思でそちらを選ぶよう誘導するのって非常にうまいですね。

ちなみに、HuLuの設定は、Huluの「アカウント」=>「支払い情報」のところになる「アカウントホールドを利用する」から可能です。


Macbook airでBlu-rayドライブを使う

白鳥は哀しからずや 空の青 海のあをにも染まずただよふ
若山牧水

自宅PCをMacbook air (Mid2011 13")に乗り換えてから、しばらくはドライブ無しで使ってたのですが、さすがにないとやっぱり不便。ほとんど必要なケースはないんですが、CDリッピングくらいはやっぱりしたい。
一応、Windows PCもまだありますが、いちいちそのために別PCでWindows立ち上げるのも面倒。ということで、やっぱりドライブは購入することにしました。


さて、Macbook air用のドライブとしてまず候補にあがるのが、Apple純正のMacBook Air SuperDrive。専用ドライブなので見た目のデザインはMacbook airとの組み合わせでの機能は一番。itunesのバックアップなんかはこれでないとできないみたいだし。

Apple MacBook Air SuperDrive MC684ZM/A
B00485CHL8

とはいえ、このドライブ、Macbook air専用のため、他の機器では使えない。Windowsはもとより、Macbook Proでだって使えない。これはさすがにいまいち。
あともう一点悩ましいのがBlu-ray対応。どうせ新たに外付けドライブ買うのであれば、できればBlu-ray対応のものにしたいところです。自宅にはBDレコーダもありますし、別にMacでBDをみたいというわけではないんですが、BDレコーダでBDやDVDにバックアップとった個人ムービーを、PC環境でもう一度バックアップor編集したいと思うことが前々からありましたので。


というわけで、今回はsuperdriveはやめて、汎用のBlu-rayドライブを購入することに決めました。
私が購入したのは次のBUFFALOのポータブルBlu-rayドライブ(BR-PX68U2-BK)。

BUFFALO ポータブルブルーレイドライブ BR-PX68U2-BK
B002UD6CMK

旧モデルなので安かったのが決め手です。発売が古いため、バンドルされている再生ソフトも古く、Updateが必須という話もあるようですが、私の場再生用じゃないので問題なし。というか、そもそもMac用じゃないですしね。
ちなみに、このモデル含め、現在発売されているBlu-rayドライブはどれも公式にはMac対応していません(過去にあったようですが今は品切れ)。とはいえ、実際使っている限りは、何の設定せずとも問題なく使えています。メニューにもBD関連の設定が出ますので、Mac OS Lion自体にもBlu-ray対応はきちんと入っているようですね。


以下、簡単な動作確認結果です。

メディア書き込み (ファイル書き込み)読み込み
音楽CD - OK (itunesでリッピング)
CD-R OKOK
DVD-Video - OK (DVDプレイヤで再生)
DVD-R OK (Finderからファイル書き込み) OK
DVD-RAM OK (Finderからファイル書き込み) OK
BD-R (1層 25GB) (未検証) OK
BD-RE (1層 25GB) OK (Finderからファイル書き込み) OK
BD-RE (2層 50GB) OK (Finderからファイル書き込み)OK

書き込み速度も十分でています。
Blu-rayへの書き込みはできないかなと思っていたのですが、あっさりできたのは意外でした。あんまり書き込みすることはなさそうですが、うれしい誤算です。あと、DVD-RAMが使えるのものうれしい。


といことで、
・公式サポートでないということは気にならない
・自己責任で使う
・BDやDVD-RAMの資産がある
というMacbook airユーザーの方には、Blu-rayドライブはいいかもしれません。
私が買ったのは古い型ですが、BDXL対応の多分新しいモデルでも大丈夫かと思われます。

BUFFALO BDXL対応 ポータブルブルーレイドライブ BRXL-PC6U2-BK
B004T7V62G
PR

482228493X


人気エントリ
最近の記事
4873115655
PR
最近のコメント
4873114799
Links
プロフィール
  • Author:proger
  • 組み込み関係で仕事してます
4873115930
ブログ内検索