makoラボ

日常や勉強会や技術ネタ

ORマッパーを使う時に気にしていること

ふと、自分がORマッパーを使う時に何を気にするだろう?と思う事があったので、まとめてみました。

ちなみに、ORマッパー否定派ではありません。効果的に使えば全然いいと思いますし、むしろ好きな方です。

気にしていること

出力されるSQL

自分が意図した通りに出力されているかどうかが気になります。確かにORマッパーの自動生成は楽ちんですが、どんな感じに生成されるのかは最低限知っとかないとなと思ったりしてます。

SQLの実行タイミング

いつ実行されるの?今なの?ってのが気になります。どのメソッドを実行するとSQLが発行されてデータベースにアクセスされるのかは分かっとかないとなと思ったりします。

データベースアクセス

無駄にSQLを発行してないか?とかデータベースへのアクセスが無駄に発生してないかが気になります。上の2つに絡む事ですが気にしとかないとなと思うところです。

トランザクションの範囲

どこからどこまでがトランザクションの範囲なの?ってのが気になります。まぁちゃんとメソッドとか調べとけよって事ですが。。。

ロックはどうなってる?

テーブルロック、レコードロック、どの単位?ロックがかかってる?ロックの状態が気になります。更新系もそうですが、SELECTするだけでロックがかかるデータベースもあるので注意です。

まとめ

ばーっと思いついたものを書きなぐってみました。ORマッパーを使うにしてもSQLやデータベースの事を気にしようよと思います。知っとくと処理速度が向上したり、今の処理の問題点が出てきたりするんじゃなかろうかと思います。

みなさんはORマッパーを使う時にどこを気にしてますか?

今年度ももう終わりですね

今年度も今日も終わりですね。 なのでちょっと振り返ってみようと思います。

今年度はじめ

今年度のはじめあたりはOSOで副委員長やったり、クックパッドの24時間コンテストに応募したり色々やりましたね。クックパッドの24時間コンテストは残念ながら入賞出来ませんでしたが、次回は何かしらの賞がもらえるように頑張りたいところです。ちなみに応募作品はこちら

今年度中盤

今年度中盤はデスマなプロジェクトとに突っ込まれててんやわんやしてました。TDDBCに参加できたのはホント奇跡な気がする。

今年度後半

1月にクレオフーガに転職しました。転職してからの3ヶ月間はあっという間だった気がする。iPhoneアプリ作ったり、WordPressやったり、Railsやったり、東京合宿行ったりとめまぐるしく過ぎていった気がします。

そんなこんなで怒涛の1年だった気がしますが、おかげで色々と充実してた一年だったのかもしれません。明日から新年度ですが、OSOの実行委員長もありますし、今年度よりもより一層何かしらありそうな予感もしてたり。また来年振り返っていい一年だったと思えるような1年にしていきたいなと思います。

広島・岡山Ruby交流会01に参加して来た

以前にこのブログで紹介した、広島・岡山Ruby交流会01に参加してきました。

今回の勉強会のテーマは「技術者の交流」ということで、自己紹介をいつもより長めにしようという試みをしてみました。

各自のやってること、今困ってること、会社のことなどを話してもらって、気になったことなどをみんなが質問する形式で自己紹介をやってみました。

結果、自己紹介が思った以上に盛り上がって午前中の2時間で収まらず、まさかの昼休憩を挟んでしまうという展開にw普段、みんながどんな事をしてるのかなんかが色々と聞けてよかったんじゃないかなと思います。

その後は、hirosima.rb本体と噂のひむひむ氏のセッションがあったり。みんなでそれに対して話をしたりしてました。(ひむひむ氏のセッション内容はこちら)

全体を振り返ってみて、テーマの「技術者の交流」とい目的は果たせたかなと思います。ただちょっと自己紹介が長すぎた気もするので次回はもう少し調整した方がいいかなと思ったりしてます。

次はみんなで温泉という噂があったりなかったり

the_dateとget_the_dateの違い

WordPressでトップページ等で記事の一覧を表示したい場合があって、その場合日付を見出しに持ってきたりすると思います。

そんな時、同じ日付に投稿された記事がある場合に見出しに日付が表示されない現象が起きてしまいました。

日記:2014/03/26
お好み焼きを作ってみた
お知らせ:2014/03/23
誕生日でした
日記:
◯◯に行って来ました

原因は『the_date』

上のように表示されてしまった時のソースは以下のような感じでした。

<dl>
<?php 
  // 日付降順で最新3件を取得する
  $args = array( 'posts_per_page' => 3, 'order'=> 'DESC', 'orderby' => 'date' );
  $postslist = get_posts( $args );

  foreach ( $postslist as $post ) :
  setup_postdata( $post ); ?>

    <dt><?php the_date('Y/m/d', '', '', true); ?></dt>
    <dd><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dd>

<?php
endforeach; 
wp_reset_postdata();
?>
</dl>

見出しにしようしている日付の所でthe_dateを使用していたのですがそれが問題でした。 the_dateは1日に複数記事の投稿があった場合、最新の投稿だけに投稿日時を出力する。とのことなので最初の1件しか表示されないです。

全部表示したいなら『get_the_date』

<dl>
<?php 
  $args = array( 'posts_per_page' => 3, 'order'=> 'DESC', 'orderby' => 'date' );
  $postslist = get_posts( $args );

  foreach ( $postslist as $post ) :
  setup_postdata( $post ); ?>

    <dt><?php echo get_the_date('Y/m/d', '', '', true); ?></dt>
    <dd><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dd>

<?php
endforeach; 
wp_reset_postdata();
?>
</dl>

全てに日付を表示したい場合はget_the_dateを使うの良いようです。こちらだと『すべての投稿記事に投稿日時を表示する』なので投稿日時が全件表示されます。

おわり

『the_date』『get_the_date』の違いでハマってしまいました。また困ったときのためにメモ。

選択されているUITableViewのセルにチェックマークをつける

f:id:mako_wis:20140307110219p:plain

上の画像のようにUITableViewを使って選択肢を表示するようなUIを使うことって案外あるんですよね。 その時にはほぼ必ずチェックした事を示すためにチェックマークを付けると思います。

今回は選択されているUITableViewのセルにチェックマークをつける方法を書いていきます。

UITableView内で保持している選択状態に応じてチェックマークをつけていきます。配列とかに選択状態とか持たせた方がええんじゃね?とか意見があるような気がしますが今回はあくまでUITableViewの機能を利用しての方法で進めていきます。

ちなみに以前書いたUITableViewのセルを選択した時にチェックマークをつける方法はこちら

選択されているセルにチェックマークをつける

今回はcellForRowAtIndexPath内で選択されているセルに対してチェックマークをつけます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    cell.textLabel.text = @"hogehoge";

    // 一旦チェックマークを外す
    cell.accessoryType = UITableViewCellAccessoryNone;    

    // UITableViewから選択済みのインデックスを取り出す
    for (NSIndexPath *selectedindex in [tableView indexPathsForSelectedRows]) {
        // 選択済みかどうかチェック
        NSComparisonResult result = [selectedindex compare:indexpath];
        if (result == NSOrderedSame) {
           // 選択済みであればチェックマークを付ける
           cell.accessoryType = UITableViewCellAccessoryCheckmark;
           break;
        }
    }
    
    return cell;
}

対象のUITableViewの中から選択済みのインデックスを全件取得して、現在表示しようとしているセルのインデックスと比較して選択済みであればAccessoryでチェックマークをつけています。

UITableView自体に対象のインデックスが選択済みかどうかのメソッドくらいあっても良さそうなのですが、残念ながらなさそうなので泥臭い事をしてしまってます。

今回は説明のためにcellForRowAtIndexPath内にインデックスのチェック処理を書いちゃってますが、UITableViewにカテゴリでチェック処理メソッドを追加しとくもの良いかと思います。

@implementation UITableView (hoge)

- (BOOL)isSelectedIndexpath:(NSIndexPath *)indexpath {
    for (NSIndexPath *selectedindex in [self indexPathsForSelectedRows]) {
        NSComparisonResult result = [selectedindex compare:indexpath];
        if (result == NSOrderedSame) {
            // 選択済みであればtrue
            return true;
        }
    }
    // 未選択であればfalse
    return false;
}
@end

おわり

選択されているUITableViewのセルにチェックマークをつける方法を書いてみました。以前書いた選択した時にチェックマークをつける方法と合わせ技で選択状態を配列等に入れて保持しなくてもチェックマークを表示する事ができると思います。

表示する度にグルグルと処理を回してるので件数が多い場合とかはチェック状態の保持を考えたほうが良さそうですね。

そもそもデフォルトでチェックマークをチェック状態の表示で使えないのはどうなんでしょうかねえ・・・そこがハイライトから切り替えられればこんなことしなくて良いのに・・・

git commit時にコメントをSublime Textで書きたい

git commitをした時にSublime Textでコメントを書きたかったので、設定してみたものの動か無かったりしたのでハマった所のメモ。

sublコマンドの登録

公式にそれぞれやり方が書いてあるので参考に登録。

Sublime Text 3

http://www.sublimetext.com/docs/3/osx_command_line.html

ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ~/bin/subl

Sublime Text 2

http://www.sublimetext.com/docs/2/osx_command_line.html

ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl

gitのコミット時のエディタをsublにする

gitの設定を変更します。

git config --global core.editor "subl -w"

なぜかコミット出来ない

これでだいたいのブログとかで書かれている手順は終了なのですがなぜか自分の環境では以下のエラーが出てコミット出来ない・・・

subl -w: subl: command not found
error: There was a problem with the editor 'subl -w'.
Please supply the message using either -m or -F option.

コマンドが見つからない?ちゃんと設定しているはずなのに・・・ と困っていて調べてみると以下の記事が出てきました。 http://stackoverflow.com/questions/10892368/problems-using-subl-command-in-terminal-command-not-found-no-such-file-or どうやらrvm関連でそっちにもシンボリックリンクを貼っておかないとダメみたい。

rvmのbinにsublコマンドを登録

ということなのでrvm配下のbinにシンボリックリンクを貼ります。

ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ~/.rvm/bin/subl

これで無事コミットできるようになりました。

UISearchBarが空の状態でも検索ボタンを有効にする

f:id:mako_wis:20140309195642p:plain

UISearchBarはデフォルトの設定では、入力が空の状態ではキーボードの検索ボタンが無効になってしまいます。 でも、入力が空の状態でもキーボードの検索ボタンを有効にしたい場合があると思います。

今回はコード側で設定する方法について書いていこうと思います。

実装方法

UISearchBarに検索ボタンの有効・無効の設定項目は無く、UISearchBarの中にあるUITextFieldに設定があります。ですのでまずはUISearchBarの中のUITextFieldを取得する必要があります。

その後、取得したUITextFieldに対して検索ボタンの有効・無効の切り替えプロパティの設定を行います。

以下に順番に実装方法を書いていきます。

UISearchBarの中のUITextFieldの取得

// UISearchBar内のUITextFieldを取得する
- (UITextField *)getTextFieldFromView:(UIView *)view {
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            return (UITextField *)subview;
        } else {
            UITextField *textField = [self getTextFieldFromView:subview];
            if (textField) {
                return textField;
            }
        }
    }
    return nil;
}

上記のメソッドの引数にUISearchBarを渡して、UITextFieldを取得します。再帰構造にしているのはUISarchBarの直下のSubViewより深い階層にUITextFieldが設定されているためです。

プロパティの設定

// UISeachBar(self.searchBar)の検索ボタンを常に有効にする
[self getTextFieldFromView:self.searchBar].enablesReturnKeyAutomatically = NO;

上記のように取得したUITextFieldのリターンキーの自動有効・無効設定を切りに指定します。

おわり

ほんとはStoryboard上の設定ですべてを終わらせたいのですが、無いようなので今回のようなコード側での実装を行っています(あるよお前の目は節穴か!とい場合は是非教えて下さい。)

また、iOS6以前だとUISearchBar直下のSubViewの階層にUITextFieldがあったようなのですが、iOS7からは更に深い階層に潜っているようです。。。やっぱりStoryboardで設定したい。。。そもそもそういう使い方が良くないのかな。