ksaitoの日記

日々試したことの覚え書き

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の開発環境がつらい

MacVSCodePython環境を作ろうとしましたが、断念しました。

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を認識しない

Macpythonはデフォルトでは、python2です。 brewでpython3.7をインストール済みでした。

VSCodepythonのプロジェクトを開くと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の二重管理で余計な混乱が増えるのは目に見えている...

きっとWindows版のVSCodeでは問題ないのでしょう。

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コマンドを実行するだけです。
JDKmavenのインストールは不要です。
初回は、下記のようにコンテナをダウンロードします。

$ 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