vimspectorの使い方
vimでデバッグできるプラグイン、vimspectorの使い方。
細かい使い方はわかっていないが、とりあえず手元の環境(WSL2 / Python3.9)で動いたので備忘がてら記事にする。
インストール
vimspectorのインストール
READEME の通りでOK。
自分はvim-plugを使っているため、vimrcに以下の行を追加した。
Plug 'puremourning/vimspector'
gadgetsのインストール
デバッグしたい言語ごとに、デバッグ用のモジュール(gadgets)をインストールする。
Pythonの場合はdebugpy
を利用する。
vimspectorに以下の行を追加して、 :VimspectorInstall
を実行する。
let g:vimspector_install_gadgets = ['debugpy']
設定ファイル
vimspector.json
というファイルに設定を書き込む。
詳細はこちらを参照。
ファイルの場所
詳細はこちらを参照。
<vimspector home>/configurations/<os>/<filetype>/vimspector.json
が読み込まれる。
<vimspector home>
はg:vimspector_base_dir
という変数で設定できる。
linuxでpythonを実行する場合は以下の通り。
<vimspector home>/configurations/linux/python/vimspector.json
vimspector.json
実行したい環境によってjsonファイルを実装する。
以下はPythonの例。
{ "configurations": { "launch": { "adapter": "debugpy", "filetypes": [ "python" ], "breakpoints": { "exception": { "caught": "Y", "uncaught": "Y" } }, "configuration": { "name": "launch", "type": "python", "request": "launch", "python": "${HOME}/.pyenv/shims/python", "stopOnEntry": true, "console": "externalTerminal", "debugOptions": [], "program": "${file}" } } } }
参考
【解決済】AWS認定試験のPSIサービスのエラーと問い合わせ
背景
AWS認定試験では、テスト実施業者をPearson VUEとPSIのいずれかから選択できる。
普段はPearsonを使っているが、都合の良い日程が空いていなかったので、PSIを使ってみたところ、入金に際してエラーが発生した。
タイムライン
2021-11-27 エラー発生
PSIのサイトにて試験予約を行い、料金支払いする際にタイムアウトエラーが発生した。
試験はスケジュールされなかったが、クレジットカード会社の利用履歴上は料金を支払ったことになっていた。(バウチャーを使ったので半額になっている)
こちらのブログ を参考に、PSIの問い合わせページから日本語で事象の説明と返金の要求を行った。
(以降返信は来ていない)
2021-11-30 英語で再問い合わせ
2営業日経ってもメールの返信が来ないため、同じ内容のメールを英語で送信した。
(こちらも返信なし)
2021-12-02 Live Chatによる問い合わせ 1回目
英語での問い合わせも2営業日経って返信されないので、Live Chatによる問い合わせを行った。
通常は1時間程度で返金される、とだけ言われチャットを終了された。
返金されてないから問い合わせしたんだけど、、
クレジットカード会社側の処理に時間がかかっている可能性も否定できないため、1週間待ってみることにした。
2021-12-09 Live Chatによる問い合わせ 2回目
1週間待っても返金されず、クレジットカード会社に問い合わせてもキャンセル要求が発行されていないとのことだったので、
再度Live Chatで問い合わせた。
ネットワークの問題?で相手方からの回答が届かず、チャットを終了された。
2021-12-10 Live Chatによる問い合わせ 3回目
前日の内容を再度問い合わせた。前日と同じ人が応対してくれた。
テストがキャンセルされた履歴が残っていないとのこと。
AWS試験のCandidate IDを伝えたところ、追跡調査を行ってくれるとのことだった。
2021-12-27 Live Chatによる問い合わせ 4回目
追跡調査について特に連絡がなかったので、改めて問い合わせてみた。
調査状況について確認する権限が無いため、 aws.psisupport@psionline.com にメールをしてほしいとのこと。
2021-12-27 aws.psisupport へメール
言われた通りにメールを送ってみた。(日本語)
数時間後に自動返信でメールが返ってきた。24時間以内に担当者から返信するとのことだった。
2021-12-28 aws.psisupport からメール
日本語で返信が返ってきた。
AWS Candedate numberやクレジットカードの下4桁などを教えてほしいとのことだったので、
それらを伝えたところ、3-5営業日内にまた連絡すると返信された。
2022-01-08 aws.psisupport へメール
おそらく5営業日は過ぎたと思うが、連絡がなかったので催促してみた。
2022-01-10 aws.psisupport からメール
催促に対して返信があった。すぐに返金するとのことだった。
クレジットカードを見ると、実際に返金されていることを確認できた。
わかったこと
- メールは返ってこないが、Live Chatだとすぐに対応してくれる。
- Live Chatは担当者によって言っていることが違ったので、何度も問い合わせてみるのが良い。
その後
テストはPearsonで予約しなおし、無事合格しました。
返金について状況が変わったらこの記事も更新しようと思っています。
参考
Cloud Logging向け構造化ログ Python編
Cloud Loggingでは構造化ログがサポートされており、JSON形式のログを出力する事で構造化データとして読み取ってくれる。
構造化ログを出力すると、Cloud Loggingのクエリでのフィルタリングが簡単になるため、
GCP上で実行されるアプリケーションのログはCloud Loggingフレンドリーにしておきたい。
要件
- Cloud Loggingのログエントリ形式に合わせる
- 特にseverity, message, timestampを合わせると、Cloud Logging Viewer上の表示がいい感じになる
- 標準出力/標準エラー出力からログを出力する
- Cloud Logging API等を使うと、ローカル環境のテストがやりづらくなる。
- 任意のkey-valueを追加できる
- message だけでなく任意の変数を埋め込めると、ログ分析をする際に文字列パースをしなくて済む
実装
Python標準のLoggingモジュールに、Cloud Logging用のFormatterを設定する。
python-json-logger を使う事で、JSON形式のFormatterを簡単に作ることができる。
""" cloud logging logger """ from datetime import datetime from datetime import timezone import sys import logging from pythonjsonlogger import jsonlogger class CloudLoggingFormatter(jsonlogger.JsonFormatter): def parse(self): return ["name", "message", "stack_info"] def add_fields(self, log_record, record, message_dict): super().add_fields(log_record, record, message_dict) if not log_record.get("timestamp"): # RFC3339形式にフォーマットする log_record["time"] = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%S.%fZ") if log_record.get("level"): # Pythonのログレベルのアッパーケースを流用 log_record["severity"] = log_record["level"].upper() else: log_record["severity"] = record.levelname formatter = CloudLoggingFormatter() stream = logging.StreamHandler(stream=sys.stdout) stream.setFormatter(formatter) logger = logging.getLogger("app-name") logger.setLevel(logging.INFO) logger.addHandler(stream)
使い方
$ cat main.py from logger import logger logger.info("info log", extra={"extra-key1": "fuga", "extra-key2": "fuga"}) logger.error("error log", extra={"extra-key2": "fuga"}) $ python main.py | jq { "name": "app-name", "message": "info log", "stack_info": null, "extra-key1": "fuga", "extra-key2": "fuga", "time": "2020-12-28T13:54.096049Z", "severity": "INFO" } { "name": "app-name", "message": "error log", "stack_info": null, "extra-key2": "fuga", "time": "2020-12-28T13:54.096245Z", "severity": "ERROR" }
Cloud Logging Viewerだと以下のようになる。
severityに合わせて左側のアイコンが変化するため、見やすくなる。
参考
【Golang】GCP用のフォーマットでログ出力する - Qiita
Homebrewで+clipboardなvimをインストールする方法
linuxbrewでやってみました。
brewの設定情報を編集するエディタを指定する
$ export HOMEBREW_EDITOR=vim
vimの設定情報を編集する
$ brew edit vim
configureの引数に--enable-clipboard
を追加
system "./configure", "--prefix=#{HOMEBREW_PREFIX}", "--mandir=#{man}", "--enable-multibyte", "--with-tlib=ncurses", "--with-compiledby=Homebrew", "--enable-cscope", "--enable-terminal", "--enable-perlinterp", "--enable-rubyinterp", "--enable-python3interp", "--enable-gui=auto", # <- `no` から `auto` に変更 "--without-x", "--enable-luainterp", "--with-lua-prefix=#{Formula["lua"].opt_prefix}", "--enable-clipboard" # <- 行を追加
ビルドに必要なライブラリをインストール
$ sudo apt install -y liblua5.1-dev luajit libluajit-5.1 python-dev ruby-dev libperl-dev libncurses5-dev libatk1.0-dev libx11-dev libxpm-dev libxt-dev
ソースコードからビルドしてインストール
$ brew install vim --build-from-source
+clipboard
になっているか確認
$ vim --version | grep clipboard +clipboard +jumplist +popupwin +user_commands +ex_extra -mouse_jsbterm -sun_workshop +xterm_clipboard
参考
Pythonでgkeのクラスタ認証情報を取得する
Pythonでgkeのクラスタ認証情報を取得する
gcloud container clusters get-credentials
をPythonのGoogle Cloud SDKでやる方法
import base64 from tempfile import NamedTemporaryFile import google.auth import google.auth.transport.requests from google.cloud import container_v1 from kubernetes import client def create_k8s_client() -> client.Configuration: project_id = "your-project-name" zone = "us-central1-b" cluster_name = "your-cluster-name" container_client = container_v1.ClusterManagerClient() response = container_client.get_cluster( name=f"projects/{project_id}/locations/{zone}/clusters/{cluster_name}" ) creds, _ = google.auth.default() auth_req = google.auth.transport.requests.Request() creds.refresh(auth_req) configuration = client.Configuration() configuration.host = f"https://{response.endpoint}" with NamedTemporaryFile(delete=False) as ca_cert: ca_cert.write(base64.b64decode(response.master_auth.cluster_ca_certificate)) configuration.ssl_ca_cert = ca_cert.name configuration.api_key_prefix["authorization"] = "Bearer" configuration.api_key["authorization"] = creds.token return configuration if __name__ == "__main__": config = create_k8s_client() k8s_client = client.BatchV1Api( client.ApiClient(config) ) ret = k8s_client.list_job_for_all_namespaces()
参考
Client for Google Container Engine API — google-cloud-container documentation
WSL2でvimからクリップボードを利用する
忘れないようにメモ
クリップボードオプション付きvimをインストールする
vim --version | grep clipboard
して+clipboard
が出ない場合、
+clipboard
なvimをインストールする。
sudo apt purge vim sudo apt install vim-gtk
VcXsrv Windows X Serverをインストールする
- Extra settingsにて
Clipboard
,Disable access control
にチェックをつける Save configuration
ボタンから、設定を適当なフォルダに保存する- 起動時のオプションで設定ファイルを読み込む
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\VcXsrv\XLaunch
のプロパティを開く- リンク先を
"C:\Program Files\VcXsrv\xlaunch.exe" -ac -run C:\path\to\config.xlaunch
にする
Windows DefenderのFWでVcXsrvを許可する
WSL2に環境変数を設定する
export DISPLAY=$(grep -oP "(?<=nameserver ).+" /etc/resolv.conf):0.0
追記: 上記コマンドでは動かなくなってしまった。以下で動作することを確認 参考:
Can't use X-Server in WSL 2 · Issue #4106 · microsoft/WSL · GitHub
export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0
yankした時に"*レジスタに記録させる
set clipboard=unnamed
参考:
react-map-gl + node-mapnikでWebベースのGISアプリケーションを作った
react-map-gl + node-mapnikでのGIS Webアプリケーションを作った
この記事はFOSS4G Advent Calendar 2018の11日目の記事です。
Lgisという、WebベースのGISアプリケーションを作りました。
デモサイト的なものはまだありません。。近々作る予定です。
機能
- ブラウザ上で動作します。
- PostGIS上に保存されている位置情報データを可視化する事ができます。
モチベーション
位置情報データから何らかの知見を得たい時、QGIS等のGISアプリを使って地図上に可視化するのが一般的だと思います。
QGISは、データの表現力高く、対応するデータソースも多い素晴らしいアプリケーションですが、
処理速度が遅かったり、ドリルダウン向きの機能が弱かったりと、仮説検証を繰り返しながらデータ分析をする上では痒い所に手が届かない印象があります。
最近では、Kepler.gl というモダンなGISアプリもありますが、データソースがテキストのみというのが厳しい。
また、Re:DashやTableau等のBIツールは簡単にデータをドリルダウンする事ができますが、地図描画の機能自体がまだまだ弱いです。
そこで、両者の良さを活かしたツールを作れないかと思い、開発に至りました。
利用した技術
バックエンド
- node-mapnik
- ベクタタイルを使いたかったので、対応している地図サーバの中で一番人気そうなこちらを選びました
フロントエンド
- react-map-gl
- Reactで書いたほうが後々拡張しやすいかなと思い、Mapbox-GL-JSのReactラッパーのこちらを採用しました。
- Redux
- TypeScript
使い方
yarn install yarn build yarn start
react-map-glを使っている関係上、Mapbox Access Tokenが必要になります。
今後
ベクタータイルはPostGISにかける負荷が結構多いようで、手元の環境では地物が500万レコードぐらいを超えるとサーバーが固まります。
これを解消するために、タイルのキャッシュ機能を追加してあげる必要があるかなと思います。