2014年1月30日 星期四

【備忘】在Mac中如何取消標記

在Mac中,在Finder中點選資料夾或檔案,再點按滑鼠右鍵開啟選單,可以幫該檔案或資料註記一個或多個標記:



做上標記的,在Finder中顯示時,會有一個有顏色的點點:


若要移除標記也很簡單,一樣點選要移除標記的資料夾後,點按右鍵,再將滑鼠移到已標記的顏色點點上,就會出現移除標記你已標記顏色的提示,再點一下,就可以移除:


2014年1月24日 星期五

【筆記】EJB使用Deployment Description來實現Interceptor

在Session Bean或Message Driven Bean的某些方法被呼叫時,可以使用Interceptor在呼叫前後,做一些其他的處理,他像是EJB的AOP (Aspect Oriented Programming) 。

Interceptor可以使用Annotation或使用Deployment Descriptor來宣告,下面的範例包含了一個Singleton Session Bean、一個要做為Interceptor的類別、一個宣告Interceptor的Deployment Descriptor文件,另外還有一個做為客戶端程式的Servlet,我使用GlassFish 3.1來做為我的伺服器,並使用Deployment Descriptor來宣告Interceptor。

SingletonSessionBean.java
package jk.idv.ssb;

import java.util.Date;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;

@Singleton(name="SingletonSessionBean")
@LocalBean
public class SingletonSessionBean
{
 private final static String MY_NAME = "SingletonSessionBean";
 
 private String username = "[no man]";
 
 @PostConstruct
 private void init()
 {
  System.out.println("    " + MY_NAME + " - Initialized");
 }
 
 @PreDestroy
 private void destroy()
 {
  System.out.println("*** " + MY_NAME + " - Destroyed");
 }
 
 public String retrieveMessage()
 {
  Date theCurrentTime = new Date();
  return "Name saved in " + MY_NAME + " is " + username + " "
  + theCurrentTime;
 }
 
 public void saveName(final String inName)
 {
  this.username = inName;
 }
}


上列程式碼中,未使用@Interceptors來宣告這個Singleton Session Bean相關的Interceptor。

LogInterceptor.java
package idv.jk.interceptor;

package idv.jk.interceptor;

import javax.interceptor.InvocationContext;

public class LogInterceptor
{
 public Object logMethod(InvocationContext inCtx) throws Exception
 {
  System.out.println(" LogInterceptor intercepting: " +
    inCtx.getTarget().getClass().getSimpleName() +
    "." + inCtx.getMethod().getName());
  return inCtx.proceed();
 }
}


上列的程式碼中,也沒有使用@Interceptor來宣告此類別為一個Interceptor。
SingletonClientServlet.java
package idv.jk.client;

import java.io.IOException;
import java.io.PrintWriter;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jk.idv.ssb.SingletonSessionBean;

/**
 * Servlet implementation class SingletonClientServlet
 */
@WebServlet("/SingletonClientServlet")
public class SingletonClientServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
       
 @EJB
 private SingletonSessionBean singletonSessionBean;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SingletonClientServlet() {
        super();
    }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String theParam = request.getParameter("name");
  
  PrintWriter pw = response.getWriter();
  
  String msg = singletonSessionBean.retrieveMessage();
  pw.println("Get message from singleton session bean: ");
  pw.println(msg);
  
  if(theParam != null)
  {
   singletonSessionBean.saveName(theParam);
  }
  msg = singletonSessionBean.retrieveMessage();
  pw.println("Check message from singleton session bean: ");
  pw.println(msg);
  pw.println("Finished invoking singleton session beans!");
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 }

}

上列的Servlet使用注入的方式來使用Singleton Session Bean的方法,並在瀏覽器中印出一些我需要的資訊。

最後是名為ejb-jar.xml的Deployment Descriptor:

 
 
  
   idv.jk.interceptor.LogInterceptor
   
    logMethod
   
  
 
 
  
   SingletonSessionBean
   idv.jk.interceptor.LogInterceptor
  
 


將Web應用程式部署到GlassFish後,再打開瀏覽器輸入:http://localhost:8888/BusinessMethodInterceptorsDD/SingletonClientServlet?name=Javakid,應該可以看到下列的結果:

Get message from singleton session bean: 
Name saved in SingletonSessionBean is [no man] Fri Jan 24 00:05:32 CST 2014
Check message from singleton session bean: 
Name saved in SingletonSessionBean is Javakid Fri Jan 24 00:05:32 CST 2014
Finished invoking singleton session beans!

在Console中,也會看到一些訊息被印出來:


完整的程式由此下載

參考資料:

http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes,p.97

2014年1月21日 星期二

【筆記】使用d3 cloud做標籤雲

在網路上搜尋使用JavaScript來做標籤雲的套件很多,但我目前覺得最好用的是這一套:d3 cloud,以d3為基礎,來做標籤雲的呈現,下列範例使用d3 cloud的範例程式稍做修改後來做說明。

先在html中新增一個要放入標籤雲的div:
  
再來在程式中引入d3和d3 cloud的函式庫 (在上列的d3 cloud連結中可以下載範例和函式庫):

  
  

最後撰寫我要的標籤雲部份:
(function() {
  var fill = d3.scale.category20();
  //要顯示於標籤雲的資料內容,為一個JSON物件的陣列
  var data = [
      {
        text : "透視C語言",
        size : 37,
        url : 'http://www.tenlong.com.tw/items/9862769408?item_id=886353'
      },
      {
        text : "超圖解 Arduino",
        size : 35,
        url : 'http://www.tenlong.com.tw/items/9863120847?item_id=577739'
      },
      {
        text : "Linux Shell 程式設計",
        size : 25,
        url : 'http://www.tenlong.com.tw/items/986276970X?item_id=887065'
      },
      {
        text : "無瑕的程式碼",
        size : 40,
        url : 'http://www.tenlong.com.tw/items/PG-001?item_id=884070'
      },
      {
        text : "挑戰大數據",
        size : 23,
        url : 'http://www.tenlong.com.tw/items/9865764040?item_id=883951'
      },
      {
        text : "Android 大螢幕手機",
        size : 23,
        url : 'http://www.tenlong.com.tw/items/9862018143?item_id=887255'
      } ];
  d3.layout.cloud().size([ 300, 300 ]).words(data).padding(3).rotate(
      0).font('"微軟正黑體",Impact').fontSize(function(d) {
    return d.size;
  }).on("end", draw).start();

  function draw(words) {
    d3.select("#tag") //要插入標籤雲的tag id
    .append("svg").attr("width", 300).attr("height", 300)
    .append("g").attr("transform", "translate(150,150)") //這裡的值要對應到繪圖區域的寬、高的一半,針對不同的瀏覽器要設可以使用的值,如Chrome為-webkit-transform
    .selectAll("text").data(words).enter().append("text")
    .style("font-size", function(d) {
          return d.size + "px";
        })
    .style("font-family", '"微軟正黑體",Impact')
    .style("cursor", 'pointer')//當滑鼠移上去時,變換cursor
    .style("fill", function(d, i) {
      return fill(i);
    }).attr("text-anchor", "middle")
    .attr("transform",//跟上面的transform一樣,需依不同的瀏覽器設定對應的值
        function(d) {
          return "translate(" + [ d.x, d.y ] + ")rotate(" + d.rotate + ")";
        })
    .text(function(d) {
      return d.text;
    }).on('click', function(d) {//點按文字後,開啟超連結
      window.open(d.url);
    });
  }
}());

最後的結果像這樣呈現:


上列範例原始碼可以在這裡下載

2014年1月16日 星期四

【筆記】在Mac上安裝Java EE 7 SDK

在到Oracle的官網下載後,使用終端機切換到下載檔案 (.sh file) 的目錄。


使用下列指令先把下載的檔案改成可以執行的模式:
$ chmod +x java_ee_sdk-7-jdk7-macosx-x64.sh
再來執行安裝,在終端機中輸入:
$ sh ./java_ee_sdk-7-jdk7-macosx-x64.sh
假使有顯示下列訊息,如:
This program requires DISPLAY environment variable to be set.
Please re-run after assigning an appropriate value to DISPLAY.
就先再執行下列指令:
$ export DISPLAY=:0
當出現下列視窗後,點按【下一步】開始安裝:


接下來若沒特殊需要,就只要按【下一步】就好。

參考資料:



2014年1月14日 星期二

【筆記】使用CSS製作網頁載入動畫效果(CSS for loading)

有時為了讓使用者有更好的使用經驗,在網頁載入時,需要顯示些什麼,讓使用者知道現在在載入中,今天同事介紹了一個網站cssload.net,讓人輸入一些簡單的設定後,就可以不用gif等圖檔,只使用CSS做出網頁載入時,等待的效果,像這樣:


進入該網站後,就會有幾個簡單的設定:


第一步在「Select your loader」 選擇好我們要的載入時顯示的圖形樣版:


再來選擇好要的顏色、大小,和動畫的速度後,點按【GET CODE】,就會跳出一個小視窗,顯示相對應的html和CSS:


上列的程式碼中包含了<style>和<div>兩個部份,分別把需要的style和html複製後放在適當的地方,就可以顯示出所需要的效果。

2014年1月9日 星期四

【備忘】如何查詢Mac中Java的安裝目錄

在Mac OSX中,要查詢Java的安裝目錄,就要使用下列命令:


/usr/libexec/java_home -V

打開終端機後,輸入上列命令:


按下return鍵後,就會看到跑出相關的資訊:


根據上列的目錄去尋找,就可以找到所需要的Java安裝目錄了。

參考來源

【備忘】在Mac中安裝軟體

在Mac中安裝軟體和在Windows中很不一樣,沒有下一步的繁鎖步驟,只要把下載好的「.dmg」檔點按兩下,出現下列的畫面:


出現上列的畫面後,把左邊要安裝的軟體圖示,用「拖」的接到右邊的資料夾圖示去,這裡是要用滑鼠拖的哦,不是點按滑鼠。

【備忘】Mac的快捷鍵整理

用了Mac作業系統一段時間後,真的有回不去的感覺,若能搭配它的快捷鍵的話,使用起來想必更加得心應手,因為很多地方還在熟悉,在這裡整理一些自己常用的快捷鍵:

瀏覽器
在瀏覽器中選取網址列 ⌘ + L
重新整理(重新載入目前頁面) + R
上一頁 + 左方向鍵
下一頁⌘ + 右方向鍵
上一頁⌘ + [
下一頁⌘ + ]
本機操作
在同一應用程式之間切換⌘ + `(tab鍵上面)
顯示桌面⌘ + F3
前往指定的資料夾(會跳出輸入框指定路徑)⌘ + ⇧ + G
螢幕截圖(自選區塊)⌘ + ⇧ + 數字鍵4
螢幕截圖(全螢幕)⌘ + ⇧ + 數字鍵3
移動檔案選取要移動的檔案後,按⌘ + C
到目的地資料夾,按⌘ + alt + V
將視窗縮到最小⌘ + M
開啟檔案或資料夾⌘ + O
在Finder中到上一層目錄⌘ + 方向鍵↑
在Finder中進入目前選擇的目錄,或開啟選擇的檔案⌘ + 方向鍵↓
捲到螢幕最上方⌘ + 左方向鍵
捲到螢幕最下方⌘ + 右方向鍵
到前一個資料夾⌘ + [
到下一個資料夾⌘ + ]
往後刪除fn + delete
重新命名檔案或資料夾選取好檔案或資料夾後,按return
Adobe Reader
前往某一頁⌘ + ⇧ + N

慢慢筆記中...

參考來源: