2024-02-29

KDE Plasma 6 リリース

KDE Plasma は、主に Linux 向けに開発されているデスクトップ環境です。長い開発期間を経て、ようやく Qt 6 を利用した KDE Plasma 6 が 2 月 28 日(現地時間)にリリースされました。リリースの詳細については、プロジェクトからのアナウンス [1] をご覧ください。

早速 KDE プロジェクトが提供している Linux ディストロである KDE neon のサイト [2] から User Edition の neon-user-20240228-1346.iso をダウンロードして、仮想環境 GNOME Boxes へインストールしてみました。

KDE neon (neon-user-20240228-1346.iso) の KDE Plasma 6 デスクトップ画面

KDE Plasma 6 の機能については、少し使い込んでからまとめていきたいと考えています。

追記 [2024-03-02]

過去にブログで掲載していた「Linux ディストロ探訪」を再構成し、KDE neon を取り上げました[サイトへ]。継続的に内容を更新していきます。

参考サイト

  1. KDE MegaRelease 6 - KDE Community [2024-02-28]
  2. KDE neon - Download Now

 

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

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



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

2024-02-26

Fedora Linux と Berkeley DB

Berkeley DB (BDB) は、キー/バリュー・データ用の組み込みデータベース・ソフトウェア・ライブラリで、オープンソース・ソフトウェアにおいて歴史的に重要な位置を占めています。Berkeley DB は C 言語で書かれており、他の多くのプログラミング言語用の API バインディングを備えています。BDB は任意のキーとデータのペアをバイト配列として格納し、一つのキーに対して複数のデータ項目をサポートできます。Berkeley DB は SQL を利用したリレーショナルデータベースではありませんが、データベーストランザクション、マルチバージョン・コンカレンシーコントロール、ライトアヘッド・ロギングなどのデータベース機能を備えています。BDB は、ほとんどの Unix ライクなシステムや Windows、リアルタイムオペレーティングシステムを含む、さまざまなオペレーティングシステム上で動作します。

Wikipedia より引用、翻訳、編集

Fedora Linux を開発している Fedora プロジェクトは、Fedora 33[2020-10-27 リリース]から Berkeley DB (libdb) の利用を非推奨 (deprecated)、Fedora 35[2021-11-02 リリース]からは使用を放棄 (orphaned) するとして、多くのソフトウェアが使用している libdb から他のデータベースへの移行を進めています [1]

Fedora Linux はパッケージ管理に RPM というパッケージマネージャを利用していますが、この RPM が Berkeley DB に依存していたので(RPM の開発プロジェクトは)これを SQLite へ移行しています [2] [3] [4]

Fedora Linux に収録されているパッケージで Berkeley DB に依存しているソフトウェアは数が多く、他のデータベースへの移行には時間がかかるようです。次期リリースの Fedora Linux 40 でも依然、特定のパッケージについて Berkeley DB から他のデータベースへ移行することが変更予定 (ChangeSet) に記載されています [5]

今回のテーマ
  • いまさらではありますが、なぜ Fedora プロジェクトが Berkeley DB のライブラリに依存しないように取り組んでいるのかをまとめました。

4.4BSD Unix 用に開発された Berkeley DB

Berkeley DB は、もともとカリフォルニア大学バークレー校で 4.4BSD Unix 用に開発されたフリーライセンスのデータベース・ソフトウェアでした。その後 1996 年に、このプロジェクトの開発者たちは Sleepycat 社を設立し、Netscape 社から新機能提供の要請を受けて商用サポートを始めました。

そのため、Sleepycat 社は、商用利用目的ではプロプライエタリ・ソフトウェア・ライセンスの下で Berkeley DB を配布し、同時に Sleepycat License を作成し、GNU General Public License と同様のコピーレフトな再配布条件で、オープンソースとしての利用と配布を許可しました。

Wikipedia より引用、翻訳、編集

Oracle 社による買収とライセンス変更

2006 年に Oracle 社が Sleepycat 社を買収しました [6]。当然のことながら、Berkeley DB は Oracle 社の製品群に追加されました。

その後 2013 年に、Oracle 社は Berkeley DB のライセンスを変更しています [8] [9]。Fedora プロジェクトの wiki によると、ライセンス変更は Berkeley DB v.6 からのようです [10]。具体的には、オープンソース向けのライセンスが、従来の Sleepycat License から AGPLv3+ へ変更されました [11]

AGPL とは

AGPL は GPLv2 のコピーレフト条項が ASP では適用されない課題を解決するために策定されたライセンスです。すなわち、AGPL ライセンスの著作物(通常、ウェブアプリケーション)のネットワークユーザーに対して、完全なソースコードを提供可能にしておくことを要求しています。

Wikipedia より引用、編集

Fedora プロジェクトの判断

AGPL の是非は別として、ライセンスが変更された新しいバージョンの Berkeley DB を Fedora Linux に収録すると、少なくとも ASP に Fedora Linux あるいは(Fedora プロジェクトの開発成果を反映した)RHEL を利用している開発者に運用方法の変更を強いることにつながります。特にエンタープライズ用途のアプリケーションにとって深刻な変更になるでしょう。

Fedora プロジェクトは Fedora Linux に収録する Berkeley DB を、新しいライセンスが適用される前のバージョンに据え置きました。

Oracle Berkeley DB の最新バージョンは、このブログ記事作成時点で 18.1 ですが [12]、現行の Fedora Linux 39 に収録されている Berkeley DB のバージョンは以下にように 5.3.28 のままです。

Fedora Linux 39 に収録されている libdb

他の Linux ディストロ

RHEL 9 では libdb (Berkeley DB) の利用は非推奨になっており [13] [14] [15]、利用できる libdb のバージョンも 5.3.28 です。Debian や Ubuntu でも libdb のバージョンは 5.3.28 です。

念のため、Oracle Linux 9 を確認してみましたが、libdb は RHEL と同様に 5.3.28 を利用できるものの、それより新しい Oracle Berkeley DB のバージョンは、モジュールストリームを含めて利用できるようにはなっていませんでした。RHEL 互換のためと言い訳できるのでしょうが、Unbreakable Enterprise Kernel (UEK) の利用をユーザーにほぼ強制している割には、自社製品である Berkeley DB については消極的なアプローチなので、やり方が狡いと感じてしまいます。💢

ちなみに最新の Berkeley DB を収録している Linux ディストロがあるのか探したところ、OpenMandriva Lx 15 が Berkley DB 18.1 を lib64db18.1 というパッケージ名で収録していました。こだわりがあるのか、何か情報がないか探しましたが、これといった情報に辿り着けませんでした。

OpenMandriva Lx 15 に収録されている lib64db18.1

最後に

冒頭に触れた Fedora プロジェクト Wiki 'Changes/Libdb deprecated' [1]Detailed Description には、「Fedora 35 で既存のデータベースの変換ツールを提供し、libdb を orphaned(放棄)としてマークします。」とありますが、変換ツールについての詳細が追記されていません。

調べてみると、Fedora Linux の libdb の RPM パッケージ(の spec ファイル)について、参考サイト [17] のコミットに db_converter の追加が記されています。db_converter の github のサイト [18] によると、Berkeley DB から様々なデータベース形式への変換ツールとのことです。この変更は libdb パッケージのリリースバージョン 57 以降になるので、Fedora Linux 40 からになるでしょう。

参考サイト

  1. Changes/Libdb deprecated - Fedora Project Wiki
  2. Fedora Looking To Transition The RPM Database From Berkeley DB To SQLite - Phoronix [2020-03-16]
  3. RPM 4.16.0 Release Notes [2020-09-30]
  4. RPM 4.17.0 Release Notes [2021-09-03]
  5. Releases/40/ChangeSet - Fedora Project Wiki
  6. Oracle、オープンソースデータベースのSleepycatを買収 - ITmedia NEWS [2006-02-15]
  7. オラクルが作るNoSQL DBの正体は?(1/2) - @IT [2011/11/8]
  8. Berkeley DB、ライセンスを変更 - OSSコミュニティでは議論 | TECH+(テックプラス) [2013-07-08]
  9. Oracle、BerkeleyDBのライセンスをひっそりとAGPLに変更 | スラド オープンソース [2013-07-10]
  10. Changes/BerkeleyDB 6 - Fedora Project Wiki [2014-06-04]
  11. Open Source License for Berkeley DB
  12. Oracle Berkeley DB Downloads
  13. 7.6. 動的プログラミング言語、Web サーバー、およびデータベースサーバー Red Hat Enterprise Linux 9 | Red Hat Customer Portal
  14. Available replacements for the deprecated Berkeley DB (libdb) in RHEL - Red Hat Customer Portal [2023-02-28]
  15. RHEL で廃止された Berkeley DB (libdb) の利用可能な置き換え - Red Hat Customer Portal [2023-02-28]
  16. MySQL闇歴史 SleepycatとBerkeley DB [2022-12-05]
  17. Commit - rpms/libdb - 1615145196a9e0b7b94db250670133275e1209d5 - src.fedoraproject.org
  18. fila43/db_converter: Converting tool from BerkeleyDB to various databases formats

Fedora 36 のころに公開されたビデオですが、判りやすく、かつ丁寧に Fedora Linux について紹介されています。

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

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



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

2024-02-24

QWebEnginePage のコンテクスト・メニュー

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

QWebEngineView に表示されたウェブサイト上を右クリックするとコンテクスト・メニューが表示されます。メニューの中で、Back / Forward / Reload については機能が付いていますが、残る Save pageView page source については(少なくとも試した PySide6 のバージョンでは)何も反応がありません。

今回のテーマ
  • QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されます。
  • ここに表示されたウェブサイト上で、右クリックすると表示されるコンテクスト・メニュー(下記)の Save pageView page source を利用します。

なお、本サンプルで使用しているウェブサイトは、下記を利用しています。

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

Fedora Workstation 39 x86_64
Python 3.12.1
PySide6 6.6.2

サンプルを以下に示します。

qt_webenginepage_3.py

このサンプルの実行例を以下に示しました。

qt_webenginepage_3.py の実行例

サンプルの説明

Save page

参考サイト [2]PySide6.QtWebEngineCore.QWebEnginePage.WebAction の説明によると、

定  数説  明
QWebEnginePage.SavePage
(QWebEnginePage.WebAction.SavePage)
Save the current page to disk. MHTML is the default format that is used to store the web page on disk. Requires a slot for downloadRequested() .
[参考訳]
現在のページをディスクに保存します。MHTML は、Web ページをディスクに保存する際のデフォルトのフォーマットです。downloadRequested() のスロットが必要です。

downloadRequested() のスロットが必要?

具体的に何をするのかピンとこなかったのですが、参考サイト [1] にズバリ知りたかったことが記載されていましたので、参考にさせていただきました。

class Example(QWebEngineView):
    def __init__(self, url: QUrl):
        super().__init__()
          :
          :
        self.page().profile().downloadRequested.connect(
            self.on_download_requested
        )

on_download_requested メソッドでは、最初に念のため self.pageAction(QWebEnginePage.WebAction.SavePage) が有効になっているか確認しています。

    def on_download_requested(self, download: QWebEngineDownloadRequest):
        action: QAction = self.pageAction(QWebEnginePage.WebAction.SavePage)
        if not action.isEnabled():
            return

        # Save page as single HTML
        url_path = download.url().path()
        if url_path == '/':
            url_path = 'index.html'
        suffix = QFileInfo(url_path).suffix()
        path, _ = QFileDialog.getSaveFileName(
            self, 'Save File', url_path, '*.' + suffix
        )
        if path:
            download.setSavePageFormat(
                QWebEngineDownloadRequest.SavePageFormat.SingleHtmlSaveFormat
            )
            download.setDownloadFileName(path)
            download.accept()

QWebEngineDownloadRequest クラスの使い方、あるいはそのインスタンス download の扱い方については、試行錯誤をしている状態です。とりあえず、表示されている HTML の内容が保存されることで良しとしています。🙇🏻

View page source

参考サイト [2]PySide6.QtWebEngineCore.QWebEnginePage.WebAction の説明によると、

定  数説  明
QWebEnginePage.ViewSource
(QWebEnginePage.WebAction.ViewSource)
Show the source of the current page in a new tab. Requires implementation of createWindow() or newWindowRequested() .
[参考訳]
現在のページのソースを新しいタブに表示します。createWindow() または newWindowRequested() の実装が必要です。

これもなんだかよく判らなかったのですが、とにかく createWindow メソッドを実装(オーバーライド)してテストしてみました。すると、コンテクスト・メニューの View page source を選択すると、確かにこのメソッドが実行されることを確認できました。

この createWindow メソッドが呼び出されるのは、ソースを表示したい時だけではないかもしれないので、まず self.pageAction(QWebEnginePage.WebAction.ViewSource) が有効になっているかどうかを確認しています。なお、HTML ソースの内容を QTextEdit などに表示した方が実用的ですが、ここでは単に print_html メソッドで標準出力しています。

    def createWindow(self, wwtype: QWebEnginePage.WebWindowType):
        action: QAction = self.pageAction(QWebEnginePage.WebAction.ViewSource)
        if not action.isEnabled():
            return
        # Just STDOUT
        self.page().toHtml(self.print_html)
    @staticmethod
    def print_html(html: str):
        print(html)

参考サイト

  1. python - How to download csv file with QWebEngineView and QUrl - Stack Overflow [2019-05-03]
  2. QWebEnginePage - Qt for Python
  3. QWebEngineView - Qt for Python
  4. QWebEngineDownloadRequest - Qt for Python

下記の動画では PyQt6 を利用しており、PySide6 ではありませんが大部分が同じなので参考になります。

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

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



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

2024-02-23

QThreadPool と QRunnable (2) 〜 PySide6 〜

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

以前、当ブログで PySide6 の QThreadPool と QRunnable を利用したマルチスレッディングのサンプルを紹介しました [1]。これは、他サイトで紹介されていたサンプル [2] を自分用に判りやすく書き直したサンプルでした。

その後、意外とマルチスレッディングを必要とする機会が多く、最近の本ブログ記事でも QThreadPool をタイトルにした記事 [3] を掲載しました。しかし、あとで読み返してみるど、タイトルの QThreadPool を使うことよりも、どちらかというと mplfinance モジュールに興味が向くような内容になっていました。

今回は(主に自分自身が)テンプレート的に利用できるシンプルな QThreadPool と QRunnable のサンプルを、備忘録としてまとめました。

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

Fedora Workstation 39 x86_64
Python 3.12.1
PySide6 6.6.2

サンプルを以下に示しました。

qt_threadpool_2.py

このサンプルの実行例を以下に示しました。

START ボタンをクリックすると、Worker クラスのインスタンスの処理 worker.run() は、QThreadPool クラスのインスタンス self.threadpoolstart メソッドで別スレッドで開始されます。

           :
           :
        worker = Worker()
        worker.threadProgress.connect(self.on_status_update)
        worker.threadFinished.connect(self.on_completed)
        self.threadpool.start(worker)

Worker クラスは QRunnable を継承したクラスで、run メソッドを実装します。QRunnable クラスでは Singal を利用できないので、別に QObject クラスを継承した WorkerSignal クラスで必要な Signal を定義しておき、これも Worker クラスが QRunnable と一緒に継承(多重継承)します。

class WorkerSignal(QObject):
    threadFinished = Signal()
    threadProgress = Signal(int)


class Worker(QRunnable, WorkerSignal):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(100):
            time.sleep(0.1)
            self.threadProgress.emit(i + 1)
        self.threadFinished.emit()

run メソッドの処理は、テスト用に用意した 0.1 秒の sleep の 100 回ループを開始、ループカウントを self.threadProgress シグナルで毎回 emit します。これを本体のスロットで受け取って QProgressBar のインスタンスの値を更新しています。

ループが終わると self.threadFinishedemit します。

参考サイト

  1. bitWalk's: QThreadPool と QRunnable 〜 PySide6 〜 [2023-01-23]
  2. Multithreading PySide6 applications with QThreadPool
  3. bitWalk's: QThreadPool を使う ~ PySide6 [2024-01-30]
  4. QThreadPool - Qt for Python
  5. QRunnable - Qt for Python

 

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

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



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

2024-02-18

QWebEnginePage から HTML ソースを取得する(改) ~ PySide6

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

以前、当ブログで紹介した、QWebEngineView で表示したサイトの HTML を取得するサンプル [1] について、より簡単な方法が判ったので改定します。

今回のテーマ
  • QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されますが、ここに表示されたウェブサイトの HTML のソースを取得します。[改訂版]

なお、本サンプルで使用しているウェブサイトは、下記を利用しています。

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

Fedora Workstation 39 x86_64
Python 3.12.1
PySide6 6.6.2

サンプルを以下に示します。このサンプルは、指定した URL を表示して、そのソースを標準出力するという単純なものです。

HTML ソースの内容取得には、QWebEnginePagetoHtml メソッドを利用しています。当初、マニュアル(参考サイト [3])でこのメソッドの説明を読んでも使い方がピンとこなかったので、用法の追求を後回しにしてしまいました。

qt_webenginepage_2.py

このサンプルの実行例を以下に示しました。

qt_webenginepage_2.py の実行例

表示された HTML の内容が標準出力されます。

qt_webenginepage.py の出力例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<!-- Google tag (gtag.js) -->
<script type="text/javascript" async="" src="https://ssl.google-analytics.com/ga.js"></script><script async="" src="https://www.googletagmanager.com/gtag/js?id=G-ZML74SB67X"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-ZML74SB67X');
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="keywords" content="パンダ,ジャイアントパンダ,上野パンダ,上野動物園,上野,保護,サポート基金,ZOONET">
<meta name="description" content="東京動物園協会の運営する「UENO-PANDA.JP」は、上野動物園のジャイアントパンダを紹介する公式サイトです。ジャイアントパンダの個体情報をはじめ、上野動物園へのアクセス、開園時間、園内マップ、その他ジャイアントパンダ保護サポート基金等、さまざまな情報を掲載しています。">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0">
<link rel="shortcut icon" href="//www.ueno-panda.jp/favicon.ico" type="image/x-icon">
<link rel="icon" href="//www.ueno-panda.jp/favicon.ico" type="image/x-icon">

<title>上野動物園のジャイアントパンダ情報サイト「UENO-PANDA.JP」</title>
   :
   :
(以下省略)

参考サイト

  1. bitWalk's: QWebEnginePage から HTML ソースを取得する ~ PySide6 [2024-01-08]
  2. QWebEngineView - Qt for Python
  3. QWebEnginePage - Qt for Python

 

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

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



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

2024-02-07

Secure Boot に対応している Linux ディストロ

UEFI セキュアブートは、起動対象のオペレーティングシステムの電子署名を検証して正当なソフトウェアであることが確認できた場合にのみブート処理を継続します。Windows マークのあるマシンではセキュアブートに Microsoft の電子署名が使われており、Windows 8 以降はセキュアブート電子署名が付与されています。一方で、Windows 7 以前のオペレーティングシステムやほとんどの Linux ディストリビューションは電子署名が付与されていないため、セキュアブートが有効な UEFI ブートローダーでは起動できません。

Microsoft は、実費で Microsoft の鍵によって署名を行うサービスを提供しています。Fedora, openSUSE, Ubuntu, RHEL, Debian などの Linux ディストリビューションは、このサービスによって署名された軽量ブートローダを用いることでセキュアブート(の鍵配布と鍵インストールに纏わる問題)に対応しています。

Wikipedia より引用・編集

最近はお金が無いし、置く場所も無くなってきたのでコンスタントには続いていないのですが、超格安の Windows PC を買っては Linux をインストールしてみることが趣味のようになっています。

それでも、年に何回かは買ってしまう超格安の PC へ Linux をインストールする際、UEFI のセキュアブートを無効にしなくとも、そのままインストールできていて、迂闊にもそれを不思議だと感じていませんでした。

最初にインストールしてみる Linux ディストロである Fedora Linux が、セキュアブートに対応していたのでした [1]。また、UEFI でセキュアブートを無効にする機能が、Windows 10 以降で(要求仕様では)オプションになっていることを知りませんでした。実機にインストールするのであれば、セキュアブートに対応している Linux ディストロであることが要件になってきます。

そう言えば、昨年 12 月に開催された AlmaLinux Day Tokyo において、AlmaLinux OS Architect / Release Engineering Lead の Andrew Lukoshko 氏が、AlmaLinux はセキュアブートに対応していることを詳しく話されていましたが、自分の理解が追従できませんでした。そのため、たとえ逐次通訳の説明があってもメモをしっかり取れなかったことを思い出しました [2]。その時の講演では Rocky Linux はセキュアブートに対応していないのでは、なんて話がありましたが Rocky Linux 8.5 以降でセキュアブートに対応しています [3]

Linux ディストロを調べればセキュアブートに対応しているかは判るのですが、逆に、セキュアブートに対応している Linux ディストロ一覧の情報がないか探しています。しかし、そんな都合の良いサイトは見つかっていません。よいサイトが見つかれば情報を追記していきます。

参考サイト

  1. Secureboot - Fedora Project Wiki
  2. bitWalk's: AlmaLinux Day に参加して [2023-12-09]
  3. Rocky Linux 8.5 is Out, Secure Boot is Now Officially Supported [2021-11-16]

 

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

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



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