そらとぶけもの

こわくないよ

GUIアプリケーション作るフレームワークを調べる

この記事はくまが書いています。

ただのメモです。

最近はWebアプリが主流で、時点がスマホのアプリという印象があり、Windowsのデスクトップで動くソフトとか下火になってきてるようなきがします。とはいえ、ファイル操作とかPCローカルでやりたい作業はいまだに多く、最近だったらつよつよグラボを使ってゲームとか、AIでの画像生成とか、動画作成とか、それなりにWindowsPCで遊びのためにGUIアプリケーションを使う機会もないわけじゃないですね。ちょっとした自分用の便利ツールをGUIで作ろうと思ったとき、どんなフレームワークがあるんだろうと思ったので軽く調べてみました。

Electron

GitHub 作成のGUI作成フレームワークですね。言語はJavaScriptとHTML(CSS)。Nodejsの知識があればGUIアプリケーションが作れるのは大きいです。ただ、ブラウザのエンジンを同梱するのでファイルサイズが肥大化しがち、あとやはりネイティブに比べればどうしても動作が遅いといわれたりしてますね。

Qt

Qtも歴史の古いGUIフレームワークですね。言語はC++。言語自体に馴染みがあれば普通に使えると思いますが、いきなりC++はけっこうハードルが高そうですね。

WPF

MS謹製のフレームワークです。言語はC#。個人的には仕事でずっと使ってきたこともあり、ぼく自身は一番簡単にアプリが作れますが、じゃあ知らない人が一から勉強するのに進めるかと言えばちょっとおすすめしづらいです。まず環境つくるのがめんどくさい(実際はそんなにめんどくさいわけじゃないんですが、知見がないとハマりがち)。やりたいのはプログラムを作ることであって環境構築じゃないですからね。

JavaFx

言語はJavaです。Javaは業務系の言語やってる人なら使える人も多いので選択肢に入りそうですね。

Tkinter, PySimpleGUI, PyQt, wxPython, Kivy

Pythonは標準でもTkinterというフレームワークが入っているようです。ほかにもwxPythonとかKivyとかPySimpleGUIとかQtをPythonから扱えるようにしたPyQtもあり乱立してますね。Python自体は馴染みのあるひともおおいでしょうからそれはメリットですね。ただこんなに乱立してると選んだ技術が廃れてしまいそうなのが怖いです。

【備忘録】Minecraft(BE)のScript API

この記事はつばさが書いています。

公式ドキュメントを参考にマイクラのアドオンを作成したので備忘録を書く。

learn.microsoft.com

ビヘイビアパックのファイル構造

tbkm_BP
   |-scripts
   |     |-main.js
   |-manifest.json
   |-pack_icon.png

manifest.jsonの書き方

{
    "format_version": 2,
    "header": {
        "description": "§l§3つばくまのアドオン",
        "name": "つばくまあどおん",
        "uuid": "74770947-328e-4430-ae74-61b93de960dd",
        "version": [1, 0, 0],
        "min_engine_version": [ 1, 19, 0 ]
    },
    "modules": [
        {
            "description": "script",
            "type": "script",
            "language": "javascript",
            "uuid": "803dbda5-dce0-4617-a6ac-7ba1c6c004d9",
            "version": [1, 0, 0],
            "entry": "scripts/main.js"
        },
        {
          "description": "dummy",
          "type": "data",
          "uuid": "211e5691-771f-42a6-9365-a3e85c921374",
          "version": [1, 0, 0]
      }
    ],
    "dependencies": [
      {
        "module_name": "@minecraft/server",
        "version": "1.1.0-beta"
      },
      {
        "module_name": "@minecraft/server-ui",
        "version": "1.0.0-beta"
      }
    ]
}
mainfest.jsonは、description,name,uuidだけ変えればまあ大丈夫です。

dependenciesの中身は、apiを使うためのものなので使うapiに応じて変更する必要があります。

minecraft/server-admin Module | Microsoft Learn

↑必要なapiのページに情報があるのでちゃんと見てください。

それ以外の場所を変える必要はほぼないです。

main.jsの書き方

チャットでテスト

import * as server  from "@minecraft/server";
server.world.events.beforeChat.subscribe(ev => {
    ev.message = "§l§3" + ev.message;
});

解説
server.world.events.beforeChat.subscribe()

チャットが送信されたときに発火する関数。BeforeChatEventがコールバック関数の引数に入ります。

ev.message = "§l§3" + ev.message;
§l§3をメッセージの先頭につけることで、メッセージが緑色の太字になります。

§(セクション記号)と、特定の英数字を組み合わせることで文字をカスタマイズできるマイクラの仕様です。

バニラのワールドでも看板やチャットで使えるので調べて試してみてください。

↓参考にした動画↓(はっち&ぽっちーチャンネル様)

※少し前の動画なので書き方がところどころ違います。 www.youtube.com

uiの作り方

import * as server  from "@minecraft/server";
import * as ui from "@minecraft/server-ui";

function menu_00(player) { const form = new ui.ActionFormData(); form.title("タイトル"); form.body("もじ"); form.button("ボタン1"); form.button("ボタン2","textures/blocks/command_block"); form.show(player).then(response => { let selectButton = response.selection; if(selectButton === 0) menu_01(player); else if(selectButton === 1) menu_02(player); }); };

function menu_01(player) { const form = new ui.ModalFormData(); form.title("タイトル"); form.textField("テキストフィールド","ここに入力してください。","初期値"); form.dropdown("ドロップダウン",["要素1","要素2","要素3","要素4"],0); form.slider("スライダー",0,100,1,0); form.toggle("トグル",false); form.show(player).then(response => { player.runCommandAsync('say ${response.formValues[0]}');//※シングルクォートになっているので、コピペする場合はバッククォートに直してください。 }); }); };

server.world.events.beforeItemUse.subscribe(ev => { if(ev.item.typeId === rulerstone_id)ruler_menu(ev.source); });

解説
server.world.events.beforeItemUse.subscrib()

アイテムを右クリックすると発火する関数。 BeforeItemUseEventがコールバック関数の引数に入ります。

function menu_00(player) {
    const form = new ui.ActionFormData();
    form.title("タイトル");
    form.body("もじ");
    form.button("ボタン1");
    form.button("ボタン2","textures/blocks/command_block");
    form.show(player).then(response => {
        let selectButton = response.selection;
        if(selectButton === 0) menu_01(player);
        else if(selectButton === 1) menu_02(player);
    });
};
ActionFormDataはボタンと文字のみのフォームです。

メソッドでボタン、文字を追加します。

ボタンの第二引数には、ボタンの横に表示するテクスチャを設定することができます。これはなくても大丈夫です。

テクスチャのパスがわからない場合は、公式のサンプルを参考にしてください。 適当なバージョンを探してAssetsを開いてSource code(zip)ダウンロード。ダウンロードしたzipを回答して開くとresource_packがあるのでちゃんと確認することをお勧めします。

showで表示、thenで押されたボタンの処理などをかけます。

response.selectionで何番目のボタンが押されたかわかります。※0から始まるので注意。

function menu_01(player) {
    const form = new ui.ModalFormData();
    form.title("タイトル");
    form.textField("テキストフィールド","ここに入力してください。","初期値");
    form.dropdown("ドロップダウン",["要素1","要素2","要素3","要素4"],0);
    form.slider("スライダー",0,100,1,0);
    form.toggle("トグル",false);
    form.show(player).then(response => {
            player.runCommandAsync('say ${response.formValues[0]}'); //※シングルクォートになっているので、コピペする場合はバッククォートに直してください。
        });
    });
};
ModalFormDataは、テキストフィールド、ドロップダウン、スライダー、トグルのみのフォームです。

上のサンプルコードを見てもわからない場合は公式ドキュメントを参照してください。((めんどくさいので💦

response.formValuesにフォームの上から順番に結果が入っています。※resonse.formValuesは配列です。

MessageFormDataは、使用したことがないので省きます。

【くまいくらにっき】キノコの島バイオームにいく

この記事はくまが書いてます。

ムーシュルームという牛がいることを知らなくて、このワールドでそいつが見つかるキノコの島がどこにあるかをつばさくんが調べてくれたところ、初期リス地から実にX軸Z軸ともに6000ブロックも離れたところにあることが判明。見てみたい一心でネザーでかなりの長旅をして、見つけてきました。

かなりひろい!

キノコの島バイオーム

ムーシュルームいた! かわいすぎる! なにこれ!

ムーシュルーム

まんなかにすごい巨大でオシャレな朽ち果てたネザーゲートを見つけました。これ稼働するようにして使おうかなぁ。

朽ち果てたネザーゲート

キノコの島バイオームには敵対的MOBがスポーンしないとのことで、建築物をクリーパーに爆破されないと言うだけで夢のような島ですね。

ここへの道を作ってここも拠点の一つにしてみたいなぁ。

くまでした。

ドラクエタクト:育成素材効率テーブル(2023年4月版)

この記事はくまが書いています。

ドラゴンクエストタクトで、育成素材を手に入れるクエストのどこで何が手に入りやすいかの表です。 表の本になったデータはにぁくしょんさんのツイート*1を参考にしています。いつも為になるツイートありがとうございます。

先にサマリだけ書いておきますね。

ステージ スタミナ 用途
初級 3 ストーンが欲しいとき
中級 5 ホワイトオーブが欲しいとき
上級 8 回る必要なし
超級 12 オーブが欲しいとき
地獄級 20 秘石が要らなくて宝石が欲しいとき
EX 24 珠・虹・秘石・クリスタルが欲しいとき

詳細は

【くまいくらにっき】木の家をつくった

この記事はくまが書いてます。

建築をするとつい、左右対称になってしまいがちなので、アシンメトリーの家に憧れていて、いろんなひとの家を参考に作ってみました。

なかなかいい感じに出来た!

木の家

もともとあった家をなるべく壊さないのがコンセプトの一つなのです。黒い木材をらせん状に纏わせて屋上まで配置することで動きと流れが表現できたのでこのテクニックは使えるかもと思いました。

ほんとうは石臼に鎖を吊したかったんだけど、統合版だとできないんですね。このへんのJava版との謎の差があるのなんなんだ。

Webブラウザ謎解きゲーム +CodeRe: を遊んでみた

この記事はくまが書いています。

注意

  • ネタバレというかこの記事は、攻略です! 答えを書いていますので、やったことないかたは気をつけてください。
  • 批評めいた言葉がありますが、それはくまの感想です。そこに「正しさ」はありません。「合う」「合わない」があるだけです。合う方はぜひ参考にしてみてください。

プレイ記

今日プレイしたのはこちらの謎解きです。PCでブラウザをつかったホラー要素のある謎解きゲームです。無料。

pluscode-re.geo.jp

オープニング

まずはオープニング映像を見ます。キーワードがあるので、そのキーワードをページ下にあるキーボードで入力します。

ネタバレは以下のように背景同色で記します。まだ未プレイの人はうかつに反転させないようにしてくださいね。

STARTと入力したら開始です。

 1

第一の謎は、ノーヒントで解けました。

左の言葉をすべて母音だけにします。それを英語にします。

  • 過去→KAKO→AO→青→BLUE
  • 秘湯→HITOU→IOU→硫黄→SALFUR
  • 時化→SHIKE→IE→家→HOUSE
  • 鍵→KAGI→AI→愛→

答えは LOVE です。

 2

次の問題は考えさせられました。

理科室ということ、タイトルの「すべての元となるもの」から、これは「元素」つまり、周期表がヒントになるのかというところはすぐに気がつきました。ただこの問題文にある〇はO(酸素)かどうかわからない、N(窒素)はそのまま読めるからいいとして……Gがありません。Ga(ガリウム)Ge(ゲルマニウム)ならありますが、Gはありません。ここで結構悩みました。

……実は、この問題はこれだけでは解けません。このページのとある場所をよく見ると何回かに一度光る場所があります。そこをクリックすることで、独自の周期表を手に入れることが出来ます。うーん、ぼくはこのギミックはイマイチだと思いました。まず特定の場所をクリックさせる、という行動になんの手がかりもありません。こういった謎解きで「謎に必要な全ての情報が得られているか分からない」というのがいちばん困ります。集まっていない情報を元にどれだけ悩んでも意味がありません。かといって、そこをクリックして情報が得られると分かったところでそれが全てである保証がありません。このギミックは適当な場所ではなく、明確な意志を持ってプレイヤーに特定の場所をクリックさせるような誘導があるのが綺麗な謎解きだと感じます。誘導は別の謎でやるのが良いでしょう。同じ問題から複数の情報が得られるものが理想ですが、それが叶わないなら、せめてリードとなる文章でそれを誘導してほしかったですね。

でてきたものは「周期表」ですが……一般的な周期表とはちがいますね。数も35しかありません。「周期表」というのはすでにあるので勝手に作ってしまうのはちょっと気になりますが……まあいいでしょう。この世界ではこれが周期表ってことで。というか、いかにも文字を読むのに使いそうな元素記号がありますね。Naなんて4回もあります。どこが周期表なんだよ。

とにかくこれが手に入ったことでO=8とN=7とG=9とわかります、計算すると1080となりました。いやこの数字に意味があるのか?(たぶんない)

答えは 1080 です。

 3

次の問題にもいろいろ気になるところがありました。

まず最初にやることは、チラシの各文字の頭の文字を繋いで「ていかたかいならび」という意味を読み取ります。が……ここも誘導に疑問があります。初手の「頭の文字を繋ぐ」ことについてなんの誘導もないです。ただなんとなく頭の文字を読めというのはスマートじゃないでしょう。しかも割引後なのか割引前の数字なのか釈然としないです。割引後の数字だとして、定価を計算すると定価が整数になりません。

なんとか高い順に並べます。とそこでつまっていたんですが、前のページに「特定の場所をクリック」するというギミックがあることを思いだして、マウスでいろいろ触っていたら、画像を思わずドラッグしてしまい……するとなんか文字が浮き出ている……。どうやら作者の意図としてはTAKE FREEなので画像を持ち帰ってね(保存して見てね)ということだったらしいのですが、偶然ドラッグしただけで見えてしまいました。偶然発見できてしまうのもマヌケですが、TAKE FREEを見て画像を保存しろ、という意味を読み取るのはちょっと無理があります。というかYYYYとかいうよくわからない店の名前表記に何の意味もないところも苛立たしい。TAKE FREEには意味があるのに? こういう意味ありげなだけで何にも使わないというのもスマートじゃないと感じます。 

これでは終わりません。値段を高い順に並べたところに書いてある文字を順番に読むと once in a blue moon となります。これみよがしに Google のロゴが貼られているのでこの文字を検索せよということでしょう。once in a blue moon を検索したら謎の数字が出てきました。1.16699016 × 10-8 ヘルツということです。この数字を見たら、問題文にある・・・16password16・・・を思い出しましょう。つまりこれは、この数字の中の16で挟まれた部分がpassword=答えだろうと推測がつきました。16699016 なので

答えは 6990 です。

 4

次の謎はよい謎だと思いました。

つぎは、問題文の「背の順に並べ」が誘導です。同じく問題文の「答え」が赤くなっているところから、オープニング画像を見て「赤い文字」を拾い、その文字の表示された高さ順に読めばいいとわかります。「ごめんなさい」が一瞬しか出ないので見落としていました(それ以外はオープニング見たときから違和感があって覚えていた)。「ごかいおせ」という言葉が出てきます。なにかを5回押すようです。ここで発想の転換が必要。「OPを見て」という問題の指示をどう受け取るかです。OPとあるのはオープニングではなく、OとPという文字とも受け取れます。そこで下にある解答入力用キーボードのOとPの間を5回押すということに思い当たりました。

答えは 入力しない です。OPの間を五回クリックします。

 5

次の問題に進みましょう。これは謎は良かったのにヒントの出し方がとてももったいない気がします。

リード文にある謎の言葉「のろまな犬を すばしっこいちゃいろのきつねがとびこえるころ あたしは、このきょうしつにのこします」から「この日本語が英語のいろはうたを訳したこと」を導く必要があります。が。こんなものは別に常識ではないので知らないとぜんぜん進みません。そしていろは歌は「のろまな犬をすばしっこいちゃいろのきつねがとびこえる」です。「ころ あたしは、このきょうしつにのこします」は一切意味がありません。「あたしは、このきょうしつにのこします」は句読点の位置も不自然ですし、日本語としてもあまりこなれていないのでてっきりヒントになるかと思っていましたがなにも意味がありませんでした。ただ思わせぶりにしてミスリードを誘うのは安直ですし、あまりいい体験とはおもえません。

さて、謎2ででてきた周期表ですが、あれだけで使い終わるとも思えません。ぼくはこんかいの問題文を見たとき「あさり」「なっとう」「きいろ」があの周期表に書かれた As A RIとか Na T To とか K Ii Ro とか作れそうだなとおもっていたんですよね。そこで予め数字に直してありました。As=33 A=13 R=30のようにです。Naは4箇所もあるので11,15,22,34とメモしてありました。T=35 To=20です。K=21 Ii=6 Ro=16ですね。これはいかにもありそうなので、DNAやOGPということばを数字に置き換える方法を探すことしにしていました。

で、英語のいろは歌です。探してみると「英語版の「いろは歌」はある?」という記事が見つかりました。「A quick brown fox jumps over the lazy dog.」とあり、意味としてもこの問題のことばと一致しています。文字数を見るとだいたい35文字位あります。そして、この英語のアルファベットに最初から1~の数字をあてはめてみました。するとD=31 N=11 A=1,28 で、O=9,13,20,32 G=33 P=18 となります。あれ。なんか近い数字になったんですがことごとく2個ズレてます。でもまあ2個ズレてても答えは出ました。K=21 Ii=6 Ro=16を二個ズラしたら19、4、14ですから、19文字目S、4文字目I、14文字目Sということで

答えは SIX です。

ですが、2個ズレていたのが解せません。そうしてもういっかい検索してみたところ、さきほどのいろは歌の冒頭の A が The に置き換わった「The quick brown fox jumps over the lazy dog.」という文章が出てくるではありませんか。なんてこったい、こっちがヒントとして正しかった……。どうやら英語のいろはうたといえば、The で始まるほうが一般的なんですね。これ、たまたま検索でトップに出てくる「英語版の「いろは歌」はある?」という記事がAで始まる文を例としてあげてしまっていて、こちらはマイナーだったというオチ。この謎が出た当時はこの検索結果ページは一位ではなかったかも知れません。時の流れに騙されたアアアア。昔の謎解きをやるとこう言う罠にはまりますね。

 6

気を取り直していきましょう。そろそろ終わりに近いです。

次の問題は「第七の教室を見つける」ことが最初の行動になります。これは実はURLにある意味をなさない文字列がヒントでした。これまでの部屋のURLの一部には3文字の英数字が含まれていました。その文字は最初の部屋から順番に qaz→wsx→edc→rfv→tgb→yhn→となっていました。どこかでみたことがありますね。はい、これはキーボード中段列を上から3文字とったものです。つまり次は ujm とわかります。この問題はとても良いですね。おもしろいのは問題文にある □□ □ □/□/□ というのがこの URL 文字列(http://pluscode-re.geo.jp/xxx/xxxx.html)をそこはかとなく表していると想像できるからです。空白をドットと見做すと一致しますよね。というわけで、とりあえず次の部屋に移動します。

次の部屋は「事故現場」とあります。何か恐ろしい事故が起きて誰かが死んだのでしょう。ここでもクリックしてヒントが得られる場所があります。クリックすると二次元バーコードが出てきます。読み取るとメールアドレスがでてきます。ところがそこにメールを送りつけても何もおきません。返事が来るだろうと想像できるのですが来ません。ここで最初の部屋を思い出す必要があります。じつはあそこにもクリックできる場所があり、そこをクリックすることで「生徒にあてた注意喚起のプリント」が出てくるんです。それがヒントになります。その注意喚起プリントには、「メールアドレスに誕生日などを使った生徒が多くメールアドレスが変えられないのなら、合い言葉を入れて送るようにしましょう」というような言葉があり、合い言葉の例として「連絡」が上げられています。

ぼくはこれをみて「なるほど、では合い言葉を探すのが次に進むための鍵か」と思ってしまい、盛大に時間を費やしました。しかし!!!!!! 実はここはなんのひねりもなかったのです。合い言葉は「連絡」です。なんということもない、プリントで「例としてあげられていたもの」です。なんなんだこれは!!! ここは折角ストーリーがあるのですから、好きなものを合い言葉に入れてみてはと誘導する→別の謎で女の子の好きなものが明らかになる→合い言葉として好きなものを送信……みたいな流れを期待するじゃないですか!!!! なんだよ、「連絡」でいいのかよ。ただの例だぞ! そのままのやつがおるか!

憤りはともかく、とりあえず連絡として送り返されてきた文章を見ます。言葉は大事、とあり、頭を繋げとあります。ここで頭を繋ぐって誘導が出来るならチラシの謎の時にも書けよ! などとつっこみながら、頭を繋ぐ文字を探します。各部屋のサブタイトルでしょうか? ちがいますね。そうなると出てきたときに違和感があったもの……そうか、鉤括弧で書かれた独白部分だ。「が、がいこつ」とかなんか怪しかったんだよな、と思い当たります。というわけで、これまでの問題文やリードの文章で、カギカッコに入っている文字の頭を繋いでみます。「しがうまれたひのきの」なんとなく文章になりましたが前後が欠けていそうです。おそらくですが、前半に「あた」後半に「う」が入って、全文が「あたしがうまれたひのきのう」になるのが正しそう。そういう目でオープニング動画を見返すとここにもカギカッコの文章が二つありました。「あ」と「た」ではじまってます。おお、これは正解っぽい。さらにひとつまえの謎で返ってきたメールを見るているとここにもカギカッコがあり、「し」という文字で始まっています。ビンゴです。まあ、この前後の言葉が見つからなくても文章が想像できて先に進めてしまうんで、ここはオープニングと最後のメールにも文字があることに気づかないと別の行動にミスリードされるような文章にして欲しかったかなぁ。オープニングとメールまでも使うアイデアはとても良いですね。

というわけで「あたしが産まれた日の昨日」という文字列になりました。この女の子の誕生日は2/29です。たしか、この亡くなった二年生でした(新聞記事にありました)。さて、葬儀の日付は2004年です。ということは年齢から逆算して1996年生まれなのでこの子の誕生日の昨日は1996/2/28ということになります。しかしこんな数字は入力欄に入り切りません。数字をアルファベットに変換する必要がありそうです。過去の問題に変換表がありましたね。そうです、周期表ですね。しかし1996なんて数字は大きすぎます。そこでこの問題文の微妙な隙間を思い出します。 □□ □ □/□/□ とあります、このスペースこそ区切りになっているではないでしょうか。となると19 9 6 2 28 という数字になり、これなら周期表でアルファベットになりそうです。Ka G Ii Re Te =鍵入れて。おお。言葉になりました。鍵とはなんでしょうか。どこかにありました。「鍵」とは最初の問題の答えじゃないですか。ということは最初の問題と同じ答えを入れれば良さそうです。

答えは LOVE です。

最後の問題は出た数字を二回ほど置き換える工程があってとても良かったですね。2年生を生まれ年に直すのがちょっと面倒臭かったですけどね。ただ、ちょっと気にいらないのは、アイテムとして表示される葬式の案内にある住所ですね。住所が2-29でおわっていて、これがこの子の誕生日と同じ数字なんですよ。こんなところで一致させて惑わせる意味ないでしょう。思わせぶりでのミスリードさせるだけなのはいくらでも作れてしまうので工夫も感じられないし、とにかく安易なんですって……。

感想

まあ文句はありますが、それなりに悩ませてもらい楽しめましたよ。ただ……難易度をしきりに強調していますが、正直、これは難しかったと言うより不親切で正解率が落ちているような気がしてなりません。よくわからない探索は謎解きの体験を向上させている気がしないので無くすか、どこに隠れているかのヒントを出してほしいですね。雰囲気などはとても良かったので惜しいなと思いました。続編があるようなので今度はそちらも遊んでみたいと思いました。

それではまた、くまでした。