マダカレークッテナイデショー

お仕事SE、趣味ドラム

dlib がインストールできない

環境

windows10 64bit 上の 仮想マシン(virtual box, debian)

できなかったこと

sudo pip install dlib

最終的に下記が出て失敗

error: cmake build failed!

結論

仮想マシンのメモリが足りなかった。512MB -> 2GBに増量で解決。

試したこと

ソースを直接落として、setup.pyからやってみる

ダウンロード

$ wget http://dlib.net/files/dlib-18.18.tar.bz2
$ mv dlib-18.18.tar.bz2 dlib-18.18.tar
$ tar xvf dlib-18.18.tar

(※bz2をそのまま解凍しようとしたら失敗)

インストー

$ cd dlib-18.18
$ sudo python setup.py --no USE_SSE4_INSTRUCTIONS

※ 下記を参考にオプションをつけてみた。

https://github.com/davisking/dlib/issues/111

結局、失敗する。

よく見ると、下記のようなログが出ていた。

  c++: internal compiler error: Killed (program cc1plus)
  Please submit a full bug report,
  with preprocessed source if appropriate.
  See  for instructions.
  CMakeFiles/dlib_.dir/build.make:123: recipe for target 'CMakeFiles/dlib_.dir/src/svm_c_trainer.cpp.o' failed
  make[2]: *** [CMakeFiles/dlib_.dir/src/svm_c_trainer.cpp.o] Error 4
  CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/dlib_.dir/all' failed
  make[1]: *** [CMakeFiles/dlib_.dir/all] Error 2
  Makefile:117: recipe for target 'all' failed
  make: *** [all] Error 2
  error: cmake build failed!

  ----------------------------------------
  Failed building wheel for dlib

ログはちゃんと見ましょう、、、

dlib, install, debian, linux

ラズパイにKeras、TensorFlowとOpen CVを入れたときのメモ

Kerasを使ってみたい、ということで以下を参考に導入してみる。

qiita.com

基本的には上記の手順通り。ただ、根本的なところ(virtualenvの使い方)などで少しはまったので、自分が気になったところを残しておく。

OpenCV3インストール

環境を作成するとき、

mkvirtualenv cv -p python2
mkvirtualenv cv -p python3

自分の使いたい環境に合わせて、どちらかのみ作ればよい。 自分は(python2にしたかったのに)何も考えずどちらも実行して、あとで戻ってきた。

TensorFlowインストール

virtualenvでpipするときは、sudoは使わない。(システム環境の方のpythonにインストールされてしまう?)

Kerasインストール

こちらも、sudoは使わない。特に、kerasのインストールは時間がかかる(自分は一晩放置した)ので、やり直すのはなかなか面倒。

ただし、事前に

sudo apt-get install libhdf5-dev

をする必要がある。
このあと、学習済みモデルの利用の段階で必要になる。 その後、以下を実施(やたらと時間がかかる)

pip install h5py
pip install keras

学習済みモデルの利用

git clone https://github.com/fchollet/deep-learning-models
cd deep-learning-models

ここで、elephant.jpgを直接保存して、同ディレクトリに配置しておく

python inception_v3.py

それらしい結果が出た。
(実際には、TensorFlow ~ Keras の手順を何度かさまよった)

改造 以降

  • InceptionV3()は、数分時間がかかる。
  • ひとつひとつの認識は、5秒程度。(Raspberry pi B+)
  • ssh経由ではできない。(新たにウインドウを立ち上げようとするので。HDMIでつないで直接やるか、VNCなどで接続。)
  • cv2.waitKeyは、新たに立ち上がったウィンドウに対する入力を待つ。(コンソールではない)
  • 別のデバイスでカメラを使っていると怒られる。自分はmotionを起動していたので、sudo service motion stop した。

その他、疑問

  • opencv
    初めて使った。今回は初めて尽くしだったので、いろいろとつらい。でも、面白そうだ。ラズパイにこだわらず、普通にwindows環境でも使ってみよう。

  • virtualenvは便利
    それ故に自分がどの環境に対して操作しようとしているか意識しないと面倒になる。

  • virtualenv
    上記の詰まった箇所で、システム環境にインストールしたものをvirtualenvにリンクしなおす設定とかがありそうだが、未調査。
    また、virtualenv環境では、権限はどう考えたらよいのか。具体的には、sudo pip と pip したときは何が違ってくるのだろうか。 とりあえずシステムの環境に干渉しないように、pipで実施したほうがよさそう。

Raspberry pi で VNCServerをchkconfigに登録してもうまく起動時に起動できない

前提

他のサイトを参考に、VNCServerの導入自体は完了している。

  • /etc/init.d/vncbootのchkconfigへの登録はOK
  • 実行属性の変更もOK
  • /etc/init.d/vncboot start を直接実行すると問題ない

対処

ログを調査

$ less /var/log/syslog | grep vnc

Apr 30 13:56:41 raspberrypi systemd[2189]: Failed at step EXEC spawning /etc/init.d/vncboot: Exec format error Apr 30 13:56:41 raspberrypi systemd[1]: vncboot.service: control process exited, code=exited status=203 Apr 30 13:56:41 raspberrypi systemd[1]: Unit vncboot.service entered failed state.

そもそもうまく実行できてないようである

スクリプトを修正

他のinit.d以下のスクリプトと比較して、以下の2点を修正

  • #! /bin/sh -> #!/bin/sh に変更(半角スペース除去)
  • #!/bin/sh をファイル先頭に持ってくる

上記2点を修正。後者だけでも良いかもしれないが、確認はしていない。 調べてたら、改行コードなどで引っかかる場合もあるらしい。Linuxあるあるなのか。これで解決する理由もよくわかってない。つらい。

参考

Exec format error で検索したときの以下が参考になった(直接的には関係ないが)

MemoIt: sudoではまった

追記

bashのシェルスクリプトの記述に関してメモ等 - Qiita
Linux/Unixでは、ファイルの先頭2バイトが「#!」であった場合は、その後に記述されている別のコマンドを実行することになります。」 とのこと。そもそもスクリプト自体はコピペしてきたものだけど、他の人はそれでも実行できてたのだろうか。この感じだと、実行できなさそうだが、、、
なにはともあれこれからは気にかけよう。

データベーススペシャリスト受験記

2017年春に受験。結果はおたのしみ(微妙)。 効率的に勉強するために実施したことをメモ。(詳細な対策については参考になる情報がほかにたくさんあるので、省略。)

準備

過去問ダウンロード

午後1、2の問題をダウンロードしておく。 一括で取得するために、以下を参考にまずURL一覧を取得。

IPA 情報処理技術者試験過去問のURLリスト作成 · GitHub

取得したURLリストを使って、wgetでダウンロード。

過去問印刷

当初はすべてタブレットで見ようとしていたが、特に午後2対策の時にはページを行ったり来たりするので、限界を感じた。 そのまま印刷すると量が莫大になるため、ちょっと工夫。

PDFを結合

ダウンロードしたPDFはロックがかかっていて編集できないので、PDF印刷 -> プリンタ:Microsoft Print to PDFで別ファイルとして(印刷したい対象を)保存しておく。
(ひとつひとつ手作業になってしまうが、代替手段が思い浮かばなかったため、仕方なし)

その後、フリーソフトを使って、午後1、午後2それぞれで一つのPDFにまとめる。

PDFを編集

ページ数を削減するために、フリーソフトを使って、問題に関係ない部分を削除する。
(どの年度かわからなくなりそうなので、各年度の表紙は残した)

コンビニで印刷する前に

近所のコンビニは、1枚当たりのページ数が2ページまでしか設定できなかった。これではページ数がまだまだ多い。 編集したページをMicrosoft Print to PDFで別ファイルとして保存する。このとき、用紙をA3サイズ、1枚当たり8ページしておく。

コンビニで印刷する

作成したファイルを、コンビニでA3サイズで印刷する。 午後1の問1、2、午後2の問2をH18くらいまでさかのぼって印刷したけど、500円くらいでおさまった。

対策

対策本は、以下の2つ。定番のやつと、SQLが不安だったので別に1冊。(実務でDBを触ったことがない。)

情報処理教科書 データベーススペシャリスト 2017年版

情報処理教科書 データベーススペシャリスト 2017年版

午前2

データベーススペシャリスト過去問道場|データベーススペシャリスト.com

このサイトで、主に通勤時間などに勉強。すごく素晴らしいサイト。 対策本を読む前に1周しておくと、何がわかってないのかがはっきりするので、勉強効率がUPすると思う。 対策開始時と、受験直前の合計2周。

午後1

問1、2に絞って勉強。 特に問1は、午後2対策をすることによっても解けるようになるので、少し感じをつかんだら午後2対策に移って、再度戻ってくるといいかも。

午後2

問2に絞って勉強。

proxytunnelでプロキシを越える

あるクライアントA(のプログラム)からプロキシBを超えて外部のサーバC(hogehoge.com:1234)に通信したいとする。 プロキシに阻まれて通信できないとき、proxytunnelというツールでプロキシを越える。 いろいろ調べてみても、英語ばっかり、かつ書いてある情報は「ssh接続するためには?」的な情報が多くて迷ったのでまとめておく。

まず、必要なこと。

proxytunnelの導入

以下からダウンロードする。
http://proxytunnel.sourceforge.net/download.php
windowsではcygwinビルドが必要らしい。ビルド済みのものが入手できるのでそれを利用。
クライアントAの適当な箇所に配置。

proxytunnnelの設定

コマンドラインから、以下のように起動する。

proxytunnel.exe -a 10000 -p your.proxy.co.jp:8080 -d hogehoge.com:1234 -P username:password

-a はproxytunnnelで使うポート
-p はプロキシ
-d は接続先(サーバCのURI)
-P はプロキシの認証情報

クライアントA(のプログラム)の設定

上記の通りproxytunnelを起動させておき、hogehoge.com:1234ではなく、localhost:10000につなぐようにしておく。

サーバ側の設定

特に不要。クライアントからの通信ができるようにはしておく。


以下、気になったこと

サーバ側の設定は不要なの?

80とか443のポートで通信を待ち受けて、それを通信したいポートに流すリバースプロキシ的な設定がいると想像していた。HTTP CONNECTという任意のポートと接続を確立するメソッドを使っているらしく、そういう設定は不要。
つまり、proxytunnnelがやってくれてることは

  • プロキシ認証(とその情報の保持)
  • もともとの通信をHTTP CONNECTメソッドにラップして通信を代理

ということだろうか。
proxytunnnelのページにも書いてあったが、プロキシ自体がCONNECTメソッドを制限(それ自体を禁止しているか、ポートを絞っている)と使えないらしく、環境による。

proxytunnnel以外のツールも調べてみると、リバースプロキシっぽい設定も書いてあったので、ツールによってこのあたりの方法は違うのかもしれない。 それにしても、このネットワーク周りの話は疎いので、いざというときいろいろ困る。

そのほかのオプション

リモートプロキシの設定がうんたらかんたらとか書いてあったが、この場合でのローカルプロキシとリモートプロキシの違いが不明。 2段階でプロキシを越える場合?それともリバースプロキシがある場合の設定?よくわからない。

使うことについて

そもそもプロキシでアクセスを制限しているのは、セキュリティやらなんやらその組織の都合によるもののはず。 こういったツールを利用すること自体が、組織のルールに沿っているものかは確認しておいた方がよさそう。

追記

入手先のページのヘルプと、実際のproxytunnel.exeのヘルプが違っていたので修正。 認証情報の引数は-P(入手先のページは、-sとか-uとか書いてた)。

社内のプロキシ環境下で仮想環境から外部通信できないときに調べたこと

タイトルの通り。

仮想マシンでapt-get ができず、いろいろ調べました。

解決法そのものはたくさん見つかるんだけど、どれが自分の状況にあってるのかわからなくて時間がかかったので、調べた手順を残します。

 

環境

Windows7(32bit)、Vagrant + VirtualBox仮想マシンDebian 64bit)

 

接続状況

イメージは以下。

「ゲストPC(Debian 64bit)」---「仮想ルータ(VirutualBox)」---「ホストPC(Windows 32bit)」---「社内プロキシサーバ」---「外部ネットワーク」

 

調べたこと

  • 仮想ルータまで通信できるか?

ネットワークアダプタの設定を「NAT」にしている場合、ホストマシンとの間でVirtualBoxが仮想ルータ的な役割をしてくれるらしい。デフォルトでは10.0.0.2らしいので、

ping 10.0.0.2

ちゃんと返ってきてた。

ダメな場合は、ネットワークアダプタの設定などを見直すといいのかもしれないけど、そんな状況が起こるのかわからない。複数のアダプタを設定してて、デフォルトゲートウェイDNSの設定が重複したりおかしくなったり、、、とかがありうるのかな?

あとは、ネットワークアダプタ自体が機能してない可能性もあるかも。

 

  • ホストPCまで通信できるか?

ping XXX.XXX.XXX.XXX

自分のPCに割り当てられているアドレスにping

通らない場合は、ネットワーク設定で「ゲストマシン間のみで接続できる」みたいなのがあったはずなので、そこを疑う。

 

  • プロキシサーバまで通信できるか?

ping XXX.XXX.XXX.XXX

プロキシサーバあてにping

ここがおかしかったら、そもそもホスト自体が社内ネットワークから切り離されてるのかも。ケーブルがささってるかなどを一応確認。

 

  • 外部ネットワークに接続できるか?

ping www.google.co.jp

は通らなかった。自分の場合は、社内のプロキシがhttp(s)しか通さないため。当然といえば当然。

 

wget www.google.co.jp

通った。上記を考えれば必然か。

ここがおかしい場合はプロキシ設定を見直してみる。

プロキシ設定 - ArchWiki

このあたりを参考に、仮想マシンでプロキシを設定。

VirtualBox側でもしないといけないので、注意。環境設定なところから、プロキシ設定があるはず。

 

sudo apt-get update

自分は、ここがダメでした。ここまで来て、なぜできないのだろう、、、

と思ったら、

sudoで環境変数を引き継ぎたい|ざる魂

これでした。せっかく設定したプロキシ設定が、sudoでちゃんと引き継がれていなかった。-Eをつけたら、できるようになった。

 

最後に

慣れないものを扱っていると、「そこかよ!」ってとこで詰まってしまいます。今回もプロキシ周りをしつこく見直していたけど。原因はまったく別のところ、、、

まあでも、ひとつひとつ知っていくしかないか。

 

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 を読んでみて

 

 

 昨年買って積読のままだった本が消化できたので。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

読んだといえど、実装はしてないし、ちょっと理解が追い付かない箇所もあり。

それでも、とても充実した内容でした。

3~4年前(大学院生のころ)にこの本があったらなあ、、、

当時は、むずかしいろんぶん(えいご)を読んだりして四苦八苦してたけど(理解していたかは別の話)、こんなにすっきりまとまった本が日本語で出るとは、なんと素晴らしいことでしょう。

 

4、5章のニューラルネットワーク~誤差逆伝搬に 関しては、すごくぼんやりした理解だった箇所をすごく単純なレベルまで落とし込んで説明してくれて、数式の意味がやっとわかってきた感じ。

 

6章のテクニック、7章のCNNも、避けてしまっていたとこや知らなかったことがわかりやすく(過去に読んだものと比較して)書かれてて、目から鱗とはこのことかと。

 

とはいえ、そもそもかじっていた程度だったのと、2年ほどは遠ざかっていたので大きい声ではいろいろ言えませんが、そのギャップを埋めてくれて満足させてくれるとても良い本だと思いました。

 

Gitにもソースがあったので、ちょっと時間を作っていじってみよう。