iPhoneSDKで現在位置取得&地図表示

TamaCです。
iPhoneアプリをいじってみたのでメモ代わりにのこしておきます。

Objective-Cを1週間ほどやってみたのですが、
なかなか難しいですね。

初めてObjective-Cを触る方は、どこがObjective-Cのコードで、どこがiPhoneSDKのライブラリなのかをはっきりわけるとこから入るといいと思います。

ところで、現在位置を取得して位置表示など簡単なアプリを設計しましたので
復習がてら書きます
開発ツールバージョンは
xcode4.0.2
iOS SDK4.3
です。

現在位置表示アプリ


こんな感じのをつくります。
いまいる現在地から地図を表示するものです。
※この緯度、経度、マップはでたらめです




作る!

早速つくります
まずはプロジェクトの生成。特に遷移とかもないのでView-based Applicationで。
名前は「CurrentMap」などにしました。




xibの設定

xibは最初にできあがりイメージをつかむのにも、私は最初に基盤だけ設定します。
画面の大半をMKMapViewにして
下の方にLabelを配置しました。ドラッグアンドドロップでできるわかりやすいインターフェースです。




フレームワークの追加

今回の現在位置のマップを表示するにあたって



・現在位置の取得
・マップの表示

が必要です。デフォルトではこのような機能を実装するには大変なので、簡単に使えるようにライブラリ追加して使えるようにします。
ちょっとわかりにくいですが
左上の「CurrentMap」からTARGETSの「CurrentMap」、右側の「Build Phases」からその下の「Link Binary With Libraries」の▶をクリックします。
するといま入っているフレームワークが出てくるので、その下の「+」記号をクリックします。

クリックすると既存ライブラリが出てくるので、
位置情報関連ライブラリの「CoreLocation.framework」と
マップ関連ライブラリの「MapKit.framework」と追加します。

↓追加前

↓追加後




CurrentMapViewController.hの設定

だいぶ準備が整ってきたのでコード編集にいきます。
CurrentMapViewController.hを編集します。

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h> // 位置情報関連のライブラリ読み込み
#import <MapKit/MKmapView.h> // 地図情報関連のライブラリ読み込み

@interface CurrentMapViewController : UIViewController<CLLocationManagerDelegate> {
    MKMapView    *mapview;        // 地図表示用
    UILabel      *locationlabel;  // 下部の表示用
    
    CLLocationCoordinate2D coordinate; // 現在の緯度経度
}

@property (nonatomic, retain) IBOutlet MKMapView *mapview;
@property (nonatomic, retain) IBOutlet UILabel   *locationlabel;

@property (nonatomic) CLLocationCoordinate2D coordinate;

@end

こんな感じです。nonatomic とかはまだ勉強中です。よく使うので今のところおまじないの感覚です。




xibの編集

ここでCurrentMapViewController.hでIBOutletを定義したので、xibファイルで場所を結びつけてあげます。
IBOutletで定義した変数はxibのどこかの部分と結びついている = 画面からタッチした後の動きなどを定義するためのパイプ役
と考えてもらっていい思います。

CurrentMapViewController.xibで
「File's Owner」を選択し、
右側の→記号をクリックします。

すると下のような画像が出るので、○部分をドラッグアンドドロップして、MKMapViewとLabel部分に結びつけます。



CurrentMapViewController.mの編集

まずはCurrentMapViewController.hで定義した変数をsynthesizeします。

#import "CurrentMapViewController.h"

@implementation CurrentMapViewController
@synthesize mapview;
@synthesize locationlabel;

@synthesize coordinate;




viewDidLoadの編集

同じファイルのCurrentMapViewController.mのviewDidLoadの編集。
アプリが起動したタイミングで呼ばれるメソッドです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    if ([CLLocationManager locationServicesEnabled]){ // 位置情報が取得可能か
        locationManager.delegate = self;
        [locationManager startUpdatingLocation]; // 位置取得開始
    } else {
        NSLog(@"ロケーションサービスを利用できません");
    }
}


現在地が取得できた場合のメソッドのオーバーライド

こちらも同じくCurrentMapViewController.m内で次のメソッドを定義します。
これは追加したライブラリのCoreLocation内のメソッドのオーバーライドです。
ファイルないであれば基本的に場所はどこでも良いので追加します。

// 位置情報が取得できた場合の処理
- (void)locationManager:(CLLocationManager *)manager
 didUpdateToLocation:(CLLocation *)newLocation
 fromLocation:(CLLocation *)oldLocation
{
    // 緯度経度取得の確認のため。
    NSLog(@"緯度:%fと経度%f", [newLocation coordinate].latitude,
 [newLocation coordinate].longitude);
    
    coordinate = newLocation.coordinate;
    
    [self displayLocation];
    // 取得した座標を中心に地図を表示
    MKCoordinateRegion zoom = mapview.region;
    // どのくらいの範囲までズームするか。※値が小さいほどズームします
    zoom.span.latitudeDelta = 0.001;
    zoom.span.longitudeDelta = 0.001;
    // ズームする
    [mapview setRegion:zoom animated: YES];
    // 動きをつけながら表示
    [mapview setCenterCoordinate:newLocation.coordinate animated:YES];
    // ラベルに書き出す
    [locationlabel setText:[NSString stringWithFormat:
                            @"緯度:%.2f 経度:%.2f 方位:%.0f",
                            coordinate.latitude,
                            coordinate.longitude,
                            0]]; // 方位はシュミレータだと取得できなかったので、また今度。
}




表示

ここまで来るとシュミレータでこんな感じの表示になります。

勉強あるのみ。

日々勉強ですね。C言語も知らない私にとっては最初つらいものがありましたが
ちょっとやるとおもしろさ感じました。

開発はやっぱ楽しいですね。

べた書きだらけで良いコードではないと思いますが

誰かの参考になればと思います。

RTM活用メモ

RTM使おう。

Remember The Milkは2年前くらいから使っているのですが、あまり使う機会がなく放置してましたが、
最近やらなければいけないことが増えすぎて、そろそろタスク管理しなきゃなーと思いはじめ、またRTMを使ってみました。

にしても、ただ公式web上でタスク管理をしているだけれはなかなかタスク意識が持てません。

しかしクライアントソフトを入れることで使いやすさ、忘れやすさはグンと上がります。

Windowsクライアント

使用OS: windows7

ガジェット使いました。

ダウンロードはこちらから
http://gallery.live.com/liveItemDetail.aspx?li=55ccf415-af76-4a33-bad6-5bdaa370b214



ガジェットの右側にある、設定アイコンをクリックして
最初にログイン設定をします



ブラウザ上でOKして、ガジェットでログインします。



デフォルトでの表示はこんな感じです。



ちょっとみづらいので、表示設定を変えました。




タスクのリロードはガジェットの右上にあるアイコンをクリックして、
リロードマークをクリックします。



デスクトップ上に常に表示されるので、
タスク一覧がしやすいです^^


macクライアント

使用OS: Mac OSX 10.6.4

MilkMaidというものを使いました。
あちこちの記事で見かけたのですが、使いやすそうです。

ダウンロードはこちらから。
https://github.com/jgallen23/MilkMaid/downloads

インストールすると、こんな感じでタスクが表示されます。
シンプルでいいですねー

未完了のタスクが数で表示されます。
いっぱいたまってるな。。牛乳買わなきゃ;


iPhoneにも多数アプリがあるようなので、こちらも併せて使うとタスク管理がより効果的になりそうです。


参考サイト様
http://www.moongift.jp/2010/09/milkmaid/

symfony propel:insert-sqlでエラー出たよ

symfony propel:insert-sqlでエラー

symfony propel:insert-sqlしたらエラーになった。


Execution of target "insert-sql" failed for the following reason: /usr/share/pear/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/build-propel.xml:275:1: [wrapped: could not find driver]
[phing] /usr/share/pear/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/build-propel.xml:275:1: [wrapped: could not find driver]

Some problems occurred when executing the task:
build-propel.xml:275:1: [wrapped: could not find driver]
If the exception message is not clear enough, read the output of the task for more information

原因

ORMのpropel1.3ではphpにpdo-mysqlモジュールが必要とのこと。

解決

yumでpdo-mysqlをインストールした。
※php5.3をあつかうためremiで配布されているPHPを使用しています


sudo yum --enablerepo=remi install php-pdo

して、


sudo yum --enablerepo=remi install php-mysql

で解決。
途中コンフリクトエラー起こしたのでremi経由で入っていないphp-mysqlを一旦削除して
mysql入れ直した。

もう一度


$ symfony propel:insert-sql

This command will remove all data in your database.
Are you sure you want to proceed? (y/N)

y
>> schema converting "/xxx/config/schema.yml" to XML
>> schema putting /xxx/config/generated-schema.xml
>> propel Running "insert-sql" phing task
>> file- /xxx/config/generated-schema.xml

入ったー

crontab の設定で日付の入った名前のファイルをつくろうとしたらエラーでたよ

やりたかったこと

cron で毎日行うバッチ処理でファイル名に日付入りのものを作ろうとしてこんな感じでcrontabに記述してた。

0 5 * * * /bin/sh ~/batch.sh > ~/`date +%Y%m%d`.log

エラー発生

みたいにやってたらどうも動いてないのでcronのメールの中身見てたらエラー出てた。
なんぞこれ


/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

原因

ふむ。。いろいろ調べてみると
同じようにひっかかってる人がいたので原因判明(=´∇`=)

cronだと%がコマンドの終わりと解釈されるみたい。
なんでバッククォートの対の対応が見つからない、ってのでエラーはいてたのね。


解決

ということで % をエスケープしてやるとうまくいきました。

0 5 * * * /bin/sh ~/batch.sh > ~/`date +\%Y\%m\%d`.log

historyの記録件数の変更と日付表示

記事数があまりにも少ないのでちょっとしたメモでも書いていこうと思いました


historyの記録件数を10000件にして日付(時間付き)表示にする

設定ファイルに

HISTSIZE=10000
HISTTIMEFORMAT='%Y-%m-%d %T ';
export HISTSIZE HISTTIMEFORMAT

のように書いて suorceコマンドなどで設定反映。

Happy Hacking keyboard と blue ESCキー が届いた^^

ついに手に入れました!

昨年あたりから欲しかったものですが高価のためずるずるとひきずってましたが
PFU 50周年キャンペーンにやられてしまい、
PFUダイレクトにて思い切って購入しました。
……やっちゃいました。
買ったのは、Happy Hacking Keyboard Professional2 墨 無刻印。

届いたもの


大きめの段ボールに丁寧に梱包されておりました。さすが高級キーボード。

HHKB


キャンペーンのキーボードトランク


先着100名の青ESCキー




Blue ESCキー装着した


ちょっとポップな感じになります。
本当に欲しいのは昨年のキャンペーンの赤Ctrlキーなんですが。

全部黒のほうがかっこいいと思ったので、しばらくは青ESCは付けずに使用することにした。

感想

良いよこと悪いところの素直な感想。

GOOD!!

  • 触感。ざらざらしたキーがたまらん。
  • 音。コトコトコト...といった打鍵音が心地良すぎる。
  • 打鍵感。静電容量無接点式というのがどれほど普通のキーボードと違うかが分かる。
  • キー配列。無駄なキーがない。自然とホームポジションの強化にもなる
    (例えば自分の場合だとシフトキーを全部右シフトキーを使っていた、などクセを発見した)
  • 姿勢がよくなる。ホームポジションが要求されるため、姿勢もあまり動かなくなる。

BAD↓↓

  • 慣れるのに少し時間が。。自分はMacBookUNIX配列を使用していたが、微妙に配列が違い、ミスタイプもある
  • deleteとenterが近い。慣れもあるが、この二つのキーをミスタイプすると痛い。
  • より正確にな入力の時に困る。例えばパスワードの設定。無刻印だと数字とかちゃんと打ててるか気になる。
  • synergyなどでwindowsmacをつなぐとモードが違うためおかしいことになる。

結論

良いキーボードを持ちたいと思うのであれば持っていて損はないと思います。
むしろキーボードをいずれ良いものにしたいなと言うのであれば早いうちに買っておいたほうがいいかも。

私にとってはメリットのほうが大きく、このHHKBを使ってのタイピングが楽しいです。
特に私はこの打鍵音が大好きです。心地よすぎて眠たくなるくらい。

ちなみに、慣れないうちは危険な作業はやめたほうがいいですww

しばらくはタイピングに病み付きになりそう。
ではでは。


※赤Ctrlキー求む!!!

sedコマンドメモ

ファイル整理してたらみつけた。これなにしようとしてたんだっけな。。


for FILE in `find ./ -type f ! -path '*/.svn/*' -print0 | xargs -0 grep -l "HOGE"`; do sed -e "s/HOGE/FUGA/g" $FILE > $FILE.back; mv $FILE.back $FILE; done