ともの技術メモ

趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • Python2.7のプログラムをexe化する

    投稿日 2018年 6月 11日 コメントはありません

    次に、Python2.7で作ったプログラムを配布用にexe化してみます。
    まず、仮想環境を作ります。

    D:\virtual-python>py -2 -m virtualenv py2exe1 --system-site-packages
    New python executable in D:\virtual-python\py2exe1\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd py2exe1
    D:\virtual-python\py2exe1>scripts\activate.bat
    (py2exe1) D:\virtual-python\py2exe1>

    次に、py2exeをインストールします。試しにpipでやってみると、

    (py2exe1) D:\virtual-python\py2exe1>py -2 -m pip install py2exe
    Collecting py2exe
    Downloading https://files.pythonhosted.org/packages/e9/a9/040d38b60bca5b19ff5599a6cbe52b4b9a4fb27986a44fc35f72d9e729e6/py2exe-0.9.2.2.zip (129kB)
    100% |################################| 133kB 2.3MB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\setup.py", line 10, in <module>
    raise RuntimeError("This package requires Python 3.3 or later")
    RuntimeError: This package requires Python 3.3 or later
    
    ----------------------------------------
    Command "python setup.py egg_info" failed with error code 1 in c:\users\xxxxxxxx\appdata\local\temp\pip-install-xhrt4i\py2exe\
    
    (py2exe1) D:\virtual-python\py2exe1>

    ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

    exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

    from distutils.core import setup
    import py2exe
        
    option = {
        'compressed' : 1,
        'optimize' : 2,
        'bundle_files' : 1,
    }
    
    setup(
        options = {
            'py2exe' : option ,
        },
        console = [
            {'script' : 'main.py'}
        ],
        zipfile = None,
    )

    今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

    自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

    (py2exe1) D:\virtual-python\py2exe1>cd LOG
    (py2exe1) D:\virtual-python\py2exe1\LOG>python setup.py py2exe
    running py2exe
    creating D:\virtual-python\py2exe1\LOG\build
     :
     :(途中略)
     :
    copying C:\Python27\DLLs\unicodedata.pyd -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    *** copy dlls ***
    copying C:\WINDOWS\system32\CRYPT32.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\collect-2.7
    copying C:\WINDOWS\system32\python27.dll -> D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7
    setting sys.winver for 'D:\virtual-python\py2exe1\LOG\build\bdist.win32\winexe\bundle-2.7\python27.dll' to 'py2exe'
    copying C:\Python27\lib\site-packages\py2exe\run.exe -> D:\virtual-python\py2exe1\LOG\dist\main.exe
    Adding python27.dll as resource to D:\virtual-python\py2exe1\LOG\dist\main.exe
    The following modules appear to be missing
    ['ElementC14N', '_scproxy', 'cElementTree', 'distutils.command', 'distutils.command.build_ext', ... ]
    
    *** binary dependencies ***
    Your executable(s) also depend on these dlls which are not included,
    you may or may not need to distribute them.
    
    Make sure you have the license if you distribute any of them, and
    make sure you don't distribute files belonging to the operating system.
    
       OLEAUT32.dll - C:\WINDOWS\system32\OLEAUT32.dll
       USER32.dll - C:\WINDOWS\system32\USER32.dll
       SHELL32.dll - C:\WINDOWS\system32\SHELL32.dll
       ole32.dll - C:\WINDOWS\system32\ole32.dll
       ADVAPI32.dll - C:\WINDOWS\system32\ADVAPI32.dll
       WS2_32.dll - C:\WINDOWS\system32\WS2_32.dll
       GDI32.dll - C:\WINDOWS\system32\GDI32.dll
       KERNEL32.dll - C:\WINDOWS\system32\KERNEL32.dll
    
    (py2exe1) D:\virtual-python\py2exe1\LOG>

    それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

    ということで、意外にあっさりexe化に成功しました。


  • Windows10にPython環境を構築

    投稿日 2018年 6月 10日 コメントはありません

    訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
    で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

    1.Pythonのインストール

    まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

    次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

    インストールできたかどうかは

    C:\>py -2 -V
    C:\>py -3 -V

    としてそれぞれPython2系、Python3系が起動できているか確認します。

    2.virtualenvのインストール

    Python2系用の仮想環境を作成するvirtualenvをインストールします。

    デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

    import sys
    sys.setdefaultencoding('cp932')

    作成したら、反映されていることを確認します。

    c:\Python27>py -2
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    次に、pipをバージョンアップします。

    c:\Python27>py -2 -m pip install --upgrade pip
    Collecting pip
    Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 451kB/s
    Installing collected packages: pip
    Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
    Successfully uninstalled pip-9.0.3
    Successfully installed pip-10.0.1
    
    c:\Python27>

    次に、virtualenvをインストールします

    c:\Python27>py -2 -m pip install virtualenv
    Collecting virtualenv
    Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
    100% |################################| 1.9MB 2.2MB/s
    Installing collected packages: virtualenv
    The script virtualenv.exe is installed in 'C:\Python27\Scripts' which is not on PATH.
    Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
    Successfully installed virtualenv-16.0.0
    
    c:\Python27>

    3.virtualenvを使ってみる

    早速Python2.7の仮想環境を作ってみます。

    D:\>mkdir virtual-python
    D:\>cd virtual-python
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    :
    :(中略)
    :
    File "D:\virtual-python\testenv\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 7: ordinal not in range(128)
    ----------------------------------------
    :
    :(中略)
    :
    OSError: Command D:\virtual-python\testenv\Scripts\python.exe - setuptools pip wheel failed with error code 2
    D:\virtual-python>

    ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
    原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
    いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
    具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

    D:\virtual-python>copy C:\Python27\Lib\site-packages\sitecustomize.py d:\virtual-python\testenv\Lib\site-packages\.
    1 個のファイルをコピーしました。
    D:\virtual-python>py -2 -m virtualenv testenv
    New python executable in D:\virtual-python\testenv\Scripts\python.exe
    Installing setuptools, pip, wheel...done.

    ということで、旨くいきました。仮想環境への移行も

    D:\virtual-python>cd testenv
    D:\virtual-python\testenv>Scripts\activate.bat
    (testenv) D:\virtual-python\testenv>python -V
    Python 2.7.15
    (testenv) D:\virtual-python\testenv>
    

    でうまくいくようです。
    この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

    直後に追記)
    こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
    (下記1行目がその例です)

    D:\virtual-python>py -2 -m virtualenv testenv2 --system-site-packages
    New python executable in D:\virtual-python\testenv2\Scripts\python.exe
    Installing setuptools, pip, wheel...done.
    D:\virtual-python>cd testenv2
    D:\virtual-python\testenv2>Scripts\activate.bat
    (testenv2) D:\virtual-python\testenv2>python -V
    Python 2.7.15
    (testenv2) D:\virtual-python\testenv2>python
    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> sys.getdefaultencoding()
    'cp932'
    >>>

    4.venvを使ってみる

    Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

    D:\>cd virtual-python
    D:\virtual-python>py -3 -m venv testenv3
    D:\virtual-python>cd testenv3
    D:\virtual-python\testenv3>Scripts\activate.bat
    (testenv3) D:\virtual-python\testenv3>python -V
    Python 3.6.5
    (testenv3) D:\virtual-python\testenv3>

    でPython3系が動くことが確認できました。


  • MongoDBについて調べてみた

    投稿日 2018年 5月 13日 コメントはありません

    いろいろあって、MongoDBについて調べてます。

    調べた結果をメモしておきます。


  • Windows10からLinuxMint上のHL2240Dに印刷する

    投稿日 2018年 3月 26日 コメントはありません

    自宅の環境の整理をしているのですが、これまで不便だったのがWindows10からプリンタ(ブラザーのHL2240D)に印刷する時でした。正直、なぜLAN内蔵モデルにしなかったんだろう、というのがこれまでの悩みでした。

    が、今回、Windows10からLinuxMintに接続したHL2240DにLAN経由で印刷することができるようになりましたので、メモしておきます。

    1.LinuxMint側で印刷できるようにする

    これは以前の記事のブラザーのレーザープリンタ買いましたを見て下さい。インストールしたら、「システム管理」→「プリンタ」でHL2240Dを「共有する」にチェックを入れておきます。

    2.名前解決できるようにする

    LinuxMintのマシンはDHCPでアドレス設定しているので、名前解決できる必要があります。で、簡単なのはavahi(mDNS)なので、そちらの準備をします。
    Linux側はavahi daemon(Mintは初めから入っているような気がする)を入れておきます。Windows側は、Appleのサイトから「Bonjour Print Services (Windows)」をダウンロードしてインストールして、Windowsファイアウォールで 5353/UDP を許可しておきます。インストールしたら、Windows10のコマンドプロンプト/Linuxのシェルから「ping 相手のホスト名.local」で応答が返ってくるのを確認します。

    3.プリンタの追加

    「Bonjour Print Services (Windows)」をインストールした時に追加された「Bonjour プリンターウィザード」を起動すると、勝手にLinuxMint上のプリンタを見つけてくれました。ウィザードに沿って操作していくのですが、Brotherのドライバが同名でたくさんあってよくわかりません。とりあえず、「Brother Laser Type2 Class Driver」の中の一番下のをインストールして、テスト印刷したらうまくテスト印刷できました。印刷結果ではドライバーの種類が「Type 4 – ユーザーモード」となっていました(よくわかりませんが)。


  • Raspberry Piをネットワークの試験に使う

    投稿日 2018年 2月 10日 コメントはありません

    ここのところ買い集めている小さなLinuxボードは結局はネットワークの試験のために購入したもので、元々はなるべく小さなtcpdumpが使えて動かしっぱなしで放置できるものを探していたものです。で、いろいろぐぐっていたら、linuxでEthernetインタフェースが2つある環境を使って、もっといろいろできることがわかってきました。具体的には、ブリッジとして動作させてた上で、遅延を挿入したりできるというものです。その環境もRaspberry PiにUSBイーサネットアダプタを追加してやれば、Raspberry Piでもできそうなことがわかったので、試してみました。

    1.Raspbianのインストール

    今回はGUIは不要なので、Raspbian Liteを適当なMicro SDに書き込んで、余っていたRaspberry Pi model B+に入れました。
    起動して、User/Passwd=pi/raspberryでログインしたあと、コンソールから

    $ sudo touch /boot/ssh
    $ sudo reboot

    として再起動。再起動後、linuxマシン側から

    $ ssh pi@raspberrypi.local

    としてsshでログイン、以降はリモートログインで作業します。リモートログインしたら、

    pi@raspberrypi:~ $ sudo raspi-config

    として、初期設定をします。今回は、

    • パスワード設定
    • ホスト名をraspinetに変更
    • ブートオプションをConsoleに設定
    • ローカライゼーションでLocaleにja_JP.UTF-8 UTF-8を追加、デフォルトはen_GB.UTF-8のまま。タイムゾーンはAsia/Tokyoを選択。
    • Advanced OptionでExpand Filesystemを選択、Memory Spiltは16MBに設定

    で、設定後に再度、再起動。再起動後、Linuxマシン側から

    $ ssh pi@raspinet.local

    として再度ログインします。ログインしたら、

    pi@raspinet:~ $ sudo apt-get update
    pi@raspinet:~ $ sudo apt-get upgrade
    pi@raspinet:~ $ sudo apt-get install tcpdump bridge-utils

    として、アップデートを一通りかけた後、bridge-utilsとtcpdumpをインストールします。

    2.スクリプトファイルを作成して起動時に実行させる

    pi@raspinet:~ $ sudo vi /usr/local/bin/start-bridge

    として、ブリッジを起動する以下の内容のスクリプトを作成しました。(実行タイミングをsleepで調整しているのでちょっと汚いですが・・・)

    #!/bin/sh
    # disable IPv6
    sysctl -w net.ipv6.conf.all.disable_ipv6=1
    # setup bridge
    brctl addbr vbr0
    brctl addif vbr0 eth0
    brctl addif vbr0 eth1
    sleep 5
    # start interface
    ifconfig eth0 0.0.0.0 up
    ifconfig eth1 0.0.0.0 up
    ifconfig vbr0 0.0.0.0 up
    sleep 5
    dhclient -r
    dhclient vbr0
    echo 0 > /sys/devices/virtual/net/vbr0/bridge/multicast_snooping

    IPv6は今回禁止、IGMP snooping も禁止しました。作成後に、

    pi@raspinet:~ $ sudo chmod a+x /usr/local/bin/start-bridge

    として、実行権限を付与。起動時に実行させるため、/etc/rc.local を修正して、最後の exit 0 の前に以下の部分を追加しました。

    if [ -e /usr/local/bin/start-bridge ]; then
      /usr/local/bin/start-bridge &
    fi

    これで、Raspberry Piを起動させると自動的にブリッジとして動作するようになります。

    3.tcpdumpで通過パケットをモニタしてみる

    Linuxホスト側から

    $ ssh pi@raspinet.local

    でブリッジに設定したRaspberry Piにログインします。その後、

    pi@raspinet:~ $ sudo tcpdump -i vbr0 not port ssh

    とか、

    pi@raspinet:~ $ sudo tcpdump -i vbr0 not host `/sbin/ip -f inet -o addr show vbr0 | awk '( $2 == "vbr0" ) {print $4}' | cut -d/ -f 1`

    で通過するパケットをモニタします。(後ろの方の長いのは vbr0 のIPアドレスを抽出しているだけです)
    ポートやIPアドレスでRaspberry Piに接続しているsshのパケットを除外しています。除外しないと、表示した文字列をパケットキャプチャして、それを再度表示してしまいます。

    4.参考情報


  • NanoPi NEO2でタイムラプス撮影(続)

    投稿日 2018年 1月 8日 コメントはありません

    NanoPi NEO2でのタイムラプス撮影ですが、前回はcronが使えないようなので、スクリプト中でsleepして周期の調節をしていました。

    で、いろいろ調べていたら、systemdのtimerユニットで似たようなことが実現できるようなのでやってみました。

    1.スクリプトの作成

    ログイン中であればユーザー権限でtimerユニットを動作させることもできるようなのですが、今回はroot権限で動作させます。

    /usr/local/bin/TimerImageとして以下のファイルをrootで作成しました。

    #!/bin/sh
    DATE=$(date +"%Y%m%d%H%M%S")
    fswebcam --quiet --jpeg 80 --timestamp "%Y-%m-%d %H:%M:%S (%Z)" -r 800x600 /DATA/TimerImage/pictures/$DATE.jpg
    (/DATAはHDDをマウントしてあるディレクトリです)
    作成したら、実行権限を付与しておきます。

    2.サービスファイルの作成

    /etc/systemd/system/TimerImage.serviceとして以下のファイルを作成しました。

    [Unit]
    Description=Time Lapse Capture
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/TimerImage

    3.timerを設定する

    /etc/systemd/system/TimerImage.timerとして以下のファイルを作成しました。

    [Unit]
    Description= Capture every 10 seconds
    
    [Timer]
    AccuracySec=1sec
    OnCalendar=*-*-* *:*:00/10
    Unit=TimerImage.service
    
    [Install]
    WantedBy=multi-user.target

    作成後、以下のようにして起動します。

     $ sudo systemctl daemon-reload
     $ sudo systemctl start TimerImage.timer
     $ sudo systemctl enable TimerImage.timer

    daemon-reload は設定ファイルを修正した場合に再読み込みさせる際に必要です。(=初回は必要ない)

    4.動作状態を確認する

    以下のようにして動作状態を確認することができます。再起動しても自動的に起動することも確認できました。

    $ systemctl --system --all list-timers
    NEXT                         LEFT         LAST                         PASSED    UNIT                         ACTIVATES
    Mon 2018-01-08 18:58:40 JST  8s left      Mon 2018-01-08 18:58:30 JST  1s ago    TimerImage.timer             TimerImage.service
    Mon 2018-01-08 20:08:31 JST  1h 9min left Sun 2018-01-07 20:08:31 JST  22h ago   systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.servi
    Tue 2018-01-09 06:36:24 JST  11h left     Mon 2018-01-08 06:47:50 JST  12h ago   apt-daily-upgrade.timer      apt-daily-upgrade.service
    Tue 2018-01-09 07:37:17 JST  12h left     Mon 2018-01-08 18:28:22 JST  30min ago apt-daily.timer              apt-daily.service

     


  • NanoPi NEO2のUbuntu CoreでWiFi有効化

    投稿日 2017年 11月 29日 コメントはありません

    NanoPi NEO2 の Ubuntu Core で WiFi を有効化したので、その際のメモです。

    使用可能なUSBアダプタは

    • RTL8188CUS 802.11n WLAN Adapter
    • RT2070 Wireless Adapter
    • RT2870/RT3070 Wireless Adapter
    • RTL8192CU Wireless Adapter
    • NetGear, Inc. WG111v3 54 Mbps Wireless [realtek RTL8187B]

    ということらしいですが、きっと Raspberry Pi で動作可能なものは動くのでしょう^^;

    USBコネクタにWiFiアダプタは挿しておきます。

     

    1.使用可能なデバイスのリストアップ

    $ sudo nmcli dev
    DEVICE           TYPE      STATE          CONNECTION 
    eth0             ethernet  connected      Wired connection 1 
    wlx106f3fxxxxxx  wifi      disconnected   -- 
    lo               loopback  unmanaged      --

    という感じで、wlxに続いてMACアドレスという形でデバイスが表示されました。

    2.WiFi起動

    $ sudo nmcli r wifi on

    3.アクセスポイントのスキャン

    $ sudo nmcli dev wifi
    *   SSID             MODE   CHAN  RATE       SIGNAL  BARS    SECURITY 
        xxxxxxxxxxxxxxx  Infra  2     54 Mbit/s  100     ▂▄▆█  WPA1 WPA2 
        Mxxxxxxxx        Infra  11    54 Mbit/s  100     ▂▄▆█  WPA1 WPA2 
        axxxxxxxxxxx     Infra  11    54 Mbit/s  100     ▂▄▆█  WPA1 WPA2 
        Gxxxxxxxx        Infra  5     54 Mbit/s  82      ▂▄▆█  WPA1 WPA2 
        Nxxxxxxxx        Infra  5     54 Mbit/s  82      ▂▄▆█  WPA1 WPA2 
        sxxxxxxxxxxx     Infra  8     54 Mbit/s  52      ▂▄__   WPA1 WPA2 
        Bxxxxxxxxxxxxx   Infra  1     54 Mbit/s  42      ▂▄__   WPA2 
        axxxxxxxxxxxxxx  Infra  8     54 Mbit/s  22      ▂___    WEP 
        axxxxxxxxxxxxx   Infra  11    54 Mbit/s  22      ▂___    WPA1 WPA2

    という感じでグラフィカルに表示されます。

    4.アクセスポイントに接続

    $ sudo nmcli dev wifi connect " (SSID) " password "パスワード" 
    Device 'wlx106f3fxxxxxx' successfully activated with 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.

    5.接続されているか確認

    $ ifconfig
    wlx106f3fxxxxxx Link encap:Ethernet HWaddr 10:6f:3f:xx:xx:xx 
     inet addr:xxx.xxx.xxx.xxx Bcast:xxx.xxx.xxx.255 Mask:255.255.252.0
     inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:595 errors:0 dropped:0 overruns:0 frame:0
     TX packets:372 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000 
     RX bytes:86952 (86.9 KB) TX bytes:82940 (82.9 KB)

    という感じで無事に接続。再起動しても大丈夫です。


  • NanoPi NEO2のNASキットを動かしてみました

    投稿日 2017年 11月 28日 5個のコメント

    秋月で NanoPi NEO/NEO2 用のNASキットが売っていたので、買ってみました。

    秋月の説明書きにはヒートシンクが同梱されているとは書いてない(写真には写っていますが・・・)ので、思わずヒートシンクも余計に買ってしまいましたが、これから買う方はキットにヒートシンクが同梱されているので気をつけて下さい。

    このNASキット以外に、

    • NanoPi-NEO2 (または NanoPi-NEO)
    • 2.5インチのHDDまたはSDD(まずは余り物の160GBをつけてみました)
    • CR2032コイン型リチウム電池
    • 起動用のMicroSDカード(手持ちの16GBを使いました)
    • 12VのACアダプタ(秋月で標準的なDCプラグがついているもの)

    の準備が必要です。

    組み立てにあたっては、

    • ハンダゴテ一式(NanoPi-NEO2の端子はハンダ付けが必要)
    • プラスドライバ(たぶん+1のもの)

    も必要です。

    とりあえず、端子をハンダ付けしました。ランド径が小さいので、ハンダ付けしにくいです。

    この状態で、別のNanoPi-NEO2 から持ってきた MicroSD カードを挿して Ubuntu-Core で起動して ssh でログイン、適当に /dev/sda1 を mount してやると、中身を見ることができましたので、動作は問題ないようです。

    ヒートシンクを付けてみました。

    この後、Official ROMのイメージを

    https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2

    の下の Official ROMs から nanopi-neo2_debian-nas-jessie_4.11.2_20171103.img.zip をダウンロードして、これを展開、USBイメージライタでMicroSDに書き込んで電源投入します。

    ブラウザで、 http://friendlyelec.local/ にアクセスすると、

    として画面が出ました。

    ユーザー名: admin
    パスワード: openmediavault

    でログインすることができました。

    とりあえず、

    • Web管理者パスワードの設定
    • タイムゾーンの設定、NTPの有効化
    • ホスト名を NanoPi-NAS に変更
    • アップデートの確認&インストール
    • ディスクのワイプ、ファイルシステム作成
    • ユーザーの作成

    をしてみました。

    この後、プラグインを見てみると、「openmediavault-flashmemory」というのがあり、これを使うと MicroSD への書き込みを減らせるようです。・・・が、インストールを試みたところエラーになりました・・・。

    あと、デフォルトで root での ssh ログインが有効になっています

    $ ssh root@nanopi-nas.local (変更していない場合はfriendlyelec.local)
    root@nanopi-nas.local’s password: (デフォルトパスワードは fa )
    root@nanopi-nas:~# passwd
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    root@nanopi-nas:~# passwd pi
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    root@nanopi-nas:~# passwd fa
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    root@nanopi-nas:~#

    として、ログインパスワードは変更しておく必要があります。(もしくは、SSHを無効化したほうがよいかも)

    ・・・と思ったのですが、/etc/ssh/sshd_config の AllowGroups の項目には root と ssh しかいないので、実際にログインできるのは root だけのようです。


  • NanoPi NEO2でタイムラプス撮影

    投稿日 2017年 11月 27日 コメントはありません

    部屋を掃除していたらELECOMのWebカメラが出てきました。LinuxMintのマシンに挿してみたところ uvc カメラとして認識するようでしたので、NanoPi NEO2に挿してみたらこちらも認識しました。

    なので、TimeLapse撮影ができないか、試してみました。
    ググると Ubuntu でTimeLapseをやっている方は結構いるようで、基本的にはそちらに倣ってやってみました。

    基本、NanoPi NEO2に合わせている以外はこちらのページのパクリです。

    1.カメラ画像の連続キャプチャ

    1枚単位での撮影には fswebcam を使うのが簡単なようです。

    $ sudo apt-get install fswebcam

    でインストールできます。で、連続撮影する場合には、1枚キャプチャするシェルスクリプトを書いて、cron で所定の時間毎に1枚キャプチャ、というのが簡単なようなのですが、NanoPi-NEO2のUbuntu-coreではcronはユーザーに開放されてないっぽいです。crontab -eとしても編集できないですし、ググってもシェルスクリプト内でループしてsleepで時間待ちせよ、みたいなことが書いてあります。

    結局、以下のようなシェルスクリプトで連続撮影します。ファイル名は TimeLapse.sh として、ホームディレクトリの下に CaptureImage というディレクトリを作って、そこに置きました。

    #!/bin/bash
    while true;
    do
    	DATE=$(date +"%Y%m%d%H%M%S")
    	fswebcam --quiet --jpeg 95 --timestamp "%Y-%m-%d %H:%M:%S (%Z)" -r 800x600 /home/pi/CaptureImage/$DATE.jpg
    	sleep 2s
    done

    作成したスクリプトに実行権限を付けてやります。

    $ chmod +x TimeLapse.sh

    で、実行すると、ザクザクと画像が溜まっていきます。

    2.キャプチャした静止画の引取の準備

    動画への変換はホスト側でやります。

    ホスト側で

    $ mkdir nanopi
    $ sshfs pi@nanopi-neo2.local: /home/xxx/nanopi

    として、sshfsでnanopi側のホームディレクトリをローカルディレクトリにマウントして、これで引き取ります。
    (今考えれば、sshfsでマウントしなくても scp でも良かった・・・)

    3.画像の変換の準備

    ローカル側でffmpegで変換しますが、motionをインストールするほうが楽だという情報があったので、そうしました。

    $ mkdir motion
    $ cd motion
    $ sudo apt-get install motion

    4.画像の引取と変換

    以下の手順で画像の引取と変換を行います。

    $ cp ../nanopi/CaptureImage/*.jpg .
    $ c=1 ; for i in ??????????????.jpg ; do mv $i `printf %d $c`.jpg ; c=$((c+1)) ; done
    $ ffmpeg -f image2 -r 15 -i %d.jpg -r 15 -an -vcodec libx264 -pix_fmt yuv420p video.mp4

    これで TimeLapse ができましたが、静止画の保存サイズが大きいようです。
    1分間で3〜4MB出力しているようなので、1週間で40GBくらいになってしまいます。ちょっと要対策ですね。


  • NanoPi NEO2のデバッグシリアルに苦労した話

    投稿日 2017年 11月 8日 コメントはありません

    Gigabit Ethernet環境でtcpdumpをひたすら放置で動かしておきたくて、NanoPi NEO2に手を出してました。

    ファイルシステムのイメージファイルは違いますが、NanoPi NEOと同じ手順で環境構築できて、一度はシリアルコンソールが動いているUART0(デバッグシリアル)も動いていたのですが、しばらくシリアルコンソール無しで運用した後、再びシリアルコンソール経由で操作をしたくなった時に苦労しました。

    公式サイトにある端子説明がこちらで、実物を半田面から写真を取ったのが以下です。

    わかりますでしょうか??

    実は写真に写っているNanoPi-NEO2の実物のデバッグシリアルの端子表記は間違っているので、シルク印刷の端子表記を信用すると動かない、という罠に陥ります。本当は、写真の上から、GND、5V、TX、RXの順で逆順になっています。

    ・・・ということで、最初に動かした時は公式サイトの端子説明をみて配線したので無事動いたのですが、今日改めて動かそうとした時には基板のシルク印刷をみて動かそうとしたので、動かなかった、というオチでした。悩んだ数時間を返してくれ、という感じです。