develog.me

into VR

Oculus Riftを注文したら届くまでに急いでやるべきこと

https://lh6.googleusercontent.com/--YE_MR1WsqU/UY3XHQQuorI/AAAAAAAAANc/3T3NnYuotUI/s600/IMG_2792.JPG

届いてからでは遅い

  • ゲーム目的で買った人もこれを読んだらすぐにやって欲しい。俺みたいに悲しい思いをしないように。
  • 今世紀最高のゲーム体験ができるデバイスを手元で腐らせるのはもったいない。
  • もちろんUnityで画面の中の嫁に会いに行く兄弟も準備を怠るな。

FPS酔いに慣れる

  • FPS酔いとは、現実の運動と見えている風景の遅延から起こる違いで脳が混乱しておこる車酔いみないな症状。
    • 視野角が広がったことにより、普通にFPSやるより酔いやすい。
    • よくFPSで酔うのなら画面から離れてやるという策がある。視界にしめる割合を減らして脳の混乱を抑えるものだが、Oculusだと離れようがない。
    • さらにFPSでは視点移動はマウスなので、脳が現実の運動と直接リンクしない(けど酔う)
      • Oculusでは頭の動きなど現実の運動と同じことで視界の移動ができてしまうため酔い易い。
  • どうすればいいのか
    • 訓練あるのみ
      • FPSを前のめりで視界いっぱいで遊ぶ。
      • 気持ち悪く なりそうになったら 休むを繰り返す。一週間くらいで慣れる。

訓練もといOculusが来たら接続するだけでゲームが出来るように準備をしておく

  • Oculus VRで配布された Team Fortress 2 で遊ぶ。

Unityで画面の中の嫁に会いに行く準備

それもこちらの記事参照 Oculus Riftが到着してからやったこと

Oculus Riftが到着してからやったこと(随時更新)

https://lh4.googleusercontent.com/-WJUZhTSAE4A/UY3W6UEc8PI/AAAAAAAAALg/a6BiVZjMqwk/s600/IMG_2795.jpg

早速!。。って何からやったものか

changelog

  • up 2013-06-09 Oculus + Unity + Razer Hydraで VRDemo Tuscany を動かす 追加
  • up 2013-06-08 いろいろ追加
  • up 2013-05-19 VMD Loaderまで
  • up 2013-05-12 PMD Loaderまで
  • new 2013-05-11 開発環境構築途中まで

とりあえず初体験してみる

すごいガジェットが手に入った!! けど、何からしていいものか、とりあえずOculusの実力を体験してみる。

その前に色々準備

PCと接続

  • 本体は実際に頭に装着するHeadsetと、電源ON/OFF・ブライトネス・コントラスト操作のControl Boxがケーブルで接続されている。
  • Control Boxに電源通してPCとUSB接続。あと映像のためのHDMIかDIV挿せばOK。

その1 Steamゲームで遊ぶ

Team Fortress 2 で遊んでみる - 無料

  • ユーザー登録とSteamクライアントインストール。
  • Oculus VRのHatCodeを使ってゲームをインストール
    1. クライアントインストール後に「ライブラリ」の左下、「ゲームを追加…」から「Steamでアイテムを有効化する…」を選ぶ。
    2. HatCodeを使ってゲームを有効化する。
    3. ダウンロード、インストールが終わったら、「ライブラリ」から「Team Fortress2」を選んで右クリック。「プロパティ」を開く。
    4. 「一般」の「起動設定…」に -vr を入力。
    5. 現在は関係ないが、ちょっと前に画面分割されなくなる不具合があったみたいで、念のため「ベータ」で「prerelease」選ぶ。
    6. ゲーム開始。「プレイ」かダブルクリックで。最初のメニュー画面は左右分割されない。ゲームプレイ時の画面でようやく分割表示される。(ロード画面も分割されない。)
    7. 文字は荒い。ゲーム中のInfoは左だけ表示で右にボタンあったりすると押せない。
      1. vr_calibration コマンドやら手はあるかとは思うがそこまで詳しく見てない。
      2. 詳しくはこちらで Oculus Rift User Guide - Official TF2 Wiki | Official Team Fortress Wiki

Half-Life 2 で遊んでみる - 有料

その2 ユーザー作成ゲームで遊ぶ

@warapuriさん作、巨人立体機動ゲーム

  • Titan - UnityGames
    • 進撃の巨人風ゲーム。
    • v0.0.5の時点では人類に巨人を倒すすべはありません。捕食対象です
    • 立体機動で空を縦横無尽に飛び回る爽快感は凄い。
    • Macでは無理っぽい?VMでやっても真っ黒
    • Ver. 0.0.5
      • 巨人がプレイヤーを食べるようになりました
    • Ver. 0.0.4
      • 巨人が自分を追いかけて捕まえるようにしました
    • Ver. 0.0.3
      • 巨人がこっちを見るようになりました
    • Ver. 0.0.2
      • 鎖で引っ張られている最中は↑方向(頭方向)に力が加わるようにしました
    • Ver. 0.0.1
      • 敵は倒せません
      • 見る以外何もできませんので絶望感を味わって下さい

ギロチン体験

Oculus Developer Forums - Oculus Showcase

その3 YouTube

その4 UnityでParaisoを作る

  • 導入
    • 注意
      • Unityの正しい知識が欠如しています。間違いは Pull Request Twitterからご指摘ください。
      • MMD for Unity SVNから直接Checkoupしてきた r129 使用
        • MacUnity では、 PMD Loader でモデルデータをConvertすると、生成される Materials Physics ファイルが文字化けして、参照に失敗するみたいなので Windows必須
      • ただし、 Windows 32bit では Oculus Unity でdll参照時に64bitのdllをみてエラーっぽい(未確認)ので、実行は MacUnity でやっている。
    • Unity導入
      • UnityでOculusを使うにはProライセンスが必要(133,875円)
        • Oculusユーザーは4ヶ月Trialできるらしいけど?
        • すでにインストール済みで普通のLICENSEの人は、「Manage License」から適当にライセンスリセットで途中からUnityのライセンス切り替えができる。
    • MikuMikuDanceを手に入れる
    • Oculus VR Developer登録してSDKを入手する
  • 手順
    1. Unity新規プロジェクト作成〜Oculus・フィールド下準備
      1. OculusUnityIntegrationに入ってるサンプル「が僕達の新居にふさわしいので、この中で同居します。フヒヒ」『内にMMDのモデルを配置する』
        OculusUnityIntegrationGuide.pdfを参考に、元となるプロジェクトをUnityで準備する
        1. Unityで新規プロジェクトる
        2. プロジェクトにサンプル読み込ませる(Windowsだと強制終了食らったのでMacで作業 Oculus Unity v0.22)
          • メニューの Assets -> Inport Package -> Custom Package で OculusUnityIntegrationTuscanyDemo.unitypackage を選ぶ
          • Project ビュー の Tuscany Scenes SRDemo_Tuscany.unity をダブルクリック 出てきた ダイアログは Don’t Save を選ぶ
        3. Scene に表示されるはず。上の 押して試してみる。
          • 操作はFPS風のWASD(詳しくはOculusUnityIntegrationGuide.pdfのp5, 2.2)
    2. ミクに裸Yシャツになってもらう UnityでMMDモデルを追加する(MMD for Unity、MFU r129)
      • 全面的にこちらの記事を参考に作る
        【MMDforUnity】UnityでMMDモデルを動かす: 名も無き製作室
        1. Unityで作ったプロジェクトでMMDが動くようにPluginとか追加
          • SVNからチェックアウトしてきた mmd-for-unity/trunk 下の MikuMikuDance for Unity フォルダごと Project View に D&D
            • メニューバーの PluginsMMD Loader が追加されたら成功
        2. 嫁を手に入れる
        3. MMDモデルファイル .pmd を変換してUnityプロジェクトに読み込ませる
          1. Unityの Project ViewMMDModel フォルダを追加して、 MMDDaccs_0150 フォルダごとどらっぐどろっぷ
            • ものによって依存とかあるみたいで、単品で最低限コピーするとめんどくさそう。
            • これがいいのか悪いのか知らないけど ハーレム 後からばかすか入れるつもりで管理が用意だからこうする。
          2. PMD Loader を使って .pmd ファイルを Convert
            • PMD Loader 起動
              • メニューバー Plugins から、 MMD Loader > PMD Loader
            • Convert対象の .pmd ファイルを選択して Convert
              • Project ViewMiku wDummy.pmd を、 PMD file : None(Object) の上にD&D
                • (それか None(Object) の右にある丸アイコンをクリックして出るとこから選ぶ)
              • Convert クリック
              • 正常に取り込めたら、 Hierarchy View に生成されたモデルを Project View の同じく生成された Asset (白い四角アイコン)に D&D
                • これをやらないと VMD LoaderPrefab の選択肢に出てこない。
            • TroubleShooting
              • NullReferenceException: Object reference not set to an instance of an object
                • メッセージ押せばエラー発生箇所がでる。コード嫁
              • 取り込んだモデルのテクスチャがかけている、真っ白、真っ黒
                • .pmd が参照するテクスチャ画像ファイルを Project View に持ってき漏れている。
                  そもそもモデルのディレクトリまるごとコピーしていれば問題ない
              • ただでさえ天使で眩しいミクさんが眩しすぎて辛い
                • 取り込んだ Materials の設定で光の当たり方を変える必要がある。
                • Project View の生成した Prefab (青い四角アイコン)と同じ階層にある Materials フォルダ以下のファイルを全選択
                • Inspector ViewShader で Diffuse を選ぶ
              • 浮気したわけでもないのに天使のはずのミクさんの顔の影が怖い
                • 他の物体から影を計算する Receive Shadows が効いている。
                • 本来は正しくモデルを直すべきだが、一生を共にするつもりはないので OFF にする。
                • Project View の生成した Prefab (青い四角アイコン) ファイルを選択
                • Inspector ViewSkinned Mesh Renderer Receive ShadowsOFF
              • ネクタイ・スカートがめり込む
                • いろいろ方法があるみたい。
                • Ki式初音ミクAct4 さんの場合は、
                  • MFUr122 から r129 に変えて取り込み直したら、スカートめり込まないようになった。
                  • ネクタイは ネクタイ1Configurable JointAngular XMotionLimitedLocked で(Limitedのまましきい値設定でも良さそう)
          3. 晴れて配置が終わったら、巨人ミクさんのサイズを変える
            • Convert直後に配置されるミクは駆逐対象サイズなので、自分の性癖の身長に変更
              1. Project View の生成した Prefab (青い四角アイコン) ファイルを選択
              2. ScaleX Y Z を次の値で統一する。
                目安としては、ペドは 0.1以下 、ロリは 0.1 、普通は 0.15 あたりで。モデルによって変わるかもしれない
    3. 配置したモデルにMotionを割り当てる
      1. MMDのモーションデータ .vmd を変換する
        1. モーションデータを拾ってくる VPVP wiki - モーションデータ/日常系・その他
        2. VMD Loader を使って .vmd ファイルを Convert
          • VMDLoder 起動
          • メニューバー Plugins から、 MMD Loader > VMD Loader
        3. PMD Prefab には先程生成してこちょこちょした Prefab ファイル
          • PMD Loader 取込、 Convert 直後に次の操作が必要(上から読んでいたら実行済)
          • Hierarchy View に生成されたモデルを Project View の同じく生成された Asset (白い四角アイコン)に D&D 青い四角アイコンに変わればOK
          • しないと VMDLoder の選択肢で、 PMDLoader でConvertしたモデルが選べない。
        4. VMD file歩く10.vmd
        5. よく知らないけど Create Asset にチェック
        6. よく知らないけど Interpolation Quality はそのまま 1
        7. Convert
        8. Prefab と同じ階層に Animation フォルダが生成され、その中に 再生ボタンっぽいアイコンのファイルができる。
      2. モデルに変換したモーションデータをバインドする
        1. このままじゃモデルにバインドされてないので、再生ボタンっぽいアイコンのファイルを選んで青い四角アイコンの Prefab に D&D
        2. 一回しかモーションしてくれないので Loop させる
          • 再生ボタンっぽいアイコンのファイルを選んで Inspector ViewWrap Mode から Loop を選ぶ
        3. ここまでを確認
          • 押して試してみる。
          • 操作はFPS風のWASD(詳しくはOculusUnityIntegrationGuide.pdfのp5, 2.2)

Oculusに関連するもの

ガジェット

DELTA SIX

Omni by Virtuix

Leap Motion

Razer Hydra

ゲーム

Oculus + Unity + Razer Hydraで VRDemo Tuscany を動かす

  • Sixense Razer Hydra Oculus Rift Tuscany Demo RELEASED
    • SourceCodeの公開渋ってるから自分でやってみた
  • ポイントは3つ
    • RazerHydraをUnityで使えるようにするAssetを入れる
    • 手のオブジェクトを移動に追従するようにする
      • Hierarchy でオブジェクトの入れ子を変更
        • OVRPlayerController/OVRCameraController/CameraLeft/Left Hand
        • OVRPlayerController/OVRCameraController/CameraRight/Right Hand
    • RazerHydraのJoystickで移動する
      • OVRPlayerController.cs 書き換え( // Razer Hydra の3箇所)
        public virtual void UpdateMovement()
        {
          // Do not apply input if we are showing a level selection display
          if(OVRMainMenu.sShowLevels == false)
          {
            bool moveForward = false;
            bool moveLeft    = false;
            bool moveRight   = false;
            bool moveBack    = false;
        
            MoveScale = 1.0f;
        
            // * * * * * * * * * * *
            // Keyboard input
        
            // Move
        
            // WASD
            if (Input.GetKey(KeyCode.W)) moveForward = true;
            if (Input.GetKey(KeyCode.A)) moveLeft  = true;
            if (Input.GetKey(KeyCode.S)) moveBack    = true; 
            if (Input.GetKey(KeyCode.D)) moveRight   = true; 
            // Arrow keys
            if (Input.GetKey(KeyCode.UpArrow))    moveForward = true;
            if (Input.GetKey(KeyCode.LeftArrow))  moveLeft    = true;
            if (Input.GetKey(KeyCode.DownArrow))  moveBack    = true; 
            if (Input.GetKey(KeyCode.RightArrow)) moveRight   = true; 
        
            if ( (moveForward && moveLeft) || (moveForward && moveRight) ||
               (moveBack && moveLeft)    || (moveBack && moveRight) )
              MoveScale = 0.70710678f;
        
            // No positional movement if we are in the air
            if (!Controller.isGrounded) 
              MoveScale = 0.0f;
        
            MoveScale *= DeltaTime;
        
            // Compute this for key movement
            float moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier;
        
            // Run!
            if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
              moveInfluence *= 2.0f;
        
            if(DirXform != null)
            {
              if (moveForward)
                MoveThrottle += DirXform.TransformDirection(Vector3.forward * moveInfluence);
              if (moveBack)
                MoveThrottle += DirXform.TransformDirection(Vector3.back * moveInfluence) * BackAndSideDampen;
              if (moveLeft)
                MoveThrottle += DirXform.TransformDirection(Vector3.left * moveInfluence) * BackAndSideDampen;
              if (moveRight)
                MoveThrottle += DirXform.TransformDirection(Vector3.right * moveInfluence) * BackAndSideDampen;
            }
        
            // Rotate
        
            // compute for key rotation
            float rotateInfluence = DeltaTime * RotationAmount * RotationScaleMultiplier;
        
            //reduce by half to avoid getting ill
            if (Input.GetKey(KeyCode.Q)) 
              YRotation -= rotateInfluence * 0.5f;  
            if (Input.GetKey(KeyCode.E)) 
              YRotation += rotateInfluence * 0.5f; 
        
            // * * * * * * * * * * *
            // Mouse input
        
            // Move
        
            // Rotate
            float deltaRotation = 0.0f;
            if(AllowMouseRotation == false)
              deltaRotation = Input.GetAxis("Mouse X") * rotateInfluence * 3.25f;
        
            float filteredDeltaRotation = (sDeltaRotationOld * 0.0f) + (deltaRotation * 1.0f);
            YRotation += filteredDeltaRotation;
            sDeltaRotationOld = filteredDeltaRotation;
        
            // * * * * * * * * * * *
            // XBox controller input  
        
            // Compute this for xinput movement
            moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier;
        
            // Run!
            moveInfluence *= 1.0f + 
                       OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftTrigger);
        
            // Razer Hydra
            uint buttonsCount = 0;
            string buttonsText = "";
            string buttonsText2 = "";
            if (SixenseInput.Controllers[0].Enabled) {
              foreach (SixenseButtons button in System.Enum.GetValues(typeof(SixenseButtons))) {
                if (SixenseInput.Controllers[0].GetButton(button) && (buttonsCount < 4)) {
                  if ( buttonsText != "" ) {
                    buttonsText += " | ";
                  }
                  buttonsText += button;
                  buttonsCount++;
                } else if (SixenseInput.Controllers[0].GetButton(button) && (buttonsCount >= 4)) {
                  if (buttonsText2 != "") {
                    buttonsText2 += " | ";
                  }
                  buttonsText2 += button;
                  buttonsCount++;
                }
        
                if (SixenseInput.Controllers[0].GetButtonDown(button)) {
                  Debug.Log("Pressed = " + button + ":" + buttonsText2);
                }
        
                if (SixenseInput.Controllers[0].GetButtonUp(button)) {
                  Debug.Log("Released = " + button + ":" + buttonsText2);
                }
              }
            }
            //guiText.guiText.text = "Buttons = " + buttonsText;
            //guiText2.guiText.text = "" + buttonsText2;
        
        
            // Move
            if(DirXform != null)
            {
              float leftAxisY = 
              OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftYAxis);
        
              float leftAxisX = 
              OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftXAxis);
        
              // RazerHydra
              if (SixenseInput.Controllers[0] != null) {
                leftAxisY = SixenseInput.Controllers[0].JoystickY;
                leftAxisX = SixenseInput.Controllers[0].JoystickX;
                if (buttonsText == "JOYSTICK") {
                  leftAxisY *= 2.0f;
                  leftAxisX *= 2.0f;
                }
              }
        
        
              if(leftAxisY > 0.0f)
                  MoveThrottle += leftAxisY *
                DirXform.TransformDirection(Vector3.forward * moveInfluence);
        
              if(leftAxisY < 0.0f)
                  MoveThrottle += Mathf.Abs(leftAxisY) *    
                DirXform.TransformDirection(Vector3.back * moveInfluence) * BackAndSideDampen;
        
              if(leftAxisX < 0.0f)
                  MoveThrottle += Mathf.Abs(leftAxisX) *
                DirXform.TransformDirection(Vector3.left * moveInfluence) * BackAndSideDampen;
        
              if(leftAxisX > 0.0f)
                MoveThrottle += leftAxisX *
                DirXform.TransformDirection(Vector3.right * moveInfluence) * BackAndSideDampen;
        
            }
        
            float rightAxisX = 
            OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.RightXAxis);
        
            // RazerHydra
            if (SixenseInput.Controllers[1] != null) {
              rightAxisX = SixenseInput.Controllers[1].JoystickX;
            }
        
        
            // Rotate
            YRotation += rightAxisX * rotateInfluence;    
          }
        
          // Update cameras direction and rotation
          SetCameras();
        
        }
        
        

Oculus Rift届きました!(フォトレビュー)

https://lh6.googleusercontent.com/-7DwzXke8pco/UY3XQ_Mwx7I/AAAAAAAAAPI/xoQQoF41BeM/s900/IMG_2748.JPG

KickStarterで出資していたOculus Riftが届きました!

  • 2012/08/15に出資をして、2013/05/11に到着。その間270日、8ヶ月と26日
    • 半年以上。SonyのHMZ-T1より待たされた。
  • 出資額は$300+送料$30
  • 当初は12年末、13年の2,3月と言われハラハラしたのはいい思い出。
  • Order IDは0070xx ちょっと出遅れた感じ。
  • Order Statusの変化
    • 13/05/11 オーダーステータスに変更はなく到着。不意打ち
    • 13/05/05 PROCESSING:Your order has been checked out for shipping and will be shipped in the next batch. We’ll send you a notification once it’s shipped.
    • 13/05/04 Processing - Your order is being processed for shipping.
    • 13/05/03以前、失念。 Ready - Your order is ready! We’ll notify you as soon as it’s shipped.

付属品

  • 基本別途ケーブル類を揃える必要はない。
    • 付属の電源アダプタも日本で使える。
    • PCとの接続についても外部出力にDIVかHDMIの端子がある最近のPCならOK。(D-subはコネクタ別途必要)
    • PCとは映像出力のためのDIVorHDMI接続と、データ連携でUSB接続が必要。
  • Headset
  • Control Box
  • 3 Pairs of Lenses
  • Over-the-head Strap
  • 3ft DIV Cable
  • 6ft HDMI Cable
  • 3ft HDMI Cable
  • Power Card with Adapter
  • DIV/HDMI Adapter

画像はこちら

Mac Android開発環境構築。実機転送設定(Xperia Z)

今回はアプリの実機転送を行い、実行してみる。

前置き

SDK導入済みであること

Android 4.1

実機 Xperia Z(SO-02E)

Mac 10.8.3 Mountain Lion

手順

  1. USBドライバ設定のmanifest.ini作る
    • adt-bundle-mac-x8664-xx/sdk/add-ons/xperia-z/manifest.ini
      # SDK Add-on Manifest
      name=Sony Xperia z
      vendor=Sony
      description=Adds USB support for Xperia Z(Vendor id:0x054c)
      api=16
      revision=1
      usb-vendor=0x054c
      
  2. USBドライバ設定の反映
    • 事前にSDKのplatform-toolsへPATH通す。
      % android update adb
      % adb kill-server
      % adb start-server
      
  3. 確認
    • usb-vendorの値が追記される。
      % cat ~/.android/adb_usb.ini
      # ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.
      # USE 'android update adb' TO GENERATE.
      # 1 USB VENDOR ID PER LINE.
      0x054c
      
  4. Xperia Zの設定
    • 「提供元不明のアプリ」OFF->ON [設定]->[セキュリティ]->[提供元不明のアプリ]
    • 「USBデバッグ」OFF->ON [設定]->[開発者向けオプション]->[USBデバッグ]
    • 備考。設定不要だったもの
      • 不要。MTPのままでOK。「USB接続モード」MSCに(Mac/Linuxで広く互換性のあるものらしい。ROOT化必須なのかも)
      • 不要。PC CompanionはWindows専用「PC Companionのインストール」
  5. MacとXperia Z接続
    • consoleから確認
      % adb devices
      List of devices attached
      emulator-5554  device
      xxxxxxxxxx device  <- kore
      
  6. 実機にeclipseからアプリ転送して実行
    • 対象プロジェクト上で[Run As]->[Android Application]選択
    • 5の手順でちゃんと実機が認識されていれば、エミュレータか実機かでdeploy先選択がでる。

Cordova(PhoneGap)でAndroidApp作る その1 環境構築編

注意!2013/04/14現在の情報です。

Cordova(PhoneGap)を使ってAndroidアプリ開発環境をMac上に構築

  • JDKは入っているけどEclipseもSDKも無い状態から、Cordovaの空のプロジェクトを作成するまでを書く。
  • 設定が済んでいて、空のCordovaプロジェクトだけ作りたいのであれば Getting Started with Androidの、3.プロジェクトを作る を参照

前書きと概要

初Android端末購入に浮かれて、早速SIMアダプタぶっ壊して鬱状態です。こんにちは!0^ みなさんはSIMのゲタだけ入れて、引っこ抜くときにピンが引っかかって欠けさせることが無いようご注意くださいまし。 (修理はDOCOMO契約あれば5,000円くらい。なければ20,000円くらい。死にたい)

それでははりきってまいりましょうρ(・ω・、)

  • Cordovaとは iPhoneでもAndroidでも動くアプリをHTML+Javascriptで作れるFrameworkです。 CordovaとPhoneGapと呼び名が2つあるのは、(以下私見)Adobeが買収してアホな判断を下したから。 この記事では、呼び名を統一せず、contextで適当に呼び名を変えます。

ちなみに日本語のコミュニティの情報でさえも古いので、 英語の公式Getting Started Guides をチェックするのが良いです。

じゃつまらないので、以下の構成としてとりあえず書く(゜△゜;)

  • Mac Mountain Lion 10.8.3
  • PhoneGap 2.6.0 [ DL page ] 適当なディレクトリに展開
  • Android SDK [ DL page ]
    • eclipse入りの adt-bundle-mac-x8664-20130219 適当なディレクトリに展開

Getting Started with Android

大まかにはこれの手順に則って行う。

  1. SDKとかPhoneGapをローカルの適当なディレクトリに配置
  2. PATH通す Documentではこうなってるけど、SDKを解凍するとadt-bundle-mac-x8664-20130219なので適当に読替える。
    export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools
    ↓
    export PATH=${PATH}:/Development/Android/Toolkit/adt-bundle-mac-x86_64-20130219/sdk/platform-tools:/Development/Android/Toolkit/adt-bundle-mac-x86_64-20130219/sdk/tools
    

    Path通さないと、プロジェクト作る際に

    An unexpected error occurred: ANDROID_BIN="${ANDROID_BIN:=$( which android )}" exited with 1
    

    とおこられる

  3. プロジェクト作る
    ./create <projectルートPATH> <package_name> <project_name>
    
    <project_folder_path> is the path to your new Cordova Android project
    <package_name> is the package name, e.g. com.YourCompany.YourAppName
    <project_name> is the project name, e.g. YourApp (Must not contain spaces)
    
    • Nya プロジェクトを作成 フルパスは説明のためなんだからね(//)
      % /Development/Android/Toolkit/phonegap-2.6.0/lib/android/bin/create /Development/Android/Cordova/Nya me.develog.Nya Nya 
      
  4. eclipse起動 Documentではeclipse classicを入れてプラグイン入れてと、七面倒な手順なので、 最初からeclipse入りのSDKを使いましょう。
    • 作ったプロジェクトを開く New Projectから、 Android の中にある Android Project from Existing Code 選択
  5. Emulatorで動かす Documentでは 5A. Deploy to Emulator あたり。 なにやらエミュレータ用のなんかを入れないといけない。 ドロイド↓矢印のアイコンから適当に入れる。
  6. 実行設定
    1. Run Configurations から、 Android Application 選んで追加。
    2. Android タブ の Project: に プロジェクト名 Nyaを選択
    3. Target タブの ところで追加したEmulatorを指定してあぷらい 右下の Run で実行。初回は ANDROID とイカしたロゴが出てエラい時間待たされる。 その後 APACHE CORDOVAとかわいらしいアイコンの画面が出たらOK

Further Reading

超便利。すぐに実行結果を表示できる「quickrun.el」をさらに便利にしてみる

これがなければemacs使ってない。

quickrun.el とは、ソースコード上でプログラムの実行を行うことができるelispです。
M-x quickrun で実行。 M-x quickrun-region で選択範囲のみの実行ができるのですが、 わざわざ選ぶのはめんどくさいので、region選択の有無で自動化します。

対象

  • emacs 24
  • quickrun 1.8.2

region選択されていたら quickrun-region されていなかったら quickrun を実行する。

(defun quickrun-sc (start end)
(interactive "r")
(if mark-active
    (quickrun :start start :end end)
  (quickrun)))

使い方

(global-set-key (kbd "<f5>") 'quickrun-sc)

Octopressでプレビュー作業の決定版。ブラウザでプレビューを自動リロード表示!(octopress+guard-livereload)

Blogへ記事を投稿。ローカルの確認作業をがんばらない

編集している記事の内容を、即座にブラウザでプレビュー表示できるようにします。
またemacs引きこもりなので、ブラウザを自動的にリロードさせて最新のプレビューを表示するようにもします。

検証環境

  • Mac
  • chrome

作業フロー比較

Before

  1. プレビュー用にWEBrick起動
    1. console に移って % rake preview
    2. browser に移って http://localhost:4000 にアクセスして確認
  2. console で記事を作る % rake new_post
  3. 以下 めんどくさい ループ
    1. emacs で記事を編集
    2. console に移って % rake preview 再起動で変更内容を反映
    3. browser に移って http://localhost:4000 にアクセスして確認
  4. okならば console から % rake gen_deploy で投稿

After

  1. 変更内容を自動的に読み込ませる。毎回の % rake preview が不要になる。
    1. console に移って % rake watch
  2. プレビュー用にWEBrick起動
    1. console に移って % rake preview
    2. browser に移って http://localhost:4000 にアクセスして確認
  3. console で記事を作る % rake new_post
  4. 以下 めんどくさくない emacs ひきこもりループ
    1. emacs で記事を編集・編集・編集! emacs で保存の度に browser が勝手にリロード。最新の内容をプレビュー表示
  5. okならば console から % rake gen_deploy で投稿

導入手順

まずは、 /octopress に移動して、 % rake watch で、 _posts ディレクトリに変更があったら自動的に静的ページを public 以下へ生成するようにします。
次に、 gem gurad (指定ディレクトリの変更を監視。変更があったら任意のコマンドを実行) の、任意コマンド→ browser の自動リロードを行う、 gem gurad-livereload を使います。

gem gurad の導入

% cd octopress

gem追加

% emacs Gemfile
 group :development do
   ...
+  gem 'guard'
+  gem 'guard-livereload'
 end
% bundle

console を新規に開く

Guardの設定。監視ディレクトリ指定

% guard init livereload
% emacs Guardfile
guard 'livereload' do
  watch(%r{public/.+\.(css|js|html)})
end

browser にプラグイン導入

早速使ってみる

  1. console
    • 記事の変更で静的コンテンツ自動生成仕込む
      % cd octopress
      % rake watch
      
    • 記事の静的コンテンツ自動生成監視でブラウザ自動リロード仕込む
      % cd octopress
      % guard
      
  2. browser
    • chromeの場合は livereload の設定については特に不要。 右上のアイコンがconnectedのようになって、 % guard で、 INFO - Browser connected. といったメッセージが表示されていればOK
  3. emacs
    • 以降は、 .markdown を保存すれば、フォーカスを移してブラウザのリロードボタンを押さずとも、 裏で自動的にブラウザがリロードされて、最新のプレビューが表示されます。

だいぶ偏ったチートシート Emacs - 基本操作

emacsだいぶ偏った基本操作

カーソル移動

熟練者は C-f C-b C-p C-n を使いません。 C-s C-r で移動したい所の文字を入力します。

そのためmigemoは必須。

繰り返し操作

ログとかテスト用データなどなど、整形するのには、マクロ機能が便利。

  1. F3 で記録開始
  2. その間繰り返したい操作を行う。
  3. F4 で記録終了
  4. C-x e で再生。もちろん前に C-u を押せばその分繰り返される

矩形編集

対象の文を選択して

  • C-c r d 削除
  • C-c r t 続けて入力した文字を挿入 各列の頭にスペースを入れたりするのに便利

読み取りモードの解除

C-x C-q

文字化け解消のためとかでエンコード変更

カレントバッファのファイルのエンコード変更する。

  • M-x set-buffer-file-coding-system 続けて指定

ほかに文字化けの原因としては、tarminal、例えばteratermなんかで 受信送信のエンコード変えてみるとか。

インデントを整形

  • M-x indent-region リュージョン選択を整形
  • M-x align-regex 各列のインデントを指定文字で縦にそろえる
    (keyboard-translate ?\C-h ?\C-?) ; C-h -> BS
    (delete-selection-mode t) ; C-dでリージョン削除
    

    C-SPC でリュージョン選択 M-x align-regex Align Regex: ; を入力

    (keyboard-translate ?\C-h ?\C-?) ; C-h -> BS
    (delete-selection-mode t)        ; C-dでリージョン削除
    

    各列の終端コメントのインデントが ; でそろえられる。

設定済みのキーバインドを調べる

  • M-x describe-key 続けて確認したいキーバインドを入力
  • M-x describe-bindings‎ すべての設定を確認

毎回メニューバーから@がんばらない。よく使うのにキーボードショートカットが割り当てられていないアプリに自由に割り当てる方法(Treeでラベルカラー設定を割り当てる)

よく使うコマンドなのにキーボードショートカットが割り当てられていない。。

毎回メニューバーからちまちま選んで操作なんてしてられるかー! 今回はMacのアウトラインプロセッサで人気のTreeで、Labelのカラー設定をショートカットに割り当てます。

Macの標準の機能を利用

  1. システム環境設定
  2. キーボード
  3. キーボードショートカット タブ
  4. 左の一覧の アプリケーション
  5. 右の すべてのアプリケーション などがあるエリアの下にある、 + -+ をクリック
  6. 次の入力エリアに下記のように設定

    アプリケーション : Tree.app

    メニュータイトル :

    キーボードショートカット : ⌘R

これで設定完了。 Treeでノードを選択して ⌘R で、Labelを赤くすることができるようになります。

まとめ

メニュータイトルとはそのままの意味で、メニューバーに表示されている文言をそのまま階層関係なく入力で。