いやはや、やれやれ、何と言うか、長年の不思議が解けた。Windows 10や11でターミナル環境がコマンドプロンプト(cmd.exe)からPowerShellに移行したことの影響がある。必要に迫られ、孤立したスクリプタは生成AIに助けられた。
while(<DATA>){ chomp; push(@keywords, $_); } while(<>){ chomp; s/蛇/ヘビ/g; s/蝶/チョウ/g; s/蜂/ハチ/g; s/(船|舟)虫/フナムシ/g; s/百日紅/サルスベリ/g; s/紫陽花/アジサイ/g; s/唐楓/トウカエデ/g; s/夾竹桃/キョウチクトウ/g; s/タブの木/タブノキ/g; s/西洋キズタ/セイヨウキズタ/g; s/鳩/ハト/g; s/鴎/カモメ/g; s/鳶/トビ/g; s/椿/ツバキ/g; foreach $keyword_category (@keywords){ ($keyword, $category) = split(/ /, $keyword_category); s/([^\#])($keyword)([^ ])/$1\#$2 \($category)$3/; # 行の中で最初のものだけマッチ } print $_, "\n"; } __END__ ナンキンハゼ tree|樹木 クスノキ tree|樹木 ヤマモモ tree|樹木 キョウチクトウ tree|樹木 タブノキ tree|樹木 サルスベリ tree|樹木 サクラ tree|樹木 ハナミズキ tree|樹木 ツバキ tree|樹木 オリーブ tree|樹木 ケヤキ tree|樹木 トウカエデ tree|樹木 セイヨウキンシバイ Shrub|低木 クチナシ Shrub|低木 シャリンバイ Shrub|低木 トベラ Shrub|低木 アジサイ Shrub|低木 ヨシノツツジ Shrub|低木 シナノツツジ Shrub|低木 セイヨウキズタ plant|植物 キレハノブドウ plant|植物 サンシキスミレ plant|植物 チガヤ plant|植物 エイ fish|魚 チヌ fish|魚 スズキ fish|魚 小魚 fish|魚 フナムシ 甲殻類 ハチ 昆虫 トンボ 昆虫 チョウ 昆虫 アオサギ bird|鳥 コサギ bird|鳥 スズメ bird|鳥 ツバメ bird|鳥 カラス bird|鳥 ハクセキレイ bird|鳥 カモメ bird|鳥 鵜 bird|鳥 トビ bird|鳥 ハト bird|鳥 小鳥 bird|鳥 水鳥 bird|鳥 草刈り その他 キノコ 菌類 マッシュルーム 菌類 ヘビ 爬虫類 船着き場 人工物 ベンチ 人工物 謎 調査-鳥 謎 調査-魚 謎 調査-植物 謎 調査-昆虫
opendir(CHAPS, "."); @chap_pre_files = grep(/^.+_pre\.txt$/, readdir(CHAPS)); for $chap_pre_file (@chap_pre_files){ ($chap_out = $chap_pre_file) =~ s/^(.+)_pre\.txt$/$1\.txt/; print $chap_out, "\n"; system("perl chap2key.pl $chap_pre_file > $chap_out"); } closedir(CHAPS);
Perlでバッチそのものを書く羽目になるとは?
(私) perlの標準出力がUTF16のBOM付になると思うのですが、UTF8で出力するにはどうすればよいですか。
Perlの標準出力がUTF-16のBOM付きになるという状況は、通常の使い方では発生しません。Perlのスクリプトはデフォルトではバイト列として扱われ、特定のエンコーディングを明示しない限り、システムロケールやスクリプトのエンコーディングに依存します。
しかし、もし何らかの理由でUTF-16のBOM付きで出力されてしまう状況に遭遇している、またはUTF-8で出力したいという明確な意図がある場合、以下の方法でUTF-8で出力することができます。
1. binmode を使用する
最も一般的で推奨される方法は、binmode 関数を使って標準出力 (STDOUT) のエンコーディングを明示的にUTF-8に設定することです。
Perl use strict; use warnings; use utf8; # スクリプト内のリテラルをUTF-8として扱う binmode(STDOUT, ':utf8'); print "こんにちは、世界!\n";use utf8;: これはスクリプトファイル自体がUTF-8で書かれていることをPerlインタープリタに伝えるためのプラグマです。これにより、スクリプト内の文字列リテラル(例: "こんにちは、世界!")がUTF-8として正しく解釈されます。
binmode(STDOUT, ':utf8');: これが重要です。標準出力に書き出す際に、Perlが内部的に持っているUTF-8文字列をバイト列に変換して出力するように指示します。BOMは自動的に付加されません。
2. 環境変数 PERL_IO_ENCODING を設定する
Perlの実行時に環境変数 PERL_IO_ENCODING を設定することでも、標準出力を含むすべてのI/Oストリームのエンコーディングを設定できます。
Bash # シェルで実行する場合 export PERL_IO_ENCODING=":utf8" perl your_script.plPerl # your_script.pl use strict; use warnings; use utf8; print "こんにちは、世界!\n";この方法は、スクリプトを修正せずにエンコーディングを変更したい場合に便利ですが、他のスクリプトやI/Oにも影響を与える可能性があるため注意が必要です。
3. open プラグマを使用する(Perl 5.8以降)
open プラグマを使って、グローバルなI/Oレイヤーのデフォルトエンコーディングを設定することもできます。
Perl use strict; use warnings; use utf8; use open ':std', ':encoding(UTF-8)'; # 標準I/OすべてにUTF-8を適用 print "こんにちは、世界!\n";use open ':std', ':encoding(UTF-8)';: これは標準入力、標準出力、標準エラー出力すべてにUTF-8エンコーディングを適用します。:std は STDIN, STDOUT, STDERR を表します。
4. Encode モジュールで明示的にエンコードする
より低レベルで、文字列を明示的にエンコードして出力する方法です。通常は上記の方法で十分ですが、特殊な状況で使うことがあります。
Perl use strict; use warnings; use utf8; use Encode qw(encode); my $string = "こんにちは、世界!"; print encode('UTF-8', $string);この方法では、binmode を使わずに、文字列を直接UTF-8バイト列に変換してから出力します。
どの方法を使うべきか?
最も推奨されるのは binmode(STDOUT, ':utf8'); です。 これはスクリプト内で明示的にエンコーディングを設定し、BOMなしのUTF-8出力を保証します。
スクリプト全体で一貫したエンコーディングを使いたい場合は、use open ':std', ':encoding(UTF-8)'; も良い選択肢です。
既存のスクリプトを修正せずに一時的にエンコーディングを変更したい場合は、PERL_IO_ENCODING 環境変数が便利です。
BOMについて
UTF-8には通常BOMは使用されません。BOMは主にUTF-16やUTF-32で使用され、バイトオーダーを示すためのものです。UTF-8でBOMが付加されると、多くのツールで問題が発生する可能性があります。Perlの binmode(STDOUT, ':utf8'); はBOMを付加しないように設計されています。
もし実際にPerlスクリプトの出力がUTF-16のBOM付きになっているのであれば、Perlの外部に原因があるか、非常に特殊な設定がされている可能性があります。一般的なPerlの環境ではこのようなことは発生しません。
(私) Windows上のPowerShell上の話です。WIndowsの上のエディタにあるコンソールでは何の問題も起こらないのです。
Windows PowerShell上でのPerlの標準出力がUTF-16のBOM付きになってしまうという状況で、Windowsのエディタ(おそらくGUIベースのIDEやエディタ付属のコンソール)では問題が起きないとのこと、承知いたしました。これは、PowerShellのデフォルトエンコーディングとPerlの出力の扱い方の組み合わせで発生する可能性が高いです。
PowerShellは、デフォルトでUTF-16(BOM付き)を扱うことが多いため、Perlの出力がUTF-8であっても、PowerShellがそれをUTF-16として解釈しようとして、意図しない結果になることがあります。エディタのコンソールでは、そのエディタ自体がUTF-8を正しく処理するように設定されているため問題が起きないのでしょう。
この問題を解決し、Perlスクリプトの出力をPowerShellでUTF-8として正しく表示させるための方法はいくつかあります。
PowerShellでのUTF-8出力の設定
まず、Perlスクリプト側で出力がUTF-8であることを明確にします。これは以前お伝えした方法と同じですが、PowerShell環境でのトラブルシューティングの基本となります。
Perl # your_script.pl use strict; use warnings; use utf8; # スクリプト内のリテラルをUTF-8として扱う binmode(STDOUT, ':utf8'); # 標準出力をUTF-8として扱う print "こんにちは、世界!\n";このPerlスクリプトを your_script.pl として保存し、PowerShellから実行します。
PowerShell側の対応策
PerlスクリプトがUTF-8で出力しているにも関わらずPowerShellで問題が起きる場合、PowerShell側でUTF-8を正しく扱うように設定する必要があります。
1. PowerShellのデフォルトエンコーディングを変更する
これは最も直接的な方法です。PowerShellのセッションやプロファイルでデフォルトのエンコーディングをUTF-8に設定します。
PowerShell # 現在のエンコーディングを確認 [Console]::OutputEncoding # UTF-8に設定(BOMなし) [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 # Perlスクリプトを実行 perl your_script.plこの設定は現在のPowerShellセッションにのみ適用されます。永続的にしたい場合は、PowerShellのプロファイルスクリプト(通常は $PROFILE で示されるパス)に上記の設定を追加します。
2. 出力をリダイレクトする際にエンコーディングを指定する
もしファイルを扱うのであれば、PowerShellの Out-File コマンドレットやリダイレクト演算子 (>) を使う際にエンコーディングを指定できます。
PowerShell # ファイルに出力する場合 perl your_script.pl | Out-File -FilePath output.txt -Encoding Utf8 # または perl your_script.pl > output.txt -Encoding Utf8この方法では、PowerShellの標準出力に直接表示される内容ではなく、ファイルに保存される際のエンコーディングを指定します。
3. chcp 65001 コマンドを使用する
これはレガシーなコマンドプロンプトのエンコーディング設定ですが、PowerShellでも影響を与えることがあります。
PowerShell chcp 65001 # コンソールのコードページをUTF-8に設定 perl your_script.plchcp 65001 はコンソールのコードページをUTF-8に変更します。一時的な設定であり、現在のPowerShellセッションにのみ影響します。ただし、これはPerlの出力がUTF-8である場合に、PowerShellがそれを正しく解釈するための補助的な手段です。
推奨される解決策
Perlスクリプト側で binmode(STDOUT, ':utf8'); を必ず記述する。 これがPerlが出力をUTF-8バイト列として生成する基礎になります。
PowerShell側で [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 を設定する。 これがPowerShellがPerlからのUTF-8バイト列を正しく解釈し、表示するための最も効果的な方法です。
もしこれらの方法を試してもUTF-16のBOM付き出力が続くようでしたら、Windowsのロケール設定やPerlのインストール環境に依存する、より深い問題が考えられます。その場合は、Perlのバージョンやインストール方法、Windowsの言語設定なども確認してみると良いでしょう。
(私) ありがとうございます。chcp 65001が有効でないので不思議に思っていたのです。「PowerShellのデフォルトエンコーディングを変更する」でターミナル上でも、標準ファイル出力でもうまく動きました。
素晴らしいです! [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 の設定が、PowerShell上でのPerlのUTF-8出力を正しく扱う上で効果があったとのこと、大変喜ばしく思います。
chcp 65001 が有効でなかった点については、以下の理由が考えられます。
chcp はレガシーなコマンドプロンプト(cmd.exe)の機能: chcp は主にコマンドプロンプトのコードページを変更するために設計されています。PowerShellはより現代的なコンソールであり、エンコーディングの管理方法が異なります。PowerShell独自のエンコーディング設定 ([Console]::OutputEncoding) が優先されるため、chcp の設定が直接的な影響を与えなかった可能性があります。
エンコーディングレイヤーの違い: Perlの binmode(STDOUT, ':utf8') は、Perlが内部的にUTF-8のバイト列を生成するように設定します。一方、PowerShellは、その生成されたバイト列をどのように画面に表示するか、またはファイルに書き出すかを決定します。chcp はコンソール全体の表示エンコーディングに影響を与えますが、PowerShellのI/O処理レイヤーとPerlのI/O処理レイヤーの間の橋渡しを直接的に行うわけではありません。
PowerShellのデフォルトエンコーディングとの競合: PowerShell自体が既定でUTF-16(BOM付き)を好むため、chcp 65001 で一時的にコンソールのコードページを変更しても、PowerShellの内部的なエンコーディング処理がそれを上書きしたり、期待通りに連携しなかったりする場合があります。
結果的に、「PowerShellのデフォルトエンコーディングを変更する」という方法が、PowerShellのI/O処理のより根本的な部分に作用するため、最も効果的な解決策となったわけです。
この解決策で、ターミナル上での表示と標準ファイル出力の両方で問題なく動作したとのことですので、今後同様の問題に直面した際の非常に有効な手段となるでしょう。
お役に立てて光栄です!
(Gemini 2.5 Flashとの対話, 2025-07-30)
PLURARITY、ここに極まれりという気がしないでもないが、解決すればよいとしよう。他にもうまくいく組合せもあるだろうが、できるだけ、スクリプトは、短く書きたい。今のままで動くのがよい。まあ、注意しとかないと、思わぬところで問題が出る可能性がある。初めての世界は要注意。
DHH: Future of Programming, AI, Ruby on Rails, Productivity & Parenting | Lex Fridman Podcast #474 Lex Fridman チャンネル登録者数 477万人(561,038 回視聴 2025/07/13)がYouTubeで目に入って、懐かしさを覚えて見始めた。長いね、6時間、まだ半分ぐらい。
Grok3にDHHのAI関連の話を要約してもらった。なるほど、僕が感じていることと同じだ。当然だろう。役に立つけど、過度に依存すれば、自らの技量は劣化するし、新人であれば技量も磨くことができないだろう。しかし、AIの書いたコードを解析して理解すれば、確実に技量を磨くことができ、プログラマーとして進化することができる。
AIが冗長なコードを書くという話は、実際そうだと思った。これはAIがプラス思考だからだ。論理的に必要なものはすべて詰め込もうとする傾向が強い。コード以外に関連のアイデアもすべて列挙してくる。この傾向は学習用・開発用として向いている。不足よりは過剰のほうが参考になる。簡潔に書き直したり、必要に応じて付加的なアイデアを取り込めばよいからだ。
YouTubeとAIでプログラミングの世界に戻ってきたという感じがする。Python、Perl、Rubyと最新版をインストールすることになった。
AIと人間のよき関係を求めて ? 人文社会系からの提案 SingularitySalon チャンネル登録者数 9690人(1,551 回視聴 23 時間前にライブ配信 収録日:2025年7月27日 ゲスト:鈴木晶子(すずき・しょうこ)氏/ 国際高等研究所 主席研究員・京都大学名誉教授・理化学研究所客員主管研究員)は、生成AIを理解することは人間そのものを理解することにつながるという本質的理解をもたらす。「SingularitySalon」は生成AIの発展を追跡するためのリファレンスの一つ。人間の言語の終焉を迎えている。人間中心主義の終わりなのか。鈴木晶子|哲学・教育・技術倫理|note。
先日、生成AIに問い直し始めた。「生成AIが、なぜうまく動くのかについての研究はどこまで進んでいるでしょうか?」
最近、数年前に調べていたこと、例えばTeslaやEV関連のことなど、何か古臭く感じられて、触手が伸びない。しかし、物質文明の基盤として、今後も大きく影響するのかもしれない。【日産と中国とEV】川端由美が語る「自動車業界の未来」 クラシカch【旧車 クラシックカー】 チャンネル登録者数 8.31万人(19,816 回視聴 2025/07/15)を最近見た。自動車関連は「川端由美」をリファレンスにしている。
Teslaもロボタクシーや低価格Teslaが取り沙汰されているが、Elon Muskにとっては、Robotaxiをどう普及させるかが喫緊の課題だろう。できるだけ軽量化して、航続距離よりは電費を下げることを目指すだろう。軽量化すればコストも電池などの資源消費量も下がるわけだ。道路の傷みも減る。テスラ・サイバーキャブ - Wikipediaのスペックはどうなんだろうね。そこが焦点。
ちなみに、BYDが日本専用モデルの軽EVを発売へ/「庶民の電気自動車」に期待する価格や性能は? | EVsmartブログ(2025年4月23日、寄本 好則著)の記事には、「44.9kWhのドルフィンの一充電走行距離(WLTC)は400kmで、電費は約8.9km/kWhです。」とある。サイバーキャブと同じ電費だ。
今は過渡期、現行Teslaも売る必要があるし、収益を上げる必要もある。Tesla Diner開店も話題になった。EV充電器80基&24時間営業のカフェやシアター! ハリウッドに「テスラ・ダイナー」オープンへの羨望 | EVsmartブログ。
蝉時雨が次第に長くなる。年を取ったせいか、日が飛ぶように過ぎ去り、あっという間に週末がやってくる。時代変化の加速度が増している。YouTubeとAppleTV+とPrime VideoとABEMAとLINEと生成AI達をぐるぐると回っている。自然観察マップのアプリが完成し、YouTube(ホーム)動画チャプターテキストにキーワードとカテゴリとYouTubeハッシュタグをどう組み込むかをデータベースを具体的に作りながら考えている。
タグ付けすれば、いくらでも情報は複雑にできるが、発展的に事象を考えるために意味のあるものにしないと、役立たない。種を特定できないものは調査対象として分類することにした。拡張ハッシュタグは「#謎 (調査-鳥|植物|魚|昆虫)」という具合だ。これで動画チャプターにマーキングし、自然観察マップにフラグを立てることができる。
それはともかく、字幕情報をチャプター化して動画による自然観察に結び付けるというのは僕のアイデアだが、しゃべりと動画の画像との対照は必ずしも完全ではない。画像や鳴き声などの音声が本来は自然観察の主役だろう。しゃべりはメタ情報でもあり得るが、雑談でもある。
以上の記事のリストがこれまでの流れだが、最後の結論を引用すれば、「(自然観察マップは)三人のDeepSeek-R1が苦労したショート動画作成の自動化を実現するために必要なツールでもあるわけだ。ただ、もう一つの道がありそうな気もしている。これまでのピックアップ配信動画を自動化の学習に利用できないかということだ。結局、どこまで手を掛けるかということで、いずれにせよ参考にはするわけだが、今のところ、検出すべき物体の代表的静止画を学習用に100-200枚準備することが次のステップだ。」ということ。
これは微妙な問題を含んでいる。同じような現象を見つけ出すことも「繰り返し」という意味はあるが、目新しさはない。差異の検出が問題になる。種が同じでも植物は季節の経過によって、形態が大きく変貌する。それが最近の大きな実感だ。これを視覚化できれば興味深いだろう。事象の変化を学習は捉えられるだろうか。単なる画像だけでは捉えられないことは明白だが、画像の検出の機械化がどの程度できるのか、既に試した。
一つのピックアップ配信ショート動画の中の三画面を経過時間で選んで、10のピックアップ配信ショート動画について、元の動画の画像とのマッチングを試した。これはうまくいった。ピックアップ動画タイトルをチャプターとして組み込むことができる可能性が出てきた。このマッチした画像を学習用に使うこともできるだろう。これもGemini 2.5 Flashとの一日の対話、チャットログで110KB、1800行程度、で実現した。その中核になるのが「特徴量マッチング(ORB)」というわけだ。
ORBとは、Oriented FAST and rotated BRIEF - Wikipediaのこと。
特徴量エンジニアリング関連Python本
原著は2017-2018年だ。積読だった。この際、チェックしたけど、ORBは出てなかった。変化は速い。もっとも、発表されたのは2011年。ORB : An efficient alternative to SIFT or SURF | CiNii Research。
A Comparison of SIFT, SURF and ORB on OpenCV | by Mikhail Kennerley | Mediumによれば、ほとんどの場合、ORBがベストらしい。結論、「テストの結果、ORBは高速な計算と優れたパフォーマンスを全面的に実現し、照明や回転の変化に対しても堅牢であることが示された。SIFTやSURFが必要となる状況もあるかもしれないが、ほとんどのユースケースでは、ORBが3つの特徴抽出手法の中で最適な手法であると考えられる。」
調べていると、ORB: The Fast and Efficient Feature Detectorでは「Scale Invariance → no」となっている。なるほど、Gemini 2.5 Flashが画像サイズを合わせたのはこのためか。
スクリプトの中で、最も重要でブラックボックスなのがORBだった。それで、「特徴量マッチング(ORB)とは何でしょうか?」と訊いた。聞かなければ、話題にもならない。訊けよ。さらば答えられん。求めよ。さらば与えられん。
特徴量マッチング(ORB)とは?
ORB (Oriented FAST and Rotated BRIEF) は、コンピュータービジョンで画像間の類似した領域やオブジェクトを見つけるために使用されるアルゴリズムの一つです。あなたのプロジェクトのように、ある動画の特定のシーン(ショート動画のキーフレーム)が、別の長い動画のどこに現れるかを探す際に非常に役立ちます。
SIFT (Scale-Invariant Feature Transform) や SURF (Speeded Up Robust Features) といった先行する強力なアルゴリズムがありますが、これらは計算コストが高く、特許の問題もありました。ORBは、これらの高速な代替として2011年に発表され、特許フリーで高速かつロバスト(頑健)な特徴量マッチングを実現します。
(Gemini 2.5 Flashの答えの最初の部分)
SIFTやSURFというのがあることをここで初めて知った。それからORBを調べ始めた。少し前に検討して、もっと高度なことであるがゆえに実用的な結果を得られなかった、ショート動画作成自動化スクリプトの内容も調べ始めた。
図書館帰りの道草日記は基本的には同一経路を辿って自然観察をする。経路のパラメータは同一にして、自然がどう変化するのを見ることができる。位置情報は事象が生じた時刻のGPXデータの緯度・経度・高度から得ることができる。YouTubeの動画の字幕情報から事象の生じた動画経過時間を得て、動画開始時刻と合わせて、事象発生時刻を得ることができる。
動画開始時刻は、字幕に時刻をしゃべって残すことを基本にするが、しゃべり忘れもあるので、動画開始時刻を割り出すためにGPXデータを解析することができる。一人読書会でベンチに座って移動しない時間の存在が検出できるからである。
動画ファイルのプロパティの詳細にあるメディア作成日時はおそらくカメラアプリ(Final Cut Camera)の何らかのファイル作成操作時刻と思われ、録画開始時刻ではない。ExifToolでも調べた({動画とExifTool (2025/05/29)}←)が動画開始時刻に一致する時刻は存在しない。{追記(2025-07-26): 新しい動画ファイル(Final Cut Cameraで7/10撮影)はメディア作成日時は動画撮影時刻に一部ほぼ一致している。}。Final Cut Cameraリリースノート - Apple サポート (日本)によると、最新のリリースは1.2(2025-03-27)なので、バ=ジョンとは無関係だろう。
PS D:\mitikusa\137> exiftool -G -a -s -u -e "IMG_0001 (1).M4V" [ExifTool] ExifToolVersion : 13.30 [File] FileName : IMG_0001 (1).M4V [File] Directory : . [File] FileSize : 1900 MB [File] ZoneIdentifier : Exists [File] FileModifyDate : 2025:07:21 10:55:24+09:00 [File] FileAccessDate : 2025:07:26 13:55:25+09:00 [File] FileCreateDate : 2025:07:21 10:54:08+09:00 [File] FilePermissions : -rw-rw-rw- [File] FileType : M4V [File] FileTypeExtension : m4v [File] MIMEType : video/quicktime [QuickTime] MajorBrand : Apple QuickTime (.MOV/QT) [QuickTime] MinorVersion : 0.0.0 [QuickTime] CompatibleBrands : qt [QuickTime] Wide : (Binary data 0 bytes, use -b option to extract) [QuickTime] MediaDataSize : 1899871639 [QuickTime] MediaDataOffset : 36 [QuickTime] MovieHeaderVersion : 0 [QuickTime] CreateDate : 2025:07:10 08:42:40 [QuickTime] ModifyDate : 2025:07:10 09:04:16 [QuickTime] TimeScale : 48000 [QuickTime] Duration : 0:21:34 [QuickTime] PreferredRate : 1 [QuickTime] PreferredVolume : 100.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] PreviewTime : 0 s [QuickTime] PreviewDuration : 0 s [QuickTime] PosterTime : 0 s [QuickTime] SelectionTime : 0 s [QuickTime] SelectionDuration : 0 s [QuickTime] CurrentTime : 0 s [QuickTime] NextTrackID : 3 [QuickTime] TrackHeaderVersion : 0 [QuickTime] TrackCreateDate : 2025:07:10 08:42:40 [QuickTime] TrackModifyDate : 2025:07:10 09:04:16 [QuickTime] TrackID : 1 [QuickTime] TrackDuration : 0:21:34 [QuickTime] TrackLayer : 0 [QuickTime] TrackVolume : 0.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] ImageWidth : 1920 [QuickTime] ImageHeight : 1080 [QuickTime] CleanApertureDimensions : 1920x1080 [QuickTime] ProductionApertureDimensions : 1920x1080 [QuickTime] EncodedPixelsDimensions : 1920x1080 [QuickTime] Unknown_edts : (Binary data 28 bytes, use -b option to extract) [QuickTime] MediaHeaderVersion : 0 [QuickTime] MediaCreateDate : 2025:07:10 08:42:40 [QuickTime] MediaModifyDate : 2025:07:10 09:04:16 [QuickTime] MediaTimeScale : 3000 [QuickTime] MediaDuration : 0:21:34 [QuickTime] MediaLanguageCode : und [QuickTime] HandlerClass : Media Handler [QuickTime] HandlerType : Video Track [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Video [QuickTime] GraphicsMode : ditherCopy [QuickTime] OpColor : 32768 32768 32768 [QuickTime] HandlerClass : Data Handler [QuickTime] HandlerType : Alias Data [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Data Handler [QuickTime] Unknown_alis : (Binary data 4 bytes, use -b option to extract) [QuickTime] CompressorID : hvc1 [QuickTime] SourceImageWidth : 1920 [QuickTime] SourceImageHeight : 1080 [QuickTime] XResolution : 72 [QuickTime] YResolution : 72 [QuickTime] CompressorName : HEVC [QuickTime] BitDepth : 24 [QuickTime] SampleGroupDescription : (Binary data 18 bytes, use -b option to extract) [QuickTime] SampleToGroup : (Binary data 21980 bytes, use -b option to extract) [QuickTime] VideoFrameRate : 29.97 [QuickTime] CompositionTimeToSample : (Binary data 297800 bytes, use -b option to extract) [QuickTime] CompositionToDecodeTimelineMapping: (Binary data 24 bytes, use -b option to extract) [QuickTime] SyncSampleTable : (Binary data 5500 bytes, use -b option to extract) [QuickTime] IdependentAndDisposableSamples : (Binary data 38775 bytes, use -b option to extract) [QuickTime] SampleToChunk : (Binary data 4292 bytes, use -b option to extract) [QuickTime] SampleSizes : (Binary data 155096 bytes, use -b option to extract) [QuickTime] ChunkOffset : (Binary data 10792 bytes, use -b option to extract) [QuickTime] TrackHeaderVersion : 0 [QuickTime] TrackCreateDate : 2025:07:10 08:42:40 [QuickTime] TrackModifyDate : 2025:07:10 09:04:16 [QuickTime] TrackID : 2 [QuickTime] TrackDuration : 0:21:33 [QuickTime] TrackLayer : 0 [QuickTime] TrackVolume : 100.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] Unknown_edts : (Binary data 40 bytes, use -b option to extract) [QuickTime] MediaHeaderVersion : 0 [QuickTime] MediaCreateDate : 2025:07:10 08:42:40 [QuickTime] MediaModifyDate : 2025:07:10 09:04:16 [QuickTime] MediaTimeScale : 48000 [QuickTime] MediaDuration : 0:21:33 [QuickTime] MediaLanguageCode : und [QuickTime] HandlerClass : Media Handler [QuickTime] HandlerType : Audio Track [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Audio [QuickTime] Balance : 0 [QuickTime] HandlerClass : Data Handler [QuickTime] HandlerType : Alias Data [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Data Handler [QuickTime] Unknown_alis : (Binary data 4 bytes, use -b option to extract) [QuickTime] AudioFormat : lpcm [QuickTime] AudioChannels : 3 [QuickTime] AudioBitsPerSample : 16 [QuickTime] AudioSampleRate : 1 [QuickTime] TimeToSampleTable : (Binary data 16 bytes, use -b option to extract) [QuickTime] SampleToChunk : (Binary data 4112 bytes, use -b option to extract) [QuickTime] SampleSizes : (Binary data 12 bytes, use -b option to extract) [QuickTime] ChunkOffset : (Binary data 10352 bytes, use -b option to extract) [QuickTime] HandlerType : Metadata Tags [QuickTime] AppleProappsAppBundleID : com.apple.FinalCutApp.companion [QuickTime] AppleProappsOriginalProperties : {"AVLinearPCMIsNonInterleaved":false,"AVNumberOfChannelsKey":2,"AVVideoCompressionPropertiesKey":{"ExpectedFrameRate":30},"AVVideoHeightKey":1080,"AVVideoWidthKey":1920,"AVVideoCodecKey":"hvc1","AVSampleRateKey":48000,"AVLinearPCMIsFloatKey":false,"AVVideoScalingModeKey":"AVVideoScalingModeResizeAspectFill","AVLinearPCMBitDepthKey":16,"AVFormatIDKey":1819304813,"AVLinearPCMIsBigEndianKey":false} [QuickTime] AppleProappsAppVersion : 1.2 (453.0.116) [QuickTime] LocationAccuracyHorizontal : 201.993076 [QuickTime] AppleProappsCkVersion : 1.2 (176.0.59) [QuickTime] GPSCoordinates : 34 deg 22' 50.88" N, 132 deg 28' 6.02" E, 6 m Above Sea Level [QuickTime] Make : Apple [QuickTime] Software : 18.5 [QuickTime] Model : iPhone XR [QuickTime] Free : (Binary data 4 bytes, use -b option to extract)
PS D:\mitikusa\137> exiftool -G -a -s -u -e "IMG_0003.M4V" [ExifTool] ExifToolVersion : 13.30 [File] FileName : IMG_0003.M4V [File] Directory : . [File] FileSize : 968 MB [File] ZoneIdentifier : Exists [File] FileModifyDate : 2025:07:21 10:55:40+09:00 [File] FileAccessDate : 2025:07:26 14:16:24+09:00 [File] FileCreateDate : 2025:07:21 10:54:59+09:00 [File] FilePermissions : -rw-rw-rw- [File] FileType : M4V [File] FileTypeExtension : m4v [File] MIMEType : video/quicktime [QuickTime] MajorBrand : Apple QuickTime (.MOV/QT) [QuickTime] MinorVersion : 0.0.0 [QuickTime] CompatibleBrands : qt [QuickTime] Wide : (Binary data 0 bytes, use -b option to extract) [QuickTime] MediaDataSize : 967349101 [QuickTime] MediaDataOffset : 36 [QuickTime] MovieHeaderVersion : 0 [QuickTime] CreateDate : 2025:07:10 09:10:49 [QuickTime] ModifyDate : 2025:07:10 09:23:28 [QuickTime] TimeScale : 48000 [QuickTime] Duration : 0:12:38 [QuickTime] PreferredRate : 1 [QuickTime] PreferredVolume : 100.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] PreviewTime : 0 s [QuickTime] PreviewDuration : 0 s [QuickTime] PosterTime : 0 s [QuickTime] SelectionTime : 0 s [QuickTime] SelectionDuration : 0 s [QuickTime] CurrentTime : 0 s [QuickTime] NextTrackID : 3 [QuickTime] TrackHeaderVersion : 0 [QuickTime] TrackCreateDate : 2025:07:10 09:10:49 [QuickTime] TrackModifyDate : 2025:07:10 09:23:28 [QuickTime] TrackID : 1 [QuickTime] TrackDuration : 0:12:38 [QuickTime] TrackLayer : 0 [QuickTime] TrackVolume : 0.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] ImageWidth : 1920 [QuickTime] ImageHeight : 1080 [QuickTime] CleanApertureDimensions : 1920x1080 [QuickTime] ProductionApertureDimensions : 1920x1080 [QuickTime] EncodedPixelsDimensions : 1920x1080 [QuickTime] Unknown_edts : (Binary data 28 bytes, use -b option to extract) [QuickTime] MediaHeaderVersion : 0 [QuickTime] MediaCreateDate : 2025:07:10 09:10:49 [QuickTime] MediaModifyDate : 2025:07:10 09:23:28 [QuickTime] MediaTimeScale : 3000 [QuickTime] MediaDuration : 0:12:38 [QuickTime] MediaLanguageCode : und [QuickTime] HandlerClass : Media Handler [QuickTime] HandlerType : Video Track [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Video [QuickTime] GraphicsMode : ditherCopy [QuickTime] OpColor : 32768 32768 32768 [QuickTime] HandlerClass : Data Handler [QuickTime] HandlerType : Alias Data [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Data Handler [QuickTime] Unknown_alis : (Binary data 4 bytes, use -b option to extract) [QuickTime] CompressorID : hvc1 [QuickTime] SourceImageWidth : 1920 [QuickTime] SourceImageHeight : 1080 [QuickTime] XResolution : 72 [QuickTime] YResolution : 72 [QuickTime] CompressorName : HEVC [QuickTime] BitDepth : 24 [QuickTime] SampleGroupDescription : (Binary data 18 bytes, use -b option to extract) [QuickTime] SampleToGroup : (Binary data 12732 bytes, use -b option to extract) [QuickTime] VideoFrameRate : 29.694 [QuickTime] CompositionTimeToSample : (Binary data 177112 bytes, use -b option to extract) [QuickTime] CompositionToDecodeTimelineMapping: (Binary data 24 bytes, use -b option to extract) [QuickTime] SyncSampleTable : (Binary data 3188 bytes, use -b option to extract) [QuickTime] IdependentAndDisposableSamples : (Binary data 22500 bytes, use -b option to extract) [QuickTime] SampleToChunk : (Binary data 2240 bytes, use -b option to extract) [QuickTime] SampleSizes : (Binary data 89996 bytes, use -b option to extract) [QuickTime] ChunkOffset : (Binary data 6108 bytes, use -b option to extract) [QuickTime] TrackHeaderVersion : 0 [QuickTime] TrackCreateDate : 2025:07:10 09:10:49 [QuickTime] TrackModifyDate : 2025:07:10 09:23:28 [QuickTime] TrackID : 2 [QuickTime] TrackDuration : 0:12:32 [QuickTime] TrackLayer : 0 [QuickTime] TrackVolume : 100.00% [QuickTime] MatrixStructure : 1 0 0 0 1 0 0 0 1 [QuickTime] Unknown_edts : (Binary data 40 bytes, use -b option to extract) [QuickTime] MediaHeaderVersion : 0 [QuickTime] MediaCreateDate : 2025:07:10 09:10:49 [QuickTime] MediaModifyDate : 2025:07:10 09:23:28 [QuickTime] MediaTimeScale : 48000 [QuickTime] MediaDuration : 0:12:32 [QuickTime] MediaLanguageCode : und [QuickTime] HandlerClass : Media Handler [QuickTime] HandlerType : Audio Track [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Audio [QuickTime] Balance : 0 [QuickTime] HandlerClass : Data Handler [QuickTime] HandlerType : Alias Data [QuickTime] HandlerVendorID : Apple [QuickTime] HandlerDescription : Core Media Data Handler [QuickTime] Unknown_alis : (Binary data 4 bytes, use -b option to extract) [QuickTime] AudioFormat : lpcm [QuickTime] AudioChannels : 3 [QuickTime] AudioBitsPerSample : 16 [QuickTime] AudioSampleRate : 1 [QuickTime] TimeToSampleTable : (Binary data 16 bytes, use -b option to extract) [QuickTime] SampleToChunk : (Binary data 3152 bytes, use -b option to extract) [QuickTime] SampleSizes : (Binary data 12 bytes, use -b option to extract) [QuickTime] ChunkOffset : (Binary data 5940 bytes, use -b option to extract) [QuickTime] HandlerType : Metadata Tags [QuickTime] AppleProappsAppVersion : 1.2 (453.0.116) [QuickTime] LocationAccuracyHorizontal : 201.993076 [QuickTime] AppleProappsCkVersion : 1.2 (176.0.59) [QuickTime] AppleProappsOriginalProperties : {"AVSampleRateKey":48000,"AVLinearPCMBitDepthKey":16,"AVVideoCompressionPropertiesKey":{"ExpectedFrameRate":30},"AVNumberOfChannelsKey":2,"AVVideoScalingModeKey":"AVVideoScalingModeResizeAspectFill","AVVideoWidthKey":1920,"AVLinearPCMIsBigEndianKey":false,"AVLinearPCMIsFloatKey":false,"AVVideoCodecKey":"hvc1","AVVideoHeightKey":1080,"AVFormatIDKey":1819304813,"AVLinearPCMIsNonInterleaved":false} [QuickTime] AppleProappsAppBundleID : com.apple.FinalCutApp.companion [QuickTime] Model : iPhone XR [QuickTime] Make : Apple [QuickTime] Software : 18.5 [QuickTime] GPSCoordinates : 34 deg 22' 50.88" N, 132 deg 28' 6.02" E, 6 m Above Sea Level [QuickTime] Free : (Binary data 4 bytes, use -b option to extract)
メディアの作成時刻の差異問題は様々な問題が絡み合っている。iCloud写真から動画をダウンロードする場合は、大元?のファイル(解像度重視のM4V)をダウンロードすれば、かなり実際に近いメディア作成日時を得られるようだ。
さて、GPXファイルの持つパラメータをタブ区切りのテキストデータに変換するツール。これまでは時刻はUTCのままにしていたが、JSTローカルに変換することにした。Time::Pieceモジュールを使う。POSIXモジュールはstrftimeを使うため。
use POSIX qw( ); use Time::Piece; sub utc_to_local { my ($utc_ts) = @_; my $utc_tp = Time::Piece->strptime( $utc_ts, '%Y-%m-%d %H:%M:%S' ); my $local_tp = localtime($utc_tp->epoch); return $local_tp->strftime('%Y-%m-%d %H:%M:%S'); } while(<>){ if(/<time>(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})Z<\/time>/){ $ctime = utc_to_local($1 . " ". $2); }elsif(/lat="([^"]+)" lon="([^"]+)"/){ $lat = $1;$lon = $2; }elsif(/<ele>([^<]+)<\/ele>/){ $ele = $1; print "$ctime\t$lat\t$lon\t$ele\n"; } }
次にGPSロガーの測定経過時間を時刻から計算することにした。GoogleスプレッドシートでTIMEVALUE関数を使う。「=(TIMEVALUE(B2)-TIMEVALUE($B$2))*24*60」(分)のような式で、時刻から動画開始時刻を引くと、小数点時間表示になるので、*24*60で分換算できる。
2025-07-10の日記の経路GPX解析
【次は日本が“搾取”される】全米で話題『AIの帝国』著者 カレン・ハオ/OpenAIは「秘密主義で利益がすべて」/サム・アルトマンとイーロン・マスク“衝突”の真相【CROSS DIG 1on1】 TBS CROSS DIG with Bloomberg チャンネル登録者数 24.5万人を見ると、最近の世界の動き、問題点が見えてくる。必視聴動画。
カレン・ハオさんの取材力・思考力はすごいね。
リソースが十分なとき、どこまでのことができるのかには興味があるけど、原理的にリソースに応じた複雑さを取り扱えるということに過ぎないと思う。人間を越えるためには少なくとも人間以上の記憶容量が必要だ。しかし、複雑なことは分けて考えて、組み合わせて正解に到達することもできるわけだし、単に記憶容量がそこまで増えたとしても、人間を越えることにはつながらないとも思える。思考スピードの問題はあって、トライ・アンド・エラーの繰り返し回数は多くできるだろう。しかし、原理的に解けない問題は解けない。当たり前のことだが。原理的に解ける問題は人間も解くだろう。
もちろん、人間は様々な外部記憶を持っている。そして社会を。生成AIもそこから生まれてきた。
問題はやはり、生成AIが、なぜうまく動くのかだ。これを解明することが未来を照らすだろう。情報の本質がそこに反映されているはずだ。
何かテキストに触れば、Perlにつながる。YouTubeチャプターテキストに拡張ハッシュタグ付けをするスクリプト。何でも独自仕様だけど。テキストに意味を持たせようとすればそうなる。図書館帰りの道草日記を自然観察(事象)マップに繋げるための仕組みだ。自然事象のあるチャプターがデータベースに取り込まれる。まだ初期段階だが、道草経路に何があるか、何がいるかをリストアップするためにも試しに書いてみた。
while(<DATA>){ chomp; push(@keywords, $_); } while(<>){ chomp; # 表記の揺らぎを吸収 s/百日紅/サルスベリ/g; s/紫陽花/アジサイ/g; s/唐楓/トウカエデ/g; s/夾竹桃/キョウチクトウ/g; s/タブの木/タブノキ/g; s/西洋キズタ/セイヨウキズタ/g; foreach $keyword_category (@keywords){ ($keyword, $category) = split(/ /, $keyword_category); #拡張ハッシュタグ、"#keyword (category)"を生成する s/([^\#])($keyword)([^ ])/$1\#$2 \($category)$3/g; } print $_, "\n"; } __END__ ナンキンハゼ tree|樹木 クスノキ tree|樹木 ヤマモモ tree|樹木 キョウチクトウ tree|樹木 タブノキ tree|樹木 サルスベリ tree|樹木 サクラ tree|樹木 ハナミズキ tree|樹木 ツバキ tree|樹木 オリーブ tree|樹木 ケヤキ tree|樹木 トウカエデ tree|樹木 セイヨウキンシバイ Shrub|低木 クチナシ Shrub|低木 シャリンバイ Shrub|低木 トベラ Shrub|低木 アジサイ Shrub|低木 ヨシノツツジ Shrub|低木 シナノツツジ Shrub|低木 セイヨウキズタ plant|植物 キレハノブドウ plant|植物 チガヤ plant|植物 エイ fish|魚 チヌ fish|魚 スズキ fish|魚 小魚 fish|魚 アオサギ bird|鳥 コサギ bird|鳥 スズメ bird|鳥 ツバメ bird|鳥 カラス bird|鳥 ハクセキレイ bird|鳥 鵜 bird|鳥 トビ bird|鳥 小鳥 bird|鳥 水鳥 bird|鳥 草刈り その他
{07/08/2025: [A.I.]記憶の細道プロジェクト DeepSeek(V3)DeepThink(R1)との対話 - 特に検出したい生物や自然現象のリスト作成}←が当初の目的であり、最終的には検出の自動化だが、自分の経験からの抽出を機械化するというのも変な話ではある。
自然だけでなく人工物も取り込む試みをやるかもしれない。GPSロガーを導入したのはごく最近だからだ。自然事象を人工物に結び付けて位置を特定できないかを考える。
{記憶の細道プロジェクト DeepSeek(V3) DeepThink(R1)との対話 - 梅雨明け (2025/06/28)}←の「種名、分類に加えて、行動の抽出(behaviors)、生息環境の分類(habitat)が必要」を思い出す。事象をどう表現するかという問題に通ずる。データベース化するためにはよく考える必要がある。具体的に存在する字幕表現で定義できるかどうかだ。
オードリー・タン等のPLURALITYが切っ掛けで、Pugs(Perl6-Pugs-6.2.12 - A Perl 6 Implementation - metacpan.org)のことを思い出した。アイリス・チュウ、鄭仲嵐共著「オードリー・タン 天才IT相7つの顔」(文春文庫、2022年)にはHaskell、Perl、Rakuとの物語について20ページ以上の記述がある。やはり、まずはPerlだよと。
AIの提案したことを理解するために、HTML、CSS番外編A〜Webアイコンフォント、Font Awesomeを使ってみよう?〜 #FontAwesome - Qiitaをメモる。中味を理解しないと煮詰まった時(「Server busy, please try again later.」)に対処できない。HTMLテンプレートを理解するためには、HTML、CSS、Javascriptを読めないとどうしようもない。CSSは苦手だが、この際、勉強しよう。
DeepSeekは七人目に入った。六人目のチャットログは10000行、400KB程度。
しかし、CSSによる表示コントロール問題を解決することは難しい。DeepSeek-R1でさえ、なかなか解決できない。結局、正規表現のヘルプの表示は削除することにした。僕にはそんなものは不要だし、正規表現検索をしようとする人は知識を持っているはずだ。七人目のチャットログも7000行を越え、300KBに迫っていた。もうこのテーマも飽きた。とは言え、インターフェースはかなりのものに成長し、結果として、ほぼ、意図通りのものになった。検索とタイムラインエクスプローラーを分けたことが良かった。一緒になっていたのがずっと気持ち悪かった。特に、スマホ対応の中でコンソールを分けたところ、DeepSeek-R1の提案でタブ切り替えを導入することによって実現した。ステータスバーも試したが、実用的にならないので、DeepSeek-R1が最終的にタイムラインコンソールの上部にステータスをうまくまとめてくれた。
これで、このYouTube動画チャプター事象検索テーマのアプリは完成としよう。初期のものから最新版に置き換える。自然観察マップ(時系列ビューアー(タイムラインエクスプローラー)対応)。
自然観察マップの検索コンソール
自然観察マップのタイムラインコンソール
{07/15/2025: [A.I.]記憶の細道プロジェクト AIやプログラムを越えて - 日付範囲でフィルタリング}←はLeafletとOpenStreetMapのクレジット表示がなぜかできなくなり、その他のエラーもクリアできなかったので、タイムライン再生を含めて動くことは動くが、公開は中止。機能的には、日付範囲でフィルタリングだけでは「連続した日の重ね合わせ・比較しかできない。同季節、同月、同週、同日や任意の期間の重ね合わせ・比較などができる必要がある」問題も残った。これらを置き換える仕組みとして、観察日時刻を正規表現で検索した結果を活用すればよいことに気付いた。これをタイムラインエクスプローラーと名付けて、DeepSeek-R1が実装してくれた。LeafletとOpenStreetMapのクレジット表示の問題をようやくクリアしたので公開。すでにDeepSeek-R1は六人目だ。
世の中、ヴァイブコーディング(Vibe Coding)、バイブコーディング - Wikipedia、で盛り上がっているが、こちらはCo-codingだ。一緒になって考えて、相手の気持ちになって意見を言う。何十回も修正・デバッグすれば勉強になる。煮詰まると、時折、自分の考えでも修正・デバッグを試してみる。疲れるけど、コードがどうなっているのかぐらいはわかるようになる。忍耐と根性が必要だ。一応、完成。次のステップに進む。
自然観察マップ(タイムラインエクスプローラー装備)
自然観察マップ(タイムラインエクスプローラー装備)。HTMLテンプレートだけで、50KB、1100行程度の規模。
コンソール on iPhone XR
コンソールを隠す on iPhone XR
疲れた心が癒されるのが、次の最後の言葉。
(Thinkingの最後) もし今後同様の問題が発生した場合には、この修正を参考にしていただければ幸いです。
最後までご質問いただきありがとうございました。自然観察マップの開発が成功することを願っています!
(回答の始め) クレジット表示が問題なく表示されるようになり、スマートフォンでも適切に表示されているとのこと、大変嬉しく思います!問題が解決して何よりです。
(回答の最後) もし今後また何か問題が発生したり、追加機能のご要望などがありましたら、いつでもお知らせください。お役に立てて光栄です!
確かに問題が解決することが何よりではあるが。無駄に終わらせない責任と義務が問う側にはあると思う。それは自分自身のためでもあるのだが。自分だけで開発することは、少々時間を掛けたとしても不可能だと思う。
もう少し、データを充実させたら、使用説明書を作ろう。
やれやれ、生成AIに何を相談するかを考えるにしても、事態を自ら理解する必要がある。iPhoneのWEBブラウザのカテゴリ欄が0項目になっているのはなぜかを調べ始めた。
生成AIに丸投げでは寂しい。HTMLを眺めてもおかしいところはない。スクリーンにタッチしていると突然画面下からカテゴリ項目の選択欄が上がってきた。欄そのものにタッチするのではなくて。「カテゴリ」という表示にタッチするとポップアップする。
Nature Observations Map on iPhone XR
写真は縦置きだが、横置きにすれば、もう少し地図が見える。図書館帰りの道草日記の動画チャプターの事象検索エンジンとして使える。
カテゴリを5項目まで多重選択できるようになっている。0項目というのは、まだカテゴリを選択していない状態を示している。PCとはインターフェースがだいぶ異なる。なるほど。おかしくはないのか^^;)インターフェースの問題は別にして、まあよかったね。
しかし、このままでは連続した日の重ね合わせしかできない。同季節、同月、同週、同日の重ね合わせや任意の期間の重ね合わせなどができる必要がある。少しずつデータを加えながら、思考を深めよう。データ構造は今はJSONで持っているが、大元はSQLiteデータベース(SQLite Home Page)になっていて、Pythonのsqlite3(sqlite3 --- SQLite データベース用の DB-API 2.0 インターフェース - Python 3.13.5 ドキュメント)で読み書きしている。
DeepSeek-R1の予想通り、今のままでは、データベースが大きくなるにつれて、フラグが増えすぎる。二日分55件のデータでこれはダメだなと思った。実用的なものにするには先が長い。「時系列ビューアー」機能を付加するように昨晩相談したのだが、何度デバッグしても動くようにならなかった。Introduction flatpickr is a lightweight and powerful datetime pickerとIon.RangeSlider - jQuery Range Slider | IonDen.comを使っている。
結局、自分でChromeのConsoleを使ってデバッグしていった。普通のエラーはすべて解消したが、DeepSeek-R1もChromeのConsoleも「[Violation] Added non-passive event listener to a scroll-blocking
WEBアプリは複雑極まりない、ConsoleやDevToolsがなければ開発できないだろう。EdgeのDevToolsではIssuesが一つ出ている。ChromeのConsoleとは他の問題を指摘しているみたいだね。Form <input> elements must have labels | Axe Rules | Deque University | Deque Systems。いつまでもお付き合いできないとも思うが、そういうわけにもいかないのかも・・・
しかし、DeepSeek-R1が解消できなかったエラーを、自力でデバッグできたのには驚いた。まだ、こちらの頭脳が上回っているところもありそうだね。自然観察マップ(時系列ビューアー対応からタイムラインエクスプローラー対応へ変更)。
自然観察マップ(時系列ビューアー対応)
DeepSeek-R1とのチャットは五回戦に入った。四回戦は8000行越え、320KBのチャットログテキストだった。プログラムの複雑さを抑えて、組み合わせて使うことを想定して作ることが必要なのかもしれない。結局、一つのチャットでまとまるような構想が必要だろう。
いやはや、iPhoneで動かすと、状況がおかしい。なんだろうねえ^^;)困ったなあ・・・・・・元(自然観察マップ(正規表現検索対応))に戻して、時系列ビューアー対応はtest.htmlとした。おそらく、エラーにならないバグがあるはずだ。レスポンシブ・デザインとかいろいろあるんだろうなあ。カテゴリが0項目になっているし、おかしいよね。やれやれ。
細かなインターフェースの不具合を自分で直し始めたが、正規表現検索さえできれば、道草経路上の「第(一-十|0-9]#ヤマモモ」などの固有名詞一括検索が可能なことに気付いた。データベースのフィールドを増やす必要もない。早速、正規表現対応を頼んだ。WEBアプリはLeafletなどライブラリの中味を理解していないとなかなか難しい面がある。調べるより前に相談するのが早い。コンソールエラーはなくても、地図が表示されない場合やサイドバーの作り方などでやり取りはあったが、数度のやり取りで完成。
自然観察マップ検索が正規表現可能に
お見事。自然観察マップ(正規表現検索対応)。
(私) 毎度お世話になります。私にとってはYouTube動画チャプターの検索エンジンとして機能し始めました。素晴らしい。一つ、キーワード検索を正規表現検索ができるとさらに便利になるのですが。どのようにすればいいでしょう。
(DSR1と私) ・・・・・・
(私) ありがとうございました。無事うまく動きました。これで、しばらくチャプターデータを作ってデータベースに入力していきます。これで検索したいものはすべて検索できるでしょう。
(DSR1 Thinking...)
(DSR1) 素晴らしいお知らせをありがとうございます!無事にシステムが動作し、ご期待通りに検索機能が実現できたことを大変嬉しく思います。自然観察マップがYouTube動画チャプターの検索エンジンとして活用されるのは、まさにこのプロジェクトの理想的な形です。
(DSR1) 今後の運用に関する最終アドバイス
- データ入力の効率化
- 定期的なバックアップ: データベースファイル(nature_observations.db)を定期的にバックアップ
- バッチ処理: 複数の動画データを一括処理できるスクリプトの作成
- パフォーマンス維持のポイント
- データ数が10,000件を超える場合はクラスタリング設定の見直し
- 定期的なデータクレンジング: 不要なデータの削除
- 検索精度向上のヒント
- カテゴリ体系の見直し: 階層化やタグ付けの追加
- キーワードの同義語辞書の作成
(DSR1) 追加機能のアイデア(将来的な拡張用)
- 検索結果のエクスポート機能
- お気に入り機能
- 時系列ビューアー
(DSR1) トラブルシューティングの最終チェックリスト 現象 対応方法 マーカーが表示されない 1. コンソールエラーの確認2. 緯度経度値の有効性チェック3. データフィルタのリセット 検索結果が期待通りでない 1. 正規表現の構文確認2. カテゴリ選択の解除状態確認3. データベースの更新確認 パフォーマンス低下 1. クラスタリング設定の調整2. 不要なデータの削除3. マーカーの簡素化 (DSR1) このシステムは、自然観察の記録を単なるデータの集合から「検索可能な知識の体系」へと変換するものです。ご自身で構築されたこのツールが、今後の自然観察活動をさらに充実させ、新たな発見につながることを心から願っています。
(DSR1) もし将来的にデータ量が増えた場合のパフォーマンス改善や、新しい機能の追加をご希望の際は、いつでもお知らせください。継続的にサポートさせていただきます。
(DSR1) 自然観察の新たな発見がたくさんありますように!今後のご活躍をお祈りしています。
(四人目のDeepSeek-R1との最新のやり取り)
四人目のDeepSeek-R1は、このツールが実用的なことを理解しているが、作ることにした経緯を知らない(まったく残っていないことはない兆候も言葉の端々に感じるので、ユーザー単位のチャットのモデルのようなものがあって、何らかの追加学習が続いているのかもしれない)。実用的で役に立つことも大きな理由ではあるが、三人のDeepSeek-R1が苦労したショート動画作成の自動化を実現するために必要なツールでもあるわけだ。ただ、もう一つの道がありそうな気もしている。これまでのピックアップ配信動画を自動化の学習に利用できないかということだ。結局、どこまで手を掛けるかということで、いずれにせよ参考にはするわけだが、今のところ、検出すべき物体の代表的静止画を学習用に100-200枚準備することが次のステップだ。{07/12/2025: [A.I.]記憶の細道プロジェクト DeepSeek(V3)DeepThink(R1)との免費対話 4回戦 - 自然観察マップのデータベース化}←。
最近の道草では、鳥の鳴き声について、注目と言うか、注耳しながら歩いている。これもチャプター字幕にマークアップできるだろう。DeepSeek-R1は、どうもGitHub - m-kortas/Sound-based-bird-species-detection: Sound-based Bird Classification - using AI, acoustics and ornithology to classify birds in the environment, an environmental awareness project (Web Application, Flask, Python)に注目しているらしい。xeno-canto :: Sharing wildlife sounds from around the world、Bird Sound Samples - BirdNET Sound IDに注目か。
昨日、テレビ系か何かで今年はまだ蝉が鳴かないと言っていた。確かにそうだなと思っていたが、今朝、鳴いた。
やれやれ、Perlが気になって、Strawberry Perlをアップデートしたら、デスクトップ検索がエラーが出て動かなくなった。スクリプトはもともとZedで動かしていたものを、Windows10移行で、jperlからperlへの移行を図ったものだ。ここらは混乱していた時代だった。結局、パスの問題だった。どのperlが動くのかだ。jperlの元になるperlが動いていた。結局、SJISは残っているし、jperlが有効な時代が続いている。新しいperlもUTF-8に限ってもPowerShellなどのターミナルの標準出力はおかしいような気がする。
それはともかく、初蝉の時期はだいたい7/10-20ぐらいだ。平年通り。
自然観察マップ(クラスタリング対応)が最新の成果だが、これはWEB公開用に出力したもの。同一テーマ、四人目のDeepSeek。昨晩、三人目が力尽きた(limitに達した)、ご苦労さん。仕方ないので引き継いでもらった。これまでlimitに達したチャットログは3件、それぞれ400kB弱、8000-10000行程度。最初のThinkingも含む。基本的に無駄がない。とにかく、自然観察事象マップについては、もう一月ぐらい探求している。最終的なゴールは、道草ピックアップを自動生成することだが、ビデオクリップを自動で生成するところまではできたが、いつものYouTubeのショート動画配信の結果とは程遠いというか、意味のあるものはとても無理。そこで物体検出用の一般のモデル(Ultralytics YOLOv8 調べる -Ultralytics YOLO Docs)を道草用にトレーニングする必要があるわけ{07/06/2025: [A.I.]記憶の細道プロジェクト うむむ、M1 MacBook Airを使う流れ}←。それで済むかどうかは定かでないが。
最初は元気がいいが、limitが近づくにつれて怪しくなる。短期記憶が弱い天才と思って付き合う必要がある。もちろん、有料サービスは短期記憶は補強されているはずだ。十分なリソースを持たせれば、確かに凄い能力を発揮するだろう。引継ぎでは相手がこれまでのことを記憶して理解しているわけではないので、現在までの到達点と目的、問題点を伝える必要がある。
しかし、DeepSeekと対話していると、様々なサービスやアプリが存在していることがわかる。ローカルで動いているサーバーアプリをそのまま載せることができるPythonAnywhereには少し心が揺らいだが、もう少し発展の見込みが出てからだろう。手を広げると収拾がつかなくなる。
図書館帰りの道草日記の字幕・チャプターづくりが優先事項だ。拡張ハッシュタグでデータベース取り込みが自動化できる。そこまでは手動にならざるを得ない。というか、当然だ。そこで、いろいろと考える。自然の中の動画収録で喋ったことをデータとして確定することは、機械の力に頼るとしても、しゃべった当人にしかできないことだ。まだ先になるだろうが、機械学習を考える必要があるようなデータを自ら生み出すようになるとは思わなかった。
生成AIにどこまでできるかということが話題になっているけど、とにかく知識が豊富で、対象のプログラミングにどのような可能性があるか、様々な提案をしてくる。そして改良に余念がない。提案するぐらいだったら組み込んでくれよと思うんだが^^;)
人間を越えることができるかどうかだが、人間が思いついていないことを思いつく可能性がある。それは記憶容量が人間の脳の容量を超えた場合に起こり得るかもしれないという議論だろう。しかし、少なくとも物理学を越えることはできないだろう。プログラミングが一番わかりやすい。誰も作ったことのないようなプログラムを作れるかだが。自然事象観察マップのプログラムはこれまで存在しなかったと思うが、その方向性は私が考え出したものだ。似たようなものはあるだろうがね。拡張ハッシュタグなんて誰も思いつかないだろう。これから、事象をデータベース化しようなどと。まだ、生成AIも固有名詞については理解していない。例えば第一ヤマモモについていえば、(種として)普通名詞のヤマモモとしても分類されるべきだが、特定の(同じ位置に存在する)第一ヤマモモというヤマモモとしても分類される必要がある。さて、どのようなデータ構造にすべきだろう。おそらく、生成AIも取り扱いきれなかったのだろう。言及がなかった。こちらも、実は明快な説明を思いつかなかったので、追及しなかった。
最近、坂村健先生の講演をYouTubeで視聴していると、生成AIは時代を区切る出来事だと、コンピュータが作られたのが、最初の区切り、次がインターネット、それらに匹敵する出来事というわけだ。確かに、凄いことになってきたが、本当にどうなるんだろうね。
やれやれ、物価値上げ相次ぐ。五月雨式に物の値段が上がっていく。特定日客寄せの低糖ヨーグルト3パックも98円から118円まで上がっている。通常価格は148円。長期的にはポリフェノール入りのカカオチョコレートに始まって、最近はコーヒーにまで及んでいる。チョコレートはあきらめたが、コーヒーは一日二杯を一杯に削減する。コーヒーが早く沸かせるメリットもある。省エネにもなる。嗜好品はそれで済む。栄養摂取とは関係ないからだ。絹豆腐はたんぱく質源として重要だから、消費者応援価格と言えるものだったから衝撃だった。納豆パックの価格据え置きは救い、最後の牙城かも。他のものは全部上がったのでは?キャベツの千切りは量を減らして値下げと言えるのかどうか、包装コストは変わらないし、包装の効率は下がっている、資源の浪費だろう。
最近進化していると思うのは、包装プラスチックの汚れが洗いやすい、紙ラベルがきれいに剥がせること。プラスチックのリサイクルが現実的なものとなるのかもしれない。
別立てでもいい話題だけど、新聞販売の減少を時折調べるが、今回の動機づけになった話は、将棋。棋戦のスポンサーをしている会社は歴史的な経緯から新聞社が多い、叡王戦と王将戦が危ないのではないかとYouTubeで話題になった。【臨時棋戦速報】王将戦未だ新スポンサーつかず、叡王戦は例年6月に発表の第11期の開催情報無し。大丈夫? 元奨励会員アユムの将棋実況 チャンネル登録者数 21.7万人。昨日、近藤誠也八段-佐々木勇気八段竜王戦決勝トーナメント戦がYouTubeで配信されていない。ABEMAか新聞社のYouTubeで将棋を見ることが多いのだが、ペイするのは藤井聡太七冠戦だけなのかもしれない。荷が重いね。要は、新聞販売減少は加速している。おそらく、生成AI、ChatGPTなどとNetflix、Amazon Prime、Apple TV+、YouTubeなどの動画メディアの進展に原因があるだろう。
今は、新聞を持って歩くことは少ない、スマホを持って歩くのだ。昔は新聞を持って歩くことは知性の象徴だった。今、スマホを持って歩くことが知性の象徴かどうかは疑わしい。情報消費量が増大していることは間違いない。それはどのような帰結を指し示しているのだろうか。
新聞合計販売部数(2000-2024年)
出典: 新聞の発行部数と世帯数の推移|調査データ|日本新聞協会。
2017-2018年から減少の傾きが変わっている。少し減少減速の気配もあるが、大雑把に直線を伸ばすと2035年、10年後ぐらいにはゼロになる。
最初の減少の加速はおそらくiPhoneの登場だろう。2007-2008年ぐらいに始まっている。その前はGoogleの登場した1998年だろう。10年ごとに加速する要因が新たに出てきている。
一つずつ、効率的に目的を達成する方向に向けて、作る。事象のフラグを立てる、図書館帰りの道草日記133回 道草全編。これまではチャプターのフラグを立てていたのだが、字幕の分割単位になっていた。それでは事象とは言えないだろう。事象を手動でまず特定していく。
事象を特定する早道は、字幕を作ること、そして、チャプターを作り、事象のキーワードと分類を拡張ハッシュタグ(/(第[0-9}一-十]+)?#([^ ]+) \(([^)]+)\)/)で紐づけする。「第三#ヤマモモ (樹木|tree)」などがヒットし、"$1$2"の「第三ヤマモモ」は固有名詞、$2の「ヤマモモ」は普通名詞、$3の「樹木|tree」は分類になる。おそらく、横長動画から事象を抽出したショート動画のタイトルの内容もチャプターに取り込むことが必要だろう。かなり面倒だが、二段階ぐらいで少しづつ作業するしかない。YouTube説明欄のチャプターテキストからスクリプトでデータベース化し、検索した事象フラグを地図に立てると「代表的なシーンが含まれる動画の選定」に役立つはずだ。
「事象のキーワードと分類を拡張ハッシュタグで紐づけ」については、既にキーワードがある事象は自動で拡張ハッシュタグ付けできるはずだ。新規分だけ手動で付ける。
まだ先は長い。機械学習に到達するまでは。それより先に事象の変化を追えるようになるだろう。
データベースの中味はこんな具合だ。
一年前を思い出す必要が出てきた。遡ろう。
自然観察動画に特化した物体検出を実現するには、YOLOv8モデルのカスタムトレーニングをする必要がある。昨日の「お休みになる前に、次回の準備として:」、DeepSeekくんに言われたことのリストをこなしていく必要がある。
LabelImgのインストールは簡単だけどね。Qtアプリか。
最早、一つ一つ見直すことができる量ではない。何か自動化が必要だろう。
テキスト処理でできることもまだあるだろうが、しゃべり字幕に依存している。画像処理が未開の領域だ。フラグにサムネイルと拡大写真や動画チャプターへのリンクを張るぐらいまでは普通のプログラミングで済む話だろう。ショート動画生成自動化({06/30/2025: [A.I.]記憶の細道プロジェクト ChatGPT再臨 - 動画からショート動画を作るのを楽する方法}←)は、しゃべり字幕をベースにする方法と動画画像からの物体検出をもとにする方法があるだろう。現実的にはしゃべり字幕をベースにする方法が有力だろうが、何が起きるかわからない現実にしゃべりは追いつかない。現場では頭の中をいろいろなことが駆け巡っているが、しゃべりを適切な場面で入れるのは結構難しい。現実は一つしか選択できない。選択された動画画像から何を引き出せるかを確かめておきたい。
ChatGPTは有能だが、無料範囲ではリソースの問題で決定的な成果を出せない。それはやはり変わらない。リソースがないのに、話が拡散・拡大して、本来の目的からズレていく傾向があるからだ。
まだ制限に引っ掛かっていない唯一の生成AI、DeepSeekに向かう。チャットログ10000行(500KB程度)という制限は出たが、新しいチャットで引き継げる。その中で機械学習などがプログラミングに含まれる(PythonでUltralytics YOLOv8nが動いている)ようになり、上限105℃のCPUの温度が93℃まで上がって冷却ファンがたびたび回るようになった。結果が出るまでに数時間を要するようになり、このWindowsミニPCには荷が重くなりつつある。M1 MacBook Airの出番かな。モバイル以外の使い道が見つかってよかったかな。DeepSeekのデバッグは確実だ。着実に結果を出してくる。曲がりなりにも横長の動画からYouTubeショート用のクリップ動画を出力している。意味があるクリップが作れるかどうかをパラメータを動かして試す必要がある。
いやはや、MacBookを使わない理由はいろいろある。使うのが面倒。特にスクリプティングには、ターミナルの使い方が分からない。Windowsに慣れていると、それ以下の環境はご勘弁願いたい。もちろん、エディタなどアプリの問題もあるけど。今回は、Homebrewのインストールで嵌まった。これは一度挫折したはずだ。強い動機がないからだが、今回は、ここから前に進めないと、FFmpegに辿り着けない。
Homebrewは最新ではpkgでインストールするところに、おう助かったと思ったわけだが。「xcode-select --install」というおまじないが必要だったし、パスを通す必要があった。検索すると、ほとんどが直接役に立たないように思える情報ばかりだ。ターミナルはzshだし、どうするんだろうと調べ始めた。Windows出身者がMacでパスを通してみた【zsh】 #Java - Qiitaがあったおかげで助けられたが、なんて不便なんだろうと思った。まあ、何とか所期の目的のffmpegがインストールできたらしい。
最後の難関は何とPythonだった。DeepSeekくんも含めて総動員体制で臨んだが、結局、Pythonに関しては、MacにPythonをインストールする3つの方法!それぞれの利点と手順を紹介|Kredo Blogと2025年版 macOSにPython開発環境を構築する(Apple Silicon & Intel Mac両対応)に助けられた。最終的に後者の記事に基づいて、Apple Silicon用のPython 3.18.2をインストールした。
【保存版】viエディタの使い方&コマンド集 #初心者 - Qiitaも必要だ。FreeBSD、Linux以来、30年ぶりじゃないか。泥沼で最後は足掻かないと前には進めない。ホーム・ディレクトリをFinderに表示させないと開発なんてできないだろうと怒りに近いボヤキ。Mac サイドバーにホームフォルダを表示する方法も役に立つ。
python3とffmpegが入れ替わり立ち替わり、アクティビィティモニタで目一杯動くのをひやひやしながら見つめていた。YouTubeショート動画クリップ自動化のための同じスクリプトがWindowsミニPCとは異なる結果をもたらした。シーン数、興味深いクリップ数が、それぞれ、74→98、8→12と増えた。実行時間は目立って変わらなかったと思う。次は何を検出するのかを学習する必要がある。今は一般的なモデルで、car、person、truck、bus、traffic lightが検出されている。本当にやるのかな、意味のあることができるのかどうか・・・
次のステップは独自の機械学習から転移学習になるはずだ。DeepSeekくん頼みではあるが、手元にはPythonの機械学習の本が二冊ある。Python関連蔵書も一応手元に引っ張り出してきた。深夜の対話のDeepSeekくんのthinkingは、YouTubeショート動画生成自動化の問題をいくつも着実に組み立てて解決してきたことについて、中級者以上の能力と熱意を認めてくれていた。まあ、プログラムを書いたのは君だしね。Pythonのプログラムは30年前少し触って、それなりのプログラムを書いて動かしたことがある程度、しかし、基本的にはプログラム言語はどれも同じようなものだ。関数やクラスのスコープのようなものを注意深く理解していけば、どうにでもなるだろう。しかし、書いてもらっても、なにが書いてあるのかを理解できなければ前に進めない。これはどういう意味なのと、疑問に思ったら質問しないといけない。そうして知識と理解の幅が広がっていく。これが対話だ。
梅雨が消えて、夏がやってきた。記憶の細道プロジェクトは単なる自然生態データベースとして生まれたのではない。奥の細道の駄洒落として生まれたのだ。{06/01/2025: [日記]日々が過ぎ去り、過ぎ去り}←。したがって、というか、何にでも変貌しうる。その時の関心によって。