« 2019年6月 | トップページ | 2019年8月 »

HyperTalk的Swiftの解釈

 さて、この盆灯篭アプリの話もそろそろこれで終わりにしましょうか。
 
 以前にも触れたように、私の本格的なプログラム体験はHyperTalk & LINGOです。 これが当時からすでにオブジェクト指向だったそうですが、そんなことは全く意識していません。

 

 どこかでボタンをクリックするとコールを起こし、これを仮に"action"という名前にすると、それを別のところで"on action"というハンドラが検知し、そこに書き込まれている機能を実行する、つまり定義されたfunctionを実行する、というのがとても手に馴染んでいました。
 
 ところがこの感覚がSwiftに馴染まず、よって私のようなHyperTalkあがりには使いにくいというか理解しにくい原因の一つであったのは事実です。
 そこでここでも触れた"viewDidLoad()"の上書き。
 
 "viewDidLoad()"自体は、そのスペルの通り、「アプリがロードされたら以下のことをします」というまさしく関数というかfunctionで、普通にSwiftでプロジェクトを立ち上げたら必ずviewController.swiftに最初から書き込まれています。
 変な話、アプリが立ち上がった後、何もさせたくなければここに何も書かなければ良いだけ。
 
 で、私はずっとこれは、アプリが立ち上がった直後のみにしか反応しないハンドラ(じゃないんだけどHyperTalk的に)だと思い込んでいたのですが、@objcをキーワードとしてiOSデバイスの画面上にボタンを用意し、それが押されたら... つまりHyperTalk的にいうと"on mouseUp"に"viewDidLoad()"を書き込んでみたら。
 
 あら、アプリが立ち上がった直後と同じ動きが始まりました。
 あ、ちょっとHyperTalk的。 あ、これがオブジェクト指向だったという証?
 この辺り、クラスやらインスタンスと何度参考書を見ても完全に理解できなかったのが、かなり氷解。
 
 私のこのアプリは、SceneKit、さらに全90回にも及ぶ篤志な記事に触れた方であれば想像がつくように、例のくるくる回る宇宙船を元にしています。
 こいつを灯篭にし、最初から回転させるようにしたのですが、"runAction(SCNAction.repeatForever())"を使っているので、"viewDidLoad()"自体はループしているわけではなく、すでに終了しています。
 ところが灯篭の絵柄を変更した時には別の".scn"ファイルを読み込み直させているため、この"viewDidLoad()"を再度呼び出さなくてはならなかった、というわけです。
 
 え?なんでそんな原始的なことをしているか?
 そうです。 背景を変更する時にはスマートな命令で処理しているので、".scn"を読み込み直すことはなく、よって画面推移も比較的スムーズです。
 なのになぜ灯篭絵の変更はそれができなかった?
 いえ、恥ずかしながらDiffuseを変更するのに"scene.background.contents = UIImage(named:"xxx.xxx")"に相当する命令を見つけられなかっただけ、というポンコツぶり。
 
 仕方ないのです。 今年のお盆に間に合わせたかったのです...

| | コメント (0)

Xcode、シミュレーター、実機、メモリリーク

 なんかSEOのタグ付けみたいな題名になってしまいました。
 要は、「シミュレータでは動くのに、実機で試したらメモリリークが起きて起動できなかった。実機テストが重要なのはわかってるけど、さりとていくつも実機を用意するわけにもいかず」という話です。

 このアプリはシミュレーターでは主にiPhone XRで、実機は自前のiPhone SEでテスト、iPadはシミュレーターのみで行っていました。
 ただiPadは、もし安いのがあれば、今回設定iOSの一番古いバージョンである9.3が動く古いのを手に入れてもいいかな、とも。
 ネットで調べると、iOS9.3の3rd gen.が一万円ほど。 え?高くない? と思いつつ、ポイントを使い倒して支払い5千円ほどにしました。 ちょっと勿体無い買い物だったなぁと思いつつ、Xcodeに登録して実機で走らせると...
 スタートアップが一瞬垣間見えた後、画面が真っ白になって異常終了。

 おりょ?

 なんどやっても同じで、あ〜、もう完成したと思ってたのにぃ。 所詮私の人生こんなもん。 としばし絶望。
 が、ここまで来て諦めるのも悔しい。
 と、今度はiPad実機を接続したXcodeを眺めながら何度もトラブルを再現することに。 すると使用メモリが一時1GBを超えることに気づきました。 そのあとは数百MBに落ち着くので、もしやと思い、ネットで今度はiPadの搭載メモリを検索。
 すると3rd.gen.は1GBだと判明。 
 アプリ自体のサイズは二十数MBだし、考えられる原因といえばこれか、と考えを巡らすことに。

Memory

 一旦1GBを超えたあとは一気に落ち着くことを考えると、立ち上がり時の問題、例えば読み込みに問題がある可能性が高く、デフォルトでbackgroundに銀河の写真を設定したことに気づきます。 まぁ、その方が見栄えもいいし。
 SceneKitの仕様で、立体を取り巻く周囲の画像は、仮に視覚固定で一方向しか要らないときでも正六面体で包む仕様となっています。 ただ、少しでも画像容量少なくするために背景以外の5面は真っ黒にして圧縮が効くようにしてありますし、せめてもの対策としてPNG24からPNG8にしてみるも改善せず。

 ん〜、とさらに検索すると、
scene.background.contents = UIImage(named:"xxx.xxx")
 という命令を発見。

 あ、ならば、とGUIの方でデフォルトはblackにし、ボタンを押すことで銀河の画像に切り替えるよう変更。
 するとこれが功を奏して、無事実機iPadでも立ち上がるようになりました。

 でこのbackground、さらに面倒なことに、iOS9.3では表示されないこともこの実機で判明。
 おかげでアプリの紹介文にはその旨書き加えることができて、めでたしめでたし。

 ではないのである。
 確かに今回はたまたま助かったものの、全対象デバイスを実機で試すのは不可能。 が、非常に重要。
 もちろん世の中にそういうテストをする業者があるのは知ってるものの、そもそもそんな大掛かりなものじゃないし、さりとて例え120円でも買ったわ立ち上がらんわ、となったら批判爆発でしょうから、それも避けたいし、いや、そもそも余ったiOSデバイスで仏壇のお飾りをと思ったから仕方ないとはいえ、古いiOS、イコール古い端末を相手にするのはほどほどに、ということでしょうかね。

| | コメント (0)

盆灯篭アプリ公開

Bonicon ここしばらくいろいろと事が順調に進み、忙しさよりも達成感を感じる方が多いというありがたい日々を送っています。
 実は今日、第二種電工検定の実技試験が終わったのが最大の解放感なのですが、ここしばらくの書き込みの流れから、ずっと懸案だったiPhoneアプリが完成、公開されたのでこちらを先に書くとしましょう。

 ここをiOSデバイスでお読みならダウンロードはこちら 。 iOSデバイス上のAppStoreアプリから「盆灯篭」で検索してもすぐに見つかります。
 あ、有料なのは、絵やら音を複数お金払って購入したからです。 ご理解のほどを。

 すでに使わなくなったiOSデバイスを仏壇に供えっぱなしにできるよう、古いiOS、今回は9.3から動くようにこころがけ、結果iPad3でも稼働できるようにしております。 実機テストはしていませんが、iPad2でも動くのではないかと。

 元はと言えば五年前の母の初盆の折、あぁ昔家にあった盆灯篭をずっと回していたかったな、と思ったのが始まりです。
 仕掛け的には3D技術を使って、とまではわかりつつも、プログラム的に全く未知の分野だったことと、何よりメインとなる灯篭絵が思うように手に入らないまま、iPhoneのリマインダーにずっと塩漬けになっていた案件でした。
 てな話は、ほんの少し前にここに書いて、技術的にはネットにしっかりと書かれたほぼ日本語の公式資料とも言える記事を大いに頼りにしたというのも既述のとおり。

 で今回、Swiftを理解したとは言えないまでも、一つ大きな進歩だったのはsuperクラス、具体的にはどのViewController.swiftにも決め打ちで書いてあるsuper.viewDidLoad()を@objcとかの関数から好きなタイミングで呼び出すことができるという発見でした。

 これって、昔のHyperTalkやらLingoのonハンドラー的な使い方を連想させて、「なんだ、これができるんだ」と思わずニヤリとしながら呟きました。 とはいえ、調子に乗ってこれを使い込もうとするとまた別の問題にあたるんでしょうが、多分それもなんとかなるんじゃないかと、なぜか最近は少々強気になっております。

 とりあえず今年こそはお盆に間に合わせたかったのもあって、コードそのものは洗練されたとは決して言えないレベルなので、もっとすっきりしたものに整理し、さらにすでに浮かんでいるアイデアを加え、来年に向けてのver2.0にしてゆきたいと思っています。
 
 あ、古いiOSデバイスの搭載メモリによるエラーってネタもありますが、これは次回にて。

| | コメント (0)

日本のSceneKitの原点

Bontourou1

 お盆に的を絞ったiOSアプリ、ver.1はほぼほぼ完成で、あとは公開申請に必要なマーケティングサイトを整備すれば終了です。
 このアプリについての詳細はAppStore公開時に改めて書くとして、今日はこの核となった技術のAppleのSceneKitというフレームワークについて。

 今回のアプリには3D技術が必須であるとはわかりつつ、swiftの知識も今ひとつなのに、さらに3Dなんてなぁ、と遠い目で途方にくれること数年。
 とりあえずSceneKitというフレームワーク(3DCGライブラリ)がiOS上での3D空間開発に必須というのがわかり、いつものようにジュンク堂へ。 というか、それ以前にネットでも書籍検索をし、日本語で書かれたSceneKitの参考書がないことは薄々わかっておりました。 そして案の定、頼りのジュンク堂でも発掘できず。

 これにはiOS開発言語がここ数年でObjective-Cからswiftへと徐々に、しかし確実に移行しているのも原因の一つで、書棚の下の方にデッドストック的に残っているiOSの3Dやらゲーム関連の書籍はObject-Cベースのものばかり。 さりとて出版業界も今さら全面swiftに対応した改訂版を出す気もないようです。 たぶん、もう多数の素人がXcodeを立ち上げてiOSやらのアプリを作る時代は終わったという(商売にならない)との見切りもあるのだと想像します。
 
 Appleは盛んにデベロッパー参加を煽り、日本の小学校でもプログラミング教育が始まろうという昨今ながら、戦場は先鋭化したプロしか売れるアプリが生み出せないほど高度化しているという乖離が透けて見えます。(売れるアプリを作れるプログラマーを養成しようっていうだけじゃないのはわかっていますけど)

 ま、それはさておき、日本語で書かれた専門書がないのは辛い。 と改めて具体的なキーワードでネット検索すると、はてなで全編90回に渡るSceneKitの解説記事を発見。 あまりに膨大すぎて題名をエクセルで別途管理しないと大変、なんて罰当たりなことを言ってしまいそうなほどの貴重な資産です。 本当にありがとうございます。

 読み進むうちに、SceneKitにはSceneEditorというのが用意されていて、GUIで3D空間を用意できることがわかり、これが先日書いた、たった数時間の自習時間の監視で大きく開発が進んだ理由でもあります。
 といっても最終的にはそれらのシーンをswiftで繋ぐのに苦労するんだけど、それすらネットの他の方の記事を参考に確実に乗り越えることができました。

 WatchOSの開発時にも同じくネット上の先人にお世話になりましたが、あれも紙じゃなくてKindleベースでしたっけ。 いやほんと、今更ながら改めてデジタルの恩恵を再確認した次第です。

| | コメント (0)

第二種電気工事士検定、学科にパス

Passed1
 先日書いた「とある検定」というのは、第二種電気工事士検定でした。
 元はと言えば、昨年の夏ごろ、ラズパイを使った監視カメラ制御みたいなことをやってたとき、電源増設時など、いつかは必要かもしれないと感じたのが引き金でした。

 が、実は家庭内の電気工事というか作業の許認可が今ひとつわかってなかったというのが本音でもありまして、例えば壁に埋め込んである人感センサー付きスイッチや、リモコン内蔵スイッチなどは勝手に取り替えても良いと思っていたのです。 これを資格保持者に聞くと、住人が自宅のをいじる範囲で訴えられるようなことはないけど、いわゆるネットポリスというか、正義原理主義者、別名ヒマ人揚げ足取り主義者には格好の攻撃材料になるかもしれないと。 それはつまらん。

 ということで、昨年また別の検定に落ちた時に感じた記憶力の減退もあって、とりあえずまだやる気があるうちに取っておきたいと思ったのが動機の駄目押しです。
 
 いや、面白いよ電気は。 なにより家の周りの電柱の一番高いところに張ってある送電線がなぜ三本なのか。 交流とは言えプラスとマイナスでしょ? だったら二本か、三相なら六本必要でしょ? と子供の頃から漠然と感じていた疑問。 これが三相交流の特性を学んであっさり氷解しました。 実を言うとこのネタは、万が一学科を落ちた時に「これがわかっただけでも満足」的な言い訳にしようと思っていたくらいの目から鱗でした。
 
 直流についてはクルマ関連でそこそこ複雑な継電器制御回路までつくれていたにもかかわらず、いや交流は曲者というか、いろいろ違っていてほんと面白いです。
 
 はい、そんなこんなでよかったですね。 ではありません。
 この後に実技試験が控えています。 まぁいいや、学科受かってるから実技はパスするまで何度でも受けよう、なんて寝ぼけたこと思ってたら、実技は二回しか受けられない、つまり二回落ちると再度学科受験からやり直しというルールがあるのを知りました。
 
 えらいこっちゃ、ならば実技も一発でパスするくらいの心構えで臨まなくちゃ、と学科自己採点後に意を決意して購入したのがこのダンボールの中の実習キット。 これ以外にも実技受験に必要な最低限の工具セットやら参考書やらで、これは結構経費のかさむ検定だと今頃気がつきました。
 
 ということで、ここしばらく、夜中に空き時間を作ってひたすらケーブルの皮をムキムキ、ムキムキ。
 でもこれ、なんか楽しい。 ひたすら回路図を見ながら黙々と配線作業。 気がつくと、子供のころ、ひたすら組み立て説明図を見ながらプラモデルを作り続けていたころを思い出します。 やっぱ、こういうのが好きなんですね、はい。
 
 これ以上のさらなる詳細は無事実技が通ってからということで...
Material

| | コメント (0)

« 2019年6月 | トップページ | 2019年8月 »