あお日記

理系研究者のブログです。勉強したことや本の感想などを中心に残して行くつもりです。

proxy配下でのdocker buildについて(Docker for mac)

ひとまず現状のメモ。整理して更新予定。
環境としてはホストがmac OSX。Docker for macを使用(Version 17.03.1-ce-mac5)。
proxy配下かつローカルのDNSを指定している状況。
buildしようとしているimageはubuntu:16.04

うまく行くパターン

  • --build-arg使用
docker build --build-arg http_proxy=http://my_proxy:port .
  • Dockerfile内でENV利用
ENV http_proxy http://my_proxy:port
  • Dockerfile内でapt.confに設定
RUN echo "Acquire::http::proxy \"http://my_proxy:port/\";" >> /etc/apt/apt.conf

うまく行かないパターン

  • --build-arg使用だが大文字HTTP_PROXY
docker build --build-arg HTTP_PROXY=http://my_proxy:port .

ホストがUbuntuだと(確か)--build-argで大文字HTTP_PROXYでもうまく行っており結構ハマった。


おまけ:うまく行かない時にDNSのせいかと思ってDockerfile内でcat /etc/resolv.confしてみたところ

# Generated by dhcpcd from eth0.dhcp
# /etc/resolv.conf.head can replace this line
nameserver 192.168.65.1
# /etc/resolv.conf.tail can replace this line

とのこと。192.168.65.1ってどっから来たのか。ググったところDockerが用意しているようだけど実態がよく分からない。

Node-REDのインストール

Node-REDをnpmを使ってインストールする際に詰まったのでメモ。

バージョンはNode-REDがv0.13.1, Node.jsがv0.12.4 でした。

公式サイト (Node-RED) ではNode.jsをインストールしてnpmコマンドでOK!と書いてあるがやってみると下記のエラーが。

Node-RED has not been built. See README.md for details

調べて見るとnpmのバージョンが古いのが原因のようでした。
node-red command won't work after npm install · Issue #749 · node-red/node-red · GitHub

下記のコマンドを実行して再度Node-REDをインストールをしたら解決しました。

$ sudo npm install -g node-red

Ubuntu 14.04.3をUEFIモードでインストールした時に詰まった

Ubuntu 14.04.3をサーバにインストールする際、UEFIと外付けのUSB-DVDドライブが原因で少し詰まったので残しておきます。

環境としては
OS: Ubuntu server 14.04.3
サーバ: Supermicro X9DRH-iTF
でした。

はじめUEFIとは何かも分かっておらず、通常通りダウンロードしたUbuntuのisoイメージをCDに焼き、CDからboot、インストールと進めていました。するとインストールは完了するのですが起動できない。

調べてみると、ファームウェアBIOSではなくUEFIで動作しているため適切なパーティションがインストール時に作成されておらず起動に失敗するようでした。
UbuntuTips/Install/UEFI - Ubuntu Japanese Wiki

そこから検索をかけたりマザーボードの設定項目を洗ってみたりするけどどうも「UEFIモードで起動」というのが出来ない。設定項目が見当たらない。

結果としては、サーバにドライブが付いていなかったため外付けしていたUSB-DVDドライブがUEFI対応していなかったのが原因のようでした。古いドライブなどにはUEFIブート非対応のものがあるようです。

幸いIPMIポートがあったので、最終的にはIPMIのVirtual Mediaを使う事で解決しました。
IPMI Virtual Media(仮想メディア)機能 | 技術情報 / Engineering Library | Supermicro国内正規代理店 ソフトバンク・テクノロジー株式会社

Virtual Mediaにisoを設定し、ファームウェアのboot設定を確認すると、UEFIモードのドライブと通常モードのドライブが増えているのでUEFIを選択し、あとは通常通りインストールすると無事起動できました。UEFIモードで起動できていれば特にパーティションの手動設定などは要りません。

その他試していませんが、UEFI対応の光学ドライブを用意する/ファームウェアをレガシーBIOSに設定しインストールする、等でも解決できたかも?
以上、つまった誰かのお役に立てれば嬉しいです。

ローカルのNode-REDにhttpsアクセスする方法

タイトルの通り、ローカルでNode-REDのテストをしていた時
デフォルトだとhttpsアクセスができなかったのでその方法。
環境はMacです。

まず下準備としてlocalhosthttpsアクセスするための
鍵などの準備をします。下記URLを参考にさせて頂きました。
ここで設定した秘密鍵と証明書の配置場所はあとで使います。
Macに最初から入っているApacheでSSL通信する環境を整えた | karakaram-blog


続いて本題のNode-REDのインストール。方法はgitのREADMEにある通り。
npmというコマンドを使用します。
node-red/node-red · GitHub

インストール後、settings.jsという設定ファイルの内容を書き換えます。
手元の環境では以下のパスにありました。
/opt/local/lib/node_modules/node-red/settings.js

変更内容としてはコメントアウトされている以下の箇所をアンコメントします。

//var fs = require("fs");
//https: {
//    key: fs.readFileSync('privatekey.pem'),
//    cert: fs.readFileSync('certificate.pem')
//},

'privatekey.pem'と'certificate.pem'は上記の作業で
実際に配置した場所の絶対パスに置き換えます。
(参考URLのやり方に従うと拡張子はpemではなく
それぞれkey, crtとなっていますが問題ありません)

これでNode-REDを起動するとhttps://localhost:1880でアクセス可能になっているはず。

追記:
上記をすると逆にhttpではアクセスできなくなるので注意。
どちらでもアクセスできるようにすることもできるのかな?

余談:
Node-RED触っているとLost connection to server というエラーが出たので消し方を調べたところ
httpsにすれば良いよ、という記事がありhttpsアクセスできるようにしたのですが
エラーは消えませんでした。悲しい。

人工知能は人間を超えるか ディープラーニングの先にあるもの:松尾豊

読書ネタで久々に更新。

東京大学の先生である松尾豊さんの
人工知能は人間を超えるか (角川EPUB選書)

仕事でディープラーニングの話が耳に入ってくるのですが
中身がよく分かっていなかったので入門書として読みました。

過去の人工知能研究の歴史から、非常に分かりやすく書かれており、
人工知能機械学習、ディープラーニングの基礎知識を得る事ができます。
読むのに数学の難しい知識は必要ありません。

私は読書前はディープラーニングの凄さポイントが分かっておらず、
「今までの手法と比べて大きく精度が上がったことが凄いのかな」
「特にコレが新しくできるようになる、という事はないのかな」
と思っていたのですが大きく認識が変わりました。

ディープラーニングの凄さは、本書の言葉をお借りすると
「頑健な特徴表現学習を実現した」
それによって、
「コンピュータが自ら概念を獲得する事を可能とした」
という事になるでしょうか。

本書にもありますが、一見その凄さが分かりにくい
「グーグルがネコを認識する人工知能を開発した」
というニュース。
これが実は世界を大きく変えるかも知れないインパクトを秘めています。

自分の研究分野にも飛び火してどんどん応用が広がっていくのか、
これから世界が大きく変わっていくのか、とても楽しみです。

人工知能やディープラーニングに興味のある人には
オススメの一冊です。

jqコマンドで値が変わって困った話

JSONを見やすく表示するためにjqコマンドを使っていた際、整形前後で値が変わっており困ったのでブログに残しておきます。

jqの中で数値をdoubleで持っている事が原因のようですが、コードを読んだりはしていないので別部分かも知れません。

以下は具体的に詰まった状況。

ryuが提供しているofctl_rest.pyを使ってREST APIでdpidの値を取ってました。
まずはデフォルト。値が少し見づらいです。

User:~$ curl -s -X GET http://localhost:8080/stats/switches
[992291725058348458]User:~$ 

そこでjqを使うとこうなります。お尻の方が丸まってしまい値が変わっています。
数値精度の問題のようですが、この現象に気付かずしばらく困りました。

User:~$ curl -s -X GET http://localhost:8080/stats/switches | jq '.[]'
992291725058348400

解決策として、デフォルトのままでも良いのですが変わりにpython -mjson.toolを使うと値はそのままで見やすく表示できました。

User:~$ curl -s -X GET http://localhost:8080/stats/switches | python -mjson.tool
[
    992291725058348458
]

めでたしめでたし。
こちらのブログを非常に参考にさせて頂きました。ありがとうございました。
やっぱりdoubleでは「76287755398823936」は表現できない | ψ(プサイ)の興味関心空間

Ryuでパケットをドロップする方法

Openflow ControllerであるRyuを触っていて特定の条件にマッチしたパケットをドロップする方法が分からなかったので調べた。

見つけたMailing Listにはactionsをemptyにしろとある。

> I want to install rules on switches to drop packets coming from a specific
> IP address.. I checked all OFPP actions, but could not find and action
> similar to "drop".. so I would like to have any advices to deal drop
> action..
IIRC, a match with empty actions drops a matched packet.

http://sourceforge.net/p/ryu/mailman/message/31977966/

実際には下のようにactionsに[]を使用する事でできた。
add_flowのactionsの部分に直接[]を記述しても良いみたい。

    match = parser.OFPMatch(eth_type=0x806, in_port=in_port, arp_spa='192.168.1.1')
    actions = []
    self.add_flow(datapath, 1, match, actions)