2012年11月25日

XenServer6.1:Add CIFS ISO,xenserver does not support extended characters


圖片來源:http://blog.eogn.com/eastmans_online_genealogy/2011/05/-is-your-cd-rom-data-disappearing.html

目前最新版本的 XenServer 6.0, 6.1和 XCP beta 1.5, 1.6都有同樣的問題,
就是在新增 CIFS iso 空間時如果帳號、密碼、路徑有非英文可能就會出現以下錯誤:
XenServer does not support extended characters in CIFS paths, usernames and password.

還有一點要注意的是 iso 名稱也包含在路徑裡面喔,
如果 iso 有中文的話就會造成該 CIFS 無法加入,
把 iso 檔名改掉就可以正常運作囉,供大家參考啦~

本文出自符碼記憶,請勿全文轉載,部份轉載請註明出處關鍵字:XenServer, 6.1, XCP, 1.5, 1.6, CIFS, ISO
參考資料:

2012年11月15日

Powerpoint:線條動畫製作


最近在做投影片動畫時有個需求,
想要線段有從一頭到另一頭流動的效果,這用在箭號也許更有感覺,
總之就是希望線段能有延著某個方向慢慢出現的動畫。
查了一下資料發現用 powerpoint 內建的動畫效果就能達成。

圖片來源:http://www.veryicon.com/icons/system/rhor-v2-part-1/pptx-files.html

以下為步驟設定:
  1. 建立線條圖形:
    在 Powerpoint 2010裡可以使用:插入 -> 圖案 -> 線條 (還可以用最右邊的徒手畫)
  2. 建立所要的效果動畫:
    選擇剛剛建立的線條圖形後在上方選擇動畫,新增動畫 -> 擦去。
  3. 選擇動畫效果方向:
    依需求於「效果選項」處選擇向上、向下、向左或向右。
下面是一個簡單的教學 pptx 檔,大家可以下載回去後播放看看效果。
Powerpoint 線條動畫教學


本文出自符碼記憶,請勿全文轉載,部份轉載請註明出處關鍵字:Powerpoint, 線條動畫製作, 效果, ppt, pptx, 箭號, 動畫
參考資料:

解決工作排程器錯誤:工作影像已損毀或已遭竄改。(發生例外情況於HRESULT:0X80041321)


之前在使用工作排程器時,
只要一進到工作排程器就連續出現好幾個錯誤視窗,
錯誤的內容是:工作影像已損毀或已遭竄改。(發生例外情況於HRESULT:0X80041321)。
找了好一陣子,最近終於在別人的文章中找到解決方法且成功了!
工作影像已損毀或已遭竄改。(發生例外情況於HRESULT:0X80041321) --解決方法

圖片來源:http://skdarz.blog.so-net.ne.jp/upload/detail/m_NEC_4384.jpg.html

解決方法步驟有二:
  1. 把 C:\Windows\System32\Tasks 裡面有錯誤的工作檔案刪掉:
    網友文章中有提到通常是自己建的比較有問題,
    不過我的似乎不是…一個一個找太慢,最後我就把所有 task 都刪掉了!
  2. 刪除登錄編輯器 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks 裡面和錯誤的工作ID有關的資料夾。
    網友文章有提到做了第一步就沒錯誤了,其實我也是 XD
    所以如果第一步做完還是有錯誤的話再來做第二步吧。
那篇文章中還有列出其他國外文章的討論,一併列在參考資料中囉~

本文出自符碼記憶,請勿全文轉載,部份轉載請註明出處關鍵字:工作排程器, 錯誤, 處理, 解決, HRESULT, 0X80041321
參考資料:

2012年11月7日

Java Concurrent ScheduledExecutorService:定期排程的 thread pool


先前介紹過了使用 Java Timer 來達成工作排程的效果,
也介紹了 Java 內建超簡單的 Thread Pool 機制,
今天則是要來結合這兩者,
使用 Thread Pool 裡的 Thread 來執行定期排程的工作!

在開始之前,建議的大家可以先看一下先前的相關文章:
圖片來源:http://www.backupforall.com/backup%20scheduler.php

下面的程式中首先我們在 constructor 裡取得 2條 Thread 的 Scheduled Thread Pool,
service = Executors.newScheduledThreadPool(2);
接著一次進行一項測試,分別為:
testScheduleWork、testScheduleOutdatedWork 及 testScheduleMultiWork。

完整程式碼如下:
  1. package werdna1222coldcodes.blogspot.com.demo.scheduleTask;
  2.  
  3. import java.text.ParseException;
  4. import java.util.Date;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.ScheduledExecutorService;
  7. import java.util.concurrent.TimeUnit;
  8.  
  9. public class ScheduledThreadPoolDemo {
  10.  
  11. public static void main(String[] args) throws ParseException {
  12.  
  13. ScheduledThreadPoolDemo demo = new ScheduledThreadPoolDemo();
  14. // demo.testScheduleWork();
  15. demo.testScheduleOutdatedWork();
  16. // demo.testScheduleMultiWork();
  17. }
  18.  
  19. private ScheduledExecutorService service = null;
  20. public ScheduledThreadPoolDemo() {
  21. service = Executors.newScheduledThreadPool(2);
  22. }
  23.  
  24. void testScheduleWork() {
  25. Date current = new Date();
  26. System.out.println("***************testScheduleWork************
  27. ***");
  28. // schedule by delay
  29. Date date = new Date();
  30. date.setTime(current.getTime()+TimeUnit.MILLISECONDS.convert(
  31. 10, TimeUnit.SECONDS));
  32. service.schedule(new Work(1, date), 10, TimeUnit.SECONDS);
  33. // schedule by date
  34. Date date2 = new Date();
  35. date2.setTime(current.getTime()+TimeUnit.MILLISECONDS.convert(
  36. 5, TimeUnit.SECONDS));
  37. service.schedule(new Work(2, date2), date2.getTime()-current.
  38. getTime(), TimeUnit.MILLISECONDS);
  39. }
  40. void testScheduleOutdatedWork() {
  41. System.out.println("***************testScheduleOutdatedWork****
  42. ***********");
  43. Date current = new Date();
  44. Date date = new Date();
  45. // schedule by delay
  46. date.setTime(current.getTime()+TimeUnit.MILLISECONDS.convert(-
  47. 10, TimeUnit.SECONDS));
  48. service.schedule(new Work(1, date), date.getTime()-current.
  49. getTime(), TimeUnit.MILLISECONDS);
  50. }
  51. void testScheduleMultiWork() {
  52. System.out.println("***************testScheduleMultiWork*******
  53. ********");
  54. for (int i = 0; i < 5; i++) {
  55. Date date = new Date();
  56. long offset = (long)(Math.random()*10) - 5;
  57. date.setTime(date.getTime()+TimeUnit.MILLISECONDS.convert(
  58. offset, TimeUnit.SECONDS));
  59. System.out.println(date);
  60. service.schedule(new Work(i, date), date.getTime()-new
  61. Date().getTime(), TimeUnit.MILLISECONDS);
  62. }
  63. }
  64. class Work implements Runnable {
  65. private int id;
  66. private Date date;
  67. public Work (int id, Date date) {
  68. this.id = id;
  69. this.date = date;
  70. }
  71. public void run() {
  72. System.out.println(Thread.currentThread().getName() + "
  73. Begins Work " + id);
  74. System.out.println("Work " + id + " Scheduled Time: " +
  75. date.toString());
  76. System.out.println("Work " + id + " Start Time: " + new
  77. Date().toString());
  78. try {
  79. Thread.sleep(5000);
  80. }
  81. catch (InterruptedException ex) {
  82. ex.printStackTrace();
  83. }
  84. System.out.println("Work " + id + " End Time: " + new Date(
  85. ).toString());
  86. System.out.println(Thread.currentThread().getName() + "
  87. Ends Work " + id);
  88. }
  89. }
  90. }

在 testScheduleOutdatedWork 裡我們測試了如果 delay 是負的或 date 已過期的狀況,
結果會馬上執行補做喔,而不是就不做了!
像下面的結果程式開始的時間是 21:17:09,排程的時間是20秒前的 21:16:59,
所以程式一執行他馬上就補做了!
***************testScheduleOutdatedWork***************
pool-1-thread-1 Begins Work 1
Work 1 Scheduled Time: Wed Nov 07 21:16:59 CST 2012
Work 1 Start Time: Wed Nov 07 21:17:09 CST 2012
Work 1 End Time: Wed Nov 07 21:17:14 CST 2012
pool-1-thread-1 Ends Work 1

最後在 testScheduleMultiWork 裡我們是要測試 Thread Pool 的效果,
仔細觀察可以發現奇妙的結果喔!
程式在 21:28:43 開始後馬上補做 28:38, 28:39 兩個過期的工作,
而在工作執行期間 44, 45兩個工作也應該要馬上做了,
但因為 Pool 中只有兩條 Thread,所以這兩項工作被 delay,要等前面的工作做完才做。
同理我們看到最後執行的 Work 3,排程的時間是 47,但開始執行時已經是 53囉!
***************testScheduleMultiWork***************
Wed Nov 07 21:28:44 CST 2012
Wed Nov 07 21:28:45 CST 2012
Wed Nov 07 21:28:39 CST 2012
Wed Nov 07 21:28:47 CST 2012
Wed Nov 07 21:28:38 CST 2012
pool-1-thread-2 Begins Work 2
pool-1-thread-1 Begins Work 4
Work 2 Scheduled Time: Wed Nov 07 21:28:39 CST 2012
Work 4 Scheduled Time: Wed Nov 07 21:28:38 CST 2012
Work 2 Start Time: Wed Nov 07 21:28:43 CST 2012
Work 4 Start Time: Wed Nov 07 21:28:43 CST 2012
Work 2 End Time: Wed Nov 07 21:28:48 CST 2012
Work 4 End Time: Wed Nov 07 21:28:48 CST 2012
pool-1-thread-2 Ends Work 2
pool-1-thread-1 Ends Work 4
pool-1-thread-1 Begins Work 0
pool-1-thread-2 Begins Work 1
Work 0 Scheduled Time: Wed Nov 07 21:28:44 CST 2012
Work 1 Scheduled Time: Wed Nov 07 21:28:45 CST 2012
Work 0 Start Time: Wed Nov 07 21:28:48 CST 2012
Work 1 Start Time: Wed Nov 07 21:28:48 CST 2012
Work 0 End Time: Wed Nov 07 21:28:53 CST 2012
Work 1 End Time: Wed Nov 07 21:28:53 CST 2012
pool-1-thread-1 Ends Work 0
pool-1-thread-2 Ends Work 1
pool-1-thread-1 Begins Work 3
Work 3 Scheduled Time: Wed Nov 07 21:28:47 CST 2012
Work 3 Start Time: Wed Nov 07 21:28:53 CST 2012
Work 3 End Time: Wed Nov 07 21:28:58 CST 2012
pool-1-thread-1 Ends Work 3

以上的程式供大家參考,其實還有其他好用的 schedule 方法,下面簡單介紹給大家。
service = Executors.newScheduledThreadPool(2);

// 只要有空的 Thread 就直接執行
service.execute(command);

// 固定週期,如:initialDelay, initialDelay+period, initialDelay+2*period ……
// 下一個工作開始時間以前一工作開始時間加上 period 計算
service.scheduleAtFixedRate(command, initialDelay, period, unit);

// 固定延遲, 下一個工作開始時間以前一工作結束時間加上 delay 計算
service.scheduleWithFixedDelay(command, initialDelay, delay, unit);

若想知道更多有關 Java 時間相關的轉換、排程等應用,
或是想看其他我所寫關於 Java 的範例程式,請見:Java 教學及程式範例大全

本文出自符碼記憶,請勿全文轉載,部份轉載請註明出處關鍵字:Java, Thread, Pool, Executor, Executors, ThreadExecutor, ThreadPoolExecutor, ScheduledThreadPool, execute, scheduleAtFixedRate, scheduleWithFixedDelay, schedule
參考資料:

解決 Eclipse 無法啟動問題:Failed to load the JNI shared libray


64位元的作業系統已經很普及了,因為他能兼容 64及 32位元的程式,
所以大家平常也不太 care 到底用的程式是哪一種。

先前因為 Java 出現在一些安全性的問題,
加上電腦裡安裝了 Java 6, 7 的 32 bit, 64bit 再分為 JRE 及 JDK 讓人覺得心煩,
就想說要把用不到的刪一刪,結果刪完後 Eclipse 就開不起來了 QQ
出現了這樣子的錯誤訊息:「Failed to load the JNI shared libray」。


原因是因為 Eclipse 雖然是免安裝,卻有分為 32及 64的版本,
如果 Eclipse 與 Java JVM 的版本對不上,就會出現這樣的錯誤訊息。
解決方法很簡單:確定 Eclipse 版本後裝上對應的 32或 64位元的 Java 即可。

關鍵字:Failed to load the JNI shared libray, Eclipse, Java, JVM, JDK, JRE
參考資料:

2012年11月4日

「智慧型股票投資人」讀後心得 (The intelligent investor : a book of practical counsel, 4th rev. ed.)


在約一年前整理的投資書單「Warren Buffett 華倫.巴菲特推薦的投資理財書單」中,
《智慧型股票投資人》這本書理所當然地名列其中,
這本書不但被投資界譽為有史以來為股票投資人所撰寫的經典之作,
也被股神華倫‧巴菲特盛讚,本書為「截至目前最佳的投資範本」,

在 華倫·巴菲特 的 wiki 中提到:
在閲讀班傑明·葛拉漢(Benjamin Graham)的名著《智慧型投資人》(The Intelligent Investor)後,也奠定了華倫·巴菲特在投資方面的興趣與基礎。


書名:智慧型股票投資人
原文書名:The intelligent investor : a book of practical counsel, 4th rev. ed.
原文作者:Benjamin Graham著
譯者:俞濟群譯
出版社:寰宇
出版日期:1996年12月14日
語言:繁體中文 ISBN:9578457014
裝訂:平裝

雖然作者算是巴菲特的老師,這本書算是他投資論理的精華之作,
巴菲特和其他投資者都深受影響且大為推崇,
但這本書卻因為翻譯的關係讀起來異常難懂且艱深,
原本以為是自己程度不夠讀不起經典之作還有點偒心,
沒想到看其他人的心得也都是如此……

再回頭去看去年整理書單時別人的評論:據說翻譯不佳流暢度不足,且是1996年版。
真是後悔硬啃這本被翻譯給害了的經典之作!
之後也許會直接去找大陸那邊新譯的版本來看吧 orz

簡體中文譯本:
聰明的投資者(4版平裝,20110701出版)聰明的投資者(4版精裝,20101101出版)
看過之後我會再重新補上心得的。

更多閱讀心得請見:閱讀心得清單
更多投資理財相關書籍請見:投資理財入門書單推薦總整理
另外若參考心得後有想買書,本站有提供博客來代訂服務及 e-coupon 分享,
若有需要,請見:博客來e-coupon折價券序號分享、免費代訂代購服務

本文出自符碼記憶,請勿全文轉載,部份轉載請註明出處
關鍵字:智慧型股票投資人, 投資, 理財, 心得, 讀後感, 參考書, 書單, 書目, 推薦