TS-112

MacのHDDを写真データが圧迫するのと、今まで使ってたNASが壊れてしまったので、QnapのTS-112を購入しました。QNAP TurboNAS TS-112

とりあえず、組み立てて、iPhotoライブラリとiTunesライブラリをコピー。
今回のNAS購入を機にAperture3を導入。

さて、ApertureライブラリをQnap上に構築しようとしたら、ファイルフォーマットが対応しておりませんと表示!

QnapはデフォルトではEXT4、Aperture3はHFS+にしか対応してないのかな???NASに対応してないとは書いてないし…もしかして、フォーマットしなおし?

とほほ…

QnapはそもそもEXT4ファイルフォーマットから取り扱ってないらしい…。USBで接続される外部デバイスをHFS+にフォーマットして使うとか。リサーチが足りなかったな…
MacBookからNASで接続してどこでも写真加工をワイヤレスでやりたかったんだけどな。

Aperture3がHFS+しか対応してないってのももっと大きく書いてくれ!
http://support.apple.com/kb/TS3252?viewlocale=ja_JP

ImageViewをリサイズして角丸にする。

UITableViewに表示する画像をTwitterアプリのユーザーアイコンみたいにするためのTips
まずは画像のサイズ変換。

UIImage *img = [[UIImage alloc] initWithData:data];
float widthPer = 0.5;  // リサイズ後幅の倍率
float heightPer = 0.5;  // リサイズ後高さの倍率
	
CGSize sz = CGSizeMake(img.size.width*widthPer,
					   img.size.height*heightPer);
UIGraphicsBeginImageContext(sz);
[img drawInRect:CGRectMake(0, 0, sz.width, sz.height)];
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

次は角丸。角丸を「かくまる」って読んでたのは内緒w「かどまる」ですね。

#import <QuartzCore/QuartzCore.h>

cell.imageView.layer.masksToBounds = YES;
cell.imageView.layer.cornerRadius = 5.0f;

最後に、

cell.imageView.image = img;

ナビゲーションバーとステータスバーを非表示にする

ステータスバーは電波強度や時間、充電残量を表示している部分。
ナビゲーションバーはUITableViewなどの上部に表示されている戻るやタイトルなどが表示されている部分。

それぞれ、ナビゲーションバーとステータスバーを非表示にする - ほげほげ(仮)に書かれていたので、メモ。
消したい場所で以下のコードを記入。

まずステータスバー

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];

ナビゲーションバーは以下

[self.navigationController setNavigationBarHidden:YES animated:YES];

でも、これだと常に消えちゃうな…
タッチして付けたり消したりってどうやるんだろう?

JSON Frameworkを使ってjsonをiPhone(iOS)でパースする。

iPhonejsonの解析はぐぐるとすぐに以下のページが出てくる。
[iPhone] JSON Framework の使い方(準備編) | Sun Limited Mt.
[iPhone] JSON Framework の使い方(解析編) | Sun Limited Mt.

ただ、これだと情報が古い。
現在のJSON Frameworkはバージョン2.3.1。
ちょっとやり方が変わっているから、メモ。
参考にしたのは以下のサイト
How to use JSON in Cocoa/Objective-C • Zach Waugh

JSON Frameworkは以下からダウンロードできる。
Google Code Archive - Long-term storage for Google Code Project Hosting.
Downloads · stig/json-framework · GitHub


ダウンロードしたら、解凍したフォルダ内のJSONをプロジェクトのクラス内にコピー。










JSON Frameworkを使うコード内に

#import "JSON.h"

を加える。

twitterのタイムラインをjsonで取ってきてパースするサンプルは以下。

// twitterからstatusesをダウンロードするためのURLリクエストを準備
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://twitter.com/statuses/public_timeline.json"]];

// URLからJSONデータを取得(NSData)
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// JSONで解析するために、NSDataをNSStringに変換。
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

// JSONデータをパースする。
// ここではJSONデータが配列としてパースされるので、NSArray型でデータ取得
NSArray *statuses = [json_string JSONValue];

// statuses内の要素を取り出して、確認
for (NSDictionary *status in statuses)
{
  // You can retrieve individual values using objectForKey on the status NSDictionary
  // This will print the tweet and username to the console
  NSLog(@"%@ - %@", [status objectForKey:@"text"], [[status objectForKey:@"user"] objectForKey:@"screen_name"]);
}

参考にしたサイトではSBJSON型のパース領域を用意しているが、これはObjectiv-Cのネイティブクラスであるため、iOSではサポートされてない様子。iOSでパースするために、

NSArray *statuses = [json_string JSONValue];

としている。

ここで、何も考えずに、NSDataをJSON Frameworkにパース用データとして与えたために少しはまってしまった。
確実にNSDataをNSStringに変換してからJSONにパースすること。

MacBook Air 11インチ欲しい!

MacBook Air 11インチ欲しい!

キャンペーンをやってるので応募!

今使ってるマシンはMacBook 13インチ。
アルミユニボディの今で言うところのMacBook Pro 13インチ。
持ち運ぶのにいいかな?と思ったけど、なんやかんやでやっぱり重い。

その前に使ってたのが、PowerBook G4 12インチ。
PowerPC G4最後のノート。

小さいノートばっかりを使ってた中で11インチも気になるところ。

これが当たると次買うMaciMacMacBook Pro 15とか17に出来る!

Google App Engine (GAE/P) でjsonを出力する。

python2.6からは標準でjsonが実装されているが、GAEはpython2.5なので、djangoに含まれるsimplejsonをimport。
日本語を含む場合、文字化けするのを防ぐために、ensure_ascii = Falseを付ける。

from django.utils import simplejson 
data = [] 
json = simplejson.dumps(data, ensure_ascii=False) 
self.response.content_type = 'application/json' 
self.response.out.write(json) 

Webappクラスを使ってフォームから値を受け取る

URLから値を受け取る - ひろぽんのプログラミングメモ
こんな記事を書いたけど、Google App EngineにはWebappクラスが実装されてる。それを使ってフォームから値をGETするのが一般的らしい。

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainHandler(webapp.RequestHandler):
	def get(self):
		text = self.request.get('text').encode('utf-8')
		self.response.out.write(text)
		return

def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                         debug=True)
    run_wsgi_app(application)


if __name__ == '__main__':
    main()

これでファイルを保存。サーバーを起動して、以下をURLフォームへ入力。

http://localhost:8080/?text=hogehoge

実行すると。

hogehoge

となる。