Docker MCPを使ったClaude Desktop連携設定

AI開発の世界で注目されているModel Context Protocol(MCP)を、Dockerを活用してより安全かつ簡単に利用する方法のメモ。 設定時にはまった内容も含みます。

docker with claude desktop

Docker MCPとは何か?

Model Context Protocol(MCP)の基本

Model Context Protocol(MCP)は、Anthropic社が開発したオープンスタンダードで、AI アシスタントと外部データソースやツールを接続するための標準化されたプロトコルです。MCPにより、AI アプリケーションは外部ソースからデータを取得し、第三者サービスとの操作を実行できるようになります。

MCPは以下の要素から構成されています:

  • MCPクライアント: Claude Desktop AppなどのLLMベースのアプリケーションに組み込まれる
  • MCPサーバー: 外部システムとの接続を提供し、特定の機能を実装する

Docker MCPで解決できること

従来のMCP実装では、以下のような課題がありました:

  • 環境競合: MCP サーバーのインストールで、Node.js、Python などの特定バージョンが必要で、既存環境と競合する可能性
  • ホスト隔離の欠如: MCP サーバーがホスト上で実行され、すべてのホストファイルとリソースにアクセス可能
  • 複雑なセットアップ: ユーザーがすべてのコードをダウンロードし、環境を設定する必要がある
  • クロスプラットフォームの課題: 異なるアーキテクチャ(x86 vs ARM、Windows vs Mac)での一貫した実行が困難

Docker MCPは、これらの課題をコンテナ技術で解決します:

  • 環境分離: 各 MCP サーバーが独立したコンテナで実行される
  • 一貫性: すべてのプラットフォームで予測可能な動作
  • セキュリティ: サンドボックス化された実行環境
  • 簡単なデプロイ: ワンクリックでのインストールと設定

Docker MCP Catalog と Toolkit

Docker MCP Catalog

Docker MCP Catalogは、Docker Hub に統合された信頼できるMCPサーバーのレジストリです。2025年5月現在、以下の特徴があります:

  • 100以上のMCPサーバー: Stripe、Elastic、Neo4j、New Relicなどの主要企業が提供
  • 検証済みツール: 出版社検証、バージョン管理、キュレーションされたコレクション
  • Docker Hub統合: mcp/ 名前空間でアクセス可能

主なMCPサーバー例: - Filesystem: ローカルファイルシステムへの安全なアクセス - GitHub: リポジトリ管理とGitHub API統合 - Puppeteer: Webページスクリーンショットとブラウザ操作 - Google Calendar: Googleカレンダーイベント管理 - Postgres: PostgreSQLデータベース操作

Docker MCP Toolkit

Docker MCP Toolkitは、MCPサーバーの設定、管理、実行を可能にするゲートウェイです:

  • クロスLLM互換性: Claude Desktop、Cursor、Continue.dev、Gordonで即座に動作
  • 統合ツール検出: Docker Desktop内でMCPサーバーを直接参照・起動
  • ゼロ手動設定: 依存関係管理、ランタイム設定、サーバー設定が不要
  • セキュリティ: CPUを1コア、メモリを2GBに制限、デフォルトでファイルシステムアクセス無し

Windowsでの設定方法

事前準備

  1. Docker Desktopのインストール

    • 最新版のDocker Desktop for Windowsをダウンロード・インストール
    • 推奨バージョン: 4.43.0以降
  2. Claude Desktopのインストール

    • Anthropic公式サイトからClaude for Desktopをダウンロード
    • Windowsバージョンをインストール

方法1: Docker MCP Toolkitを使用(推奨)

ステップ1: MCP Toolkitの有効化

1. Docker Desktopの設定を開く
2. 「Beta features」を選択
3. 「Enable Docker MCP Toolkit」を有効化
4. 「Apply」をクリック

ステップ2: MCPサーバーの追加

  1. Docker Desktopで「MCP Toolkit」を選択
  2. 「Catalog」タブを開く
  3. 使用したいMCPサーバーを選択(例:GitHub Official、Puppeteer)
  4. プラスアイコンをクリックして追加
  5. 必要に応じて「Config」タブで設定を行う

ステップ3: Claude Desktopとの接続

  1. Docker MCP Toolkitの「Clients」タブを選択
  2. 「Claude Desktop」の横の「Connect」ボタンをクリック
  3. Claude Desktopを再起動

これで、Claude Desktopの設定ファイル(claude_desktop_config.json)に以下の設定が自動追加されます:

{
  "mcpServers": {
    "MCP_DOCKER": {
      "command": "docker",
      "args": [
        "mcp",
        "gateway",
        "run"
      ],
      "env": {
        "LOCALAPPDATA": "C:\\Users\\ユーザー名\\AppData\\Local",
        "ProgramFiles": "C:\\Program Files"
      }
    }
  }
}

Claude Desktopとの接続

接続確認

Claude Desktopを再起動後、以下を確認してください:

  1. MCPアイコンの表示: チャット入力欄の右下にハンマーアイコンが表示される
  2. 開発者設定での確認:
    • 設定 → Developer タブを開く
    • MCPサーバーが「running」状態になっている

権限の確認

MCPツールを初回使用時、Claude は権限の確認を求めます:

ファイルシステム(ローカル)からツールを許可する
ファイルシステムから write_file を実行

使用前に各アクションを慎重に確認してから許可してください。

実際の使用例

例1: ファイル操作

プロンプト: 
C:\Users\username\Documents\test.txt に「Hello, Docker MCP!」と記載したテキストファイルを作成してください。

Claude は Filesystem MCP サーバーを使用してファイルを作成します。

例2: Webスクリーンショット

Puppeteer MCPサーバーを有効にした場合:

プロンプト:
docs.docker.com のスクリーンショットを撮影して、色を反転させてください。

例3: GitHub操作

GitHub MCP サーバーを設定した場合:

プロンプト:
私のGitHubリポジトリ一覧を表示してください。

注意: GitHub MCPサーバーを使用するには、Personal Access Token(PAT)の設定が必要です。

注意点とベストプラクティス

セキュリティ上の注意点

  1. 信頼できるソースのみ使用

    • Docker Hub の mcp/ 名前空間の検証済みイメージを使用
    • 不明なソースのMCPサーバーは避ける
  2. ファイルシステムアクセスの制限

    • 必要最小限のディレクトリのみアクセス許可
    • 機密データが含まれるフォルダは除外
  3. 定期的な更新

    • Docker MCP Toolkitとサーバーイメージを定期更新
    • セキュリティパッチの適用

パフォーマンス最適化

  1. リソース管理

    • 不要なMCPサーバーは無効化
    • Docker Desktop のリソース設定を適切に調整
  2. ネットワーク設定

    • プロキシ環境では適切な設定が必要
    • ファイアウォール設定の確認

トラブルシューティング

一般的な問題

  1. MCPサーバーが認識されない

    • Claude Desktop の完全な再起動を実行
    • タスクマネージャーでClaude プロセスが完全に終了していることを確認
  2. 設定ファイルが反映されない

    • JSON構文エラーの確認
    • パスの記述方法(Windows では \\ を使用)
  3. Docker接続エラー

    • Docker Desktop が起動していることを確認
    • Docker サービスの状態を確認
    • Windows管理者権限でDockerを実行

特定のエラーケース

1. ProgramDataエラー

ログに以下のようなエラーが表示される場合:

panic: unable to get 'ProgramData'

これはDocker MCP Gatewayが環境変数にアクセスできない問題です。解決方法(実証済み)

Claude Desktopの設定ファイル(claude_desktop_config.json)で、環境変数を明示的に指定:

{
  "mcpServers": {
    "MCP_DOCKER": {
      "command": "docker",
      "args": [
        "mcp",
        "gateway",
        "run"
      ],
      "env": {
        "LOCALAPPDATA": "C:\\Users\\ユーザー名\\AppData\\Local",
        "ProgramFiles": "C:\\Program Files",
        "ProgramData": "C:\\ProgramData"
      }
    }
  }
}

重要: ユーザー名の部分を実際のWindowsユーザー名に置き換えてください。

この解決策は、Docker for Windows GitHub Issue #14860 で報告・解決された実際の問題です。

ログの確認

Windows環境でのログファイル場所:

%APPDATA%\Claude\logs\mcp*.log

PowerShellでログを確認:

Get-Content -Path "$env:APPDATA\Claude\logs\mcp*.log" -Tail 20 -Wait

現在の既知の問題と解決策(2025年7月時点)

  1. Docker MCP Gateway ProgramDataエラー解決済み

    • 症状: panic: unable to get 'ProgramData'エラーで接続失敗
    • 原因: Docker MCP GatewayがWindows環境変数にアクセスできない
    • 解決策: Claude Desktop設定で環境変数を明示的に指定(上記参照)
    • 参考: Docker for Windows Issue #14860
  2. MCPサーバーの接続タイムアウト

    • 一部のMCPサーバーで初回接続時にタイムアウトが発生
    • 回避策:Claude Desktopの再起動を複数回試行
  3. Claude Pro推奨

    • 無料版では利用制限が厳しく、実用的な作業には不向き
    • Sonnet 3.5 は特に制限が厳しい
  4. MCPサーバーの制限

    • 一部のMCPサーバーはAPIキーやトークンが必要
    • Windows特有の設定が必要な場合がある
  5. ネットワーク依存

    • インターネット接続が必要なMCPサーバーが多い
    • オフライン環境での制限

まとめ

Docker MCPは、従来のMCP実装の課題を解決する画期的なソリューションです。特にWindows環境では、Docker MCP Toolkitを使用することで、複雑な環境設定を回避し、安全で一貫したMCPサーバーの実行が可能になります。

Claude Desktopとの統合により、AIアシスタントの能力を大幅に拡張でき、ファイル操作、Web操作、データベース操作、API統合など、様々なタスクを自動化できます。

今後、Docker MCP Catalogには更に多くのMCPサーバーが追加される予定で、AI開発のエコシステムは急速に進化しています。セキュリティベストプラクティスに従いながら、この革新的な技術を活用してください。


次のステップ - Docker MCP Toolkitで様々なMCPサーバーを試す - 独自のMCPサーバーの開発を検討 - セキュリティ設定の見直しと最適化

参考にした情報源

公式ドキュメント

Docker公式ブログ

Anthropic公式

GitHub リポジトリ・Issues

技術記事・チュートリアル

日本語記事

その他の参考記事

Tailscale Exit Node設定でインターネットに接続できない問題の解決方法

Tailscale Exit Node設定でインターネットに接続できない問題の解決方法
Tailscaleは、簡単にVPNネットワークを構築できる優れたツールです。その中でもExit Node機能を使うことで、特定のサーバー経由でインターネットにアクセスできるようになります。しかし、Exit Nodeを設定したにも関わらず、他の端末からインターネットに接続できなくなるという問題に遭遇することがあります。(過去2回設定して、2回とも忘れていた…ので記録に残す)

問題の症状

  • Tailscale Exit Nodeを設定後、クライアント端末からインターネットへの接続ができない
  • Tailscaleネットワーク内の通信は正常に動作する
  • Exit Nodeサーバー自体はインターネットに接続できている

原因:IP転送が無効

この問題の最も一般的な原因は、Exit Nodeとして設定したサーバーでIP転送(IP Forwarding)が無効になっていることです。

IP転送とは、Linuxサーバーが異なるネットワークインターフェース間でパケットを中継する機能です。Exit Nodeとして動作するためには、Tailscaleインターフェースから受信したパケットを、インターネットに向けて転送する必要があります。

解決方法

1. 現在のIP転送設定を確認

まず、現在のIP転送の状態を確認します:

cat /proc/sys/net/ipv4/ip_forward

この値が 0 の場合、IP転送が無効になっています。

2. IP転送を一時的に有効にする

すぐに問題を解決するために、一時的にIP転送を有効にします:

sudo sysctl -w net.ipv4.ip_forward=1

または、より直接的な方法として:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

3. 設定が反映されたことを確認

cat /proc/sys/net/ipv4/ip_forward

この値が 1 になっていれば成功です。

4. 永続的な設定にする

サーバーを再起動してもIP転送が有効のままになるよう、設定を永続化します:

# 設定ファイルに追記
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf

# 設定を反映
sudo sysctl -p

5. Exit Nodeの設定を確認

Tailscale側でもExit Nodeとして適切に設定されているか確認します:

# Exit Nodeとして広告
sudo tailscale up --advertise-exit-node

# 状態確認
tailscale status

追加で必要になる可能性がある設定

ファイアウォール設定

環境によっては、iptablesの設定も必要な場合があります:

# Tailscaleインターフェース経由のトラフィックを許可
sudo iptables -A FORWARD -i tailscale0 -j ACCEPT
sudo iptables -A FORWARD -o tailscale0 -j ACCEPT

# NAT設定(eth0は実際のインターフェース名に置き換え)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

IPv6環境での設定

IPv6も使用している場合は、IPv6転送も有効にします:

echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

クライアント側での接続設定

Exit Nodeの設定が完了したら、クライアント側でExit Nodeを使用するよう設定します:

# 利用可能なExit Nodeを確認
tailscale status

# 特定のExit Nodeを使用
tailscale up --exit-node=<exit-node-ip>

動作確認

設定が正しく動作しているか確認する方法:

# パブリックIPアドレスを確認(Exit NodeのIPアドレスになるはず)
curl ifconfig.me

# ルーティングを確認
traceroute 8.8.8.8

それでも繋がらない時のトラブルシュート・チェックリスト

  • Exit Node機はオンラインですか?
    • Tailscale管理画面(Web)で、Exit Nodeの横にある緑色のランプが点灯しているか確認してください。
  • 鍵(Key)の有効期限は切れていませんか?
    • デフォルトでは180日で認証キーが期限切れになります。
    • 管理画面で「Disable Key Expiry」を設定していない場合、再認証が必要です。
  • Tailscaleアプリは最新ですか?
    • クライアント側とExit Node側でバージョンが大きく離れていると不具合が起きることがあります。sudo tailscale update で最新にしてください。
  • マジックDNS(MagicDNS)は有効ですか?
    • Exit Node経由だと名前解決(DNS)がうまくいかないことがあります。
    • 管理画面のDNS設定で「Override local DNS」がオンになっているか試してみてください。
  • 「Allow LAN Access」の設定
    • クライアント側(特にmacOS/iOS)の設定で「Allow LAN Access」がオフになっていると、ローカルIPへのアクセスがブロックされることがあります。

まとめ

Tailscale Exit Nodeでインターネット接続ができない問題は、多くの場合IP転送が無効になっていることが原因です。sysctl -w net.ipv4.ip_forward=1 で一時的に有効にし、/etc/sysctl.conf への設定追加で永続化することで解決できます。

参考情報

公式ドキュメント

Linux システム設定

【所要時間15分程度】TailscaleでAdGuard Homeを導入して広告ブロック環境を構築する

前回の記事「TailscaleでVPN環境を構築する」では、OCI上にTailscaleのExitNodeを構築しました。今回はその続きとして、同じサーバ上にAdGuard Homeを導入し、VPN経由でアクセスする端末の広告を効果的にブロックする環境を構築していきます。

AdGuard Homeとは

AdGuard Homeは、ネットワーク全体の広告とトラッカーをブロックするオープンソースのDNSサーバーです。

主な特徴

  • DNS レベルでの広告ブロック: アプリケーションレベルではなく、DNS解決時点で広告やトラッカーをブロック
  • 詳細なクエリログと統計: リアルタイムでDNSクエリを監視し、詳細な統計情報を提供
  • 豊富なフィルタリスト対応: EasyList、AdGuard filters、Pi-hole listsなど多様なフィルタリストをサポート
  • モダンなWeb管理画面: 直感的で使いやすいWebベースの管理インターフェース
  • 暗号化DNS対応: DNS-over-HTTPS (DoH)とDNS-over-TLS (DoT)をサポート
  • ペアレンタルコントロール: 成人向けコンテンツのブロック機能
  • セーフブラウジング: フィッシングサイトやマルウェアサイトの検出・ブロック

今回の構成

前回構築したTailscale ExitNodeに、AdGuard Homeをコンテナとして追加します。Tailscaleコンテナとネットワークを共有することで、VPN経由でのみアクセス可能なDNSサーバーを構築できます。

サーバーセットアップ手順

前提条件

  • 前回の記事で構築したTailscale環境が動作していること
  • Docker と Docker Compose がインストールされていること
  • サーバーへのSSHアクセスが可能であること

1. 作業環境の準備

まず、AdGuard Home用の作業ディレクトリを作成し、必要なディレクトリ構造を準備します:

# 作業ディレクトリの作成
mkdir -p ~/docker/docker-tailscale-adguard
cd ~/docker/docker-tailscale-adguard

# 必要なディレクトリの作成
mkdir -p adguard_config adguard_data tailscale_var_lib

# ディレクトリの権限設定(AdGuard Homeが書き込み可能にする)
chmod 755 adguard_config adguard_data

Docker Composeファイルの作成

cat > docker-compose.yml << 'EOF'
services:
  tailscale:
    hostname: adguard-hosted              # Tailscaleデバイス名
    image: tailscale/tailscale:latest
    volumes:
      - "./tailscale_var_lib:/var/lib"        # Tailscale設定データの永続化
      - "/dev/net/tun:/dev/net/tun"           # VPN接続に必要
    cap_add:                                    
      - net_admin                             # ネットワーク管理権限
      - sys_module                            # カーネルモジュール操作権限
    environment:
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--accept-routes --accept-dns=false
    restart: unless-stopped

  adguardhome:
    restart: unless-stopped
    volumes:
      - './adguard_data:/opt/adguardhome/work'   # 作業ディレクトリ
      - './adguard_config:/opt/adguardhome/conf' # 設定ディレクトリ
    image: adguard/adguardhome
    network_mode: service:tailscale              # Tailscaleとネットワーク共有
EOF

3. コンテナの起動

# バックグラウンドで起動
docker compose up -d

# 起動状況の確認
docker compose ps

# ログの確認(必要に応じて)
docker compose logs -f

4. Tailscaleの認証

初回起動時は、Tailscaleの認証が必要です:

# 認証URLの確認
docker compose logs tailscale | grep "To authenticate"

# 表示されたURLにアクセスしてログイン
# 例: https://login.tailscale.com/a/XXXXXXXX

認証完了後、Tailscale管理画面のMachinesページで新しいノードが表示されることを確認してください。

Docker Composeでの構築詳細

ディレクトリ構成

最終的なディレクトリ構成は以下のようになります:

~/docker/docker-adguard-tailscale/
├── docker-compose.yml
├── adguard_config/          # AdGuard Home設定ファイル
├── adguard_data/            # AdGuard Home作業データ
└── tailscale_var_lib/       # Tailscale状態データ
    └── tailscale/
        └── tailscaled.state # Tailscale接続状態

設定パラメータの詳細解説

Tailscaleコンテナ設定:

  • hostname: adguard-hosted: Tailscaleネットワークで表示されるデバイス名
  • volumes:
    • ./tailscale_var_lib:/var/lib: 認証情報などの永続化
    • /dev/net/tun:/dev/net/tun: TUNインターフェースへのアクセス(VPN必須)
  • cap_add:
    • net_admin: ネットワーク設定変更権限
    • sys_module: カーネルモジュール操作権限
  • TS_EXTRA_ARGS=--accept-routes --accept-dns=false:
    • --accept-routes: 他のTailscaleノードが広告するルートを受け入れます
    • --accept-dns=false: TailscaleのDNS設定を無効にし、AdGuard HomeのDNSを優先させます(この設定により、AdGuard Home自体がTailscaleのDNSを使用しないようになります)

AdGuard Homeコンテナ設定:

  • network_mode: service:tailscale: Tailscaleコンテナとネットワークスタックを共有
  • volumes:
    • ./adguard_data:/opt/adguardhome/work: クエリログや統計データの保存
    • ./adguard_config:/opt/adguardhome/conf: 設定ファイルの保存

重要なポイント

network_mode: service:tailscale: この設定により、AdGuard HomeはTailscaleコンテナとネットワークスタックを共有します。これにより:

  • AdGuard HomeはTailscaleのIPアドレスでアクセス可能になります
  • 外部からの直接アクセスは不可能で、VPN経由でのみアクセス可能です
  • セキュリティが向上します

セットアップ手順

Tailscaleの管理画面で、作成したノードのIPアドレスを確認し、ブラウザでアクセスします:

http://[TailscaleノードのIP]:3000

初期設定ウィザードが表示されるので、以下の手順で設定します:

  1. 管理画面のポート設定
    • Admin Web Interface: 3000 (デフォルト)
    • DNS Server: 53 (デフォルト)
  2. 管理者アカウント作成
    • ユーザー名とパスワードを設定
  3. DNS設定
    • アップストリームDNSサーバーを設定
    • 推奨: 1.1.1.18.8.8.8

2. Tailscale管理画面でのDNS設定

AdGuard Homeが起動したら、Tailscale管理画面でDNSサーバーとして設定します。この設定により、VPNに接続したすべてのデバイスでAdGuard Homeの広告ブロック機能が有効になります。

DNS設定手順

  1. AdGuard HomeのTailscale IPアドレスを確認

    bash

     docker compose exec tailscale tailscale ip -4
    
  2. Tailscale管理画面でDNS設定

    • DNS設定ページにアクセス
    • Global nameserversセクションで「Add nameserver」をクリック
    • 「Custom」を選択し、AdGuard HomeのTailscale IPアドレス(例:100.x.y.z)を入力
    • Override local DNSトグルを有効化(重要:これにより全デバイスでTailnet DNS設定が強制適用されます)

画像を表示

設定のポイント

Override local DNS の有効化: この設定により、Tailscaleに接続したデバイスがローカルDNS設定を無視し、AdGuard Homeを強制的に使用するようになります。これは重要な設定で、これを有効にしないと一部のデバイスでAdGuard Homeが使用されない可能性があります。

3. キー期限切れの無効化

DNS中断を避けるため、AdGuard Homeノードのキー期限切れを無効化することを推奨します:

  1. MachinesページでAdGuard Homeノードを選択
  2. Disable key expiryを有効化

画像を表示

フィルタリスト設定

AdGuard Homeの管理画面にログイン後、「Filters」→「DNS blocklists」で以下の推奨フィルタを追加します:

  • AdGuard DNS filter: 基本的な広告ブロック
  • EasyList: 広告ブロックの標準リスト
  • EasyPrivacy: トラッカーブロック
  • 日本語フィルタ: 日本語サイトの広告対応

動作確認

DNS動作確認

# クライアントマシンから
nslookup doubleclick.net [AdGuard HomeのIP]

# ブロックされていれば 0.0.0.0 が返される

まとめ

TailscaleとAdGuard Homeを組み合わせることで、セキュアで効果的な広告ブロック環境を構築できました。

この構成により、すべてのTailscaleデバイスで自動的に広告がブロックされ、一貫したフィルタリング体験を提供できます。ExitNodeが必要な場合は、別のノードを設定することで、DNS機能と出口機能を分離した運用が可能です。

参考リンク

肩こり対策に最適/Corne V4 Cherry 使用メモ

肩こり対策のため、分割キーボード「Corne V4 Cherry」を入手して、利用状況が安定してきたのでメモ。

キーキャップ

  • メインの黒いところはXDAプロファイル
  • 他、赤と黄色DSAプロファイル
  • 親指 1.25Uサイズはダイヤテックのサイトで購入したかまぼこ形状

最初はすべてXDAとしていたが、周辺のキーを天板面積の小さいDSAにすることでミスタイプを減らせるという個人的傾向が見られたので、変更した。

キーボードのレイアウトの考え方

  • 日本語109キーのレイアウトを基本とする
  • アルファベットとハイフンは基本のレイヤーで打てるようにする
  • アットマーク、アンダースコア、カギかっこは長押しで打てるようにする
  • WindowsとMacで利用することを考える (ChromebookとLinuxはだいたい、Windowsと同じレイアウトでOK)
  • 記号をメインで打てるレイヤーを設ける
  • 数字をメインで打てるレイヤーを設ける
  • 簡単なマウス操作とスクショなどのためのレイヤーを設ける

Layer 0 Windows向け

Layer 0

左手

  • TD(3)長押しで半角全角/短押しでESC
  • TD(0)長押しでCTRL/短押しでTAB
  • TD(1)長押しで@/短押しでa

右手

  • TD(6)長押しでセミコロン/短押しでカンマ
  • TD(7)長押しでコロン/短押しでピリオド
  • TD(4)長押しでカギかっこ「/短押しでl
  • TD(5)長押しでカギかっこ」/短押しでp
  • TD(8)長押しでLayer1へ切り替え/短押しでEnter

真ん中のRGB ToggleはバックライトのON/OFFで自分のいるLayerが0か1かわかるようにする工夫

Layer 1 MacOS向け

Layer 1

Mac本体に付属のキーボードが日本語配列でもCorne V4は英字配列と認識されるため、記号は同じように配列している。

左手

  • TD(9)長押しでCTRL+SPACE/短押しでESC
  • TD(10)長押しでオプションキー/短押しでTab

他英字長押しして記号を出す方法はLayer0と同じ考え方

Layer2 記号

Layer 2

右手親指長押しでレイヤー移動

Layer4 数字とカーソル

Layer 4

左手親指長押しでレイヤー移動

カーソルはh,j,k,lのVI方式で対応。

Layer5 マウスとよく使うショートカット

Layer 5

右手小指右下長押しでレイヤー移動

  • 右手でマウスカーソルの移動
  • 左手でホイール操作(左右ホイールがマウスについていないので便利)

右端にスクリーンショットやCTRL+ALT+DELETE、画面ロックなどよく使うものを割り当てている。今後の改善ポイント。

ホーミングキー

ホーミングキーのため、ネイルチップをはりつけ

F,Jのところに目印がついているが、ばら売りキーキャップだと目印がない。

しばらく目印なしで使ってみたが、存外あてにして指を置いていたことがわかったので、先人の教えにしたがい、DAISOでネイルチップを購入しはりつけた。

持ち運び

持ち運びにはDAISOの袋

DAISOで見かけた袋がちょうどサイズぴったりだったので、入れて持ち運んでいる。

まとめ

今のところ、楽しく使えている。肩こり対策にも良い影響があると実感している。 無線化されたものもあるみたいなので、もし定着するようならば持ち運び用に入手を検討してもいいかも。

これ以上キーが少ないとコンビネーションが増えすぎて難しいと思うので、コンパクトさとのバランスを考えるとこれが限界かな…。

【所要時間10分程度】TailscaleでVPN環境を構築する

Tailscaleとは

TailscaleとはWireguardというVPN技術をベースにつくられたメッシュ型のVPNサービスです。

参考URL 100台まで無料のVPNサービス「tailscale」、リンクだけでマシンのシェアも可能!?【イニシャルB】 - INTERNET Watch

Hamachiに似ていますね。公式サイトもHamachiの置き換えについて言及があります。 Tailscale: A modern replacement for Hamachi · Tailscale

個人的には2014年ごろHamachiを使っていたことがあります。ええ、上記の記事にあるようにゲームのためですが。

Tailscaleで気になっていたのがVPNに参加している端末の中からExitNode(インターネットへの出口)を決められるということ。 自宅PCをExitNodeにするもよし、パブリッククラウド上のサーバをExitNodeにするもよし。

サービス利用開始

サービスの利用申し込みはいたって簡単でした。上記の紹介記事どおりです。 WindowsやAndroid、iOS用のアプリもあるのでそちらの利用もいたって簡単にできるようになりました。

OCI上のインスタンスをTailscaleのVPNに参加させる

通信料に応じた課金額が少ないOCIにインスタンスを立ててTailscaleのExitNodeにしようと思います。 こちらにSSHトンネルでアクセスすることで、VPNに参加したWindowsPCにVNCでアクセスできるようにすることなどを狙っております。 また広告カットのフィルタをこちらのサーバ上に入れることで通信費の節約しようという以前も実施していた試みを別の形で実践しようとも考えております。

yourpalm.jubenoum.com

OS: Ubuntu 22.04 で環境を構築して、SSHでログインできるようにした後、以下のコマンドを実行して完了でした。あっさり。 Setting up Tailscale on Ubuntu 22.04 (jammy) · Tailscale Docs

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt-get update
sudo apt-get install tailscale
sudo tailscale up
# 初回起動時にログイン用URLが払出されるのでログインする

To authenticate, visit:

        https://login.tailscale.com/a/XXXXXXXX

tailclace upSuccess.

# いったん停止する
sudo tailscale down

# パケットフォワーディングを許可する
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

# ExitNodeとして起動する
sudo tailscale up --advertise-exit-node

ここまで設定するとTailscaleの管理ページには、ソフトをインストールして接続した機器が見えるようになっています。 ExitNodeを複数設定した上で、その時々で選択できるようですので、AWSなどの海外のリージョンにExitNodeを立てて…なんてこともできるのかな。 設定も簡単なのでいろいろ試してみたいと思います。

n8nをセルフホストする

n8nとは

ZapierやIFTTTなどと同様のノーコード・ローコードで複数の Webサービスを連結したワークフローを作成できるシステムです。 クラウドでも利用できるのですが セルフホストで使うことができるということで、GCP上で稼動させました。 公式サイトにも手順があったDockerイメージを利用する手順としています。

参考URL Docker Compose | n8n Docs

セルフホストに向けた手順

GCPでインスタンスを立ててSSHでアクセスできるようにする

GCPでインスタンスを立てることは問題なくできました。 参考URL Google Compute EngineのインスタンスにSSH接続する | virtualiment

GCP内にDockerイメージをたてて起動する

古いdockerをアンインストールして、新しいdockerをインストールする

Docker Compose | n8n Docs

n8nのサイトで紹介されている手順は「ubuntu」前提だったので、少々はまった。 GCPで起動するLinuxインスタンスは「debian」だったので一部変更する必要あり。

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

docker用のディレクトリを作成して、必要なファイルを作成し起動

mkdir docker
cd docker
mkdir docker-n8n
cd docker-n8n
vi docker-compose.yml
vi .env
sudo mkdir /root/n8n
sudo chmod 777 /root/n8n
sudo docker compose up -d

docker-compose.yml

version: "3.7"

services:
  traefik:
    image: "traefik"
    restart: always
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${DATA_FOLDER}/letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.n8n.tls=true
      - traefik.http.routers.n8n.entrypoints=web,websecure
      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge
      - traefik.http.middlewares.n8n.headers.SSLRedirect=true
      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000
      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true
      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true
      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
      - traefik.http.middlewares.n8n.headers.STSPreload=true
      - traefik.http.routers.n8n.middlewares=n8n@docker
    environment:
      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
      - ${DATA_FOLDER}/.n8n:/home/node/.n8n

.env

# Folder where data should be saved
DATA_FOLDER=/root/n8n/

# The top level domain to serve from
DOMAIN_NAME=<your own domain>

# The subdomain to serve from
SUBDOMAIN=n8n

# DOMAIN_NAME and SUBDOMAIN combined decide where n8n will be reachable from
# above example would result in: https://n8n.example.com


# Optional timezone to set which gets used by Cron-Node by default
# If not set New York time will be used
GENERIC_TIMEZONE=Asia/Tokyo

# The email address to use for the SSL certificate creation
SSL_EMAIL=<your email adress>

ドメインを設定する

Type: A
Name: n8n (or the desired subdomain)
IP address: <IP_OF_YOUR_SERVER>

はまったポイント

自分のドメインなのに「偽のサイトにアクセスしようとしています」

参考URL 「偽のサイトにアクセスしようとしています」が自分のサイトで表示されたらすること|SLOPOND

Search Consoleにログインして必要な対応を行なったら問題なくアクセスできました。

3年かけてコツコツ構築してきた在宅ワークスペース

コロナ禍からオフィスに出社せず、自宅からの業務をすることが増えましたが、3年かけた現状ここまで環境が整備されてきました。 現状を残すとともに要件や制約事項を満たすのによりよい方法があれば考えたいと思っているので整理のためにメモを残します。

自宅のワークスペース 2023.08.09

環境整備の要件

  • 仕事、プライベートで用いる複数のマシンがあるため、切り替えを容易にしたい
    • 異なるマシンであるが、用いるキーボードやマウス、ディスプレイ、ヘッドセットなどは同一のものとしたい
    • 各マシンの主な用途は以下の通り。いずれのマシンもType-Cによる映像、音声の出力が可能である。
      • Windows: プライベート → ゲーム、動画視聴など
      • Chromebook: プライベート → 文書作成、Linuxでの作業など
      • Mac: 業務用 → アプリ開発、画像編集など
  • iPhoneやiPadなどのタブレットの充電を容易にしたい
  • 会議出席時にリラックスしたくなる時があるのでケーブルレスのヘッドセットを使いたい
  • ヘッドフォン、ヘッドセットなどの充電は容易にしたい
  • ゲームや動画視聴、Udemyなどの研修を受講するときはヘッドホンよりはスピーカー派なのでスピーカーも置きたい
    • 可能であれば、それなりにいい音で聴きたい
  • 普段はパソコン仕事が多いが、メモやアイデア出しは紙のノートでやっているので、ノートを広げられるスペースは確保したい
  • 作業に必要な明るさは確保したい
  • 飲み物を飲みながら仕事をしたいが机上にこぼす危険度を下げたい
  • 可能であれば、窓から外が見えるとうれしい
  • 可能であれば、エアコンが効く場所で仕事がしたい

環境整備の制約

私のワークスペースを実現するにあたり、同居人たる家族から提示された制約事項(家族の希望なので当然満たしたい)は以下のとおり

  • カメラオンのオンライン会議時には家の様子が見えなくなるようにしてほしい
  • ケーブル類は台所から見たときに目立たないようにしてほしい
  • 大きめのフィギュア類は置かないこと

要件への対応

切り替えを容易にしたい

デスクの裏側 Anker PowerExpand 9-in-1 USB-C PD Dock ドッキングステーション

裏側はごちゃっとしておりますが、こちらのドッキングステーションに、各環境共通して使いたいものを接続しています。

  • キーボード
  • マウス
  • DAC
  • ヘッドセットのコネクタ
  • ディスプレイ

で、一番上に見えるType-CケーブルをWindows、Mac、Chromebookで接続変更すれば、そのまま使えるという算段です。 これで物理的な環境切り替えがグッと楽になりました。

ケーブルレスのヘッドセット

ヘッドフォンホルダーは便利

Logicoolのヘッドセットは非常に軽くて装着感もよいので、会議などで一番よくつかっています。 ケーブルレスなので、会議で自分がしゃべるターンでなければ、ソファに寝転んで対応できるし…。

Logicool 軽い

音楽を聴きたいときにはSonyを、iPadで動画を見たくなったときは、声をかけられても気がつけるように Shokzの骨伝導イヤフォンを使うというのがおおざっぱな使いわけかたです。

それなりにいい音でスピーカー

DACとスピーカー、そして小物

コスパすごいと評判のCreative Pebbleですが、確かにこれ インシュレーターがわりに使っているのは100均で購入した謎の板なのですが、これの本来の用途はなんだろうと思っています。

明るさの確保

夜の状況 Chromebook
BenQ ScreenBar スクリーンバー モニター 掛け式ライト【デスクライト monitor lamp モニターライト 】

夜になっても、手元を明るく照らし、ディスプレイも見やすくしてくれるモニター掛け式ライト。 明るさも自動調整してくれるのでとても快適です。

ノートを広げられるスペースの確保

直接置くとスペースを食うものは浮かせてしまうのがスペース確保につながります。ディスプレイとノートパソコン本体は浮かせてしまうのがよくて、空いた下スペースには物が置けます。

飲み物を飲みたいが机上にこぼす危険度を下げたい

IKEAのコースターを左手に配置しています。 通常のマグカップを置くには少し深すぎるので、同じくIKEAのコルクのコースターを敷いています。

制約への対応

ケーブルを目立たないようにする

テーブルの裏側

大きめのフィギュアは置かないこと

しろたん「シロック」と燭台切光忠こけし

しろたんと燭台切光忠のこけしを配置して癒やしとしています。

自分のアイコンはヘッドフォンなので「シロック」を配置した。 https://item.rakuten.co.jp/sirotan/361-08921s/

刀剣乱舞ONLINE ミニこけし 燭台切光忠 | 刀剣乱舞万屋本舗 https://touken-yorozuya.com/item/minikokeshi_02/

カメラオンのオンライン会議の時に家を見せない

仕切りありの状態

こちらの仕切りをオンライン会議や英会話の際に設置しております。 普段は以下のように目立たない場所に置いています。

仕切り収納

ベースとなる設備と機材

キーボードとマウス

キーボードとマウス

キーボードは家の中で使うことを考慮して、打鍵音がうるさくない軸を選んでいます。 他にiPadのタブレットを同時に使うことを考慮して、マウス・キーボードともBluetoothで接続変更可能なものを選んでいます。 マウスは机の上を広く使いたいために、トラックボールを主に使っています。

ディスプレイ

仕事で使うディスプレイはアンチグレアがよいですね。EIZOのディスプレイはさすがの品質です。 目も疲れづらいです。

デスク

IKEA ローヴァロール コンソールテーブル https://www.ikea.com/jp/ja/newsroom/range-news/20200831-ravaror-pub39d2f927

※テーブル下のワゴンとボックス、デスク左側のライトも同じコレクションから買いましたが、今では入手できない…

以上です。


yourpalm.jubenoum.com

3年前はこんな状態でした。家の中に自分の居場所がある状態というのを強く意識するようになったと思います。