2008-09-17

GQLのWHERE条件にINを使うときの注意点

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
GQLのWHERE条件にINを使うときに配列を渡すわけですが、その配列に要素が一つもないとどうもその条件がまったく聞いていない気配。

search_list = []
aaa = db.GqlQuery("SELECT * FROM AAA WHERE colcolIN :list",list = search_list)

aaa = db.GqlQuery("SELECT * FROM AAA")
と同じことになっている気配。
個人的には、ひっかかるものが何もないという感じで返してくれる方がうれしかったのですが。

なのでこの動作だとちょっとイヤだなと思う人は、
事前に渡す配列の要素数が0であることをチェックする
か、
絶対にひっかからないダミーの要素を一個入れておく
などする必要がありそうです。

2008-09-16

SOBARCOを作る時に参考にしたサイト

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
参考にしたサイトをメモ

Google App Engineのドキュメント
http://code.google.com/appengine/docs/
http://groups.google.co.jp/group/google-app-engine-japan

Pythonのドキュメント
http://www.python.jp/doc/release/index.html

iアプリのドキュメント
http://www.ep.u-tokai.ac.jp/~nakazato/API/504i/base/jguide504_apiref020517/javadoc/overview-summary.html

jQueryのドキュメント
http://www.openspc2.org/JavaScript/Ajax/jQuery_study/ver1.2.6/index.html

エンジニアのためのWebデザイン教室
http://itpro.nikkeibp.co.jp/article/COLUMN/20080214/293856/

WebプログラマのためのHTMLデザイン(その2)
http://fromnorth.blogspot.com/2008/08/webhtml2.html

HTMLタグ・CSS・JavaScript - Web制作のインデックスサイト
http://www.tagindex.com/index.html

Dynamic Drive CSS Library
http://www.dynamicdrive.com/style/

アイコン集
http://speckyboy.com/2008/07/28/96-best-ever-free-icon-sets-for-web-designers-developers-and-bloggers/

モバイルサイトをPCで見るためのツールやFirefoxアドオン
http://blog.livedoor.jp/ld_directors/archives/51079649.html

Firefoxでモバイル端末をシミュレートするアドオン「FireMobileSimulator」
http://ke-tai.org/blog/2008/09/04/firemobilesimlator/

iアプリでバーコードを読む

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iアプリでバーコードやQRコードを読むのは結構簡単なのです。

前にどっかで検索して調べたはずなのですが見つからなかったので書いておきます。
以下のような感じです。
と思ったら、過去に見たものよりも別のもっとよいページがありました。
http://www.geocities.jp/inu_poti/makeiapp/tuika/codeReader.htm


CodeReader cr;
cr = CodeReader.getCodeReader(0);
boolean use_auto = false;
int can_use_codes[];
can_use_codes=cr.getAvailableCodes();
int i=0;
while(true){
try{
int use_code=can_use_codes[i];
if(use_code==CodeReader.CODE_AUTO) use_auto=true;
i++;
}catch(Exception e){
break;
}
}
if(use_auto) {
cr.setCode(CodeReader.CODE_AUTO);
} else {
cr.setCode(CodeReader.CODE_QR);
}
try {
cr.read();
}catch(InterruptedOperationException e){
}
//読み取った値を取得
String read_code = cr.getString();
//その他付加情報(あんまり使い道なし)
int code = cr.getResultCode();
int type = cr.getResultType();

CODE_AUTOは機種によっては問題があるようです。
なので利用できるかどうかをきちんとチェックした方がよさげです。
あと、ドコモのマニュアルを見るとCODE_OCR(テキスト認識)というコード種別もセットできるようなのでひょっとしたら機種によってはOCR機能を利用できる可能性もあります。

2008-09-12

SOBARCOというのを作ってみました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
SOBARCOというものを作ってみました。
携帯でバーコードを読み取って公開するものです。

このブログで書いていたのは、このSOBARCOを作るために調べたもののメモです。

蔵書管理に使うこともできると思いますし、バーコードを利用した一言ブログとしても利用できると思っています。

もしよろしければ使ってみてください。
今後いろいろ改良を加えてみたいと思っています。
よろしくお願いします。

Google app engineのmemcacheの期限の上限

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google app engineでmemcacheを利用しているのですが、キャッシュ期限を
expire = 60*60*24*30
と30日のつもりで設定していてローカル環境ではうまく動いていたのですが、本番にアップしたらこの期限は駄目でした。
expire = 60*60*24*29
にしたら問題なく動きました。
マニュアルには、
up to 1 month
と書いてあったので、1ヵ月間ということで30日いけるだろうと思ったのです・・・
なので上限は、上記二つの間にあるはずです。

2008-09-05

モーダルダイアログなフォームを作る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
正式にはなんていうのかわからないのですが、更新作業などをする時にページ遷移をせずに現在のページが暗くなって、その上にモーダルダイアログな感じのフォームが出てくる感じのことをやりたいわけです。
こういうものは、どうもLightbox風と呼ばれているような気配もします。

実際にやるには、jQueryと組み合わせるならば
ThickboxというjQueryのプラグインを使うといいようです。

実際にフォームを表示させるには、
<a class="thickbox" title="Update" href="http://www.blogger.com/update?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=400&width=600&modal=true"> Update </a>
みたいな感じで普通にリンクに書いてclassにthickboxと書けばよいようです。

こうすると開きたいたいフォーム(この場合はupdate)をiframeで開いてくれます。
?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=400&width=600&modal=true
の部分を実際に表示させたいurlにつけるのがポイントです。

そして開いたiframe内でiframeを閉じたいときには
<input onclick="self.parent.tb_remove();" type="button" value="閉じる">
って感じに普通にフォーム内に書いておけば閉じてくれます。
&modal=true
をつけておかないとこの機能は使えないようです。
&modal=true
がなければ、Thinkboxの方で閉じるボタンをつけてくれます。

更新作業などが終わって、iframeでのフォームを閉じる時に元の画面の情報を更新したい時には、以下のような感じのボタンを用意することで対応できました。
<input onclick="self.parent.location.reload();" type="button" value="閉じる">

同じようなものをやるものとして、
jqModalというのもあるらしいです。こちらの方がサイズが小さいけど高機能らしいです。

2008-09-04

IEでjQueryを利用してxmlをパース

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
サーバからxmlを受け取るajaxアプリを最近firefoxで確認しながら作っていたのですが、ふとIEで見てみたらxmlのパースがうまく出来ていないことが判明しました。

どうもIEでは、明示的にヘッダーに
Content-Typeにtext/xml; charset=utf-8としてあげないとだめみたいです。

なので、google app engineでxmlを返す際には
きちんと以下のような感じでヘッダーを指定しないといけないようです。
self.response.headers["Content-Type"] = "text/xml; charset=utf-8"
self.response.out.write(template.render(path, template_values))

ちなみにクライアント側のコードは以下のような感じです。

function hogehoge(val) {
if (!confirm('よろしいですか?')) {
return;
}
$.ajax({
url: '/hogehoge/hoge?key=' + val,
type: 'GET',
error: cant_connect,
success: get_xml_message
});
}

function cant_connect() {
alert('サーバーと接続できませんでした');
}

function get_xml_message(xml) {
var message;
$(xml).find('message').each(function(){
message = $(this).text();
});
alert(message);
}



ちなみにIEでは、きちんとheaderでContent-Typeを指定してないと
$(xml).find('message').each(function(){
の部分がうまく動いてくれないのでした。

2008-08-24

pythonで文字列の中に携帯の絵文字が含まれているかどうかを確認する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
pythonで文字列の中に絵文字が含まれるかどうかを確認しようとして以下のような関数を作ってみました。
とりあえず、受け取るフォームはutf-8で作られているとしています。

def include_emoji(str):
'''指定文字列内に絵文字が含まれるかどうかを確認する

  引数
str String チェック対象文字列(utf-8)
  戻り値
Boolean'''
if str is None:
return False
try:
dummy = unicode(str,'utf-8').encode('euc_jp')
except UnicodeEncodeError,UnicodeDecodeError:
return True
return False

本当にこんなんでいいのかどうかよくわからないけど、簡易的に試した限りはうまくいく気配。
でも、本当は携帯の絵文字をキャリア毎に変換することをやりたいと思ったのですが、pythonでのやり方がわからず挫折。
perlやPHPでは変換モジュールみたいのがあるのですが、pythonでは見つからず。。。
作り直すには技術が足らず。。。

cssでドロップダウンメニュー

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
とりあえず、

http://www.dynamicdrive.com/style/csslibrary/item/inverted-shift-down-menu/
http://blog.faro.main.jp/?eid=369489
にお世話になりドロップダウンメニューを作ってみました。

こんな感じ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--ここからCSS-->
<style type="text/css">
body {
margin: 0; /*ブラウザデフォルトの空白を除去*/
}

.menu {
position: absolute;
top: 100px;
width: 100%;
padding: 0;
border-top: 5px solid #D00;
font: bold 12px Arial;
}

.menu_list {
margin:0;
margin-left: 40px; /*メニューの横の隙間*/
}

.menu dl {
margin:0;
padding: 0;
float: left;
}

.menu dt {
margin: 0 2px 0 0; /*メニュー間の隙間*/
}

.menu dd {
display: none;
margin: 0;
padding: 5px 10px 5px 10px;
border-left: 1px solid #000;
border-right: 1px solid #000;
border-bottom: 1px solid #000;
background-color: #DDD;
}

.menu dl:hover dt {
background-color: #DAA;
padding-top: 9px;
padding-bottom: 5px;
color: #FFF;
}

.menu dl:hover dd {
display: block;
}

.menu a {
display: block;
color: #000;
text-decoration: none;
}

.menu a:hover {
color: #FFF;
}

.menu dd a:hover {
color: #D00;
}

.menu .current {
background-color: #D00;
padding: 9px 10px 5px 10px;
color: #FFF;
}

.menu dl:hover dt.current {
background-color: #D00;
}

.menu .menu_item {
padding: 5px 10px 9px 10px;
}
</style>
<!--ここまでCSS-->
</head>

<body>
<div class="menu">
<div class="menu_list">
<dl><dt class="current">Menu1</dt></dl>
<dl><dt class="menu_item"><a href="">Menu2</a></dt></dl>
<dl><dt class="menu_item"><a href="">Menu3</a></dt></dl>
<dl><dt class="menu_item">Menu4</dt>
<dd><a href="">Menu4-1</a></dd>
<dd><a href="">Menu4-2</a></dd>
<dd><a href="">Menu4-3</a></dd>
</dl>
<dl><dt class="menu_item"><a href="">Menu5</a></dt></dl>
</div>
</div>
</body>
</html>


FireFox3とIE7では動くみたいですが、IE6はひょっとしたら
http://blog.faro.main.jp/?eid=369489
に書いてあるjavaスクリプトも入れないといけないのかもしれないです。

そして関係ないですが、
色指定で
#D00
と書いたら
#DD0000
の意味になるらしいですね。

2008-08-02

Google App Engineで日本時間を表示する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engineでdateime型を利用すると日本時間が表示されないでちょっと困ります。
そこでいろいろ調べた結果
http://webdba.blogspot.com/2008/04/google-app-engine4python.html
を参考に以下のような感じで解決することにしました。

モデルを以下のように作成します。
モデル内にget_create_tという関数を作成してここで時間の表示したい形式でフォーマッティングします。

from datetime import *
from google.appengine.ext import db

class Samples(db.Model):
name = db.StringProperty(required=True)
create_t = db.DateTimeProperty(required=True,auto_now_add=True)

def print_create_t(self):
jd = self.create_t + timedelta(hours=9)
return jd.strftime("%Y-%m-%d %H:%M:%S")


その後、実際に出力するさいには
sample.print_create_t()
とすることで利用できます。