20210220のMacに関する記事は9件です。

MacのPython開発環境作成メモ

はじめに

Python環境作成時の自分用メモです。下記を参考にしました。

Macにpyenv + AnacondaでPython環境作成の備忘録
【初心者向け】Anacondaで仮想環境を作ってみる
pyenv-virtualenvを使って都合のいいように Pythonパッケージ環境を行き来する話
Macに0からpyenv + pyenv-virtualenvでpython環境を作る

動作環境

macOS Catalina 10.15.7

1. pyenv, pyenv-virtualenvのinstall

pyenvとpyenv-virtualenvはすでに入っていたので、実際にはinstall作業していないけれど、必要な作業は下記。

zsh
$ brew install pyenv pyenv-virtualenv

pyenvにPathを通す。.zshrcに以下を追加してsource .bash_profileで設定を適用する。

vim
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

2. Anacondaのinstall

pyenvでAnacondaをinstallする。

zsh
#install可能なpythonは下記で検索可能。Anacondaだけではなくいろいろ。
$ pyenv install --list

#anaconda3-5.1.0をinstall
$ pyenv install anaconda3-5.1.0

#installされたpythonのversionを確認
$ pyenv versions
* system (set by /Users/user/.pyenv/version)
  anaconda3-5.1.0

3. virtualenvを作成する

pyenv virtualenv installしたpython 環境名で環境を作成する。

zsh
$ pyenv virtualenv anaconda3-5.1.0 anaconda3-510env
#installされるパッケージの名前とかいろいろ出てくる

workディレクトリにvirtualenvをあてる。

zsh
$ pyenv versions
  system
* anaconda3-5.1.0 (set by /Users/user/.pyenv/version)

#Anacondaをglobalに切り替え
$ pyenv global anaconda3-5.1.0 

#workディレクトリを作成する。プロンプトの前に現在のpythonの環境が出てくる。便利
(anaconda3-5.1.0) $ mkdir anaconda3-510env
(anaconda3-5.1.0) $ cd anaconda3-510env

#workディレクトリにanaconda環境をあてる。workディレクトリに移動するとanacondaが使えるようになる
(anaconda3-5.1.0) $ pyenv local anaconda3-5.1.0
(anaconda3-5.1.0) $ pyenv versions     
  system
* anaconda3-5.1.0 (set by /Users/user/anaconda3-510env/.python-version)

#condaで仮想環境を作る
(anaconda3-5.1.0) $ conda create --name py36 python=3.6
(anaconda3-5.1.0) $ pyenv versions
  system
* anaconda3-5.1.0 (set by /Users/user/anaconda3-510env/.python-version)
  anaconda3-5.1.0/envs/py36

#py36用のworkディレクトリを作成
(anaconda3-5.1.0) $ mkdir py36
(anaconda3-5.1.0) $ cd py36

#py36workディレクトリにpy36環境をあてる
(anaconda3-5.1.0) $ pyenv local anaconda3-5.1.0/envs/py36
(anaconda3-5.1.0/envs/py36) $ pyenv versions
  system
  anaconda3-5.1.0
* anaconda3-5.1.0/envs/py36 (set by /Users/user/anaconda3-510env/py36/.python-version)

#ディレクトリを移動するとpython環境が変わる。すごい、便利
(anaconda3-5.1.0/envs/py36) $ cd ../
(anaconda3-5.1.0) $ pyenv versions
  system
* anaconda3-5.1.0 (set by /Users/user/anaconda3-510env/.python-version)
  anaconda3-5.1.0/envs/py36

#systemをglobalに戻す(必要に応じて)
(anaconda3-5.1.0) $ pyenv global system

4. Jupyter Notebookの設定

condaで作成した仮想環境py36にはJupyter Notebookが入っていない。Jupyter Notebookのカーネルを設定する上で必要なので、インストールして諸々設定を行う。

zsh
#py36環境にjupyterをinstall
$ cd py36
$ pip install jupyter

#baseに戻って、environment_kernelsをinstall
$ cd ../
$ pip install environment_kernels

#設定ファイル作成
$ jupyter notebook --generate-config
Writing default config to: /Users/achi/.jupyter/jupyter_notebook_config.py
$ echo "c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'" >> ~/.jupyter/jupyter_notebook_config.py
$ echo "c.EnvironmentKernelSpecManager.conda_env_dirs=['/Users/user/.pyenv/versions/anaconda3-5.1.0/envs/']" >> ~/.jupyter/jupyter_notebook_config.py

Jupyter Notebookを開いて、設定した環境が出てきたら設定完了。
スクリーンショット 2021-02-20 23.46.05.png

お疲れ様でした。

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

Macのpyenv installエラー

環境

  • MacOSX 11.2.1 BigSur

エラー内容

MacOSXでのzlibエラー。
pyenv install 3.8.5を叩くとエラーがでた。

$ pyenv install 3.8.5
error
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Installing Python-3.8.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.2.1 using python-build 20180424)

ログのtailはこんな感じ。

log
    __import__(pkg_name)
  File "<frozen zipimport>", line 241, in load_module
  File "<frozen zipimport>", line 709, in _get_module_code
  File "<frozen zipimport>", line 570, in _get_data
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

対処法

Tipsによく転がっているxcode-selectや、pkgのインストールなどではうまくいかなかったが、下記でうまくいった。

LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib" pyenv install 3.8.5

参考にした記事

こちらの記事に書いてあった。
https://github.com/pyenv/pyenv/issues/1219#issuecomment-727951276

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

pyenv installしたときのZipImportError

環境

  • MacOSX 11.2.1 BigSur

エラー内容

MacOSXでのzlibエラー。
pyenv install 3.8.5を叩くとエラーがでた。

$ pyenv install 3.8.5
error
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Installing Python-3.8.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.2.1 using python-build 20180424)

ログのtailはこんな感じ。

log
    __import__(pkg_name)
  File "<frozen zipimport>", line 241, in load_module
  File "<frozen zipimport>", line 709, in _get_module_code
  File "<frozen zipimport>", line 570, in _get_data
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

対処法

Tipsによく転がっているxcode-selectや、pkgのインストールなどではうまくいかなかったが、下記でうまくいった。

LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib" pyenv install 3.8.5

参考にした記事

こちらの記事に書いてあった。
https://github.com/pyenv/pyenv/issues/1219#issuecomment-727951276

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

JenkinsのBuild AgentをMac上に構築する

Jenkinsを使ったiOSアプリのCI/CD環境を構築するために、ビルドエージェントとしてmac miniを登録する機会があったため手順をまとめておきます。

基本的な流れは GitLab CI Runner に近いです。
https://qiita.com/takamii228/items/64fd6879e6acce845980

なお今回利用したJenkinsのバージョンは 2.235.2 です。

mac miniの設定をする

まずmac miniでJenkinsのAgentが動作する準備をします。

JenkinsのAgentを動作させるためにはJavaが必要なのでHomeBrew経由でインストールします。

$ brew install openjdk@11
$ export PATH="/usr/local/opt/openjdk@11/bin:$PATH"
$ java -version   
openjdk version "11.0.9" 2020-10-20
OpenJDK Runtime Environment (build 11.0.9+11)
OpenJDK 64-Bit Server VM (build 11.0.9+11, mixed mode)

またJenkins Agentが動作するための作業ディレクトリを切って移動しておきましょう。

$ mkdir ~/jenkins
$ cd ~/jenkins

今回はサンプル用にかんたんなシェルスクリプトを動作させますが、本来はmac miniのagent上で実行したいCI・CDの実行環境も合わせて構築する必要があります。

JenkinsのJNLPのポートを固定する

JenkinsのAgentの通信方法はsshを使うものとJNLPを使うものを選べますが今回はJNLPを使います。
JNLPはJava Network Launch Protocolの略でJenkinsのビルドエージェントを動作させる仕組みとして用いられています。詳細な説明はこちらを参照してください。

https://docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/jnlp.html

Jenkinsのデフォルトの設定だとJNLPで使うポート番号はランダムになるようになっています。ランダムだとセキュアでよいのですが、IPやポートに制限を加えている環境での利用では可変だと困るので、適当な値に固定にしておくとよいでしょう。他のポートとぶつからないようにプライベートポートの範囲である49152 ~65535の間から一つ選びましょう。

JNLPで利用するポート番号の固定はJenkinsにログインして管理画面(Manage Jenkins)に移動してグローバルセキュリティ(Configure Global Security)のAgentの設定で指定できます。

合わせてこのポート番号とmac miniからの通信経路の穴あけを確認しておきましょう。

JenkinsのBuild Agentを追加する

次にJenkinsの管理画面でBuild Agentのノード設定を行います。

管理画面(Manage Jenkins)に移動して「ノード管理(Manage Nodes and Clouds)」を選択します。

ノードの管理画面の左のリストのうち「新規ノードの作成(New Node)」を選択して新しいNodeを作成します。ノードの名前を入力し、Permanent AgentにチェックをいれてOKを押します。

次に詳細な設定を入力していきます。

  • ノード名(Name)
    • ノードの名前を入力します
  • 説明(Description)
    • ノードの説明を入力します
  • 同時ビルド数(# of executors)
    • 同一ノード上での同時ビルド数を入力します。iOSは並行でビルドするとDerivedDataの関係でエラーになる可能性があるので1にします
  • リモートFSルート(Remote root directory)
    • mac mini上での絶対パスをします。今回は /Users/${username}/jenkins です
  • ラベル(Labels)
    • Jenkinsfileでnodeとして指定するラベルを定義します
  • 用途(Usage)
    • 指定された場合のみ動作するか共有にするか選べます。今回は指定された場合のみに設定します。
  • 起動方法(Launch method)
    • Launch agent by connection it to the master にします
  • 可用性(Availability)
    • Keep this agent online as much as possible にします
  • ノードプロパティ
    • 特に設定しません

すべて入力したら保存(Save)します。

Jenkins Agentを起動してMasterと接続する

次にmac mini上でagentを起動してJenkins Masterと接続します。

動作させるJenkins Agent用のjarファイルは http://yourserver:port/jnlpJars/agent.jar にアクセスするとダウンロードすることができます。yourserver:portの部分は自身の動作させている環境に合わせて修正してください。

先程作成したノードの作成画面にagent.jarの起動コマンドが記載されているので、それをmac mini上で起動すればよいです。

$ java -jar agent.jar -jnlpUrl http://${yourhostname}:${port}/computer/${jenkins-agent-node-name}/slave-agent.jnlp \
  -secret ${secretToken} -workDir "/Users/xxxxxx/jenkins" 
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /Users/xxxxxx/jenkins/remoting as a remoting work directory
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to /Users/xxxxxx/jenkins/remoting
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main createEngine
INFO: Setting up agent: ${jenkins-agent-node-name}
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener <init>
INFO: Jenkins agent is running in headless mode.
Feb 18, 2021 8:04:58 PM hudson.remoting.Engine startEngine
INFO: Using Remoting version: 4.3
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /Users/xxxxxx/jenkins/remoting as a remoting work directory
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Locating server among [http://${yourhostname}:${port}/]
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver isPortVisible
WARNING: Connection refused (Connection refused)
Feb 18, 2021 8:04:58 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping]
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Agent discovery successful
  Agent address: ${yourhostname}
  Agent port:    ${jnlpport}
  Identity:      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Handshaking
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connecting to ${yourhostname}:${jnlpport}
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Trying protocol: JNLP4-connect
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Remote identity confirmed: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Feb 18, 2021 8:04:58 PM hudson.remoting.jnlp.Main$CuiListener status
INFO: Connected

上記ログのように Connect が表示されれば起動完了です。

Jenkinsの管理画面からも確認できます。

settings.png

ジョブを動かしてみる

ジョブが正しく設定されていることを確認してみましょう。Jenkinsでパイプラインジョブを作成して、mac mini上のマシン名を表示するだけのジョブ設定をしたJenkinsfileを入れて実行してみます。labekのところはノードの設定のときに入力したラベル名を入れます。

pipeline {
    agent {
        node {
            label '${nodeLabelName}'
        }
    }

    stages {
        stage('build'){
            steps {
                sh 'uname -n'
            }
        }
    }
}

実行ログでmac miniのマシン名が表示されれば設定は完了です。

Started by user xxxxxx
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on jenkins-agent-sample in /Users/xxxx/jenkins/workspace/jenkins-connect-sample
[Pipeline] {
[Pipeline] stage
[Pipeline] { (build)
[Pipeline] sh
+ uname -n
xxxxxxxxx.local
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

以上で設定は完了です。実際にはこのシェルディレクティブの中でCIやCDのスクリプトを実行するようにして、Jenkinsのジョブ設定でトリガーやパラメータ設定をすれば完成です。

おまけ

JenkinsのAgent起動ジョブはコマンドラインでjavaコマンドで起動していました。もしmac miniを再起動したりコネクションが切れたときに再接続したい場合は、都度マシンにアクセスして起動コマンドを打たないといけません。

この課題を解決するために、macOSでデフォルトで利用できるlaunchdという仕組みを活用します。launchdについては公式サイトに例が沢山乗っているのでこちらを参考にします。

https://launchd.info/

今回は起動時に起動のjavaコマンドを実行し、ネットワークが再接続されたりクラッシュしたら再度javaコマンドを実行するようにlauchdを設定してみます。

launchdはplistファイルに設定や実行コマンドを記述します。Jenkins Agentを起動するplistファイルは以下のようになります。コマンドは絶対パスで記入するのがポイントのようです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.Jenkins.Agent.launchd</string>
        <key>KeepAlive</key>
        <dict>
            <key>NetworkState</key>
            <true/>
            <key>Crashed</key>
            <true/>
        </dict>
        <key>RunAtLoad</key>
        <true/>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/opt/openjdk@11/bin/java</string>
            <string>-jar</string>
            <string>/Users/xxxxxx/jenkins/agent.jar</string>
            <string>-jnlpUrl</string>
            <string>http://${yourhostname}:${port}/computer/${jenkins-agent-node-name}/slave-agent.jnlp</string>
            <string>-secret</string>
            <string>${secretToken}</string>
            <string>-workDir</string>
            <string>"/Users/xxxxxx/jenkins"</string>
        </array>
        <key>StandardOutPath</key>
        <string>/tmp/jenkins.agent.stdout</string>
        <key>StandardErrorPath</key>
        <string>/tmp/jenkins.agent.stderr</string>
    </dict>
</plist>

作成したファイルは ~/Library/LaunchAgents/ 配下に配置してlaunchctlコマンドでloadすると設定されます。

$ launchctl load ~/Library/LaunchAgents/jenkins.agent.settings.plist  

こうしておくとmac miniの起動時に自動でagent.jarを起動してくれます。
再起動してみましょう。

$ ps aux | grep "agent.jar"
xxxxx          969   0.0  2.5  8137224 211276   ??  S     6:51PM   0:19.33 /usr/local/opt/openjdk@11/bin/java -jar /Users/xxxx/jenkins/agent.jar
$ launchctl list | grep "local.Jenkins"
969 -9  local.Jenkins.Agent.Setting

設定通り起動してくれていますね。

クラッシュしたりネットワークが切れたときについては試してませんがおそらく再起動してくれるはずです。もしかしたらjnlpのレイヤでやってくれるのかもですが、まずはしばらく運用してみようと思います。

参考資料

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

M1 MacでのECRへのpushで ここに気をつけろ❗️

horizontal-logo-monochromatic-white.png

要点

  • CodeBuild でエラー。何が起きたか気づきにくい
    standard_init_linux.go:211: exec user process caused "exec format error"
  • amd64 のダイジェストを指定してpullしましょう

内容

2020年から Docker Hub の Pull回数制限がかかり、
回避のためにローカルからpushする方などいるのではないでしょうか。

M1 Macでも いつもの通り、
$ docker pull XX:XX
と普通に pull してしまうかもしれませんが、

対象のimageがマルチCPUアーキテクチャ対応だと、
自動選択で arm のイメージを持ってきてしまいます?

ですので、amd64 のダイジェストを指定してpullしましょう。

php imageでの簡易例

  1. Tagsタブ -> OS/ARCH のlinux/amd64 を選択
    スクリーンショット 2021-02-20 15.58.40.png

  2. DIGEST: の右をコピー
    スクリーンショット 2021-02-20 15.33.26.png

  3. 以下のように pull する

    $ docker pull php:fpm-alpine3.13@sha256:4b90222a821ef24358d305cbe51ff65f31edea6e323b06f40ee1f800401ebaf0
    
  4. 試しに run で確認して、arm という文字列がなければOK

    $ docker run 932a0ce9593c uname -a
    Linux 2309aaa4729b 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 Linux
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VS CodeでOpenCVする時に、MacBook内蔵Facetimeカメラが使えない(セキュリティーとプライバシー)

とりあえず、最短距離でOpenCVを試してみたい

Mac/iMacで、OpenCVやってみたい、さぁ、とりあえずサンプルを、と思ったとき、以下のような最短手順で、内蔵Facetimeカメラを使った顔認識を試すことができます。

ダウンロード/インストール

pip3 install -U opencv-contrib-python
curl -OL https://github.com/opencv/opencv/archive/4.5.1.zip
unzip 4.5.1.zip

実行

cd opencv-4.5.1/samples/python

python3 facedetect.py
カメラへのアクセスが必要と言われたら、[OK]を押して、もう一度実行。
自分の顔で試したり、そのへんに転がっていた集合写真などをかざせば、オッケー。
(escキーで終了)

(蛇足)ダウンロードは、curlでもwgetでもお好きな方で。

wgetが好きな人は、curlの代わりに、
wget https://github.com/opencv/opencv/archive/4.5.1.zip
brewでwgetをインストールする場合は、
brew install wget

VS Codeでやってみると、あれ???

VS Code便利!、ターミナルもVS Codeで、となっている人も多いと思います。
で、やってみると、んんー、と考えた後、エラーが出ます。

Abort trap: 6

なにこのエラーメッセージ。そっけない。ググッてみたら、C++コード実行時例外発生、ということで、いろいろな局面で出る模様。

Facetime HD Camera関係でググると、カメラのアクセスがシステムによって許可されていないから、ということ。「システム環境設定/セキュリティーとプライバシー/カメラ」で、登録するやつですね。

ターミナルアプリは、許可されているのでオッケー。はい、ここにVS Codeも登録したら良いです。とはならない。。

例えば、ブラウザ経由で動いているJupyterがカメラ/マイクを使おうとするとき、Jupyterからリクエストがでて、ここに登録する流れができますが、VS Codeはそれがないことが問題。マイクへのアクセスも同様。

とりあえずの解決策

ターミナルから、code .とコマンドを打ってVS Codeを起動すればよい。カメラ/マイクへのアクセスは、起動した親のアクセス権が適応される、ということ。

codeコマンドを有効にするには、
1. VS Codeのコマンドパレットから、shellと入力。
2. 「シェル コマンド: PATH内に'code'コマンドをインストールします」をクリック。

根本的な解決

VS CodeのGitHub.comリポジトリで、issueが上がっています。

'VSCode terminal doesn't allow/request permissions to access media devices #95062'
https://github.com/microsoft/vscode/issues/95062

問題は認識されているが、未解決。
根本的な解決は、VS Codeが「セキュリティーとプライバシー」に登録される流れを実装すること。しばし待て、ですね。

危険なゴニョゴニョ

おとなしく、待つ方が賢明です。それでもやりたい人は、データベースを直接書き換えます。アップデートなどでデータベースの構造が変化していたりすると、バグります。

リカバリーモードでシステム再起動(cmd+R長押し)して、System Integrity Protection(SIP、システム整合性保護)を一時的に無効化しないとダメ、というサイトが多数見られますが、不要です。

代わりに、ターミナルにフルディスクアクセスの権限を与えます。

スクリーンショット 2021-02-20 13.19.02.png

Mojaveは、これで行けました。

# TCC.dbを念の為バックアップして、データベースを編集
cd ~/Library/Application\ Support/com.apple.TCC/
cp TCC.db TCC.db.bak
sqlite3 TCC.db  # sqlite>プロンプトが出ます。

# Mojaveの場合:
#  VS Codeにカメラへのアクセス権を追加
INSERT into access VALUES('kTCCServiceCamera',"com.microsoft.VSCode",0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

#  マイクへのアクセス権を追加
INSERT into access VALUES('kTCCServiceMicrophone','com.microsoft.VSCode',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

スクリーンショット 2021-02-20 13.15.45.png

BigSurの場合(すみません、未検証です。どなたか、冒険心と興味あれば追試を。危険です。)

# BigSurの場合:

GitHub.comのissueでBigSurを検証してくれた人がいました。カラムが12から13に増えたようで、1を一つ増やしてオッケーだったようです。

INSERT into access VALUES('kTCCServiceCamera',"com.microsoft.VSCode",0,1,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

INSERT into access VALUES('kTCCServiceMicrophone','com.microsoft.VSCode',0,1,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

おまけ。OpenCVのサンプル実行

色々試すには、メニューアプリdemo.pyを使う。

cd opencv-4.5.1/samples/python
python3 samples/python/demo.py

読みにくかったので、フォントやフォントサイズを改変しました。各エントリーが、かなりいい加減に作られていて、ボロが出ます。もうちょっとメンテしても良さそうな。。

ビデオソースを使うデモとしてわかりやすいのは、こんなところで。

facedetect.py
mosse.py
edge.py

基本的にescキーで終了、となっているものが多いかな?

レナさんファンは、チュートリアルにある、こちらなど、どうぞ。

cd opencv-4.5.1/samples/python
python3 tutorial_code/ImgTrans/Filter2D/filter2D.py

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

Finderで開いてるディレクトリへcdするコマンド

Finderで開いてるディレクトリへcdするコマンドを作ります。

~/.zshrc
cdf() {
  target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
  if [ "$target" != "" ]; then
    cd "$target"; pwd
  else
    echo 'No Finder window found' >&2
  fi
}

alias f='open .'

シェルを開き直します。

$ exec $SHELL -l

Finderでcdしたいディレクトリを開いておきます。

$ cdf

移動できればokです。

$ f

カレントディレクトリをFinderで開くエイリアスを付けておくと便利です。

参考

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

Zoomでバ美肉発表したい!(macOS)

macOSだけど自作のVRモデルでバ美肉したい人向けの覚え書きです。
声も合わせて変えるように設定します。
全て無料で出来ます。
大体はこのページの最後に書いてあるサイトを参照して作りましたが、自分でトラブルシューティングしたものやメモ等を書きます。
初めてのQiitaなので、間違っていることがあったら教えてください!

環境

  • MacBook Pro(Catalina)

目次

1.モデルを作る
2.リップシンクする
3.仮想カメラに出力する
4.声を変える
5.参照

使うもの

  • VRoid Stadio
  • 3tene_beta
  • OBS Stadio
  • Gachikoe!
  • soundflower
  • LadioCast

インストールの際開発元が不明なためなどポップアップが出て開けない場合はmacのシステム環境設定->セキュリティとプライバシー->一般許可または開くをしてください

1. モデルを作る

VRoid Stadioをインストールします。
https://vroid.com/studio/

起動直後のアバターを選ぶ画面で右上のLanguage日本語に変えてください。
モデルを作る際、0から作るのもいいですが、初めて作る方は自作キャラのイメージに近い髪型の子をサンプルモデルとして選ぶといいと思います。

macの性能次第で後手の手順でつまづく可能性があるので、ここで一旦サンプルモデルをダウンロードしましょう。

上部右の撮影・エクスポートタブから
エクスポートを選択して.vrm形式で保存するか、VRoid Hubにアップロードする(非公開設定可)方法があります。
私はVRoid Hubにアップロードしました。その方が3teneで使用する際若干楽なので特に問題なければその方がいいと思います。
pixivのアカウントが必要なので、未登録の人は登録してください。
ログインしてもモデリングの上でさほど問題はないので、プライベート用の人もそのまま使用して大丈夫だと思います。

2. リップシンクする

モデルを読み込んで、3teneでリップシンクさせます。
以下のサイトでダウンロードしてください。
https://3tene.com/free/
ダウンロード後はアプリケーションフォルダに移動すると扱いやすいかもしれません。

スクリーンショット 2021-02-20 0.55.41.png
左側のバーの上から4番目にあるこのアイコンをクリックして.vrmファイルを選ぶか、VRoid Hubにアクセスしてください。

VRoidHubから抽出する場合

ブラウザを起動するを選択するとサイトが立ち上がるので待ってください。表示された認可コードをブラウザからコピーして3teneのテキストフィールドにペーストします。アクセス権については自作したものなら同意で大丈夫だと思います。

ファイルから選ぶ場合

のアイコンをクリックして先ほど保存した.vrmの拡張子のファイルを選択して開きます。

スクリーンショット 2021-02-20 0.59.30.png
このアイコンでリップシンクをオンにします。手持ちのMacBookAirだとここをオンにすると落ちてしまうのですが、改善策があれば教えてください。
(追記:MacBookAirで外部ウェブカメラだと使える場合もあるそうです。再インストールも試してみてください。)
MacBookProだと問題なく使えました。

トラッキングの開始はこの状態にしてください。
スクリーンショット 2021-02-20 12.46.14.png

スクリーンショット 2021-02-20 1.00.13.png
リップシンク種類は顔認識がデフォだと思いますが、もし違ったらここで変えておいてください。
スクリーンショット 2021-02-20 1.20.01.png
デフォルトの状態だと反転してしまっていると思うので、顔のフェイストラッキング(全般)映り方シンクロからに変更しておいてください。

スクリーンショット 2021-02-20 1.03.48.png
リップシンクとフェイストラッキングをオンにした後は、変な方向を向いていると思うので、必ずこのボタンを押してください。

スクリーンショット 2021-02-20 1.03.34.png
この後他の画面と重ねてモデルを使うのでこのアイコンで背景を緑にしておいてください。
スクリーンショット 2021-02-20 1.06.15.png
背景変更->色指定->緑

モデルの設定はこれで完成です。

3. 仮想カメラに出力する

今回使用するOBS Studioはこちらのサイトでインストールしてください。
https://obsproject.com/

OBSの設定です。OBSを起動するとポップアップウィンドウで配信か否か聞かれますが、閉じてしまって大丈夫です。
スクリーンショット 2021-02-20 1.13.39.png
スクリーンショット 2021-02-20 1.14.12.png

ソースのところを右クリックしてウィンドウキャプチャを選択します。
新規作成を選択し、空の名前でウィンドウを表示にチェックを入れて
スクリーンショット 2021-02-20 12.39.22.png
3teneFREE_betaウィンドウを選択します。ここで画面収録をセキュリティに求められるので、macのシステム環境設定->セキュリティーとプライバシー->プライバシー->画面収録->OBSにチェックです。鍵を外して設定変更し、OBSを再起動します。

次に、同じようにウィンドウキャプチャを選択し、モデルと重ねたい画面を選びます。ここで選びたいウィンドウが出てこない場合は、該当ウィンドウが最大化・最小化されていないか確認してください。

選択ウィンドウが表示されたら、同じ手順で3teneのウィンドウを選択します。
ウィンドウのトリミングはoption+ドラッグでできます。
トリミングしたモデルのレイヤーを右クリックして、フィルタを選択します。
スクリーンショット 2021-02-20 1.16.43.png
下から二番目です。
スクリーンショット 2021-02-20 1.17.14.png
エフェクトフィルタクロマキーを選択すると、人物だけ抽出されます。

zoomを始める前に、
スクリーンショット 2021-02-20 1.23.22.png
仮想カメラ開始を選択します。
26.1より前のバージョンだと、仮想カメラを別でインストールする必要がありましたが、現在(2021年1月)のバージョンだとこのボタン一つで仮想カメラが作動します。必ずzoomに入る前に行ってください。入った後だとこの仮想カメラが認識されない可能性があります。

zoomに入ったら
スクリーンショット 2021-02-20 1.19.30.png
カメラを選択OBS Virtual Cameraを選択します。

声を変える必要がない人はこれで終了です。

4. 声を変える

soundflowerとLadioCastとGachikoe!をインストールしてください。
soundflower: https://soundflower.softonic.jp/mac
LadioCast: https://apps.apple.com/jp/app/ladiocast/id411213048?mt=12
Gachikoe!: https://booth.pm/ja/items/1236505
LadioCastはapp storeから検索しても大丈夫です。

soundflowerはうまくインストールできない人は、BlackHoleがいいらしいです。

Gachikoe!の設定はスクリーンショット 2021-02-20 1.25.50.png
上のOptionを選択しスクリーンショット 2021-02-20 1.26.18.png
Audio Settings...を選択します。
スクリーンショット 2021-02-20 1.26.58.png
OutputにSoundflower(2ch)を選択して、Inputはお手持ちのマイクか内臓マイクを選択してください。

次にLadioCastを起動してスクリーンショット 2021-02-20 1.28.18.png
このように設定します。
スクリーンショット 2021-02-20 1.28.48.png
zoomはマイクの設定をSoundflower(64ch)にして完成です。
この場合、LadioCastで出力した先をマイクにするのがコツです。

以上で終わりです。
ここまで読んでくれてありがとうございました。

5. 参照

https://game.sukecom.net/vroid-obs/#i
https://silverbirder180.hatenablog.com/entry/2020/03/08/175607

VRoidモデル作成に関して

VRoidのショートカット
WEARVIRTUAL2forVRoid(このサイトで服がDLできてすごい!)

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

FBXSDKをmacのターミナルで使いたいので使えるようにした

はじめに

ふと思いました。macとOpenGLでFBXモデルを表示してみたい!
OpenGLがオワコンなのはわかっています。でもやりたかったんです。

でも、そもそもFBXをどうやって読み込むのか、そこから始めないといけませんでした。
手動など色々考えましたが、辿り着いたのはFBXSDKでした。
このFBXSDKを使えばFBXが簡単に読み込める!そう思ってた時期が自分にもありました。

C++で書いたプログラムでFBXを読み込みたかったんです。
XcodeやVSでコンパイルする方法は調べればたくさん出てくるのですが、ターミナルでコマンドを打ってコンパイルする方法ってあんまり書かれてないんですよ。
公式のサンプルはcmakeを使用してますが、cmakeを作るのも面倒です。

gccもしくはg++で一発でコンパイル&リンクしてくれないだろうか...
この記事はそれをなんとかやってみた話になります。

環境

  • macOS BigSur 11.2.1
  • zsh 5.8
  • g++ 12.0.0(Apple clang)
  • fbxsdk 2020.2

FBXSDKのインストール

とにもかくにもSDKをインストールしないと始まりません。
FBXSDKのWebサイトから、Macのところのリンクをクリックしてください。Universal Binaryとか書いてあると思います。

そしたらtgzファイルがダウンロードされると思うので、解凍します。
するとpkgファイルが作成されます。これを開くことでFBXSDKのインストールが始まります。
デフォルトだと、/Applications/AutoDesk/FBX SDK/(バージョン)/のようなところに保存されると思います。場所を変更したければしてもらって構いません。以降は便宜上/FBX SDK/2020.2/と表記します。

お試しビルド

まず自身の環境でビルドができるのか、サンプルで試してみます。
インストールしたフォルダの中にあるsamples/ViewSceneまでターミナルで移動します。
そこで、

$ cmake .
$ make

とすればビルドができると思います。
人によってはPermission Deniedなんて出るかもしれません。そんな時は須藤sudoをつけて実行してください。
実行ファイルの場所は出力されていると思います。自分の場合は、
/FBX SDK/2020.2/bin/x64/clang-static/debug/に作成されていました。
作成した実行ファイルを動かすためには、一度このdebugファイルまでターミナルで移動してから実行してください。
Finderから実行すると場所が悪いのかうまく動いてくれませんでした。

ここまでできない場合は、そもそもC++をコンパイルできる環境にないかもしれません。いろいろ調べて出直してきてください。

自作プログラムの作成

これでFBXSDKを使ったプログラムをコンパイルできる段階まできました。
ここからは自分で用意したプログラムを任意の場所で実行する方法になります。

まず動かすプログラムを作成します。このプログラムはこちらのWebサイトから一部拝借させていただきました。FBXファイルを読み込み、何も問題なければエラーなく動き「Success」と表示されるプログラムです。

main.cpp
#include <cstdlib>
#include <iostream>
#include <fbxsdk.h>

int main(){

  // FBX SDKを生成・初期化
  FbxManager* manager = FbxManager::Create();
  assert(manager);

  // 読み込み機能を生成
  FbxImporter* importer = FbxImporter::Create(manager, "");
  assert(importer);

  if (!importer->Initialize("hoge.fbx")) // 読み込むFBXファイルを指定
    {
      // 読み込み失敗
    }

  // 読み込み用のシーンを生成
  FbxScene* scene = FbxScene::Create(manager, "");
  assert(scene);

  // ファイルからシーンへ読み込む
  importer->Import(scene);

  // FbxImporterはもう使わないのでここで破棄
  importer->Destroy();

  // 
  // シーンから必要な情報を取り出す処理を書く
  //

  // シーンを破棄
  scene->Destroy();

  // FBS SDKを破棄
  manager->Destroy();

  std::cout << "Success" << std::endl;
}

このプログラムを好きな場所においてください。これで準備は整いました。

ビルドするためのコマンド

本題です。
結論としては、このようにコマンドを入力します。

g++ -L"/FBX SDK/2020.2/lib/clang/debug" -I"/FBX SDK/2020.2/include" -lfbxsdk -std=c++11 main.cpp

順に解説をしていきます。

まずコマンドはg++です。gccでもいいのですが、その場合-lc++を付与する必要があります。

-L-Iは人によって見慣れたり見慣れなかったりだと思います。

-Lはライブラリを探すパスを表しています。このパスの先に何があるかというと、libfbxsdk.dyliblibfbxsdk.aがあります。これらが何かは墓穴を掘りそうなので調べてください。
指定することで、どのライブラリを探してほしいのか指定することができます。debugフォルダとreleaseフォルダがありますが、どちらでも大丈夫だと思います。気分で選んでください。ここではdebugフォルダとします。

-Iはincludeファイルを探すパスを表しています。ヘッダーファイルとかですね。これで#include <fbxsdk.h>が働くようになります。

ちなみに、パスをダブルクォーテーションで括っている理由は、FBX SDKに空白があるからですね。フォルダ名を変更して空白なしにすれば括らずに実行できると思います。
パスはフルパスでお願いします。

-lfbxsdkは使用するライブラリを表しています。-Lでパスを指定し、-lでライブラリを指定しているという形です。

std=c++11はなくてもいいですが、ないとワーニングが大量に出るので、C++11以上を指定してあげてください。C++17とかでもプログラムによっては大丈夫だと思います。

最後に実行したいファイル名を指定して実行すれば、コンパイルが通ります。
通るだけですが。

実行時エラー

試しにプログラムを実行すると、このようなエラーが出ると思います。

dyld: Library not loaded: @executable_path/libfbxsdk.dylib
  Referenced from: ./a.out
  Reason: image not found

これはlibfbxsdk.dylibがうまく読み込めていないことに起因します。
@executable_pathとは何かというと、実行した時のパスになります。なので今だと実行ファイルがある場所になりますかね。人それぞれ違うと思いますが。

ですが、libfbxsdk.dylib/FBX SDK/2020.2/にあります。なんとかこの場所を指定してあげる必要があります。

その方法が、こちらのページで紹介されている、install_name_toolを使用する方法です。

install_name_tool -id "/FBX SDK/2020.2/lib/clang/debug/libfbxsdk.dylib" "/FBX SDK/2020.2/lib/clang/debug/libfbxsdk.dylib"

と入力すれば、@executable_pathがフルパスに書き変わります。これももしかしたら首藤sudoが必要かもしれません。適宜挿入してください。
正しく変更された場合は、

otool -D "/FBX SDK/2020.2/lib/clang/debug/libfbxsdk.dylib"

で確認できると思います。

これでもう一度コンパイルを行い、実行すると、うまくいけば「Success」と表示されます。お疲れ様でした。

静的ライブラリでのコンパイル(2020/02/20追記)

実は上記の方法だと動的ライブラリでのリンクとなってしまいます。
動的ライブラリだとFBXSDKがない環境だと動かない可能性があります。
せっかくFBXSDKには静的ライブラリもあるので、静的ライブラリでのリンクをする方法を調べました。

こちらのコマンドになります。(こちらの記事を参考にさせていただきました)

g++ -I"/FBX SDK/2020.2/include" -lxml2 -lz -liconv -framework Cocoa -std=c++11 main.c "/FBX SDK/2020.2/lib/clang/debug/libfbxsdk.a"

いくつか解説をします。

-lxml2-lzなどが追加されてますね。これがないと動いてくれませんでした。
dylibファイルだと動的にこの辺をリンクしてくれるのに対し、aファイルだとこの辺も指定してあげないといけない、というように解釈していますが...よく分かってません。

また、debugフォルダを-Lで指定するのではなく、aファイルを直接指定しています。
これにより、自分が作成したプログラムとlibfbxsdk.aファイルがうまく組み合わさってくれます。

実はlinux環境であれば、動的ライブラリの時のコマンドに、-staticオプションと上記の-lxml2などをつけるだけで解決するのですが、macOSでは-staticが使えないそうなので1、動的ファイルが優先されてしまいます。なので、aファイルを直接与えてあげる必要があります。

そういえば、おそらくこのコマンドをコンパイルするたびに打つのはめんどいと思うので、makefileくらいは作ってあげたほうが楽かと思います。

おわりに

FBXモデルを表示させたかっただけなのに、環境構築みたいなところで詰まってしまいました...
おとなしくXcodeを使うことも考えましたが、絶対にできると信じて検索をしまくりました。
バージョンが違ったり状況が違ったりすると上記の方法ではできない可能性があるので、あくまで参考程度に考えてくださいね。

久々にコンパイルやリンク、静的ライブラリ動的ライブラリに触れたので正直どうして何があってできたのかが分かってないです。申し訳ありません。これからじっくり学んでいきます。

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