[C言語] 配列の添字に負の値は使えるか

今は終わりではない。これは終わりの始まりですらない。しかしあるいは、始まりの終わりかもしれない。

C言語で配列の添字に負の値を使うのは有りでしょうか。つまり以下のようなコードです。
  a[-1] = 0;
C言語では、配列int a[n]は、*((int*)(((int*)a + n))と等しいということなので、aが配列名、つまり、
  int a[10]
のように定義されたものなら、それは範囲外アクセスになってしまいます。
しかし、
  int b[10]
  int* a = &b[1];
のようなものであれば、*(a-1) = b[0]なので、問題なく動作します。

ということで、一応、言語的には使えなくもない負の添字ですが、不用意に使わない方が良いです。
例えば、以下のように有効な配列の範囲外を指すような使い方は、たとえ値参照しなくても使うべきではありません。
  int b[10]
  int* c = &b[-1];
C言語的には、ポインター 演算は、一度に割り振られた領域と、仮想的な"終端"を越えた1つめ の要素にだけ定義されていて、それ以外では未定義になります。よって、aが有効なアドレス空間の先頭に位置していた場合などに、a[-1]が有効なアドレスになるとは限らないということがありえます。
また、負の添字以前に、配列の添字に符号付き(signed)の型を使うのは、気づきにくい不具合を生む可能性があるという話もあります。例えば、次のようなコード。
#define ARRAY_SIZE 200
int my_array[ARRAY_SIZE];

int array(int n)
{
    if (n >= ARRAY_SIZE) {
        return -1;
    }
    return my_array[n];
}

単純なエラーチェック付きアクセサですが、これまた単純な配慮漏れがあります。
そう、nが負(マイナス値)の時の配慮が入っていないのです。

そのため、nがマイナスで渡されると、エラーチェックをすり抜けて、範囲外アクセスが発生します。この例では参照のみですが、値更新するような関数なら、任意の場所が書き換えられてしまうようなバグです。

さらに、あぶないのは以下のようなコード。
#define ARRAY_SIZE 200
int my_array[ARRAY_SIZE];

int array(int n)
{
    if (n >= ARRAY_SIZE) {
        return -1;
    }
    return my_array[n];
}

int func()
{
    char n = 150;
    printf("%d\n", array(n));
}
今後は、nがchar型になっています。char型は処理系によって、符号付きの場合と、符号なしの場合がありますが、符号ありの場合、150という値は保持されず、負の値になってしまいます。よって、負数を意図して使おうとしているわけではないものの、結果的に負数を使ってしまっています。
gccでは配列添字にcharを使っていると警告されるオプション(-Wchar-subscripts)があります。
charの暗黙の型変換は、いろんなバグの温床になるので、そもそもサイズのような変数の型にcharを使うのは、配列の添字に限らずやめるべきです。この手の変数については、符号なし型、できればsize_t(C言語ならstdlib.hで定義)を使うのが適切です。最新のC言語仕様であるC11の処理系であれば、オブジェクトの最大値を表す型としてrsize_tも使えます。


以上、C言語における配列の添字に負の値、あるいは、符号型を使った時の動作とリスクのお話でした。
この手の話は制約を理解して使えばいいという見方もあるかもしれませんが、ソフトウェア開発の現場等では、あとで別の人がメンテナンスする時の罠になりかねません。実際の現場では、あまりトリッキーなコードを書くのは控えておくのが望ましいですね。

4048919873 【関連記事】
【関連書籍】

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

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

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

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

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

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

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編集部
組込みソフトウェア開発入門 ~組込みシステムの基本を‐ハードウェアとソフトウェアの両面から学ぶ! 星野香保子 並木秀明 菊池宜志 日比野吉弘

本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索