2011年7月23日 星期六

在GAE使用Distinct(配合template)

前幾天在使用資料庫的時候發現了一個方法,通常在讀取資料庫的時候沒辦法使用MySQL、MS SQL裡的 Distinct,在抓重複的值的時候會多抓但又沒辦法只抓單筆

於是我也不知道去哪裡想出來的方法,配合template語法,在for裡加入ifchanged就可以有Distinct效果

{% for i in billdb %}
    {% ifchanged %}
        <option value="{{i.bill_idnum}}">{{i.bill_idnum}}</option>
    {% endifchanged %}
{% endfor %}


2011年6月5日 星期日

[Android] layout_gravity 和 gravity 的區別

layout_gravity 和 gravity 主要的區別是在於layout_gravity是針對父元素,也就是在他之前的元素做調整;而 gravity 是指他裡面去做調整。


android:layout_gravity="left"

android:layout_gravity="center"


android:gravity="right"






各屬性詳細的說明可以看 Drawable Resources

-
以上圖片連結參考 kuluto 的 此篇文章 若原創者有任何問題,可以寄信通知。


2011年6月2日 星期四

[JavaScript] 開啟視窗

HTML
<a href="#" onclick="window.open('test.html','textfile',config='height=500,width=750,menubar=1')">
   詳細資料
</a>

可以直接開啟新視窗,並且再最可以隱藏工具列等其他的設定

下面是jQuery 寫法

HTML
<a href="#" id="userdata" >詳細資料</a>

jQuery
$("#userdata").click(function () { 
    window.open('/','textfile',config='height=500,width=750,menubar=1');
});


以下是參數

height=100 窗口高度;

width=400 窗口寬度;

top=0 窗口距離瀏覽器上方的像素值;

left=0 窗口距離瀏覽器左側的像素值;

toolbar=no 是否顯示工具列,yes為顯示、no為不顯示;

menubar=no 是否顯示選單列,yes為顯示、no為不顯示;

scrollbars=no 是否顯示滑動軸,yes為顯示、no為不顯示;

resizable=no 是否允許改變窗口大小,yes為允許、no為不允許;

location=no 是否允許顯示網址列,yes為允許、no為不允許;

status=no 是否顯示狀態檔內的訊息,yes為允許、no為不允許;



參考網站:http://www.study-area.org/coobila/tutorial_275.html
                http://www.javascript-coder.com/window-popup/javascript-window-open.phtml
                http://kyo0183.blogspot.com/2008/10/windowopen.html

2011年5月30日 星期一

[jQuery] 指定select為選取狀態

範例 HTML
<select id="selectBox">
    <option value="A">Number 0</option>
    <option value="B">Number 1</option>
    <option value="C">Number 2</option>
    <option value="D">Number 3</option>
    <option value="E">Number 4</option>
    <option value="F">Number 5</option>
    <option value="G">Number 6</option>
    <option value="H">Number 7</option>
</script>

jQuery code
<script>
   $('#selectBox option[value=C]').attr('selected', 'selected');
</script>

在網頁裡就會顯示"Number 2"




取得目前點選的val值
<script>
$("#selectBox").change(function(){
    var t = $(this).val(); 
})
</script>


參考網頁 here

[GAE] reCaptcha 應用Python

首先先在 recaptcha 這裡申請網站 Domain Name


之後會給你 Public Key 跟 Private Key 等等會用到


接著在裡選擇語言 here 這裡介紹Python


先從 這裡下載python用的 python_recaptcha-client 下載解壓縮後將 \recaptcha\client\captcha.py 放在你的gae目錄底下

接著在你的檔案 import captcha
呼叫此函數captcha.displayhtml('public_key') 在public_key 裡放入剛剛取得的 Public Key,會回傳一段reCaptcha 的 html


前端的部份就完成,然後在你的post那裡取得你的 recaptcha_challenge_field 、recaptcha_response_field和設定你的private_key跟你的Domain Name



recaptcha_challenge_field = self.request.get('recaptcha_challenge_field')
recaptcha_response_field = self.request.get('recaptcha_response_field')
private_key = 'private_key'   #剛剛取得的private_key
remoteip= 'domain_name '  #剛剛申請的domain_name 

呼叫 captcha.submit(recaptcha_challenge_field,recaptcha_response_field,private_key,remoteip)

會回傳你剛剛在reCaptcha t輸入的是否為正確(return boolean) 就完成啦!!


全部語法

import captcha
from google.appengine.ext import webapp

# Captcha   
domain_name = 'you_domain_name'
public_key = 'public_key'
private_key = 'private_key'

class test(webapp.RequestHandler):
    def get(self):
        captcha_html = captcha.displayhtml(public_key)
        self.response.out.write(captcha_html)
        
    def post(self):
        recaptcha_challenge_field = self.request.get('recaptcha_challenge_field')
        recaptcha_response_field = self.request.get('recaptcha_response_field')
        private_key = private_key
        remoteip = domain_name
    
        ans = captcha.submit(recaptcha_challenge_field,recaptcha_response_field,private_key,remoteip)
        
        self.response.out.write('ans= '+str(ans.is_valid))


有問題可以參考這篇 reCaptcha_to_php 應該大同小異,或是
直接參考 google recaptcha api

2011年5月15日 星期日

Android MenuInflater的使用(layout menu)

1.建立一個 Android 工程我們命名為 MenuInflaterDemo .

2.在 res 目錄下創建 menu 目錄,並且創建 options_menu.xml (我們定義的菜單)文件,代碼如下:


<?xml version= "1.0"  encoding= "utf-8" ?>  
<menu  
  xmlns:android= "http://schemas.android.com/apk/res/android" >  
    <item android:id= "@+id/menu_add"  
          android:title= "Add"  
          android:icon= "@android:drawable/ic_menu_add"  
           />  
    <item android:id= "@+id/menu_wallaper"  
          android:title= "Wallpaper"  
          android:icon= "@android:drawable/ic_menu_gallery"  
           />  
   <item android:id= "@+id/menu_search"  
          android:title= "Search"  
          android:icon= "@android:drawable/ic_search_category_default"  
           />  
   <item android:id= "@+id/menu_setting"  
          android:title= "Settings"  
          android:icon= "@android:drawable/ic_menu_preferences"  
           />  
</menu>

3.在主要程式碼內加入,如下

@Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        MenuInflater inflater = getMenuInflater();  
        inflater.inflate(R.menu.options_menu, menu);      
        return true;  
    }  
      
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch  (item.getItemId()) {  
        case  R.id.menu_add:  
            break ; 
        case  R.id.menu_wallaper:  
            break ;  
        case  R.id.menu_search:  
            break ;  
        case  R.id.menu_setting:    
            break ;  
        }  
        return  super .onOptionsItemSelected(item);  
    }

當選單選到Add or Wallpaper ...則會執行 onOptionsItemSelected 底下 
switch 的case




參考網站:http://blog.csdn.net/Android_Tutor/archive/2010/04/23/5522913.aspx

2011年5月14日 星期六

GAE 使用Session

網址:gae-sessions

下載完後,將gaesessions資料夾放入子目錄

在修改 appengine_config.py 裡的 9行
COOKIE_KEY = 'do not use this key'
更改成
COOKIE_KEY = os.urandom(64)


使用方法和一些函數使用
session = get_current_session()  

session['a'] ='a'  

session.has_key('a')

session.terminate()


session = get_current_session()  
建立 session

session['a'] ='a' 
設立一個為a的session值為'a'

session.has_key('a')
判斷是否有a這個session return bool

session.terminate()
刪除session並終止該用戶


詳細函數可以至gaesessions目錄下的__init__.py