pythonのMagicMockにname属性を設定する
PythonのMagicMockは、とても便利なのですがコンストラクタでname属性が指定できません。
>>> a = MagicMock(**{'id': 1, 'name': 'namae'})
>>> a.name
<MagicMock name='namae.name' id='2456793495584'>
>>>
Mock の名前と name 属性のようにMagicMockの仕様なのでMockを作成してからname属性を設定するしかありません。
下記のような関数で、思ったようなコードをかけるようになります。
# https://docs.python.org/ja/3/library/unittest.mock.html#mock-names-and-the-name-attribute def mkmock(attr, name=None): attr_name = None if 'name' in attr: attr_name = attr['name'] del attr['name'] if name != None: attr['name'] = name mock = MagicMock(**attr) if attr_name != None: mock.name = attr_name return mock
こんな感じで書けます。
>>> m = mkmock({'id': 1, 'name': 'python'})
>>> m.name
'python'
>>> m = mkmock(name='mock_name', attr={'id': 1, 'name': 'python'})
>>> m
<MagicMock name='mock_name' id='2456793527728'>
>>> m.name
'python'
>>>
Mac版VSCodeでPythonの開発環境がつらい
Mac版VSCodeでPython環境を作ろうとしましたが、断念しました。
gitを認識しない
ターミナルでは、問題なくつかてているgitをVSCodeが認識しませんでした。
ソース管理の画面を開くと「有効なソース管理プロバイダはありません。」と表示されます。
結局、ターミナルでgit init .したディレクトリでcode .コマンドでVSCodeを開くと、なぜか使えるようになる不思議な動きで解決しました。
もはや、原因はわかりませんが、やったことは下記の通り。
- 拡張機能で@builtin gitが有効化されていることを確認
Code-基本設定-設定のユーザ設定に"git.path": "/usr/bin/git"を追加
codeコマンドを使えるようにするためにコントロールパレットでshell command: install `code` commandを選択しました。
原因は、全くわかっていませんが、ターミナルで、
gti init sample cd sample code .
とやって認識するようにはなりました。
pythonを認識しない
Macのpythonはデフォルトでは、python2です。 brewでpython3.7をインストール済みでした。
VSCodeでpythonのプロジェクトを開くとpythonの拡張機能をインストールするか聞かれるので、インストールします。
コントロールパレットでpythonのインタープリタを選択すると、なぜか、開いたプロジェクトしか選択できず、/usr/local/bin/python3を指定しても反応なし...
ワークスペースからプロジェクトを削除して、VSCodeを再起動したところpythonインタープリタに/usr/local/bin/python3が指定できました...
原因がわからない、なぞ設定でVSCodeを全く信用できなくなってきました。
poetryとの親和性がとても悪い
pythonのプログラムは、poetryで環境や依存ライブラリの管理をしていました。
コントロールパレットでpython: すべての単体テストを実行とやるとテストフレームワークがないから拡張機能をインストールするか聞かれます...
インストールすると、python3のpipコマンドがpip3なのでpython2のpipを使って何かをインストールしようとして失敗...
それならば、ターミナルからvenvでpython3環境を作ってVSCodeを起動すればと、考えましたが、なぜかcodeコマンドが使えない。 activateしたときのパスの問題かと思いきや/usr/local/bin/codeにシンボリックリンクされているcodeコマンドがなくなっている...
どうやら、VSCodeでcodeコマンドを有効にすると、/usr/local/bin/code -> /private/var/folders/rt/25m7j4r14bd7g80qdrfrpdl00000gn/T/AppTranslocation/<なにかのID>/d/Visual Studio Code.app/Contents/Resources/app/bin/codeにシンボリックリンクを貼るようですが、VSCodeを終了・起動すると<なにかのID>は、別物になってしまうような...
もう無理...
VSCodeのpoetry拡張機能はないようなので、このうえ、VSCodeとpoetryの二重管理で余計な混乱が増えるのは目に見えている...
Mavenのオフシャルコンテナを使ってmvnコマンドをすぐ使えるようにする
Mavenは、DockerHubでオフシャルコンテナを公開しています。
このコンテナを使って、LinuxのDocker環境で、いつでもmvnを実行できるようにしました。
下記のようなシェルを$HOME/bin/mvnに準備して事項権限をつけます。
$ cat ~/bin/mvn
#! /bin/bash
docker run -it --rm \
-u $(id -u):$(id -g) \
-v $HOME/.m2:/var/maven/.m2 \
-v "$(pwd)":/usr/src/mymaven \
-e MAVEN_CONFIG=/var/maven/.m2 \
-w /usr/src/mymaven \
maven:3.6.3-jdk-11-openj9 \
mvn -Duser.home=/var/maven $*
$ chmod +x ~/bin/mvn
あとは、普通にmvnコマンドを実行するだけです。
JDKやmavenのインストールは不要です。
初回は、下記のようにコンテナをダウンロードします。
$ mvn -v Unable to find image 'maven:3.6.3-jdk-11-openj9' locally 3.6.3-jdk-11-openj9: Pulling from library/maven a1125296b23d: Already exists 3c742a4a0f38: Already exists 4c5ea3b32996: Already exists 1b4be91ead68: Already exists 262049cebf1b: Pull complete 5ad2d62fe9e8: Pull complete ff29c42fd76a: Pull complete dbb173a54a45: Pull complete eef609065721: Pull complete Digest: sha256:4d35cebbd4eb96206e83391b08f1a92f25464eed1c558bec624a44bbc269feba Status: Downloaded newer image for maven:3.6.3-jdk-11-openj9 Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /usr/share/maven Java version: 11.0.8, vendor: AdoptOpenJDK, runtime: /opt/java/openjdk Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "4.19.76-linuxkit", arch: "amd64", family: "unix" $ type java -bash: type: java: 見つかりませ $
terraformで特定のリソースのみ操作する
terraformで作成したリソース一式のうち特定のリソースのみplan/apply/destroyしたいときに使えます。
terraform plan -target=リソース名
例えば、ec2-instanceモジュールで複数のEC2を作った場合、2番目のインスタンスだけplan実行は、次のようにします。
terraform plan -target=module.ec2.aws_instance.this[1]
AWS CloudTrailの活用
AWSは、デフォルトで90日分のログがCloudTrailに取得されています。
誰が、いつ、どのような操作を行ったかを調べることができます。
下記は、直近100イベントのイベント名を集計するコマンドです。
$ aws cloudtrail lookup-events --max-items 500 --query 'Events[].EventName' | sort | uniq -c | sort -r
253 "AssumeRole",
225 "DescribeInstances",
21 "SendCommand",
1 ]
1 [
1 "DescribeInstances"
時間帯やユーザ、リソースといった観点でフィルタして必要な情報を検索できます。
サーバ証明書を取得する方法
自己署名を使っていたりProxy環境の場合、HTTPSのアクセスでSSL certificate problem: self signed certificate in certificate chainという感じのエラーに遭遇することがあります。
サーバが既知のものであるとわかっている場合、下記のコマンドで証明書を入手して設定します。
SERVER=<サーバ名>
openssl s_client -connect $SERVER:${PORT:-443} -showcerts < /dev/null 2> /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $SERVER.pem
Windowsの場合のメモ
scoop install sed openssl
set SERVER=<サーバ名> set PORT=443 echo | openssl s_client -connect %SERVER%:%PORT% -showcerts | sed -ne "/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p" > %SERVER%.pem