読者です 読者をやめる 読者になる 読者になる

cpanコマンドで「Cannot allocate memory」が出る

perl

cpanで何かモジュールをインストールしようとすると 

 Using Tar:/bin/tar xf "Web-Scraper-0.38.tar":
Couldn't untar Web-Scraper-0.38.tar: 'Cannot allocate memory'
MIYAGAWA/Web-Scraper-0.38.tar.gz
Had problems unarchiving. Please build manually

 と怒られてしまい先に進めない。「Cannot allocate memory」というエラーを文面通りに受け止められず(何しろほとんどメモリを消費するプロセスはなかった)、色々調べてみたのだが、どうやら本当にメモリ不足の模様。awsのt2.nanoでは動かないらしい(httpdmysqlなどは止めてみたが効果なし)

total used free shared buffers cached
Mem: 503264 306660 196604 64 22016 188804
-/+ buffers/cache: 95840 407424
Swap: 0 0 0

 これで足りないというのだからcpanはどれだけメモリを食うのだろう……。

結局、かなり以前からApp::CpanminusというMIYAGAWA氏が作った軽量版のcpanが強く勧められていたこともあり、こちらをインストールしたところ、すんなりインストールすることができた。(当時からcpanコマンドは色々と評判が悪かった)

rootになりcpanからinstall App::Cpanminusとすると怒られるのだが、tar.gzファイルのフルパスが出るので、それを自力でtar xvfzし、展開された階層でperl Makefile.PLとし、そうするとMakefileが出来るので普通にmake installとするとcpanmコマンドがインストールされる。

使い方としては、cpanコマンドは単純にcpanで起動し、install XXXとしてモジュールをインストールするのだが、cpanmコマンドはcpanm XXXとしてコマンドラインで直接モジュール名を指定するとインストールが開始される。

当然cpanコマンドと同様依存関係も全部チェックしてくれるのでcpanコマンドがうまく動かない場合は移行してみると良いかもしれない。

ダイビングで「水深10mにつき1気圧」と教わるのはなぜか

 たまには技術から離れた話を書きます。

 

ダイビングのライセンスを取る時に「海水では水深10mで体が受ける圧力が1気圧上昇する」という風に習います。でもそれってちょっと都合良すぎない? 海水は比重が水よりも重いし、1気圧だってちょうど1,000hPaではないはず。

1気圧って何?

単位としての「気圧(標準気圧)」は「フランス付近の海抜ゼロメートルにおける平均的な気圧」を元に1,013.25hPaちょうどと定められているようです(理科年表より)。他方hPaはSI単位系メートル法などから構成されているので、1,000ぴったりにならないのは当然なんですね。天気図などで見る気圧が1,000前後を指しているのも偶然のようです。

じゃあ深さ10mの海水の気圧を計算しよう

水圧はP(Pa)=pghが「近似式」です。この時、pは要するに液体の比重(kg/m^3)になります。でも海水なので水より重く単純に1,000kg/m^3ではありません。海水の比重は1020 - 1035kg/m^3、だいたい1030と取りましょう。すると水深(h)10mでの1m^2あたりの海水の重さは10,300kg/m^2(N)となります。次に重力加速度gは9.80665m/s^2なので掛け合わせると約101,000Pa=1,010hPa。おお、標準大気圧(1,013.25 hPa )とほぼ重なりますね。偶然に偶然が重なって「10mでほぼ1気圧」となっているようです。

ちなみに

ちなみに、普通にダイブする場合、水の上に大気が載ってるので、体にかかる圧力は10m=2気圧、20m=3気圧となります。たった10mで体が受ける圧力が倍になるとは水って怖い……。スポーツとしてのダイビングでは50m以上潜ることはまずないので目安としては適当かな、となります。ちなみにこの誤差がなかなか少なくて、海面下6500mの水圧は……諸説あるらしいですが、10m=1気圧から大きく外してはいないようです。偶然って怖い。

 

seppina.cocolog-nifty.com

 

たしかに普通のダイバーにとっては「とにかく10mで1気圧なんだよ!」でいいような気がしてきました。なるほど、重力定数が10よりやや少ないってのと、海水が水よりやや重いってのが微妙にバランスを取ってるんだなあ。

 

もちろん淡水でダイブする場合は10m=1気圧より気持ち少なく見積もります。

 

 

リピータ・ハブとスイッチング・ハブ

Q&A スイッチング ハブとリピータ ハブはどう違うのですか?

 

リピータ・ハブというのは実はあまり聞いたことがないのだが、おそらくスイッチング・ハブが出てくる以前のハブがそういう仕組みであったのであろうという理解(物理的にケーブル同士を結ぶだけだと機能しないため)。

 
元々Ethernetってのが、俗称イエローケーブル(10BASE5ケーブルという図太い同軸ケーブルに等間隔にトランシーバーを(物理的に)ぶっ刺して、同じ信号を共有していたのだけど、輻輳が起きやすいこと(同じ信号を同じケーブルに流しているので。逆に言うとここまで単純な構造でp2pでデータをやりとりできる仕組みは画期的だった)、遠距離ではノイズや減衰の影響を受けること、狭い場所では取り回しが効かないなどで出てきた装置がハブ。名称が示す通り、ハブーハブ間の通信が出来ることも大きな特徴。これにより遠距離間通信が細いケーブルで実現できるようになった。
 
受け取った信号のノイズや歪み、減衰やエラーなどを訂正し、「きれいな」信号としてそのまま送り返すのがリピータ・ハブ。ハブの機能を持たず、単純に信号を訂正する装置としてリピータというものも存在する(主に長距離間通信の中継用途)
 
 
様々な信号が全てのケーブルに同一に流されるのは効率が悪いので、元先を選別して必要なケーブルに必要な信号しか流さないようにしたのがスイッチング・ハブ。これによって従来のEthernetに存在した輻輳の問題は解決した。
 
いずれも、Ehternetの送受信側、要は端末側の変更がほとんど必要でないことから急速に普及した。
 

Rapsberry Pi 2で高出力リモコン操作を行う

Qiitaの以下の記事

qiita.com

に触発されて自分でもエアコンをコントロールしたいと思い、Rapsberry Pi 2 B (1)を購入しました。上記記事はちょっと古いため書いてある通りにしてもうまく行きません。特に赤外線送信が短距離でしか行えないという問題点があります。調べてみると多くのブログでこの現象に悩まされているようです。試行錯誤の末、通常のリモコン程度の出力は出せるようになったので紹介したいと思います。

結論から言うと、LEDにもっと大きい電流を流せばよいだけでした。リモコンの赤外線出力は38kHzのパルス波を信号として使っているため、条件によっては定格の10倍くらいの電流が流れても壊れてしまうことはないということです。

「パルス波は300マイクロ秒以上が1単位では?」と思った人は以下のサイトが参考になるかと思います。

http://elm-chan.org/docs/ir_format.html
f:id:canadie:20150906100431p:plain

38kHz(26マイクロ秒)のパルス波を数百マイクロ秒単位で明滅させてます。つまりリモコンのパルス信号のHIGH部分(信号が出てる部分)を細かく見るとそこもパルスになってるんですね。赤外線は日常にも溢れていますから、受光器(テレビとか)は赤外線のうち38kHzの部分を取り出し(検波し)てからパルス信号の解析を行っているようです。

データシートを見てみましょう。

OSI5FU5111C-40.pdf

f:id:canadie:20150906094347p:plain

ぱっと見、「DC Forward Current」が定格に見えるので100mAしか出せないことになります。リモコンが届かないという人はこの数字を参考にしてるかと思います。しかしその下に、「Pulse Forward Current」というのがあって、パルス順方向の定格が1,000mAとなっています。ただしこれには条件があり、PDFによれば

*Pulse Width≦100us, Duty≦1/100

つまり、100マイクロ秒(0.1ミリ秒)のパルス波で、Duty比が1/100の時に限ると書いてあります。Duty比というのはパルスのうち信号が流れている期間と流れていない期間の比率です。ちなみに赤外線リモコンは38kHzなので1/38,000=26マイクロ秒なので問題はないですね。ただしDuty比が赤外リモコンの場合1/2です。しかし、38kHzのパルスを数百マイクロ秒明滅させているわけなので、微妙ですがそこそこ流してもLEDは大丈夫そうです。

検索していると以下のサイトを見つけました。600mAを流そうとしているようです。5V電源の容量を気にしているようですが、

Raspberry PiのGPIOの配置図と基本的な説明 | ものづくりエクスペリメント

によると電源に2A以上流れて入れば大丈夫そうです。私は750mA流してみました。12.5mA流れば良いようなので

(3.3-0.9)V÷0.0125mA=192Ω

192Ωの抵抗を入れれば良いようです。ちょっと余裕を見て200Ωの抵抗を入れることにしました。

f:id:canadie:20150905143754p:plain

これで普通のリモコンと同じぐらいの出力が出るようになりました。ちなみにLEDは電圧が高すぎると電流がいくらでも流れるようになってしまうらしく、これを防ぐためにお守りで10Ωの抵抗を挟んでいます。ベース・エミッタ間の抵抗をもう少し流れるようにして出力を上げてみたいとも思いますが、今のところこの回路でも充分なパフォーマンスが出ているので良しとします。

なお、普通のリモコンと同じように壁に一度反射させてもエアコンの電源がつきました。

他でも振れられていますが赤外線LEDは指向性が強いので、部屋中のものの電源を操作したいのであればLEDを複数つけるとか、ゴムキャップを付けるなどの対策が必要だと思います。LEDを複数つける場合には、同時点灯だとRaspberry Pi側の出力が足りなくなると思いますので外部電力が必要かも知れません(別々の回路に順番に流すという方法も考えられなくはない)