おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

UBUNTU21.10でGtkのバージョンが4.4に

最近、UBUNTUの新しいバージョン(21.10)がリリースされました。 このバージョンではGtkのバージョンが4.4に上がっています。 (GtkといえばGtk4が現在の標準なので、単にGtkと書きます)。 この前のUBUNTU21.04ではGtkのバージョンが4.0.3でした。 4.0.3から4.4への変化はかなり大きいものがあります。 その概要はGtkのブログにありますので、そちらを参照してください。

なお、新規インストールでは、Gtk3のみがインストールされ、Gtk4がインストールされていない可能性があるかもしれません(未確認ですが)。 その場合は、libgtk-4-0とlibgtk-4-devの2つのパッケージをインストールすることが必要です。

Gtk4のドキュメンテーションが新しくなっている

Gtk4関連のドキュメントは「GNOME開発センター」から「APIリファランス」をクリックしてアクセスできていたのだが、このたびそれがリニューアルされた。 今までの(古い)ドキュメントは、ここに保存されている。 新しいGNOME開発のウェブサイトはここで、ドキュメントはここになった。 この書き換え作業は進行中でまだ完成はしていない模様だ。

ドキュメントのアドレスが変わってしまったので、「GObject tutorial」と「Gtk4 tutorial」の本文中のリンク先を更新した。 全部更新するのに2日かかった。 それでもまあ順調にアップデートできたと思う。

新しいドキュメントは、整理の仕方が変わって、「クラス」「インターフェース」「関数」「マクロ」などの項目ごとに整理されている。 以前のドキュメントよりもターゲットとなる項目を探しやすくなっている。 たとえば、GtkButtongtk_button_new関数を調べたいときは、クラスのButtonをまず探す。 プリフィックスの「Gtk」は除いて、オブジェクト名の「Button」だけが表示されているので注意が必要だ。 そこを開き、「コンストラクタ」のところに、「gtk_button_new」がある。 この関数はボタンを生成するので、コンストラクタと呼ばれる関数になる。 ボタンに関するその他の関数は「インスタンス関数」のところにある。 この分類は、よりオブジェクト指向を意識したものになっている。

コンセプトやチュートリアルに関しては、だいぶ書き加えられているとはいうものの、まだ完成とはいえない状態である。 そのため、プログラムを作成中に古いドキュメントを参照することが必要になることもあるだろう。 ただ、この問題は作業が完成すれば解決するので、一時的なものである。

今回のリニューアルは、項目の整理が進んだという点で歓迎すべきものであるが、内容的に新しくなったわけではない。 Gtkの初学者にはまだまだ分かりにくいドキュメントであるので、今後はチュートリアルなどの分かりやすいドキュメントの追加が望まれる。

Geogebra

Geogebraというソフトがあります。 かなり歴史のあるソフトです。 どういうソフトかというと、数学の図形やグラフを描けて、なおかつその手順を記録できる、というものです。 直感的に操作できるので、とりあえずダウンロードして開いてみると良いと思います。

このソフトはとても良いソフトだと感じています。 例えば、2つの交わる円を表示して、その2交点を通る直線と2つの中心を通る直線を引くことが簡単にできます。 そして、その図形同士の繋がりを維持することができ、例えば片方の円の大きさを変えてみると(矢印ボタンを選択してドラッグする)、2交点が動き、その2点を通る直線も動くのですが、常にその直線と、もうひとつの(2円の中心を通る直線)は垂直であることがわかります。

この性質は作図でよく用いられる基本的な定理なのですが、こうして図形を動かしてみると、直感的な理解がすすみます。

いろいろ試してみましたが、パスカルの定理(円に内接する6角形の延長線の交点が同一直線状に並ぶ定理)などは、視覚的に分かりやすくなります。 といっても、それを証明するのは難しいですが。

Geogebraを使っているうちに、次のような問題を発見しました。

f:id:ToshioCP:20210703223224p:plain
円に内接する四角形の問題

証明には結構苦労したのですが、PDFにまとめてみたので、興味があればリンクをクリックしてみてください。

解答

この定理は自分で発見したのですが、この程度のものならすでに誰かが考えて証明しているはずだと思います。 もし、どなたかご存知の方がいたら、コメントで教えていただけませんか?

GObject tutorialを大幅書きかえしました。

気になっていたGObject tutorialの修正を終えて、Githubにアップロードしました。

とても気になっていたのは、TPtrというポインタのプロパティをもつオブジェクトの子オブジェクトとして文字列のオブジェクトのTStrを定義したことです。 それはすごくまずいことで、TStrの内部で保持している文字列に外部からアクセスすることが出来るのです。 セキュリティの観点から言えば、どでかい穴が空いている設計なのです。

最初は良いアイディアのような気がして、そうしたのですが、あとからとんでもないことをしていたと気づきました。 今回それを根本から書き直したので、一安心です。 今度はTPtrを全面的に削除し、親オブジェクトをTStrにし、その子オブジェクトをTNumStrという数字を表す文字列にしました。 例えば、"100"は文字列ですが、数字を表す文字列で、TNumStrオブジェクトに格納できます。 それに対し、"Hello"は数字を表さないので、TNumStrオブジェクトに格納することはできません。 TNumStrに格納できる文字列を「数値文字列」と呼ぶことにします。 数値文字列の例としては、

  • "100", "0", "-30", "+50" のような整数
  • "0.1", "100.", ".5", "+1.2", "-3.5" のような実数

浮動小数点表示はサポートしていません。 TStrとTNumStrの親子はセキュリティ上の問題がなく、まあまあの例になったかと思います。

GObject tutorialの例は、整数型、実数型、文字列型、数値文字列型の4つで、それに抽象型の数字型とインターフェースの比較型を加え、6つの型になります。 これらは実際に応用できるような例ではなくて、チュートリアル用の例にすぎず、特に便利なことはありません。 しかし、もしGObjectではなくて、あるいはCではない言語を新しく設計すれば十分実用になります。 例えばRubyの同様のクラスはとても便利です。 実は、このチュートリアルの型はRubyのクラスをヒントに作りました。

詳しいことを知りたい方は、Githubを見てください。

懸案事項が片付いたので、次はGtk4 tutorialの見直しをしようと思っています。 こちらは、いろいろな人、とくに外国の方が見てくれているので、見直しもやり甲斐があります。 内容の拡張はするつもりはありません。 バグ取り中心になる予定です。 何かありましたら、githubのissue、あるいは、このブログにコメントしていただければ、対応したいと思います。

Csv editor にアップグレードしました

先日ブログに書いたCsv viewerに編集の機能をつけました。 ビューワというよりもエディタの面が主になってきたので、名前もCsv editorにすることにしました。

ビューワからエディタに変更するために一番手間がかかったのは、GtkColumnViewのウィジェットとリストの連携です。 これらはGtkListItemで繋がれて管理されるので、リストアイテムが得られれば何でもできるのですが、そう簡単にはいきません。 リストアイテムは、GtkListItemFactoryが自動的にセットアップ、バインド、アンバインド、テアダウンを管理するので、外からアクセスが難しいのです。 それを解決するのにいろいろなアイディアを試して、それに時間がかかりました。 いくつかの方法が考えられます。

  • リスト(たとえばGSList)を利用して、リストアイテムのリストを作り、そこからアクセスする。 リストアイテムが必要ではなく、表示用のウィジェット(リストアイテムのチャイルド)だけですむならば、そのウィジェットのリストを作る。 ウィジェットは常に存在するわけではないので、リストから取り出すときにはかならずチェックが必要です。 (ポインタがNULLかどうかをチェックするなど) この方法の利点はすべての表示ウィジェットにアクセスすることができることです。 例えば、全体のウィジェットについてCSSの状態をチェックしたいときなどに有効です。
  • リストアイテムが参照するリストの要素をGObjectの子オブジェクトとして新たに定義し、その中に対応するリストアイテム、またはウィジェットへのポインタを設定する。 この場合は、ウィジェット全体をアクセスすることも一応出来ますが、面倒な作業が必要になり、実用的ではありません。 ウィジェット全体へのアクセスが必要な場合は最初の方法が勝っています。 この方法の利点はリストを作るなどの複雑なことをしなくてすみ、実装が簡単なことです。

これらは、シグナル・ファクトリを用いて、セットアップ、バインドのいずれかで設定し、アンバインド、テアダウンのいずれかで解放するようにします。

これにより、もともとリストを表示するためのGtkColumnViewを、単なるビューワだけでなく、編集機能をもたせて、リストにフィードバックすることが可能になります。

Csv editorは、名前をtcsvとつけました。 tcsvは今日の時点でバージョンを0.5としました。 ドキュメントも含めて一応完成した形になっています。

ソースファイルはgithubのレポジトリに収められています。

tcsvは長いことかかりましたが、これで一段落したので、今後はGObject tutorial で気になっていた修正や、Gtk4 tutorial の見直しに取り掛かりたいと思っています。

CSV viewer を作ってみました

Csv View -- Csv ファイルを見るためのプログラムを作ってみました。 github にレポジトリを作ってあります。

github/ToshioCP/tcsv

一応テスト済ですが、開発途中です。

今後編集の機能を持たせようと思っているので、その準備のためのボタンがいくつかあります。 それらは現段階では動作しません。

特徴としては、

  • 自前のCsvの検証・読み・書きの関数を備えている
  • Gtk4を使っている。とくにGtk4で新しく導入されたGtkColumnViewを使っている
  • Glib 2.68 で新しく導入された、エラー・ドメインの拡張機能を使っている

といったところです。

近い将来には、編集機能を加えようと思っています。 また、その先には(時間はかかると思いますが)

  • PostgreSQLのようなデータベースの読み書きをサポートする
  • 複数の編集画面を提供する(例えば、特定のレコードを編集する画面と全体の一覧表示の画面、それらの切り替え)
  • 検索機能をつける

といったアイディアを持っています。 そこまでいくと、よくあるデータベース・ソフトに近くなります。 オープンソースなので、カスタマイズもしやすく、利用価値も出てくるかと思っています。

Ubuntu 21.04 のgtk4パッケージ

今日、Ubuntu 21.04にgtk4パッケージがあることに気づきました。 さっそくインストールして試しましたが、(当然ながら)ちゃんと動きます。 バージョンは4.0.3で最新ではありませんが。 (最新のgtk4安定版は4.3)。

$ pkg-config --modversion gtk4
4.0.3

パッケージのインストールはとても簡単で、次のようにタイプすれば良いです。

$ sudo apt-get install libgtk-4-bin libgtk-4-common libgtk-4-dev libgtk-4-doc

他のディストリビューションでは、Arch、Debian、Fedoraがgtk4をサポートしているようです。 Gtkのウェブサイトにそのことがでていました。

Installing GTK from packages

その他に、前回書いた

  • Gnome OS
  • Fedora 34 Beta
  • openSUSE

の3つは、gtk4に加えて、Gnome 40デスクトップも動きます。

さて、話をもとにもどしましょう。 パッケージのgtk4の良いところは、Ubuntu自体との矛盾がないことです。 以前、Ubuntu 20.04LTSにソースからビルドしたgtk4を/usr/localにインストールして、システムがクラッシュしたことがありました。 開発中のライブラリを安易にシステムにインストールしては駄目だということを思い知らされました。 パッケージ版のgtk4は初めからシステムに入っていますし、また、開発したアプリを/usr/local/binにインストールしても大丈夫です。

逆に、パッケージ版の良くないところは、最新版ではないということです。 gtkが4.0から4.3になるまでに、バグフィックスと性能向上が行われてきました。 アプリ開発において、最新板でないと性能面で不十分だというケースもあるかと思います。

今後はどのlinuxディストリビューションもgtk4に移行するでしょう。 それにより、gtk4の開発が主流になることは必然の流れだと思われます。