ウマい話、ちょいくれや。 このページをアンテナに追加 RSSフィード Twitter

2011年05月04日

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

TamaCです。

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

Objective-Cを1週間ほどやってみたのですが、

なかなか難しいですね。

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

ところで、現在位置を取得して位置表示など簡単なアプリを設計しましたので

復習がてら書きます

開発ツールバージョンは

xcode4.0.2

iOS SDK4.3

です。

現在位置表示アプリ

f:id:TamaC:20110505023925j:image

こんな感じのをつくります。

いまいる現在地から地図を表示するものです。

※この緯度、経度、マップはでたらめです



作る!

早速つくります

まずはプロジェクトの生成。特に遷移とかもないのでView-based Applicationで。

名前は「CurrentMap」などにしました。

f:id:TamaC:20110505024722j:image:w360



xibの設定

xibは最初にできあがりイメージをつかむのにも、私は最初に基盤だけ設定します。

画面の大半をMKMapViewにして

下の方にLabelを配置しました。ドラッグアンドドロップでできるわかりやすいインターフェースです。

f:id:TamaC:20110505024718j:image:w360



フレームワークの追加

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


・現在位置の取得

・マップの表示


が必要です。デフォルトではこのような機能を実装するには大変なので、簡単に使えるようにライブラリ追加して使えるようにします。

ちょっとわかりにくいですが

左上の「CurrentMap」からTARGETSの「CurrentMap」、右側の「Build Phases」からその下の「Link Binary With Libraries」の▶をクリックします。

するといま入っているフレームワークが出てくるので、その下の「+」記号をクリックします。

クリックすると既存ライブラリが出てくるので、

位置情報関連ライブラリの「CoreLocation.framework」と

マップ関連ライブラリの「MapKit.framework」と追加します。

↓追加前

f:id:TamaC:20110505024721j:image:w360

↓追加後

f:id:TamaC:20110505024720j:image:w360



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部分に結びつけます。

f:id:TamaC:20110505031554j:image:w360



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]]; // 方位はシュミレータだと取得できなかったので、また今度。
}



表示

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

f:id:TamaC:20110505023925j:image:w360

勉強あるのみ。

日々勉強ですね。C言語も知らない私にとっては最初つらいものがありましたが

ちょっとやるとおもしろさ感じました。

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

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

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

2010年11月28日

RTM活用メモ

RTM使おう。

Remember The Milkは2年前くらいから使っているのですが、あまり使う機会がなく放置してましたが、

最近やらなければいけないことが増えすぎて、そろそろタスク管理しなきゃなーと思いはじめ、またRTMを使ってみました。

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

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

Windowsクライアント

使用OS: windows7

ガジェット使いました。

ダウンロードはこちらから

http://gallery.live.com/liveItemDetail.aspx?li=55ccf415-af76-4a33-bad6-5bdaa370b214


ガジェットの右側にある、設定アイコンをクリックして

最初にログイン設定をします

f:id:TamaC:20101128090153j:image


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

f:id:TamaC:20101128090238j:image


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

f:id:TamaC:20101128090307j:image


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

f:id:TamaC:20101128090628j:image

f:id:TamaC:20101128090546j:image


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

リロードマークをクリックします。

f:id:TamaC:20101128090653j:image


デスクトップ上に常に表示されるので、

タスク一覧がしやすいです^^


macクライアント

使用OS: Mac OSX 10.6.4

MilkMaidというものを使いました。

あちこちの記事で見かけたのですが、使いやすそうです。

ダウンロードはこちらから。

https://github.com/jgallen23/MilkMaid/downloads

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

シンプルでいいですねー

f:id:TamaC:20101128095933j:image

未完了のタスクが数で表示されます。

いっぱいたまってるな。。牛乳買わなきゃ;

f:id:TamaC:20101128095934j:image


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


参考サイト様

http://www.moongift.jp/2010/09/milkmaid/

2010年10月20日

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

入ったー

2010年10月14日

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

2010年09月15日

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

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


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

設定ファイルに

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

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