2013/10/31

[Python][Google App Engine]Imageの横幅と高さの取得

どうやら、Google App Engineでは、画像の高さと幅を取得できるようだ。

from google.appengine.api import images
#imgはdb.BlobProperty()
img
imgObj = images.Image(img)
w = imgObj.width
h = imgObj.width
最初、取得できないと勝手に決め込んでいたのですが、サーバーサイドで取得できることがわかったので、色々な局面で使えるのかなと。

2013/10/30

[iOS][Objective-C]UIImageを左右反転させる

前回、フロントカメラとリアカメラを切り替える処理を書きました。

で、実際、そこからUIImageを取得することができるもののリアカメラだと左右反対になってしまい、ちょっと気持ち悪いので、UIImageをY軸でミラー反転のプログラムを参考にして実装したら見事に左右反転することができました。

プログラムは下のような感じ。

//変換対象となるUIImage
UIImage *img;
CGImageRef imgRef = [img CGImage];

UIGraphicsBeginImageContext(img.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM( context, img.size.width,img.size.height);
CGContextScaleCTM( context, -1.0, -1.0);
CGContextDrawImage( context, CGRectMake( 0, 0,img.size.width, img.size.height), imgRef);
UIImage *retImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
これリアカメラを実装する上でめちゃくちゃ役に立つのでこうしてまとめておけばコピペですんで便利かなと。

2013/10/29

[Love Nail]カタログ無料カテゴリ25位になりました

 photo lovenail_25_zps62108203.png
おかげさまでカタログカテゴリーの無料で25位をいただきました!!

開発が追いついていない状況ですが引き続き改善を行っていきたいと思いますので、応援よろしく御願い致します。

ダウンロードは、app storeから無料でできますよ。

2013/10/28

[Love Nail]カタログ無料カテゴリ30位になりました

 photo lovenail_30_zpsf2f1280a.png
おかげさまでカタログカテゴリーの無料で30位をいただきました!!

皆様に応援していただいているんだなと思い、現状に満足することなく、ひたすら改良を加えていきます。

ダウンロードは、app storeから無料でできますよ。

2013/10/27

[Love Nail]カタログカテゴリの人気作品に掲載

 photo whatishot_zpscc6e920f.png
なんと、Love Nailが、カタログカテゴリの人気作品に掲載されましたー。

応援ありがとうございます!!

ダウンロードは、app storeから無料です。

ネイルにご興味のある方は、是非。

2013/10/26

[iOS][Objective-C]フロントカメラとリアカメラを切り替える

iOSでよく見られるボタンを押して、リアカメラとフロントカメラを切り替える処理は、下のように書けばおk

/*--------------------------------------------------
AVCaptureSession *session;
AVCaptureDeviceInput *frontFacingCameraDeviceInput;
AVCaptureDeviceInput *backFacingCameraDeviceInput;
----------------------------------------------------*/
-(void)changeDevice{


    [session beginConfiguration];
    //初回設定
    if([session.inputs count] == 0){
        [session addInput:backFacingCameraDeviceInput];
    //2回目以降
    }else{

        AVCaptureDeviceInput *deviceInput = (AVCaptureDeviceInput *)[session.inputs objectAtIndex:0];
        AVCaptureDevice *device = deviceInput.device;
        AVCaptureDeviceInput *nextDeviceInput;
        if (device.position == AVCaptureDevicePositionBack) {
            nextDeviceInput = frontFacingCameraDeviceInput;
        }else{
            nextDeviceInput = backFacingCameraDeviceInput;
        }
        [session removeInput:deviceInput];
        [session addInput:nextDeviceInput];

    }
    [session commitConfiguration];
}

-(void)setCameraDeviceInput{
    NSArray *devices = [AVCaptureDevice devices];
    for (AVCaptureDevice *device in devices) {
        if ([device hasMediaType:AVMediaTypeVideo]) {
            NSError *error = nil;
            if (device.position == AVCaptureDevicePositionBack) {
                backFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
            }else{
                frontFacingCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
            }
        }
    }
}
setCameraDeviceInputメソッドでAVCaptureDeviceInputクラスのfrontFacingCameraDeviceInput変数とbackFacingCameraDeviceInput変数を初期化して、実際の、切り替えは、changeDeviceメソッドが担当しています。

こうしてまとめておけば、次回以降、コピペで済むので便利かなと。

2013/10/25

[Love Nail]iPhone Plus by 週刊アスキーにLove Nailを掲載

 photo iPhone_weekly_ascii_zps0aac2bd2.png
週刊アスキーさんがプロデュースしているiPhone Plusというサイトがあるのですが、個人開発者に向けてアプリを紹介していただけるコンテンツがあり、そちらの掲載許諾をいただき、無事に、記事が反映されました。
 photo iphone_weekly_ascii_lovenail_zpsd9c09f01.png
asciiさんのご協力もいただき素敵な記事を書くことができました。

詳細は、iPhone Plusに掲載した記事を見ていただくことにして、是非、これを機会に、ネイルにご興味のある方は、ダウンロードは無料なので、お試しください。

2013/10/23

[Python][Google App Engine][Instagram]ユーザーの最新投稿を取得する

Instagramのユーザーがアップした写真や動画を取得するにはどうすればいいのだろうか?

下のように問い合わせたらいけた。

from google.appengine.api import urlfetch
#useridは、ユーザーID
useid = ""
#accesstokenは、認証で取得したtoken
accesstoken = ""
#countは、取得件数
count = 10
url = "https://api.instagram.com/v1/users/%s/media/recent/?access_token=%s&count=%s" % (userid,accesstoken,count)
result = urlfetch.fetch(url)
取得できたかどうかの判定は、前回書いたREST APIの構造についてにそって、Pythonコードをかけばおk

次回以降の問い合わせは、next_urlで取得しにいけばいいから便利です。

2013/10/22

[Google]Mobile Backend Starter for iOS

 photo MobileBackendStarter_zps432b1ab0.png
こんなツールが存在していたとは。

インターネット大手のGoogleが、「Google Cloud Platform」上で作業を行う「iOS」開発者向けのツールセットを強化し、iOS向けに最適化された「Mobile Backend Starter」をリリースした。

via:グーグル、「Mobile Backend Starter」の「iOS」版をリリース
どうやら、google app engine上で設計されており、サーバーサイドコードを書かなくてもいいようなのだが、本当に書かなくて大丈夫なのだろうか?

DB設計とか、queryとかマジで大丈夫なのかと思ってしまう。

昨今、サーバーサイドを書かなくてもサービスinできるというサービスがでているが、実用に耐えられるか不安になってしまう。

食わず嫌いせずに、とりあえず使ってみるのがベストなのだろうか?

2013/10/21

[ゲーム]ファイナルファンタジー6がiOSに

すっげー。

ドラゴンクエスト1〜8がスマートフォンに移植されるというニュースがあったばかりですが、スクウェア・エニックスの公式Facebookアカウントからファイナルファンタジー6のiOS版とAndroid版が今年の冬に登場することが発表されました!

via:懐かしい! FF6のスマホ版は今冬リリース、FF7のスマホ版は数年後に登場か
7も技術的にはできるそうなのですが、容量が多すぎてiOSのダウンロードできるサイズを超えてしまうそうです。

上のエントリーでも書いてありましたが、クオリティーは下げずに、何個かに分割してリリースしてくれないかなー。
FINAL FANTASY VII ADVENT CHILDREN COMPLETE 【通常版】 [Blu-ray]
FINAL FANTASY VII ADVENT CHILDREN COMPLETE 【通常版】 [Blu-ray]
ソニー・ピクチャーズエンタテインメント

2013/10/20

[JavaScript][Require.js]waitSecondsパラメータ

Require.jsを使ってプログラムを作ると回線速度が遅い場合、ライブラリがロードされない時があります。

そんなときは、waitSecondsを指定すれば、その分だけライブラリのロードを待つことができるようになります。

requirejs.config({
  waitSeconds:10
});
ちなみに、0にすると永久に待ってくれるようです。

タイムエラーをする場合は、これを使えば回避することができるかもしれません。

2013/10/19

[iOS][Objective-C]カメラのデバイス判定を行う

iOS4または、iPhone4からフロントカメラが内蔵され、当然、Objective-Cからもアクセスできるのだが、iPhone3GSは、iOS4にアップデートすることでできるため、フロントカメラにアクセスすることができない。(そもそもないから)

よって、プログラムからアクセスできるかどうか判定するわけだが、その方法は、UIImagePickerControllerのisCameraDeviceAvailableクラスメソッドを使って、以下のようにすればよい。

//リアカメラにアクセスできる場合
if([UIImagePickerController isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceRear]){

}

//フロントカメラにアクセスできる場合
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){

}
こうしてまとめておくと後で参照しやすいので便利かなと。

2013/10/18

[ChromeBook]AcerからもChromebookC720がリリースへ

Acerもかー。

しかし今度出た249ドルのAcer C720は、SDカードリーダー、USB 3.0 のポート、ビデオチャット用にHDのフロントカメラなどがある。

via:AcerもChromebookの新型機を出す–徐々に機能充実へ
記事では予約開始と書いてあるが、chromebookのサイトにいくと「Buy now」とあるので、もう購入できるかも。
 photo AcerC720Chromebook_zpsf194e63b.png
それ以前に日本からでも購入できるのかなー。

結構、chromebookは注目しているのだが。

2013/10/17

[Instagram]REST APIの構造について

InstagramのREST APIを読みながら構造について調査

{
    "meta": {
        "code": 200
    },
    "data": {
        ...
    },
    "pagination": {
        "next_url": "...",
        "next_max_id": "13872296"
    }
}
まず、問い合わせを行って正常終了したかどうかを確認すには、metaキーのcodeを見ればおk。

200であることを確認した上で、dataキーの中をチェック。

paginationキーは、次の問い合わせができるかどうかの確認用に使うのだが、ない場合は、next_urlキーが存在しないので、注意が必要。

2013/10/16

[Game][iOS]ドラクエシリーズもiOS版登場

なぬ。

スクウェア・エニックスは10月8日、「ドラゴンクエスト」シリーズをスマートフォン・タブレット向けに展開すると発表した。

via:ドラクエI~VIIIがスマホにやってくる! 今冬から展開
6まではファミコンないしスーパーファミコンだったので、移植できるだろうなーっとは、思うのだが、7、8もリリースされるってすごいなー。

7は、プレストと同じ内容なのか、すごく気になる。
ドラゴンクエストVII エデンの戦士たち
ドラゴンクエストVII エデンの戦士たち
スクウェア・エニックス
8は、プレステ2だったので、完全にコピーは無理だろうなー、どうなんだろー。
アルティメット ヒッツ ドラゴンクエストVIII 空と海と大地と呪われし姫君
アルティメット ヒッツ ドラゴンクエストVIII 空と海と大地と呪われし姫君
スクウェア・エニックス

2013/10/15

[Game]DIABLO3のリリース日と値段が決定

前回、スクエニからDIABLO IIIがリリースされることを書きましたが、リリース日と値段が決まった模様。

スクウェア・エニックスは、同社の海外ゲームタイトル専門レーベル「SQUARE ENIX EXTREME EDGES」の新作である、PS3用ソフト「DIABLO III(ディアブロ III)」の日本語版を、2014年1月30日に発売することを発表した。価格は7980円。

via:スクエニ、PS3用日本語版「DIABLO III」を1月30日に発売
相変わらずPS3は持ってないけど、ソフトだけ買っちゃおうかなー。
ディアブロIII初回生産特典 追加DLC4種同梱(地獄の兜、天使の翼、瓶詰めされた雲の染料、瓶詰めされた煙の染料)
ディアブロIII初回生産特典 追加DLC4種同梱(地獄の兜、天使の翼、瓶詰めされた雲の染料、瓶詰めされた煙の染料)
スクウェア・エニックス


2013/10/14

Love nail version3.1をリリース

 photo update_lovenail_zpsaed1d221.jpg
先週、appleに提出しました最新バージョン3.1の審査が通りましたので、ここでは、最新機能の紹介をしたいと思います。

  • 自分がアップしたネイル写真にコメントがついた場合に、Activityページに誰がコメントを残したのか、わかるようになりました。
  • プロフィール編集が行えるようになりました。現在は、国とプロフィール画像の変更だけ行うことができます。
  • 友達招待機能の各メニューを日本語にしました。
  • 友達招待に、アドレス帳のお友達とLINEのお友達を招待できるようになりました。
  • iPhone4以降のお使いの方は、ネイル写真投稿時に高画質の写真をアップできるようにしました。

今後とも、月1でバージョンアップを行っていきたいと考えておりますので、引き続きLove Nailの応援よろしく御願い致します。

ダウンロードは、app storeから無料でできますよ。

2013/10/13

[Google]iOS版のGoogle+ Localが終了していた件

昨日に引き続き終了ネタ

iOS向け「Google+ Local」が8月に打ち切られる。

 Googleは、Google+ LocalのiOS版アプリを現在利用しているユーザーに電子メールを送り、同サービスが米国時間2013年8月7日から利用できなくなると通知した。最近になってGoogle+ Localの機能がiOS版「Google Maps」アプリに統合されたことを考えると、それほどの驚きはない。

via:iOS向け「Google+ Local」、8月にサービス打ち切り
これを読むと、Google Mapsに統合されると書いてあるので、終了というわけではなさそうだ。

確かに、アプリを乱発されるよりも、一個のアプリを充実させてほしいなーっとは思うが。

2013/10/12

[Google]Google Latitudeが終了していた件

え、いつの間に。。。

Googleの位置情報サービス「Google Latitude」が、2013年8月9日で終了することが明らかになっています。

via:Googleの位置情報サービス「Google Latitude」終了へ
確か、昔、このAPIも公開されていて、なにかおもしろもの作れるかなーっと模索していたのですが、いつの間にか終了していたんですねー。

やっぱり、Googleといえども、ヒットサービスを生み出すのって大変なんだなっと。

2013/10/11

[Objective-C][iOS]UIWebViewのstringByEvaluatingJavaScriptFromStringについて一言

UIWebViewのstringByEvaluatingJavaScriptFromStringでJavaScriptの関数を実行する場合、return値をString型で返さないとNSStringに返却値が格納されないようだ。

例として以下のプログラムをあげる。

function hoge(){
  var j ={};
  return j;
}
上のJSは単純にJSONを返してくれる関数であり、これを実行するObjective-Cを下のように実装してみる。
UIWebView *webView;
NSString *ret = [webView stringByEvaluatingJavaScriptFromString:@"hoge();"];
で、結果として、retには何も設定されていない。

この場合、どうするのかというと、JSON.stringifyを使ってString型にする。
function hoge(){
  var j ={};
  return JSON.stringify(j);}
そんでもって、下のようにNSStringを一度、NSDataにした上でJSONをパースすればおk
UIWebView *webView;
NSString *ret = [webView stringByEvaluatingJavaScriptFromString:@"hoge();"];
NSData *retData = [ret dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:retData options:NSJSONReadingMutableContainers error:nil];
実際に使えるNSDictionaryにするまでに道のりが長くてちょっとめんどいです。

2013/10/10

[Python][Google App Engine]Jinja2を使う

どうやら、新しいGoogle App EngineではJinja2テンプレートが標準でついているようなので、ちょっと試しに使ってみる。

各ファイルの設定方法は下記の通り

app.yaml

libraries:
- name: jinja2
  version: latest
hoge.py(実行ファイル)
import os
import jinja2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True
)

class Hoge(webapp2.RequestHandler):
  def get(self):
    template_values = {
      'test':'this is JINJA'
    }
    template = JINJA_ENVIRONMENT.get_template('index.html')
    self.response.write(template.render(template_values))
index.html(テンプレート元になるファイル)
<!DOCTYPE html>
{% autoescape true %}
<html>
  <body>
    {{ test }}
  </body>
</html>
{% endautoescape %}
queryをループする処理はまだ必要なかったので調べなかったのですが、変数を埋め込むだけだったら、これだけでいけそうです。

2013/10/09

[JavaScript][Zepto]関数の設定について

Zepto.jsを使って関数を設定したい場合は、どうすればいいのだろうか?

下のように実装すれば問題ないようだ。

Zepto(function($){
  $.fn.hoge = function(){
    alert("bar");
    return;

  };

  $().hoge();
  $([]).hoge();
});

2013/10/08

[Google App Engine]datastoreのindexを削除する方法

datastoreのkindが増えてくるとどうしても不要なindexもそれと同時に増殖してしまう。

というわけで、いらなくなったindexを削除する方法を調査しました。

Deleting unused indexesを読むと、ターミナルで、以下のコマンドを叩けばいいことがわかる。

appcfg.py vacuum_indexes 削除したいアプリのディレクトリ
実際に、上のコマンドを打ったらうまくいきました!!

これで削除するときも困りませんね。

2013/10/07

[mac os x]Mountain Lionにバージョンアップ

最新のXcodeを使いたかったので、去年、購入したmacbook airにMountain Lionをインストールしました。

Xcodeをバージョン5にアップしたのですが、劇的にUIが変更されており、また使い方に慣れるまで時間がかかりそうです。

2013/10/06

[jQuery]onメソッドのselectorについて

これは、便利

<script>
jQuery(function($){
  $("#hoge").on("click","#bar",function(e){
    console.log("dddd")
  });
});
</script>
<div id="hoge" style="width:1000px;height:1000px;border:1px solid red;">
  <div style="width:100px;height:100px;border:1px solid blue;">hoge1</div>
  <div style="width:100px;height:100px;border:1px solid yellow;" id="bar">hoge2</div>
  <div style="width:100px;height:100px;border:1px solid grey;">hoge3</div>
</div>
この場合、id="bar"だけクリックするとイベントがトリガーされる。

なんでかというと、onメソッドで子要素として指定しているから。

動的にDOMを追加したときに、それに対してイベントバインドさせたいときなんかに、これは使えるかも。

2013/10/05

[iOS][Objective-C]UIWebViewでリダイレクトURLを検出する

UIWebViewを使ってURLをリクエストするときに、リダイレクトが発生した場合、そのURLを突き止めることができるのだろうか?

結果的にいうと、Yesのようである。

iOSアプリにおけるOAuth連携の実装を読むと、下のようにすると取得できることがわかる。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

    NSLog(@"web view string 's  is %@",request.URL.absoluteString);
    return YES;
}
ここで、はまってしまったのは、webViewクラスからでは取得できないということ。

これでOauth2.0を使ったログインも実装できるかなと。

2013/10/04

[Google]Google Shopping Expressがスタート

これ、日本でも開始してくれないかなー。

米Googleは9月25日(現地時間)、3月から試行していたオンラインショッピング商品の当日配送サービス「Google Shopping Express」を米国の一部の地域で正式スタートしたと発表した。まずは、カリフォルニア州サンフランシスコとサンノゼを対象地域とする。半年間は送料無料。

via:Google、日用雑貨の当日配送サービスを正式スタート モバイルアプリも公開
amazonとどう差別化するのだろうか?

ってか、これをスタートするgoogleのメリットって。

いずれにしろ、日本でも展開してほしい。

2013/10/03

[Python]タプル作成時の注意点

ってきり下のようにすればタプルができると思っていた。

hoge = ("foo")
冷静になって考えればわかるのだが、これはタプルではなく、たんなる括弧のついた文字列になってしまう。

というわけで、1つしか要素がない場合に、タプルを作る場合は、タプルオブジェクトを参考にすると下のようにすればいいことがわかる。
hoge = ("foo",)
今後、1要素しかない、タプルを作る場合は気をつけたい。

2013/10/02

[Love Nail]Facebook App Centerの審査が通りました

 photo facebookappcenter_zps6a1fad99.png

約1ヶ月ほど前のことですが、Facebook App Centerのアプリ掲載申請を提出し、見事、審査に通りました。
 photo lovenailfacebookappcenter_zpsf9ed4aff.png
app storeにアプリ配信する際には、審査を必ず実施しなければいけないのですが、Facebookの場合は、任意で申請することができます。

ただFacebookにもきちんと審査に承認していただくことで、両方から承認が通ることにより、お客様に対する安心感が増すことを考え、今回、実施いたしました。
無事に今回、審査が通りましたので、安心してお使いいただくことができます。

今後とも、Love Nailをよろしく御願い致します。

Love Nailはapp storeから無料で。