銀の弾丸、はじめました

Unityとかガジェットとか

色々あって,俺がプロ生ちゃんになるよ

この投稿は【プロ生ちゃん Advent Calendar 2015】2日目です

qiita.com


用意するもの

neuronmocap.com

f:id:japanetfutan:20150826203140j:plain

  • VR HMD(ヘッドマウントディスプレイ)Oculus Rift DK2(現在販売終了)

www.oculus.com

f:id:japanetfutan:20140319165239j:plain

f:id:japanetfutan:20151203090636p:plain

完成したモノ

画面下が プロ生ちゃん(プレイヤー)視点を単眼出力しているモノです.
ユニティちゃん にも同じモーションを流しています.

Perception NeuronはKinectと違って寝っ転がったりPCから離れてもリアルタイムにモーションキャプチャーできるのが良いです.
個人でもVR内に入り込めた感がより強まりました.

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています

CloudPebbleショートカットキー

最近のバージョンアップで色々な動作ができるようになった.
コードの画面以外でも(SETTINGSとか)でも機能する.
これで.ログ見たり実行したりが容易になった.
github.com

Command (ctrl) + Shift + P

f:id:japanetfutan:20151109094712p:plain

「r」を押すと絞られる.
この時,「Run」にフォーカスが当たっているので,そのまま Enter で実行できる.

f:id:japanetfutan:20151109094709p:plain

Pebble.js だと Chalkエミュレータが正常に動かないけど(2015/11/06現在)

一段とCloudPebbleが使い易くなった!

* 注意

私の環境だけかもしれませんが,OS XGoogle Chrome
Pocket(後で読む系サービス)のExtensionが入っていたせいで,
このショートカットキーが使えませんでした.
ショートカットキーを変更してもダメだったので無効にしました.
現状で しばらく様子みています.

chrome.google.com

TimeText の使い方

使い方が分かったのと,凄い便利だったので.

Documentを見ていたら文字列のフォーマット形式の類だと思っていたのですが,
どうにも上手くいかず,日時表示は生のJavaScriptでやっていました.

しかし,どうやら,このTimeTextはオブジェクト的なモノみたいです.
以下の Pebble.js コードだけで,WatchFace アプリの完成です.

凄い便利なのが,勝手に秒単位,分単位で時間が更新されること!

こんな便利なのがあったなんて知りませんでした.

第0回 関西Pebbleアプリ勉強会 開いて本当に良かった.)

JavaScriptで今までやってたやり方…(例)

var UI = require('ui');
var Vector2 = require('vector2');
var window = new UI.Window();
window.fullscreen(true);

var textField = new UI.Text({
  position: new Vector2(0,25),
  size: new Vector2(144, 168),
  font: 'leco-20-bold-numbers',
  backgroundColor: 'black',
  color: 'vividCerulean',
  textOverflow:'wrap',
  textAlign:'center',
  text: ''
});

window.add(textField);
window.show();

function padZero(s){
  return s < 10?'0'+s:s;
}

function itsTime(){
  var date = new Date();
  var y = date.getFullYear();
  var m = date.getMonth()+1;
  var d = date.getDate();
  var hh = date.getHours();
  var mm = date.getMinutes();
  var ss = date.getSeconds();
  m = padZero(m);
  d = padZero(d);
  hh = padZero(hh);
  mm = padZero(mm);
  ss = padZero(ss);
  return y + '/' + m + '/' + d + ' ' + hh + ':' + mm + ':' + ss;
}

setInterval(function(){
  textField.text(itsTime());
}, 1000);

TimeText ならこれだけで勝手に更新される!
(分単位,秒単位などそれぞれ勝手に更新してくれる!!)

var UI = require('ui');
var Vector2 = require('vector2');
var window = new UI.Window();
window.fullscreen(true);

var timeText = new UI.TimeText({
  position: new Vector2(0, 25),
  size: new Vector2(144, 30),
  //text: "%H:%M:%S",
  text: "%Y-%m-%d\n%X",
  font: 'leco-20-bold-numbers',
  color: 'vividCerulean',
  textAlign: 'center'
});

 window.add(timeText);
 window.show();

結果は同じ
f:id:japanetfutan:20151106205828p:plain

Pebbleアプリ勉強会を開催しました

以前からやりたいと思っていたPebbleアプリ勉強会.

突発で10/26(月)に決めて10/31(土)に決行.

さいあく,もう1人の主催者 @itosue ともくもくと何かやれればいいか程度に考えていましたが,計4人集まりました.

e7d8f6d046c4e47266982cdc44.doorkeeper.jp

初級者向けと言う事もあり,スライドもそれなりに作りこんだつもりです. 内容は CloudPebblePebble.js を使っています.( 公式チュートリアルの一部 をそのまま使っています)

参加者は全員エンジニアだと思っていたのですが,営業の方が1名おりました

(HtmlもJavaScriptも分からない方だったので,どの程度吸収できたのか…自分がいたらないばかりに色々中途半端になってしまったかも…)

このスライドをなぞるだけで,のべ90分は使ったと思います(色々と不具合でたり回線繋がらなかったり…)
ハンズオンは絶対予定より押してしまいますね…

時間は13〜18時まで(スライド,その他で半分づつくらいの割合だったかと思います)

スライドとは別に団欒

  • オススメのWatchFaceやApp
  • 普段どのような使い方をしているか?
  • ストラップ(ベルト),保護フィルムの話.
  • TIME LINEについて
  • 日本語パック(日本語化してない方のPTを日本語化しました!)
  • Voiceについて
  • Pebble社の今後の噂

ベストなWatchFace,ベストなApp,ベストな使い方

そんなモノはなくて,皆色々な自分流のベストな使い方をしている印象でした.
(当然,人気アプリなどは使われてるケースが多いですが)
個人的に驚いた使い方は,iPhoneを持っておらず,普段iPadで通知がないからPebble Timeは使える.って方がおりました.
iPadでもPebble Timeアプリを使える事に驚きですが,凄い使い方だと思いました.
iPadでも日本語化できました!!)

CloudPebble

現在はスライドの通り,バグがあるのであれですが,ボクが伝えたかったのが,CloudPebble凄いよ!って事でした.
気になっていた「同一Wi-Fi環境下のCloudPebbleで実機デバッグできるのか?」を2台で検証したところ,ちゃんと機能しました!
回線が遅かった印象を受けましたので,やはりワークショップ・勉強会では各位Wi-Fi環境は用意する方が良さそうです.

反省点

実は今回初めて勉強会を開いたのですが,本当に反省点ばかりです.
スライドも誤字脱字,冗長なコードだらけですし,営業の参加者の方のフォローが中途半端でした.
参加人数が少ないとは言え,もっと参加者サイドに立った考え方で進行するべきでした.
(アンケート機能とかも使わなかったのでレベル感とか当日になるまで分からなかった)
伝達ミスもあり,当日の集合時間も1時間程ズレてしまった(開催が突発過ぎた)

CloudPebbleで実機実行時にメモリエラー
(コンソール青文字)→ Pebble Timeアプリ再起動,Pebble Time再起動で通りました.
(ハンズオンやる場合,直前に再起動させた方が良さそうです.)

次回

次回は前もって募ってもう少し規模感のある勉強会が開ければと思っております.
(やって欲しいネタとかあればコメントなり Twitter なりで連絡ください.)
LTなどを交えながらBLEコンパニオンアプリ連携やTIME LINE使ったサービス・アプリなど,内容の濃いモノや,
初級者向けのPebble.js,CloudPebbleの良さも引き続き伝えられたらと思っています.

お住まい大阪近辺で興味があればメンバー登録だけでも,ボチっとよろしくお願いします.

関西Pebbleアプリ勉強会 | Doorkeeper

都内近郊でもやってくれとお声がけを頂くのですが,ボクがやらなくても東京近郊でなら直ぐに人が集まりそうですよ!!

It's Time!!

f:id:japanetfutan:20151031184426j:plain

Xcode7.1と6.4を共存させると6.4が起動直後に落ちる問題と回避策

Xcode.appをリネームしてXcode6.4とXcode7.1をいつも通り共存させる.

で,普段通りにXcode6.4でPJを開くといきなりXcodeが落ちる. キャッシュ等を削除しても一向に変わらず…でも他のPJは開ける.

で,思ったのが Storyboard

この落ちてしまうPJはデフォルト(Xcode開いてすぐ表示される部分)で Storyboardが表示されるようになってる事を思い出した.

そこで,1度Xcode7.1でPJを開き,Storyboardがデフォルト開かれるので MainViewController.m などの他のファイルを開きXcode7.1を終了(特に保存などはしない)

その後,Xcode6.4でPJを開くとXcodeが落ちずに MainViewController.m が開く.

ここで,Storyboardを開くと

やっぱXcodeが落ちる.

回避策

Storyboardの編集はXcode7.1で行う. あるいはAppCodeとか…

Storyboardに何かあるんだろうけど特にエラーとか出ずに落ちるしなんだかなぁ…

追記

他の環境Mac OS Xでも確認. storyboardだけでなくxibファイルでも落ちる

環境違っても起きたしあちこちで同じような人多そうなんだけどなぁ

2015/10/28 更に追記

と,思ったら似たような事象があちこちで起こっているみたいです.

dev.classmethod.jp

本当に困ったもんです…

2015/11/11 追記

同様の事象が他の方でも起こっているのを確認.
色々とヤバそう…そして7.1.1を入れてもダメだった.
色々キャッシュ消してもダメだったので以下の方法でもう1度やってみたところ,

dev.classmethod.jp

↑このやり方で取り敢えずXcode6.4のみインストールでStoryboadが機能しました.
試していませんが,Xcode7.1.xと共存される場合は以下の方法しかないかもしれません.
怖くて7.1.xインストールできません…

qiita.com

BLEデバイス(Peripheral)のUUID一覧を取得する

iOS Objective-C のメモ

// セントラル
@property (nonatomic, strong) CBCentralManager *centralManager;
// ペリフェラル
@property (nonatomic, strong) CBPeripheral *peripheral;
@property (nonatomic) NSMutableArray *peripherals;
@end

NSMutableArray *a_peripheral;
NSString * const ServiceUUID = @"XXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX";

@implementation PeripheralTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"PeripheralTableViewController - viwDidLoad");

    self.peripherals = [NSMutableArray array];  // データ用
    a_peripheral = [NSMutableArray array];      // 文字列用

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self
                                                               queue:nil];
    self.serviceUUID = [CBUUID UUIDWithString:ServiceUUID];
    self.characteristicUUID = [CBUUID UUIDWithString:CharacteristicUUIDHeartRateMeasurement];
}


// セントラルマネージャ状態が変化
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {

    NSLog(@"Updated state: %ld", (long)central.state);

    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
        {
            // スキャン開始
            NSArray *services = @[self.serviceUUID];
            [self.centralManager scanForPeripheralsWithServices:services
                                                        options:nil];
            break;
        }
        default:
            break;
    }
}

// ペリフェラル発見
- (void)   centralManager:(CBCentralManager *)central
    didDiscoverPeripheral:(CBPeripheral *)peripheral
        advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"peripheral:%@, advertisementData:%@, RSSI:%@",
          peripheral, advertisementData, RSSI);

    // 単数の場合は以下で良いが,
    //self.peripheral = peripheral;
    // 複数のPeripheral取得には配列に格納する必要がある
    // strong属性の配列(NSMutableArray)に保持
    if (![self.peripherals containsObject:peripheral]) {
        NSLog(@"peripheral.identifier : %@", peripheral.identifier);

        [self.peripherals addObject:peripheral.identifier];

        // <__NSConcreteUUID 0x15e85410> 1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A
        // <__NSConcreteUUID 0x15e8a1c0> 20B403AA-24E0-C70A-48A6-62BD9F40A1E3
        NSString *source = [NSString stringWithFormat:@"%@", peripheral.identifier];

        NSString *pattern = @"(^<.*> )";
        NSString *replacement = @"";

        NSRegularExpression *regexp = [NSRegularExpression
                                       regularExpressionWithPattern:pattern
                                       options:NSRegularExpressionCaseInsensitive
                                       error:nil
                                       ];

        NSString *str = [regexp
                         stringByReplacingMatchesInString:source
                         options:NSMatchingReportProgress
                         range:NSMakeRange(0, source.length)
                         withTemplate:replacement
                         ];
        NSLog(@"これがPeripheralのUUIDだ!!! : %@",  str);

        [a_peripheral addObject:str];

        NSLog(@"self.peripherals -> %@", self.peripherals);
        NSLog(@"a_peripheral -> %@", a_peripheral);
        NSLog(@"self.peripherals count : %d", [self.peripherals count]);
        NSLog(@"a_peripheral count : %d", [a_peripheral count]);
    }

    // スキャン停止
    //[self.centralManager stopScan];

    // 接続開始
    //[central connectPeripheral:peripheral options:nil];
}

加工した文字列用の配列を用意したのは,生のまま出力すると以下の用になってしまうため

(結果1)

self.peripherals -> (
    "<__NSConcreteUUID 0x15e85410> 1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A",
    "<__NSConcreteUUID 0x15e8a1c0> 20B403AA-24E0-C70A-48A6-62BD9F40A1E3"
)

<__NSConcreteUUID 0x15e8a1c0>  の部分が不要で,気持ち悪いので
別途文字列にして加工してUUIDのみ配列に入れてる.

(結果2)

a_peripheral -> (
    "1174BF05-3D9A-2AD4-40D8-8A35E4D74A4A",
    "20B403AA-24E0-C70A-48A6-62BD9F40A1E3"
)

追記(2015/12/04)

どうやら,文字列操作しなくてもUUIDのNSStringを取得できるらしい…

[peripheral.identifier UUIDString]

stackoverflow.com

参考文献

iOS×BLE Core Bluetoothプログラミング

iOS×BLE Core Bluetoothプログラミング

Pebble.jsによる色の指定(色一覧)

Pebble.js の色一覧

 
色の指定は以下の Color Name を指定する.
大文字(アッパーケース),小文字(ローケース)も区別するので注意が必要です.
現在(2015/10/03)Pebble.jsによる色の指定方法がまとまったドキュメントが公式サイトにすらないので,コードを元にまとめました.
(永久保存版かもw)
 
* white, clearWhiteの違いはよく分かりません.
 
 
clear
* clearはPebble Classicだと白,Pebble Timeだと黒になると思います.
black
 
oxfordBlue
 
dukeBlue
 
blue
 
darkGreen
 
midnightGreen
 
cobaltBlue
 
blueMoon
 
islamicGreen
 
jaegerGreen
 
tiffanyBlue
 
vividCerulean
 
green
 
malachite
 
mediumSpringGreen
 
cyan
 
bulgarianRose
 
imperialPurple
 
indigo
 
electricUltramarine
 
armyGreen
 
darkGray
 
liberty
 
veryLightBlue
 
kellyGreen
 
mayGreen
 
cadetBlue
 
pictonBlue
 
brightGreen
 
screaminGreen
 
mediumAquamarine
 
electricBlue
 
darkCandyAppleRed
 
jazzberryJam
 
purple
 
vividViolet
 
windsorTan
 
roseVale
 
purpureus
 
lavenderIndigo
 
limerick
 
brass
 
lightGray
 
babyBlueEyes
 
springBud
 
inchworm
 
mintGreen
 
celeste
 
red
 
folly
 
fashionMagenta
 
magenta
 
orange
 
sunsetOrange
 
brilliantRose
 
shockingPink
 
chromeYellow
 
rajah
 
melon
 
richBrilliantLavender
 
yellow
 
icterine
 
pastelYellow
 
white
 
clearWhite
 
 

Sample

// sample_code.js
var textField = new UI.Text({
  position: new Vector2(18,55),
  size: new Vector2(144, 168),
  font: 'gothic-28',
  backgroundColor: 'oxfordBlue',
  color: 'lightGray',
  textOverflow:'wrap',
  text: 'Hello world.'
});
 

参考サイト