2014年3月9日 星期日

[JAVA] 計算該程式整支(片段)運算時間

通常我們在實驗用的程式時,或者加解密程式的時候,其實挺重視效率這一點的,因此我們會借助一些函數來幫我算出整體程式的時間。

先來看一個範例程式:
public class p0309 {

 public static void main(String[] args){
  long start_time = System.currentTimeMillis();
  for(int i=0;i<99999;i++)
   for(int j=0;j<99999;j++)
    for(int k=0;k<999999;k++)
     ;
  long end_time = System.currentTimeMillis();
  System.out.printf("整體運算時間:%dms", (end_time-start_time));
 }
}




這邊運用大量的for loop去拖延程式的時間。

主要要介紹的函數是這個「System.currentTimeMillis()」

這個函數的回傳值為long,而回傳這個數字是現在的時間1970/01/01 00:00:00 UTC這之間所差的毫秒時間。(UTC: Coordinated Universal Time,世界標準時間)

程式一開始先取得這時間值,然後結束時也取得一次,而這相減便是所謂的程式整體時間了。

2014年3月3日 星期一

OCPJWCD 考試心得分享 (原SCWCD)

首先大概在2014年1月初時,便開始我的證照準備之旅~~

一開始先乖乖地將官方教材閱讀過一遍
(一遍就好了,但是請不要放過任何一個單字,他是原文的!)

(考前59天)
官方教材,請參考這一篇「[JAVA] Sun JAVA 認證考試官方教材 (Oracle適用)」並且下載SL-314的教材,我是將它印出來,然後一頁一單字的閱讀,雖然有些人會說官方教材不用看,但我還是覺得從根本讀起會比較扎實,不過它是原文的當然會稍微吃力些(我手機一直保持在Google Translation的頁面xD)

(考前20天)
大約二月初時,我把官方教材讀完了,真的很痛苦......我不得不承認= ="
便開始閱讀這本書「猛虎出閘尊爵版:1Z0-858 OCP JavaEE 5 Web元件應用程式設計師認證」看它的考試重點,還有做它的模擬試題。
(目前這本書已經絕版了,或許在準備出下一版吧?!)

網路上會有不少人推薦說可以一起閱讀:「深入淺出Servlets與JSP」,這本書其實我在半年前有大約讀了快一半的量,只是我發現他講解的方式跟我不太符合,後來就沒有繼續看了,但它的觀念真的是還蠻清楚的,若有時間的人,也歡迎把它列入閱讀的書單中。

(考前7天)
最後,就是多做考古題,充實一下自己的戰力了,通常考古題,網路搜尋一下會有不少。這些題目是值得參考看看的,但是多數的題目其實已經在「猛虎出閘尊爵版:1Z0-858 OCP JavaEE 5 Web元件應用程式設計師認證」出現過了,僅能說做複習之用。

BUT!!注意一點,通常網路上的考古題並非答案都是對的,盡量去考察一下,以防考試時發生悲劇。舉例來說:
































這是網路上找到的考古題裡面的其中一題,筆者覺得答案並非原始給的A,B,正確應該是A,C為對。

因為依照題意,A:前置詞'java'是保留詞,是沒錯的。B:應該改成uri='myTags.tld'的實際位置才對。C:在轉譯期間會發生錯誤,因為使用到java的保留詞。

在JSP 2.0規格中有提到(原文檔案:http://download.oracle.com/otndocs/jcp/jsp-2.0-fr-oth-JSpec/















由此可知,有這些保留字詞。


最後.......

整體考起來的心得,其實有人說OCPJWCD會比OPCJP好考,因為它的內容僅侷限於網路這方面的內容,相較於OCPJP則廣泛的涵蓋了JAVA的各部份的技術,所以在準備上會比較累。但是相對的,及格分數有比較低61%,而OCPJWCD則提高到72%才及格,因此準備上需要多加用心了。不過內容讀熟,準沒錯!!!



2014年1月9日 星期四

Google App Engine 使用Facebook帳號登入

上一篇「Google App Engine 連接資料庫(GAE Datastore)」已經有學習過如何將資料寫進資料庫中了,現在要來學習如何使用Facebook做登入動作,並且取得使用者FB的相關資訊。

首先,先到Facebook開發者平台這邊註冊一個應用程式
https://developers.facebook.com/



















之後會要求輸入Display Name、Namespace,Display Name是可以輸入中文,然後用來當作標題之類的文字,Namespace就有點像是id,不能跟別人重複的唯一識別碼。














之後會導到該應用程式的管理頁面,會看到應用程式編號應用程式密鑰等資訊






























左方有一個設定,我們必須去裡面新增平台,由於GAE是屬於網頁的應用程式,所以我們要選擇新增網頁,在網站URL那邊打上網域,因為目前我們是在自己的電腦測試,所以網域僅要打上http://127.0.0.1:8888/即可,之後上架到GAE則需要改成http://yourAppname.appspot.com/































之後回到Eclipse開始來建立專案

主要由以下這幾個檔案組成:

FunctionCall.java (將所有的Java功能全部寫在這個裡面,可以做呼叫)
PMF.java (主要是要使用到PersistenceManagerFactory這功能)
store.java (這個檔案有點類似像資料庫中的資料表)
hello.jsp (這頁包含一個簡單的Link,連結到FB)
login.jsp (這要主要是與FB做溝通,來取得相關資料的)

FunctionCall.java

package com.FBconnect.study2fun;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import javax.jdo.Query;
import javax.jdo.PersistenceManager;

public class FunctionCall {

 public static void adddata(String name){
  //宣告一個PersistenceManager
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //創建一個資料表物件,並同時將資料寫入
  store db = new store(name);
  try{
   //透過PersistenceManager將資料表放入DataStore
   pm.makePersistent(db);
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   pm.close();
  }
 }
 
 //這邊是一個查詢功能,會資料料庫中的所有FBid的list回傳
 public static List<store> queryFBid(){
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //此處可以做query的動作,有點類似SQL語法
  Query query = pm.newQuery(store.class);
  List<store> result = (List<store>) query.execute();
   return result;
    
  
 } 
 //將FB回傳的網址解析出來
 public static String geturl(String url){
  StringBuilder sb = new StringBuilder();
  try{
   URL graphURL = new URL(url);
   HttpURLConnection conn = (HttpURLConnection)graphURL.openConnection();
   BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
   String line = in.readLine();
  while(line !=null){
   sb.append(line);
   line = in.readLine();
  }
  
  }catch(MalformedURLException e){
   e.printStackTrace();
  }catch(IOException e){
   e.printStackTrace();
  }
  return sb.toString();
 }
}

PMF.java

package com.study2fun.datastore;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public class PMF {

 private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");
 private PMF(){}
 public static PersistenceManagerFactory get(){
  return pmfInstance;
 }
}


store.java

package com.FBconnect.study2fun;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

//這個地方有點像一個資料表的意思
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class store {

 //可以設定主鍵,這邊是讓系統自動產生流水號
 @PrimaryKey
 @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
 Long id;
 
 //各欄位的名稱和屬性
 @Persistent
 String FBid;
  
 //各欄位的名稱和屬性
 //@Persistent
 //int No;
 
 //設定建構子,將值傳進來
 public store(String name){
  super();
  this.FBid = name;
 }
 
 
 public Long get_id(){return id;}
 public String get_FBid(){return FBid;}
 

}




hello.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="com.FBconnect.study2fun.FunctionCall"%>
<%@page import="com.FBconnect.study2fun.store"%>
<%@page import="java.util.List"%>
<%@page import="com.restfb.types.User" %>
<%@page import="com.restfb.DefaultFacebookClient" %>
<%@page import="com.restfb.FacebookClient" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FBconnect</title>
</head>

<body>
<%
//這邊是一個debug的技巧,雖然程式是在網頁上面跑,但是在Console那邊還是可以檢視到System.out.println的資料,就可以知道程式是否有執行到這邊了
System.out.println("test-show");
//取得授權碼
String code = request.getParameter("code");
//應用程式ID
String client_id = "562850973805812";
//程式密鑰
String secret = "f752230afd606dd0f386246e06fc9b48";
String redirect_uri = "http://127.0.0.1:8888/hello.jsp";
String authURL = "https://graph.facebook.com/oauth/access_token?"+
"client_id="+ client_id+
"&redirect_uri="+redirect_uri+
"&client_secret="+secret+
"&code="+code;
String resp = FunctionCall.geturl(authURL);
String access_token = resp.substring(resp.indexOf("=")+1,resp.lastIndexOf("&"));
FacebookClient fbClient = new DefaultFacebookClient(access_token);
User user = fbClient.fetchObject("me",User.class);
//這邊的話,因為FB的資訊不僅有id而已,還有其他的資訊,生日、Email等等,這些資訊皆可以抓取,雖然有時好像抓不太到~"~
String name = user.getName();
//這邊我們將取得的FBid寫進到我們的資料庫中
FunctionCall.adddata(name);
%>
<!--  下面這邊要直接印出一個變數,可以直接用個=變數即可-->
Hello, <%=name %><p>

<p>資料庫中所有的FBid如下<p>
<%
List<store> result = FunctionCall.queryFBid();
for(store fs : result){
 //如果在Java Code裡面要包含網頁語法的話,就可以使用out.println,用字串的方式輸出網頁語法來呈現
 out.println(fs.get_FBid()+"<p>");
  }
%>



</body>
</html>


login.jsp

<%@ page language="java" contentType="text/html; charset=BIG5"
    pageEncoding="BIG5"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Insert title here</title>
</head>
<body>
<!-- 使用FB登入的方式便是透過一個FB的連結去取得驗證 -->
<%
String fbloginurl = "https://www.facebook.com/dialog/oauth?"+
"client_id=562850973805812" +
"&redirect_uri=http://127.0.0.1:8888/hello.jsp";
%>
<a href="<%=fbloginurl %>">Facebook登入</a>

</body>
</html>

一開始我們先到登入頁面














之後會跳到FB那邊取得授權



















最後會到達轉址後的頁面(前提是授權要過,接受的意思)























其實像最後一步這邊,可以寫一個簡單的功能去判斷,該使用者是否已經有記錄過登入資訊了,如果已經有記錄過的話就不用再將他寫進資料庫裡面了。

完整專案檔下載:下載


Google App Engine 連接資料庫(GAE Datastore)

Google App Engine中使用的資料庫並不是一般的SQL,而是有點類似SQL的GQL。

底下將會介紹五個不同的檔案,分別是
FunctionCall.java (將所有的Java功能全部寫在這個裡面,可以做呼叫)
PMF.java (主要是要使用到PersistenceManagerFactory這功能)
store.java (這個檔案有點類似像資料庫中的資料表)
WriteDataToDatastore.html (這是我寫的測試網頁,用來post資料給result.jsp)
result.jsp(處理post過來的資料,並且寫入到資料庫中)


FunctionCall.java
package com.study2fun.datastore;

import java.util.List;
import javax.jdo.Query;
import javax.jdo.PersistenceManager;

public class FunctionCall {

 public static void adddata(String name,String num){
  //宣告一個PersistenceManager
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //創建一個資料表物件,並同時將資料寫入
  store db = new store(name,num);
  try{
   //透過PersistenceManager將資料表放入DataStore
   pm.makePersistent(db);
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   pm.close();
  }
 }
 
 //這邊是一個查詢功能,爾後會在連結Facebook那邊寫詳細一點
 public static List<store> sqlfile(String sql){
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //此處可以做query的動作,有點類似SQL語法
  Query query = pm.newQuery(store.class);
  List<store> result = (List<store>) query.execute();
  
  return result;
  /*
   * for(filestore fs : result){
   * System.out.println(fs.???)
   * }
   * 
  */
 } 
}

PMF.java
package com.study2fun.datastore;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public class PMF {

 private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");
 private PMF(){}
 public static PersistenceManagerFactory get(){
  return pmfInstance;
 }
}



store.java
package com.study2fun.datastore;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

//這個地方有點像一個資料表的意思
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class store {

 //可以設定主鍵,這邊是讓系統自動產生流水號
 @PrimaryKey
 @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
 Long id;
 
 //各欄位的名稱和屬性
 @Persistent
 String name;
 
 @Persistent
 String num;
 
 //各欄位的名稱和屬性
 //@Persistent
 //int No;
 
 //設定建構子,將值傳進來
 public store(String name,String num){
  super();
  this.name = name;
  this.num = num;
  
 }
 
 
 public Long get_id(){return id;}
 public String get_name(){return name;}
 public String get_num(){return num;}

}


WriteDataToDatastore.html
<!DOCTYPE html>
<html>
<head>
<meta charset="BIG5">
<title>寫入資料庫測試</title>
</head>
<body>
<!-- 這邊簡單寫一個表單傳送的HTML網頁,並將值post到result.jsp這頁面 -->
<FORM action="result.jsp" method="post">
 名字:<INPUT name="name" size=10 maxlength=20><P>
 學號:<INPUT name="no" size=10 maxlength=20><P>
 
 <INPUT type="submit" value="送出表單">
 <INPUT type="reset" value="重新輸入">
 
</body>
</html>

result.jsp
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Test</title>
</head>
<body>
<!-- 這邊是屬於JSP網頁,我們需要把該頁所用到的Java功能import進來 -->
<%@page import="com.study2fun.datastore.FunctionCall"%>

<!-- 在JSP頁面中使用JAVA Code需要使用<%/*...*/%>包起來,如下面 -->
<%
//這邊會接收剛剛post過來的資料,並且要設定好相對應的名稱(如上一頁的的參數name="?")
String name = request.getParameter("name");
String no = request.getParameter("no");
//呼叫Java功能,這邊是做寫入的動作
FunctionCall.adddata(name, no);
%>

<a href="http://127.0.0.1:8888/_ah/admin/datastore">查看本地資料庫</a>


</body>
</html>

執行本地端瀏覽器瀏覽結果
在要瀏覽的網頁檔上按下右鍵>>Run As>>Web Application





























底下的Development Mode那邊會顯示一個網址,可以點擊後瀏覽。
而右上角有一個雙黃色的箭頭「Reload web server」則是當有做任何修改的話,只需存檔後,按下此紐,就會重新載入網頁,無須再Run As......











檢視本地資料庫的方式為,請在網址那邊打上http://127.0.0.1:8888/_ah/admin/可以進入到本機端管理介面,此時我們可以先看到資料庫是沒有資料的。


















之後我們來嘗試新增一筆資料













新增完畢後,我們再到管理介面,並且列出資料




此時會發現剛剛新增的中文部分會顯示亂碼,英文則是正常的顯示,關於這點,目前在本地端不太要緊,之後上架到GAE平台後,可以支援中文的~



























完整專案檔下載:下載

2013年12月26日 星期四

國立東華大學 校園網路自動登入服務






使用說明

1.第一次使用時,請先輸入帳號密碼後,按下「保存資料」按鈕。
2.若發現無法連線,請確定帳號密碼是否正確,且ndhu是否顯示已連線。
3.若手機出現 登入Wi-Fi 的通知,請勿理會。
4.本系統使用AES加密技術保存您的帳密



服務條款

1.請遵守「台灣學術網路管理規範
2.請遵守「國立東華大學校園網路使用規範
3.本系統僅提供自動登入服務,並不提供網路服務
4.嚴禁以此系統進行商業行為


疑難排解

1.請先確認WIFI是否有開啟
2.確認是否連線到ndhu
3.帳號密碼是否有輸入錯誤(請重新輸入即可)


特別感謝


  • 國立東華大學
  • 圖書資訊中心 網路管理組
  • 資訊管理學系
  • 協助測試程式的同學



Google Play:下載

開發者:Digital Orange......just for fun xD


2013年12月14日 星期六

[推廣] 雲端筆記-考試學長罩

最近跟幾位同學合力完成一套PaaS雲端平台:雲端筆記-考試學長罩

在這邊跟大家分享一下:http://cloudnote365.appspot.com

ps.為了避免第三方亂新增學校與科系,若有需要請留言告知我們,謝謝^o^

2013年10月27日 星期日

TQC+ 程式語言 C 解題解題秘笈

TQC+ 程式語言C認證

[更新]TQC+ 程式語言 C 解題解題秘笈(含勘誤) - Last updated on 2020.06.16

官方介紹:連結
程式語言 (C)
使用軟體代號應考時間測驗內容合格成績報名費
CPCP100分鐘操作題共9題70分1500
  • 本認證採操作題,總分為100分。
  • 操作題為九大題,第一大題至第七大題為除錯題每題5分,第八大題至第九大題為綜合應用題,第八大題每題30分,第九大題每題35分,總計100分。
  • 於認證時間100分鐘內作答完畢並存檔,成績加總達70分(含)以上者該科合格。
相關書訊:碁峰出版松崗出版



第一類:基本認識 LINK
第二類:選擇敘述與迴圈 LINK
第三類:函數與陣列 LINK
第四類:指標 LINK
第五類:結構 LINK
第六類:字元字串與檔案處理 LINK
第七類:其他論題 LINK
第八類:綜合應用一 LINK

(801列印星號、802不定數迴圈、803投票程式、804平均值計算、805多重迴圈、806九九乘法表、807九九成積、808氣泡排序、809選擇排序、810矩陣乘積)
第九類:綜合應用二 LINK
(901傳址呼叫、902大樂透、903分數篩選、904成績檔案讀寫、905浮點數檔案讀寫、906學生成績、907GPA等第、908亂數、909庫存函數、910動態記憶體配置)


考試指定編輯IDE:Dev-C++
大家可以參考阿榮福利味的「Orwell Dev-C++ 5.5.1 免安裝中文版

本篇教學的程式碼皆由筆者編輯,歡迎轉貼本教學,但請全文轉貼,謝啦 ~


故是從這邊說起......
筆者其實原本在考慮要不要將「TQC+ 物件導向程式語言 Java 6 解題秘笈」的解說再重寫一遍,畢竟又過了快一年,想法又會不太一樣了,但想想Java 7的認證應該也快出來(我猜的,也或許沒有),那現在在重寫Java 6有沒有意義呢?
後來發現TQC+ C語言也沒有出解題秘笈,筆者就突然心癢癢的想樣來寫程式和註解,不僅讓想考試或是想自修的人,都可以透過程式碼和輔助的註解來學習C語言。
想想當初筆者也是從C語言出生的,只是後來摸到了Java就一路倒了過去,哈!!這是算回來試水溫吧!!