2023年3月19日日曜日

マウス小噺

去年末まで Logicool MX400BK というマウスを使っていまして、確かロジクール初の青レーザーマウスで私がプログラマーをやっていた頃から使っていたから…
調べてみたら2006年販売!
17年近くも使っていました。最終的にはマウスポインタがブレるようになり、センサーにノイズが乗るようになったと判断した為買い直したのですが…。

  • 予算もあってエレコムのEPRIM M-Y9UB にしてみましたが…
廉価青レーザーマウスなのですが、なんと3か月で壊れました。症状はホイールが正しく動かない(飛んだり逆転する)というもの。
これはホイールの表面に埃が付いた後、ホイールを回転させると埃が中に巻き込まれ、巻き込まれた埃が回転検知センサーに絡む事で生じる症状。
分解してホイール軸に絡んだ埃を掃除すれば大抵治るのですが…
ラベルにある凹みはフェイクで、下の足の裏にある穴が本命。
…なのですが、簡単に分解させない為にわざわざY字ネジを使っています。まあ、ホームセンターでも数百円で売っていますが。
で、埃を取り払ったものの数日で同じ症状が起き、再度分解しても埃が見当たらない…
つまりセンサー内部に傷が入ったようですね。

小さな凹凸やホコリでもより正確に光が反射し、場所を選ばずに快適に使用できる~

という商品説明が最早ギャグです。
でも、ご安心ください、安定の日本クオリティーです。
…こんなのに名乗らせないで欲しいです、切実に。

  • で、家にあった RAZER NAGA CHROMA を使ってみる
…なんでそんなゲーミングマウスが在るんだと思ったのですが、以前ハードオフで衝動買いして忘れてました。
これは12ボタンマウスで、本来は現在使っている HAVIT MAGIC EAGLE が壊れた場合のバックアップとして用意したのですが…
HAVIT MAGIC EAGLE は現在販売されていませんが、当時最安値(約3000円)の12ボタンマウスだったのですが未だ壊れていません(購入したのは2018年5月)。
デバイスに関して言えば、現状日本製品は中国製に勝てません。どちらも中国の工場で作っているので単純に設計が悪い事になる訳で…凋落っぷりが酷いですね。

  • で、この RAZER のマウスですが、各ボタンは専用のソフトで設定します。
RAZER Synapse というソフトなのですが、コレ、400MB以上します。
いや、なんでマウスの設定するだけのソフトがそんな大きさになるのかと。イベントムービーでも入っているのかと。プレステのゲームがそのまま入る位大きいのですが。

又、マウス入力と入力結果の間にソフトウェアが挟まる為か稀にカーソルが数秒フリーズする事があります。
数時間使って1回程度ですがゲーミングとしては致命的な気がします。

そんなこんなで、設定し直して別のパソコンに接続してみた所…
アレ?反映されていない?
そう、HAVIT MAGIC EAGLE はプログラマブルマウスで、割り振った動作をマウス本体に保存している為、取り外して別のPCや Linux マシンに繋いでもそのまま使えるのですが、RAZER NAGA CHROMA は設定したPCのソフトの中に設定値が入っている為、別PCでは初期値で動作します。
一応、Linux でも使えるソフトはあるようですが、いちいち接続PC毎にソフトをインストールするのは面倒ですね(しかもデカいし)。

ゲーミングマウスを購入する際には「プログラマブル」であるかどうかを確認しようと思いました。

2023年3月13日月曜日

E2-3乙に到着しましたが…

…はい。
そりゃあ、こんなの誰でもキレるわ。
幸い乙では1/3くらいの確率で軽空母が1隻のパターンがありますが…1期の5-5みたいな確率ですね…。

では、順を追いまして

  • E2-1
出し惜しみをしてはならないという事だったので、通常なら最終海域で出撃させるようなメンバーを出しています。
駆逐艦は対地攻撃ができるメンバーをチョイス。
基地航空隊はCマスに集中。艦隊支援は道中支援のみとしました。

  • E2-2


最初、戦艦枠を榛名にしていたのですが、全艦が高速になってしまいルートを逸れてしまいました。
で、武蔵なのですが、3隻目です。
基地航空隊はHマスに集中。艦隊支援は道中支援のみとしました。
たしか、5戦5勝で終了だったはず。

  • E3ギミックあけ
現時点ではWikiのマップの基地航空隊の行動半径に誤記があったりします。
結局自力で攻略したような。

  • で、E2-3
御覧の通り、やまむさペア。
私が所持している2組目のペアです(1組目はカンスト)。
なんとE2だけで大和1隻武蔵2隻を投入したのですが…
開幕Mマス
後衛空母から飛んでくる、高命中、致命の6回攻撃。尚且つ倒す方法が無い。
初戦撤退なのでキラが直ぐに剥がれるし、毎回キラ付けするような提督は更に憤慨しているのではないでしょうか?
前述の通り、乙は軽空母が1隻のパターンもあるのでそれを待つのも手ですが、やまむさペアを運営しているので、無駄出撃が資源的に非常に痛い。
尚、大和型はこんな感じで少し無理してでも対空CIを出しています。
この組方でも主、副連撃は可能であり、尚且つ火力も180以上ある為、案外なんとかなります。
航巡も対空CIは可能ですが水戦を積まないと対空があぶないのでやっていません。

又、龍驤と瑞鳳は艦戦キャリアです。この為やたらに低いレベルの物を投入しています。

にしても…ひたすらMマスがデレるのを待つ以外どう攻略するんですかね…
秋月型の投入はボス戦を(火力不足で)危うくしそうですし…
先人たちの言う通り「援軍が来るまで待つ」が正解なんでしょうかね?

※3/17追記
とうとう自然回復墜ちしました。現在1/3ほどまでゲージを削りましたが…
乙でもゲージは6400ほどあり、3出撃に1回ほどのボス到達率に対して、ボスを倒す事はほぼ不可能で、平均与ダメージが600程。となるとラスダンまでに10到達、30出撃程が必要になるのですが…よしんば攻略できたとしてもその後がオール丁の可能性すら見えてきています。

2023年3月11日土曜日

E1甲攻略

…はい。
難易度は甲なので妥当…だと思います。
そもそも7日まではクオータリークエストやEO海域の突破をやっていてイベントに手を付けて居ません。
イベントを開始したのは9日からですが、開始時の資材がこんな感じ。
うん、無理では?

  • 攻略時の編成はこんな感じ
日向はラスダンのみに投入で、ラスダンは一発クリア。
ちょっともったいないかなと思いましたが、アニメを見る限り航空戦艦は扶桑姉妹の方が出し処がありそうなのでこのチョイスとなりました。
尚装備はこんな感じ。
はい、ヘリ母艦かな?
攻略中は重巡洋艦枠に青葉、海防艦枠に平戸を使っています。
E1のお約束である軽巡枠の那珂が居ないのですが、4スロないと電探を積む枠が取れない(索敵不足でルートが逸れる)為です。

  • 報酬

うーん、選択報酬は新規向けに用意したと思うのですが…
E1が攻略できるレベルの提督なら1-5を余裕でクリアできると思うのですよね。
で、1-5のボスは明石をドロップする訳ですよ。
…配るべきは艦艇修理施設では?
ステージクリア後に対潜装備配られても新規さんも困ったろうなという感想でした。

あと、クリア報酬の隼Ⅱ
12月のランカー報酬なので、これで2個め。コレの強化版が1月のランカー報酬でE2甲の突破報酬…同じランカー500位の報酬なのになぜゆえこんなに差が付いた。
※以前書いた通り、節分クエストのせいで1月のランカーの方が大変でしたが
E2甲に関しては方々言われているように理不尽…だそうです(後述)。

  • E1攻略について
大方の予想通り潜水艦と航空機でしこたま殴られるマップです。
こちらの空母は軽空母1隻以外許されていません。
で、無敵空母。
…いや、潜水艦マスと空襲マスが交互に来られてもプレー時間が長くなるだけなのは確かにその通りなんだが…プレー時間の短縮と消費資材の抑制はできたものの、キラが剝がれやすくなるデメリットも有り、なにより「敵だけ無敵でダメージを受けない」ってコンシューマの負けイベみたいな敵をソシャゲで出すのはどうなのさ。

もっともハマったのはE1-1のラスダンで、しかもボス手前のKマス。どういうわけか5連続撤退になりました。編成変わっていないハズなのになぜでしょうね。
E1はドロップが非常に渋く周回する意味がありません。又、ラスボスも1隻のみ潜水艦のため、攻撃を吸いやすく撃沈できないとボスだけダメージを受けてD敗北という現象が多発、ただでさえ渋いドロップが攻略中にボスドロップ無しを連発しています。
…まあ、出ても渋く、山汐丸未取得の提督以外は周回する意味がありませんし、未取得でも通常海域で限定ドロップが実装されるまで待った方が良いと思います。

…ただし…後段作戦と同時に実装されると目される時雨改三。こいつが実装されると恐らく同時にクエストを実装すると思うのですが、その際にE1の周回を要求しそうな気がするのですよね。
ただ、イベント海域を使ったクエスト実装は以前もやった事がありましたが、マップの難易度設定によってクエストの難易度まで変わるのでどの程度の物になるのか解りません。

  • 現状判っている事について
序盤で批判の多かった輸送ゲージを前半3マップで1ゲージのみにしたのは英断だとは思うのですが、間が持たないと思ったのか新規3隻の内2隻を掘り艦に充ててしまいました。
私は前イベで2隻(夏雲/マサチューセッツ)が取得できなかったのですが、よりにもよって異常な難易度と言われるE2のラスボスでのドロップとなっているため、これは取得どころか掘る事も考えていません。
又、現在ランキングが2桁前半ですが、新規艦を演習で見かけた事はありません。どころかイベント攻略している艦隊もまばらです。今回の突破率はどうなってしまうのでしょうか?

  • 今イベントは開始からグダグダでした
まあ、アニメに引っ張らられてスケジュールが大崩れしたのは解るのですが、告知が遅れまくったリアルイベントの翌日にゲームイベントを開始。
…リアルイベントでプロデューサーがゲームイベント内容を発表して、ゲームイベント開始…という流れは割と何処のゲームもやっている話なのですが、リアルイベントのスタッフがそのままゲームイベントの作業に入りましたと言う告知があったとの事。
…普通はゲームイベントは実装前に完成させて、プロデューサーがリアルイベントで事前告知、ゲームチームが実装するものでは?
職種が全く異なる作業をどうして同一スタッフがやってしまうのか?
ゲームイベントも2月後半実装→2月28日実装となり、結局は3月1日4時45分に実装されました。35回目のイベントで33回目の実装時間遅延となります。
それでも前半3マップのうち2マップしか実装できず3日に3マップ目を投入。更に米艦の特効入れ忘れ等も後日サイレント修正する等、混乱が続きます。当然調整などしているハズも無く、方々が阿鼻叫喚。本来ユーザーをなだめていた攻略サイトや、公式アンソロジーに寄稿していた作家さんたちですら苦言を呈する事態。

曰く、E2は支援艦隊が来るまで待て

一般に支援艦隊到着→1週間後、支援本隊到着→1週間後イベント終了の流れとなっています。E2~E6の全5マップを支援が来てからの2週間でクリアするのは現実的では無く、久しぶりのイベント突破率7割以下が既に見え始めています。

  • 後段予想
バナーの後付けが有りそう。と、読んでいます。
アニメが元ネタのハズなのに扶桑姉妹と最上が居ません。そしてあれだけ事前に実装していた夜戦対策が前段では特に活かせていません。
後段に西村艦隊による払暁戦を放り込む…と、思うのですが現在の悲惨な状況から考えると変えてくるかもしれません。E2で燃え尽きた提督方に対して後段にリスクの高い艦隊決戦をぶつけるとイベント離れが決定的になりますしね。
普通のゲームなら実装1週間前のタイミングでゲーム内容が変わる事は無いのですが、ここの運営は…そしていつも通り、デバッグも調整もしていないものが実装されるという流れでしょうね。

高速で10人のスケルトン拳士を鍛えてみる(インポートを容認した Kenshi 3)その1

以前トライしなかった事項を検証していくのですが…割と速度重視。
そして、今回はインポートを使いません。つまり、アイテムドゥープをしない方にも参考になるかもしれません。
というわけで、今回のスタートは…以前の前半、マップ中央のウェイステーションで6人で開始→シャークで一人目の仲間をゲット→北上してバーンの塔に来た所から。
バーン加入後、バーンの塔の中でお金になりそうなアイテムを物色。
この後、前回はインポートのやり直し続けてバーンの塔のアイテムを錬成、重量制限ギリギリまでアイテムを積んでいましたが、今回は行いません。
次に行くのは前回はワールドエンドでしたが、直接ブラックデザートに向かいます。
途中、遺跡に入って宝箱を開けて鍵開けの訓練をしていましたが、今回はこれも行いません。
後に気づいたのですが、バーンさんのピッキングレベルは2であり、ギリギリ虐待の塔の檻を開けられるためです。

  • ブラックデザートに到着
バーンの塔で入手したアイテム、初期メンバーが持っていた「くずばこ」以外のかばん、バーンの初期装備のスカート以外を売却。
そして当然サッドニールを加入。

  • ブラックデザートシティから南下して虐待の塔へ
突入するのは前述の理由からバーンさん。
例によって
1.アグヌの隣の檻に自分で走り込んで入る
2.まずは自分の檻の鍵を開ける
3.アグヌの檻をピッキングして解錠
4.アグヌが勝手に檻から出たら自分も檻から出る
5.一度アグヌと話して味方にする
6.走って脱出し、その他仲間と合流

※3/15追記
後に確認した所、コレはレアパターンであった事が判りました。
具体的には、アグヌの隣の檻の解錠レベルが30台であった場合は可能です。しかし、ここの8個ある檻の内30台になる檻はランダムで2個である為、やや分の悪い賭けです。
もしアグヌの隣の檻が40台だった場合は、一旦30台の檻に自分で入り、ピッキングをしてレベルを上げ、改めてアグヌの檻の隣に入り直しましょう。


虐待の塔を出たら例によってカワハギ盗賊の拠点へ
いつもの通り、キャットロンの世界に行く前の無料回復です

  • キャットロンの居城
例によって、キャットロンを取り囲んで暗殺上げ
※10人揃ってキャットロン初撃破は5日目の7:19でしたね。
全員の暗殺を大体86まで上げたら、ここからが本番です。
※なぜ86かというと、キャットロンの暗殺が可能になるレベルがおおよそこの辺りだからです

  • 北上してスプリングへ
スプリングのお店で忍者装束を購入。暗殺レベル1.1倍のバフがかかりまして…


暗殺86で1.1倍のバフがかかると幹部クラスでも結構行ける。

なんと、ティンフィストの気絶率が33%と表示されている!
前回リスクが高いから無理と書いていましたが…
ティンフィストがこの位置に立っている場合、目線が切れていれば暗殺可能です。
…討ち取ったり
※ティンフィスト撃破が5日目の19:52。
実際にはティンフィストを担いでスプリングの影響圏外に脱しないとスプリングは滅びませんが…スケルトン2大勢力を5日で滅ぼす事が可能なんですね。

まあ、必要なものはティンフィストのコートだけですし、コートを頂いたらそのまま犯罪がつかないように去りましょう。

ちなみに、ティンフィストの装備はスプリングの街で売ることができるため、ロンダリング可能です。

  • ブラックスクラッチへ向かうのですが…
なんと、道中に野良のクラブレイダーを発見。敵対もしていないので攻撃もしてきませんが、本来東の果てまで行かないと会えない相手、しかも二人です。
後ろに歩いている相手を暗殺。
カニズボンを強奪。ちなみにクラブレイダーは近接では最優秀に近いカニヘルメットを被っているのですが、これのおかげで非常に視界が狭いため相方が倒れても気づかなかったりします。
ここでカニズボンが手に入ると半日以上時間を短縮できますね。

  • ブラックスクラッチへ
途中に初心者におすすめの土地ガットがありますが(不要ゾーンでしたスイマセン)、あそこは大変危険なので、万全を期するならブリンクを経由してブラックスクラッチに行くべきかもしれません。
ブラックスクラッチでは周辺でリーバーをトレインしてブラックスクラッチの衛兵に倒してもらい、防刃ジャケットをうばうのですが…
ブラックスクラッチの住人そのものも、衛兵が忍者だったりで、割と有用な装備を持っています。
このため、各建物の2F等、フロアにあまり人数の居ない場所を狙い、一時停止を使ってフロア内に居る全員にいっぺんに暗殺を仕掛けます。
フロア内の全員がいっぺんに昏倒した場合、発見者無しで警報がなりません。そして装備を奪っても犯罪中が3秒のみなので、うばって3秒間発見者が居なければ完全犯罪成立です。
ここで全員分の忍者装束、又は暗殺者の衣が揃えばひとまず、格闘訓練用装備の装備は揃います。
※尚、ここで一番上等な暗殺者の衣を着ているのは反奴隷のボーの持っている熟練等級ですが…この防具はバフが本体なので無理する事は無いと思います。

格闘訓練用装備

バフ用
暗殺者の衣
装甲付きボロスカート(バーン初期装備)

デバフ用
防刃ジャケット
カニズボン

キャットロン用
ダスターコート
適当なズボン(ティンフィストのズボンか、元から履いている錆びた侍袴。)

尚、適宜スプリング及びブラックスクラッチで盗賊かばんを買い足します

  • いざ、再びキャットロンへ?
キャットロンを殴って格闘を上げる準備が整ったので行ってみて…アレ?
そう、キャットロンの暗殺訓練後、装備を奪って売り払ったのですが、再会したら裸になっていました。
気になってティンフィストの所に行ってみたら同様に…
一般にNPCは街の勢力圏外まで移動するとデータがリロードされるのですが、ユニークキャラははメイトウだけでなく防具まで一度失うとインポートまで復活しないようです。
※ただ、稀に数日たったら再生したという話も聞くので日数が影響するかもしれませんが

…まあ、私の場合はインポートするのですが、インポートをしない(ドゥープをしない)場合は、キャットロンを取り囲んで全員の暗殺レベルを86に上げた後に

1.キャットロンの防具だけを奪う
2.最初にブラックスクラッチに行き、全員分の忍者、及び暗殺者の衣を住人から奪いつつ、近所のリーバーから防刃ジャケットを奪う
3.道中でクラブレイダーに会えなかった場合は、東のクラブ村に行ってカニズボンを奪ってくる
4.帰りにスプリングに寄り、ティンフィストを暗殺してダスターコートを奪う(暗殺86時に暗殺者の衣を装備した場合、ティンフィストに対する成功率は77%前後になります)
5.再度キャットロンに相対する→キャットロンを気絶させて用意した装備に着せ替えて訓練開始

という流れがベストかと思います。

ちなみにインポートを容認する場合は、キャットロンを瀕死にするまで格闘訓練をする→装備を奪う、スプリングに行く→キャットロンの装備を売って、ティンフィストからコートを奪ってインポート、再度キャットロンの居城に行き…のループで強化していきます。


2023年2月23日木曜日

10万遠征成功達成

 99999…

10万!

1年に1万回ですかい…1日平均27回とか言う恐ろしい数字が出てくるのですが…。
それと、10年で失敗が259回ってのも地味にすごい数字ですね。ちなみに演習219敗は主に1年目に敗北必至で演習していた為です…現在でも稀に1日に2、3敗する事があるのですが。
さて、現在の資材はこんな感じであり、どう見ても来週からイベントを始める状況ではありません。

  • むりやり手に入れた最上瑞雲ですが…
コレは辛かったですね。あらかじめ★1の瑞雲改二を持っていたとはいえ、その後にネジ40個と瑞雲13個が必要になります。
ただ、この夜戦瑞雲、確かに最上に載せるとパラメータ上強いのですが、機数が少なすぎるので、本領を発揮するのは大和改二重ではないかと思います。
又、近年やたらと夜戦を推すので恐らく大規模な払暁戦イベントを仕掛けてくるのではないかと予想しています。
アニメで言ったら3話までの話であり、ゲームなら1期最後のレイテ前編(2017年秋イベ)の最終マップ辺りで過去にやっていました。

夜戦になるならばと、瑞鳳改二乙の量産や赤加賀の増産をした為資材が尽きています。
現在の運営の更新速度から考えると、まだ見ぬ新艦や改二の為に資材を貯めこむよりも、現有戦力でラストスパートをかける時と判断しています。

  • 次のイベントの新艦は恐らく夕暮と…
多分、コレのモチーフ元。陸軍娘は毎度絵師が変わるので誰が担当かは解りませんが特設空母…うーん低速軽空母ですら戦力として微妙なんですが…
実態としては、クエストに実装する度に苦情が出る6-4右回りの特化空母なんじゃないかな?という気がします。

2023年2月20日月曜日

買い物小話

 以前「アッシュアームズはキャラは良いからゲームは再開しないけど書籍が出たら買う」とか書いていましたが、出てたんですね…。BOOTH で出品されている上に届くまで2ヶ月もかかる事から中国で作って船便なんでしょうけど、ひとまず予約しました。

  • トライポッドワークスのC109Sに続いて、何年か前に買った MacBookAir のパチモノのバッテリーが案の定壊れまして
寝床で使えるPCがなくなりました(流石に13インチオーバーのノートはでかいし、中華パッド系はキーボードが…)。そこで、あきばおーで売っている7インチモニタと小型キーボードを購入、以前組んだエプソンエンデバー2台をKVMに繋いだ物と接続して使うことに。
で、それ自体はなんとか動いたのですが(流石に Atom270 の方はかなり厳しい)ふと、この7インチモニターには HDMI コネクタがついているなと。
…ついているということは、スティックPCを接続すれば一体型PCになるのでは…
…と、思ったのですが、結局タッチできない中華パッドになると気づいて正気に戻りました。稼働できる中華パッドを3台以上も持っていて考える事じゃないですね。
クロームキャストとつないで、小型ドンキTV(所謂NHKの映らないTV)として使用するという手もあるかもしれませんが。

  • 最近SSDの値段が落ちてきていまして
1TBも1万円を切っています。私は15年ほど前にキューブPCで Win2000 を使っていたのですが、そのときに最後に1TBのHDDに換装してしまったのですよね。
おかげで移植ができなかったのですが、やっとSSDに移植できます。
ついでに、休眠中のMACにでも入れてみますか…CoreDuo と PentiumM のどちらが早いのか見当が付きませんが。
中に入っているゲームが遊べるかぐらいしか興味がないので、いっそ3世代 Core i5 の∪型が乗っている、レッツノートに移植するのも手かもしれません。
おそらく、2000 年代初頭の AGP 接続ビデオボードの性能くらいなら iGPU で超えるのではないでしょうか?

  • 不調の Yoga260 ですが
昨年末にメモリを変えても結局不調だった Yoga260 なのですが、それならマザーボードを交換してみたらどうだろう?と考えた訳ですよ。
アリババで調べた所、Corei7 でメモリがオンボードで8GB乗っている物が売られていました。コレならば i5 からコア数が倍になる上に、メモリもデュアルチャンネルにできそうです。
…が、良く調べたら、現在中古市場に Yoga380 や Yoga720 等の上位機種がかなりの安値で流れているのですよね。アリババだと当然中国からの船便で2ヶ月待ちになりますし、これは流石に要らないかもしれません。

2023年2月7日火曜日

Python+Kivy 備忘録 BMPファイルを読んでみる編

はい、前回テキストを読みましたが、今回はBMPファイルです。
といっても処理を簡単にしたかったので、24ビットBMPファイルしか読めません。

## load_bmp ##

from kivy.app import App
from kivy.uix.widget import Widget

from kivy.graphics import Color, Ellipse, Line, Rectangle
from kivy.core.window import Window

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.factory import Factory
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup

import os
from os.path import join,isdir
import uuid
from datetime import datetime

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

from kivy.clock import Clock

Window.clearcolor = (0,0,0,0)

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 RGB():
    def __init__(self,r,g,b):
        self.r = r
        self.g = g
        self.b = b
        
class Output(BoxLayout):
    def __init__(self,path,**kwargs):
        super(Output,self).__init__(**kwargs)

        outputtext = path
        header = []
        
        self.map_width = 0
        self.map_height = 0
        self.bitmap:RGB = []

        self.list_la =[]
        self.list_rc =[]

        while True :
            if not os.path.exists(path):
                break
            outputtext = "exists"
            
            size = os.path.getsize(path)
            if size < 54:
                outputtext = "header not found"
                break
                
                
            with open(path,'rb') as f: 
                while True :
                    header = f.read(54)
                    
                    if not ((header[0]==66)&(header[1]==77)):
                        outputtext = "this file is not bmp"
                        break
                    
                    filesize = int(header[2]+(header[3]<<8)+(header[4]<<16)+(header[5]<<24))
                    headersize = int(header[10]+(header[11]<<8)+(header[12]<<16)+(header[13]<<24))
                    colorbit = int(header[28]+(header[29]<<8))
                    w = int(header[18]+(header[19]<<8)+(header[20]<<16)+(header[21]<<24))
                    h = int(header[22]+(header[23]<<8)+(header[24]<<16)+(header[25]<<24))
                    
                    if headersize != 54:
                        outputtext = "this format not surpported"
                        break
                        
                    if colorbit != 24:
                        outputtext = "24 bit color only"
                        break
                        
                    ### read bitmap ###
                    hsize = int((filesize - headersize)/h)
                    d = f.read(filesize - headersize)
                    
                    for y in range(h):
                        for x in range(w):
                            idx = hsize * y + x * 3
                            self.bitmap.append(RGB(b = int(d[idx+0]),g = int(d[idx+1]),r = int(d[idx+2])))
                            
                    outputtext ="colorbit:"+str(colorbit)+"width:"+str(w)+"/height:"+str(h)
                    self.map_width = w
                    self.map_height = h

                    break
            break
        print(outputtext)
        self.text = outputtext

    def Draw(self):
        if not self.bitmap:
            return
            
        with self.canvas.before:
            # clear all rectangle
            for old in self.list_rc:
                self.canvas.before.children.remove(old)
            self.list_rc.clear()
            
            # clear all label
            for old in self.list_la:
                self.canvas.before.children.remove(old.canvas)
            self.list_la.clear()
            
            w = self.size[0]/self.map_width
            h = self.size[1]/self.map_height
            idx = 0
            for y in range(int(self.map_height)):
                for x in range(int(self.map_width)):
                    Color(self.bitmap[idx].r/255,self.bitmap[idx].g/255,self.bitmap[idx].b/255)
                    idx = idx+1
                    self.list_rc.append(Rectangle(pos=(self.right-self.size[0]+x*w,self.top-self.size[1]+y*h),size=(w,h)))

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=['*.bmp']
        self.mode = -1 # setup

        Clock.schedule_interval(self.update, 1.0/3.0)

    def update(self,dt):
        if self.mode == 0: # Base Mode
            self.main_disp.Draw()
            return
        
    def DrawBase(self):
        self.clear_widgets()
        self.orientation='vertical'
        
        self.main_disp =Output(path=self.parent.lFile.text,size_hint_y=4)
        b1 =BtnChangeSelectFile(text='SelectFile',size_hint_y=1)
        self.add_widget(self.main_disp)
        self.add_widget(b1)
        
        self.mode = 0 # Base
        
    def DrawSelectFile(self):
        self.clear_widgets()
        self.orientation='vertical'

        b2=BtnSelectFile(text='SelectFile',size_hint_y=1)
        b3=BtnChangeBase(text='QUIT',size_hint_y=1)
        
        self.add_widget(self.fc)
        self.add_widget(b2)
        self.add_widget(b3)
        
        self.mode = 1 # Select

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 LoadBmpApp(App):
    def build(self):
        layout = Display()
        return layout

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

※毎度の事ですが、一部字を小さくしているので、コードはコピペして読む事を推奨します

  • キモは BoxLayout 派生クラスの Output クラス
解説するとしたらイニシャライズで行っている、BMPファイルの読み込みと Draw 関数でしょうか。
そこまで怪しい処理は組んでいないと思いますが、いくつか注意点を連ねます。

  •  hsize という変数はビットマップの横一列分のデータサイズです
ビットマップは横一列のデータサイズが4バイト区切りで無いといけないというルールがあります。しかし、24ビット=3バイトで1ドットを表現している都合上、画像サイズによっては4で割り切れない場合があります。
この場合、末端に穴埋め用のデータを詰めて4バイトで割れるように整えます(パディングとか言います)。
が、この計算が面倒だったので、単純に画像データサイズ(ファイルサイズ-ヘッダーサイズ)をビットマップの縦のドット数で割って求めています。

  • 各ドットの色の順
一般的に光の三原色はRGBと並べますが、ファイルにはBGRの順に並んで格納されているので取り出す際に注意が必要です。

  • 描画は1秒間に3回行っている
Output クラスの Draw メソッドは親の SubDisplay クラスから1/3秒ごとに呼ばれる事になっています。
これは add_widget 直後ではサイズが定かではない為、正しく描画ができなかった為です。

…で、動かしてみたのですが…
…動く…けど、無茶苦茶重い。
32x32ドットの画を1024個の Rectangle で秒間3回描画しているだけなのに異常に重い。
コレはなにかしらやらかしている予感がしますね。
本当は次はテクスチャフォーマットの読み込みをやりたかったのですが、改良編になりそうです。