Pages

2012-12-24

階層式項目(Hierarchy)網頁設計Pattern

網站後台管理UI設計裏,通常Table項目維護都使用「Grid」列表方式作列表維護,遇到階層式或Master-Details的顯示,傳統的子層跳頁或內嵌顯示方式,都會讓整個UI介面顯得不夠清爽。

對User而言,要表現出資料的階層式關係即可,介面上儘量力求簡單。對Programmer而言,頁面程式要好複製,利用DB Hierarchy架構可以共用相同的Table,而下方的UI設計Pattern可以求得平衡。
Hierarchy UI

例如要開發Master-Details架構,只要複製ASPX頁面,設定好頁面的隱藏Key值, 設計好右側頁面的UI控件呈現,基本的CRUD架構就形成。
Hidden Keys

左側樹狀選單使用AJAX方式,動態取子層的項目列表,而且可以透過滑鼠左鍵拖曳讓Item在階層裏移動、改變顯示順序。遇到複雜的項目維護,拉到磞出的Window視窗再作操作。

此Pattern因採用樹狀選單UI來表達階層式視覺分類(若子項多的話,宜用Grid+條件搜尋來操作),比起傳統的一層List顯示方式或Master-Details Grid,會更清楚,且支援更複雜的表單內容設計。
Hier List

考量開發成本及Reuse效益,我習慣在ASPX頁面作很多隱藏參數設定,程式員只要調整其值,即可符合多數的資料維護管理需求。至於DB設計,所有網站只需要一個Table即可,即使為了資料維護便利拆分成不同Table,其實Schema架構都差不多。

至於是否要使用程式產生器(Code Generator)產生這些程式碼,其實DB及UI都一致,使用人工方式複製、修改+客製化校正,跟產生器設定時間上都差不多。除非有大量重複性客源開發需求,否則也不太需要。

總言之,UI的呈現還是要看客戶需求而定,這個Pattern只是少量分類項目Table維護的一種UI呈現而己,特別適合「分類項目」的資料維護。對沒耐心的程序員來說,這種小Table的CRUD程式很簡單,但卻是一再重複的Dirty Work,特別會扼殺編程樂趣。對客戶來說,傳統的Grid列表較無法簡單呈現資料分類設計,更無法視覺上讓項目在分類間裏移動,而這UI Pattern正因此而生。

2012-12-19

Hinet空間下載器:Xuite Downloader

在台灣資源下載最快的主機空間,當然就屬中華電信Hinet (每秒1MB/s以上),只要有申辦其電信網路,就能在其Xuite網站帳號得到額外的配給空間(端視你的網路方案),裏頭可以設定目錄/檔案的分享。目前此空間也整合至「Hami+個人雲」空間,因此也能使用其同步Client工具把資料上傳至網站「同步資料櫃」,再移至「非同步資料櫃」,以利能長久分享。
Sync Upload
Xuite網站要下載分享的資源,必須點擊一個廣告及輸入驗證圖片(動作簡單大方,不像一些不肖的免費空間),不過多檔時就有些麻煩且無法批次自動化,因此我們得善用專屬下載工具「Xuite Downloader」。
Download

Xuite Downloader的官網請請下載「需安裝 NET4.0」的版本(我是使用B版,不知差異,但直覺既是B版必有特別之處),它能幫你自動點廣告及填入驗證數字,挺方便的。也許Xuite官方日後會改變下載邏輯,但這軟體也會隨之更新版本。這軟體亦能把你的分享網址作加密再分享給別人,有點類似SMG工具的網址加密。
Xuite Downloader

大檔資源透過網頁上傳通常會逾時,透過Hami個人雲同步工具就有大優勢,不過檔案的分享網址還是得一個一個複製,這是目前唯一免不了的Dirty Work。

2012-12-02

Properties.Settings讀值的效能低落

當應用程式想要讀取設計值,使用App.config內的設定值物件是最為簡便(string zip5 = Settings.Default.XmlZip5):
App.config 

當你要讀config裏的值時,強型別(Strong-Typed)的語法很簡單,但它背後卻藏著一個效能低調的陷阱。我們會直覺以為是個字串,實際上它不僅每次都得從所有Object Collection集合取值,而且所做的事比想像中沉重!(追查至.NET Framework官方源碼)
GetPropertyValue

它造成的影響為:若該設定值只讀一次效率損耗不大,但你若把它放在大迴圈裏去讀取,程式效能就慢如牛了,所以得事先把它讀取至一個新字串變數(字串是複製)。

我剛開始學習物件程式設計時,就隱然覺得Public Property(屬性)是把兩面刃,它雖能保護私有變數不被修改(很多書只提這優點),但很多人把Property GET作了太多背後工作,使用Class的人卻誤以為它只是一個簡單讀值而己。所以我有養成一個習慣,就是複雜計算的取值,一定是用Method()去讀取,而不用Property屬性來取得,就是避免讓人誤解繼而埋下效能地雷。

2012-11-29

Resizable移動控制項

在WinForm程式裏,有些UI的呈現是與視窗位置有極大相關性,例如像Diagram圖及電子地圖、流程功能圖等應用,可以利用像Visual Stdio.NET的IDE編輯功能,利用滑鼠能拖曳方塊位置,並調整Size。我們只需要將的相對位置(長、寬、前後景)儲存,下次開啟讀取設定檔即可。

這種沒什麼現成商業控件可用,它的基本原理就是利用GDI+技術畫四周虛線及動態產生四周8個小白色方塊,利用控制項MouseMove()事件來即時調整Size及位置而己,其計算方式有些Dirty Work,建議網上搜尋參考別人的基礎再酌些調整即可。

Resizable Control

ResizeControlPicker helper = new ResizeControlPicker();
helper.Add(panel1);
helper.Add(textBox1);

你可下載Demo程式試試效果。
Download from Dropbox (.NET 4.0 Portable, 63.14KB, 2012/11/29 Updtaed)

2012-10-29

透過RJ-11埠開啟電子錢箱

POS主機通常會有一個RJ-11埠連接電子錢箱(DC 12V),要以GPIO讀寫來控制它,就得知道它的GPIO暫存器位址。通常主機廠商能提供規格文件,例如以下的畫面(這算是寫得很人性的文件,有些寫得十分不直覺):
CashDrawer Register Spec 
上圖是說只要寫IO位址0A22h,將該Byte的Bit4設為1即可開錢箱。我們可以透過RW工具開啟IO Space位址圖,並寫值測試是否可開?你可以使用LPT1的位址區段(0378h)作此工具實驗,這些區段通常允許你寫入值。
LPT1 IO Range

RJ-11埠固定連著錢箱,所以你不用特別讀出原值作OR Bit4運算,直接測一下ON,OFF值即可。各式電子錢箱開啟位址及流程不一致,有些下「關->開」指令即可,有些得「關->開->關」才能把錢箱推回去。因應各種錢箱,我寫了一個C#類別來處理它,讀入不等長的Hex指令字串依實機狀況來設定,雖短短幾行,裏頭卻包含著一些與硬體打交道的程式兼容寫作經驗。
Sample Code

2012-10-26

電子錢箱(CashDrawer)的選購策略

POS電子錢箱市場上各家廠牌一大堆,身為消費者(或系統整合商)該選擇怎麼的規格最適合呢?
Cash Drawer
外觀尺寸
以尺寸區分,電子錢箱通常寬度分為35,40,45公分,重量則約7,9, 11公斤左右。35公分寬的錢箱,通常是比較便宜的,但個人覺得小錢箱內的空間也小,拿錢都會卡卡的,不是很方便,建議還是40公分以上比較適當~當然那種最大的是更好,就像開RV休旅車,只要車庫放得下,誰不想要大車呢?但大車價格貴,還是買中間款的比較合適,何況店面收銀台空間通常不大的。

開箱考量
錢箱開啟時會震動,所以太輕的錢箱會讓上面的POS主機產生晃動,硬碟震久了易壞。有些錢箱開啟時會噹一聲,安靜時會覺得它很吵,但營業時其實還好,而且也能提醒店家錢箱被開了!不過這種噹聲通常不能以軟體指令取消,購買前也得考慮一下。

開箱介面
錢箱不需要電源,常見是透過RJ-11(6針4線)、RJ-12(6針6線)、RS-232介面開啟。RJ-11款比較常見,也比較便宜,不過一般PC並沒有RJ-11埠,而且得透過Driver讀寫控制其IO位址,然而一般錢箱並沒有經過微軟官方驗證的專屬Driver,而且硬體上連接的IO位址也不盡相同。因此獨立性上,RS-232介面(帶電)會比較通用。

開箱電壓
錢箱可以連接在出單機/發票機(24V),也可以連接至POS主機(12V),電壓彼此不相容,雖然也有12->24V變壓器可調整,但這又是另一個成本了。考慮到多用性,而且一般PC主機上沒有RJ-11介面(通常只有專屬pos機硬體才有),所以若有發票機或出單機,會建議買24V的錢箱機種。

結論
若無特殊狀況且已有出單機情況下,建議買24V,40公分寬以上的POS錢箱最適宜! 若是有專屬的POS主機,講求電源獨立性可以買12V的錢箱即可。

2012-10-18

SQLExpress的Login Failure

SQLExpress雖然是免費DB,但存在一些限制,其中最討厭就是同時執行程式存取及SQL Management Studio (SMS),一方打開了,另一方就喊程序被使用無法開啟,常常得重新啟動SQLExpress服務及解除MDF檔的Lock才行(Unlocker工具)。既然免費,這點極不方便的麻煩就忍了,我後來自己寫了一套SQL執行管理工具取代了SMS以應急。

若使用SQLExpress當作是Website的資料庫,極可能你會遇到「Login Failure for “NT Authority\System”」的錯誤,網上文章會教你要SMS的Login裏要新增這帳號,但明明它就已存在呀! 其實要通過DB權限登入檢查,有下次2個地方要注意:

1. DB Security:
下圖是SMS安全/登入裏的角色,預設「NT Authority\System」帳戶就會存在,但每個DB裏也有Login的帳戶,當你複製過來時即使有同名的帳號,其實該Login User已中斷了權限,必須刪除再重建才行。
DB Security
2. File Security:
畢竟SQLExpress會讀寫MDF檔,所以該帳號也要有對FileSystem的讀寫權限,不過通常「 System」帳號都有讀寫權了。
File Security

通常以上兩種試了此錯誤還是會存在,才會有此文章的產生。通常SQLExpress的連線字串是使用:
AttachDbFilename=|DataDirectory|\xxx.mdf;User Instance=True

由於IIS執行網頁已咬住該MDF檔,所以你在SMS無法attach打開它,往往會誤以為新增SQL服務Login就好,它就會連動至所有的SQLExpress DB,這是錯誤的觀念,因為它的「Login連動效果」只侷限SMS內有Attached上的所有DB而己。

所以請用Unlocker工具把MDF檔解除鎖定,再用SMS將它Attach上,並在其DB Login內確認具備該System帳號 (複製而來的通常不存在),再Detach卸載該DB(因為無法同時使用)並執行即可。

2012-08-29

解決JDownloader的中文亂碼

以前從免費空間下載檔案總是習慣用JDownloader,雖然它是用Java寫的(個人偏見),但只要能穩定下載並自動解壓縮,我也是會愛用的。後來有白馬下載器(MiPony)用.NET寫的,但我覺得它的介面設計不是很優雅,總是仍以JDownloader為主力。

一直以來,軟體我都習慣使用英文介面,但發現在默認模式下,JDownloader的下載Link檔名會呈現中文亂碼,也將就地用著,後來我連OS介面也換成英文版,解決中文亂碼問題變得刻不容緩。

原來要在「Settings/User Interface/Look/Style」,把默認的「Substance Office Silver 2007」值,換成「Windows Style」就好,雖然介面比默認的「傳統」些,但功能還是最重要的。
JDownloader Style 

終於,下載的資源檔名,是正常的中文編碼了。
Resource Correct Encoding

2012-07-28

資料Grid分頁的數據效能考量

在Web後台管理,我們習慣使用Grid控件(DataGrid, GridView)來呈現Table的資料,資料一多當然會使用UI分頁:
Grid Paging

實際上UI切換頁次時,背後程序仍是向數據庫下達完整數量的Select指令,只是UI上呈現一頁而己。假設該Table有上百萬筆資料,在無法使用Where過濾條件下,取回的效能會很差。

ASP.NET為此提供了ObjectDataSource控件,它有StartRowIndex、MaximumRows與Sort欄位等參數名稱,可以只向數據庫取回該頁資料就好,然而每個Table性質不一樣,查詢條件又不同,實作該強型別(Strong Typed)類別實在是不好維護。尤其使用SQL Server時,它仍不支援LIMIT index, count等分頁語法,得寫成下面冗長的分頁Select語法:SQL Paging

這種複雜的分頁SQL語法,且不論SQL Server效能如何,程序員要維護這樣語法就很痛苦。因此有些程序員乾脆不實作真正背後數據分頁,而是在查詢介面硬加上「最大筆數」限制,至少就避免了載入大量資料的問題。
Search TopRow

在後台管理介面裏,這算可接受的中間作法,不過在前端顯示頁面裏,「最大筆數」最終限制了資料呈現,怎麼辦呢?最終我基於方便維護程式的原則下,將所有ObjectDataSource控件統一指向一個強型別空殼物件,將其中最重要的Select(), SelectCount()函式透過Delegate指到執行頁面的程式碼裏,就省去了帶入SQL Parameters及得實作該Class的麻煩。

至於T-SQL的分頁複雜語法,發現它的ROW_NUMBER()還得帶入一個Sort欄位指定,真是既難用又雪上加霜。為了日後相容別的資料庫(MySQL, SQLite),仍使用LIMIT 10,10的語法,再用個轉換函式將它自動轉成T-SQL的分頁複雜查詢語法,如此可以達到程式碼易維護目的。
Source Code
 
結論,編程世界裏處處充滿阻礙與困難,Hold住堅持下來不亂寫,工作才會有成就及樂趣。

2012-07-20

多個JavaScript Arguments參數傳遞

進入Mobile WebForm開發的時代,JavaScript的應用絕對少不了,它不僅負責前端UI的控制工作,往往也是用來接收AJAX或XmlHttp等伺服器端回應的Response讀取。

通常這樣的JavaScript Callback Function會設計成下面這樣的寫法:
function OnReponseReceived(sender, args) {
var a = args;
alert(a);
}
這個args參數是由遠端服務回傳的值,為了支援多個參數,通常會使用陣列Array變數:
function OnReponseReturn() {
var args = new Array();
args[0] = "a1"; // 免宣告陣列數量,依序新增即可
args[1] = "a2";
reponse(args);
}
但新式的JavaScript有支援Object變數,它可簡易地新增多屬性值,讓參數的傳遞更加直覺易懂。
function OnReponseReturn() {
var args = new Object();
args.Name = "a1";
args.Value = "a2"; // Property屬性可以自由新增
reponse(args);
}
結論,不要再停留在傳統的JavaScript的陣列參數傳遞語法了!!

2012-05-05

PayPal如何改登入密碼?

PayPal的介面設計很簡潔原是好事,不過要找到改密碼的地方,第一次可能不易找到。我在管理介面上遍尋不找,Google+百度搜尋,官方說明也不是說很清楚,原來要點選它的「選單Menu」分類文字呀!
PalPay Change Password

我在設計網頁時,也愈來愈朝向介面簡單的方向前進,但有特殊的設計,會儘量用ToolTip這種連結提示文字來表達。畢竟讓用戶得透過尋找答案才能學習起來,就踰越了原本簡單易操作的本意。

2012-04-11

使用Hotmail Connector的風險疑慮

使用Outlook Hotmail Connector可以大為簡化郵件收發設定,但它衍生幾個風險問題:

  1. 信件匣完全放在Hotmail主機上,只要超過30天沒有登入存取,主機端的信件匣就會被標記「Deleted」狀態。
  2. Local應該有個資料夾是對應到Hotmail信件匣(MAPI),但這Local信匣的資料並無法像傳統*.pst般能輕易複製與備份。
  3. 若有安裝第三方POP3 Monitor等檢查信件小軟體,執行其POP3的刪除郵件指令,可能會把整個線上Hotmail信匣刪除了。Local信匣內的資料也會在Outlook啟動時同步都被刪除,連拯救的機會都沒有。

所以比較安全的作法,就是仍使用傳統的POP3/SMTP來收取Hotmail信件
Hotmail POP & SMTP
Outlook Settings

在Outlook中設定裏,你可能遇到無法收發測試正常的狀況,這時你得先刪除Outlook Hotmail Connector的設定,避免讓伺服器誤判。而且也可能會遇到15分鐘登入限制的錯誤(Exceeded the login limit for a 15 minute period,微軟官方沒有文件解釋此Error),試著把收信間隔調久一點。
Login Limit

2012-04-07

地瓜Yam保存與處理技巧

地瓜內皮上有強大澱粉,容易在削皮時產生黑色氧化,讓手黏黑不易清洗等情形,都是處理地瓜時會遇到的狀況。地瓜放久容易發芽或乾竭,如何長久保存也是令人頭痛的問題。查了些網上資料加上自己的處理經驗,分享一下。

地瓜處理技巧

  1. 選購時挑個頭大、形體飽滿的橢圓型最優,表面無凹凸不平或小黑洞者為佳。
  2. 帶泥地瓜先泡水一下,不僅去泥方便,也有助削皮時不易變黑(烹煮去皮前才煮,避免發芽)。
  3. 戴上橡皮手套。(哈,這是重點~ 手沾黑後很難洗,酸性洗液或醋水比較有效)
  4. 地瓜表面通常不平,削皮時可以深層一點削,再用刀尖去除黑點處。
  5. 削皮過程裏若發現瓜肉變黑,要立即沖水,削完後的地瓜也要泡在水中,洗去澱粉液。
  6. 切丁塊放入保鮮袋,放入冷凍室。(冷藏後的地瓜,在烹食時熟透的速度是一般的5倍)

Yam Bean

如此切丁放入冷凍庫既能長久保存,要煮用時(如地瓜飯)時取用,多方便呀!

2012-04-02

IIS6無法啟動,誰佔走了80 Port?

通常重要Server伺服器我不會隨時作Windows Update,因為怕有衝突風險。總是等待一陣子發現沒啥大災難傳出,才一次更新到足。某天我作了這樣「一次到位」的更新,重開機後發現Windows 2003裏的IIS 6.0服務無法啟動,原因是80埠被佔走了!!
WWW Start Failed

首先嘗試「telnet localhost 80」確認有個Unknown TCP Listener在運作,接著我使用「netstat -abn」指令及「TCP View」工具查詢目前網路Port號所綁定的PID,但這Listener完全隱身找不到。接著開始展開耗時痛苦的Google爬文工程,舉凡會佔80埠的程式(如Skype, TeamViewer, Reporting Service, Apache…」都翻了一遍,仍無所獲。

這完全是很奇怪的現象,到底是啥佔住了80埠?我一開始也有看到這篇「Event 1363 iis www service not starting」的討論串,它指出微軟更新「KB980436」有問題,不過它的發行日期是2010/08/09,比該主機年紀還老,而且隔那麼久若有此衝突,微軟豈有不更新道理?直到我看到這篇文章「IIS無法啟動——鬱悶的KB939373補丁」,文末它提到「理論上這個補丁不是給大家帶來麻煩的,可是問題卻在很多機器上出現」,我開始覺得也許真是遇到此問題了!

無計可施下,只好開始執行這種屬於「自殘行為」移除更新的作法。文中的Update編號在系統裏找不到,猜是Win2003 R2版本更新關係,不過同理類推,就拿編號KB980436開刀吧! 移除後重新開機,問題解決!!

結局一句很短,但耗盡了一天及壓力跟這種怪現象纏鬥。問題暫時解決了,也歸納出一個教訓結論,即Win2003畢竟屬於老舊系統了,打補丁的更新方式終會造成怪問題產生,以後還是直接安裝Windows 2008比較好。

2012-03-30

使用Python產生密碼+更新日期字串

現代人穿梭於Internet網站之間,會員帳號/密碼管理成為一個重要課題。很推薦一套免安裝的密碼管理軟體「KeePass Password Safe」,它也有Android手機版本,能共用加密資料庫。某些網站基於安全理由會強制用戶得定期更新密碼,雖然KeePass都有提供密碼產生工具,但人就是懶惰,連開啟密碼產生器都嫌麻煩,最好是按個Hot Key就產生制式密碼串最好。

我個人比較不重要的密碼串,偏好喜歡用「2位英文+8位數字」共10位長的隨機字元,再儲存於KeePass項目備註裏。例如產生以下的字串:

PWD: ec26636617(2012/03/26 02:47:46 updated)
為了使用方便,我在Notepad++裏呼叫Python Script,即可輕易得到這樣的字串產出:
from random import *
import string
import time

#------------------------------------------------------------
# 可使用的字元來源
# string.ascii_letters, string.digits
# string.ascii_uppercase, string.ascii_lowercase
#------------------------------------------------------------
def Rand_Abc2Num8():
abc = ''.join(choice(string.ascii_lowercase) for x in range(2)) # 隨機抽出2個
num = ''.join(choice(string.digits) for x in range(8)) # 隨機抽出8個
dat = time.strftime('%Y/%m/%d %H:%M:%S') # 現在日期
return abc + '' + num + '(' + dat + ' updated)' # 組合字串

editor.replaceSel(Rand_Abc2Num8())
產出字串裏,密碼與日期中間不用空白隔開,是因為方便滑鼠點兩下選取密碼字串。 Python網上範例碼真的蠻多的,結合在Notepad++中呼叫執行,可以產出很多種自訂字串,極為方便。

我並沒有深入研究Python(也不必要),只要把我的需求Keyword作Google搜尋,把簡單可理解的Script範例拿來改,遇到不懂的再查書即可。以下超推薦這本Python入門書,用詞精簡又文風生趣,也兼顧到Python v2.6與v3.1跳版的相容性。


Beginning Python Using Python 2.6 and Python 3.1
Python EBook

2012-03-27

密封式玻璃水瓶Bottle

因為要減重晚上不吃,備有睡前牛奶來止住飢餓,但一直沒有賞心悅目又能去味清洗的玻璃容器。研究了市場上的的玻璃容器產品,規格上大致以日製「HARIO RPL-1400 玻璃冷水壺1400CC」$260 TWD勝出。可惜它的瓶口沒有密封設計,對於有味道的汁液盛裝,並不妥當。

玻璃容器選購策略如下
1. 能放入一般冰箱側門空間(約10-12cm),因為舊式冰箱有設計直立式空槽並不多。
2. 寬瓶口設計,方便刷子清洗,瓶身不要太曲線洗不到的地方。
3. 透明瓶身,如此才能賞心悅目。
4. 瓶身不要過重,容量在1000cc以上。

某一天突然想到,用來放梅酒的台製玻璃圓直瓶,不是很適合嗎?雖然容量才600ml,但售價只要$50 TWD。雖然它重一些質感弱些,但還沒找到理想玻璃容器前,將就一下也是行的。冰鎮後效果不錯,牛奶喝起來覺得特別香甜。

Circular Bottle

2012-03-24

Casio平價慢跑錶

平時有在慢跑健身,很容易忘了圈數,一直以來我靠著換跑道或手上鑰匙換手的方式來輔助記憶,上週朋友提議一起合購慢跑電子錶,徹底解決圈數記憶問題。由於小六有了金屬錶後,就沒再戴過電子錶,加上我的手腕比較細,因此購買策略上就是選擇平價的慢跑專用錶,經過Survey之後,選擇「Casio SDB-100-1A」慢跑錶。
Casio SDB-100-1A 

它雖是女款設計,但黑色款外觀中性,也適合手腕細的男生,更加有輕巧(28g)的優勢。露拍價是$890元,碼錶及圈數的按鈕都在錶面,比一般側面的好按許多(只需單指)。或許這款錶鎖定在女性消費者,因此在操作設計上都很簡單直覺,學習一下就可上手。

錶的實際規格與Size不在這邊贅述。它主要提供每一圈的Period時間及計數,可以記憶61圈,若輸入步距資訊,最後能得到總距離、時間及每一圈的資訊。現在運動健身很怕過量而引起傷害,所以除了數圈外,我也會設定一定時間鬧鐘提示,時間到立刻走人不留戀。尤其在游泳池,皮膚泡水太久真的不是很好,有了這電子錶,一切都理智多了。

2012-03-22

露天PayLink代付的幾項爭議

PayLink是露天推出的第三方支付服務,賣家提供PayLink服務之後,買家便可以透過PayLink付款,款項將會由PayLink替買賣雙方暫時保管10天,10天之後款項會自動撥款給賣家。透過暫時保管的方式,可以提供買家購物保障,也有助於賣家提升服務品質。

Ruten PayLink

我蠻肯定這樣的代付安全機制,因此類似這樣機制的「Yahoo輕鬆付」出來時,我也申辦了。但因為要對賣家收手續費及有匯款劫標的問題,因此賣家很少使用它,讓身為買家的我沒處用,只好把儲值內的錢贖回。露天這次推出PayLink代付機制,雖然有買家不必事先儲值,賣家不收手續費的優點,但仍有以下的爭議:

對買家而言:
1. 代管的錢發生商品不符爭議,賣家也同意退款了,但那筆錢無法有個方便的機制匯回賣家帳戶! 在大陸支付寶,賣家同意退款,買家在幾分鐘就可回收這筆錢。PayLink酌收匯款款費還合理,畢竟買家評估決策失誤,付點學費是OK的。

2. 買家沒有自己專屬的PayLink帳號及儲值來處理平時支付的動作,對於經常使用此支付的買家,會產生多筆的ATM轉帳費。我覺得最好能有個專屬買家帳戶,常常網購的買家就能方便地儲值及得到匯回款,增加處理時效性。

對賣家而言:
1. PayLink要能提領保管金,賣家須通過書面身份認證(身份證/銀行存摺/滿20歲),但露天預設直接啟用PayLink,讓不知情的買家把錢匯入了賣家PayLink帳戶,使得一些未成年的賣家無法請領該款項,這筆錢就這樣卡住了。客訴時露天卻要賣家直接找PayLink處理,自己卻好像完全沒責任似的,但這問題卻是露天未經賣家同意所造成的困擾啊~

2. 若入帳的帳戶非台新銀行,須付10元轉帳手續費,這是一個多出來的成本,但還能接受。另外,成功入帳後要4個工作天才可提領,且每日限額3萬,曠時太久且金額限額太低了,這實在是大問題。

3. 出貨寄件(2天) + 進帳保管時間(10天) + 提領申請 (4天),賣家共要16天才能領到錢!為了得到良好的履約保障,前2項委曲賣家是OK, 不過最後一項宜加速些。

以上是個人對PayLink推出所看到的爭議點,或許這代付機制會持續改進,本文章保留隨時日後修正的權利。這也希它能活比較久一些,雖然很多代付機制跟大陸「支付寶」比起來是嚴重不足的,但許多問題是因為卡在台灣金管會條例的限制。台灣那麼小網上代收付機制卻無靈活能力,說穿了是假金融安全名義,以獨厚傳統銀行而己,政府真該與時俱進,有所作為才是。

2012-03-18

樂扣Lock&Lock玻璃保鮮盒

不知何時開始,我很愛用保鮮盒,由便宜的雜牌塑膠收納盒,到選擇蓋子專利的樂扣牌(Lock&Lock)。後來出了「玻璃」保鮮盒,它的價格比塑膠貴上2倍,但優點是能放電鍋、微波爐,更重要是盒子好洗,也不會殘留味道(最重要)。某年心一狠就買了Cosco「GlassLock」玻璃保鮮盒18件組,從此就愛上玻璃盒(雖然它挺重的)。

樂扣牌的玻璃保鮮盒比較晚出現,而且一出來價格嚇死人,是GlassLock牌的2-3倍,雖然它的材質還能進烤箱,但價不親民只能高處不勝寒。眼看玻璃盒市佔率被GlassLock搶光,樂扣牌最近在大賣場以6折價作促銷,身為玻璃盒愛用者的我,當然得買來體驗一番,品味兩者差別在何處。

Lock&Lock 950ml

賣場裏全部以6折價促銷,各種形狀及Size定價不同,我身為重度使用者,很清楚小盒並不實用。況且整體玻璃盒賣價也只是「相對便宜」,尋出求CP值高的,就是以上圖這950ml圓形玻璃盒賣$179最合算,它的原價可是299元呢! (Crazy~)

雖然方型比較好攜帶,其實圓形使用上也不錯,買回家(我偏好同Size成對買)立刻使用,且不說樂扣牌的玻璃材質更勝一籌,摸起來的觸感及盒面開闊度,加上它的專利蓋子配合,硬是比GlassLock高上一級,優劣立判。以目前6折促銷價及該Size來比較,並不會比Cosco GlassLock的18件組(蓋子也算一件)貴。

其他牌子的玻璃盒,玻璃材質通常符合商品宣稱的(畢竟都要高溫實驗過),但蓋子不是顏色、質感太差,就是不好開蓋,得硬扭猛扯的。這道理跟買傘一樣,傘好不好用,在開傘的剎那,你就知道品質了!

2012-03-16

Notepad++插入日期文字

說也好笑,連Windows內建的陽春Notepad筆記本編輯器,都有內建F5插入日期文字,身為有UltraEdit替代品的Notepad++文書編輯器(以下簡稱NPP)竟沒有!! 搜尋了一下,發現使Notepad++用的外掛「Python Script」方式加上Hot Key捷徑,還能做到日期字串的客製化。而且Python還能做到很多功能,一想到這些無限的可能,就原諒了Notepad++沒內建日期字串的缺點了。

1. 在工具Menu上的「Plugins/Plugin Manager/Show Plugin Manager」,安裝「Python Script」(須重啟NPP)。
NPP Plugin Manager

2. 開啟Menu選單「Plugins/Python Script/New Script」,在以下使用者路徑新增一個「InsertDateTime.py」,內容輸入:

import time
editor.replaceSel(time.strftime('%Y/%m/%d %H:%M:%S'))

C:\Users\用戶名XXX\AppData\Roaming\Notepad++\plugins\config\PythonScript\scripts\
它的「User Scripts」有固定的放置位置,你也可以建立在「Machine Scripts」的安裝目錄下,方便管理就成。
Python Script Config
這個「InsertDateTime」的項目就會出現在以下的位置:
Python Script MenuItem
3. 它預設並沒有Shortcut或Hot Key,因此重新NPP後,我們在選單Menu「Settings/Shortcut Mapper」找到該項目,並給予Hot Key (我設成UltraEdit的F7鍵,因為不肯定是否會重回它的懷抱? XD)
Shortcut Mapper
在「Plugin commands」下搜尋「InsertDateTime」項目,並設定熱鍵Hot Key. 要注意該Hot Key可能被註冊走了,例如F7被「Main menu/Search Result Window」項目給設定,必須把它取消才有效果。

4. 重啟NPP,發現Hot Key產生日期字串OK了。Python可以做很多的自動化工作,詳情皆可看Python Script官方網頁說明。

2012-03-12

替Google Blogger加入Facebook留言

Facebook Comments留言功能主要的優勢是挾帶3.5億臉書用戶的普及度,不需另行註冊即可在各種平台留言,帶來很方便的互動效果。然而,Google Blogger網誌設定中的「版面佈置/Blog Posts」區塊並不支援Facebook留言嵌入功能(畢竟是社群應用市場的競爭對手),因此我透過置底的「HTML/Javascript小工具」佈署這樣的功能。

1. 閱讀重灌狂人的教學文章「在部落格嵌入 Facebook 留言板,借3.5億個會員讓流量破表!」,取得Facebook Comments的嵌入程式碼。
Facebook Code

2. 在Blogger設定的「版面佈置」下方加入一個HTML/JavaScript小工具。Blog Posts處並無法嵌入語法,我也不想每次post文時都在文章下方把這些嵌入碼置入,畢竟模組嵌入的獨立原則概念必須把持。
Blogger Layout

3. 重點來了,留言的資料是依賴Facebook Plugin Code中的「data-href」來區別,但我們無法以伺服端語言自動產生網址,所以我用Javascript的document.location變數來代替,新增如下代碼:

<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/zh_TW/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
document.write('<div class="fb-comments" data-href="'+document.location+'" data-num-posts="5" data-width="470"></div>');
</script>

4. 測試一切正常,雖然留言位置無法跑到最適當的文章下方,但還能接受。
Facebook Comments

Cobian Backup備份保留次數

Cobian Backup是一套免費的備份軟件,它主要特色是支援Windows陰影備份(使用中的檔案可被複製),常當作Server端的備份機制。我習慣以一個目錄為單位來作備份,為了增加效率,希望它平時只備份異動的檔案就好,第3次再作一次完整的目錄備份即可。
Backup Type

以上是Cobian Backup的設定畫面,步驟1-2會形成以下History記錄的循環順序效果:
Backup History

為了節省備份空間及加速備份檔案複製至其他磁碟機,每次的備份壓成ZIP檔最好,檔名標示出日期/時間。
Backup Archives

為了避免這些備份檔日累月積把磁碟灌爆,最好是只保留三份完整備份ZIP即可,這就是選項「Full copies to keep」的功能實現。當每次執行備份完畢,它會讀取History的資料,抓取倒數第3次的Full備份時間,將它之前的所有檔案(Full+Incremental)全部刪除。在Cobian Backup裏,History並不像純Log文字記錄,它是備份軌跡的重要依據資料。

有了這自動回收的機制,我們就不用怕備份檔耗竭磁碟空間。備份次數設定裏,我很愛「3」這個數字,因為備份距離時間太近太遠都不好,選擇這數字是長久累積的備份經驗也。

2012-03-07

複製Opera的頁籤名稱及網址

當我們要複製一個網頁URL給別人時,最好是能把該Page Title及URL一起複製,這樣能讓別人迅速了解你轉貼的頁面大意。舉凡Maxthon, Firefox, Google Chrome都有Extension支援這樣的"Copy Tab Title and URL”的功能,唯獨老牌的Opera瀏覽器沒有!!

對於Opera的Extension豐富度有點小小失望,因為身為老牌瀏覽器卻缺乏一些主流常見的功能,後續的發展趨勢令人擔心了。不管如何,各自一片天,還是介紹如何實作在Opera頁面中,實現「Copy Tab Title and URL」的功能。

1. 打開Opera安裝目錄下的”/ui/standard_menu.ini”檔案,搜尋”[Document Popup Menu]"字串,在此項目”Item, MI_IDM_POPUP_ADDRESS            = Copy document address” (約720行)下新增以下內容:

Item, "Copy Tab Title and URL"="Go to page, "javascript:(function() {var s=window.getSelection(),t=document.title+'\r\n'+location.href,t=s?t:t;window.prompt('',t);})()" & Delay, 10 & Copy & Cancel"

2. 儲存檔案,並重新開啟Opera。在任一Web Page頁面按滑鼠右鍵,出現:
 WebPage ContextMenu


3. 點選該項目後,會出現一個提示視窗,但隨其就不見。這是因為Javascript無法直接存取local的剪貼簿,所以透過提示視窗複製再令其消失,乃折衷辦法也。所以本來很容易的一項人性功能,官方不做,就是累死百姓了!
Tab Title and URL


我使用OperaPortable版本沒辦法成功,它好像讀取別地方的ini檔案,但我遍尋不找。你可以直接執行”\Portable\OperaPortable\App\Opera\opera.exe”即可。

2012-02-17

10分鐘得到Dropbox的免費5GB空間

官方福利說明:
Dropbox正在準備推出相機照片及影音的同步新功能,為了回饋測試的用戶,只
要透過論壇裏的Beta新版上傳5GB的照片/影音,即可得到5GB空間,即使刪去
那些檔案,得到的空間亦會保留。
image
 

文件教學目標:
依正常的程序,你得準備隨身碟內5GB的相片或影片,經過漫長的上傳等待,
才能得到此福利。此檔透過一些捷徑方法,可以讓你簡單地在10分鐘內就得到
官方福利,避開了漫長的上傳等待。

教學文件下載:(PDF, 1.54MB)
Dropbox

2012-02-09

快速大檔產生器

有時候我們需要臨時產生一個大檔來作某用途的應用,例如測網速或磁碟Quota測試,這個工具可以讓你極快速產生一個指定Size的檔案,例如下圖5GB的檔案的產生,只需要約85 miliseconds時間(不到0.1秒)。
image

工具下載 (2012/02/09 Updated, 9.52KB)
DropBox
***免安裝,需要.NET Framework 4.0以上版本。***

2012-01-31

智邦PP一元簡訊API呼叫

台灣市面上的一元簡訊服務,大部分採各自會員網頁介面,很少有提供程式API讓用戶自行撰寫程式發送簡訊。終於在智邦PP一元簡訊消費平台上,終於有提供簡易API方式給用戶:
http://pp.url.com.tw/option/api
image

智邦API是使用HTTP POST方式傳入,回傳時使用PHP陣列,使用C#還是可以輕易完成整個API的呼叫。網上關於如何實作POST多參數資料的傳遞範例碼很多,為了方便使用,我將它包成一個Helper物件:
 image

回傳的文字訊息,則可依照官方網頁的API說明作字串擷取判斷。透過這樣API方式,您可以自己打造符合手機Screen Size的網頁或開發APP來傳送一元簡訊。
 image
最後,小抱怨一下台灣簡訊價格相較大陸,實在太貴啦~ 以電信數據及3G資料量的比例原則,公道自在人心。

2012-01-11

跳過蘋果動新聞嵌入廣告

蘋果動新聞是蠻有趣的新聞報導方式,雖然它的內容有誘導及想像之處,但一切就端視閱聽人自己心中的一把尺。片頭常有很煩人的廣告,而且至少得等到播一半才能Skip略過,是屬於比較暴力式推銷方式。

為了跳過這樣煩人的置入式廣告,有網友分析出它是利用Cookie來記錄是否已播放過廣告,可以在IE「網際選項/隱私權/網站」裏把此網站的Cookie禁用,有效防止AD播放。但一些非IE的瀏覽器(如Maxthon)因為有自己專屬的Cookie控制,因此得利用Javascript來控制Cookie.

先分析動新聞網頁源碼:
image

由上圖源碼得知,只要obj.newstate=’COMPLETED’,嵌入式廣告就會消失。所以只要在網址列上輸入特定的Javascript來覆蓋這段函式,就可以達到此目的。

javascript: changeADState({newstate: 'COMPLETED'}); changeADState(); history.go(0); void(0);
其程式意思在於先設定該newstate Cookie變數為"COMPLETED”狀態,再呼叫執行它使之儲存,再重新載入該頁!你可以把這段程式碼Bookmark起來,遇到廣告播放時按一下就行了。