2016年8月31日水曜日

UnityのGetComponentとかFindとか

間違いや過不足などあればご指摘頂けると!

GetComponentに関して

gameObject.GetComponent<XXX>();した際、対象のクラスのコンポーネントが複数存在する場合は不定
複数取得する場合はGetComponentsを利用
gameObject.transformには.parentや.childCountなど親子関係の情報も保持

GetComponent (XXX)だと戻り値はComponent型となるためGetComponent(XXX) as XXXとすることでXXX型として返すことが可能
GetComponent<XXX>()であればジェネリクスを用いてXXX型で返すことが可能
該当するオブジェクトがない場合はnull

interfaceを指定したい場合はGetComponent(typeof(XXX)) as XXX

GetComponentsInChildren(XXX, true)で非アクティブもヒット
(GetComponentsInChildren<XXX>(true)も同様)

Find系に関して

Find("XXX")で名前でオブジェクトを検索することが可能
Find系は基本的にアクティブのみヒット

transform.Find("XXX")とすることで直下の子供だけを検索(孫以下は対象外)
非アクティブもヒット

FindObjectOfType(typeof(XXX))によってクラス名を指定して検索

名前で検索するのは重い処理
複数ヒットした場合は不定

非アクティブに関して

オブジェクトを非アクティブにする時はgameObject.SetActive(false)
スクリプトを非アクティブにする時はComponent.enabled = false

Unityのイベント関数

Unityで用意されてるイベント関数(StartとかUpdateとか)の一覧です。
覚書程度に。。。
勉強中ですので間違いや過不足などあればご指摘頂けると!

  • Reset : オブジェクトがアタッチされた時
  • Awake : インスタンス化直後(自身の初期化処理に留める)
  • OnEnable : アクティブ有効化
  • OnLevelWasLoaded : シーンが読み込まれた時
  • Start : インスタンス有効後、最初のフレームのUpdate直前(他オブジェクトも絡めた初期化処理)
  • FixedUpdate : フレームレートが低い場合はUpdateよりも頻繁に、高い場合はフレーム間に一度
  • Update : フレーム毎に呼出し
  • LateUpdate : Update直後に一度呼出し
  • OnPreCull : カメラがシーンを間引く前に呼出し
  • OnBecameVisible, OnBecameInvisible : カメラが表示 / 非表示になる度
  • OnWillRenderObject : オブジェクト表示時、カメラに対して一度
  • OnPreRender : カメラがシーンのレンダリングを開始する前
  • OnRenderObject : 全てのシーンレンダリング終了後
  • OnPostRender : カメラがシーンのレンダリングを終了した後
  • OnRenderImage : 画面レンダリング完了後、画面処理が可能になった際
  • OnGUI : GUIイベントに応じてフレーム毎に呼出し
  • OnDrawGizmos : Gizmosの描画に使用
  • OnDestroy : オブジェクト破棄直前のフレーム
  • OnApplicationQuit : アプリケーション終了前
  • OnDisable : 動作が無効になると呼出し

Unityで動的にAddComponent

動的にAddComponentしたい

gameObject.AddComponent<BoxCollider> ();

gameObjectとかBoxColliderは適宜置き換えて下さい(´・ω・`)

AddComponentしたコンポーネントを調整したい

BoxColliderのサイズを調整したいとかそういった場合は以下のように調整可能です。
BoxCollider collider = gameObject.AddComponent<BoxCollider> ();
collider.center = new Vector3 (0.0f, 0.0f, 0.0f);
collider.size = new Vector3 (1.0f, 1.0f, 1.0f);

centerは中心点からのオフセット値です!

2016年8月25日木曜日

MonoDevelop

MacのMonoDevelopさん、日本語入力が出来るようになったのは最近のお話。
日本語対応してくれたのは素直に嬉しい限りですし、文句言える立場ではないのですが、以下のような現象が発生しております(´・ω・`)

コメントとかで「昨日は」とか入れたい場合(あくまで例です)
キーボード的にはKINOUHAと入力すると思います。

KINOUと入力して「昨日」に変換して、HAと入力すると「あ」となるのです。。。
KINOU(in) -> 昨日(out) -> HA(input) -> あ(out)

以下のように入力すれば問題ないのですけどね。。。
KINOU(in) -> 昨日(out) -> Enter -> HA(input) -> は(out)

日本語変換を確定する次の入力(space, tab, deleteなどなどを除いて)をEnterとして処理しているのか、内部的なことは分かりませんが自分の癖のせいで非常に面倒なことになっております(´・ω・`)

同じ理由で嘆いている人は見かけなかったので少数意見かもしれません。
いや、日本語対応してくれただけで喜ばなきゃいけない!文句ばっか言ってちゃいけない!

あ、あと対応する括弧にジャンプする機能が欲しいのとファイルのタブ切替えをNext/Prevじゃなくて現実のタブ基準にして欲しいです(´・ω・`)

2016年8月19日金曜日

Unity x MagicaVoxel

無料で使える超有能ツールMagicaVoxel
使い方も簡単、Unityでのインポートも簡単と素晴らしいツールです。
デザイン系ツールが全然使えない自分でもゲーム感覚で簡単にボクセルが作れちゃいます。

詳しい使い方やインポート方法は他サイト様が詳しく書いてくださってますので割愛。
Unity内で座標を決定する際の基準点、Pivotについて。
MagicaVoxelではデフォルトで書き出すとX軸中央、Y軸下、Z軸中央にPivotが設定されております。
これを書きだした後にスクリプトから変更するのはこちらのサイト様を見る限り別の空オブジェクトを作って、その子供にしたり〜など厄介そうです。。。

ただ、MagicaVoxelはconfigをいじればPivotを自分で設定可能です!
普通にリリースノートに書いてあるんですが、誰かのお役に立てればと。。。

MagicaVoxel -> config -> config.txtfile_obj -> pivotの箇所をいじります。
pivot = '0 0 -1' // -1 : min, 0 : center, 1 : max
と記述があると思います。
X=0, Y=0, Z=-1です。
こちらMagicaVoxel上の軸ですのでお間違いなく!
MagicaVoxel上でオブジェクトを真上から見た際に右方向がX軸の正の方向、上方向がY軸の正の方向、真正面から見た際の上方向がZ軸の正の方向です。
なので以下のように変更すればオブジェクトの中央にPivotを設定できます!
pivot = '0 0 0' // -1 : min, 0 : center, 1 : max

2016年8月10日水曜日

UnityのMarkLightについて覚書 2

UnityのMarkLightについて覚書 2
MarkLight (AssetStore)
MarkLight Document (英語)

コード内でアニメーションを動的に生成したい時はここ(Creating Animations in Code)に記載があります。
以下、そのまま抜粋

var offsetAnimator = new ViewFieldAnimator();

// set up animation
offsetAnimator.EasingFunction = EasingFunctionType.QuadraticEaseOut;
offsetAnimator.Field = "Offset"; // the field that is to be animated
offsetAnimator.From = new ElementMargin();
offsetAnimator.To = new ElementMargin(x, y, 0, 0); // x and y set during runtime
offsetAnimator.Duration = 0.2f; // duration in seconds
offsetAnimator.TargetView = MyRegion; // the view whose Offset field is to be animated

// start animation
offsetAnimator.StartAnimation();

ただ、このままアニメーションしたいタイミングの箇所に記載しても動作しません。。。
TargetViewのUpdateに以下を記述する必要があります!

ViewFieldAnimator offsetAnimator;
void Update ()
{
    if(offsetAnimator != null && offsetAnimator.IsRunning)
        offsetAnimator.Update ();
}

当然、var offsetAnimator = 〜としていた箇所はメンバ変数を見るよう修正してください!

2016年7月31日日曜日

UnityのMarkLightについて覚書 1

UnityのMarkLightについて覚書
MarkLight (AssetStore)
MarkLight Document (英語)

xmlとcsファイルが対になっている。
Viewデザインに関するファイルをxmlとして管理出来る。
日本語解説サイトはほぼ皆無(´・ω・`)

<Sample (何かしら設定) Example-Scale="1">
  <Label Text="Sample内のテキスト" Width="100%" Height="100%" TextAlignment="Center" />
  <StateAnimation From="Default" To="Example" AnimationCompleted="ExampleAnimationCompleted">
    <Animate Field="Scale" From="1" To="0.8" Duration="250ms" AutoReverse="True" EasingFunction="QuadraticEaseOut" />
  </StateAnimation>
</Sample>

上記XMLであればSample.xml, Sample.csが必要となります。
Sampleタグのオブジェクトが選択された場合やクリックされた場合などに以下コードを実行するとStateAnimation内のアニメーションが実行されます。
SetState ("Example"); // Sample.cs

そして親であるSampleタグ内にExample-Scaleという記述があると思います。
これがExample状態になった時にScaleを1に設定するという指定です。
StateAnimation内でScaleについてアニメーションさせようとしているので先に指定しておかないとアニメーションしませんでした。。。
特に指定しなくてもアニメーションさせられるんじゃないかと思っているのですが、方法は分からず(´・ω・`)
まぁ初期値的な感じで使用しています。

StateAnimationにてAnimationCompletedについて記述しており、こちらは指定したアニメーション完了時に呼び出されるメソッドを指定出来ます。
コード例は以下。
public Action OnExampleAnimationCompleted;
public void ExampleAnimationCompleted()
{
  // 何かしら処理(SetStateしたりクリックイベントを通知したり)
}

なんでメンバ変数用意しなければいけないのか、とかはまだよく分かってません。。。
先の指定もMarkLight側で紐付け作業があると思うのですが、そこまで解読出来てないです。。。
分かり次第、追記致します。

Animateタグ内は見たまんまの設定が可能です。
詳細はドキュメント内のAPIを参照してもらえればと。

2016年6月10日金曜日

VR ZONE Project i Can

お台場ダイバーシティで開催しているVR ZONEへ行きました。
10月末まで開催しております!
事前予約制なので行こうと思っている方はお忘れなく!

使用端末はHTC VIVEでした。
体験するにはまずバナパスポートカードを購入(300円)する必要があり、100円 or 1000円単位でバナコインをチャージする必要があります。
体験時間は80分となっており、60分を超えたあたりから受付終了となるゲームも出始めるため事前にコレだけはやりたいってゲームを決めておいたほうが良いかと!
入場後、無料のロッカーもありました!

スキーロデオ

自分はプレイしていないですが、一緒に行った人の話によると酔うらしいです。
ゲーセンにあるような足を乗せるスキー板みたいのがあってVR装着して操作する感じです。
常に並んでる人はいなかったです(´・ω・`)

リアルドライブ

こちらもプレイしていないので分かりません。。。
ただ、VR装着はせず球状のモニターで運転するシュミレータみたいな感じでした。
これも常に並んでる人はいませんでした(´・ω・`)
まぁゲーセンの延長みたいな感じだったので。。。

高所恐怖SHOW

これはやりました!よくテレビとかでも紹介されてたので体験してみたく!
囲われたスペース内にマットが敷いてあり、木の板が置いてあります。
VR装着して両手両足にセンサー付きの専用の装備をします。そして腰に命綱(演出用?)をしてスタートです。
リアルな木の板はあえて少し揺れるように作られてて、横から風も吹きます。
普通に怖いですw
でも面白いです!これが一番面白かった!体感するという意味でも一番相性が良いのかなと思いました!
こちらは常に誰かしら並んでました!人によって一回の体験時間が異なるので待ち時間はマチマチですが。
割と早めに受付終了するのでやりたい人はお早めに!

脱出病棟Ω

これもやってません。怖いの無理なので。。。
でもVRとホラーは相性が良いと思います!
てことはホラー演出の得意な日本人の出番かもしれません!
常に叫び声がエリア内に響き渡ってますw
これが一番最初に受付終了になっていたので、これ目当ての人は最初に行きましょう!

トレインマイスター

こちらもプレイしているのを横で見ていました。
ちなみにホラーを除いて、実際にプレイしている映像をディスプレイで見ることが出来ます!
ホラーはネタバレになっちゃいますからね。
電車でGOのVRバージョンですね(´・ω・`)
なんかそこまでVRすげぇていう感じでもなかったです。
常に誰も並んでませんでした(´・ω・`)

アーガイルシフト

これはプレイしました!
かわいい女の子がすごい気遣ってくれますw
内容としてはロボットアクションみたいな感じですが、常に隣に女の子がいるのでそっちばかり気になりますw
自分で撃ったり、敵の弾避けたり出来るぽいですが、映像にあまり影響しない気がします。
女の子見たいがためにプレイしましたw
さすがのバンナムクオリティです!
こちらは混雑状況はマチマチでした。常に一人はプレイしているような状況でしたね。


VRだけではなく、他入力装置があるとやはり一気に幅が広がりますね!
VR自体は入力装置としてではなく、ただの出力装置と捉えておく方が良いのかもしれません!
今後どういう流行り方をするか難しいところではありますが、目処をつけて開発に着手しようかと!

フリーランス物語2 〜携帯サイト制作〜

30歳となりフリーランスエンジニアとなることと決めました。
同じようにフリーランスエンジニアを目指している人もいると思うので何かの役に立てば幸いです!

前回の通り、組み込み系会社を辞め、その後はフィーチャーフォン(ガラケー)向け携帯サイト制作の会社へ入社しました。
ポイントサイト、ECサイト、グラビアサイトなどの構築、運用を行っておりました。
guid=onやセッションを利用した自動ログイン機能とか各種キャリアの様々な制限(HTMLタグの挙動の違いや容量制限など)を学びました。
フィーチャーフォン向けのページデザインは非常に学ぶことが多かったです!
制限が多い狭い世界で工夫して表現するというのは良い経験だったかと!

前職の組み込み系によるメモリ管理、そしてこのフィーチャーフォン向けの開発(デザイン含む)は次に転職するソーシャルゲーム開発に非常に活きてくる経験だったと思います。

そして、この携帯サイト制作会社を辞めることになった理由は…会社都合です(´・ω・`)
当時はニュースサイトとかにも取り上げられておりました。
自分は全く関与していない&知らないお話なのでアレなんですが。。。

そして二度目の転職活動が始まることになります( ・`ω・´)

フリーランス物語1 〜組込み系への就職〜

30歳となりフリーランスエンジニアとなることと決めました。
同じようにフリーランスエンジニアを目指している人もいると思うので何かの役に立てば幸いです!

まずは簡単に経歴を。
最初に就職したのは大手組み込み系会社のソフトウェアエンジニアでした。
失礼な話ですが組み込み系とかウェブ系とかよく分かってない状態で大手だからって理由で深く考えずに就職してしまったのです(´・ω・`)

結果何を作ってるか分からないし、何のためにやっているのか分からない状態でした。
メモリ管理がどうこう、状態管理するためのビットが残ってないとかなんやで自分には合わない職業でした。
C言語で実装してて、アセンブラとかも使ってたのでそこは楽しかったんですけどね。
回路図好きーとか自作PC好きーとかそういうのにロマン感じれる人なら良いのかなと思います(´・ω・`)
(自分は自作PCとかめっぽう苦手&興味ないです…)

職務内容としては次世代DVDプレーヤ開発(Blu-rayに負けた方のやつです)とDVDドライブの不良解析業務です。
ディスクから拡張情報を読み書きしたり、音情報の同期などを担当してました。若干記憶が曖昧ですが。。。

まぁそんなこんなで組み込み系は1年程で辞めることとなりましたとさ。

2016年6月9日木曜日

GAME ON

お台場の日本科学未来館で開催していたGAME ONへ行きました。
5/30までなので、もう終了してますね(´・ω・`)
目的はPS VR体験です!
事前情報ではお昼過ぎには整理券配布終了してしまうとの噂を聞き、昼前に行きました。
無事整理券を受け取り、時間まで展示を見たりしていたので退屈することもなく!
ゲーセン向けの古い筐体が体験出来ました。
ゲーセンに行く文化がなかったので、あまり懐かしさとかもなく(´・ω・`)
でも体験系のゲームは古くても楽しいですね!
古いゲーム本体もプレイ出来ました!
オシャレ過ぎる。。。
サイズ感といい、デザインといい今見ても見劣りしないですね。

肝心のPS VR体験ですが、写真は撮ってないです。。。
感想としては想像以上に酔わないですし、没入感はすごいです!
これでサマーレッスンなんかやったら現実と本当に勘違いしてしまいそうですねw

ただ問題点としては一度プレイしたい!という想いは強いのですが、繰り返しプレイしたい!という所まではないかな。。。
体験した感想としてもすごかった!というのはありますが、もう一度やってハイスコア狙いたい!とかもっと進めたい!とかには至らなかったです。
ゲーム性に寄るのかもしれませんが、VRの抱える大きな問題だと思ってます。

企業向けのシュミレータとかVR前提で特別な入力装置を用いてプレイするイベントが現状最も向いているのではと考えています。
VR開発も調べつつ、今後の動向を見て行きたいなと!
3Dテレビみたいに滑らないといいな。。。いずれにしてもゲーム開発は楽しい!と思えるイベントでした!

2016年3月21日月曜日

Skype Connection OFFLINEになってしまう問題

Skypeのバージョンは7.21で、現象発生時点で最新です。
MacBook Pro (Retina, 13-inch, Mid 2014)で、使用OSはYosemite (10.10.3)です。

現象としては…
  • グループチャットが届かない
  • ファイル受信が出来ない
事の発端はAndroidにてSkypeをインストールし、サインイン。
その後にサインアウトしたのですが、バックグラウンドで通信しているのかメッセージの通知が来ました。
再度Android側操作でサインアウトして気持ち悪いのでアプリ削除。
そこからSkypr for desktopにてグループチャットが届かなくなり、ファイル受信も出来なくなりました。
個人メッセージはやり取り可能です。
その時点でSkypeが最新であることは確認していたのですが、再インストールも試して改善せず…(´・ω・`)
PC再起動もして、一年以上触っていなかったiPhoneのSkypeについてもアプリ削除。
それでも改善せず…

調べていく内に海外サイトに行き着き、以下コマンドを実行。
/showplaces
MSNP: Connection OFFLINE

/dumpmsnp
MSNP: Connection Data (MSNP24):
* Status: NetStateDisconnected
(略)

Skype自体はオンライン状態(前述の通り個人メッセージは可能)なのですが、OFFLINEかつ切断という結果。
/etc/hostsファイルも確認したのですが、問題なし。

Skype for WebやiOS、AndroidのSkypeでは問題なくグループチャットが届いているし、ファイル受信も可能。
Skypeの方に変にアカウントが滞在しているような状態ではなさそう。

バージョン7.20にダウングレードしても改善しませんでした…

結果として…

一年近く古いバージョン7.18にダウングレードすることで直りました…(´・ω・`)
「常に最新にする」は速攻でOFFにしました。
でもなぜか勝手にアップデートする時があるのでdmgファイルはローカルに取っておいてます…非常に不便。
コミュニケーションツールに関しては会社でも周りの人と合わせないといけないのでアレですが、Slackかchatworkの方が良さそうですね。
使い方勉強していかねば。

cocos2d-x本来のフレームワークが生成されない問題

起きている問題は…

cocos2d-xはver3.9を利用しています。
使用OSはMacのYosemite (10.10.3)です。
あるタイミングからcocos newコマンドでプロジェクトを作成してもcocos2d-x本来のフレームワークが生成されない問題が発生しました。
Xcodeを用いて作成したプロジェクトを開いてもcocos2d_lib.xcodeprojが該当プロジェクト内に存在しない状態です。
同様にプロジェクト直下(proj.ios_macなどがあるディレクトリ)にcocos2dディレクトリがありませんでした。

ただ、ライブラリファイルはリンクしているためSpriteやRefなどは記述可能。
ヘッダファイルまでは見れるのですが、ソースファイルは見れないといった状態です。

以前までは上記した問題は起こっておらず、他利用者様と同じ構成で生成されていたのですが。。。

現象発生前後で行ったこと

  • cocos studioを追加
  • Android Studioに既存プロジェクトを追加
  • コンパイル高速化のためにccacheを適用
上記で行った変更を確認しましたが、当然cocos newに影響するような変更はしておりません。
ただ、念のため全て設定や定義を戻し、再度cocos newを実行………改善されず(´・ω・`)

実際、実行は出来る?

実行は可能でした。そこで実際cocos2d-x関連のファイルはどこを参照しているのか、を調査しました。
Xcode -> PROJECT, TARGETS -> Build Settings -> Search Paths -> Header Search Paths, Library Search Paths, Framework Search Paths

すると以下ディレクトリのファイルを参照していました。
/Applications/Cocos/frameworks/cocos2d-x-X.X

なぜcocos studioのディレクトリを参照しているのか、その定義があるのかについても改めて調査しましたが、どこにも見当たらず…

最新バージョンver3.10だとどうなる?

調査時点でcocos2d-xの最新バージョンver3.10がありましたので、それを適用してみようと思いました。
setupも再度実行、bash_profileが適切に書き換わっていることも確認し、再読込み。
cocos newしてみましたが現象変わらず…(´・ω・`)

一旦諦め、リフレッシュ後に再度調査。
cocos newしてみたら正常にフレームワーク含め生成されました…
結局何が原因だったのか、何故解決したのかは不明…

2016年3月14日月曜日

Androidコマンドの備忘録

詳細を省いてしまいますが、Android開発で用いるadbコマンドや署名作成に関するコマンドを忘れないよう記します(よく使う、またはたまにしか使わないけどいざという時忘れちゃうコマンド限定)

Logcat表示

adb logcat

バックトレース出力

adb logcat | $NDK_ROOT/ndk-stack -sym proj.android/obj/local/armeabi/

NDK_ROOTの定義必須
(当然NDKのパス記述でもOK)

また、実行しているアプリのproj.androidまで移動しておく。
こちらもパス記述でもOK。

デバイス一覧

adb devices

apkインストール

adb install -r xxx.apk

-rオプションは同一apkがある場合に上書き

署名作成

keytool -genkey -v -keyalg RSA -keystore ~/xxx.keystore -alias xxx -validity 10000

アプリURLを自動振り分け

アプリリリース後にtwitterやFacebookなどで宣伝するかと思います。
その際、twitterやFacebookの機能でURLを貼り付けた時に自動的にカードのような表示に置換えられます。
iOSとAndroidでリリースしている場合に記事内に両OSのURLを載せてもどちらかのURLだけカード表示され、異なるOSのダウンロードページへ飛ばしても意味がありません。
ユーザに判断させるのも違いますし、折角アクセスしてもらってもダウンロードに至らない、なんてのは無くしたいですね!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta name="twitter:card" content="summary_large_image" />
 <meta property="og:title" content="(アプリタイトル)" />
 <meta property="og:description" content="(アプリ説明)" />
 <meta property="og:image" content="(カード画像URL)" />
 <meta property="og:url" content="(リンクURL)" />
 <meta property="og:type" content="game" />
 <meta property="og:site_name" content="(サイト名)" />
 <title>(サイト名)</title>
 <script type="text/javascript">
  var userAgent = navigator.userAgent.toLowerCase();
  window.onload = function(){
   if(userAgent.indexOf("android") > -1){
    // Google Play
    launch_frame.location.href = "(URLスキーム)";
    setTimeout(function(){
     location.href = "(GooglePlay URL)";
    }, 500);
   }else if(userAgent.search(/iphone|ipad|ipod/) > -1){
    // App Store
    launch_frame.location.href = "(URLスキーム)";
    setTimeout(function(){
     location.href = "(AppStore URL)";
    }, 500);
   }else{
    location.href = "(AppStore URL)";
   }
  }
 </script>
</head>
<body>
 <div style="width:0; height:0; overflow:hidden;"><iframe id="launch_frame" name="launch_frame"></iframe></div>
</body>
</html>
metaタグ内のogから始まるpropertyはOpenGraphProtocolというものでSNSでシェアされた際にサイト名やURLを正しく伝えるための設定です。
twitterカードの仕様についてはこちら(公式)

コードの簡単な説明をするとUserAgentによってAndroidとiOSを振り分けています(UA偽装していたら正常に判定出来ません)
また、AndroidでもiOSでもない場合(PCからアクセス等)はAppStoreに飛ばしています。
OS判定後、URLスキームを用いてアプリの起動を試みます。
アプリ起動出来ない場合(500ms応答なし)はダウンロードURLへリダイレクトしています。
端末の設定にもよりますがダウンロードURLへリダイレクトした場合、自動でアプリが起動するはずです(AndroidならGooglePlay、iOSならAppStore)

また、上記コードではSummary Card with Large Imageというカードタイプを利用しています。
twitter内で目立って良いかなという程度の理由です。
カード画像については1024x500の画像を使用しています。
(仕様的には最低280x150で容量1MB以内らしいです)

URLスキームについては別記事にしましたのでご参考までにm(_ _)m

OS毎のアプリURLの形式については言わずもがなですが一応。。。
GooglePlay URLは以下の形式
https://play.google.com/store/apps/details?id=XXX
AppStore URLは以下の形式
https://itunes.apple.com/jp/app/XXX/idXXX?l=ja&ls=1&mt=8

設定出来たらWebサーバにアップロードして構文チェックを行いましょう。
Card Validator(公式)

twitterカードの仕様にもありますApp Cardですが、これを用いれば上記コードと同等の振り分けがmetaタグだけで出来そうですが、Facebookとかで同様の振り分けを行えるかは試してないので分からないです。。。
カード画像を用意しなくてもアプリロゴを補完してくれそうな雰囲気もしますが、せっかくスクリーンショット用などで横長の画像も用意しているかと思いますのでインパクト重視でLarge Imageを使うのも良いかなと思います!

2016年3月13日日曜日

URLスキーマについて

アプリにはURLスキーマというものを設定することが出来ます。
これを設定することで別アプリからインストール可否を判断したり、Safariなどからアプリ起動をすることが出来るようになります。

< iOS >
Xcodeにて設定します。
TARGETS -> Info -> URL Types
IdentifierとURL Schemesに設定します。

IdentifierにはBundle Identifierと同じ値を設定しておけば概ね問題ないかと。
URL Schemesに設定するものが上記で説明したものになります。
aaaと設定すればSafariにてaaa://とアクセスすることでアプリが起動します。

ただし、aaaなんて誰でも思いつくようなスキーマを設定しない方が良いです。
仕様としてApple提供のアプリと被った場合はAppleアプリが起動、他アプリと被っている場合には何が起動するかは不定、となっています。
なのでBundle Identifierを整形したものやデベロッパ名などを組み込んでユニークな値となるように設定しましょう。

< Android >
AndroidManifest.xmlにて設定します。
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="XXX" android:host="execute" />
</intent-filter>
こちらも設定するとChromeなどからアプリ起動出来るようになります。

2016年3月12日土曜日

SONY WalkmanとMac iTunesの連携・その3

SONY Walkman(NW-A25HN)をMacでの使い方を書きます。
曲の同期については以下記事を参考にしていただけると!
SONY WalkmanとMac iTunesの連携・その1
SONY WalkmanとMac iTunesの連携・その2

前回の記事通りに曲を配置していた場合、iTunesのプレイリストをそのまま使えません。
なのでWalkmanの方のディレクトリ構成に合わせてあげる必要があります。

プレイリスト書き出し

iTunesにてプレイリストを選択後、右クリックで「書き出す」を選択します。
m3uフォーマットで書き出しましょう。

m3uファイルの整形

書き出したm3uファイルのままでは使用できません。
まずは曲ファイルのディレクトリ構成を変更します。
Macでターミナルを起動します。
(アプリケーションのユーティリティにあると思います)

m3uファイルをviで開きます。
起動後にvi(半角スペース)と入力して書き出したm3uファイルをドラッグアンドドロップします。
以下コマンドを貼り付けた後、Enterで実行してください。
:%s/(Ctrl+V)(Ctrl+M)/(Ctrl+V)(Ctrl+M)/g
:%s;/Users/(ユーザ名)/Music/iTunes/iTunes Music;;g

改行コードをWalkmanでも認識するよう変更し、曲ファイルのディレクトリ構成を変更しています。
(ユーザ名)の箇所は適宜変更ください。
変更完了後にZZか:wqと入力してviを終了してください。

曲名やディレクトリ名に日本語が入っている場合もあると思うので最後に文字コードをUTF-8に変更します。
nkf(半角スペース)-w(半角スペース)--overwrite(半角スペース)と入力してm3uファイルをドラッグアンドドロップして実行します。
nkf -w --overwrite XXX.m3u

変更が完了したm3uファイルをWalkmanに入れれば完了です!
曲情報を認識しているか確認してみましょう!
当然ですがプレイリストだけじゃなく曲ファイルも必要なのでお忘れなく!

2016年3月11日金曜日

Xperia Z3 compact (docomo, SO-02G)をグローバル化・その2

前回の記事の続きです。
今回はいよいよ実行手順について。

実行手順、結果については自分の環境であれば問題なく完了した、というお話です。
端末環境や製造時期などで異なる可能性もありますので参考程度に留めてください。
また、ROMの焼き直しとなりますので一切動かなくなる、ネット通信が出来なくなる等の症状が発生する可能性があります。
一切の責任を負いませんので自己責任でお願いします。

その前に…

今回はXperia Z3 compactのdocomo, SO-02GをグローバルモデルのROMに焼き直します。
そのため日本固有の機能(赤外線とかFelicaとか)は使えなくなります。
改めて普段利用していないかご確認ください!

また、LINEの機種変更手続きを忘れずに!
きちんと事前に手続きしておかないと同一アカウントでログインしてもスタンプとかコインとか諸々消えちゃいます(´・ω・`)
Facebookとかtwitterとかもアプリで使用しているとパスワードを忘れがちです。
必要であればログイン出来ている内に手続きしておきましょう(パスワード忘れてる場合、ログイン可否に関わらず問い合わせ方法は一つしかありませんが…)
あ、あとWi-Fi設定も消えちゃうので事前に用意しておきましょう!
あとはゲームアプリなんかも機種変更手続き等でアカウント情報を引き継げる状態にしておきましょう!
大抵アカウントIDとパスワードなんかが発行されると思いますのでスクリーンショット撮ってPC等に転送しておくのをオススメします!

Flashtoolの入手

まずはFlashtoolをダウンロードしましょう。
それぞれの環境(Windows, Linux, MacOSX)に合ったものをダウンロードしてください。

自分が使用したものはver0.9.19.10でした。

FTFファイルの入手

Flashtool起動後にXIマークをクリックして、XperiFirmを起動します。
ただ、Macだと何も反応しないです。。。Flashtoolのアプリケーションディレクトリを見たらexeファイルが出来ていたのでWindowsじゃないと呼び出せないのかもしれません。

こちらのサイトにFTFファイルがまとまっていますので参考までに。
他サイト様を参考に以下ファイルを利用しました。
Xperia Z3 compact LTE-A [D5803]
23.0.A.2.93 USA

ROM焼き直し

まずFlashtoolの実行ファイルがあるディレクトリにfirmwaresディレクトリがありますので、そこにFTFファイルを置きます。

Flashtoolを起動して、左上の雷マークをクリックします。
BLUはBootLoader Unlockの略らしいです。

Flash ModeとFastboot Modeが選択出来ると思うので、Flash Modeを選択。

Wipe: APPS_LOG, USERDATAにチェック
キャッシュファイルや内部ストレージを削除するかどうか、なのですがROMが異なるため以前のファイル達がどんな悪さをするか分かりません。
どうせ初期化するので削除してしまいましょう。

Exclude: AMSS_FSG, AMSS_FS_1, AMSS_FS_2, MODEMにチェック
除外するカテゴリを指定します。
通信帯域に関する情報が記述されているそうで、日本とUSAでは通信帯域が異なるので除外しましょう。
除外しないとROM焼き直し後にLTEが繋がりにくい等の症状が発生する可能性があります。

上記WipeとExcludeの項目はFlashtoolのバージョンによって名称が違うぽいです。
それぞれの項目の詳細が知りたい方はこちらのサイトが丁寧に解説してくださってます。

ダウンロードモード起動

Flashしてしまえば後は指示に従うだけです!
端末からUSB抜いて→電源OFF→ボリューム下ボタン押しながら→USB接続
これでダウンロードモードになります。

Flashtoolにログが出てくるので静かに待ちます。
自分の場合は数分でした。

あとは端末購入時と同様、初期設定をしていきます。
USAのROMでもちゃんと最初に日本語設定出来るのでご安心を!
設定の端末情報にてモデル番号がD5803となっていれば無事成功です!

その後に…

晴れてdocomoの呪縛から解き放たれ、色々無効化したりスタミナモードを屠ったりしたり、早速LINEやらtwitterやらを設定したい気持ちは分かるのですが、まずはソフトウェアアップデートが全て完了するのを待ちましょう。

これが果てしないです…
古いビルド番号のものを入れているのでしょうがないです。
何度も新しいアップデートがあります、インストールの準備が出来ました、再起動を繰り返しますので充電しながら待ちましょう。
1時間以上は見ておいた方が良いかもしれません(´・ω・`)

最終調整

ソフトウェアアップデートも落ち着いたら、最後に確認した方が良い項目があります。

  • Wi-Fiを切ってモバイル通信が正常かチェック
  • 電話をする
  • 電話をしてもらう
最低限上記だけは最初にチェックしておきたい所です。
(スタミナモードのチェックとしてスリープ状態で実施するのも良いと思います)

また、グローバルモデルでは日本モデルと少し異なる点があるので調整していきます。
主に節電対策とかネットワークの安定に繋がると思いますので参考までに。
こちらのサイトを参考にさせて頂きました!

ネットワーク設定
電話を起動します。
「*#*#4636#*#*」と入力してください。
最後のアスタリスクを入力した時点で画面が切り替わります(通話とかは押さなくてOK)

携帯電話情報の優先ネットワークを設定→LTE/WCDMAを選択

NFCを削除
設定→その他の設定→NFCがグレーアウトしている
こいつの電池消費が激しいそうです。。。

NFCサービスをkillする必要があるのですが、adbコマンド(Android Debug Bridge)というものが必要になります。
自分はアプリ開発者なのでPC環境にadbコマンドを導入していたので問題ないのですが、普通のPC環境には入っていないので導入する必要があります。
導入方法につきましてはGoogle先生が詳しい&丁寧ですので割愛させて頂きます。

adbコマンドからkillすれば先ほどのグレーアウトしていたNFCの表示がなくなります!

あとは細々とした輝度を落としたりとか自動回転を切ったりとか、プリインストールされてるアプリ削除(または無効化)したりとか自分好みに設定頂ければと!

自分はROM焼き直し前からSIMロック解除していてU-mobileの格安SIMを使っていました。
ROM焼き直し後も何も変わらず使用出来ております!
また、docomoのプリインストール削除やらスタミナモードの適用やらでXperiaさんが言うには5日以上持つようになりました。
実際充電するタイミングは明らかに伸びました!
(普段全然スマホ触らないので参考にならないかもです…)

これから実行される方、あくまで自己責任でお願いします!
ただ、同じXperia仲間として成功することを心より願っております!

2016年3月6日日曜日

Xperia Z3 compact (docomo, SO-02G)をグローバル化・その1

Xperia Z3 compactを普段利用しているのですが、購入時にdocomo端末かグローバルモデルにするか悩みました。
背面のdocomoロゴが嫌だ、というのとプリインストールされてる(かつ削除や無効化出来ない)不要なアプリがあるという理由でグローバルモデル一択だったのですが、購入を迷っていた時にdocomo端末の投げ売り値下げが行われました。
数年前の白ロムと同程度まで値下げ(たしか3万円前後)されまして、当時グローバルモデルが5〜6万円していたので、さすがにdocomo端末で甘じました。。。


現在でも同程度の価格でやり取りされているようです。
スペック的にも非常にお得な買い物だったと思っております。

[ 不満点 ]
AndroidOS KitKatですのでSDカードへアプリを移動することは出来ません。
プリインストールアプリのFile Commanderを使用することで画像ファイルや音楽ファイルをSDカードへ移動することは可能。
ただし、画像ビューアアプリや音楽プレイヤーアプリから参照可能なディレクトリは限定されています。
これのせいで微妙に不整合が起きたりしておりました。。。(ファイルが正常に認識されなかったり等)
また、内蔵ROMにゲームアプリが2,3個入ってるだけでアップデートデータでどんどん圧迫されていきます。。。

そして7月末頃にLollipopが配信され、SO-02Gにてアップデートデータが来ました!
LollipopからこのSDカード制限がなくなるとのことで心待ちにしていました。
(アップデートスケジュールはキャリアやメーカーによってコントロールされているためAndroidOSが発表されても適用出来ないのです)


喜び勇んで適用したのですが、なんとアプリのSDカードへの移動が出来ないのです。。。
こちら調べた所、Z3 compactでもグローバルモデルでは問題なく移動が出来るそうで。。。
ネットで調べた情報によるとdocomoによる制限が入っているらしい、とのことでした。
(オフィシャルな情報は見当たりませんでした)

使用して一年、結果として常に「内蔵ROMが75%使用されています」お知らせが出続ける状態になってしまいました。。。
これはXperia側の機能で内蔵ROMを確保するために画像や音楽ファイル、アプリを移動してくれようとするのですが、アプリの移動だけは前述同様に何度やっても転送失敗します。

このままお知らせマークと共に生活をするのは耐えられないのでグローバルモデルのファームウェアに焼き直すことを決めました!
実行手順、結果については次回記事に致します!

2016年2月21日日曜日

アプリ開発者向けスタミナデザインツールを公開しました

そんな仰々しいものではありませんが、アプリ開発者向けにスタミナを計算するWebツールを公開しました。
スタミナデザインツール

自分が使いたい機能しか考えてないので、もしも要望などありましたらコメント頂けると!

2016年1月30日土曜日

SONY WalkmanとMac iTunesの連携・その2

前回の続きです。

まずは曲の同期について。
iTunesでは以下の構成で曲管理されています。
/Users/(ユーザ名)/Music/iTunes/iTunes Music/Music/(アーティスト名)/(アルバム名)/(曲名)

Walkman(NW-A25HN)では以下のように構成されています。
Walkmanの種類によって異なるかもしれません。
/MUSIC/(アーティスト名)/(アルバム名)/(曲名)

WalkmanをUSB接続した後、iTunes Musicディレクトリ配下をそのままコピーすればOKです。

そのまま曲を移すとWalkman上で曲一覧を表示した時に曲名やアーティスト名が不明と表示されてしまうと思います。
アルバムアートワークも恐らく表示されないものがほとんどではないかと。
そこでID3タグ変換とアルバムアートワークを再設定する必要があります。

ID3タグ変換

曲名やアーティスト名は音楽ファイルのID3タグにて管理されてます。
iTunesではこのID3タグがデフォルトでver2.4で管理されており、Walkmanではver2.4に対応しておらず表示出来ずに設定なしと判定されてしまいます。
ver2.3であれば問題なく表示出来ますのでiTunes上で一括変換してしまいましょう。
(iTunes上の表示は変わりません)
  • iTunesにて曲一覧を表示
  • Command+Aで全曲を選択状態にする
  • 右クリックでID3タグを変換
  • ID3タグバージョンをv2.3
自分は4600曲くらいありますが、全曲変換で1分程度でした。

アルバムアートワーク

iTunesで自動設定されたアルバムアートワークなどは表示されません。
また、自分で設定している場合もPNGやGIFもダメ、解像度が大きすぎてもダメです。

なのでJPGかつ解像度500x500のものを設定しましょう。
そしてJPGには何気に二種類あり、プログレッシブJPGとベースラインJPGです。
違いは圧縮方法だったり、ブラウザで表示する際の表示(処理)方法が異なります。
WalkmanではプログレッシブJPGだと表示出来ません。

自分はJPGがプログレッシブなのかベースラインなのか判別する方法が分からなかったので一律で変換しました。

まずMacのアプリケーション、ターミナルを起動します。
(アプリケーション内のユーティリティにあります)
指定のJPGファイルのある箇所まで移動して以下コマンドを実行します。
jpegtran (書き出し元ファイル名) > (書き出し先ファイル名)

自分は最初からjpegtranが使用可能だったのですが、もし使用不可(ターミナルでjpegtrくらいまで入力してtab押して補完されない)であればjpegtranをインストールしてください。
インストール方法は他の方が丁寧に解説してくださっているので割愛致しますm(_ _)m

2016年1月29日金曜日

SONY WalkmanとMac iTunesの連携・その1

GRAVITY DAZEとコラボしたNW-A25HNを購入しました。
自分は普段iPhoneで音楽を聴いているのですが、買い替えた理由としてはSONY信者である(笑)ということと音質、さらにiPhoneのミュージックアプリのシャッフル機能が本当自分との相性が悪くてイライラするのです。。。(´・ω・`)

シャッフル機能自体のロジックについては公表されていませんが、自分の感覚的な感じだとアーティストのアルバム、曲ごとにまとめて重み付けして、BPM解析して次の曲を決めているのかなと。
また、ミュージックアプリではシャッフル中でも前の曲に戻れるという特徴があります。
これのせいで前の曲、次の曲が計算出来るようなロジックになっており、それが単調化させているのでは考えております。

NW-A25HNでもAppleロスレス含め主要な音楽ファイルはほぼ再生可能となっております。
この辺の仕様はご自身の音楽ファイルを確認したり、SONYの公式サイトを確認頂けると!

ただ、一番の悩みとなっていたのが音楽ファイルの同期です。
やはりこれについてはMac iTunesとiPhoneの連携は完璧ですね(当然ですが)
NW-A25HNでもMac用のツールContent Transferがあるのですが、結果的に言うと全然使えません。。。
プレイリスト及び曲をドラッグ&ドロップで同期出来るのですが、途中で止まってしまうのです。。。
これに関しては自分の環境の可能性もあるので何とも言えません。上手く同期出来る方もいるかもしれませんが、少なくとも自分は無理でした。

次回、iTunesで管理している音楽ファイルとプレイリストをNW-A25HNへ同期する方法について書こうと思います!

アプリバージョンについて

<iOS>
Xcode -> TARGETS -> Generalから編集します。
Version = ユーザにも見えるバージョン
Build = AppStore側で最新のアプリを判断するためのバージョン番号

<Android>
AndroidManifest.xmlを編集します。
versionCode = GooglePlay側で最新のアプリを判断するために使用(整数のみ)
versionName = ユーザにも見えるバージョン

アプリのパッケージ名とアプリ名変更

パッケージ名変更

AppStoreやGooglePlayにてユニークに管理するためにパッケージ名を決める必要があります(AppStoreとしてはパッケージ名という呼び方ではありませんが)
com.google.XXXのような形式です。
一般的には自身で保有されてるドメインを逆順にjp.YourDomain.AppNameみたいな形式にするのが多いです(トップレベルドメインはjpだったりcomだったりしますが)

かの有名なパズドラは「jp.gungho.pad」
Puzzle And Dragonsの頭文字ですね。

<iOS>
アンダースコア利用不可
XcodeにてTARGETS -> General -> Identity -> Bundle Identifierから変更可能です。

<Android>
ハイフン利用不可
AndroidManifest.xml -> package変更
eclipseにてsrc配下をエクスプローラからリファクタリングし、javaファイル内のpackageも修正。

iOSとAndroidで揃えておく必要はありませんが、社内で開発してる等の場合、揃えておいた方が管理がしやすいかなと思います。
また、iOSではアンダースコア利用不可だったりAndroidではハイフン利用不可ですので記号を使わずに設定しましょう。
ユーザには見えない箇所(GooglePlayではURLの一部)なので管理のしやすさを優先しましょう。
パズドラほど簡素すぎるのもアレかなと思いますが。。。

アプリ名変更

アプリをダウンロードしてもらった後にホーム画面等で表示されるアプリ名です。
AppStoreやGooglePlayで表示されるアプリ名とは異なります。

<iOS>
全角6文字(半角11文字)
最新のiPhone、iPadだと異なるかもしれない。。。

XcodeのTARGETS -> Info -> Custom iOS Target Properties -> Bundle display name

ローカライズする場合、主言語のアプリ名を上記箇所に設定。
XcodeにてInfoPlist.stringsを作成(空ファイル)します。
右のLocalizationクリックし、言語選択。
CFBundleDisplayNameに各言語用のアプリ名を設定します。

<Android>
全角5文字(半角10文字)
こちらも機種やメーカーによって結構異なります。

eclipseにてres -> values -> strings.xml -> app_nameから設定。

アプリ名はiOSとAndroidの文字数の制限を考えると全角5文字(半角10文字)で設定しましょう。
アプリの略称とかをオススメします。