日々精進

新しく学んだことを書き留めていきます

npm installは新しいパッケージをインストールする時以外は使わない方が良い

IT

npm installを実行すると、package-locl.jsonが更新されることがある。 そのため、パッケージのバージョンが知らない間に変わっていて画面が崩れるという不具合が起きてしまった。 普段はnpm ciでパッケージをインストールし、パッケージのバージョンアップ…

機械学習モデルの予測結果を説明する方法

AI

最近、機械学習モデルの予測結果を説明する手法が話題になっているので いくつか調べてみた。 Azureには予測結果を説明する機能がある。テーブルデータを説明する場合はSHAPを使うのが一般的っぽい。 SHAPの実行結果をどうグラフに表示するかは参考になりそ…

hackingでpythonのLintをすると誤ってwarningになる箇所がある

AI

2つのエラーが誤って検出された。 E701 multiple statements on one line (colon) は古いバージョンのpycodestyleに不具合があり、誤って検出されるっぽい。flake8/hackingは内部的にpycodestyleを使っている。 stackoverflow.com 以下を見ると既に修正版が…

apache http clientには3つのタイムアウト時間を設定出来る。

IT

3つのタイムアウトは以下。 connectionRequestTimeout コネクションプールからコネクションを取得するまでのTimeout時間 connectTimeout TCPコネクションがestablishedになるまでのTimeout秒数 socketTimeout データを相手に送信してからレスポンスが返って…

サーバからHTTPSリクエストを送ったら15分後にタイムアウトする

IT

15分という数字を設定した覚えがなかったので謎だったけど、Linuxのデフォルト設定だと15分ぐらいでTimeoutになるっぽい。 詳細は以下を見て欲しいが、Exponential Backoffを15回繰り返すと合計926秒になる。Linuxのデフォルト設定では15回リトライするので9…

Redisでは有効期限が切れたデータもしばらく削除されない

IT

Redisは以下のルールで有効期限が切れたデータを削除しているらしい。 有効期限が切れたデータにアクセスするリクエストがきたら、そのタイミングで削除する。 10秒おきに20エントリをランダムの調べて、有効期限が切れていたら削除する。有効期限切れの割合…

GPU使用率をwatchする

AI

nvidia-smi -l で定期的にwatchできる。他にも色々オプションがあるけど基本使うのは-lだなぁ。 参考: qiita.com

tensorflowでの学習がhangする

AI

この現象はGPUが複数ある環境でのみ発生する。 学習が終わるタイミングで処理が止まってしまい、プロセスも終了することなく残る。 原因はtensorflowのバグっぽい。Issueでも似た現象が報告されているが、解決していない。(ちょっと違う現象なので別原因か…

boto3でS3のget_bucket_locationがNoneを返す

IT

原因はus-east-1リージョンはロケーションの制約がないため。get_bucket_locationはbucketのリージョンを返すと思っていたけど、 以下資料の「ロケーションの制約」を返すっぽい。 AWS サービスエンドポイント - AWS 全般のリファレンス なのでap-northeast-…

EBSのサイズを変更する

IT

まずAWSコンソールからEBSの容量を変更する。手順は以下参照。 dev.classmethod.jp 次に、EC2にsshでログインして以下のコマンドを実行する。 lsblk # パーティション容量の確認 sudo growpart /dev/nvme0n1 1 # パーティションの拡張 lsblk # パーティショ…

Pythonで「ImportError: cannot import name」エラー

IT

原因はimportが循環参照になっていること。 つまりA.pyからB.pyをimportし、逆にB.pyからA.pyもimportしていると発生する。 importをメソッド内にうつし、local importにすると解消する。 ほんとは循環参照をやめた方が良いんだろうな。。 参考: qiita.com

YAMLとJSONの使い分け方

IT

YAMLは可読性が高く、コメントが書けるので設定ファイルなど人が読み書きするしプログラムも読むファイルに向いている JSONはより一般的なので、プログラム間のデータ連携に向いている 参考: stackoverflow.com

pythonでファイルを読み込むコードを簡単にする

IT

普通はwith open(path) as f: ...のように書くと思うけど、以下だとone linerでかける。 from pathlib import Path contents = Path(file_path).read_text() 細かいけどちょっと嬉しい。 参考: stackoverflow.com

python標準のファイル操作APIでなく、tf.gfileを使うメリット

IT

tf.gfileは普通のファイルシステムの他にHDFS等に対応しているのがメリット。 ファイルシステムだけしか使わないならメリットはない。 参考: stackoverflow.com

yamlを出力したときにインデントが足りないところがある

IT

dictに配列をネストさせたオブジェクトをyamlに出力すると以下のようになる。 dictionary: - A - B こうなってほしい。 dictionary: - A - B こうするためには、以下のようにする。 class FixIndentDumper(yaml.Dumper): def increase_indent(self, flow=Fal…

OrderedDictをyamlに出力する

IT

yaml.dump(ordered_dict)を実行するだけだと、Pythonのクラス名も出力されてしまうので以下のようにすると通常のyaml形式で出力される。 def represent_odict(dumper, instance): return dumper.represent_mapping('tag:yaml.org,2002:map', instance.items(…

YAMLとJSONの使い分け方

IT

YAMLはJSONより可読性が高く、コメントも書けるので設定ファイルはYAMLの方が適している。 JSONはデータフォーマットとしてより一般的なので、システム間でテキストで構造化データを受け渡す場合に使う。 JSONはコメントが書けないのがツライ。。 参考: sta…

TFRecordDatasetにS3のパスを渡すと「Encountered Unknown AWSError」が出る

AI

S3からデータを読み込む時に以下のログが出る。 2019-11-18 11:36:44.626135: W tensorflow/core/platform/s3/aws_logging.cc:57] Encountered Unknown AWSError InvalidRange The requested range is not satisfiable: 2019-11-18 11:36:44.626177: W tenso…

boto3でbucketのregionを取得する

IT

以下でできた。 s3: ServiceResource = boto3.resource('s3') bucket = s3.Bucket(bucket_name) bucket.meta.client.get_bucket_location(Bucket=self.bucket_name)['LocationConstraint'] 参考: stackoverflow.com

【OpenAPI3.0】readOnly属性を付けてもswagger codegenで生成したコードにsetterがある

IT

setterは生成しないのがあるべきと思ったが、生成される。。 Issueはあるけど2ヶ月以上放置されているので今後も直る可能性は低そう。 参考: github.com

yamlでNoneや指数形式が文字列になる

IT

none_item: None float_item: 1e-09 上記のようにyamlを定義してPyYamlで読み込むと。それぞれ'None', '1e-09'という文字列になってしまう。。 なので、以下のように修正した。 none_item: # None float_item: 0.000000009 もっといいやり方ないのかねぇ。。…

aws cliで「SignatureDoesNotMatch」「The request signature we calculated does not match the signature you provided. Check your key and signing method.」エラー

IT

原因は aws configure コマンドで設定したシークレットアクセスキーなどの情報が間違っていたため。 IAMロールで権限を与えていたのでそもそもaws configureは不要だった。なので、.awsフォルダを削除したら直った。 参考: qiita.com

S3上のデータを直接tensorflowから読み込んだ場合に「curl returned error code 77」「If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.」エラーが出る

IT

tensorflowのtf.data.TFRecordDatasetにS3に置いたTFRecordのパスを渡すと読み込んでくれるという機能がある。 github.com これを使うと curl returned error code 77 が出た。77はSSL証明書のエラーらしい。 curl.haxx.se 今回はEC2からのアクセスで、man i…

EC2からS3のデータをダウンロードする場合、AWS外のネットワークを経由する場合がある

IT

今までEC2-S3間の通信はAWS内のみ通ると思っていたけど、VPCエンドポイントがない場合、一度インターネットに出るらしい。 そうすると通信速度が落ちるしセキュリティ的にも問題になりうるので VPCエンドポイントは必ず作るようにしておかねば。。 参考: ht…

Pycharmでplt.show()を実行しても図が表示されない

AI

前はIDE上で図が見えたんだけど、なぜか何も表示されなくなった。。 import matplotlib matplotlib.use('TkAgg') をmatplotlibをimportする前に実行すると表示されるようになった。けど、別窓で表示されるのでちょっと不便。 参考: teratail.com

Pythonのre.matchは先頭一致

AI

他の言語では部分一致になることが多いと思うが。。 部分一致にしたい場合はre.searchを使う。 参考: note.nkmk.me

boto3のlist_objects_v2は最大1000オブジェクトまでしか取得出来ない

AI

1001以上取得したい場合はループを回す必要がある。例は以下。 def list_all_contents(self, prefix: str = ''): next_token = '' base_kwargs = { 'Bucket': self.bucket_name, 'Prefix': prefix, } all_contents: List[dict] = [] while next_token is not…

pythonでメソッドの実引数に**を付けるとdictを展開してくれる

AI

これ知らなかった。。コードを見た方がわかりやすいと思う。例は以下。 >>> def parrot(voltage, state='a stiff', action='voom'): ... print("-- This parrot wouldn't", action, end=' ') ... print("if you put", voltage, "volts through it.", end=' '…

AWS CLIを使ってS3からファイルをダウンロードすると途中から速度が落ちる

IT

現象は以下。 インスタンスタイプはg4dn.xlarge 同じリージョンのS3バケットからEBS gp2にダウンロードする aws s3 cpコマンドで実行 このとき、 最初:210MB/s⇒5GBぐらいから速度が下がり始める⇒10GBを越える頃には150MB/sぐらい のように速度が変化する。 …

特定のVPCからの通信のみ権限を与えるポリシー

IT

以下のようにVPCエンドポイント指定で権限を付けられる。 { "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Access-to-specific-VPCE-only", "Principal": "*", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:a…