Quantcast
Channel: その後のその後
Viewing all 317 articles
Browse latest View live

[cocos2d][iOS][Objective-C]プレイ動画を録画&シェアできるゲームアプリ向けSDK『Kamcord』を少々さわってみたメモ

$
0
0

Kamcord は、ゲームの動画を撮ってシェアするための SDK(フレームワーク) です。







基本的な使い方

録画は startRecording / stopRecording メソッドを呼ぶだけ

[Kamcord startRecording];
[Kamcord stopRecording];

で、showView メソッドを呼ぶと、

[Kamcord showView];

下記のような画面が出てきて、録画したプレイ動画のシェア他プレイヤーの動画の閲覧等ができるようになります。



以上。簡単ですね。


自前UIを使う

ここからはニッチな話になってしまいますが、上記の出来合いのビューを使わず、Kamcord サーバ上にアップされた動画のURLだけ取得してゴニョゴニョ、といったことができるのか、それとも隠蔽されててできないのか、というのを調べてみました。



で、結論としては、可能です。



オフィシャルドキュメント内の下記ページに書かれていて、


Using the Kamcord API: Fully Custom UI


KCCustomUI というクラスを使います。


で、この件についてはドキュメントとかサンプルコードが古い、というかメンテされておらず、Web上でもあまり情報がありません。


このあたりに関して、引っかかった点、わかりにくかった点を以下に箇条書きでまとめておきます。

  • KCCustomUI を使用したサンプルの在処と実行方法
    • サンプルプロジェクトから CustomUITest クラスのファイルが外されている。
    • Custom UIのサンプルを試すには、プロジェクトフォルダ配下の tests/CustomUITest.h,m を改めてプロジェクトに追加し、 ターゲットを作成する必要がある。
  • VideoTicketDelegate プロトコルの実装
    • AppDelegate のサブクラスを VideoTicketDelegate に指定すると EXC_BAD_ACCESS エラーになる。
    • CALayer のサブクラスを VideoTicketDelegate に指定すると問題なくなった。
    • 理由/原因は不明。
  • 動画URLの取得
    • KCVideoTicket クラスの getVideoURL メソッドで得られる URL は、Base URL が省かれている。
    • 同クラスの thumbURL プロパティから得られる結果で、Base URL は https://s3.amazonaws.com と判明(実際にこれで動画にアクセスできた)

また何か出てきたら追記します。



[Objective-C][ライブラリ]iOSアプリに友達招待機能を追加できる『AppSocially SDK』の使い方

$
0
0

AppSocially iOS SDK を使うと、たった1行コードを追加するだけで、友達を招待する機能をアプリに追加することができます。無料で使えて、招待数による従量課金もありません。



招待の方法もいろいろあって、いまのところ

  • Facebook のチャット
  • Twitter の DM
  • メール
  • SMS
  • LINE

が用意されています。


iOS6 以降は Social.framework によって Facebook や Twitter への投稿がものすごく簡単になりましが、DM やチャットは Accounts.framework を用いた認証や、SLRequest で API をハンドリングする処理を自前で書かなければならず *1、それでいてアプリ毎に固有な差別化要素でもないので、まるっと外部ライブラリに任せてしまえばかなり手間が省けます。


導入方法

上述したとおり、フレームワーク追加、ヘッダインポートといった一般的なライブラリの導入手順をのぞけば、基本的にはメソッドを1つ呼ぶだけで導入できます。


1. フレームワークをプロジェクトに追加

GitHubリポジトリから最新リリース版 のzipをダウンロードし、解凍したフォルダ配下にある AppSocially SDK フォルダごとプロジェクトに追加します。(フォルダには AppSocially.framework と AppSocially.bundle が入っています。)


また、下記の依存フレームワークもプロジェクトに追加し、

  • Accounts.framework
  • AddressBook.framework
  • AddressBookUI.framework
  • CFNetwork.framework
  • MessageUI.framework
  • MobileCoreServices.framework
  • QuartzCore.framework
  • Security.framework
  • Social.framework
  • SystemConfiguration.framework
  • libresolv.dylib
  • libxml2.dylib
  • libiconv.dylib

Build Settings の "Other Linker Flags" に、"-ObjC" と "-all_load" を追加しておきます。


このあたりは、サードパーティ製フレームワークを導入する際にはおなじみの手順です。


2. SDKを初期化

AppDelegateでヘッダをインポートし、

#import <AppSocially/AppSocially.h>

AppSocially API Key と Facebook APP ID をセットします *2

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [AppSocially setAPIKey:@"5acbd3940b4603f68108ff2efd02e02b"];

    [AppSocially setFacebookAppID:@"117100645022644"];

    // And you code here...

    return YES;
} 

3. 招待用アクションシート表示メソッドをコール

あとは、showInviteSheetInView: メソッドをコールするだけ。

[ASInviter showInviteSheetInView:self.view];

このメソッドにより、次のような招待用アクションシートが表示され、


f:id:shu223:20130905160756p:image


あとはSDK内でよしなにやってくれます。


※このアクションシートからの招待は、SDK に同梱されている『FirstSample』というサンプルアプリで、挙動をすぐに試すことができます。


ランディングページのカスタマイズ

AppSocially では、アプリ毎に最適化を施して招待効果を高められるよう、またクリックやインストールをトラッキングできるように、「招待毎」にランディングページを生成します。


f:id:shu223:20130905160757p:image

(facebook chat経由で届いた招待ページ)


デフォルトは上記のようなシンプルなものですが、これをダッシュボードで自由にカスタマイズできるようになっています。


Undaの事例

f:id:shu223:20130905164326j:image:w550


AppSocially SDKを導入しているビデオメッセンジャーアプリの『Unda*3 では、招待ランディングページ内に動画を埋め込み


f:id:shu223:20130905160758p:image


招待というよりは、まだ Unda を始めていない友達に Facebook chat や Twitter DM、メール、SMS でビデオメッセージを送るといった見え方になるようなかたちで招待機能が実装されています。


カスタマイズのやりかた

ページカスタマイズはダッシュボードの『Templates』メニューから行います。


f:id:shu223:20130906085232p:image:w400


プレビュー上にある "EDIT" を押すとエディタが開き、編集できるようになります。


f:id:shu223:20130906085617p:image:w500


基本的に HTML + CSS です。動的に文字列を埋め込みたい場合には、たとえば次のように書きます。

<img class="app-icon" src="{{app.icon_url}}" width="72" height="72">

このあたりのドキュメントはこちらにあります。


Undaタイプの招待画面

さきほど紹介した Unda の招待画面は、ASFriendPickerViewController というクラスを使用して実装されています。


f:id:shu223:20130906092631p:image


これは、Facebook、Twitter、アドレス帳にある情報をひとつの TableView に一覧表示し、そこから選択して招待するための UIViewController サブクラスです。


ここから複数の友達を選択しての一括招待もできるので、効果的につかえば、強力なユーザー獲得手段となりえます。


これを用いた招待機能の実装方法は、SDKに同梱されている『InviteSample』と、こちらのドキュメントが参考になります。


おわりに

これを書かないとステマになってしまうので書いておきますと、AppSocially は、僕が所属しているアメリカのスタートアップ『AppSocially』が提供しているサービスです。で、SDK は僕が開発しています。


SDKの最新バージョンは 0.7.1 で、1.0.0 に到達していないことからも汲んでいただける通り、まだまだやることが盛りだくさんです(たとえばつい先週までドキュメントは皆無でした)。*4


今回ここに書いた以外にも、AppSocially にはユーザー獲得にまつわるさまざま機能があり、SDKに同梱のサンプルコードにてご確認いただけますが、「こういうことできるの?」「どうやるの?」といったご要望やご質問は僕にメールや Twitter で(お手柔らかに)お伝えいただければ、善処させていただきます。


そんなわけで AppSocially SDK、ぜひこの土日にでもお手持ちのアプリにサクッと導入して申請していただけると幸いです!



AppSocially iOS SDKをダウンロード




*1:FacebookのPermissionまわりや、Twitterのマルチアカウント対応、API回数制限のことなど、ちゃんとやろうとすると意外とめんどくさいことがポロポロと出てきます

*2:AppSocially API Key は AppSocially のサービスにサインアップしてダッシュボードから取得する必要があるのですが、ここではすぐに試せるよう、僕がつくったキーを入れてあります。また Facebook APP ID も Facebook Developers より(本番で使う際には)作成してください。

*3:参考:LINEの次はこれかも…注目のビデオメッセンジャー『unda』を開発した徳井直生氏が、シリコンバレーで学んだこと

*4:実は yidev@渋谷勉強会 第一回 にてバージョン 0.2 か 0.3 のころに発表させていただいたのですが、いろいろあって発表スライドを公開するタイミングを逸してしまいました。

[ライブラリ][iOS][Objective-C]API クライアントを AFNetworking を用いてつくる手順

$
0
0

ちょっとこの Web API 使ってなんかつくってみるか」ということがたまにある(とくにハッカソンで)ので、手早くつくれるように僕なりの手順をまとめてみました。


「共通処理の実装」までは簡単な文字列の置換で済むので、 ファイルテンプレートにしておく とより簡単になりそうです(参考:Xcodeのファイルテンプレートを自作する)。


1. 共通処理の実装

APIキーをセットするメソッドの定義と実装と、オブジェクト初期化用のメソッド実装。

ヘッダ
+ (void)setAPIKey:(NSString *)APIKey;
実装ファイル
#import "AFJSONRequestOperation.h"
#define API_BASE_URL      @"http://xxxx"
@interface XXXX ()
@property (nonatomic) NSString *APIKey;
@end
+ (XXXX *)sharedClient
{
    static XXXX *sharedClient = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[XXXX alloc] initWithBaseURL:[NSURL URLWithString:API_BASE_URL]];
    });
    
    return sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url
{
    if (self = [super initWithBaseURL:url]) {
        
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setParameterEncoding:AFJSONParameterEncoding];
        [self setDefaultHeader:@"Accept"     value:@"application/json"];
    }
    
    return self;
}

+ (void)setAPIKey:(NSString *)APIKey {
    
    [[XXXX sharedClient] setAPIKey:APIKey];
}

2. 汎用Privateメソッドの実装

ここは各サービスの仕様に合わせて実装を変える必要がある。APIキーをセットする、とか、そのサービスにおけるAPIをたたく際の共通の処理をここで行う。


(APIキーをパラメータに渡す場合)

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                      path:(NSString *)path
                                parameters:(NSDictionary *)parameters
{
    NSAssert(self.APIKey, @"API Key has not been set.\n\n");
    
    path = [path stringByAppendingFormat:@"?api_key=%@", self.APIKey];
    
    for (NSString *key in [parameters keyEnumerator]) {
        
        NSString *value = [NSString stringWithFormat:@"%@",
                           [parameters valueForKey:key]];
        
        NSAssert2([key length] && [value length],
                  @"invalid param! key:%@: value:%@", key, value);
        
        path = [path stringByAppendingFormat:@"&%@=%@", key, value];
    }

    NSMutableURLRequest *req = [super requestWithMethod:method
                                                   path:path
                                             parameters:nil];
        
    return req;
}

3. 各APIに対応したメソッドを書く

- (void)companyWithName:(NSString *)name
                handler:(void (^)(NSDictionary *result, NSError *error))handler
{
    NSAssert([name length], @"name is required");
    
    __weak XXXX *weakSelf = self;
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString *path = [NSString stringWithFormat:@"company/%@.js", name];

        [weakSelf getPath:path
               parameters:nil
                  success:^(AFHTTPRequestOperation *operation, id responseObject) {
                      
                      dispatch_async(dispatch_get_main_queue(), ^{
                          
                          handler(responseObject, nil);
                      });
                      
                  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                      
                      dispatch_async(dispatch_get_main_queue(), ^{
                          
                          handler(nil, error);
                      });
                  }];
    });
}

サンプル

この手順でつくったAPIクライアント

[ライブラリ][Objective-C]CrunchBase APIをiOSアプリで使用する手順のメモ、およびAPIクライアントつくりました

$
0
0

CrunchBaseというのは、米国のテック系企業の情報が詰まったデータベースみたいなものです。以下そのAPIを使う手順のメモ。


APIキー取得まで

デベロッパーページのトップ

http://developer.crunchbase.com/


ここから登録(最初のアプリの登録もここで行う)

http://developer.crunchbase.com/member/register


完了すると、確認メールが送信され、メールのリンクをクリックでAPIキーが発行される


APIの基本的な呼び方

ベースURLは

http://api.crunchbase.com/v/1/

で、下記のように引数 "api_key" にAPIキーをくっつけるだけ。

http://api.crunchbase.com/v/1/company/facebook.js?api_key=(your_acess_key)


APIを試す

下記URLで、各APIを試せる。

http://developer.crunchbase.com/io-docs

一通りの組み合わせを試せるので、これがドキュメントにもなっている。


ドキュメント

ちゃんと書かれたドキュメントはこちら。

http://developer.crunchbase.com/docs


APIクライアントつくりました

とあるハッカソン(いままさにその真っ最中)の副産物として、以下のような CrunchBase API の iOS 用クライアントができました。


CrunchBase API Client for iOS


こんな感じで使えます。

(会社名を指定して情報取得)

[CrunchBaseClient companyWithName:@"appsocially"
                          handler:
 ^(NSDictionary *result, NSError *error) {
     
     // Do something.
 }];

他の詳細は同梱のREADMEにてどうぞ(ハッカソン中はどんどん更新すると思います)。


[ライブラリ][iOS][Objective-C]Kloutスコアを取得するライブラリをつくりました

$
0
0

Klout はちゃんとオフィシャルに iOS SDK がリリースされているのですが、最終更新が1年前と古く、デモは正常に動作せず(APIKeyとAPISecretをセットしても認証が通らない)、APIはシンプルなのにソースはなんだか複雑。。


ということで『API クライアントを AFNetworking を用いてつくる手順』に従って Klout スコアを Twitter の screen_name から取得する iOS 用 API クライアントをつくりました。


Klout API Client for iOS


使い方

README.md に書いてある通りですが、下記のような感じでスコアを取得できます。

[KloutAPIClient scoreWithTwitterScreenName:@"shu223"
                                   handler:
 ^(NSDictionary *result, NSError *error) {
     
     // Do something
 }];

結果をログ出力すると、こんな感じです。

{
    kloutId = 36310276762296144;
    nick = shu223;
    score =     {
        bucket = "60-69";
        score = "64.7767214065569";
    };
    scoreDeltas =     {
        dayChange = "1.221016407905331";
        monthChange = "3.329226905713995";
        weekChange = "0.5908994821739952";
    };
}

[iOS][Objective-C][ライブラリ][海外就職]アメリカの大規模ハッカソンに参加し、入賞しました

$
0
0

9/7-8の2日間、24時間にわたってサンフランシスコにて開催されたハッカソン『Disrupt SF Hackathon 2013』に参加し、なんと賞をいただいてしまいました。



Disrupt SF Hackathon 2013について

Disrupt SF Hackathon 2013は、参加者600人以上、プロジェクト(チーム)の数はプレゼンにエントリーしたものだけでも260以上という、かなり大規模なハッカソンです *1


(会場の奥行きが伝わりますでしょうか)


(参加費無料で、3食出ます。おやつと夜食とビールも出ます。)


(行列が終わる頃に余裕こいていくとごはんもなくなっています)


作品発表会

作品発表会(プレゼン)がまた本格的で、プロのイベント運営会社が入っていてモニター類やバックステージの設備もしっかりしてて、進行も完璧でした。


(発表会。照明も音楽もクラブ調)


(発表直前にバックステージから客席を撮った写真)


(客席を沸かせた9歳の女の子ハッカーのプレゼン。

その右方には、客席を沸かせられなかった35歳の某日本人プログラマの姿も)


受賞者発表

プレゼンの持ち時間は1チーム1分で、進行も的確に進んでいたのですが、さすがに260組もいると、休憩含めプレゼン時間は5時間以上(!)に及びました。


で、家にネコ(弊社CEOから預かっている)を待たせていたこともあり、受賞者発表を最初の方だけちょっと見て家に帰ってしまったのですが、翌日Twitterを見ると、冒頭でTweetを載せた彼から、


(意訳:会場で君を見つけられなかったけど、賞をあげたいから連絡ちょうだい


とmentionをいただき受賞を知ったのでした。


ハッカソンでやったこと

一人で参戦して一人で黙々と作業していました。プレゼンのときに初めてちゃんと声を発した気がします。


Leap Motionを試した

サンフランシスコ行きの電車に乗り遅れ、会場に到着したのはハッカソン開始から2時間後。そして僕はその日箱から出したばかりの『Leap Motion』で何かつくる、ということに着手しました。


(電車に乗り遅れ、駅近くのカフェでセットアップ)


で、ハッカソンお約束の「インターネットがつながらない」問題と戦いながらいろいろ調べはじめ、「Leap Motion には iOS用SDKがない」ということに気付いたのがハッカソン開始から4時間半経過した17:00。



重い腰をあげて箱から出してセットアップできたし、これがわかっただけでもよかったです。MacアプリとかUnityでつくるかもしれないし、今後iOS SDKが出るかもしれないし。


つくるものを考えた

というわけで作戦変更。スポンサーが提供しているAPIを使って何かつくろう、と スポンサーAPI一覧 を一通り眺めました。


で、興味のある CoreBluetooth を使ってるやつとか、定番のEvernoteとか、景品が豪華なところとか、いろいろ迷ったのですが、兼ねてからつくりたいと思ってたものをつくれそうな、CrunchBase API を使うことにしました。


つくりたいと思ってたのは、会社名からそこに在籍する人のリストを引っ張ってきて、その人たちのKloutスコアをとってきて、その合計値からその会社のパワーを計る というもの。


なんか、知り合いが転職したけど、その会社よく知らない、ってことあるじゃないですか。で、僕が世間知らずなだけで、その会社が結構すごい会社ってこともあるじゃないですか。そういうのを計りたいなと *2


APIクライアントを2つつくって GitHub で公開

そんなわけで、CrunchBase API と Klout API のiOS用クライアントをつくり、GitHubにサンプルコードと簡単なREADMEつきでアップしました。


CrunchBase APIは、位置情報からも検索できるっぽかったので、「近隣のスタートアップのパワーを調べる」みたいなこともできそうだと思って実装を進めてたのですが、そこに来てたスタッフの人に(メールで)いろいろ聞きながら実装してみた結果、緯度経度では検索できないとか、レスポンスがものすごい遅いとか、いろいろとイマイチだったので、最終的に会社名で検索する機能だけにしました。


まぁ、UI/UXがまとまりきらなかっただろうし、プレゼン時間も足りなかっただろうから、これで良かったです *3


ブログを3記事書いた

つくりきれるかどうか、いい落としどころを見つけられるかどうかの確信がなかったので、せめて中間アウトプットを細かく出そう、ってことで、ハッカソン中にブログを3記事書きました。


一番上の記事はブックマークも結構ついたし、今後の自分のためにもなるので、書いてよかったです。


Company Scouter

これがハッカソンの最終作品。日本語でいうと『会社スカウター』。会社のパワーと、算出の基となる各メンバーのKloutスコアが一覧表示されます *4


まるっとソース公開してます *5


https://github.com/shu223/CompanyScouter


ちなみにいくつか試した感じでは、Apple最強でした。


f:id:shu223:20130910173756p:image:w600


プレゼン資料をつくった

作品提出締め切りまで時間が5時間ほどあまり、もう改良する気力はなく、しかし眠るにはあまりにも寒かったため、ひとりで無駄に会場を歩き回ったのちに、



プレゼン資料の作成に着手しました。


で、できたのがこちら *6



あと最後のページはプレゼンでは触れませんでした。1分だと足りないのと、ネイティブだけどブラウザで試せる、ってのが説明不足だと混乱を招くかなと。ブラウザアプリなの?どっち?みたいな。


プレゼンした

プレゼンしました。


f:id:shu223:20130910182200p:image:w600


賞品もらいに行きます

そんなわけで、あさって、サンフランシスコに行く用事があるので、賞をくれた Mashery のオフィスに寄って賞品をいただいてきます。


BIG JAMBOXの "Mashery Red" (要は赤)をもらえるみたいです。


ちょうどしっかりした音の出るワイヤレススピーカー探してたし、この中だと赤がいいのでめちゃくちゃ嬉しいです。



*1こちらに別の日本人参加者の方がリアルタイムレポート記事を書かれていて、とても臨場感あります。

*2:Klout スコアなので計れる「パワー」は狭い意味になってしまうのと、CrunchBase だと日本の会社はあまり入っていないという欠点はありますが、使うAPIはあとから入れ替え可能だし、今回はスポンサーだし、ということでよしとしました。

*3:Klout API に関しては、公式リポジトリにiOS SDKとかあるのですが、ちゃんと動作しなかったし、そもそも1年以上メンテされてなかったし、無駄に複雑に見えたので、自分でつくった方が早いってことで自作しました。

*4:本当に大したものではないというか、ちょっと痛々しさすらあります。「会社のパワーを計る」というコンセプト自体はもともとつくりたかったものなのでいいのですが、中途半端に「スカウター」というネタっぽいものになぞらえてしまったことを少し後悔したりもしました。

*5:この方がスポンサーが喜ぶと思ったので。。

*6:英語でのプレゼンは初めてで舞い上がること必至なので、自分が強調して話したい部分を資料でも強調してます。

[Xcode][iOS][Objective-C]Xcode の旧バージョンも Dev Center からダウンロードできるようです

$
0
0

昨日ついに Xcode5 が正式リリースされましたが、現行バージョンだけでなく、Xcode4.x、Xcode3.x や Xcode2.x も引き続き Dev Center からダウンロードできるみたいです。




たとえば Xcode4 でいうと、4.6.x, 4.5.x, 4.4.x, ... と本当にひとそろいダウンロードできるようになってます。


初めて知りました。このページ何度か見てるはずなのに。。



[iOS][Objective-C][Xcode][ライブラリ]iOS 7 の新機能のサンプルコード集『iOS7 Sampler』を公開しました。

$
0
0

iOS7にどんな新機能があるのかも把握しきれないままベータ期間が終わってしまい、せっかくのメジャーバージョンアップ祭に乗り遅れた感があったので、先週末に開催された『もくもく開発会@鎌倉 #2 by Qiita』にて、 iOS 7 で新たに加えられたAPI の使い方等を勉強しつつ、簡単なサンプルを集めたアプリをつくりました。


ソースコードは GitHub に置いてあります。


https://github.com/shu223/iOS7-Sampler



今のところまだ7つしかないのですが、何か調べた折に随時追加していきます。


以下サンプルのリストです。


Dynamic Behaviors

iOS7 では UIView サブクラスに簡単に物理演算を適用することができるようになりました。


本サンプルでは、UIDynamicAnimator, UIGravityBehavior, UICollisionBehavior, UIDynamicItemBehavior を用いて 重力と衝突をシミュレート しています。



関連:UIKit で物理演算エンジンを使用する


Speech Synthesis

AVSpeechSynthesizer, AVSpeechUtterance を用いた音声合成のサンプル。


任意の文字列を iOS が読み上げ てくれます。Macのsayコマンドのようなもの。


関連:フリーの iOS 向け音声認識/音声合成ライブラリ『OpenEars』の使い方


Custom Transition

UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegateを用いた カスタムトランジション (画面遷移)のサンプル。


トランジションエフェクトは下記のOSSを入れています。


HUAnimator

細い線に分解されて遷移するエフェクト。



ZBCustomTransitions

ブロックに分解されガラガラと崩れ落ちて遷移するエフェクト。



3D マップ

MKMapView の camera プロパティ (MKMapCamera という新クラス)を用いた 3D 地図表示 のサンプル。



関連:Google Maps SDK for iOSの導入手順


Motion Effects (Parallax)

UIMotionEffect を用いた パララックスエフェクト(視差効果) のサンプル。



AirDrop / Flickr / Vimeo / ReadingList

新たに追加された UIActivityTypes のサンプル


AirDropはデバイスが対応している必要があり、Flickr, Vimeo は Settings でアカウントを設定している必要があります。



Static Map Snapshots

MKMapSnapshotOptions, MKMapSnapshotter を用いた 地図のスナップショットを取得する サンプル。


おわりに

iOSアプリに友達招待機能を追加できる『AppSocially SDK』も iOS 7 サポートしております。


関連:iOSアプリに友達招待機能を追加できる『AppSocially SDK』の使い方




[海外就職][iOS]シリコンバレーから出戻りました

$
0
0

アメリカでのiOSアプリ開発の仕事にありつけました』 という記事を書いたのが5月20日。それから4ヶ月ちょっとしか経っていませんが、諸事情により *1 シリコンバレーより出戻っております。しばらく日本にいる予定です *2


で、せっかくシリコンバレーに行ったから、なんか感想とか体験記的なことを書きたいなぁ、とずっと思っていて、今日見つけた『シリコンバレー滞在30日で分かった15のこと』という記事が、いい感じに僕も書きたい切り口が多かったので、これらの項目にコメントするかたちで *3 僕なりの体験や感じたことを書きたいと思います。


最高の気候

こちらに滞在している誰もがいうことですが、本当に本当に気候が最高。

本当に誰もが言うので、僕が改めて言うことは何もないのですが、最高です。


日本が誇る「電車が時間通りに来る」 というのと同じように、明日も明後日も快晴であることが保証されている というのは、(日本では望むべくもないことですが、)素晴らしい体験でした。


(4ヶ月間、毎日こんな感じでした)


食べ物は全然アリ

これは住んでいる場所と、人によって違うようですが、食べ物は全体的に美味しいです。

アメリカで暮らしてきました、というと、よく「食べ物はどうだった?」と聞かれます。暗に「合わなかったでしょ〜」という期待を含んでいる気がしてしまうのですが、僕は全然アリでした。場合によっては日本よりアリでした。


とくにシリコンバレーは、世界中から人が集まってくるからか、日本料理や中華はもちろん、イタリアン、メキシコ料理、インド料理、タイ料理、ベトナム料理、地中海料理、スペイン料理、フランス料理、トルコ料理、etc... と徒歩圏内だけでも多種多様なレストランが揃っていて、毎日気分によって食べたいものを変えられて楽しかったです。


あと、どんな店でも、どんなメニューでも大概テイクアウト可能なところがすごくよかった。たとえば高級店ぽいレストランで、表にテイクアウトとか書いてなくても、聞いてみたらOKだったし、つけ麺みたいなテイクアウトしづらそうなものでも全然OK。


f:id:shu223:20130826131034j:image:w400

(つけ麺テイクアウト)


これ、僕が知らなかっただけで、日本でも実は聞いてみればOKだったのかな?と思い、帰国して家に帰る道中にさっそく東京駅構内のレストランで「テイクアウトできますか?」って聞いてみたら余裕でNGでした。


英語の習得はそんなに甘くなかった

世界経済を考えた場合、これまでは日本国内だけで一定以上の市場があったので、日本語という言語の壁に守られた経済圏を確立できていたのですが、ことWebサービスについてはグローバル化、ボーダレス化が非常に容易なので、これからWeb業界でやって行きたい人には、絶対に英語の学習をおすすめします。

この主張に異論ありません。英語を習得することは完全に正解です。


ただ、僕は全然ダメでした。多少マシにはなったけど、全く仕事に活かせるレベルじゃない。


聴き取りぐらいならいるうちに耳が慣れてくる、という人もいますが、僕は未だにほとんど聴き取れないです。『パシフィック・リム』をあっちで観たけど、「カイジュウ」という単語と、日本人ヒロインの台詞しかわかりませんでした。


まぁでも現地にいると日々危機感を感じられるおかげで嫌々ながらも勉強するし、そうするとさすがに多少マシにはなっていくので、もっと長く住めば僕でも何とかなる日がくるかもしれません。


AngelListとLinkedInの影響力

こちらに来て驚いたのは、日本ではあまり馴染みのない「Angel List」というサービスの知名度と影響力が大きいことです。

日本にいた頃、「海外で働きたい。でも、ビザもコネもない。」 と思ってました。


でもあっちに行ってみて得たでかい収穫が、「飛び込んでしまえばなんとかなる」という実感。


この記事で触れられているAngelListとLinkedInにスキルと実績をしっかり書いて、住所をMountain Viewにしてからというもの、アメリカの会社から週2〜3、月に10件ぐらいのペースでスカウトメールが来るようになりました。既に世界的に有名になっているスタートアップや、某Appl○本社からもお声がけいただいたりしました。ビザのスポンサードが可能なことを明記しているところもありました。


とはいえ大抵が人事部門からのメールなので、実際に選考に進むと英語力やら何やらで無理なのかもしれませんが、少なくともとっかかりはあるもんだなぁと。


ちなみに、日本に帰ってからのことですが、最近GitHubにアップした iOS7 Sampler というオープンソースリポジトリに世界各地からstarをいただき、こっち経由でも仕事の話がくるようになりました。


これを日本で展開したら流行りそう、というサービスがごろごろしている

日本にいるときよりは、段違いに新しいサービスに触れる機会が増えました。空気感として、Webだけで完結するサービスやソーシャル系は一段落している雰囲気があり、O2Oサービスがこれから増えてきそうな感じです。リアルと連動している分、地域性がともなうので、タイムマシーン経営が成り立つジャンルだと思います。

これはあります。KickStarterのプロダクトマネージャーとご飯食べた際に、日本では同様のコンセプトの CAMPFIRE というサービスが存在感出してるよ、という話題が出て、「まあ、うち日本語に対応してないからな〜」と、わかっちゃいるけどなかなか手が回らない、という雰囲気でした *4


f:id:shu223:20130801124230j:image:w500

(NewYorkにあるKickStarterオフィス。古いビルを改装してて超かっこよかった)


車は必須

車がないと生活用品の買い出しもままならないので、車は必需品です。東京にいたときは、電車でほとんど用事が済ませられたので、ほとんど車に乗る機会がなかったのですが、こちらに来て生活スタイルがガラッと変わってしまいました。

これは正直、車の運転をなるべくしたくない僕としてはマイナス要素でした。左ハンドル、右車線でややこしいし。


まぁでも免許は持ってるわけだし、ここらで車の運転に慣れとくと人生の幅が広がって良いかも、と今では考えてます。


日本ではペーパードライバーだったけどあっちで必要に迫られて運転するようになった、という人多いみたいです。


税+チップでプラス23%!

日本に帰ってきて、800円のものが800円ポッキリで買える、ということに感動しました。


カリフォルニア州は消費税が8%ちょい *5 あり、チップは最低15%とされているので、あっちでレストランで800円ぐらいのものを頼むとなぜか1000円を超えている、という感覚です。


投資家がたくさんいる

これはこっちにきてカルチャーショックでした。石を投げれば投資家に当たる、というぐらい投資家がいます。


次世代を応援しよう、という文化があるので、投資家を名乗ってない人でも事業を気に入ってくれれば投資家になってくれたりします。意思決定も早く、講演にきた先輩CEOに、弊社CEOが事業の説明を10分ぐらいして、2つ3つ端的に質問をしたのち「オーケー、投資しよう」と言ってるのを目の当たりにしたときは驚きました。


(あのマシ・オカさんもAppSociallyを支援していただけることに!)


プログラミングはどこでやっても同じ

あっちでの日々の中でよく使った「言語」を順に並べると、


Objective-C > 日本語 >>>>>>>>>> 英語


という感じです。


プログラマという仕事はどこででもできる、ということでもあるし、どこでやっても大差ない、ということでもあります。


それでもやっぱり海外で働くのは楽しい。


旅先にパソコンを持っていってインターネットをしていると、「せっかく旅行してるのになんでインターネットしてるの」とか言う人がいるけどそれはちょっと違う。「旅行中にインターネットをしている」のではなくて「ずっと家でインターネットしてると飽きるからたまには別の場所でインターネットをしている」という認識が正しい。

旅インターネット - phaの日記


関連記事

シリコンバレー滞在時に書いた本ブログの記事。



*1:プライベートな事情です。 AppSocially には引き続きフルコミットしており、畳&障子のある和室にてスカイプで米国とやりとりしつつ仕事しております。

*2:状況が安定するまで、少なくとも年内はいる見込みです

*3:最後の方の項目は元記事にはないものです

*4:英語がわからないので実際こう言ってたのかわかりません。僕が感じた雰囲気です。

*5:消費税という税ではないかもしれないですし、州の決まりでもないかもしれません

[iOS][Objective-C][ライブラリ]AppSocially SDK が CocoaPods に対応しました

$
0
0

先日紹介した AppSocially SDK を、CocoaPods から導入できるようにしました。これにより、 スクリプトを1行書いて、コマンドを1つ実行するだけ で AppSocially SDK を使えるようになりました。


Podfile に

pod 'AppSociallySDK'

と書き足して、あとはターミナルから下記コマンドを実行するだけです。

pod install

ソース非公開の自作フレームワークのPodSpec

AppSocially SDK はソースは公開しておらず、AppSocially.framework, AppSocially.bundle だけを配布しているのですが、そういうケースで PodSpec をどう書いてよいかわからず、かなり試行錯誤しました。


最終的に、下記のようにしました。(nameとかversion等の部分はここでは省略)

s.source       = { :git => "https://github.com/appsocially/AppSocially-iOS-SDK.git", 
:tag => "release-0.8.1" }
s.resources = "AppSociallySDK/AppSocially.bundle"

s.frameworks = 'AddressBook', 'AddressBookUI', 'CFNetwork', 'MessageUI', 'MobileCoreServices', 'QuartzCore', 'Security', 'SystemConfiguration'
s.weak_frameworks = 'Accounts', 'Social'
s.libraries = 'iconv', 'xml2', 'resolv'

s.preserve_paths = "AppSociallySDK/AppSocially.framework"
s.public_header_files = "AppSociallySDK/AppSocially.framework/**/*.h"
s.vendored_frameworks = 'AppSociallySDK/AppSocially.framework'

s.requires_arc = true
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2', 'OTHER_LDFLAGS' => '-ObjC -all_load'}

参考



[Objective-C]iOS 7 で使えるフォント名一覧

$
0
0

iOS 7 の隠しフォント, ヒラギノ角ゴ W1/W2 を CSS で指定する』という記事を読んで、「あれ、これってPrivate APIにあたるんじゃない?」と思いフォント名一覧を出力してみたので、そのついでにその一覧をここに掲載しておきます。


(追記2013/10/17その1)

iOS7で追加されたフォント、iOS6で追加されたフォントがわかるよう色分けしました。


(追記2013/10/17その2)

iOS7の新機能のサンプルコード集、『iOS7 Sampler』 で新フォントを確認できるようにしました。


f:id:shu223:20131017212209p:image:w240


サンプルコードを提供されてもビルドできない!というデザイナーやディレクターの方は、ぜひお近くの開発者に実機インストールしてもらってみてください。

(追記ここまで)


何に使うのか?

self.hogeLabel.font = [UIFont fontWithName:@"Helvetica Bold Oblique" size:10.0];

みたいな感じでシステムフォント以外の UIFont を使う場合にこのフォント名が必要になります。


どうやって出力したのか?

UIFont の familyNames メソッドと、fontNamesForFamilyName: メソッドを使います。

NSMutableString *str = @"".mutableCopy;
for (NSString *familyName in [UIFont familyNames]) {
    [str appendFormat:@"<b>%@</b>\n\n", familyName];
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
        [str appendFormat:@"- %@\n", fontName];
    }
    [str appendFormat:@"\n"];
}
NSLog(@"%@", str);

(ここに貼り付ける用にHTML+はてな記法で出力してます)


一覧

合計でファミリー数が71、フォント数が236でした。


iOS7で追加されたフォントに (iOS7) 、 iOS6で追加されたフォントに (iOS6) というマークを付けてあります(iOS5, iOS6, iOS7のリストを出力して比較するコードを書きました)。


Thonburi

  • Thonburi-Bold
  • Thonburi
  • Thonburi-Light (iOS7)

Snell Roundhand

  • SnellRoundhand-Black
  • SnellRoundhand-Bold
  • SnellRoundhand

Academy Engraved LET

  • AcademyEngravedLetPlain

Marker Felt

  • MarkerFelt-Thin
  • MarkerFelt-Wide

Avenir (iOS6)

  • Avenir-Heavy (iOS6)
  • Avenir-Oblique (iOS6)
  • Avenir-Black (iOS6)
  • Avenir-Book (iOS6)
  • Avenir-BlackOblique (iOS6)
  • Avenir-HeavyOblique (iOS6)
  • Avenir-Light (iOS6)
  • Avenir-MediumOblique (iOS6)
  • Avenir-Medium (iOS6)
  • Avenir-LightOblique (iOS6)
  • Avenir-Roman (iOS6)
  • Avenir-BookOblique (iOS6)

Geeza Pro

  • GeezaPro-Bold
  • GeezaPro
  • GeezaPro-Light (iOS7)

Arial Rounded MT Bold

  • ArialRoundedMTBold

Trebuchet MS

  • Trebuchet-BoldItalic
  • TrebuchetMS
  • TrebuchetMS-Bold
  • TrebuchetMS-Italic

Arial

  • ArialMT
  • Arial-BoldItalicMT
  • Arial-ItalicMT
  • Arial-BoldMT

Marion

  • Marion-Regular
  • Marion-Italic
  • Marion-Bold

Menlo (iOS7)

  • Menlo-BoldItalic (iOS7)
  • Menlo-Regular (iOS7)
  • Menlo-Bold (iOS7)
  • Menlo-Italic (iOS7)

Malayalam Sangam MN

  • MalayalamSangamMN
  • MalayalamSangamMN-Bold

Kannada Sangam MN

  • KannadaSangamMN
  • KannadaSangamMN-Bold

Gurmukhi MN

  • GurmukhiMN-Bold
  • GurmukhiMN

Bodoni 72 Oldstyle

  • BodoniSvtyTwoOSITCTT-BookIt
  • BodoniSvtyTwoOSITCTT-Bold
  • BodoniSvtyTwoOSITCTT-Book

Bradley Hand

  • BradleyHandITCTT-Bold

Cochin

  • Cochin-Bold
  • Cochin-BoldItalic
  • Cochin-Italic
  • Cochin

Sinhala Sangam MN

  • SinhalaSangamMN
  • SinhalaSangamMN-Bold

Hiragino Kaku Gothic ProN

  • HiraKakuProN-W6
  • HiraKakuProN-W3

Iowan Old Style (iOS7)

  • IowanOldStyle-Bold (iOS7)
  • IowanOldStyle-BoldItalic (iOS7)
  • IowanOldStyle-Italic (iOS7)
  • IowanOldStyle-Roman (iOS7)

Damascus (iOS7)

  • DamascusBold (iOS7)
  • Damascus (iOS7)
  • DamascusMedium (iOS7)
  • DamascusSemiBold (iOS7)

Al Nile (iOS7)

  • AlNile-Bold (iOS7)
  • AlNile (iOS7)

Farah (iOS7)

  • Farah (iOS7)

Papyrus

  • Papyrus-Condensed
  • Papyrus

Verdana

  • Verdana-BoldItalic
  • Verdana-Italic
  • Verdana
  • Verdana-Bold

Zapf Dingbats

  • ZapfDingbatsITC

DIN Condensed (iOS7)

  • DINCondensed-Bold (iOS7)

Avenir Next Condensed (iOS6)

  • AvenirNextCondensed-Regular (iOS6)
  • AvenirNextCondensed-MediumItalic (iOS6)
  • AvenirNextCondensed-UltraLightItalic (iOS6)
  • AvenirNextCondensed-UltraLight (iOS6)
  • AvenirNextCondensed-BoldItalic (iOS6)
  • AvenirNextCondensed-Italic (iOS6)
  • AvenirNextCondensed-Medium (iOS6)
  • AvenirNextCondensed-HeavyItalic (iOS6)
  • AvenirNextCondensed-Heavy (iOS6)
  • AvenirNextCondensed-DemiBoldItalic (iOS6)
  • AvenirNextCondensed-DemiBold (iOS6)
  • AvenirNextCondensed-Bold (iOS6)

Courier

  • Courier
  • Courier-Oblique
  • Courier-BoldOblique
  • Courier-Bold

Hoefler Text

  • HoeflerText-Regular
  • HoeflerText-BlackItalic
  • HoeflerText-Italic
  • HoeflerText-Black

Euphemia UCAS

  • EuphemiaUCAS
  • EuphemiaUCAS-Bold
  • EuphemiaUCAS-Italic

Helvetica

  • Helvetica-Oblique
  • Helvetica-Light
  • Helvetica-Bold
  • Helvetica
  • Helvetica-BoldOblique
  • Helvetica-LightOblique

Hiragino Mincho ProN

  • HiraMinProN-W6
  • HiraMinProN-W3

Bodoni Ornaments

  • BodoniOrnamentsITCTT

Superclarendon (iOS7)

  • Superclarendon-Regular (iOS7)
  • Superclarendon-BoldItalic (iOS7)
  • Superclarendon-Light (iOS7)
  • Superclarendon-BlackItalic (iOS7)
  • Superclarendon-Italic (iOS7)
  • Superclarendon-LightItalic (iOS7)
  • Superclarendon-Bold (iOS7)
  • Superclarendon-Black (iOS7)

Mishafi (iOS7)

  • DiwanMishafi (iOS7)

Optima

  • Optima-Regular
  • Optima-Italic
  • Optima-Bold
  • Optima-BoldItalic
  • Optima-ExtraBlack

Gujarati Sangam MN

  • GujaratiSangamMN-Bold
  • GujaratiSangamMN

Devanagari Sangam MN

  • DevanagariSangamMN
  • DevanagariSangamMN-Bold

Apple Color Emoji

  • AppleColorEmoji

Savoye LET (iOS7)

  • SavoyeLetPlain (iOS7)

Kailasa

  • Kailasa
  • Kailasa-Bold

Times New Roman

  • TimesNewRomanPS-BoldItalicMT
  • TimesNewRomanPSMT
  • TimesNewRomanPS-BoldMT
  • TimesNewRomanPS-ItalicMT

Telugu Sangam MN

  • TeluguSangamMN
  • TeluguSangamMN-Bold

Heiti SC

  • STHeitiSC-Medium
  • STHeitiSC-Light

Apple SD Gothic Neo

  • AppleSDGothicNeo-Thin (iOS7)
  • AppleSDGothicNeo-SemiBold (iOS7)
  • AppleSDGothicNeo-Medium
  • AppleSDGothicNeo-Regular (iOS7)
  • AppleSDGothicNeo-Bold
  • AppleSDGothicNeo-Light (iOS7)

Futura

  • Futura-Medium
  • Futura-CondensedMedium
  • Futura-MediumItalic
  • Futura-CondensedExtraBold

Bodoni 72

  • BodoniSvtyTwoITCTT-Book
  • BodoniSvtyTwoITCTT-Bold
  • BodoniSvtyTwoITCTT-BookIta

Baskerville

  • Baskerville-Bold
  • Baskerville-SemiBoldItalic
  • Baskerville-BoldItalic
  • Baskerville
  • Baskerville-SemiBold
  • Baskerville-Italic

Symbol (iOS6)

  • Symbol (iOS6)

Heiti TC

  • STHeitiTC-Medium
  • STHeitiTC-Light

Copperplate

  • Copperplate
  • Copperplate-Light
  • Copperplate-Bold

Party LET

  • PartyLetPlain

American Typewriter

  • AmericanTypewriter-Light
  • AmericanTypewriter-CondensedLight
  • AmericanTypewriter-CondensedBold
  • AmericanTypewriter
  • AmericanTypewriter-Condensed
  • AmericanTypewriter-Bold

Chalkboard SE

  • ChalkboardSE-Light
  • ChalkboardSE-Regular
  • ChalkboardSE-Bold

Avenir Next (iOS6)

  • AvenirNext-MediumItalic (iOS6)
  • AvenirNext-Bold (iOS6)
  • AvenirNext-UltraLight (iOS6)
  • AvenirNext-DemiBold (iOS6)
  • AvenirNext-HeavyItalic (iOS6)
  • AvenirNext-Heavy (iOS6)
  • AvenirNext-Medium (iOS6)
  • AvenirNext-Italic (iOS6)
  • AvenirNext-UltraLightItalic (iOS6)
  • AvenirNext-BoldItalic (iOS6)
  • AvenirNext-Regular (iOS6)
  • AvenirNext-DemiBoldItalic (iOS6)

Bangla Sangam MN

  • BanglaSangamMN
  • BanglaSangamMN-Bold

Noteworthy

  • Noteworthy-Bold
  • Noteworthy-Light

Zapfino

  • Zapfino

Tamil Sangam MN

  • TamilSangamMN
  • TamilSangamMN-Bold

Chalkduster

  • Chalkduster

Arial Hebrew

  • ArialHebrew-Bold
  • ArialHebrew-Light (iOS7)
  • ArialHebrew

Georgia

  • Georgia-BoldItalic
  • Georgia-Bold
  • Georgia-Italic
  • Georgia

Helvetica Neue

  • HelveticaNeue-BoldItalic
  • HelveticaNeue-Light
  • HelveticaNeue-Italic
  • HelveticaNeue-UltraLightItalic
  • HelveticaNeue-CondensedBold
  • HelveticaNeue-MediumItalic (iOS7)
  • HelveticaNeue-Thin (iOS7)
  • HelveticaNeue-Medium
  • HelveticaNeue-Thin_Italic (iOS7)
  • HelveticaNeue-LightItalic
  • HelveticaNeue-UltraLight
  • HelveticaNeue-Bold
  • HelveticaNeue
  • HelveticaNeue-CondensedBlack

Gill Sans

  • GillSans
  • GillSans-Italic
  • GillSans-BoldItalic
  • GillSans-Light
  • GillSans-LightItalic
  • GillSans-Bold

Palatino

  • Palatino-Roman
  • Palatino-Italic
  • Palatino-Bold
  • Palatino-BoldItalic

Courier New

  • CourierNewPSMT
  • CourierNewPS-BoldMT
  • CourierNewPS-ItalicMT
  • CourierNewPS-BoldItalicMT

Oriya Sangam MN

  • OriyaSangamMN
  • OriyaSangamMN-Bold

Didot

  • Didot-Bold
  • Didot-Italic
  • Didot

DIN Alternate (iOS7)

  • DINAlternate-Bold (iOS7)

Bodoni 72 Smallcaps

  • BodoniSvtyTwoSCITCTT-Book

過去のiOSバージョンとの比較

同じコードをiOS5と、iOS6でも実行してみました。

Version Families Fonts
iOS5.1 58 163
iOS6.1 61 199
iOS7.0 71 236

だいぶ数が増えたようです。



参考までに、下記記事は iOS5 の頃に同様の方法で一覧を出力したものです。


UIFont の fontName 一覧



[iOS][海外就職]人生初の講演をしました

$
0
0

本日11/11吉日、TechCrunch Tokyo ハッカソンにて、"TechTalk" という枠で人生初の講演をさせていただきました。


さて、このハッカソンに、ハッカー界の著名人が2人も登場して頂けることとなったのでお知らせしたい。(中略)もう1人は、同じく500 Startupsに参加するグロース・プラットフォーム「AppSocially」の開発者、堤修一氏だ。



堤氏のことは、iOS開発者向けに多くの技術情報を出すブログや、著書「iOSアプリ開発達人のレシピ100―開発現場で実証された実用コード集」でご存じの方も多いかもしれない。これまでにフルスクラッチで開発したiOSアプリは30本以上といい、その中には150万ユーザー以上を獲得した対戦RPG「バウンドモンスターズ」もあるという筋金入りのiOS開発者だ。NTTデータ、キヤノンで、それぞれ音声認識技術の研究開発、画像処理機能の設計に携わるなど硬派なエンジニアでもある。ハッカソン経験も豊富な堤修一氏には、イベント初日11日の11時半ごろからハッカソンの心構えなどを語って頂く予定だ。

TechCrunch Tokyoハッカソンで、500 Startupsに参加する日本人エンジニア2人が講演!


上記の告知文にある通り、お話をいただいた時点では サンフランシスコで開催されたTechCrunch主催のハッカソンに参加したときの話 をしようかなと思ってたのですが、資料をつくりはじめてみると、このテーマでそんなに話したいことは多くはないな、と。


自分が、ハッカソンに参加される方々(主にエンジニア?)に向けて、わざわざお時間いただいて話せる話って何だろう、といろいろ考えて、最終的に次のようなスライドをつくりました。


「スキルなし、実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで


二度も受けてやっと入れたカヤックで初めて自分で手を動かしてものをつくる立場になり *1、「全然使えないおっさんが入ってきた」状態になってしまい、そのつらい状況から這い上がるきっかけとなった3つのターニングポイントについての話です。


普段は黙々とモニタに向かってるだけなので、今回は急遽話し方教室に行って練習し、普段のばしっぱなしのヒゲをそり、いつものロンTではなく襟付きのシャツを着て臨みました。諸々反省点はありますが、話したかったことはちゃんと話せたし、今はホッとしつつハッカソン会場のうしろでこれを書いているところです。



ちなみに、今週末ですが、こういうイベントにも登壇します。


シリコンバレーで働く方などをお招きした「スタートアップ企業のリアル」というトークイベント

ソーシャルメディア上でベンチャー・スタートアップ企業に関する情報を目にする機会があるかもしれませんが、表面的な情報だけで、その内情について知る機会はあまり多くないのかと思っております


そういった企業のリアルな姿を知ってもらうことで、今後のキャリアを考える上でのヒントになるようなことを想定して今回


「スタートアップ企業のリアルという」


コンセプトにてトークイベントを実施いたします。


登壇いただく方たちの経歴などを踏まえて

  • 海外(シリコンバレー)で働いて感じた現地のスタートアップ企業の人達
  • SIerからベンチャーとフィールドを移した時に感じたこと
  • ベンチャー・スタートアップらしさとは?

といったテーマに触れるパネルディスカッションを以下要領にて実施いたします


こちらは少人数・双方向でもっとじっくりお話できるかと思います。ご都合よろしければ、ぜひご参加いただければ幸いです。



(関連記事など)


*1:それ以前は自分では手を動かさない仕事をしていました

[電子工作][ガジェット][iOS][Objective-C]『iOSアプリと連携させて使えるデバイスたち』という連載を始めました

$
0
0

今日から、gihyo.jpで新しい連載が始まりました。


iOSアプリと連携させて使えるデバイスたち


というタイトルで、 iOSアプリと連携させるためのSDKや、Web APIが用意されているデバイスを紹介していこうと思っています。


iPhoneやiPadは,あたりまえですが画面があって音も出て,インターネットにもつながり,さらにはGPSや加速度センサも付いていて,スマートフォンアプリに必要な機能を実現するにはかなり「揃っている」デバイスです。ただ,それでもiPhoneからにおいは出せませんし,脳波はとれませんし,時計のように腕に巻くことはできませんし,直接電子回路をつなげることはできません。


そういった「iOSデバイスにない機能」を使うには,外部デバイスに頼る必要があります。嬉しいことに,昨今のスマホアプリ開発人気のおかげで,iOSアプリと連携させて使えるデバイス,すなわちiOSアプリと連携させるためのSDKや,Web APIが用意されているデバイスが色々と市販され始めています。


本連載では,そういった「iOSアプリの可能性を広げるデバイス」を毎回1つずつ取り上げ,その特長や,連携させるためのアプリ側の実装方法などを紹介していきます。

(第1回「はじめに」より)


というようなコンセプトとなっております。


第1回 「konashi」とiOSアプリを連携させる

記念すべき第1回目は国産フィジカルコンピューティングデバイス『konashi』を紹介しています。


http://gihyo.jp/dev/serial/01/futuredevice/0001



対象読者としては、

  • Objective-C で iOS アプリはつくれる
  • デバイスまわりの専門知識はない
  • でも興味がある

こんな感じの方々(要は僕自身)をイメージしているので、デバイスは使いつつ、アプリ側の実装、もしくはデバイスの組み合わせであれこれやるというスタンスになる予定です。


というわけでこの第1回も、フィジカルコンピューティングデバイスを扱いつつも電子回路的な話には踏み込まない範囲で書いています。


元同僚で現ユカイ工学の Rentaro Nozaki さんや、開発者の Reo Matsumura さんにもご協力いただきました。


連載開始の経緯

ずっとリアルデバイスには興味あったのですが、Arduinoのワークショップに参加してみたりしつつ、


  • 「どうやら自分は電子回路とかを本格的に学びたいとは思ってないらしい」
  • 「はんだづけも、ブレッドボードもあまり好きじゃないなぁ。。」

などなど方向性を模索するうち、


得意なiOSアプリをベースにしつつ、その可能性を広げるようなデバイスを使う


というあたりがリアルデバイス周りで自分の一番興味あるポイントだなとたどり着きました。


で、以前の連載 でお世話になった技術評論社の馮さんに、

 Shuichi Tsutsumi 10/22, 5:56am


Fuonさん、ご無沙汰しております。元カヤック、現AppSociallyの堤です。gihyo.jpへの連載のアイデアがあり、ご相談したく。(後略)

早朝5時のテンションで企画持ち込みメッセージ を送ってみたところ、


 Tomihisa Fuon 10/22, 8:30am


ご無沙汰しております.おもしろいですね.

ありがたいことに見事採用していただけた、という経緯です。


そんなわけで

みなさま、どうぞよろしくお願いいたします!!!!



[iOS]iOS7対応の名刺をつくりました

$
0
0

カヤック時代の同僚であり、かつ尊敬するクリエイターである 佐藤ねじ 氏(以下ねじさん)に、デザインをお願いし、個人の名刺 *1 をつくりました。


f:id:shu223:20131118151315p:image:w600



「堤」の部分にはミシン目が入っていて、


f:id:shu223:20131118170901p:image:w500


ペリッとはがすと一番上の写真のように「iOSアプリアイコン型の穴」があきます。


で、これiPhoneに置くとちょうどホーム画面の左上から2,2番目のアイコンと位置が合うようになってるのですが、いま出先の喫茶店でこれを書いてて、iPhoneが1台しかなく、その様子を撮影することができません。。


他にも仕掛けがあるのですが、そのあたりはこれから準備を進めていく予定です。


裏面には諸々のコンタクト情報を載せています。


f:id:shu223:20131118170902p:image:w500


ねじさんについて

カヤックのデザイナー(ほぼ同じ時期に入社)で、会社でもいろいろおもしろいものをつくってるのですが、個人活動でもめちゃくちゃおもしろいものをつくってる人です。


たとえば、昨年すごいバズった『すごいWEB』とか


グッズのアイデア提案サイト『prototype 1000』とか。


ねじさんの仕事一覧


経緯など

ねじさんに個人名刺を依頼したいなというのは実は海外に行くよりも全然前の、今年の始めぐらい(このころ)からあり、正式に依頼したのは9月中旬。


帰国してすぐぐらいに直接会って、名刺のデザインをお願いしたいです、ということと、載せたい情報(名前は日/英両方とか、GitHubアカウントとか)だけを伝えて、アイデア含めまるっとお願いしました。


名刺に穴をあける、という加工が個人名刺として現実的な価格で可能なのか、というのがこのデザインの最大の課題でしたが、ねじさんがいろいろ探してくれて、トムソン加工というものに行き着きました *2



仕事でもプライベート開発でも、わりと一人でもくもくやるのが好き *3 なので、こういう試みは初めてだったのですが、かなり楽しい体験でした。


刺激にもなるので、個人的に尊敬している人に何かを依頼する/一緒に何かつくるというのは今後は意識して積極的にやっていこうかと思っております。



*1:引き続きAppSociallyで働いております。最近個人としての動きも多いのと、単純にねじさんに依頼したかったというのもありつくりました

*2:費用とかの詳細は、ニーズありそうであればまた後で追記します

*3:ハッカソンとかでもチーム組まずに個人でやることが多い

[ライフハック][雑記][Mac]オフラインになる、あるいはSNSを遠ざける方法7つ

$
0
0

シャワーあびてるときはやたらアイデアが浮かんだり今やるべきことが明確に見えてきたり(あとずっと忘れてたことを思い出したり)するというのはなんでだろう、と考えてみて、仮説として思い浮かんだのは、「外部からのインプットがほぼないので、自分の内面と向き合えるから」ではないかと。


そういえば、机に向かってるときはもちろん、歩いてるとき、トイレに行くとき、布団に入って寝る前もスマホ見たり音楽聴いたりしてて、ほんとに「外部からのインプットがない」状態なのはシャワーあびてるときだけかもしれない。


で、ライフハックとして、「明確な用があるときまでiPhoneとMacの電源を切っておく」というのを思いついた。



というわけで一度消えます。


ということをFacebookに書いて3時間ほどPCもiPhoneも電源offで過ごしてみたのですが、これがなかなかよかった。


店出たとき、電車乗ったとき、信号で立ち止まったとき・・・とちょいちょい無意識にiPhoneを見ようとしてて、相当毒されてるなーと思った。



で、iOSアプリを開発する人が Mac も iPhone も電源 off のままというわけにはいかないので、どうするかなーと思いついたのが以下の 7 つ。


無自覚にインプットを受け続けるのをやめたい、という意味でのオフラインになる、というのと、Facebook/Twitterをちょいちょい見て時間を無駄に消費するのをやめたい、というのが混ざってます。


あと自分ではちょっとできないな、、というものも混ざってます。


1. Mac/iPhoneの電源を切っておく

仕事もできないので、制約としてはなかなか厳しいですが、Mac/iPhoneを使って何をやるべきか、どのように進めるかが明確でないときはこの状態からスタートするのがよいのかなと。


2. SNSクライアントをアンインストールしておく

iPhone から Facebook アプリや Twitter クライアント等をアンインストールしておく、というものです。


必要なら都度インストールしてもいいし、Mac起動してブラウザからアクセスしてもいいし、iPhoneのブラウザからアクセスしてもよい。


いずれにしてもそれぐらいのハードルを超えてまでアクセスしたいのか?という抑制効果があります。


自分はFacebook Messengerだけ入れておいて、他のFacebook/Twitter関連アプリはアンインストールしましたが、なかなか快適です。


3. キーチェーンからSNSのid/passを消しておく

キーチェーンとか、1passwordとか。


覚えられるようなpasswordを使っている場合に限るので、セキュリティの観点からはよくありませんが。。


4. SNSからログアウトしておく

抑止力はちょっとしたものですが、ハッと我に返れるときもあります。


5. ブックマークから消す

ほとんどこういう人はいないかもしれませんが、僕は昔ブラウザのブックマークバーからメールやTwitterにすぐにアクセスできるようにしてました。


6. ブラウザのプラグインでURLをブロックする

WaistNoTimeというプラグインがありまして、

*.facebook.com
*.twitter.com
*mail.google.com

みたいな感じでFacebookやTwitterをブロックしてます。また、開発に必要なdev.〜とかはallowリストに入れてアクセスできるようにしてあります。


詳しくは以前書いた下記の記事にあります。


仕事に集中するための仕組みづくり


Chrome, Safariにはこれを入れてあって、Firefoxは抜け道としてとってあったのですが、最近カジュアルにそこから見るようになってしまったのでアンインストールしました。


7. Wi-Fiの登録を消す

Mac だと System Preferences の Network -> Advanced から、iPhone だと Settings -> Wi-Fi から、ネットワーク情報を削除することができます。


落としどころ

思いついたのを順不同で適当に挙げましたが、自分で(部分的に)実行してみているのは、1, 2, 4, 5, 6です。



[雑記][iOS]プログラミング素人の31歳が、カヤックに入社するまでの記録・ダイジェスト版

$
0
0

本日、CAREER HACKさんに、『失敗続きの窓際エンジニアが掴んだ最後のチャンス|iOS開発者 堤修一に訊く│CAREER HACK』というインタビュー記事を掲載していただきました。


screenshot


この記事は2本立てとなっていて、実際にどうやってスキルを伸ばしていったのか、という後編につながるのですが、31歳のおっさんが、最初はディレクターとして応募したり、スクールに通ってプログラミングを勉強したりと四苦八苦しながらもどうにかこうにかカヤックに入社させてもらうまでの話ってこのインタビュー中にはしなかったなと。


で、本ブログの前身である、


Over&Out

screenshot


というブログは、まさにその、「カヤックの中途採用に応募してみよう、と思ってから、カヤックに合格するまで」を綴ったブログになります。


CAREER HACKさんに過去の経緯についてインタビューいただいたことだし、せっかくなのでこの超マイナーブログの記事をいくつか掘り起こして、ダイジェストで、『プログラミング弱者の31歳が、カヤックのプログラマになるまで』をお送りしようと思います。


ブログ立ち上げ

カヤックを受けようと思い、この時点では自分でプログラム書いて何かをつくったりということができないので、まずはブログを立ち上げました *1

Web業界への転身を(これから)目指します。


それにまつわる日々のあれやこれやを、

ブログとして書き残していきたいと思います。


応募職種を決めるところからスタート。

現状について正直なことを申しますと、

応募する職種さえ決めかねている状態です。


Webの世界について勉強をはじめる

Flash レッスンブック―CS4対応
今北 舞
ソシム
売り上げランキング: 108,214

この本を買って、Flash体験版をさわってみました。画像をタイムラインに貼り付けただけですが、たったそれだけで動くものがつくれたので、「おおっ」と思った記憶があります。


ウェブサイト制作のワークフローと基礎技術
佐藤 好彦
技術評論社
売り上げランキング: 896,500

ディレクター志望でエントリーシートを書いたものの、ディレクターってどんなことやるの?というのがわからなかったので、ブックオフで上記の本を買って読んでみました。


で、感想は、

・・・つまんなそう。。

でした。。


カヤックのディレクター全員を研究したりしました *2


面接対策として、企画を99本持っていくことにしました *3


カヤック二次面接

面接時にCTOかいちさんの反応があまりに冷ややかで、これはヤバいと、急遽その日にたまたま開催されていたカヤックの交流会に飛び込み参加。


かいちさんをつかまえて、言い足りなかったことをアピールしました。


結果、どうにかこうにか二次もパス。


数年後、この日のことをかいちさんに聞いてみたところ、実際に落とすところだったそうです。


カヤック最終面接

無事三次もパスして、いよいよ明日は最終面接!というタイミングで書いた記事 *4


まずは合格者像を正確にイメージするために、柳澤さんの「採用に関する発言」を集めてみました。

とあるとおり、CEOやなさんのインタビュー記事を大量に集めてきています *5


実際に受けてきた感想。CEOやなさんのあとに、瀬尾さん、玉田さん、大塚さん登場。




結果は・・・




見事に不合格!!



そして・・・


はじめてのActionScript作品

当時、自分で手を動かしてものをつくれるようになるべく、週末を利用して、ActionScriptのスクール、『クスール』に通っていました。



そこでの制作課題は、「Yahoo! JAPAN Internet Creative Award」のバナー部門に応募すること。


で、つくって応募したのがこれ。


※開くといきなり爆音が出るので注意)


タイトルは『ヘビメタ』です。マウスに合わせてキャラ *6 がギターソロを弾き、最後にフライングVを宙に投げ、それがYahooのYになるというもの。


カヤックのやなさんが審査員ということではりきってつくりましたが、残念ながら箸にも棒にもかからず


Mac購入/はじめてのビルド

タイトルには「iPhoneアプリつくりました」ってあるけど、ビルドしてシミュレータで実行しただけ。


全然まとめられてない。。 *7


退職 → (ほぼ)ニートに

ダイジェストと言いつつかなり長くなってるのでここらから巻きでいきます。


当時勤めていた会社の上司に退職の意志を伝えました。


・・・といっても転職先とかが決まってるわけではなく、

実績も次の就職先もない。


人脈もほとんどない。


年齢は30を超えている。


既婚。

フリーランスという名のニートに。 *8


賞をもらう

引き続きスクールで Flash / ActionScript を勉強し、

2つ目の作品で、賞をいただきました。


そのときの作品を、ブログパーツにしたものがこれ。



天気予報APIを使用して取得した週間天気予報より、オルゴールのように美しいメロディを生成します


というコンセプトですが、APIの使用期限が切れているので、「晴れ」しかでず、今はもうあまり自動生成感はありません。。


カヤック合格

二度目の面接は10分ほどで終了。


持っていったものはあまり評価されませんでした *9 が、

勉強をして、それをしかも形にして、賞という一定の評価まで得て、実際につくっていたものを持って受けに来た(元記事

ことが合格につながったとのこと。



で、このブログとしてはめでたしめでたし。



そして、例のスライドの話や、今回のインタビューの話につながります。




以上、カヤック入社までを綴った前身ブログ『Over&Out』のダイジェスト版でした!


(2013.11.28追記)告知

そんな感じで前身ブログ、本ブログと、ずいぶんお世話になっているはてなさんよりお声がけいただき、「はてなエンジニアブロガー祭り」というイベントに登壇させていただくことになりました。



"第2部 パネルディスカッション「ブログとエンジニアと私(仮)」" なるパートに出ます。


ピザもビールも出て無料とのことですので是非!



*1:タイトルは、家にあったCDの曲名から適当に語感が良いと思うものを選びました。で、Gorky's Zygotic Mynciというバンドの曲名より拝借。

*2:とはいえプロフィールと関連コンテンツ読んだだけ

*3:今思うと、これは企画というより、アイデア(それぞれ1行ぐらいのメモ書きしかなかった)。当時「企画書」とか見たことなかったし、どれぐらい/どうやって具体化すればいいのかわかってなかった。

*4:このブログは全然アクセスなくて超マイナーなのですが、『カヤック 面接』でググるとこの記事が上位に出てくるので、カヤックに入社してくる人だけには「ブログ読んでましたよ〜」とよくいわれました。

*5:当時の自分に「そんなのいいから何かつくれ!」と言いたい

*6:ペンタブ買って自分で描きました

*7:結局どれが何用なのかわからず、この後1年半ぐらいは「View-Based」だけを使ってた気がします。

*8:ちなみにニートで有名な id:pha さん(phaの日記)は、同じ大学、同じ学年、(一瞬だけ)同じ部でした。彼の文章・考え方・つくるもののファンで、memorizeの頃からずっとブログを読んでいます。

*9:実戦ではまだまだ通用しない、という評価

[Xcode][iOS][Objective-C]【iOS7】バイナリに arm64 アーキテクチャが含まれているかを確認する

$
0
0

xcrun コマンドを使用します。

$ xcrun lipo -info <path_for_binary>

たとえば AppSocially SDK について調べてみると、

$ xcrun lipo -info AppSocially.framework/Versions/A/AppSocially

下記のように、出力されました。

Architectures in the fat file: AppSocially are: armv7 armv7s i386 arm64 

armv7, armv7s, arm64 と、i386(シミュレータ用)のアーキテクチャに対応していることがわかります *1


lipo コマンドと、-info オプションについて

lipo とその -info オプションについて man コマンドで調べると

$ man lipo

下記のように説明されています。

lipo - create or operate on universal files
-info  Briefly list the architecture types in the input universal  file
         (just the names of each architecture).

lipo コマンドは ユニバーサルファイルを生成、操作する もの、 -info オプションは ユニバーサルファイルに含まれているアーキテクチャの種類のリストを出力する もの、とのことです。


参考記事

確認方法は下記記事を参考にしました。


また 32bit/64bit 同梱バイナリ生成にあたってのビルド設定については、下記記事を参考にしました。



*1:AppSociallySDKのarm64対応版は、12/5 AM11現在は未リリース

[iOS][Objective-C][ライブラリ]【iOS7】AsyncImageView が arm64 でクラッシュする件

$
0
0

AsyncImageView を arm64 で動かすと EXC_BAD_ACCESS でクラッシュする件の対処法です。


結論から言うと、objc_msgSend をキャストするよう修正すればOKです。


たとえばこれを、

objc_msgSend(connection.target, connection.success, image, connection.URL);

こうします *1

((void(*)(id, SEL, id, id))objc_msgSend)(connection.target, connection.success, image, connection.URL);

情報ソース

objc_msgSend 関数の修正方法については、公式ドキュメントの『64ビット移行ガイド』で説明されています。

An exception to the casting rule described above is when you are calling the objc_msgSend function or any other similar functions in the Objective-C runtime that send messages. Although the prototype for the message functions has a variadic form, the method function that is called by the Objective-C runtime does not share the same prototype. The Objective-C runtime directly dispatches to the function that implements the method, so the calling conventions are mismatched, as described previously. Therefore you must cast the objc_msgSend function to a prototype that matches the method function being called.


Listing 2-14 shows the proper form for dispatching a message to an object using the low-level message functions. In this example, the doSomething: method takes a single parameter and does not have a variadic form. It casts the objc_msgSend function using the prototype of the method function. Note that a method function always takes an id variable and a selector as its first two parameters. After the objc_msgSend function is cast to a function pointer, the call is dispatched through that same function pointer.

64-Bit Transition Guide for Cocoa Touch: Converting Your App to a 64-Bit Binary


その他

あとでプルリク送ってみようと思いますが、本家リポジトリはiOS7リリース後の更新はなく、マージしてくれないかもしれません。


ちょうど何日か前に、




こんなやり取りがあったのですが、やっぱり SDWebImage に乗り換えた方がいいかなと、今回の件で思いました。


メンテされてるかどうか、はOSSの善し悪しの判断基準としてトップに来ると思いますが、iOSの場合はとくに『メジャーアップデート後にメンテされているか』が重要かなと。


*1:これ以外に、何カ所かあります。引数の数に合わせてキャストの記述を変更してください。

[雑記][iOS]ブログを三ヶ月毎日続けるためにやったこと

$
0
0

先週、タイムラインにこんな記事が流れてきました。



タイトルを見て、ちょうど僕が 初めての講演 をさせたいただいた内容の、「ブログを3ヶ月間毎日更新した」というところでちょうど一致してるので、分野は違えど同じような感覚なんだなぁと。




で、ありがたいことに上のスライドは約2週間で 9万人 近い人に見ていただき、それからというもの

  • 「あのスライドを見てブログをはじめた」
  • 「再開した」

というご報告をいただくことがしばしばあります。


まずは始めた/再開したというだけでも意義のあることだと思うのですが、「続ける」というのは、始めるのとは違った難しさがあるものなので、自分の場合は どうやって地道に技術ブログを続けることができたか というコツみたいなものを書いてみたいと思います。


# Blog #blogadvent Advent Calendar 2013 - Adventar 9日目の記事です。


ブログを書くために書かない

僕が続けてこれた最大にして唯一のコツはこれ(↑)になります。


「ブログを書く」というのは基本的に面倒 *1 なので、ブログを更新するために何かを書こうとするとなかなか続きません。


なので僕は、ブログを書こうと思っていたらもう書けていた となるようにしていました。


どういうことかというと、

  • 開発中に、調べるついでにメモをとる
  • → (気が向いたら)それをブログにアップする

というノリでやる、ということです。


具体例

たとえば、iOSアプリをつくっていて、さあ申請するぞとアップしようとしてみたら、なんかエラーが出たとします。エラーには、"An error occurred uploading to the iTunes Store" とか書いてあって、よくわからん、と。


そういう場合、ググりますよね。僕はググります。


で、ググる前に、テキストエディタでファイルを新規作成して、

#アップロード時に An error occurred uploading to the iTunes Store エラーが出た場合の対処方法

と、とりあえずタイトルだけ書いておきます。


で、"An error occurred uploading to the iTunes Store" でググる。


なるほどー、と思う情報があれば、URLをさっきのテキストファイルにコピーしておきます。

#アップロード時に An error occurred uploading to the iTunes Store エラーが出た場合の対処方法




で、有力情報があれば、それもコピペしておいたり。試してみたらその方法ではだめだったり。


そんな感じでできあがったメモ、アップしてみると、



これな感じで記事のできあがりです。


最初のころはがんばって書いたところでアクセスもないし、ツイートで知らせたりもしてなかったので、ほとんどの記事がこんな感じでした。スクリーンショットとかも面倒なのでほとんど貼らず。他者にはわかりにくいなーというところの説明も補充せず。ほんとに自分用メモをアップしただけという感じ。


それでも、続けていればコンテンツが増え、Google経由で誰かしらが訪れてくるようになり、記事も自然とこなれてきます(このあたりのブログを続けてよかった話は上のスライドに書きました)。


それでもめんどくさい

はい、それでもめんどくさいです。


でも毎日開発はするし、ちょっとややこしい調べ物をするときにはだいたいメモをとるので、僕のローカルフォルダには、数百のブログ記事化されることのなかったテキストファイル達が眠っています。


f:id:shu223:20131209175202p:image:w500


名前もちゃんとつけてない *2 ので、どれがどんな内容だかわかりませんし、一つ一つ確かめるには数も多いのでおそらく2度と振り返ることもありません。でも、ちゃんと名前をつけて管理しようと思ったらそれも面倒になってしまいそうなので、適当な名前つけて適当なフォルダに放り込んでます。


それぐらい、自分に負担をかけないという方針でやってきました *3 。基本的に業務でいっぱいいっぱいだし、ブログはあくまで副産物なので。


まとめ

技術ブログを続けるには、「さーブログ書くぞ!」と気負って書くと面倒になって書けないので、開発中にメモをとる、そのメモをアップする、ぐらいの感覚で更新すると続けられるかもしれません、という話でした!


*1:いろいろと心理的ハードルがある

*2:デフォルトの名前に、適当に数字を打ち込んで保存してます。

*3:最近は、読んでくれてる人も多くなってきたので、メモベースでアップするにしても以前よりもしっかりめに情報を入れることが多くなりました。

[iOS][Objective-C][ガジェット]BLEデバイスと技適 〜EstimoteのBeaconsを使うと逮捕されるのか〜

$
0
0

という発表を、本日クックパッドさんのTips共有会 "potatotips" *1 の第2回でしてきました。



Tipsというか、 個人輸入したBLE対応デバイスの技適の取り扱いに関して、識者の方々に相談して得た情報 を共有してきた感じで、結論もまだモヤッとしております。


みなさまも法令遵守の上、楽しいBLEデバイスライフを!


*1:参加者全員が5分ずつTipsを発表する。Android/iOS開発者混合。

Viewing all 317 articles
Browse latest View live