2022/06/30

メモ:競プロ用に使っているVSCode Remote WSL の tasks.json と launch.json

VSCodeは、remote WSL で WSLに繋ぐ。
workspaceは WSL の中の、/home/myname/atcoder/ 。
tasks.json と launch.json はさらにその中の .vscode/ の中。

tasks.json
デバッグ用の実行形式は a.dbg

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "/usr/bin/g++",
            "args": [
                "-std=gnu++17",
                "-g",
               "-O0",
                "-o",
                "${workspaceFolder}/a.dbg",
                "${file}",
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "options":{
            },
            "problemMatcher": ["$gcc"],
            "presentation": {
                "close": false,
                "echo": true,
                "reveal": "silent",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            }
        }
    ]
}


launch.json
[F5]で、上で作った a.dbg に、in.txt を標準入力で入れる。
in.txt に sample をコピペして [F5] を押せば、そのままサンプル実行できる。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "remote WSL gdb",
            "type": "cppdbg",
            "request": "launch",
            "program": "a.dbg",
            "args": [
                "<",
                "in.txt"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/",
            "environment": [],
            "externalConsole": true,
            "pipeTransport": {
                "pipeCwd": "/",
                "pipeProgram": "bash",
                "pipeArgs": ["-c"],
                "debuggerPath": "/usr/bin/gdb"
            },
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
        }
    ]
}

2022/06/10

Notebookで分析とVS Codeで開発をリモートで同時に行う話

 GCP の Vertex AI Workbench はクラウドでデータ分析をする環境として非常に便利です。AI関連の分析はもちろん、単なる jupyter notebook として、python や R で notebook ベースでの分析作業環境を簡単に構築できます。

一方、分析は分析だけで終わる場合もありますが、その結果を使って、また、分析自体をパッケージ化して、なんらかのツールを開発することがしばしばあります。もしくは、notebook で使うモジュールを分析と同時に開発するというケースもあります。ところが、分析と開発を同時にやりたいと思ったとき、jupyter notebook だけでは開発環境がちょっと弱い。

そのようなニーズに対応するためかどうかはわかりませんが、Vertex AI Workbench には jupyter notebook ではなく、Theia IDE を UI として使うメニューも(現状は Experimental ですが)あります。しかし・・・Theia より、VS Code を使いたい・・・。見た目はほぼ同じなので、Theia に慣れればいいだけなのですが、なんとも言われぬもっさり感に、いや、VS Code の快活な動きに慣れてしまった後では、どうしても Theia よりは VS Code で、と思ってしまいます。


ならば、クラウドのノートブックインスタンスに、VS Code の remote SSH で繋げばいいじゃないか!と思ってやってみたらあっさり繋がりましたので、その備忘メモです。


まず、Vertex AI Workbench のノートブックインスタンスは適当に作って立ち上げておきます。


ローカル側ではVS Code を用意し、また、ssh でノートブックインスタンスに接続するので、SSH の設定が一通り必要になります。

まず、SSHの鍵ペアを用意します。無ければ生成して、しかるべき場所に置きます。ローカルが Windows ですと、VS Code は(たぶん)Power Shell の SSH を使って接続しようとするので、C:/user/(name)/.ssh に置くことになると思います。

で、作成した公開鍵を上で立ち上げたノートブックインスタンスに登録します。登録は、Vertex AI Workbench のコンソールからではなく、Compute Engine の設定画面から行います。コンソールのVMインスタンスから当該のインスタンスの設定を「編集」、SSH認証鍵のところで「項目を追加」から公開鍵を記入します。

このとき、公開鍵の最後にくっついているコメントがそのままユーザー名になるので、必要ならばこれを jupyter にしておきます。これは、プロジェクトベースでノートブックインスタンスを立ち上げると、利用するユーザーは Google Account の個人ではなく、Jupyter Notebook のサービスアカウントになっているからです。その名前が jupyter さんなので、ここで登録する SSH公開鍵の名前も jupyter さんにしておきます。

なお、プロジェクトによってはセキュリティの都合上 Compute Engine のインスタンスへの直接 SSH アクセスを禁止していることがありますが、その場合は諦めましょう。管理者が設定したセキュリティ要件には従ってください。


さて、SSH公開鍵をノートブックインスタンスに設置したら、ローカルから SSH 接続ができるかどうかを試します。ローカルの SSHクライアントを適切に選び、接続テストをします。

接続ができたら、config ファイルを作成します。VS Code はその config の Host を見て接続するので、ここに必要な事項を書いておきます。例えば、

Host mynotebookinstance

HostName xxx.xxx.xxx.xxx

User jupyter

IdentityFile ~/.ssh/id_rsa

など。

ここで注意なのが、HostName です。ここにIPアドレスを記入するのですが、Vertex AI Workbench で立ち上げたインスタンスの外部IPはエフェメラルなので、変化する可能性があります。固定IPを契約する、もしくは何らかのホスト名をつけるというのがよいのですが、それができない場合は毎回 IP アドレスを確認し、この HostName を修正する必要があります。但し、セキュリティ的にはそういう運用はあまりよくなさそうですので、心配な方は IT 部門に相談しましょう。


ここまできたら、あとは VS Code の remote-ssh で接続するだけです。VS Code の remote-ssh 拡張は、WSL で VS Code を使っていればおなじみのプラグインなので、入っていればそれでOK。無ければインストールします。

その後、左下の「リモートウィンドウを開きます」から Connect to Host を選ぶと、先ほど config に設定した Host が出てくるので、それを選択します。SSH鍵のパスフレーズを入力し、最初はリモートインスタンスのタイプを尋ねられるので、Linux を選択したら、VS Code からノートブックインスタンスに繋がるはず。左ペインにリモートのディレクトリが見えればOKです。


リモート開発環境の設定、例えば launch.json や settings.json などを適宜実施すれば、めでたく、jupyter notebook をブラウザで開きつつ、VS Code でリモート開発ができる環境が作れました。



最後にセキュリティについて。

そもそも、なぜわざわざクラウドでこういうことをやりたいのかというと、一番の理由は「ローカルに分析の痕跡を残したくない」からです。データ分析の仕事は秘密のデータをたくさん扱うので、データのセキュリティのことを考えると、最も安全なのは、「データをクラウドから出さない」ことです。GCP にはプロジェクトという枠組みがあって、プロジェクトの中にあるものは、プロジェクトの外からは見えなくなっています。Google Account を使ってプロジェクトの中に入ることで、初めてデータやコードなどのリソースに触ることができ、プロジェクトから出ればそれらとしっかり遮断される、そういう環境が理想的です。

そして、Vertex AI Workbench のサービスが開始されて以降、ようやくその理想に近づいてきました。(その以前から別の名前で同様のサービスがあったのですが、最初は非常に使いにくかった。)また一歩、「クラウドから出さないデータ分析」の理想に近づきました。

ただ、それでもまだ完璧ではないのは、Theia のもっさり感と、代替手段である VS Code の快活さです。正直、Vertex AI の Theia での開発はまだちょっと無理です。非常に重い。Theia 自体もさることながら、ブラウザベースでのコミュニケーションであること、また、おそらくコンソールの通信をツールがうまく橋渡ししておらず、タイピングのレイテンシがかなりのストレスになります。

そこで、理想は理想としてありつつも、現実的な路線として、VS Code によるリモート開発が選択肢として上がってきます。SSHで繋ぐので、リモート環境にあるコードやデータをローカルにダウンロードしようと思えば可能です。しかしそのためには scp などを意図的に使う必要がある、つまり、無意識にデータが漏洩することはありません。それ以外では、普通にVS Code でリモート開発しているだけなら、ローカルには(キャッシュを除き)痕跡は残りません。リモートを切断すればローカルには何もありません。

唯一の懸念点は、ローカルに置いてある SSH鍵を使えば、ノートブックインスタンスにアクセスできてしまう点です。この鍵は Google Account を経由せずにプロジェクトの中に入れるので、注意が必要です。しかしその一方で、あくまでも GCP のサービスアカウントの一つですから、その権限を正しく設定しておくことで、リスクを低減することが可能です。また、ノートブックインスタンスは IPアドレスが常に変化するので、万が一この設定が盗難されてしまったとしても、Google Account 無しに IPアドレスを突き止めることは不可能です。さらには、SSH鍵に正しくパスフレーズを設定しておくことで、リスクは限りなくゼロに近づけることができます。

ということで、これらのセキュリティ要件をちゃんと考えた上で、VS Code でのリモート開発は便利で効率的、という話でした。

2022/06/08

マイナンバーカードを使って「商業登記電子証明書」を取得した話

「商業登記電子証明書」は会社の代表個人のマイナンバーカードを使うとすべてオンラインで取得できるとのことで、やってみました経過の備忘録です。次回、27ヶ月後に思い出せるように。

【作業順】

基本的には商業登記のサイトに載っている手順書の通りに実施すればOKだけれど、ちょっと不親切なところがあったので、自分用のメモが次。

  1. 商業登記電子認証ソフトをインストールし、申請用データを作成した。
    • 作成するファイル
      • SHINSEI
      • 鍵ペア
      • 発行申請書・委任状ファイル(紙申請用なので使わない)

  2. 申請用総合ソフトをインストールし、申請書を作成した。
    • まずは送信前の準備で、電子署名の手前まで作業を進める。

  3. 電子署名をして申請
    • マイナンバーカードをICカードリーダーに挿した状態で、申請用総合ソフトの「ツール」->「ICカード切替」で使用するICカードライブラリを登録する。
      • その前にマイナンバーカードを公的個人認証として使えるようにしておくことが必要(後述)
    • 申請書を右クリックし、署名付与
      • マイナンバーの署名用パスワードを入力。
    • これで申請ができるので、申請する。

  4. しばらく経つと受理と費用納付の連絡が来るので、費用を納付する。
    • 「納付」を押すと、ペイジー納付のウェブサイトに飛ぶので、インターネットバンキング等を使って納付する。
    • ブラウザが開き、そのままインターネットバンキングのページに飛ぶのだけれど、もし別のブラウザや別のマシンを使って納付したいときはどうすればいいんだろう?

  5. またしばらく経つと、申請用総合ソフトでステータスが「納付済み」、「手続終了」に変化する。手続き終了になったら、「お知らせ」欄に出力されるシリアル番号を控えておく。

  6. 商業登記電子認証ソフトにて、「電子証明書の取得」を実行
    • 申請用総合ソフトで控えたシリアル番号と、2で作成した鍵ペアファイルを使い、また、電子証明書パスワードを設定して、商業登記電子証明書をダウンロードする。
以上。

これで、自分が代表を務める会社の商業登記電子証明書を、自分のマイナンバーカードを使って、すべてオンラインで取得することができました。


【公的個人認証ソフトについて】

JPKIのサイトからJPKI公的個人認証の利用者クライアントソフトをダウンロード、インストールしておく必要があります。なお、ツール群の中にはjavaのインストールを要求するようなものがあるのですが、今回は不要です。(javaとか絶対インストールしたくない・・・。)

また、ICカードリーダーを接続しておきます。

ところで、たいていのICカードリーダーは、パソコンに接続すると自動的に汎用ドライバがインストールされて使えるようになるのですけれど、自分の環境ではこのドライバはNGでした。ちゃんとメーカーのサイトから専用ドライバをダウンロードし、インストールしておかないと、JPKI利用者ソフトが無言で落ちます。例えばパスワードを入力してマイナンバーカード情報を読み取ろうとした時など。メーカーから正しいドライバをインストールするとその現象は治りました。

落ちる前になんらかのメッセージくらい出してほしかったという思いはあります。

正しく設定されていると、パスワードを使ってカードの情報を読み取ることができます。


【必要なソフトウェア】

結局、3つのソフトウェアをPCにインストールすることになりました。
  • 商業登記電子認証ソフト
  • 申請用総合ソフト
  • JPKI利用者クライアントソフト群
昨今はほとんどのツールがウェブアプリ化されているので、PCにソフトウェアをインスト-ルするということが減りました。インストール画面でのセキュリティ警告も「はい」を押すしかありません。利用するPCも(消耗品として)どんどん入れ替わりますし、ローカルに何かをインストールすると環境を汚して、他の大事なツールが動かなくなったりするので、正直あまりローカルにインストールしたくないです。27ヶ月後はウェブアプリ化されているといいと思います。