2019/04/20(土) [n年前の日記]
#1 [ruby] ShoesをインストールするとWindowsが破壊される
Rubyスクリプトっぽい感じでソースを書いていくとGUIアプリが作れる、Shoes というツール、というか環境があるのだけど。
_Shoes! The easiest little GUI toolkit, for Ruby.
手元の Windows10 x64上で、Shoes 3.2 や Shoes 3.3 のインストール・アンインストール等を行いながら動作確認をしていたら、ふと、Windows10 の、システム側の環境変数 PATH がめちゃくちゃになってることに気が付いた。状態としては、ユーザ側の PATH 内容で、システム側の PATH が全て上書きされている、みたいな感じ。
破壊された、システム側の PATH の一番最後に、Shoes のパスが追加されていて、しかし、ユーザ側の PATH にはソレがないので…。もしかすると、Shoes 3.2 か 3.3 のインストーラ・アンインストーラが、環境変数 PATH を壊してしまったのではないかなあ、と予想。
_Shoes! The easiest little GUI toolkit, for Ruby.
手元の Windows10 x64上で、Shoes 3.2 や Shoes 3.3 のインストール・アンインストール等を行いながら動作確認をしていたら、ふと、Windows10 の、システム側の環境変数 PATH がめちゃくちゃになってることに気が付いた。状態としては、ユーザ側の PATH 内容で、システム側の PATH が全て上書きされている、みたいな感じ。
破壊された、システム側の PATH の一番最後に、Shoes のパスが追加されていて、しかし、ユーザ側の PATH にはソレがないので…。もしかすると、Shoes 3.2 か 3.3 のインストーラ・アンインストーラが、環境変数 PATH を壊してしまったのではないかなあ、と予想。
◎ 犯人は Shoes 3.3だった。 :
気になったので、もう少し調べてみた。順に以下の作業をしながら、その都度、環境変数 PATH を確認。
犯人は Shoes 3.3 だった。コイツをインストールすると、直後に、ユーザ側の PATH 内容で、システム側の PATH を全て上書きする。
つまり、Shoes 3.3 をインストールすると、Windows が破壊される。ヤバイ。コイツはヤバいぜ。気をつけよう。
ちなみに、Shoes 3.2 をインストールした場合は、そんな状態にはならないように見えた。3.2 を使っておいたほうが、まだ安全なのかな…。
ググってみたら、不具合報告は上がってたらしいけど、3.3.7 beta で修正済みのつもりらしい。怖。おーい、まだ直ってないよー。
_Windows Path Destroyed - Issue #421 - shoes/shoes3
報告しようにも、自分は英語が分からんから、どうにも…。
- Shoes 3.2 をアンインストール
- Shoes 3.3 をインストール
- Shoes 3.3 をアンインストール
- Shoes 3.2 をインストール
犯人は Shoes 3.3 だった。コイツをインストールすると、直後に、ユーザ側の PATH 内容で、システム側の PATH を全て上書きする。
つまり、Shoes 3.3 をインストールすると、Windows が破壊される。ヤバイ。コイツはヤバいぜ。気をつけよう。
ちなみに、Shoes 3.2 をインストールした場合は、そんな状態にはならないように見えた。3.2 を使っておいたほうが、まだ安全なのかな…。
ググってみたら、不具合報告は上がってたらしいけど、3.3.7 beta で修正済みのつもりらしい。怖。おーい、まだ直ってないよー。
_Windows Path Destroyed - Issue #421 - shoes/shoes3
報告しようにも、自分は英語が分からんから、どうにも…。
◎ GTK+アプリは怖い。 :
Shoes 3.2、3.3 は GTK+ を使っているらしいけど。以前、Windows用のGTK+ランタイムをアンインストールしたら、環境変数PATHを全削除されちゃったことがあって…。これだから GTK+ は嫌いなんだ。
*1
*1: このあたり、GTK+ ではなくてインストーラの問題なので、GTK+を悪者扱いするのはおかしいだろと言われそうだけど。しかし、GTK+ を使ってるプログラムは、何故か致命的なバグがあるインストーラを採用する印象もあり。GTK+ は基本的に *NIXで動かすことを前提にしているので、Windows版はバグチェックがおろそかになる傾向があるのではと邪推。
[ ツッコむ ]
#2 [ruby] green_shoes を動かせないか試したり
Windows10 x64 + Ruby 2.2.6 p396 x86 mingw32 上で、green_shoes が動かせるようにならないか試したり。
green_shoes と言うのは、Ruby でGUIアプリを作れるようになるライブラリ、という説明で合ってるのかどうか…。一般的なGUIアプリとはノリがちょっと違う気もするけど。
green_shoes と言うのは、Ruby でGUIアプリを作れるようになるライブラリ、という説明で合ってるのかどうか…。一般的なGUIアプリとはノリがちょっと違う気もするけど。
◎ gtk2 が動くかどうか実験。 :
green_shoes を動かすためには、gtk2 がインストールされている必要がある。まずは gtk2 が動くかどうかを確認した。
色々なバージョンをインストール・アンインストールして試したけれど、とりあえず、以下のバージョンの組み合わせなら、昔書いた gtk2用スクリプトも動作した。
インストール方法は以下。
ちなみに、以下の組み合わせでも動作したが、後で green_shoes を修正する際、対応させる方法が分からなかった。
gtk2 は 3.2.9 まで、cairo は 1.15.14 までなら、x86-mingw32向けのバイナリが用意されていて、インストール時間はさほどかからない。しかし、それ以降の現行版は、MSYS2 でビルドしてインストールするので結構時間がかかる。手っ取り早くインストールして、ちょっとだけ試す程度なら、バグ等はあるだろうけど、3.2.9 までの版をインストールしたほうが楽かもしれない。
色々なバージョンをインストール・アンインストールして試したけれど、とりあえず、以下のバージョンの組み合わせなら、昔書いた gtk2用スクリプトも動作した。
- cairo 1.15.11 x86-mingw32
- gtk2 3.2.1 x86-mingw32
- atk 3.2.1 x86-mingw32
- cairo-gobject 3.2.1 x86-mingw32
- gdk_pixbuf2 3.2.1 x86-mingw32
- gio2 3.2.1 x86-mingw32
- glib2 3.2.1 x86-mingw32
- gobject-introspection 3.2.1 x86-mingw32
- pango 3.2.1 x86-mingw32
インストール方法は以下。
gem install cairo -v="1.15.11" --platform=x86-mingw32 gem install gtk2 -v="3.2.1" --platform=x86-mingw32
- cairo をインストールしてから gtk2 をインストールしないとエラーが出る。
- cairo のバージョンが古いと gtk2 が動かない時もあったので注意。
- gtk2 3.2.1 は、Ruby 2.2 - 2.4 までの対応らしい。
ちなみに、以下の組み合わせでも動作したが、後で green_shoes を修正する際、対応させる方法が分からなかった。
- cairo (1.15.14 x86-mingw32)
- gtk2 (3.2.9 x86-mingw32)
- atk (3.2.9 x86-mingw32)
- cairo-gobject (3.2.9 x86-mingw32)
- gdk_pixbuf2 (3.2.9 x86-mingw32)
- gio2 (3.2.9 x86-mingw32)
- glib2 (3.2.9 x86-mingw32)
- gobject-introspection (3.2.9 x86-mingw32)
- pango (3.2.9 x86-mingw32)
gem install cairo -v="1.15.14" --platform=x86-mingw32 gem install gtk2 -v="3.2.9" --platform=x86-mingw32
gtk2 は 3.2.9 まで、cairo は 1.15.14 までなら、x86-mingw32向けのバイナリが用意されていて、インストール時間はさほどかからない。しかし、それ以降の現行版は、MSYS2 でビルドしてインストールするので結構時間がかかる。手っ取り早くインストールして、ちょっとだけ試す程度なら、バグ等はあるだろうけど、3.2.9 までの版をインストールしたほうが楽かもしれない。
◎ green_shoesを修正。 :
まずは green_shoes をインストール。
そのままだと green_shoes を使ったスクリプトを動かそうとしてもエラーが出てしまうので、green_shoes の関連ファイルを直接修正して試してみたり。
<Ruby 2.2.6 インストールフォルダ>/lib/ruby/gems/2.2.0/gems/green_shoes-1.1.374/lib/ 内の、以下のファイルを修正。
以下の記述を修正。
helper_methods.rb の 146行目を修正。
一応 diff も載せておく。
green_shoes.rb
shy.rb
ruby.rb
helper_methods.rb
この修正をすることで、Windows10 x64 + Ruby 2.2.6 p396 x86 mingw32 + gtk2 3.2.1 x86-mingw32上で、green_shoes 1.1.374 が一応動いてくれた。
gem install green_shoes
> ruby -v ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32] > gem list green_shoes *** LOCAL GEMS *** green_shoes (1.1.374)
そのままだと green_shoes を使ったスクリプトを動かそうとしてもエラーが出てしまうので、green_shoes の関連ファイルを直接修正して試してみたり。
<Ruby 2.2.6 インストールフォルダ>/lib/ruby/gems/2.2.0/gems/green_shoes-1.1.374/lib/ 内の、以下のファイルを修正。
- shoes/shy.rb
- green_shoes.rb
- shoes/ruby.rb
- shoes/helper_methods.rb
以下の記述を修正。
before | after |
---|---|
yaml_as | yaml_tag |
Gdk::Pixbuf | GdkPixbuf::Pixbuf |
GdkPixbuf::Pixbuf::ROTATE_NONE | GdkPixbuf::PixbufRotation::NONE |
GdkPixbuf::Pixbuf::ROTATE_CLOCKWISE | GdkPixbuf::PixbufRotation::CLOCKWISE |
GdkPixbuf::Pixbuf::ROTATE_UPSIDEDOWN | GdkPixbuf::PixbufRotation::UPSIDEDOWN |
GdkPixbuf::Pixbuf::ROTATE_COUNTERCLOCKWISE | GdkPixbuf::PixbufRotation::COUNTERCLOCKWISE |
Pango::WRAP_WORD | Pango::WrapMode::WORD |
Pango::WRAP_CHAR | Pango::WrapMode::CHAR |
Pango::ELLIPSIZE_END | Pango::EllipsizeMode::END |
GdkPixbuf::Pixbuf.new(path) | GdkPixbuf::Pixbuf.new(:file => path) |
helper_methods.rb の 146行目を修正。
layout.alignment = eval "Pango::ALIGN_#{align.upcase}" ↓ layout.alignment = eval "Pango::Alignment::#{align.upcase}"
一応 diff も載せておく。
green_shoes.rb
--- green_shoes.rb.orig Sat Apr 20 04:03:23 2019 +++ green_shoes.rb Sat Apr 20 04:08:17 2019 @@ -19,7 +19,7 @@ LINKHOVER_DEFAULT = "<span underline='single' underline_color='#039' foreground='#039' weight='normal'>" BANNER_DEFAULT, TITLE_DEFAULT, SUBTITLE_DEFAULT, TAGLINE_DEFAULT, CAPTION_DEFAULT, PARA_DEFAULT, INSCRIPTION_DEFAULT, IMAGE_DEFAULT = {}, {}, {}, {}, {}, {}, {}, {} - ROTATE = [Gdk::Pixbuf::ROTATE_NONE, Gdk::Pixbuf::ROTATE_CLOCKWISE, Gdk::Pixbuf::ROTATE_UPSIDEDOWN, Gdk::Pixbuf::ROTATE_COUNTERCLOCKWISE] + ROTATE = [GdkPixbuf::PixbufRotation::NONE, GdkPixbuf::PixbufRotation::CLOCKWISE, GdkPixbuf::PixbufRotation::UPSIDEDOWN, GdkPixbuf::PixbufRotation::COUNTERCLOCKWISE] VERSION = IO.read(File.join(DIR, '../VERSION')).chomp BASIC_ATTRIBUTES_DEFAULT = {left: 0, top: 0, width: 0, height: 0, angle: 0, curve: 0} SLOT_ATTRIBUTES_DEFAULT = {left: nil, top: nil, width: 1.0, height: 0} @@ -30,7 +30,7 @@ LINECAP = {curve: Cairo::LineCap::ROUND, rect: Cairo::LineCap::BUTT, project: Cairo::LineCap::SQUARE} SPAN_FORM = {emphasis: :style, family: :font_family, weight: :weight, rise: :rise, strikethrough: :strikethrough, strikecolor: :strikethrough_color, underline: :underline, undercolor: :underline_color} - WRAP = {word: Pango::WRAP_WORD, char: Pango::WRAP_CHAR, trim: Pango::ELLIPSIZE_END} + WRAP = {word: Pango::WrapMode::WORD, char: Pango::WrapMode::CHAR, trim: Pango::EllipsizeMode::END} FONT_SIZE = {"xx-small" => 0.57, "x-small" => 0.64, "small" => 0.83, "medium" => 1.0, "large" => 1.2, "x-large" => 1.43, "xx-large" => 1.73} COLORS = {} end
shy.rb
--- shy.rb.orig Sat Apr 20 04:03:23 2019 +++ shy.rb Sat Apr 20 04:06:14 2019 @@ -13,7 +13,7 @@ MAGIC = "_shy".freeze LAYOUT = "A4vV".freeze #Force to Little Endian for all platforms - yaml_as 'tag:hackety.org,2007:shy' + yaml_tag('tag:hackety.org,2007:shy') attr_accessor :name, :creator, :version, :launch def self.launchable(d)
ruby.rb
--- ruby.rb.orig Sat Apr 20 04:03:23 2019 +++ ruby.rb Sat Apr 20 04:09:22 2019 @@ -107,7 +107,7 @@ def ask_color title = 'Pick a color...' $dde = true dialog = Gtk::ColorSelectionDialog.new title - dialog.icon = Gdk::Pixbuf.new File.join(DIR, '../static/gshoes-icon.png') + dialog.icon = GdkPixbuf::Pixbuf.new(:file => File.join(DIR, '../static/gshoes-icon.png')) dialog.run ret = dialog.colorsel.current_color.to_a.map{|c| c / 65535.0} dialog.destroy @@ -120,7 +120,7 @@ def get_win Gtk::Window.new.tap do |s| - s.icon = Gdk::Pixbuf.new File.join(DIR, '../static/gshoes-icon.png') + s.icon = GdkPixbuf::Pixbuf.new(:file => File.join(DIR, '../static/gshoes-icon.png')) end end end
helper_methods.rb
--- helper_methods.rb.orig Sat Apr 20 04:03:23 2019 +++ helper_methods.rb Sat Apr 20 04:09:57 2019 @@ -143,7 +143,7 @@ layout.spacing = leading * Pango::SCALE layout.text = text layout.justify = justify - layout.alignment = eval "Pango::ALIGN_#{align.upcase}" + layout.alignment = eval "Pango::Alignment::#{align.upcase}" fd = Pango::FontDescription.new fd.family = font fd.size = size * Pango::SCALE
この修正をすることで、Windows10 x64 + Ruby 2.2.6 p396 x86 mingw32 + gtk2 3.2.1 x86-mingw32上で、green_shoes 1.1.374 が一応動いてくれた。
◎ Ruby 2.3.3でも動いた。 :
Ruby 2.3.3 p222 でも、同じ作業をしてみたところ、一応 green_shoes が動いてくれた。とメモ。
◎ 無理して使うものでもないよなと。 :
ここまでやっておいてなんだけど、green_shoes は無理して使うものでもないよなと…。
元々 Shoes は「簡単にGUIアプリが作れますよ」というのが売りだったけれど。こういう修正作業を要してしまう時点で、当初の目的をもはや達成できていないわけで。これでは存在意義が無いというか、使う意味がないというか。
もっとも、 _Red Shoes (単体で動くShoes)をインストールして使えば、こんな苦労はしないで済むはずだけど。そっちはそっちで、Windows が破壊される不具合がありそうだし…。
どうしても Ruby を使ってGUIアプリを書きたいなら、 _gtk2 、 _gtk3 、 _fxruby 、 等を使ったほうがマシだろうなと…。
そもそも、「RubyでGUIは鬼門」というのが定評なので…。 _LL *1 でGUIアプリを書きたいなら Python を選んだほうがいいよなと。
Python なら、tkinter、wxPython、PyQt(PySide)、Kivy等々、色々あるし。Ruby のGUIライブラリと違って、ライブラリが軒並み死んでいるということもなさそうだし。
元々 Shoes は「簡単にGUIアプリが作れますよ」というのが売りだったけれど。こういう修正作業を要してしまう時点で、当初の目的をもはや達成できていないわけで。これでは存在意義が無いというか、使う意味がないというか。
もっとも、 _Red Shoes (単体で動くShoes)をインストールして使えば、こんな苦労はしないで済むはずだけど。そっちはそっちで、Windows が破壊される不具合がありそうだし…。
どうしても Ruby を使ってGUIアプリを書きたいなら、 _gtk2 、 _gtk3 、 _fxruby 、 等を使ったほうがマシだろうなと…。
そもそも、「RubyでGUIは鬼門」というのが定評なので…。 _LL *1 でGUIアプリを書きたいなら Python を選んだほうがいいよなと。
Python なら、tkinter、wxPython、PyQt(PySide)、Kivy等々、色々あるし。Ruby のGUIライブラリと違って、ライブラリが軒並み死んでいるということもなさそうだし。
*1: Lightweight Language。軽量プログラミング言語。
[ ツッコむ ]
#3 [python] GUIライブラリ Kivy をインストールしてみたり
Kivy という、Python で使えるGUIライブラリがあるのだけど、そういえば触ったことがなかったので試しにインストールしてみたり。環境は、Windows10 x64 + Python 2.7.15 x86(32bit版)。
インストール手順は公式サイトに書いてあったので、DOS窓上でそのまま一つ一つ実行。
_Installation on Windows ・ Kivy 1.10.1 documentation
Python 3.5 の場合は、glew の代わりに以下を使えるらしい。今回は 2.7 を使っているので、インストールしなかった。
すんなりインストールできてしまった。
以下でデモを動かせる模様。
サンプルは、Pythonインストールフォルダ\share\kivy-examples\ 以下に入ってる。
インストール結果は以下。
環境変数 KIVY_GL_BACKEND で、glew、angle、sdl2 のどれを使って描画するのかを指定できるらしい。標準では glew が使われている模様。
インストール手順は公式サイトに書いてあったので、DOS窓上でそのまま一つ一つ実行。
_Installation on Windows ・ Kivy 1.10.1 documentation
python -m pip install --upgrade pip wheel setuptools python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew python -m pip install kivy.deps.gstreamer
Python 3.5 の場合は、glew の代わりに以下を使えるらしい。今回は 2.7 を使っているので、インストールしなかった。
python -m pip install kivy.deps.angle
python -m pip install kivy python -m pip install kivy_examples
すんなりインストールできてしまった。
以下でデモを動かせる模様。
python (Pythonインストールフォルダ)\share\kivy-examples\demo\showcase\main.pyなんだかカッコイイ画面が次々に出てきた。コレ、もしかしてスマホ等の上でも動かすことを前提にして設計されてるのかな。
サンプルは、Pythonインストールフォルダ\share\kivy-examples\ 以下に入ってる。
インストール結果は以下。
> pip list | grep -i -E "kivy|docutils|pygments|pypiwin32" docutils 0.14 Kivy 1.10.1 Kivy-examples 1.10.1 Kivy-Garden 0.1.4 kivy.deps.glew 0.1.10 kivy.deps.gstreamer 0.1.13 kivy.deps.sdl2 0.1.18 Pygments 2.2.0 pypiwin32 219
環境変数 KIVY_GL_BACKEND で、glew、angle、sdl2 のどれを使って描画するのかを指定できるらしい。標準では glew が使われている模様。
◎ 日本語訳があった。 :
インストール作業を終えてからググってたら、公式ドキュメントの日本語訳があることを知った。
_Installation on Windows(翻訳済み) ・ Kivy 1.10.0 ドキュメント
コレを見て作業すればよかった…。
_Installation on Windows(翻訳済み) ・ Kivy 1.10.0 ドキュメント
コレを見て作業すればよかった…。
[ ツッコむ ]
以上、1 日分です。