This man is too old to remember everything in his brain. Right now, he needs a place to write down what he has studied.
2014年10月28日 星期二
log table and log library
table : azo_file
library : cl_azolog
DATABASE ds
GLOBALS "../../config/top.global"
FUNCTION cl_azolog(p_key,p_fn,p_src,p_tag)
DEFINE p_key VARCHAR(40), # 索引值
p_fn VARCHAR(20), # 欄位名稱
p_src VARCHAR(500), # 原始值
p_tag VARCHAR(500), # 異動值
p_log LIKE azo_file.azo06
LET p_log = p_fn CLIPPED,' ',p_src CLIPPED,'->',p_tag CLIPPED
WHENEVER ERROR CONTINUE
INSERT INTO azo_file VALUES (g_prog,g_user,g_today,g_time,p_key,p_log)
WHENEVER ERROR CALL cl_err_msg_log
INSERT INTO tc_mem_file VALUES (g_prog,g_user,g_today,g_time,p_key,p_fn,p_src,p_tag)
END FUNCTION
library : cl_azolog
DATABASE ds
GLOBALS "../../config/top.global"
FUNCTION cl_azolog(p_key,p_fn,p_src,p_tag)
DEFINE p_key VARCHAR(40), # 索引值
p_fn VARCHAR(20), # 欄位名稱
p_src VARCHAR(500), # 原始值
p_tag VARCHAR(500), # 異動值
p_log LIKE azo_file.azo06
LET p_log = p_fn CLIPPED,' ',p_src CLIPPED,'->',p_tag CLIPPED
WHENEVER ERROR CONTINUE
INSERT INTO azo_file VALUES (g_prog,g_user,g_today,g_time,p_key,p_log)
WHENEVER ERROR CALL cl_err_msg_log
INSERT INTO tc_mem_file VALUES (g_prog,g_user,g_today,g_time,p_key,p_fn,p_src,p_tag)
END FUNCTION
2014年10月27日 星期一
將繁體中文 charset = utf-8 的網頁,parsing後,轉為big-5 存文字檔
use Encode;
$text = decode("utf8",$text);
$text = encode("big5",$text);
之後FTP到Windows OS,office 才不會看到亂碼
$text = decode("utf8",$text);
$text = encode("big5",$text);
之後FTP到Windows OS,office 才不會看到亂碼
如何解決 Perl parsing HTML 有 等特殊符號的問題
其實可以用
use Data::Dump;
...
...
...
#$text是有問題的html code
print Data::Dump->dump($text), "\n";
會有以下結果:
("Data::Dump", "Tel\xEF\xBC\x9A02 - 25590489 \xA0")
==> \xA0 是 的Perl 字串
所以用以下程式將 替換掉
$text =~ s/\xa0//;
use Data::Dump;
...
...
...
#$text是有問題的html code
print Data::Dump->dump($text), "\n";
會有以下結果:
("Data::Dump", "Tel\xEF\xBC\x9A02 - 25590489 \xA0")
==> \xA0 是 的Perl 字串
所以用以下程式將 替換掉
$text =~ s/\xa0//;
使用 VIM 進行 HEX Mode 編輯 (16進位編輯)
http://changyy.pixnet.net/blog/post/25633298-%E4%BD%BF%E7%94%A8-vim-%E9%80%B2%E8%A1%8C-hex-mode-%E7%B7%A8%E8%BC%AF-%2816%E9%80%B2%E4%BD%8D%E7%B7%A8%E8%BC%AF%29
想說以前都用 UltraEdit 編輯遊戲存檔,沒想到 VIM 也能這樣做。
只要編輯時,下 :%! xxd ,就會以 Hex Mode 顯示檔案,然後編輯完想返回可以再用 :%! xxd -r 接著再存檔囉
想說以前都用 UltraEdit 編輯遊戲存檔,沒想到 VIM 也能這樣做。
只要編輯時,下 :%! xxd ,就會以 Hex Mode 顯示檔案,然後編輯完想返回可以再用 :%! xxd -r 接著再存檔囉
2014年10月20日 星期一
2014年10月14日 星期二
2014年10月8日 星期三
陸游 十一月四日風雨大作/示兒
https://tw.knowledge.yahoo.com/question/question?qid=1205081706736
《十一月四日風雨大作》/陸游
僵臥孤村不自哀,尚思為國戍輪臺。
夜闌臥聽風吹雨,鐵馬冰河入夢來。
--------------------------------------------------------
十一月四日:指宋光宗淳邵熙三年十一月四日
僵臥:直艇地躺著
不自哀:不為自己的不幸遭遇而悲哀
戍:防守邊疆
輪臺:漢代西域地名(今新疆輪臺縣)
夜闌:夜深
冰河:指封凍的河流
這是一首抒情詩,是詩人晚年閒居山陰時所作。當時陸游已68歲,儘管年近古稀,處境孤獨險惡,仍渴望為國效忠,戍守邊防,表露了詩人的剛毅精神。
前兩句直抒胸臆。"僵臥"既交代了年邁,又象徵環境困苦。"孤村"被朝廷棄置不用,無人過問,仍"不自哀",還在想著"戍輪臺"。
後兩句轉入風雨和夢境的描寫。"夜闌"表示詩人為國勞心,常常難以入睡,直到深夜。"風雨"也是喻指當時南宋統治的政治氣候。固有的"風雨",自己的金戈 鐵馬氣吞殘虜的雄心遐想,只能寄託在夢中了,已只是一場空而已。"入夢來"既反映報國願望之強,又是對投降派的有力諷刺。而此夢更是不眠之夢,強化他老而 彌堅的形象,比從現實著筆更加深一層。
《示兒》/陸游
死去原知萬事空,但悲不見九州同。
王師北定中原日,家祭無忘告乃翁。
------------------------------------------------------
示兒:給兒子看,"示"字兼有訓示之意
原:原來的意思
但:只
九州:古代把中國劃分為九州,後來就把九州代稱中國
王師:南宋的軍隊
中原:泛指淮北一帶,當時為金人所佔
家祭:祭祀祖先
乃翁:你的父親
此詩是陸游的絕筆詩,終年85歲。詩人懷著臨終前不見中原恢復的遺恨,藉對兒子的遺囑,述說一生壯志未酬的悵怨。
開篇以"死"字著筆。詩人在病褟彌留之際,此時,要說之事,可謂千頭萬緒,詩人此刻萬事俱可忘懷,唯一事,就是變成土中枯骨也放不下的便是"九州同",唯念淪喪的國土。
結末二句,詩人以殷切的叮嚀口吻,囑托兒孫國土收復之日,家祭之時,不要忘記把喜訊告知你死去的父親。
此詩構思奇異,境界開闊。人死萬事皆空,卻有一事懸心不忘,自是感人之情。
2014年10月6日 星期一
perl HTML::TokeParser example
#!/usr/bin/perl
#use strict;
use LWP::Simple;
use HTML::TokeParser;
use Encode;
#my $html = get("https://www.iyp.com.tw/leisure/Hotels.html");
#my $html = get("https://www.iyp.com.tw/showroom.php?cate_name_eng_lv1=leisure&cate_name_eng_lv3=Hotels&p=0");
my $i;
open FILE ," >output.csv";
for ($i=0 ; $i<=60 ; $i++) {
my $html = get("https://www.iyp.com.tw/showroom.php?cate_name_eng_lv1=leisure&cate_name_eng_lv3=Hotels&p=$i");
my $stream = HTML::TokeParser->new(\$html);
my %image = ( );
while (my $token = $stream->get_token) {
#if ($token->[2]{"title"} ne "" && $token->[2]{"target"} eq "_blank") {
#if ($token->[0] eq 'S' && $token->[1] eq 'a' && $token->[2]{"class"} ne "more-btn") {
if ($token->[0] eq 'S' && $token->[1] eq 'a' && $token->[2]{"target"} eq "_blank" && $token->[2]{"class"} ne "more-btn") {
my ($tel) = $token->[2]{"href"} =~ m/(\d+)/;
print FILE "$tel" ."#\t";
#print FILE encode("big5",$token->[2]{"title"}). "\t";
print FILE $token->[2]{"title"}. "#\t";
}
if ($token->[0] eq 'S' && $token->[1] eq "span" && $token->[2]{"title"} eq "查看地圖") {
my ($misc,$addr) = $token->[2]{"go-map"} =~ m/(\/\/.*=)(.*)/;
#print FILE encode("big5",$addr) ."\n";
print FILE $addr ."\n";
#print $token->[2]{"go-map"}. "\n"
}
#}
}
}
close FILE;
#use strict;
use LWP::Simple;
use HTML::TokeParser;
use Encode;
#my $html = get("https://www.iyp.com.tw/leisure/Hotels.html");
#my $html = get("https://www.iyp.com.tw/showroom.php?cate_name_eng_lv1=leisure&cate_name_eng_lv3=Hotels&p=0");
my $i;
open FILE ," >output.csv";
for ($i=0 ; $i<=60 ; $i++) {
my $html = get("https://www.iyp.com.tw/showroom.php?cate_name_eng_lv1=leisure&cate_name_eng_lv3=Hotels&p=$i");
my $stream = HTML::TokeParser->new(\$html);
my %image = ( );
while (my $token = $stream->get_token) {
#if ($token->[2]{"title"} ne "" && $token->[2]{"target"} eq "_blank") {
#if ($token->[0] eq 'S' && $token->[1] eq 'a' && $token->[2]{"class"} ne "more-btn") {
if ($token->[0] eq 'S' && $token->[1] eq 'a' && $token->[2]{"target"} eq "_blank" && $token->[2]{"class"} ne "more-btn") {
my ($tel) = $token->[2]{"href"} =~ m/(\d+)/;
print FILE "$tel" ."#\t";
#print FILE encode("big5",$token->[2]{"title"}). "\t";
print FILE $token->[2]{"title"}. "#\t";
}
if ($token->[0] eq 'S' && $token->[1] eq "span" && $token->[2]{"title"} eq "查看地圖") {
my ($misc,$addr) = $token->[2]{"go-map"} =~ m/(\/\/.*=)(.*)/;
#print FILE encode("big5",$addr) ."\n";
print FILE $addr ."\n";
#print $token->[2]{"go-map"}. "\n"
}
#}
}
}
close FILE;
2014年10月3日 星期五
北京話中有希伯來語?有趣的比較
http://www.chinatimes.com/realtimenews/20141004001862-260405
「燒麥」又叫燒賣,被認為是受胡人影響而發明的食品,在希伯來語有個同音同義字Shemesh。(取材自網路)
希伯來語與華語,乍看之下像是天南地北的兩種語言,但學者石旭昊的考證,卻有令人吃驚的結果。北京屬於大河北地區,這
一地區包括河北、北京、天津、山西、陝西,甚至遠達現在西南的重慶東北部。由於古代羯胡人長期活躍在中國北方一帶,而且羯胡人的祖先是古希伯來人,因此北
京話中存有大量的希伯來語詞彙。
比如「得吧」,在北京話中是「說話」的意思,與古希伯來語同音同義,希伯來語發音 Dabar。
再比如,北京人常吃的「燒麥」,這也是羯胡人遷徙到中國北方發明的食品,與希伯來語同音同義,希伯來語的發音是Shemesh。
北京人常稱村 莊為「屯厄」(帶兒化音),而在《舊約聖經》中的希伯來語,也是如此稱呼村莊的,希伯來語的發音是Duwr。
其實,北京兒化音的形成原因,就與很多外來詞 彙有關。
類似的還有很多,例如:
「俺」,這個詞是北京和北方人「我」、「我的」意思,希伯來語也是同音同義,希伯來語的發音An和Ammi。
「丫頭」,「鴨蛋兒」,是北京人或北方人形容小女孩的,希伯來語同樣是這個意思,希伯來語的發音是Yaldah。
「別介」,是北京人表達否定的說法,相當於英語中No的意思,希伯來的發音是Bil-tsi與希伯來語同音同義。
「甭」,這個詞彙是北京表示否定之意,《舊約聖經》中的希伯來語同樣也是這個意思,發音是Bal。
「胡同」,這個北京最常見的地方,很多人以為是來自蒙古語,其實不對。實際也是希伯來語,發音是Hoot,同樣也是小街道的意思。
「捻兒」,在北京話中是燈芯的意思,在希伯來語中的意思是一樣的,也是照亮、照明以及光明有關的東西。希伯來語的發音是Ryn,Niyr。實際上我認為北京著名的兒化音,就是外來語的明顯印跡。
「坷垃」,表示硬土塊和石頭等意思。與希伯來語同音同義,希伯來語的發音是Kela。
「疙瘩」,北京、河北一帶的話表示團塊的意思,希伯來語發音是Qaneh,同音同義。
「窟」、「窟窿」,在中國北方是洞眼、洞穴、山洞之意,希伯來語同音同義,發音是Chowr。
「戲」,遊戲、戲耍之意,希伯來語的發音是Shiyr,意思是唱、演唱的意思。
類似中國北方話與希伯來語同音同義還有很多、很多詞彙,而且在歷史長河中,很多詞彙出現了符合與疊加,形成了意思或發音的改變。
比如,北京話中「丫的」,表 示你、你們的人稱代詞,其實希伯來語的發音是Yad,意思完全一樣。
只是現代北京話中的「丫的」已經是罵人的話了,這就是歷史與時間的扭曲了。
北京話中有希伯來語?有趣的比較

比如「得吧」,在北京話中是「說話」的意思,與古希伯來語同音同義,希伯來語發音 Dabar。
再比如,北京人常吃的「燒麥」,這也是羯胡人遷徙到中國北方發明的食品,與希伯來語同音同義,希伯來語的發音是Shemesh。
北京人常稱村 莊為「屯厄」(帶兒化音),而在《舊約聖經》中的希伯來語,也是如此稱呼村莊的,希伯來語的發音是Duwr。
其實,北京兒化音的形成原因,就與很多外來詞 彙有關。
類似的還有很多,例如:
「俺」,這個詞是北京和北方人「我」、「我的」意思,希伯來語也是同音同義,希伯來語的發音An和Ammi。
「丫頭」,「鴨蛋兒」,是北京人或北方人形容小女孩的,希伯來語同樣是這個意思,希伯來語的發音是Yaldah。
「別介」,是北京人表達否定的說法,相當於英語中No的意思,希伯來的發音是Bil-tsi與希伯來語同音同義。
「甭」,這個詞彙是北京表示否定之意,《舊約聖經》中的希伯來語同樣也是這個意思,發音是Bal。
「胡同」,這個北京最常見的地方,很多人以為是來自蒙古語,其實不對。實際也是希伯來語,發音是Hoot,同樣也是小街道的意思。
「捻兒」,在北京話中是燈芯的意思,在希伯來語中的意思是一樣的,也是照亮、照明以及光明有關的東西。希伯來語的發音是Ryn,Niyr。實際上我認為北京著名的兒化音,就是外來語的明顯印跡。
「坷垃」,表示硬土塊和石頭等意思。與希伯來語同音同義,希伯來語的發音是Kela。
「疙瘩」,北京、河北一帶的話表示團塊的意思,希伯來語發音是Qaneh,同音同義。
「窟」、「窟窿」,在中國北方是洞眼、洞穴、山洞之意,希伯來語同音同義,發音是Chowr。
「戲」,遊戲、戲耍之意,希伯來語的發音是Shiyr,意思是唱、演唱的意思。
類似中國北方話與希伯來語同音同義還有很多、很多詞彙,而且在歷史長河中,很多詞彙出現了符合與疊加,形成了意思或發音的改變。
比如,北京話中「丫的」,表 示你、你們的人稱代詞,其實希伯來語的發音是Yad,意思完全一樣。
只是現代北京話中的「丫的」已經是罵人的話了,這就是歷史與時間的扭曲了。
2014年10月1日 星期三
畫面能夠依資料內容來變更文字顏色、樣式
http://4shiun.blogspot.tw/2013/02/blog-post.html
TIPTOP的畫面設計比較偏向 TEXT-Mode ,所以會以比較單調樣式來呈現,
現在應該沒有人在用這種方式了吧,都是用 GUI 的方式來使用。
這樣就可以添加一些色彩、底線、粗體,來增加使用者操作上資料的辦識能力。
依 4js 的說明,在 DISPLAY 可以加上屬性,如下:
1. BLACK, BLUE, CYAN, GREEN, MAGENTA, RED, WHITE, YELLOW – 顯示顏色
2. BOLD, DIM, NORMAL – 顯示字體樣式
3. REVERSE, BLINK, UNDERLINE – 顯示文字的屬性
屬性的字面上的意思就能知道用途了,多重屬性時只要加上逗號來區隔,就不多加說明了。
例如我們想要 sfb01 這個欄位在某些情況下顯示藍色時,只要加判斷再加上 ATTRIBUTE,
例:
IF g_sfb01.sfb04 = '8' THEN
DISPLAY BY NAME g_sfb01.sfb01 ATTRIBUTE(BLUE)
ELSE
DISPLAY BY NAME g_sfb01.sfb01 ATTRIBUTE(BLACK)
END IF
鼎新也有提供 lib 的函式來改變顏色:
CALL cl_set_comp_font_color("sfb01,sfb02","RED")
但是如果是單身的話會用 DISPLAY ARRAY 就只能所有單身全部的顏色都變一樣,
要改用 DIALOG.setCellAttributes 的方式來顯示欄位的屬性。
例:
要先定義單身有那些是要動態變更欄位屬性的陣列變數:
DEFINE g_gen_attr DYNAMIC ARRAY OF RECORD
gen01 STRING,
gen02 STRING,
gen03 STRING
END RECORD
記得要先做 g_gen_attr.clear()。
在 fill() 函數時 FOREACH 的時候判斷:
IF g_gen[g_cnt].gen03 IS NULL TEHN
LET g_gen_attr[g_cnt].gen01 = 'MAGENTA REVERSE'
ELSE
LET g_gen_attr[g_cnt].gen01 = ''
END IF
再來就是 DISPLAY ARRAY 顯示的時候依定義好的屬性來顯示:
BEFORE DISPLAY
CALL cl_navigator_setting( g_curs_index, g_row_count )
CALL DIALOG.setCellAttributes(g_gen_attr) #加上這一句
畫面能夠依資料內容來變更文字顏色、樣式
現在應該沒有人在用這種方式了吧,都是用 GUI 的方式來使用。
這樣就可以添加一些色彩、底線、粗體,來增加使用者操作上資料的辦識能力。
依 4js 的說明,在 DISPLAY 可以加上屬性,如下:
1. BLACK, BLUE, CYAN, GREEN, MAGENTA, RED, WHITE, YELLOW – 顯示顏色
2. BOLD, DIM, NORMAL – 顯示字體樣式
3. REVERSE, BLINK, UNDERLINE – 顯示文字的屬性
屬性的字面上的意思就能知道用途了,多重屬性時只要加上逗號來區隔,就不多加說明了。
例如我們想要 sfb01 這個欄位在某些情況下顯示藍色時,只要加判斷再加上 ATTRIBUTE,
例:
IF g_sfb01.sfb04 = '8' THEN
DISPLAY BY NAME g_sfb01.sfb01 ATTRIBUTE(BLUE)
ELSE
DISPLAY BY NAME g_sfb01.sfb01 ATTRIBUTE(BLACK)
END IF
鼎新也有提供 lib 的函式來改變顏色:
CALL cl_set_comp_font_color("sfb01,sfb02","RED")
但是如果是單身的話會用 DISPLAY ARRAY 就只能所有單身全部的顏色都變一樣,
要改用 DIALOG.setCellAttributes 的方式來顯示欄位的屬性。
例:
要先定義單身有那些是要動態變更欄位屬性的陣列變數:
DEFINE g_gen_attr DYNAMIC ARRAY OF RECORD
gen01 STRING,
gen02 STRING,
gen03 STRING
END RECORD
記得要先做 g_gen_attr.clear()。
在 fill() 函數時 FOREACH 的時候判斷:
IF g_gen[g_cnt].gen03 IS NULL TEHN
LET g_gen_attr[g_cnt].gen01 = 'MAGENTA REVERSE'
ELSE
LET g_gen_attr[g_cnt].gen01 = ''
END IF
再來就是 DISPLAY ARRAY 顯示的時候依定義好的屬性來顯示:
BEFORE DISPLAY
CALL cl_navigator_setting( g_curs_index, g_row_count )
CALL DIALOG.setCellAttributes(g_gen_attr) #加上這一句
如何直覺式知道 axmi221 其他地址和客戶聯絡人有沒有內容 ?
http://4shiun.blogspot.tw/2014_08_01_archive.html
過去的文章可以用一個圖示就知道有沒有附件的資料-增加相關文件圖示,
方便查詢時就不需要每個都按相關文件去查看。
那如果是 Action 呢? 能不能知道 Action 串連的程式有沒有資料。
舉例: axmi221 客戶基本資料能不能直覺式就看出來有沒有其他地址和客戶聯絡人呢?
其實也是可以的,在 Action 可以動態加上 image 的圖示就可以了,
沒辦法改變 Action 的文字顏色或是背景的顏色。
Genero 已經有預設一些圖示提供給 TIPTOP 可以直接宣告來使用,
想要看有那些圖示,請參考:/u1/genero/gas/pic/ 資料夾的 png 檔。
再來就是依範例加上此段程式就可以啦。有資料的時候就會顯示圖示,沒有資料的話就不會顯示圖示。
這樣就方便使用者可以很直覺的知道有沒有輸入資料了。
# 有客户其他地址時顯示符號
LET l_cnt = 0
SELECT COUNT(*) INTO l_cnt FROM ocd_file WHERE ocd01 = g_occ.occ01
IF l_cnt > 0 THEN
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_address1")
CALL n.setAttribute("image","information")
ELSE
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_address1")
CALL n.setAttribute("image","")
END IF
# 有客户聯絡人時顯示符號
LET l_cnt = 0
SELECT COUNT(*) INTO l_cnt FROM oce_file WHERE oce01 = g_occ.occ01
IF l_cnt > 0 THEN
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_contact")
CALL n.setAttribute("image","information")
ELSE
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_contact")
CALL n.setAttribute("image","")
END IF
如何直覺式知道 axmi221 其他地址和客戶聯絡人有沒有內容 ?
方便查詢時就不需要每個都按相關文件去查看。
那如果是 Action 呢? 能不能知道 Action 串連的程式有沒有資料。
舉例: axmi221 客戶基本資料能不能直覺式就看出來有沒有其他地址和客戶聯絡人呢?
其實也是可以的,在 Action 可以動態加上 image 的圖示就可以了,
沒辦法改變 Action 的文字顏色或是背景的顏色。
Genero 已經有預設一些圖示提供給 TIPTOP 可以直接宣告來使用,
想要看有那些圖示,請參考:/u1/genero/gas/pic/ 資料夾的 png 檔。
再來就是依範例加上此段程式就可以啦。有資料的時候就會顯示圖示,沒有資料的話就不會顯示圖示。
這樣就方便使用者可以很直覺的知道有沒有輸入資料了。
# 有客户其他地址時顯示符號
LET l_cnt = 0
SELECT COUNT(*) INTO l_cnt FROM ocd_file WHERE ocd01 = g_occ.occ01
IF l_cnt > 0 THEN
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_address1")
CALL n.setAttribute("image","information")
ELSE
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_address1")
CALL n.setAttribute("image","")
END IF
# 有客户聯絡人時顯示符號
LET l_cnt = 0
SELECT COUNT(*) INTO l_cnt FROM oce_file WHERE oce01 = g_occ.occ01
IF l_cnt > 0 THEN
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_contact")
CALL n.setAttribute("image","information")
ELSE
LET w = ui.Window.getCurrent()
LET n = w.findNode("MenuAction","customer_contact")
CALL n.setAttribute("image","")
END IF