ROS2をMacbookにインストールする( macOS Catalina)けど大量のエラー : Library not loaded: /usr/local/opt/poco/lib/libPocoFoundation

いつもはUbuntuだけど、macでもROS2にもインストールできるそうなんで、手持ちのMacbookAirにインストールしてみる。

公式ドキュメント
https://index.ros.org/doc/ros2/Installation/Dashing/OSX-Install-Binary/

まずはbrewで必要な物をインストール

brew install asio tinyxml2
brew install tinyxml eigen pcre poco
brew install opencv
brew install openssl
echo "export OPENSSL_ROOT_DIR=$(brew --prefix openssl)" >> ~/.bashrc
brew install qt freetype assimp
brew install log4cxx
brew install cunit
brew install pyqt5
ln -s /usr/local/share/sip/Qt5 /usr/local/share/sip/PyQt5
brew install graphviz

次にPythonのモジュールを入れる。
virtualEnvでROS2用に環境を作る。

mba:pyenv dp$ virtualenv ros@3.7.0
mba:pyenv dp$ source ros\@3.7.0/bin/activate
(ros@3.7.0) mba:pyenv dp$ pip install pygraphviz pydot lxml catkin_pkg empy lark-parser pyparsing pyyaml setuptools argcomplete

Macの場合、SIP(System Integrity Protection)の無効化をしないと親子プロセスで変数の継承ができないらしいので、OFFにしようと思ったら

$ csrutil status
System Integrity Protection status: disabled.

SIPがdisabledになってる。
Macのログイン画面の背景変更の時かな?
OFFだったので、スルーする。

ROS2のダウンロード
https://github.com/ros2/ros2/releases

mba:pyenv dp$ mkdir -p ~/ros2_crystal
mba:pyenv dp$ cd ~/ros2_crystal
mba:pyenv dp$ wget https://github.com/ros2/ros2/releases/download/release-dashing-20191018/ros2-dashing-20191018-macos-amd64.tar.bz2
mba:pyenv dp$ tar xf ros2-dashing-20191018-macos-amd64.tar.bz2 
mba:pyenv dp$ . ~/ros2_crystal/ros2-osx/setup.bash

ROS2インストール完了したはずなので
デモを起動したら、エラー。。。

mba:pyenv dp$ ros2 run mba:pyenv dp$ demo_nodes_cpp talker

Failed to load entry point 'delete': dlopen(/Users/dp/ros2_crystal/ros2-osx/lib/python3.7/site-packages/rclpy/_rclpy.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/tinyxml2/lib/libtinyxml2.7.dylib
  Referenced from: /Users/dp/ros2_crystal/ros2-osx/lib/libbuiltin_interfaces__rosidl_typesupport_fastrtps_c.dylib
  Reason: image not found
The C extension '/Users/dp/ros2_crystal/ros2-osx/lib/python3.7/site-packages/rclpy/_rclpy.cpython-37m-darwin.so' failed to be imported while being present on the system. Please refer to 'https://index.ros.org/doc/ros2/Troubleshooting/#import-failing-even-with-library-present-on-the-system' for possible solutions
Failed to load entry point 'info': dlopen(/Users/dp/ros2_crystal/ros2-osx/lib/python3.7/site-packages/rosbag2_transport/_rosbag2_transport_py.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/poco/lib/libPocoFoundation.63.dylib
  Referenced from: /Users/dp/ros2_crystal/ros2-osx/lib/python3.7/site-packages/rosbag2_transport/_rosbag2_transport_py.cpython-37m-darwin.so
  Reason: image not found
The C extension '/Users/dp/ros2_crystal/ros2-osx/lib/python3.7/site-packages/rclpy/_rclpy.cpython-37m-darwin.so' failed to be imported while being present on the system. Please refer to 'https://index.ros.org/doc/ros2/Troubleshooting/#import-failing-even-with-library-present-on-the-system' for possible solutions
dyld: Library not loaded: /usr/local/opt/poco/lib/libPocoFoundation.63.dylib
  Referenced from: /Users/dp/ros2_crystal/ros2-osx/lib/librosidl_typesupport_c.dylib
  Reason: image not found

調べてみたらlibtinyxml2のバージョンに問題があるみたい。
Homebewでインストール済みのバージョンはtinyxml2(7.1.0)だけど7系は動かないとのこと
「ROS 2 fails to build against tinyxml2 7.0.0 #671」
https://github.com/ros2/ros2/issues/671
Homebewでインストール済みのtinyxml2をダウングレード
https://github.com/ros2/ros2/issues/625

brew unlink tinyxml2
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/da9a96f093a57eb8ac7c9470c1ec04fd1823a37a/Formula/tinyxml2.rb
brew switch tinyxml2 6.2.0

またdylibが見つからないのはlinkを作成

$ ll /usr/local/opt/poco/lib/libPocoFoundatio*
-rw-r--r--  1 dp  staff  1701096 12 19 23:12 /usr/local/opt/poco/lib/libPocoFoundation.64.dylib
lrwxr-xr-x  1 dp  staff       26  9 18 17:03 /usr/local/opt/poco/lib/libPocoFoundation.dylib -> libPocoFoundation.64.dylib
ln -s libPocoFoundation.dylib libPocoFoundation.63.dylib
$ ll /usr/local/opt/tinyxml2/lib/libtinyxm*
lrwxr-xr-x  1 yuta  staff     23  4  6  2018 /usr/local/opt/tinyxml2/lib/libtinyxml2.6.dylib -> libtinyxml2.6.2.0.dylib
lrwxr-xr-x  1 yuta  staff     19  4  6  2018 /usr/local/opt/tinyxml2/lib/libtinyxml2.dylib -> libtinyxml2.6.dylib
$ cd /usr/local/opt/tinyxml2/lib/
$ ln -s libtinyxml2.6.2.0.dylib libtinyxml2.7.dylib

console_bridgeのインストールを忘れてた。

brew install console_bridge

これで対応できたと思ったけどpipモジュールが見つからないエラーが大量。。

(ros@3.7.0) mba:lib dp$ ros2 -help
Failed to load entry point 'test': No module named 'yaml'
Failed to load entry point 'launch': No module named 'yaml'
Failed to load entry point 'send_goal': No module named 'yaml'
Failed to load entry point 'list': No module named 'yaml'
Failed to load entry point 'load': No module named 'yaml'
Failed to load entry point 'standalone': No module named 'yaml'

これはpyenv使ってインストールした関係なので、パスを設定してからsetup.shを実行してOK

export PYTHONPATH=~/pyenv/ros\@3.7.0/lib/python3.7/site-packages/
$ which python
/Users/dp/pyenv/ros@3.7.0/bin/python
$. ~/ros/dashing/setup.bash

まだ自分マックはbashを使ってる。
間違えてsetup.shを実行したらエラーがでてしばらく悩んでしまった。

export PYTHONPATH=~/pyenv/ros\@3.7.0/lib/python3.7/site-packages/
$. ~/ros/dashing/setup.sh
The build time path "/Users/osrf/jenkins-agent/workspace/packaging_osx/ws/install" doesn't exist. Either source a script for a different shell or set the environment variable "COLCON_CURRENT_PREFIX" explicitly.

AmazonLinux2でLet’s Encryptがエラー – Sorry, I don’t know how to bootstrap Certbot on your operating system!

久しぶりにAmazonLinux2に触ったら
Let’s Encryptのインストール後、certbot-auto実行でエラーが発生

[ec2-user@ip-99-99-99-99 certbot]$ sudo ./certbot-auto
Sorry, I don't know how to bootstrap Certbot on your operating system!

You will need to install OS dependencies, configure virtualenv, and run pip install manually.
Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisites
for more info.

certbot-autoを開くと、Amazon Linuxの判定があるけどこれを修正する必要があるらしい。

elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

確かに、判定できない。。

[ec2-user@ip-99-99-99-99 certbot]$ grep -iq "Amazon Linux" /etc/issue
[ec2-user@ip-99-99-99-99 certbot]$
[ec2-user@ip-99-99-99-99 certbot]$ cat /etc/issue
\S
Kernel \r on an \m

[ec2-user@ip-99-99-99-99 certbot]$

これに書き換える。

elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"

参考-> Amazon Linux 2でLet’s Encryptが使えない

Docker – Jenkinsの公式イメージでsudoが出来ない

Jenkinsのプラグインをテストするために公式イメージをとりあえず動かす。

mac #docker pull jenkins/jenkins:lts
mac #docker run -d -p 8080:8080 -p 50000:50000 -v ~/Desktop/jenkins_docker_data:/var/jenkins_home --name jenkins --restart=always jenkins/jenkins:lts

printするだけのmavenプロジェクトをgithubから取得してビルドさせるとエラーが発生

Caused: java.io.IOException: Cannot run program "mvn" (in directory

インストールしようとすると、sudoが出来ない。
というか見つからない。

mac #docker exec -it jenkins bash
jenkins@7da8a1d859bd:/$ sudo
bash: sudo: command not found
jenkins@7da8a1d859bd:/$ which sudo
jenkins@7da8a1d859bd:/$

sudoではなく、ログイン時に指定するといいらしい。

mac #docker exec -it -u root コンテナのID(docker psで見る)  /bin/bash
root@7da8a1d859bd:/# id uid=0(root) gid=0(root) groups=0(root) root@7da8a1d859bd:/#

macでAndroidStudioがアップデート後に起動しない( pleiades.jar 消しちゃった)

docからAndroidStuidoを起動しても、起動しないけど、下記を直接起動してみるとエラーが表示される。

mac:~ dp$/Applications/Android\ Studio.app/Contents/MacOS/studio
Error opening zip file or JAR manifest missing : /Users/dp/Library/Preferences/AndroidStudio3.3/jp.sourceforge.mergedoc.pleiades/pleiades.jar

更新の時に読み込んでない設定ディレクトリだと思って削除した方にPleiadesのjarが入っていたようなので、pleiadesのプラグインをもう一度インストールすれば起動した。

https://mergedoc.osdn.jp/#pleiades.html#PLUGIN

2019-10-28 08:05:21.209 studio[6644:252431] Value of STUDIO_VM_OPTIONS is (null)
2019-10-28 08:05:21.209 studio[6644:252431] Processing VMOptions file at /Applications/Android Studio.app/Contents/bin/studio.vmoptions
2019-10-28 08:05:21.210 studio[6644:252431] Done
2019-10-28 08:05:21.210 studio[6644:252431] Processing VMOptions file at /Users/dp/Library/Preferences/AndroidStudio3.5/studio.vmoptions
2019-10-28 08:05:21.210 studio[6644:252431] Done
2019-10-28 08:05:21.210 studio[6644:252431] Processing VMOptions file at 
2019-10-28 08:05:21.212 studio[6644:252431] No content found
Error opening zip file or JAR manifest missing : /Users/dp/Library/Preferences/AndroidStudio3.3/jp.sourceforge.mergedoc.pleiades/pleiades.jar
Error occurred during initialization of VM
agent library failed to init: instrument
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
Deleting expired sessions...4 completed.

[プロセスが完了しました]

aws chaliceでpynamodb(dynamodb)を利用する際のIAM policy

chaliceはboto3で使っているメソッドから必要なIAMを自動的に付与(更新しないもできる)する機能を持ってるので、boto3でdynamodbを使ったりすれば、自動で付与されるけど、pynamodbを使った場合はそこまでは面倒見てくれないので、boto3でdynamoを利用せず、pynamodbのモデルしか用意してないと、こんな感じでdynamodbへのポリシーは無視される。

$ chalice gen-policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "275e6aad3b0a4356ac3b9ab90fbe2422"
    }
  ]
}

なので、手動で管理する必要があるけど、Identity and Access Management (IAM)から編集するのはchalice使う意味なくなるので、.chalice/policy.jsonを利用する。

手動で変更してもいいけど、ミスってもいやなので、適当に下記のapp.pyにboto3でdynamoを操作する記述を追加

dynamodb.get_item(TableName="nanndemoiiyo")
dynamodb.put_item(TableName="nanndemoiiyo")
table = dynamodb.create_table(...

この状態でポリシーを見るとDynamodbのポリシーが入るので、jsonとして保存

$ chalice gen-policy > .chalice/policy.json
$ cat .chalice/policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cognito-idp:AdminCreateUser",
        "cognito-idp:AdminInitiateAuth",
        "cognito-idp:AdminRespondToAuthChallenge"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "c5c6757d1033420fa4ba529b67bd333d"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:CreateTable",
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "5a2f50fb91a34608b571409e5291041b"
    }
  ]
}

環境によってサフィックスが必要
今回は「.chalice/policy.json」から「.chalice/policy-dev.json」に変更してデプロイ時は「–no-autogen-policy」をつければOK

cloudformationでCognitoのUserPool作成でエラー

CloudFormationでCognitoのUserPoolを作成しようとしてエラーが出てしまった

aws cloudformation deploy --template-file userPool.yml --stack-name CognitoUserPool-test --capabilities CAPABILITY_IAM  --profile dev-southeast

Waiting for changeset to be created..
Waiting for stack create/update to complete

Failed to create/update the stack. Run the following command
to fetch the list of events leading up to the failure
aws cloudformation describe-stack-events --stack-name CognitoUserPool-test
 {
            "StackId": "arn:aws:cloudformation:ap-southeast-2:00000894962:stack/CognitoUserPool-test/f6e05000-0000-11e9-ba1c-0664273e8e22",
            "EventId": "CognitoUserPool-CREATE_FAILED-2019-08-15T07:26:25.833Z",
            "StackName": "CognitoUserPool-test",
            "LogicalResourceId": "CognitoUserPool",
            "PhysicalResourceId": "",
            "ResourceType": "AWS::Cognito::UserPool",
            "Timestamp": "2019-08-15T07:26:25.833Z",
            "ResourceStatus": "CREATE_FAILED",
            "ResourceStatusReason": "Property validation failure: [Encountered unsupported properties in {/Schema/0}: [Required\"]]",
            "ResourceProperties":
Schema:
   - Name: "name"
   AttributeDataType: String
   Mutable: true
   Required": true

誤字なだけ。。作成できました。

AWS – Cognitoでemailを変更した場合、認証してなくても古いメアドはログインできない

Cogitoを使った認証でユーザが登録後に、メアドを変更する際に
入力ミスで違うメアド入れちゃったけど、アプリからはログアウトしちゃった
という状況はどうなるのか?

javascriptでテストしてみる。

まずユーザを登録する。

var attributeList = [];
attributeList.push(new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute({
	Name: 'name',
	Value: $('#name').val()
}));
attributeList.push(new AWSCognito.CognitoIdentityServiceProvider.CognitoUserAttribute({
	Name: 'email',
	Value: $('#email').val()
}));
userPool.signUp($('#email').val(), $('#password').val(), attributeList, null, function(err, result) {
	if (err) {
		console.log(err);
		return;
	}
	cognitoUser = result.user;
	console.log('Username:' + cognitoUser.getUsername());
});

登録後、認証コードが送られてくるので、認証コードを登録してメールアドレスを認証済みにする。


Cognitoで見ると、メールアドレスは認証済みになっているので
そのユーザでログインして、メールアドレスの変更を行う。


認証コードが新しいメールアドレスに送信されるが
それを認証せずに、古い情報でログインしようとすると


認証エラーが発生してログインできない。

Cognito上ではメアドは変更されていて、認証済みが取り消されている。
これに対応するにはdynamoで管理するか、cognitoに追加の属性を持たせて、認証や変更トリガーでmail属性を認証後にアップデートするようにしました。

GoogleのGoogleDrive乗っ取られた?エロ画像を置かれた

GoogleDriveは使ってないんですが
たまたまGmailのメールから添付Drive経由で開いて、削除しようと一覧を開いたらエロ画像が置かれていて、x****@gmail.comと共有になっていて、半年以上前からになっていて、Googleに削除されなかったのが救い。。

何かアプリをインストールした時なのか、わからないけどドライブへの許可をしてたみたいで、API経由でアップロードなのかシェアされていたみたい。

使わないつもりのサービスでもたまにチェックしないと、不意にアカウント停止の対象になるかもしれない。

GADInvalidInitializationException-GoogleMobileAdsアップデートしたら動かなくなった

GADInvalidInitializationExceptionが発生

GoogleMobileAdsをアップデートしたら、iOSアプリがクラッシュするようになってしまった。


2019-03-29 17:20:39.153251+0900 test.app[9165:102709] *** Terminating app due to uncaught exception 'GADInvalidInitializationException', reason: 'The Google Mobile Ads SDK was initialized incorrectly. Google AdMob publishers should follow instructions here: https://googlemobileadssdk.page.link/admob-ios-update-plist to include the AppMeasurement framework, set the -ObjC linker flag, and set GADApplicationIdentifier with a valid App ID. Google Ad Manager publishers should follow instructions here: https://googlemobileadssdk.page.link/ad-manager-ios-update-plist'
*** First throw call stack:

GADInvalidInitializationExceptionの原因

いままでAppDelegateでGADMobileAds.configure( APPID )してましたがこれがとうとうダメになったようです。

‘configure(withApplicationID:)’ is deprecated: Use [GADMobileAds.sharedInstance startWithCompletionHandler:]


 GADMobileAds.configure(withApplicationID: 

今後はInfo.plistにGADApplicationIdentifierを追加するらしいです。


GADApplicationIdentifier
ca-app-pub-123~????????

Androidはちょっと前からmanifest.xmlに追加が必要になっていたので同じ感じ。
Googleが解析しやすいようにするのかな?

carthageでpkluz/PKHUDがBuild Failed – バージョン指定を間違えてビルドエラー


$ cat Cartfile
github "pkluz/PKHUD" ~> 4.0

$ carthage update --platform iOS PKHUD
*** Building scheme "PKHUD" in PKHUD.xcodeproj
Build Failed
	Task failed with exit code 65:
	/usr/bin/xcrun xcodebuild -project /Users/dp/dev/Xcode/test.app/Carthage/Checkouts/PKHUD/PKHUD.xcodeproj -scheme PKHUD -configuration Release -derivedDataPath /Users/dp/Library/Caches/org.carthage.CarthageKit/DerivedData/10.2_10E125/PKHUD/4.2.3 -sdk iphoneos ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES archive -archivePath /var/folders/bv/0637g83s7bz_l040pkghmt380000gn/T/PKHUD SKIP_INSTALL=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=NO CLANG_ENABLE_CODE_COVERAGE=NO STRIP_INSTALLED_PRODUCT=NO (launched in /Users/dp/dev/Xcode/test.app/Carthage/Checkouts/PKHUD)

This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/bv/0637g83s7bz_l040pkghmt380000gn/T/carthage-xcodebuild.15y1aS.log

Build Failed , Task failed with exit code 65

ログを確認します。


cat /var/folders/bv/0637g83s7bz_l040pkghmt380000gn/T/carthage-xcodebuild.15y1aS.log

note: Planning build
note: Constructing build description
Build system information
error: SWIFT_VERSION '3.0' is unsupported, supported versions are: 4.0, 4.2, 5.0. (in target 'PKHUD')

Build system information
error: SWIFT_VERSION '3.0' is unsupported, supported versions are: 4.0, 4.2, 5.0. (in target 'PKHUD')

** ARCHIVE FAILED **

バージョン指定間違ってた。。


$ cat Cartfile
- github "pkluz/PKHUD" ~> 4.0
+ github "pkluz/PKHUD" ~> 5.0

https://github.com/pkluz/PKHUD