- 投稿日:2021-02-20T23:50:59+09:00
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-virtualenvpyenvにPathを通す。.zshrcに以下を追加して
source .bash_profile
で設定を適用する。vimexport 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.03. 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 system4. 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.pyJupyter Notebookを開いて、設定した環境が出てきたら設定完了。
お疲れ様でした。
- 投稿日:2021-02-20T19:30:17+09:00
Macのpyenv installエラー
環境
- MacOSX 11.2.1 BigSur
エラー内容
MacOSXでのzlibエラー。
pyenv install 3.8.5を叩くとエラーがでた。$ pyenv install 3.8.5errorpython-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
- 投稿日:2021-02-20T19:30:17+09:00
pyenv installしたときのZipImportError
環境
- MacOSX 11.2.1 BigSur
エラー内容
MacOSXでのzlibエラー。
pyenv install 3.8.5を叩くとエラーがでた。$ pyenv install 3.8.5errorpython-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
- 投稿日:2021-02-20T19:12:55+09:00
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の管理画面からも確認できます。
ジョブを動かしてみる
ジョブが正しく設定されていることを確認してみましょう。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については公式サイトに例が沢山乗っているのでこちらを参考にします。
今回は起動時に起動の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のレイヤでやってくれるのかもですが、まずはしばらく運用してみようと思います。
参考資料
- 投稿日:2021-02-20T16:35:08+09:00
M1 MacでのECRへのpushで ここに気をつけろ❗️
要点
- 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での簡易例
以下のように pull する
$ docker pull php:fpm-alpine3.13@sha256:4b90222a821ef24358d305cbe51ff65f31edea6e323b06f40ee1f800401ebaf0試しに 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
- 投稿日:2021-02-20T14:11:52+09:00
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 wgetVS 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、システム整合性保護)を一時的に無効化しないとダメ、というサイトが多数見られますが、不要です。
代わりに、ターミナルにフルディスクアクセスの権限を与えます。
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);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
- 投稿日:2021-02-20T13:37:52+09:00
Finderで開いてるディレクトリへcdするコマンド
Finderで開いてるディレクトリへ
cd
するコマンドを作ります。~/.zshrccdf() { 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 -lFinderで
cd
したいディレクトリを開いておきます。$ cdf移動できればokです。
$ fカレントディレクトリをFinderで開くエイリアスを付けておくと便利です。
参考
- 投稿日:2021-02-20T01:31:36+09:00
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/
ダウンロード後はアプリケーション
フォルダに移動すると扱いやすいかもしれません。
左側のバーの上から4番目にあるこのアイコンをクリックして.vrmファイルを選ぶか、VRoid Hubにアクセスしてください。VRoidHubから抽出する場合
ブラウザを起動する
を選択するとサイトが立ち上がるので待ってください。表示された認可コードをブラウザからコピーして3teneのテキストフィールドにペーストします。アクセス権については自作したものなら同意で大丈夫だと思います。ファイルから選ぶ場合
+
のアイコンをクリックして先ほど保存した.vrmの拡張子のファイルを選択して開きます。
このアイコンでリップシンクをオンにします。手持ちのMacBookAirだとここをオンにすると落ちてしまうのですが、改善策があれば教えてください。
(追記:MacBookAirで外部ウェブカメラだと使える場合もあるそうです。再インストールも試してみてください。)
MacBookProだと問題なく使えました。
リップシンク種類は顔認識
がデフォだと思いますが、もし違ったらここで変えておいてください。
デフォルトの状態だと反転してしまっていると思うので、顔のフェイストラッキング(全般)
で映り方
をシンクロ
から鏡
に変更しておいてください。
リップシンクとフェイストラッキングをオンにした後は、変な方向を向いていると思うので、必ずこのボタンを押してください。
この後他の画面と重ねてモデルを使うのでこのアイコンで背景を緑にしておいてください。
背景変更->色指定->緑モデルの設定はこれで完成です。
3. 仮想カメラに出力する
今回使用するOBS Studioはこちらのサイトでインストールしてください。
https://obsproject.com/OBSの設定です。OBSを起動するとポップアップウィンドウで配信か否か聞かれますが、閉じてしまって大丈夫です。
ソースのところを右クリックして
ウィンドウキャプチャ
を選択します。
新規作成
を選択し、空の名前でウィンドウを表示
にチェックを入れて
3teneFREE_beta
ウィンドウを選択します。ここで画面収録をセキュリティに求められるので、macのシステム環境設定
->セキュリティーとプライバシー
->プライバシー
->画面収録
->OBSにチェック
です。鍵を外して設定変更し、OBSを再起動します。次に、同じように
ウィンドウキャプチャ
を選択し、モデルと重ねたい画面を選びます。ここで選びたいウィンドウが出てこない場合は、該当ウィンドウが最大化・最小化されていないか確認してください。選択ウィンドウが表示されたら、同じ手順で3teneのウィンドウを選択します。
ウィンドウのトリミングはoption
+ドラッグでできます。
トリミングしたモデルのレイヤーを右クリックして、フィルタ
を選択します。
下から二番目です。
エフェクトフィルタ
のクロマキー
を選択すると、人物だけ抽出されます。zoomを始める前に、
仮想カメラ開始
を選択します。
26.1より前のバージョンだと、仮想カメラを別でインストールする必要がありましたが、現在(2021年1月)のバージョンだとこのボタン一つで仮想カメラが作動します。必ずzoomに入る前に行ってください。入った後だとこの仮想カメラが認識されない可能性があります。zoomに入ったら
カメラを選択
で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!の設定は
上のOption
を選択し
Audio Settings...
を選択します。
OutputにSoundflower(2ch)
を選択して、Inputはお手持ちのマイクか内臓マイクを選択してください。次にLadioCastを起動して
このように設定します。
zoomはマイクの設定をSoundflower(64ch)
にして完成です。
この場合、LadioCastで出力した先をマイクにするのがコツです。以上で終わりです。
ここまで読んでくれてありがとうございました。5. 参照
https://game.sukecom.net/vroid-obs/#i
https://silverbirder180.hatenablog.com/entry/2020/03/08/175607VRoidモデル作成に関して
VRoidのショートカット
WEARVIRTUAL2forVRoid(このサイトで服がDLできてすごい!)
- 投稿日:2021-02-20T00:14:41+09:00
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.dylib
とlibfbxsdk.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を使うことも考えましたが、絶対にできると信じて検索をしまくりました。
バージョンが違ったり状況が違ったりすると上記の方法ではできない可能性があるので、あくまで参考程度に考えてくださいね。久々にコンパイルやリンク、静的ライブラリ動的ライブラリに触れたので正直どうして何があってできたのかが分かってないです。申し訳ありません。これからじっくり学んでいきます。