2014年7月20日

股市自動交易系統(半完成品) - NDDEAgent

開發背景:
在台灣的程式交易中,DDE可以說是無人不知無人不曉,
這鬼東西在我一開始接觸程式交易時,
對大家講的DDE...TS...資料源,根本一頭霧水,
一查資料,乖乖不得了,這鬼東西的書竟然是1994年,
要特別到圖書館借舊書才找得到,電腦書店根本沒有這東西。

用DDE+linux為關鍵字Google,想當然,什麼鬼都沒有,
有一樣疑問的人當然有,有人有發問,但答案就是......No answer.....
因此最終放棄在Linux上呼叫或連結DDE,改在Windows上開發個Agent來做。

一開始,我期望統一用Java來開發,畢竟同語言開發有一致性,好維護,
我當時比較熟的也只有Java,但不幸的,Java的DDE只有JDDE,而且似乎要收費,
因此轉而用跟Java比較相近的c#和NDDE開發。

最早,DDE Agent的開發是一回事,證券軟體的操作是另一回事,
為了自動操作證券軟體,最早我用AutoIt另外寫了一個Stock Server
AutoIt的Stock Server專門用來操作Windows軟體,
DDE Agent則專門透過DDE取得和廣播DDE資訊,
這樣的設計實在太複雜,2個TCP Server各自運作,卻還互相關聯,
因此我將證券軟體啟動的AutoIt程式加入到DDE Agent,
成為了目前版本的NDDE Agent v1.5Beta。

一些網友會問(包括最開始的我),
DDE除了用Excel之外,怎麼接收?
DDE有辦法轉成其他Protocol嗎?
除了TS外,有沒有什麼程式可以同時設定、接收多個資料源?
NDDE Agent就是答案。

NDDE Agent功能與需求:

  1. 要能夠接收DDE訊息
  2. 要能透過TCP廣播DDE訊息
  3. 要能被控制,需要能下指令給NDDE Agent
  4. 要能將DDE註冊到證券軟體
  5. 要能啟動證券軟體(寶來點金靈)
  6. 能否提供個Web介面供呼叫?


NDDE Agent與Java ATS Server架構:

NDDE Agent基本設計:
為了能達到若干需求,NDDE Agent包括下面3個Server:
NDDE Agent的Server基本設計是Telnet Server。

所謂的常駐型Server,意思是Client端連上後,就會保持連線狀態,
直到下指令斷線離開,或者任一方斷線為止。

所謂的問答式Server,意思是這個Server是和Web Server一樣,
用一問一答方式設計,每次連上後詢問,得到答案後,會自動斷線。

在NDDE Agent中,目前裡面包裹了3個TCP Server,作用如下:
Data Server:
負責廣播所有DDE訊息。
Client連上後,所有DDE訊息都會透過它收到,它沒有指令控制,
Client連上後只能被動的接收訊息,要離開,由Client自行斷線即可。

Admin Server:
負責下指令給NDDE Agent。
Client連上後,會保持登入狀態,直到Client下exit指令離開,
Client可以透過它下DDE註冊指令,
Client也可以透過它下啟動點金靈指令,
Client也可以透過它下開啟元大寶來的B2CAPI指令。

Http Admin Server:
負責下指令、詢問NDDE Agent。
這個Server是應朋友需要加上的,透過它可以用Http URL的方式下指令給NDDE Agent,
因為它模擬Http Server,因此每次詢問或下指令後,都會回應並斷線,
它可以提供DDE訊息,但只能透過詢問方式取得,沒有即時性。

NDDE Agent特色:
1. DDE轉Socket程式
2. 支援多DDE註冊
3. Data Server用non-blocking方式開發,理論上在多Client同時接收時,能盡量降低延遲時間

NDDE Agent各部份設計:


NDDE Agent整個程式只有1個.cs檔案,算是整個Java ATS裡面數一數二醜又難看的程式,
好消息是,程式算單純,而且一段一段,分得還算清楚。

程式碼說明:
Admin Server、Http Admin Server各自是一個獨立的Thread,
Admin Server和Http Admin Server都是以TcpListener實做。

Data Server就是NDDE Agent的主程式。

NDde和EWinner的B2CAPI,它們都是設計成Event Handle的形式,
因此裡面像是objEwinner_OnDataResponse、DDEOnAdvise,
就是它們各自的Event Handler function。

DDE Connect Table和DDE Item Table,為了紀錄所有註冊的DDE連線,
因此設計2個Hash Table,各自儲存所有的DDE Connect和所有的DDE Item,
新增、刪除都會紀錄在這2個Hash Table內,然後才下function去註冊和刪除DDE。

AutoIt程式操作,AutoIt本身大概可以寫上一整篇,
先前為了寫AutoIt版的Stock Server,可以說是遇到很多麻煩,
這裡只是為了啟動點金靈,用的不多,就不細說了,
程式裡面有用到的只有2個片段,用au3為關鍵字查詢,就能看到那段內容。
這2段程式功能大意是:
登入:輸入帳號密碼、按確定、等公告、按確定
登出:關閉點金靈程式、按確定

程式啟動說明:
程式啟動後,畫面如下:

它會顯示NDDEAgent的版本號碼和Admin Server、Http Admin Server、Data Server的Port。

Admin Server指令說明:
確定NDDE Agent啟動後,此時用telnet連Admin Server,如下:

此時輸入help指令,按下Enter,如下:

會看到所有指令的一覽、說明、範例。

Http Admin Server指令說明:
和Admin Server類似,但改為瀏覽器輸入,所有指令的格式都如下:
http://[Server IP]:58892/command?[指令]

例如我這邊的環境:
NDDEAgent的IP是192.168.1.12
我要呼叫help指令,瀏覽器輸入如下:
http://192.168.1.12:58892/command?help

截圖如下:

Data Server說明:
程式啟動後,telnet到58888 Port,畫面如下:

當有DDE訊息進入後,就會直接收到,例如:


DDE語法說明:
在NDDE Agent中,針對DDE註冊,需要下指令,語法如下:
add conn DDEService|DDETopic
add item DDEService|DDETopic!DDEItem
add item DDEService|DDETopic!DDEItem
add item DDEService|DDETopic!DDEItem

以點金靈要註冊「中鋼」(2002)的成交價格、開盤價格、最高價格為例,如下:
add conn EWinner|RQ
add item EWinner|RQ!2002.Price
add item EWinner|RQ!2002.Open
add item EWinner|RQ!2002.High

截圖:


要刪除,直接刪除Connect,我記得程式會自動把item統統刪掉。
remove conn EWinner|RQ

程式需求:
執行時,程式需要下面幾個.dll檔案:

  1. 元大寶來的B2CAPI dll檔
  2. AutoIt dll檔
  3. Ndde dll檔和1個xml檔案
  4. 程式使用前,要確定AutoIt的dll有正確註冊
  5. 目前點金靈自動登入的分公司選擇無效,需手動勾選「記憶帳號」,並成功登入,讓點金靈記住分公司資訊後,才能使用NDDEAgent做自動登入的功能


使用平台是選WinXP,理論上應該適用大部分Windows系統,
選WinXP的原因是,它的使用空間最小、系統資源吃得最少。

為何不用Win2K?Win98?
之前一直是Win2K,但Win2K現在證券軟體支援很差了,只能換到WinXP。
Win98,嗯......VirtualBox的支援都很差了,不用說證券軟體了。

程式下載:
講這麼多,程式在哪?程式碼在哪?
http://www.openfoundry.org/of/projects/1818

股市自動交易系統(半完成品) - 設計發想與架構

隨著台股上9000點,加上最近比較沒這麼忙,
又想起了一直想做的程式交易。

在先前,為了做程式交易,我陸續自行開發了許多程式交易的程式和元件,
但最終因為一個人人力有限無力負擔,加上回測部份一直沒有完成,
操作演算法一直沒有頭緒,因此就讓它自然荒廢了,
我想,網路力量大,把它Open Source出來,也許會有比較多人想一起來寫,
這篇,會先介紹這個未完成系統的架構與設計發想。

程式交易架構:
程式交易系統千千萬萬,但不外乎下面這幾個元件:


設計發想:
在開始設計時,我有幾個需求:

  1. 希望在Linux上進行程式交易
  2. 希望能夠有彈性,方便開發和修改交易演算法
  3. 全自動操作,免人為操作
  4. 最好有類似證券軟體的GUI可以回測


因為上述條件,我開始進行設計。

設計:
即時資料源:
在台灣,台灣的證券公司普遍提供Microsoft DDE做為即時資料源,
我不得不說,DDE這東西已經快變成骨灰了,Microsoft自己都不太維護這東西了,
證券公司是該改改了吧,
人家國外直接有IB提供完整的API,可以抓歷史資料、即時資料、下單,
靠DDE是要打混摸魚到什麼時候?
離題了.......

因為DDE是Microsoft的東西,Linux一定不支援,
加上要做到全自動,自動啟動證券軟體的開啟、登入是必要的,
因此針對Windows的DDE,我做了下面的設計:

這個設計簡單說,就是在Windows上寫個Agent,
Linux端透過Agent取得資料源的資料,
Linux端也透過Agent控制證券軟體的操作。

歷史資料:
歷史資料主要就是Parse證交所網頁的每日資料和歷史資料,
當然也可以從證券軟體中把歷史資料匯出到Excel後取出。

歷史資料的儲存,設計上是儲存到mysql,
但理論上,因為它沒有用特殊語法,因此它應該可以支援各式SQL Server。
設計如下:

下單:
在元大寶來有提供B2CAPI,可以透過寶來點金靈進行下單,
但和取得即時資料有相同的問題,它只支援Windows,不支援Linux,
因此設計上和取得即時資料相同,都要透過Windows的Agent進行操作。
設計如下:

交易演算法:
這裡的交易演算法,是我的稱呼,它其實就是俗稱的「下單機」、「自動交易程式」...等。
設計上就是JavaATS Server(ATS為Automated Trade System的簡稱)。

它的設計發想包含2部份:

  1. 它是Time Trigger的系統
  2. 演算法容易開發、維護


Time Trigger設計:
在設計時,它的定位不是高頻交易系統,也不是當沖系統
它的設計比較趨近於短線操作(精確度:分鐘),或中長線操作(精確度:天以上),
因此它並不是根據成交觸發的Event Trigger設計
它的設計是以Time Trigger的方式,定時觸發執行。

它有2種Time Trigger觸發執行,
一種是以秒為單位的定時觸發,
另一種的執行週期最短執行為每分鐘,最長可以是數天甚至數週。

為了提供彈性的定時執行計畫,我以Linux的crontab設計為發想,設計了下面這樣的語法:
*_*_*#* *:*/1

[年]_[月]_[日]#[週] [時]:[分]

語法和crontab類似,
可定義「某年」、「某月」、「某日」、「某周」、「某時」、「某分」。

和crontab一樣,它可以定義週期執行,例如:
*_*_*#* *:*/1

*/1     表示每分鐘執行

和crontab一樣,它可以定義多個特定時間點,例如:
*_*_*#* *:1,5,10,15,20,25

1,5,10,15,20,25     表示每小時的1分、5分、10分、15分、20分、25分執行

和crontab一樣,它可以用「*」定義是否mask該時間設定,例如:
2014_7_*#* 13:0

2014年7月,每天的13:00執行

這樣的設計理論上可以提供極大的彈性,規劃出任何時間的週期執行。

這個設計的缺陷是,它不支援以秒為單位的短時間觸發,
因此,我另外設計了Interval Timer Trigger,可以設定固定間隔幾秒觸發執行。

演算法設計:
在我一開始找程式交易相關資料時,注意到下面幾個是大部分人的開發系統:

  • Excel
  • HTS

Excel:
Excel因為有大量Cell和方便的圖表產生器,
最重要的是,它有方便的VBA可以開發,
因此是很多人入門的首選。

HTS:
HTS實際上裡面提供了Power Language的程式開發功能,
可以簡單的開發出交易程式,搭配HTS內提供的圖表,可以方便的回測。

再經過一段時間的摸索後,我得出一個重要結論,
演算法不好開發,等於無法使用。

想想看,我希望有個MA(移動平均)資料,卻要寫出2頁程式碼,
這應該沒人受得了,
但偏偏傳統的通用語言C/C++、Java、Python、Perl、PHP...等,
都不是針對自動交易設計,一定是難用又難受,
光想到寫個簡單的邏輯演算法,卻要Compile再Compile,
如果是C/C++,甚至還要處理new、free、delete的問題,嗯.....很痛苦.......

但矛盾的是,大部分的程式資源,又都集中在C/C++、Java...等通用語言上,
像Power Language這類語言,沒有提供的功能,你就是無法使用,
試想看看,一個開放的競技場,不限定使用的武器,
但你用Power Language,表示你只能用長矛、用盾牌、用護甲。
槍呢?對不起,沒有提供
劍呢?對不起,沒有提供

我認為在先天上就輸了,你用它可以贏過沒有裝備的人,
但對於有能力自製武器的人而言,你先天就輸了,因為你缺乏武器........

為此,當時我找了一些Open Source的Script,
加上Java ATS一開始是用Java設計,
因此後來選定了BeanShell做為開發。

BeanShell本質上就是Java,理論上所有Java SDK都可以透過BeanShell呼叫執行,
BeanShell以Script方式執行,可以很方便的在修改後直接執行,
不用經過Compile,Java不用解釋了,它不用free/delete,
這能夠很大程度的降低開發門檻。

剩下的麻煩是呼叫方式,我希望簡單的呼叫個function,
就能夠達成,例如:
BUY(0050, 1);           //買0050,1張

因此,我當時決定寫個API,就叫做StockAPI,
提供些會用到的function,能夠方便的呼叫使用,
裡面實際上就包裹了實際操作的麻煩。

針對上述的2項設計,以及前面的幾項元件,其架構如下:
訊息通知:
訊息通知不外乎就是,
下單後通知自己,已經下單,
成交了通知自己,已經成交,
有危險時通知自己,快點逃命。

訊息通知方式,不外乎有數種IM軟體,包括:

  • MSN
  • Skype
  • GTalk
  • LINE
  • What's App
  • Yahoo Messager


實際上,有提供API的,大概只有

  • MSN
  • GTalk


Line和What's App都沒有免費提供API,Yahoo Messager我沒有使用,
Skype好像有,但之前很少用,現在被Microsoft併購後,SDK是否有提供不清楚。

因此在先前,我先開發了MSN的Client,後來寫了GTalk的Client。

SMS?
SMS要花錢,原則上直接排除。

回測:
很不幸的,回測部份我並沒有找到很好的回測設計方式,
這也是這個系統遲遲無法使用的主要原因之一。

我本來期望的是,能夠類似HTS一樣,下個Draw之類的就能畫出來,
但不幸的,每種資料的資料形式差異太大,
資料的X軸、Y軸標記形式太多,
並沒有一個固定的模式可以動態產生所有想要的圖形,
因此沒有設計出來。

另一方面,回測的作法目前我也沒有概念,
是用類似replay的方式餵資料,或者載入後直接顯示在圖形上,
還沒有想好設計方式,因此回測部份目前沒有任何設計。


2014年2月8日

網樂通開發 第2集 - 網樂通上嵌入式Linux

本篇前言:
這篇會先介紹網樂通上的嵌入式Linux,要玩它、修改它,要先知道它哪些可以改。

本篇開始:
所有嵌入式Linux系統都差不多,大致上包括:

  • BootLoader
  • Linux Kernel
  • rootfs
在網樂通上的嵌入式Linux包括如下:
  • BootLoader:u-boot
  • Linux Kernel:Debian Kernel for 網樂通、ArchLinux Kernel For 網樂通、sh4twbox 0.92 Kernel、網友提供2.6.32.59版Linux Kernel for 網樂通...等
  • rootfs:sh4twbox、Debian、ArchLinux
網樂通嵌入式Linux幾個部份的說明:

BootLoader:
網樂通的BootLoader是使用u-boot,這套BootLoader在嵌入式系統上經常被使用。
網樂通內建的RAM是256MB,但不知道為何,官方的u-boot只開放了128MB,
因此網友修改u-boot程式碼,讓網樂通u-boot能支援256MB。
關於刷u-boot,可以參考:

Linux Kernel:
Linux的驅動程式幾乎都相依在Linux Kernel上,
要讓網樂通支援其他硬體,像是usb webcam、usb wifi...等,
Linux Kernel都必須要自己重新編譯。
另外,針對Debian for 網樂通和ArchLinux for 網樂通,
因為本身有一些Kernel module的套件,所以會需要各自的Kernel,
否則一般而言,在網樂通中,Linux Kernel是可以另外編譯,另外支援。

rootfs:
一般所謂的網樂通刷機,指的都是更換rootfs。
所以rootfs實際上指的就是更換成sh4twbox、Debian、ArchLinux...等不同的Linux系統。

各部份在網樂通的位置:
在網樂通的刷機文件中會提到,網樂通需要至少2個分割區,
第1個分割區必須是FAT32,第2個分割區必須是ext2/ext3/ext4,分割區類似如下:








第1個分割區就是存放Linux Kernel的,內容如下:





第2個分割區就是rootfs,內容如下:

















從這裡可以注意到,除了BootLoader外,
Linux Kernel和rootfs都直接按不同分割區放置,很容易可以區分。

更換各部份:
更換Linux Kernel:
如果我們重新編譯Linux Kernel,要更換新的Linux Kernel,
只要將編譯出來的vmlinux.ub直接覆蓋sda1的vmlinux.ub,
重新開機後就會是載入我們新編譯出來的Linux Kernel。
類似如下:









更換rootfs:
要更換rootfs,最簡單的方式就是參考sh4twbox的教學
先將產生的rootfs壓縮打包好,接著按照正常刷機的步驟,
sh4twbox的教學的1.4第2步指定我們自己的rootfs壓縮檔,
它就會幫我們把rootfs解壓縮建立好。


網樂通開發 第1集 - 刷機版本的選擇

這篇開始,我會以網樂通和STLinux為基礎,寫一些自己開發的心得文章,
這篇是第1篇,主軸放在目前網樂通刷機版本的介紹,
因為這系列文章是以開發為主,不會描述刷機的過程,
文章會描述的是如何用網樂通和STLinux進行Cross-Compile,
目標是透過這系列文章,可以將網樂通開發成自己想要的功能主機。

本篇前言:
目前網樂通在網路上文章很多,但有點雜,
我過年前開始玩時,發現有好幾個不同版本的網樂通系統可以刷,
但並沒有太多文章描述這幾個版本有何不同,系統差異在哪。
因此,第1篇目標放在對幾個版本的描述,
在開發時,可以根據目標選擇合適的系統來刷。
這裡要先說的是,ArchLinux我不熟,所以針對ArchLinux的描述並不確實。

網樂通版本:
目前網樂通刷機的版本大致可以分為4種:

  • sh4twbox 0.62版
  • sh4twbox 0.92版
  • Debian wheezy版
  • ArchLinux版

sh4twbox 0.62版:
大本營:https://code.google.com/p/sh4twbox/

sh4twbox系列通常是網樂通第1次刷機的選擇,
事實上,0.92版刷機時用的USB隨身碟本身就是sh4twbox版本。

sh4twbox是以STLinux為基礎的Linux系統,
STLinux則是網樂通使用的SuperH系列處理器廠商維護的嵌入式Linux版本,
sh4twbox是以STLinux 2.3版為基礎修改而成,
目前STLinux2.3已經停止開發,因此sh4twbox也建議不要再使用sh4twbox 0.62版。

sh4twbox 0.92版:
大本營:https://code.google.com/p/sh4twbox/

sh4twbox 0.92版是以STLinux 2.4版為基礎的Linux系統,
是目前原廠正在維護的嵌入式Linux版本。

STLinux設計上就是嵌入式Linux,
相對於ArchLinux和Debian來說,它有幾個優點:

  1. 系統小使用資源少:最直接的就是開機時間比較短,系統運作比較順,反應比較快
  2. Cross Compiler環境:STLinux原廠提供了完整的Cross Compile環境供開發
但相對的它有幾個缺點:

  1. 現成的應用程式少
  2. 嵌入式系統和桌上型Linux環境差異較大

Debian wheezy版:

我個人熟悉的Linux其實是Debian/Ubuntu,但對於Debian在sh4處理器上的支援性,
我真的是覺得爛到爆了。

目前網樂通上,因為有Debian for 網樂通的善心人士協助,
網樂通上的Debian能跟上目前Debian的Stable版本Wheezy版,
從網站上可注意到,
他們現在正努力的讓Debian的下一個版本(目前是測試版)能支援網樂通。

相對於STLinux,Debian wheezy版有幾個優點:
  1. 現成的系統整合較好:像X-Window、幾套X-Window管理器都能順利運作
  2. 和PC版Debian開發環境相同:開發環境相同,開發上比較沒障礙
但它有幾個致命缺點:
  1. 系統大,使用資源多:最直接感受到的就是開機時間長,操作時反應慢
  2. 套件數量少:Debian for sh4的支援性差直接體現在套件數量上,它的套件數量相對於ARM版本就少很多,跟PC版Debian根本沒得比
ArchLinux版:

sh4twbox的作者覺得ArchLinux是網樂通比較好的選擇,因為ArchLinux套件數量多,
又是用PKGBUILD方式針對不同平台build,因此理論上要安裝套件,
只要透過ArchLinux的PKGBUILD就能建立出網樂通版的套件,
並安裝在網樂通上。

但可惜的是,ArchLinux我不會用,
對於PKGBUILD的使用方式以及套件的建立環境不會架設,
於是就.......

因為不懂ArchLinux就不多做評論了,這裡僅列出我刷機後使用時的感覺:
  • 開機速度比STLinux慢,但比Debian快
  • 系統的反應比Debian快

buildroot網樂通系統:
我自己在過年期間,有用buildroot建立過網樂通系統,並成功刷機執行。

buildroot可以簡單的建立出整個嵌入式系統,
DD-WRT、OpenWRT都是以buildroot為基礎修改的,
buildroot系統的優點是:
  • 系統小
  • 速度快
缺點是:
  • 幾乎沒有提供開發環境,只有執行環境
我自己使用的感覺是,buildroot系統比STLinux快,環境更小,
如果是buildroot有提供的功能,像是QT的Transmission。
直接使用buildroot說不定更好,系統資源更省。

我會在Cross Compile環境介紹後,介紹buildroot建立網樂通系統方式。

2014年2月5日

網樂通硬改,更換大容量或高速USB DOM(免焊接)

網樂通內的儲存空間主要是靠USB DOM,
要加大空間或者更換USB DOM網路上都能搜尋到文章,
文章原則上有3類:
  1. 直接用USB隨身碟插在屁屁
  2. 拆機後,把USB DOM的接腳另外焊上USB隨身碟
  3. 拆機後,原來的USB DOM焊接個USB接頭當隨身碟
我的問題:
內建的USB DOM真的有夠爛,
速度慢也就算了,刷一刷竟然被我刷掛了。

我的那個USB DOM死法真的是沒救,
它應該是USB DOM最前面儲存Partition的block壞軌了,
每次重新建立Partition,重開機Partition就消失了,
因此,它無法正常的刷Linux,
所以,我需要更換USB DOM。

因為這個原因,第3種教學文章直接沒用;

第1種作法不錯,但我的目標是Printer Server,
後面的USB需要接印表機,沒辦法用;

第2種作法不錯,但我技術差不想動電烙鐵,
怕下手後沒處理好,反而把元件燒了。

最終我找到了折衷的辦法,也就是我要發的這篇文章的作法。

我的作法:
網樂通上面的USB DOM,
接在板子上的4個pin腳其實就是杜邦端子的公頭,
網路上的教學是,
直接在端子和板子的焊接點上,焊接一個USB隨身碟,
但其實不用,只要自己剪條USB線,
在USB線做出4個杜邦端子的母頭,
就可以直接插入,完全不用電烙鐵焊接。

所需工具和零件:
  1. USB線一條(要有USB母座)(越短越好)
  2. 剝線鉗一把
  3. 杜邦端子接頭數個(至少5個以上,以防失敗)
  4. 4P杜邦端子座1個
  5. 豆子隨身碟1個(可選購4G、8G、16G、32G)
過程:

1. 首先準備一條有母頭的USB線,留下一小段,剪斷它並去皮,如下圖:


 2. 用剝線鉗接USB的4條電線都做好杜邦端子,這部份是最麻煩的,完成品如下圖:

3. 將網樂通上的USB DOM拆下後,最重要的,把它原本的杜邦端子座移除,如下圖:

 4. 將USB線上面的杜邦端子套上杜邦端子座,插上網樂通的端子頭,如下圖:
這裡注意到,一定會有疑問是,線怎麼排列,5V方向在哪?
USB線的順序是(由左而右):
黑 綠  

如下圖所示,
左邊是網樂通後面,右邊是網樂通前面,
電源接頭在左下角,網路接頭在左上角,
此時,USB線的紅色靠下。

5. 完成後,按網路教學用背後的USB隨身碟開機,刷Linux,應該就可以看到新的USB DOM。

網樂通開發文章計畫開始

利用過年期間,把網樂通的開發玩了玩,雖然還沒玩完,
但對於網樂通的STLinux開發有了一些心得,
我想後續應該可以針對網樂通sh4 STLinux的開發寫出大概4~5篇文章。

文章大概會從比較基本的網樂通目前網路上有的Linux Distribution介紹,
大概描述STLinux、ArchLinux、Debian在網樂通上我認為的區別。

接著會把主軸放在網樂通的STLinux如何開發。

如果我的Printer Server順利的話,
最後應該可以以Printer Server為例描述過程。

2013年12月22日

核能發電的未來-放射性同位素電池(核電池)?

核能發電有諸多的問題,
最主要的問題是輻射線容易外洩核反應有可能不受控制

但想想看,衛星、火星車也都用核能,沒聽說衛星或火星車需要更換燃料棒,
原因就在於它們使用的是核電池。

我的想法是,如果把目前大型的核子反應爐縮小,
改成發電效率比較好的核電池(目前核電池發電效率很差,網路上說只有8%~10%),
一個發電站內存放100顆小型核電池,
每顆核電池的核元素封裝在中心,無法開封、更換,
但保證能持續產生穩定能量20年或30年,
核元素的外部透過熱電發電機或者核元素放射的電子發電。

如此一來,每次只需更換核電池的某些元件,
像熱電發電機可能會有壽命需要更換,
核心核元素不用更動,時限到了頂多也是整顆核元素中心更換,
從頭到尾不會有輻射外洩或者核反應無法控制的問題,
雖然每一顆提供的電量少,但可以用大的數量來補足,
發電站可能以城鎮為單位,例如各縣市一個發電站,僅供應單一城鎮電力即可。

我認為這種作法不錯,
同時可以避開核能發電廠的問題,
以及有效利用核能發電的優勢。

我認為,目前的核能發電方式的確蠢了一點,
利用核能產生熱能,然後燒鍋爐水,
利用鍋爐蒸氣推動汽輪機發電,
整個結構除了改用核能產生熱能之外,
跟汽油、瓦斯、煤炭燒鍋爐水發電一模一樣,
我認為這不是先進的發電方式,
因為光中間
核能轉成熱能→熱能燒開水→水變水蒸氣→水蒸氣推汽輪機→汽輪機發電

每個環節事實上都有轉換效率問題,
任何一個環節異常,就會導致發電異常,
前段異常,甚至會造成輻射外洩,
而為了防堵中間的問題,
目前的手法卻是在每個環節增加更多的安全機制,
在異常出現時立即中斷某個環節,
但異常何其多,有辦法全部考慮到嗎?
那麼,是否該重新思考核能發電的整個流程是否合理?

我贊成核能發電,我認為目前人類並沒有發現比核能更強大的能源,
要解決人類能源使用的問題,我認為目前核能還是唯一解,
但我認為是時候發展新型態的核能發電方式了。

PS:
核電池不會反應過度的原因是,
核電池是讓核元素自然反應,讓它自然的衰變,
並不會控制它的燃料或反應,
優點是它的衰變速度慢,反應速度只會持續下降,持續時間長;
但缺點是他的能量產出較少。

2013年9月29日

硼酸蟑螂藥餌研發成功(內有蟑螂照片,不喜勿入)

自從大樓一樓開快炒店後,家裡的蟑螂每年呈現倍數增加,
加上家裡廚房設計不良,因此蟑螂非常囂張。

為了蟑螂問題,我做了一些措施,但成效不大,
加上家裡人並沒有良好習慣,且都沒有共識,
近兩年家裡開伙,情況更加嚴重。

這次嘗試使用蟑螂藥餌,但試作了多次都失敗,
這次應該算是接近成功的。

有圖有真相,先來幾張半夜蟑螂覓食的照片。
地點:客廳
放置時間:一開始(把蟑螂趕過去後)

地點:客廳
放置時間:15分鐘後

地點:客廳
放置時間:45分鐘後(全家都來了)


地點:客廳
放置時間:2小時後(鄰居也來了)


 實際實戰,放置於廚房瓦斯爐縫隙。
地點:廚房瓦斯爐縫隙1
放置時間:2小時後
左邊那隻蟑螂實在太搞笑了,整個身體不平衡,嘴巴還趴在藥餌上吃。
旁邊那是.....蚊子嗎?你來搶什麼鏡頭啊.....

地點:廚房瓦斯爐縫隙2
放置時間:2小時後




幾次蟑螂藥餌的製作,最大的問題並不是蟑螂不吃,
最大的問題是藥餌乾掉硬掉的問題。

網路上硼酸藥餌的教學都是說用糖水和,
但我發現用水和,當藥餌放了1星期後,會因為水乾掉,
整個藥餌變成麵粉糖塊,蟑螂根本啃不動,
所以還是會零星看到蟑螂爬過去,但碰兩下就走了,
顯然太硬啃不動。

後來參考了蟑螂炸彈作法後,發現可以用果糖替代,
因此這次不用水,完全改用果糖,效果看起來不錯。

至於為何不做蟑螂炸彈?
蟑螂炸彈不用硼酸改用農藥,
農藥傷殺力太強了,我家蟑螂都從廚房來,
難保蟑螂和農藥不會變成晚餐的一部分。

製作材料:
  • 低筋麵粉
  • 砂糖
  • 豐年果糖
  • 硼酸
  • 排油煙機廢油

製作比例:
  • 麵粉20kg
  • 砂糖20kg
  • 硼酸20kg
  • 排油煙機廢油數滴(我大概滴了10滴左右,一小佗的我算一滴)
  • 果糖比例未知
製作方法:
  1. 用數位秤邊量邊放入麵粉、砂糖、硼酸,數位秤很便宜,網拍買,一個不到NT 300元,非商業用即可。
  2. 攪一攪或倒一倒把麵粉、砂糖、硼酸混在一起
  3. 滴入排油煙機廢油數滴,攪一攪
  4. 滴入一些豐年果糖
  5. 倒一些豐年果糖在手上,然後用手抓一堆有結塊和沒結塊的混合粉末
  6. 在手上擠一擠、捏一捏,捏成球形,中間捏不成型時,就倒一點豐年果糖在手上或手上的混合粉末
最後捏出來的圓形,應該會是像下面這張照片的球形。














做好後,就把捏出來的幾顆球放到保鮮袋,如下照片。













任何時候需要時,就把手指伸進去,捏一點出來擠成小圓球,
放在蟑螂出沒或覓食的地方即可。

2013年9月26日

「阿呆的blog」新轉址「ycfu.blog.mypc.tw」

我註冊了新的網域「mypc.tw」。

阿呆的blog之後會轉址到「ycfu.blog.mypc.tw」,
原先google提供的ycfunet.blogspot.tw仍可繼續使用,
它會自動轉過來。

這次註冊到的網域「mypc.tw」有興趣可以google看看,
我只能說,我能註冊到真的是非常的幸運。

2013年8月31日

可惡的山水米混充越南米

我很少發新聞類的文章,
翻看blog,早期還會有一點新聞文評論文或政治文,
但很久沒有了,這次真的是想提一下。

在台灣買米,要不被混充越南米、泰國米很難,
看看這次上新聞,越南米、泰國米的價格根本是台灣米的一半,
混越多賺越多。

但吃米會知道,泰國米、越南米不好吃,
混太多就很容易被吃出來,
所以關鍵問題在於「混充多少」。

往往買米時會發現,一包米或一斤米有不同價格,
價格高的往往「比較好吃」,價格低的往往「比較難吃」,
明明都是台灣米,怎麼還有好吃不好吃之分?

其實價格不同的關鍵,在於「被混充多少外來米」,
混充多,比較不好吃,就價格低一點,
混充少,比較好吃,就價格高一點。

但可惡的地方在於,台灣本身產米,而且是「生產過剩」,
農田甚至需要休耕。
每次這類問題上新聞,原因都被歸咎在現代人飲食習慣改變,
改吃麵線、麵包這類麥製品,稻米使用量自然就減少了。

但問題是,當我們吃飯,甚至買「台灣米」,
買到的卻是一堆泰國米、越南米,
一般消費者怎麼吃得出差異?
當大家自以為我們在吃台灣米,減少稻米生產過剩時,
誰知道其實還幫泰國、越南賺了外匯?

在細想這問題,米商為了賺錢混充低價外國米,
但有沒有想過因為你們的舉動,會不會造成稻田休耕?
自產米就已經生產過剩了,還使用外來米,這是正確的行為嗎?

在目前,一些農友都會自產自銷,可能透過網路,或者透過電話,
然後直接宅配到家。
這類的自產自銷幾乎可以確定百分之百是台灣的台梗9號米,
沒有混充的問題。

如果有要幫忙稻米生產過剩的問題,除了多吃飯之外,
直接由產地透過網拍、電話、宅配買米,可能是好辦法。

2012年12月3日

投資就不用工作?

這篇其實算是延續上一篇「%百分比的魔力」。

當景氣大好時,尤其是2008年金融風暴前,有一些人一些言論會出現,
多半是「唸甚麼書,炒股(投機)就能賺大錢啦!」,
「工作幹嘛,炒股(投機)都賺得比工作多啦!」。

而從上一篇我的想法中,我認為投資的資金大到一個程度後,
基本上工作賺錢已經沒有意義了,
因為你投資獲取的獲利,大於你工作獲取的獲利,
那麼你就不需要為了賺錢生活而工作。

但在上一篇有一個重點,投資的獲利,是根據本金決定的,
本金越大,獲取的獲利會等比增加,
可惜的是,每個人出生在這個世界上,
落地的當下,身上擁有的本金並不相同,
富二代之所以叫富二代,就是因為他們一出生,
身上就是有非常驚人的財富可以當本金。

正如前面說到的,大部分生產者都不是資本家,都沒有錢,
生產者生的孩子,一落地,就跟你、我一樣,
甚麼都有,就是沒有錢,
那麼,你、我要靠投資賺錢過生活,基本上是沒辦法的,
很簡單的計算公式:
0 x 3% = 0

就算今天給你30%獲利的機會:
0 x 30% = 0

基本上,在現在這個資本的世界中,
沒錢就是沒有進入「%百分比」世界的機會,
因此沒錢的人靠投資,是沒辦法的。

但工作不同。
工作和投資的區別是,投資是用錢賺錢;
工作則是用身體(勞力、體力、精力)賺錢。

這表示,工作賺錢不用成本(著裝、知識、技能、談吐...等在此不考慮)。
因此在一無所有時,工作是唯一獲取獲利的方式。

如果用工作產生獲利這樣的方式套入到「%百分比」的世界中計算:
假設今天月薪是1000元(假設成本為1)
1 x ?% = 1000

你會發現,靠工作賺錢,獲利高達1000倍,
因為實際上,工作是靠身體,不是靠本金,
套入很低很低的本金後,獲利非常大。
因此,在沒錢時,還是乖乖工作賺錢,沒錢時候投資的獲利,
不可能高過工作靠身體賺得錢。

但從前一篇來看,靠工作賺錢,當生產者,永遠只能被投資者剝削,
且永遠無法出頭,那怎麼辦?
所以比較好的辦法是,在年輕時努力工作賺錢,
賺來的錢進行穩當的投資,
此時的身份既是「生產者」也是「投資者」。
當本金增加後,本金多到足以產生足夠獲利(現金流)進行生活,
此時就能夠退休了,
而退休,實際上就是轉換身份為「投資者」,不再是「生產者」。

此時如果不退休繼續工作,工作的目的也不再是為了生活,
那麼工作時的心情、心態也會不同。

因此結論是,
不能因為投資就不工作,只要投資的現金流沒有建立完成,
是無法依靠投資養活自己,
此時當「生產者」工作能獲得的獲利是遠高於投資的,
當投資的本金大到某個程度後,
就能夠將自身的角色進行轉換,轉換成「投資者」,
更好的方式是,
在工作同時存錢和投資,一邊當「生產者」一邊當「投資者」。

最後一點,
現實世界總是不這麼美好,
為了吸引大量的「生產者」貢獻金錢,
會將金融商品包裝成奇奇怪怪的東西,
這些東西,10個有9個半都不美好,多半都有陷阱,
但介紹時,從來不會提它們的陷阱,只會提這些商品的好處,
甚至許多詐騙集團,擺明就是詐騙,
賣的東西連金融商品都不是,只是偷竊,偷「生產者」的錢。

對於投資,我只能說,
金融世界裡,「獲利」都伴隨「風險」,高獲利就是會有高風險
當今天你被推銷金融商品時,它告訴你獲利的當下,
請仔細檢視它的獲利和風險
獲利,請和「定存利率」比較,風險則要自己評估,
當獲利很高時(比定存利率高很多),請了解它的風險,
或者它根本是詐騙集團。

現在這個世界,沒有人會好心的推薦你穩賺不賠的投資,
只有自己了解風險,才能知道自己要的是甚麼投資。

%百分比的魔力

其實滿慶幸我在經歷金融風暴時,有開始買股票,並注意相關訊息,
當時的許多新聞或節目,多半會針對金融風暴給予評論,
讓我可以對投資理財有一點點認識,
這邊提出我對投資理財的第一個有趣的了解,
我取名叫「%百分比的魔力」。

在投資理財中,一句話經常被提出來,那就是「複利的威力勝過原子彈」,
但其實我認為,真正厲害的基礎其實是「%」。

在投機和投資中,如果稍微注意會發現到,
所有的賺賠都不是用「金額」,而是用「%」,
舉個例子:
一家公司股票每股單價為10元。
今年公司賺錢,給股東每股0.3元。
這時候小朋友都知道,這家公司股票的股息就是3%。
假設我有1,000股,以每股3%來計算,表示我可以獲得300元。
但如果我有10,000股,同樣以每股3%來計算,
表示我可以獲得3,000元。

從上面的例子可以發現,不用金額而用%百分比來計算的原因是因為,
每個股東持有的股份數量不同,因此獲得的股息也會不相同,
從這樣的角度來看,整個過程和計算都是非常合情合理的。

從%百分比的角度來看,利息的金額多寡沒有意義,
真正有意義的是持股單位和%百分比,它才真正決定了利息的金額高低。

1. 「%百分比」的世界,沒有獲利成本,沒有資源上限,而且大者恆大
從這裡可以推想出一個現實,以%百分比為單位的世界中,
本金(持股單位)越多,獲得的利息會等比例增加,
以上面的例子來說,
持有1,000股和10,000股相比,獲得的股息同樣差10倍。
這說明了,在%百分比的世界中,是大者恆大的,而在金融市場中,
基本上就是個%百分比的世界,而這裡不考慮內線...等不正規的投資方式,
在這個世界中,就是本金越多,獲利越大。

現實的世界是甚麼?跟%百分比的世界不同在哪?
現實是,我們都生活在地球,所有資源都是有限的,
田地是有限的,人力是有限的,
更白話的說,一個人一天就是只有24小時,一個人的精力就只有那麼多,
全地球田地的耕作面積就是這麼多,全部的一切都是有上限的,
但按照%百分比和比例,在%百分比的世界中,
只會有非常多的本金(持股的資金),
並希望按照%百分比獲得非常多的利息,但沒有上限。

例如:
今天耕作,1畝地可以產生等值10元的穀物,按%百分比來看,
我只要有100畝地,就可以產生等值1,000元的穀物,
我只要有1,000畝地,就可以產生等值10,000元的穀物,
所以我只要增加耕作面積,就可以賺到非常非常多的錢,
真的是這樣嗎?
事實上,現實是,當你有1,000畝地時,你無法單憑自己的力量耕種,
必須要依靠額外的人力,或者聰明的用機器,
但不論哪種方式,成本都會增加,
而且,1000畝地之後呢?10,000畝地?還是1,000,000畝地?
耕地從哪裡來?

但如果換一個角度,我們用投資的角度來看這件事情,
我們先不考慮物以稀為貴這件事情,單就%百分比來看。

例如:
今天某公司股票每股100元,我可以花100元買1股,也可以花100,000買1,000股,
我也可以花10,000,000,000買100,000,000股,
當公司賺錢給予3%股息時,獲利可以等比例的增加,
1股的只能得3元,但100,000,000股的可以得300,000,000元,
而且中間沒有任何額外的成本,
沒有耕地限制、沒有人力限制、沒有機器維護,油耗成本。

2. 投資者是在「固定%百分比」的世界計算獲利,生產者是在「固定金額」的世界計算獲利
目前的世界上,大部分的人努力花費勞力,體力,腦力,精力在進行生產,
而這些生產產生的獲利,就如同上面耕地的例子,它是用「金額」計算的,
而不是用「%」計算的。
例如:
我每天認真工作,一個月領取1000元。
我這個月加班,因此領取1200元。

但不論是1000元,或是1200元,都是用「金額」計算,不是用「%百分比」計算,
當你用「固定金額」來計算獲利,而投資者用「固定%百分比」計算獲利時,
你會發現,利基根本不同,不管你怎麼努力,你的最大獲利不可能和投資者相比。

3. 投資者的資金,不會腐爛變質,但穀物有保存期限
投資者進行投資時,它的資金是沒有時限的,舉例來說,30年前的黃金放到現在,
它還是黃金,並且可以繼續增加甚至增值,
但30年前的穀物,只會因為時間而腐爛,因此,對於投資者而言,
錢是會繼續滾錢,讓本金更大,而不會像生產者產出的穀物一樣,放著就爛了。

因此我認為,在現在這個時代,原物料嚴重上漲,全世界貧富差距大,
一個關鍵的原因就是,富者幾乎都是投資者,它們利用%百分比的魔力進行賺錢,
而窮者都是生產者,它們利用「固定的金額」在賺錢,
富者透過投資,將「金額」與「%百分比」間的差值賺到口袋中,
並用相同方式製造無限迴圈,讓這個世界富者更富,而窮者更窮,
並且窮者還在不斷的幫富人賺取大量金錢而不自知。

更恐怖的是,這整個金融世界的運作法則,已經是目前全世界的共通法則,
所有人都認定這一套法則是正確的,並繼續的在運作中
(事實上,歐美為主的資本主義運作這套法則到現在,
還是世界經濟的中心,
這表示目前全世界大部分的人都還是認同這樣的運作法則)。

最後一個問題是,
我們在這樣的世界裡要生存,要當投資者還是生產者?

2012年11月14日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(程式碼下載、使用說明篇)

上一篇解說了JNX-2000D的USB無線接收器和PC間的溝通方式以及測電器的資料表示方式,
這一篇我將我寫好的程式、程式碼和使用方式附上。

程式介紹:
整份程式包含3支程式,2支C程式,1支php的程式,分別是:

  • jnx2000_meter.c
  • jnx2000_monitor.c
  • meter.php
jnx2000_meter.c:
USB無線接收器的讀取程式,它根據前一篇的流程將測電器數據讀出後,
將數據寫到Linux的SHM(ShareMemory)當中,並持續更新。
為了能同時支援多台JNX2000D的USB無線接收器,
每個Channel Number會使用獨立的SHM Key,例如:
Channel 0時,SHM Key為70248070
Channel 1時,SHM Key為70248071
.....
依Channel Number增加使用不同的SHM Key


jnx2000_monitor.c:
Linux Console的測電器資訊顯示程式。
程式執行時,要帶入測電器的Channel Number,
如果SHM Key存在(jnx2000_meter讀取程式正常執行),
就會在終端機中顯示目前的測電器資訊。
畫面如下:


















meter.php:
Linux PHP Web版的測電器資訊顯示程式。
直接透過網頁可以讀取到Web Server的測電器資訊,
Web URL同樣要帶入測電器的Channel Number。
畫面如下:















編譯方式:
jnx2000_meter.c:
jnx2000_meter.c的編譯非常簡單,直接如下即可產生jnx2000_meter:
gcc -o jnx2000_meter jnx2000_meter.c

jnx2000_monitor.c:
jnx2000_monitor.c編譯時要稍微注意一下,
jnx2000_monitor的Console繪圖,是使用ncurses這個library,
因此編譯前要先確定有安裝libncurses5-dev這個套件。
在Debian/Ubuntu下,如下安裝:
apt-get install libncurses5-dev

確定有ncurses的library後,如下執行即可產生jnx2000_monitor:
gcc -o jnx2000_monitor jnx2000_monitor.c -lncurses


使用說明:
jnx2000_meter:
jnx2000_meter使用前要注意幾點:

  1. USB無線接收器的USB要確定插在Linux電腦上,且要確定ttyUSB有抓到
  2. 要確定USB無線接收器是開機狀態(有數值顯示),因為它有省電保護,一段時間沒有和PC通訊,就會自動關機。
  3. 操作順序必須是,先開USB無線接收器,確定有開機,再執行jnx2000_meter。如果先執行jnx2000_meter,是抓不到USB無線接收器的

按照上述幾點,操作順序如下圖:

執行方式如圖片所示,輸入
jnx2000_meter
例如:jnx2000_meter /dev/ttyUSB1&
例如:jnx2000_meter ttyUSB1&


成功取的測電器資訊,會如圖片一樣顯示:
JNX-2000D Channel=9
Share Memory Key=70248079


這就表示jnx2000_meter成功執行中。
最後面記得加上&,讓它在背景執行。

jnx2000_monitor:
jnx2000_monitor使用相對簡單些,要注意的是:

  1. 要確定ncurses library有安裝,在Debian/Ubuntu下可以安裝libncurses5
    apt-get install libncurses5
  2. 必須要先執行jnx2000_meter,才可以執行jnx2000_monitor
要執行jnx2000_monitor,要先知道Channel Number,知道後,如下執行:
jnx2000_monitor <Channel Number>
例如:jnx2000_monitor 9


meter.php:
php版的meter.php功能和jnx2000_monitor相同。
要使用它,首先將meter.php放在php可以執行的Web路徑中,
以我這邊為例,我的Web路徑在
/var/www/

將meter.php放入/var/www/中,之後Web URL輸入如下:
http://192.168.1.6/meter.php

成功了會看到下面的畫面:














此時同樣的,根據Channel Number,在網址列加入Channel Number,
在這裡,我使用的Channel是9,加上:
http://192.168.1.6/meter.php?channel=9

即可出現下面畫面:















SHM資訊:
jnx2000_meter會將測電器資訊寫入SHM當中,
如果要在其他程式中使用SHM資訊,直接讀取即可使用,
SHM的資訊如下:

  1. 每個Channel Number會使用獨立的SHM Key,例如:
    Channel 0時,SHM Key為70248070
    Channel 1時,SHM Key為70248071
    .....
    依Channel Number增加使用不同的SHM Key

  2. SHM結構如下:
  3. typedef struct power_meter_string_data PowerMeterStringData;
    struct power_meter_string_data
    {
            char voltage[10];
            char current[10];
            char quantity[10];
            char duration_days[10];
            char duration_hours[10];
            char duration_mins[10];
            char factor[10];
            char wattage[10];
            char reserve[60];
    };
    所有資訊都使用char表示,並且均為10個字元(含字串結尾),
    最後面包含保留空間60個字元。


程式碼下載:
程式碼與程式

2012年11月13日

JNX-2000D測電器(PowerMeter)-Linux讀取程式(流程、格式說明篇)

延續上篇的JNX-2000D介紹,這篇正式來po出Linux的讀取程式。
如果對程式流程和內容沒興趣,可以直接跳過本篇,看下一篇下載程式和使用說明。

JNX-2000D的USB無線接收器,實際上只是USB to RS-232,將它插到Linux電腦後,
一般來說就能抓到pl2303的USB to serial port裝置,從dmesg顯示如下:
[ 18.283060] usb 3-1: pl2303 converter now attached to ttyUSB1 
[ 18.283090] usbcore: registered new interface driver pl2303 
[ 18.283092] pl2303: Prolific PL2303 USB to serial adaptor driver 

正常來說,大多會抓到ttyUSB0,如果跟我一樣已經有一個USB to SerialPort裝置,
它就會是ttyUSB1...之後遞增。

USB無線接收器它在連接到電腦後,按下面的流程先進行初始化:


這段流程完成後,PC和USB無線接收器就會完成初始化,接著按下面流程,
即可取出測電器資訊:

這裡注意到一點,當第一次送出0x64 0x63後,收到的第一筆測電器資訊是獨特的,
它類似如下:
A2 09 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

這裡的09表示使用Channel 9,同樣的如下:

A2 0A 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
這裡的0A表示使用Channel 10。


其他正常的測電器資訊,格式我看起來有3種,
每種都是29個bytes,區別在開頭,有0A、0B、0C這3種。
這3種資訊,有部份資訊是相同的,部份資訊不同。
這部份我認為一開始設計為0A,後來欄位不夠了,就以0A為基礎改為0B,
再來又加上0C,因此有些欄位在0A、0B、0C都表示相同資訊,有些則不同。
我總共提取了如下6項資訊:

  1. 消耗瓦數
  2. 使用電壓
  3. 消耗電流
  4. 功率因數
  5. 花費度數
  6. 持續測量時間

花費金額的部份我沒有設定,因此都是0,看不出來是哪幾個欄位,其他上述資訊如下:
消耗瓦數:
0A、0B、0C都有,類似如下:
0A 00 00 01 04 08 xx xx xx xx xx
00 00 01 04 08表示消耗瓦數為: 0014.8W

0C 00 00 00 03 02 xx xx xx xx xx
00 00 00 03 02表示消耗瓦數為: 0003.2W

使用電壓:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx 01 01 02 07 xx xx xx xx
01 01 02 07表示電壓為: 112.7V

0C xx xx xx xx xx 01 01 02 09 xx xx xx xx
01 01 02 09表示電壓為: 112.9V

消耗電流:
0A、0B、0C都有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 00 02 05
00 00 02 05表示電流為: 00.25A

功率因數:
0A、0B都有,0C沒有,類似如下:
0A xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 00 05 01 01
00 05 01 01表示功率因數為: 051.1%

花費度數:
0A有,其他都沒有,類似如下:


0A xx xx xx xx xx xx xx xx xx 00 00 03 03 02 07 01 02
00 00 03 03 02 07 01 02 表示度數為: 0033.2712度



持續測量時間:
持續時間比較麻煩,它由2部份組合而成,分別是
  • 天數
  • 小時分鐘
小時分鐘:
0B有,其他沒有,類似如下:
0B xx xx xx xx xx xx xx xx xx 03 08 00 01 00
03 08 00 01 00表示: 01h 38m (小時和分鐘倒過來放置)

天數:
0C有,其他沒有,類似如下:
0C xx xx xx xx xx xx xx xx xx 00 00 03 01 00
00 00 03 01 00表示 31天(0031)

最後一點,它每筆資料的結尾2 bytes相加均為D0,用來做結尾表示,例如:
0C C4 (0C + C4 = D0)
11 BF (11 + BF = D0)

JNX-2000D測電器(PowerMeter)介紹

這系列其實是遲來的文章。

今年夏天,台電調漲電費,很自然的就有不少人對測電器這類PowerMeter很有興趣,
其中mobile01的便宜電力計心得分享介紹了幾款容易買到且價格便宜的測電器,
而這次要介紹的主角,就是其中提到的JNX-2000D,特別提到它除了是因為我有買來用之外,
最重要的是,它提供連接電腦的功能,可以讓我們將電力的消耗量直接數位化,
可以在電腦中進一步統計,甚至像是把它放上網頁,動態的更新即時的耗電量,
甚至繪製成一段時間的耗電圖表。

JNX-2000D硬體分為2個部份,分別為

  • 測電器本身
  • USB無線接收器

在這裡,我就直接借用mobile01的venon大大拍的照片(已授權使用):
測電器本身
測電器正面
測電器背面




















USB無線接收器
USB無線接收器正面
USB無線接收器背面




















USB接頭則在側面,如下圖:
USB無線接收器USB接頭








這款測電器,它因為能夠連結電腦,
所以它另外提供了Windows的軟體,
軟體照片如下,同樣是mobile01的venon大大抓的圖:




注意到,它左邊深灰色和咖啡黃的部份,就是它即時從測電器抓到的目前資訊。
上面Signal後面的5,則是它的頻道號碼。

這款測電器買來後,我最不滿意的部份,就是它程式感覺很鳥,又沒有提供API,
最重要的是,沒有提供Linux的程式,
因此,我花了些時間將它的RS-232信號抓出來(它實際上是USB to RS-232),
寫出了Linux的讀取程式。

這部份我會在下篇po出。

新20年期儲蓄險之我見


最近很多保險公司在推20年期複利儲蓄險,當然網路上有些人有些看法,
但我想提個我自己的看法,由流動性為出發點提出我對這保單的想法。

這種20年期儲蓄險通常如下:
前6年利率很低,約0.8%~0.9%,
第7年開始利率用2%~3%計算,
複利滾入直到領回。

我從流動性想到個有趣的觀點,試想:
1. 正常人,一筆錢放著不動,6年算長嗎?能持續6年嗎?
如果不能,那麼顯而易見的,保險公司可以用超低的利率跟你借這筆錢,
並跟你賭,6年內你會領回,你領回了,保險公司還現賺30%(6年內領回,只能領回約70%)

2. 非常有恆心毅力的人,一筆錢放著不動,就一直放到老....直到.....世界末日......
如果今天遇到個有恆心的人,他真的按照遊戲規則一直把這筆錢存放在保險公司,
那麼問題來了,這筆錢,是保險公司的?還是這個人的?
這問題怎麼說?
想看看,當你為了第7年開始的高額複利,因此把錢放在保險公司不動,
你想著高額利息,因此一直放著不領,那麼利息對你來說,是現金,還是紙上富貴?
我們反過來想,當這樣的人為了高額利息持續放在保險公司,
對保險公司而言,這筆錢幾乎等於送給保險公司,因為你不領,錢永遠都是保險公司的。

再想看看,保險公司規劃的複利通常為2.x%,那其實也只是略高於長期平均的定存利率,
考慮到大部分人6年內會解約,少部份人一放就不領了(很多八成忘了這筆錢),
剩下來一點點人,給他平均的定存利率,
這對長年投資股市、房地產...等賺高額股息、房租的保險公司而言,
根本是穩賺不賠的生意,再加上這種保險,無解約時間,那可以假設大額資金的解約時間其實不同,
那麼對保險公司的現金流量影響其實很小,怎麼看都覺得對保險公司合算。

2012年2月27日

我目前投資的兩句諍言,以及目前我的看法

很久沒po文了,上次po文已經是去年了,趁著連假來一篇。

在經過了一段時間的投資、上網看文、看幾本書(漫步華爾街),
加上金融危機,這次歐債危機後,我認為我開始有了投資的Rule,
而這Rule我認為可以簡化成兩句諍言:
景氣好時買債券(賣股票),
景氣不好時買股票(賣債券)。

而債券,必須是長期政府公債,也可以現金、定存替代。
債券和現金差異在於,債券有較高配息,
但同樣受景氣影響,只是跌幅較低,
現金、定存沒有配息(或配息較低),但不受景氣影響而虧損。

而股票,如果本錢夠多夠大,可以用房地產替代。


至於景氣好壞的判定,目前我的判斷方式,還是用平均值來判斷,
以台股來說,我會以金融風暴前後的指數為依據:
9000甚至10000為最高點
4000為最低點
7000左右均為平均範圍(6000~8000)

以歐債危機而言,雖然已經是事後諸葛,
但我認為實際問題並沒有媒體報導的嚴重,
因為包括台股在內的全球市場和歐洲市場,
最低不過是跌到平均值的位置,
台股的許多權值股事實上根本跌不多,沒有跌到適合買入的價位,
因此這次歐債危機,我的年終獎金,主要就拿來買小型傳產股,
因為小型股不在台灣50、中型100當中,容易受到景氣影響而大幅波動,
比較容易出現不錯的價格。

最近,我傾向航運股,因為BDI指數目前在歷史低點,
航運股價格目前還不算太高。

而考慮到歐債幾個國家減債,
金融風暴造成美國和全球的虧損,
以及像X鋼、X積電...等績優股配息並不多的事實,
甚至從電視看起來,許多評論家認為的中國可能發生的許多問題,
我認為股價長期維持在平均值上下是比較好的,
如果全球股價飆得高,
那我猜想,可能容易出現暴漲暴跌的情況
(我猜國外的投機基金喜歡這樣,暴漲暴跌才能炒作撈錢)。

短期來說,我自己的看法是,
歐債還沒完全過(大部分散戶多少還有一點疑慮),
美國、歐洲幾隻豬準備選總統(選前景氣太差或變化太大可能影響選情),
中國也要換領導人(接棒前景氣太差或變化太大可能影響政局),
伊朗、以色列問題(要打嗎?) ,
因此我猜全球股市可能漲或維持平盤(震盪形式?)一段時間,
但時間多長我不確定
(要屠宰散戶,總要等散戶信心恢復,股價維持高點一段時間再宰)。

現階段,我只希望航運股維持低價,
讓我可以繼續買幾個月就很滿足了。

2011年10月16日

買房策略-地段、地段、地段與房價

首先我必須說,房子是我很不瞭解的部份。
再來我必須說,我很幸運家裡有個在台北市的房子,沒有租屋付房租的壓力,
因此這篇,比較接近我以投資觀點來看買房這件事情。
這篇主要是看到了張金鶚的房產七堂課讀後感續1-----購屋的大同世界
加上之前看過的漫步華爾街後的有感而發。

因為前陣子房價很高,老媽走在路上,就會到處看房子,然後嘆息說
「以前應該在這裡買房,現在價格如何」。

然後我問我老媽,買房重點是啥,她回答了一個名人的經典說法
「買房重點有3個:地段、地段、地段」。

我聽完之後,一直覺得哪裡不大對勁,
在前陣子看過「漫步華爾街」之後,終於想明白問題在哪了......

漫步華爾街的作者在書後段提到房地產投資,作者對房地產的看法是
「他不瞭解房地產的價格如何被評估,認為房地產價格無法像公司股票比較容易量化和分析,而房地產的價格會隨著市場景氣高低波動,波動幅度會比市場景氣來得大」。
看完這段之後,我就瞭解到了一件事,
買房地段的確很重要,但實際上還是要考量到房價,一個簡單的問題:
同地段相同等級的房屋,且條件相同,
同一時間一間賣300萬,一間賣500萬,正常人會買哪間?
如果只按照「地段」作為選擇依據,
那麼300萬的房子和500萬的房子「都是值得購買的」,
可是顯然不大對,正常人都會買300萬那間而不會買500萬那間。
所以事實上,除了「地段」這項條件外,還要考慮到「價格」這個條件。

當買房條件出現了「價格」,甚至於和市場景氣出現關聯時,
那麼買房子就會和買股票、基金、黃金差不多,一樣會有價格高點和價格低點。

而股市在遇到空頭時,往往會出現一些有趣的說法,如:
「當擦鞋童都知道如何買股票時」
「當新聞版面隨處可見股市消息時」
「當某某名人說他賺了幾間房子時」
就是股市高點出現了。

那麼,如果套用到房地產呢?
如果房地產真的這麼厲害,只會漲不會跌,那美國次級房貸的問題怎麼會出現?
又如果房地產只會漲不會跌,那次級房貸後,美國房地產價格為何會破底再破底?
在回想下,前陣子台股9000點時,新聞是否經常出現買房大賺,房價大漲的新聞?
甚至可以比較一下,現在的房價和當時的房價相比有沒有差異?

所以我認為,買房只是另一種投資,
同樣要低買高賣或低買不賣,買進的時機點可能在市場景氣低點時會比較適合,
在景氣大好時,可能不適合買房,
我也認為,房價在任何時候價格不應該是相同的,
房價應該也會受到景氣影響而有房價高點跟房價低點。

2011年7月31日

OpenOffice聚會之心得分享 - 過程與範例程式、投影片下載


當天報告的投影片、範例程式:OpenOffice範例程式與投影片

年初時參加OpenOffice聚會,當時依瑪貓說,
之後OpenOffice Macro有成果,要和我們分享唷~

我當時義不容辭的同意了,於是在之後準備了這份報告。

這份報告,同時也是我到目前對OpenOffice Macro的認識與學習心得。

2011年7月8日

複委託之優點

日本發生海嘯後,我就在積極的查詢購買海外股票的方法和比較,
最後發現,目前在台灣,可以透過2種方式購買到國外股票:
1. 在海外開設股票帳戶
2. 透過國內證券公司的海外複委託購買

在經過比較後,最後我選擇使用海外複委託。

因為,用海外複委託搜尋,會發現有人在詢問海外複委託好不好,
所以這裡我大致列出我選擇的原因和海外複委託的優點和缺點。

海外複委託的缺點:
1. 手續費
我想,包括我在內所有人,
都認為海外複委託最大的缺點是「手續費
海外複委託的手續費都很貴。
以寶來證券日股交易來說,
每次交易1%計算,但最少5000日幣,
這相當於台幣1850左右(以1:2.7計算)。
其他應該也差不多,
日盛是最少5000日幣,
超過xx萬改以1%計算。

2. 人工單
除了港股、美股之外,都只有人工單,
電話呼叫很麻煩,有時候會打不進去,
詢問報價,和奇摩查到的報價會有誤差。

3. 帳戶操作麻煩
a. 沒有T+2
和台股不同,沒有T+2天,
必須帳上有足夠外幣現金(有些可以台幣交割了),
轉成外幣買完後,盛下的零碎外幣不好處理,
轉回有匯損,放著又不知道能幹嘛。
b. 轉出需要Fax+電話確認
錢從外幣帳戶轉出,需要傳真要求,
而且需要電話確認,很麻煩。

4. 限制比較多
我不用信用和融資買賣(槓桿太恐怖了),
複委託在信用買賣和融資操作,
是有限制的,印象中是不可以的。

5. 海外股票無法辦理退稅
以美股來說,美股配息先扣30%稅金,
透過複委託無法辦理退稅。

海外複委託的優點:
1. 多市場買賣
許多人推薦直接開立海外股票帳戶操作,但指的都是美股,
所以事實上,它並不是多市場,它只有美股可以操作,
只是因為美股中有全世界大部分公司的股票發行,或者ADR,
所以才說可以買到全世界公司的股票,但實際上,它還是美股,
而不會是日股、韓股、港股。
以這次日本海嘯後,我想買的日股來說,美股中的日本公司股價,
其海嘯造成的影響沒有很大,真正造成衝擊是日本股價。

2. 無銀行開戶限制
這點其實和第一點是關聯的。
要開立海外帳戶購買海外股票,必須針對單一地區開立銀行帳戶,
例如買港股要去香港銀行開戶,買美股要開立美國證券帳戶,
買日股要開立日本銀行帳戶...等。
香港和美國相對問題比較少,香港近,請假2天去玩一玩,
就能順便開好戶頭;美國可以用郵寄解決。
韓國、新加坡不清楚。
但針對日本,上網搜尋會發現,日本銀行排外性很高,
留學生都不容易找到可以開戶的銀行,何況是觀光客。

3. 手續費高,但其他費用少
海外複委託雖然手續費高,
但買賣時不用其他費用(配息手續費大家都有,費用也相同,看市場),
但其他海外帳戶不同。

我同事買港股,
選擇香港匯豐銀行(應該是很多人都會選擇的,香港最大)。
香港匯豐銀行規定,帳戶內金額(聽同事說,
含股票市值)必須大於20萬港幣,
否則每個月都要收取保管費,這筆錢複委託並不需要。

美股的話,除非人到美國去開戶,否則需要匯款,
匯款需要一筆不低的手續費,
我當時計算,如果「每次買美股都匯款」,
那手續費其實接近海外複委託的美股手續費,
因此網路上都說,
一次匯入大筆金額後,再進行操作,
而像我這樣靠薪水投資的,並不合適。

另外,如果我沒記錯的話,匯款是有時差的,
好像需要2~3天,
海外複委託的操作都是台灣的銀行的外幣帳戶操作,
放錢到可以操作,大概2~3個小時即可
(這應該是證券公司帳戶資訊沒更新,
我從銀行帳戶看,是立刻就有錢)。

4. 可靠度高
這點網路上的人都提過,透過海外複委託購買可靠度比較高,
比較不怕證券公司倒閉或者股票不見,
在網路上有人提到過,他透過美國的線上證券公司買股票,
結果股票不見的事情。
針對這點,網路上的人是說,
你可以找有加入「投資人保障協會」的線上證券公司,
但問題是,當你真的發生問題時,
你要如何和投資人保障協會聯絡?要怎麼把股票拿回來?
你的操作紀錄都在線上證券公司裡,
它股票都能不見,你怎麼能保證它操作紀錄還在?
那你怎麼舉證你的股票?

基於上述原因,
我最後選擇透過海外複委託買股票,
不過對我來說,
最主要原因還是因為我要買的是日股而不是美股或港股,
但我想,未來我要購買港股或美股,我不用因此跑到香港,
或者郵寄、匯款到美國搞很久,就能直接購買了,
這應該在便利性上也會好很多。

2011年4月4日

OpenOffice Calc BASIC Macro位址、名稱轉換

在OOo Calc中寫OOo BASIC時,會遇到個問題是,
要取得Cell時,常使用getCellByPosition() Method,例如:
oCell = oSheet.getCellByPosition(0,0)
oCell.String = now 'This function returns the current date and time

這樣可以取得A1這個Cell,並修改它的內容。

但getCellByPosition() Method使用的是0 Base,且X、Y都是數值
可是在Calc當中,
我們一般操作都使用A1這樣的字母+數值,且是1 Base
為了解決這個麻煩的小問題,我寫了個簡單的轉換函式,如下:
Function CellPositionToName(X As Integer, Y As Integer) As String
Dim LETTER_ARRAY As Variant
LETTER_ARRAY = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ","JA","JB","JC","JD","JE","JF","JG","JH","JI","JJ","JK","JL","JM","JN","JO","JP","JQ","JR","JS","JT","JU","JV","JW","JX","JY","JZ","KA","KB","KC","KD","KE","KF","KG","KH","KI","KJ","KK","KL","KM","KN","KO","KP","KQ","KR","KS","KT","KU","KV","KW","KX","KY","KZ","LA","LB","LC","LD","LE","LF","LG","LH","LI","LJ","LK","LL","LM","LN","LO","LP","LQ","LR","LS","LT","LU","LV","LW","LX","LY","LZ","MA","MB","MC","MD","ME","MF","MG","MH","MI","MJ","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NB","NC","ND","NE","NF","NG","NH","NI","NJ","NK","NL","NM","NN","NO","NP","NQ","NR","NS","NT","NU","NV","NW","NX","NY","NZ","OA","OB","OC","OD","OE","OF","OG","OH","OI","OJ","OK","OL","OM","ON","OO","OP","OQ","OR","OS","OT","OU","OV","OW","OX","OY","OZ","PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL","PM","PN","PO","PP","PQ","PR","PS","PT","PU","PV","PW","PX","PY","PZ","QA","QB","QC","QD","QE","QF","QG","QH","QI","QJ","QK","QL","QM","QN","QO","QP","QQ","QR","QS","QT","QU","QV","QW","QX","QY","QZ","RA","RB","RC","RD","RE","RF","RG","RH","RI","RJ","RK","RL","RM","RN","RO","RP","RQ","RR","RS","RT","RU","RV","RW","RX","RY","RZ","SA","SB","SC","SD","SE","SF","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SP","SQ","SR","SS","ST","SU","SV","SW","SX","SY","SZ","TA","TB","TC","TD","TE","TF","TG","TH","TI","TJ","TK","TL","TM","TN","TO","TP","TQ","TR","TS","TT","TU","TV","TW","TX","TY","TZ","UA","UB","UC","UD","UE","UF","UG","UH","UI","UJ","UK","UL","UM","UN","UO","UP","UQ","UR","US","UT","UU","UV","UW","UX","UY","UZ","VA","VB","VC","VD","VE","VF","VG","VH","VI","VJ","VK","VL","VM","VN","VO","VP","VQ","VR","VS","VT","VU","VV","VW","VX","VY","VZ","WA","WB","WC","WD","WE","WF","WG","WH","WI","WJ","WK","WL","WM","WN","WO","WP","WQ","WR","WS","WT","WU","WV","WW","WX","WY","WZ","XA","XB","XC","XD","XE","XF","XG","XH","XI","XJ","XK","XL","XM","XN","XO","XP","XQ","XR","XS","XT","XU","XV","XW","XX","XY","XZ","YA","YB","YC","YD","YE","YF","YG","YH","YI","YJ","YK","YL","YM","YN","YO","YP","YQ","YR","YS","YT","YU","YV","YW","YX","YY","YZ","ZA","ZB","ZC","ZD","ZE","ZF","ZG","ZH","ZI","ZJ","ZK","ZL","ZM","ZN","ZO","ZP","ZQ","ZR","ZS","ZT","ZU","ZV","ZW","ZX","ZY","ZZ","AAA","AAB","AAC","AAD","AAE","AAF","AAG","AAH","AAI","AAJ","AAK","AAL","AAM","AAN","AAO","AAP","AAQ","AAR","AAS","AAT","AAU","AAV","AAW","AAX","AAY","AAZ","ABA","ABB","ABC","ABD","ABE","ABF","ABG","ABH","ABI","ABJ","ABK","ABL","ABM","ABN","ABO","ABP","ABQ","ABR","ABS","ABT","ABU","ABV","ABW","ABX","ABY","ABZ","ACA","ACB","ACC","ACD","ACE","ACF","ACG","ACH","ACI","ACJ","ACK","ACL","ACM","ACN","ACO","ACP","ACQ","ACR","ACS","ACT","ACU","ACV","ACW","ACX","ACY","ACZ","ADA","ADB","ADC","ADD","ADE","ADF","ADG","ADH","ADI","ADJ","ADK","ADL","ADM","ADN","ADO","ADP","ADQ","ADR","ADS","ADT","ADU","ADV","ADW","ADX","ADY","ADZ","AEA","AEB","AEC","AED","AEE","AEF","AEG","AEH","AEI","AEJ","AEK","AEL","AEM","AEN","AEO","AEP","AEQ","AER","AES","AET","AEU","AEV","AEW","AEX","AEY","AEZ","AFA","AFB","AFC","AFD","AFE","AFF","AFG","AFH","AFI","AFJ","AFK","AFL","AFM","AFN","AFO","AFP","AFQ","AFR","AFS","AFT","AFU","AFV","AFW","AFX","AFY","AFZ","AGA","AGB","AGC","AGD","AGE","AGF","AGG","AGH","AGI","AGJ","AGK","AGL","AGM","AGN","AGO","AGP","AGQ","AGR","AGS","AGT","AGU","AGV","AGW","AGX","AGY","AGZ","AHA","AHB","AHC","AHD","AHE","AHF","AHG","AHH","AHI","AHJ","AHK","AHL","AHM","AHN","AHO","AHP","AHQ","AHR","AHS","AHT","AHU","AHV","AHW","AHX","AHY","AHZ","AIA","AIB","AIC","AID","AIE","AIF","AIG","AIH","AII","AIJ","AIK","AIL","AIM","AIN","AIO","AIP","AIQ","AIR","AIS","AIT","AIU","AIV","AIW","AIX","AIY","AIZ","AJA","AJB","AJC","AJD","AJE","AJF","AJG","AJH","AJI","AJJ","AJK","AJL","AJM","AJN","AJO","AJP","AJQ","AJR","AJS","AJT","AJU","AJV","AJW","AJX","AJY","AJZ","AKA","AKB","AKC","AKD","AKE","AKF","AKG","AKH","AKI","AKJ","AKK","AKL","AKM","AKN","AKO","AKP","AKQ","AKR","AKS","AKT","AKU","AKV","AKW","AKX","AKY","AKZ","ALA","ALB","ALC","ALD","ALE","ALF","ALG","ALH","ALI","ALJ","ALK","ALL","ALM","ALN","ALO","ALP","ALQ","ALR","ALS","ALT","ALU","ALV","ALW","ALX","ALY","ALZ","AMA","AMB","AMC","AMD","AME","AMF","AMG","AMH","AMI","AMJ")

If X < 1024 Then CellPositionToName = LETTER_ARRAY(X) + (Y + 1) Else MsgBox "Out Of Range" End If End Function

傳入X、Y 2個數值,回傳A3這樣的名稱,
因為X最大是AMJ(0~1023),因為數值並不大,
我直接定義成變數查表即可。

注意:已經自動轉換Base 0為Base 1,傳入時不用刻意加1。

2011年4月3日

007先生的交易歷程 的 讀後回文

本來在找匯率表之類的,就找到這個有趣的Blog
007先生看來年紀跟我差不多,不是同年就是小個1~2歲,
整個Blog看下來後,我認為007先生實際的以金錢去做了個實驗,
實驗證明了,程式交易並不是神,
僅僅依靠程式交易搭配特定演算法就要套利,
結果就是直接被市場KO,
我後來想了想,覺得007先生這麼做,並以日記形式寫成Blog,
應該可以作為不錯的反向教材,
而在倒數第二篇文章中,因為007先生的不甘心,
提到「一定是哪裡出了問題」,
因此我把我這段時間的想法寫成回文,
這段回文,算是目前我對交易市場和程式交易的想法。


沒做過外匯,只有最近(算前陣子)台幣升值時有換一些美金玩玩。
我是看到「我知道必定是哪裡出了錯...」這句話,才想回應的。

我對程式交易有興趣,但我只打算用程式交易做股市中長期(月為單位、長期持有定存股),代替人工下單(上班沒時間)。
我目前認為,除非遇到系統風險或異常超跌,否則在交易市場要套利,應該很難和大戶或法人玩。

我目前認為,程式交易會失敗有幾個關鍵因素:
1. 常見的程式交易,都是用EasyLanguage去寫的,你仔細想一下,事實上它能做到的條件很死板,它的條件幾乎都是軟體寫好提供的,感覺有點像是說,給你玩個沒規則的遊戲,但只給你幾個條件去搭配判斷,這聽起來就很受限,只要我知道你能夠使用的條件,我想贏你的機會應該很大

2. 目前沒有任何聖杯,可以保證獲利,沒有任何條件套用在金融市場是百分百正確的,我們透過一連串無法保證的條件去判斷,並期望它要有6成勝率,那可能用亂數感覺還快些

3. 去年發生過一次美股異常交易的事件有上新聞,大家都知道,有人說可能是高頻交易引發的連鎖效應,我查了高頻交易,才知道國外很多大型投資公司用高頻交易套利,它們利用電腦,以「每秒400次成交」的速度,高速的進行買跟賣,利用利差來套利,甚至我認為,能以此掌握最短期的市場變化,在設備、環境、程式、資金大小、消息面都不對等的情況,我不認為我的程式有辦法跟這樣的程式作對

4. 程式是人寫的,換言之,它只能代替人去按照特定模式交易,既然你我都沒找到一個勝率達6成的模式,又怎麼能要求程式能有6成勝率?

最後,我想我可以把最近幾個月的想法說一下,我認為,憑空希望能透過投機的方式來獲利,不如注意系統風險的發生。
你買了這麼多書,相信有提到一點,交易市場會有系統性風險跟非系統性風險,系統性風險不可預期,且影響巨大,像金融風暴、次級房貸...等。
事實上你稍微注意一下會發現,當遇到系統風險時,該投資標的很有機會跌到非常不錯的價格,只要不破產,此時買入並長期持有(預期至少1~2年),那麼我認為績效應該都不會太差。
你前面常提到,有錢人一開始也是從無到有的,這點我認同,但不完全認同,一些人它可能父母有庇蔭,一開始就有一筆不少的資金,當他剛好遇到某個系統風險時,大膽的投入,運氣不好可能破產,但此時只要沒破產,勝率很高,且因為資金大,獲得的獲利非常可觀,原因是,在交易市場,你玩了這麼久就知道,它的獲利是以%數計算的,他有資金,又在系統風險最低點投入,上來時,那種以%數計算的獲利非常驚人。
最後,我們生在台灣,天生就不平等,你想想,我們辛辛苦苦一個月不過3,4萬,一個月有辦法也不過存2萬,美國人薪資是我們的2~3倍,扣除開銷和稅金,還是比我們多很多,他們的資金水平和我們不是同一個水平,對賠率的容忍度比我們高,這是沒辦法的事,但好消息是,跟對岸或東南亞國家相比,薪資水準、物價水平我們又好一些。

OpenOffice BASIC Macro資料庫操作-2

在上集中,我們完成了現在要使用的資料庫,
接著我們就可以透過OpenOffice BASIC來操作剛剛產生的資料庫。

在OOo BASIC中要操作資料庫,整個過程需要6個動作:
  1. 連結DataSource
  2. 取得查詢
  3. 連結SQL伺服器
  4. 從查詢中取得SQL Code,並查詢SQL伺服器
  5. 查詢完成,取出查詢結果
  6. 關閉SQL伺服器連線

整個程式碼如下:
Sub Main

REM 連結 DataSource
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("OOoTEST")

REM 取得查詢
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = QueryDefinitions("ProductQuery")

REM 連結SQL伺服器
Dim InteractionHandler As Object
Dim Connection As Object
InteractionHandler = createUnoService("com.sun.star.task.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)

REM 從查詢中取得SQL Code,並查詢SQL伺服器
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery(QueryDefinition.Command)

REM 查詢完成,取出查詢結果
Dim DATA_ID As String
Dim DATA_NAME As String
Dim DATA_PRICE As String
If Not IsNull(ResultSet) Then
While ResultSet.next
DATA_ID = ResultSet.getString(1)
DATA_NAME = ResultSet.getString(2)
DATA_PRICE = ResultSet.getString(3)
MsgBox "ID:"+ DATA_ID + " 名稱:" + DATA_NAME + " 價格:" + DATA_PRICE
Wend
End If

REM 關閉SQL伺服器連線
Connection.Close()
End Sub


接著我們分段來解說每個部份:
1. 連結 DataSource
在OpenOffice中,所有要被Calc使用的資料庫都需要先被「註冊」,
在建立資料庫時,預設都會自動幫你把它註冊到OpenOffice當中,
回憶一下,如下圖:
當我們將資料庫註冊到OpenOffice後,
我們就可以將它當成DataSource進行連結,
這裡要注意到,註冊的名稱可以和DataBase名稱不同,
要以「註冊名稱」為「DataSource名稱」,
不過預設,兩者名稱相同。

在這裡,我們指定DataSource為剛剛建立好的資料庫OOoTEST
分段程式碼如下:
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("OOoTEST")

我們先定義DatabaseContext和DataSource這兩個變數,
接著建立DatabaseContext服務
透過DatabaseContext服務來取得OOoTEST這個DataSource

延伸:
這裡有個延伸的程式碼可以參考,如下:
Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Names = DatabaseContext.getElementNames()
For I = 0 To UBound(Names())
MsgBox Names(I)
Next I

我們可以透過這段程式碼,將所有註冊的資料庫全部列出。

2. 取得查詢
取得DataSource後,還記得剛剛我們在OOo Base裡面,
有建立好一個叫做ProductQuery的查詢項目。
接著,我們取得這個查詢,分段程式碼如下:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = QueryDefinitions("ProductQuery")

定義QueryDefinitions這個變數,
透過DataSource的getQueryDefinitions() Method,
我們取得全部的Query,
並從裡面取出我們要使用的Query - ProductQuery

延伸:
如果我們不清楚有哪些Query,希望透過Macro動態查詢,如下:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
REM 顯示所有查詢
For I = 0 To QueryDefinitions.Count() - 1
QueryDefinition = QueryDefinitions(I)
MsgBox QueryDefinition.Name
Next I

我們可以用這段程式碼,將所有已經儲存的Query全部列出。

如果我們想要用Macro建立新的Query,我們可以使用下面的程式碼:
Dim QueryDefinitions As Object
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = createUnoService("com.sun.star.sdb.QueryDefinition")
QueryDefinition.Command = "SELECT Name FROM ProductTable"
QueryDefinitions.insertByName("OurNewQuery", QueryDefinition)

透過這段程式碼,我們可以建立一個新的Query叫做OurNewQuery
這個Query的SQL Code為「SELECT Name FROM ProductTable」。

3. 連結SQL伺服器
再來我們要正式連結SQL伺服器,分段程式碼如下:
Dim InteractionHandler As Object
Dim Connection As Object
InteractionHandler = createUnoService("com.sun.star.task.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)

這裡我們要建立InteractionHandler服務
接著使用DataSource的ConnectWithCompletion()來連結SQL伺服器

4. 從查詢中取得SQL Code,並查詢SQL伺服器
SQL伺服器連結完成後,我們要查詢SQL伺服器,如下:
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery(QueryDefinition.Command)

我們先定義Statement變數
接著透過Statement的executeQuery()查詢SQL伺服器

這邊注意到,事實上executeQuery()使用的是SQL Code,
因此我們要透過QueryDefinition.Command
將剛剛我們取得的Query - ProductQuery內的SQL Code取出。

延伸:
因為executeQuery()使用的是SQL Code,
因此我們可以不透過Query,直接用SQL Code進行資料庫的查詢,
程式碼如下:
Dim Statement As Object
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT Name FROM ProductTable")

5. 查詢完成,取出查詢結果
如果資料庫是INSERT或者UPDATE的操作,不需要取得資料,
那麼這個步驟是完全不需要的,這個步驟只有在查詢資料,
需要從資料庫中取得資料才需要。

分段程式碼如下:
Dim DATA_ID As String
Dim DATA_NAME As String
Dim DATA_PRICE As String
If Not IsNull(ResultSet) Then
While ResultSet.next
DATA_ID = ResultSet.getString(1)
DATA_NAME = ResultSet.getString(2)
DATA_PRICE = ResultSet.getString(3)
MsgBox "ID:"+ DATA_ID + " 名稱:" + DATA_NAME + " 價格:" + DATA_PRICE
Wend
End If

這裡很簡單,在前面步驟4的最後,
我們透過executeQuery()查詢資料庫後,
結果會儲存在變數ResultSet當中,
這裡我們先檢查ResultSet,確定它是有東西的,
接著使用ResultSet.next取出每條結果,
再來我們使用ResultSet.getString(1)取出第1個欄位資料
使用ResultSet.getString(2)取出第2個欄位資料,
利用MsgBox將資料用訊息視窗顯示出來

6. 關閉SQL伺服器連線
最後,我們要有好習慣,將SQL伺服器斷線,分段程式碼如下:
Connection.Close()
到這裡,整個資料庫的查詢全部完成。

這裡延續前面的慣例,可以出個作業,
這裡我們完整的取得了資料庫的資料,
那要如何填入OpenOffice的Calc呢?

OpenOffice BASIC Macro資料庫操作-1(資料庫建立)

要操作資料,或者進行歷史資料處理,資料庫的操作都是不可避免的,
在前面入門課題結束了,我們就開始直奔主題,而第一個po的心得,
就是頗有難度,但在資料處理上很重要的,資料庫操作,這裡是操作讀取,
但寫過資料庫程式的都知道,讀取比寫入麻煩,會讀取,要會寫入都不難。
因為篇幅可能會比較長,我分上下兩集介紹,上集是建立資料庫。

開始工作前,首先需要個資料庫,在這裡我們使用OpenOffice Base的資料庫來操作。

1.建立資料庫,並存檔為OOoTEST.odb放置於桌面



2. 建立Table、輸入資料



3. 建立查詢,查詢ProductTable內全部項目


如果偏好直接用SQL Code,也可以用下列SQL Code直接建立:
SELECT "ID", "Name", "Price" FROM "ProductTable";

4. 至此,資料庫和查詢建立完成,可以開始透過Macro操作了

2011年3月19日

日本祈福與福島核災

日本這次發生誇張的地震和歷史性的海嘯,在慶幸不是台灣的同時,
祝福他們,希望他們能夠早日重建完成,我相信強大的日本,
絕對可以在短時間內重建,恢復如常。

這次,我繼四川地震、八八風災後,第三次捐款,
同樣捐助了3000元台幣,雖然不算太多,但以我目前的收入來說,
是3日所得,算是我能力所及的,因為我最近比較忙碌,
經常加班,恐怕沒辦法有力出力,錢,大概也只能出這些,
希望大家都能幫忙,讓日本能更快得回覆原來生活。

至於福島的核災,現在很多媒體報導的很誇張,
我實在不想點名,但有些新聞台報導的實在太離譜了,
記得第二天某新聞台的報導,
一邊說原能會說輻射線對台灣沒影響,風向也不對,
但另一邊打跑馬說輻射線晚上就會來台灣,這實在是......

在到達第4天時,某新聞台晚上的新聞評論,
幾個名嘴一邊說反應爐已經破洞了,一邊說水不夠,
一邊說他們拿水桶衝過去潑水,
這看得我笑到眼淚都噴出來了,這也太扯了......

我認為,日本核電廠的問題算嚴重,
但並沒有嚴重到會發生核子爆炸,也不會發生核子爆炸,
事實上,他們第一時間反應爐就停機了,
核子反應第一時間就降到最低了,所以不會核爆,
但因為核子反應「不會完全停止」,因此需要持續水循環作降溫,
而供水設備沒電、故障,才引發後續問題。

到了現在第6天,事實上狀況「漸趨穩定」了,
從新聞來看,他問題的背景是:
遭遇地震+海嘯時
1號、2號、3號反應爐機組運作中
4號、5號、6號停機歲修中(全世界核電廠的反應爐機組,運作1年半都要歲修一次)

所以4、5、6正常來說,反應爐是不應該有問題的。
所以4號失火,第一時間日本官防長官(台灣的行政院長)說正在瞭解情況,
因為不應該有問題,而之後的瞭解是,「廢燃料棒儲存槽失火」。

到今天(2011-03-19)原能會發佈的狀況是:
1號反應爐機組,反應爐圍阻體正常,冷卻水(海水)有進入,勉強可控制
2號反應爐機組,反應爐圍阻體「可能受損」,冷卻水無法進入,無法控制
3號反應爐機組,反應爐圍阻體「可能受損」,冷卻水無法進入,無法控制
4號「廢燃料棒儲存槽」「可能受損」,冷卻水無法進入,無法控制
5號「廢燃料棒儲存槽」原本水位降低,柴油發電機已能正常動作,冷卻水循環已經正常
6號「廢燃料棒儲存槽」和5號相同,柴油發電機已能正常動作,冷卻水循環已經正常

所以現在要注意的是:
1. 4號儲存槽是否有受損,這關係到輻射線是否外洩?
4號儲存槽的冷卻水循環何時能恢復?
2. 2號跟3號的反應爐圍阻體到底受損多嚴重,是變形還是破洞?
因為這關係到輻射線外洩的嚴重程度
3. 2號跟3號的冷卻水循環,或者外部海水注入,何時可以完成?

這3個點才是目前要關注的,這3個點,也才是輻射線外洩程度的關鍵問題。
至於爆炸,目前我認為再發生爆炸的機會不大,核爆的可能性更低,
而輻射線外洩,是「已經洩了」,但「洩漏程度」是目前的問題點。

至於台灣,我認為台灣的核電廠安全係數比福島的高一些,
就原能會的新聞來看,台灣核電廠的選址地形、備援機制都要比日本福島的好很多,
同樣的災難發生在台灣,可能不至於讓核電廠出問題,
但我認為,台灣的核電廠未必會出現和日本一樣的災難,
卻可能因為其他災難造成其他問題,因此我認為,加固或增加安全機制有必要性,
但因此反核我就不認同了。

最後,我的結論是,在為日本祈福,有錢出錢有力出力的同時,
對於核能的問題,還是應該理性一點看待,不應該被一些怪怪的媒體報導左右,
然後搞得認為世界末日或者福島要核彈爆炸了,
以冷靜的腦袋,儘可能的瞭解資訊,讓自己不要驚慌,應該是這時候比較適合做的事。

OpenOffice巨集參考資料

繼上篇的UNO架構介紹和上上偏的簡單範例後,
相信已經有能力寫個HelloWorld的Macro(巨集;之後都會直接用Macro表示)了,
但記得我在很多年前寫過,要學習一個新的程式語言,需要知道幾個部份:
1. Main結構
2. 程式語法
3. API或Class Reference

從上上篇的範例看完,以及上篇的UNO解說,
我相信1和2大概都能掌握了,接著是3的部份,而這篇,
就是列出一些我在寫OpenOffice時,參考的網站、文件。

書:
我在學習OpenOffice Macro時,第一個找的是書,但很不幸的,
中文書是完全沒有的(正體、簡體),
我找到的一本值得的書是:

這本書基本上不錯,但仍舊有缺點,它細節的部份很多都略過了,
所以看起來也會有一知半解的感覺。

文件:
針對OpenOffice Macro的基本概念和語法教學,寫得最好的我認為是:
這個算是Oracle(前Sun)提供的官方教學文件,
針對OpenOffice的BASIC Macro寫得非常詳盡,
事實上,我認為前面介紹的書,有一些是從這裡面Copy出來的。
雖然文件是介紹StarOffice的BASIC,
但事實上,
OpenOffice的BASIC和StarOffice的BASIC在語法上幾乎是一樣的。

網頁:
 針對OpenOffice BASIC,OpenOffice網站的教學當然不能錯過:
OpenOffice.org BASIC Programming Guide

這個教學頁面有提供簡體中文的翻譯,如下:
OpenOffice.org BASIC 編程指南
這個教學頁面我認為部份內容寫得還ok,
但它幾乎沒有圖片,解說內容也很少,看得很模糊,
看完之後,感覺上還是甚麼都沒看懂,
但基本上,有比沒有好,還是一個值得參考的教學頁面。

OpenOffice.org Developer's Guide
這個同樣是OpenOffice wiki內的教學頁面,
它的特點是,它介紹了OpenOffice內多種語言的開發,
包括OOo BASIC、Java、C++...等,
但如果前面的BASIC Programming Guide是有比沒有好的話,
這個頁面就實在是不怎麼樣,每個篇幅看下來,
反應就是,只有2句話我能看懂甚麼... :(
但,憑著它有多個語言的描述,勉強可以參考參考。

The OpenOffice.org API Project
OpenOffice.org Global Index A
OpenOffice.org Module star
這3個網頁是OpenOffice API內的頁面,
它們其實是同一串網頁的東西,
它們其實就是UNO的API Reference,
第2個網頁是將所有Service、Method、Properties全部以字母排列,
然後列出來。

第3個網頁則是以Module Name來排列描述的樹狀頁面。

第1個網頁則是它們的首頁,
如果知道Module、Method、Property的名稱,
首頁提供了很難用的搜尋引擎可以直接尋找。

我認為這幾個API Reference的頁面非常重要,
它提供了OpenOffice能夠使用的所有API的說明,
也非常有價值,但它寫得很爛,遠比Java在使用的API Reference爛得多,
我不瞭解,明明有Java的API Reference這麼好得樣板,
為啥還要作成這種鬼樣子。

Calc Functions listed by category
這同樣是OpenOffice wiki的網頁,但內容非常不錯,
我們回到最初提過的,我們這麼辛苦的學習OOo Macro,
就是為了使用它的Calc幫助我們運算和資料整理,
Calc裡面最強大的莫過於它的許多「function」,
這些function能幫助我們進行數學、財經...等運算,
透過Macro,我們還是要知道這些function怎麼用,
這個頁面,就是列出了所有Calc的function,
並有簡單的解說和Example教我們怎麼使用它。

The OpenOffice.org Wiki
因為前面的推薦頁面中,很多個都來自OpenOffice的wiki,
因此,還是把它的首頁列出來推薦,
這個可以算是前面幾個教學頁面的目錄。
不過因為它是針對OpenOffice的wiki,
而不是專門針對OpenOffice開發,
所以大部分的教學都還是針對OpenOffice的操作進行說明和教學。

OpenOffice Help:
沒看錯,就是OpenOffice的Help,
和前面的Calc Functions listed by category類似,
OpenOffice的Help能夠提供我們Calc Function的使用說明,
還有一部分BASIC的解說,包括OOo BASIC的資料型態,
運算符號和方式...等。
OpenOffice的Help最方便的地方在於,它可以直接搜尋,
雖然命中率有點低,但相對來說,還是比較方便的。

範例程式:
要使用OpenOffice的Macro,通常需要安裝OpenOffice SDK,SDK安裝好後,除了相關的Library外,還提供了一些範例和說明,
路徑在:
OpenOffice.org 3\Basis\sdk\examples

這裡必須要提一下,它的範例,我個人覺得有些複雜難懂。

論壇:
Macros and UNO API(OpenOffice Forum)
壓箱寶一定要放在最後面。
因為OpenOffice的Macro開發實在是文件稀少,
很多人都有相關的疑問,因此它的Forum真的是很熱鬧,
裡面有幾個國外的高手,看起來從很早前就在用OOo Macro了,
不少相關的解說和文章都相當的有用,直接提供了Code。
事實上,我看了前面的API Reference,
還是沒辦法獨立的根據API Reference寫出OOo的BASIC程式,
需要到Forum裡面查看看有沒有人有寫過並po文,
交互參考後才寫得出來,由此可知這個Forum的強大。

到這裡,我認為OpenOffice Macro入門所需的知識應該已經夠了,
下一篇開始,我會將這段時間的研究後得到的一些技巧性的程式段po出來,
一些是來自於論壇的Code的改寫,一些則是翻翻找找後拼湊出來的,
還請期待。