どうやら、Google App Engineでは、画像の高さと幅を取得できるようだ。
from google.appengine.api import images #imgはdb.BlobProperty() img imgObj = images.Image(img) w = imgObj.width h = imgObj.width最初、取得できないと勝手に決め込んでいたのですが、サーバーサイドで取得できることがわかったので、色々な局面で使えるのかなと。
常にテンパってます。
どうやら、Google App Engineでは、画像の高さと幅を取得できるようだ。
from google.appengine.api import images #imgはdb.BlobProperty() img imgObj = images.Image(img) w = imgObj.width h = imgObj.width最初、取得できないと勝手に決め込んでいたのですが、サーバーサイドで取得できることがわかったので、色々な局面で使えるのかなと。
前回、フロントカメラとリアカメラを切り替える処理を書きました。
で、実際、そこから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();これリアカメラを実装する上でめちゃくちゃ役に立つのでこうしてまとめておけばコピペですんで便利かなと。
おかげさまでカタログカテゴリーの無料で25位をいただきました!!
開発が追いついていない状況ですが引き続き改善を行っていきたいと思いますので、応援よろしく御願い致します。
ダウンロードは、app storeから無料でできますよ。
おかげさまでカタログカテゴリーの無料で30位をいただきました!!
皆様に応援していただいているんだなと思い、現状に満足することなく、ひたすら改良を加えていきます。
ダウンロードは、app storeから無料でできますよ。
なんと、Love Nailが、カタログカテゴリの人気作品に掲載されましたー。
応援ありがとうございます!!
ダウンロードは、app storeから無料です。
ネイルにご興味のある方は、是非。
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メソッドが担当しています。
週刊アスキーさんがプロデュースしているiPhone Plusというサイトがあるのですが、個人開発者に向けてアプリを紹介していただけるコンテンツがあり、そちらの掲載許諾をいただき、無事に、記事が反映されました。
asciiさんのご協力もいただき素敵な記事を書くことができました。
詳細は、iPhone Plusに掲載した記事を見ていただくことにして、是非、これを機会に、ネイルにご興味のある方は、ダウンロードは無料なので、お試しください。
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
こんなツールが存在していたとは。
どうやら、google app engine上で設計されており、サーバーサイドコードを書かなくてもいいようなのだが、本当に書かなくて大丈夫なのだろうか?インターネット大手のGoogleが、「Google Cloud Platform」上で作業を行う「iOS」開発者向けのツールセットを強化し、iOS向けに最適化された「Mobile Backend Starter」をリリースした。
via:グーグル、「Mobile Backend Starter」の「iOS」版をリリース
すっげー。
7も技術的にはできるそうなのですが、容量が多すぎてiOSのダウンロードできるサイズを超えてしまうそうです。ドラゴンクエスト1〜8がスマートフォンに移植されるというニュースがあったばかりですが、スクウェア・エニックスの公式Facebookアカウントからファイナルファンタジー6のiOS版とAndroid版が今年の冬に登場することが発表されました!
via:懐かしい! FF6のスマホ版は今冬リリース、FF7のスマホ版は数年後に登場か
Require.jsを使ってプログラムを作ると回線速度が遅い場合、ライブラリがロードされない時があります。
そんなときは、waitSecondsを指定すれば、その分だけライブラリのロードを待つことができるようになります。
requirejs.config({ waitSeconds:10 });ちなみに、0にすると永久に待ってくれるようです。
iOS4または、iPhone4からフロントカメラが内蔵され、当然、Objective-Cからもアクセスできるのだが、iPhone3GSは、iOS4にアップデートすることでできるため、フロントカメラにアクセスすることができない。(そもそもないから)
よって、プログラムからアクセスできるかどうか判定するわけだが、その方法は、UIImagePickerControllerのisCameraDeviceAvailableクラスメソッドを使って、以下のようにすればよい。
//リアカメラにアクセスできる場合 if([UIImagePickerController isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceRear]){ } //フロントカメラにアクセスできる場合 if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){ }こうしてまとめておくと後で参照しやすいので便利かなと。
Acerもかー。
記事では予約開始と書いてあるが、chromebookのサイトにいくと「Buy now」とあるので、もう購入できるかも。しかし今度出た249ドルのAcer C720は、SDカードリーダー、USB 3.0 のポート、ビデオチャット用にHDのフロントカメラなどがある。
via:AcerもChromebookの新型機を出す–徐々に機能充実へ
InstagramのREST APIを読みながら構造について調査
{ "meta": { "code": 200 }, "data": { ... }, "pagination": { "next_url": "...", "next_max_id": "13872296" } }まず、問い合わせを行って正常終了したかどうかを確認すには、metaキーのcodeを見ればおk。
なぬ。
6まではファミコンないしスーパーファミコンだったので、移植できるだろうなーっとは、思うのだが、7、8もリリースされるってすごいなー。スクウェア・エニックスは10月8日、「ドラゴンクエスト」シリーズをスマートフォン・タブレット向けに展開すると発表した。
via:ドラクエI~VIIIがスマホにやってくる! 今冬から展開
前回、スクエニからDIABLO IIIがリリースされることを書きましたが、リリース日と値段が決まった模様。
相変わらずPS3は持ってないけど、ソフトだけ買っちゃおうかなー。スクウェア・エニックスは、同社の海外ゲームタイトル専門レーベル「SQUARE ENIX EXTREME EDGES」の新作である、PS3用ソフト「DIABLO III(ディアブロ III)」の日本語版を、2014年1月30日に発売することを発表した。価格は7980円。
via:スクエニ、PS3用日本語版「DIABLO III」を1月30日に発売
先週、appleに提出しました最新バージョン3.1の審査が通りましたので、ここでは、最新機能の紹介をしたいと思います。
昨日に引き続き終了ネタ
これを読むと、Google Mapsに統合されると書いてあるので、終了というわけではなさそうだ。iOS向け「Google+ Local」が8月に打ち切られる。
via:iOS向け「Google+ Local」、8月にサービス打ち切り
Googleは、Google+ LocalのiOS版アプリを現在利用しているユーザーに電子メールを送り、同サービスが米国時間2013年8月7日から利用できなくなると通知した。最近になってGoogle+ Localの機能がiOS版「Google Maps」アプリに統合されたことを考えると、それほどの驚きはない。
え、いつの間に。。。
確か、昔、このAPIも公開されていて、なにかおもしろもの作れるかなーっと模索していたのですが、いつの間にか終了していたんですねー。Googleの位置情報サービス「Google Latitude」が、2013年8月9日で終了することが明らかになっています。
via:Googleの位置情報サービス「Google Latitude」終了へ
UIWebViewのstringByEvaluatingJavaScriptFromStringでJavaScriptの関数を実行する場合、return値をString型で返さないとNSStringに返却値が格納されないようだ。
例として以下のプログラムをあげる。
function hoge(){ var j ={}; return j; }上のJSは単純にJSONを返してくれる関数であり、これを実行するObjective-Cを下のように実装してみる。
UIWebView *webView; NSString *ret = [webView stringByEvaluatingJavaScriptFromString:@"hoge();"];で、結果として、retには何も設定されていない。
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にするまでに道のりが長くてちょっとめんどいです。
どうやら、新しいGoogle App EngineではJinja2テンプレートが標準でついているようなので、ちょっと試しに使ってみる。
各ファイルの設定方法は下記の通り
app.yaml
libraries: - name: jinja2 version: latesthoge.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をループする処理はまだ必要なかったので調べなかったのですが、変数を埋め込むだけだったら、これだけでいけそうです。
Zepto.jsを使って関数を設定したい場合は、どうすればいいのだろうか?
下のように実装すれば問題ないようだ。
Zepto(function($){ $.fn.hoge = function(){ alert("bar"); return; }; $().hoge(); $([]).hoge(); });
datastoreのkindが増えてくるとどうしても不要なindexもそれと同時に増殖してしまう。
というわけで、いらなくなったindexを削除する方法を調査しました。
Deleting unused indexesを読むと、ターミナルで、以下のコマンドを叩けばいいことがわかる。
appcfg.py vacuum_indexes 削除したいアプリのディレクトリ実際に、上のコマンドを打ったらうまくいきました!!
最新のXcodeを使いたかったので、去年、購入したmacbook airにMountain Lionをインストールしました。
Xcodeをバージョン5にアップしたのですが、劇的にUIが変更されており、また使い方に慣れるまで時間がかかりそうです。
これは、便利
<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"だけクリックするとイベントがトリガーされる。
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クラスからでは取得できないということ。
これ、日本でも開始してくれないかなー。
amazonとどう差別化するのだろうか?米Googleは9月25日(現地時間)、3月から試行していたオンラインショッピング商品の当日配送サービス「Google Shopping Express」を米国の一部の地域で正式スタートしたと発表した。まずは、カリフォルニア州サンフランシスコとサンノゼを対象地域とする。半年間は送料無料。
via:Google、日用雑貨の当日配送サービスを正式スタート モバイルアプリも公開
ってきり下のようにすればタプルができると思っていた。
hoge = ("foo")冷静になって考えればわかるのだが、これはタプルではなく、たんなる括弧のついた文字列になってしまう。
hoge = ("foo",)今後、1要素しかない、タプルを作る場合は気をつけたい。
約1ヶ月ほど前のことですが、Facebook App Centerのアプリ掲載申請を提出し、見事、審査に通りました。
app storeにアプリ配信する際には、審査を必ず実施しなければいけないのですが、Facebookの場合は、任意で申請することができます。
ただFacebookにもきちんと審査に承認していただくことで、両方から承認が通ることにより、お客様に対する安心感が増すことを考え、今回、実施いたしました。
無事に今回、審査が通りましたので、安心してお使いいただくことができます。
今後とも、Love Nailをよろしく御願い致します。
Love Nailはapp storeから無料で。