pretty code

2009年12月9日 星期三

合併排序

合併就是把兩堆已經排序好的資料
按大小重新排列成一堆

//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#define  LEFT      'L'
#define  RIGHT     'R'
//---------------------------------------------------------------------------
int      g_icount = 1;
//---------------------------------------------------------------------------
void mergeSort(int *list, int *tmp, char type, int left, int right)
{
    if(left >= right) return;
   
    int middle = (left+right)/2;
   
    mergeSort(list, tmp, LEFT,  left,     middle);
    mergeSort(list, tmp, RIGHT, middle+1, right);
   
    int indexL = left;
    int indexR = middle+1;
    int index  = 0;
   
    while(indexL <= middle && indexR <= right)
    {
        if(list[indexL] <= list[indexR])
        {
            tmp[index++] = list[indexL++];
        }
        else
        {
            tmp[index++] = list[indexR++];
        }
    }
   
    //Copy from Left
    for(int i = indexL; i <= middle; i++)
        tmp[index++] = list[i];
    //Copy from Right
    for(int i = indexR; i <= right; i++)
        tmp[index++] = list[i];
   
    //Debug
    printf("[%02d] %c ", g_icount++, type);
    for(int i = 0; i < index; i++)
        printf("%d ", tmp[i]);
    printf("\n");
   
    //Copy to list
    int j;
    for(int i = left, j = 0; i <= right; i++, j++)
        list[i] = tmp[j];   
}
//---------------------------------------------------------------------------
int main(void)
{
    int list[] = {12,15,49,22,15,10};
   
    int max = sizeof(list)/sizeof(int);
   
    int tmp[6];   
   
    mergeSort(list, tmp, LEFT, 0, max-1);
   
    printf("\nResult: ");
    for(int i = 0; i < max; i++)
        printf("%d ", list[i]);
    printf("\n\n");
       
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
 

2009年12月7日 星期一

計概爛題目解決之道

set CC=D:\Dev-Cpp\bin\gcc.exe
set EDITOR="C:\Program Files\IDM Computer Solutions\UltraEdit-32\uedit32.exe"

%CC% test.c -E > test.out
%EDITOR% test.out


如果可以把檔案再 parse 過會更好,只要 main 以後的。

好歹我也寫了五年的程式,計概的程式會不會太爛了點?
我連 preprocessor 都動用了... XD

分頁替換法

搞了好久
終於搞懂恐龍書說什麼
原來是它排版沒排好的關係


2009年11月30日 星期一

計算機概要趨勢預測


牌品好,牌就會好

牌品好,牌就會好

越爛的牌越要用心去打
越打就會越順
越順運氣就會越好

這句話是我最喜歡的華仔
在電影嚦咕嚦咕新年財說的話

其實套用在讀書上面也會通

越難的科目越要用心去看
看久了就會順
順了自然就沒有問題了 ... XD

讀書真的需要技巧
作筆記也是
(努力只是基本的)

可惜之前考試時還沒到達這個境界
不然我會更有把握

之前的我還以為進入了嫁衣神功‧如意之境
想想還真是有些天真

總有一天
我一定會跟明玉神功第九層一決高下

快速排序

//---------------------------------------------------------------------------
#define  SWAP(x,y) {int t; t = x; x = y; y = t;}
//---------------------------------------------------------------------------
#define  LEFT      'L'
#define  RIGHT     'R'
//---------------------------------------------------------------------------
int      g_icount = 1;
//---------------------------------------------------------------------------
void quickSort(char type, int preindex, int list[], int left, int right)
{
    int i     = left;
    int j     = right;
    int pivot = left;
    int max   = right;
    int min   = left;
   
    //current index
    int index = g_icount;
   
    //debug
    printf("(%02d) %02d %c  ", g_icount++, preindex, type);
   
    for(int i = left; i <= right; i++)
        printf("%02d ", list[i]);
    printf("\n");
   
    if(left >= right) return;
   
    while(i < j)
    {
        while(list[i] <= list[pivot] && i < max) i++;
       
        while(list[j] > list[pivot] && j > min) j--;
       
        if(i < j)
        {
            //i,j change
            SWAP(list[i], list[j]);
        }           
    }

    //pivot, j change
    SWAP(list[j], list[pivot]);
   
    quickSort(LEFT,  index, list, left, j-1);
    quickSort(RIGHT, index, list, j+1, right);
}

2009年11月29日 星期日

資料庫需補充資料

1. 系統目錄、資料字典
2. 自然合併、日合併(希爾他)
3. 先導圖
4. 時間戳記

2009年11月28日 星期六

2009年11月16日 星期一

柴可夫斯基‧1812 序曲

自從看了交響情人夢後
對交響樂還蠻有興趣的
一直想找機會去聽現場演奏

1812 算是交響樂中振奮人心的
蠻適合寫程式聽的
寫出來的程式我想會暴走吧

改天我的程式要放復活節彩蛋的話
就放個加農砲齊鳴吧 ... XD

2009年11月10日 星期二

筆記的重要性

出自 ptt littleflat(律師上榜)

第五:筆記很重要 很重要*N

什麼讀書計畫 念多少書 要看哪本哪本必看的 其實都在其次

最重要的 就是去蕪存菁 也許大家看過很多人寫的心得都有這個

但是我要再次強調 唸書的過程就是

-->第一遍 搞懂那個科目在幹嘛 並且把重點先畫

-->第二遍 把重點的地方看懂 把重點藤在筆記上

-->第三遍 看考題 知道考題重點在哪把筆記補充上去

-->第四遍 只看筆記 把書丟掉

2009年11月4日 星期三

理想中的境界

袁承志眼望天上明月,《金蛇秘笈》中種種武功秘奧,有如一道澄澈的小溪,緩緩在心中流過,清可見底,更無半分渣滓,直到紅日滿窗,這才醒覺。

2009年10月26日 星期一

依法行事

一般性考試法規

本想從命題規則和閱卷規則找尋一些資料,
看來是沒有什麼可以參考的。

至少確定鈴響前是不能動筆畫輔助線的。

2009年10月22日 星期四

April Hoffman

Did you know that thirty-five people try to jump off the Brooklyn Bridge each year, most because of broken hearts?

你知道每年有 35 人因為心碎從布魯克林大橋上跳下去嗎?



艾波霍夫曼(Isla Fisher)
是 definitely, maybe 電影裡面其中的一個女主角名

蠻不錯的一部電影,我已經在 HBO 看了三遍 ... XD

霍夫曼應該是一個姓吧?



我在唸書的過程中學到了一種無失真壓縮的編碼法
日常生活中碰到的 JPEG、mp3 都是使用此編碼法

他有可能會是計概或資結的考題

總而言之,我喜歡這部電影的結局 ...

2009年10月20日 星期二

期望值

剛剛在 PTT 發了篇倒扣心得的文章
本來覺得是很爁的文章
沒什麼可以分享的

不過不分享,我還真的不知道自己的渺小呢!
做一堆白癡的事 ... XD

我以前只知道倒扣分數的依據是
讓整個答題的期望值變成 0

我還真的不知道可以用期望值來算要不要猜題?
我想它的原理應該是只要期望值大於 0 的話
就有猜題的意義

學海無涯,Code 海茫茫呀 ~

2009年10月19日 星期一

國考必勝公式 - KPIS























PS. 這是知識管理的公式 .... XD

2009年10月18日 星期日

考試心得

如果要考國營事業,請用普考或特考四等的方向去看
如果要考普考特考,請用高考或特考三等的方向去看
如果要考高考特考,請多加利用 KPIS 公式 ... XD

國營事業注意事項:

不管是專A or 專B,網路概論要看熟
綜合前幾年的考古題和今年的考題來看
其實考得還蠻細的
舉例來說,我在考前一天,特別把 IP 的 Header Format 挑重點看
結果他要的比我背的欄位還細
雖然我用刪去法刪到剩 2 個選項並猜題
但還是怕怕的
幸好有猜對(寫程式模擬倒扣果然有用 ... XD)
專A 我只要 2 選 1 都有猜,蠻幸運大部份都對
不過前提是刪去法的要沒背錯

802.03、802.04、802.05、802.11、802.15、802.16
背了那麼多的 802.X,結果給我考 802.1X
可見他考得多細
我懷疑高普考會這樣考嗎?
個人認為是因為選擇題才這樣考的緣故
不過既然有倒扣了,這樣考有意義嗎?

高考、普考、特考注意事項:

以出題水準度來說
高考 > 普考 > 特考

系統分析與設計看林信惠那本
資管看周宣光和林東清那本
即使不考資料結構,常見的演算法要做到能自己寫程式過一遍
什麼 B+ Tree、AVL Tree,不懂原理根本無法解題

近年來計概越來越難,不論是普考特考自己考試模擬結果都一樣
從八九十分變成六七十分
想要拿高分的秘訣,資結和布林代數(積之和,和之積)

英文注意事項:

應該要靠文法拿分
背再多的單字沒有超過 5000字 的水準
都只是背心酸的

文法除了少數跟單字有關的外
看了就會懂,懂了就會有分數

想到再補充 ...

2009年10月17日 星期六

Definitely, Maybe

早上吃早餐時,偶然轉到 HBO 看到的電影,如果不是我之前有這部 DVD﹝還沒看過﹞,這類型的電影應該不是現在的我有興趣的。

好吧,時間還足夠,看一下,雖然只看到結尾的 10 分鐘。

不過片尾曲很棒,雖然我看了歌詞還是不知道他在唱什麼。

是首適合陽光普照的天氣下,騎著腳踏車沿著河濱公園聽的紓情歌曲,有著淡淡的憂傷,以及想哭將哭的情懷﹝所以才要天氣晴的天氣 ... XD﹞。

2009年10月16日 星期五

今天航向西

哥倫布向西航行,找尋他認為存在的陸地。

當船上的食物、飲水只剩下一半時,
他面臨抉擇,返航?繼續向西?
他在航海日誌上,只短短寫下幾個字:「今天航向西。」

這個決定可能使船員暴動,而使他喪命;
更有可能的是,所有的人從此不會再踏上陸地。
我認為,這是他一輩子所做過最浪漫的一件事。

什麼是浪漫?
浪漫就是
「以有限的資源或條件,勇敢而堅定地,
追求一個不可能的理想或目標的那一份氣質和情懷」。

(出自 PTT 網友 hsnuhunter)

2009年10月9日 星期五

國考答案紙

出自 Ez會計師 -- 會計師考試心得分享

http://tw.myblog.yahoo.com/hedge-hog/article?mid=20



1、目前新版本申論試卷暨國文試卷配合公文橫書開始施行均採直式横書(全頁面積為17.5x26.5平方公分),自本年地方機關特種考試開始使用,以後各項各類考試均採用上開新版。2、各科(國文除外)申論試卷每頁保留左列兩直行為評分及題號之用。每頁可作答空間有23行,行寬1公分,行長約14公分,高考一、二級或相當等級特考申論式試卷頁數為9頁,高考三級、普、初考或相當等級特考、檢覈筆試試卷頁數均為七頁,惟第一頁因第一行註明「答案請從本頁第1行開始書寫,並請標明題號,依序作答」,故僅有22行。3、各試卷封面底頁載明作答注意事項,卷首附有空白稿紙。答案紙務須節用,答案請從第1頁開始書寫,稿紙僅供擬答、試算或答案紙不足時使用。4、國文試卷均為七頁有格(直虛線横實線標示)計分14格23行,可作答空間為行長約15.7公分,行高23.5公分,格長寛為1.1公分x1公分。惟第一頁有「答案請從本頁第一行開始書寫,並請標明題號,依序作答」為22行,及保留左列一直行為評分之用,為13格。

2009年10月6日 星期二

嫁衣神功‧如意之境

嫁衣神功是天下間至剛至猛的武功。

取名嫁衣乃是"為他人作嫁衣裳"之意。

這嫁衣神功練成之後,真氣就會變得如火焰般猛烈,自己非但不能運
用,反而要日日夜夜忍受它的煎熬,那種痛苦實在非人所能忍受,所
以他只有將真氣內力轉注給他人。但若要練成嫁衣神功至少也要二十
年苦功,又有誰捨得將如此辛苦練成的功力送給別人。

嫁衣神功轉注給第二人之後,他本身固然已油盡燈枯,第二個人卻可
受用無窮。

嫁衣神功太過猛烈,所以練到六七成時,就要將練成的功力全都毀去
,然后再從頭練過,此一方法即為"欲用其利,先挫其鋒。"

嫁衣神功經此一挫,再練成後,其真氣的鋒稜已被挫去,但威力卻絲
毫末減,練的人等於已將這種功夫練過兩次,自然摸得更熟,非但能
將之發揮最大的威力,而且可以收發由心,運用如意了。

欲練嫁衣神功以達天下無敵的境地,必先使自身受盡煎熬,再嘉惠他
人,方能達到功力收放自如、天下無敵的如意之境。



雖然只來得及將該看的書看過一遍,有些也還來不及背起來,但我已
經盡了我最大的努力,無愧於心。

以前總認為台灣的考試很機車,總是在考死背,沒想到高普考的題目
還蠻有水準的,不是我想像中的那麼無聊。

也許這兩個月來都沒在寫程式,但現在的我反而比以前的任何時候,
都還想寫程式。

不過,不要逼我看卡諾圖畫簡和正反器呀!

看就看,誰怕誰?

畢竟現在的我已經進入如意之境了 ... XD

2009年10月1日 星期四

最近黃金存摺牌價


常用 7000 單字清單 - Level

http://tylpk.myweb.hinet.net/English/7000_LEVEL_1.txt
http://tylpk.myweb.hinet.net/English/7000_LEVEL_2.txt
http://tylpk.myweb.hinet.net/English/7000_LEVEL_3.txt
http://tylpk.myweb.hinet.net/English/7000_LEVEL_4.txt
http://tylpk.myweb.hinet.net/English/7000_LEVEL_5.txt
http://tylpk.myweb.hinet.net/English/7000_LEVEL_6.txt

全民英檢單字清單

http://tylpk.myweb.hinet.net/English/GEPT_1.txt
http://tylpk.myweb.hinet.net/English/GEPT_2.txt
http://tylpk.myweb.hinet.net/English/GEPT_3.txt

為了這個清單搞了好久
本想直接用 n詞酷 分享的就好
後來還是去 GEPT 網站
使用暗黑心法 + 自己寫的小程式 + 人工比對
終於有了這份清單

留給有緣人吧 ~

2009年9月23日 星期三

配合英文學習 - 未來 EasyDictionary 改版事項

1. 取消 Config Record,都什麼時代了,還在用 File DB 的觀念。
2. 增加英文字字數統計的欄位,可以幫忙分析英文字常出的頻率等。
3. 取消 word 欄位不能重覆的限制(同樣的單字可以歸類在不同的群組)。

4. 參考棉被俠的程式,增加另一種測驗方式。
5. 批次下載失敗的單字要有 Log 記錄。
6. 找出 Thread 播 mp3 不 delay 的做法,或是找 open source 解決。
7. 增加相似字尋找的功能(select word from word where word like '%pose')
8. PKY = groups + word
9. prefix 改成 char not int



以上是這陣子練習英文的一些想法
感覺對英文越來越有 idea 了
哈 ... 我果然是天才

2009年9月22日 星期二

英文好好玩

英文這個科目從最早的沒把握
到現在想靠它拿分數
這其間的轉折我也不知道是怎麼回事

也許是因為英文的範圍比較明確吧
而且有背就有分

話說回來
看了一下人資的考古題
好像也蠻簡單的
至少比資訊類的申論題簡單多了

這是因為我沒有上過正統的課程
所以抓不到考試的重點嗎?

如果 100 分都考程式就好了
那我現在就可以出去玩了 ... XD

Wanted

圖書館呆久了總是會有一些奇奇怪怪的想法

最近突然有幾個想寫的程式

1. 程式碼排版軟體(轉 HTML),為了貼文章用。

反正我又不是要寫 compiler,分析和剖析對這個程式來說並不需要
我只要想辦法讓空白和斷行可以轉 HTML 就好

不過剛試用某網站轉檔的結果好像也不差
那這個程式就算了吧
反正不要寫中文註解就好了 ... XD

倒扣‧猜題‧程式

#include <stdio.h>
#include <mem.h>
#include <stdlib.h>
#include <time.h>
//---------------------------------------------------------------------------
const int    iTotalQuestions = 50;
const int    iGetScore       = 2;
const double dDelScore       = 1.0/3.0;
const int    iSelects        = 2;
const int    iOKQuestions    = 15;
const int    iTotalTest      = 1000000;
const double dLimitRate      = 1.0/3.0;
const double dGuestMax       = (iGetScore*iOKQuestions)*(dLimitRate)/dDelScore/iGetScore;
//---------------------------------------------------------------------------
struct SQItem
{
    int Ans;
    int Quess;
    int Done;
};
struct SRItem
{
    int Score;
    int Count;
};
//---------------------------------------------------------------------------
SQItem *g_iExam   = NULL;
SRItem *g_iResult = NULL;
//---------------------------------------------------------------------------
int GetQuestionSize(void)
{
    return (iTotalQuestions-iOKQuestions);   
}   
//---------------------------------------------------------------------------
int GetResultSize(void)
{
    int Size = ((int)dGuestMax+iOKQuestions)*iGetScore -
               (iOKQuestions*iGetScore-(int)(dGuestMax*dDelScore)*iGetScore) + 1;
               
    return Size;
}
//---------------------------------------------------------------------------
void GetQuestion(void)
{
    int QSize = GetQuestionSize();
   
    g_iExam = new SQItem[QSize];
   
    if(g_iExam)
    {
        for(int i = 0; i < QSize; i++)
        {
            g_iExam[i].Ans   = rand()%(iSelects);
            g_iExam[i].Quess = 0;
            g_iExam[i].Done  = 0;
        }           
    }   
}
//---------------------------------------------------------------------------
void DelQuestion(void)
{
    if(g_iExam)
    {
        delete []g_iExam;
        g_iExam = NULL;
    }   
}
//---------------------------------------------------------------------------
void InitResult(void)
{
    int RSize = GetResultSize();             
   
    g_iResult = new SRItem[RSize];
   
    for(int i = 0; i < RSize; i++)
    {
        g_iResult[i].Score = 0;
        g_iResult[i].Count = 0;
    }
}
//---------------------------------------------------------------------------
void DelResult(void)
{
    if(g_iResult)
    {
        delete []g_iResult;
        g_iResult = NULL;
    }   
}
//---------------------------------------------------------------------------
void SortResult(void)
{
    int RSize = GetResultSize();
   
    SRItem tmp;
   
    for(int i = 0; i < RSize; i++)
    {
        for(int j = i; j < RSize; j++)
        {
            if(g_iResult[i].Count < g_iResult[j].Count)
            {
                memcpy(&tmp, &g_iResult[i], sizeof(SRItem));
               
                memcpy(&g_iResult[i], &g_iResult[j], sizeof(SRItem));
               
                memcpy(&g_iResult[j], &tmp, sizeof(SRItem));
            }     
        }
    }
}
//---------------------------------------------------------------------------
void CalResult(void)
{
    int QSize = GetQuestionSize();
   
    int OCount = 0;
    int XCount = 0;
   
    for(int i = 0; i < QSize; i++)
    {
        if(g_iExam[i].Done == 1)
        {
            if(g_iExam[i].Ans == g_iExam[i].Quess)
            {
                OCount++;
            }
            else
            {
                XCount++;   
            }                                   
        }
    }
   
    double Total = iGetScore*(iOKQuestions+OCount) -
                   iGetScore*dDelScore*(XCount);
   
    int RSize = GetResultSize();
   
    //Old Result
    for(int i = 0; i < RSize; i++)
    {
        //Finded
        if(g_iResult[i].Score == (int)Total)
        {   
            g_iResult[i].Count++;
           
            return;
        }
    }
   
    //New Result
    for(int i = 0; i < RSize; i++)
    {
        //New Item
        if(g_iResult[i].Score == 0)
        {   
            g_iResult[i].Score = (int)Total;
            g_iResult[i].Count++;
           
            return;
        }
    }
}
//---------------------------------------------------------------------------
void WriteResult(void)
{
    FILE *f = fopen("Result.txt", "wb");
   
    if(f)
    {
        SortResult();
       
        int RSize = GetResultSize();
       
        for(int i = 0; i < RSize; i++)
        {
            if(g_iResult[i].Count != 0)
            {
                fprintf(f, "%07d, %d\r\n", g_iResult[i].Count, g_iResult[i].Score);
                printf("%07d, %d\r\n", g_iResult[i].Count, g_iResult[i].Score);
            }
        }
       
        printf("\r\n\r\n");           
        fclose(f);     
    }
}
//---------------------------------------------------------------------------
void GuessExam(void)
{
    while(1)
    {
        int QSize = GetQuestionSize();
        int index = rand()%(QSize);
       
        if(g_iExam[index].Done == 0)
        {
            g_iExam[index].Quess = rand()%(iSelects);
            g_iExam[index].Done  = 1;           
                   
            break;
        }
    }
}
//---------------------------------------------------------------------------
int main(int argc, char *argv[])
{   
    srand((unsigned int)time(0));
   
    InitResult();
       
    for(int i = 0; i < iTotalTest; i++)
    {
        int count = 0;
       
        GetQuestion();
       
        while(1)
        {
            GuessExam();
           
            count++;           
           
            if(count == (int)dGuestMax)
            {
                break;   
            }   
        }
       
        CalResult();
       
        DelQuestion();
    }
   
    WriteResult();
    DelResult();   
   
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
 

2009年9月21日 星期一

2009年9月19日 星期六

倒扣‧猜題‧結論

延續之前的想法,增加了一些變數

1. 只有 4 個選項
2. 最多猜到原本的分數被吃掉 1/3 就不再猜題
3. 反正是電腦在跑,就讓它跑一百萬次



結果如下!

30 分有把握,猜 15 題 (吃掉 1/3 的最多猜題次數),4 選 1

30 分有把握,猜 06 題,4 選 1


30 分有把握,猜 15 題,2 選 1




我想結論應該已經很明顯了!

4 選 1 的情況下,猜不猜題都沒有意義。
2 選 1 的情況下,即使猜題猜到 15 題,都還可以接受。

2009年9月12日 星期六

倒扣‧猜題

這次的考試有倒扣
別科倒也罷了
英文卻有最低標的限制
雖然英文需要長久的努力
並非一朝一夕可即
但是總可以做點什麼吧?

為了反應真實考試狀況
假設是 50 題單選題,一題 2 分,倒扣 1/3

如果以常理推斷
錯 3 題才會吃掉 1 題的分數
看起來是很划算的
不過實情真的是如此嗎?

我決定使用程式來模擬倒扣的情況

1. 分別用同樣的程式在 Windows and Linux 下跑,避免作業系統的差異。
2. 次數跑 10000 次。
3. 要先決定英文有把握的分數,我看應該是 30 分,也就是有 35 題是需要猜的。
4. 程式一點也不難,難的是這個模擬要有意義,故要把所有真實情況都考慮進去再來動工。

未完待續 ~

2009年8月29日 星期六

詩海不存在

相傳詩海石硯台是上古時期的先天人
一揮長虹造天筆的隱居之處

在那個地方,流傳著一個傳說:
詩海不存在,神筆出硯台

意即當詩海這個地方消失了
造天筆就會再渡紅塵 ...

2009年8月28日 星期五

EasySVNLog

這個程式最早的用途是
幫助前東家的同事可以方便找出自己在 SVN 上曾經做過的修改
並整理成檔案清單方便 BSP 進版用

後來在某一次與 HW 弟兄驗證 reset 問題時
又將它做了些修改
可以決定 parse 的條件等

故其實不全是為了 SVN 用的
我後來 parse log 都是直接用它

剛剛在驗證 EasyDictionary SQL 語法的問題
為了確認單字 select 的條件
EasySVNLog 就又重出江湖啦 ....

格式化輸出的重要性

大概沒有人像我一樣用 C 去寫 parser 吧?

也不是說 C 不好用,只是有了正規表示法的加持,大部份的人都會選擇用 Perl 之類的語言來做。

我就記得我資策會的一個老師曾經分享他的經驗,用 Perl 幫某園區半導體廠 parsing  log 來分析問題。

前前家公司某位同事離職時被交接了一個工作,該程式是負責每天轉送儀器送來的圖至 Server 上。

由於是一家算大的醫院,故每天的量其實都很驚人,只有 3 台 PC 權做 Server,卻又分別接 5 ~ 6 台 Gateway 丟過來的圖,忙碌是一定的,因此常被質疑怎麼圖都沒有收到,害醫生不能打報告。

我接手後,除了改善一些效能上的問題之外,最重要的是我將原本的 log 去蕪存菁,整理出有用的資訊及格式化相關字串。

因此我可以寫一個 parser,把我需要的字串 parsing 出來,並直接寫入到 excel 裡,我只要再手動選取做成圖表即可,應該餵給 gnupilot 才對,不過我還需要篩選,excel 還是較方便。

這樣一來,當技師再質疑時,我只要連到現場把 log 抓回來,用我的工具產生報表,就可以解釋異常的原因,甚至證明程式是沒有問題的。

我不否認我會買些軟體工程的書來看,不過有些想法我覺得還是天生的,這大概就是身為程式設計師的命吧。

2009年8月27日 星期四

EasyDictionary 完成版 V2

本次修正如下:

1. 修正學習與測驗 SQL rule 顛倒的問題。
2. SQL rule 的計算由 int 改為 double(%f)。
3. 修正單字測驗時按下 ESC 次數會顯示 0 的問題。


年紀大了,寫程式有點力不從心了... XD

人一輩子寫程式的量大概是固定的吧?
這五年間我已經把 quota 都用完了 ...

2009年8月26日 星期三

風之水晶‧轉職‧網路工程師

這樣下去,我快變成網路工程師了!

這個科目對我來說還算是最輕鬆的。

加油,再撐一下。

2009年8月25日 星期二

EasyDictionary 待解 Bug

select learn_count from word where groups='Config';
Config Learn Count (7).
select count(*) from word where groups='Dictionary';
Group (Dictionary), Total Words (4)
select learn_count from word where groups='Dictionary';
Group (Dictionary), Total Learn Count (3)
Rule Rate (0).
select * from word where learn_count <= 0 and groups='Dictionary' ORDER BY Random() limit 1;
Learn Word (reclaim)

測驗 SQL 取法有 Bug ...

要去圖書館了,先記得,有空再說 ...

EasyDictionary 完成版 V1

本次修正如下:

1. 因為延用單字學習的 function,所以變成測驗也會更新學習次數,已修正。
2. 因為延用單字學習的 function,所以 rule 變成沒學習過的反而會出現在測驗,已修正。
3. 將輸入欄改成紫色,感覺比較好看。
4. 稍微調整一下 UI size。
5. 修正離開單字測驗後,視窗沒有置中的問題。

2009年8月23日 星期日

EasyDictiony 完成版

雖然 UI 不怎麼樣
但還是趕在閉關前把它寫了出來

儘管已對資訊業不存在任何幻想
但完成的那一剎那
其實還是有點興奮的
雖然只有那僅僅的幾秒鐘

開始測驗

測驗結果

電腦審計

以下內容出自 PTT, reiny﹝背景:資管系﹞

勤業眾信電腦審計面試過程

我主動應徵的~在會議室跟兩位主管進行面談
問了應徵動機? 對這行的了解?
也特別針對成績單問了 UNIX 學校學了什麼?
XML的課程內容跟業界應用有哪些?
結束後寫好多份考卷(英文+邏輯測驗(or性向測驗忘了)+電腦專業科目)
簡單描述一下電腦專業科目內容~包含了UNIX跟WINDOS的指令跟權限設定介面問題
還有資訊環境安全與風險評估的簡答題~問題很多 寫不完是正常 就盡量寫



XML課程?
還是指 UML ?

2009年8月22日 星期六

LaTex 真好玩

雖然現在並沒有要寫論文
不過玩玩 LaTex 還蠻有趣的

1. 把台大 FTP 站的 cwtex33 下的東西全抓回來
2. install cwtex33(已包含相關軟體,editor等的不用裝)
3. install Texmaker(LaTex editor)
4. 中文還搞不定 ... XD











仁者無敵

剛剛轉電視看到重撥的京奧跆拳道比賽項目
(最近生活真棒,已經看完了好幾本書,可惜只剩幾天了)

跆拳道素有腳的藝術師之稱
踢的技法真的是很華麗
除了迴旋踢外
個人感覺等你轉身回來
一個正拳就把你打趴了
也許我也是說得一嘴好功夫吧 ... XD

受到黃飛鴻電影的影響
我對洪拳還蠻有興趣的

相傳洪拳是福建茶商洪熙官所創的一門武術
工字伏虎拳則是洪拳的代表套路,主要是紮橋手、橋馬與氣息內勁
其中橋手用法,講求橋來橋上過、無橋自造橋

我記得古龍先生在圓月彎刀一書中提到
長於心智者必拙於體力
所以一般讀書的人
體質上多半文弱一點

只有練武的人不然
他們的武功進展是配合著心智並進的
武學登入一個新的境界
體能有了超異的成就
智慧也就一定跟著圓熟

可惜以前沒有早看到這本書
多走了冤枉路

君 子 所 以 異 於 人 者 , 以 其 存 心 也 . 君 子 以 仁 存 心 , 以 禮 存 心 . 仁 者 愛 人 , 有 禮 者 敬 人 . 愛 人 者 人 恆 愛 之 , 敬 人 者 人 恆 敬 之 .

2009年8月21日 星期五

作手的劇本

時間背景:2008/12
緣由:在金融海嘯中受創甚多

股民都是健忘的
而且剛歷經一波金融海嘯
就像牌桌上的賭徒一樣
想把失去的再贏回來

於是從 2009/03 開始
創造多頭氛圍
從平均交易量 600 多億
到 2009/08 的 1500 億

等到滿足了作手的獲利
便開始再來一次熊市
這樣還可以兩邊操作

以上純屬不負責任講座 ... XD

2009年8月20日 星期四

Dirty Code

程式如果跟 SQL 語法有關
Code 看起來就會很髒

我到現在還沒想到比較漂亮的做法

不知是不是要從 pattern 著手?

放空的禁忌

不是每支股票都可以拿來放空 ...

但這裡要探討的不是技術面的東西
而是心理層次方面的

放空最忌諱看某支股票不爽
所以放空時心情應該要處在一個很平靜的狀態
以客觀的心理來決定要不要放空該股票

以我個人經驗來說
雖然我到目前為止總投資損益還是正的
但我放空的操作累積起來就賠了快兩萬
而且出手幾乎都是賠
對照我的淨利益
其實一來一往中
我少賺了很多錢

在不正確的心態操作下
只會導致自我滅亡的結果

感謝王力群老師的文章讓我領悟了這個道理 ...

抽樣如何抽,樣本知多少?

以下內容出自網路!

信賴敘述(confidence statement)包含兩部分:誤差界限(margin of error)及信賴水準(level of confidence)
● 誤差界限告訴我們,樣本統計量離母體參數多遠。
● 信賴水準告訴我們,所有可能樣本中有多少百分比滿足這樣的誤差界限。
● 從一個隨機樣本所得到的統計量的變異性,並不受母體大小的影響,只要母體至少比樣本大 100 倍即可。
樣本統計量的變異性是由樣本的大小決定,而不是由母體的大小決定
● 信賴敘述的結論永遠是針對母體而不是針對樣本。
報告誤差界限時用 95% 的信賴水準是很普遍的
● 想在相同的信賴水準下要求較小的誤差界限嗎?取個大一點的樣本就成了。

統計裡面的一個基本動作:用樣本的事實,當做母體真實訊息的估計
● 參數(parameter)是描述母體的數字。參數是一個固定的數字,但是我們實際上無法知道參數的值。
● 統計量(statistic)是描述樣本的數字。一旦取了樣本,統計量的值就知道了。但是換個不同的樣本,統計量的值就可能改變。
● 我們常用統計量來估計未知的參數。
● 偏差(bias)是當我們取很多樣本時,統計量一直朝向同一個方向偏離母體參數值。
● 變異性(variability)描述的是,當我們取很多樣本時,統計量的值會散開到什麼程度。變異性大,就代表不同樣本的結果可能差別很大。
一個好的抽樣方法,應該要有小偏差以及小變異性
● 減低偏差:利用隨機抽樣即可。
● 減低變異性:用大一點的樣本即可。

2009年8月19日 星期三

會計皇‧統計神

這是我大二下學期時的綽號
雖然是我自稱的
但也表示了我對這些科目的自信心

最近在看一本統計的書
雖然價錢還不到 200
但是把一些理論的東西解釋得很清楚
讓我不禁懷疑
唸大學的意義何在?

當然那是指一般人
如果是用功讀書的學生
雖然他們只是讀死書
但我覺得多少還是有意義吧

台灣的僵化考試制度真的很糟糕
只要背多分就可以考上好學校
想當初我的三民主義和歷史如果拿到正常人的分數
至少也能報到前三名的大學

不過即使在開放的外國
愛因斯坦小時候也是被老師當作白癡來看
我想對台灣也就不要太苛刻了

還好脫離學生生活後
出了社會賺了錢
自己可以選擇自己想要讀的書
不再受限於填鴨式的教育

想想我比那些死讀書的人幸運多了
至少沒有失去閱讀的樂趣


終於來到這篇的正點了
年紀大了特別會碎碎唸
(其實是在幻想有沒有機會出書啦 ... XD)

以下內容出自﹝你不能不懂的統計常識﹞

01. 隨機選擇的好處是客觀,因為經常在一起的人其意見會互相影響。
02. 估計值的型態是可預知的。
03. 把隨機選取方式可能得到的平均分數在平均起來,必定等於全部樣本的平均分數。
04. 把分數平均之後,這些平均數的分散程度,必定小於原本個別分數的分散程度,這叫做集中化
05. 大部份估計值都距離真正值不遠,但前提是隨機選擇要夠客觀樣本數要夠多
06. 負責任的民調結果,都不應該只報導百分比這一個數字,還要加上信心水準和抽樣誤差。
07. 假設信心水準是 95%,最有可能的結果是落在該區間,即使不是,其誤差也不會相去太遠。
08. 一般民調的樣本數約一千人左右(95%, 3%)。
09. 信賴區間重疊,嚴格來說只能算平手。
10. 95%的信心水準,誤差率 1.5%,最少樣本數約為四千人
11. 99%的信心水準,誤差率 1.5%,最少樣本數約為七千三百多人
12. 用電話號碼隨機抽樣,因為可行性高,所以是最多民調使用的方式。
13. 專業的民調單位,能有較多方法,把抽樣影響結果準確性的因素盡量消除。


為了股票程式而重拾統計知識
目前看起來好像在繞遠路
但我認為這才是正確的學習方式
希望時間能夠為我證明 ...

扛壩子知識篇

感謝 HW 扛壩子的熱情指導,雖然有些我還似懂非懂,
但我會努力從歐姆定律中去漸漸了解電子的世界。


trickle -> fast -> topoff(pulse)
是 Qualcomm 的說法,但這些名詞不是標準用語。

不過基本上來說
只差在用語的差異
充電曲線的特性是不會變的

但是充電曲線是非線性的
(網路上搜尋一下有很多中文論文可以看)


電路原本就是閉電路,正極原本就會接到負極,
但正負極相接短路,是因為當時電阻變小,流經的電流變大,才會損害零件。


電子元件過熱造成的熱
從電路圖著手比從機構上著手
可以更有效的解決散熱問題

2009年8月17日 星期一

印度九九乘法表

適用範圍:

兩位數 x 兩位數
十位數的數字必須一致
十位數 > 3 其實就不好心算了

BMP HEADER


2009年8月16日 星期日

2009/08/14 平盤以下可放空個股

0050 - 台灣50
0051 - 中100
0052 - FB科技
0053 - 寶電子
0054 - 台商50
0055 - 寶金融
0056 - 高股息
0057 - FB摩台
0058 - FB發達
0059 - FB金融
0060 - 新台灣
0080 - 恒中國
0081 - 恒香港
1101 - 台泥
1102 - 亞泥
1201 - 味全
1210 - 大成
1216 - 統一
1301 - 台塑
1303 - 南亞
1314 - 中石化
1326 - 台化
1402 - 遠紡
1434 - 福懋
1440 - 南紡
1503 - 士電
1504 - 東元
1605 - 華新
1704 - 榮化
1710 - 東聯
1717 - 長興
1722 - 台肥
1723 - 中碳
1802 - 台玻
1907 - 永豐餘
2002 - 中鋼
2006 - 東鋼
2014 - 中鴻
2015 - 豐興
2023 - 燁輝
2101 - 南港
2103 - 台橡
2105 - 正新
2106 - 建大
2201 - 裕隆
2204 - 中華
2208 - 台船
2301 - 光寶科
2303 - 聯電
2308 - 台達電
2311 - 日月光
2315 - 神達
2317 - 鴻海
2323 - 中環
2324 - 仁寶
2325 - 矽品
2328 - 廣宇
2330 - 台積電
2332 - 友訊
2337 - 旺宏
2344 - 華邦電
2347 - 聯強
2349 - 錸德
2352 - 佳世達
2353 - 宏碁
2354 - 鴻準
2356 - 英業達
2357 - 華碩
2362 - 藍天
2371 - 大同
2377 - 微星
2379 - 瑞昱
2382 - 廣達
2384 - 勝華
2385 - 群光
2392 - 正崴
2393 - 億光
2395 - 研華
2409 - 友達
2412 - 中華電
2441 - 超豐
2448 - 晶電
2451 - 創見
2454 - 聯發科
2458 - 義隆
2474 - 可成
2475 - 華映
2485 - 兆赫
2498 - 宏達電
2501 - 國建
2504 - 國產
2542 - 興富發
2548 - 華固
2603 - 長榮
2605 - 新興
2606 - 裕民
2607 - 榮運
2609 - 陽明
2610 - 華航
2612 - 中航
2615 - 萬海
2617 - 台航
2618 - 長榮航
2704 - 國賓
2707 - 晶華
2801 - 彰銀
2823 - 中壽
2834 - 臺企銀
2854 - 寶來證
2855 - 統一證
2856 - 元富證
2880 - 華南金
2881 - 富邦金
2882 - 國泰金
2883 - 開發金
2884 - 玉山金
2885 - 元大金
2886 - 兆豐金
2887 - 台新金
2888 - 新光金
2889 - 國票金
2890 - 永豐金
2891 - 中信金
2892 - 第一金
2903 - 遠百
2912 - 統一超
2915 - 潤泰全
3008 - 大立光
3009 - 奇美電
3034 - 聯詠
3035 - 智原
3037 - 欣興
3044 - 健鼎
3045 - 台灣大
3189 - 景碩
3231 - 緯創
3367 - 英華達
3376 - 新日興
3443 - 創意
3474 - 華亞科
3481 - 群創
3622 - 洋華
3702 - 大聯大
4904 - 遠傳
4906 - 正文
5203 - 訊連
5522 - 遠雄
5608 - 四維航
5854 - 合庫
6005 - 群益證
6116 - 彩晶
6239 - 力成
6286 - 立錡
6505 - 台塑化
8008 - 建興電
8046 - 南電
8078 - 華寶
9904 - 寶成
9907 - 統一實
9917 - 中保
9921 - 巨大
9933 - 中鼎
9945 - 潤泰新

向 OpenSource 致敬

剛剛在 Jserv's blog 看到
0xlab 釋出 0xdroid -- Android distribution

我只能想到一句話,敬禮!

MSCI - Taiwan 2009/08/14

頭部?

又是一個頭部的開始?
算了,不預設立場
這不是機械派要了解的
我只要跟著訊號走就好了 ...

EasyStockData

真煩
正準備下載這一年的股市資料
結果大三元又改版了

只好拿出我的工具 EasyStockData
如果需要更早年份的資料
要從凌群網站中去 parse
http://www.dbmaker.com.tw/stock/



最近大盤資料 K 線圖:

基本電學原理 2

電流流過的路徑就稱為電路,且為閉鎖形式(閉電路)

電路的組成:
電壓、電流、電阻

負責將電流流動產生的電能轉變為光能或熱能,稱為負載。因為它有妨礙電流流通的性質,故也稱為電阻或阻抗。

直流電 - 流向和流量大小固定
交流電 - 電流的方向時常在改變

歐姆定率:
I = V/R
電流 I 與電壓 V 成正比,與電阻 R 成反比。

串聯 - 電流以同樣的大小在流動。
並聯 - 電流會變兩倍。

串聯 - 總電阻為各電阻的相加。
並聯 - 1/各電阻的倒數和。

家電用品和斷路器是以並聯接續的。(因此電壓都為 110 V)

CPU IDLE

X86:
hlt

ARM:
mov r0, #0
mcr p15, 0, r0, c7, c0, 4

參考資料:
http://orzlab.blogspot.com/2007/07/slc-ecc-correction-in-s3c2440.html

人生如夢

人生也許只是一場夢
但在夢中的人生亦應有著夢想

倒數計時中 ... 2

2009年8月15日 星期六

VR GetValue

if(sVR == "AE" || sVR == "CS" || sVR == "LO" ||
   sVR == "LT" || sVR == "PN" || sVR == "SH" ||
   sVR == "ST" || sVR == "UI")
{
  InsertString(iTag, sValue);
}
else if(sVR == "IS" || sVR == "SL" || sVR == "UL")
{
  InsertLong(iTag ,StrToInt(sValue));
}
else if(sVR == "DA")
{
  InsertDate(iTag, sValue);
}
else if(sVR == "TM")
{
  InsertTime(iTag, sValue);
}
else if(sVR == "AS")
{
  InsertAge(iTag, StrToFloat(sValue));
}
else if(sVR == "DS")
{
  InsertDouble(iTag, StrToFloat(sValue));
}
else if(sVR == "SS" || sVR == "US")
{
  InsertShort(iTag, StrToFloat(sValue));
}
 

國內醫療資訊系統相關廠商代表

* 台灣英飛特股份有限公司。
* 奇菱科技股份有限公司。
* 台灣電腦服務股份有限公司。
* 鉅仁科技股份有限公司。
* 台灣愛克發吉華股份有限公司。
* 台灣富士通股份有限公司。
* 奇異亞洲醫療設備股份有限公司。
* 商之器科技股份有限公司。

HIS

醫療院所的核心系統-醫療資訊系統(HIS)

劉麗惠/台北〈企業IT〉

相較於其他行業,醫院資訊系統的獨特性自成一格,醫院所採用的資訊系統,並非一般行業使用的企業資源規劃(Enterprise Resource Planning;ERP)、客戶關係管理(Customer Relationship Management;CRM),而是所謂的醫療資訊系統(Healthcare Information System;HIS)。


然而,HIS包含了哪些層面的應用系統,根據行政院衛生署資訊中心所公告的醫療資訊系統規範2.0,將HIS區分為3大部分,分別為「醫療相關資訊系統」、「行政管理相關資訊系統」及「基礎建設與醫院相關系統」。

醫療相關資訊系統旗下子系統包括「門診系統」、「入院出院轉診系統」、「醫囑系統」、「護理系統」、「檢驗系統」、「影像與放射資訊系統」、「藥品與衛材系統」、「手術與麻醉系統」、「重症照護系統」、「營養系統」以及「電子病理管理系統」。

行政管理相關資訊系統下面的子系統則有「健康保險系統」、「財務與行政管理系統」、「決策支援系統」、「醫院顧問關係管理系統」及「高階主管資訊系統」。

基礎建設與醫院相關系統則區分為「訊息、編碼與軟體開發標準」、「資訊安全」、「病人安全系統」、「公共衛生通報與監測系統」、「社區醫療資訊系統」、「長期照護系統」、「緊急醫療危機應變系統」、「行動無線運算平台資訊系統」以及「參考資訊架構」。

Private Tag

4109,0010=XX識別字串 (VR = LO)
0010代表我們用到的後面四碼(element number)都是10開頭

Private Creator Data Elements numbered (gggg,0010-00FF) (gggg is odd) shall be used to reserve a block of Elements with Group Number gggg for use by an individual implementor.

The implementor shall insert an identification code in the first unused (unassigned) Element in this series to reserve a block of Private Elements. The VR of the private identification code shall be LO (Long String) and the VM shall be equal to 1.


4109,1002=資料1
4109,1004=資料2
4109,1006=資料3
4109,1008=資料4
4109,100A=資料5
4109,100C=資料6
4109,100E=資料7
4109,1010=資料8
4109,1012=資料9
4109,1014=資料10
4109,1016=資料11
4109,1018=資料12
4109,101A=資料13
4109,101C=資料14

Private Data Elements have an odd Group Number that is not (0001,eeee),(0003,eeee), (0005,eeee), (0007,eeee), or (FFFF, eeee). Private Data Elements are discussed further in Section 7.8 (PS 3.5 of the DICOM Standard).

Transfer Syntax

Implicit VR Little Endian 1.2.840.10008.1.2
explicit VR Little Endian 1.2.840.10008.1.2.1
explicit VR Big Endian 1.2.840.10008.1.2.2

DICOM FILE META INFORMATION

1. 128 byte File Preamble(0x00, or Application defined)
2. 4 byte DICOM prefix("DICM")
3. DICOM Meta Elements with Tags and Lengths(0002 Group)

The 0002 Group shall be encoded using the explicit VR Little Endian Transfer
Syntax(UID=1.2.840.10008.1.2.1)

Image Plane Module Attributes(影像平面屬性)

Pixel Spacing(0028,0030)
記錄兩個十進位的值,標示影像每一個圖素中心之間的物理距離,
第一個數值為一列中相鄰圖素中心之距離,第二個數值為一行中相
鄰圖素中心之距離,由此可得影像在真實空間(單位為公釐)的大小。

Image Orientation(0020,0037)
記錄相對於病人的第一列及第一行的方向餘旋。

Image Position(0020,0032)
錄影像左上角的空間影像位置(單位為公釐),空間方向是依病人方向定義的
(x 軸向左為正,y 軸向後為正,z 軸向上為正)。

Slice Thickness(0018,0050)
記錄影像厚度(單位為公釐)。

Image Pixel Module(影像圖素模組)

Sample Per Pixel(0028,0002)
代表每一個像素的Byte,RGB=3、CMYK=4、Gray=1。

Photometric Interpretation(0028,0004)
圖像的色彩空間:
MONOCHROME1 - 灰階,像素最小值顯示為白色。
MONOCHROME2 - 灰階,像素最小值顯示為黑色。
RGB - RGB彩色圖案。
HSV - HSV彩色圖案。
PALLETE COLOR - 使用調色盤的彩色圖案。
ARGB
CMYK
YBR-FULL

Planar Configuration(0028,0006)
彩色圖案的像素數據排列順序:
0000 - R1、G1、B1、R2、G2、B2。
0001 - R1、R2、G1、G2、B1、B2。

Number of Frames(0028,0008)
Multi-Frame的影像的Frmae數。

Rows(0028,0010)
圖案的高,以像素為單位。

Columns(0028,0011)
圖案的寬,以像素為單位。

Bits Allocated(0028,0100)
The size of the Pixel Cell。

Bits Stored(0028,0101)
Total number of these allocated bits that will be used to represent a Pixel Sample Value, shall never be larger than Bits Allocated。

High Bit(0028,0102)
Where the high order bit of the Bits Stored is to be placed with respect to the Bits Allocated。

Pixel Representation(0028,0103)
0表示圖素值為正整數,1表示圖素值為補數。

以上四個屬性描述了像素單元的存儲結構。


Pixel Data(7FE0,0010)
像素數據。

Retired Data Elements

PS 3.6 標示 RET的 Tag就是Retired Data Elements.

SQ and Items

Item (FFFE,E000)
Item Delimitation Item (FFFE,E00D)
Sequence Delimitation Item (FFFE,E0DD)

以上3個都沒有VR(Implicit VR),不受Transfer Syntax規範。
除了Group Number and Element Number,
如果是little endian,則Item會等於(FEFF,00E0).

明確長度(以Big Endian為例)
(FFFE,E000) (0x00000004) Value Length 直接標明後面Value的實際長度。
沒有Value,Length就是(0x00000000).

不定長度(以Big Endian為例)
(FFFE,E000) (0xFFFFFFFF) Value Length = 0xFFFFFFFF。
結尾需有Item Delimitation Item.
(FFFE,E00D) (0x00000000) Value Length = 0x00000000。(標示結尾用,故不會有Value)

SQ跟Item很像
有明確長度Value Length就標示長度
不定長度結尾需有Sequence Delimitation Item.
其Value Length = 0x00000000。(標示結尾用,故不會有Value)

Attribute's Data Element Type

mandatory 強制的。
conditional 有條件的。
user option 選擇性。

1 必備,不允許空值即長度不能為0。
1C 符合條件一定要有。
2 必備,允許空值,所以長度可以為0。
2C 符合條件一定要有。
3 選擇性。

Byte ordering

VRs constructed of a strign of characters of 8-bit single byte codes are really constructed of a string of individual bytes, and are therefore not affected by byte ordering.

The VRs that are not a string of characters and consist of multiple bytes are:

2-byte US,SS,OW adn each component of AT
4-byte OF,UL,SL and FL
8-byte FD

VR Length、Value Length

explicit VR

OB、OW、OF、SQ、UN、UT,VR為4個byte,後2個byte為0x0000,Value Length為4個byte.其他VR為2個byte,Value Length也為2個Byte.

implicit VR

無VR,Value Length為4個byte.

故簡單來說有VR,VR幾個byte,Value Length便幾個byte. 無VR一律4個byte.

補充:
explicit VR下,OB、OW、OF、SQ、UN允許不定長度,但需要用Sequence Delimitation(FFFF,E0DD)來判斷結尾,此時Value Length為0xFFFFFFFF。

implicit VR下,可以允許不定長度,規則同上。

Data Elements

xxxx,yyyy

xxxx Group Number
yyyy Element Number

Standard Data Elements have an even Group Number that is not (0000,eeee), (0002,eeee), (0004,eeee), or (0006,eeee).

Note: Usage of these groups is reserved for DIMSE Commands(see PS 3.7 of the DICOM Standard) and DICOM File Formats.

Private Data Elements have an odd Group Number that is not (0001,eeee), (0003,eeee), (0005,eeee), (0007,eeee), or (FFFF, eeee). Private Data Elements are discussed further in Section 7.8 (PS 3.5 of the DICOM Standard).

VR Padding

Values with a VR of UI shall be padded with a single trailing NULL (00H) character when necessary to achieve even length. Values with a VR of OB shall be padded with a single trailing NULL byte value (00H) when necessary to achieve even length.

(Dicom Tag的值都必須是偶數,所以除了UI及OB的VR外,其他都補空白0x20)

12-Lead ECG IOD Modules(PS 3.3-2007 Page 172 ~ 172、812 ~ 818)

SOP class UID
1.2.840.10008.5.1.4.1.1.9.1.1

Modality(0008,0060)
Shall be ECG.

Waveform Sequence(5400,0100)
Items shall be between 1 and 5, inclusive.
(最多5個Item)

Number of Waveform Channels(003A,0005)
In each Waveform Sequence Item shall be between 1 and 13, inclusive.

The total number of channels encoded across all Items shall not exceed 13.
(如果有5個Item,5個Item加起來的Channel不能超過13個)

Number of Waveform Samples(003A,0010)
In each Waveform Sequence Item Shall be less than or equal to 16384.
(1個Channel的Samples最多有16384個)

Sampling Frequency(003A,001A)
In each Waveform Sequence Item shall be between 200 and 1000, inclusive.
(Frequency in Hz,意即每秒幾個取樣值)

16384 / 1000 = 16.384 即一個Item的呈現最多不會超過 16.384 Sec.
16384 / 200 = 81.920 即一個Item的呈現最多不會超過 81.920 Sec.

this allows over 16 seconds per channel at the maximum sampling frequency;
if longer recordings are required, the General ECG IOD may be used.

Waveform Sample Interpretation(5400,1006)
In each Waveform Sequence Item shall be SS(signed short)

Waveform Bits Allocated(5400,1004)
Each Sample's Bits
(需配合54001006來看)

Channel Definition Sequence(003A,0200)
003A0005有幾個Channel,此Sequence就會有幾個Item.

Channel Sensitivity(003A,0210)
Nominal numeric value of unit quantity of sample.

Channel Sensitivity Correction Factor(003A,0212)
Multiplier to be applied to encoded sample values to match units
specified in Channel Sensitivity(003A,0210). Required if Channel
Sensitivity is present.

Something about Dicom Tags

#Study ID(該次檢查的編號)
00200010=001
(請統一填001即可)

#Study UID(該次檢查的唯一識別ID)
0020000d=1.2.840.xxxxxx(機構代號)...

#Series Number(該組影像的編號)
00200011=1
(該次檢查有好幾組的話, 請從1開始編流水號即可)

#Series UID(該組影像的唯一識別ID)
0020000e=1.2.840.xxxxxx(機構代號)...

#Instance Number(影像編號)
00200013=1
(該組有好幾張影像的的話, 請從1開始編流水號即可)

#Instance UID
00080018=1.2.840.xxxxxx(機構代號)...

Ex:
Study UID = 1.2.840.xxxxxx(機構代號).部門編號.產品編號.儀器編號.時間
Series UID = Study UID + Series Number
Instance UID = Series UID + Instance Number

只要UID不會衝突即可...

相關資料:DICOM Fundamentals.ppt P73 ~ P75
申請機構代號:
http://www.dclunie.com/medical-image-faq/html/part8.html#UIDRegistration

#Study Date(檢查日期)
00080020=03/28/2007

#Series Date(該組影像產生日期)
00080021=03/28/2007

#Image Date(影像日期)
00080023=03/28/2007

#Study Time(檢查時間)
00080030=09:44:30.703

#Series Time(該組影像產生時間)
00080031=09:44:30.703

#Image Time(影像時間)
00080033=09:44:30.703

Attribute Matching(PS 3.4-2007 Page 41)

The following types of matching may be performed on Key Attributes
in the Query/Retrieve Service Class:

— Single Value Matching
— List of UID Matching
— Universal Matching
— Wild Card Matching
— Range Matching
— Sequence Matching

Matching requires special characters ( i.e. “*”,”?”,”-”, and “\”)
character repertoire for the VR of the Key Attributes.
Notes: 1.For example, the “-“ character is not valid for the DA, DT
and TM Vrs but is used for range matching.

The total length of the Key Attribute may exceed the length as
specified in the VR in PS 3.5. The Value Multiplicity (VM) may
be larger than the VM specified in PS 3.6 for the Key Attribute,
as defined for particular Matching Type.

難怪CFind or WorkList查詢時,明明是DA的VR,卻填上"20070101-20070103",又不受VR的
長度限制,這Dicom果然還真複雜。

補充一下Range Matching:

In the absence of extended negotiation, if the Attribute is a date, then:
a) A string of the form “ - ”, where is less or
equal to , shall match all occurrences of dates which fall
between and inclusive.
b) A string of the form “- ” shall match all occurrences of
dates prior to and including .
c) A string of the form “ -“ shall match all occurrences of
and subsequent dates.

In the absence of extended negotiation, if the Attribute is a time, then:
a) A string of the form “ - ”, where is less or
equal to , shall match all occurrences of times which fall
between and inclusive.
b) A string of the form “- ” shall match all occurrences of
times prior to and including .
c) A string of the form “ -“ shall match all occurrences of
and subsequent times.

If the Attribute is a datetime, then:
a) A string of the form “ - ”, where
is less or equal to , shall match all moments in time
which fall between and inclusive.
b) A string of the form “- ” shall match all moments in
time prior to and including .
c) A string of the form “ -“ shall match all moments in
time subsequent to and including .
d) The offset from Universal Coordinated Time, if present in the
Value of the Attribute, shall be taken into account for the
purposes of the match.

If extended negotiation of combined datetime matching is successful,
then a pair of Attributes that are a date and a time, both of which
specify the same form of range matching, shall have the concatenated
string values of each range matching component matched as if they were
a single datetime Attribute.

Note: For example, a Study Date of “20060705-20060707” and a Study Time
of “1000-1800” will match the time period of July 5, 10am until July 7,
6pm, rather than the three time periods of 10am until 6pm on each of
July 5, July 6 and July 7, as would be the case without extended
negotiation.

Range matching is not defined for types of Attributes other than
dates and times.