2014-05-26(月) | -- (permalink)

はじめに

私は、業務で主にObjective-Cを利用しているのだが、Cがよく分からないままObjective-Cを使っていると、なんともいえないモヤモヤした気持ちになる。低レイヤのAPIを使用するときや 、老害っぽいコード読む時など、Cがよく分かっていないことを痛感させられる。Cをほとんど学んだことがないままで、CのスーパーセットであるObjective-Cをやっている。こうした境遇の人は結構多そうだ。そこで、Cを勉強するのに良いテーマが無いかと探していたところ下記のサイトを発見した。

Buil Your Own Lisp

うん、これしかないだろう。何かの言語を学ぶときにLispの処理系を作るのは定番だ。CでLispを実装し、HaskellでLispを実装し、LispでLispを実装するのだ(超言語抽象)。というわけで、このチュートリアルを最後までやってみたのだが、日本語の記事でこの内容に言及しているものはほとんどなかったので、どんな内容であったのか簡単にまとめてみた。一部翻訳があるが、完全に意訳である。ご了承いただきたい。

どんな人がやるべきか

これは著者が冒頭で述べている通りである。

This book is for anyone wanting to learn C, or who has once wondered how to build ...


2014-02-19(水) | -- (permalink)

はじめに

2/15-16と2日間に渡って行われた、Open Hack Day Japan 2というイベントに参加してきた。 ここではイベントの概要、開発したプロダクト、参加して得た感想について述べる。

Open Hack Day Japan 2とは

Hack Dayは世界各国のYahoo!で開催されている開発イベントで、24時間という限られた時間で自由にアイデアを創造、実際に開発し、できあがったプロトタイプを発表します。日常の業務から離れ、自由な発想で、好きな技術を使って開発に取り組めるクリエイティブマインドにあふれたHack Dayは、ヤフー社内で300人近くの参加者を集める人気イベントです。

これをヤフーが社外にも公開したのがOpen Hack Dayであり、今回はその2回目となる。 今回も参加者約350名、チーム数80強と、比較的大規模なイベントとなったようだ。


2014-02-12(水) | -- (permalink)

概要

この2月からadvertisingIdentifierの利用方法が原因でリジェクトされるケースが大量に発生しているようだ。自分自身でadvertisingIDを利用するコードを書いている人はあまりいないであろうが、UDIDが利用できなくなった現在、効果測定を行うSDKの大半がトラッキングのためにこのIDを利用している。そして、このadvertisingIDの利用方法がリジェクトされてしまう原因であるようだ。

ちなみにリジェクトされるとこのようなメッセージがくる。

PLA 3.3.12

We found your app uses the iOS Advertising Identifier but does not include ad functionality. This does not comply with the terms of the iOS Developer Program License Agreement, as required by the App Store Review Guidelines.

Specifically ...


2014-01-31(金) | -- (permalink)

静的サイトジェネレーターを使いたかったので、Wordpressをやめた。 現在、Pelicanに移行中。


2013-12-24(火) | -- (permalink)

(この投稿はQiitaのiOS Second Stage Advent Calendar 2013の25日目の記事です)

もはや非常に一般的となった、CIDetectorによる顔検出。

ただ、よく見るサンプルはほとんどカメラの入力に対するリアルタイム検出ばかりだったので、

試しに動画に対して顔を検出するサンプルを作成してみた。

https://github.com/yuseinishiyama/VideoFaceDetection

CIDetectorとAVAssetReaderを組み合わせるだけで簡単にできる。

VFDVideoFaceDetector.h

#import <Foundation/Foundation.h>

typedef void(^VFDVideoReaderCompletionHandler)(NSArray *allFeatures);

@interface VFDVideoFaceDetector : NSObject
- (void)readFromURL:(NSURL *)targetURL
complitionHandler:(VFDVideoReaderCompletionHandler)completionHandler;
@end

VFDVideoFaceDetector.m

#import "VFDVideoFaceDetector.h"
#import <AVFoundation/AVFoundation.h ...

2013-11-13(水) | -- (permalink)

Unityを触ったり、簡単なシェーダー書いたりしてるうちに描画処理への関心が高まってきた。ゲームとかグラフィックスの分野は、一定以上のものを作るために比較的コアな知識がいる一方で、結果がキャッチーで分かりやすい。ゲームにはあまり興味がない私だが、ゲームエンジンブームである。先日、「Playgroundハッカソン」に参加してからというもの、ますます興味が湧いてきている。

そんなわけで、「Game Engines」がテーマの第7回テックヒルズに行ってきた。

以下が公開されているスライドへのリンクだ(一部、公開が確認できていないものもある)。

  1. 「Unity2DとnewGUIについて」安藤 圭吾さん(ユニティ・テクノロジーズ・ジャパン)
  2. 「Aiming開発ゲームの裏側」牧野 克俊さん(Aiming)
  3. 「cocos2d-xおよび開発ツールについて」清水 友晶さん(TKS2)
  4. 「 enchant.jsの野望 9分コーディングライブ」 清水 亮さん(ユビキタスエンターテインメント)
  5. 「イントロダクション」 &「Playgroundの描画仕組み」「マルチPF対応ゲームエンジン内のAndroid対応」ロマン・ピコアさん(KLab) ・中澤 慧さん(KLab)
  6. 「次世代ゲームエンジンの比較 ...

2013-10-09(水) | -- (permalink)

開発者のWordpressサイトがデフォルトのテーマだというのもなんとなく恥ずかしいので、テーマを作成してみた。とはいえ、Webの開発経験は全然ないので結構苦戦した。未だにあちこち粗が目立つ。しかし、「そのうち全部直して適応〜」とかいってると、一生デフォルトのを使い続けそうなので、先に本番環境に適応してから少しずつ修正することにした。

レスポンシブデザインとかそういうことも考えだすと、自作するのを辞めたい衝動に駆られてしまうが・・・。


2013-09-16(月) | -- (permalink)

開発者であれば、ユーザーには自分の開発したアプリの最新版を使ってほしいと思うだろう。また、ユーザーのアプリバージョンにばらつきがないことは、ビジネス面のメリットも大きい。仕事として開発を行っている人であれば、「アプリのアップデートが行われた場合に通知する機能」の実装を要求されたことは多々あるだろう。

そこで今回は、

アプリの最新版を取得し、ユーザーが利用しているアプリが最新版より古ければ通知する機能

の実装方法を紹介する。

さて、まず考えなくてはいけないのは、どこからアプリの最新版を取得するか、ということである。これにはおおまかに言って、2通りの方法がある。「1.自前のサーバを利用する方法」、と「2.AppleのAPIを利用する方法」の2つだ。どちらが適切な方法であるか比較するために、それぞれのメリット、デメリットを挙げてみた。

1.自前のサーバを利用する方法

メリット

デメリット

2.AppleのAPIを利用する方法。

メリット

デメリット

結論から言うと、「AppleのAPIを使ったほうが楽だが ...


2013-09-07(土) | -- (permalink)

RequiredDeviceCapabilityを正しく設定していないと、Appleにリジェクトされてしまうことは、広く知られている。

例えば、アプリに静止画を撮影する機能がある場合、このRequiredDeviceCapabilityに「still-camera」を追加してやらないといけない。

RequiredDeviceCapabilityは正しく設定されていなくても、ビルドに失敗しないし、Validationも通過する。だからこそ、リジェクトされてから気づくわけで、こういう作業は特に自動化するメリットが大きいだろう。

そこで、PostProcessBuildPlayerを利用し、Unityからのビルド時にInfo.plistを書き換えて、RequiredDeviceCapabilityを編集する関数を作成してみた。

def process_plist(plist_filepath):
  pl = plistlib.readPlist(plist_filepath)
  new_settings = {"still-camera"}
  if "UIRequiredDeviceCapabilities" in pl:
    pl["UIRequiredDeviceCapabilities"].extend(new_settings)
  else:
    pl["UIRequiredDeviceCapabilities"] = [new_settings]
  plistlib.writePlist(pl, plist_filepath)

Info.plistのパスを与えてやると、Info.plistに「still-camera ...


2013-09-06(金) | -- (permalink)

Unityでスクリーンショットを撮るのは非常に簡単である。

Application.CaptureScreenshotという関数が用意されているからだ。

だが、この方法ではアプリのデータ領域に画像が保存されるだけなので、ユーザーが、その画像を閲覧できるようにはならない。アプリ内で画像を管理できるようにしてもいいかもしれないが、スクリーンショットを確認したいだけなのであれば、そこまでする必要はないだろう。

そこで今回は、UnityからiOSのカメラロールにアクセスする方法を紹介する。

#import <Foundation/Foundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <AVFoundation/AVFoundation.h>

/* 
 スクリーンショット撮影時に利用するネイティブコード。
 */

// 指定したパスの画像をカメラロールに保存する。
extern "C" void _WriteImageToAlbum (const char* path)
{
    UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithUTF8String:path]];
    ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
    NSMutableDictionary *metadata = [[[NSMutableDictionary ...

Page 1 / 2 »