2025-12-27

【備忘録】PySide6 のダークモード

Fedora Linux は Red Hat 社が支援するコミュニティ Fedora Project で開発されている Linux ディストロです。このディストロは、最新の技術を積極的に取り込むことで知られています。Fedora Linux の開発成果は CentOS Stream に取り込まれます。ここでテストを経て最終的に Red Hat Enterprise Linux, RHEL へ反映されます。Fedora Linux は、おおむね春と秋の年二回の頻度で新しい版がリリースされています。

メインの PC には Fedora Linux Workstaion(以下 Fedora と呼びます)をインストールしています。そのためデスクトップ環境は GNOME で、ダークモード(暗いスタイル)にして利用しています。

GUI アプリを作るときには、もっぱら Qt for Python (PySide6) を利用しているのですが、デスクトップがダークモードでも Qt のウィジェットには反映されません。Ubuntu で同じことをするとダークモードが反映されるのに Fedora ではできません。謎でした。

Fedora Linux 43 Workstation Ubuntu 25.10

PySide6 のウィジェットにデスクトップのダークモードが反映されないことは、それほど深刻な問題ではなかったので放置していました。それでも、マルチプラットフォーム対応のアプリを作っていると、見映えの違いはやっぱり気になるので、いまごろになって生成 AI (Microsoft Copilot) に尋ねてみました。

Microsoft Copilot とのやり取りを抜粋してまとめました。

📌 1. Fedora 公式:「No custom Qt theming for Fedora Workstation」

Fedora 40 以降、QGnomePlatform と adwaita-qt をデフォルトから外すと公式に決定されました(Fedora 39 では非推奨 → Fedora 40 で正式削除)。

理由は Fedora 公式ページに明記されています:

  • これらのプロジェクトは 「outdated and semi-occasionally broken」
  • Fedora Workstation では Qt upstream の標準テーマに戻す方が良い
  • メンテナンスコストが高く、安定性が確保できない

【情報源】

📌 2. GitHub(FedoraQt/adwaita-qt):プロジェクトが非メンテ状態

adwaita-qt の GitHub リポジトリには、はっきりとこう書かれています:

“Adwaita-qt project is unmaintained and no longer actively developed.”

つまり、開発者側が 開発終了を宣言しています。

【情報源】

【補足】

Fedora 39 以前は下記のようなやり方で、デスクトップのモードに追従できたようです。知りませんでした。

sudo dnf install adwaita-qt6

環境変数を設定:

export QT_QPA_PLATFORMTHEME=gnome

📌 3. 開発者 Jan Grulich 氏のブログ

QGnomePlatform と adwaita-qt の主要開発者である Jan Grulich 氏が、これらのプロジェクトの背景と課題を詳しく説明しています。

ポイント:

  • Qt と GNOME の統合は非常に複雑
  • GNOME の UI 変更に追従するのが困難
  • Qt upstream の仕様変更で壊れやすい
  • Fedora でデフォルトにするには負担が大きい

【情報源】

📌 まとめ:なぜ adwaita-qt6 は廃止されたのか?

理由 説明
メンテナンス不能 開発者がプロジェクトを維持できなくなった(GitHub で明言)
壊れやすい GNOME や Qt の更新で頻繁に壊れる(Fedora 公式が指摘)
Fedora の方針変更 GNOME との統合をやめ、Qt upstream の標準テーマに戻す方針へ
開発者の負担 Qt と GNOME の橋渡しは技術的に非常に難しく、継続が困難

自分なりの結論

デスクトップを KDE Plasma に変更すれば、このような問題は解消されます。

ブログの内容の確認を Microsoft Copilot にお願いしたら、いくつもダメ出しがありましたが、そのうちの一つを追記します。

🔍 KDE Plasma に切り替えた場合のメリット

  • KDE Plasma は Qt のネイティブ環境
  • Qt6 が KDE のテーマ API を直接参照
  • GNOME のような “テーマブリッジ” が不要
  • PySide6 の外観が最も安定する

しかし GNOME のミニマリズムな使い方にすっかり慣れてしまって、これが快適だと思っています。そんなわけで、メインのデスクトップ環境を Windows ライクなものに戻せそうにはありません。

Qt の外観については、今まで通り割り切って利用することにします。

最後に落ち穂拾いです。

🌙 Ubuntu で PySide6 がダークモードを拾う理由

Ubuntu は GNOME ですが、Qt アプリの統合を強化しているため:

  • adwaita-qt6 が標準で入っている
  • GNOME のダークモード設定を Qt に橋渡しする仕組みが有効

そのため PySide6 も自然にダークモードになります。

【補足】

ここは論拠が薄かったので Microsoft Copilot と議論を重ねました。結局 Fedora は upstream-first で独自パッチを極力持たない方針であるのに対し、Ubuntu は ユーザー体験のためなら upstream に依存しない文化があるという違いに帰結してしまいました。これが本題ではないのでこのぐらいにしておきます。

参考サイト

  1. Fedora Linux | The Fedora Project
  2. Qt と GTK アプリケーションの外観の統合 - ArchWiki

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2025-12-16

ダイアログを表示後にサイズを固定する 〜 PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

PySide6 の GUI アプリで表示した後にウィンドウサイズを変更できないようにしたいと思う時があるのですが、いままでしっかり調べたことがありませんでした。Microsoft Copilot に尋ねてみたところ、showEvent を利用すれば簡単にできることを教えてもらいました。

今まで知らなかったことが恥ずかしいのですが、QDialog のサンプルを例に備忘録にしました。

下記の OS 環境で動作確認をしています。

Fedora Linux 43 x86_64
Python 3.13.9
PySide6 6.10.1
qt_dialog_fixed_size.py
qt_dialog_fixed_size.py の実行例

参考サイト

  1. PySide6.QtWidgets.QDialog - Qt for Python
  2. PySide6.QtWidgets.QWidget - Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2025-11-25

AlmaLinux 10 で httpd を設定

Apache HTTP Server (httpd) は、Apache License 2.0 の条件でリリースされるフリーでオープンソースのクロスプラットフォームの Web サーバソフトウェアです。Apache は Apache ソフトウェア財団の支援のもと、開発者のオープンコミュニティによって開発・保守されています。

Wikipedia より抜粋、修正

家庭内 LAN で稼働している AlmaLinux 10 のファイルサーバーに Apache の httpd をインストールしてローカル Web サーバーに設定したメモです。

httpd のインストールと設定

Apache HTTP Server (httpd) をインストールおよび設定をする OS は下記のとおりです。

OS AlmaLinux 10.0 (Purple Lion) x86_64v2

パッケージのインストール

Apache HTTP Server httpdhttpd-devel パッケージをインストールします。

Apache HTTP Server のインストール
$ sudo dnf install httpd httpd-devel

サービスの起動

Apache HTTP Server のサービス、httpd を起動 (start) します。また、OS 起動後にサービスが使えるように有効化 (enable) します。

httpd の起動 
$ sudo systemctl start httpd
$ sudo systemctl enable httpd

ファイアーウォールの設定

HTTP で通信できるようにサービスを追加した後、ファイアーウォールの設定を再ロードします。

ファイアーウォールの設定 
$ sudo firewall-cmd --zone=public --permanent --add-service=http
success
$ sudo firewall-cmd --reload
success

ユーザ毎のディレクトリの設定

ユーザアカウント内の public_html 内をウェブサイトとして利用できるように /etc/httpd/conf.d/userdir.conf を編集します。下記に変更した箇所を赤字で示しました。

/etc/httpd/conf.d/userdir.conf の設定 
#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid.  This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
#
<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    #UserDir disabled

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    # 
    UserDir public_html
</IfModule>

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

ユーザアカウント内に public_html ディレクトリを作成します。この例ではユーザアカウントは bitwalk のみです。パーミッションは下記のようになっています。

ユーザアカウントのディレクトリとパーミッション 
$ cd ~
$ mkdir public_html
$ chmod 755 /home/bitwalk
$ ll -d /home/bitwalk
drwxr-xr-x. 23 bitwalk bitwalk 4096 11月 25 07:25 /home/bitwalk
$ ll -d /home/bitwalk/public_html
drwxr-xr-x. 2 bitwalk bitwalk 6 11月 25 07:25 /home/bitwalk/public_html
$

httpd を再起動します。

httpd サービスの再起動 
$ sudo systemctl restart httpd

SELinux の設定

最後に SELinux 下で httpd がユーザーディレクトリをアクセスできるように httpd_enable_homedirs を有効にします。

SELinux の httpd_enable_homedirs を有効化
$ sudo setsebool -P httpd_enable_homedirs 1

mod_ssl のインストール

SSL/TLS による HTTPS 通信に対応させるため、下記のように mod_ssl をインストールしておきます。

mod_ssl のインストール 
$ sudo dnf -y install mod_ssl

暗号化された HTTP 通信を行なう標準のポート 443 を利用できるようにファイアウォールを設定します。

ファイアーウォールの設定 (2) 
$ sudo firewall-cmd --permanent --add-port=443/tcp
success
$ sudo firewall-cmd --reload
success

httpd を再起動します。

httpd サービスの再起動 
$ sudo systemctl restart httpd

シンボリックリンクに関して

ユーザーアカウント内で作成した ~/public_html 内にシンボリックリンクを作成して、他の PC のブラウザから見ようとしたところアクセスを拒否されてしまいました。

SELinux のログを確認すると、

SELinux により、/usr/sbin/httpd による read アクセスが、ディレクトリー /home/bitwalk/MyProjects で拒否されました。

というエラーが出ていました。

SELinux の Solutions に従って下記のように httpd_read_user_content を実行したところ、シンボリックリンクしたディレクトリ内をブラウザから閲覧できるようになりました。

SELinux の httpd_read_user_content を有効化 
$ sudo setsebool -P httpd_read_user_content 1

ローカルで動かしているなら SELinux は面倒であれば無効化してしまう、という意見を見かけます。SELinux が普及し始めた古い記事だから、と思いたいのですが…。

いざ SELinux が必要な局面になったら途端に狼狽えてしまうことが判っているので、普段から SELinux アリで設定をしようと心がけています。

せっかく、SELinux でセキュリティの高い OS を実現しているというのに、ローカルだからとか VM で利用しているからという理由を言い訳にして無効にするのはもったいないことです。

ディレクトリ・リスティングの文字化け [追記 : 2025-11-29]

index.html がないディレクトリにアクセスすると、ディレクトリの中身の一覧が表示されます(mod_autoindex の機能)。家庭内 LAN では、この機能を積極的に利用していますが、ディレクトリやファイルの名前が日本語の場合、文字化けしてしまいます。

/etc/httpd/conf.d/autoindex.confIndexOptionsCharset=UTF-8 を追加して httpd サービスを再起動することで、文字化けの問題は解消されます。

/etc/httpd/conf.d/autoindex.conf の設定 
#
# Directives controlling the display of server-generated directory listings.
#
# Required modules: mod_authz_core, mod_authz_host,
#                   mod_autoindex, mod_alias
#
# To see the listing of a directory, the Options directive for the
# directory must include "Indexes", and the directory must not contain
# a file matching those listed in the DirectoryIndex directive.
#

#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
#
#IndexOptions FancyIndexing HTMLTable VersionSort
IndexOptions FancyIndexing HTMLTable VersionSort Charset=UTF-8

# We include the /icons/ alias for FancyIndexed directory listings.  If
# you do not use FancyIndexing, you may comment this out.
#
Alias /icons/ "/usr/share/httpd/icons/"
...
...

参考サイト

  1. Apache HTTP Server Version 2.4 Documentation - Apache HTTP Server Version 2.4

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2025-11-07

【備忘録】VWAP の算出

VWAP(Volume Weighted Average Price, 売買高加重平均価格)とは、当日の東京証券取引所のオークション市場で成立した価格を価格毎の売買高で加重平均した価格をいいます。VWAP は、より取引実態に近い平均的な約定値段として、主に機関投資家の執行価格の目標値として用いられています。

日本取引所グループの用語集 [1] より引用

東証の取引時間中、特定銘柄について 1 秒間隔で株価と出来高(累計)を取得して分析していますが、生成 AI (Microsoft Copilot) に VWAP の算出と活用方法についてアドバイスをもらったので、備忘録にまとめました。

VWAP の計算式

英語版の Wikipedia [2] に VWAP の計算式が示されていたので、それを引用して株価にあてはめました。

\[ P_{VWAP} = \frac{\sum_j {P_j \times Q_j}}{\sum_j Q_j} \]
  • \(P_{VWAP}\)  : VWAP(売買高加重平均価格)
  • \(P_j\) : 取引\(j\) の株価
  • \(Q_j\) : 取引\(j\) の出来高
  • \(j\) : 定義された期間内に発生する個々の取引

 

Microsoft Copilot にお願いをして、VWAP の活用方法、長所・短所についてまとめてもらいました。

VWAP の活用例

  1. エントリー・エグジットの判断基準
    • VWAP より安く買えれば「割安」、高く売れれば「割高」と判断できる
    • 機関投資家は VWAP 付近で約定することを目指すことが多い
  2. トレンドの中心線として利用
    • VWAP は滑らかに推移するため、価格の上下動を相対的に評価できる
    • GUI 上では基準線として表示されることが多い
  3. アルゴリズム取引の基準価格
    • VWAP は多くのアルゴリズム取引で「目標価格」として使われる
    • 特に大量注文を分割して執行する際に、VWAP を基準にすることで市場への影響を抑える

VWAP の長所

長所 内容
市場の平均的な約定価格を示す 実際の取引に基づいた価格なので信頼性が高い
滑らかでノイズに強い 短期的なスパイクに左右されにくく、トレンド把握に適している
逐次更新が可能 リアルタイムでVWAPを更新できるため、ティックデータにも対応しやすい
機関投資家の行動と親和性が高い 実需に基づいた価格判断が可能

VWAP の短所・注意点

短所 内容
過去のデータに依存する 累積的な指標のため、直近の急変には反応が遅れる
時間帯によって意味が変わる 前場と後場で市場の性質が異なるため、VWAP の解釈も変わることがある
出来高が極端に偏ると歪む 特定の時間帯に出来高が集中すると、VWAP がその価格に引っ張られる
単独では売買シグナルにならない 他の指標(RSI、MACDなど)と組み合わせることで真価を発揮する

まとめ

  • VWAP は、市場の平均的な取引価格を把握するための強力なツールです。
  • 特に短期売買やアルゴリズム取引においては、VWAP を基準にすることで、合理的なエントリー・エグジット判断が可能になります。
  • ただし、VWAP はあくまで「過去の加重平均」であり、未来の価格を予測するものではないことに注意が必要です。
  • 他のテクニカル指標と組み合わせて使うことで、より精度の高いトレード判断ができるでしょう。

JupyterLab でプロット

Excel ファイルの保存したティックデータ(シート名は銘柄コード)を読み込んで、VMAP と、株価との乖離率を算出してプロットした例を示します。

必要なパッケージのインポート

import datetime
import os

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import dates as mdates

Matplotlib の設定(省略可)

FONT_PATH = "../fonts/RictyDiminished-Regular.ttf"
fm.fontManager.addfont(FONT_PATH)

# FontPropertiesオブジェクト生成(名前の取得のため)
font_prop = fm.FontProperties(fname=FONT_PATH)
font_prop.get_name()

plt.rcParams["font.family"] = font_prop.get_name()
plt.rcParams["font.size"] = 12

ティックデータの読込

Excel ファイルはデータを取得した時刻を UNIX 形式のタイムスタンプに変換して保持していますが、このままででは扱いにくいので、Pandas の日付時刻形式に変換してインデックスにしています。

file = "ticks_20251006.xlsx"
body = os.path.splitext(os.path.basename(file))[0]
path_excel = os.path.join("..", "collection", file)
code = "7011"
df = pd.read_excel(path_excel, sheet_name=code)
df.index = pd.to_datetime([datetime.datetime.fromtimestamp(ts) for ts in df["Time"]])
df

 

VWAP と 株価との乖離率 の算出

常に過去データを扱うのであれば、Pandas でスマートに VMAP を算出できるのですが、リアルタイムでデータを逐次取得することを想定しているので、転用しやすいように敢えてループ処理をしています。

cum_pv = 0.0
cum_vol = 0.0
volume_prev = None
vwap_list = []
vwap_deviation_list = []


# データを逐次取得することを想定して、ループで処理
for price, volume in zip(df["Price"], df["Volume"]):
    if volume_prev is None:
        vol_diff = 0.0
    else:
        # ティックデータの出来高は累積出来高であるため
        vol_diff = volume - volume_prev

    cum_pv += price * vol_diff
    cum_vol += vol_diff
    volume_prev = volume

    # VWAP の算出
    vwap = cum_pv / cum_vol if cum_vol > 0 else price
    vwap_list.append(vwap)

    # 株価と VWAP の乖離率
    vwap_deviation = (price - vwap) / vwap
    vwap_deviation_list.append(vwap_deviation)

df["VWAP"] = vwap_list
df["VWAPdev"] = vwap_deviation_list
df

 

株価と VWAP のプロット

fig, ax = plt.subplots(figsize=(6, 3))

ax.plot(df["Price"], linewidth=1, label="株価")
ax.plot(df["VWAP"], linewidth=1, label="VWAP")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")

plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap.png")
plt.show()

 

株価と VWAP の乖離率

fig, ax = plt.subplots(figsize=(6, 3))

ax.plot(df["VWAPdev"], linewidth=1, color="C2", label="VWAP 乖離率")
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
ax.set_ylabel("VWAP 乖離率")
ax.grid()
ax.legend(fontsize=7)
ax.set_title(f"{code} in {file}")

plt.tight_layout()
# plt.savefig(f"{body}_{code}_vwap_dev.png")
plt.show()

 

参考サイト

  1. 用語集 | 日本取引所グループ VWAP
  2. Volume-weighted average price - Wikipedia
  3. pandasでExcelファイル(xlsx, xls)の読み込み(read_excel) | note.nkmk.me

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2025-11-01

【備忘録】ウォルラス演算子と正規表現 ~ Python

Python 3.8 から導入された := は、代入と評価を同時に行える構文で、条件式やループ内での一時変数の代入に特に便利です [1]。恥ずかしながら、生成 AI とのコーディングのやりとりで話題になるまで、知らなかった演算子でした😳。

生成 AI (Microsoft Copilot) が次のようにまとめてくれました。

🦭 ウォルラス演算子( := )とは?

  • 正式名称:Assignment Expression(代入式)
  • 通称:ウォルラス演算子( := の形がセイウチ, walrus の目と牙に似ていることから)
  • 導入バージョン:Python 3.8 (PEP 572 [2])

この演算子は、式の中で変数に値を代入しつつ、その値を評価に使うことができます。従来の = は文としてしか使えず、式の中では使えませんでした。

特に便利だと思う、正規表現を扱う時の例を備忘録としてまとめました。

ウォルラス演算子の利用例
import re

pattern = re.compile(
    r"^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$"
)


addr = "user@example.com"

if match := pattern.match(addr):
    print(f"メールアドレスは '{match.group(0)}' です。")
else:
    print(f"'{addr}' は無効なメールアドレスです。")
メールアドレスは user@example.com です。

電子メールアドレスを判別する正規表現は、参考サイト [3] を引用しました。

参考サイト

  1. What's New In Python 3.8 — Python ドキュメント
  2. PEP 572 – Assignment Expressions | peps.python.org
  3. メールアドレスの正規表現 | 正規表現入門

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

2025-10-08

【備忘録】NumPy の警告を例外として扱う

NumPy は、プログラミング言語 Python において数値計算を効率的に行うための拡張モジュールです。効率的な数値計算を行うための型付きの多次元配列(例えばベクトルや行列などを表現できる)のサポートを Python に加えるとともに、それらを操作するための大規模な高水準の数学関数ライブラリを提供しています。

Wikipedia より引用、編集

Numpy の関数計算で無効な引数を指定した場合、RuntimeWarning という警告が出るものの np.float64(nan) を返すだけの場合があります。例を以下に示しました。

import numpy as np

v = -1
np.log(v)
/tmp/ipykernel_10573/3390615159.py:4: RuntimeWarning: invalid value encountered in log
  np.log(v)
np.float64(nan)

np.float64(nan) で処理されて都合が良い時もありますが、例外処理をしたい場合もあります。

警告を例外として扱う方法を Microsoft Copilot に尋ねてみたところ、三つのやり方を教えてくれました。

その中で、最もしっくりきた方法を備忘録にしました。

import warnings

import numpy as np

# NumPyの警告を例外として扱う設定
warnings.filterwarnings("error")

try:
    v = -1
    result = np.log(v)
except Warning as e:
    print(f"警告が例外としてキャッチされました: {e}")
警告が例外としてキャッチされました: invalid value encountered in log

使用した OS 環境は以下のとおりです。

Fedora Linux Workstation 42 x86_64
Python 3.13.7
jupyterlab 4.4.9
numpy 2.2.6

参考サイト

  1. Pythonのwarningsで警告(Warning)を非表示、例外化 | note.nkmk.me

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加