サブルーチン駅前4時29分集合

プログラミングと散歩と数学に興味のある男のブログです。基本的に知識は浅いです。

Solar2D(Corona SDK)は、日本語の面を除けばとっつきやすい!

 こんにちは。虫の羽音が苦手なので、夏の到来が憂鬱なたねろうです。今日は、久しぶりにCoronaSDKについて書こうかと思います。過去にブログで取り上げたことはあるのですが、正直言ってあんま勉強できておりません。XamarinとかJavascriptのほうに興味が移っていたもので…。

 その上で、CoronaSDKをほんの少し(マジでほんの少しです)触ってみた上での好きなところとかいろいろ書こうと思います。

 

 まず、プログラミング素人からするとLuaがカンタンで助かります。文法がC#とかに比べると単純なのでとりあえず書くのは楽です。型の指定もしなくてよく、なんと整数型と浮動小数点型の区別もないです。おそらくC言語とかJavaとかをやってる人からしたら適当過ぎて頭が痛くなるでしょうが、「とりあえず動かす」のには便利な感じがします。大規模の開発とかになってくるとちょっと大変そうですが…。

 

 あとは、画面の概念も絶対位置をピクセル指定するだけでとりあえず物を置けたり図形を描画できたりするので簡単です。Xamarinの場合StackLayoutとかGridとかいろいろあって最初は困りますが、CoronaSDKはめちゃめちゃシンプルです。知っている人向けに言うと、「プチコン」とかの単純なBASICでの開発環境に近いです。座標でピクセル打ったりして気軽に遊べます。

 

 ただ、欠点もあります。とりあえず一番困ったのが日本語の情報が少ないこと。英語がイマイチな僕としては大打撃です。具体的に言うと、「Corona SDK」とGoogleで検索したときの検索結果、4ページ目で日本語のページが尽きます。日本語で丁寧に発信をされている方もいらっしゃるのですが、数が少ない…。したがって謎のエラーが出たときは英語で情報を得なければなりません。これはなかなかタフです。僕も「Android Sdkでこれをインストールしろ!」とかいろいろエラーが出て、英語を読みながらなんとか対処しましたが、そのたびごとに「日本語が欲しい…(泣)」と思ったものです。

 

 あとは、Xamarinなどと違いネイティブのコントロールはフルには使えないみたいです。シンプルなボタンの設置とかは簡単なのですが、いろいろやりたいなら大変になってくるかもしれません。

 

 いろいろといい面と不便な面とありますが、僕的にはかなり面白そうな環境だなと思います。やはりLuaというカンタンな言語で、直感的に図形とかを動かしてゲームを作れるのは楽しいです。

 Unityとかも中学生の時に少し挑戦したことがあるんですけど、Unityの操作とc#を同時を覚えるのが非常につらく、難しかった記憶があります。Coronaはそれに比べ、「テキストエディタだけあればいいぞ!display.newTextで文字が表示できるぞ!display.newLineで線が引けるぞ!」って感じでマジでわかりやすいです。特にあんまりプログラミングをやったことのない人とかもとっつきやすいと思います。Lua自体もすごい初心者向けな言語ですし。

 

 もう少し詳しくなったら情報とか発信したいですね…。初めてのパソコンでのプログラミングがLuaだった者としては、Luaももっと有名になってほしいですし。Pythonが花形だけど、Luaも面白いよってね。

Xamarin.FormsのDataTemplateの内側から外側のBindingContextを参照した~い!

 こんにちは。先日腕時計が壊れた、たねろうです。6月になりましたが、関東はまだ梅雨入りしないですね。普通に暑い晴れの日が多いです。周囲の人でエアコンをつけ始める人も多いですが、僕は寒がりなので例年梅雨明けまでつけないことが多いです。

さて、本題ですが、Xamarin.FormsでCollectionViewなどのDataTemplateの内側から外にあるBindingContextのViewModelを参照する方法がわかったのでメモしておこうと思います。

 CollectionViewで表示するUIのひとつひとつに、削除ボタンを付けておく場合などにCommandを親のViewModelに持たせておいて共通化するということはよくあると思います。例を出すと、BindingContextにMainPageViewModelをもつMainPageの中に、ItemViewModelのリストをItemsSourceとするCollectionViewがあり、DataTemplateでその様式を指定しているとします。ここで、各DataTemplateの中に要素を削除するための削除ボタンをつけておく場合、各ItemViewModelにCommandを持たせるよりも、ItemViewModelのリストを持っているMainPageViewModelにCommandを持たせておいたほうが削除の処理が楽になりますし、ItemViewModelの数だけCommandを持たせる必要もなくなります。ここでは、MainPageViewModelがDeleteCommandを持っているとします。

今の状況をXamlで表すと以下のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="BlogTest"
             x:Class="BlogTest.MainPage">
    <ContentPage.Resources>
        
        <DataTemplate x:Key="Item">
            <Label Text="これはItemです"/>
            <Button Text="削除"
                    Command=""/> //ここをどう指定するか
        </DataTemplate>
    </ContentPage.Resources>

    <ContentPage.BindingContext>
        <local:MainPageViewModel />
    </ContentPage.BindingContext>

    <StackLayout>
        <Label Text="メインページです"/>
        //ItemListはItemViewModelのリストです
        <CollectionView ItemsSource="{Binding ItemList}" 
                                   ItemTemplate="Item"/>
    </StackLayout>

</ContentPage>

さて、ここでDataTemplateの内側からMainPageViewModelのDeleteCommandを参照するにはどうすればよいかというと、どうやらRelativeSourceを使うと上手くいくようです。

Command="{Binding Source={RelativeSource AncestorType={x:Type local:MainPageViewModel}},Path=DeleteCommand}"

Commandをこう指定することによって、「MainPageViewModel型をBindingContextに持つ親を探し、あったらMainPageViewModelのDeleteCommandを代入する」という指定をすることができます。ここで、Xamarinのドキュメントによると、x:Typeの指定により、挙動が変わるようです。今回の場合のように、Viewから派生した型(Label, Entry, Editor, Buttonなど)ではない型を指定した場合、「その型をBindingContextにもつ要素を親から探す」挙動になりますが、Viewから派生した型を指定したときは、「その型の要素を親から探す」ことになります。

 また、DataTemplateの内側から親を探す場合、DataTemplateがCollectionViewなど、Templateを適用する要素の子として配置された状態で親を探します。したがって、DataTemplateがどこに適用されているかで親の位置が変わったりするので注意が必要みたいです。

 このあたりの挙動がよくわかってなかったので、分かってよかったです。

Xamarin.Formsで"specified cast is not valid"と出たが、凡ミスが原因だった

 こんにちは。Xamarin勉強中のたねろうです。非常にどうでもいい凡ミスで苦しんだので、記事にしようかと思います。

 

 現在試しに作っているアプリで、CollectionViewでDatatemplateにのっとってアイテムをずらっと表示させるということをやっていたのですが、ある時からアイテムを追加しようとすると"specified cast is not valid"というエラーが出るようになってしまいました。いろいろ情報を探してみても、ピンとくるものはなく。ううむ…と唸っていたところ、ふと気づきました。

 

 ContentVIewとContentPageを間違えていました。本来なら


   



とするところで、ContentPageにしちゃっていました。凡ミス中の凡ミスでした。

Xamarin.Androidに「failed to open directory 指定されたファイルが見つかりません」と怒られた

 結論:関係するフォルダの名前から日本語文字を取り除いてローマ字にしたら解決しました

 

Visual Studio 2019にて、Microsoftの公式ドキュメントを読みながら勉強していたときに、アプリを走らせようとしたところ「failed to open directory 指定されたファイルが見つかりません」というエラーが出てしまいました。resというディレクトリがないと主張しているのですが、(アプリ名).Android→obj→Debug→81→resに存在しています。これはどういうことか。

 

 調べたところ、フォルダの階層が深すぎたりフォルダ名に日本語が混じったりしていると出ることがあるみたいです。そこで、とりあえず関係するフォルダの日本語を全部ローマ字にしてみました。すると出なくなりました。ファイルやフォルダを作るときに日本語を混ぜるのは良くないですね。英語力のなさからたびたびやってしまうのですが…

タイピング修行

 タイピングが早くなりたい。最近よく考えることの一つです。軸足を現実世界よりもパソコンの中に置いて生きている僕にとって、キーボードとマウスは手足のようなものです。そして、マウスにはあまり上手い下手ありせんが、キーボードにはタイプの上手さというものがあります。

 

 特にプログラミングを書くときなどは、キーボードをいかに早く操るかが生産性に大きく影響しています。最近は変数名の候補が予測変換されたりと便利になったものの、変換でなかなか出てこない関数名とかはズバっと入力したほうがいいわけです。

 

 初めてパソコンを触って10年近く経ちますが、実はタイピングの指ポジションを意識したことはありませんでした。タイピングの関する努力はすることなく、自己流のタイピングを貫き通してここまできています。が、さすがに人差し指と中指のみにシフトを回しその他の指に仕事を振らないシステムも限界がきており、タイピング速度の上達はここ3年くらい止まっていました。-とか_とかはノールックで打てなかったし。

 

 そこで2か月くらい前にホームポジションに矯正しました。人差し指と中指の伝統的スタイルではかったe-typingのスコアは200より少し高いくらいのA-かAだったのですが、慣れない指使いにした直後は140くらいまで下がりました。

 

 で、今。青空文庫でちまちまと名著をタイピングして練習した結果、

f:id:zenkashiki011:20210424011342p:plain

327Thunderまできました。すげえよホームポジション。なんとなく面倒くさくて敬遠してたのを後悔してます。情報の時間とかに

「あ~、これね(笑)。こんなの、真面目ちゃんしかやってないから。俺みたいなのは"コレ"だから。やっぱさ、文科省のいうこと鵜呑みにしちゃ、「格」が低いよね~(笑)」

とか言っていたのは何だったのでしょうか。ホームポジションも万能ではないみたいですが、そこそこには役に立つものですね。

 

 で、今後も修行やっていきます。現状の課題としては、ホームポジションでやりづらい場合を自己流にアレンジする「最適化」をまだやっていないことです。といっても現状の僕の速さだと最適化とかはまだ早いとかあるんですかね?その辺全然わからないので。

 

 最終的に、500超えるくらいになったらいいなあ。そしたらズコズコと打てますよね、多分。

 

 

末端の魔力

 盲腸線ってありますね。鉄道路線で主要な路線からピロっと短く分岐してる路線のことです。

 

 なんか最近盲腸線っていいなって思うんです。大体空いてるんです。人でギッシリになってる支線って僕的にはあんまイメージ浮かばないです。分岐する駅で乗り換えてガラガラの車内。これだけでなんかエモいじゃないっすか。それに分岐先って幹線沿いの地域よりだいたい寂れてたりちょっと田舎っぽかったりするんですけど、その緩い雰囲気も大好きなんですよね。

 

 なんか異世界に分岐したみたいな雰囲気というか、

「あ、"迷い込んじまった"か…」って感じが好みなんです。

 そんで終点の駅は大体いい感じに栄えてないのがいいです。さて、来たはいいものの…ってなるあのセンチメンタルな感じがすげぇ好きです。なんかそのまま失踪してしまいたくなるような、このままこの町に吸い込まれたらどうなるんだろうとか考えたりしてしまいます。

 

 特に好きなのは西武の「西武園」駅ですね。マジで周りがなんですよね。おいおい、東京にこんなゴリゴリの森あんのかって思います。そんでホームも寂しい感じで非常にいい。エモい気分になりたいときはぜひ。

 

 ただ近くに「西武遊園地」駅があったので超紛らわしかったです。だけど2021年3月ダイヤ改正で「多摩湖」駅に改称されたから安心! …と思いきや旧「遊園地西」駅が「西武園ゆうえんち」になったので結局危険なのは変わらず。というか西武園ゆうえんち駅のほうが西武園駅よりも遠いので間違えたときのダメージがむしろデカくなっている。しかもあの辺は路線網が迷路のように入り組んでいるので迷わないように行くときはご注意を。まあその辺の駅はどこで降りても似たような景色なので盲腸線の終着にこだわらなければ適当に乗って大丈夫です。

 

 

Corona sdk始めてみました

こんにちは。最近めっきり春めいた気候になってきましたね。桜も地方によっては咲き出してるみたいですし、僕の花粉センサーも日々絶好調です。アレグラでしのいでいるのですが、アレグラを貫通する日もあります。特に今年は新型コロナがいるということもあり人前で鼻水をすするのも気がひけますからね。花粉症にはつらい季節ですよ本当に。

さて、最近ではコロナというとすっかりウイルスのほうを指しますが、今日は別のコロナの話を。
corona sdkというものがあります。僕も正確にはわかってないんですが、簡単に言うとLuaを使ってゲームを作れるやつみたいです。ただ、どうも日本でやってる人が少ないみたいです。検索してもほぼ英語のサイトしか引っ掛かりません。
このcorona、言語はluaです。他の言語をさしおいてluaです。面白いですね。実は僕がcoronaをやってみたのはluaだったからという点が大きいです。僕は昔aviutlというソフトを使っていたのですが、そのソフトでスクリプトを書くときの言語がluaでした。その縁でなんとなくluaには親しみがあったんですね。luaは書くのが簡単なんでそれ以来気に入ってます。
ゲーム作りはDSiプチコン(basic的な言語でプログラミングができるソフト)以来だったのですが、割りとシンプルでわかりやすいです。多分詳しい人からしたらいろいろ準備されすぎてて気持ち悪いかもしれませんが、僕にはちょうどいいです。適当にオブジェクト作って動かすだけでも面白いです。画面のタップの時の制御とかも簡単に関数でできるようになってるので、簡単な2Dのスマホゲーならすぐ作れそう。

ただ今現在、作りたいものがないのでストップしています。その点野田クリスタルってすげぇなって思ってます。あんなにたくさん奇ゲーのアイデアが思い浮かんだら楽しいだろうなぁ。

 作りたいものができたらまた触ってみようかと思います。