2026年8月22日土曜日

Markdown と図を 1 つのファイルにまとめるエディタ「MaCa Editor」

MaCa Editor は、Markdown と図を Markdown Package Specification(mdpkg 仕様)に則った .mdpkg というひとつのファイルにまとめ、を閲覧・編集するためのデスクトップエディタです。 Markdown 文書の編集と SVG ベースの作図を 1 つのアプリケーションで行い、文章・画像・図をまとめて管理できます。

このツールが解決する問題

通常、文章と図は別々のツールで作ることが多いです。文章は Markdown エディタ、図は draw.io や Excalidraw などで作成し、最後に画像として貼り付けます。

例えば、技術資料を書いているときに、図を直したくなることがあります。 そのたびに、図ツールを開いて編集し、画像として書き出し、Markdown の images/ フォルダに置き直して、本文のリンク先が古い画像のままになっていないかを確認する、という手順を繰り返していました。 文章の修正が 1 行なのに、図の更新に数分かかることもあります。 しかも、書き出した画像と Markdown のリンクが別々に管理されているため、どちらかを更新し忘れると、資料全体の整合性が崩れます。

MaCa Editor は、この「文章と図を別々に管理する」手間を減らすことを目的としています。.mdpkg というパッケージ形式の中に、Markdown 文書・画像・SVG 図をまとめて保持し、1 つのアプリケーションで編集できるようにしています。

なぜ 1 つのアプリケーションにまとめるのか

文章と図を同じパッケージに保持すると、以下の利点があります。

  • 参照の整合性が保たれる: 図や画像のリンクがパッケージ内の相対パスで管理され、ファイルの移動や欠落を防ぎやすい
  • 編集の往復が減る: プレビュー上の図をクリックすると Drawing Editor が開き、その場で再編集できる
  • 配布が単純になる: .mdpkg 1 ファイルで文章・画像・図をまとめて持ち運べる

冒頭で挙げた「図を直すたびに書き出しと貼り直しを繰り返す」体験は、この設計でどのように改善されるのでしょうか。

まず、図の書き出しと貼り直しという手順自体がなくなります。 図は SVG としてパッケージ内に保持され、Markdown からはパッケージ内の相対パスで参照されます。 図を編集するときは、プレビュー上の図をクリックして Drawing Editor を開き、その場で書き出しなしに更新できます。 文章の修正が 1 行でも図の更新に数分かかる、という手間は、書き出しと貼り直しの往復が消えることで解消されます。

また、画像とリンクが別々に管理されていたために更新し忘れて整合性が崩れる問題も、構造上起こりにくくなります。 図とそれを参照する Markdown が同じパッケージにあり、リンクは相対パスで解決されるため、図を更新したときにリンク先を探し直す必要がありません。 ファイルの移動や欠落も、パッケージ内で管理されることで防ぎやすくなります。

つまり、この設計は「図の更新にかかる手間」と「図と文章の整合性を保つ手間」の両方を、1 つの場所で編集できるようにすることで削減しています。

主な機能

主な機能は以下の通りです。

  • Markdown の編集とプレビュー
  • ファイルと画像の管理
  • Drawing Editor
  • PlantUML・Mermaid

名称の由来

名称の MaCa は、Markdown と Canvas に由来します。Markdown による文章編集と、Canvas(描画領域)による SVG 作図を組み合わせた設計であることが、名称に表れています。

デモ動画

まとめ

MaCa Editor は、Markdown 文書と SVG 図を 1 つの .mdpkg パッケージにまとめて管理できるデスクトップエディタです。 文章・画像・図を同じ場所で編集・管理したい場合に適しており、図を多用する人にとってうれしいアプリケーションとなっています。

2026年8月13日木曜日

WSL2 上で llama.cpp をビルドする

前回 は、 DGX Spark 向けにビルドしましたが、今回は WSL2 上でビルドする手順。

今回は初めからデーモン化する前提で進めていく。

前提

  • Windows: Windows 11 Pro 25H2 ビルド 26200.8524
  • グラフィックボード: NVIDIA GeForce RTX 4070 Ti SUPER (16 GB)
  • WSL2: Ubuntu 24.04 LTS

前提パッケージのインストール

llama.cpp 版をビルドするために必要なパッケージをインストールする。

sudo apt update
sudo apt install -y git build-essential cmake libssl-dev nvidia-cuda-toolkit

llama.cpp 実行ユーザーの追加

llama というシステムユーザーを追加する。

sudo useradd \
  --system \
  --home-dir /opt/llama \
  --shell /usr/sbin/nologin \
  llama

llama.cpp 用のディレクトリ作成

sudo mkdir /opt/llama
sudo chown llama:llama /opt/llama

llama.cpp ソースコードのクローン

いつものように git clone する。

cd /opt/llama
sudo -u llama git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

llama.cpp ビルド

NVIDIA のグラボなので、それ用の make コマンドを叩く。

sudo -u llama cmake -B build-cuda \
      -DGGML_CUDA=ON \
      -DCMAKE_BUILD_TYPE=Release \
      -DLLAMA_CURL=ON \
      -DLLAMA_OPENSSL=ON
sudo -u llama cmake --build build-cuda -j"$(nproc)" --target llama-server

動作確認

とりあえず普通に動くかを確認。

sudo -u llama /opt/llama/llama.cpp/build-cuda/bin/llama-server -hf unsloth/DeepSeek-V4-Flash-0731-GGUF:Q8_0

OK.

systemd 用のファイル作成

cat << 'EOF' | sudo tee /etc/systemd/system/llama-server.service
[Unit]
Description=llama.cpp OpenAI-compatible inference server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=llama
Group=llama
WorkingDirectory=/opt/llama/llama.cpp/build-cuda/bin

ExecStart=/opt/llama/llama.cpp/build-cuda/bin/llama-server \
  -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-IQ3_XXS \
  --gpu-layers all \
  --no-mmap \
  --host 0.0.0.0 \
  --port 11434

Restart=on-failure
RestartSec=5

TimeoutStartSec=0
TimeoutStopSec=120
KillSignal=SIGINT

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

設定反映

sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server

以上。

2026年8月6日木曜日

DGX Spark 1 台で DeepSeek V4 Flash 0731 を動かす(llama.cpp 版)

前回 は DwarfStar で DeepSeek V4 Flash 0731 を動かしたが、今回は llama.cpp 版で動かしてみる。

サーバーの安定性が DwarfStar よりも高いらしいので、llama.cpp 。

前提

  • マシン: ASUS Ascent GX10 GX10-GG0006BN 90MS0371-M00060 (1TB)
  • Ollama, DwarfStar のデーモンを止めた後から

前提パッケージのインストール

llama.cpp 版をビルドするために必要なパッケージをインストールする。

sudo apt update
sudo apt install -y git build-essential cmake libssl-dev

llama.cpp ソースコードのクローン

いつものように git clone する。

cd ~/project
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp

llama.cpp ビルド

DGX Spark なので、それ用の make コマンドを叩く。

cmake -B build-cuda -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=121 \
      -DCMAKE_BUILD_TYPE=Release -DLLAMA_CURL=ON -DLLAMA_OPENSSL=ON
cmake --build build-cuda -j"$(nproc)" --target llama-server llama-cli llama-bench

ほんとうは llama-server だけで良いのだけど、参考にしたサイト通りに全部ビルドしちゃった。

モデルのダウンロード

前回 のモデルを使うのでダウンロードは省略。

サーバー起動

OpenAI API 互換サーバーを起動する。

./build-cuda/bin/llama-server --host 0.0.0.0 --port 11434 --no-mmap -m ~/project/ds4/gguf/DeepSeek-V4-Flash-IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8-chat-v2-imatrix-0731.gguf

結構長い時間待つ感じ。成句すると以下のような出力がされる。

0.00.300.436 I srv    load_model: loading model '/home/mikoto/project/ds4/gguf/DeepSeek-V4-Flash-IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8-chat-v2-imatrix-0731.gguf'
8.00.852.448 I srv    load_model: initializing, n_slots = 4, n_ctx_slot = 1048576, kv_unified = 'true'
8.00.861.742 I srv          init: chat template supports preserving reasoning, consider enabling it via --reasoning-preserve
8.00.861.881 I srv  llama_server: model loaded
8.00.861.884 I srv  llama_server: listening on http://0.0.0.0:11434

クライアント起動

OpenAI API 互換クライアントで接続確認。 OK.

> C:\Java\jdk-25\bin\java.exe -jar ..\project\rei\target\rei-0.0.1-SNAPSHOT.jar
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by org.sqlite.SQLiteJDBCLoader in an unnamed module (jar:nested:/F:/project/rei/target/rei-0.0.1-SNAPSHOT.jar/!BOOT-INF/lib/sqlite-jdbc-3.51.3.0.jar!/)
WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module
WARNING: Restricted methods will be blocked in a future release unless native access is enabled

AI Shell
通常入力は chat として扱います。/exit で終了します。
複数行入力: 複数行ペースト対応。行末に \\ を付けるか、Ctrl+J でも改行できます。
/paste で確実な複数行入力モード(終了は単独行の . )
22:15 deepseek-v4-flash> こんにちは!!!!!

 User
こんにちは!!!!!


=== thinking ===
The user greeted me with "こんにちは!!!" (Hello!!!!!). This is a simple greeting. I should respond naturally in Japanese. Looking at the memory, there was a similar greeting earlier and the assistant responded with "こんにちは!? 何かお手伝いできることはありますか?"

I'll respond similarly. No tools needed.
=== answer(23.7 s) ===
こんにちは!? 今日もお手伝いできることがあれば、何でも言ってくださいね!

models には対応していなさそう。

llama-server の daemon 化

実行ユーザーの追加

llama というシステムユーザーを追加する。

sudo useradd \
  --system \
  --home-dir /opt/llama \
  --shell /usr/sbin/nologin \
  llama

llama-server の配置

llama 用のディレクトリを作成し、ビルドした llama-server を配置する。

sudo cp -a ~/project/llama.cpp/build-cuda /opt/llama
sudo chown -R llama:llama /opt/llama

systemd ユニットを作成

作成していく。

cat << 'EOF' | sudo tee /etc/systemd/system/llama-server.service
[Unit]
Description=llama.cpp OpenAI-compatible inference server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=llama
Group=llama
WorkingDirectory=/opt/llama/bin

ExecStart=/opt/llama/bin/llama-server \
  -m /opt/ds4/ds4flash.gguf \
  --gpu-layers all \
  --no-mmap \
  --host 0.0.0.0 \
  --port 11434

Restart=on-failure
RestartSec=5

TimeoutStartSec=0
TimeoutStopSec=120
KillSignal=SIGINT

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

設定反映

sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server

以上。

参考資料

変更履歴

日付 変更内容
2026/8/5 新規作成
2026/8/6 HTTPS 用フラグを追加