tag:blogger.com,1999:blog-91760132024-03-19T12:08:07.745+09:00bitWalk'sすぐりふひとのプログラミングメモUnknownnoreply@blogger.comBlogger1122125tag:blogger.com,1999:blog-9176013.post-31222145681568697142024-03-17T19:32:00.006+09:002024-03-17T19:41:26.575+09:00KaOS 2024.03 と KDE Plasma 6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB7w_k6S942RWd3ahKZGDOcpTgZf8ASH_gR1EZiLR1I9_9wn4KdZCjp66nTyymbh4MUXTAnTu3ymcRfeBd8eQF_eSzejSVZ0fZMbbk4d9ZjsRMpaO_sk_g_mVpmm7WRvng9P1ofLpmQSi1tk9woqYgR4pEgq66BvQasyM2S86b-jH74DJBQ9ofPA/s1600/KaOS_logo.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB7w_k6S942RWd3ahKZGDOcpTgZf8ASH_gR1EZiLR1I9_9wn4KdZCjp66nTyymbh4MUXTAnTu3ymcRfeBd8eQF_eSzejSVZ0fZMbbk4d9ZjsRMpaO_sk_g_mVpmm7WRvng9P1ofLpmQSi1tk9woqYgR4pEgq66BvQasyM2S86b-jH74DJBQ9ofPA/s1600/KaOS_logo.png"/></a></div>
<p>KaOS は デスクトップ用途の Linux ディストリビューションで、最新バージョンの KDE デスクトップ環境、Qt ツールキットを使用するその他の一般的なソフトウェアアプリケーションを搭載しています。</p>
<div align="right" style="font-size: small;"><a href="https://en.wikipedia.org/wiki/KaOS" target="_blank">Wikipedia</a> より引用・翻訳、編集</div>
<p>先日正式にリリースされた KDE Plasma 6 をいち早くデスクトップ環境に反映している Linux ディストロを探索していたところ、KaOS というディストロが対応していることを知りました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/KaOS-2024.03/KDE_Plasma_6.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1080" data-original-width="1920" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/KaOS-2024.03/KDE_Plasma_6.png"/></a></div>
<div class="title2">KaOS のデスクトップ画面</div>
<p>ノート「<a href="https://bitwalk.blogspot.com/p/linux_2.html">Linux ディストロ探訪</a>」に、KaOS を取り上げました[<a href="https://bitwalk.blogspot.com/p/kaos.html">サイト</a>へ]。継続的に内容を更新していきます。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="kaosx"></a><a href="https://kaosx.us/" target="_blank">KaOS – A Lean KDE Distribution</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/e3wz0vBhGHY?si=0H7IZrRSdllzQMB3" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-17155548524772106222024-03-16T06:33:00.008+09:002024-03-16T07:21:53.745+09:00openSUSE Tumbleweed が KDE Plasma 6 に対応<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLa6lmsL5JFfs7wXZ9bxd0ft4BPhtn7AoUHd8D_7-v0Y9ciGinZ4i6mVfsciX06JDuiSr-EqqM2677gFlp-qYv69u-n9EIZb5BJU0eJ699iL-T0BSEmkPhrLfDF-rlZ_zRx0E4YHET20keL0RpNzEBJwIv0rwQTktQQKnNbfjQq1e0wu2VG_Xzw/s1600/opensuse.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLa6lmsL5JFfs7wXZ9bxd0ft4BPhtn7AoUHd8D_7-v0Y9ciGinZ4i6mVfsciX06JDuiSr-EqqM2677gFlp-qYv69u-n9EIZb5BJU0eJ699iL-T0BSEmkPhrLfDF-rlZ_zRx0E4YHET20keL0RpNzEBJwIv0rwQTktQQKnNbfjQq1e0wu2VG_Xzw/s1600/opensuse.png"/></a></div>
<p style="font-size: small;">openSUSE <span class="mono">/ˌoʊpənˈsu↪Lzə/</span> は、SUSE 社等が支援するコミュニティー <span style="font-weight: bold;">openSUSE プロジェクト</span> によって開発されいるオープンソースの Linux ディストリビューションです 。元々は <a href="https://ja.wikipedia.org/wiki/SUSE" target="_blank">SUSE</a> 社が開発していたエンタープライズ向けの SUSE Linux でしたが、2003 年に<a href="https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%99%E3%83%AB_%28%E4%BC%81%E6%A5%AD%29" target="_blank">ノベル</a>社が SUSE 社を買収。その後、SUSE Linux から openSUSE へ名称変更して、100% オープンソースを目指したコミュニティベースの開発体制に移行しました。</p>
<div align="right" style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/OpenSUSE" target="_blank">Wikipedia</a> より引用、編集</div>
<p>参考サイト <a href="#FZ7OPVGZS3IIJKTQSB5JIGAFPIU466R3">[1]</a> によると、<a href="https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9" target="_blank">ローリングリリース</a>版の openSUSE Tumbleweed は <span class="mono">Snapshot20240311</span> より、KDE Plasma 5 から 6 (KDE Plasma 6.0.1 / Gear 24.02 / Frameworks 6.0) への移行を開始したとのことです。</p>
<p>openSUSE Tumbleweed のダウンロードサイト <a href="#tumbleweed">[2]</a> から <span class="mono">openSUSE-Tumbleweed-DVD-x86_64-Snapshot20240314.iso</span> をダウンロードして、<a href="https://ja.wikipedia.org/wiki/GNOME_Boxes" target="_blank">GNOME Boxes</a> にインストールしてみました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/openSUSE-Tumbleweed-DVD-x86_64-Snapshot20240314.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="1080" data-original-width="1920" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/openSUSE-Tumbleweed-DVD-x86_64-Snapshot20240314.png"/></a></div>
<div class="title2">openSUSE-Tumbleweed の KDE Plasma 6 デスクトップ(Snapshot20240314)</div>
<p>現時点では <a href="https://ja.wikipedia.org/wiki/Wayland" target="_blank">Wayland</a> には未対応です。</p>
<p>ちなみに、言語に日本語を選択してインストールすると、インストール後に日本語変換 <span class="mono">(ibus-mozc)</span> が利用できるようになっていました。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="FZ7OPVGZS3IIJKTQSB5JIGAFPIU466R3"></a><a href="https://lists.opensuse.org/archives/list/factory@lists.opensuse.org/thread/FZ7OPVGZS3IIJKTQSB5JIGAFPIU466R3/" target="_blank">KDE Megarelease 6 in TW snapshot 20240311 - openSUSE Factory - openSUSE Mailing Lists</a> [2024-03-13]</li>
<li><a name="tumbleweed"></a><a href="https://get.opensuse.org/tumbleweed/" target="_blank">openSUSE Tumbleweed - Get openSUSE</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/mtaQroi75M0?si=K7rrmpZXS1UxdvxG" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-8361502772175137102024-03-09T06:01:00.003+09:002024-03-09T09:32:27.124+09:00Fedora Linux 40 の壁紙<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png"/></a></div>
<p style="font-size:small;">Fedora Linux は <a href="https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%83%E3%83%89%E3%83%8F%E3%83%83%E3%83%88" target="_blank">Red Hat</a> 社が支援するコミュニティ Fedora Project で開発されている Linux ディストロです。このディストロは、最新の技術を積極的に取り込むことで知られています。Fedora Linux の開発成果は <a href="https://en.wikipedia.org/wiki/CentOS_Stream" target="_blank">CentOS Stream</a> に取り込まれます。ここでテストを経て最終的に <a href="https://ja.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" target="_blank">Red Hat Enterprise Linux, RHEL</a> へ反映されます。</p>
<p style="font-size:small;">Fedora Linux は、おおむね春と秋の年二回の頻度で新しい版がリリースされています。</p>
<p>次期 Fedora Linux 40 の開発は、予定どおり Fedora Rawhide のリポジトリから 2 月 13 日に Fedora Linux 40 のリポジトリへブランチしました<sup> <a href="#f-40-key-tasks">[2]</a></sup>。このところ、Rawhide からのブランチ直前に新しい Fedora Linux 向けの壁紙が更新されていましたが、今回はもっと遅いタイミングでした。</p>
<p>節目の 40 回目のリリースなので、なにか壁紙に趣向が凝らされるのかどうか注目していましたが、ようやく新しい壁紙がリリースされました。特に何か特別な壁紙だという感はありませんでした。Fedora Linux 40 のプレリリース版で確認しました<sup> <a href="#iso">[3]</a></sup>。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_40_wallpaper.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_40_wallpaper.png"/></a></div>
<div class="title2">Fedora Linux 40 の壁紙(デフォルト)[2024-03-09 現在]</div>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_40_wallpaper_dark.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_40_wallpaper_dark.png"/></a></div>
<div class="title2">Fedora Linux 40 の壁紙(ダーク)[2024-03-09 現在]</div>
<p>Fedora Linux 40 の正式リリースは、現在のところ 4 月 16 日に予定されています<sup> <a href="#f-40-key-tasks">[2]</a></sup>。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="f40"></a><a href="https://docs.fedoraproject.org/en-US/releases/f40/" target="_blank">Fedora Linux 40 :: Fedora Docs</a></li>
<li><a name="f-40-key-tasks"></a><a href="https://fedorapeople.org/groups/schedule/f-40/f-40-key-tasks.html" target="_blank">Fedora Linux 40 Schedule: Key</a></li>
<li><a name="iso"></a><a href="https://dl.fedoraproject.org/pub/fedora/linux/development/40/Workstation/x86_64/iso/" target="_blank">https://dl.fedoraproject.org/pub/fedora/linux/development/40/Workstation/x86_64/iso/</a></li>
<li><a name="ChangeSet"></a><a href="https://fedoraproject.org/wiki/Releases/40/ChangeSet" target="_blank">Releases/40/ChangeSet - Fedora Project Wiki</a></li>
<li><a name="Wallpapers"></a><a href="https://fedoraproject.org/wiki/Wallpapers" target="_blank">Wallpapers - Fedora Project Wiki</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/AioC5KaPMKE?si=qbZ8Rr_RuMedCboC" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-73559665215860772982024-03-08T18:57:00.000+09:002024-03-08T18:57:26.935+09:00【備忘録】sizeHint の活用 ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p></p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>GUI のウィンドウサイズを固定します。</li>
</ul>
</div>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.2</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.2</td>
</tr>
</tbody></table>
<p>PySide6 で、ウィンドウのサイズを固定するには次のようにします。</p>
<pre class="brush:python gutter:false" title="">
self.setFixedSize(600, 400)
</pre>
<p>これで、ウィンドウのサイズは 600 x 400 に固定され、変更できなくなります。</p>
<p>ひとつ問題があります。作成した GUI のウィンドウの最小サイズをどのように入手するのか、ということです。そんなとき、下記のように <span class="mono">sizeHint</span> メソッドを利用すれば簡単に解決できます。</p>
<pre class="brush:python gutter:false" title="">
self.setFixedSize(self.sizeHint())
</pre>
<p>サンプルを以下に示します。</p>
<div class="title1">qt_gridlayout_top_left_resize.py</div>
<script src="https://gist.github.com/bitwalk123/01a8239233487e5639b06e9fa76104ac.js"></script>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_gridlayout_top_left_resize_1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="233" data-original-width="287" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_gridlayout_top_left_resize_1.png"/></a></div>
<div class="title2">qt_gridlayout_top_left_resize.py の実行例</div>
<p>なぜこのような簡単なテーマを備忘録にするのかというと、それは、自分が長い間 Tcl/Tk で GUI アプリを作っていたからです。Tk では、ウィンドウのサイズ変更を <span class="mono">wm</span> コマンドで制御しているため<sup> <a href="#wm_resizable">[1]</a></sup>、そのやり方にとらわれてしまって PySide6 ではどうするのか、かなり長い間解らなかったからです。</p>
<pre class="brush:bash gutter:false" title="">
wm resizable window ?width height?
</pre>
<p>結局、自分のための備忘録なのです。🙇🏻</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="wm_resizable"></a><a href="https://wiki.tcl-lang.org/page/wm+resizable" target="_blank">wm resizable</a> [Tcl/Tk manual]</li>
</ol>
<p style="clear:both;"></p>
<iframe width="480" height="270" src="https://youtube.com/embed/SelawmXHtPg?si=OaSJf6aColqP5_1y" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-73778357264584925672024-02-29T04:54:00.005+09:002024-03-02T10:29:56.412+09:00KDE Plasma 6 リリース<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png" style="display: block; padding: 0.35em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png"/></a></div>
<p>KDE Plasma は、主に Linux 向けに開発されているデスクトップ環境です。長い開発期間を経て、ようやく Qt 6 を利用した KDE Plasma 6 が 2 月 28 日(現地時間)にリリースされました。リリースの詳細については、プロジェクトからのアナウンス <a href="#6">[1]</a> をご覧ください。</p>
<p>早速 KDE プロジェクトが提供している Linux ディストロである KDE neon のサイト <a href="#download">[2]</a> から User Edition の <span class="mono">neon-user-20240228-1346.iso</span> をダウンロードして、仮想環境 <a href="https://ja.wikipedia.org/wiki/GNOME_Boxes" target="_blank">GNOME Boxes</a> へインストールしてみました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/neon-user-20240228-1346.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/neon-user-20240228-1346.png"/></a></div>
<div class="title2">KDE neon (neon-user-20240228-1346.iso) の KDE Plasma 6 デスクトップ画面</div>
<p>KDE Plasma 6 の機能については、少し使い込んでからまとめていきたいと考えています。</p>
<h4>追記 <span style="font-weight: normal; font-family: monospace;">[2024-03-02]</span></h4>
<p>過去にブログで掲載していた「Linux ディストロ探訪」を再構成し、KDE neon を取り上げました[<a href="https://bitwalk.blogspot.com/p/kde-neon.html" target="_blank">サイト</a>へ]。継続的に内容を更新していきます。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="6"></a><a href="https://kde.org/ja/announcements/megarelease/6/" target="_blank">KDE MegaRelease 6 - KDE Community</a> [2024-02-28]</li>
<li><a name="download"></a><a href="https://neon.kde.org/download" target="_blank">KDE neon - Download Now</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/tRR9qLwMsoI?si=BHWlOozBVb3RF4gD" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-57474529263633762522024-02-26T18:28:00.007+09:002024-02-27T05:22:08.072+09:00Fedora Linux と Berkeley DB<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTxrf0FWZUPcLuUBfpDAtjeWjegOWZG6Bma0xYM2E8uTKBRGfC-V6AuAE4hXCFDfUhnbxakFzpu6_bxxKkkUoEgVJnbyhhScul9g8j9ZtR1_zi8KxX48BpfIcNNtmgWtPDfR1qoxf1I8iZqjSf7tE8qJ4ik3rm8O-NHOl_sMGrIilNvgsriu_8NA/s1600/oracle_berkeley_db.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTxrf0FWZUPcLuUBfpDAtjeWjegOWZG6Bma0xYM2E8uTKBRGfC-V6AuAE4hXCFDfUhnbxakFzpu6_bxxKkkUoEgVJnbyhhScul9g8j9ZtR1_zi8KxX48BpfIcNNtmgWtPDfR1qoxf1I8iZqjSf7tE8qJ4ik3rm8O-NHOl_sMGrIilNvgsriu_8NA/s1600/oracle_berkeley_db.png"/></a></div>
<p style="font-size:small;">Berkeley DB (BDB) は、キー/バリュー・データ用の組み込みデータベース・ソフトウェア・ライブラリで、オープンソース・ソフトウェアにおいて歴史的に重要な位置を占めています。Berkeley DB は C 言語で書かれており、他の多くのプログラミング言語用の API バインディングを備えています。BDB は任意のキーとデータのペアをバイト配列として格納し、一つのキーに対して複数のデータ項目をサポートできます。Berkeley DB は SQL を利用したリレーショナルデータベースではありませんが、データベーストランザクション、マルチバージョン・コンカレンシーコントロール、ライトアヘッド・ロギングなどのデータベース機能を備えています。BDB は、ほとんどの Unix ライクなシステムや Windows、リアルタイムオペレーティングシステムを含む、さまざまなオペレーティングシステム上で動作します。</p>
<div align="right" style="font-size: small;"><a href="https://en.wikipedia.org/wiki/Berkeley_DB" target="_blank">Wikipedia</a> より引用、翻訳、編集</div>
<p><a href="https://ja.wikipedia.org/wiki/Fedora" target="_blank">Fedora Linux</a> を開発している Fedora プロジェクトは、Fedora 33<span style="font-size: small; font-family: monospace;">[2020-10-27 リリース]</span>から Berkeley DB (libdb) の利用を非推奨 (deprecated)、Fedora 35<span style="font-size: small; font-family: monospace;">[2021-11-02 リリース]</span>からは使用を放棄 (orphaned) するとして、多くのソフトウェアが使用している libdb から他のデータベースへの移行を進めています<sup> <a href="#Libdb_deprecated">[1]</a></sup>。</p>
<p>Fedora Linux はパッケージ管理に RPM というパッケージマネージャを利用していますが、この RPM が Berkeley DB に依存していたので(<a href="https://rpm.org/" target="_blank">RPM の開発プロジェクト</a>は)これを <a href="https://ja.wikipedia.org/wiki/SQLite" target="_blank">SQLite</a> へ移行しています<sup> <a href="#Fedora-RPMDB-To-SQLite">[2]</a> <a href="#4_16_0">[3]</a> <a href="#4_17_0">[4]</a></sup>。</p>
<p>Fedora Linux に収録されているパッケージで Berkeley DB に依存しているソフトウェアは数が多く、他のデータベースへの移行には時間がかかるようです。次期リリースの Fedora Linux 40 でも依然、特定のパッケージについて Berkeley DB から他のデータベースへ移行することが変更予定 (ChangeSet) に記載されています<sup> <a href="#ChangeSet">[5]</a></sup>。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>いまさらではありますが、なぜ Fedora プロジェクトが Berkeley DB のライブラリに依存しないように取り組んでいるのかをまとめました。</li>
</ul>
</div>
<h2 class="frame">4.4BSD Unix 用に開発された Berkeley DB</h2>
<p>Berkeley DB は、もともとカリフォルニア大学バークレー校で 4.4<a href="https://ja.wikipedia.org/wiki/Berkeley_Software_Distribution" target="_blank">BSD</a> Unix 用に開発されたフリーライセンスのデータベース・ソフトウェアでした。その後 1996 年に、このプロジェクトの開発者たちは Sleepycat 社を設立し、<a href="https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BA" target="_blank">Netscape</a> 社から新機能提供の要請を受けて商用サポートを始めました。</p>
<p>そのため、Sleepycat 社は、商用利用目的では<a href="https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A8%E3%82%BF%E3%83%AA%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2" target="_blank">プロプライエタリ・ソフトウェア</a>・ライセンスの下で Berkeley DB を配布し、同時に <a href="https://opensource.org/license/sleepycat-php" target="_blank">Sleepycat License</a> を作成し、GNU General Public License と同様の<a href="https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%83%AC%E3%83%95%E3%83%88" target="_blank">コピーレフト</a>な再配布条件で、オープンソースとしての利用と配布を許可しました。</p>
<div align="right" style="font-size: small;"><a href="https://en.wikipedia.org/wiki/Sleepycat_Software" target="_blank">Wikipedia</a> より引用、翻訳、編集</div>
<h2 class="frame">Oracle 社による買収とライセンス変更</h2>
<p>2006 年に Oracle 社が Sleepycat 社を買収しました<sup> <a href="#news015">[6]</a></sup>。当然のことながら、Berkeley DB は Oracle 社の製品群に追加されました。</p>
<p>その後 2013 年に、Oracle 社は Berkeley DB のライセンスを変更しています<sup> <a href="#20130708-a019">[8]</a> <a href="#0356236">[9]</a></sup>。Fedora プロジェクトの wiki によると、ライセンス変更は Berkeley DB v.6 からのようです<sup> <a href="#BerkeleyDB_6">[10]</a></sup>。具体的には、オープンソース向けのライセンスが、従来の <a href="https://opensource.org/license/sleepycat-php" target="_blank">Sleepycat License</a> から <a href="GNU%20Affero%20General%20Public%20License" target="_blank">AGPL</a>v3+ へ変更されました<sup> <a href="#berkeleydb-oslicense">[11]</a></sup>。</p>
<h3 class="frame">AGPL とは</h3>
<p>AGPL は <a href="https://ja.wikipedia.org/wiki/GNU_General_Public_License" target="_blank">GPL</a>v2 の<a href="https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%83%AC%E3%83%95%E3%83%88" target="_blank">コピーレフト</a>条項が <a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80" target="_blank">ASP</a> では適用されない課題を解決するために策定されたライセンスです。すなわち、AGPL ライセンスの著作物(通常、ウェブアプリケーション)のネットワークユーザーに対して、完全なソースコードを提供可能にしておくことを要求しています。</p>
<div align="right" style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/GNU_Affero_General_Public_License" target="_blank">Wikipedia</a> より引用、編集</div>
<h3 class="frame">Fedora プロジェクトの判断</h3>
<p>AGPL の是非は別として、ライセンスが変更された新しいバージョンの Berkeley DB を Fedora Linux に収録すると、少なくとも ASP に Fedora Linux あるいは(Fedora プロジェクトの開発成果を反映した)RHEL を利用している開発者に運用方法の変更を強いることにつながります。特にエンタープライズ用途のアプリケーションにとって深刻な変更になるでしょう。</p>
<p>Fedora プロジェクトは Fedora Linux に収録する Berkeley DB を、新しいライセンスが適用される前のバージョンに据え置きました。</p>
<p>Oracle Berkeley DB の最新バージョンは、このブログ記事作成時点で <span class="mono">18.1</span> ですが<sup> <a href="#berkeleydb-downloads">[12]</a></sup>、現行の Fedora Linux 39 に収録されている Berkeley DB のバージョンは以下にように <span class="mono">5.3.28</span> のままです。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_39_libdb_5_3_28.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="611" data-original-width="658" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_linux_39_libdb_5_3_28.png"/></a></div>
<div class="title2">Fedora Linux 39 に収録されている libdb</div>
<h3 class="frame">他の Linux ディストロ</h3>
<p>RHEL 9 では libdb (Berkeley DB) の利用は非推奨になっており<sup> <a href="#deprecated-functionality_dynamic-programming-languages-web-and-database-servers">[13]</a> <a href="#6464541">[14]</a> <a href="#6963237">[15]</a></sup>、利用できる libdb のバージョンも <span class="mono">5.3.28</span> です。Debian や Ubuntu でも libdb のバージョンは <span class="mono">5.3.28</span> です。</p>
<p>念のため、Oracle Linux 9 を確認してみましたが、libdb は RHEL と同様に <span class="mono">5.3.28</span> を利用できるものの、それより新しい Oracle Berkeley DB のバージョンは、モジュールストリームを含めて利用できるようにはなっていませんでした。RHEL 互換のためと言い訳できるのでしょうが、<a href="https://docs.oracle.com/cd/F10276_01/" target="_blank">Unbreakable Enterprise Kernel (UEK)</a> の利用をユーザーにほぼ強制している割には、自社製品である Berkeley DB については消極的なアプローチなので、やり方が狡いと感じてしまいます。💢</p>
<p>ちなみに最新の Berkeley DB を収録している Linux ディストロがあるのか探したところ、<a href="https://en.wikipedia.org/wiki/OpenMandriva_Lx" target="_blank">OpenMandriva Lx</a> 15 が Berkley DB 18.1 を <span class="mono">lib64db18.1</span> というパッケージ名で収録していました。こだわりがあるのか、何か情報がないか探しましたが、これといった情報に辿り着けませんでした。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/openmandriva_15_gnome_lib64db18.1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="483" data-original-width="658" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/openmandriva_15_gnome_lib64db18.1.png"/></a></div>
<div class="title2">OpenMandriva Lx 15 に収録されている lib64db18.1</div>
<h2 class="frame">最後に</h2>
<p>冒頭に触れた Fedora プロジェクト Wiki 'Changes/Libdb deprecated' <a href="#Libdb_deprecated">[1]</a> の <a href="https://fedoraproject.org/wiki/Changes/Libdb_deprecated#Detailed_Description" target="_blank">Detailed Description</a> には、「Fedora 35 で既存のデータベースの<span class="marker_pink">変換ツール</span>を提供し、libdb を orphaned(放棄)としてマークします。」とありますが、変換ツールについての詳細が追記されていません。</p>
<p>調べてみると、Fedora Linux の libdb の RPM パッケージ(の spec ファイル)について、参考サイト <a href="#1615145196a9e0b7b94db250670133275e1209d5">[17]</a> のコミットに <span class="mono">db_converter</span> の追加が記されています。<span class="mono">db_converter</span> の github のサイト <a href="#db_converter">[18]</a> によると、Berkeley DB から様々なデータベース形式への変換ツールとのことです。この変更は libdb パッケージのリリースバージョン 57 以降になるので、Fedora Linux 40 からになるでしょう。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="Libdb_deprecated"></a><a href="https://fedoraproject.org/wiki/Changes/Libdb_deprecated" target="_blank">Changes/Libdb deprecated - Fedora Project Wiki</a></li>
<li><a name="Fedora-RPMDB-To-SQLite"></a><a href="https://www.phoronix.com/news/Fedora-RPMDB-To-SQLite" target="_blank">Fedora Looking To Transition The RPM Database From Berkeley DB To SQLite - Phoronix</a> [2020-03-16]</li>
<li><a name="4_16_0"></a><a href="https://rpm.org/wiki/Releases/4.16.0" target="_blank">RPM 4.16.0 Release Notes</a> [2020-09-30]</li>
<li><a name="4_17_0"></a><a href="https://rpm.org/wiki/Releases/4.17.0" target="_blank">RPM 4.17.0 Release Notes</a> [2021-09-03]</li>
<li><a name="ChangeSet"></a><a href="https://fedoraproject.org/wiki/Releases/40/ChangeSet" target="_blank">Releases/40/ChangeSet - Fedora Project Wiki</a></li>
<li><a name="news015"></a><a href="https://www.itmedia.co.jp/news/articles/0602/15/news015.html" target="_blank">Oracle、オープンソースデータベースのSleepycatを買収 - ITmedia NEWS</a> [2006-02-15]</li>
<li><a name="dbwatch201111_01"></a><a href="https://atmarkit.itmedia.co.jp/fdb/rensai/dbwatch2011/dbwatch201111_01.html" target="_blank">オラクルが作るNoSQL DBの正体は?(1/2) - @IT</a> [2011/11/8]</li>
<li><a name="20130708-a019"></a><a href="https://news.mynavi.jp/techplus/article/20130708-a019/" target="_blank">Berkeley DB、ライセンスを変更 - OSSコミュニティでは議論 | TECH+(テックプラス)</a> [2013-07-08]</li>
<li><a name="0356236"></a><a href="https://opensource.srad.jp/story/13/07/10/0356236/" target="_blank">Oracle、BerkeleyDBのライセンスをひっそりとAGPLに変更 | スラド オープンソース</a> [2013-07-10]</li>
<li><a name="BerkeleyDB_6"></a><a href="https://fedoraproject.org/wiki/Changes/BerkeleyDB_6" target="_blank">Changes/BerkeleyDB 6 - Fedora Project Wiki</a> [2014-06-04]</li>
<li><a name="berkeleydb-oslicense"></a><a href="https://www.oracle.com/downloads/licenses/berkeleydb-oslicense.html" target="_blank">Open Source License for Berkeley DB</a></li>
<li><a name="berkeleydb-downloads"></a><a href="https://www.oracle.com/database/technologies/related/berkeleydb-downloads.html" target="_blank">Oracle Berkeley DB Downloads</a></li>
<li><a name="deprecated-functionality_dynamic-programming-languages-web-and-database-servers"></a><a href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/9.0_release_notes/deprecated-functionality_dynamic-programming-languages-web-and-database-servers" target="_blank">7.6. 動的プログラミング言語、Web サーバー、およびデータベースサーバー Red Hat Enterprise Linux 9 | Red Hat Customer Portal</a></li>
<li><a name="6464541"></a><a href="https://access.redhat.com/articles/6464541" target="_blank">Available replacements for the deprecated Berkeley DB (libdb) in RHEL - Red Hat Customer Portal</a> [2023-02-28]</li>
<li><a name="6963237"></a><a href="https://access.redhat.com/ja/articles/6963237" target="_blank">RHEL で廃止された Berkeley DB (libdb) の利用可能な置き換え - Red Hat Customer Portal</a> [2023-02-28]</li>
<li><a name="9c3a2a2ce21a2b262a5d"></a><a href="https://qiita.com/RKajiyama/items/9c3a2a2ce21a2b262a5d" target="_blank">MySQL闇歴史 SleepycatとBerkeley DB</a> [2022-12-05]</li>
<li><a name="1615145196a9e0b7b94db250670133275e1209d5"></a><a href="https://src.fedoraproject.org/rpms/libdb/c/1615145196a9e0b7b94db250670133275e1209d5" target="_blank">Commit - rpms/libdb - 1615145196a9e0b7b94db250670133275e1209d5 - src.fedoraproject.org</a></li>
<li><a name="db_converter"></a><a href="https://github.com/fila43/db_converter" target="_blank">fila43/db_converter: Converting tool from BerkeleyDB to various databases formats</a></li>
</ol>
<p style="clear:both;">Fedora 36 のころに公開されたビデオですが、判りやすく、かつ丁寧に Fedora Linux について紹介されています。</p>
<iframe width="480" height="270" src="https://youtube.com/embed/m8AWyzybnCQ?si=xjApZqPxFDuojEC9" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-92187484323976342062024-02-24T07:39:00.000+09:002024-02-24T07:39:31.785+09:00QWebEnginePage のコンテクスト・メニュー<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>QWebEngineView に表示されたウェブサイト上を右クリックするとコンテクスト・メニューが表示されます。メニューの中で、<span class="mono">Back / Forward / Reload </span> については機能が付いていますが、残る <span class="mono">Save page</span> と <span class="mono">View page source</span> については(少なくとも試した PySide6 のバージョンでは)何も反応がありません。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されます。</li>
<li>ここに表示されたウェブサイト上で、右クリックすると表示されるコンテクスト・メニュー(下記)の <span class="marker_pink"><span class="mono">Save page</span></span> と <span class="marker_pink"><span class="mono">View page source</span></span> を利用します。</li>
</ul>
<a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_context_menu.png"><img alt="" border="0" data-original-height="134" data-original-width="175" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_context_menu.png" style="margin: 0 0 0.5em 3em;"/></a>
</div>
<p>なお、本サンプルで使用しているウェブサイトは、下記を利用しています。</p>
<ul><li><a href="https://www.ueno-panda.jp/" target="_blank">上野動物園のジャイアントパンダ情報サイト「UENO-PANDA.JP」</a></li></ul>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.2</td>
</tr>
</tbody></table>
<p>サンプルを以下に示します。</p>
<div class="title1">qt_webenginepage_3.py</div>
<script src="https://gist.github.com/bitwalk123/2e4b60eccb943fbf9f9e279ec4da160a.js"></script>
<p>このサンプルの実行例を以下に示しました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_3.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="662" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_3.png"/></a></div>
<div class="title2">qt_webenginepage_3.py の実行例</div>
<h2 class="frame">サンプルの説明</h2>
<h3 class="frame"><span class="mono">Save page</span></h3>
<p>参考サイト <a href="#QWebEnginePage">[2]</a> の <a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEnginePage.html#PySide6.QtWebEngineCore.PySide6.QtWebEngineCore.QWebEnginePage.WebAction" target="_blank"><span class="mono">PySide6.QtWebEngineCore.QWebEnginePage.WebAction</span></a> の説明によると、</p>
<table class="simple"><tbody>
<tr><th>定 数</th><th>説 明</th></tr>
<tr>
<td nowrap>QWebEnginePage.SavePage<br>(QWebEnginePage.WebAction.SavePage)</td>
<td>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() .<br>[参考訳]<br>現在のページをディスクに保存します。MHTML は、Web ページをディスクに保存する際のデフォルトのフォーマットです。downloadRequested() のスロットが必要です。</td>
</tr>
</tbody></table>
<p><span class="mono">downloadRequested()</span> のスロットが必要?</p>
<p>具体的に何をするのかピンとこなかったのですが、参考サイト <a href="#how-to-download-csv-file-with-qwebengineview-and-qurl">[1]</a> にズバリ知りたかったことが記載されていましたので、参考にさせていただきました。</p>
<pre class="brush:python gutter:false" title="">
class Example(QWebEngineView):
def __init__(self, url: QUrl):
super().__init__()
:
:
self.page().profile().downloadRequested.connect(
self.on_download_requested
)
</pre>
<p><span class="mono">on_download_requested</span> メソッドでは、最初に念のため <span class="mono">self.pageAction(QWebEnginePage.WebAction.SavePage)</span> が有効になっているか確認しています。</p>
<pre class="brush:python gutter:false" title="">
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()
</pre>
<p><span class="mono">QWebEngineDownloadRequest</span> クラスの使い方、あるいはそのインスタンス <span class="mono">download</span> の扱い方については、試行錯誤をしている状態です。とりあえず、表示されている HTML の内容が保存されることで良しとしています。🙇🏻</p>
<h3 class="frame"><span class="mono">View page source</span></h3>
<p>参考サイト <a href="#QWebEnginePage">[2]</a> の <a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEnginePage.html#PySide6.QtWebEngineCore.PySide6.QtWebEngineCore.QWebEnginePage.WebAction" target="_blank"><span class="mono">PySide6.QtWebEngineCore.QWebEnginePage.WebAction</span></a> の説明によると、</p>
<table class="simple"><tbody>
<tr><th>定 数</th><th>説 明</th></tr>
<tr>
<td nowrap>QWebEnginePage.ViewSource<br>(QWebEnginePage.WebAction.ViewSource)</td>
<td>Show the source of the current page in a new tab. Requires implementation of createWindow() or newWindowRequested() .<br>[参考訳]<br>現在のページのソースを新しいタブに表示します。createWindow() または newWindowRequested() の実装が必要です。</td>
</tr>
</tbody></table>
<p>これもなんだかよく判らなかったのですが、とにかく <span class="mono">createWindow</span> メソッドを実装(オーバーライド)してテストしてみました。すると、コンテクスト・メニューの <span class="mono">View page source</span> を選択すると、確かにこのメソッドが実行されることを確認できました。</p>
<p>この <span class="mono">createWindow</span> メソッドが呼び出されるのは、ソースを表示したい時だけではないかもしれないので、まず <span class="mono">self.pageAction(QWebEnginePage.WebAction.ViewSource)</span> が有効になっているかどうかを確認しています。なお、HTML ソースの内容を QTextEdit などに表示した方が実用的ですが、ここでは単に <span class="mono">print_html</span> メソッドで標準出力しています。</p>
<pre class="brush:python gutter:false" title="">
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)
</pre>
<pre class="brush:python gutter:false" title="">
@staticmethod
def print_html(html: str):
print(html)
</pre>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="how-to-download-csv-file-with-qwebengineview-and-qurl"></a><a href="https://stackoverflow.com/questions/55963931/how-to-download-csv-file-with-qwebengineview-and-qurl" target="_blank">python - How to download csv file with QWebEngineView and QUrl - Stack Overflow</a> [2019-05-03]</li>
<li><a name="QWebEnginePage"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEnginePage.html" target="_blank">QWebEnginePage - Qt for Python</a></li>
<li><a name="QWebEngineView"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineWidgets/QWebEngineView.html" target="_blank">QWebEngineView - Qt for Python</a></li>
<li><a name="QWebEngineDownloadRequest"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEngineDownloadRequest.html" target="_blank">QWebEngineDownloadRequest - Qt for Python</a></li>
</ol>
<p style="clear:both;">下記の動画では <a href="https://www.riverbankcomputing.com/static/Docs/PyQt6/" target="_blank">PyQt6</a> を利用しており、PySide6 ではありませんが大部分が同じなので参考になります。</p>
<iframe width="480" height="270" src="https://youtube.com/embed/GzW5mRET_X0?si=zZodPoHX-rUqgAO1" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-14996931092322828722024-02-23T11:35:00.007+09:002024-02-23T17:27:36.776+09:00QThreadPool と QRunnable (2) 〜 PySide6 〜<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>以前、当ブログで PySide6 の QThreadPool と QRunnable を利用したマルチスレッディングのサンプルを紹介しました<sup> <a href="#qthreadpool-qrunnable-pyside6">[1]</a></sup>。これは、他サイトで紹介されていたサンプル <a href="#multithreading-pyside6-applications-qthreadpool">[2]</a> を自分用に判りやすく書き直したサンプルでした。</p>
<p>その後、意外とマルチスレッディングを必要とする機会が多く、最近の本ブログ記事でも QThreadPool をタイトルにした記事 <a href="#qthreadpool-pyside6">[3]</a> を掲載しました。しかし、あとで読み返してみるど、タイトルの QThreadPool を使うことよりも、どちらかというと <a href="https://pypi.org/project/mplfinance/" target="_blank">mplfinance</a> モジュールに興味が向くような内容になっていました。</p>
<p>今回は(主に自分自身が)テンプレート的に利用できるシンプルな QThreadPool と QRunnable のサンプルを、備忘録としてまとめました。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.2</td>
</tr>
</tbody></table>
<p>サンプルを以下に示しました。</p>
<div class="title1">qt_threadpool_2.py</div>
<script src="https://gist.github.com/bitwalk123/1ff7098e20429d14fb8a8b6c1904fa55.js"></script>
<p>このサンプルの実行例を以下に示しました。</p>
<table>
<tbody>
<tr>
<td><div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_threadpool_2-1.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="133" data-original-width="206" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_threadpool_2-1.png"/></a></div></td>
<td><div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_threadpool_2-2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="133" data-original-width="206" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_threadpool_2-2.png"/></a></div></td>
</tr>
</tbody>
</table>
<p><kbd>START</kbd> ボタンをクリックすると、<span class="mono">Worker</span> クラスのインスタンスの処理 <span class="mono">worker.run()</span> は、<span class="mono">QThreadPool</span> クラスのインスタンス <span class="mono">self.threadpool</span> の <span class="mono">start</span> メソッドで別スレッドで開始されます。</p>
<pre class="brush:python gutter:false" title="">
:
:
worker = Worker()
worker.threadProgress.connect(self.on_status_update)
worker.threadFinished.connect(self.on_completed)
self.threadpool.start(worker)
</pre>
<p><span class="mono">Worker</span> クラスは <span class="mono">QRunnable</span> を継承したクラスで、<span class="mono">run</span> メソッドを実装します。<span class="mono">QRunnable</span> クラスでは <span class="mono">Singal</span> を利用できないので、別に <span class="mono">QObject</span> クラスを継承した <span class="mono">WorkerSignal</span> クラスで必要な <span class="mono">Signal</span> を定義しておき、これも <span class="mono">Worker</span> クラスが <span class="mono">QRunnable</span> と一緒に継承(多重継承)します。</p>
<pre class="brush:python gutter:false" title="">
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()
</pre>
<p><span class="mono">run</span> メソッドの処理は、テスト用に用意した 0.1 秒の <span class="mono">sleep</span> の 100 回ループを開始、ループカウントを <span class="mono">self.threadProgress</span> シグナルで毎回 <span class="mono">emit</span> します。これを本体のスロットで受け取って <span class="mono">QProgressBar</span> のインスタンスの値を更新しています。</p>
<p>ループが終わると <span class="mono">self.threadFinished</span> を <span class="mono">emit</span> します。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="qthreadpool-qrunnable-pyside6"></a><a href="https://bitwalk.blogspot.com/2023/01/qthreadpool-qrunnable-pyside6.html" target="_blank">bitWalk's: QThreadPool と QRunnable 〜 PySide6 〜</a> [2023-01-23]</li>
<li><a name="multithreading-pyside6-applications-qthreadpool"></a><a href="https://www.pythonguis.com/tutorials/multithreading-pyside6-applications-qthreadpool/" target="_blank">Multithreading PySide6 applications with QThreadPool</a></li>
<li><a name="qthreadpool-pyside6"></a><a href="https://bitwalk.blogspot.com/2024/01/qthreadpool-pyside6.html" target="_blank">bitWalk's: QThreadPool を使う ~ PySide6</a> [2024-01-30]</li>
<li><a name="QThreadPool"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QThreadPool.html" target="_blank">QThreadPool - Qt for Python</a></li>
<li><a name="QRunnable"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QRunnable.html" target="_blank">QRunnable - Qt for Python</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/Z1N9JzNax2k?si=AbZYZo3GjeyqiCUu" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-82129648920347341422024-02-18T14:57:00.001+09:002024-02-18T15:05:24.697+09:00QWebEnginePage から HTML ソースを取得する(改) ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>以前、当ブログで紹介した、QWebEngineView で表示したサイトの HTML を取得するサンプル <a href="#qwebenginepage-html-pyside6">[1]</a> について、より簡単な方法が判ったので改定します。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されますが、ここに表示されたウェブサイトの HTML のソースを取得します。[改訂版]</li>
</ul>
</div>
<p>なお、本サンプルで使用しているウェブサイトは、下記を利用しています。</p>
<ul><li><a href="https://www.ueno-panda.jp/" target="_blank">上野動物園のジャイアントパンダ情報サイト「UENO-PANDA.JP」</a></li></ul>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.2</td>
</tr>
</tbody></table>
<p>サンプルを以下に示します。このサンプルは、指定した URL を表示して、そのソースを標準出力するという単純なものです。</p>
<p>HTML ソースの内容取得には、<span class="mono">QWebEnginePage</span> の <span class="mono">toHtml</span> メソッドを利用しています。当初、マニュアル(参考サイト <a href="#QWebEnginePage">[3]</a>)でこのメソッドの説明を読んでも使い方がピンとこなかったので、用法の追求を後回しにしてしまいました。</p>
<div class="title1">qt_webenginepage_2.py</div>
<script src="https://gist.github.com/bitwalk123/050082bb1dcb5ed077e2779a77656213.js"></script>
<p>このサンプルの実行例を以下に示しました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="662" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage_2.png"/></a></div>
<div class="title2">qt_webenginepage_2.py の実行例</div>
<p>表示された HTML の内容が標準出力されます。</p>
<div class="title1">qt_webenginepage.py の出力例</div>
<pre class="output">
<!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>
:
:
(以下省略)
</pre>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="qwebenginepage-html-pyside6"></a><a href="https://bitwalk.blogspot.com/2024/01/qwebenginepage-html-pyside6.html" target="_blank">bitWalk's: QWebEnginePage から HTML ソースを取得する ~ PySide6</a> [2024-01-08]</li>
<li><a name="QWebEngineView"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineWidgets/QWebEngineView.html" target="_blank">QWebEngineView - Qt for Python</a></li>
<li><a name="QWebEnginePage"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEnginePage.html" target="_blank">QWebEnginePage - Qt for Python</a></li>
</ol>
<p style="clear:both;"> </p>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-5430874291142314372024-02-07T05:28:00.009+09:002024-02-07T06:05:19.583+09:00Secure Boot に対応している Linux ディストロ<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFkk_mcv9R4Pi93GrlmHKtB-7sKIchDJiB3NFokUuiekT_WuBybQE4SGX81kRaHAHbqZh723kT82NIQ-OXbGPgPj2jSsj1NCKB2tzgdimiHj-RhyphenhyphenuHu-PPcIQrgTIGlS98Wt8EXQzpc_htIVMaG7rrWOYEQKaUwaGoERJdo5O6hrZ6tbXyh4AIJw/s1600/UEFI.png" style="display: block; padding: 0.4em 0.5em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFkk_mcv9R4Pi93GrlmHKtB-7sKIchDJiB3NFokUuiekT_WuBybQE4SGX81kRaHAHbqZh723kT82NIQ-OXbGPgPj2jSsj1NCKB2tzgdimiHj-RhyphenhyphenuHu-PPcIQrgTIGlS98Wt8EXQzpc_htIVMaG7rrWOYEQKaUwaGoERJdo5O6hrZ6tbXyh4AIJw/s1600/UEFI.png"/></a></div>
<p style="font-size: small;">UEFI セキュアブートは、起動対象のオペレーティングシステムの電子署名を検証して正当なソフトウェアであることが確認できた場合にのみブート処理を継続します。Windows マークのあるマシンではセキュアブートに Microsoft の電子署名が使われており、Windows 8 以降はセキュアブート電子署名が付与されています。一方で、Windows 7 以前のオペレーティングシステムやほとんどの Linux ディストリビューションは電子署名が付与されていないため、セキュアブートが有効な UEFI ブートローダーでは起動できません。</p>
<p style="font-size: small;">Microsoft は、実費で Microsoft の鍵によって署名を行うサービスを提供しています。Fedora, openSUSE, Ubuntu, RHEL, Debian などの Linux ディストリビューションは、このサービスによって署名された軽量ブートローダを用いることでセキュアブート(の鍵配布と鍵インストールに纏わる問題)に対応しています。</p>
<div align="right" style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface#%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%96%E3%83%BC%E3%83%88" target="_blank">Wikipedia</a> より引用・編集</div>
<p>最近はお金が無いし、置く場所も無くなってきたのでコンスタントには続いていないのですが、超格安の Windows PC を買っては Linux をインストールしてみることが趣味のようになっています。</p>
<p>それでも、年に何回かは買ってしまう超格安の PC へ Linux をインストールする際、UEFI のセキュアブートを無効にしなくとも、そのままインストールできていて、迂闊にもそれを不思議だと感じていませんでした。</p>
<p>最初にインストールしてみる Linux ディストロである Fedora Linux が、セキュアブートに対応していたのでした<sup> <a href="#Secureboot">[1]</a></sup>。また、UEFI でセキュアブートを無効にする機能が、Windows 10 以降で(要求仕様では)オプションになっていることを知りませんでした。実機にインストールするのであれば、セキュアブートに対応している Linux ディストロであることが要件になってきます。</p>
<p>そう言えば、昨年 12 月に開催された AlmaLinux Day Tokyo において、AlmaLinux OS Architect / Release Engineering Lead の Andrew Lukoshko 氏が、AlmaLinux はセキュアブートに対応していることを詳しく話されていましたが、自分の理解が追従できませんでした。そのため、たとえ逐次通訳の説明があってもメモをしっかり取れなかったことを思い出しました<sup> <a href="#almalinux-day">[2]</a></sup>。その時の講演では Rocky Linux はセキュアブートに対応していないのでは、なんて話がありましたが Rocky Linux 8.5 以降でセキュアブートに対応しています<sup> <a href="#rocky-linux-8-5">[3]</a></sup>。</p>
<p>Linux ディストロを調べればセキュアブートに対応しているかは判るのですが、逆に、セキュアブートに対応している Linux ディストロ一覧の情報がないか探しています。しかし、そんな都合の良いサイトは見つかっていません。よいサイトが見つかれば情報を追記していきます。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="Secureboot"></a><a href="https://fedoraproject.org/wiki/Secureboot" target="_blank">Secureboot - Fedora Project Wiki</a></li>
<li><a name="almalinux-day"></a><a href="https://bitwalk.blogspot.com/2023/12/almalinux-day.html" target="_blank">bitWalk's: AlmaLinux Day に参加して</a> [2023-12-09]</li>
<li><a name="rocky-linux-8-5"></a><a href="https://linuxiac.com/rocky-linux-8-5/" target="_blank">Rocky Linux 8.5 is Out, Secure Boot is Now Officially Supported</a> [2021-11-16]</li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/Mqh9o8YY2dg?si=2qctruiu8qlkI1d4" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-39017191678070094052024-02-05T05:33:00.002+09:002024-02-05T05:45:03.013+09:00【備忘録】Firefox が使用する動画コーディック<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhThyphenhyphen1ljgElNOvbbYPZaA06PiNdeA-TWrA6FRDNq4uQVsLfbD9je0sbRpbOTp1SRAaxLQTk8exmx23vWMtSbxTfJ_ZM9wPW01rUBgfG83qJIey3cJt6j9h6scciFLRlIK3ERN9OYQ/s0/almalinux.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhThyphenhyphen1ljgElNOvbbYPZaA06PiNdeA-TWrA6FRDNq4uQVsLfbD9je0sbRpbOTp1SRAaxLQTk8exmx23vWMtSbxTfJ_ZM9wPW01rUBgfG83qJIey3cJt6j9h6scciFLRlIK3ERN9OYQ/s0/almalinux.png"/></a></div>
<p style="font-size:small;">AlmaLinux OS はオープンソースでコミュニティ主導のエンタープライズ Linux ディストロであり、<a href="https://ja.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" target="_blank">RHEL</a> とバイナリ互換性があります。AlmaLinux OS Foundation は、AlmaLinux OS コミュニティの利益のために設立された <a href="https://ja.wikipedia.org/wiki/501%28c%29%E5%9B%A3%E4%BD%93" target="_blank">501(c)</a>(6) の非営利団体です。</p>
<p>Linux ディストロで標準ブラウザとしての採用が多いのは、おそらく <a href="https://ja.wikipedia.org/wiki/Mozilla_Firefox" target="_blank">Mozilla Firefox</a>(以下、単に Firefox)でしょう。自分のメインのデスクトップ環境で使っている <a href="https://ja.wikipedia.org/wiki/Fedora" target="_blank">Fedora Linux</a> も、サーバで使っている RHEL や AlmaLinux でもデフォルトのインターネットブラウザは Firefox です。</p>
<p>サーバのブラウザが Firefox でもなんでも構わないのですが、メインのデスクトップ環境では <a href="https://ja.wikipedia.org/wiki/Google_Chrome" target="_blank">Google Chrome</a> を追加でインストールして使っています。なぜか?</p>
<p style="margin: 0 1em 2em 1em;">Google Chrome を使い続けるのは、Google のアカウントでログインすれば、設定やブックマークが引き継がれるので便利だからなのですが、その他に、動画の<a href="https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%87%E3%83%83%E3%82%AF" target="_blank">コーデック</a>を気にすることがない(実用上必要なものは揃っている)ことが理由に挙げられるでしょう。</p>
<p>私は超格安なノート PC を買っては Linux をインストールして遊んでいるのですが、一通りの評価が終わってしまえば、あとは「長期で安定して利用できる Linux ディストロ」をインストールして、フツーのノート PC として使っています。</p>
<p style="margin: 0 1em 0 1em;">フツーのノート PC の要件は、インターネットブラウザを利用できて、そこそこ最近のバージョンの <a href="https://ja.wikipedia.org/wiki/Python" target="_blank">Python</a> を利用できることです。超格安な PC は非力ですが、用途を限ってしまえばそれなりに使えます。</p>
<p>最近では「長期で安定して利用できる Linux ディストロ」として AlmaLinux を使うようになりました。システムの python3 のバージョンは <span class="mono">3.9.x</span> ですが、同時に Python 3.11 も利用できます。デフォルトのインターネットブラウザは Firefox です。</p>
<p>AlmaLinux を「サーバー(GUI 使用)」でインストールした直後から Firefox ブラウザを利用できますが、動画のコーデックが不十分で再生できません。この不便を解消できれば、追加で Google Chrome をインストールしなくても Firefox だけで十分です。超格安な PC はストレージ容量も小さいので、インストールするパッケージは最低限に抑える必要があります。</p>
<p>ということで、今回のテーマは、</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>Firefox で動画を再生するために必要なコーデックをインストールした顛末をまとめました。</li>
</ul>
</div>
<p>以下の OS で確認しています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="2"><img alt="" border="0" width="24" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhThyphenhyphen1ljgElNOvbbYPZaA06PiNdeA-TWrA6FRDNq4uQVsLfbD9je0sbRpbOTp1SRAaxLQTk8exmx23vWMtSbxTfJ_ZM9wPW01rUBgfG83qJIey3cJt6j9h6scciFLRlIK3ERN9OYQ/s0/almalinux.png"/></td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">AlmaLinux 9.3</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="vertical-align: middle;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle; text-align: end;">Firefox</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">115.7.0-1</td>
</tr>
</tbody></table>
<p>動画の再生に必要なコーデックのパッケージをインストールするには、まず、EPEL<sup> <a href="#epel">[2]</a> </sup>のリポジトリを利用できるようにする必要があります。</p>
<pre class="output">
$ <span class="black">sudo dnf install epel-release</span>
$ <span class="black">sudo dnf -y update</span>
</pre>
<p>次に、<span class="mono">libavcodec-free</span>(と、依存するパッケージ)をインストールします。</p>
<pre class="output">
$ <span class="black">sudo dnf install libavcodec-free</span>
</pre>
<p>念のため、次のパッケージもインストールしておきました。</p>
<pre class="output">
$ <span class="black">sudo dnf install mozilla-openh264</span>
</pre>
<p>これで、<a href="https://ja.wikipedia.org/wiki/Facebook" target="_blank">Facebook</a>, <a href="https://ja.wikipedia.org/wiki/Instagram" target="_blank">Instagram</a>, <a href="https://ja.wikipedia.org/wiki/YouTube" target="_blank">YouTube</a> などの動画が問題なく再生できるようになりました。</p>
<p><a href="https://ja.wikipedia.org/wiki/Amazon_Prime_Video" target="_blank">Amazon Prime Video</a> の再生には <a href="https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E8%91%97%E4%BD%9C%E6%A8%A9%E7%AE%A1%E7%90%86" target="_blank">DRM</a> のプラグインが必要でしたが、これはブラウザの画面の指示に従うと必要なプラグイン (Widevine Content Decryption Module) がインストールされました。</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi37OELc_StnNBYI1N3saMJrW5uaPHCafFPuKCfKvWgNoSabnwZxyEaQqA3VUsZm4q7Obuxs3XofD6BPFyMqEDabkFMG9ko9nDjMIg_vQTjbYDWhAN0g9CK7LIfDTulqUrTWPhnnIxJNthpr2U3VvQTNtd6Z8hG5dhU2EPs8YpQXymxwRbw7XlTLg/s990/firefox_plugin.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="521" data-original-width="990" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi37OELc_StnNBYI1N3saMJrW5uaPHCafFPuKCfKvWgNoSabnwZxyEaQqA3VUsZm4q7Obuxs3XofD6BPFyMqEDabkFMG9ko9nDjMIg_vQTjbYDWhAN0g9CK7LIfDTulqUrTWPhnnIxJNthpr2U3VvQTNtd6Z8hG5dhU2EPs8YpQXymxwRbw7XlTLg/s600/firefox_plugin.png"/></a></div>
<div class="title2">Firefox のプラグイン</div>
<p>とりあえず、以上で問題が無いようにみえますが、使っている中で不足しているパッケージが判れば追記するようにします。</p>
<p>また、Firefox はそもそもメジャーなブラウザとは言えなくなっているので、サイトによっては非推奨で再生できない場合があるかもしれません。自分のニーズで、どの程度、不自由があるのかも確認していきたいです。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="Video_codecs"></a><a href="https://developer.mozilla.org/ja/docs/Web/Media/Formats/Video_codecs" target="_blank">ウェブ動画コーデックガイド - ウェブメディア技術 | MDN</a></li>
<li><a name="epel"></a><a href="https://docs.fedoraproject.org/en-US/epel/" target="_blank">Extra Packages for Enterprise Linux (EPEL) :: Fedora Docs</a></li>
<li><a name="open-h264-plugin-firefox"></a><a href="https://support.mozilla.org/en-US/kb/open-h264-plugin-firefox" target="_blank">Why is there an OpenH264 plugin in Firefox? | Firefox Help</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/XuJ9DmcXsn4?si=rpviGsAbq94UYtb-" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-17419326977653957122024-02-04T07:40:00.000+09:002024-02-04T07:40:13.768+09:00Fedora Rawhide の KDE も Plasma 6 RC 2 へ<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png"/></a></div>
<p style="font-size:small;">Rawhide は Fedora Linux の開発バージョンに与えられている呼称です<sup> <a href="#rawhide">[1]</a></sup>。現在、Fedora Linux 39 がリリースされていますので、Rawhide は 40 のリリースに向けて開発が続けられています。Fedora Linux の次期バージョンのリリース予定の2ヶ月前ぐらいに rawhide のリポジトリから、Fedora Linux のリリース用のリポジトリがブランチされます。Fedora Linux 40 へのブランチは現在のところ 2024-02-13 の予定です<sup> <a href="#f-40-key-tasks">[2]</a></sup>。</p>
<p>KDE プロジェクトが公開している Linux ディストロ <a href="https://ja.wikipedia.org/wiki/KDE_neon" target="_blank">KDE neon</a> の testing 版で、KDE Plasma 6 RC 2 (<span class="mono">5.93.0</span>) が利用できるようになったことを、当ブログで紹介しましたが<sup> <a href="#kde-plasma-6-rc-2">[3]</a></sup>、Fedora Rawhide でも、KDE Plasma 6 RC 2 (<span class="mono">5.93.0</span>) が取り込まれました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_rc_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_rc_2.png"/></a></div>
<div class="title2">Fedora Rawhide (KDE) のデスクトップ[2024-02-04 時点]</div>
<p>現在のところ、KDE Plasma 6 の最初の正式版 6.0 が 2 月 21 日にリリースされる予定です<sup> <a href="#Plasma_6">[4]</a></sup>。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="rawhide"></a><a href="https://docs.fedoraproject.org/en-US/releases/rawhide/" target="_blank">Rawhide :: Fedora Docs</a></li>
<li><a name="f-40-key-tasks"></a><a href="https://fedorapeople.org/groups/schedule/f-40/f-40-key-tasks.html" target="_blank">Fedora Linux 40 Schedule: Key</a></li>
<li><a name="kde-plasma-6-rc-2"></a><a href="https://bitwalk.blogspot.com/2024/02/kde-plasma-6-rc-2.html" target="_blank">bitWalk's: KDE Plasma 6 RC 2 リリース</a> [2024-02-01]</li>
<li><a name="Plasma_6"></a><a href="https://community.kde.org/Schedules/Plasma_6" target="_blank">Schedules/Plasma 6 - KDE Community Wiki</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/ykdMVIhgzTg?si=1v1UXeFw957KQtaM" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-55817527016689887062024-02-01T15:15:00.002+09:002024-02-02T17:08:17.737+09:00KDE Plasma 6 RC 2 リリース<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png" style="display: block; padding: 0.35em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png"/></a></div>
<p style="font-size: small;">KDE Plasma は、主に Linux 向けに開発されているデスクトップ環境です。現在リリースされている KDE Plasma 5 は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a> 5 ライブラリを利用していますが、その後継である Qt 6 を利用した KDE Plasma 6 がリリースに向けて開発中です。</p>
<p>1 月 31 日(現地時間)に、現在開発中の次期 KDE Plasma 6 の Release Candidate 2 (5.93.0) のリリースが KDE プロジェクトからアナウンスされました<sup> <a href="#6_rc2">[1]</a></sup>。リリース候補はのリリースはこれが最後です。今月末には KDE Plasma 6, Framworks 6 そして KDE Gear が正式にリリースされる予定です。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_5_93_0.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_5_93_0.png"/></a></div>
<div class="title2">GNOME Boxes 上にインストールした KDE neon testing を最新にアップデート(2/1 時点)</div>
<p>画面右下の文字は KDE Plasma 6.0 RC1 のままですが、KDE Plasma のバージョンは RC 2 に相当する 5.93.0 に更新されています。</p>
<h4 style="margin-top: 4em;">追記 <span style="font-family: monospace; font-weight: normal;">[2024-02-02]</span></h4>
<p>2 月 2 日に KDE neon testing を更新したところ、なんと KDE Plasma 6 のバージョンが 6.0.0 になっていました。🤔</p>
<p>ただ、壁紙の画面右下の文字は KDE Plasma 6.0 RC1 のままです。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_6_0_0.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_6_0_0.png"/></a></div>
<div class="title2">GNOME Boxes 上にインストールした KDE neon testing を最新にアップデート(<span class="red">2/2</span> 時点)</div>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="6_rc2"></a><a href="https://kde.org/announcements/megarelease/6/rc2/" target="_blank">KDE's Megarelease 6 - Release Candidate 2 - KDE Community</a> [2024-01-31]</li>
<li><a name="Plasma_6"></a><a href="https://community.kde.org/Schedules/Plasma_6" target="_blank">Schedules/Plasma 6 - KDE Community Wiki</a></li>
<li><a name="download"></a><a href="https://neon.kde.org/download" target="_blank">KDE neon</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/_KrLiGhvd6Y?si=qKqAnTI7AZRCovnt" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-89709215535534589932024-01-31T19:37:00.001+09:002024-01-31T19:37:49.038+09:00今年は CentOS Stream 10 が登場<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKEN7w2Kkjatr9_7eUJKyTptTEc2RdTKNy_-np0jT8kd0Ev-0NV3sFH201AhNksgfOYdzOOnezIXCfaVl72aJBIS14U7phX0NpBpYkm3XuXfA4FaZxBNwNIBYHVOPcdwIDliYkSeHui1qiJrzg4N4xrAOcMa4QLauA8Bcvos_qXHpEBoLjysb9Iw/s1600/centos_stream.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKEN7w2Kkjatr9_7eUJKyTptTEc2RdTKNy_-np0jT8kd0Ev-0NV3sFH201AhNksgfOYdzOOnezIXCfaVl72aJBIS14U7phX0NpBpYkm3XuXfA4FaZxBNwNIBYHVOPcdwIDliYkSeHui1qiJrzg4N4xrAOcMa4QLauA8Bcvos_qXHpEBoLjysb9Iw/s1600/centos_stream.png"/></a></div>
<p style="font-size: small;">CentOS Stream は、継続的に提供される <a href="https://ja.wikipedia.org/wiki/Red_Hat_Enterprise_Linux" target="_blank">Red Hat® Enterprise Linux</a> (RHEL) のディストリビューション・アップストリームを、オープンソース・コミュニティのメンバーが Red Hat の開発者と連携して開発、テスト、貢献することができる、Linux® ディストリビューションです。</p>
<div align="right" style="font-size: small;">参考サイト <a href="#what-is-centos-stream">[1]</a> より引用</div>
<p>CentOS 8 の開発終了がアナウンスされたのは 2020 年 12 月 8 日のことでした<sup> <a href="#centos">[2]</a></sup>。当時はこのアナウンスに慌てましたが、<a href="https://ja.wikipedia.org/wiki/AlmaLinux" target="_blank">AlmaLinux</a> や <a href="https://ja.wikipedia.org/wiki/Rocky_Linux" target="_blank">Rocky Linux</a> の登場で RHEL 互換 OS の選択に困ることがなくなりました。</p>
<p>CentOS 8 の開発が終了して、残った CentOS Stream 8 も、RHEL 8 のフルサポートフェーズが終わる日と同じ、2024 年 5 月 31 日にサポートが終了します<sup> <a href="#product-life-cycles">[3]</a></sup>。CentOS Stream が CentOS の代替にならない大きな理由は、RHEL のアップストリームであることですが、EOL が RHEL のフルサポートフェーズ終了日(現在は5年)というサポート期間の短さも理由のひとつとしてあげられるでしょう。</p>
<p>しかし、デスクトップ用途の PC の OS に <a href="https://ja.wikipedia.org/wiki/Fedora" target="_blank">Fedora Linux</a> を使っている者としては、CentOS Stream が RHEL のちょっと先行くディストロなので、個人的なサーバー用途としては、変化の激しい Fedora Linux よりも魅力的ではあります。しかも(3年毎ぐらいに)次の RHEL がリリースされれば新しい方に移行することを考えるので、5年というサポート期間はそれほど短いとも言えません。</p>
<p style="font-size: small;">※ 実際には本番環境に RHEL 9、テスト環境に AlmaLinux 9 を使用しています。😅</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/centos_stream_9-2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/centos_stream_9-2.png"/></a></div>
<div class="title2">CentOS Stream <span class="red">9</span> のデスクトップ画面</div>
<p>その後リリースされた RHEL 9 <sup> <a href="#hot-presses-red-hat-enterprise-linux-9">[5]</a> </sup>は、先にリリースされた CentStream 9 をベースにビルドされてリリースされました。</p>
<p>今年は 2025 年にリリース予定の RHEL 10 のアップストリームとして、CentOS Stream 10 がリリースされる年です<sup> <a href="#CentOS-Stream-10-Start">[7]</a></sup>。と言っても、Fedora Linux 40(現在のところ 4 月 16 日リリース予定<sup> <a href="#f-40/f-40-key-tasks">[8]</a></sup>)をベースにするようですので、CentOS Stream 10 が一般公開されるのは、もしかすると CentOS Stream 8 が EOL になってからなのかもしれません。</p>
<p>Fedora Linux 40 のリポジトリが Fedora Rawhide からブランチするのが 2 月 13 日に予定されていますので、気の早い考えをすると、このブランチ以降で CentOS Stream 10 にもなにか動きがあるかもしれません。</p>
<p>いずれにしても、CentOS Stream 10 の動きに注視を続け、なにか動きがあれば、当ブログで紹介したいと考えています。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="what-is-centos-stream"></a><a href="https://www.redhat.com/ja/topics/linux/what-is-centos-stream" target="_blank">CentOS Stream とは | Red Hat</a></li>
<li><a name="centos"></a><a href="https://blog.centos.org/2020/12/future-is-centos-stream/" target="_blank">CentOS Project shifts focus to CentOS Stream – Blog.CentOS.org</a> [2020-12-08]</li>
<li><a name="product-life-cycles"></a><a href="https://access.redhat.com/product-life-cycles?product=Red%20Hat%20Enterprise%20Linux,OpenShift%20Container%20Platform%204" target="_blank">Product Life Cycles | Red Hat Customer Portal</a></li>
<li><a name="errata"></a><a href="https://access.redhat.com/ja/support/policy/updates/errata" target="_blank">Red Hat Enterprise Linux のライフサイクル - Red Hat Customer Portal</a></li>
<li><a name="centos-stream-intro"></a><a href="https://rheb.hatenablog.com/entry/centos-stream-intro" target="_blank">CentOS Stream入門 - 赤帽エンジニアブログ</a> [2021-03-19]</li>
<li><a name="hot-presses-red-hat-enterprise-linux-9"></a><a href="https://www.redhat.com/ja/blog/hot-presses-red-hat-enterprise-linux-9" target="_blank">いよいよ登場:Red Hat Enterprise Linux 9</a> [2022-05-18]</li>
<li><a name="CentOS-Stream-10-Start"></a><a href="https://www.phoronix.com/news/CentOS-Stream-10-Start" target="_blank">CentOS Stream 10 Starting To Get Underway, More Activity In 2024 - Phoronix</a> [2023-06-17]</li>
<li><a name="f-40/f-40-key-tasks"></a><a href="https://fedorapeople.org/groups/schedule/f-40/f-40-key-tasks.html" target="_blank">Fedora Linux 40 Schedule: Key</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/tjBGKXchLlA?si=9t41jEIo8O01ZUp8" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-47786567218858025862024-01-30T15:27:00.007+09:002024-01-30T18:24:06.573+09:00QThreadPool を使う ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>以前、本ブログで PySide2 と mplfinance を組み合わせた GUI サンプルを紹介しました<sup> <a href="#pythonmplfinance">[1]</a></sup>。また、PySide6 に GUI ライブラリを更新したサンプルも既に紹介しています<sup> <a href="#pyside6-mplfinance">[2]</a></sup>。</p>
<p>今回は <span class="mono">yfinance</span> の API を利用して株価データを取得する部分を、<span class="mono">QThreadPool</span> / <span class="mono">QRunnable</span> で別スレッドにして読み込むようにしました。データの読み込みにそれほど時間が掛かるわけでもないのですが、スレッドの練習題材にしたくて、ローソク足チャートのサンプルを再び取り上げました。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="7">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">matplotlib</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.8.2</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">mplfinance</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">0.12.10b0</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">pandas</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">2.2.0</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">yfinance</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">0.2.36</td>
</tr>
</tbody></table>
<h2 class="frame">サンプル</h2>
<p>サンプルはあまりコンパクトにできなかったので、下記の4つのファイルに分けました。</p>
<ul style="font-family: monospace;">
<li>qt_mpl_finance_2.py</li>
<ul style="font-size: small; margin-top 0;">
<li>GUI サンプルのメイン</li>
</ul>
<li style="margin-top 1em;">qt_mpl_finance_2_func.py</li>
<ul style="font-size: small; margin-top 0;">
<li>関数処理</li>
</ul>
<li style="margin-top 1em;">qt_mpl_finance_2_sub.py</li>
<ul style="font-size: small; margin-top 0;">
<li>GUI のサブ・コンポーネント</li>
</ul>
<li style="margin-top 1em;">qt_mpl_finance_2_thread.py</li>
<ul style="font-size: small; margin-top 0;">
<li>QRunner によるスレッド処理</li>
</ul>
</ul>
<p><span class="mono">qt_mpl_finance_2.py</span> は、本サンプルのメイン部分で、下記の GUI を <span class="mono">QMainWindow</span> で構成しています。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="628" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-1.png"/></a></div>
<div class="title2">qt_mpl_finance_2.py の実行例 (1)</div>
<div class="title1">qt_mpl_finance_2.py</div>
<script src="https://gist.github.com/bitwalk123/c7d21f5151408e1b40db8ce42723856f.js"></script>
<p><span class="mono">qt_mpl_finance_2_func.py</span> は、<span class="mono">yfinance</span> で株価データを読み込む処理と、<span class="mono">mplfinance</span> でデータフレームをキャンバス上に描画する処理を関数としてまとめてあります。</p>
<div class="title1">qt_mpl_finance_2_func.py</div>
<script src="https://gist.github.com/bitwalk123/21dff89eae06126023aeffaa1a3cecc7.js"></script>
<p><span class="mono">qt_mpl_finance_2_sub.py</span> は、メインの <span class="mono">QMainWindow</span> の GUI を構成する、ツールバー、中心部のチャート用のキャンバス、<span class="mono">Matplotlib</span> のナビゲーション・ツールバーを表示する下部のドックを記述しています。</p>
<div class="title1">qt_mpl_finance_2_sub.py</div>
<script src="https://gist.github.com/bitwalk123/7bf14519b8f035e27fe1ee9af21c7c20.js"></script>
<p><span class="mono">qt_mpl_finance_2_thread.py</span> は、<span class="mono">yfinance</span> で株価データを読み込む処理を別スレッドで実行する <span class="mono">QRunnable</span> クラスを継承した <span class="mono">ThreadWorker</span> クラスです。</p>
<div class="title1">qt_mpl_finance_2_thread.py</div>
<script src="https://gist.github.com/bitwalk123/1f5a158f04f4416902ea44f460e3a6af.js"></script>
<p><span class="mono">QRunnable</span> クラスを継承した <span class="mono">ThreadWorker</span> のインスタンスでは、別スレッドで処理を実行させることができますが、そのままでは、処理の終了や結果を Signal を発して親スレッドへ送ることができません。そのため、このサンプルでは、QObject を継承したシグナル専用のクラス <span class="mono">ThreadWorkerSignal</span> を作成しておいて、QRunnable と一緒に多重継承して、<span class="mono">ThreadWorkerSignal</span> で定義したシグナルを利用できるようにしています。</p>
<pre class="brush:python gutter:false" title="">
class ThreadWorkerSignal(QObject):
finished = Signal(str, pd.DataFrame)
class ThreadWorker(QRunnable, ThreadWorkerSignal):
def __init__(self, ticker: str):
super().__init__()
self.ticker = ticker
def run(self):
df = get_trade_info(self.ticker)
self.finished.emit(self.ticker, df)
</pre>
<p>この <span class="mono">ThreadWorker</span> は、本体 <span class="mono">qt_mpl_finance_2.py</span> 側で、下記のメソッド内でインスタンス <span class="mono">worker</span> を生成して、QThreadPool のインスタンス <span class="mono">self.threadpool</span> の <span class="mono">start</span> メソッドにインスタンス <span class="mono">worker</span> を渡します。この <span class="mono">start</span> メソッドが実行されると、別スレッドで <span class="mono">worker.run()</span> が実行されます。</p>
<pre class="brush:python gutter:false" title="">
def on_ticker_entered(self, ticker: str):
worker = ThreadWorker(ticker)
worker.finished.connect(self.on_draw_chart)
self.threadpool.start(worker)
</pre>
<p><span class="mono">worker</span> の処理が終わると、<span class="mono">finished</span> シグナルが発せられるので、これを <span class="mono">self.on_draw_chart</span> メソッド(スロット)で処理します。</p>
<pre class="brush:python gutter:false" title="">
def on_draw_chart(self, ticker: str, df: pd.DataFrame):
chart: QWidget | StockChart = self.centralWidget()
draw_chart(chart, ticker, df)
</pre>
<h3 class="frame">サンプルの使い方</h3>
<p>東証に上場している銘柄であれば、ツールボックスの QLineEdit のインスタンスに、銘柄コードに <span class="mono">.T</span> を付加した文字列(例 <span class="mono">1301.T</span>)を入力して <kbd>Enter</kbd> すると、過去3ヶ月分の日足チャートが出力されます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="628" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-2.png"/></a></div>
<div class="title2">qt_mpl_finance_2.py の実行例 (2)</div>
<p>日経平均の指数は <span class="mono">^N255</span> と入力して <kbd>Enter</kbd> します。米国銘柄はアルファベットのシンボルを入力します。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-3.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="628" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mpl_finance_2-3.png"/></a></div>
<div class="title2">qt_mpl_finance_2.py の実行例 (3)</div>
<p>サンプルということで、存在しないコードを入力したときなどのエラー処理は一切していません。🙇🏻</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="pythonmplfinance"></a><a href="https://bitwalk.blogspot.com/2021/05/pythonmplfinance.html" target="_blank">bitWalk's: ローソク足チャート ~ python/mplfinance</a> [2021-05-02]</li>
<li><a name="pyside6-mplfinance"></a><a href="https://bitwalk.blogspot.com/2023/08/pyside6-mplfinance.html" target="_blank">bitWalk's: ローソク足チャート ~ PySide6, mplfinance</a> [2023-08-15]</li>
<li><a name="QThreadPool"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QThreadPool.html" target="_blank">QThreadPool - Qt for Python</a></li>
<li><a name="QRunnable"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QRunnable.html" target="_blank">QRunnable - Qt for Python</a></li>
<li><a name="yfinance"></a><a href="https://github.com/ranaroussi/yfinance" target="_blank">ranaroussi/yfinance: Download market data from Yahoo! Finance's API</a></li>
<li><a name="mplfinance"></a><a href="https://github.com/matplotlib/mplfinance" target="_blank">matplotlib/mplfinance: Financial Markets Data Visualization using Matplotlib</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/Z1N9JzNax2k?si=Mry8mQmt8o6Bqs4L" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-73647885928358245372024-01-28T07:27:00.000+09:002024-01-28T07:27:41.059+09:00QMediaPlayer を使ってみる ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>Qt ライブラリの機能は GUI 部品にとどまらず、とても広範なので、使ったことの無い機能がたくさんあります。今回は、そのうち、動画再生に利用できる QMediaPlayer で <a href="https://ja.wikipedia.org/wiki/MP4" target="_blank">MP4</a> ファイルを再生する簡単なサンプルを紹介します。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
</tbody></table>
<p>以下のスクリーンショットは、参考サイト <a href="#sample-videos">[4]</a> から MP4 ファイルをダウンロードして、それを読み込んで再生している例です。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mediaplayer.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="433" data-original-width="606" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_mediaplayer.png"/></a></div>
<div class="title2">qt_mediaplayer.py の実行例</div>
<p>サンプルは、ツールバーの部分である <span class="mono">MyToolBar</span> クラスと、本体 <span class="mono">Example</span> クラスに分けました。</p>
<div class="title1">qt_mediaplayer_toolbar.py</div>
<script src="https://gist.github.com/bitwalk123/c33a08d5e26149f357dc62f37e147f95.js"></script>
<div class="title1">qt_mediaplayer.py</div>
<script src="https://gist.github.com/bitwalk123/5c144f4e9cbed2cef4874d1112ded680.js"></script>
<p>サンプルを実行すると下記のようなメッセージが出ます。メッセージが出ても MP4 のファイルの再生はできているのですが、メッセージの解消方法が判れば追記します。</p>
<pre class="output">
(venv) $ <span class="black">python qt_mediaplayer.py</span>
<span class="red">qt.multimedia.ffmpeg.libsymbolsresolver: Couldn't load VAAPI library</span>
</pre>
<p>このサンプルは、MP4 ファイルを読み込んで、再生するだけのものです。</p>
<p>サンプルの大まかな流れは、まず QMediaPlayer のインスタンス <span class="mono">self.player</span> を作成し、QAudioOutput で音、QVideoWidget で動画の出力先のインスタンスをそれぞれ作成して <span class="mono">self.player</span> に登録します。</p>
<pre class="brush:python gutter:false" title="">
self.player = QMediaPlayer()
audio = QAudioOutput(self)
self.player.setAudioOutput(audio)
video = QVideoWidget(self)
self.player.setVideoOutput(video)
</pre>
<p>MP4 ファイル <span class="mono">filename</span> を <span class="mono">self.player</span> に読み込んで <span class="mono">play</span> メソッドで再生します。</p>
<pre class="brush:python gutter:false" title="">
self.player.setSource(QUrl.fromLocalFile(filename))
self.player.play()
</pre>
<p>QMediaPlayer の機能を試しながら、もっと使いこなせるようにしていきたいです。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="QMediaPlayer"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtMultimedia/QMediaPlayer.html" target="_blank">QMediaPlayer - Qt for Python</a></li>
<li><a name="QAudioOutput"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtMultimedia/QAudioOutput.html" target="_blank">QAudioOutput - Qt for Python</a></li>
<li><a name="QVideoWidget"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtMultimediaWidgets/QVideoWidget.html" target="_blank">QVideoWidget - Qt for Python</a></li>
<li><a name="sample-videos"></a><a href="https://sample-videos.com/" target="_blank">Download Sample Videos / Dummy Videos For Demo Use</a></li>
<li><a name="videooverview"></a><a href="https://doc.qt.io/qt-6/videooverview.html" target="_blank">Video Overview | Qt Multimedia 6.6.1</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/Z1N9JzNax2k?si=DlF0hib159prkVo-" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-23585191629095461552024-01-23T14:30:00.001+09:002024-01-23T19:12:20.649+09:00KDE neon testing 版の KDE Plasma 6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png" style="display: block; padding: 0.35em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png"/></a></div>
<p style="font-size: small;">KDE Plasma は、主に Linux 向けに開発されているデスクトップ環境です。現在リリースされている KDE Plasma 5 は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a> 5 ライブラリを利用していますが、その後継である Qt 6 を利用した KDE Plasma 6 がリリースに向けて開発中です。</p>
<p>1 月 10 日(現地時間)に、KDE プロジェクトから現在開発中の次期 KDE Plasma 6 のリリース候補 RC 1 (<span class="mono">5.92.0</span>) のリリースがアナウンスされましたが<sup> <a href="#6_rc1">[1]</a></sup>、KDE neon unstable 版は KDE Plasma 6.1 へ開発が移り、当時の KDE neon testing 版ではパッケージの更新をうまくできませんでした。幸い、すぐに Fedora Rawhide の方で KDE Plasma 6 RC1 を確認できたので、そちらの方を当ブログでは紹介しました<sup> <a href="#kde-plasma-6-rc-1">[2]</a></sup>。</p>
<p>今日、KDE neon testing 版のパッケージが <span class="mono">20240222-1309</span> に更新されていたので、ダウンロードして GNOME Boxes の仮想環境にインストールしました。デスクトップ環境が KDE Plasma 6 RC1 (<span class="mono">5.92.90</span>) になっていることを確認しました。KDE Plasma の開発プロジェクトがリリースしている版だからでしょうか、バージョン番号は Fedora Rawhide のもの (<span class="mono">5.92.0</span>) より進んでいます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_5_92_90.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/kde_neon_testing_5_92_90.png"/></a></div>
<div class="title2">GNOME Boxes 上にインストールした neon-testing-20240222-1309.iso</div>
<p>リリース候補版になって壁紙も一新されました。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="6_rc1"></a><a href="https://kde.org/announcements/megarelease/6/rc1/" target="_blank">KDE's 6th Megarelease - Release Candidate 1 - KDE Community</a> [2024-01-10]</li>
<li><a name="kde-plasma-6-rc-1"></a><a href="https://bitwalk.blogspot.com/2024/01/kde-plasma-6-rc-1.html" target="_blank">bitWalk's: KDE Plasma 6 RC 1 リリース</a> [2024-01-15]</li>
<li><a name="download"></a><a href="https://neon.kde.org/download" target="_blank">KDE neon</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/HGYtpCpvetc?si=wHq9Nn5PkOiG0YpR" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-71992961404392476882024-01-21T13:54:00.007+09:002024-01-21T14:06:19.335+09:00QCalendarWidget と QDate ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>python で日付や時間情報を扱う時にはもっぱら datetime モジュールを利用してきました。しかし GUI ライブラリに PySide6 を利用するのであれば、日付や時間情報も QDate あるいは QDateTime クラスを利用した方が便利のように思えます。</p>
<p>簡単なサンプルの作成を重ねて評価しようと、今回は QCalendarWidget と QDate をサンプルにしてみました。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
</tbody></table>
<p>サンプルを下記に示しました。</p>
<div class="title1">qt_calendar.py</div>
<script src="https://gist.github.com/bitwalk123/7cab8839e7cf14e7b95d90cc13353aa3.js"></script>
<p>このサンプルを実行すると、ツールバーを持った QMainWindow クラスのインスタンスが表示されます。ツールバー上の右側にある Apply ボタンをクリックすると QCalendarWidget クラスのインスタンス(カレンダーと呼びます)が表示されます。ツールバー上の左側にある DateEntry クラスのインスタンスに日付が表示されていればその日付が、そうでなければ本日の日付が選択状態(青色)になります。</p>
<p>マウスでカレンダー上の日付を選択してダブルクリックすると、カレンダーが閉じられます。その際、カレンダーは選択された日付を QDate のインスタンスで返します。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_calendar.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="287" data-original-width="322" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_calendar.png"/></a></div>
<div class="title2">qt_calendar.py の実行例</div>
<p>返された日付は、ツールバーの左側にある DateEntry クラスのインスタンス上に表示されます。DateEntry は QLineEidt を継承したクラスで、setDate メソッドで渡された QDate の日付情報をそのままインスタンスで保持し、yyyy-mm-dd の文字列に整形して表示します。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="datetime"></a><a href="https://docs.python.org/ja/3/library/datetime.html" target="_blank">datetime --- 基本的な日付型および時間型</a></li>
<li><a name="QDate"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QDate.html" target="_blank">QDate - Qt for Python</a></li>
<li><a name="QDateTime"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QDateTime.html" target="_blank">QDateTime - Qt for Python</a></li>
</ol>
<p style="clear:both;"> </p>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-44804157163954088232024-01-15T19:23:00.009+09:002024-01-17T12:03:40.425+09:00KDE Plasma 6 RC 1 リリース<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png" style="display: block; padding: 0.35em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZBkgBHP8vC-39nY2o7J-Q9Im0xJanAI6P5HupoCY5RQTrXINtiwLuBe3ariIhhU9pzbSJyF6PGwcLTJZuycrin-qjVZMoHFrH-78fZQxvE2hVFTXdwdb0LmHJMPa5uE41Lyxcklmv94OT6GBYiCgls7AGbBCxTkeUqLI-qTfTxEDEbZ3jvDXgSA/s1600/KDE_logo.png"/></a></div>
<p style="font-size: small;">KDE Plasma は、主に Linux 向けに開発されているデスクトップ環境です。現在リリースされている KDE Plasma 5 は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a> 5 ライブラリを利用していますが、その後継である Qt 6 を利用した KDE Plasma 6 がリリースに向けて開発中です。</p>
<p>1 月 10 日(現地時間)に、現在開発中の次期 KDE Plasma 6 の Release Candidate 1 (5.92.0) のリリースが KDE プロジェクトからアナウンスされました<sup> <a href="#6_rc1">[1]</a></sup>。</p>
<p>KDE プロジェクトがリリースしている Linux ディストロ KDE neon の unstable 版<sup> <a href="#download">[2]</a> </sup>に反映されるのを待っていたのですが、今回は、Fedora Rawhide Spins の KDE 版<sup> <a href="#rawhide">[3]</a> </sup>の方が反映されるのが早かったようです。更新したところ、壁紙の右下の文字列が <span>KDE Plasma 6 RC1</span> になりました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_rc_1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_rc_1.png"/></a></div>
<div class="title2">GNOME Boxes 上にインストールした Fedora Rawhide KDE を最新にアップデート(1/15 時点)</div>
<p>※ KDE neon の unstable 版は、'KDE Plasma 6.1 Dev' になって、6.1 の開発に移っていました。[2024-01-16]</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="6_rc1"></a><a href="https://kde.org/announcements/megarelease/6/rc1/" target="_blank">KDE's 6th Megarelease - Release Candidate 1 - KDE Community</a> [2024-01-10]</li>
<li><a name="download"></a><a href="https://neon.kde.org/download" target="_blank">KDE neon</a></li>
<li><a name="rawhide"></a><a href="https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Spins/x86_64/iso/" target="_blank">https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Spins/x86_64/iso/</a></li>
<li><a name="Plasma_6"></a><a href="https://community.kde.org/Schedules/Plasma_6" target="_blank">Schedules/Plasma 6 - KDE Community Wiki</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/_KrLiGhvd6Y?si=qKqAnTI7AZRCovnt" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-27467319763219018602024-01-14T10:03:00.003+09:002024-01-14T10:07:38.654+09:00【備忘録】Matplotlib のテーブルの PDF 出力<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi25Enf8oN-3GudRKs933P820WBbf7on5EONQHnjVCAWilnQz77EJV34LejnCNO7aTeMahs1qfgukZ9yCnQqOQKFOkWHXlwd0-y-_4Xq9szq19RKGTkg1ExIinSlRhbpmLlK2Z2Ug/s0/matplotlib.png" style="display: block; padding: 0.25em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi25Enf8oN-3GudRKs933P820WBbf7on5EONQHnjVCAWilnQz77EJV34LejnCNO7aTeMahs1qfgukZ9yCnQqOQKFOkWHXlwd0-y-_4Xq9szq19RKGTkg1ExIinSlRhbpmLlK2Z2Ug/s0/matplotlib.png"/></a></div>
<p style="font-size: small;">Matplotlib は、Python と NumPy のためのプロットライブラリです。Tkinter、wxPython、Qt、GTK のような汎用 GUI ツールキットを使ったアプリケーションにプロットを埋め込むためのオブジェクト指向 API を提供しています。</p>
<div align="right" style="font-size: small;"><a href="https://en.wikipedia.org/wiki/Matplotlib" target="_blank">Wikipedia</a> より引用、翻訳</div>
<p>Matplotlib は、データを可視化する際に大変重宝しています。プロットは Matplotlib で、表(テーブル)は PySide6 で対応できていますが、小さな表をプロットと同様にファイルに出力したい時があります。Matplotlib の table の機能を利用する方法があるので、簡単なサンプルを作成しました。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="4">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">pandas</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">2.1.4</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">matplotlib</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.8.2</td>
</tr>
</tbody></table>
<p>このサンプルは、データフレームを表にして表示、さらに PDF へ出力します (<span class="mono">out.pdf</span>)。</p>
<div class="title1">sample_table.py</div>
<script src="https://gist.github.com/bitwalk123/28a15cb834232d0cdb8c1e61c815bbbd.js"></script>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/sample_table.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="552" data-original-width="646" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/sample_table.png"/></a></div>
<div class="title2">sample_table.py の実行例</div>
<p>まだ表の位置決めに課題が残っていますが、備忘録的に掲載しました。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name=""></a><a href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.table.html" target="_blank">matplotlib.pyplot.table — Matplotlib 3.8.2 documentation</a></li>
<li><a name=""></a><a href="https://matplotlib.org/stable/gallery/misc/multipage_pdf.html" target="_blank">Multipage PDF — Matplotlib 3.8.2 documentation</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/bsYJ3hTvx7c?si=T1Pnpg99t-0zJSso" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-29291683007864949982024-01-08T14:37:00.001+09:002024-01-08T14:53:28.589+09:00QWebEnginePage から HTML ソースを取得する ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>本ブログではすでに QWebEngineView クラスを利用したシンプルなインターネットブラウザを何度か紹介してきました。</p>
<p>Google Chrome をはじめ無料で利用できる汎用で高機能なインターネットブラウザが利用できるのに、同等な機能を備えたウィジェットを利用したくなるのは、特定のウェブサイトの内容を取得して、解析や整理、その他いろいろなことをしたい場合に、プログラム的なアプローチが取れて便利だからです。</p>
<p>そのためには表示されているサイトの内容 (HTML) をプログラム的に取得できることが必要です。ということで、今回は、QWebEngineView で表示したサイトの HTML を取得する簡単なサンプルの紹介をします。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>QWebEngineView で読み込んだ URL は、QWebEnginePage に表示されますが、ここに表示されたウェブサイトの HTML のソースを取得します。</li>
</ul>
</div>
<p>なお、本サンプルで使用しているウェブサイトは、下記を利用しています。</p>
<ul><li><a href="https://www.ueno-panda.jp/" target="_blank">上野動物園のジャイアントパンダ情報サイト「UENO-PANDA.JP」</a></li></ul>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.12.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
</tbody></table>
<p>サンプルを以下に示します。このサンプルは、指定した URL を表示して、そのソースを標準出力するという単純なものです。</p>
<div class="title1">qt_webenginepage.py</div>
<script src="https://gist.github.com/bitwalk123/e10ff48c3046b0ce324b162a849fd1d5.js"></script>
<p>このサンプルの実行例を以下に示しました。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="662" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_webenginepage.png"/></a></div>
<div class="title2">qt_webenginepage.py の実行例</div>
<p>表示された HTML の内容が標準出力されます。</p>
<div class="title1">qt_webenginepage.py の出力例</div>
<pre class="output">
<span class="red">doh set to "" -- SystemOnly</span>
<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>
:
:
(以下省略)
</pre>
<p>QWebEingineView クラスを継承した Example クラスで、引数で与えられた URL の読み込みを完了すると発生する <span class="mono">loadFinished</span> シグナルを、on_load_finished メソッド(スロット)に接続します。</p>
<div class="title1b">Example クラスの on_load_finished メソッド</div>
<pre class="brush:python gutter:false" title="">
class Example(QWebEngineView):
def __init__(self, url: QUrl):
super().__init__()
self.load(url)
self.loadFinished.connect(self.on_load_finished)
:
:
</pre>
<p>QWebEngineView 内の URL を表示している QWebEnginePage のインスタンスに対して、<span class="mono">runJavaScript</span> メソッドで指定した Javascript を実行しています。その結果をスタティックメソッド <span class="mono">print_html</span> に渡して出力しています。</p>
<p>このサンプルで使用している Javascript は、<a href="https://ja.wikipedia.org/wiki/Document_Object_Model" target="_blank">DOM</a> の ルートの要素 <span class="mono">document.documentElement</span> における <span class="mono">outerHTML</span> プロパティを取り出しているだけです。 </p>
<div class="title1b">Example クラスの on_load_finished メソッド</div>
<pre class="brush:python gutter:false" title="">
def on_load_finished(self, flag: bool) -> bool:
if not flag:
return False
page: QWebEnginePage = self.page()
page.runJavaScript(
"document.documentElement.outerHTML",
0, self.print_html
)
return True
</pre>
<p>今回は取り出した HTML の内容を標準出力しているだけですが、用途に応じていろいろと応用できると思います。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name=""></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineWidgets/QWebEngineView.html#PySide6.QtWebEngineWidgets.PySide6.QtWebEngineWidgets.QWebEngineView.loadFinished" target="_blank">QWebEngineView - Qt for Python</a></li>
<li><a name=""></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWebEngineCore/QWebEnginePage.html" target="_blank">QWebEnginePage - Qt for Python</a></li>
</ol>
<p style="clear:both;"> </p>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-33651862761313965402024-01-06T11:11:00.010+09:002024-01-07T06:32:38.156+09:00QBuffer を利用する ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>本ブログの過去記事 <a href="#pdf-pyside6">[1]</a> で、データベースに書き込んだ PDF を読み込んで表示する際に、一旦、テンポラリ領域にファイルとして保存したファイルを読み込んで QPdfView に表示するサンプルを紹介しました。その後、QBuffer を利用すればファイルに保存せずともデータベースから読み込んだバイナリを QPdfView へ渡せることを確認できました(追記済みです)。</p>
<p>今回は、matplotlib が保存する画像を、ファイルに保存せずに QBuffer を介してウィジェットに画像として表示するサンプルを紹介します。</p>
<p>QBuffer を使用すると、QIODevice インターフェイスを使用して QByteArray にアクセスできます。QIODevice は、<a href="https://e-words.jp/w/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9.html" target="_blank">ブロックデバイス</a>のための抽象インターフェースを提供しています。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>Matplotlib で描画したチャートを <span class="mono">plt.savefig()</span> あるいは <span class="mono">figure.savefig()</span> で画像ファイルに保存できますが、これを画像ファイルに、ではなく、QBuffer クラスのインスタンスを介して QWidget 上に画像として表示します。</li>
</ul>
</div>
<p>なお、本サンプルで使用している 3D プロットのチャートは、下記のサイトから引用させていただいています。</p>
<ul><li><a href="https://matplotlib.org/stable/gallery/mplot3d/subplot3d.html" target="_blank">3D plots as subplots — Matplotlib 3.8.2 documentation</a></li></ul>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="4">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.11.7</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">matplotlib</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.8.2</td>
</tr>
</tbody></table>
<p>サンプルを以下に示します。</p>
<div class="title1">qt_matplotlib_sombrero.py</div>
<script src="https://gist.github.com/bitwalk123/48a68a0aa212407c0b1bd26b0890781d.js"></script>
<h2 class="frame">サンプルの説明</h2>
<p>本サンプルを実行すると、下記のような matplotlib で描画したチャートのウィンドウが表示されます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_matplotlib_sombrero_1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="591" data-original-width="646" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_matplotlib_sombrero_1.png"/></a></div>
<div class="title2">qt_matplotlib_sombrero.py の実行例 (1)</div>
<p>QMainWindow の下部のステータスバーの位置に配置した matplotlib の NavigationToolbar の右端のフロッピーディスクのアイコンをクリックすれば、画像としてチャートを保存することができます。しかし、今回はウィンドウ上部のツールバーの位置に Apply ボタンを用意して、これをクリックすれば、別ウィンドウ (QWidget) 上に matplotlib が出力した画像イメージを表示するようにしました。</p>
<p>その Apply ボタンをクリックすると下記のような QWidget のトップレベルのウィンドウが表示され、出力された画像が表示されます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_matplotlib_sombrero_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="513" data-original-width="646" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_matplotlib_sombrero_2.png"/></a></div>
<div class="title2">qt_matplotlib_sombrero.py の実行例 (2)</div>
<p>Apply ボタンをクリックすると下記の <span class="mono">on_apply_button</span> メソッドが実行されます。</p>
<div class="title1b">Example クラスの on_apply_button メソッド</div>
<pre class="brush:python gutter:false" title="">
def on_apply_button(self):
buffer = QBuffer()
buffer.open(QIODevice.OpenModeFlag.WriteOnly)
canvas: QWidget | FigureCanvas = self.centralWidget()
canvas.figure.savefig(buffer)
byte_array = buffer.data()
self.viewer = ImageViewer(byte_array)
self.viewer.show()
</pre>
<p>書き込み用のバッファ <span class="mono">buffer</span> を用意して、チャートを表示している FigureCanvas のインスタンス <span class="mono">canvas</span> の <span class="mono">savefig</span> メソッドの引数にします。通常この引数には、出力するファイル名を指定しますが、QBuffer のインスタンスを指定しています。</p>
<p> <span class="mono">savefig</span> メソッドが出力したバイナリは、<span class="mono">buffer</span> に QByteArray 型で保持されます。これを <span class="mono">buffer</span> の <span class="mono">data</span> メソッドで取り出し、画像を表示する ImageViewer のインスタンスへ渡します。</p>
<div class="title1b">ImageViewer クラス</div>
<pre class="brush:python gutter:false" title="">
class ImageViewer(QWidget):
def __init__(self, byte_array: QByteArray):
super().__init__()
self.init_ui(byte_array)
self.setWindowTitle('Matplotlib image viewer')
def init_ui(self, byte_array: QByteArray):
lab = QLabel(self)
pixmap = QPixmap()
pixmap.loadFromData(byte_array)
lab.setPixmap(pixmap)
lab.setFixedSize(
pixmap.size().width(),
pixmap.size().height()
)
</pre>
<p>ImageViewer クラスでは、QPixmap の <span class="mono">loadFromData</span> メソッドで、渡された QByteArray のインスタンスを読み込んで QLabel 上に表示しています。</p>
<h2 class="frame">まとめ</h2>
<p>今回紹介したサンプルは QBuffer の機能を検証しただけの、他になんの役にも立たないサンプルですが、QBuffer を入出力のバッファとして利用したい場面はいろいろとありそうです。QBuffer の使い方については、まだ不慣れな部分が多いので間違っているところがあるかもしれません。誤りが判り次第、訂正を加えていくようにします。</p>
<p>なお、QBuffer を利用することがメインのテーマだったので、PySide6 上で matplotlib を扱うことについての説明は割愛しました。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
.shadowbox {
width: 15em;
border: 1px solid #333;
box-shadow: 2px 8px 5px #444;
padding: 5px 5px;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="pdf-pyside6"></a><a href="https://bitwalk.blogspot.com/2023/12/pdf-pyside6.html" target="_blank">bitWalk's: PDF をデータベースに格納 ~ PySide6</a> [2023-12-29]</li>
<li><a name="QBuffer"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QBuffer.html" target="_blank">QBuffer - Qt for Python</a></li>
<li><a name="QIODevice"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QIODevice.html" target="_blank">QIODevice - Qt for Python</a></li>
<li><a name="QByteArray"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QByteArray.html" target="_blank">QByteArray - Qt for Python</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/f8lc-cRdDKE?si=ME27-iSoj5Gp0Iml" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-27685165472850403542024-01-02T15:53:00.001+09:002024-01-02T15:56:17.710+09:00QToolButton にメニューをつける ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>メニューバーでつくるメニューではなく、GUI に配置した特定のボタンの機能を拡張するためにメニューを付けたくなるときがあります。そんなとき、どうやるんだっけと、いつもあれこれ調べ始めてしまいます。これでは効率が悪いので、ベースサンプルとして使えるように、QToolButton にいわゆるプルダウン・メニューをつけたサンプルを作りましたので、備忘録として紹介します。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="3">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.11.7</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
</tbody></table>
<p>サンプルを以下に示しました。</p>
<div class="title1">qt_toolbar_toolbutton_menu.py</div>
<script src="https://gist.github.com/bitwalk123/7ad405eebc36a75b65a881b9f7f71203.js"></script>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_toolbar_toolbutton_menu.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" data-original-height="137" data-original-width="268" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_toolbar_toolbutton_menu.png"/></a></div>
<div class="title2">qt_toolbar_toolbutton_menu.py の実行例</div>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#080;}
span.comment {color:darkgreen;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.italic {font-style: italic;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="QToolButton"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QToolButton.html" target="_blank">QToolButton - Qt for Python</a></li>
</ol>
<p style="clear:left;"></p>
<iframe width="480" height="270" src="https://youtube.com/embed/Z1N9JzNax2k?si=bBqgHqz75Kip_tPA" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-60249243508750189272024-01-01T07:35:00.003+09:002024-01-01T07:45:33.588+09:00Fedora Rawhide の KDE も Plasma 6 Beta 2 に<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png" style="display: block; padding: 0.4em 1em 0 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEdUTEZiHAWktqm-UI8DGaC2iOIdz6tf_KEdSsVnYstXaA-Uh6hLPy0WHVpg_Jl_-pB5MrcUW4uChUp45n85totM2PvGHi01YqaWlhJT6_Q6_Ui5XnsJCfpMRZVDv-3cpsJg6k9A/s0/fedora_logo.png"/></a></div>
<p style="font-size:small;">Rawhide は Fedora Linux の開発バージョンに与えられている呼称です<sup> <a href="#rawhide">[1]</a></sup>。現在、Fedora Linux 39 がリリースされていますので、Rawhide は 40 のリリースに向けて開発が続けられています。Fedora Linux の次期バージョンのリリース予定の2ヶ月前ぐらいに rawhide のリポジトリから、Fedora Linux のリリース用のリポジトリがブランチされます。Fedora Linux 40 へのブランチは現在のところ 2024-02-06 の予定です<sup> <a href="#f-40-key-tasks">[2]</a></sup>。</p>
<p>KDE プロジェクトが公開している Linux ディストロ <a href="https://ja.wikipedia.org/wiki/KDE_neon" target="_blank">KDE neon</a> の unstable 版で、KDE Plasma 6 Beta 2 (<span class="mono">5.91.90</span>) が利用できるようになったことを、当ブログで紹介しましたが<sup> <a href="#kde-plasma-6-beta-2">[3]</a></sup>、Fedora Rawhide でも、KDE Plasma 6 Beta 2 (<span class="mono">5.91.0</span>) が取り込まれました。KDE Plasma 6 のバージョンが微妙に異なりますが、壁紙の表示が KDE Plasma 6 Beta 2 と変わったので Beta 2 なのでしょう。😅</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_beta_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="450" data-original-width="800" src="https://raw.githubusercontent.com/bitwalk123/linux-distro/main/fedora_rawhide_KDE_plasma6_beta_2.png"/></a></div>
<div class="title2">Fedora Rawhide (KDE) のデスクトップ[2024-01-01 時点]</div>
<p>2024 年になって、リリース候補版 (RC1, RC2) を経て、来月には KDE Plasma 6 の最初の正式版がリリースされる予定です。楽しみです。</p>
<p>なお、Fedora Rawhide の Spins の ISO イメージは下記から入手できます。</p>
<div class="box-frame"><span class="box-title">Fedora Rawhide の ISO イメージの入手先</span>
<ul><li><a href="https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Spins/x86_64/iso/" target="_blank">https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Spins/x86_64/iso/</a></li></ul>
</div>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:40px; color:black;}
pre.code {clear:both;color:#242;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.output {clear:both;color:#444; border:1px solid #aaa;border-radius:5px; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; font-size:medium; white-space: pre-line;}
pre.console {clear:both; color:#444; padding:0.5em; margin-top:0px; margin-bottom:1em; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%; font-size:small;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 1em 0em;
font-weight: normal;
border: solid 1px #555;
border-radius: 6px;
}
.box_round h3 {
margin-top:0px;
color: #248;
}
.box_round p {
margin: 1em 1em;
padding: 0;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 1em;
border: 1px solid #555;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #555;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #444;
}
ol.blacket {margin-left: 0; padding-left: 0; counter-reset: item}
ol.blacket>li {margin-left: 0; padding-left: 0; counter-increment: item; list-style: none inside}
ol.blacket>li:before {content: "[" counter(item) "]"; padding-right: 0.5em}
li.mono {font-family: monospace;}
li.proc {margin-top:5px; margin-bottom: 5px;}
span.cmd {font-weight:bold; font-family: monospace;}
code.black {color: black;}
span.black {color: black;}
span.blue {color: #46F;}
span.cyan {color: #088;}
span.gray {color: gray;}
span.green {color: #080;}
span.comment {color: darkgreen;}
span.command {color: blue;}
span.red {color: red;}
span.red2 {color: #ff6060;}
span.note {color: darkviolet;}
span.emp {font-weight: bold;}
span.mono {font-family: monospace;}
span.italic {font-style: italic;}
.marker_yellow {background: linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background: linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background: linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight: bold;}
table {font-size:medium; font-family: monospace;}
table td {padding: 0px 10px;}
kbd {
font-family: inherit;
font-size: inherit;
color: #2e3436;
background-color: #f3f3f0;
border: solid 1px #babdb6;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
-moz-box-shadow: 1px 1px 2px #babdb6;
-webkit-box-shadow: 1px 1px 2px #babdb6;
box-shadow: 1px 1px 2px #babdb6;
margin: 0 0.2em 0 0.2em;
padding: 0 0.5em 0 0.5em;
white-space: nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border-top: 1px solid #ccc;
border-bottom: 1px solid #ccc;
}
.simple th {
padding: 3px 6px;
vertical-align: top;
color: #666666;
border-bottom: 1px dotted #ccc;
white-space: nowrap;
}
.simple td {
padding: 3px 6px;
border-bottom: 1px dotted #ccc;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;}
}
</style>
<ol class="blacket">
<li><a name="rawhide"></a><a href="https://docs.fedoraproject.org/en-US/releases/rawhide/" target="_blank">Rawhide :: Fedora Docs</a></li>
<li><a name="f-40-key-tasks"></a><a href="https://fedorapeople.org/groups/schedule/f-40/f-40-key-tasks.html" target="_blank">Fedora Linux 40 Schedule: Key</a></li>
<li><a name="kde-plasma-6-beta-2"></a><a href="https://bitwalk.blogspot.com/2023/12/kde-plasma-6-beta-2.html" target="_blank">bitWalk's: KDE Plasma 6 Beta 2 リリース</a> [2023-12-21]</li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/oje635ilUnA?si=acfhBi2yOWY0MAcu" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-9176013.post-26664509745071583072023-12-29T05:29:00.005+09:002024-01-05T19:13:21.898+09:00PDF をデータベースに格納 ~ PySide6<a name="top"></a>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png" style="display: block; padding: 0.3em 1em 0.5em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" data-original-height="24" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Til3KXxQOSYbh-2VXmCEpoj3dPp69nLwTUJs9-PuyXM5QspdNd79Cydim9H9P1b1_KV5X7Vj92n9pvhgdy0AxPyVkh7h3n5-NHqbGbnhDN1I8vT01QAr84BRbM3wIJZIE53UsQ/s0/pyside.png"/></a></div>
<p style="font-size: small;"><a href="https://ja.wikipedia.org/wiki/PySide" target="_blank">PySide</a> (<a href="https://wiki.qt.io/Qt_for_Python" target="_blank">Qt for Python</a>) は、<a href="https://ja.wikipedia.org/wiki/Qt" target="_blank">Qt</a>(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは <a href="https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License" target="_blank">LGPL</a> で公開されています。</p>
<p>本ブログの過去記事 <a href="#sqlite-pdf-pyside6">[1]</a> で、<a href="https://ja.wikipedia.org/wiki/Portable_Document_Format" target="_blank">PDF</a> ファイルを <a href="https://ja.wikipedia.org/wiki/SQLite" target="_blank">SQLite</a> のデータベースに格納する PySide6 のサンプルを紹介しました。その後 <a href="https://ja.wikipedia.org/wiki/PostgreSQL" target="_blank">PostgreSQL</a> でも同じことをしようと試行錯誤していたところ、バイナリをデータベースに格納するのに <a href="https://ja.wikipedia.org/wiki/Base64" target="_blank">Base64</a> のモジュールより、PySide6 の <span class="mono">QByteArray</span><sup> <a href="#QByteArray">[2]</a></sup> クラスを利用した方がシンプルになりそうだったので、書き直すことにしました。</p>
<p>また SQLite と PostgreSQL それぞれに対応したサンプルを、なるべく共通な部分を流用することで一緒に紹介することにしました。</p>
<div class="box-frame"><span class="box-title">今回のテーマ</span>
<ul>
<li>選択した PDF ファイルを読み込んでデータベースへ格納します。そして、データベースから読み込んだ内容を(一旦保存して) QPdfView クラスのウィジェット上に表示する、という GUI サンプルを紹介します。</li>
<li style="margin-top: 0.5em;">データベースは最初 SQLite で確認したあと、PostgreSQL でも同じことができるサンプルを作成します。そのため、SQLite と PostgreSQL で共通に使える部分が多くなるように意識してサンプルを作成します。</li>
</ul>
</div>
<p>なお、PDF ファイルのサンプルは、東京国立博物館ニュースの PDF ファイルを利用させていただきました<sup> <a href="#publication_news">[3]</a></sup>。</p>
<p>下記の OS 環境で動作確認をしています。</p>
<table style="border: 1px dotted; margin-top: 10px; padding: 0px 5px;"><tbody>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="4">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"><img alt="" border="0" data-original-height="24" data-original-width="24" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7rGjqffkieo8Ip1nuftSPC1DGbI18Trhxi80Uv6llIeyJ2oHH3zchJ2GShuUJ_tyPJNz6LFagpDbtPXuHvIsf99o8Yz1NXXHHmR3ytn6_x2taf5faGmytbbZMYxbhYBNhqQPqw/s0/fedoralogo.png"/></a>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">Fedora Workstation 39</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">Python</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">3.11.7</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PySide6</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">6.6.1</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;" colspan="2">(libpq-15.3-1.fc39.x86_64)</td>
</tr>
<tr>
<td style="padding: 0.5em 0.2em 0 0; vertical-align: top;" rowspan="2">
<img alt="" border="0" width="24" data-original-height="32" data-original-width="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhThyphenhyphen1ljgElNOvbbYPZaA06PiNdeA-TWrA6FRDNq4uQVsLfbD9je0sbRpbOTp1SRAaxLQTk8exmx23vWMtSbxTfJ_ZM9wPW01rUBgfG83qJIey3cJt6j9h6scciFLRlIK3ERN9OYQ/s0/almalinux.png"/>
</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">AlmaLinux 9.3 (192.168.0.34)</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">x86_64</td>
</tr>
<tr style="font-size:small;">
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;text-align:right;">PostgreSQL (server)</td>
<td nowrap="" style="padding: 0px 5px; vertical-align: middle;">15.5</td>
</tr>
</tbody></table>
<h4 style="margin-bottom: 0.5em;">【注意】</h4>
<p style="margin-top: 0.5em;">本稿で紹介するサンプルは、シンプルで判りやすく、かつサイズ(行数)を抑えることを優先したため、想定しうるエラー処理をほとんどしていません。</p>
<div align="right"><a href="#top">トップへ</a></div>
<h2 class="frame">データベースに SQLite を利用したサンプル</h2>
<p>以下にサンプル <span class="mono">qt_db_sqlite_pdf.py</span> を示しました(<span class="mono">SQLitePDF</span> クラス)。</p>
<div class="box-frame" style="width: 500px;"><span class="box-title">SQLite 版サンプルの実行に必要なファイル</span>
<ul style="font-family: monospace;">
<li>qt_db_sqlite_pdf.py<span class="gray">(メイン)</span></li>
<li>qt_db_common_pdf.py</li>
</ul>
</div>
<div class="title1">qt_db_sqlite_pdf.py</div>
<script src="https://gist.github.com/bitwalk123/8002a01dc86e0f5be4200377232d9d5d.js"></script>
<p>SQLite と PostgreSQL で変更無しに利用できるクエリ処理部分を <span class="mono">qt_db_common_pdf.py</span> に分離しました。</p>
<div class="title1">qt_db_common_pdf.py</div>
<script src="https://gist.github.com/bitwalk123/21e7dc0df9672405a0e86dcf04147b71.js"></script>
<h3 class="frame">サンプルの説明</h3>
<h4 class="frame">初期化</h4>
<p>サンプルを実行すると、データベースに接続するインスタンスを生成します。このとき指定した名前のデータベース・ファイル <span class="mono">test.sqlite</span> が存在してければ作成されます。</p>
<div class="title1b">SQLitePDF クラスの冒頭</div>
<pre class="brush:python gutter:false" title="">
class SQLitePDF(QMainWindow):
app_title = 'SQLite & PDF test'
def __init__(self):
super().__init__()
self.con = self.get_connection()
self.init_table()
:
:
</pre>
<p>データベースに接続するインスタンスの生成は、SQLite と PostgreSQL では異なるので、あとあとのことを考えて <span class="mono">get_connection</span> メソッドで処理するようにしました。</p>
<div class="title1b">get_connection メソッド(SQLite 用)</div>
<pre class="brush:python gutter:false" title="">
@staticmethod
def get_connection() -> QSqlDatabase:
con = QSqlDatabase.addDatabase('QSQLITE')
dbname = 'testdb.sqlite'
con.setDatabaseName(dbname)
return con
</pre>
<p>その後 <span class="mono">init_table</span> メソッドで、使用するデータベースのテーブルの初期化をします。</p>
<div class="title1b">init_table メソッド</div>
<pre class="brush:python gutter:false" title="">
def init_table(self):
if self.con.open():
self.create_table()
self.con.close()
</pre>
<p>テーブルの初期化処理は <span class="mono">create_table</span> メソッドで処理しています。</p>
<div class="title1b">create_table メソッド(SQLite 用)</div>
<pre class="brush:python gutter:false" title="">
@staticmethod
def create_table():
query = QSqlQuery()
sql = """
CREATE TABLE IF NOT EXISTS pdfrepo (
name_file TEXT UNIQUE,
content NONE
);
"""
if not query.exec(sql):
print(query.lastError())
</pre>
<p>なお、<span class="mono">get_connection</span> と <span class="mono">create_table</span> は、敢えてスタティック・メソッドとして <span class="mono">SQLitePDF</span> クラス内に残しています。</p>
<p>その後、プログラムは GUI を生成します。</p>
<h3 class="frame">PDF ファイルを読み込んでみる</h3>
<p>実行したサンプルのメニューから <span class="under">F</span>ile » Open をクリックします。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="608" data-original-height="151" data-original-width="608" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_1.png"/></a></div>
<div class="title2">qt_db_sqlite_pdf.py の実行例 (1) - メニューから <span class="under">F</span>ile » Open</div>
<p>データベースに格納する PDF ファイルを選択します。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="715" data-original-height="300" data-original-width="715" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_2.png"/></a></div>
<div class="title2">qt_db_sqlite_pdf.py の実行例 (2) - PDF ファイルの選択</div>
<h4 class="frame">バイナリーデータをデータベースへ格納</h4>
<p>ファイルをバイナリモードで読み込んで、パスを除いたファイル名と読み込んだ内容を、データベースに格納します。</p>
<div class="title1b">show_dialog メソッド</div>
<pre class="brush:python gutter:false" title="">
def show_dialog(self):
dialog = QFileDialog()
dialog.setWindowTitle('PDF file selection')
dialog.setNameFilters(['PDF files (*.pdf)'])
if dialog.exec():
filename = dialog.selectedFiles()[0]
basename = os.path.basename(filename)
f = open(filename, 'rb')
with f:
content = f.read()
if self.con.open():
insert_filename_content(basename, content)
self.con.close()
self.update_filelist()
self.combo.setCurrentText(basename)
</pre>
<p>PySide6 でバイナリ・データをそのままクエリに渡してもデータベースに格納できなかったのですが、<span class="mono">QByteArray</span> 型にすると格納できました。<span class="mono">QByteArray</span> 型にするということは、読み出すときにも <span class="mono">QByteArray</span> 型を扱えるようにする必要があるので、「PySide6 あるいは Qt6 のライブラリを使わなければならない」という縛りができてしまいますが、ここではそれを良しとしました。</p>
<p>このクエリを処理する <span class="mono">insert_filename_content</span> 関数は PostgreSQL でも利用します。</p>
<div class="title1b">insert_filename_content 関数</div>
<pre class="brush:python gutter:false" title="">
def insert_filename_content(filename: str, content: bytes):
sql = 'INSERT INTO pdfrepo VALUES(?, ?);'
query = QSqlQuery()
query.prepare(sql)
query.bindValue(0, filename)
query.bindValue(1, QByteArray(content))
if not query.exec():
print(query.lastError())
</pre>
<p>データベースに書き込んだ内容を読み込み直して QPdfView のインスタンスに表示されます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_3.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="608" data-original-height="501" data-original-width="608" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_3.png"/></a></div>
<div class="title2">qt_db_sqlite_pdf.py の実行例 (3) - 読み込んだ PDF ファイルの表示</div>
<h4 class="frame">データベースにあるファイルリストの取得</h4>
<p>QPdfView のインスタンス <span class="mono">view</span> は、QMainWindow を継承した <span class="mono">SQLitePDF</span> クラスに <span class="mono">setCentralWidget</span> メソッドで配置されています。</p>
<div class="title1b">init_ui メソッドの一部</div>
<pre class="brush:python gutter:false" title="">
def init_ui(self):
:
:
combo.currentTextChanged.connect(self.on_current_text_changed)
toolbar.addWidget(combo)
view = QPdfView(self)
view.setPageMode(QPdfView.PageMode.MultiPage)
view.setZoomMode(QPdfView.ZoomMode.FitToWidth)
self.setCentralWidget(view)
</pre>
<p>QToolBar にある QComboBox に表示するファイルリストは下記の関数のクエリで取得しています。</p>
<p>このクエリを処理する <span class="mono">get_list_file</span> 関数は PostgreSQL でも利用します。</p>
<div class="title1b">get_list_file 関数</div>
<pre class="brush:python gutter:false" title="">
def get_list_file(list_file: list):
query = QSqlQuery()
sql = 'SELECT name_file FROM pdfrepo;'
flag = query.exec(sql)
while query.next():
list_file.append(query.value(0))
if not flag:
print(query.lastError())
</pre>
<p>QComboBox のインスタンスに表示されている文字が変更されるとシグナルが発生して、インスタンス・メソッド <span class="mono">on_current_text_changed</span> メソッドが実行されます。</p>
<div class="title1b">on_current_text_changed メソッド</div>
<pre class="brush:python gutter:false" title="">
def on_current_text_changed(self):
filename = self.combo.currentText()
if len(filename) == 0:
return
if self.con.open():
content = get_content_from_filename(filename)
self.con.close()
if content is not None:
filepath = os.path.join(tempfile.gettempdir(), filename)
with open(filepath, 'wb') as f:
f.write(content)
document = QPdfDocument(self)
document.load(filepath)
view: QWidget | QPdfView = self.centralWidget()
view.setDocument(document)
</pre>
<p>このメソッドで、データベースから QComboBox のインスタンスに表示された文字列 = ファイル名に対応するファイルの中身(バイナリ・データ)をデータベースから読み込みます(<span class="mono">get_content_from_filename</span> 関数)。</p>
<p>データベースから取り出して元に戻したバイナリにファイル名をつけてテンポラリの領域に保存して、それを QPdfDocument のインスタンスで読み込んで、QPdfView のインスタンス <span class="mono">view</span> に渡して表示しています。</p>
<h4 style="margin-bottom: 0.5em;">【追記】テンポラリ領域に保存しない方法 (2024-01-04)</h4>
<p style="margin-top: 0.5em;">データベースから取り出したバイナリをファイルに保存せずに QPdfDocument のインスタンスに読み込ませる方が効率的です。あとになって動作確認ができたので、追記します。</p>
<div class="title1b">on_current_text_changed メソッド(改)</div>
<pre class="brush:python gutter:false" title="">
def on_current_text_changed(self):
filename = self.combo.currentText()
if len(filename) == 0:
return
if self.con.open():
content = get_content_from_filename(filename)
self.con.close()
if content is not None:
byte_array = QByteArray(content)
buffer = QBuffer(byte_array)
buffer.open(QIODevice.OpenModeFlag.ReadOnly)
document = QPdfDocument(self)
document.load(buffer)
view: QWidget | QPdfView = self.centralWidget()
view.setDocument(document)
</pre>
<p><span class="mono">QByteArray</span> 型を QBuffer のインスタンスに渡す関係で、<span class="mono">get_content_from_filename</span> 関数でデータベースから取り出した際に <span class="mono">bytes</span> 型に戻したのに、再び <span class="mono">QByteArray</span> 型にすることになりました。最初にサンプルを作った流れを踏襲したので無駄な処理になってしまっています。🙇🏻</p>
<h4 class="frame">バイナリーデータをデータベースから取り出す</h4>
<p>クエリで取り出した QByteArray 型のオブジェクトから <span class="mono">data</span> メソッドで元のバイナリ取り出して返しています。</p>
<p>この <span class="mono">get_content_from_filename</span> 関数は PostgreSQL でも利用します。</p>
<div class="title1b">get_content_from_filename 関数</div>
<pre class="brush:python gutter:false" title="">
def get_content_from_filename(filename: str) -> bytes:
byte_array = None
content = None
query = QSqlQuery()
sql = """
SELECT content FROM pdfrepo
WHERE name_file = '%s';
""" % filename
flag = query.exec(sql)
if query.next():
byte_array = query.value(0)
if not flag:
print(query.lastError())
if byte_array is not None:
content = byte_array.data()
return content
</pre>
<h3 class="frame">複数の PDF ファイルの読み込み</h3>
<p>複数の PDF ファイルをデータベースに読み込むと、QComboBox のインスタンスにファイル名が列挙されます。どれかを選択すれば、その PDF ファイルが表示されます。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_4.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="608" data-original-height="501" data-original-width="608" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_sqlite_pdf_4.png"/></a></div>
<div class="title2">qt_db_sqlite_pdf.py の実行例 (4) - 読み込んだ複数の PDF ファイルから選択</div>
<div align="right"><a href="#top">トップへ</a></div>
<h2 class="frame">データベースに PostgreSQL を利用したサンプル</h2>
<p>以下にサンプル <span class="mono">qt_db_postgres_pdf.py</span> を示しました(<span class="mono">PostgresPDF</span> クラス)。</p>
<div class="box-frame" style="width: 500px;"><span class="box-title">PostgreSQL 版サンプルの実行に必要なファイル</span>
<ul style="font-family: monospace;">
<li>qt_db_sqlite_pdf.py<span class="gray">(SQLite 版のスクリプト)</span></li>
<li>qt_db_common_pdf.py<span class="gray">(SQLite 版のスクリプト)</span></li>
<li>qt_db_postgres_pdf.py<span class="gray">(メイン)</span></li>
<li>qt_db_postgres_pdf.py<span class="gray">(データベース接続用ダイアログ)</span></li>
</ul>
</div>
<div class="title1">qt_db_postgres_pdf.py</div>
<script src="https://gist.github.com/bitwalk123/2564c531e5b631ed5cdf4d29002ce795.js"></script>
<p>PostgreSQL データベースへ接続するのに必要な情報を入力するダイアログ、<span class="mono">DBInfoDlg</span> クラスを用意しました (<span class="mono">qt_db_postgres_dialog.py</span>)。サンプルの起動の度に入力するのは面倒ですが、安易にパスワードを露わにして処理することに躊躇しました。😅</p>
<div class="title1b">qt_db_postgres_dialog.py</div>
<script src="https://gist.github.com/bitwalk123/98be8829fbeb41fdd2d6443483d06de6.js"></script>
<h3 class="frame">サンプルの説明</h3>
<p>さて、メインの <span class="mono">PostgresPDF</span> クラスですが、SQLite を利用した前述の <span class="mono">SQLitePDF</span> クラスを継承して、PostgresSQL 用にオーバーライドしています。</p>
<div class="title1b">SQLitePDF を継承した PostgresPDF クラス(PostgreSQL 用)</div>
<pre class="brush:python gutter:false" title="">
class PostgresPDF(SQLitePDF):
app_title = 'PostgreSQL & PDF test'
def __init__(self):
super().__init__()
</pre>
<p>オーバーライドしているのは、ウィンドウに表示するタイトル文字列と、スタティック・メソッドにした下記の二つのメソッドです。</p>
<p>なお、テーブルを作成する SQL は、SQLite と PostgreSQL で共通にできるのかもしれませんが、ここでは別々にしました。</p>
<div class="title1b">create_table メソッド(PostgreSQL 用)</div>
<pre class="brush:python gutter:false" title="">
@staticmethod
def create_table():
query = QSqlQuery()
sql = """
CREATE TABLE IF NOT EXISTS pdfrepo (
name_file character varying(255) UNIQUE,
content bytea
);
"""
if not query.exec(sql):
print(query.lastError())
</pre>
<p>データベースとの接続を処理する <span class="mono">get_connection</span> メソッドでは、<span class="mono">DBInfoDlg</span> クラスのダイアログを表示して、接続に必要な情報を取得しています。</p>
<div class="title1b">get_connection メソッド(PostgreSQL 用)</div>
<pre class="brush:python gutter:false" title="">
@staticmethod
def get_connection() -> QSqlDatabase:
con = QSqlDatabase.addDatabase('QPSQL')
dict_info = dict()
dlg = DBInfoDlg(dict_info)
if dlg.exec():
con.setHostName(dict_info['host'])
con.setDatabaseName(dict_info['database'])
con.setUserName(dict_info['user'])
con.setPassword(dict_info['password'])
return con
</pre>
<p>サンプル <span class="mono">qt_db_postgres_pdf.py</span> を実行すると、最初にデータベースへ接続するための情報を入力するダイアログが表示されます。必要事項を正しく入力して <kbd> OK </kbd> ボタンをクリックします。入力情報が間違っていてもなにか警告が出るようにはなっていませんのでご注意ください。🙇🏻</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_postgres_pdf_1.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="230" data-original-height="196" data-original-width="230" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_postgres_pdf_1.png"/></a></div>
<div class="title2">qt_db_postgres_pdf.py の実行例 (1) - データベースへの接続ダイアログ</div>
<p>あとの操作は、SQLite 版 (<span class="mono">qt_db_sqlite_pdf.py</span>) と同じです。</p>
<div class="separator" style="clear: both;"><a href="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_postgres_pdf_2.png" style="display: block; padding: 0; text-align: center; "><img alt="" border="0" width="608" data-original-height="501" data-original-width="608" src="https://raw.githubusercontent.com/bitwalk123/PySide6_sample/main/screenshots/qt_db_postgres_pdf_2.png"/></a></div>
<div class="title2">qt_db_postgres_pdf.py の実行例 (2) - 読み込んだ PDF ファイルの表示例</div>
<div align="right"><a href="#top">トップへ</a></div>
<h2 class="frame">まとめ</h2>
<p>データベースを利用する規模や状況にもよるのでしょうが、定型のレポートなど、あまり大きくないサイズのファイルをデータベースにバイナリで格納するはアリだと思っているので、PDF を例にしてサンプルを作ってみました。</p>
<p>また、なにかデータベースを利用した GUI アプリを作るのに、まず試しに SQLite で動作確認をしてから PostgreSQL などのデータベース・サーバーに移行する、ということがよくあります。移行の際、あまり大きな変更をしなくとも PostgreSQL へ移行するのに効果的な方法はないものかと模索している一環として、クラスを継承するというアプローチを取ってみました。</p>
<div align="right"><a href="#top">トップへ</a></div>
<a name="ref"></a><h2>参考サイト</h2>
<style type="text/css">
a {color:#830; text-decoration:none;}
cite {color:#555; font-family:sans-serif; margin-left:1em;}
h2 {margin-top:60px;}
h2.ruby {margin-top:0px;}
h2.frame {padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #b47de6;}
h2.frame2 {padding: 0.25em 0.5em; color: #494949; background: transparent; border-bottom: solid 1px #b47de6; border-left: solid 5px #b47de6;}
h3 {margin-top:40px;margin-bottom:5px;}
h3.frame {margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #7db4e6;}
h3.frame2 {clear:none; margin-top:40px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #8ae;}
h4 {margin-top:30px; color:black;}
h4.frame {margin-top:30px; padding: 0.25em 0.5em; color: #494949; background: transparent; border-left: solid 5px #e6b47d;}
pre.code {clear:both;font-size:smaller;color:#222;line-height:1.1;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
pre.console {clear:both; color:#888; border:1px solid #aaa; border-radius:5px; background-color:#f8f8f8; padding:0.5em; margin-top:0px; height:auto; overflow:auto; word-break:normal; word-wrap:normal; white-space: pre; line-height: 110%;}
pre.blank {clear:both;color:#666;border:1px solid #aaa;border-radius:5px;padding:0.5em;margin-top:0px;height:auto;overflow:auto;word-break:normal;word-wrap:normal;white-space: pre;}
div.title1 {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:1px;}
div.title1b {clear:both; font-family:mono; font-size:small; text-decoration:underline; margin-left:4pt; margin-top:10pt; margin-bottom:-7px;}
div.title2 {clear:both; margin-bottom:30px; margin-top:0px; text-align:center; text-decoration:underline; font-size:small;}
.box_round {
margin: 0.5em 0;
padding: 0em 0.5em 1em 0.5em;
color: #222;
border: solid 1px #248;
border-radius: 6px;
}
.box_round h5 {
margin: 0.5em 1em;
padding: 0;
}
.box_round p {
margin: 0.5em 1em;
padding: 0;
font-size: small;
}
.box-frame {
position: relative;
margin: 2em 0em;
padding: 0px 2em;
border: 1px solid #666;
border-radius: 6px;
background-color: #fff;
}
.box-title {
position: absolute;
padding: 0 0.5em;
left: 20px;
top: -10px;
color: #222;
background-color: #fff;
font-size: small;
}
.box-desc {
color: #222;
}
ol.blacket {margin-left:0; padding-left:0; counter-reset:item}
ol.blacket>li {margin-left:0; padding-left:0; counter-increment:item; list-style:none inside}
ol.blacket>li:before {content:"[" counter(item) "]"; padding-right:0.5em}
li.mono {font-family:monospace;}
li.proc {margin-top:5px; margin-bottom:5px;}
code.black {color:black;}
span.black {color:black;}
span.blue {color:#46F;}
span.cyan {color:#088;}
span.gray {color:gray;}
span.green {color:#060;}
span.comment {color:#060;}
span.command {color:blue;}
span.red {color:red;}
span.red2 {color:#ff6060;}
span.note {color:darkviolet;}
span.emp {font-weight:bold;}
span.mono {font-family:monospace;}
span.under {text-decoration:underline;}
.marker_yellow {background:linear-gradient(transparent 75%, #ffff66 75%);}
.marker_yellow2 {background:linear-gradient(transparent 70%, #ffff00 0%);}
.marker_doger {background:linear-gradient(transparent 75%, #1e90ff 75%);}
.marker_pink {background: linear-gradient(transparent 75%, #ff66ff 75%);}
.bold {font-weight:bold;}
table {font-size:medium; font-family:monospace;}
table td {padding:0px 10px;}
kbd {
font-family:inherit;
font-size:inherit;
color:#2e3436;
background-color:#f3f3f0;
border:solid 1px #babdb6;
-moz-border-radius:2px;
-webkit-border-radius:2px;
border-radius:2px;
-moz-box-shadow:1px 1px 2px #babdb6;
-webkit-box-shadow:1px 1px 2px #babdb6;
box-shadow:1px 1px 2px #babdb6;
margin:0 0.2em 0 0.2em;
padding:0 0.5em 0 0.5em;
white-space:nowrap;
}
.gist-data {
max-height: 500px;
}
.simple {
border-collapse: collapse;
border: 1px solid #aaa;
}
.simple th {
border: 1px solid #aaa;
padding: 3px 6px;
vertical-align: top;
color: #666;
white-space: nowrap;
}
.simple td {
border: 1px solid #aaa;
padding: 3px 6px;
vertical-align: top;
}
.simple2 {
border-collapse: collapse;
border-top: 0px solid #ccc;
border-bottom: 0px solid #ccc;
}
.simple2 th {
padding: 1px 6px;
vertical-align: top;
color: #666666;
border-bottom: 0px dotted #999;
white-space: nowrap;
}
.simple2 td {
padding: 1px 6px;
border-bottom: 0px dotted #999;
}
ul.github {
list-style: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG4mZrPUuyCPj24jfm_0HUxrC1C7qPMQNcW4jfkettKa-56-DODrGIPiU4_bySEw82k4AnDFw_0BSjyxGGHkMryLGU3a_bP0oylvRsArik_SIZtIUJ8TLuOsadU97p3-8bs_DLTA/s0/github.png) inside;
}
}
</style>
<ol class="blacket">
<li><a name="sqlite-pdf-pyside6"></a><a href="https://bitwalk.blogspot.com/2023/12/sqlite-pdf-pyside6.html" target="_blank">bitWalk's: SQLite と PDF ファイル ~ PySide6</a> [2023-12-20]</li>
<li><a name="QByteArray"></a><a href="https://doc.qt.io/qtforpython-6/PySide6/QtCore/QByteArray.html" target="_blank">QByteArray - Qt for Python</a></li>
<li><a name="publication_news"></a><a href="https://www.tnm.jp/modules/r_db/index.php?t=publication_news" target="_blank">東京国立博物館 - 調査・研究・貸与 出版・刊行物 東京国立博物館ニュース</a></li>
</ol>
<p style="clear:both;"> </p>
<iframe width="480" height="270" src="https://youtube.com/embed/qGPzmvleo88?si=NA94yBwmhk-u22Po" frameborder="0"></iframe>
<p style="clear:left;"></p>
<a href="https://blogmura.com/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/logo-blogmura-circle.svg" width="40" height="40" border="0" alt="ブログランキング・にほんブログ村へ" /></a>
<a href="https://blogmura.com/profiles/10685440/?p_cid=10685440&reader=10685440" target="_blank"><img src="https://b.blogmura.com/banner-blogmura-reader-white-small.svg" width="160" height="36" border="0" alt="bitWalk's - にほんブログ村" /></a>
<a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank"><img src="https://b.blogmura.com/it/opensource/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログ オープンソースへ" /></a><br /><a href="https://it.blogmura.com/opensource/ranking/in?p_cid=10685440" target="_blank">にほんブログ村</a>
<br><br>
<a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><img src="https://b.blogmura.com/hashtag/hashtag.svg" width="160" height="87" border="0" alt="オープンソース - ブログ村ハッシュタグ"/></a><br /><a href="https://blogmura.com/tags?q=%23%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9&p_cid=10685440"><b>#オープンソース</b></a>
<br><br>
<a href="https://blog.with2.net/link/?id=1690494&cid=1033" target="_blank"><img width="110" height="31" src="https://blog.with2.net/img/banner/c/banner_1/br_c_1033_1.gif" title="オープンソースランキング"></a>
<br><br>
<a href="https://b.hatena.ne.jp/entry/" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>Unknownnoreply@blogger.com0