20201208のMacに関する記事は5件です。

Mac版Arduino IDE で M5Stackがビルドできない(import Serialエラー)

まとめ

  • M5Paperをゲットし、MacでArduinoIDEのボードマネージャ(M5Stackライブラリ: v1.0.6)でM5Paperを選んでビルドしたところ、以下の問題に遭遇した。
    • Serial接続関連のパッケージがインストールされてないよ、と言う事らしい。
    • これはM5Stackライブラリに含まれるesptoolとMac環境の問題なので、このバージョンでM5Paper以外のボードを選択しても同じくビルドが通らなくなる。
  • Python3を何度かインストールし直したり、色々やった挙句、きれいに解決したのでここにメモしておく。
Traceback (most recent call last):
  File "/Users/nabeshin/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py", line 39, in <module>
    import serial
ImportError: No module named serial
exit status 1
ボードM5Stack-Paperに対するコンパイル時にエラーが発生しました。

スクリーンショット 2020-12-06 23.07.50.png

実行環境

  • OS: MacOS Catalina
  • ArduinoIDE: v1.8.13
  • M5Stackライブラリ: v1.0.6
    • M5Paperが含まれているライブラリは以下のボードマネージャのURLから入手した。

スクリーンショット 2020-12-06 23.11.55.png

Python環境

nabeshin@iMacNabeshin ~ % python2

WARNING: Python 2.7 is not recommended. 
This version is included in macOS for compatibility with legacy software. 
Future versions of macOS will not include Python 2.7. 
Instead, it is recommended that you transition to using 'python3' from within Terminal.
  • MacOSでは、初めからPython2がインストールされているが、Python3への移行が推奨されているようなので別途python3をインストールしてある。
    • ~/.zprofile でpython3にパスを通し、デフォルトにしている。
nabeshin@iMacNabeshin ~ % env | grep PATH 
PATH=/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
nabeshin@iMacNabeshin ~ % python --version
Python 3.9.0
nabeshin@iMacNabeshin ~ % 
  • python2で>>import serialを打って見たところ、ImportError: No module named serialとなる。
  • >pip install serialしてあるputhon3だとエラーにならない。

Arduino IDEは強制的にPython2を使ってしまう

  • シェルではバッチリpython3にパスが通っており、>>import serialも成功するが、Arduino IDEでビルドすると、どうしてもPython2が使われてしまう。

検証その1

  • 以下のようにpython3へのシンボリックリンクを張ってみたが、変わらず。。。
nabeshin@iMacNabeshin 3.0.0 % pwd
/Users/nabeshin/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0
nabeshin@iMacNabeshin 3.0.0 % ls -la
total 7992
drwxr-xr-x  6 nabeshin  staff      192 12  7 21:37 .
drwxr-xr-x  4 nabeshin  staff      128 11 28 23:58 ..
-rw-r--r--@ 1 nabeshin  staff     6148 11 29 17:23 .DS_Store
-rwxr-xr-x  1 nabeshin  staff  3910331 11 28 21:47 esptool
-rwxr-xr-x@ 1 nabeshin  staff   169633 12  6 23:02 esptool.py
lrwxr-xr-x  1 nabeshin  staff       22 12  7 21:37 python -> /usr/local/bin/python3
nabeshin@iMacNabeshin 3.0.0 % 

検証その2

  • 以下のようにesptool.pyにpythonのバージョンをファイルに書き出すようにしてみた。

スクリーンショット 2020-12-06 23.07.02.png

  • 結果
    • だめだ、やはり2.7が強制的に使わされてしまう。。。
    • この呪縛から逃れる方法はないものか。。。
nabeshin@iMacNabeshin tmp % pwd
/Users/nabeshin/tmp
nabeshin@iMacNabeshin tmp % cat DEBUG_Version.txt
2.7.16 (default, Jun  5 2020, 22:59:21) 
[GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc-
nabeshin@iMacNabeshin tmp % 

と言うわけで、
なんとかしてpython2側にserialパッケージを追加しなければならない。と言うことがわかったが、
> pip2 install serial を素直にやりたくてもpip2がインストールできない。。。

解決方法

  • 全く同じ問題について、公式のM5Stack Communityで話されていた。
  • 解決した、とされている手順に沿って以下を実施。
  • これにより、Arduino IDEでもビルドできるようになった。
nabeshin@iMacNabeshin ~ % python2

WARNING: Python 2.7 is not recommended. 
This version is included in macOS for compatibility with legacy software. 
Future versions of macOS will not include Python 2.7. 
Instead, it is recommended that you transition to using 'python3' from within Terminal.

Python 2.7.16 (default, Jun  5 2020, 22:59:21) 
[GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc- on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.path
['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Library/Python/2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC']
>>> ^D
nabeshin@iMacNabeshin ~ % sudo pip3 install --target /Library/Python/2.7/site-packages pyserial
Password:
WARNING: The directory '/Users/nabeshin/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pyserial
  Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB)
     |████████████████████████████████| 90 kB 8.8 MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.5
nabeshin@iMacNabeshin ~ % 






nabeshin@iMacNabeshin ~ % python2

WARNING: Python 2.7 is not recommended. 
This version is included in macOS for compatibility with legacy software. 
Future versions of macOS will not include Python 2.7. 
Instead, it is recommended that you transition to using 'python3' from within Terminal.

Python 2.7.16 (default, Jun  5 2020, 22:59:21) 
[GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc- on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> serial
<module 'serial' from '/Library/Python/2.7/site-packages/serial/__init__.py'>
>>> 

pip3からpython2側にパッケージを追加するコマンド

  • > sudo pip3 install --target /Library/Python/2.7/site-packages pyserial
    • なるほど、こうやって実行すればいいのか。
    • よく覚えておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apple M1で使えるSIMDビット論理演算命令

「Apple M1の速さの秘密って他にない新命令の影響じゃないの?」みたいな発言がSNSで目立つので、では実際役に立ちそうな新命令について、考察して見ることにする。

ARM NEON(ASIMD)からサポートされている64/128ビット論理演算命令

NOT (論理否定)
D = ~A
AND (論理積)
D = A & B
BIC (否定 + 論理積)
D = A & ~B
ORR (論理和)
D = A | B
ORN(否定 + 論理和)
D = A | ~B
EOR (排他的論理和)
D = A ^ B
BIF/BIT/BSL (ビット単位選択)
D = (Mask & A) | (~Mask & B) ※ソース破壊型命令

BIF/BIT/BSLはvselq_u32などの組み込み関数に割り当てられており、どのソースを破壊するかによって命令名が分かれているがコンパイラが勝手に選んでくれるので、C/C++以上のレイヤーで使う分にはプログラマーが特に意識する必要はない。

SHA3サポートによって追加された128ビット論理演算命令(Apple A13/A14/M1対応)

BCAX (否定 + 論理積 + 排他的論理和)
D = A ^ (B & ~C)
EOR3 (3入力排他的論理和)
D = A ^ B ^ C

排他的論理和はパリティを取るための処理に多用するので、連続するEORはEOR3に可能な限り置き換えた方がパフォーマンスが向上する傾向がある。他、BCAXもBIC+EORを置き換え可能な箇所があれば使いたい。
また、0xFFをブロードキャストしたベクトルをソースの一つに指定することでXNOR操作などの代替にもなる。
3入力の論理演算はビットスライス型暗号アルゴリズムで重宝するので有効に使っていきたい。
ただしclangでは組み込み関数は未サポートなので、インラインアセンブラを使うか、対応したコンパイラをビルドする他ない。

EOR3は光るが、トータルで劇的に速いというほどでもない。

なお、Appleがサポートするのは128ビットまでのSIMDである。Intelのように256ビットとか512ビットのSIMDはサポートしないので、当然SIMDによって相対的優位性を得ているはずはないという考察もできる。

どういう演算で速くなるのかの具体例

わかりやすい例として64ビット整数版Mersenne Twitsterを例に出すと、新命令を使うことによってビット論理演算を纏めることができる箇所は、この程度には存在する。

スクリーンショット 2020-12-08 22.53.12.png

SHA3はM1以外のARMでもサポートするか

ARM社公式のアプリケーション向けCPUコアの実装としては最新のCortex-A78(Snapdragon 888もこれに基づくと思われる)でもSHA3をサポート予定がないので、M1以降のMacかA13/A14以降のiOSデバイス専用にコードを組むことになる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apple M1チップ搭載MacでNervesを動かす方法(2020.12.8暫定版)

この記事はNerves JP Advent Calendar 2020の10日目の記事です。

結論

2020年12月8日現在,NervesはRosetta 2モードでは動作しますが,ARMネイティブモードでは動作しません。

また,ARMネイティブモードでasdf install elixir (バージョン番号)としてインストールした後,ターミナルをRosetta 2モードにして起動しなおしたときにElixirは正常に動作するのですが,Nervesを使おうとするとARMネイティブモードとみなされて動作しません。

Elixirのインストール方法について

現時点でApple Silicon M1チップ搭載Macで推奨されるElixirのインストール方法は,brew install elixirでインストールする方法です。

asdf install elixir (バージョン番号)によるインストール方法では,ARMネイティブモードとx86_64/Rosetta 2モードのバイナリを共存できない問題があります。Nervesは現時点で後者のモードでしか動作しないので,前者でElixirをインストールしてしまうと Nerves が動作しないという不具合に見舞われます。

Elixirのインストール方法については,こちらを参照ください。Rosetta 2モードのHomebrewでのインストール方法に従ってください。

https://qiita.com/zacky1972/items/f8f7734e9ab46aa74739

Nervesのインストール

公式ライブラリに沿ってインストールします。

https://hexdocs.pm/nerves/installation.html

ただし,HomebrewでインストールしたElixirはアンインストールせずそのままにして,asdfは使わずにしておきます。

手順を上げておきます。

  1. アプリケーション/ユーティリティ フォルダを開いてターミナルの「情報を見る」を開きます。
  2. 「Rosettaを使用して開く」にチェックを入れます。
  3. ターミナルを起動します。
  4. Homebrew をインストールします。
  5. brew install elixirとしてElixirをインストールします。
  6. brew update
  7. brew install fwup squashfs coreutils xz pkg-configとして前提ライブラリをインストールします。
  8. mix local.hex とします。
  9. mix local.rebar とします。
  10. mix archive.install hex nerves_bootstrap としてNervesがインストールできました。

Hello Nervesをやってみる

https://hexdocs.pm/nerves/getting-started.html

に沿ってファームウェアを作ってみましょう。

  1. 試しにmix nerves.new hello_nervesとしてNervesプロジェクトを作りましょう。
  2. 次に,cd hello_nervesとします。
  3. もし Raspberry Pi 3用にファームウェアを作るのであれば,export MIX_TARGET=rpi3とします。
  4. mix deps.getとします。(もし,ARMネイティブモードになっている場合には,ここでコケます)
  5. iex -S mixを実行してホストで実行してみます。
    1. HelloNerves.helloを実行すると :worldと出ることを確かめます。
    2. Ctrl-Cとaを押して終了します。
  6. 次のいずれかでターゲット(例えばRaspberry Pi 3)と接続します。
    1. ホストとターゲットをUSBで接続する (今回,未検証です)
    2. ホストとターゲットを有線LANで直に接続する
  7. 2の場合は,config/target.exsを編集します(後述)。
  8. Micro SDをアダプタを介してMacに挿します。
  9. mix firmware.burnとします。
    1. /dev/rdisk4? [Yn]y と答えます
    2. パスワード入力のウィンドウが立ち上がりますので,ログインパスワードを入れてください
  10. Micro SDを外して,ターゲットに挿入します。
  11. ターゲットを起動します。
  12. 接続方法で2を選んだ場合には,ping nerves.localとして接続を確認します。
  13. 接続されていたらssh nerves.localとします。
    1. HelloNerves.helloを実行すると :worldと出ることを確かめます。
    2. exitとして終了します。

これで動作が確認できました!

ARMネイティブモードでNervesを動かすために

NervesをM1 Macで動作させようとして,Rosetta 2モードでは成功したことと,ARMネイティブモードでは動作しなかったことを,世界で初めて私が報告しました。 https://github.com/nerves-project/toolchains/issues/66

Nervesの作者の1人のJustin Schneck氏もM1 Mac入手に動いているのですが,到着するのに4-5週間かかるということなので,私が協力してARMネイティブモードで動かすべく作業を続けています。

方向性としては,M1 Macでbuild_release.shというスクリプトを使用して,イメージを作成しGitHubに登録すれば良いのですが,なかなか正常に動作せずに苦戦しています。

おわりに

明日のNerves JP Advent Calendar 2020の11日目は @mnishiguchi さんの「Elixir/Nervesでパルス幅変調 (PWM) Lチカ」です。

本研究成果は、科学技術振興機構研究成果展開事業研究成果最適展開支援プログラム A-STEP トライアウト JPMJTM20H1 の支援を受けた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ファイルシステムをCase-sensitiveに設定しておこう for Mac

前置き

この記事は 2020 年の RevComm アドベントカレンダー 15 日目の記事です。 14 日目は
@tatakahashi35 さんの「 RevComm の裏側で動くアルゴリズム [二分探索編] 」でした。

こんにちは、 RevComm のエンジニアの持田です。 MiiTelに続く、第二弾プロダクトの開発を担当し、プロジェクトマネージャーも兼任しています。
今回は、Macで作業していて少しトラブったことがあったので、反省のために具体的な事象と解決方法をお話したいと思います。
なお、 Gitを用いた開発をしている方であれば誰でも起こりうる ので、一読いただくとのちのち助けになるかと思います。

発生したトラブル

とあるフロントエンドの改修で、ローカルのgitリポジトリ以下に存在する、setting.js 1 というファイルを、Setting.js 1 にリネームしました。
この変更がgitに検知されず、コミットに含まれなかったことが原因2で、 開発環境でNo such file or directory エラーが発生しました。

どうやらMacでは デフォルトで大文字小文字を区別しない ファイルシステムが設定されていたようでした。
再発を防ぐため、大文字小文字を区別する開発用のボリュームを作成することにしました。

大文字/小文字を区別するボリュームの作成方法

  1. Command + Spaceで「ディスクユーティリティ」と入力して、ディスクユーティリティを起動します。その後、ボリュームを追加します。
    image.png

  2. フォーマットで、APFS (大文字/小文字を区別) を選択します。暗号化するかどうかは用途に合わせてください。
    02_大文字小文字区別選択.png

  3. ボリュームが作成されると、マウントポイントが表示されます。こちらのディレクトリ以下に開発ディレクトリを置くと良いでしょう。
    image.png

確認方法

Case-sensitiveに設定できている場合は、下記のように大文字で始まる「Test」と小文字で始まる「test」の両方のファイルを作成できます。

mochida@mbp ~             % cd /Volumes/casesensetive
mochida@mbp casesensetive % touch test
mochida@mbp casesensetive % touch Test
mochida@mbp casesensetive % ls
Test    test

また、ディスクユーティリティでも、「大文字/小文字を区別」という記載がされるので、こちらでも確認できます。
image.png

他の方法

後で調べたところ、Gitでファイル名の大文字・小文字の変更を検知するようにする という記事でも、本事象に関しては解決できそうでした。

あえてファイルシステムを変更するメリットとしては、
サーバーとして多々利用される、Amazon Linux 2 などではデフォルトで大文字/小文字を区別するようになっているので、少し手間はかかりますが開発端末も合わせておくと良いかもしれません。

最後に

明日は @shuheikatoinfo さんの「 音声合成・激動の10年を振り返る 」です。


  1. 実際とは異なる、わかりやすい名前を使っています。 

  2. そもそも開発環境にデプロイするまで気がつかなった原因として付け加えるなら、差分のチェックが甘かったことと、build時のエラー検知が適切に設定されていなかったことも挙げられます。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

$ brew upradeを実行したら権限系のエラーが出た

目的

  • $ brew upgradeを実行したときに出た権限系のエラーを解決するまでの経緯をまとめる

詳細

  1. $ brew upgradeを実行したら下記のエラーが出た。

    Error: Can't create update lock in /usr/local/var/homebrew/locks!
    Fix permissions by running:
      sudo chown -R $(whoami) /usr/local/var/homebrew
    Error: The following directories are not writable by your user:
    /usr/local/lib/python3.7/site-packages
    /usr/local/share/zsh
    /usr/local/share/zsh/site-functions
    /usr/local/var/homebrew/locks
    You should change the ownership of these directories to your user.
      sudo chown -R $(whoami) /usr/local/lib/python3.7/site-packages /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew/locks
    And make sure that your user has write permission.
      chmod u+w /usr/local/lib/python3.7/site-packages /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew/locks
    
  2. ディレクトリの所有権限を変更してくれって言われたら下記を実行する。

    $ sudo chown -R $(whoami) /usr/local/lib/python3.7/site-packages /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew/locks
    
  3. もう一回下記を実行した。

    $ brew upgrade
    
  4. ちょっと進んだけどエラーが出た。

    Error: An exception occurred within a child process:
      Errno::EACCES: Permission denied @ dir_s_mkdir - /usr/local/Cellar/openssl@1.1/1.1.1g
    
  5. 下記を実行してみる。

    $ chmod u+w /usr/local/lib/python3.7/site-packages /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew/locks
    
  6. もう一回下記を実行した。

    $ brew upgrade
    
  7. 改善せずエラーが発生した。

    Error: An exception occurred within a child process:
      Errno::EACCES: Permission denied @ dir_s_mkdir - /usr/local/Cellar/openssl@1.1/1.1.1g
    
  8. 下記のようなエラーが出ていることがわかった。

    touch: /usr/local/Homebrew/.git/FETCH_HEAD: Permission denied
    touch: /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/.git/FETCH_HEAD: Permission denied
    touch: /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/FETCH_HEAD: Permission denied
    fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied
    fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied
    
  9. エラーで検索したが下記がヒットした。

  10. 下記を実行してディレクトリの権限を変更する。

    $ sudo chown -R $(whoami) $(brew --prefix)/*
    
  11. 下記エラーが出た。

    Error: No such file or directory - /usr/local/Cellar/docker/19.03.13
    
  12. 下記の知見が出てきた。

  13. 下記を実行してみる。

    $ brew install docker docker-machine
    
  14. 再度下記を実行したら正常エラーが出ず実行できた。

    $ brew upgrade
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む