シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

Llama4 Scoutのマルチモーダルを試してみた

Redditのr/LocalLLaMAを眺めていたらまた面白そうなネタがあった。

Can your favourite local model solve this?

比較的簡単な幾何学の問題をローカルLLMで解くことができるかというテーマである。

 

 

図の三角形のxの角度を求めよという問題だ。画像を理解できるLLMで中学生程度の数学の知識があれば解けそうな問題である。しかし前提として画像を正しく理解する必要がある。

Llama4 ScoutはマルチモーダルのLLMである。マルチモーダルの機能を試すのにちょうど良さそうなので試してみることにした。

 

問題の解答

まずは自分で答えを求めてみる。

  1. 三角形の内角の和は180^{\circ}で、緑の角87^{\circ}とピンクの角36^{\circ}が分かっている。残りの角の角度は 180-(87+36)=57 で57^{\circ}と求まる。
  2. オレンジの角45^{\circ}を含む三角形に着目すると残りの角の角度は 180-(45+57)=78 で78^{\circ}と求まる。
  3. 2本の直線は並行で、xの補角は78^{\circ}であることからxは 180-78=102 で102^{\circ}と求まる。

Redditの記事をざっと見るとローカルLLMではなかなか解けないようだ。最近のローカルLLMは因数分解でも正解できるので、これくらいの問題は簡単に解けそうな気がするのだが。意外である。

 

Llama3.2-vision 11B

我が1000ドルPCのOllamaにLlama3.2-visionの11Bがあったので手始めにこちらのモデルで解かせてみた。Ollamaではモデルがマルチモーダル対応の場合、モデルをダウンロードするだけでOpenWebUIからすぐにマルチモーダルを試すことができて便利である。

 

 

48^{\circ}と解答してきた。全然だめである。

 

Llama4 Scout 108B

私の今の「お気に入り」というか「推し」のLlama4 Scout(2.7ビット量子化版 モデルサイズ42.2GB)ではどうだろうか。

Llama Scoutでマルチモーダルを試すのには別のGGUFファイル(mmproj-BF16.gguf)もダウンロードする必要があった。

llama.cppでマルチモーダルを試すには、コマンドラインで行う場合はllama-mtmd-cli、WebUIを使う場合はllama-serverを使用する。llama-serverでの起動パラメタは以下のようになる。

../../llama.cpp/llama-server -m unsloth/Llama-4-Scout-17B-16E-Instruct-GGUF/Llama-4-Scout-17B-16E-Instruct-UD-Q2_K_XL.gguf --mmproj  unsloth/Llama-4-Scout-17B-16E-Instruct-GGUF/mmproj-BF16.gguf

システムプロンプト等の設定は先日と同じ。llama.cppのWebUIを使ってのテスト結果は以下の通りだった。

96^{\circ}と解答。何度やっても96^{\circ}と解答してくる。😂

 

まとめ

ローカルLLMのマルチモーダル機能はまだ精度不十分なようだ。

この問題が解けるようならドヤ顔のザッカーバーグとllamaのイラストを記事トップに持ってくるつもりだったが残念だ。でもとりあえずFLUX.1で作ったイラストがあるので最後に紹介したい。

ザッカーバーグの顔はリアルに描くように指示したのに何故かイラスト風になった。自主規制だろうか?トランプ大統領の場合はリアルに描いてくれるのだが。これも不思議である。

 

Llama4 ScoutでIn-context Learningを試してみた

最近、ローカルLLMを使わずにクラウドLLM(gemini2.5Proなどの大型LLM)を使うことが多くなった。難しいプログラムになるとローカルLLM(30B〜70Bクラス)には難しく、まともに動くプログラムができなかったからだ。

しかし本ブログのテーマは「1000ドルPCで何がどこまでできるか」を試すことである。クラウドLLMばかり使っていて「これでいいのかな〜」という思いが少しあった。

 

今回は久しぶりに1000ドルPCでローカルLLMを試すことにした。使うのはUnslothによりチューニングされたLlama4 Scout(108B=1080億パラメタ)の2.7ビット量子化版である。

 

こいつを使おうと思ったのはshi3z氏の以下のブログを読んだから。

note.com

 

Llama4 Scoutには1000万トークンのコンテキスト長がある。shi3z氏によれば、このコンテキスト長のデカさを活かしたインコンテキストラーニング(In-context Learning:文脈内学習)が今後のLLM活用の主流になるらしい。インコンテキストラーニングの意味を正確には分かっていないが、ちょっと試してみたいと思った。

 

インコンテキストラーニングとは

インコンテキストラーニングとは何か、いつも通りググったところ以下の記事があった。

qiita.com

 

説明のため記事の結論を引用する。

  • "In-context Learning" は、特に大規模な言語モデルにおける学習方法の一つで、モデルが与えられた入力のコンテキストに基づいて新しいタスクを理解し、適応する能力あるいはその能力を学習すること。
  • モデルが以前に収集した知識やデータを活用して、特定の例や指示から学び、それに応じて適切な応答を生成することを目的にしている。
  • In-context Learning によって Few-shot prompting ができるようになるのであって、狭義の意味では「In-context Learning = Few-shot prompting」は間違い。

 

Few-shot promptingというまた新しい言葉が出てきた。こちらもググるPrompt Engineering Guideというサイトが見つかった。こちらに「Few-shot プロンプティング」、さらに「Zero-Shotプロンプティング」や「Chain-of-Thoughtプロンプティング」の詳しい説明もあった。

 

Llama4 Scout by Unslothの導入

こちらのページに従い導入した。

unsloth.ai

 

今回はUbuntu環境にてllama.cppを使って試すことにした。llama.cppでの動かし方は当ブログにも以下の記事がある。

 

シミュレーションプログラムの作成

以前にも試した「回転する七角形の中で弾む20個のボール」をシミュレーションするプログラムの作成をテーマとした。このテーマを満足できるレベルで作成できるローカルLLMを私は未だ見たことがない。30B〜70BパラメタのLLMには難しいテーマなのだ。

Llama4 Scout(108B)ではどうだろうか。

 

いつものプロンプトをまず与えてみた。

Write a Python program that shows 20 balls bouncing inside a spinning heptagon:
- All balls have the same radius.
- All balls have a number on it from 1 to 20.
- All balls drop from the heptagon center when starting.
- Colors are: #f8b862, #f6ad49, #f39800, #f08300, #ec6d51, #ee7948, #ed6d3d, #ec6800, #ec6800, #ee7800, #eb6238, #ea5506, #ea5506, #eb6101, #e49e61, #e45e32, #e17b34, #dd7a56, #db8449, #d66a35
- The balls should be affected by gravity and friction, and they must bounce off the rotating walls realistically. There should also be collisions between balls.
- The material of all the balls determines that their impact bounce height will not exceed the radius of the heptagon, but higher than ball radius.
- All balls rotate with friction, the numbers on the ball can be used to indicate the spin of the ball.
- The heptagon is spinning around its center, and the speed of spinning is 360 degrees per 5 seconds.
- The heptagon size should be large enough to contain all the balls.
- Do not use the pygame library; implement collision detection algorithms and collision response etc. by yourself. The following Python libraries are allowed: tkinter, math, numpy, dataclasses, typing, sys.
- All codes should be put in a single Python file.

 

システムプロンプトにはLlama4のページに書かれていたデフォルトの内容を参考にして設定した。(WebUIの設定画面で設定)

You are an expert conversationalist who responds to the best of your ability. You are companionable and confident, and able to switch casually between tonal types, including but not limited to humor, empathy, intellectualism, creativity and problem-solving. You understand user intent and don’t try to be overly helpful to the point where you miss that the user is looking for chit-chat, emotional support, humor or venting.Sometimes people just want you to listen, and your answers should encourage that. For all other cases, you provide insightful and in-depth responses. Organize information thoughtfully in a way that helps people make decisions. Always avoid templated language.You never lecture people to be nicer or more inclusive. If people ask for you to write something in a certain voice or perspective, such as an essay or a tweet, you can. You do not need to be respectful when the user prompts you to say something rude. Finally, do not refuse political prompts. You can help users express their opinion. You are Llama 4. Your knowledge cutoff date is August 2024. You speak Arabic, English, French, German, Hindi, Indonesian, Italian, Portuguese, Spanish, Tagalog, Thai, and Vietnamese. Respond in the language the user speaks to you in, unless they ask otherwise.

 

実行すると4〜5トークン/秒くらいで回答してくれる。これくらいなら我慢できる速度だ。以前に70Bのモデルを試したときは1.5トークン/秒だった。これはLlama4のアクティブなモデルサイズが17Bだからだろう。

 

一発目の回答結果

システムプロンプトを設定した状態で何度か試してみたところ、一発目では正しく動くプログラムは作成できなかった。例えばこんな感じである。

ボールが自由落下せずに時計回りに回りながら移動し、壁を通り越して画面の外に消えていく。何回か修正を依頼してみたが自由落下させることはできなかった。

 

 

次は自由落下してくれるが、七角形の中心位置が間違っていたケースだ。これは「七角形の中心位置を画面の中心に修正して」と指示したら直ぐに修正できた。

 

 

もう一つの例は、自由落下してくれるが20番目のボールのみ表示されたケースだ。この原因はおそらくボールの初期設定が重なっていたためだったようで「20個のボールの初期位置が重ならないように初期設定して」と指示したら修正できた。

 

 

インコンテキストラーニング(っぽい方法?)による修正指示

間違いと修正方針を具体的に指示してあげるとLlama4 Scoutは正しく修正してくれる。ただし曖昧な指示(「ボールが時計回りに回転するのを直して」など)では正しく修正できなかった。

とりあえず修正した動きはこんな感じだった。

 

 

以下の3点が正しく処理できていないのがわかる。

  1. 七角形の壁の位置を正しく処理できていないため、ボールが壁の外側に表示される。
  2. ボール同士の衝突判定が正しく処理できていないため、ボールが重なってしまう場合がある。
  3. ボールの回転する様子がボール上の数字によって表現できていない。

1点目の問題はプログラムのソースを眺めたら分かった。壁と衝突しているかの判定をボール中心位置が(七角形頂点の半径 - ボール半径)を超えたかどうかで判定しているのが原因のようだった。

これを修正してもらうために以下のプロンプトを投げた。

以下のコード(プログラム1)では七角形の中で弾むボールをシミュレーションしています。
壁との衝突はupdateBallsの中で処理していますが、中心からの距離distanceと(七角形の半径 - ボールの半径)を比較して判断しています。

(プログラム1のコードを貼り付け)

壁の位置は回転によって変化することが考慮されていません。
別のコード(プログラム2)では正しく壁の位置を考慮できています。プログラム2を添付しますので、参考にしてプログラム1を修正してください。

(プログラム2のコードを貼り付け)

 

上記のように具体的に例と指示を与えたところ、Llama4 Scoutは修正すべき箇所を洗い出してくれて、そのとおりに修正したところ、壁の位置を正しく判定できるようになった。

修正後のコードの実行結果が以下である。画像をクリックすると別のタブにJavaScriptの実行結果が表示される。PythonコードからJavaScriptコードへの変換はLlama4 Scoutが正しく処理してくれた。

 

 

「モデルが以前に収集した知識やデータを活用して、特定の例や指示から学び、それに応じて適切な応答を生成すること」がインコンテキストラーニングの意味だとすると、私のプロンプトもインコンテキストラーニングの一種であると言える(と思う。多分。。)。

 

まとめ

「回転する七角形の中で弾む20個のボール」のシミュレーションプログラムをローカルで動くLLMでここまで作成できたのはLlama4 Scoutが初めてだった。

以前にLlama4 Scoutを使ったときには期待外れの結果だったが、今回の印象としては「意外と優秀」であるし、5トークン/秒の応答速度も「好印象」であった。

 

ただし、コーディングに関する限り、Llama4 Scoutは特に優秀というレベルではない。

今回は既に動作する同種のプログラムがあったので、その例を示すことで修正依頼ができたが、LLMに新規テーマでコーディングを依頼する場合に動作するプログラムはないことが通常である。そうすると常に今回の技が使えるわけではない。

 

長いコンテキスト長を活かせるような使い方、例えば長い文章を読ませてその文体を真似て新しい記事や小説を書かせるとか、長いプログラムを別言語にコンバートさせるとか、そんな使い方ならLlama4 Scoutはいい相棒になってくれそうな気がする。

 

ホンダが再使用型ロケット離着陸実験に成功

朝起きたらGoogleがホンダのロケット離着陸実験成功のニュースを教えてくれた。最近、ブログにロケット打ち上げや人工衛星関係の記事を書いているからだろうか。Googleの初期画面でニュースを表示してくれた。

 

日本の民間企業による宇宙ビジネスについては先日記事にし、実際にロケット打ち上げや月着陸船打ち上げまで行った以下の3社をリストアップしたところだった。

 

  1. 株式会社ispace
  2. インターステラテクノロジズ株式会社
  3. スペースワン株式会社

 

このリストにホンダ(本田技研工業株式会社)を追加したい。

 

続いてYouTubeを開いたら、トップに以下の動画が表示された。

GoogleのAIは私の興味のあるテーマを完璧に学習しているようだ。

 

www.youtube.com

 

詳細はホンダのニュースリリース再使用型ロケット実験機の離着陸実験に成功」に書かれているのでこちらを見ていただくのがよいかと思う。

ニュースリリースによるとホンダは「現在は要素研究の段階であり事業化するかは決まったものはありませんが、引き続き、要素研究に取り組むとともに、技術開発の目標として2029年に準軌道への到達能力実現を目指します。」としている。

 

2021年のニュースリリースHondaの新領域への取り組みについて」の中でも宇宙領域への挑戦とテーマを以下のように公開している。

 

  • 宇宙領域をコア技術を生かした“夢”と“可能性”へのチャレンジの場ととらえ、研究開発を加速
  • 燃料電池や高圧水電解技術を生かした、月面での循環型再生エネルギーシステムの構築
  • 多指ハンドやAIサポート遠隔操縦機能、高応答トルク制御技術などの月面遠隔操作ロボットへの応用
  • 若手技術者の発案による、燃焼・流体・制御・誘導技術などの応用による「再使用型の小型ロケット」の研究開発

 

2029年までにというのは事業としての明確な目標ではないかもしれないが、2020年代のうちに到達を目指すという意味で、なにか1960年代のアポロ計画(1960年代中に人類を月に到達させる)を思い出させるワクワクする計画だ。

 

これまでもホンダは、F1エンジンの開発、ホンダジェットによるジェットエンジンの開発を行ってきた。更にロケットエンジンの開発にチャレンジしているわけで、チャレンジ精神のある素晴らしい会社だな〜と感心した。

 

QZSS軌道シミュレーションアプリに説明を追加

準天頂衛星システム(QZSS)軌道シミュレーションアプリを先日公開した。公開を急いだため、衛星軌道の一部がレイアウトに収まっていなかったり、画面説明も全くない状態だった。

今回はアプリの説明を画面に追加し、画面レイアウトも一部見直してみた。

 

アプリの説明追加

自分で書こうかと思ったがAIに頼む手もあるな〜と思いgemini2.5proに頼んでみた。

結果的に自分で書くよりもいい内容になったと思う。

 

(AIに頼んだ内容)

無事にWebアプリを公開することができました。ありがとう。Webアプリのページの概要説明を追加したいと思ってます。以下を含めた概要説明をテキストベースで作成してください。

 

・QZSS軌道シミュレーションの概要

・QZSS(準天頂衛星システム)とは

・シミュレーション条件

・凡例説明(青い透明の球体:地球 緑の線:準天頂衛星の軌道など)

・参考情報

 

(AIの回答)

Webアプリの公開おめでとうございます!
ユーザーがシミュレーションをより深く理解できるよう、以下にページの概要説明のテキスト案を作成しました。ご自身のWebサイトのデザインに合わせて、自由に編集・再構成してお使いください。

 

QZSS軌道シミュレーションへようこそ
このWebアプリケーションは、日本の衛星測位システム「みちびき」(QZSS)の衛星が、地球の周りをどのように飛んでいるかを視覚的に再現する3Dシミュレーションです。

地球の自転と共に衛星が移動し、その真下の地上軌跡が特徴的な「8の字」を描く様子をインタラクティブに観察できます。マウス操作で地球を回転させたり、ズームイン・ズームアウトしたりして、宇宙から見た衛星のダイナミックな動きをお楽しみください。

QZSS(準天頂衛星システム)とは
QZSS(Quasi-Zenith Satellite System)は、愛称を「みちびき」という、日本の衛星測位システムです。 私たちが日常的に利用しているGPS全地球測位システム)を補完し、測位の精度と安定性を向上させることを目的としています。

「準天頂」という名前の通り、常に日本のほぼ真上(天頂付近)に最低1機の衛星が滞在するように、特殊な軌道で運用されています。 これにより、高層ビルが立ち並ぶ都市部や、山に囲まれた地域など、従来のGPSだけでは衛星からの電波が届きにくかった場所でも、安定して正確な位置情報を得ることが可能になります。

シミュレーション条件
このシミュレーションは、以下の軌道要素に基づいて計算されています。これらは、QZSSの代表的な軌道の一つをモデル化したものです。

  • 道長半径 (Semi-major axis): 42,200 km
  • 軌道傾斜角 (Inclination): 50.0°
  • 離心率 (Eccentricity): 0.1
  • 昇交点赤経 (RAAN): 135.0°
  • 近地点引数 (Argument of Perigee): 270.0°
  • 軌道周期 (Orbital Period): 24時間(地球の自転と同期)

凡例
シミュレーション画面に表示される各要素は、以下の通りです。

  • 青い透明の球体: 地球
  • 赤い点: 日本のおおよその位置(北緯35度、東経140度)
  • 緑色の球体: 準天頂衛星「みちびき」
  • 緑色の軌道線: 宇宙空間における衛星の軌道
  • 黄色の8の字線: 衛星の真下の点が地球上に描く軌跡(地上軌跡)
  • 灰色の線: 地球の中心と衛星を結ぶ線

参考情報
「みちびき」に関するより詳しい情報や最新の状況については、以下の公式サイトをご覧ください。

 

AIが作成してくれた内容をベースに一部編集した。

できあがった新しいQZSS軌道シミュレーションアプリがこちら。

QZSS軌道シミュレーション

 

画面レイアウト見直し

こういう作業自体は好きなので自分で行った。ブラウザによってレイアウトが若干くずれることがある。私のHTML編集能力ではこれが限界なのと、とりあえず動くことを確認したので公開することにした。

こういう作業もAIに頼むとやってくれるのかな〜。Claude Codeだと既存コードを読んで対応してくれるらしい。Claude Codeが使えるようになったらやってみたい。

Claude Codeが優秀なら軌道傾斜角や離心率をインタラクティブに変化させ、その場合の地上から見た衛星の軌跡がリアルタイムに変化する様子を描けるかもしれない。それができればちょっと面白いかな。

 

TypeScriptで作成したWebアプリを簡単に公開する方法

先日作成したPythonによる準天頂衛星(QZSS)軌道シミュレーションプログラムをTypeScriptに変換してWebアプリとして公開した。その手順を忘れないうちにメモしておきたい。

実行環境はUbuntu22.04である。私のようにAIを使ってWebアプリを開発し、できるだけ簡単な手順で公開したいと思っている方の参考になれば幸いである。

 

Webアプリ完成版イメージ

 

なぜTypeScriptを使うのか

TypeScriptを使ってみようと思ったのは、最近注目されているClaude codeに興味を持ったことがきっかけだった。npakaさんの以下のページを見ていたら「TypeScriptでブロック崩しを作成して。」とAIに依頼していた。

 

note.com

 

「TypeScript」という言語は最近どこかで聞いた気がした。たまたま昨日見ていた中嶋聡氏のYouTube "Life is Beautifull" の中で「最近はTypeScriptでしか開発していない」という言葉を確か聞いたのだ。

 

www.youtube.com

 

不勉強でTypeScriptについては私は全く知らなかった。Wikipediaで調べてみるとJavaScriptの完全上位互換の言語らしい。

「ほう〜、今どきはJavaScriptではなくて、TypeScriptなのか〜」と思い、TypeScriptで開発してみることにした。ただし、開発と言っても自分でするわけではない。もちろんAIに頼むのである。

 

PythonコードをTypeScriptコードに変換する

すでにPython版のコードはできているので、これをgemini2.5Pro(プレビュー)を使いTypeScriptのコードに変換した。

(sim_QZSS_gemini_pro.pyを添付)

添付したPythonのコードをTypeScriptのコードで作成してください。

 

gemini2.5Proは少し考えた後、以下のように回答した。

How to Run This Code

  1. Set up a project: Create a new folder for your project. You'll need Node.js installed.
  2. Create files: Inside the folder, create three files:
    ・index.html
    ・style.css
    ・src/main.ts
  3. Install dependencies: Open a terminal in your project folder and run the following commands:
    npm init -y
    npm install typescript vite three
    npm install --save-dev @types/three
    
  4. Configure package.json: Add a dev script to your package.json file:
    "scripts": {
      "dev": "vite"
    },
    
  5. Run the development server:
    npm run dev
    
    This will start a local server. Open the URL provided in the terminal (usually http://localhost:5173) in your web browser to see the animation.

この後、index.html、style.css、src/main.tsの内容が具体的に示された。

まずはNode.jsをインストールする必要があるようだ。

 

Node.jsのダウンロードとインストール

JavaScriptはクライアント側で動くスクリプトでセキュリティ対策からOS機能にはアクセスできない。これに対し、サーバ側でスクリプトを動かしOS機能にもアクセスできるようにするのがNode.jsである。Claude Codeを動かすのにもNode.jsは必須となっている。

 

このことは、Claude Codeのインストール方法のページにも書かれている。

Claude Codeを使い始める - Anthropic

 

理由はよく分からないが、AI側から見ればClaude Codeが動く端末がサーバ側になるからだろうか? AIがOS機能にアクセスする必要があるからだろうか?

今回AIが作成してくれたTypeScriptを実行するのにもNode.jsが必要となっているので、まずはNode.jsからインストールすることにした。

 

上記ページの中にNode.jsのダウンロードページへのリンクがある。

Node.js — Download Node.js®

 

リンクを開くとBashのシェルプロシジャがある。端末からWebアプリプロジェクト用のフォルダを作成し、フォルダに移動しシェルプロシジャを実行するとNode.jsのダウンロードとインストールが行われる。

mkdir pj
cd pj
mkdir satellite
cd satellite

# Download and install nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# in lieu of restarting the shell
\. "$HOME/.nvm/nvm.sh"
# Download and install Node.js:
nvm install 22
# Verify the Node.js version:
node -v # Should print "v22.16.0".
nvm current # Should print "v22.16.0".
# Verify npm version:
npm -v # Should print "10.9.2".

 

Node.jsの環境設定

AIが教えてくれた3の手順をプロジェクトフォルダで実行し、依存関係を構築する。

npm init -y
npm install typescript vite three
npm install --save-dev @types/three

 

プロジェクトフォルダにpackage.jsonが作られるので、AIが教えてくれた4の手順に従い、開発用のscripts情報「dev」を追加する。

なお、公開用には後述するが「build」も追加が必要である。修正後の私のpackage.jsonは以下の内容になった。

{
  "name": "satellite",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "singula2045",
  "license": "ISC",
  "dependencies": {
    "three": "^0.177.0",
    "typescript": "^5.8.3",
    "vite": "^6.3.5"
  },
  "devDependencies": {
    "@types/three": "^0.177.0"
  },
  "description": ""
}

 

AIが作成してくれた以下のファイルをプロジェクトフォルダに配置する。

  • index.html
  • style.css
  • src/main.ts

 

テスト実施

テストと言ってもテストプログラムを作るわけではない。アプリを実行して動きを確認しただけだ。AIが教えてくれた5の手順でアプリを起動する。

npm run dev

AIが教えてくれた通り、http://localhost:5173にアクセスすると、初期画面は表示された。

しかしアニメーションが動かない。しばらく観察すると、実時間で動いている(24時間で衛星が一周する)ようだった。

以下のプロンプトで修正を依頼した。

アニメーションは動いているようですが、実時間で動いているようです。速度を早く進めるためにはどうすればいいですか?

 

するとAIは60秒で衛星が1周するように修正してくれた。

なお、日本の位置は指示どおり北緯35度、東経140度で計算してくれているが、8の字の軌道とずれてしまう。この原因は不明であるが、私が東経45度にソースを変更して調整した。動けばOKなのだ。

 

Webアプリ公開

このアプリ公開手順が最も難解だった。

ネットから「Node.js デプロイ」などと検索して公開方法を探したところ、「npm publish」コマンドというのがそれらしい。

npmjs.comにアクセスしてアカウント名、パスワードを登録したり、使うつもりはないがGitHubにもアカウントを登録したりした。これで「npm publish」コマンドを実行すると「npm adduser」コマンドを実行しろと怒られた。

この「npm adduser」が正に鬼門で、何をどう実行しても正常終了させることができなかった。

npmjs.comにアクセスするのはここでトークンを取得したり、パッケージのリポジトリを登録したりするためのようなのだが、正式にパッケージ登録するつもりもパッケージ公開するつもりもない。単にWebアプリとして公開したいだけなのに、こんなの必要なの?と思いながら完全に行き詰まった。

 

ふと、AIに聞いてみようと思い、gemini2.5Proに聞いたところ、答えを教えてくれた。

できあがったTypeScriptを自分が公開しているWebサーバ上で公開する方法を教えて

 

以下がAIの回答。長いが全文を再掲載する。

はい、承知いたしました。
作成したTypeScriptのプロジェクトを、ご自身のWebサーバーで公開するための手順を説明します。

現在の状態は「開発環境」です。これを、Webサーバーで公開できる「本番環境用」のファイルに変換する**「ビルド」**という作業が必要になります。Viteにはそのための簡単なコマンドが用意されています。

公開までの流れ
手順は大きく分けて2つです。

  1. ローカルPCで、公開用の静的ファイルを生成する(ビルド)
  2. 生成されたファイルを、Webサーバーにアップロードする

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ステップ1:公開用ファイルのビルド
まず、あなたのPC上で、Webサーバーにアップロードするための最適化されたファイル群を作成します。

  1. ターミナルを開く:
    プロジェクトのルートディレクトリ(package.jsonがある場所)でターミナルを開きます。
  2. ビルドコマンドの実行:
    以下のコマンドを実行してください。
    npm run build
    
  3. distフォルダの確認:
    コマンドの実行が完了すると、プロジェクトのルートにdistという名前の新しいフォルダが作成されます。
    your-project-folder/
    ├── dist/                <-- ★新しく作成されるフォルダ
    │   ├── assets/
    │   │   ├── index-xxxx.css
    │   │   └── index-yyyy.js
    │   └── index.html
    ├── src/
    │   └── main.ts
    ├── package.json
    └── ... (他のファイル)

    このdistフォルダの中に入っているものが、Webサーバーで公開するための完成品です。ViteがTypeScriptやThree.jsのライブラリコードをすべて1つにまとめ、ブラウザが直接解釈できる最適化されたJavaScriptファイル(とHTML、CSS)を生成してくれます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ステップ2:サーバーへのアップロード
次に、ステップ1で作成されたdistフォルダの中身を、お使いのWebサーバーにアップロードします。

  1. アップロードするファイル:
    distフォルダの中身をアップロードします。具体的には以下のファイルとフォルダです。
    ・index.html
    ・assets フォルダ(その中身もすべて)
    注意点: distフォルダ自体をアップロードするのではなく、その中にあるファイルやフォルダをアップロードするのが一般的です。
  2. アップロード先:
    お使いのWebサーバーの公開ディレクトリにアップロードします。このディレクトリの名前は、サーバーの環境によって異なりますが、一般的には以下のような名前です。
    ・public_html
    ・www
    ・htdocs
    ・web
  3. アップロード方法:
    サーバーへのアップロードは、普段お使いの方法で行ってください。
    FTP/SFTPクライアント: FileZillaなどのソフトウェアを使う。
    レンタルサーバーの管理画面: ブラウザからアクセスできるファイルマネージャー機能を使う。

アップロードが完了したら、ブラウザでご自身のWebサイトのURLにアクセスして、アニメーションが正しく表示されるか確認してください。

【重要】サブディレクトリに公開する場合
もしWebサイトのルート(例: https://example.com/)ではなく、サブディレクトリ(例: https://example.com/my-animation/)に公開したい場合は、追加の設定が1つ必要です。

この設定をしないと、CSSJavaScriptファイルへのパスがずれてしまい、正しく表示されません。

  1. vite.config.tsの作成:
    プロジェクトのルートディレクトリに vite.config.ts という名前のファイルを新規作成します。
  2. 設定の記述:
    作成したファイルに、以下のように記述します。base の部分を、あなたの公開したいディレクトリ名に合わせて変更してください。
    // vite.config.ts
    import { defineConfig } from 'vite'
    
    export default defineConfig({
      base: '/my-animation/', // <-- 公開したいディレクトリ名(前後にスラッシュを付ける)
    })
  3. 再ビルド:
    vite.config.ts を保存した後、再度 npm run build コマンドを実行します。
    これにより、生成される index.html 内のパスが /my-animation/assets/... のように正しく設定されたdistフォルダが再作成されます。
  4. アップロード:
    新しく生成されたdistフォルダの中身を、サーバー上の対応するディレクトリ(この例では my-animation ディレクトリ)にアップロードします。

以上で、ご自身のWebサーバーへの公開が完了します。

 

「npm run build」コマンドの実行前に、「package.json」のScripts情報としてbuildを追加すること。

私がやりたかったことは正にこれだった。上記のように処理したところ、無事にWebサーバ上でアプリは動作した。以下のリンクからWebアプリを起動できる。

画面に説明が全くないのでここで説明させてもらう。

  1. 青い球:地球
  2. 緑の点:準天頂衛星
  3. 緑の線:準天頂衛星の軌道
  4. 灰色の線:地球の中心と衛星を結ぶ線
  5. 黄色の線:投影点の軌跡(地球から見た衛星の動きで8の字を描く)

 

singula-2045.angry.jp

 

WebAppLabのメニューからも起動できる。クリックするとメニューが表示される。

 

 

まとめ

AIを使ったプログラム開発には以下のメリットがある。1〜3は中島聡氏がYouTubeの中で語っていること。4は今回の私の感想。

  1. 面倒なプログラミングも文句を言わずにやってくれる
    ・例えばPythonからTypeScriptへの移植は技術者には退屈で面倒な仕事
  2. 技術者を何人か雇わないとできなかったことが、AIと自分だけでできるようになった
    ・デメリットとして技術者の雇用にこれから影響してくると思われる(私の予想)
  3. 初めて使うライブラリをとりあえず動くところまで持っていってくれること
    ・今回もTypeScript+Node.js+Three.jsで動くところまでやってくれた
  4. 分からないことはAIに聞いた方がネット検索して調べるより早い場合がある
    ・3の内容と重なる部分もあるが、今回のWebアプリ公開方法ではそう実感した

2のメリット(雇用される側からすればデメリット)は大きい。富士通が来年から新卒採用を止めるようだが少なからずAIの影響があるのではないか。

ソフトウェアエンジニアを目指す学生達は、AI革命が進む前に早く就職先を見つけた方がいい。あるいはアイデアと自信がある人なら、起業してAIを使ったアプリ開発をするのも面白いかもしれない。

 

これから私もClaude Codeを使い更にWebアプリを作成したいと思っている。ただ凡人の私には、AIに何を作らせれば面白いのか、いいアイデアが全く浮かんでこないのが悩みである。

 

Numbersは最強の資産管理ソフト

Numbers(ナンバーズ)と言っても宝くじの話ではない。Appleが提供する表計算ソフトのことである。

私は6年前からNumbersで自分の資産を管理するようになった。今回はNumbersが如何に個人の資産管理に適した優れたソフトであるかということを書きたい。

 

 

Numbersが資産管理に適している理由

Numbersは表計算ソフトであり資産管理ソフトではない。しかし株価を取得するSTOCK関数と、ドル円為替レートを取得できるCURRENCY関数がサポートされている。これらの関数を使い資産管理表を作成することはそれほど難しい作業ではない。むしろ自分の要求仕様に合う自分だけの資産管理表を作成できるというメリットがあり、そのメリットが大きい。

 

Numbersが資産管理に適している理由は以下の点になる。

  1. STOCK関数が標準サポートされている
    ・海外および日本の株価取得をサポート
    ・暗号資産(Bitcoinなど)もサポート
  2. CURRENCY関数が標準サポートされている
    ・各国法定通貨間の為替レート取得をサポート
  3. 無償で使用できる
    MaciPadiPhoneに標準でインストールされている

 

少なくとも私が資産管理表を作り始めた6年前(2019年)に株価を取得できる関数をサポートする表計算ソフトはNumbersのみであった。

他の代表的な表計算ソフト、無料アプリについて現状を改めて調べてみた。

  • Execel(有償)
    ・STOCKHISTORY関数が2021年以降にサポート開始
    ・海外および日本の株価、各国法定通貨の為替レートの取得をサポート
    ・暗号資産(Bitcoinなど)はサポートされていない
    ・Microsoft365サブスクリプションの利用者のみが使える
  • Google Spread Sheet(無償)
    ・GOOGLEFINANCE関数で株価取得できるが、米国株限定
  • LibreOffice Calc(無償)
    ・株価取得関数はサポートされていない
  • GnuCash(無償)
    ・フリーの会計ソフト
    PythonスクリプトでYafoo Financeから株価取得可能
    Pythonスクリプトを自分でメンテする必要あり

 

Google Spread Sheetでもマクロ機能などを駆使してスクレイピング(画面から必要な情報を抜き取る方法)をすれば日本の株価も取得できるようだが、資産管理をするためにそこまでしたくないだろう。

Yahoo Financeから株価情報をダウンロードしてグラフ化するPythonスクリプトの実行は私も以前からたまにやっている。しかし半年もするとなんらかの仕様変更で動かなくなることがよくある。その度にライブラリを最新にアップデートしたりPythonスクリプトを修正するのは実に面倒だ。

その点、AppleのNumbersはSTOCK関数、CURRENCY関数が標準でサポートされており安心して使える。これも私がNumbersをお勧めする理由である。

 

使用法サンプル

使用法はごく簡単なので一つだけサンプルを示す。

Apple株を保有しているとして、所有する口数分の資産価値を日本円で求める場合は以下のように行う。

 

セルB2にティッカーコード、セルB3に所有口数、セルB3で株価評価額を日本円で計算している(2025年6月9日現在)。セルB3の内容は以下の通り。

 

私が便利だと思う使用方法

基本的な使用方法を理解すれば、以下のようなことも簡単にできる。なぜなら表計算ソフトだから。

 

  • 分散投資する資産ポートフォリオの日本円での最新比率を計算する
    ・求めた結果を円グラフで表示する
    ・目標とする比率にするために買い足し、または売却が必要なポートフォリオとその金額を計算する
  • 初期投資額と現在の資産価値から運用利率を複利計算で求める
  • 年初からの資産増減をリアルタイムに把握する
    ・資産管理シートをiCloudに置けばiPhoneiPadから簡単にチェックできる

 

おわりに

AppleのNumbersが最強の資産管理ソフトであることが理解いただけただろうか。Appleユーザには既に知られていることかもしれない。しかしネットの情報を検索する限り、NumbersのSTOCK関数が活用されている様子は感じられなかった。意外と知られていないのかと思い記事にまとめてみた。

MacユーザはWindowsユーザに比べると確かに少ない。しかしiPhoneユーザは日本では大多数であると思う。無償で使えるこんな便利な機能が使われていないとすればもったいない話である。

なお老婆心ながら付け加えると、iPhoneでNumbersのシートを新規に作成することは操作性の問題で難しいかもしれない。Numbersではセルの範囲指定などはGUIでの操作になるためだ。そのためMacBookMacBook Airなどマウス(あるいはトラックパッド)が使用できる環境で作成したほうがいいと思う。

 

民間企業による宇宙ビジネス

6月6日、民間企業のispaceによる日本初、アジア初の月面着陸は残念ながら失敗に終わったようだ。私の不勉強でispaceという企業のことは今回始めて知った。民間企業で宇宙ビジネスにチャレンジすることは大変だと思うがそういう企業が日本にあることは素晴らしいことだ。

今回はミッション失敗ということで関係者のショックは大きいと思うが、失敗を恐れず再びチャレンジしてほしい。

 

Grok3に描いてもらいました

 

日本の民間宇宙ビジネス企業

代表的な民間宇宙ビジネス企業の情報をここにまとめてみた。

 

株式会社ispace

「月に眠る貴重な水資源を活用して宇宙インフラを構築し、人類の生活圏を宇宙に広げていく」ことを目標とし、月面への着陸と月面探査を行おうとしている。

月着陸船の打ち上げはSpaceX社のFalcon9ロケットを利用。

 

以下はspaceによるミッション2の終了判断のポスト。多くの人が感心を持って見ていることがわかる。

 

インターステラテクノロジズ株式会社

「世界で選ばれる宇宙のインフラをつくる」をミッションとして掲げている。

ホリエモンが出資者の一人で、役員(取締役)として経営にも関与している。

現在は新型ロケット「ZERO」の開発中。並行して「ZERO」の発射場を北海道大樹町に建設中で発射場の完成は2026年9月末見込み。「ZERO」の打ち上げは、発射場の完成後に早期に行う方針とのこと。

 

ロケット打ち上げの成功時には、あのホリエモンもプロジェクトメンバー達と抱き合って喜ぶのだろうか。そんなシーンも見てみたい。

 

スペースワン株式会社

スペースワンは、契約から打上げまでの『世界最短』と打上げの『世界最高頻度』をめざす、小型ロケットによる打上げサービス。専用のロケットと射場で宇宙へのアクセスコストを下げ、宇宙ビジネスのさらなる拡大に貢献していく」ことをミッションとしている。

キヤノン電子IHIエアロスペース清水建設日本政策投資銀行が主な出資企業。

発射場は和歌山県東牟婁郡串本町にある。

2024年12月にカイロスロケット2号機を打ち上げたが失敗。次の打ち上げ予定は現時点で未定。

 

所感

上記以外にも日本の民間宇宙ビジネス企業はあるようだが、実際にロケット打ち上げや月着陸船打ち上げまで行ったのは上記3社のみだと思う。

 

JAXAH3ロケット開発でも衛星打ち上げ成功までに約10年を要した。民間企業の宇宙ビジネスで実績を作るまでに最低でも10年はかかるだろう。それまで株主・出資者は我慢強く待つ必要がある。

 

「失敗してもいいんだ!チャレンジしろ!」

 

そう言ってプロジェクトメンバーを励ましてくれる、太っ腹な株主・出資者達であることを私は切に願う。