2020年6月16日火曜日

Python+Kivy 備忘録 スライダー、テキストボックス連動編その2

先月RGBのパラメータを入力するスライダー、テキストボックス連動クラスを作成し、Python2 から Python3 に移行したら動かなかったと書いたのですが…
動きました。
と、いうか作り直しました。
そもそも、ラベル、スライダー、テキストボックスの3個のアイテムを子に持つクラスを、更に3個束ねていたのですが
コレでタイミングエラーが出るなら、全9個のアイテムを1個のクラスでまとめれば良いのでは?
と、考えて作ってしまったのがこちらです。

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.slider import Slider
from kivy.uix.floatlayout import FloatLayout

### Input Color Value
class SlR(Slider):
    def on_touch_up(self,touch):
        self.parent.tR.text = str(int(self.value))

class TxR(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sR.value = value
        else:
            self.text=str(int(self.parent.sR.value))

class SlG(Slider):
    def on_touch_up(self,touch):
        self.parent.tG.text = str(int(self.value))

class TxG(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sG.value = value
        else:
            self.text=str(int(self.parent.sG.value))

class SlB(Slider):
    def on_touch_up(self,touch):
        self.parent.tB.text = str(int(self.value))

class TxB(TextInput):
    def on_text_validate(self):
        value = int(self.text)
        if value <= self.parent.max and value >= self.parent.min:
            self.parent.sB.value = value
        else:
            self.text=str(int(self.parent.sB.value))

class GridRGBParm(GridLayout):
    def __init__(self,**kwargs):
        super(GridRGBParm,self).__init__(**kwargs)
        self.SetUp()

    def SetUp(self):
        self.clear_widgets()

        self.cols=3

        self.min = 0
        self.max = 255

        self.lR = Label(text='R',size_hint_x=1)
        self.sR = SlR(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tR = TxR(text=str(self.min),multiline=False,size_hint_x=2)

        self.lG = Label(text='G',size_hint_x=1)
        self.sG = SlG(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tG = TxG(text=str(self.min),multiline=False,size_hint_x=2)

        self.lB = Label(text='B',size_hint_x=1)
        self.sB = SlB(min=self.min, max=self.max, value=self.min,size_hint_x=7)
        self.tB = TxB(text=str(self.min),multiline=False,size_hint_x=2)

        self.add_widget(self.lR)
        self.add_widget(self.sR)
        self.add_widget(self.tR)

        self.add_widget(self.lG)
        self.add_widget(self.sG)
        self.add_widget(self.tG)

        self.add_widget(self.lB)
        self.add_widget(self.sB)
        self.add_widget(self.tB)

class Display(BoxLayout):
    orientation='vertical'
    def __init__(self,**kwargs):
    super(Display,self).__init__(**kwargs)

    self.GridRGB = GridRGBParm(size_hint_y=1)
    self.add_widget(self.GridRGB)

class MainApp(App):
    def build(self):
        layout = Display()
        return layout

if __name__=='__main__':
    MainApp().run()


…冗長ですねえ。全く同じ処理を3回ずつ書いています。
職業プログラマがこんなコード書いたら怒られそうですが、あいにく私は意識低い系です。動けばよかろうなのだ!

2020年6月7日日曜日

イオシスの Q584/H に LinuxMint19.3 Mate を入れてみた

存在自体は昨年から知っていたのですが、流石にもう Atom マシンは要らないよ…と思っていたのです。が、コレには Linux がやたらに載せにくいという噂を聞きまして、挑戦してみる事に。
実は先日ドスパラの DG-D09IW2 に 64bit の Ubuntu20.04 Mate のインストールに成功してまして、コイツはイケるのでは?と軽く考えてしまったんですよね…


  • 64Bitは入らない

結論から書くと64Bit版のLinuxは入りません。
Atom マシンに 64bit Linux を入れる時の常套手段は、

1 rufus でインストールUSBを作る(rufus 以外で作ると2の作業ができない事がある)
2 /efi/boot というディレクトリを作って bootia32.efi を入れる

コレに限ります。
実際にこの方法でインストールディスクを作った場合、インストーラーの GRUB メニュー
(文字のみで表示される、通常起動、セーフモード起動…等の選択画面)までは Q584/H でも表示されます。
が、選択後一切動かなくなってしまいました。
USB メモリのパイロットランプも消灯した為、本当に止まってしまったと判断しました。

※余談ですが、同様に Momo7w と iwork7 でも GRUB メニューまでは表示できますがインストールはできませんでした。


さて、それでは長い備忘録がはじまります。


  • 下ごしらえ

サポートの切れた標準の Win8.1 を使っても仕方ないですが、この Win8.1 は最後のお仕事があります。
bios アップデートですね。Linux に載せ替えてしまうとなかなかアップデートはできないので、Windows が入っているうちに済ませておきましょう。
イオシスで買った場合、恐らく bios は 1.2 のハズですが、私は 1.33 にアップデートできました。


  • bios 設定

bios 画面の入り方は「電源を入れる際に音源ボタンのマイナスを入れっぱなし」デス。
bios 設定は二か所変える所があるのですが…まず一つは起動ディスク設定。
これは標準では eMMC が最優先になっていますが、USB HDD 等を上に移動させます。
※写真はインストール後に撮った物の為、eMMC の中身が ubuntu になっています

で、次が問題のセキュアブート設定。
セキュアブートというのはかつてMS社が「Windows をタダで提供する代わりに、他の OS を入れなくする設定をマザーボードに強制する」という、OS支配の為に行った施策です。
当然訴えられまして、後に撤回するのですが、この施策のターゲットが Atom タブレットだった為、 Atom マシンは 64Bit CPU なのに 64Bit OS も載らないし、Linux も載らない機種が多数あります。
まあ、先人は強かでして、ならば Windows インストーラに誤認させれば良くね?という訳で作られたのが前述の bootia32.efi なのだそうですが…

さて、bios を開いてセキュアブートの項目を見ても無効に設定する項目が無い事に気づくと思います。
コレは管理者パスワードを設定することで選択可能になるのですが…
長いパスワードを設定してはいけません
私は一度10数文字の長いパスワードを設定したのですが、内部でパスワードが化けるらしく2度と bios が開かなくなりました。
私がパスワードを間違えている可能性は?と思われるかもしれませんが、そもそもパスワード確認画面で再度同じパスワードを入れているので間違いようがありません。
これで、最初の1台は windows8.1 しか起動しない部品取りマシンになってしまいまして、買い直す羽目に。2代目は bios パスワードにも関わらず1文字というセキュリティ意識の低いシロモノになっています。
管理者パスワードを設定し、セキュアブート設定を無効にしてマシン側の下ごしらえは終了です。


  • インストールUSBの作成

基本的には先日の Momo7w と同じです。32bit 版ですが、 bootia32.efi を入れておきます。
一応、インストール用には 16GB USB2.0 の物を使いました。恐らく、どんなものでも大丈夫だとは思いますが。



  • 起動ガチャ

個体差かもしれませんが、私の場合、起動用USBは 3.0 のポートに刺さないと起動しませんでした。
このため、3.0のポートに有線LAN付きUSBハブを取り付け、コレにLANケーブルとインストール用USBメモリを刺して起動させました。
下ごしらえがちゃんと済んでいれば GRUB の画面までは表示されるハズですが、ココから地獄の起動ガチャが始まります。

この Q584/h という機種はインストール時の起動が安定しません。
ログを手繰ってはいないのですが、ハードウェア認識に手間取る間にタイムアウトしているものと思われます。写真が取れていないのですが、以下、私が出くわした失敗起動集です。

1.そもそも Linux が起動しない。
起動時にズラーっと字が表示された挙句エラーの文が表示されて起動しない。
目安として USB メモリから起動して 10 分経っても起動しなければ諦めた方が良いです。
windows10 のインストーラーと違い待ってもあまり良いことはありません。

2.Linux が起動したけどなんか変
最初に正しく起動した時の画面を上げておきます。

2-1.左上のアイコンが出ない
特に、この SD カードのアイコンが eMMC であり、このアイコンが表示されていない=認識されていない場合はインストールできません。

2-2.左下のメニューが出ない
下部のメニューがただの無地になってしまう。システムが正常に動いていない系です。コレが出た場合も大抵うまくいきません。

2-3.右下の表示がおかしい
まれに、スピーカーとマイクに×マークがついたアイコンが表示される事があります。コレは割と軽症でそのままインストールできる事がありますが、LAN のマークに異常が出た場合はインストールはほぼ不可能です。
又、インストール時の鉄則として内蔵無線 LAN を使わず、USB 接続の有線 LAN を使いましょう。有線 LAN は何らかのトラブルでインストール時に LAN が切れた場合、物理的に LAN ケーブルを繋ぎ直す事で復帰する事がありますが、無線 LAN の場合はインストール時ドライバー更新で動かなくなってそのまま詰む可能性があります。

で、USB 起動で上記の変な起動をしてしまったらどうするの?という話なのですが
ひたすら再起動
…個体差かもしれませんが、本当に気分で立ち上がり方が変わるので、起動ガチャです。安心して欲しいのは、正しく Linux インストールが終わった後は比較的安定して起動するという事ですかね。


  • インストールを始める

ディスクのマークのインストールアイコンをクリックしてインストール開始…なのですが、なかなか反応しませんし、起動まで時間がかかります。うっかりクリックを連打しがちなのですが、アイコンを一回クリックしたらエンターキーを押して2、3分待ってみましょう。


  • パーテションをどう切るの?

以前の Momo7w の時と同様に先頭200MB /boot/efi (FAT32) 次の61GB を / (ext4) 残りの1.3GB程を SWAP に設定。
efi 領域を設定しないと起動できない等の警告が出るのですが、 /boot/efi の代わりに efi 領域を設定すると毎度の GRUB エラーがインストールの最後に出てしまいます。
FAT32 にするとエラーがでないのでこちらに設定しましょう。


  • 座してインストール完了を待っていてはいけない

インストール中に質問が出る訳でもないので放置して良い…訳では無いのです。
タッチパットを動かしたりカーソルキーを押したりして、省電力モードに入らないように気をつけましょう。
私は一度インストール時に省電力モードに入ってしまい、そのまま復帰せずインストールをやり直しになりました。



  • インストールが終わったのでレビュー

正直おもちゃレベルという評価が多いのですが、Atom マシンとしてはトップクラスに早いです。それでも N 系のセレロンよりも大分遅いので微妙という評価は変わりませんが。
一応、メモリはデュアルチャンネル実装されているので、オンメモリで動く軽いアプリに対してはそれなりに動きます。


  • Inkscape と GIMP 動く?

そこそこに動きます。又、安い中華 Atom タブレットは Linux を入れるとタッチパネルが反応しなくなりがちですが、流石にワコム対応なので、ちゃんとタッチパネルも付属ペンも動きます。
私は絵を書かないので詳しくはわかりませんが、線画程度なら余裕、複雑な効果を使わない限りはそれほど苦労はしないのではないでしょうか?


  • Blender 動く?

動きません。が、これは冤罪。
標準でインストールされる Blender は 2.79 ですが、起動時にリソースの推移を見ると、メモリ消費量が等速で上がって行き、限界(4GB)を使った所でハングアップしてしまいました。
この挙動は momo7w でも同様で、Blender 側のバグが原因と断定できると思います。
そもそも 2.8 で 32bit を切り捨てているので、Blender 側が今更 2.7 系のデバッグをするかは微妙ですが、直して欲しい所ですね。

※追記
uname -m
コマンドにて i686 という答えが返ってきたため、i686 系の最後のバージョンである 2.80 も試してみたのですが…やっぱり同様のメモリエラーがおきました。 CPU も1コアは100%に張り付いており、恐らくコレがメモリ消費を無限ループさせていると思われます。
バージョンが変わっても症状が変わらないのなら、依存関係にあるライブラリの可能性もありますが… 64bit では起こらない現象なんですよねえ


  • 艦これ動く?

一応動きます。
てっきり 32Bit を切り捨てたと思っていたのですが、2期の HTML5 移行後は動くようになっていたのですね。
…とは言え、ごらんの通り、動作に4コアが90%前後稼働しているという有様で、動きもカクついています。明石休憩で20分おきにつつくくらいなら問題ないでしょうけど、コレでプレーするのはお勧めできません。
…1期の頃は momo7w でプレーできたんですけどねえ。

というわけで、Linux Mint 19.3 Mate 上のレポートでした。更なる軽量化を望むなら LMDE4 でしょうけど、面倒事が増える気が…さておき、これにて延命はできます。期限は LTS が終了する 2023 年までですがそんだけ使えば流石に十分かと。