2023年1月30日月曜日

Python+Kivy 備忘録 テキストファイルを読んでみる編

…いや、ソレ基本中の基本だろ?
fopen でパパっと…では無くて、GUIベースです。
なぜゆえこんなものを作ったかと申しますと、以前途中まで作って投げ出していたプログラムがありまして、いきなり難しい所から初めても続かないというのと、リハビリも兼ねて簡単な所から…
と、思ったんですが意外と面倒でしたね、ハイ。

## load_text ##

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput

from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup

import os
from os.path import join,isdir

from kivy.uix.filechooser import FileChooserIconView
from kivy.uix.filechooser import FileChooserListView

class BtnChangeSelectFile(Button):
    def on_release(self):
        self.parent.DrawSelectFile()
        
class BtnSelectFile(Button):
    def on_release(self):
        self.parent.parent.lFile.text='\n'.join(self.parent.fc.selection)
        self.parent.DrawBase()
        
class BtnChangeBase(Button):
    def on_release(self):
        self.parent.DrawBase()
    
class SubDisplay(BoxLayout):
    def __init__(self,**kwargs):
        super(SubDisplay,self).__init__(**kwargs)
        self.fc=FileChooserListView()
        #self.fc=FileChooserIconView()
        self.fc.size_hint_y=7
        self.fc.filters=['*.txt']
        
    def DrawBase(self):
        self.clear_widgets()
        self.orientation='vertical'
        
        outputtext = self.parent.lFile.text
        if os.path.exists(self.parent.lFile.text):
            outputtext = "exists"
            with open(self.parent.lFile.text,'r') as f:
                outputtext = f.read()
                
        t1 =TextInput(text=outputtext,size_hint_y=4,multiline=True)
        b1 =BtnChangeSelectFile(text='SelectFile',size_hint_y=1)
        self.add_widget(t1)
        self.add_widget(b1)
        
    def DrawSelectFile(self):
        self.clear_widgets()
        self.orientation='vertical'

        b1=BtnSelectFile(text='SelectFile',size_hint_y=1)
        b2=BtnChangeBase(text='QUIT',size_hint_y=1)
        
        self.add_widget(self.fc)
        self.add_widget(b1)
        self.add_widget(b2)

class Display(BoxLayout):
    orientation='vertical'
    def __init__(self,**kwargs):
        super(Display,self).__init__(**kwargs)
        self.lFile = Label(text='No Selected',size_hint_y=1)
        self.boxSub = SubDisplay(size_hint_y=8)
        self.add_widget(self.lFile)
        self.add_widget(self.boxSub)
        self.boxSub.DrawBase()
        
class LoadTextApp(App):
    def build(self):
        layout = Display()
        return layout

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


この画面で SelectFile を押すとファイル選択画面に移行

この画面でテキストファイルを選択しつつ SelectFile を押すと前画面に戻りつつ、テキストファイルを読み込めた場合、中央に表示。
QUIT を選択した場合は何もせずに前画面に戻る。

既知のバグとして

複数のファイルを同時に選ぶと不安定
ファイル選択画面に入りきらないファイル/ディレクトリがあると選択できない

等がありますが、今後改善するかは不透明です。

今後はこのプログラムをベースになんかしら作ろうと思います。

2023年1月23日月曜日

新海域が実装されましたが…

  • コレ、イベント序盤海域ですよね。
事実上戦艦、空母を出禁にした上で対空、対潜、対地、PT対策を同時に行えとかいう悪意の塊です。というか、現状は矢矧と最上のごり押しですね。
特に第二ゲージが運任せ(数少ない対地装備をした艦の攻撃がボスに当たるのを祈るだけ)すぎる…

  • マンスリー節分任務まで終わらせましたが…
こんなものを毎週/2か月連続攻略しろとかいうクエストも大概ですが。
なぜか戦果にも絡むので既視感があるなと思ったら、1年前も同じことをやっていて、12月にクオータリーランカーやっていて良かったって書いていました。本当にココの運営はなにも学習していないんですね。

アニメは一応3月で終わる事になっていて、その前後でイベント実装だと思われますが…
6月の10周年以降はどうなるんでしょうね。

2023年1月21日土曜日

死後に見るハズだった光景

  • 昨年末に結膜嚢胞という病気を患いまして。
病気…というか症状と言うか、良性腫瘍の一種で実害は無いのですよ。
眼球の周りに結膜という膜がありまして、その外側に目を湿らせる細胞があるのですが、これが眼球と結膜の間に入り込む症状です。
すると膜の中で湿り気を出す為、結膜が水膨れ状態になりまして、見た目白目に水ぶくれができるという、かなりショッキングな画ずらになります。

  • で、目の検査の為に瞳孔を開く薬を点眼したんですがね。
いやあ、光を見ると真っ白。
点眼直後は首の後ろが凝るような、軽い頭痛がしました。今思えばアレは違和感を脳で処理しきれなかったんだと思いますが。
で、4~5時間薬が切れないとは聞いていましたが、光をみるととにかく真っ白になってしまう。
何年か前にお袋が白内障の手術を受けているのですが、手術前は光を見ると景色が真っ白になってしまうと言っていましたがこんな感じだったのかもしれません。
確かに見えているのですが、違和感が酷く、おそらく目から入る情報と合致しないせいか耳の聴こえも悪くなるんですよね。
なんなら目を閉じた方が聴きとれるくらい。

死ぬまでに体験する事があったとは…ちなみに昔、部活でやらかして呼吸が止まって人工呼吸(所謂カツ入れ)で蘇生した事があるので呼吸停止は経験した事が有ります。
そのうち死に慣れるんじゃなかろうか。

ちなみに、この症状、通常は数時間から2日以下で治るのですが、私の場合は1ヶ月以上続いていて

1.針で穴を空ける(やたらに再発率が高い)
2.放置(稀に治る)
3.切除手術(根治)

があるのですが、医者がやたらと手術を避けるんですよねえ。専門家が避けるなら従わざるを得ないのですが、術を受けるかどうかを患者に任せるとか言われましてもね…
来月針でさして、経過観察する事になりましたが、微妙に面倒な事になりました。

※4/1追記
この後、2週間後に一気に腫れたと思ったら破裂しまして、そのまましぼんで自然治癒しました。発症からは約1.5ヶ月。こういう事があるから手術を避けたんでしょうね。
結局、針を刺す事も手術をする事もありませんでした。
流石に、医者的にも確証の無い事は言えないけど…という状況だったのではないかと思います。これからは病気も増える歳なので、医者を察する力が必要になってくるのかもしれません。

2023年1月16日月曜日

続続 Linux Mint で python3-kivy + buildozer 環境を作ってみた

 書く度に自分の無知を晒す事になるのでやめときゃいいのに又書く訳で…
※というか、グーグルで検索して当ページが上位に引っかかるのがコワイですね…ハイ。

先日、 Linux Mint21.1 環境になった事に伴い、開発環境も移したのですが、微妙にひっかかったので備忘録をば。

  • vs Kivy
普通に geany と kivy を Mint のソフトウェアマネージャーからインストールして起動すると…動きません。

私の場合は

AttributeError: module 'collections' has no attribute 'Callable'

というエラーが出ました。
これは Python のバージョンが上がった為に出るエラーで、3.10 未満では許されていた記述がアウト判定になった為に起こる物だそうです。
Mint 標準でインストールされる Kivy は Kivy1 系ですので、一旦アンインストールして、手動で Kivy2 系をインストールすれば治ります…
Linux Mint は安定板のソフトのみを採用するディストリビューションなのですが、動かない安定板とは一体…。

あと Python ってバージョンが上がる度に動かなくなるソースがでますね…なんというか、もうちょっと未来の事を考えてから実装して欲しいと言うか…
とりあえず実装しとけ、ダメだったら変えれば良いだろ
ってノリで言語を作られると、保守する側は大変なんですが…いや、保守屋さん的には良い飯のタネなんですかね?趣味人的には勘弁願いたいのですが。

  • vs Buildozer
直リンして良いのか判らないので書かないのですが、Buildozer 公式の Installation ページに書いてある通りのスクリプトを上からターミナルに流すだけでインストールはできるハズです。
ちなみに前々回間違えていましたが、今回私は

export PATH=$PATH:~/.local/bin/

の記述を

/etc/profile

末端に追記しました。

又、以前 openjdk-17 が入らないけど、 openjdk-11 でも動いた~と書いたのですが、公式に17がなければ11までのバージョンは許容すると書かれていますね。
私が見落としていたのか、その後に追記されたのか。
…ちなみにコレは当時フランス語(?)で記述されたサイトで観た内容なので…フランスニキだかネキだかがツッコんだのかもしれませんね。

2023年1月12日木曜日

地味に初カンスト

まさか10年かかるとは。
今後は溢れないように使ってプレーする方向ですかねえ…いや、イベントがあれば一気に放出するのですが、他の基礎資材の不足っぷりから考えると次も低難易度なのでバケツは減らないでしょうね。

次なる目標はケッコン200隻でしょうかね、ちなみに現在178隻です。
他では家具を全て買い占めるというのが有ったのですが、一回だけ達成した事があります。
12月は3群ランカーだったようですが、今後もランカーを取るかは不透明…人口減っているので、普通にプレーできていれば3か月毎にランカーを取る事自体は難しくないのですが…

2023年1月10日火曜日

SurfaceBook 初代で dGPU を使ってみた

悲願達成…なのですが。
はい、ごらんの通り LMDE5 の文字がありません。
昨年の8月に Nvidia がドライバーソースをオープンにして初の Ubuntu である 22.04.1 が11月に出まして、その後12月20日に Ubuntu ベースの Linux Mint 21.1 が出た訳です。
で、LMDE5 もろともアップデートが来たわけですが…。

…なんとアップデートした所、LMDE5 であれだけ苦労してインストールした Nvidia ドライバーが吹っ飛びました。(どうもカーネルアップデートで飛ぶらしい)
入れ直す為、最新の NVIDIA-Linux-x86_64-525.78.01.run をインストールしようと試みましたが、どうしてもエラーが出る為インストールは無理でした…。

が、しかし、Nvidia は Ubuntu 相手には手厚いサポートをしています…という事は…。

そんな訳で、Linux Mint 21.1 Mate にインストールしていきます。
…素直に Ubuntu にしろとか言うのは禁止です。

この後に書いていく内容はよそ様に書かれていた内容のほぼベタコピーです。本来必要があるのか…という話ですが個人用の備忘録なのでご容赦を。

  • 1.linux-surface 導入
linux-surface の GitHub に linux-image-6.1.3-surface_6.1.3-surface-1_amd64.deb 等のファイルが有りますが、コレを使ってインストールするとスクリーンタッチセンサのドライバ等が入らなかったのでコマンドラインでインストールして行きます。

$ sudo wget -qO - https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/linux-surface.gpg
$ echo "deb [arch=amd64] https://pkg.surfacelinux.com/debian release main" | sudo tee /etc/apt/sources.list.d/linux-surface.list
$ sudo apt update
$ sudo apt install linux-image-surface linux-headers-surface iptsd libwacom-surface
$ sudo systemctl enable iptsd
$ sudo update-grub

正味の話、私も良く解っていないのですが、要するに専用ドライバの入ったカーネルをインストールした上で grub を設定し直したようです。
この時点で再起動して

1.スクリーンをタッチしてカーソルが動く
2.uname -a コマンドでカーネルが変わっている

以上が確認できれば第一関門突破


  • 2.MX940 を認識させる
/usr/local/bin/dgpu.sh 作成

内容は以下の通り

#!/bin/sh

echo 1 | tee /sys/bus/platform/devices/MSHW0041:00/dgpu_power
echo 1 > /sys/bus/pci/rescan
setpci -H1 -s 01:00.0 6a.b=81
setpci -H1 -s 01:00.0 4.w=0407
echo 1 > /sys/bus/pci/rescan
setpci -s 01:00.0 4.w
setpci -s 01:00.0 6a.b

作ったら実行可能属性にしておく


/etc/systemd/system/dgpu.service 作成

内容は以下の通り

[Unit]
Description=Nvidia GPU initialization
Before=display-manager.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/dgpu.sh
ExecStartPre=/bin/sleep 10

[Install]
WantedBy=multi-user.target


起動時に認識用スクリプトを読み込ませるサービスを作ったので、サービスの登録を行う

$ systemctl daemon-reload
$ systemctl start dgpu.service
$ systemctl enable dgpu.service

再起動後 lspci で MX940 が認識されているかを確認


  • 3.grub の起動設定を追加
/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT 項目を

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nouveau.modeset=0 pci=realloc nvidia-drm.modeset=1 pcie_port_pm=off pcie_aspm=off"

へ変更


  • 4.カーネルに nouveau 等が混入しないように塞ぐ
実は見た限り Linux Mint 21.1 には nouveau が入っていなかったようなのですが念のため…

/etc/modprobe.d/blacklist.conf
ファイルの末尾に

blacklist nouveau
blacklist nvidiafb

と追記

$ sudo update-initramfs -u

で反映


  • 5.ドライバー導入
ドライバーマネージャーを起動する
…今までの苦労はなんだったのかと。
Ubuntu 系にプレインストールされているアプリなのですが…なんというか、コレは…。
インストール後、再起動して

$ nvidia-smi

が起動するかを確認。

  • 6.起動実験をしてみる
以前、盛大に勘違いしていたのですが、GPU を使用して起動したいソフト xxxx があった場合、コマンドラインで

$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia xxxx

と呼び出すのが正解なようです。
で、さっそく Blender を呼び出してみた結果がこちら
相変わらず Persistence-M が OFF と表示されていますが…
Processes 欄に Blender が入り、432MB の VRAM を使っています。又、GPU 温度も51度と表示されているので駆動はしているようです。

  • 7.解像度を下げる
まあ、このままでも良いのですが、Blender を起動しただけで 1GB しかない VRAM の4割強を持っていかれては直ぐに作業ができなくなるのは明白です。
なぜこんなにVRAMをドカ食いするのかと言えば解像度が高すぎるからなんですね…
なんと3000x2000もあるのですよ。私のメインのデスクトップ1920x1080なんですが…。
という訳で、1/4の解像度である1500x1000にしてみます。

/etc/profile
末端に

xrandr --newmode "1504x1000_60.00"  124.25  1504 1600 1752 2000  1000 1003 1013 1038 -hsync +vsyn
xrandr --addmode eDP-1 1504x1000_60.00
xrandr --output eDP-1 --mode 1504x1000_60.00

を追加

…なんだか150x1000という謎の4ドットが付いた解像度になっていますが…
これは解像度を追加する際に調査するコマンドの cvt で

$ cvt 1500 1000

と打った返り値がこうだったので仕方が無いデス。
ちなみにデフォルトでは cvt はインストールされていないので xcvt をインストールする必要がありますし、上記の値は私個人の環境なのでコレを参考にする方は自分でも cvt コマンドを打って正確な値を求めてください。

さて、改めて1504x1000の解像度で実行してみると…
はい、VRAMの使用量が減っていますね。
若干画面がぼんやりしてしまうのが難ですがひとまずコレで使っていける環境が整いました。


  • で、実際使ってみてどうよ?
正直に言えば、GPUの有無で実感できるほどの差は今の所無いです。むしろ、一瞬画面が灰色になったりと dGPU を使った時の方が動作は不安定です。
まあ、それでもフルパワーには違いが無いのでひとまずこれにて一区切りとしたいと思います。