デスクトップの順番を固定する:macOS Sierra

Mavericks あたりからだったか、仮想デスクトップ(最近この言い方しないね。なんでだろ)を使えるようになって、デスクトップを複数持てて便利。仮想デスクトップは、Linux で AfterStep を使っていた頃から重宝していて、MacOS でデスクトップをクリックしてもウインドウが最前面に来なくなって久しいですが、このせいもあり、特に重宝する機能です。

でも、少し問題があって、デスクトップが指定した順番にならないというか、いつのまにか勝手に順番が変わってしまう現象が・・・

私の場合、順番は次の通りがベスト。

 第一デスクトップ:ブラウザ、メール

 第二デスクトップ:Xcode

 第三デスクトップ:Terminal, Finder, RadioTunes.com のプレイヤー(ブラウザ)

第一デスクトップと第二デスクトップを頻繁に行き来して、第三は必要な時に使うという形。

El Capitan あたりから、なぜかデスクトップの順番が勝手に変わってしまう。具体的には第三デスクトップに指定しているものが勝手に第二デスクトップになってしまうのです。なんじゃこりゃ?バグじゃないかと思っていて、バージョン上がったら治るかなと思っていたのですが、Sierra にアップデートしても現象再現。なんかおかしいなぁと思って、設定をいじっていたら、Mission Control の設定に以下の項目を発見。

  □ 最新の使用状況に基づいて操作スペースを自動的に並べ替える

このチェックを外したらデスクトップの並び順が固定になりました。ってか、このチェックなんだこりゃ。こんなもの On にするとなんの役に立つのだ?余計なことすんなよって感じ。例えると、オートマの車に乗っていると、うーん、シフトダウンのタイミングちょっと違和感・・・みたいなものでしょうか。ってか、デフォで OFF にしておいてほしいものです。

 

KVO の勘所

アプリを作っていると、「ある値が変化したら・・・」ということをしたくなるもので、KVO と呼ばれる仕組みが Objective-C に用意されています。

「あるクラスの値が変化したら知らせてね」ということを登録できます。便利なんですが、覚えておかないといけないことが 3 つほど。

1. 監視できるのはプロパティで登録しているもの。

同じクラス内の値を監視しようとして、うまく通知が送られないことがあり、なんでかよくわからないことがたまにあったのですが、監視できるのはプロパティだけです。監視したければ、property 登録しろと。知らないとはまります。

 

2. クラスが破棄されるタイミングで通知は消されません。必ず手動で消しましょう。

例えば、ゲームを作っていて通知を登録して画面を切り替えたとたん落ちる、なんでだ?と思ったら通知を消していなかったからということが割とあります。

クラスが消えるタイミングで通知も消えて欲しいところですが残ってしまいます。手動で消しましょう。

これを知らないとはまります。

 

3. options が結構曲者

監視している property 変更の前後の値を知りたければ、options で NSKeyValueObservingOptionNew または、NSKeyValueObservingOptionOld を指定できます。

property で int を監視していて、変化前後の値は特に知りたくなかったんですが、New を指定していたら、エラー発生。理由がさっぱりわからず、options:0 としたらエラーは出なくなりました。

多分、監視対象にしている property の問題だと思いますが、 前後の値を特に知りたくない時には options に 0 が指定でき、それが、謎のエラー回避の方法にもなるんだなと。

 

SpriteKit: すべての子ノードを削除する

SpriteKit で、画面上にスワイプでスクロールさせたかったのですが、解説読んでもさっぱり分かりません。自作されている方もいるようで、幾つかソースも見たのですが、それでもさっぱり分かりません。仕方ないので、左右にスワイプしてページを切り替えることにしました。

 

[self.view presentScene:self transition:transition];

 

のように指定したのですが、不幸なことに、SKLabel が重なって表示され訳わからない表示に・・・self に画面遷移しているので、先に描写している node が残ってしまうのでしょう。画面遷移する前に、一度子ノードを全て削除したいところ。

調べたところ、全ての子ノードを削除するのにうってつけのメソッドがありました。

        [self removeAllChildren];

これで、一度に全部の子ノードを削除できます。まずは子ノードを配列に入れて、それからそれから、for 文で回して・・・というのを考えていたので、すごい便利でした。

 

 

 

 

ポケモンGo、部屋にいながらにして歩く?

ポケモンGoiPhone)で一人歩きできてしまう裏技です。

1. アプリ起動

2, コントロールセンターを表示

3. コントロールセンターをすぐ閉じる

2, 3 を繰り返すと勝手にキャラクターが歩きます。

結構遠くまで歩きますが、無限に遠くに行くわけではありません。実際の位置から半径 300m ぐらいは歩くみたいです。

コントロールセンターを閉じたタイミングで位置調整が行われるようで、部屋の中など、座ったままでキャラを歩かせることができます。モンスターも捕獲でき、運良くポケストップまで着ければ回すこともできます。

WIFI は切った方が遠くまで行くように思います。ただ、2 分間に1度ほどGPS 信号を読み取るようで、画面上部に GPS を探しているとのメッセージが出続けることがあります。こうなったら、同じくコントロールセンターを表示して、Wifi を ON とし、赤い表示が消えたたら、また Wifi を OFF にし、上記の 2. 3 を繰り返します。

精度は悪いため効率は悪いですが、この方法でも、歩いたとみなされ距離も加算されます。2Km たまごぐらいは、部屋にいながらにして孵すことができます。

難点は、歩く方角を指定できない点です。部屋からは回せない少しだけ離れたポケストップに好きな時に行ける・・・ということだともっとよかったんですが、なかなかそうはいかないものです。

暑い日中や、雨の日、深夜など、外出が嫌だなぁ、でもどうしてもポケモンやりたいなぁという時はちょっとだけ使えそうでしょうか。

自作 class の sub class

自作 class の sub class なので、何か性能が悪くなってしまったか?と勘違いしていましたが、循環参照問題によるものと判明し解決できたので、sub class で色々実験。

まず、super class で定義済みの @property は sub class で再度定義する必要なし。当たり前ですが、試してみてよくわかったので。

次に、delegate。super class で protcol を通してあって、delegate メソッドも実装されていれば、sub class では protcol を通す必要なしで、delegate メソッドも実装必要なしで引き継がれる。

これは便利ですね。

cannot find declaration for class A superclass of class B.

ゲーム作成中です。

SpriteKit 使ってます。

ゲームシーンは SKScene で起こしています。

あるシーンを SKScene の sub class として作りました。class A とします。

次に、class A の sub class を起こしました。class B とします。

build するとエラーになります。

cannot find declaration for class A superclass of class B.

 

なんですかこれは?

黒本引っ張り出してきて調べるも不明。Xcode の解説はないので当然。

困った時は Google さんに聞いてみます。

StackOverflow が結構引っかかります。

ヘッダーファイルを循環参照している時に起こるエラーのようです。

それで、.h に記載していた #import を.m に移動したらうまくいきました。

#import する場所が重要な鍵を握るとは知らなかった・・・

ヘッダファイルと実装ファイルどちらで import すべきかはこれから勉強。

ふぅ〜・・・

KADI Port 到着

MacBook 12 inch を入手したのが去年の 5 月。外部ポートが 1 つしかなくて、どうかなこれと思案しましたが、ついに 5 年目に突入してしまった MacBook Air 11 inch の冷却ファンがイカれ気味で異音がひどく、いつ壊れるかヒヤヒヤで、おっかなびっくり使うのは開発者にとってまったくよくなく已むを得ない、というのは表向きの理由で、最新機種を使ってみたいとの気持ちも少しだけあって、考えようによってはいいタイミングで壊れてくれました、と。

入手前から分かっていたのだけれど、usb-c 一つしかないので、usb ハブは必要だろうと。

規格自体が新しいので周辺機器がなかなか出ない中、KickStarter で KADI Port を発見。早速申し込んだのが去年 9 月頃だったと記憶しています。

HDMI のポートが欲しかったんですが、Apple の純正はずいぶん高いのでちょっと買えないなぁと思っていたところで、安くはなかったんですが、スタイリッシュな外観にも惹かれてつい、出資してしまいました。

ようやく今にして届きました KADI Port。長かった・・・本当に長かった・・・シンガポールからの国際便で届きました。

一応、出資者には必要に応じて進捗が report されてくるのですが、一時期は 12 月中に発送と言っていたのに、なかなか円滑に進まないもので、製造している中華圏では旧正月で製造がすべてストップするとか(初めからわかってんだろ?と言いたくなる)、最終テストで看過できない問題が発見されたとか、私たちは決してあきらめないとか、いろいろ(言い訳含めて)理由があって遅れに遅れ、ようやく、ほぼ一年越しの昨日届いた次第です。

KADI Port は USB-C (power charge), usb-c, USB-A, HDMI ポートを持つハブです。届いたので早速、軽くレビュー。

まず、HDMI ですが、自宅のテレビにつないでみました。見事に出力出来ました。これで当初やりたかったことはほとんどできたと言えます。 

外観ですが、購入前にも気になっていたのですが、USB-C のポートに差し込みますが、横幅が結構あるので出っ張りがそれなりになるので、なんか、差し込み口に変な力加わったら心配だなぁ、グラグラしないのかなぁ・・・と、それは、全然心配の通りで、力を加えるとグラグラしますし、誤って強い力を加えると折れてしまいそうです。将来は延長コードとかでつないで使おうかと思っています(一体型がよくて買ったのに、延長してしまうと本末転倒な気が・・・)。

また、これは誤算でしたが、厚みが結構あって、MacBook 12 本体よりも厚みがあります。つまり、装着すると土台側ははみ出た格好に・・・ただ、本体には丸いゴム足が付いていますので、下駄を履いた状態であることが幸いして、KADI Port を装着しても傾いてしまうことはありません。持ち上げる時に、装着したのと反対側を持ってしまうと KADI Port 側が当たるので、折れてしまいそうになりやや気を使いますが・・・

私が必要な機能は全て揃っていますが、装着するとグラグラしそうなのがちょっと嫌だなぁ・・・純正ぽい形状のものが安くなったらまた購入検討したいと思います。