mieki256's diary



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 3.3だった。 :

気になったので、もう少し調べてみた。順に以下の作業をしながら、その都度、環境変数 PATH を確認。
  1. Shoes 3.2 をアンインストール
  2. Shoes 3.3 をインストール
  3. Shoes 3.3 をアンインストール
  4. 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アプリとはノリがちょっと違う気もするけど。

gtk2 が動くかどうか実験。 :

green_shoes を動かすためには、gtk2 がインストールされている必要がある。まずは gtk2 が動くかどうかを確認した。

色々なバージョンをインストール・アンインストールして試したけれど、とりあえず、以下のバージョンの組み合わせなら、昔書いた 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 をインストール。
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

以下の記述を修正。
beforeafter
yaml_asyaml_tag
Gdk::PixbufGdkPixbuf::Pixbuf
GdkPixbuf::Pixbuf::ROTATE_NONEGdkPixbuf::PixbufRotation::NONE
GdkPixbuf::Pixbuf::ROTATE_CLOCKWISEGdkPixbuf::PixbufRotation::CLOCKWISE
GdkPixbuf::Pixbuf::ROTATE_UPSIDEDOWNGdkPixbuf::PixbufRotation::UPSIDEDOWN
GdkPixbuf::Pixbuf::ROTATE_COUNTERCLOCKWISEGdkPixbuf::PixbufRotation::COUNTERCLOCKWISE
Pango::WRAP_WORDPango::WrapMode::WORD
Pango::WRAP_CHARPango::WrapMode::CHAR
Pango::ELLIPSIZE_ENDPango::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ライブラリと違って、ライブラリが軒並み死んでいるということもなさそうだし。

*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 -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 ドキュメント

コレを見て作業すればよかった…。

以上、1 日分です。

過去ログ表示

Prev - 2019/04 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project