技術情報の最近のブログ記事

お世話になっています。
プログラマの竹内です。

CakePHP の便利な機能で、モデルの「アソシエーション」機能があります。
関連付けた複数テーブルのデータを一度に取得できる機能です。

今回はこのアソシエーションの1つ、「hasAndBelongsToMany」なモデルデータを、ページ分割してデータ取得してくれる「paginate」メソッドで使うことができないかなあ?というお話。


1. hasAndBelongsToMany とは

例えば、以下のようなテーブルが3つあり、

ユーザーにタグをつけて検索したいという場合。


●users テーブル

 id    name

●users_tags テーブル

 id    user_id    tag_id

●tags テーブル

 id    name


モデルには以下のように記述します。

     var $hasAndBelongsToMany = array(
        'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'users_tags',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'tag_id',
        )
    );


2. paginate で取得するには

find と同様に、モデルのデータを取得してくる paginate ですが、表面的に同じような使い方をすると期待する結果が取得できない場合があります。


通常テーブルのデータ(例えば、ユーザー名を取得する)なら

$this->paginate('User', array('User.name'=>'ひろし'));

などという感じで取得することができます。


しかし、hasAndBelongsToMany のデータを取得する場合、

例えばタグで検索しようとして

$this->paginate('User', array('UsersTag.tag_id'=>1));

などとやっても、このままでは取得することができません。


3. paginate メソッドでモデル結合する。

しょうがないので、検索のSQLでデータを結合して取得してくるようにします。


コントローラー冒頭の宣言で

    var $paginate = array('User' =>
                array(
                    'conditions'=>array(
                        'User.del_flag'=>false
                    ),
                    'limit'=>10,
                    'order'=>array(
                        'User.id'=>'asc'
                    ),
                    'joins'=>array(
                        array('type'=>'LEFT', 'alias'=>'UsersTag', 'table'=>'users_tags',
                            'conditions'=>'User.id = UsersTag.user_id')
                    )
                )
        );

と記述します。


これで、

$this->paginate('User', array('UsersTag.tag_id'=>1));

のような方法によるデータの取得が可能になりました。       


後記

だいぶ遠回りしていますが、CakePHP の機能でまだまだ不備のある点がよくわかって面白いです。

P.S. bindModel を使う手もありそうですが、恒久的なデータの取得に向かなさそうなので避けました。


Android多言語対応スクリプト

こんにちわ高崎です。
androidで多言語対応のソフトを作る場合
いちいちvalues_jaなどにxmlファイルを入れなければなりません。

それで作ったのが以下のperlスクリプト


# /bin/perl

$header='<?xml version="1.0" encoding="utf-8"?>'."\n".'<resources>'."\n";
$footer='</resources>';

open (IN, 'langage.csv');
@data = <IN>;
close (IN);

@firstline=split(/\,/,$data[0]);

for($k=1;$k<@data;$k++){
    @line=split(/\,/,$data[$k]);
    
    if(!-d $line[0]){mkdir $line[0];}
   
    $output=$header;
    for($i=1;$i<@firstline;$i++){
        $output.='<string name="'.$firstline[$i].'">'.$line[$i]."</string>\n";
    }
    $output.=$footer;
   
    open(OUT, ">/".$line[0]."/strings.xml");
    print OUT $output;
    close(OUT);
}

exit;


やりかたとしてはlangage.csvに

フォルダ名,項目1,項目2
values_ja,項目1の値,項目2の値
values_en,one_val,two_val

みたいなCSVを作ればOK。

すでに多言語アプリケーションを作ってる人は
似たようなことをやっていると思いますが・・・。


こんにちわ。高崎です。

DBを触る時postgres用のツールがあまりないため
webサーバーから簡単に操作できるDBツールをちょこちょこと作っていました。
githubにて公開したので、ぜひ使ってみてください。

https://github.com/tkk-space/webquery

まだまだバグも多いのですが、フィードバックなどがあれば反映していきます。
ファイル数も少なく、わりと簡単なコードでできているので
webアプリケーションを作っている人には、カスタマイズして使うのにも向いていると思います。

以下、簡単な導入方法。

環境:apache、PHP5(pdo)
ブラウザ:モダンブラウザ推奨


githubにアクセスしzipボタンを押してダウンロード

1.png


apacheにダウンロードしたファイルをフォルダごと入れてください。

アクセスすると、以下のような画面になると思います

2.png

3.png
接続リストに入れてセレクトボックスで接続先を選択すると、DB一覧に表示されます、DBを選択するとテーブル名が表示されるといった感じで、わりとスピード感がある操作が可能になっています。

是非試してね。

jQuery セレクタ

只今jQuery勉強中の松本です。
今回はjQueryの「セレクタ」について書きます。
あくまで勉強し始めの備忘録ということで、かなり初歩的なことしか書いてませんのであしからず。


classが「matsumoto」で、valueが「100」のinputタグ
 $("input[class='matsumoto'][value='100']")

idが「matsumoto」のヤツの直下のtd全て
 $('#matsumoto > td')
  ※あくまで「直下」。孫はダメです。

以下、クリックされたヤツを $(this) として...
クリックされたヤツが属するtr(=tableの行)
 $(this).parents("tr")

クリックされたヤツの子孫の内、クラスがmatsumotoのヤツ
 $(this).find(".matsumoto")
  ※孫もOK。

クリックされたヤツの子孫の内、クラスがmatsumotoで、かつチェックが入ってるヤツ
 $(this).find(".matsumoto:checked")
  または
 $(this).find(".matsumoto").filter(":checked")
  ※孫もOK。


最後の例は、全く別の書き方をしているのに同じヤツを参照しています。
同じヤツにアクセスするのにも、書き方によっては冗長になってしまったり簡潔になってしまったりするということです。
私の場合セレクタを簡潔に書けると気持ち良かったりするのですが皆さんはいかがですか?

フリーソフト紹介 enthumble

はじめまして
プログラマのtskです。

みなさんはキーボードについている無変換キーを使ってるでしょうか?
僕はこのキーを押したらどうなるのかもよく知りません。

で、この無変換キーをメタキーにさせるソフトというのがenthumbleです

ここでダウンロードできます。

結構便利に使ってます。
んで、僕の設定の一部を公開します。


Q={Alt down}{F4}{Alt up}
W={}
E={}
R={F5}
T={shift down}{ctrl down}{t}{ctrl up}{shift up}
Y={HOME}{shift down}{END}{shift up}{ctrl down}{c}{ctrl up}{HOME}
U={home}
I={end}
O={PgUp}
P={PgDn}
@={}
LB={}
A={}
S={}
D={HOME}{shift down}{END}{shift up}{ctrl down}{x}{ctrl up}{HOME}
F={}
G={}
H={left}
J={down}
K={up}
L={right}
Semicolon={Backspace}
:={Delete}
RB={}
Z={}
X={ctrl down}{t}{ctrl up}{x}
C={ctrl down}{t}{ctrl up}{c}
V={}
B={shift down}{F3}{shift up}
N={F3}
M={}
,={shift down}{Tab}{shift up}
.={Tab}
/={ctrl down}{shift Down}{Tab}{shift Up}{ctrl up}
Backslash={ctrl down}{Tab}{ctrl up}

見たらわかると思いますが、全体的にviを意識しています。

u,i、セミコロン、コロンなどがお気に入りですね。

また、僕はトラックポイントを使っているため、

LButton={Alt down}{left}{Alt up}
MButton={Backspace}
RButton={Alt down}{right}{Alt up}

このようなカスタマイズなどもしています。無変換キー+左クリックで戻れるってわけです。

キーバインドソフトはautohotkeyなどのソフトが有名ですが、なかなか敷居が高いイメージで
あまり使ったことがありませんでした。

このソフトのように機能を減らして使う気にさせるというのは、
なかなかいいアイデアだと思います。

1  2