おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

Unity、Android、iOSのビルドトラブルシューティング

Unityを使っていて主にビルド周りでハマったことをメモとして残したいと思います。

Q. Unityはどこからダウンロードできますか?

  1. こちらからどうぞ

リリース

パッチリリース

Q. Unityのキャッシュサーバーが落ちると自力ビルドできない?

  1. そのようです。ビルド開始後cacheサーバーへの接続が成功し、ビルド終了後に接続を切るタイミングでサーバーが落ちているとビルド自体が失敗するようです。

Q. ローカルキャッシュサーバーが上手く動かないんだけど?

キャッシュサーバーの設定をlocalにするとどうやら上手くいかない場合があるようです。 その場合でもremoteにしてlocalhost:8126にしてあげれば上手くいくようです。

Q. UnityでAndroid SDK、NDK、Javaのバージョンはどこに設定すればいいですか?

  1. [Unity] -> [Preferences] -> [External Tools]から設定できます。

f:id:orange_lily27:20180505213323p:plain

たまにNDKのPath設定が吹っ飛ぶことがあるのですが謎です(´・_・`)

Q. ビルドしようとしたらandroidコマンドがないってエラーが出ます

  1. Android SDK 25.3以降だとandroidコマンドなくなってビルドできなくなっています。 低いバージョンをインストールするか、toolsフォルダだけ古いバージョン(25.2以下)に入れ替える必要があります。

Android SDK Offline: Android SDK Tools

f:id:orange_lily27:20180505215231p:plain

Q. Android NDKのバージョンはいくつにすればよいですか?

  1. UnityではNDKのバージョンはr10e固定です il2cppビルドしない場合はndkの設定は追加しなくても大丈夫です。

アーカイブはここから入手できます。

追記: Unity2017.2からはr13bにアップデートされたようです。

Q. AndroidのBuild-toolsやSDK Plattformはどうやってバージョンアップすればいいですか?

  1. コマンドからandroidと打つ、またはAndroidStudio → Tools → Android → SDK ManagerからAndroid SDK Managerを起動してできます

f:id:orange_lily27:20180505213502p:plain

Q. HighSierraでUnityプロジェクトが開けません

HighSierraからディスクのフォーマットがAPFSとなった影響です。対応方法などは以下を参照してください。

『横井軍平ゲーム館』を読んでの感想

www.amazon.co.jp

3行まとめ

  • 任天堂の発展に寄与した横井軍平氏のインタビュー本であり、任天堂や横井さんに興味がある人にオススメ
  • すぐにゲームが作れるスキルや発想力は特に身につかない
  • コイズム

感想

本書は任天堂の発展になくてはならない人であった横井軍平氏のインタビュー本です。横井氏は任天堂の一社員としてラブテスターゲームウォッチゲームボーイなどを世に送り出してきたその人です。アナログゲームとデジタルゲーム両方の分野で成功を収めており、遊びの本質を制していた人と言っても良い人です。その横井氏を著者である牧野武文氏が亡くなる直前にインタービューしたものを元に構成、解説を付け加えて1997年に発売された単行本の文庫化です。

インタビュー中に特に難しい質疑応答はなく、誰でも楽しく横井氏の昔話を聞くような感覚で本書を読むことができます。しかし、その中には横井氏の根本的な考え方が散りばめられており、読者は横井さんの哲学であるヨコイズムを透けて見ることになります。ただし、透けて見ることが本書の主題なので、具体的なアイデアが湧いてくる方法やゲーム・おもちゃの作り方を学ぶことはあまりできません。そのような目的で本書を手に取ることはオススメできません。

wikipedia横井軍平について調べるとヨコイズムついて短く解説してあるが、あれは本質ではないと私は考えています。そしてこの本を読むことによってヨコイズムの一端を垣間見ることはできますが、受け取り方は人それぞれ変わってくると思います。それだけヨコイズムが示唆に富み多様性を秘めているということでしょう。

ちなみに私の思うヨコイズムの本質とは、「アイデア」と「技術」と「実現」のバランスを図ること、そして、人を制して遊びを制するということです。アイデアだけでもそれは絵に書いた餅だし、技術だけでも楽しさは提供できないただのガラクタになってしまいます。 横井氏の有名な言葉として「枯れた技術の水平思考」があります。文字通りに受け取れば他分野で成熟した技術をエンターテイメントとして組み込むという意味になります。そういう意味ももちろんあるでしょうが、そうではなくCPU性能がどうこう、カラーだ、高画質だと単なる技術一辺倒で押し通すのではなく「アイデア」と「技術」を最適に組み合わせることが「遊び」の本質である、その時の技術とは必ずしも最先端ではないということを言っているのではないかと感じました。

そして、ヨコイズムに欠かしてはならないのは「実現」です。いくらアイデアと技術があってもお金と人がいなければ何もできないということです。そのあたりのバランス感覚の良さが横井氏の閃き力や技術力よりも秀でた一番の才能であることがよく分かります。 さらに「遊び」を制するためには、面白い遊びを作り出すだけではまだ足りなくて、その「遊び」が人々の生活にどのように溶けこんでいくかここまで先回りして予想できるようなビジョンを打ち立てないといけないということが本書からは見て取ることができました。

これらのことは、それはそれは至極当たり前のことなんだけど、そのことを根本的に理解し、実現していくことの難しさとその困難に立ち向かう光明、これこそがヨコイズムであると私は強く思っています。

「アイデアを持って策謀を成す」人 これが本書を読み終わった時の私の横井さんに対する印象でした。 作る側、遊ぶ側エンターテイメントに少しでも携わる者としてはぜひ読んでおきたい一冊です。

『ノンデザイナーズ・デザインブック』を読んでの感想

ノンデザイナーズ・デザインブックを読んだ読書感想文。

概要 ~Hello Design World~

本書はタイトル通りデザイナーではないが洒落乙なプレゼンテーションやwebページをなどを作成したい人向けの本です。私がコードだけで全てを語ることができるハイパーエンジニアならばよいのですが、残念ながらそうではありません。自分の行った成果を人に正しく伝える手段を身につけなければいけません。この本は情報をデザインし、相手に伝わるアウトプットに昇華させるテクニックを紹介してくれています。

大きくは前後半の2部構成になっています。前半はデザインの4つの大原則「近接」「整列」「コントラスト」「反復」と「色」についての知識紹介です。さらに、前半最後では4つの原則を豊富なサンプルを交えてトレーニングしてくれます。

以下に紹介されている4つの原則について簡単にまとめてみました。

  • 「近接」とは、関連ある要素を近くに配置しまとめ、逆に関連しない項目同士を離すことで情報を組織化することです。

  • 「整列」とは、デザインの組織化に加え一体感を演出し情報を整理する効果があります。もう1つの目的としてユーザの視点を誘導し情報の組織化を行います。安定感を求め何も考えずに中央揃えにしてしまうことがあるがこれは良くありません。中央揃えは角張った静粛な場面など目的のある場合を除いて使わないようにすべきです。左揃えや右揃えを使用したほうが洗練したデザインをつくり上げることが可能です。また、基本的には1ページには1種類の方向へ揃えるべきです(例えば、右揃えと中央揃えを併用してはいけない)。

  • 「反復」とは、デザインにリズムを生み出し、そのコンテンツに一貫性を与えてくれます。小見出しなど既に反復している要素を目立たせることで情報に一体感を演出してくれます。

  • コントラスト」とは、実現方法はフォントの選択、色、形、サイズ、空白などあらゆる方法があります。大事なことは2つの要素の違いをはっきりくっきりさせるさせることで、微妙な違いは意味がありません。決して、臆病になってはいけないのです。

後半は「フォント」の重要性と使い方にページを割いています。残念なのは欧文フォント向けに書かれており、日本語フォントにはそのまま当てはめれない部分があることです。別に、日本語フォントの知識について資料を読む必要性がありそうです。

実践 ~ただの履歴書には興味ありません~

「ただの履歴書には興味ありません。この中に優秀なエンジニアがいたら弊社のところに来なさい。以上」

将来、人材エージェント、ジョン・スミスさんからこのような転職の誘いを受けるかもしれません。今回、そんな来る日に備え自分の履歴書を作成してみました。

before

(注意:この履歴書の内容はフィクションです)

希望職種はエンジニアなので、これで十分でしょうか(?_?)う〜ん、どうも私の優秀さが伝わっているとは思えません。ひと目にも触れることはないでしょう(´・_・`)
このことから履歴書においても最低限の身だしなみは大切なことがよく分かります。それでは、この『ノンデザイナーズ・デザインブック』に紹介されているテクニックを実際に使ってみましょう。

after

主な変更点

  • 中央揃え → 右揃えにする
  • 「学歴」や「志望動機」などの小見出しは左揃えにすることによってコントラストを出した
  • オレンジの水平線を小見出しの下に挿れることによって反復とグループ化を図った
  • afterの左側には大きく名前バーを設置しアピール
  • 「履歴書」や「名前」など書かなくても分かる情報をafterでは削除
  • フォントの種類を1種類から2種類へ
  • フォントを「MSP ゴシック」から「ヒラギノ角ゴ Pro」「ヒラギノ明朝 Pro」へ変更
  • afterでは小見出しや左側の名前バーにはサンセリフな「ヒラギノ角ゴ Pro」を、本文にはセリフ体である「ヒラギノ明朝 Pro」を使用しコントラストを出した
  • afterの名前バーと小見出しには同じフォント使用しているが、それぞれw6, w3を使用しwightを変えている
  • afterの左側の茶畑の緑と水平線のオレンジ色は補色関係である

なんということでしょう。素人目にもだいぶデザインが改善されたことを感じることができます。これならばジョン・スミスさんもひと目見る気になるかもしれません。今の私は中身が伴っていないので落とされるでしょうが、見てもらえるだけでも一歩前進です。

もちろん、まだまだこの履歴書には改善や工夫の余地は残されていると思います。しかし、私はエンジニアだからデザインなんか関係ないというダメ意識は少なくとも改革することができました。

まとめ ~さよなら絶望デザイン~

この本の冒頭にジョシアツリーの話が出てきます。確かにそこに存在はしていたがまったく意識することがなかったので認識出来なかったジョシアの木を図鑑を見て名前を認識することによってはじめて見えるようになったというお話です。「知識」が足されることで新たな世界を見ることが出来るようになったのです。このように、この本ではデザインに対してまったく知識のなかった私に新たな視点を与え新たな世界を見せてくれました。

私はデザイナーとは、無数のフォントや色を巧みに駆使し素敵なイラストやキャラクターを散りばめ、私が作った糞ダサなwebページも一瞬にして絶対アクセスしたくなるようになる、そんなことができる人のことだと思っていました。まるで魔法使いです。人は自分の領分以外の理解が及ばない分野になると魔法のような感覚に陥ることがあるかもしれません。しかし、その正体は魔法なのではなく小さな知識やテクニックを駆使した努力の結晶だったです。

今回、この本を読みデザインの世界を少しだけですが覗くことによって魔法などではない努力の積み重ねを理解することができ、少しだけですが真似ごとができるようになりました。

『リーダブルコード』を読み終えての感想

リーダブルコードを読んでの読書感想文です。

Amazon.jp : リーダブルコード―より良いコードを書くためのシンプルで実践的なテクニック (オライリー・ジャパン)

概要 〜Hello Readable World !〜

この本は大きく分けて4部の構成でリーダブルで美しいコードを書くための手法やテクニックについて書かれています。

第1部は変数や関数名の付け方やコメントの付け方など、私のような経験のない者でもすぐに実行できそうな「表面上の改善」です。

第2部が「ループとロジックの単純化」です。ロジックというからには小難しいプログラミングの話になってしまうのかと思いましたが、そんなことはなく三項演算子やdo while, go to文、グローバル変数はロジックが複雑になるから使わないようにしましょうといった話でした。ただ使うなと押し付けるのではなく使わないほうがよい理由がはっきりと書かれているので自然と受け入れることができます。また簡単な名前で式を説明することでコードを文書化する(説明変数)手法が紹介されていてなるほどと納得する考え方でした。そして、変数を複雑化させないために変数の数はできるだけ増やさないほうがよいという考え方は、ハッとする気づきだった。当たり前のことではあるが当たり前のことを体系化し意識することがとても重要なのだと感じました。

第3部が「コードの再構成」です。何も考えなしに実装を進めると大抵コードは肥大化していってしまう。それを考えもなしに分割し、どの関数がどの関数を呼び出しているかの依存関係が分からなくなり、ローカル変数名とグローバル変数名が衝突し、完全に袋小路に嵌り込む(;´Д`)
そして、この第3部では、そんなこともあろうかと救世主ばりに解決策を提示してくれます。具体的には、汎用部分の切り出し方、1度に一つのタスクを関数などのまとまりにする、関数ロジックを3行ほどで簡単に説明できるようにするといった手法が紹介されています。

第4部はテストコードのリーダブル手法とそれまでに紹介されたノウハウを活かした具体的な実装をテーマとして取り上げた実践的な内容です。

実践 〜ひと目で尋常でないコードだと見抜いたよ〜

かねてより自分のコードには漠然とした汚さを感じていました。しかし、なぜ自分のコードが汚いと感じるかが理解できませんでした。
それではここで私の汚コードを振り返って見ましょう。 以下にリーダブルコードを読んで気づいた直近に私の書いたJSコードの汚さの原因を挙げてみました。

  • 何も考えずに変数や関数に抽象的な名前をつけている。1つのプログラム内でキャメルケースやスネークケースが入り乱れていて、名前の付け方を何も考えていないことがよく分かる(´・_・`)

  • グローバル変数を考えなしに使っていて、変数が行方不明に陥っている(゚ロ゚;)

  • 目を凝らさないとどんな機能を持った関数なのかよく分からない
  • 似たような機能を持つ関数が乱立している
  • 3重ループのようなネストの深い文があり、配列のどこにアクセスしているのかがよく分からなくなっている

リーダブルコードを読んだことによって、モヤモヤしていた不快感を具体的に気づき見抜くことが出来ました。少し進歩です。
では、次に解決策を挙げてみましょう。

  • できるだけローカル変数を利用し、スコープを小さく保つ
  • 関数名を熟考し具体的につける。シソーラスを活用する
  • 駆動開発をする前にプログラムの流れを書き出し、機能別に必要な関数を挙げていく
  • 自分の考えをコメントとして残す
  • 行数が増えてもネストは浅くし、目に優しくする

たぶんこれだけでは完璧なコードになったわけではないでしょう。すぐにこの本に書かれていること全てを実行するのは不可能だし、その必要もないと思います。大切なのは綺麗なコードを書くことを常に頭に置き、習慣化していくことです。紹介されているテクニックから必要だと思うものを使っていけば少しづつではあっても綺麗なコードになっていくのではないかと思います。

まとめ 〜やればわかる!!やらなければ一生わからん!!〜

シンプルで分かりやすく、理解しやすいコードは「美しいコード」です。美しいコードはメンテや拡張、リファクタリングがしやすい。実際にそのような完成された美しいコードを見てしまうと、このコードは熟練したセンスや勘のような自分にはないものを持っている人にしか書けないんだと思い込み、美しいことは理解できるけど真似出来るわけないと落ち込んでしまっていましたorz

しかし、この『リーダブルコード』では職人芸のような完成されたコードも実は1つ1つはそれほど複雑ではない手法や小さいテクニックの積み重ねによるロジカルな集合体であることを具体例を交えて紐解いてくれています。1つ1つは小さく真似できますが、多くの考えを組み込むことで職人技のようなそう簡単には真似できない美しいコードが出来上がっていることを教えてくれています。そして自然と美しいコードを書けそうな気分にさせてくれます。

ただ、気分になっているだけでは何の意味もありません。実際にリーダブルなコードを書けるようにならなければいけません。そうしなければ役立たずとマサカリを投げられ死ぬだけですorz たどたどしくとも実践していくことこそ大切です。はじめは引き出しや要領がない分、よく考え悩まなければいけない時間が多く大変です。しかしその考え抜く時間を少しづつ積み重ねることが経験を積むということであり、それがセンスや勘と呼ばれる本質的な理解へとつながっていくのではないかと思います。

SF映画バック・トゥ・ザ・フューチャー2』では主人公たちが劇中で30年後の未来へ行くシーンがあり、先日その未来2015年10月21日が実際にやってきました。どれくらい映画の世界観が現実のものになっているかが話題になっていました。今から30年後に思いを馳せると自分が寝ている間にコードが完成している夢のような世界が待っているかもしれません。しかし、何年経とうと「悩み」「考え」「最適化」していくというサイクルは要領のよい人工知能やアンドロイドには真似出来ない気がします。アンドロイドには書けないリーダブルな美しいコードを30年後の自分が書いていることを夢見て、今後のコードを積み重ねていきたいと思います。

JSでボタンを押すと音が鳴る実装

ボタンを押すと音声が流れるサンプルです。

HTML

<!-- ボタンの設置 -->
 <input type="button" value="再生" onclick="ring()">
<!-- 音声ファイルの読み込み -->
<audio id="tts">
  <source src= "audio/sample.mp3" type="audio/mp3">
</audio>

JavaScript

<script type="text/javascript">
  function ring(){
    document.getElementById("tts").load();
    document.getElementById("tts").play();
  }
</script>

HHVMで性能テストもどきしてみた

HHVMをせっかくインストールしてみたので、今回は本当にHHVMは通常のPHPよりも速いのかの性能テストをしてみました。

環境

MacAirにVagrantで以下の環境を構築して比較を行ってみる。

  • ubuntu14.04 + nginx + HHVM(Hackコード)
  • ubuntu14.04 + apache2 + php5.5

(より本番環境を想定するとローカルサーバーは良くないのでは(・・?))

ソースコードはあんまりいいものが思いつかずFizzBuzz問題を使用することにした。
ループ回数を100, 10000, 1000000回で実施した。

fizzbuzz.php

<?php
  for($i = 1; $i < 1000000; $i++){
    if($i % 15 == 0){
      print("FizzBuzz\n");
    }else if( $i % 3 == 0){
      print("Fizz\n");
    }else if( $i % 5 == 0){
      print("Buzz\n");
    }else{
      print($i."\n");
    }
  }

Hackのコードは冒頭の<?phpの部分を<?hhに変更するだけでよい。

Apache Bench

ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4

Apacheをインストールするとデフォルトでくっついてくる
サクッとお手軽に負荷テストができるApache Benchというものがあるので今回はこれを使う。

AB(Apache Bench)の使い方

ab -n リクエストの総数 -c クライアント数(ユーザー数)

ab -n 100 -c 100 http://192.168.33.10/hello.php

結果の見方

f:id:orange_lily27:20150522111510p:plain

結果はこんな感じで返ってくる。それぞれの意味合いは以下のようになる。

結果 説明
Concurrency Level クライアントの数、-cの後の値が返ってくるはず
Time taken for tests 接続時間
Complete requests 成功したリクエストの数
Failed requests 失敗したリクエストの数
Requests per second 1秒当たりに処理できるリクエスト数
Time per request(mean, across all concurrent requests) 1リクエスト当たりの処理時間

Concurrency Levelを徐々に増やしていき、Failed requestsが発生した時点がそのサーバーの処理限界ということになる。

測定結果

HHVMと通常のPHP環境それぞれにFizzBuzzのループ回数を増やしていき、以下のコマンドを5回づつ実施した。

ab -n 250 -c 250 http://192.168.33.10/fizzbuzz.php 

それぞれのRequests per secondの結果を以下に示す。

100ループ

HHVM + nginx PHP + apache2
1回目 507.72 548.80
2回目 506.23 543.82
3回目 509.12 542.11
4回目 505.88 546.89
5回目 507.35 544.71
平均値 507.26 545.27

同じくらいかどちらかというと通常のPHPの方が処理速度が速いことが分かる。

1万ループ

HHVM + nginx PHP + apache2
1回目 564.48 230.76
2回目 565.06 232.59
3回目 564.84 228.59
4回目 562.77 231.54
5回目 558.20 236.23
平均値 563.07 231.94

通常のPHPがループ回数を100倍したことにより処理速度が1/2以上落ち込んでいる。一方で、HHVMの方は100ループの時よりも100000ループの方が処理速度が変わらないどころかちょっと速いという謎の結果になった。

100万ループ

HHVM + nginx PHP + apache2
1回目 572.52 2.62
2回目 558.95 2.64
3回目 570.53 2.65
4回目 567.62 2.67
5回目 559.75 2.83
平均値 565.87 2.68

ここまでループ回数を増やすとHHVMの方が圧倒的に速い。200倍以上速いことになっている。それとHHVMの特徴として目につくのはループ回数を増やしても性能がほとんど変化していないということである。

HHVMを使ってみた

HHVMをインストール、実行してみた時の備忘録。

HHVM(Hip Hop Virtual Machine)とは(?_?)

ヒップホップとか名前からしてふざけている気がするけど、HHVMはFacebookが開発を行っているプロジェクト。レガシーPHPコードをHHBC(Hip Hop Byte Code)に変換してVM(仮想マシン)上で実行して爆速化しようぜということ。たぶん。

HHVMインストール

今回はubuntu14.04にインストールを行った。

レポジトリを追加してインストールする。

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
sudo add-apt-repository 'deb http://dl.hhvm.com/ubuntu trusty main'
sudo apt-get update
sudo apt-get install hhvm

nginxをインストール

apache2でもできるみたいだけどFastCGIが標準でついていなくて面倒臭そうなので、チュートリアルに従ってnginxをインストールする。

sudo apt-get install nginx

f:id:orange_lily27:20150520115357p:plain
ローカルホストにアクセスして以上のように表示されれば成功。

nginxの設定

以下のシェルスクリプトを実行するといい感じにnginxとhhvmが関連付けられるみたい。

sudo /usr/share/hhvm/install_fastcgi.sh

HHVMの設定

nginxのドキュメントルート/usr/share/nginx/htmlに、中身もファイル名も空の.hhconfigファイルを作成する。

sudo touch .hhconfig

.hhconfigを作成したディレクトリで、hh_clientを実行する。

hh_client

nginxとhhvmを再起動させる。(インストールが完了した時点で勝手に起動している)

sudo service nginx restart
sudo service hhvm restart

そして以下のようなHackファイルを作成する。

info.php または info.hh

<?hh
echo phpinfo();

ローカルホストにアクセス。

f:id:orange_lily27:20150520140821p:plain

上記のように表示されれば成功。HHVMではphpinfo()を出力させるとHipHopと表示されるだけ。
ベンチマーク取る実験はまた今度。

Hack言語

ちなみに先ほど作成したファイルのHackとはHHVM上で実行できる言語。と言っても基本的にはPHPコードの冒頭を<?php<?hhに変更するだけでよい。但し、完全に互換性を持っているわけではない。HTML中に埋め込むことも出来ない。ファイル拡張子は.phpまたは.hh

参考