経験値倉庫

岸田 逸平(京都先端科学大学), Ippei KISHIDA(KUAS)

Last-modified:2022/03/03 21:14:31.

1 Contents

2 最新記事

2.1 ftp コマンドの ls でファイルリストが取得できない問題[2022-03-02]

職場のftp サーバ(仮に ftp.example.com とする)にログインできるが、 ls が正常に実行されない。

#正常
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 507      507          3811 May 14  2019 Rakefile
-rw-r--r--    1 507      507          1050 May 14  2019 Rakefile.upload
(snip)
drwxr-xr-x    3 507      507          4096 May 14  2019 vasputils
226 Directory send OK.
ftp>

上記のように即座にファイルリストが取得されるはずだが、以下のようになる。 ls の直後はタイムアウト待ちのように数十秒ほど待たされる。

#現状
ippei@RZ6 % ftp ftp.example.com
(snip)
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
ftp>

passive モードに切り替えても同様。

ippei@RZ6 % ftp ftp.example.com
(snip)
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (104,215,62,212,139,208).
ftp: connect: Connection refused
ftp>

2.1.1 解決

VM-ware の NIC 設定を NAT から ブリッジにしたら問題解決した。 see 部屋の中にも一年, VMwarePlayer上のゲストOSからFTPS接続ができない, NAT、ブリッジ、ホストオンリーの違い | VMware

2.1.2 環境と調査経緯

職場 FTP サーバ
|
+--------------+---------------+
|              |               |
居室Aルータ    別室Bルータ     別室C
|              |               |
PC             PC              計算機

PC はいずれも Windows で、VM-ware でゲストOS Linux

ルータの問題だろうか?以下を試す。

ダメなので、居室ルータが原因ではなさそう。

別室B と別室C の比較が手掛りか。

NETWIZ.JP トラブルシューティングのためのFTPプロトコル解説 これかな? vm-ware 上の Linux でやってるのが問題なのかも? ということで、 ラズパイの Ubuntu に ssh 接続して ftp したら ls で取得できた。 ということは vm-ware でトラブってたのか。

https://www.buffalo.jp/support/faq/detail/792.html で Windows ファイアウォールに VM-ware player を追加してみたが、だめ。 Windows ファイアウォールの問題ではないようだ。

VM-ware の NIC 設定を NAT から ブリッジにしたら問題解決した。 手順

  1. 稼働中の VM-ware をシャットダウン (NFS などが影響を受けるため)
  2. VM-ware で対象のゲスト OS の設定で、ネットワークアダプタの ネットワーク接続をブリッジに。アダプタの設定で NIC を正しく選択する。
  3. VM-ware 起動。ゲスト OS は DHCP で動くが、今のところ問題なし。

2.1.3 メモ:

NAT と FTP は相当相性が悪いようだ。 see トラブルシューティングのためのFTPプロトコル解説 FTP はコントロール通信とデータ通信があり、データ通信用のポートが動的に設定されるらしい。

2.2 [2018-03-30]

FileRenamer で学ぶ Ruby プログラム開発 に 『パッケージ化』を追記。

2.3 [2018-03-29]

Ruby 教育文書に、 FileRenamer で学ぶ Ruby プログラム開発 を追加。

2.4 rake の file タスクの挙動が変わった [2018-03-13]

いつものように文書ディレクトリで rake をかけると、 更新ファイルだけじゃなくて全ファイルでコンパイルがかかった。 更新ファイルだけにコンパイルがかかるようにしていた筈なんだけどなあ。

デスクトップではその症状が出て、 ノート PC ではその症状が出なかった。 ということは Rakefile の問題ではなく rake の環境依存が問題っぽい。 試してみたところ、rake のバージョンが

ということが分かった。 現在の挙動がバグならそのうち戻るかもしれない。 この挙動が仕様ならば、そのうちより多くの情報が出てくることが期待できる。 それまで我慢して全部コンパイルで使うのも一手ではある。 しかしまあ、最新版の 12.3 を捨てて 12.0 を使うようにすべきかな。

% gem list rake

*** LOCAL GEMS ***

rake (12.3.0, 12.0.0, 11.1.2, 10.5.0)

[~/doc]
ippei@As4 % gem uninstall rake -v 11.1.2

Select gem to uninstall:
 1. rake-11.1.2
 2. rake-11.1.2
 3. All versions
> 3
Successfully uninstalled rake-11.1.2
Successfully uninstalled rake-11.1.2

% gem list rake

*** LOCAL GEMS ***

rake (12.3.0, 12.0.0, 10.5.0)

上記では 11.1.2 を削除したが、同様にして 12.0.0 が最新になるように消していった。 これで望む動作が得られた。

ついでなので、どのバージョンからこうなったか確認しておいた。 12.1.0 をインストールして実行すると全部更新されて、12.0.1 はインストールできないようだ。 ということで、12.0.0 と 12.1.0 の間で起こったことなんだろう。 どういうコードの挙動でそうなるかは ~/.gem/ruby/2.3.0/gems/rake-12.{0,1}.0 を見比べれば分かる筈で、 diff -r してやればその差分は大した量でないことは把握できる。 しかし、まあそれは私がやる仕事ではないし、 修正の意図を把握するのが面倒なのでこの辺で切り上げることにした。

2.5 [2018-03-12]

2.6 [2018-02-23]

2.7 UNIX 今日の技: チャイムを鳴らす

高校までは授業の前後にチャイムが鳴っていますが、大学ではありません。 授業がなくても毎日決まった時間にゆるめの通知があると便利なことがあります。 ランチタイムや、終電に間に合うための帰り支度を始めるべき時刻に鐘が鳴るようにしていれば、 それまでの時間を集中することができます。 毎日決まった時刻にチャイムを鳴らすのは悪くない方策です。 そこで今回はチャイムを自作します。

2.7.1 mp3 を再生

まず、チャイムを鳴らせるようにします。 簡単なのは音声ファイルをオーディオスピーカーで鳴らすことです。 mp3 ファイルを作り、 mpg321 などで再生すれば良いでしょう。 今時の Linux ではサウンドドライバがデフォルトで入っているので、 オーディオスピーカーがあれば最も簡単に実現できます。

2.7.2 ビープの制御

私の場合はこの方法が使えません。 私は普段音楽を聞きながら作業をすることが多いのですが、 他人のいる部屋ではそうそうオーディオスピーカーから音を鳴らせないので、 ヘッドホンをしながら作業しています。 常にヘッドホンをしているのならオーディオスピーカーからチャイムを鳴らせば問題ないですが、 ヘッドホンをしていない時にチャイムが聞けなくなります。 チャイムはオーディオスピーカーとは別系統で鳴らせる方が便利です。

PC からの音声出力は、オーディオ出力だけではありません。 ビープ音があるじゃないですか! ということでビープ音を使ってチャイムを鳴らしてみましょう。

Linux の beep は実は高性能で、様々な音を鳴らすことができます。 beel -f 440 とすれば、 440 Hz の音が鳴ります。 beep -l 500 とすれば、 500 ミリ秒間だけ鳴らすことができます。 sleep と組み合わせれば、曲を演奏できそうです。

2.7.3 スクリプト

プログラムを作りましょう。 普段よく聞くチャイムは「ウェストミンスターの鐘」というらしいです。 ぐぐればメロディの楽譜もすぐに見つかるでしょう。 私は chime という名前のファイルに以下のようなコードを書きました。

#! /usr/bin/env ruby

## Westminster Chime

## 音階ごとの周波数。_S は半音上げる, _M はオクターブ下。
DO   = 440 * (2.0) ** (-9.0/12)
DO_S = 440 * (2.0) ** (-8.0/12)
RE   = 440 * (2.0) ** (-7.0/12)
RE_S = 440 * (2.0) ** (-6.0/12)
MI   = 440 * (2.0) ** (-5.0/12)
FA   = 440 * (2.0) ** (-4.0/12)
FA_S = 440 * (2.0) ** (-3.0/12)
SO   = 440 * (2.0) ** (-2.0/12)
SO_S = 440 * (2.0) ** (-1.0/12)
RA   = 440 * (2.0) ** ( 0.0/12)
RA_S = 440 * (2.0) ** ( 1.0/12)
SI   = 440 * (2.0) ** ( 2.0/12)
SO_M = SO * 0.5

## 演奏
LENGTH = 500 # millisecond
system "/usr/bin/beep -f #{DO  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH * 2.0}"
sleep LENGTH / 1000.0
system "/usr/bin/beep -f #{SO_M} -l #{LENGTH}"
system "/usr/bin/beep -f #{RE  } -l #{LENGTH}"
system "/usr/bin/beep -f #{MI  } -l #{LENGTH}"
system "/usr/bin/beep -f #{DO  } -l #{LENGTH * 2.0}"

440Hz がラで、1半音が 2 の12乗根ということでそれぞれの音階の周波数を出しています。 この曲に使わない音もありますが、 全部まとめて書いてしまった方がミスが混入しにくいです。 また、あとあと違う曲を作るのにも便利です。

演奏部ではまず、1拍に使う時間を 500 ミリ秒にしています。 system 命令で beep コマンドを実行します。 また sleep で休符を表現しています。 sleep の長さは ミリ秒ではなく秒なので、 LENGTH を 1000 で割ります。

実行して、音がなることを確認しましょう。 動作が確認できたら、chime を ~/bin/ に置きましょう。

2.7.4 cron で定期実行

作ったコマンドを cron に登録しましょう。

crontab -e を実行して、以下の行を書き加えます。

55 8  * * 1-5 /home/ippei/bin/chime #1
25 10 * * 1-5 /home/ippei/bin/chime #1end
40 10 * * 1-5 /home/ippei/bin/chime #2
10 12 * * 1-5 /home/ippei/bin/chime #2end
00 13 * * 1-5 /home/ippei/bin/chime #3
30 14 * * 1-5 /home/ippei/bin/chime #3end
45 14 * * 1-5 /home/ippei/bin/chime #4
15 16 * * 1-5 /home/ippei/bin/chime #4end
30 16 * * 1-5 /home/ippei/bin/chime #5
00 18 * * 1-5 /home/ippei/bin/chime #5end

最初の行は、「月〜金曜日の 8:55 に chime を実行する」ということを示しています。 chime のパスは私の環境になっています。 ~/bin/chime に置いた筈なので、 / から始まる絶対パスをここで指定しましょう。 ~ は使えないと思っておくべきです。 ~ の展開はシェルの機能ですが、cron はシェルを介さずにコマンドを実行するためです。

2.7.5 カッコー時計

カッコー時計を作ることも難しい事ではありません。 時分秒の時を取得して、その回数繰り返しでビープを鳴らしたらいいだけです。

3 文責