Thursday, December 5, 2013

ローカライズでいろいろつまづいた

自分のローカライズの方法がわるかったのか、英語環境と日本語環境でのframeが同じなのに表示される場所が違うってことが起きた。

それを解決するためにはユーザーの言語環境を見ないといけないんだけど、それをifで分けたら解決できた。

    frame = self.view.frame;
    
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    CGRect statusFrame = [[UIApplication sharedApplication]statusBarFrame];
    CGRect navFrame = self.navigationController.navigationBar.frame;
    
    // NSLocalizedStringのEnglishとJapaneseどちらが適用されるかを調べる
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [ud objectForKey:@"AppleLanguages"];

    int enIndex = [languages indexOfObject:@"en"];
    int jaIndex = [languages indexOfObject:@"ja"];
    
    float offset = (enIndex < jaIndex ? navFrame.size.height + (version < 7.0 ? 0 : statusFrame.size.height) : 0);
    
    frame = CGRectMake(0, 0, frame.size.width, frame.size.height - offset);
こんな感じにわけたら、うまく解決できた。

多分もっといい方法があると思うんだけどね。


あと、これでわかったことなんだけど、NSLocalizedStringはlanguagesで一番最初の言語に対応する文字を返す。

Tuesday, December 3, 2013

JASidePanelで左メニューが表示される際のデリゲートを作成する

左のメニューが表示されるさいに、その中のtableviewを更新したいなーと思っていたので、ごちゃごちゃやってたら出来ました。
参考にしたのは以下の二つのリンク
→逆引きObjective-C for iPhoneアプリ - デリゲートを自作クラスに実装する
→[iOS] Protocol – Delegateパターン | Objective-C イベント伝達 その1 « きんくまデザイン

以下、その手順です。

1. delegateプロパティをJASidePanelController.hに追加する

以下のコードをJASidePanelController.hに加えます。

@property (nonatomic, assign) id delegate;

2. プロトコルをJASidePanelController.hファイルの中で定義します

プロトコルをJASidePanelController.hファイルの中にこう定義します。
(プロトコルがなんなのかは現段階で理解できていないが、気にしない♪)

// ここまで省略

@protocol JASidePanelControlDelegate; // ここを追加しました

typedef enum _JASidePanelStyle {
    JASidePanelSingleActive = 0,
    JASidePanelMultipleActive
} JASidePanelStyle;

typedef enum _JASidePanelState {
    JASidePanelCenterVisible = 1,
    JASidePanelLeftVisible,
    JASidePanelRightVisible
} JASidePanelState;

@interface JASidePanelController : UIViewController

#pragma mark - Usage
/*
ここからずっと下まで省略
*/

// Containers for the panels.
@property (nonatomic, strong, readonly) UIView *leftPanelContainer;
@property (nonatomic, strong, readonly) UIView *rightPanelContainer;
@property (nonatomic, strong, readonly) UIView *centerPanelContainer;

@property (nonatomic, assign) id delegate; // これを追加しました

@end


/************ ここから下のコードも追加しました ************/
@protocol JASidePanelControlDelegate 

@optional
- (void) JASidePanelControl:(JASidePanelController *)controller leftMenuVisible:(UIViewController *)viewController;

@end

3. 左メニューが表示されるところでデリゲートを呼び出す。

僕はここにこう書きました。

- (void)toggleLeftPanel:(__unused id)sender {
    NSLog(@"%@", _visiblePanel);
    
    if (self.state == JASidePanelLeftVisible) {
        [self _showCenterPanel:YES bounce:NO];
    } else if (self.state == JASidePanelCenterVisible) {
        [self.delegate JASidePanelControl:self leftMenuVisible:_leftPanel]; // ここを追加
        [self _showLeftPanel:YES bounce:NO];
    }
}

4. 最後にJASidePanelControllerのサブクラスでデリゲートを設定しデリゲートメソッドを埋める

// ~省略~
- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.
    
    self.delegate = self;
}

// ~省略~
- (void) JASidePanelControl:(JASidePanelController *)controller leftMenuVisible:(UIViewController *)viewController {
    leftMenuViewController *leftMenu = (leftMenuViewController *)viewController;
    [leftMenu.table reloadData];
}

多分、これでこれから表示されるViewControllerのメソッドを実行できるはず。

それよりも、はてなブログってすごいな。
あっちにコードがものすごくきれいに表示される。これからあそこをメインにしようっと。

でけたーーー!!驚きです。

Monday, December 2, 2013

NavigationBarを編集する

iPhoneアプリだと上によくナビゲーションバーがありますよね。
その編集方法です。

タイトルをつける

こちらに書いてあるコードの

self.navigationItem.title = @"タイトル";

と書くと自分の望むように変えられます。

ボタンを作成する。


    UIBarButtonItem *setting = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"settings_32.png"]
                                                               style:UIBarButtonItemStylePlain
                                                              target:self
                                                              action:@selector(settingButtonTapped:)];
    self.navigationItem.rightBarButtonItem = setting;

これは画像を使ってボタンを作成する際のサンプルコード。
UIBarButtonItemを使うんだねと覚えておけば、次調べるときも時間をかけなくてすむ。

iPhoneのOSのバージョンをプログラムから取得する

こちらのスタックフローを参考にした。
→http://stackoverflow.com/questions/7848766/how-can-we-programmatically-detect-which-ios-version-is-device-running-on

NSStringで

[[UIDevice currentDevice] systemVersion]
で取得できる。

iOS6で追加された「引き下げて更新」を使ってみた

iOS6で「引き下げて更新」がdefaultで用意されました。

なので、その使い方をこちらのリンクを参考に書きます。


// UITableViewが画面にあるので、そこに対応させるようにしてみました。
- (void)viewDidAppear:(BOOL)animated {
    // UITableViewControllerを作成
    UITableViewController *tableVC = [[UITableViewController alloc]init];
    tableVC.tableView = self.table;
    
    // UIRefreshControlを作成
    UIRefreshControl *refresh = [[UIRefreshControl alloc]init];
    
    [refresh addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
    
    // 作成したrefreshをtableVCにくっつける。
    tableVC.refreshControl = refresh;
}

// refreshするプログラム。
- (void)refresh:(UIRefreshControl *)refresh {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"sample"
                                                   message:@"sample"
                                                  delegate:self
                                         cancelButtonTitle:@"OK"
                                         otherButtonTitles:nil, nil];
    [alert show];
    [refresh endRefreshing];
}


使ってみて、意外とカスタマイズ性があまりなかったので、「引き下げて更新」を使っているアプリはほかの方法を使っているのでしょう。

defaultではださいので、cocoacontrolで見つけたこちらのライブラリーも試してみます。
これも比較的すぐ出来ました。
こちらのGithubページの通りやればすぐ出来ると思うのでわざわざ記事にはしません。

JASidePanelsの使いかた

しゃれおつなアプリを使うとあるボタンを押すと左からメニューがでてくることありますよね。

そんなものを実現してくれるのがこのgotosleep / JASidePanelsです。
ほかにも同じようなことを実現してくれるライブラリはあるのでCocoa Controlで探してみるといいでしょう。

とりあえず、今回はJASidePanelsを使うということで。

1. QuartzCore.frameworkを加える。
2. 
JASidePanelController.h
JASidePanelController.m
UIViewContorller+JASidePanel.h
UIViewContorller+JASidePanel.m
をプロジェクトに加える。
3. 
JASidePanelControllerを継承する適当なクラスをつくる。
ここではmySidePanelViewControllerと名付ける。
4.
そして作成したmySidePanelContorllerクラスのmySidePanelViewContorller.mに以下のコードを加える。

-(void)awakeFromNib{
    [self setLeftPanel:[self.storyboard instantiateViewControllerWithIdentifier:@"leftMenu"]];
    [self setCenterPanel:[self.storyboard instantiateViewControllerWithIdentifier:@"center"]];
    
    [self setLeftFixedWidth:200];
}

storyboard上で「leftMenu」と名付けられたViewControllerが左に表示される画面。
storyboard上で「center」と名付けられたViewControllerが中央に表示される画面。

※ここでstoryboardでcenterと名付ける画面をNavigation Controllerにすると、ライブラリ側で左上にメニューの画像をおいてくれます!

ただ、左のメニューから真ん中のViewControllerに値を渡す方法がないので僕は渡したい値をNSUserDefaultを使用してます。

これだけで出来ます。

Sunday, November 24, 2013

画像をアプリ内に保存 / 取り出し

画像を保存する

画像をurlにわざわざ取りにいくのは時間もかかるしめんどくさいので、アプリ内に保存してしまいましょう。
LINEとかはそうしてますよね。オフラインでも友達の写真は表示されるのでわかります。

以下のコードでOK→(参照もと: http://fitss.jp/blog/2013/05/xcodeImagePicker.shtml)


            UIImage *image = self.image.image;
            NSData *imageData = UIImagePNGRepresentation(image);
            NSString *path = [NSString stringWithFormat:@"%@/image.png", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];
            if ([imageData writeToFile:path atomically:YES]) {
               NSLog(@"save successs");
            } else {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"エラー"
                                                               message:@"画像が保存できませんでした。あとでもう一度お試しください"
                                                              delegate:self
                                                     cancelButtonTitle:@"確認"
                                                     otherButtonTitles:nil, nil];
                [alert show];
                return;

            }



そしてこちらが保存した写真を取り出す方法

画像を取り出す

NSData *imageData = [NSData dataWithContentsOfFile:[imageLinks objectAtIndex:i]];
UIImage *image = [[UIImage alloc]initWithData: imageData];

乱数を作成する

小数 (0 ~ 1.0)

double drand48()
これだけ!!

整数 (0 ~ x)

xが100の場合
int someinteger = arc4random() % 100
このとき生み出される数の範囲は0 <= x <= 99
99までしか生み出されない。
こんな感じ。

整数で望む範囲の数を取得するにはちょっと注意が必要かも。

「One Habit Log」がリリースされました

僕が初めて作ったアプリ「One Habit Log」がリリースされました。
One Habit Log on the App Store on iTunes

アプリを作ろうと思ったことは何度もあるんですけど、ユーザーのデータが必要でデータベースが必要だったり、スピードが出なかったりで個人では出来なかったんですね。(←単純に僕の実力が足りない)

でも、今回はネットワークへ接続することはしないですし、ユーザー一人で完結するサービスなのでそこら辺の心配はなかったので楽だったです。

今回の一番の収穫はMagical Recordを使えるようになったこと。

次はこれをGoogle ChromeみたいなUIで複数記録できるようにしたいんだよね。


方法は暇なとき探しているけど、なかなかViewを取得して表示てことができない。
と思ってたら意外と簡単にUIViewを画像で保存することは出来るらしい。
→そうだ、プログラミングしよう UIViewを画像で保存する。

アップデートできそう?

Sunday, November 10, 2013

やっとアプリの提出がおわったーー!!

ValidationでXcodeがクラッシュしていたのですがなんとか、解決できましたー!

Provisioning Profileのファイルが登録されていなかったからでした。
Provisioning Profileを制作するとこんな画面になりました。


これで僕が作成したアプリが「Waiting For Review」になりました!

これで審査が通れば、晴れてApp Storeに出ます!

Saturday, November 9, 2013

archiveしたアプリをValidateできない

Validateを押して自分のアカウント情報を入れると、ユーザーのauthentication fileが見つかりませんて出てきて、そこでiTunes Connectからダウンロードスルを選択するとxcodeが落ちる。

不可解

2013/11/10 追記
この問題ですが解決しました!
やっとアプリの提出がおわったーー!!

これで審査が通ればApp Storeに現れます!

Saturday, November 2, 2013

NSStringの空白かチェック

UITextFieldとかUITextViewに入力された文字が空白かどうかを判定するメソッド。
ここから丸パクリ。iphone - NSString is empty - Stack Overflow


- (BOOL) isEmpty:(NSString *)string {
    if([string length] == 0) { //string is empty or nil
        return YES;
    }
    
    if(![[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) {
        //string is all whitespace
        return YES;
    }
    
    return NO;
}

UITextViewなどに囲い線をつける

何度もやっていたのに久しぶりに触りだすと忘れていたのでメモ。
UITextViewでユーザーに入力してほしいから領域を示すために画像を周りを線で囲いたいことがある。


//1. まずQuartzCore.frameworkを使用する

// 2. つぎにFirstViewContorller.mとか使用したいmファイルでQuartzCoreをimport

// 3. あとは使用したいところに以下のように指定する
    self.text.layer.borderColor = [UIColor grayColor].CGColor;
    self.text.layer.borderWidth = 1.0;
    self.text.layer.cornerRadius = 4.0;

Friday, November 1, 2013

UITableViewのメソッドとか

UITableViewControllerを使わないでUITableViewを使いたいてのはよくあると思うけど、よくテーブルビューのためのメソッド一覧を忘れてしまうのでその一覧。
僕が比較的よく使うやつ。
//table delegate
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc]init];
    
    static NSString *CellIdentifier = @"OneQuestion";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    return cell;
}

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath{

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {

}

Monday, October 7, 2013

ローカライズの方法とアプリの申請

これもまた参考にしたリンクのメモ。
ローカライズの方法。

こちらが大変参考になる。
アプリの名前を言語によって変える
→Xcodeでアプリ名を多言語に対応させる方法(ローカライズ)
アプリの中の写真や文章を他言語対応する方法
→iPhoneアプリ開発者が知っておきたい「アプリを多言語化(ローカライズ)」する方法

次は申請!!
これらのリンクを参考に進めていきました。
→iPhoneアプリ申請やAppleの審査に関するメモ
→【まとめ】iPhoneアプリ Xcode4での iTunesConnectへ申請する方法まとめ

またこちらのリンクもリリースする前の確認事項のリンクがあり非常にありがたかったです。
→Mac初心者のiPhoneアプリ開発記9 アプリ申請までの道


僕はitunesconnectを使用して申請しました。
デベロッパープログラムに登録しているアカウントでログインして、手順に従って入力事項を入力すれば以外とすぐ終わりました。

紹介画像などを様々な大きさで用意するのに時間がかかりましたが、それ以外は特に詰まったこともなかったです。

チュートリアルの作り方

初めてアプリを使用するユーザーにチュートリアルを見せますよね。
そのチュートリアルの作成です。

参考にしたのはこちら→UIPageControlの使い方
以下のサンプルコードはこちらのサイトのほぼ丸パクリです。

サンプルのチュートリアルです。

//
//  ViewController.h
//  SampleApp
// いらないコメント省略

#import 

@interface ViewController : UIViewController 

@end

// ViewController.m
#import "ViewController.h"

@interface ViewController () {
    UIPageControl *pager;
    UIScrollView *scroll;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)viewDidAppear:(BOOL)animated {
    int page = 3;
    
    // scrollを作成
    scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 100)];
    scroll.contentSize = CGSizeMake(self.view.frame.size.width * page, self.view.frame.size.height - 150);
    scroll.backgroundColor = [UIColor clearColor];
    
    // ページング指定
    scroll.pagingEnabled = YES;
    
    // スクロールバーを表示しない
    scroll.showsHorizontalScrollIndicator = NO;
    scroll.showsVerticalScrollIndicator = NO;
    // ステータスバータップで上に戻らない。
    scroll.scrollsToTop = NO;
    // delegate
    scroll.delegate = self;
    
    // scroll内で表示するViewを作る。
    for (int a = 0; a < page; a++) {
        UIView *view = [[UIView alloc]initWithFrame:CGRectMake(self.view.frame.size.width * a + 20, 20, self.view.frame.size.width - 40, self.view.frame.size.height - 170)];
        switch (a) {
            case 0:
                view.backgroundColor = [UIColor redColor];
                break;
            case 1:
                view.backgroundColor = [UIColor blueColor];
                break;
            case 2:
                view.backgroundColor = [UIColor greenColor];
                break;
            default:
                break;
        }
        [scroll addSubview:view];
    }
    
    
    // pagerを作る
    pager = [[UIPageControl alloc] initWithFrame:CGRectMake((self.view.frame.size.width / 2) - 20, self.view.frame.size.height - 40, 40, 20)];;
    pager.numberOfPages = page;
    pager.currentPage = 0;
    pager.pageIndicatorTintColor = [UIColor colorWithRed:0.84f green:0.85f blue:0.86f alpha:1.0f];
    pager.currentPageIndicatorTintColor = [UIColor blackColor];
    
    [pager addTarget:self action:@selector(changePageControl:) forControlEvents:UIControlEventValueChanged];
    
    [self.view addSubview:pager];
    [self.view addSubview:scroll];
}

// scrollしたときのdelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // UIScrollViewのページ切替時イベント:UIPageControlの現在ページを切り替える処理
    pager.currentPage = scroll.contentOffset.x / self.view.frame.size.width;
}

// pagerのバリューに伴ってscrollも移動させる
- (void)changePageControl:(id)sender {
    
    // ページコントロールが変更された場合、それに合わせてページングスクロールビューを該当ページまでスクロールさせる
    CGRect Aframe = scroll.frame;
    Aframe.origin.x = self.view.frame.size.width * pager.currentPage;
    Aframe.origin.y = 0;
    // 可視領域まで移動
    [scroll scrollRectToVisible:Aframe animated:YES];
}


@end


次はこれを踏み台にして、Safariみたいな複数のページを自分で切り替えられるようなものを実装します。

アプリのアイコンを作成するのに参考にした画像など

まずはデフォルトアイコンやスプラッシュ画面のサイズ、名称を参考にさせていただいたリンク
→iOSアイコンファイル早見表(2013/9)
すんばらしく見やすい。これ見て一発でわかった。
まじ感謝


Xcode5からはアイコンやスプラッシュ画面専用のImages.xcasesetsが出てきたからかなり管理しやすくなった。
アプリをリリースするの初めてだから、Xcode4でどうやって管理していたかは知らないけど。。。

アイコンやスプラッシュ画面などの画像はこちらのwebサービスを使いました。
簡単に文字や、背景色、文字色を指定した好きな大きさの画像が作れる大変優れたサービスです。
→dummyimage.com

ここで無地の画像を作成して、Mac純正の画像にリサイズ、Skitchという無料のアプリで文字を入れたりしました。

今回作ったアプリはこんな感じのアプリです。
タイトルは「One Habit Log」。その名の通り一つの習慣しか記録することが出来ません。

これが最初アプリを起動した画面
右上のタイトルをクリックすると意気込みやタイトルをつけることが出来ます。
日付を指定すると下から、ボタンが出てきて記録することが出来ます。
記録した後の画面。

記録が目的なので今日の日付以降は記録することが出来ません。

次の記事はおそらくチュートリアルの作り方です。




Sunday, October 6, 2013

Magical Recordの使い方

やっとMagical Recordが使えるようになったのでメモしておく。
Personというエンティティ名をサンプルとして使用する。
こんな感じのデータ構造になっております。

Person
--name
--age

Insert

[MagicalRecord setupCoreDataStack];

Person *person = [Person MR_createEntity];
person.name = @"Sato Taro";
person.age = [NSNumber numberWithInt: 19];
これだけで新しいPersonを作成することが出来る。

Select

 
[MagicalRecord setupCoreDataStack];
NSArray *persons = [Person MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(name == '%@')", @"Sato Taro"]];
これが単純なセレクト
ANDでつなぐ場合
[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"(name == 'Sato Taro') AND (age == 19)"]];
SORTしたいとき
[MagicalRecord setupCoreDataStack];
NSArray *persons = [Persn MR_findAllSortedBy:@"age" ascending:YES];
ほかにもっと複雑なセレクトを書けたいときは順次加えていく。

Update

[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate: [NSPredicatepredicateWithFormat:@"name = 'Sato Taro'"]];
person.name = @"Sato Kogoro";
これだけ!

Delete

[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate: [NSPredicatepredicateWithFormat:@"name = 'Sato Taro'"]];
[person MR_deleteEntity];

今のところこんな感じです。新しいことがわかったら随時加えていきます。

UIAlertViewにテキストのinputをさせる

参考→【iOS5】UIAlertViewにsetAlertViewStyleでテキストフィールドを追加する!!

ここを参考に僕も実装しました
- (void) settingButtonTapped {
    UIAlertView *setTitle = [[UIAlertView alloc] initWithTitle:@"Set Title"
                                                       message:nil
                                                      delegate:self
                                             cancelButtonTitle:@"Cancel"
                                             otherButtonTitles:@"Save", nil];
    [setTitle setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [[setTitle textFieldAtIndex:0] setText:habit.title];
    [setTitle show];
}

// Setボタンを有効にするかを決める
- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView {
    NSString *inputText = [[alertView textFieldAtIndex:0] text];
    
    if( [inputText length] >= 1 ) {
        return YES;
    } else {
        return NO;
    }
}

// アラートのsetTitleのsaveボタンが押された
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *input = [[alertView textFieldAtIndex:0] text];

    if (buttonIndex == 1) {
        NSLoG(@"%@", input);
    }
}

Saturday, October 5, 2013

UIButtonをプログラムから作成する

このようなフラットデザインのボタンを作れるライブラリを使いながらボタンを作成したのでめもめも
QBFlatDesignについてはこちらのgithubプロジェクトを見ていただければわかるので、ここでは触れません。

では、ボタンをプログラムから作る方法と、クリックイベントの取得の方法をばここに。
    QBFlatButton *bottomButton = [[QBFlatButton alloc]initWithFrame: CGRectMake(20, frame.size.height - 80, frame.size.width - 40, 60)];
    // デフォルトのボタンを作るときは以下のコード
     UIButton *bottomButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // この場合あとでフレームを指定しないと行けない
    // font
    bottomButton.titleLabel.font = [UIFont boldSystemFontOfSize: 20];
    [bottomButton setTitle:@"Mark" forState:UIControlStateNormal];
    [bottomButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    // color
    bottomButton.faceColor = [UIColor colorWithRed:0.23 green:0.83 blue:.51 alpha:1];
    bottomButton.sideColor = [UIColor colorWithRed:.16 green:.76 blue:.44 alpha:1];
    // event
    [bottomButton addTarget:self action:@selector(bottomButtonTapped) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:bottomButton];

Friday, October 4, 2013

Xcodeでアニメーションさせる

何かをアニメーションさせながら非表示にしたいということはよくあると思う。
そんなときに使えるのがこのメソッド
- (void)viewDidLoad
{
    [super viewDidLoad];

     CGRect frame = self.view.bounds;

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, frame.size.height - 100, frame.size.width, 100)];
    label.backgroundColor = [UIColor colorWithWhite:1 alpha:0.8];
    [self.view addSubview:label];

    [UIView animateWithDuration:0.5 animations:^{
        label.frame = CGRectMake(0, frame.size.height - 100, frame.size.width, 100);
    }];
}
このコードを動かすと、画面が表示されてから0.5秒掛けながら、画面の下から100px分表示されていた透明なバーが下に下がっていく。

おためしあれ〜〜

UIScrollViewでどれくらいはやく動いているかを取得する

UIScrollVIewでどれだけ動いたかを知りたくて、その方法を探していた。
UIScrollViewに限らず、UITableViewでも使える。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
{
    CGPoint velocity = [[scrollView panGestureRecognizer] velocityInView:self];
    if (abs(velocity.y) >= 800) {
        // do something
    }
}
これでvelocityの速度を違うメソッドに渡せば、Google+のiPhoneアプリのように、スクロールに合わせて表示、非表示の切り替えを行うことが出来る。

カレンダーライブラリ~MNCalendarView~

カレンダーアプリを作ろうと思い立ち、TapkuLibraryを使用できるようになったのはいいがそれでは僕がイメージしていたものができたいとわかったため、違うライブラリを探していた。

試していったのを順次使い方を含めて紹介していく。

MNCalendarView

非常に簡単に使用でき、なおデザインも最高にいい。

<手順>
こちらのGitHubプロジェクトから自分のパソコンへファイルを移動させる。形式はzipでも、gitでもなんでもいい。
そして、プロジェクトにMNCalendarViewをAdd Fileするだけ。とても簡単だ。以下のコードで画像のようなカレンダーが表示される。
// viewController.h
#import 
#import "MNCalendarView.h"

@interface ViewController : UIViewController

@end

// viewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
/*
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dateString = @"2013-09-08";
    NSDate *date = [formatter dateFromString:dateString];
    これで始めの位置を指定しようとしたがかなわなかった。
*/
    MNCalendarView *calendar = [[MNCalendarView alloc]initWithFrame:self.view.bounds];
    calendar.selectedDate = date;
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
    // 省略
}

@end

これでこのように表示される

デザインもシンプルでいいのだが、日付をタップされたときのイベントの取得がデフォルトでなく、また、カレンダーを表示させる位置も終わらせる位置もデフォルトでなかったので、ボツに

そこでTimesSquareを採用したのだが、これも長くなりそうなのでまた今度のエントリーにまとめます

TapkuLibraryのカレンダーで日付のタップイベントを取得する!

前回の記事で無事カレンダーを表示させるところまでいけたので、今回はカレンダーの日付をタップされたときのイベント取得を実装します。
前回の記事→TapkuLibraryのedgesForExtendedLayoutで悩んでいるすべての方へ


// viewController.h
// ここは前回の記事と変わらない。delegateが増えていることに注目
#import 
#import "TapkuLibrary/TapkuLibrary.h"

@interface ViewController : UIViewController 

@end

// viewController.m
#import "ViewController.h"

@interface ViewController () {
    TKCalendarMonthView *calendar;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    calendar = [[TKCalendarMonthView alloc]init];
    calendar.delegate = self;
    // calendar.dataSource = self;  * タップイベントを取得するだけだったらこれは必要ありません。
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
// 省略
}

// カレンダーがタップされたイベントを取得
- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)date {
    NSLog(@"tapped!!");
}

@end


TapkuLibraryのedgesForExtendedLayoutで悩んでいるすべての方へ

TapkuLibrary。。。すばらしいライブラリですよね。
デフォルトぽいカレンダーが数行で書けてしまいます。(僕はまだ表示させるところまでいっていない)

そんなTapkuLibraryですが、最近のiOS 7へのアップデートの影響でビルドが通らないことがあります。
その解決策です。

問題その1: "Property edgesForExtendedLayout not found on object"

ご心配には及びません。このエラーはすぐに解決できます。


まずこのエラーの原因ですが、iOS 7では存在するこのプロパティがiOS 6では存在しないことにより起きております。
証拠資料→UIViewController Class Reference


なので、「edgesForExtendedLayout」と書かれている行はすべてコメントアウトしてもかまいません。
本当はOSが7以上だったらで実行させたいところですが、xcodeをアップデートしないとこの行ではエラーがでるようになっているため、コメントアウトしか方法はありません。
iOS7かどうかを判別するif文はこちらのリンクをどうぞ
Writing iOS7 code that compiles against iOS 6 Base SDK

問題その2: "vImageBoxConvolve_ARGB8888"

これが問題になることもあります。「ARGB_8888」で検索してコメントアウトさせましょう。


無事、ビルドが通ればカレンダー表示!

問題なくビルドが通るようになったらいよいよviewにカレンダーを表示させます。


// viewController.h
#import 
#import "TapkuLibrary/TapkuLibrary.h"

@interface ViewController : UIViewController 

@end

// viewController.m
#import "ViewController.h"

@interface ViewController () {
    TKCalendarMonthView *calendar;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    calendar = [[TKCalendarMonthView alloc]init];
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
//省略
}

@end


これだけでなんとすばらしいカレンダーが表示されてしまいます!
このように!

おためしあれ〜〜

xcode4で.xcdatamodeldファイルを作成

いつもhファイルとmファイルを加えるように「File -> New -> File」と選択していく。
そうするとこのようなダイアログウィンドーがでてくるから、
上の画像の通り、OS XのCore Dataを選択し、
上の画像の通りを加える。

そのあとに作成するxcdatamodeldのファイル名を決めなくてはならないが、最初はデファルとのModel.xcdatamodeldで問題ない。

Tuesday, September 24, 2013

Chrome Extentionの要素の検証が消えてしまう

欲しい機能があったのでChrome Extentionで実現しようと、ドットインストールのクロームエクステンションの作り方の動画を見ていたのだが、そこで拡張の要素の検証ができない!!!!><

なんてことですごく困ったので、その解決策をここに記しておく。


解決方法は拡張を右クリックして、一番したのポップアップの検証をクリックすること。
そうするとChrome Developer Toolが別ウィンドーで現れて拡張の要素を見ることができる。


コードを見ないでデバッグなんてとんでもないからね。
無事CDTが現れてよかった

macでXamppを自動起動

イメージしているのは、システムを終了したmacを起動した際に、最初からxamppがすでにきどうしているところ。

下記リンクを参考にさせていただきました。

→MAC OS XでのOS起動時の自動起動 | 電脳芸 (ここをほぼ丸コピ)
→MacOSXでLighttpdを自動起動する - hippos-lab::net (手順を1から説明してくれるからわかりやすい)
→MacでWeb開発-(1) XAMPP for Macの環境設置 | Tokyo O life - ずばぴたテック (こちらはxampp_startup.tgzをダウンロードして自動起動する方法について紹介している)
→Mac活用日記 Mac OS X で XAMPP を自動起動する (上のリンク先を参考にして自動起動を行ったかたの記事。もし一つ上を参考にするならこちらもあわせてどうぞ)

僕は一番上のリンクを参考にさせていただきました。


どきどきしながら、再起動したところ動きました!
ほぼ一番目のリンクの方とやったことは同じなのですが、まとめておきます。

<コマンド>
cd /Library/StartupItems/
sudo mkdir xampp
cd xampp
sudo vi xampp

xamppの中身 (ここからの内容はすべて一番目のリンクのコピペです。)
#!/bin/sh
# Source the common setup functions for startup scripts
test -r /etc/rc.common || exit 1
. /etc/rc.common
SCRIPT="/Applications/xampp/xamppfiles/xampp"
StartService ()
{
        ConsoleMessage "Startping xampp"
        $SCRIPT start > /dev/null 2>&1
}
StopService ()
{
        ConsoleMessage "Stopping xampp"
        $SCRIPT stop > /dev/null 2>&1
}
RestartService ()
{
        ConsoleMessage "Restarting xampp"
        $SCRIPT restart > /dev/null 2>&1
}
RunService "$1"
:wqで保存してパーミッション変更 (こちらも一番目のリンクに書かれております)
sudo chmod a+x xampp

vi StartupParameters.plist
以下の内容をかいて、保存
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>XAMPP</string>
<key>OrderPreference</key>
<string>None</string>
<key>Provides</key>
<array>
<string>Appache with SSL</string>
<string>MySQL</string>
<string>Appache with SSL</string>
</array>
<key>Uses</key>
<array>
<string>Network</string>
<string>Resolver</string>
</array>
</dict>
</plist>

Monday, September 23, 2013

gitをmacにインストール

gitをmacにインストールさせる。

一応gitが何なのかはわかっているつもりだが、それでもしっかりした知識ではないので、いろいろスムーズに行かなかった。

今回従ったリンク先はこちら→http://www.msng.info/archives/2008/10/_git_mac_os_x.php


じゃ、いか僕がつまづいたところとその解決策。
------------------------

<2013/09/23 21:00:00>
wgetこまんどがない!!
上のリンクの方と同じように僕もwgetが入ってなかった。
ので、リンク先の著者の方の通りこちらのリンクを参考にcurlでgitをインストール
gitのバージョンはこちら(https://www.kernel.org/pub/software/scm/git/)のフォルダーを参考になんとなく、git-1.8.3.tar.gzを選択

<同日 21:01:00>
tarで解凍されない!!
実行したら以下のようなエラー文がでる。
tar: Unrecognized archive format
tar: Error exit delayed from previous errors.
そもそもtarというコマンドを知らなかったので調べる。
tarはUnix OSにおいて解凍するコマンドでオプションの詳細はこちらで→http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230896/

これは結局どうしたらいいかわからなかったら、gitを直接ダウンロードして、Downloadフォルダの中でtarしたらうまくいった。

原因はcurlでダウンロードできてなかったらしい。

<同日 21:23:00>
無事以下3つのコマンドが通ってgitをインストールすることができた。

cd git-1.5.5
./configure
make prefix=/usr/local all
sudo make prefix=/usr/local install

なお、gitがインストールできたかは「git」でヘルプが表示され、「git --version」で現在使用しているgitのバージョンが表示される

さあ、次はレポジトリの作成だ!!

Friday, September 20, 2013

.screenrcの設定

スクリーンを使いたかったのだがscreenの挙動がうまくいかなったから.screenrcのめも

escape ^Tt
vbell off

bind w windowlist -b

defencoding utf8
encoding utf8 utf8

hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
hardstatus off


このキーバインドはどうなんだろうか?よくわからない

<2013/09/24 追記>
俺の.screenが進化した。
今までの不満点

  • vimで何かファイルを開いた後に終了するとコマンドプロンプトが一番したに表示され、なおかつ上にはさっきまで開いていたファイルの内容が記されている。
    →ファイルをとじたことがわかりづらい
  • screenを起動するたんびにメッセージが表示される→時間の無駄
  • shellが4.2bashとか表示されて今自分がどこのディレクトリにいるかがわからない。
  • vimで編集しているときにshift + 矢印でなぜか挿入モードになったり、文章が消えたりする。→これに関しては僕が一般的なvimな使い方をしていないのかもしれないけど、shift + 矢印で一気にカーソルを移動させたい。
  • lsなどでフォルダを表示させると、色別で表示されない

以下のコードを書くことによって、これらの問題が一気に解消された。
// shellの指定
shell -$SHELL
// startup_messageを表示しないでという命令
startup_message off
// パソコンがログアウトなり、なんらかの接続が失われたらデタッチしてちょうだいという意味
autodetach on
// color
term xterm-color // これはどういう風に働いているかがわからない
attrcolor b ".I" // これもわからない
defbce "on" // これも調べたけどよくわからなかった。

すっきり!!

<同日 5分後追記>
すっきりと思っていたのですが、以下ふたつの問題がありました。

  • vimでの編集の色がscreenが起動しているときと起動していないときで違う
  • 今いるディレクトリからスクリーンを起動させることが出来ない (必ずホームのshellからスタートしてしまう) → おそらくshellこところを編集すればいい

-----------------
あと、スクリーンが何かの理由で増えてしまったとき。

 sudo rm -r /var/run/screen/S-root/*
OR
screen -S ○○○○ -X quit

これで解決。
おそらく、screenの仕組みってセッションを保存しているんじゃないかな。
だから、その保存されたセッションを消去すればいいのだろう。


ぶるぶるふるわせるjQueryプラグインがおもしろーーい

最近の僕のお気に入りのwebサービスがstorys.jpなのだが、僕はストーリーを読んでいる際のロゴをホバーしたときの、あのぶるぶると震えるのが好きだ


なので、自作しようと思ったができなかったので、プラグインを探した。
→そしたらあった。

それがこちら (http://jackrugile.com/jrumble/)
最高に面白い

導入方法は簡単で
リンク先にあるギットハブからzipファイルをダウンロード。
展開したファイルの中の「jquery.jrumble.min.js」を使いたいところで読み込み、サンプルの通り動かす。


         // ファイルの読み込み
         

    

とするだけでうごかせる。非常に簡単だ。
ちなみにホバーさせた時の一回だけのときはこうすればいいだろう

         // ファイルの読み込み
         

$(function () {
       $('#buruburu').jrumble();
        $('#buruburu').mouseover(function () {
                $('#buruburu').trigger('startRumble');
                setTimeout(function () {
                        $('#buruburu').trigger('stopRumble');
                }, 80);
        });
})

これまた簡単

ロゴとかをデザインするときに考えること

参考リン3つ

まだすべてを読み切れてない。

ロゴを考えるときに参考にする

Monday, September 9, 2013

mysqlのデータベース、テーブルの文字コードはutf8にしよう

文字コードは必ずutf8にしよう。
じゃないと文字化けの問題が出てしまう。

参考→http://babyp.blog55.fc2.com/blog-entry-838.html


文字コード関連でもう一つ
→http://ext.omo3.com/linux/mysql_character_set.html


とにかく、上のリンクでコマンドをコピペして、文字コード確認→文字コード変更しよう

Saturday, September 7, 2013

コードイグナイターが超簡単!!

まじ簡単でびっくりした。
データの取り出しを簡単にできるし、まじびっくり!!

以下メモ

・データベースについては、application/modelsに(データベース名)_model.phpに以下のコードを書く


class News_model extends CI_Model {

        public function __construct()
        {
                $this->load->database();
        }

        public function get_news ($slug = false) {
                if ($slug === FALSE) {
                        $query = $this->db->get('news');
                        return $query->result_array();
                }

                $query = $this->db->get_where('news', array('slug' => $slug));
                return $query->row_array();
        }
}

コントローラーにおける->dbはデータベースにつなげるだけだから、(テーブル名)_modelにしたからってそのテーブルだけしかつなげないということではない

・コントローラー(モデルとビューの橋渡し)はapplication/controllersに(テーブル名 || urlにしたい文字列).phpに以下のコードを書く
・functoinの名前は(クラス名)/(function名)のurlにアクセスされたときの処理


class News extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('news_model');
        }

        public function index()
        {
                $data['news'] = $this->news_model->get_news();
                $this->load->view('news_index', $data);
        }

        public function view($slug)
        {
                $data['news'] = $this->news_model->get_news($slug);
        }
}

・ビュー。コントローラーで処理されたデータを表示する



こんにちは!



viewで変数にアクセスするには、$dataの連想配列のキーになる

<追記>
複雑なselectを書けたいときに参考になる
http://ellislab.com/codeigniter/user-guide/database/active_record.html#select

複数のメソッドをつなげる
こんな感じに
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();

詳細はMethod Chainingを参照

rowをカウントする

$this->db->where('id', 2);
$this->db->count_all_results();


Sunday, September 1, 2013

そのた (フロントエンド)

ユーザーのアクセス環境を取得
http://www.myu-zin.com/webridge/archives/1038.html
cssではうまくできなかったから、phpでやたた
phpはフロントエンドもできるけどサーバー系だし、どうやって記事を分類したら良いのかを迷うw

JSでウィンドーサイズの変更を取得するプラグイン
http://d.hatena.ne.jp/cyokodog/20101101/exresize01

コピーしましたってやつを実装
http://tech.genestream.co.jp/2013/09/11/clipbord_copy_of_web_application/
このブログを書いていた人の勤務先がつい最近知り合った人のインターン先だったw

一行で左右に文字をおきたいとき。
http://the-zombis.sakura.ne.jp/wp/?p=1564

firstクラスとsecondクラスを同じ行に入れたい

// html
こちらがfirstです
こちらがsecondです
// css .first { float: left; } .second { text-align: right; }

これでいける

文字を省略して...と表示させたいとき
http://ameblo.jp/linking/entry-10268808742.html
// html
これはとても長い文章です。それはとてもとても長いです。まるで、象の鼻みたい。もしくはキリンくらい。。。ちょっと言い過ぎたかも。。。
// css .third { width: 150px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; -webkit-text-overflow: ellipsis; -o-text-overflow: ellipsis; }

phpでもやる方法があったんだけど、また次使うときに調べる

CSSで図形を作る
http://css-tricks.com/examples/ShapesOfCSS/

要素に影をつける
http://www.paulund.co.uk/creating-different-css3-box-shadows-effects
アイコン系のCSSリンク
CSS3 Image Styles

beforeとafterの説明。超絶わかりやすい
http://www.hongkiat.com/blog/pseudo-element-before-after/

JSで要素を追加。ついでにクラスも二つくらいつけちゃうし、style属性も決めちゃう
いつもはjQueryでやってるんだけど、事情でJSだけでしからやらないといけないときのために

var p = document.createElement('p');
p.innerText = 'Hello, This is SAMPLE SENTENCE';
          
// クラスを追加
p.classList.add('red');
p.classList.add('sample');

// sytle属性を追加
p.style.color = 'red';
p.style.fontSize = 35;

document.getElementById('sample').appendChild(p);

テキストの色を背景色で変えるプラグイン
http://www.kennethcachia.com/background-check/index.html

要素を反転させるjQueryプラグイン
http://lab.smashup.it/flip/
絶対役に立つ

サーバー関連

ssh ... -vvv
とかくとなにをやっているか見せてくれる。
早く理解できるようになりたい

sshのconfigファイルをいじくって、簡単にssh接続できるようになった!
Permission denied(publickey)とエラーが出ていたのだが、こちらの方のエントリーをみて解決!
→http://nick.hateblo.jp/entry/20111209/1323455748

自分のサーバーのドキュメントルートを知る
httpd.confをまずみつける
デフォルトではきっと/etc/httpd/conf/httpd.confとある。

そのファイルを開き、DocumentRootを検索
参考→http://www.adminweb.jp/apache/docroot/index1.html

サーバーを再起動
sudo service network restart
sudo service httpd restart
httpd.confをいじったときはこれが必要
参考→http://blog.livedoor.jp/yuppi0412/archives/22480485.html

ディレクトリにアクセスされたときに表示するファイルを決める
httpd.confを編集
DirectoryIndexを検索して編集
参考→http://www.linuxmaster.jp/linux_skill/2013/07/apache-4.html

アパッチのバージョンを確認
httpd -v

所用であるディレクトリのときにこちらにアクセスさせたいというときがあり、.htaccessをいじっていたのだが、apacheで.htaccessが聞いていなかったためにひどいめにあった

httpd.confの<Directory /var/www/html>
のAllowOverrideをAllに変更する
参考→http://www.masatom.in/pukiwiki/Apache/.htaccess%A4%CE%CD%AD%B8%FA%B2%BD/

ログファイルの出力先
/var/log/httpd/error_log

php.iniの場所
/etc/php.ini

mysqlの設定ファイル場所を調べる
 mysql --help | grep -A1 "Default options"

左から順に表示される
参考→http://qiita.com/kengos@github/items/2ede226c1bec86459920

Basic認証
プログラムからも出来たらしい
参考→http://www.phpbook.jp/tutorial/auth/index1.html

CodeIgniterでやる方法も調べたからのせておく
参考リンク
→http://immature.01kawa.com/php/codeigniter/codeigniter%E3%81%A7basic%E8%AA%8D%E8%A8%BC/
→http://codeigniter.jp/user_guide_ja/general/creating_libraries.html→http://codeigniter.jp/user_guide_ja/general/creating_libraries.html(ライブラリー)

エンティティ化とmysqlインジェクション

mysqlインジェクションはPDOを使って対策。これも結構使えるようになるまでめんどくさかったけどもう覚えてない。

んじゃ、エンティティかのコードをば。言語はphp

 function entity ($str) {
         $search = array('<', '>');
         $change = array('<', '>');
         return str_replace($search, $change, $str);
 }

Unixのパーミッションの見方

Unixだとls -laで現ディレクトリ配下のパーミッションが見れる。

今までどうやってみるかしらなかったので調べた。

パーミッション、読み権利、書く権利、実行する権利についてはこちら。
非常にわかりやすい
→http://www.din.or.jp/~raelian/unix_permission.html

説明へ、ls -laで以下の表示があったとする

-rw----r-- 1 root root 2197 Aug 29 13:44 index.html 
-rwxrwxr-x 1 root root 144 Aug 29 13:45 sample.html 
drwxrwxrwx 6 root root 512 Jun 22 18:46 top.html

それぞれの記号の説明

「r」   =  readable       よみこみ可能
「w」  =  writable        書き込み可能
「x」  =  executable    実行可能

1桁目 -- ディレクトリかディレクトリじゃないか、ディレクトリだったら「d」違ったら「-」が表示される

2 - 4桁目 ファイル所有者の説明

5 - 7桁目 グループに所属するユーザー

8 - 10桁目 グループに所属しないユーザー

以上でした

<追記>

パーミッションを変更したいときはchmod パーミッションコード (読み書き実行すべてのユーザーにオールオッケー) パス

を実行すればとりあえずmkdir() Permission deniedというエラーは出なくなるでしょー

多分大変な問題を引き起こすはずだけど、まだそこは勉強不足

Wednesday, August 7, 2013

[iPhoneアプリ]画像を縮小する

iPhoneの画像をサーバーに保存する際に画像サイズが大きくなってしまうので、iPhone側で画像を縮小しようと思います。


// 横200pxの画像にtrim
- (UIImage *)trimImage:(UIImage *)image {
    UIImage *trimmedImage;
    float ratio = image.size.width / 200;
    
    CGSize sz = CGSizeMake(image.size.width * ratio,
                           image.size.height * ratio);
    UIGraphicsBeginImageContext(sz);
    [image drawInRect:CGRectMake(0, 0, sz.width, sz.height)];
    trimmedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return trimmedImage;
}

このリンク先がとても役立つ→http://iphone-tora.sakura.ne.jp/uiimage.html

Monday, August 5, 2013

データを読み込むときのロード画面を作る

前回の更新から長らく時間が空いてしまいましたが、最近は開発を再会しております。

今回はデータを読み込むときの待機画面を作ってみましょう
これです


こんな感じに書けばOKです。
下のviewへのタッチイベントも吸収してくれます

    UIView *loading_view = [[UIView alloc]initWithFrame:self.view.bounds];
    loading_view.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
    
    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    indicator.center = CGPointMake(loading_view.bounds.size.width / 2, loading_view.bounds.size.height / 2);
    
    [indicator startAnimating];
    [loading_view addSubview:indicator];
    
    [self.view addSubview:loading_view];


あとちゃんと読み込んでるよーとユーザーに伝えるために、上のちっちゃいくるくるも動かすと良いですね。これです。

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

Sunday, July 28, 2013

UITextFieldを縦方向に真ん中&TableViewのgroupedでUITextFieldを表示&UINavigationBarにボタン追加

UITextFieldを縦方向に真ん中にするのは以下のコード

    UITextField *field = [[UITextField alloc]initWithFrame:CGRectMake(10, 10, 200, 100)];
    field.text = @"sample";
    field.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    [self.view addSubview:field];

高さをUITableViewCellの高さに合わせればOK

-----------------------------------------------------

UINavigationbarの右にボタンを加える。storyboardではできないからね


    UIBarButtonItem *send = [[UIBarButtonItem alloc]initWithTitle:@"保存"
                                                            style:UIBarButtonItemStyleDone
                                                           target:self
                                                           action:@selector(saveSetting:)];
    self.navigationItem.rightBarButtonItem = send;


こんな感じかなー

keyboard observer

keyboardが出てきたときに呼び出されるメソッドを作る
作り方はNSObserverという物を使う


-(void)viewWillAppear:(BOOL)animated{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
-(void)viewWillDisappear:(BOOL)animated{
    // observerを取り除く
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
-(void)keyboardWillShow:(NSNotification *)aNotification {
    // keyboardが現れたときの処理
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

    // したにあったテキストボックスなどを見えるところまで表示。
    // キーボードの大きさを取得する
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
    // prekeyboardHeightはすでにクラス全体で使えるように定義しておく。
    if (prekeyboardHeight != keyboardRect.size.height) {
        float change = keyboardRect.size.height - prekeyboardHeight;
        prekeyboardHeight = keyboardRect.size.height;
        keyboardRect.size.height = change;
    }
    
    // textFieldを押し上げる。
    CGRect textRect = self.text.frame;    
    textRect.origin.y = textRect.origin.y - keyboardRect.size.height;
    self.text.frame = textRect;

    NSLog(@"keyboard appear");
}
-(void)keyboardWillHide:(NSNotification *)aNotification {
    // keyboardが消えたときの処理

    // 今度はキーボードが消えたときに位置を調整する
    // キーボードの大きさを取得
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    
    if (prekeyboardHeight != keyboardRect.size.height) {
        float change = keyboardRect.size.height - prekeyboardHeight;
        prekeyboardHeight = keyboardRect.size.height;
        keyboardRect.size.height = change;
    }
    
    // 全体を押し下げる。
    CGRect textRect = self.text.frame;
    textRect.origin.y = textRect.origin.y + keyboardRect.size.height;
    self.text.frame = textRect;

    prekeyboardHeight = 0;

    NSLog(@"keyboard disappear");
}


なんでviewDidLoadじゃなくて、viewWillAppearに書いてあるかというと、viewDidLoadに書いたらなんかうまくいかなかったから。 多分、NSNotificationCenterはインスタンスが作られていないとだめみたいな決まりがあるのだろう

Tuesday, July 23, 2013

いろいろ

いろいろなtips

cssで図形を作る

phpでカレンダーを作る

';
    $counter++;
}
for ($day = 1; $day <= $last_day; $day++) {
    echo '' . $day . '';

    $counter ++;
    if ($counter == 7) {
        $counter = 0;
        echo '';
    }
}

?>


多分こんな感じで作れる

Sunday, July 21, 2013

コードで作ったUIViewをself.○○で使えるようにする

プログラムでUIViewパーツを作ったけどほかの場所からのアクセスの仕方がわからないって時


// .hファイル
    @property (weak, nonatomic) IBOutlet UILabel *text;

// .mファイル
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(100, 100, 50, 20);
    label.text = @"sample Label";
    [self.view addSubview:label];
    self.text = label;


こうすれ楽勝だ

UIToolBarに3セクションのUISegementedControlを加える

最近あまり開発の時間が取れていないkoheiです。

今日はtoolbarに3セクションのUISegementedControlを加える方法です。
早い話がこれのことです。

xcodeのstoryboardでUISegementedControlをtoolbarに持っていくと、勝手に黒くちいさくしてくれるのですが、セグメントの数は変えられません。
なので、プログラムで書いていくことになります。

そして、こちらがソースコードです。


    UIToolbar *toolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    toolbar.barStyle = UIBarStyleBlackOpaque;
    
    UISegmentedControl *segs = [[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"一つ目", @"二つ目", @"3つ目", nil]];
    [segs setSelectedSegmentIndex:0];
    [segs setSegmentedControlStyle:UISegmentedControlStyleBar];
    [segs addTarget:self action:@selector(optionChanged:) forControlEvents:UIControlEventValueChanged];
    
    UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithCustomView:segs];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    
    [toolbar setItems:[NSArray arrayWithObjects:space, buttonItem, space, nil]];
    [self.view addSubview:toolbar];


簡単ですね♪
こちらをコピペしました→http://www.18th-technote.com/post/9718092082/uitoolbar

xcodeでのバリデーション

メールアドレス
- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];

    return [emailTest evaluateWithObject:candidate];
}

これでOK

参照→http://sugartin.info/2011/08/17/regular-expression-for-email-validation-in-xcode-iphone-application/

パスワード

まだわからない。これから調べる

Friday, June 21, 2013

ナビゲーションするときに変数を渡す方法

これ、かなり前に勉強したはずでしたが忘れていて解決するのにものすごく労力を使ったのでここに残しておく

使用する状況は、UINavigationControllerを使っていてプログラムから指定するUIViewControllerへ移動したい。そのときに変数も伴って移動したい。
そんなときです。

ここでは、A、B(移動したいview)と名付けます
疲れたのでコードだけ

こちらは、Aのコードです
*storyBoardでview controller自体にstoryboard idをつけていないと働かないので注意してください

       //一番最初に移動したいviewcontroller.hファイルを読み込む
        #import "playMusicViewController.h"

        playMusicViewController *playMusic = [self.storyboard instantiateViewControllerWithIdentifier:@"playMusic"];
        playMusic.music_path = [music[indexPath.row] valueForKey:@"music_path"];
        [[self navigationController]pushViewController:playMusic animated:YES];

そして、こちらがBのコードです。
#import 

@interface playMusicViewController : UIViewController

@property NSString *music_path;

@end

移動したいviewのプロパティをAで指定して、実際に移動するというのがプログラムの構造になっています。

それじゃ、そういうことで

Thursday, May 2, 2013

キーボードを隠す簡単な方法(iPhone)

iPhoneアプリを制作している方でキーボードを隠したいときに
   [self.text resignFirstResponder];
と書いている人がほとんどだとおもいます。

ですが、これだとtextFieldにリーチできないときにどうしようもないですよね。
例えば、tableview cellの上にtext fieldをおいたとき、僕の場合エラーが出たのでテキストフィールド自体を参照できませんでした。

そんなときに役立つのがこのコード
   [self.view endEditing:YES];
この一つのコードでどんなシチュエーションにも対応できます!(多分ね!)

さらに、textfieldのデリゲートと併用して

-(void)textFieldDidEndEditing:(UITextField *)textField{
    keyword = [NSMutableString stringWithFormat:@"%@", textField.text];
}
こんな風に書くと、なんとテキストフィールドの中身もゲットできてしまうんですね〜
とてもいい働きをしてくれるのでお困りの際には試してください^^


Tuesday, April 23, 2013

勉強に対する価値観の違い

価値観というのはやっかいなものです。
なぜなら、本人にとってそれは自明のものであるのに対し他人とは異なることが多いから。
そして、多くの人は他人は自分と同じ価値観を持っていると想定しているのでめんどくさいです。

この価値観の相違は社会が変化することで生まれます。
社会が変化することで異なった価値観が形成され、衝突するというのはよくありますよね。僕も親とよく衝突する一人です。


今日は勉強に対する価値観の相違を発見したので、ちょこっと書いてみます。


勉強に対してよくいわれるのが「学生の本分だから」


このフレーズおもに大学生に対して使われると勝手に考えています(なぜなら僕がよく言われるから)
ですが、この表現僕にとってよく意味が分からないんですよね。


本分? = やらなきゃいけないこと?
社会的な立場によって本人のしたいことが抑圧される?


僕は本人がしたいことをするのが一番幸せだと思っています。
本人がしたいことに対して問題点を指摘するのは大歓迎ですが、この○○だから△△というのはどうしても納得できません。


どうして納得できないかを考えたところ、大学でする勉強への価値観が違うためだとの結論に至りました。
僕は大学での勉強を自分がしたいことを実現する手段の一つととらえています。


例えば、貧困問題を解決したい人が実際に貧困の現場に行って自分にどのような知識が不足しているかわかったからそれを学びに大学に行きたいというのが僕が考えるもっとも自然な大学へ進学する理由です。


他に考えられる理由は
1.社会的に認められたいから進学 → 社会的に認められたいという自分の欲求を実現するための大学進学
2.自分の興味あることについて学ぶのが好きだから → 自分がしたいことをするための大学進学

このような理由も理解できます


ですが、「学生なんだから勉強しなさい」と主張する人は勉強自体が目的になっているんだと思います。とにかく勉強すれば何でもいいよという考えです。


この大学での勉強という見方に違いがあるために僕は親が主張する「学生の本分は勉強」という主張にまったく共感しなかったんだと思います。別に勉強を目的とした勉強が間違っているとは思いません。それも高校までなら真だと思います


ですが、大学進学が義務ではなく、大学にいることが自分のしたいことを実現するための手段ではないという結論に至った場合は休学というのも選択肢の一つになるのではないのかなと思います。
(実は休学するという話について親ともめていますw 僕の場合ほかの事情もあって複雑なんですがねw)

Monday, April 22, 2013

aws, sdk php2でS3にアップロード

Amazon Web Servicesが提供するS3にファイルをsdk php2を使ってアップロードする仕方の紹介です。
ここを参考にしたので、もっと知りたい方はこちらを見てください。英語です
→http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html

Case1: /var/www/htmlにsample.txtがある
 require "vendor/autoload.php";
 use Aws\S3\S3Client;
 
 $bucket = "Bucket name";
 $client = S3Client::factory(array(
  'key' => 'Your Key',
  'secret' => 'Your Secret Key',
  'region' => 'Your Region' ));
 //このclientの作り方はhttp://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html
 //こちらのリンクのCreating a clientを参考にしてください
 $client -> putObject(array(
  "Bucket" => $bucket,
  "Key" => "fromFopen.txt",
  "SourceFile" => "/var/www/html/sample.txt",
  "ACL" => "public-read"
 ));


これでアップロードできます。自分の環境に合わせて$bucketやputObjectの中身は変えてください。ポイントは"SourceFile"でアップロードしたいファイルを指定しているところです。

Case2: フォームで指定された画像をアップロードする

        //上と同じなので省略
 $bucket = "/*省略*/";
 $client = S3Client::factory(/*省略*/));
 $fileName = $_FILES["picture"]["name"];
 $filePath = "pictures/" . $fileName;

 if(move_uploaded_file($_FILES["picture"]["tmp_name"], $filePath)){
  $client -> putObject(array(
   "Bucket" => $bucket,
   "Key" => $fileName,
   "Body" => fopen(sprintf("/var/www/html/%s", $filePath), "r+"),
   "ContentType" => "image//*写真の種類、jpg, pngとか*/".
   "ACL" => "public-read"
  ));
 } else{
  echo "Not OK!";
 }

写真の時はなぜだか"SoueceFile"ではうまくいかなかったので、"Body"に変えました
これでアップロードできます^^

Sunday, April 21, 2013

置かれた場所で咲きなさいの前提条件

「置かれた場所で咲きなさい」

この言葉を聞いたことがある方はたくさんいるはずだ。今いる状況が酷でも自分で努力して何とかしなさい、頑張ってみなさいと励ますためによく使われる。


でも、この表現には一つ前提条件がある。それは「咲く努力ができる環境にすでにいる」ということ。
咲くと表してるので花で説明しよう。


花が咲くには条件がある。光だったり、栄養素だったり、水だったり。花が咲くにはまず咲く環境が整っていることが前提条件だ。花がどんなに努力しても、水がない砂漠、光が届かない暗闇に置かれたら咲くことはできない


これを人間の話に戻そう。やはり花と同様に人間にも咲くには環境が大事だ。もし今いる環境で頑張れないと思っている人にこの「置かれた場所で咲きなさい」といった言葉は、今の場所に居続けなきゃいけないとストレスを与えるだろう。


もし今の場所にいるのが心底いやだったら別に場所を変えてもいいんじゃないですかね?
場所を変えて心機一転で頑張ればいいじゃないですか。その場所を離れるという行動を起こせたのなら新しい場所でも何とかできると思いますよ、僕は



Saturday, April 20, 2013

AVPlayerが働かないときは

以下のような簡単なAVPlayerで音楽を流したいと思ったのになぜだかうまく行かなかったときの解決策

    NSURL *url = [[NSURL alloc]initWithString:@"http://localhost/social-alarm1/musics/sampleMusic.mp3"];
    AVPlayer *player = [[AVPlayer alloc]initWithURL:url];
    [player play];

*AVFoundation/AVFoundation.hは.hファイルで読み込みをしています。

これをこうすると僕の場合は解決しました。
.mファイル

@interface ViewController () {
    AVPlayer *player;
}
@end

@implementation ViewController

- (void)viewDidLoad {/*省略。何もいじってません*/}
- (void)didReceiveMemoryWarning {/*省略。何もいじってません*/}

- (IBAction)startMusic:(id)sender {
    NSURL *url = [[NSURL alloc]initWithString:@"http://localhost/social-alarm1/musics/sampleMusic.mp3"];
    player = [[AVPlayer alloc]initWithURL:url];
    [player play];
}
@end
言葉で書くとするなら、「AVPlayerのインスタンスを.mファイルの最初のinterfaceで書くとなぜかうまくいく」ですね

Friday, April 19, 2013

awsのphp sdkインストールではまる

Amazon Web Servicesのphp sdkではまったのでどうやってインストールしたのか書いておきます
こちらの公式ドキュメントにそってインストールしていきました
→http://docs.aws.amazon.com/awssdkdocsphp2/latest/gettingstartedguide/sdk-php2-installing-the-sdk.html(日本語)

参考にさせてもらったリンクはこちらです
--http://www.1x1.jp/blog/2013/04/aws_sdk_for_php2_auto_scaling.html
--http://blog.suz-lab.com/2012/11/aws-sdk-for-php-version-2composer.html

以下のコマンドではまりました。

php composer.phar install

このコマンドを投げたときにこのような文が表示されてインストールされないんです
  [Seld\JsonLint\ParsingException]                                        
  "composer.json" does not contain valid JSON                             
  Parse error on line 1:                                                  
                                                                          
  ^                                                                       
  Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[' 
結局このエラーの原因は正しいcomposer.jsonファイルを編集していないからでした。
以下のコマンドで正しいcomposer.jsonファイルを開き、jsonを書き込みましょう

sudo vim /home/ec2-user/composer.json
//以下を書き込む
{
  "require": {
      "aws/aws-sdk-php": "*"
  }
}
これでばっちりです^^

自分の思い

ちょっと思ったこと。


僕は初音ミクとインターネットが好きだ。好きな理由はこれらのプロダクトが今まで関わりがなかった人たちをつなげたからだと思う。


初音ミクなんて本当にすごい。作る人がいて、pvをつける人がいて、それを歌ってしまう人がいる。初音ミクという作品がなかったらつながらなかった人たちがつながる。
だから、Google Chromeの初音ミクのCMには本当にしびれた。最高だった


インターネットも本当にすごい。僕がインターネットやプログラミングに興味を持ったのはインターネットである人のことを知ってからなんだけど、絶対に知り得ないであろうはるか上にいる人たちを知ることができる。パソコンでつながる。ハンパない


僕が本質的に作りたいものは今まで関連がなかった人たちをつなげて、そのつながった人たちを夢中にさせるプロダクトなのかもしれない


時々自分の本質がひょこっと顔を出すときがある。もしかしたら今回はそれが起きたのかもしれない

Thursday, April 18, 2013

RDSにphpから接続

この2日間くらいにサーバーとドメインを用意してネットワークの構築を行っていました
これから僕が使っていくのは、こちらのリンクになります→http://social-alarm.co/
.comはすでに申し込まれていて取得できませんでした

今回の記事はその過程でAWSのデータベースにphpから接続できなくてはまったのでそのphpからデータベースに接続する方法です

なかなか回り道したのですが、こちらの方のリンクの手順に従えば接続できるようになるはずです^^→http://www3441ui.sakura.ne.jp/wordpress/?p=479

Friday, April 12, 2013

NSLocalNotificationのサンプル

スリープ状態でもバイブと音でアプリの更新情報を教えてくれるあの機能です
NSLocalNotificationでネットワークにつなげることはできず、デバイスだけで完結してしまっている機能なので、facebookのようなメッセージがあったことを知らせるnotificationはPushNotificationで調べてください
(Notificationのapple公式ドキュメント => https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf)
日本語です

ここではLocal Notificationの使い方を忘れないようにメモしておきます。
(参考にしたサイト => http://ameblo.jp/porcom-yokoyama/entry-11134501691.html)
コピペですww問題があったら消します

    NSDate *now = [NSDate date];
    NSDate *notifyTime = [now dateByAddingTimeInterval:10];
    
    UILocalNotification *notify = [[UILocalNotification alloc] init];
    
    notify.fireDate = notifyTime;
    notify.timeZone = [NSTimeZone defaultTimeZone];
    notify.hasAction = YES;
    notify.alertBody = @"時間です。";
    notify.alertAction = @"起動する。";
    notify.soundName = UILocalNotificationDefaultSoundName;
    
    [[UIApplication sharedApplication] scheduleLocalNotification:notify];

上の参考リンクではNotificationの削除の仕方も載っているので、参考にしてください

Thursday, April 11, 2013

進捗状況3

進捗状況です。一番の変更点はUser Interfaceの変更です。
今こんな形です


Sunday, April 7, 2013

誰の人生を生きている?

本当に自分の決断は自分が下したと言い切れるだろうか?



確かにアドバイスはいただいた、でも最終的に決断を下したのは自分だ。と100%自信を持って言い切れるだろうか?



もちろん全ての人が自分の決断により生じるすべてに責任をもつ重みを背負うべきだとは思わない。



その人自身が現状に満足しているならどこにも問題はない



でも、現状に不満があって、何か解決策を探しているなら、もしかしたら解決策は自分の中にあるのかもしれない。



その解決策を選ぶことを自分自身に許してみよう。きっと世界が変わるはずだ




Saturday, April 6, 2013

xcodeで非同期通信

前回の投稿で非同期通信の仕方ができるようになりたいと書いたのですが、やってみたら意外とすぐできたので書いておきます
- (IBAction)asynchronousConnection:(id)sender {
    NSString *query = [NSString stringWithFormat:@"sample=%@", @"sample"];
    NSData *queryData = [query dataUsingEncoding:NSUTF8StringEncoding];
    
    NSString *url = @"http://localhost/sample/index.php";
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:queryData];
    
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [NSURLConnection connectionWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"receive response");
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSError *jsonError;
    NSMutableArray *returnedData = [[NSMutableArray alloc] init];
    returnedData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
    NSLog(@"%@", returnedData);
}
- (void)connectionDidFinishLoading: (NSURLConnection *)connection {
 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSLog(@"finish connection");
}

Friday, April 5, 2013

UILabelを透明にする

背景に画像を使用していて、その上にラベルをおきたいときてありますよね。
でも、直接おくとラベルのフレームのところだけ白くなりかっこわるい。。。ということでUILabelの背景を透明にする方法です


//プログラムから追加する方法
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 40)];
    label.text = @"Sample text";
    label.backgroundColor = [UIColor clearColor];
    [self.view addSubview:label];

    //hファイルにすでに宣言されている場合
    self.label.backgroundColor = [UIColor clearColor];

こんな風に描けばOKです

Thursday, April 4, 2013

objective-CでのHTTPリクエストの簡単なサンプル

手っ取り早く言ってしまうと、サーバーと通信するための簡単なプログラムです。
形式は決まっているのに、なかなか覚えないためメモ
* こちらは同期通信になっております。
* 非同期通信はこちら→xcodeで非同期通信


    NSString *query = [NSString stringWithFormat:@"id=%@&date=%@", user_id, date];
    NSData *queryData = [query dataUsingEncoding:NSUTF8StringEncoding];
    
    NSString *url = @"http://localhost/social-alarm/sample.php";
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:queryData];
    
    NSURLResponse *response;
    NSError *error;
    
    NSData *result = [NSURLConnection sendSynchronousRequest:request
                                           returningResponse:&response
                                                       error:&error];
   NSString *string = [[NSString alloc]initWithData:result encoding:NSUTF8StringEncoding];
   NSLog(@"%@", string);


こんなプログラムを実行するとurlに設定したurlにqueryを加えてサーバーへ送ることができます。
このやり方は同期通信といい、サーバーからのレスポンスをが帰ってくるまではなにも実行されないのが欠点です。僕も通信している間にくるくる回るやつが表示されるプログラムにしたい( ̄ω ̄;)

php側では普通に以下の方法でクエリーからのデータを取得できますよ(^^)/


$id = $_POST["id"];
$date = $_POST["date"];

参考 => http://libro.tuyano.com/index3?id=569004

Tuesday, April 2, 2013

XAMPP macのphp.iniの設定参考資料

http://ingwer-design.com/blog/php/xampp-for-mac-os-x2.html
この方のサイトが見やすくて参考になった

日付を取得・比較

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    df.dateFormat  = @"yyyy/MM/dd";
    NSString *str = [df stringFromDate:[NSDate date]];


時刻も取得したいときは
df.dateFormat = @"yyyy/MM/dd HH:mm:ss";
以上!

追加:NSStringとNSDateの変換

NSDate → NSString

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    
    NSString *dateString = [formatter stringFromDate:date];

NSString → NSDate

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    
    NSString *dateString = @"2012-03-23";
    
    NSDate *dateDate = [formatter dateFromString:dateString];


今回はこちらを参照→http://plaza.rakuten.co.jp/hiroymyan/diary/201004070001/

日付を比較

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [[NSDateComponents alloc]init];
    
    components.year = 2013;
    components.month = 10;
    components.day = 3;
    
    NSDate *date = [calendar dateFromComponents:components];

    NSComparisonResult result = [date compare:[NSDate date]];
    if (result != NSOrderedDescending) {
        return YES;
    } else {
        return NO;
    }

NSOrderedDescendingのほかにNSOrderedSame, NSOrderedAscendingがある。
参考→ 年や日などを指定して NSDate を作成する
参考→objective-Cでの日付の比較について

過去の日付を取得


// 5日前のNSDateを取得
[NSDate dateWithTimeIntervalSinceNow:-5*24*60*60]; 


Friday, March 15, 2013

進捗状況2

進捗状況その2です。
前回の進捗状況から進んだところはローカルサーバーにデータベースを作ってメッセージのやり取りができるようになったということです。
はい、それだけです。もっと時間を割けるようにします


<やること>
  1. push通知
  2. 決まった時間に音楽を流す目覚まし機能
  3. ユーザーをマッチングさせるプログラム
  4. 相手の音楽を流すプログラム
わからないことだらけで時間がかかっているけど、とにかくリリースを早くして協力してくださるエンジニアの方と巡り会いたいです

Wednesday, March 6, 2013

統計学がすべての数学の頂点だ

統計学がすべての数学の頂点であり、すべての数学の知識は微分積分ではなく統計学に収束するべきだというTED Presentation。




素晴らしい。
考えにとても共感できる。微分積分を実生活で役立たせるのは案外難しい。
でも統計なら、日々の生活で使える。生徒全員が数学を習う目的が日々の生活で使う統計学をより理解するためだという風に教わったら彼らの数学へのモチベーションも変わるかもしれない

ただ、彼が考慮していない点が一つある。それは教え方だ。僕は統計学のクラスを取っているが実際ここで習うことをどうやって実生活に役立たせればいいのかが全く分からない

理論を先に教えるのではなく、実生活のサンプルを例にしそこで使われている理論を紹介する。知識は体系的ではなくなるが、どのように知識を役立てるかは確実に定着する。なにより、実生活で役立つと分かれば生徒のモチベーションは上がるはずである

習った知識は最後の2週間くらいで体系的にまとめればいいのではないだろうか?
きっと生徒もあーこれはあのように使われてたなと体験が知識になり、知識が定着するのではないだろうか?

などと思った。

Tuesday, March 5, 2013

ソーシャル目覚ましとは

タイトルにしておいてなんも説明していなかったので、ここで説明します

<ソーシャル目覚まし>
新井康平が2013年の1月ごろにアラームで起きた時に「そういや、アラームて毎日同じだな、毎日変わったら面白いんじゃない?それがきっかけで会話が生まれると面白いかも!!!」みたいな形でスタートしました。

基本コンセプトは「目覚まし+ソーシャル」です。
アプリに登録したアラームを交換した人とアプリ上でメッセージのやり取りができます。

「マッチングする相手」+「マッチングする頻度」の2つの項目を変えることで、ソーシャル目覚ましといったカテゴリの中で複数のアプリが存在します。

イメージ図は以下の写真です


*この紙はマウス置きとしても使ってたのですこししわが寄ってます。
*番号はアプリを作っていく順番です。
1.5というのは、毎日マッチングで会話が余り生まれないのか、音楽の要素は落ちるけど長く会話する方を好むかを実験します

以上が作ろうとしているソーシャル目覚ましの説明でした~(^^)/

Monday, March 4, 2013

centosでネットインストーラーのFTP setup

centosをネットインストールしたいときにFTP setupで困る人は多いと思います。
この画面です

この方のサイトが大変参考になったので、後で忘れたときのために残しておきます。


結論から言うと、こう打ち込んでください


もしこれでうまくいかなかったら、backボタンをおしftpからhttpへ変更するとうまく行きますよ(^^)
ちなみに僕は10分くらいでインストールが終わりました

Sunday, March 3, 2013

FMDBが動かないのでwishscopeでヘルプ!

FMDBが動かなくて途方に暮れていたので、wishscopeにデータベース関連について教えてくれる方募集というお願いをしました。
http://www.wishscope.com/wish/24040

以下がFMDBが本当に動かないんだよてことを紹介する動画です。
進捗状況なので一応ブログに残しておきます


<追記1>
コメントしていただいた方にSQLiteからデータベースについて詳しく教えてただきました!そこで今はphpとMySQLを走らせるためにローカル環境を構築しているところです。

何せ詳しくないので、ドットインストールのローカル環境構築の動画を丸パクリです。
centosのインストールで3時間くらいかかりそうな勢いです。ま、しょうがないと思いあきらめます

<追記2>
結局virtual boxを使ってのデータベースを取り扱う方法がわからなかったです。個人的にsql文をターミナルから書くのが好きなので残念です(´・ω・`)
本当に残念です

おとなしくxamppをダウンロードしました。
ダウンロードしてすぐに使えるこの気軽さはいいのですが、最初のサーバー体験がvirtual boxを立ち上げ、ターミナルからsql文を投げ、cyberduckから確認するというものだったので、やっぱりそっちの方が好みです

知識がないものはおとなしく簡単に使えるものを使いましょう。。。
といってもこの気軽さはいいですね(^^)

Friday, March 1, 2013

tableviewcellが重ならなくなりました

何が起きてるかというとテキストをクリックして高さを変えた時に、

   -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

}

この記事の”UITableViewは、表示に困らない最低限のセルしか作らない。”
この文章から推測されるにUITableViewは、読み込み時に一気にすべてのセルを作成してviewを完成させるのではなく、新しく表示するものをその都度作って表示させるようですね。
そして、すでに表示したセルに関しては以前のviewを引き継いで表示させてます

前のセルが使いまわされているのかな?

調べたところ前のセルが使いまわされていることが原因でした。
とりあえずの解決策として、新しく生成されたセルのsubviewを取り除く以下のコードを書いて良しとしました。


    for(UIView *subview in [cell.contentView subviews]){
        [subview removeFromSuperview];
    }

参考にしたのはこちらです。
ただ、これだと高速でスクロールしたときに表示が重くなるかもしれないので、一応高速化の紹介をしているリンクも貼っておきます

http://blog.v-republic.jp/?p=101
http://blog.natsuapps.com/2010/10/ios-tableview_6774.html
http://iphone-dev.g.hatena.ne.jp/paella/comment?date=20090723

以下の動画はちゃんと重ならないで表示されるようになったよという報告です 笑



次はデータベースですね!
ドットインストールで勉強してきます!

Thursday, February 28, 2013

UILabelをコードで作成+NSTimer

UIViewの代表的なUILabelをプログラムから作成する方法と、タイマー処理を行うのに必要なNSTimerを紹介します

いつものように動画の後に、説明があります



<ViewController.mファイル>
1. まず最初に以下のコードでUILabelを作成します

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 300, 300, 30)];
    label.text = @"sample sentence";
    label.backgroundColor = [UIColor greenColor];
    label.font = [UIFont systemFontOfSize:17];
    label.numberOfLines = 3;
CGRectについてはこちら->CGRectのリファレンス(日本語です)
UILabelについてはこちら->UILabelのリファレンス(日本語です。紹介しきれなかったプロパティも載ってます)

2. 作成したUILabelをviewに以下のプログラムで追加します
[self.view addSubview: label];

これでUIViewにはプログラムで作成したUILabelが追加されました。
次はタイマー処理です

<タイマー処理>

タイマー処理は簡単で、以下のコードを加えるだけです
NSTimerについてはこちら->NSTimerのリファレンス(日本語です)

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(showLabel:) userInfo:nil repeats:YES];

これだけで、指定した時間ごと、もしくは指定した時間後にselectorで指定したメソッドを実行してくれます

以上がプログラムからUILabelを追加する方法とNSTimerの紹介でした