ADALM1000を買って不思議の国に迷い込んだメモ 

##PC側のアプリ「ALICE」が不思議の国だった
老後の楽しみに電子回路を自分でごにょごにょ作れるようになりたいなと思い、効率よく勉強したいこともあってADALM1000を買ってみたのです。
ちなみにオシロスコープもある（Hantek DSO5102P 200Mhz改）けどこのオシロスコープが正常かどうか確認するのにもう一台オシロは買えないので勉強用の安価なものというとこれかなということに行き着き、電流も測れる（まあシャント抵抗入れれば測れるけど面倒じゃん）し、オシレータもついてる。
学習用途には十分すぎるくらいにドキュメントも充実している（Wikiベース）https://wiki.analog.com/university/tools/m1k
老後の暇つぶしには十分すぎる分量だった。うれしい。

というわけでさっそく使おうと思ったが、MacOSX（El Capitan）とUbuntu 16.04LTSの両方で使えるように両方セットアップしていたらMacOSX側で不思議の国のALICEに出会ったという話。

##まずはUbuntuから。
libsmuのインストール。
https://github.com/analogdevicesinc/libsmu

リポジトリをクローンして

```
$ git clone https://github.com/analogdevicesinc/libsmu.git
```

buildディレクトリを作ってcmakeで設定するとソースを壊さずmakeでき、何かあればbuildを消してやり直せます。

```
$ mkdir build && cd build && cmake ..
```

インストール

```
$ sudo make install
```

cmakeやboostライブラリが必要になるので入っていなければ入れておきます。

```
$ apt install cmake boost
```

※boostのバージョンは1.58でした。

##PixelPulse2のインストール

OSXはdmgファイルが用意されているため、Linux側でビルドしていきます。
ソースからのビルドはこのリンクの通りです。※ちなみにラズパイを想定しているっぽいです。
https://wiki.analog.com/university/tools/m1k/pixelpulse/build

基本的には問題なくビルドできますが、UIにQt-QuickControlを使用しているのでもし実行時にエラーになる場合はインストールしてみてください。

```
$ sudo apt install qml-module-qtquick-controls
```

##OSX版のlibsmuインストール
基本的にはREADMEに書いてある通りなのですが、こちらの環境ではコンパイルが通りませんでした。
cloneからcmakeまでは同じです。

```
$ git clone https://github.com/analogdevicesinc/libsmu.git
$ mkdir build && cd build && cmake ..
```

```#include <cstdint>``` のcstdintが見つからないということだったので```#incude <boost/cstdint.hpp>```って書かなきゃダメ？と思っていたのですが調べていくうちにコンパイラ古いんじゃね？問題が出てきたため、大きくはまることを防ぐ目的で（もう十分だが）ひとまずxcodeをアップデートすることにしました。

7.3から8.2へ（El Capitanだとこれが最新の扱い）バージョンアップ。
その後もboost/パスをつけていってもあれこれエラーが出るため、そもそも根本的になんか見落としていそうな予感が、、、。

##CMakeList.txtを修正
これでソースを手あたり次第に修正しても埒があきそうにないのでincludeファイルを明示的にしていできないのか？あと、ほんとにboostはbrewで入れたバージョンを見ているのかな？
と疑問に思ったものの確かめる方法が怪しかったのでcloneしたソース中のCMakeList.txtを修正。include_directoriesに明示的に入れることにしました。
５３行目にinclude_directories関数があるのでその前に明示的に追加してみました。

```
include_directories(/usr/local/Cellar/boost/1.60.0_1/) 
```

※後に/usr/local/include/boostでよかったことに気づく、brewでboostインストールすると/usr/local/include配下にCellar配下へのシンボリックリンクが作成されるため。

また、ソース中のboostライブラリの使い方もC++14を想定した使い方になっているようなのでCMakeList.txtの５６行目の

```
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -std=c++11")
```

を下記のように書き換えた。

```
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -std=c++14") //14に書き換え
```

CMakeList.txtを1行追加して1行修正したらREADMEの通り（cloneはしている前提で）buildディレクトリから

```
$ make
```

でコンパイルできた。
cmakeを使ったことがないのであれこれ調べてかなり時間がかかった。

##インストールで失敗
今度はライブラリの配置でエラーとなった。

```
$ sudo make install
[ 66%] Built target smu
[ 77%] Generating timestamp
running build
running build_py
running build_ext
running build_scripts
[ 77%] Built target python
[100%] Built target smu_bin
Install the project...
-- Install configuration: ""
-- Installing: /usr/lib/pkgconfig/libsmu.pc
CMake Error at cmake_install.cmake:36 (file):
  file INSTALL cannot copy file "/Users/hog/libsmu/build/libsmu.pc" to
  "/usr/lib/pkgconfig/libsmu.pc".


make: *** [install] Error 1
```

これはEl Capitan以降のrootlessセキュリティによるもので/usr/libに書き込めないのでエラーになっていた。
/usr/libに書ければよいなら一時的にrootlessを切ってもよい。
リカバリーモード（Command+Rで起動）のターミナルで

```
csrutil disable
```

で再起動してから改めて

```
$ sudo make install
```

するとよいらしい。

参考：https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8

でも、面倒だったんでルール無用の直接配置攻撃です。

```
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install 
```
でインストールできました。
※ALICE-DesktopToolの説明書きにはこのことが書いてありますが、libsmuのGitHubページには記載がないので地雷です。

```
[ 66%] Built target smu
[ 77%] Generating timestamp
running build
running build_py
running build_ext
running build_scripts
[ 77%] Built target python
[100%] Built target smu_bin
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/pkgconfig/libsmu.pc
-- Installing: /usr/local/lib/libsmu.1.0.1.dylib
-- Up-to-date: /usr/local/lib/libsmu.1.dylib
-- Up-to-date: /usr/local/lib/libsmu.dylib
-- Up-to-date: /usr/local/include/libsmu/libsmu.hpp
-- Up-to-date: /usr/local/include/libsmu/version.hpp
running install
running build
running build_py
running build_ext
running build_scripts
running install_lib
creating /usr/local/lib/python2.7/site-packages/pysmu
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/__init__.py -> /usr/local/lib/python2.7/site-packages/pysmu
creating /usr/local/lib/python2.7/site-packages/pysmu/_vendor
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/_vendor/__init__.py -> /usr/local/lib/python2.7/site-packages/pysmu/_vendor
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/_vendor/enum.py -> /usr/local/lib/python2.7/site-packages/pysmu/_vendor
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/exceptions.py -> /usr/local/lib/python2.7/site-packages/pysmu
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/libsmu.so -> /usr/local/lib/python2.7/site-packages/pysmu
copying build/lib.macosx-10.7-x86_64-2.7/pysmu/utils.py -> /usr/local/lib/python2.7/site-packages/pysmu
byte-compiling /usr/local/lib/python2.7/site-packages/pysmu/__init__.py to __init__.pyc
byte-compiling /usr/local/lib/python2.7/site-packages/pysmu/_vendor/__init__.py to __init__.pyc
byte-compiling /usr/local/lib/python2.7/site-packages/pysmu/_vendor/enum.py to enum.pyc
byte-compiling /usr/local/lib/python2.7/site-packages/pysmu/exceptions.py to exceptions.pyc
byte-compiling /usr/local/lib/python2.7/site-packages/pysmu/utils.py to utils.pyc
running install_egg_info
running egg_info
creating pysmu.egg-info
writing pysmu.egg-info/PKG-INFO
writing top-level names to pysmu.egg-info/top_level.txt
writing dependency_links to pysmu.egg-info/dependency_links.txt
writing manifest file 'pysmu.egg-info/SOURCES.txt'
reading manifest file 'pysmu.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files matching 'CMakeLists.txt' found anywhere in distribution
warning: no previously-included files matching '*.pyc' found anywhere in distribution
warning: no previously-included files matching '*.pyo' found anywhere in distribution
warning: no previously-included files matching '__pycache__' found anywhere in distribution
writing manifest file 'pysmu.egg-info/SOURCES.txt'
Copying pysmu.egg-info to /usr/local/lib/python2.7/site-packages/pysmu-1.0.0-py2.7.egg-info
running install_scripts
copying build/scripts-2.7/pysmu -> /usr/local/bin
changing mode of /usr/local/bin/pysmu to 755
-- Installing: /usr/local/bin/smu
```

また、インストーラパッケージも作れるようになっていて

```
$ sh ./build-osx-pkg.sh
```

で、出来ました。

#まさかのpyenvじゃない！？
しかし、ここまでやってきてやっと本命のALICE-Desktopを使おうとダウンロードしてきて
https://github.com/analogdevicesinc/alice/releases/
※ちなみに本家サイトの
https://wiki.analog.com/university/tools/m1k/alice/desk-top-users-guide
にあるpythonコードのVer1.2リンクは切れているので上記GitHubから直接落とすと良いです。

##使い方は至って簡単
・dos2unix（なければbrewで入れる）で改行コードを整形
・alice-desktop-1.2.pywを編集し１行目のpythonの場所を環境にあったものに変更する
ということで編集してみたのですが、全く動作しない。
importエラーの連続・・・

「またしてもドハマリの予感しかしない」状態です。
PYTHONPATHもpyenvの設定も問題なし、pythonの場所もpyenvで指定した場所になっている。
単体でpythonを動かした時はimportも出来る、、、。
だけどalice-desktop-1.2.pywを起動するとimportエラー。
この時点で今更pyenvの仕組みをちょっと見てみようとwhich pythonで得られるpython自体の中身を見てみたらScriptになっていてpyenvから呼び出される形式になっている。

・・・・・これひょっとして実際にpythonが呼ばれたときには環境変わってんじゃね？

と思いつき、anaconda含めpyenvもろとも綺麗さっぱり削除することにしてbrewのpython2@系列で環境を作ることにしてみました。

```
$ pyenv uninstall 2.7.13
$ pyenv uninstall anaconda-4.0.0
$ brew uninstall pyenv
$ brew install python@2
```

.bash_profileに設定したpyenv関係の下りを削除して

```
export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
```
だけを残します。
念のため、libsmuのbuildディレクトリを削除してもう一度ビルドし直してインストールまで行い、alice-desktopの１行目を下記に変更します。

```
#!/usr/local/bin/python
```

#やっと動いた
alice-desktopがやっとお目見えしました。
<img width="512" alt="スクリーンショット 2018-05-03 3.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/207819/f54260a9-7af0-cb32-afe9-aadb539cb741.png">

#が
肝心のADALM1000をつなぐと起動しません。
いい加減萎えてきましたが、コレはFirmwareが古いせいだとわかったのでPixcelPulse2をADALM1000を繋いだ状態で起動するとDeviceManager画面に現れます。
現れたデバイスの右下にUpdate Firmwareボタンが出るので押すと自動的に最新のFirmwareにしてくれます。
終了するとメッセージが出るのでUSBからADALM1000を抜き、PixelPulse2も終了します。
その後、ADALM1000をUSBに挿し、PixelPulse2を起動するときちんと認識されている状態になります。

ここまでくればALICE-Desktopもきちんと起動するはずです。

#なげーよ。

ということで大ハマリでしたが
以降、使い方に関してはこちらにお譲りします。
https://aps-web.jp/academy/ec/


Win版のインストール参考：http://www.denshi.club/pc/measure/adalm10001.html