FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CakePHPのconditionsでSubqueryの結果をINで使う

CakePHPのconditionsは=>をいれないとそのままSQLのWhere句にわたるみたいですね。
そこで、
$this->ModelXX->find('all', array('conditions' => array(ModelXX.YY IN (SELECT YY FROM ZZ WHERE xxxx)'));
のようなことをかくと
ModelXX.YY IN (SELECT YY FROM ZZ WHERE xxxx)
がそのままWHERE句に入ってくれるみたいですね。
スポンサーサイト

ドコモオンラインショップのSPRING BARGAIN

ドコモオンラインショップがSPRING BARGAINやっていて、
旧機種のスマホが3150円といった具合に非常に安いので、人気になっているのですが
当然欲しい人気機種はすぐなくなってしまいます。
また、フライングで発売されたりキャンセル待ちとかあるようなので、
頻繁にチェックしてみたいところですが、なかなかそうは行きません。
そこでスクリプトで監視しようとしたのですが、各機種のページは
HTMLファイルの中に、在庫ありなしが書いてあるわけでなく
たくさんのJavascript,XML,JSONファイルをよんで動的に処理しているようです。
そこでちょっと見ていたら、とあるJSONファイルのとある項目の数値が1のときは在庫があって
3のときは在庫がないというパターンがあったので、これを使えばチェックできるかもしれません。

$json = file_get_contents('ttps://www.mydocomooo.com/dcm/dfw/onlineshop/pc**************');
$obj = json_decode($json, true);
$n = obj[xxx][yyy][zzz];

こんな感じで受け取って$n==1ならsendmailとかでメール投げればいいですね。
そしてこれをcronで適当な間隔で呼んでみればいいわけです。
まあ、この仮説が本当に正しければですが。。


JSONのクロスドメイン通信

javascriptのgetJSON()を使って異なるドメイン間でデータの受け渡しをしようとしたのですが
そのままではできません。
これを解決するためには、
CORS (Cross-Origin Resource Sharing)という機能を利用することになります。

サーバ側はレスポンスヘッダに "Access-Control-Allow-Origin" というヘッダを加える。
このヘッダに許可するアクセス元を記述する。
クライアント側は "Access-Control-Allow-Origin" の情報を参照して、
受け取った情報(レスポンスボディ)が本当に受け取って(参照して)いいものかどうかを判断する。


phpだと

$array = array();
データ作成
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
echo json_encode( $array );

という感じですね。

header('Access-Control-Allow-Origin: *');
を加えてやってみたところ、クロスドメインでgetJSON()ができるようになりました。

MFCのCDialogでENTERキーで閉じるのを防ぐ方法

MFCのCDialogでENTERキーで閉じるのを防ぐ方法です。
(備忘録です)

CDialogのPreTranslateMessage()を処理してVK_RETURNの場合にCDialogの処理が行われないように
FALSEを返せばいいです。


BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if( WM_KEYDOWN == pMsg->message ) {
switch( pMsg->wParam ) {
case VK_RETURN:
return FALSE;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}



ESCキーを無視したいときは、case VK_ESCAPEを入れればいいです。
もっと他のいい方法があったような気がしますが、
とりあえずこれで動きました。

MFCのListCtrlをソートする方法

MFCのListCtrlをソートする方法の備忘録です

まず、listにInsertItemをする際にSetItemData()でそのリストItemに関連するデータを設定します。
これは、ソートのCompareの際に、どのItemをCompareするのかを特定するための情報です。
例えば、Itemのデータを保持するエリアのポインタとか、配列のインデックス等です。

次にソートのCompare関数をstaticで定義します。
これはqsortのcompareと同じように、2つのItemをCompareして、どちらが前に来るかを返します。
(マイナスを返すCompareのと最初のItemが前で、プラスを返すと2番目のItemが前になります)

そして、このCompareを使って

CListCtrl.SortItem()を呼ぶことによって、ListCtrlの中のリストがソートされます。
このとき、選択されている行があれば、その行が移動した場合に、移動先の行が選択された状態になっています。

また、リストの見出し部分をクリックしてソートしたい場合が多いのですが、
その場合はLVN_COLUMNCLICKイベントをフックして



void CMyDlg::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

index = pNMListView->iSubItem;


のようにして、クリックしたカラムを調べることができます。

また、見出し部分に▲のマークを出すには
CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
で取得されるヘッダの該当するカラムの属性として以下のようにHDF_SORTUPやHDF_SORTDOWNを設定すればいいようですが


CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
HDITEM hdrItem;
hdrItem.mask = HDI_FORMAT;
pHeader->GetItem(index, &hdrItem);
hdrItem.fmt |= HDF_SORTUP;
pHeader->SetItem(index, &hdrItem);

のようにすればいいようですが、VC++6.0の場合は、新しいcomctl32.dllを知らせるために
xmlのmanifestを登録しないといけないようなので、ややこしいです。

プロフィール

chattera.net

Author:chattera.net
フリーでソフト開発の仕事をしています。
自作したこのチャットシステムは、何か世の中に役に立つこともあるかと思いますので、お呼びがかかるとうれしいですね。

連絡先は chatteranet@gmail.com です。

また、ソフト開発関連のお誘いもうけたまわっております。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。