Blog

  • PuTTYでCloudflare Tunnelを使って自宅のSSHサーバに接続する

    Cloudflare Tunnelトンネルを使うとプライベートIPアドレスしか持たないような環境でも外部からアクセスが可能になります。

    HTTP/HTTPSの場合は簡単で、Cloudflaredでドメインの設定(ネームサーバー等。たくさん記事があるので省略)を終えたら、Cloudflaredのダッシュボードから次を開きます。

    • Access
      • Tunnels
        • Create a tunnel

    これで割り当てたドメイン名でアクセスできるようになります。
    HTTPSも自動で設定されているのでとても楽です。

    SSHの場合はもうひと手間必要です。

    • [Connect with SSH through Cloudflare Tunnel]()

    詳しくは上記の記事の「Connect to SSH server with cloudflared access」の通りですが、クライアント側にもcloudflaredを入れる必要があります。

    WindowsでPuTTYを使っている場合は、次を参考にしました。

    user7633
    ’22 年 2月

    Simply in putty, go to proxy settings, select local, and configure the commandline to be

    cloudflared.exe access ssh –hostname %host

    (no \n at the end) and save the session as normal. works for me

    まずWindows用のfloudflaredをインストールします。

    なぜか64bitインストーラーが起動しても進まないので、手っ取り早くインストールするならコマンドプロンプトで次のようにする。

    > winget install --id Cloudflare.cloudflared
    見つかりました cloudflared [Cloudflare.cloudflared] バージョン 2023.10.0
    このアプリケーションは所有者からライセンス供与されます。
    Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
    ダウンロード中 https://github.com/cloudflare/cloudflared/releases/download/2023.10.0/cloudflared-windows-amd64.msi
      ██████████████████████████████  17.1 MB / 17.1 MB
    インストーラーハッシュが正常に検証されました
    パッケージのインストールを開始しています...
    インストールが完了しました

    AMD64版なのになぜかインストールされたのは C:\Program Files (x86)\cloudflared\cloudflared.exe です。
    このパスを残しておきます。

    PuTTYの接続画面で次の項目を設定します。

    • Connection

      • Proxy
    • Proxy type: Local(run a subprogram to connect)

    • Command to send to proxy(for some types): "cloudflared.exeへのパス" access ssh –hostname %host`

    PuTTYはホスト名だけCloudflare Tunnelで設定したものにして、他の設定はローカルで接続するのと同等でOK
    公開鍵認証で接続できました。

  • Raspberry Pi Pico WでMicroPythonを使ってLチカ

    個人的メモ。

    • BOOTSELボタンを押しながらUSB接続
      • USBドライブが認識されればOK. されなかったらケーブルを替えて試す(はまった)
        micro USBのケーブルは充電専用のものが多く紛れてる印象
    • UF2ファイルをダウンロードしてドライブに保存する
    • Thonnyをダウンロードしてインストール
      • https://thonny.org/
      • 今回は"Installer with 64-bit Python 3.10, requires 64-bit Windows 8.1 / 10 / 11 thonny-4.1.2.exe (21 MB)"を使いました
    • Thonnyを起動してRaspberry Pi Picoと接続する
      • Thonny画面右下に「ローカル Python3・ThonnyのPython」となっているところから切り替える

    file

    • 画面下の「シェル」にコードを入力して動作を確認する
      • machine.Pin('LED', machine.Pin.OUT).on()を実行すると光るはず
      • machine.Pin('LED', machine.Pin.OUT).off()で消灯

    画面上にソースを書いて「実行」してもOK

    import time
    
    while True:
        machine.Pin('LED', machine.Pin.OUT).on()
        time.sleep(1.0)
        machine.Pin('LED', machine.Pin.OUT).off()
        time.sleep(1.0)
  • SESAME3 に対応した Web API の使い方

    いつの間にかしれっと Web API が SESAME3 に対応していたので、実際に使ってみる手順を記録します。

    ※しばらく随時修正しています

    ドキュメント

    SESAME3 の UUID 確認

    公式アプリで操作したい鍵を設定画面を開いて確認します。

    API キーの取得

    ダッシュボードにログインします。
    ログインの仕方はアプリ版と同じで、メールで認証番号が届いて、それを入力するだけです。

    file

    file

    file

    file

    「API_KEY」を開くと確認できます。
    「CLIENT_KEY」は今のところ使いません。

    SESAME3 の状態取得

    Firefox の拡張機能 RESTer で動作確認します。

    file

    成功すると200でJSONが返ってきます。
    パラメータが間違っていたりすると502 Bad Gatewayになります。

    • batteryPercentage: 電池残量
    • batteryVoltage: 電池電圧
    • position: サムターン角度
    • CHSesame2Status: 状態
    • timestamp: 更新された時刻(1970-01-01 00:00:00:000からの経過ms)

    SESAME3 の履歴取得

    Firefox の拡張機能 RESTer で動作確認します。

    file

    成功すると200でJSONが返ってきます。
    パラメータが間違っていたりすると502 Bad Gatewayになります。

    SESAME3 の解錠・施錠操作

    secret key の取得

    公式アプリから鍵のシェアを行って表示されるQRコードを読み取ります。

    iPhone の場合は「ショートカット」アプリで新規ショートカットを作成し、「書類」の「QR/バーコードをスキャン」と「Quick Lookで表示」を追加し、「QR/バーコード」を「テキストとして」にしておくとQRコードの中身をテキストのまま得られます。

    URLは次のような形式になっていると思います。

    ssm://UI?t=sk&sk=AXXXXXXXX省略)XXXXXXXXXXX&l=0&n=%%%%%%%%%%

    この sk= の値をコピーしておいて、Base64 decode した文字列の1-17文字が secret key になります。
    1-17文字といってもindexでの[1:17](JavaScriptだとslice(1, 17))なので、実際は2文字目から17文字目までですね。

    Pythonが使える環境であれば、次のようにして対話モードでサクッと変換できます。

    $ python
    Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> b64 = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # skの値(sk=の後から&前まで)
    >>> import base64
    >>> base64.b64decode(b64)[1:17].hex()
    'abcdef0123456789hogehoge'

    動作確認

    CMACの生成が手間だったのでPythonで行っています。
    pipでpycryptodome, requestsをインストールしておきます。

    $ pip install pycryptodome, requests
    import datetime, base64, requests, json
    from Crypto.Hash import CMAC
    from Crypto.Cipher import AES
    
    uuid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
    secret_key = '0123456789abcdef0123456789abcdef'
    api_key = 'XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXx'
    
    # 鍵の操作(toggle/lock/unlock)
    cmd = 82    # 88/82/83 = toggle/lock/unlock
    
    # 履歴に残す内容
    history = 'Locked (Web API)' # 半角21文字/全角不明
    history = base64.b64encode(history.encode()).decode()
    
    # HTTP header
    headers = { 'x-api-key': api_key }
    
    # signの生成
    cmac = CMAC.new(bytes.fromhex(secret_key), ciphermod=AES)
    message = int(datetime.datetime.now().timestamp()).to_bytes(4, 'little', signed=False)[1:4]
    cmac.update(message)
    sign = cmac.hexdigest()
    
    # 鍵の操作
    url = f'https://app.candyhouse.co/api/sesame2/{uuid}/cmd'
    
    body = {
        'cmd': cmd,
        'history': history,
        'sign': sign
    }
    res = requests.post(url, json.dumps(body), headers=headers)
    print(res.status_code, res.text)

    参考

  • docker-compose で建てた CodiMD(HackMD) を 1.3.1 から 2.0.1 に更新する

    docker-compose で建てた CodiMD(HackMD) を 1.3.1 から 2.0.1 に更新する

    以前の記事の最新版です。

    更新時に注意するバージョンについて次に挙げるページで言及されていますが、1.1.0 以降は特に表立った手順は必要ないようです。

    前回の記事の後追いなので、詳細は省略して残します。

    手順

    PosgreSQL データのバックアップ

    不要ですが念のため。

    $ cd docker-hackmd
    $ sudo docker-compose exec database pg_dump hackmd -U hackmd  > backup.sql

    コンテナ削除

    $ sudo docker-compose down
    Stopping docker-hackmd_app_1      ... done
    Stopping docker-hackmd_database_1 ... done
    Removing docker-hackmd_app_1      ... done
    Removing docker-hackmd_database_1 ... done
    Removing network docker-hackmd_backend

    docker-compose.yml を変更

    イメージの指定を 2.0.1 に変更します。
    app: 下の image: hackmdio/hackmd:1.2.0image: hackmdio/hackmd:2.0.1 に書き換えます。

    新しいイメージの取得

    $ sudo docker-compose pull
    Pulling database ... done
    Pulling app      ... done

    コンテナ作成

    $ sudo docker-compose up -d
    Creating network "docker-hackmd_backend" with the default driver
    Creating docker-hackmd_database_1 ... done
    Creating docker-hackmd_app_1      ... done

    失敗

    一見うまくいっているように見えていますが、appのコンテナが落ちています。

    $ sudo docker-compose ps
              Name                        Command                State       Ports
    --------------------------------------------------------------------------------
    docker-hackmd_app_1        /home/hackmd/app/docker-en      Restarting
                               ...
    docker-hackmd_database_1   docker-entrypoint.sh postgres   Up           5432/tcp

    原因調査

    $ sudo docker logs docker-hackmd_app_1
    Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!Error: value of env: CMD_DB_URL is empty!

    環境変数が一つだけ変更されていました。
    HMD_DB_URLCMD_DB_URL に変更すればOKです。

    コンテナ再生成

    $ sudo docker-compose down
    Stopping docker-hackmd_app_1      ... done
    Stopping docker-hackmd_database_1 ... done
    Removing docker-hackmd_app_1      ... done
    Removing docker-hackmd_database_1 ... done
    Removing network docker-hackmd_backend
    $ sudo docker-compose up -d
    Creating network "docker-hackmd_backend" with the default driver
    Creating docker-hackmd_database_1 ... done
    Creating docker-hackmd_app_1      ... done
    
    $ sudo docker-compose ps
             Name                   Command           State           Ports
    --------------------------------------------------------------------------------
    docker-hackmd_app_1      /home/hackmd/app/docke   Up      0.0.0.0:3000->3000/tcp
                             r-en ...
    docker-                  docker-entrypoint.sh     Up      5432/tcp
    hackmd_database_1        postgres

    これで元通り問題なく使えました。

  • さくらのレンタルサーバーで Redis 5.0.8 を使う

    Redis 3.2.x の記事はいくつもありますが、現在の Stable である 5.0.8 に関しての記事がなかったので記録します。

    セットアップ手順

    ソースのダウンロードと展開

    % http://download.redis.io/releases/redis-5.0.8.tar.gz
    % tar xvzf redis-5.0.8.tar.gz

    ビルド前準備

    Redis には configure がありません。
    src/Makefile のインストールパスを直接編集します。

    PREFIX?=/usr/localPREFIX?=$(HOME)/usr/local とします。

    ### 省略 ###
    PREFIX?=$(HOME)/usr/local
    ### 省略 ###

    ビルドとインストール

    % gmake
    % gmake install

    Warning はいくつも出ますが、Error は発生していません。

    動作確認

    % $HOME/usr/local/bin/redis-server -v
    Redis server v=5.0.8 sha=00000000:0 malloc=libc bits=64 build=7ae0b2bf8de7e59e

    起動手順

    原始的な方法ですが、nohup とバックグラウンドプロセスを組み合わせて起動します。

    % nohup $HOME/usr/local/bin/redis-server < /dev/null >& /dev/null &

    動作確認

    redis-cli を実行します。

    % $HOME/usr/local/bin/redis-cli
    127.0.0.1:6379> exit
    %

    プロンプトが表示されれば成功です。

    参考

  • さくらのレンタルサーバーで Python 3.6.10 をインストール

    さくらのレンタルサーバーで Python 3.6.10 をインストール

    さくらインターネットのレンタルサーバーは標準で Python 2 が使えます。
    しかし、Python 3 への移行が進んだ現在では、できれば Python 3 系列を使いたいです。

    既に先人が残した記事が多くありますが、pyenv を使った記事が多いため、やや煩雑に感じます。
    純粋に Python 3 を使うための手順を残します。

    必要なもの

    • レンタルサーバーのスタンダードプラン以上
      • SSH で作業するので必須です

    手順

    SSH のログイン

    さくらインターネットの説明を確認して SSH でログインしてください。

    Python 3.6.10 のダウンロードと展開

    上記リリースページからソースコード(Gzipped source tarball)を取得します。

    % wget https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz
    % tar xvzf https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz

    ビルドとインストール

    不要かもしれませんが、インストール先を用意しておきます。

    % mkdir -p $HOME/usr/local/python

    インストール先を指定して configure, make します。

    % ./configure CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib" --prefix=$HOME/usr/local/python
    % make
    % make install

    動作確認

    % $HOME/usr/local/python/bin/python3 -V
    Python 3.6.10
    % $HOME/usr/local/python/bin/pip3 -V
    pip 18.1 from /home/username/usr/local/python/lib/python3.6/site-packages/pip (python 3.6)

    試しに pip でパッケージをインストールして、python で import できるか試してみます。

    % $HOME/usr/local/python/bin/pip3 install bottle
    Collecting bottle
      Downloading https://files.pythonhosted.org/packages/e9/39/2bf3a1fd963e749cdbe5036a184eda8c37d8af25d1297d94b8b7aeec17c4/bottle-0.12.18-py3-none-any.whl (89kB)
        100% |################################| 92kB 8.8MB/s
    Installing collected packages: bottle
    Successfully installed bottle-0.12.18
    You are using pip version 18.1, however version 20.1b1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    % $HOME/usr/local/python/bin/python3
    Python 3.6.10 (default, Apr 27 2020, 12:00:08)
    [GCC 7.4.0] on freebsd11
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import bottle

    問題ありませんね。

    参考

  • Vue CLI のインストールからプロジェクトの作成まで

    Vue CLI のインストールからプロジェクトの作成まで

    自分用のメモです。

    インストール

    遅いです。

    $ npm install -g @vue/cli

    空プロジェクトの作成

    $ vue create project-name

    開発サーバの起動

    $ cd project-name
    $ npm run serve

    (参考)Git からプロジェクトをダウンロードしたとき

    $ unzip project-name.zip
    $ cd project-name
    $ npm install

    参考