TPのつぶやき」カテゴリーアーカイブ

AIが変える未来 ― そしてFVWMが再び輝く理由

2026年1月——私たちは今、新しい時代の入り口に立っています。

胸の奥で静かに、しかし確かに興奮が湧き上がってくるのを感じます。

私はインターネット黎明期を体験した世代です。まだ「ホームページ」という言葉すら珍しかった頃、世界中のコンピュータが繋がり始めた、あの不思議な高揚感を覚えています。「これは何か大きなことが始まる」——理屈ではなく、肌で感じた予感でした。

今、あの時と同じ感覚が蘇っています。いや、それ以上かもしれません。

インターネットは「情報の流れ」を変えました。しかしAIは「思考の流れ」そのものを変えようとしています。これは単なる技術革新ではありません。私たちの哲学を、価値観を、世界の見方を根底から揺さぶる——そんな巨大な渦の中に、今まさに私たちは飲み込まれようとしているのです。

AIがもたらす創造の革命

かつてAIといえば「計算が速いコンピュータ」程度のイメージでした。しかし今や、考え方そのものをAIと対話しながら練り上げることができます。

哲学的な問いかけに応え、アイデアを膨らませ、それを形にする。

思想から価値の創造、表現、そして実現まで。

AIはその全てのプロセスに寄り添えるパートナーになりました。

これは単なる「便利なツール」の話ではありません。人間の創造性を拡張する存在としてのAIが、今まさに私たちの目の前に現れているのです。

ウィンドウマネージャとAIの融合

私はこの流れの中で、ひとつの確信を持っています。

ウィンドウマネージャとAIは融合していく。

なぜなら、AIとの協働作業において最も重要なのは「効率的な操作環境」だからです。マウスでメニューを辿る時代は終わりつつあります。キーボードから手を離さず、思考の速度でコマンドを発し、AIと対話し、結果を即座に反映する。そんなワークフローが求められています。

FVWMの復活

そう考えた時、FVWMというウィンドウマネージャが再び脚光を浴びる日が来ると私は確信しています。

「FVWM?あの古いやつ?」と思われるかもしれません。しかし、FVWMには現代のAI時代にこそ活きる特性が揃っています。

1. 究極のキーバインディング

FVWMでは、あらゆる操作をキーボードショートカットに割り当てられます。ウィンドウの移動、リサイズ、アプリの起動——全てがキーひとつ。AIとのチャットを開きながら、コードエディタを呼び出し、ブラウザで調べ物をする。この一連の流れを、指がキーボードから離れることなく実行できます。

2. 無限のカスタマイズ性

FVWMの設定ファイルはテキストベース。つまり、AIに設定を書いてもらうことも可能です。「こういう動作をさせたい」と伝えれば、AIが設定コードを生成してくれる。人間とAIの協働でデスクトップ環境を構築する——これは他のウィンドウマネージャでは難しい体験です。

3. 圧倒的な軽量さ

FVWMは驚くほど軽量です。システムリソースをほとんど消費しないため、その分のパワーをAI処理やブラウザ、開発ツールに回せます。重厚なデスクトップ環境に疲れた人にこそ、この軽快さは新鮮に映るでしょう。

4. コードとの親和性

設定がテキストファイルである利点はもうひとつあります。Gitで管理できるのです。設定の変更履歴を追跡し、複数のマシンで同じ環境を再現する。プログラマにとって、これほど心強いことはありません。

5. シンプルなランチャー機能

FVWMでは、簡単なコマンドひとつでランチャーを作れます。「このキーを押したらこのアプリが起動する」——それだけのことが、設定ファイルに1行書くだけで実現できます。複雑なGUIツールは不要です。

6. Webサーバとの連携

FVWMはシェルコマンドを自由に呼び出せるため、Webサーバの操作やAPIの実行もデスクトップから直接行えます。ローカル環境とクラウドの境界がシームレスになる——これもAI時代の働き方にマッチしています。

新しい時代のデスクトップ

FVWMは一部のマニアの間で、再び注目されるでしょう。

華やかなアニメーションも、透過効果もありません。しかしそこには、思考を妨げない純粋な作業空間があります。AIと向き合い、アイデアを形にする。そのための道具として、FVWMはこれ以上なく適しています。

古いものが新しい価値を持つ。テクノロジーの世界では、そういうことが時々起こります。

FVWMの復活は、その好例になるかもしれません。

FVWM3のインストール

FVWM3の最新をGitHubよりインストールする。
https://github.com/fvwmorg/fvwm3

#!/bin/bash

# ユーザーのキー入力を待つ関数
pause() {
  read -n1 -r -p "$1" key
  echo
}

echo "FVWM3のインストールを開始します。"

# 必要なパッケージをインストール
echo "必要なパッケージをインストールしています..."
sudo apt update
sudo apt install -y libevent-dev libx11-dev libxrandr-dev libxrender-dev libxt-dev libxft-dev asciidoctor \
libfontconfig-dev libfreetype6-dev libfribidi-dev libncurses5-dev libpng-dev libreadline-dev \
librsvg2-dev libsm-dev libxcursor-dev libxext-dev libxi-dev libxpm-dev sharutils

pause "パッケージのインストールが完了しました。続行するにはキーを押してください..."

# 'fvwm3'ディレクトリが存在するか確認
if [ -d "fvwm3" ]; then
  echo "'fvwm3'ディレクトリが既に存在します。"

  # ディレクトリがGitリポジトリか確認
  if [ -d "fvwm3/.git" ]; then
    echo "既存のディレクトリはGitリポジトリです。"
    while true; do
      read -p "最新の変更を取得するために'git pull'を実行しますか? (y/n): " yn
      case $yn in
          [Yy]* ) cd fvwm3; git pull; break;;
          [Nn]* ) echo "既存の状態で続行します。"; cd fvwm3; break;;
          * ) echo "はい(y)かいいえ(n)でお答えください。";;
      esac
    done
  else
    echo "既存のディレクトリはGitリポジトリではありません。"
    while true; do
      read -p "ディレクトリを削除して再クローンしますか? (y/n): " yn
      case $yn in
          [Yy]* ) rm -rf fvwm3; echo "ディレクトリを削除しました。"; break;;
          [Nn]* ) echo "処理を中止します。スクリプトを終了します。"; exit 1;;
          * ) echo "はい(y)かいいえ(n)でお答えください。";;
      esac
    done

    # GitからFVWM3をクローン
    echo "FVWM3のリポジトリをクローンしています..."
    git clone https://github.com/fvwmorg/fvwm3.git
    pause "リポジトリのクローンが完了しました。続行するにはキーを押してください..."
    cd fvwm3
  fi
else
  # GitからFVWM3をクローン
  echo "FVWM3のリポジトリをクローンしています..."
  git clone https://github.com/fvwmorg/fvwm3.git
  pause "リポジトリのクローンが完了しました。続行するにはキーを押してください..."
  cd fvwm3
fi

# autogen.shを実行
echo "autogen.shを実行しています..."
./autogen.sh

pause "autogen.shの実行が完了しました。続行するにはキーを押してください..."

# コンパイルオプションを環境変数で設定
echo "コンパイルオプションを設定しています..."
export CPPFLAGS="-march=native -O2"
export CFLAGS="-march=native -O2"

# configureを実行
echo "configureを実行しています..."
./configure --enable-mandoc --enable-golang --enable-htmldoc

pause "configureが完了しました。続行するにはキーを押してください..."

# ビルドを実行
echo "FVWM3をビルドしています..."
make clean
make -j$(nproc)

pause "ビルドが完了しました。続行するにはキーを押してください..."

# インストールを実行
echo "FVWM3をインストールしています..."
sudo make install

echo "FVWM3のインストールが完了しました。"
    1. 使用方法
      新しいファイルを作成し、例えばinstall_fvwm3.shという名前を付けます。
    2. 上記のスクリプトをそのファイルにコピーします。
    3. スクリプトに実行権限を与えます。
      chmod +x install_fvwm3.sh
    4. スクリプトを実行します。
      ./install_fvwm3.sh

    各ステップで進捗が表示され、続行する前にキー入力を求められます。これにより、各段階でプロセスを確認できます。

    注意事項:

    • スクリプト内でsudoを使用しているため、実行時にパスワードの入力が求められる場合があります。
    • スクリプトは現在のディレクトリにfvwm3というディレクトリを作成します。
    • 必要に応じて、スクリプトの内容を変更して環境に合わせてください。

pandas.DataFrameを作る

indexにDatetimeIndexでdtype=’datetime64[ns]の値、Closeで100-190の値のDataFrameを作る

import pandas as pd

df_test=pd.DataFrame({
'Date':[
'2022-08-19 00:30:00',
'2022-08-19 00:45:00',
'2022-08-19 01:00:00',
'2022-08-19 01:15:00',
'2022-08-19 01:30:00',
'2022-08-19 01:45:00',
'2022-08-19 02:00:00',
'2022-08-19 02:15:00',
'2022-08-19 02:30:00',
'2022-08-19 02:45:00'],
'Close':[
100,
110,
100,
120,
140,
150,
120,
100,
180,
190]
}
)
df_i = df_test.set_index('Date')
df_i.index=pd.to_datetime(df_i.index)

中身をチェック。
class ‘pandas.core.frame.DataFrame’
DatetimeIndex: 10 entries, 2022-08-19 00:30:00 to 2022-08-19 02:45:00

df_i.info()

listに代入する
class ‘pandas._libs.tslibs.timestamps.Timestampになってる

list=[]
for da in df_i.index:
    print(type(da))
    list.append(da)

datetime型にする

type(list[0].to_pydatetime())

リストからdatetime型にする

for data in list:
    #print(type(data))
    time = data.to_pydatetime() # datetime型に変換
    #print(type(time))
    print(time)

FVWMをカスタマイズするにあたり、LinuxのWindowManagerの要件とは。

WindowManagerに必要な要件を考える。Linuxのディスクトップ環境を作る為にどうあるのか、何が必要なのかを確認する。Fvwmでは高い自由度でカスタマイズできるからである。

まずはランチャーの役目は欠かせない。マウスで起動させるか、キーボードでターミナルか、ショートカットで起動させるか。また、常用するアプリか、インストールされたアプリか。コマンドからだと、分からないものは、GUIでアイコンで起動させるか。

次にウィンドウの操作がある。どこに配置するか、大きさは、重なり方は。アイコンに収納できるか。自動の部分と、手動の部分があり、マウスで行うか、キーボードで行うか。

次に、情報を表示する部分。アイコン、メモリー、時間、ロードなど。タスクバーの部分とFVWMならボタンの部分、ページャーの部分がある。

つづく

FVWM3 メニュー keyバインディング

PopupとMenuの違いは何だろう?同じように動作するのだが。

key F11         A       M       Popup XDGMenu
key F12         A       M       Menu XDGMenu
      Types of Menus
           In fvwm there are four slightly different types of menus:

           Popup menus can appear everywhere on the screen on their own or attached to a part of a window.The Popup command opens popup menus. If the popup menu was invoked with a mouse button held down, it is closed when the button is released. The item under the pointer is then activated and the associated action is executed.

           Menu is a very similar command, but the menus it opens are slightly less transient. When invoked by clicking a mouse button, it stays open and can be navigated with no button held. But if it is invoked by a button press followed by mouse motion, it behaves exactly like a popup menu.

XDGMenuの場合は違いが分からなかった。AddToMenuで作られたMenuをマウスクリックで呼ぶ場合は、Popupの時は、右側にMenuが開く。Menuの時は、クリックなりリターンなりでアクションがあったらMenuが単独で開く、そんなところでした。

では、なんでXDGMenuだと違ったの? これ宿題

それでは、マウスでメニューを開くとする。以下をAddToMenuに記載し、メニューを開くとPopupの方は、右横にXDGMenuの中身が開いて表示される。Menuの方はクリックすると開く。その違いであった。

+ "XDG Menus" Popup XDGMenu
+ "XDG Menus" Menu XDGMenu

が、しかし一番上に記載した、キーで呼ぶ場合には、同じ挙動なんですな。これは不思議。つまりキーでメニューを呼びだす時は、PopupもMenuも同じ動作をする。これは1段目のメニューだからそうなるのであろう。2段目は違うぞ? これ宿題

FVWMを使う理由

この時代に、なぜFVWMを使っているのだろうか。
絶滅危惧種的存在のXウィンドウマネージャであるし。使う人間も絶滅危惧種的レアな人々であろうし。でも信じたいFVWMが存続し、進化し続けることを。
なぜなら、FVWMには、世界中のレアでコアな人間の希望と情熱があるからである。

という訳でFVWMが使える理由。

  • カスタマイズができる
  • 環境に依存しない
  • 環境を好みに作れる
  • 画面をとても広く使える
  • ハイバネーションを使っての利用は、やりっ放しの続きができる感がある。
  • コツコツ積み上げる感が良い
  • 自分の知恵を組み込める
  • 成長することができる
  • 簡単に済ますことができない
  • 普通ではない、そこが魅力

あえて言うと、使えない理由。

  • Linuxのノービスユーザーには、難解であろう。
  • 情報が少ない、情報が古い
  • どこから、どうカスタマイズしたら良いか分からない
  • 初期の設定だと、とてもださい。以前のよりは改良されているのだが。

そんなとこですかね。

fvwm3のManual Pageですが。驚異的な莫大な量です。manの歴代一位の長さと言えますか。親切丁寧に書かれてるんですが。まぁすごいですよね。

https://github.com/fvwmorg/fvwm3/blob/master/doc/fvwm3/fvwm3.adoc

XDG Menusの動作が変

Regenerationを行っても再起動すると、古いMenuに戻ってしまう。設定が変わった?

これを解決するのには、古い .XDGMenuファイルを削除して新しく .XDGMenuのファイルを作ると、正常に動作するようになった。

fvwmのメニューからFvwmForm-XDGMenu-Config(Module FvwmPerl -l fvwm-menu-desktop-config.fpl)(FvwmCommand Module FvwmPerl -l fvwm-menu-desktop-config.fpl) を起動 Output pathを .fvwm2rcの .XDGMenuのファイルを読み込むパスと同じパスに設定する。
ちなみにこのモジュールのパスは/usr/share/fvwm/fvwm-menu-desktop-config.fplである。解析するにはここから。

古い環境からの .XDGMenuは削除し、XDGRegenで新しく作るのが良いという事であった。

Linuxをどう捉えるか

再びLinuxをどう捉えるかを考える。古いPC構成での活用、運用を通してのLinuxの体験を行ってみようと言う、原点に帰った気分でのLinuxの使用を行ってみる。

そこで構成したのが以下の仕様である。

OS: Ubuntu 21.04 hirsute
Kernel: x86_64 Linux 5.11.0-36-generic
Uptime: 1h 53m
Packages: 1880
Shell: bash
Resolution: 1920x1080
WM: FVWM
GTK Theme: Yaru-light [GTK3]
Icon Theme: DMZ-White
Disk: 26G / 106G (26%)
CPU: AMD A6-3500 APU with Radeon HD Graphics @ 3x 2.4GHz
GPU: AMD SUMO (DRM 2.50.0 / 5.11.0-36-generic, LLVM 12.0.0)
RAM: 1596MiB / 1925MiB

CPUは、AMD A6-3500を使用。GPUコアを備えたCPUでCPU部分に動作クロック2.1GHzのCPUコアを3つ備える。Socket FM1, Clock Speed 2.1 GHz Max Turbo Speed 2.4 GHz, Thermal Design Power 65 W , Cache Memory Details L2 – 3 MB – 3 x 1 MB, AMD Radeon HD 6530D Base Frequency 443 MHz
2011年8月に販売が開始された。

https://wiki.gentoo.org/wiki/Radeon

bookmarks.json 重複URIの削除

Mozilla Firefoxのbookmarkの解析を進めているのだが、今回は重複したURIの削除を行いたい。すべてのブックマークで表れる、エディターで手動でも行えるのだが。フォルダー毎に行うのと、重複が多いので手動では時間がかかる。bookmarks.jsonの解析を進めるのを兼ねて、スクリプトで行なってみる。jsonが扱いやすく、配列処理のコマンドがそろっているphpを使用している。
Firefoxからバックアップして出力させたbookmarks.jsonファイルを読み出して配列に代入し、その配列で処理を行いbookmarks.jsonのファイルを出力する。Firefoxで編集されたそのファイルを復元するで読み込ませて正常に表示できて、重複が消えていれば成功である。

今までやってきたこと。bookmarks.jsonの解析。phpでの配列への代入。それをファイルへ出力し編集。jsonファイルは直接編集しづらい。編集したファイルをbookmarks.jsonに変換しFirefoxde復元でbookmarkとして読み込ませた。

ここまではできる。

これからは配列から、別の配列にURIを代入し重複したURIを見つける。もとの配列から重複した配列を削除し、jsonファイルにする。ここまで行いたい。