Paradigm Shift Design

ISHITOYA Kentaro's blog.

株式会社エングラフィアを起業しました。

おひさしぶりであります。

この2-3ヶ月怒濤だったわけで、目下、なお渦中なのですが、9月30日付けで名古屋大学大学院情報科学研究科 博士後期課程を満期退学して、10月1日付けで「株式会社エングラフィア」を起業し、代表取締役社長に就任しました。
要約すると、まだ学位取れてないけれど、見切り発車で会社作ったよ!頑張るよ!です。


タイミングとしては、高専を3年次にやめたとき、大学卒業したとき、修士卒業したとき、博士を3年で卒業できない事が分かった1年前も、ずっと起業する起業する!と言い続けてきた気がします。
出資してくださった某高専の某同級生にも「お前はいつもいつも、やるやる詐欺だな!」と言われ続け、不義理に不義理を重ねておりましたが、いざ起業して開業式に来ていただいても「オフィスにきてもまだ信じられない!」と言われる始末でありまして。

本日、無事会社の登記が完了し、株式会社として正式に発足しました。
起業の目的は、「人の役に立つサービスを開発・運用する」という、まだ曖昧模糊としたものですが、これからサービスを作り続けて行く中でアイデンティティを確立して行けたらなと考えています。

目的は目的ということで、生きて行くためには仕事が必要です!
私にWebデザインはできませんが、株式会社リオと強固な協力体制を敷いています。
Webサイト、Webシステム、スマートフォン・タブレットアプリなど、お心当たりがありましたら、仕事ください!まずは飲み会からお願いします!


…あ、名前は、エングラフィア(Engraphia)といいます。
エングラフィアは造語で、グラフは情報科学で「人と人のつながり」とか「知識」とかそういうネットワーク構造であらわせるものを指します。
en(強化する) + graph(人と人のつながり、知識)+ ia(場所)
という意味です。

えぇ、すでに株式会社円グラフという宛名の領収証が2枚あります。
覚えていただければ幸いです!


ちなみに、大学院の時のひとつ年下の先輩、土田 貴裕さんと2人で創業です。
場所は総武線水道橋駅、徒歩2分。気が向いたら、お気軽にお越し下さい。お茶くらい出します。
会議机とホワイトボードを揃え(てもらい)ましたので(ている途中)、ちっさいミーティングとか勉強会ができたらなと思ってます。

Webサイトは、
http://engraphia.com
です。Bootstrap満開なので、かっこいいデザインにしてくれるデサイナのかた、待ってます!

あ、あと、学位は来年の1月になんとか取れそうな雰囲気です!
本当は、この記事を10月1日に上げたかったのですが、記事を落ち着いて書けるような状態ではなく。


最後になりましたが、発起人のみなさま、会社設立にあたってお世話になったみなさま。ファミール、高専Wakhok、名大、リオなどこれまで私を温かく見守ってきてくださったみなさま。そして、家族、とりわけ両親と森井家、天野家のみなみなさま。
これから、どうなるのか自分でもドキドキですが、みなさんをいい意味でドキドキさせられるように、気合いを入れていきますので、よろしくお願いいたします!

MFMailComposeViewControllerの確認画面を超絶無視する方法

MFMailComposeViewControllerの確認画面がうざい。
一律に、確認しないとメールを送れないようにするんじゃなくて、所定の手続きを踏んでユーザに確認すれば、確認画面を出さないでバックグラウンドでメールを送れるようにして欲しい...

で、skpsmtpmessage Quick SMTP client code for the iPhone を使おうかと思ったけど、デフォルトで設定されているE-Mailアカウントを使えない。
それじゃ意味がなさすぎるので。

なんか方法ないかなーってさまよってたら、cocoa touch - iPhone send email not using MessageUI - Stack Overflowというのを見つけた。Sendボタン押しちゃうわけね。絶対、審査とおんないんだろうなぁ。

通んないのかなぁ。とりあえず投げてみてから考えるか。っつーわけで、実装してみた。

まず、MFMailComposeViewControllerの設定。ちなみにSimulatorではメールを送れない。あと、サブジェクトがないとAlertが出てうざいので、ちゃんと埋めておく。

/*!
 * submit content
 */
- (id)submitContent:(PhotoSubmitterContentEntity *)content 
      andOperationDelegate:(id<PhotoSubmitterPhotoOperationDelegate>)delegate{
    MFMailComposeViewController *mailComposeViewController = [[MFMailComposeViewController alloc] init];
    if([MFMailComposeViewController canSendMail] == NO){
        [self completeSubmitContentWithRequest:mailComposeViewController andError:nil];
        return mailComposeViewController;
    }
    
    mailComposeViewController.mailComposeDelegate = self;
    [mailComposeViewController setToRecipients:[NSArray arrayWithObject:self.sendTo]];
    
    NSString *subject = nil;
    NSString *body = nil;
    if(content.comment == nil && self.defaultSubject != nil){
        subject = self.defaultSubject;
    }
    if(content.comment != nil && self.commentAsSubject){
        subject = content.comment;
    }
    if(content.comment == nil && self.defaultBody != nil){
        body = self.defaultBody;
    }
    if(content.comment != nil && self.commentAsBody){
        body = content.comment;
    }
    
    if(subject == nil || [subject isEqualToString:@""]){
        subject = @"tottepost photo";
    }
    [mailComposeViewController setSubject:subject];
    [mailComposeViewController setMessageBody:body isHTML:NO];
    
    
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"M/d/y h:m:s"];
    
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.dateFormat  = @"yyyyMMddHHmmssSSSS";
    NSString *filename = nil;
    NSString *mimeType = nil;
    if(content.isPhoto){
        filename = [NSString stringWithFormat:@"%@.jpg", 
                     [df stringFromDate:content.timestamp]];
        mimeType = @"image/jpeg";
    }else{
        filename = [NSString stringWithFormat:@"%@.mp4", 
                     [df stringFromDate:content.timestamp]];
        mimeType = @"video/mp4";
    }
    
    [mailComposeViewController addAttachmentData:content.data 
                                        mimeType:mimeType fileName:filename];
    if(self.confirm == NO){
        [mailComposeViewController view];
    }else{     
        dispatch_async(dispatch_get_main_queue(),^{
            [self presentModalViewController:mailComposeViewController];
        });
    }
    return mailComposeViewController;
}


で、composeし終わってMFMailComposeViewControllerが表示されそうになったら、controllerのsubviewを辿ってsendボタンを探す。探すのは再帰になるのでこんな感じのメソッドを作る。

/*!
 * find views named
 */
- (NSArray *)searchForViewsNamed:(NSString *)name 
                        fromView:(UIView *)view found:(NSMutableArray *)found{
    if(found == nil){
        found = [[NSMutableArray alloc] init];
    }
    
    for (UIView *subview in [view subviews]) {
        if([NSStringFromClass([subview class]) isEqualToString:name]){
            [found addObject:subview];
        }
        [self searchForViewsNamed:name fromView:subview found:found];
    }
    return found;
}


でUINavigationBarの右側にあるSendボタンを探すので、こうなる。

/*!
 * on composed
 */
- (void) mailComposeController:(MFMailComposeViewController*)controller 
 bodyFinishedLoadingWithResult:(NSInteger)result error:(NSError*)error
{
    if(self.confirm == NO){
        id button = nil;
        NSArray *views = 
          [self searchForViewsNamed:@"UINavigationBar" 
                           fromView:controller.view found:nil];
        if(views.count == 0){
            return;
        }
        views = [self searchForViewsNamed:@"UINavigationButton" 
                                 fromView:[views objectAtIndex:0] found:nil];
        if(views.count == 0){
            return;
        }
        for (UIView *v in views) {
            if(v.frame.origin.x > 200){
                button = v;
            }
        }
        
        if(button == nil){
            return;
        }
        [button sendActionsForControlEvents:UIControlEventTouchUpInside];
        [self checkForSizeConfirmWindow];
    }
}


でもって、sendボタン押した後、写真のサイズが大きすぎると、選択するUIActionSheetが出てしまう。出ている場合にはUIApplicationのkeyWindowからUIActionSheetを辿れるので、適当に選択するようにする。

/*!
 * select size confirm button
 */
- (void) checkForSizeConfirmWindow{
    UIActionSheet *actionsheet = nil;
    NSArray *buttons = [[NSMutableArray alloc] init];
    NSArray *views = 
      [self searchForViewsNamed:@"UIActionSheet" 
                       fromView:[UIApplication sharedApplication].keyWindow found:nil];
    if(views.count == 0){
        return;
    }
    actionsheet = [views objectAtIndex:0];
    buttons = [self searchForViewsNamed:@"UIAlertButton" 
                               fromView:actionsheet found:nil];
    if(actionsheet && buttons.count > 2){
        [[buttons objectAtIndex:1] sendActionsForControlEvents:UIControlEventTouchUpInside];
    }
}

で、これで黙ってSendできます。多分審査は通らないと思うけど、とりあえず出してみる。まぁ、確認画面が毎回出るだけなんだけど。

当然、AppStore通さないアプリなら問題なく使えます。

追記

審査とおった。多分、運だと思います。

せんでん

1タップで写真&動画を共有できるカメラtottepost
カメラのついたiPad/iPhoneで撮った写真や動画を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真&動画を共有できるカメラ - tottepost - ISHITOYA Kentaro

RestKit.hがみつからないよっておこられる場合の処方箋

tottepostのSalesForce対応で使わなければならないことになったので、今まで毛嫌いしていたRestKitに手を出しました。
で、案の定、色々トラブってます。


RestKitの名誉のためにいっておきますが、悪いのはRestKitではなくて、大分ましになったとはいえ、ちょっと頭の弱いXCodeちゃんのせいです。
愚痴を言い始めると一週間ぐらい酒が飲めそう…


で、掲題の件ですが、普通にBuildするときはおこられないのにArchiveするときだけ

Lexical or Preprocessor Issue - 'RestKit/RestKit.h' file not found 

とか言われる場合の対処法です。


1, 0.9.3以前から乗り換えた
Home · RestKit/RestKit Wiki · GitHub
あたりを読めば解決するかもしれません。

特に、Header Search Pathに書くべき値が、

"$(BUILT_PRODUCTS_DIR)/../../Headers"

になっているので気をつけてください。



2, 最初っから0.10.0以降を使ってる
とりあえず、色々BugFixされてるので、submoduleをアップデートしましょう
その上で、ProjectのBuild SettingsとTargetのBuild Settingsの両方に

 "$(BUILT_PRODUCTS_DIR)/../../Headers"

と書いてあるかを確かめてください。両方にないと、RestKitなんて見つからないよって言われます


以上、エラーエントリでした。

せんでん

1タップで写真&動画を共有できるカメラtottepost
カメラのついたiPad/iPhoneで撮った写真や動画を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真&動画を共有できるカメラ - tottepost - ISHITOYA Kentaro

1タップで写真&動画を共有できるカメラ、tottepost1.2リリース

前回のアップデートから日が開きましたが、tottepostのバージョン1.2をリリースしました。

tottepostは写真や動画を撮ったその場で手軽にアップロードするためのカメラアプリです。Facebook/Dropbox/Picasa/Flickr/Twitterなど主要なWebサービスに対応しています。詳しくは、iTunes App Storeをご覧ください。


今回は、
1, 動画撮影
2, 写真と動画の解像度選択
が主な変更点です。


動画に関しては、画面左下にあるスイッチをタップ(スライドしなくても変わります)すると、写真と動画を切り替えることができます。
解像度に関しては、設定画面から変更してください。Photo解像度はそのカメラの最大解像度になります。
動画はHighだとiPhone4、4SおよびiPad3で1080pが、iPod Touch 4thでは720pが撮影できるようです(機種ごとに違うので、設定画面に表示していません…)、が!ファイルサイズが大きくなりすぎるのでMedium(デフォルトです)で撮影されることを推奨します。


なお、LITE版もリリースしました。
LITEでは、解像度選択、アルバム選択ができなくなっています。


というわけで、今後ともtottepostをよろしくお願い致します!


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

ソーシャルゲームの健全化というはなし

「なんでソーシャルゲームってパチンコと同列にされるんですかね」
って、後輩が言う。


「ソーシャルゲームってデジタルコンテンツを売る仕組みじゃないですか。今までのデジタルコンテンツ屋さんができなかった、少額決済でデジタルコンテンツをお金に変える仕組み作ったじゃないですか。すごいことですよ。」



うん。僕もそう思うよ。でも、「ソーシャルゲームとパチンコが同一視されるのは仕方がないよ」とも思う。


DeNAの財務状況GREEの財務状況http://www.cyberagent.co.jp/ir/reference/chg/:CyberAgentの財務状況を見ればこれまでに売り上げが急激な勢いで伸びていて、DeNA、通期売上高134%増の1,127億円。2014年度売上高5,000億円を目指す :ベンチャーニュース:Venture Now(ベンチャーナウ)にもあるように今後もユーザー数、業績ともに一段の伸びが予想されていることは、共通認識としておいていいよね。


どの会社も業績が伸びててユーザー数が増える事が予想されるから、パチンコと同一視されるんだよ。
っていうのは刺さんなかったみたい。後輩は、あんまり納得してない顔をしていた。


なぜ、人は携帯ソーシャルゲームに嫌悪感を持つのか。 | More Access,More Fun!とか、ソーシャルゲームは金を搾取して、運営会社がモラルにかけている場合が多く嫌い - First Loungeとかよく言われてる事だよね。


まぁ、弱者をターゲッティングしてる"と思われてる"から問題になるんだよ。
ってのも刺さんなかったみたい。やっぱり後輩は、あんまり納得してない顔をしていた。


あんまりにもあんまり納得してない顔をされたので、どうやら論理的に伝える事ができていないようだ、と、そこでちょっと立ち止まって考えてみたという話。


そもそも、ソーシャルゲーム批判ってどんなの?

批判記事とか読んでみるといくつか類系があるんじゃないかな。

  • 妬み系
    • 儲かってるからむかつく
    • 働くのは俺たちで儲かるのはあいつらだよ(中の人)
  • 賭博法に抵触する系
    • 射幸心煽り過ぎ
    • 法に抵触するような事を公然とやってるのはどうなの
  • 犯罪の温床系
    • RMTとか
    • 青少年とか、PTAとか
  • 搾取かっこわるい系
    • 情報弱者、社会的弱者から薄く広く集金してる構造が悪い
    • 情報弱者に注意喚起するべきだ
    • ソシャゲーとか頭の悪い奴がやるもんでしょ
    • コンテンツの質が低い
  • ゲーム理解できない系
    • コンテンツの社会的認知度が低い
    • 非生産的
    • ゲーム脳とか
    • 共感できない

みたいな感じ。感じだからミッシーかどうかは気にしないで。

妬みは論外だけど。

まぁ、犯罪の温床、賭博法云々はいいのさ。それはシステムや運用で改善できる問題だから。
グリー株式会社 | ニュースリリース | プレスリリース 2012年 | プラットフォーム事業者6社によるソーシャルゲームの利用環境向上等に関する連絡協議会を設置
がうまく機能すれば自浄作用が働いて業界が健全化するさ。
しなければ、グリー、週刊誌に「摘発検討」と報じられる 「犯罪行為、一切ない」と反論が検討じゃなくて、実際に行政が介入して健全化の方向に持って行くよ。


で、他の批判にどうやって応対するかっていうと、今まではさ、


『「搾取かっこわるい」ってのは、第3者的な批判だよね。搾取されているといわれている人たちは、ゲーム内のその何かにお金を払うだけの価値を感じてるんだから。「ガチャ回してカードとって集めるだけとか、昔のRPGとかに比べてゲームの質が低いのに、そんなものにお金払うとか信じられない」とかいう人は、あなたの思う質の高いゲームについて、俺だってソーシャルゲームなんか作りたくねーよ! とかスクエアエニックスホールディングスの財務ハイライトとかを読んで考えたら良いとおもう。


だいたい、情弱だから社会的弱者だからソーシャルゲームやってるんだとか、大衆は無駄な時間使うもんだとか、そんな批判、無意味。誰がどんなものに価値を感じようとも問題ないでしょ。自分の金払って、楽しんで何が悪い訳?


だれか、パチンコをやっている奴は馬鹿だ、ギャンブルやっている奴は馬鹿だ。パチンコもギャンブルも社会的価値が低くて非生産的で、無駄な行為だ。って考えているひとに、ソーシャルゲームをパチンコやギャンブルと同列に扱うんじゃねぇ!って伝えて納得してもらう方法を、ぼくに伝授してくれさい。


多分、無理だよね。価値観が違うから。


分かってもらう必要なんかないよ。本人たちは楽しんでお金払ってるんだから、気にしなくて良いよ。価値観の違う人は、頭が固いし、ムリだって。


価値観は多様。多様な価値観は許容しなきゃいけないよね!*1


みたいな、価値観多様、分かんないなら分かんなくていいよでなんとかなってたわけっすよ。

で、最初に戻るわけ

世界で10億ユーザー目指して、ゲームで世界を幸せにしようぜ!っていってるわけじゃん。ソーシャルゲームが一般化しようとすればするほど、あるユーザーが感じている価値がみんなに理解できるようにならなきゃいけないんだよ。


「ガチャ回してカード集めてコンプリートする」っていう行為に対して10万円払うことが、「ぼくはそれに10万円払わないけれど、きみがそれにお金を払うことは理解できる」っていう程度に理解できるようにならないといけない。「ぼくはクルマに20万円かけてアルミホイール買う事はしないけれど、きみがアルミホイールを買う事は理解できる」程度に。


そうでなければ、いつまで経ってもパチンコと同じ。なんだか、怪しげで、無価値で、分かる人にしか分からないのに、金だけもうけてて。健全じゃねぇ!みたいな非難を甘んじて受けて行かなければならないよね。そういう意味で、ソーシャルゲーム業界に就職する人たちは、どことなくお金と引き換えにみたいな感じなんでしょ。


だから、健全化っていうのは、警察のお世話にならないように、犯罪を助長しないようにするってことと、ソーシャルゲームに対するイメージを良い方向に変えるってことの2軸になるんだとおもう。

ま、そういうわけだからして

南場智子氏の講演内容のsho_yokoi氏によるまとめ - Togetterで南場さんがいってる、

南場氏「DeNAで成し遂げたい事を三つ挙げたい。1つ目。social gameは悪者扱いされがちだが、これを→entertainment→culture、あるいは、→edutainment→education、あるいは、→ramificationとしていきたい」

って日本語でOKな言葉は、ゲームが文化として受け入れられなければ、モバイル50億の端末をターゲットにしたプラットフォームで世界一を目指す事なんてできないってことだよね、ってことで。


もうさ、二郎とかゲームじゃん。スーパーのスタンプもゲームだし、山崎パンの白い皿だってゲームだよね。そういうのお店の人がゲーム化できるプラットホーム作ればいいんじゃない?おばちゃんも500円券もらえるなら文句いわないよ。


あるいは、ゲーム内のカードが現実世界で使えるとかすればいいんじゃない?クーポンとかつまんないじゃん。敵と戦って手に入るのがネイルサロンの2000円引きクーポンなら、自称セレブも文句いわないよ。ガチャ回して手に入るのカードがゴルフ場で1ラウンド!なクーポンとして使えるならおっさんも文句いわないんじゃね。ゲームとの親和性が問題か。


まぁ,ソーシャルゲーム自体を理解してもらうってよりもページが見つかりません - MSN産経ニュースみたいな、野球界に寄付して知名度と信用を勝ち取るというコーポレイトハックてきなことでどうにかしてかなきゃいけないんだよね。


立ち止まって、考えただけで、まとまってなくて申し訳ありません。もう、眠くて面倒くさいので、書きっぱなしでいきます…。


せんでん

1タップで写真共有tottepost
カメラのついたiPad/iPhoneで撮った写真を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

*1:ぼくは、「多様な価値観」って言葉で物事を済ませる事を、ただの無関心だと思っています

最新iOSデバイス(iPhone4S, iPad2/3, iPod Touch 4th)の写真/動画解像度

tottepostの実装で撮る写真や動画の解像度を指定できるようにしたいと思ったんですが、AVCaptureMovieFileOutputやAVCaptureStillImageOutputを使う場合、AVCaptureSessionのsessionPresetプロパティにAVCaptureSessionPresetPhotoのような定数をセットする仕組みで、幅とか高さを指定するもんじゃないんですね。


で、設定画面に「Photo(2592x1936)」とか出したいじゃないですか。AVCaptureSessionから実行時に取得できないもんかなーと思って探したんですがたどり着かず、静的なデータで一覧になってないかなーと思って探しても、iPhone4やそれ以前のデータはAVFoundation Media Captureという公式のドキュメントやというサイトに載っているんですが、iPhone4S、iPad2/3*1iPod touch 4thのカメラの解像度が見つからなくて困っていました。


というわけで手作業で調べた結果をリストにします。幅的な都合で3Gは割愛します。
3GS/4/4SはiPhoneです。P2/P3はiPadです。T4はTouchです。

写真解像度

Preset 3GS(B) 4(B) 4S(B) P2(B) P3(B) T4(B)
Photo 2048x1536 2592x1936 3264x2448 960x720 2592x1936 960x720
High 640x480 1280x720 1920x1080 1280x720 1920x1080 1280x720
Medium 480x360 480x360 640x480 640x480 640x480 640x480
Low 192x144 192x144 640x480 640x480 640x480 640x480

Low/Mediumの4S/P2/P3/T4に自信がありません、なんか値が変わらない...。しかし、iPad2のカメラしょぼすぎる...。


動画解像度

Preset 3GS(B) 4(B) 4S(B) P2(B) P3(B) T4(B)
High 640x480 1280x720 1920x1080 1280x720 1920x1080 1280x720
Medium 480x360 480x360 480x360 480x360 480x360 480x360
Low 192x144 192x144 192x144 192x144 192x144 192x144


バックカメラの解像度のみです。
動画の場合はMediamとLowは基本同じです。iPhone4、iPad2とTouch4thは720pで、4SとiPad3は1080pのようですね。


AVFoundationのsessionPresetにこれらの値をセットする事で解像度を変える事ができます。

session_ = [[AVCaptureSession alloc] init];
[session_ beginConfiguration];
session_.sessionPreset = AVCaptureSessionPresetPhoto;
[session_ commitConfiguration];

みたいな感じですね。


以上メモでした。

せんでん

1タップで写真共有tottepost
カメラのついたiPad/iPhoneで撮った写真を、その場でFacebook/Mixi/DropboxなどのサービスにアップロードできるtottepostというiOSアプリを開発しています!詳しくは、iTunes App Storeをご覧ください。


ご購入はこちら!
1タップで写真共有 - tottepost - ISHITOYA Kentaro

*1:あえて3と呼びます

tottepost1.1.1リリース!iPad2以降でも使えます。

tottepost1.1.1がReady for Saleになりました!
今回は基本的にバグフィックスです。tottepostの詳細については1.0のリリースをご覧ください。

  • iPad2以降のサポートを追加。
  • 自動補正機能を追加
  • 進行中のアップロードの個数がおかしくなる問題を修正
  • Twitterで140文字以上入力してアップロードに失敗する問題を修正
  • TwitterでGPSをONにしても場所情報が埋め込まれない問題を修正
  • Fotolifeでログインがうまくできない事がある問題を修正
  • 選択中のアルバムを示すチェックマークの描画がおかしい問題を修正
  • MinusとMixiでアルバムを選択していないとアップロードできない問題に対処

1タップで写真共有 - tottepost - ISHITOYA Kentaro


アップデート直後にアップデート前にログインしたサービスが使えなくなる場合がありますので、その場合はログアウトしてから再度ログインしてください。


自動補正とか付けてみましたが、あまり補正されない気がします...

問題があればフィードバック、このエントリへのコメント、FacebookTwitterなどでご連絡ください!

GithubのIssues


ちなみに、次のリリースでは動画が扱えるようになります!