2020-01-26

Solus 4.1 リリース

Solus /ˈsəʊləs/ は、独自に開発された、アイルランド生まれの独立系 Linux ディストリビューションです。プロジェクトサイトによるとホームコンピューティングのためにデザインされたシステムとのことです。

パッケージ管理は、 PiSi パッケージマネージャーから派生した eopkg という独自の方式を使っています。デスクトップ環境は、独自に開発された Budgie のほか、GNOME, MATE, KDE Plasma 版が用意されています。

スローガンは、Install today. Updates forever.(今日インストールしよう、いつまでも更新できます)です [1]

DistroWatch.com に 1 月 25 日付で Solus 4.1 のリリースアナウンスが出ていましたので [2]、仮想環境にインストールしてみました。本ブログではすでに Solus 4.0 を紹介していましたが [3]、Solus 標準のデスクトップ環境 Budgie では日本語入力/変換はできるものの、入力ソースの状態をデスクトップ上で確認することができず、日本語環境としては使いずらいものでした。

今回のリリースで、この不具合が改善されているかもしれないと期待したのですが、改善はされていませんでした。

Solus 4.1 Budgie のデスクトップ画面

前回ブログ記事を書いた時には他のデスクトップ環境を試していなかったので、今回は GNOME も試してみたところ、こちらは他のディストリビューションと同じく、画面右上のバーに入力ソースの状態が表示されていました(赤字矢印と丸)。

Solus 4.1 GNOME のデスクトップ画面

Budgie は GNOME をベースにしたデスクトップ環境なので、日本語などの言語圏の人が開発者に加わっていればすぐに対応がとれるのに…と、他力本願な期待をしてしまいます。💦

参考サイト

  1. About | Solus
  2. Distribution Release: Solus 4.1 (DistroWatch.com News)
  3. bitWalk's: Linux ディストロ探訪(8) 〜 Solus 〜 [2019-05-06]
  4. Getting Involved | Solus Help Center

 

ブログランキング・にほんブログ村へにほんブログ村

2020-01-25

【備忘録】PyGObject の TreeView

GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。

PyGObject は GObject へのバインディングを提供する Python パッケージです。

Wikipedia より引用・編集

TreeView のサンプル

PyGObject を使いこなせるようになるために、勉強しながら少しずつ「PyGObject サンプル集」を書き足している最中です。

TreeView のサンプルで、参考にしているチュートリアルのサイト [1] のサンプルに納得できませんでした。TreeView というと、階層構造を表現するものというイメージを持っているのですが、フィルター機能があるにせよ普通のテーブルのサンプルだったからです。

他にもっと良いサンプルを探したところ、参考サイト [2] に階層構造のサンプルを見つけました。ただ、PyGTK で記述されていたので PyGObject 用に書き直して少しアレンジしました。

gtk_treeview.py
gtk_treeview.py の実行例

もう少し手を加えるかどうかを検討してから、「PyGObject サンプル集」に反映します。

参考サイト

  1. 12. Tree and List Widgets — Python GTK+ 3 Tutorial 3.4 documentation 12.5. Filtering
  2. PyGTK - TreeView Class - Tutorialspoint

 

ブログランキング・にほんブログ村へにほんブログ村

2020-01-19

Linux パッケージマネージャのコマンド比較

Linux は Windows などの商用の OS と異なり、さまざまなディストリビューションが存在します。ディストリビューションは主にコンパイルされたバイナリパッケージを配布するという形態のために、rpmdeb など、何らかのバイナリパッケージシステムが採用されています。これがディストリビューションの大きな特徴のひとつにもなっています。

Arch Linux のパッケージマネージャに採用されている pacman の使い方を調べていたところ、参考サイト [1] に他のパッケージマネージャとのコマンド比較表がありました。大変詳しい比較表で、普段は Fedora を使っている自分でも知らない dnf のコマンドがあったりと大変興味深いのですが、とりあえず普段使うコマンドだけでまとめたものも欲しいと思ったので、下記にまとめ直しました。

異なるパッケージマネージャのコマンドを、機能的に一対一に対応できるわけではありませんが、一応の参考になるのではないでしょうか。

よく使うパッケージマネージャのコマンド比較
機  能 Arch RHEL Debian/Ubuntu SLES Gentoo
名前を指定してパッケージをインストール pacman -S dnf install apt install zypper install emerge [-a]
名前を指定してパッケージを削除 pacman -Rs dnf remove apt remove zypper remove emerge -vc
名前などでパッケージを検索 pacman -Ss dnf search apt search zypper search emerge -S
インストールされているパッケージの更新 pacman -Syu dnf upgrade apt update
さらに apt upgrade
zypper update emerge -uDN @world
ローカルキャッシュの消去 pacman -Sc
pacman -Scc
dnf clean all apt autoclean
apt clean
zypper clean eclean distfiles
パッケージの情報取得 pacman -Si
pacman -Qi
dnf list
dnf info
apt show
apt-cache policy
zypper info emerge -S
emerge -pv
インストールされているパッケージの情報 pacman -Qi dnf info installed dpkg -s
aptitude show
zypper info
rpm -qi
emerge -pv
emerge -S
レポジトリ(リモート)にあるパッケージの情報 pacman -Si dnf info apt-cache show
aptitude show
zypper info emerge -pv
さらに emerge -S
インストールされているパッケージに含まれているファイル pacman -Ql rpm -ql dpkg -L rpm -Ql equery files
レポジトリ(リモート)にあるパッケージに含まれているファイル pacman -Fl dnf repoquery -l apt-file list pfl
単一の(フルパスの)ファイルが属しているパッケージ名 pacman -Qo rpm -qf dpkg -S zypper search -f equery belongs
パッケージの変更履歴 pacman -Qc rpm -q --changelog apt-get changelog rpm -q --changelog equery changes -f
パッケージの検索 pacman -Ss dnf search apt search zypper search emerge -S
更新可能なパッケージのリスト pacman -Qu dnf list updates
dnf check-update
apt-get upgrade zypper list-updates
zypper patch-check
emerge -uDNp @world
利用可能な全パッケージのリスト pacman -Sl dnf list available apt-cache dumpavail
apt-cache dump
apt-cache pkgnames
zypper packages portageq all_best_visible /
インストールされているパッケージのリスト pacman -Q dnf list installed dpkg --list | grep ^i zypper search --installed-only qlist -IC

参考サイト

  1. Pacman/Rosetta - ArchWiki

ブログランキング・にほんブログ村へにほんブログ村

2020-01-18

【備忘録】kpatch のライブカーネルパッチ機能

kpatch は Linux カーネルが動作している状態でパッチをあてる機能があり、再起動なしに新しいカーネルを適用することでシステムの稼働率を最大化させようとする目的で開発されました。同時に、予定されたダウンタイムを変えることなくカーネルに関連したセキュリティパッチをあてることができます。

kpatch は Red Hat 社によって開発され、ソースコードは Linux カーネルと同じ GPLv2 のライセンスで公開されています [2014-02-26 ~]。

ミッションクリティカルな用途で必要になる技術ですので備忘録にしました。必要に応じて書き足していきます。

参考サイト

  1. kpatch - Wikipedia
  2. kpatchの使い方 - Qiita [2019-06-01]
  3. dynup/kpatch: kpatch - live kernel patching
  4. Centos 8: live updating the kernel using kpatch - James

ブログランキング・にほんブログ村へにほんブログ村

2020-01-17

CentOS 8-1911 リリース

CentOS Linux 8-1911 が 1 月 15 日にリリースされました。これは昨年 11 月 5 日にリリースされた Red Hat Enterprise Linux 8.1 をベースにしています。対応アーキテクチャは ARM (aarch64), PowerPC (ppc64le), x86_64 となっています。

なお、CentOS 8-1905 がすでにインストールされている場合は sudo dnf -y update でアップグレードされます。

CentOS 8-1911 のデスクトップ例

参考サイト

  1. Download CentOS
  2. Manuals/ReleaseNotes/CentOS8.1911 - CentOS Wiki
  3. 「CentOS 8-1911」リリース、RHEL 8.1をベースとした互換環境 | OSDN Magazine [2020-01-16]
  4. 2020年1月17日 RHEL 8.1をベースにした「CentOS-8 1911」がリリース:Linux Daily Topics|gihyo.jp … 技術評論社 [2020-01-17]
  5. Red Hat Enterprise Linux 8.1 リリースのポイント | Red Hat Technical Blog [2019-11-20]

ブログランキング・にほんブログ村へにほんブログ村

2020-01-15

MSYS2 の導入

MSYS (Minimal SYStem) は、Windows 上で動作する軽量の UNIX 風シェル環境です。 Unix シェル Bash やテキスト操作ユーティリティ (gawk, sed, findutils)、ソースコードパッチ用ツール (diffutils)、アーカイブツール (tar, bzip2, zlib) を統合したパッケージで、GNU ツールチェーンの Windows 移植版 (32bit) である MinGW を補う目的で作られました。

MSYS2 は 2013 年後半に新しく始まった MSYS とは別の独立したプロジェクトで、32/64bit 向けの MinGW-w64 パッケージを利用できます。

Wikipedia より引用・編集

OUTLINE

MSYS2 の導入

Windows 10 に MSYS2 をインストールして GCC の開発環境および GTK+ (GObject) を利用して python で GUI アプリを開発できる環境を構築します。

MSYS2 とは

GNU Compiler Collection (GCC) による開発環境を Windows 上で利用するためのシステムで有名なものに Cygwin(1995 年〜)があります。

Cygwin は POSIX に準拠するシステムコールを実現するために cygwin1.dll というランタイムライブラリを提供しており、Cygwin 上の GCC でビルドしたアプリケーションを実行には、このランタイムライブラリが必要になります。

cygwin1.dll に依存せず、Windows ネイティブなランタイムライブラリ msvcrt.dll を利用するようにした開発環境が MinGW で、そのシェル環境が MSYS と呼ばれています。このプロジェクトは 20 年以上前の 1998 年に始まっており、32bit の Windows をサポートしています。

その後、MinGW プロジェクトが 64bit 向けの開発へ移行しなかったため、64bit 向けのプロジェクト MinGW-w64 が新たに立ち上がりました(2005 年〜)。

一方、開発の進捗が遅い MSYS に対して、Cygwin をベースに新たに書き直した MSYS2 プロジェクトが立ち上がり、MinGW-w64 の GCC (32/64bit) をサポートするようになりました(2013 年〜)。

MSYS2 の特徴

MSYS2 は Arch Linux のために開発された Pacman というパッケージ管理システムを採用しています。Pacman は、パッケージのインストール・アップグレード・削除・ダウングレードを処理するとともに依存関係の自動解決を行います。MSYS2 をインストール、設定する際に、その便利さを紹介します。

MSYS2 のインストール

まず、参考サイト [1] からインストーラ(この例では 64bit の msys2-x86_64-20190524.exe)をダウンロードします。

インストール先を D:\msys64 にしてインストールした例を以下に示しました。インストール先は Windows 10 HOME edition(日本語版)です。

(「□ 今すぐ MSYS 64bit を実行します。」にチェックが入っていれば)完了 (F) ボタンをクリックしてインストーラを終了すると端末エミュレータ (Mintty) が起動します。

MSYS2 の端末エミュレータ (Mintty)

MSYS2 のアップデート

pacman -Syu でローカルパッケージデータベースの更新と、(更新可能な)パッケージを更新します。

bitwa@WIN-7713IMJPI09 MSYS ~
$ pacman -Syu
:: パッケージデータベースの同期中...
 mingw32                  451.1 KiB   964K/s 00:00 [#####################] 100%
 mingw32.sig              119.0   B  0.00B/s 00:00 [#####################] 100%
 mingw64                  453.4 KiB  1378K/s 00:00 [#####################] 100%
 mingw64.sig              119.0   B  0.00B/s 00:00 [#####################] 100%
 msys                     190.9 KiB  1224K/s 00:00 [#####################] 100%
 msys.sig                 119.0   B  0.00B/s 00:00 [#####################] 100%
:: Starting core system upgrade...
警告: terminate other MSYS2 programs before proceeding
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (3) mintty-1~3.0.6-1  msys2-runtime-3.0.7-6  pacman-5.2.1-4

合計ダウンロード容量:  14.12 MiB
合計インストール容量:  52.11 MiB
最終的なアップグレード容量:  -7.89 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 msys2-runtime-3.0.7...     2.6 MiB  2.49M/s 00:01 [#####################] 100%
 mintty-1~3.0.6-1-x86_64  664.9 KiB   617K/s 00:01 [#####################] 100%
 pacman-5.2.1-4-x86_64     10.9 MiB  2.41M/s 00:05 [#####################] 100%
(3/3) キーリングのキーを確認                       [#####################] 100%
(3/3) パッケージの整合性をチェック                 [#####################] 100%
(3/3) パッケージファイルのロード                   [#####################] 100%
(3/3) ファイルの衝突をチェック                     [#####################] 100%
(3/3) 空き容量を確認                               [#####################] 100%
:: パッケージの変更を処理しています...
(1/3) 更新 msys2-runtime                           [#####################] 100%
(2/3) 更新 mintty                                  [#####################] 100%
(3/3) 更新 pacman                                  [#####################] 100%
警告: terminate MSYS2 without returning to shell and check for updates again
警告: for example close your terminal window instead of calling exit

コアのパッケージを更新したからでしょうか、シェルがここで止まってしまったので、「警告」に従って端末エミュレータ右上の X をクリックして終了します。

スタートメニューから「MSYS 64bit」→「MSYS2 MSYS」を選択して端末エミュレータを起動します。pacman -Su で残りのパッケージを更新します。

bitwa@WIN-7713IMJPI09 MSYS ~
$ pacman -Su
:: コアシステムの更新を開始...
 何も行うことがありません
:: システム全体の更新を開始...
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (45) bash-completion-2.10-1  brotli-1.0.7-2  bsdcpio-3.4.0-4
                bsdtar-3.4.0-4  bzip2-1.0.8-1  ca-certificates-20190110-1
                curl-7.67.0-1  dtc-1.5.1-1  findutils-4.7.0-1  gawk-5.0.1-1
                gcc-libs-9.1.0-2  gnupg-2.2.19-1  heimdal-libs-7.7.0-1
                less-551-1  libarchive-3.4.0-4  libbz2-1.0.8-1
                libcurl-7.67.0-1  libedit-20191025_3.1-1  libexpat-2.2.9-1
                libgcrypt-1.8.5-1  libgnutls-3.6.11.1-1  libgpgme-1.13.1-1
                libhogweed-3.5.1-1  libiconv-1.16-1  libidn2-2.2.0-1
                liblz4-1.9.2-1  libnettle-3.5.1-1  libnghttp2-1.39.2-1
                libopenssl-1.1.1.d-1  libp11-kit-0.23.18.1-1
                libpcre2_8-10.34-1  libpsl-0.21.0-1  libreadline-8.0.001-1
                libssh2-1.9.0-1  libtasn1-4.15.0-1  libutil-linux-2.34-1
                libxml2-2.9.10-1  libxslt-1.1.34-1  libzstd-1.4.4-1
                ncurses-6.1.20190615-1  nettle-3.5.1-1  openssl-1.1.1.d-1
                p11-kit-0.23.18.1-1  pkgfile-21-1  util-linux-2.34-1

合計ダウンロード容量:   22.82 MiB
合計インストール容量:  129.84 MiB
最終的なアップグレード容量:    5.14 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 bash-completion-...   211.6 KiB   676 KiB/s 00:00 [#####################] 100%
 gcc-libs-9.1.0-2...  1183.6 KiB  2.39 MiB/s 00:00 [#####################] 100%
 brotli-1.0.7-2-x...   284.8 KiB  8.97 MiB/s 00:00 [#####################] 100%
...
(省略)
...
 libutil-linux-2....   254.7 KiB  1481 KiB/s 00:00 [#####################] 100%
 pkgfile-21-1-x86_64    43.0 KiB  0.00   B/s 00:00 [#####################] 100%
 util-linux-2.34-...  1450.1 KiB  2.16 MiB/s 00:01 [#####################] 100%
(45/45) キーリングのキーを確認                     [#####################] 100%
(45/45) パッケージの整合性をチェック               [#####################] 100%
(45/45) パッケージファイルのロード                 [#####################] 100%
(45/45) ファイルの衝突をチェック                   [#####################] 100%
(45/45) 空き容量を確認                             [#####################] 100%
:: パッケージの変更を処理しています...
( 1/45) 更新 bash-completion                       [#####################] 100%
( 2/45) 更新 gcc-libs                              [#####################] 100%
( 3/45) 更新 brotli                                [#####################] 100%
...
(省略)
...
(39/45) 更新 gnupg                                 [#####################] 100%
==> msys2.gpg からキーを追加...
==> キーリングの信頼されたキーに署名...
  -> キーに署名 D55E7A6D7CE9BA1587C0ACACF40D263ECA25678A...
  -> キーに署名 123D4D51A1793859C2BE916BBBE514E53E0D0813...
  -> キーに署名 B91BCF3303284BF90CC043CA9F418C233E652008...
  -> キーに署名 9DD0D4217D75A33B896159E6DA7EF2ABAEEA755C...
==> 所有者信頼値をインポート...
==> 信用データベースを更新...
gpg: 信用データベースの検査は、不要です
(40/45) 更新 libarchive                            [#####################] 100%
(41/45) 更新 libgpgme                              [#####################] 100%
(42/45) 更新 libpcre2_8                            [#####################] 100%
(43/45) 更新 libutil-linux                         [#####################] 100%
(44/45) 更新 pkgfile                               [#####################] 100%
(45/45) 更新 util-linux                            [#####################] 100%

bitwa@WIN-7713IMJPI09 MSYS ~
$

git のインストール

MSYS2 の更新ができましたので、pacman -S git で git をインストールしておきます。

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ pacman -S git
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (35) db-5.3.28-2  expat-2.2.9-1  gdbm-1.18.1-2  heimdal-7.7.0-1
                libgdbm-1.18.1-2  openssh-8.1p1-1  perl-5.30.1-1
                perl-Authen-SASL-2.16-2  perl-Convert-BinHex-1.125-1
                perl-Encode-Locale-1.05-1  perl-Error-0.17028-1
                perl-File-Listing-6.04-2  perl-HTML-Parser-3.72-4
                perl-HTML-Tagset-3.20-2  perl-HTTP-Cookies-6.08-1
                perl-HTTP-Daemon-6.01-2  perl-HTTP-Date-6.05-1
                perl-HTTP-Message-6.18-1  perl-HTTP-Negotiate-6.01-2
                perl-IO-Socket-SSL-2.066-1  perl-IO-stringy-2.111-1
                perl-LWP-MediaTypes-6.02-2  perl-MIME-tools-5.509-1
                perl-MailTools-2.21-1  perl-Net-HTTP-6.19-1
                perl-Net-SMTP-SSL-1.04-1  perl-Net-SSLeay-1.85-3
                perl-TermReadKey-2.37-4  perl-TimeDate-2.30-2
                perl-Try-Tiny-0.30-1  perl-URI-1.76-1
                perl-WWW-RobotRules-6.02-2  perl-libwww-6.43-1  vim-8.1.2292-1
                git-2.24.1-1

合計ダウンロード容量:   28.85 MiB
合計インストール容量:  139.19 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 expat-2.2.9-1-x86_64   43.7 KiB  0.00   B/s 00:00 [#####################] 100%
 vim-8.1.2292-1-x...     7.0 MiB  2.04 MiB/s 00:03 [#####################] 100%
 heimdal-7.7.0-1-...   430.4 KiB  1312 KiB/s 00:00 [#####################] 100%
...
(省略)
...
 git-2.24.1-1-x86_64     5.2 MiB  3.14 MiB/s 00:02 [#####################] 100%
(35/35) キーリングのキーを確認                     [#####################] 100%
(35/35) パッケージの整合性をチェック               [#####################] 100%
(35/35) パッケージファイルのロード                 [#####################] 100%
(35/35) ファイルの衝突をチェック                   [#####################] 100%
(35/35) 空き容量を確認                             [#####################] 100%
:: パッケージの変更を処理しています...
( 1/35) インストール expat                         [#####################] 100%
( 2/35) インストール vim                           [#####################] 100%
( 3/35) インストール heimdal                       [#####################] 100%
...
(省略)
...
(25/35) インストール perl-libwww                   [#####################] 100%
perl-libwww の提案パッケージ
    perl-LWP-Protocol-https: for https:// url schemes
(26/35) インストール perl-TimeDate                 [#####################] 100%
(27/35) インストール perl-MailTools                [#####################] 100%
(28/35) インストール perl-IO-stringy               [#####################] 100%
(29/35) インストール perl-Convert-BinHex           [#####################] 100%
module test... pass.
(30/35) インストール perl-MIME-tools               [#####################] 100%
(31/35) インストール perl-Net-SSLeay               [#####################] 100%
(32/35) インストール perl-IO-Socket-SSL            [#####################] 100%
(33/35) インストール perl-Net-SMTP-SSL             [#####################] 100%
(34/35) インストール perl-TermReadKey              [#####################] 100%
(35/35) インストール git                           [#####################] 100%
git の提案パッケージ
    python2: various helper scripts
    subversion: git svn

bitwa@WIN-7713IMJPI09 MINGW64 ~
$

三種類の端末エミュレータ

インストールした MSYS2 では、スタートメニューに、MinGW 32bit, MinGW 64bit そして MSYS の三種類の端末エミュレータが登録されていて、どれを使うべきなのか戸惑います。

どれも Mintty で bash シェルを利用できますが、パスが微妙に異なっています。また env で確認すると、PATH 以外にも CONFIG_SITE, MSYSTEM_CHOST などの環境変数の値も異なっていることを確認できます。

ここでは 64bit の GCC を利用するので、以降、MSYS2 MinGW 64-bit(実体は D:\msys64\msys2_shell.cmd -mingw64 という引数付きバッチファイルです)を利用することにします。

参考までに、それぞれの端末エミュレータでパスを確認した結果を示しました。

MSYS2 MinGW 32-bit
bitwa@WIN-7713IMJPI09 MINGW32 ~
$ echo $PATH
/mingw32/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

bitwa@WIN-7713IMJPI09 MINGW32 ~
$
MSYS2 MinGW 64-bit
bitwa@WIN-7713IMJPI09 MINGW64 ~
$ echo $PATH
/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

bitwa@WIN-7713IMJPI09 MINGW64 ~
$
MSYS2 MSYS
bitwa@WIN-7713IMJPI09 MSYS ~
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/opt/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

bitwa@WIN-7713IMJPI09 MSYS ~
$

GCC (64bit) のインストール

GCC の開発環境をインストールします。ただし、GCC でアプリをビルドする目的で MSYS2 を利用しない場合はインストールを省略できます。

まず、pacman -Sg でパッケージグループを表示します。

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ pacman -Sg
kf5
mingw-w64-i686-toolchain
mingw-w64-i686
mingw-w64-i686-gimp-plugins
kde-applications
kdebase
mingw-w64-i686-qt
mingw-w64-i686-qt5
mingw-w64-i686-qt-static
mingw-w64-i686-qt5-static
mingw-w64-i686-vulkan-devel
tesseract-data
mingw-w64-x86_64-toolchain
mingw-w64-x86_64
mingw-w64-x86_64-gimp-plugins
mingw-w64-x86_64-qt
mingw-w64-x86_64-qt5
mingw-w64-x86_64-qt-static
mingw-w64-x86_64-qt5-static
mingw-w64-x86_64-vulkan-devel
libraries
development
base-devel
base
msys2-devel
compression
VCS
sys-utils
Database
net-utils
editors
python-modules
mingw-w64-cross-toolchain
mingw-w64-cross
perl-modules
utilities

bitwa@WIN-7713IMJPI09 MINGW64 ~
$

上記から mingw-w64-x86_64-toolchain を選んで 64bit 対応の GCC 関連パッケージをまとめてインストールします。

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ pacman -S mingw-w64-x86_64-toolchain
:: 17 個のパッケージがグループ mingw-w64-x86_64-toolchain に存在します:
:: リポジトリ mingw64
   1) mingw-w64-x86_64-binutils  2) mingw-w64-x86_64-crt-git
   3) mingw-w64-x86_64-gcc  4) mingw-w64-x86_64-gcc-ada
   5) mingw-w64-x86_64-gcc-fortran  6) mingw-w64-x86_64-gcc-libgfortran
   7) mingw-w64-x86_64-gcc-libs  8) mingw-w64-x86_64-gcc-objc
   9) mingw-w64-x86_64-gdb  10) mingw-w64-x86_64-headers-git
   11) mingw-w64-x86_64-libmangle-git  12) mingw-w64-x86_64-libwinpthread-git
   13) mingw-w64-x86_64-make  14) mingw-w64-x86_64-pkg-config
   15) mingw-w64-x86_64-tools-git  16) mingw-w64-x86_64-winpthreads-git
   17) mingw-w64-x86_64-winstorecompat-git

選択して下さい (デフォルト=all):
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (43) mingw-w64-x86_64-bzip2-1.0.8-1
                mingw-w64-x86_64-ca-certificates-20190110-1
                mingw-w64-x86_64-expat-2.2.9-1
                mingw-w64-x86_64-gettext-0.19.8.1-8
                mingw-w64-x86_64-gmp-6.1.2-1  mingw-w64-x86_64-isl-0.22-1
                mingw-w64-x86_64-libffi-3.2.1-4
                mingw-w64-x86_64-libiconv-1.16-1
                mingw-w64-x86_64-libsystre-1.0.1-4
                mingw-w64-x86_64-libtasn1-4.15.0-1
                mingw-w64-x86_64-libtre-git-r128.6fb7206-2
                mingw-w64-x86_64-mpc-1.1.0-1
                mingw-w64-x86_64-mpdecimal-2.4.2-1
                mingw-w64-x86_64-mpfr-4.0.2-2
                mingw-w64-x86_64-ncurses-6.1.20190630-1
                mingw-w64-x86_64-openssl-1.1.1.d-1
                mingw-w64-x86_64-p11-kit-0.23.18.1-1
                mingw-w64-x86_64-python-3.8.1-1
                mingw-w64-x86_64-readline-8.0.001-2
                mingw-w64-x86_64-sqlite3-3.30.1-1
                mingw-w64-x86_64-tcl-8.6.10-1  mingw-w64-x86_64-termcap-1.3.1-5
                mingw-w64-x86_64-tk-8.6.10-1
                mingw-w64-x86_64-windows-default-manifest-6.4-3
                mingw-w64-x86_64-xz-5.2.4-1  mingw-w64-x86_64-zlib-1.2.11-7
                mingw-w64-x86_64-binutils-2.33.1-1
                mingw-w64-x86_64-crt-git-8.0.0.5576.34082b63-1
                mingw-w64-x86_64-gcc-9.2.0-2  mingw-w64-x86_64-gcc-ada-9.2.0-2
                mingw-w64-x86_64-gcc-fortran-9.2.0-2
                mingw-w64-x86_64-gcc-libgfortran-9.2.0-2
                mingw-w64-x86_64-gcc-libs-9.2.0-2
                mingw-w64-x86_64-gcc-objc-9.2.0-2  mingw-w64-x86_64-gdb-8.3.1-3
                mingw-w64-x86_64-headers-git-8.0.0.5576.34082b63-1
                mingw-w64-x86_64-libmangle-git-8.0.0.5573.a4de8df4-1
                mingw-w64-x86_64-libwinpthread-git-8.0.0.5574.33e5a2ac-1
                mingw-w64-x86_64-make-4.2.1-4
                mingw-w64-x86_64-pkg-config-0.29.2-1
                mingw-w64-x86_64-tools-git-8.0.0.5573.a4de8df4-1
                mingw-w64-x86_64-winpthreads-git-8.0.0.5574.33e5a2ac-1
                mingw-w64-x86_64-winstorecompat-git-8.0.0.5573.a4de8df4-1

合計ダウンロード容量:  146.49 MiB
合計インストール容量:  910.72 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 mingw-w64-x86_64...   623.0 KiB   950 KiB/s 00:01 [#####################] 100%
 mingw-w64-x86_64...   102.1 KiB  6.65 MiB/s 00:00 [#####################] 100%
 mingw-w64-x86_64...    13.6 MiB  2.94 MiB/s 00:05 [#####################] 100%
...
(省略)
...
 mingw-w64-x86_64...    35.9 KiB  0.00   B/s 00:00 [#####################] 100%
(43/43) キーリングのキーを確認                     [#####################] 100%
(43/43) パッケージの整合性をチェック               [#####################] 100%
(43/43) パッケージファイルのロード                 [#####################] 100%
(43/43) ファイルの衝突をチェック                   [#####################] 100%
(43/43) 空き容量を確認                             [#####################] 100%
:: パッケージの変更を処理しています...
( 1/43) インストール mingw-w64-x86_64-libiconv     [#####################] 100%
( 2/43) インストール mingw-w64-x86_64-zlib         [#####################] 100%
( 3/43) インストール mingw-w64-x86_64-binutils     [#####################] 100%
...
(省略)
...
(43/43) インストール mingw-w64-x86_64-winstore...  [#####################] 100%

bitwa@WIN-7713IMJPI09 MINGW64 ~
$

Hello World!

GCC がインストールできましたので、念の為、簡単な Hello World! の GUI プログラムをコンパイルしてみました。なお、下記ソースは日本語版 Windows デフォルトのエンコーディングである cp932 (Shift-JIS) で保存しておきます。

hello.c (cp932)
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
    MessageBox(NULL, "こんにちは、世界!", "こんにちは、世界!", MB_OK);
    return 0;
}

-v オプションを付けてコンパイル時の処理も出力しました。

bitwa@WIN-7713IMJPI09 MINGW64 ~/hello
$ gcc -o hello.exe hello.c -mwindows -v
Using built-in specs.
COLLECT_GCC=D:\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.2.0 (Rev2, Built by MSYS2 project)
COLLECT_GCC_OPTIONS='-o' 'hello.exe' '-mwindows' '-v' '-mtune=generic' '-march=x86-64'
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/cc1.exe -quiet -v -iprefix D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/ -D_REENTRANT hello.c -quiet -dumpbase hello.c -mwindows -mtune=generic -march=x86-64 -auxbase hello -version -o D:\msys64\tmp\ccoorSFx.s
GNU C17 (Rev2, Built by MSYS2 project) version 9.2.0 (x86_64-w64-mingw32)
        compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "D:/msys64/mingw64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/9.2.0/include"
ignoring nonexistent directory "C:/building/msys64/mingw64/include"
ignoring nonexistent directory "/mingw64/include"
ignoring duplicate directory "D:/msys64/mingw64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/9.2.0/include-fixed"
ignoring duplicate directory "D:/msys64/mingw64/lib/gcc/../../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/include"
ignoring nonexistent directory "C:/building/msys64/mingw64/x86_64-w64-mingw32/include"
#include "..." search starts here:
#include <...> search starts here:
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/include
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../include
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/include-fixed
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/include
End of search list.
GNU C17 (Rev2, Built by MSYS2 project) version 9.2.0 (x86_64-w64-mingw32)
        compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 3bcdf03344e3ad7cb057c2ec82f696e6
COLLECT_GCC_OPTIONS='-o' 'hello.exe' '-mwindows' '-v' '-mtune=generic' '-march=x86-64'
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/as.exe -v -o D:\msys64\tmp\ccOkl3s7.o D:\msys64\tmp\ccoorSFx.s
GNU assembler version 2.33.1 (x86_64-w64-mingw32) using BFD version (GNU Binutils) 2.33.1
COMPILER_PATH=D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/;D:/msys64/mingw64/bin/../lib/gcc/;D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/
LIBRARY_PATH=D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/;D:/msys64/mingw64/bin/../lib/gcc/;D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../lib/;D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/;D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../
COLLECT_GCC_OPTIONS='-o' 'hello.exe' '-mwindows' '-v' '-mtune=generic' '-march=x86-64'
 D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/collect2.exe -plugin D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/liblto_plugin-0.dll -plugin-opt=D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/lto-wrapper.exe -plugin-opt=-fresolution=D:\msys64\tmp\cc6QBLmS.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lgdi32 -plugin-opt=-pass-through=-lcomdlg32 -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep --subsystem windows -Bdynamic -o hello.exe D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/crtbegin.o -LD:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0 -LD:/msys64/mingw64/bin/../lib/gcc -LD:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib -LD:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../lib -LD:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib -LD:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../.. D:\msys64\tmp\ccOkl3s7.o -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -lgdi32 -lcomdlg32 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/lib/../lib/default-manifest.o D:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/crtend.o
COLLECT_GCC_OPTIONS='-o' 'hello.exe' '-mwindows' '-v' '-mtune=generic' '-march=x86-64'

bitwa@WIN-7713IMJPI09 MINGW64 ~/hello
$
hello.exe の実行例

PyGObject のインストール

python で GTK+ の GUI プログラミングをするために必要なパッケージをインストールします。参考サイト [7] に従って、下記のようにインストールします。

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-gobject
警告: mingw-w64-x86_64-python-3.8.1-1 は最新です -- 再インストール
依存関係を解決しています...
衝突するパッケージがないか確認しています...
警告: 循環依存が検出されました:
警告: mingw-w64-x86_64-harfbuzz は依存パッケージ mingw-w64-x86_64-freetype の前にインストールされます

パッケージ (36) mingw-w64-x86_64-adwaita-icon-theme-3.34.3-1
                mingw-w64-x86_64-atk-2.34.1-1  mingw-w64-x86_64-cairo-1.16.0-1
                mingw-w64-x86_64-fontconfig-2.13.1-1
                mingw-w64-x86_64-freeglut-3.2.1-1
                mingw-w64-x86_64-freetype-2.10.1-1
                mingw-w64-x86_64-fribidi-1.0.8-1
                mingw-w64-x86_64-gdk-pixbuf2-2.40.0-1
                mingw-w64-x86_64-glib2-2.62.4-1
                mingw-w64-x86_64-gobject-introspection-runtime-1.62.0-2
                mingw-w64-x86_64-graphite2-1.3.13-2
                mingw-w64-x86_64-harfbuzz-2.6.4-3
                mingw-w64-x86_64-hicolor-icon-theme-0.17-1
                mingw-w64-x86_64-jasper-2.0.16-1
                mingw-w64-x86_64-json-glib-1.4.4-1
                mingw-w64-x86_64-libcroco-0.6.13-1
                mingw-w64-x86_64-libdatrie-0.2.12-1
                mingw-w64-x86_64-libepoxy-1.5.4-1
                mingw-w64-x86_64-libjpeg-turbo-2.0.4-1
                mingw-w64-x86_64-libpng-1.6.37-3
                mingw-w64-x86_64-librsvg-2.46.4-1
                mingw-w64-x86_64-libthai-0.1.28-2
                mingw-w64-x86_64-libtiff-4.1.0-1
                mingw-w64-x86_64-libxml2-2.9.10-2  mingw-w64-x86_64-lzo2-2.10-1
                mingw-w64-x86_64-pango-1.43.0-3  mingw-w64-x86_64-pcre-8.43-1
                mingw-w64-x86_64-pixman-0.38.4-1
                mingw-w64-x86_64-pygobject-devel-3.34.0-3
                mingw-w64-x86_64-python-cairo-1.18.2-2
                mingw-w64-x86_64-shared-mime-info-1.15-1
                mingw-w64-x86_64-wineditline-2.205-3
                mingw-w64-x86_64-zstd-1.4.4-1  mingw-w64-x86_64-gtk3-3.24.13-1
                mingw-w64-x86_64-python-3.8.1-1
                mingw-w64-x86_64-python-gobject-3.34.0-3

合計ダウンロード容量:   38.11 MiB
合計インストール容量:  328.42 MiB
最終的なアップグレード容量:  215.75 MiB

:: インストールを行いますか? [Y/n] y
:: パッケージを取得します...
 mingw-w64-x86_64...    31.5 KiB  0.00   B/s 00:00 [#####################] 100%
 mingw-w64-x86_64...    58.2 KiB  0.00   B/s 00:00 [#####################] 100%
 mingw-w64-x86_64...   885.1 KiB  1112 KiB/s 00:01 [#####################] 100%
...
(省略)
...
 mingw-w64-x86_64...   188.6 KiB  5.94 MiB/s 00:00 [#####################] 100%
(36/36) キーリングのキーを確認                     [#####################] 100%
(36/36) パッケージの整合性をチェック               [#####################] 100%
(36/36) パッケージファイルのロード                 [#####################] 100%
(36/36) ファイルの衝突をチェック                   [#####################] 100%
(36/36) 空き容量を確認                             [#####################] 100%
:: パッケージの変更を処理しています...
( 1/36) インストール mingw-w64-x86_64-hicolor-...  [#####################] 100%
( 2/36) インストール mingw-w64-x86_64-wineditline  [#####################] 100%
( 3/36) インストール mingw-w64-x86_64-pcre         [#####################] 100%
...
(省略)
...
(36/36) インストール mingw-w64-x86_64-python-g...  [#####################] 100%

bitwa@WIN-7713IMJPI09 MINGW64 ~
$

calculator.py の実行

本ブログで以前紹介した PyGObject のサンプルプログラム [8] を git でクローンします。サンプルの中から calculator.py を実行してみます。

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ git clone https://github.com/bitwalk123/PyGObject_samples.git
Cloning into 'PyGObject_samples'...
remote: Enumerating objects: 141, done.
remote: Counting objects: 100% (141/141), done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 141 (delta 85), reused 99 (delta 46), pack-reused 0
Receiving objects: 100% (141/141), 24.68 KiB | 283.00 KiB/s, done.
Resolving deltas: 100% (85/85), done.

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ ls
PyGObject_samples

bitwa@WIN-7713IMJPI09 MINGW64 ~
$ cd PyGObject_samples

bitwa@WIN-7713IMJPI09 MINGW64 ~/PyGObject_samples
$ ls
calculator.py       gtk_grid.py        gtk_notebook.py     gtk_textview.py
gtk_button.py       gtk_hbox.py        gtk_progressbar.py  gtk_togglebutton.py
gtk_checkbutton.py  gtk_headerbar.py   gtk_radiobutton.py  gtk_vbox.py
gtk_combobox.py     gtk_iconview.py    gtk_spinbutton.py   hello.py
gtk_dialog.py       gtk_label.py       gtk_spinner.py      hello2.py
gtk_entry.py        gtk_linkbutton.py  gtk_switch.py       README.md

bitwa@WIN-7713IMJPI09 MINGW64 ~/PyGObject_samples
$ python -V
Python 3.8.1

bitwa@WIN-7713IMJPI09 MINGW64 ~/PyGObject_samples
$ python calculator.py
calculator.py の実行例

このスクリプトは Linux 上で開発したので、文字は UTF-8 でエンコードされてます。アプリがコンソール(端末エミュレータ)に文字列を出力せず、GUI だけを使用している場合は、文字化けの問題はなさそうです。しかし、Windows と Linux とエンコードが違う以上、文字化けの問題が出てくるだろうと考えられます。詳しく調べて、別の機会に対処方法などを紹介したいと考えています。

参考サイト

  1. MSYS2 homepage
  2. Mintty — Cygwin Terminal emulator
  3. MSYS2で快適なターミナル生活 - Qiita [2016-04-28]
  4. Pacmanの使い方 - Qiita [2016-07-30]
  5. Pacman/Rosetta - ArchWiki
  6. Repo Updates - MSYS2 Packages
  7. Getting Started — PyGObject
  8. bitWalk's: PyGObject を試す (2) 〜 電卓エミュレータ [2020-01-12]

ブログランキング・にほんブログ村へにほんブログ村

2020-01-12

PyGObject を試す (2) 〜 電卓エミュレータ

GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。

PyGObject は GObject へのバインディングを提供する Python パッケージです。

Wikipedia より引用・編集

本ブログ記事では下記の OS 環境で動作確認をしています。

Fedora 31 (Workstation Edition) x86_64
Python 3.7.5
PyGObject 3.34.0

電卓エミュレータ

昨年末に PyGObject を試してみて [1]、Linux と Windows(それに MacOS)のマルチプラットフォームで利用でき、普段使っている Linux の GNOME デスクトップと同じ GTK+ ライブラリを使っていて相性が良いので、使いこなせるようになりたいとウィジェットのサンプル集を作りはじめました [2] 

しかし、延々とウィジェット単体だけを扱うのは退屈な作業です。そこで何かはっきりした用途で動作する簡単なサンプルを作りたいと思い、使い古された題材ですが電卓エミュレータを作ってみました(左図)。

と言っても、簡単なサンプルなので、レイアウトをイメージしやすい Gtk.Grid しか使っていません。

最近の電卓は高機能になり、計算順序は数式どおりのもありますが、このエミュレータは、昔ながらの入力順の計算をします。

また、電卓特有の機能、例えば (結果:6)といった裏技のような機能はエミュレートしていません。参考サイト [3] によると、いろいろ裏技があっておもしろそうですが、どこまでエミュレートできるようにするかは、使う人の用途次第です。

ウィジェットの色やフォント、マージンなどの修飾は CSS で設定します。

個々のアプリでウィジェットの修飾にあまり懲り過ぎると、デスクトップでの使用感 (UX) が他のアプリとあまりに違ってしまうので、控えめに使う事を心掛けていますが、ここでは練習のため、色付けやマージンなどを敢えていじってみました。

ボタンウィジェット上に表示する文字は、多言語化対応した環境を使っているのですから、ASCII 文字で表示することをせず、いわゆる「全角」のフォントを意識してわざわざ使っています。

※ こんなことをわざわざ説明するのは、昔から GUI に日本語フォントを表示するのにいろいろ苦労してきた古い人間だからです。💦

以下に、ソースコードを示しました。いつもコードの可読性と簡潔さの両立を目指していますが、電卓のディスプレイの表示が整数の場合、例えば 0 ではなく 0. と表示することにこだわったのでコーディングが少々煩雑になってしまいました。

calculator.py

ウィジェットを修飾する CSS ファイルを別にしました。

calculator.css

リポジトリ

GitHub の下記のサイトにリポジトリを公開しています。calculator.py は PyGObject のサンプルと一緒に入っています。

ソースを入手するには下記のように git でクローンしてください。

git clone https://github.com/bitwalk123/PyGObject_samples.git

Windows 10 上での動作確認

Windows 10 に MSYS2 をインストール、Python / PyGObject を開発できる環境を整えておきます。git で上記のリポジトリからクローンして calculator.py を実行した結果を右に示しました。

このリポジトリにアップされているスクリプトは Linux で開発されているので、文字のエンコーディングは UTF-8 です。Windows の文字コードは cp932(いわゆるシフト JIS)ですが、MSYS2 のパッケージで実行する限り、文字の表示は UTF-8 で問題が無いようです。

参考サイト

  1. bitWalk's: PyGObject を試す
  2. bitWalk's: PyGObject サンプル集
  3. こんなこともできる!電卓の裏ワザ的使い方 | nanapi [ナナピ]
  4. X11の色名称 - Wikipedia

 

 

 

ブログランキング・にほんブログ村へにほんブログ村