環境:Win7+XE4
uses System.RegularExpressionsCore;
:
procedure TForm1.Button1Click(Sender: TObject);
var
RE: TPerlRegEx;
slFile,slTmp: TStringList;
begin
RE:=TPerlRegEx.Create;
slFile:=TStringList.Create;
slTmp:=TStringList.Create;
slFile.LoadFromFile(FOD1.FileName);
RE.Subject:=slFile.Text;
RE.Options:=[preCaseLess]; //忽略大小寫
slTmp.Delimiter:='|';
slTmp.Text:=Memo1.Lines.Text;
RE.RegEx:='([\s|\.|\=|\[])('+slTmp.DelimitedText+')([\s|\.|\]])';
while RE.MatchAgain do begin
RE.Replacement:='$1GA00_$2$3'; //也可以 " \ " 替代 " $ " 結果相同
RE.Replace;
end;
FreeAndNil(RE);
FreeAndNil(slFile);
FreeAndNil(slTmp);
end;
備註:
TPerlRegEx.ComputeReplacement; //經樣式運算後的替代字串
TPerlRegEx.MatchedText; //符合樣式的字串等同 TPerlRegEx.Groups[0]
TPerlRegEx.Replacement:=''; //經運算後似乎無法讓Replace再利用,所以看使用狀況必須重覆執行
2016-02-11
2016-01-25
2015-04-06
Google App Engine memcache 測試
環境:
# -*- coding: utf-8 -*-
#!/usr/bin/env python2.7
import webapp2
import urllib2
import json
from google.appengine.api import memcache
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
r = urllib2.urlopen('http://mis.twse.com.tw/stock/api/getIndustry.jsp')
j = json.loads(r.read())
for n in range(0,len(j['tse'])):
memcache.add(key=j['tse'][n]['code'], value=j['tse'][n]['name'], namespace='tse')
for n in range(0,len(j['otc'])):
memcache.add(key=j['otc'][n]['code'], value=j['otc'][n]['name'], namespace='otc')
self.response.out.write(memcache.get(key='01', namespace='tse'))
self.response.out.write(memcache.get(key='01', namespace='otc'))
- Google App Engine - 1.9.18
- Python-2.7
# -*- coding: utf-8 -*-
#!/usr/bin/env python2.7
import webapp2
import urllib2
import json
from google.appengine.api import memcache
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
r = urllib2.urlopen('http://mis.twse.com.tw/stock/api/getIndustry.jsp')
j = json.loads(r.read())
for n in range(0,len(j['tse'])):
memcache.add(key=j['tse'][n]['code'], value=j['tse'][n]['name'], namespace='tse')
for n in range(0,len(j['otc'])):
memcache.add(key=j['otc'][n]['code'], value=j['otc'][n]['name'], namespace='otc')
self.response.out.write(memcache.get(key='01', namespace='tse'))
self.response.out.write(memcache.get(key='01', namespace='otc'))
2015-02-21
Delphi 讀取證券交易所股票資訊JSON格式
環境:
- Win7
- Delphi XE4
uses IdHTTP, Data.DBXJSON;
...
...
procedure TForm1.Button1Click(Sender: TObject);
var
H: TIdHTTP;
JSON: String;
JO: TJSONObject;
JV: TJSONValue;
JP: TJSONPair;
begin
H:=TIdHTTP.Create(nil);
H.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)';
JSON:=H.Get('http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_3673.tw');
JO := TJSONObject.ParseJSONValue(JSON) as TJSONObject;
JP := JO.Get(0);
ShowMessage(JP.ToString);
ShowMessage(JP.JsonString.Value);
JV:=(JP.JsonValue as TJSONArray).Get(0);
ShowMessage((JV as TJSONObject).Get('n').JsonValue.Value);
FreeAndNil(JO);
FreeAndNil(H);
end;
2015-02-11
一次清除 GroupBox 裡所有 CheckBox.Checked 狀態
procedure TMainForm.btnClearClick(Sender: TObject);
var
i: Integer;
begin
for i := 0 to GB2.ControlCount-1 do
if GB2.Controls[i].ClassNameIs('TCheckBox') then
TCheckBox(Gb2.Controls[i]).Checked:=False;
end;
var
i: Integer;
begin
for i := 0 to GB2.ControlCount-1 do
if GB2.Controls[i].ClassNameIs('TCheckBox') then
TCheckBox(Gb2.Controls[i]).Checked:=False;
end;
2015-02-09
動態設定 FastReport frxReport 資料來源
procedure setRepDataSource;
var
DB : TfrxADODatabase;
Query: TfrxADOQuery;
begin
with Main.frxReport1 do begin
DB := TfrxADODatabase(FindObject('ADODatabase1'));
DB.Connected := False;
DB.DatabaseName := DM.ADOC1.ConnectionString;
DB.Connected := True;
Query := TfrxADOQuery(FindObject('ADOQuery1'));
Query.Close;
Query.SQL.Text:=DM.ADODataSet1.CommandText;
Query.Open;
end;
end;
var
DB : TfrxADODatabase;
Query: TfrxADOQuery;
begin
with Main.frxReport1 do begin
DB := TfrxADODatabase(FindObject('ADODatabase1'));
DB.Connected := False;
DB.DatabaseName := DM.ADOC1.ConnectionString;
DB.Connected := True;
Query := TfrxADOQuery(FindObject('ADOQuery1'));
Query.Close;
Query.SQL.Text:=DM.ADODataSet1.CommandText;
Query.Open;
end;
end;
2015-02-07
Delphi MainMenu 字型放大及Menu Checked 提示圖示不見解決方法
Delphi 預設 Menu 字型大小為8,想把它放大為12只要2個步驟即可:
- 在Project Source 中加上 Screen.MenuFont.Size:=12;
- MainMenu -> OwnerDraw -> True
Menu字型放大後,點選MenuItem後若有設Checked屬性,會發現無法正常顯示提示圖示,原先想以ImageList顯示圖示為解決方案,後來發現只要加入ImageList並指定給MainMenu後即可解決這個問題,不必載入Bitmap icon也可正常運作:
- 加入 ImageList
- MainMenu -> Images -> ImageList1
2014-08-27
Indy IdUDPServer/IdUDPClient 接收傳送中文字
透過 Indy 套件的 IdUDPServer / IdUDPClient 收發訊息時,英文基本上一定是沒啥問題,但遇到傳送中文訊息,以Indy的預設編碼傳送後接收顯示為亂碼,很明顯是編碼出了狀況,測試的環境為Win7 + XE4,TextEncoding的功能參數必須 uses IdGlobal 才會正常,最初測試時試了半天找不到正確的參數,只好去 IdGlobal.pas 翻一下,找到這個:
在使用 IdUDPServer / IdUDPClient 收發時,下列兩種方式都可以正常傳送顯示中文,以IdUDPClient為例,IdUDPServer 也適用:
測試環境:
uses IdGlobal;
..............
IdUDPClient1.Send(Edit1.Text, IndyTextEncoding_UTF8);
or
GIdDefaultTextEncoding := encUTF8;
IdUDPClient1.Send(Edit1.Text);
在使用 IdUDPServer / IdUDPClient 收發時,下列兩種方式都可以正常傳送顯示中文,以IdUDPClient為例,IdUDPServer 也適用:
測試環境:
- Windows 7
- Delphi XE4 測試版
uses IdGlobal;
..............
IdUDPClient1.Send(Edit1.Text, IndyTextEncoding_UTF8);
or
GIdDefaultTextEncoding := encUTF8;
IdUDPClient1.Send(Edit1.Text);
2014-06-12
Delphi XE? + dbexpress + sqlite3
這兩天空檔在弄個股票資訊蒐集的小工具當練功,想到要用sqlite來當資料庫,以SimpleDataSet來連接sqlite,但在開發階段Connection enable時老是會跳出"sqlite3.dll not found"的錯誤訊息,而且sqlite3.dll已放置在source code目錄下當然也放在win32/debug和win32/release目錄下,還是會出現一樣的錯誤,不過如果直接以執行檔的方式運行後再連接sqlite就可以,看樣子開發階段應該在某個地方也要放才對。
去問了大神找到這篇,原來這兩個地方也要擺,真的有效。
去問了大神找到這篇,原來這兩個地方也要擺,真的有效。
- 32bit 的sqlite3.dll 通常放在 C:\Windows\SysWOW64
- 64bit 的sqlite3.dll 就放在 C:\Windows\system32
2013-11-06
JSN ImageShow for JOOMLA - 增加 Image Max Size 項目
JSN ImageShow 是 Joomla 上功能強大的圖片或照片播放模組,支援component、module和content plugin三種模式,檔案來源除了本機的目錄外也支援如 Picasa 這類的網路相薄。
在為首頁製作網路相薄播放區塊 + 網路相薄就以 JSN ImageShow + Phoca Gallery + Picasa 的組合來當成解決方案,照片檔經過縮小最佳化後丟在 Picasa 裡,再分別以 JSN ImageShow 和 Phoca Gallery 到 Picasa 讀取同一份相薄即可。
每個模組的設計需求理念不同,像Phoca Gallery 在以幻燈片模式播放照片時是指定在 640 x 480 的解析度在播放,它會自行將照片縮成 640 x 480,而 JSN ImageShow 就不會,而是以預設的 max-width : 1024 為播放標準。問題來了,因為 JSN ImageShow 是放置在首頁上的一個小區塊,只有 326 x 244 的大小,造成無法完整的顯示照片,所以必須讓 JSN ImageShow 可以將照片縮成 max-width 只有 326 來播放。
環境:
在為首頁製作網路相薄播放區塊 + 網路相薄就以 JSN ImageShow + Phoca Gallery + Picasa 的組合來當成解決方案,照片檔經過縮小最佳化後丟在 Picasa 裡,再分別以 JSN ImageShow 和 Phoca Gallery 到 Picasa 讀取同一份相薄即可。
每個模組的設計需求理念不同,像Phoca Gallery 在以幻燈片模式播放照片時是指定在 640 x 480 的解析度在播放,它會自行將照片縮成 640 x 480,而 JSN ImageShow 就不會,而是以預設的 max-width : 1024 為播放標準。問題來了,因為 JSN ImageShow 是放置在首頁上的一個小區塊,只有 326 x 244 的大小,造成無法完整的顯示照片,所以必須讓 JSN ImageShow 可以將照片縮成 max-width 只有 326 來播放。
環境:
- Joomla-2.5.14
- JSN ImageShow Free - 4.6.0
2013-11-03
下載hichannel影片的方法其中之二
去年弄了一篇下載hichannel影片的方法其中之一,今年來弄篇之二,只是有點換湯不換葯啦,換個Browser而已。
環境:
環境:
- Windows 7
- Firefox-25.0
- Net Transport-2.9.3
- 當然是開啟 Firefox 並連到 http://hichannel.hinet.net/ 囉!

- 選定你"心儀"的影片

- 選定點選後也許會看到需安裝外掛的畫面,不過這是好事,這樣我們就不用像之一一樣,要先中斷播放。

- 重點工具來了,請啟用"開發者工具列"。

- 點選右下角那個位置就可以看到工作頁面。

- 啟用"使用滑鼠選取元素"功能,想點左下還是右上皆可。

- 接著點選叫你安裝外掛的提示畫面,如果步驟正確應該會有個白色虛線外框,點選時下面的工具列也會顯示對應的Source Code。

- 接下來的步驟就和之一大同小異了,把反白的URI以 Ctrl + C 複製下來,為什麼用 Ctrl + C,而不用"複製內部HTML"咧?因為這個功能在Firefox-24.0版是正常的,但是到25.0版就掛了,所以..還是用 Ctrl + C吧。

- 把找到的URI整理一下,最好是變成反白的那個樣子,最好把http也換成mms,經過測試mms 的protocol下載是正常的。也許其他下載工具可接受經過urlencode後的URL,那你不換應該也可以。

- 最後就把整理出來的URL,新增下載工作、貼上、確定,給點耐性,如果這些步驟做完沒經過太久,隔一下子應該就會開始有動作了。Net Transport 操作有問題可參閱之一。

- 如果連結失效的話,請再快速的重來一次吧。
P.S.最後還是老話一句,技術要討論教學相長才會進步但請合法使用。
Google App Engine for PHP
一個偶然的機緣下發現這個訊息,找個時間試了一下,透過 Google Developer's Guide 的說明是試出來了,但是還是發生大眼睛看不見小字的習慣,而且人總是健忘的還是記一下吧!
環境:
環境:
- Debian-7.2
- PHP-5.4.4
- Python-2.7.3
- Google App Engine PHP SDK 1.8.3
重點:
- 安裝照著 Developer's Guide 即可
- 記得 php-cli 和 php-cgi 是不一樣的東西,確定有裝 php-cgi ,不然應該會看到這行錯誤
"assert 'Content-Type' in message, 'invalid CGI response: %r' % stdout" - dev_appserver.py 預設是以 localhost 為Server IP,若測試環境Server/Client 是分開的,可以 --host 指定Server IP,如下:
$> google_appengine/dev_appserver.py --host 192.168.13.128 --php_executable_path=/usr/bin/php-cgi helloworld/
標籤:
GAE,
Google App Engine,
Linux,
PHP
2013-10-30
HighPoint RocketRAID 2310 RAID Management/ Inband Service for FreeBSD
年初代管一部ASUS 1U機架式伺服器,原先的管理者不知為何原因沒起動Raid,後來決定將系統重灌成Linux or FreeBSD,Linux中慣用的Debian內建沒RocketRAID-2310的driver,因為懶得再另外弄driver就決定裝FreeBSD。
FreeBSD內建有RocketRAID-2310的drvier,但是沒管理工具可監看raid的即時狀態,RR2310的Bios介面也粉陽春,一樣看不到現在raid的狀態,以至於更換H.D後是否有進行rebuild也不得而知,這部Server更囧了,連H.D讀取燈也沒看到在亮,當然也看不到H.D的故障燈號,還好H.D故障時會叫給你聽就是了。
後來在 HighPoint 官網找到支援FreeBSD的管理工具,安裝後運行正常。
環境:
FreeBSD內建有RocketRAID-2310的drvier,但是沒管理工具可監看raid的即時狀態,RR2310的Bios介面也粉陽春,一樣看不到現在raid的狀態,以至於更換H.D後是否有進行rebuild也不得而知,這部Server更囧了,連H.D讀取燈也沒看到在亮,當然也看不到H.D的故障燈號,還好H.D故障時會叫給你聽就是了。
後來在 HighPoint 官網找到支援FreeBSD的管理工具,安裝後運行正常。
環境:
- FreeBSD-8.3-p12
- HighPoint RocketRAID 2310
- CLI-FreeBSD-3.5-1-100707.tgz
- 到官網下載FreeBSD版本的CLI管理工具程式,下載時版本為v3.5-1,下載後解開可看到4支檔案,安裝可參考README.txt,HPT_CLI_Guide.pdf 為使用說明,其他為安裝檔。

- 安裝完成後啟動服務 /usr/local/etc/rc.d/hptdaemon.sh start,若正常可看到服務起動。

- 服務正常啟動後,執行 hptraidconf ,過程中會要輸入帳號密碼,請參閱HPT_CLI_Guide.pdf。

- 輸入query arrays,顯示目前已建立的raid,可以看到現行各raid的狀態,下圖可看到正在rebuild。

- 輸入query devices,顯示各H.D的狀態。

- rebuild完成,Status會由REBUILDING變成NORMAL。

- 它也有輸出log檔儲存使用及系統記錄,路徑及檔名為 /vat/log/hpt.log。

- 其他指令可在hptraidconf CLI畫面裡 key "help"即可。
2013-10-01
幫DBNavigator功能按鈕新增文字說明
Delphi裡的DBNavigator在資料庫程式中是常用的物件,但是預設只有圖示而沒有文字說明,雖然可以使用Hint,但使用上還有覺得少了些什麼,在網路上找了些資料並試作並把部份重點節錄下來。
環境:Win7 + Delphi XE4 試用版
uses
Vcl.Buttons;
type
TMyNavigator = class(TDBNavigator);
procedure TForm1.FormCreate(Sender: TObject);
const
Captions: array[TNavigateBtn] of string = ('第一筆', '上一筆', '下一筆',
'最後一筆', '插入', '刪除', '編輯', '儲存', '取消', '刷新', '確認更新', '取消更新');
var
btn: TNavigateBtn;
begin
for btn := low(TNavigateBtn) to high(TNavigateBtn) do
with TMyNavigator(DBNavigator1).Buttons[btn] do
begin
Layout:=blGlyphTop;
Caption:=Captions[btn];
end;
end;
成果:
環境:Win7 + Delphi XE4 試用版
uses
Vcl.Buttons;
type
TMyNavigator = class(TDBNavigator);
procedure TForm1.FormCreate(Sender: TObject);
const
Captions: array[TNavigateBtn] of string = ('第一筆', '上一筆', '下一筆',
'最後一筆', '插入', '刪除', '編輯', '儲存', '取消', '刷新', '確認更新', '取消更新');
var
btn: TNavigateBtn;
begin
for btn := low(TNavigateBtn) to high(TNavigateBtn) do
with TMyNavigator(DBNavigator1).Buttons[btn] do
begin
Layout:=blGlyphTop;
Caption:=Captions[btn];
end;
end;
成果:
2013-08-17
hichannel radio 改版中?
[2015/06/08] EzNetRadioU4.40F
前兩天把EzNetRadio開起來想聽聽古典樂,因為午休時想說聽個古典樂助眠是個不錯的選擇,東點西點才發現有些站台失效連不上有些卻正常,卡好更睡不著...
利用放假天測了一下,才發現hichannel的廣播正悄悄在改版中。之前使用Microsoft的技術,使得chrome和firefox的使用者可能無法正常收聽,改版後的chrome和firefox皆可正常收聽。
前兩天把EzNetRadio開起來想聽聽古典樂,因為午休時想說聽個古典樂助眠是個不錯的選擇,東點西點才發現有些站台失效連不上有些卻正常,卡好更睡不著...
利用放假天測了一下,才發現hichannel的廣播正悄悄在改版中。之前使用Microsoft的技術,使得chrome和firefox的使用者可能無法正常收聽,改版後的chrome和firefox皆可正常收聽。
既然EzNetRadio部份的站台無法正常收聽就代表它又得改版了,查了下hichannel的新方法,應該是使用 flowplayer.org 的解決方案。
flowplayer.org 主要是應用在web上的解決方案,EzNetRadio是個AP,要再想想怎麼兜...
標籤:
嗑牙鹹橄欖,
flowplayer,
hichannel
2013-04-26
Joomla 後台管理選單及文章分類排序不動?
Joomla的選單及文章分類可以依管理人員需求進行排序。最近在構思一個新站台,花了1天的時間以舊站的結構弄了個sample site,在結構確定後再來調整,但在後續調整時,發現某個文章分類無法上調的問題。試了半天後把垃圾筒內的文章分類清掉,這個狀況就解除啦!!
2013-04-17
Joomla 2.5.x 文章相關細部欄位
Joomla的文章列表方式主要分成清單和Blog兩種,清單列表只能顯示標題、發佈日期、作者和點擊數等四個欄位,想以標準的Joomla實現"分類"的最新消息,也就是顯示最新消息的子分類,是無法實現的。
後來以[Multicategories]解決分類的問題後,一直沒搞定清單顯示分類的問題,問題是沒找到"分類"的變數到底是category?categories????後來在不經意的狀況下看到了下圖,原來是"category_title",剩的就只是修正程式碼了。
這裡面應該包括了一篇文章所有相關的欄位了吧?我想。
檔案位置:/components/com_content/models/category.php
增加清單列表欄位,檔案位置:/components/com_content/views/category/tmpl/vim default_articles.php
後來以[Multicategories]解決分類的問題後,一直沒搞定清單顯示分類的問題,問題是沒找到"分類"的變數到底是category?categories????後來在不經意的狀況下看到了下圖,原來是"category_title",剩的就只是修正程式碼了。
這裡面應該包括了一篇文章所有相關的欄位了吧?我想。
檔案位置:/components/com_content/models/category.php
增加清單列表欄位,檔案位置:/components/com_content/views/category/tmpl/vim default_articles.php
2013-04-09
Re-Join Physical Disk to VDisk RAID
公司有部 HP2000 G3 iSCSI Storage,上星期其中一顆HD掛點,報修拿到新HD後當然直接插回原來的slot,但是狀況跟一般的Raid不太相同,一般的Raid卡通常會直接進入Rebuild的程序,但是HP2000在測完HD後,HD並沒有一如預期的直接Rebuild,而新HD的狀態只顯示"AVAIL"。
後來在 HP Support Forums 找到下面的程序。
這個程序完成後狀態就變成這樣啦,就等吧!!
後來在 HP Support Forums 找到下面的程序。
這個程序完成後狀態就變成這樣啦,就等吧!!
2013-02-24
以Aptana整備Joomla開發環境
最近發現了個Web程式開發的好工具Aptana,聽說是從Eclipse發展出來的。斷斷續續的使用Joomla這個CMS,雖然Joomla有一狗票extension,但是還是有自己試試看的想法。
Aptana上已整合了Wordpress、Drual的bundle,不過還不支援Joomla,不過網路上已有相關說明囉!
http://www.youtube.com/watch?v=k6bl--auCsY
http://www.youtube.com/watch?v=4HCqomfey34
Aptana上已整合了Wordpress、Drual的bundle,不過還不支援Joomla,不過網路上已有相關說明囉!
http://www.youtube.com/watch?v=k6bl--auCsY
http://www.youtube.com/watch?v=4HCqomfey34
2013-02-11
訂閱:
文章 (Atom)










