- BACKNUMBERS -
2024 / 5
2024 / 6
2024 / 7
2024 / 8
2024 / 9
2024 / 10
2024 / 11
2024 / 12
2025 / 1
2025 / 2
2025 / 3
2025 / 4
2025 / 5
2025 / 6
2025 / 7
2025 / 8
2025 / 9
2025 / 10
2025 / 11
最新月

web6047 - 2025年 12月

ここは個人の趣味のページです。

昭和49年生まれ、血液型B型、男。

名前は、かわ、kawa、d_kawakawa、cookiepuddingman、平行四辺形 などいろいろあります。

文書を書くときの助詞や助動詞、副詞などが苦手で、記事を書いて後から「不自然だな」と思ったりします。

iTunes real time information:
now loading...

注: ここに表示される氏名、名称と当ホームページはなんら関係ございません.


私がプログラミングを好むのは、プログラミングは私の「物づくり」に対する探求心創造性を十分に満たしてくれるから、、です。

憧れに向かう、形にする。そんなわけで、この個人ページではプログラミングの話をすることが多いです。


ここの管理人、
AI の利用やめるってよ。

AI の問題点:

  1. 自分で考えずに AI を利用することで、考える力が減退する。
  2. 人と人との交流(教える、教わる)が減る。
  3. 創作物のオリジナリティが無くなる。(自分の力で作ることの喜びが減る)
  4. 犯罪に使われている。
  5. AI のハルシネーション(幻覚を見ながら語ることがある)により、人間が間違った知識を AI から学んでしまう。
  6. 公序良俗に反するコンテンツの氾濫。(2025/10/18追加 ChatGPT の OpenAI がそのような方針をとったから)

これらが向こう10年解決されないだろうと見込んで、やめることにしました。(2025年5月23日~)

私は AI に頼らず「自分の力」を大切にしたいです。

…とはいえ、人間は新しく見つけた技術を手放すということは基本的にやらないと思います。

だから私も後々 AI を利用することにはなると思います。

でも上記の問題点は確かなもので、将来 AI ロボが私の家の扉をコンコンと叩いて

「市からの要請で、お手伝いするため おうかがいしました」

と言うまでの間は、この AI 技術を導入せず、頑張ってみようと思います。

でもこの考え方、キツイと思うのでマネしなくていいです。

 

▲ AI をいっさい使わずに自分の力で作った人体描画システム

- Special Documents -

特別な記事へのリンク

3DCGプログラミングの方法
書籍「はじめて読む486」の
サンプル動作環境の作成方法
3Dお姉さんによるプログラミング解説
RPG のルーツ(PDF)

ゲームコーナー 

クレイジーバルーン
(↑, ↓, ←, →)
テトリス
(←, →, ↓, z, x)

その他 単発のアプリ

矩形波は複数波形の合成です
SVC: 簡易的な試作
SVC: パーツ連結のみ
SVC:パーツ連結,ポーズ補間

- 以降は日記です -

2025年12月1日

プログラミング 最近、その後3

先月 11 月 16 日の記事「プログラミング 最近、その後2」で

『本番の「人体描画システム」のほうで使うときのヒントが得られました』

と書いたとおり、ヒントが得られて、下図のように作りました。

Excel で図を描きボタンを押し…

JavaScript の 人体描画システムで表示

JavaScript にて、3D モデルの任意の面に、ドロー(ベクタ)の図形を描画することができます。


Excel で少し変更してボタンを押し…


ブラウザの更新ボタンで反映


凝った配置でも…


ちゃんと反映


Excel の「フリーハンド」図形も


基本は同じドロー(ベクタ)なので可


線を太字にすると


Excel の線の太さ設定を拾うので反映


和同開珎かよと思ったので


せっかくだから、おにゃんこさん

Excel のすべての図形に対応させようと、いろいろやったんですが、結局データフォーマット(の全貌)が分からないので、ある図形をきれいに描画できるようにすると、別の図形で崩れ、それを直すとまた別の図形で崩れ、、とどうしようもなかったので、すべての図形に対応させるのはあきらめました。

あきらめるまで1週間くらい、データフォーマットを探る作業を続けて苦しみました。

悟空(ドラゴンボール)が重いおもりを両手両足につけて修行した結果、おもりをはずすといつの間にか楽々になっていた… 

というのと似ています。

苦しみ抜いたので、もはや Excel 図形データを自分の JavaScript プログラムの中で扱うのは苦になりませんでした。

でもデータフォーマットの解明には至っていないので、必要最低限の図形に対応、ということで妥協しました。

妥協しないと今年中に終わらないぞと思ったので…。


今日は仕事が終わって、アパートの自室のドアの前まで来たら、ポケットに部屋の鍵が入っていませんでした。

仕事場に置き忘れたので、取りに戻りました。(歩きと電車で片道1時間)

また歩くのは嫌だったので、タクシーを呼びましたね。往復5700円。

最近ボケてますからね。難しいプログラミングをやるくせにボケてる。

ボケてはいるけど、繰り返すわけにはいかないと思って、スペアキーを準備するという対応はちゃんと行うことができました。

それでもいつか別の何かでオオボケするだろうな。。。

この記事で示した技術の概要

Excel で作成した図形をどうやって JavaScript で表示させているのか、その流れをここに示します。

  1. Microsoft Excel(バージョン2010)でシート内に図形を配置する。
    ※ 最新バージョンの Excel と Excel 2010 とで、Shape のデータフォーマットが共通して同じであれば、以下の手順は最新バージョンの Excel でも有効です。
    調べたところ、下図の通り最新の「Excel オンライン」で作成した図を Excel 2010 でも表示できたので、たぶん有効です。
  2. Microsoft Excel で VBA 画面を開き、図形(Shape)のプロパティを読み取る。
  3. 特に、Shape.Nodes について、一つの点(Node)が editingType、segmentType、points という3つのプロパティで表現されていることに注目する。
    このうち、プロパティ segmentType が
    値 "msoSegmentLine" の場合は JavaScript の canvasContext.lineTo() に、
    値 "msoSegmentCurve" の場合は JavaScript の canvasContext.bezierCurveTo() に、
    それぞれ通じます。(そのままでは使えず、上手に対応させる必要がある)

    Excel のプリセットの図形には Nodes プロパティの points プロパティが未定義の状態になっており、値を参照できません。
    Shape.Nodes.SetPosition(1, 100, 100) ' 1番の Node の座標を 100, 100 にする
    を行うことでプリセット図形はフリーフォーム図形となり、そのとき初めて points プロパティが定義されます。
  4. Excel の図形(Shape)のプロパティのうち、必要なプロパティを一つ一つそのままのデータ構成で拡張子 .js のファイルへ出力する。
    (グループ図形、図形の回転、図形の上下左右反転などそれぞれ適切に処理する必要がありますが、「壁」がいくつもあり、とても大変です)
    出力結果はたとえばこれ(catFaceNormalPath.js)
  5. JavaScript でその .js ファイルをロードする。ロードとは、<script src="~.js"></script> のことです。
  6. そのデータをもとにして、JavaScript の CANVAS に図形を再現できること。(これも大変)
  7. また、前提として JavaScript で 3DCG が描けること。
  8. また、前提としてその 3DCG 内でベジェ曲線を描けること。
    JavaScript でベジェ曲線を描くときは、一般に、
    canvasContext.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
    のように記述する。
    cp1x, cp1y が開始点のハンドル(コントロールポイント)の座標、
    cp2x, cp2y が終了点のハンドルの座標、
    x, y が終了点の座標。

    これらの座標に Z座標を単純に加えると、
    cp1x, cp1y, cp1z が開始点のハンドルの座標、
    cp2x, cp2y, cp2z が終了点のハンドルの座標、
    x, y, z が終了点の座標、
    となり、三次元空間内にベジェ曲線が出現したことになる。(論理的に)

    それぞれの座標について、二次元の画面へ「投影」すると Z 座標が消えて、
    cp1xP, cp1yP が開始点のハンドルの座標、
    cp2xP, cp2yP が終了点のハンドルの座標、
    xP, yP が終了点の座標、
    となる。P は Projection、投影という意味です。
    投影とは、
    s = 50
    二次元x = 三次元x * s / 三次元z
    二次元y = 三次元x * s / 三次元z
    という計算で三次元座標を二次元座標へ変換することです。

    これらの座標(投影座標)を使って、
    canvasContext.bezierCurveTo(cp1xP, cp1yP, cp2xP, cp2yP, xP, yP);
    を行うと、三次元の描写となる。
  9. 3DCG が描ける、ベジェ曲線も描けるとなったら、あとは特定の面に Shape データを描けばよい。
    つまり、特定の面が向いている方向をもとに、Shape データの各座標を回転させてから描く。
    これには高校数学を駆使する必要があります。

(訪問者のどんなニーズと この記事がつながるか)

  • 面白いものを見たい
  • プログラミングの話
  • 日記を読みたい

2025年12月3日

プログラミング 最近、その後4

面に描く Excel 図形データを切り替えられるようにしました。

パラパラアニメではなく、図形から図形へのモーフィング(昔行ったベジェ曲線同士のモーフィング)にすればリアルになりそうですが、とりあえずそこまでやらなくても良いので、これで OK として次へ進むことにします。

図形から図形へのモーフィングができる、昔やった、と言うだけではどういうことなのか分からないので、、

これです。

つまり、目をあけている顔から、目を閉じている顔へモーフィングすれば、なめらかにまばたきするリアルなアニメが期待できるということです。

でも目的(ページ上でキャラを動かしてプログラミングを教える)を考えると絶対に必要というわけではないのでひとまず見送ります。

人体表示システムは今月中にある程度使える状態にしないと。。。

次はフキダシかな。。


どうして 3DCG プログラミングができたり、その 3DCG の面に図を描いたり、その図を「切り替えよう」と言って切り替えたり、図のモーフィングをしたり、、あれやこれやといろいろできるのか不思議ではないでしょうか。

好きでやってるからかな。嫌いだったらこうはなりません。

他にもいろいろありますが、はっきりと言えるのはとりあえずそんなところですね。

(訪問者のどんなニーズと この記事がつながるか)

  • 面白いものを見たい
  • プログラミングの話
  • 日記を読みたい


2025年12月6日

プログラミング iTunes を制御する

iTunes を制御する VBS プログラムを紹介します。

VBS(VBScript)はすべての Windows で使用できるプログラミング言語で、主に OS を制御するために使われ、アプリがインターフェース(API)を用意していればアプリも制御できます。

ただし、VBS は数年後に廃止予定なので、それまでの間の使用に限られます。

同じことは、C++、C#、VisualBasic、Perl でもできるようです。

※ 下図スクリーンショット中の作品名、個人名と当サイトとは何ら関係はございません。


VBS で iTunes を演奏開始し、プレイリスト中の全2曲を演奏して終了した様子


別のコマンドプロンプトを開いて、演奏中の情報を取得して表示した様子


左上のプロンプトで演奏開始、右下のプロンプトでその演奏について情報表示、停止を実行

このように、VBS を使って iTunes の演奏を制御できます。


そのプログラムリストです。応用する前の「ひな形」のつもりで作ったものです。

' .vbs
' ===== iTunes 制御の基本プログラム サンプル =====
' iTunes COM Interface Documentation(WEBアーカイブ)
' https://web.archive.org/web/20220517004755/http://www.joshkunz.com/iTunesControl/main.html
' itunes 8.1.0.52 以降に対応
' このテキストを control.vbs というファイル名で保存し、
' Windows コマンドプロンプトにて、
' cscript control.vbs play
' のようにして実行します。
' (このプログラムは文字コード Shift-JIS で作成しましたが、UTF8 でも問題なく動作しました)
' (意味が分からない場合は気にしないで良いです)
' ただし、.vbs(VBScript)はそのうち使えなくなります。
' https://ja.wikipedia.org/wiki/VBScript
' >そして、2024年5月にMicrosoftは3段階に分けてVBScriptを廃止すると発表している。
' >なお、3段階とは
' >「オンデマンド機能(FOD)をすべてのWindows 11のバージョン24H2にプリインストールさせ、デフォルトでオンにする」、
' >「2027年頃からオンデマンド機能(FOD)をデフォルトで有効にならなくする」、
' >「VBScriptを廃止する」である。[3]
' 代替としては、C++、C#、VisualBasic、Perl が使えます。(このプログラムをそれらに書き直す)
' (ここに各サンプルがあるからこの4つを挙げましたが、VisualBasic が一番 .vbs に近いのでおすすめです)
' https://web.archive.org/web/20220813205345/http://www.joshkunz.com/iTunesControl/interfaceIiTunes.html
' このプログラムの構造:
' コマンドラインオプションで簡易的な命令を受け取り、各命令ごとに実行して終了するだけ。
' ※ 標準では .vbs(VBScript) は変数,オブジェクト,操作の名前,および定数などの大文字と小文字を区別しません。
' このプログラムはコピーして自由にお使いください。
' ================================================
'check. コマンドラインオプション指定がない
if Wscript.Arguments.Count = 0 then
cecho "usage: cscript control.vbs (play,stop,volup,voldn,next,back,info,plist)"
WScript.Quit
end if
cecho "vbs start"
' iTunes アプリケーションを変数にセットする。
Dim itunes
Set itunes = WScript.CreateObject( "iTunes.Application" )
' コマンドラインオプション指定コマンド別に各処理
' play,stop,volup,voldn,next,back,info,plist
'(play はループに入るので、play 以外のコマンドは別途プロンプトを開くなりして実行する)
if Wscript.Arguments( 0 ) = "play" then
cecho "vbs play command"
' itunes イベントと vbs ユーザー関数(ITEventTest_~)をつなげる
WScript.ConnectObject itunes, "ITEventTest_"
itunes.play()
' itunes イベントを有効にし続けるためにはループする。
' また、1曲の終了イベントはあるが、iTunes の停止イベントは無いのでここで実装する。
' ここで言う「停止」とは「||」ボタンを押したり、プレイリストが演奏終了したときのことを指す。
state0Processed = false
loopFlg = true
cecho "into LOOP"
cecho vbCR & vbLF & "この画面を消すときは、まず iTunes で停止ボタンを押してください。"
cecho "そうしないと、次回このプログラムを起動時したときにイベントが起動しなくなります。"
Do while loopFlg
WScript.Sleep 500
if itunes.PlayerState = 0 then
if not state0Processed then
' itunes が停止したとき
cecho vbCR & vbLF & "player state is 0"
state0Processed = true
' ここに itunes が停止したときの処理を書く
loopFlg = false
WScript.DisconnectObject( itunes )
end if
else
state0Processed = false
end if
Loop
cecho "after LOOP"
WScript.Quit
elseif Wscript.Arguments( 0 ) = "stop" then
cecho "vbs stop command"
itunes.Pause
elseif Wscript.Arguments( 0 ) = "volup" then
cecho "vbs volup command"
itunes.SoundVolume = itunes.SoundVolume + 10
elseif Wscript.Arguments( 0 ) = "voldn" then
cecho "vbs voldn command"
itunes.SoundVolume = itunes.SoundVolume - 10
elseif Wscript.Arguments( 0 ) = "next" then
cecho "vbs next command"
itunes.NextTrack ()
elseif Wscript.Arguments( 0 ) = "back" then
cecho "vbs back command"
itunes.backTrack ()
elseif Wscript.Arguments( 0 ) = "info" then
cecho "vbs info command"
' 演奏中の曲情報
dim track
set track = itunes.CurrentTrack
dim str
str = "Artist:" & vbTab & track.Artist
str = str & vbCR & vbLF
str = str & "Album:" & vbTab & track.Album
str = str & vbCR & vbLF
str = str & "track:" & vbTab & track.Name
cecho str
elseif Wscript.Arguments( 0 ) = "plist" then
cecho "vbs plist command"
' プレイリストへのアクセス例
cecho itunes.sources.count ' 2
cecho itunes.sources(1).name ' ライブラリ
cecho itunes.sources(2).name ' iTunes Store
cecho itunes.sources(1).playlists.count ' 121
cecho itunes.sources(1).playlists(1).name ' ライブラリ
cecho itunes.sources(1).playlists(2).name ' ミュージック
cecho itunes.sources(1).playlists(3).name ' ムービー
cecho itunes.sources(1).playlists(4).name ' ホームビデオ
cecho itunes.sources(1).playlists(5).name ' テレビ番組
cecho itunes.sources(1).playlists(6).name ' ポッドキャスト
cecho itunes.sources(1).playlists(7).name ' オーディオブック
cecho itunes.sources(1).playlists(8).name ' 私のプレイリスト1
cecho itunes.sources(1).playlists(9).name ' 私のプレイリスト2 ...
cecho itunes.sources(1).playlists.itemByName( "ライブラリ" ).name ' ライブラリ
cecho itunes.sources(1).playlists.itemByName( "ミュージック" ).tracks.count ' 2609
cecho itunes.sources(1).playlists.itemByName( "ミュージック" ).tracks(1).play()
' 1 番は itunes 内部 リストのトップのこと
wscript.sleep(5000)
cecho itunes.sources(1).playlists.itemByName( "ミュージック" ).playFirstTrack()
' 現在の画面リストのトップのこと
' その他のメソッド、プロパティ
' IITPlaylist Interface Reference
' https://web.archive.org/web/20220702203408/http://www.joshkunz.com/iTunesControl/interfaceIITPlaylist.html
else
cecho "undefined : " + Wscript.Arguments( 0 )
End If
'以下 イベントハンドラ(関数名「ITEventTest_~」の ~ を itunes が認知する)
sub ITEventTest_OnPlayerPlayEvent( track )
'when a track begins playing.
cecho vbCR & vbLF & "OnPlayerPlayEvent"
' ここに曲が演奏開始されたときにやりたい処理を書く
'sample. 曲情報をコンソールに出力する例
if 1 then
dim str
str = "Artist:" & vbTab & track.Artist
str = str & vbCR & vbLF
str = str & "Album:" & vbTab & track.Album
str = str & vbCR & vbLF
str = str & "track:" & vbTab & track.Name
cecho str
end if
'sample. 曲情報を .js ファイルに書き込む例   (※1)
' 例を利用するには、
' ①レンタルサーバーが必要です。
' ② 最初の行の if 0 を if 1 にする。
' ③ file の ***** 部分を自分のものに変更する。
' ④ この末尾の「なんらかの ftp コマンド」を自分で用意する
if 0 then ' ← ②の最初の行とはこれのこと
dim track2
set track2 = itunes.CurrentTrack
' ③以下の ***** 部分はその人の環境によります。
file = "D:\*****\playing.js"
Set out = CreateObject( "ADODB.Stream" )
out.Open
out.Type = 2 ' テキストファイル
out.Charset = "UTF-8" ' 文字コード
out.LineSeparator = 10 ' 区切り文字 (LF)
out.WriteText "playing = {", 1
out.WriteText vbTab & "name : """ & track2.name & """,", 1
out.WriteText vbTab & "artist : """ & track2.artist & """,", 1
out.WriteText vbTab & "album : """ & track2.album & """,", 1
out.WriteText vbTab & "playListName : """ & track2.Playlist.Name & """,", 1
out.WriteText vbTab & "nowtime : """ & Now & """,", 1
out.WriteText "}", 1
out.SaveToFile file, 2
out.Close
'④「なんらかの ftp コマンド」
'.js ファイルをなんらかの ftp コマンドでサーバーへアップロードする。
' 以下は私個人の環境の場合です。
' 個人的に作成した upload.bat では perl スクリプトの
' FTP コマンドを利用してアップロードしています。
CreateObject( "WScript.Shell" ).Run "upload.bat " + file, 0, True
end if
end sub
sub ITEventTest_OnPlayerPlayingTrackChangedEvent( track )
'現在演奏中の曲の名前とかの情報が変更されたときに呼ばれる。
'when information about the currently playing track has changed.
cecho vbCR & vbLF & "OnPlayerPlayingTrackChangedEvent"
' ここに情報が変更されたときにやりたい処理を書く
end sub
sub ITEventTest_OnPlayerStopEvent( track )
'when a track stops playing.
cecho "OnPlayerStopEvent"
' ここに曲が演奏停止されたときにやりたい処理を書く
' 停止とは、停止ボタンを押した、曲が終了した。
end sub
sub ITEventTest_OnQuittingEvent
'when iTunes is about to quit.
cecho vbCR & vbLF & "OnQuittingEvent"
' ここに iTunes が終了したときにやりたい処理を書く
loopFlg = false
WScript.DisconnectObject( itunes )
cecho "itunes scripting disconnected"
' ただし、LOOP 内の「' itunes が停止したとき」の
' 停止処理の方が早いので、たぶん実行されない。
end sub
'(そのほか以下のイベントがある)
' OnDatabaseChangedEvent
' OnCOMCallsDisabledEvent
' OnCOMCallsEnabledEvent
' OnAboutToPromptUserToQuitEvent
' OnSoundVolumeChangedEvent
' https://web.archive.org/web/20220702201321/http://www.joshkunz.com/iTunesControl/interface__IiTunesEvents.html
'以下 サブルーチン
Sub cecho(text)
' cscript で実行の場合はコンソールに出力
' その他で実行の場合は何もしない
On Error Resume Next
WScript.StdOut.WriteLine text
End Sub

これを元にして、たとえば、

など、ひな形プログラムをもとに、いろいろできると思います。


ただ、playing.js をサーバーに送ることについては、「なんらかの FTP コマンド」と言っているだけなので、そこはもしかしたら難しいかもしれません。

なので、FTP 機能を持っている別のプログラミング言語、Perl とか Python とかで、別途 FTP をやってもらう形にするしかないようです。

そういうわけで、今回、そのあたりの説明は大変でできませんでした。