名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

EM Night Talks – After Conference に参加した

(今思うとイベントに年号入れていてほしい?気もする)

イベントページ

EM Night Talks – After Conference https://cybozu.connpass.com/event/383434/ #emnight_talks

メモ

電車遅延やQRコードの表示に戸惑い、10分ほど遅刻しました。一番最初の発表の終わり頃から聞いていました。

見つけた資料は次のとおり

x.com

x.com

x.com

  • チームが大きくなるにつれてコンテキストの共有や意思決定の経緯がわからなくなる
    • 対策としての DesignDoc, ADR
  • 組織がでかいと失敗しずらい?
    • 対策としてのミニプロジェクト
    • ミニプロジェクトでは失敗するかも?な挑戦を短い期間でやっていく
    • マネージャーとしてふるまいを観察する、どうマネジメントするかを見る
    • DACIフレームワーク
    • 経験学習の場としての提供、経験して学ぶことは多い
  • AI が入り込んでいる開発組織チームのあり方
    • AIが高速化している、人間のレビューがボトルネックになりつつある
    • AIにはSpec駆動(SDD)で進めてもらいつつ、レビューの高速化が必要
    • AIで95点くらいのものは作れる、しかしそこからのラストワンマイルの作り込みは人間の力の見せどころ
    • チームサイズを小さくして意思決定なども高速化する
  • プレイングマネージャーの観察不足に関する課題
    • 開発と並行していて、向き合えていなかった
    • 観察ログをつけておく
    • 1on1を待たずしてどんどんフィードバックする
    • 余白を持つという意識が余白を生む。余白を持ってメンバーの行動をよく観察しよう
  • EMの思考の可視化: EMラジオ
    • EMは何をしているのかわからず、何を考えてるのか聞かれがち
    • 決定事項の共有が多く、背景や過程の共有が不足している
    • EMが雑に話すEMラジオをしてみて、考えている過程自体を共有している
    • 継続が大事

下記は雑感です。

  • 内容が多岐にわたっていて面白かった
    • how の手段が非常に多い
    • 経験豊富だからできる打ち手、なのかも
  • チームサイズが小さくなってAI Agentとの協業が増える話
    • EMConf でも同じ話があった
    • そうするとリーダー、サブリーダーの数が増えていくはず
    • 今メンバーで働いている人に関係する日も近いのではないかと思った
    • 他方、リーダーやサブリーダーの採用コスト、人件費はどのように変化するのかが気になるところ

イベント楽しかったし、学び多くて良かったです!

ollama + qwen2.5-coder:3b を使って neovim でコードサジェストしてみる

Marp で書いていたものの移し替え。各要素については使い始めたばかりなので超雑な理解です。

やったこと

  • ollama を Podman で建てる
  • qwen2.5-coder:3b を ollama にインストール
  • neovim でコードサジェスト

ollama ってなに

  • ローカルで大規模言語モデルを動かすためのツール
  • Podman や Docker でコンテナを管理
  • モデルのインストールや管理が簡単
  • 公式ページ: https://ollama.com/

qwen2.5-coder:3b ってなに

  • Qwen 2.5 Coder は、コード生成に特化した大規模言語モデル
  • B はモデルパラメーターを表す
  • 今回は CPU しか乗ってない 8GB RAM の環境で動かすため、3B を選択
  • 公式ページ: https://ollama.com/library/qwen2.5-coder

podman で ollama を建てる

なんかこんなの

クリックすると展開されます

services:
  ollama:
    image: docker.io/ollama/ollama:latest
    ports:
      - "11434:11434"
    volumes:
      - ollama-data:/root/.ollama

  ollama-pull:
    image: docker.io/ollama/ollama:latest
    depends_on:
      - ollama
    environment:
      - OLLAMA_HOST=http://ollama:11434
    entrypoint: ["/bin/sh", "-c", "sleep 5 && ollama pull qwen2.5-coder:3b"]
    restart: "no"

volumes:
  ollama-data:

neovim からの接続

  • milanglacier/minuet-ai.nvim を利用した
  • ollama で設定されているモデルに合わせて切り替えるコードが無駄に入っている(7b, 3b, 1.5b など切り替える)
    • 検証のためフォールバックするコードが書かれた
    • 3b が動かないときは 1.5b を使うようにしている
    • 7b が動かなかったのであとから削除した

こんな感じ

クリックすると展開されます

  -- Ollama によるコード補完(virtual-text フロントエンド)
  -- リモートの Ollama が動いていなければ読み込まない
  -- 3b > 1.5b の優先順でモデルを選択する
  {
    "milanglacier/minuet-ai.nvim",
    dependencies = { "nvim-lua/plenary.nvim" },
    cond = function()
      local handle = io.popen("curl -s -o /dev/null -w '%{http_code}' http://localhost:11434/api/tags 2>/dev/null")
      if not handle then return false end
      local code = handle:read("*a")
      handle:close()
      return code == "200"
    end,
    config = function()
      local ollama_base = "http://localhost:11434"

      -- Ollama にプルされているモデル一覧を取得
      local handle = io.popen("curl -s " .. ollama_base .. "/api/tags 2>/dev/null")
      if not handle then return end
      local result = handle:read("*a")
      handle:close()

      local ok, data = pcall(vim.json.decode, result)
      if not ok or not data or not data.models then return end

      local model_set = {}
      for _, m in ipairs(data.models) do
        model_set[m.name] = true
      end

      -- 優先順: 3b > 1.5b
      local model_name
      if model_set["qwen2.5-coder:3b"] then
        model_name = "qwen2.5-coder:3b"
      elseif model_set["qwen2.5-coder:1.5b"] then
        model_name = "qwen2.5-coder:1.5b"
      else
        return
      end

      require("minuet").setup({
        provider = "openai_fim_compatible",
        n_completions = 1,
        context_window = 1024,
        virtualtext = {
          auto_trigger_ft = { "python", "markdown", "lua" },
          keymap = {
            accept = "<A-A>",
            accept_line = "<A-a>",
            accept_n_lines = "<A-z>",
            prev = "<A-[>",
            next = "<A-]>",
            dismiss = "<A-e>",
          },
        },
        provider_options = {
          openai_fim_compatible = {
            api_key = "TERM",
            name = "Ollama",
            end_point = ollama_base .. "/v1/completions",
            model = model_name,
            optional = {
              max_tokens = 128,
              top_p = 0.7,
              temperature = 0.5,
            },
          },
        },
      })
    end,
  },

サジェスト

  • Alt + [ でサジェスト
  • Alt + A で適用

実際の画面

結果

  • なんかびみょい
  • 3b だとコードの理解が浅いのか、あまり賢くない
  • たまに合ってるコードは出てくることがある
  • 手元の CPU しかないマシンで LLM 動くだけでもすごいといえばすごい

まとめ

  • ollama を使うとローカルで LLM を動かせる
  • neovim でコードサジェストもできる
  • 実用するのであればいいモデルを使おう
  • 雑なやり取りなら CPU でも動くモデルでも行けるケースはありそう

セルフホストで動くmiroみたいなやつの調査

ふりかえりでビジュアライズされたデータ配置をしたいというニーズが自分の中にあり、探していた。

figma でも良かったかもなー miro は無料枠が狭い印象なので避けてみた。

調査サマリ

AI に探していただいた。こんなことを聞いてたらしい。自分の思考性が出ている。

Fun Done Learn をやりたいんだけど、無料でできるものとかってありますか? Miro は有料なので、候補から外しています。

ローカルでサーバー立ててやれるようなやつありますか? SaaS型サービスだと登録が面倒ですし、データの取り扱いも心配があります。 また日本語のサポートも意識してほしいポイントです

Fun Done Learn は2次元的に弁図に配置するので、カラム型の配置だと意味が異なってしまうかな。 2次元的な配置が可能なレトロスペクティブツールはありませんか? Miro みたいなやつ

調べてまとめた結果がこちら

Fun Done Learn 向けセルフホスト可能なホワイトボードツール比較

  • Excalidraw — 手描き風デザインのホワイトボード。Miro代替として最も人気が高い
  • AFFiNE — Notion + Miro 的なオールインワンワークスペース。Edgelessモードでホワイトボードとして使える
  • draw.io (diagrams.net) — 定番のダイアグラムツール。デスクトップ版はオフラインで完全ローカル動作
  • Spacedeck Open — メディアを自由配置できるホワイトボード。Nextcloud統合あり |項目 |Excalidraw|AFFiNE |draw.io |Spacedeck Open| |---------|----------|--------|----------|--------------| |2D自由配置 |◎ |◎ |◎ |○ | |リアルタイムコラボ|○(要追加設定) |◎ |× |○ | |セルフホスト容易さ|○ |○ |◎ |△(開発停滞) | |日本語対応 |テキスト入力のみ |UI対応あり |UI対応あり |× | |ライセンス |MIT |AGPL-3.0|Apache 2.0|AGPL-3.0 |

Excalidraw, AFFiNE あたりが良さそうだなと思ったので、 Excalidraw を使ってみた。

Excalidraw, こんな感じになる

いきなり各画面に飛ばされるのでびっくりするものの、直感的でシンプルな機能のみが提供されているのでわかりやすい。 背景の YWT みたいなものは私が書いたものだが、すごく手書き風。

画像のアップロードもできるのでテンプレートは画像から読み込んで見るのがいいのかも?とはちょっと思いました。

またマウスやトラックパッドなどの自由度が高いマウスインターフェースのほうが操作しやすいのかなとと思いました。 私の家には大きめのディスプレイがあるので十分使いやすかったです。

AFFiNE を使うのはまた今度。