2015年10月26日星期一

Task Scheduler+VBA: Send an email via SMTP using VB script

Task Scheduler provides "Send an e-mail" function, but it does not work with authentication. To solve the problem, I created a script with arguments for sending an email using "Start a program" action instead of "Send an e-mail" in Task Scheduler.

1) Copy and save below script in your computer. For example: save file in D:\script\ and named "SendEmail.vbs".
'==============================================================================
'=== Send Email using VBS Script
'===    arg1: Email Subject
'===    arg2: Email From
'===    arg3: Email To
'===    arg4: Email Text Body
'==============================================================================

SET args = WScript.Arguments
SET objEmail = CreateObject("CDO.Message")
SET objEmlConfig = objEmail.Configuration

DIM emlSubject
DIM emlFrom
DIM emlTo
DIM emlBody

emlSubject = args.Item(0)
emlFrom = args.Item(1)
emlTo = args.Item(2)
emlBody = args.Item(3)


WITH objEmlConfig.Fields
    .Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2      ' 2 = using SMTP
    .Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.server"      ' your smtp server id
    '.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    .Update
END WITH

WITH objEmail
    .Subject = emlSubject
    .From = emlFrom
    .To = emlTo

    .TextBody = emlBody
END WITH

' send email
objEmail.Send

SET objEmlConfig = nothing
SET objEmail = nothing
Remember to change the "smtp.server" as your SMTP Server.

2) Create a Task in Task Scheduler.
2.1) In General page, input the name of task.
2.2) In Triggers page, create a new trigger and set "Begin the task" is "On a schedule".
2.3) In Actions page, create a new action and set "Action" is "Start a program".
2.3.1) Set "Program/script" is "D:\script\SendEmail.vbs"
2.3.2) Set "Add arguments:" is "send email from vbs" "sendfrom" "sendto" "email_body". Remember to change the "sendfrom" and "sendto" as your email address.
2.3.3) Set "Start in" is "D:\script\".
2.4) Press OK to save.
schaction

You can try to run the task in Task Scheduler Library.

Outlook+VBA: How to delete older deleted email after n days automatically on schedule?

Here's coding is only for selecting a specific folder such as "Deleted Items" and check the date whether is older than n days, for example is 14 days, then delete it permanently.

Reference, if you don't know : How to create VBA function, Outlook rule and enable macros in Outlook?

1) Press Alt+F11 to open VBA to create a function on Outlook.

Example 1:
A simple way to delete all type of emails which are under “Deleted Items" folder and the Last Modifcation Time (DateTime) older than 14 days.
Sub CleanupDeletedEmail(Item As Outlook.MailItem)
    Dim DelItems As Outlook.Items
    Dim OlderDay As Integer
    
    OlderDay = 14

    Set DelItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems).Items
    
    For i = DelItems.Count To 1 Step -1
       If DateDiff("d", DelItems.Item(i).LastModificationTime, Date) >= OlderDay Then
            DelItems.Item(i).Delete
       End If
    Next

    Set DelItems = Nothing
End Sub
Tips:
1. You can also change the folder from Deleted Items “olFolderDeletedItems" to another such as Inbox “olFolderInbox".
2. As email that received will include non-email type, for example delivery email error that sent by outlook server or task, which does not have SentOn date, so using “LastModificationTime" instead of “SentOn".


Example 2:
Sending an email if there is any error found during deleting. Besides, if item type is email then check the SentOn date otherwise using LastModificationTime.
Sub CleanupDeletedEmail(Item As Outlook.MailItem)
    On Error GoTo ErrHandler
    
    Dim DelItems As Outlook.Items
    Dim OlderDay As Integer
    Dim IsDel As Boolean
    Dim sRptToEmailAddr As String
    
    OlderDay = 14
    sRptToEmailAddr = "name@domain.com"    

    Set DelItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems).Items
    
    For i = DelItems.Count To 1 Step -1
        IsDel = False    

        If DelItems.Item(i).Class = olMail Then
            If DateDiff("d", DelItems.Item(i).SentOn, Date) >= OlderDay Then
                IsDel = True
            End If
        ElseIf DateDiff("d", DelItems.Item(i).LastModificationTime, Date) >= OlderDay Then
            IsDel = True
        End If
        
        If IsDel = True Then DelItems.Item(i).Delete
    Next
    
GoTo Finally
ErrHandler:
    Call CreateNewMessage("Error: " + Item.Subject, sRptToEmailAddr, Err.Description)
Finally:
    Set DelItems = Nothing
End Sub

Sub CreateNewMessage(pSubject As String, pTo As String, pBody As String)
    Dim objMsg As MailItem    
    Set objMsg = CreateItem(olMailItem)
    With objMsg
        .Subject = pSubject
        .To = pTo
        .Body = pBody
        
        .Send
    End With

    Set objMsg = Nothing
End Sub

2) Save and exit VBA.

3) Create a new rule on Outlook.
3.1) Start from a blank rule: Select "Apply rule on messages I receive" -> press Next
3.2) Which condition(s) do you want to check? Select "with specific words in the subject"
3.3) Use mouse to click "specific words" in "Edit the rule description" box, and input "Call Cleanup Deleted Email". -> press "Add" -> press "OK".
3.4) What do you want to do with the message? Select "delete it" and "run a script".
3.5) Use mouse to click "run a script" in "Edit the rule description" box, and select "Project1.ThisOutlookSession.CleanupDeletedEmail". -> press Next.
3.6) Press Next to ignore "Are there any exceptions?".
3.7) Assign a name for this rule: Call Cleanup Deleted Email.
3.8) Press Finished.

rule

The action of this rule: When new email arrived which the subject is "Call Cleanup Deleted Email" then delete this email and run the script "CleanupDeleteEmail".

You can now to send an email with the subject is "Call Cleanup Deleted Email" to this account for checking whether the rule can call the script and delete the email which the date is older than 14 days correctly.

Using below tutorial link to create a Task Scheduler and send "Call Cleanup Deleted Email" email periodically.
Task Scheduler: Another way to send an email via SMTP using script

Below is an example to kick-off the task on 12:05am everyday. There are many options such as Daily, Weekly, Monthly or Repeating for you selection, so you can assign what you want in Trigger.
task

Outlook+VBA: How to delete Auto-forwarded emails using outlook rule and VBA?

There is not condition for Auto-forwarded when you try to create a new rule in Outlook, so you have to run a script when an email arrives.

1) Press Alt+F11 to open VBA (VbaProject.OTM) on Outlook 2010.
2) Create a procedure. Copy and paste below coding in your VBA.
Sub DeleteAutoForwardedEmail(Item As Outlook.MailItem)
   If Item.AutoForwarded Then
      Item.Delete
   End If
End Sub
vba
3) Save and exit VBA.

4) Create a new rule on Outlook 2010.
5) Start from a blank rule: Select “Apply rule on messages I receive” -> press Next
6) Which condition(s) do you want to check? Select nothing or “on this computer only” -> press Next.
7) What do you want to do with the message? Select “run a script”.
8) Use mouse to click “run a script” in “Edit the rule description” box, and select “Project1.ThisOutlookSession.DeleteAutoForwardedEmail”. -> press Next.
9) Press Next to ignore “Are there any exceptions?”.
10) Assign a name for this rule: Delete AutoForwarded Email.
11) Press Finished.

rule



Before to run the script, you need to enable macros in Outlook.

1) File -> Options -> Trust Center -> Trust Center Settings
2) Macro Setting -> Select "Enable all macros (not recommended; potentially dangerous code can run)".
3) Press OK and re-start Outlook.

enablemacro



2015年10月15日星期四

Dyson V6 無線吸塵機在 Amazon.de 訂購的分享編

在其他人的文章提到可以在美國Amazon或德國Amazon訂購Dyson,但大多數人也會在德國Amazon訂購的原因是可以退稅(VAT)就算再加上運輸費之後,價錢還是比美國Amazon平。另一方面我發現美國Amazon已經沒有再提供運送到香港的服務,所以還是要在德國Amazon訂購。第一次在Amazon訂貨就要看德文字,難度真高。不過經上網看其他人分享了他們在Amazon.de訂購Dyson的經驗及將德文轉英文的step by step的講解之後事情變得簡單很多。我當時的想法是先跟步驟做看看是否成功,如果真的太深太複雜,那直接經香港網購訂貨吧!但後來發現原來Amazon.de的網頁已經推出了"In English - Beta"的功能,當你選擇了這個功能之後大部份也轉了做英文再加上用Google Translate幫手,最後我也完成訂購。


步驟:

1) 首先在 美國Amazon.com德國Amazon.de 登記一個戶口,如果你已有美國戶口那不用在德國Amazon申請了,因為我用美國戶口在德國Amazon也可以登入。如果你用Amazon.de來登記那記得先選擇"In English - Beta"的功能來看英文版如下:

按"In English - Beta"。
amazon_inengbeta

已經轉為英文。
amazon_Signin


補充:以上說的"In English - Beta"的功能已轉了以下的介面選項,因為同之前有太大出入所以在此更新一下。
amazon_chgeng


2) 登入之後就可以在search內搜尋有關"dyson v6"的資料。

Dyson手提吸塵機其實有好多個Model,我當時決定買這款的原因,除了想要一部手提款式之外,還需要有HEPA的功能來幫助提升吸塵蟎的能力。最後只有Dyson V6 Absolute及Dyson V6 Total Clean兩款符合我的要求,所以今次我只列出這兩款資料。另外要注意的事雖然電壓同香港一樣,但它的火牛不是用英式的三腳插而是用兩腳,所以收到貨後可以去買一個轉插轉回三腳就可以用了。

補充:

1) 雖然前段提到HEPA的功能,但其實HEPA只是一個過濾網的標準而已,根據wiki網解釋HEPA的標準至少可過濾99.97%以上的空氣中的微粒(0.3微米)。如果有看過有關Dyson機內部的話就會知道HEPA是放在馬達(Motor)的尾部份(藍色的頭內),而吸風口及馬達之間還有一個濾芯(過濾網),我當時覺得奇怪為何會有兩個的過濾網而只有一個才有HEPA,是否成本問題?如果是成本問題的話那應將濾芯轉為HEPA那就可以吧!那為何要另設計多一個過濾網?就這個問題我看了好多Dyson資料及影片,其中一個影片是介紹Dyson V6及另一部品牌(無品牌)的吸塵機當吸入白色煙霧後的兩者效果,效果顯示無品牌的吸塵機吸入之後再將白色煙霧經由出風口吹出來(意思是過濾功能不夠好),而Dyson就沒有吹出白色煙霧。就這個測試才知道藍色的頭是出風位的部份,所以我認為HEPA安裝在這裡應該是用來阻擋微粒經由出風位吹回出來,這可確保微粒(塵蟎)能儲存在容器內,用完後一次過倒出。以上是我個人的理解而已。

2) Dyson吸塵機不可以吸水,因為會影響了過濾網從而發出臭味。但如果不小心吸水之後,解決方法是將過濾網清洗乾淨,等待完全曬乾後再安裝就可以解決。

3) 充滿電後可用大約20分鐘,但會根據用的吸頭及吸力模式而減少可用電量。下面的圖會看見有一些吸頭需要另給電力(30W/50W),所以當用這種吸頭時用電量會減少,根據官方說用電量將會減少至16分鐘。另它有兩種吸力模式,正常及最大(MAX),也會影響用電量,根據官方說當選用最大模式(MAX)用電量將會減少至6分鐘。


Dyson V6 Absolute 及 Dyson V6 Total Clean 的介紹如下:
dysonv6_absoulute
Dyson V6 Absolute
盒內連四個不同的配件
重量 2.7kg
dysonv6_totalclean
Dyson V6 Total Clean
盒內連五個不同的配件
重量 2.8kg
掛座
Convenient Docking Station
dysonv6_dock
除了可掛牆及充電之外,支架還預留了兩個可擺放配件的空間。

註:主機可以不用掛座也可直接充電。
碳纖維尼龍刷毛電動吸頭
Direct-Drive Cleaner Head
dysonv6_directdrive
有 (50 W) 有 (30 W) 適合在地毯上去除地面污垢。
組合吸頭及縫隙吸頭
Combination Tool & Rigid Crevice Tool
dysonv6_combine
適合清洗難到達的地方,例如牆角位、冷氣機出風位、或縫隙等。

註:縫隙吸頭(Rigid Crevice Tool)是一件裝,當中不可延長及加裝刷頭與Flexi Crevice Tool是不同的。
硬地板吸頭
Hard Floor Cleaner Head
dysonv6_hardfloor
- 適合在硬地板上,如鑲木地板。
軟絨毛滾筒吸頭
Soft Roller Cleaner Head
dysonv6_softroller
- 有 (30 W) 軟尼龍用於接收粗塵土(如狗餅)和細小的灰塵,非常適合在硬地板上的所有要求。

如果清洗此吸頭?
迷你電動吸頭
Mini Motorised Tool
dysonv6_minimotor
- 適合去除寵物毛髮和深層次的污垢,也可吸梳化或床。

我不清楚輸出30W同50W對於吸力是否有很大的分別,反正我用不著這款碳纖維尼龍刷毛電動吸頭,因為它是針對在地毯上的用途。另外兩款就比較適合我用,一款是改良版的硬地板吸頭-軟絨毛滾筒吸頭,雖然用了絨毛的設計會比較難清洗,但看影片介紹它比以前更能吸入大粒沙塵或狗餅之類,似乎效能加強好多。另一款是迷你電動吸頭,我看影片好多人都用來吸梳化、地毯、床墊等而且效果很好,但如果你不介意吸床墊及地毯也是用同一個吸頭的話。

另外如果你覺得盒內的吸頭還是不夠用的話,以下我列一些我已買或有興趣的配件,如有興趣可以再另購。

過敏套裝
(床墊吸頭,軟質毛刷吸頭及彈性縫隙吸頭)
Allergy Kit
(Mattress Tool, Soft Dusting Brush & Flexi Crevice Tool
dysonv6_AllergyKit
床墊吸頭
dysonv6_Mattresstool

軟質毛刷吸頭
dysonv6_softbustbrush

彈性縫隙吸頭 (類似縫隙吸頭的進階版。可延長、彎曲及有刷頭)
dysonv6_AllergyKit
家庭清潔套裝
(軟質毛刷吸頭,多角度刷頭及硬毛刷頭)
Home Kit
(Soft Dusting Brush, Up Top Tool & Stubborn Dirt Brush)
dysonv6_homekit
軟質毛刷吸頭
dysonv6_softbustbrush

多角度刷頭
dysonv6_multiangle

硬毛刷頭 (對付頑固的污垢)
dysonv6_stubborndirt
無纏結渦輪吸頭
Tangle-free Turbine
dysonv6_tanglefree
無纏結渦輪吸頭 (不會將毛髮殘留在吸頭內)
dysonv6_tanglefree2
梳毛工具
Dyson Groom Tool
dysonv6_groomtool
梳毛工具 (當梳毛時按住按鈕不放,梳完之後放開按鈕然後它才會將在梳面上的毛髮吸入機內)
dysonv6_groomtool2
彈性縫隙深層工具
Reach Under Tool
dysonv6_reachundertool
dysonv6_reachundertool3

這個工具我很想買,不過在德國Amazon找不到,反而在美國Amazon找到,但由於沒有退稅及運輸費還貴過件工具,所以最後都沒有訂。

彈性縫隙深層工具 (是彈性縫隙吸頭的進階版,保留之前的功能(可延長、彎曲及配備一個獨立刷頭)之外,新增了一個扁平的吸頭來方便進入狹小的空間,它的側面加設數個小孔以及V型的尼龍刷頭設計更可引導灰塵進入吸道。

註:刷頭及扁平吸頭不可以同時間一齊用。
dysonv6_reachundertool2

最後我買了Dyson V6 Total Clean, Allergy Kit, Home Kit and Tangle-free Turbine四樣東西。由於有退稅的源故總價錢已經平了差不多八佰元,所以我付多EUR10(HK$89)轉用快運(3-6個工作日),那當然選用集齊所用產品才運送否則要加錢,經扣除VAT稅再加回運輸費用後總價錢最後比未扣之前還平了EUR9。當日星期一我已經完成訂購,但當中有一件配件要等到星期五才有貨,所以最快也要等待下星期才能收貨,但在星期三那天我收到email講他們會幫我分開寄出而不作另外收費,之後我上Amazon check個運送期,主機最快會是星期五而另外配件就要下星期一,奇怪的事明明其中一件話星期五才有貨,但我已經見到產品在星期二分另一張運送單一齊出貨了。


以下是我的訂購單。
dysonv6_orderform


以下是我訂購產品的網頁。
德國Amazon Dyson V6 Total Clean (EUR 449.00)
德國Amazon Allergy Kit (EUR 38.89)
德國Amazon Home Kit (EUR 37.89)
德國Amazon Tangle-free Turbine (EUR 38.99)


DHL真快,主機比預期早了一日(星期四)早上收到,而其他也在同日下午收到了。


下一編:Dyson V6 無線吸塵機的工具的用後感

2015年10月8日星期四

無意中選中 Netgear Nighthawk X4 AC2350 (R7500) Router 的分享篇

這款Netgear AC2350 Router根據盒上的賣點是Advanced Gaming & Streaming再加上1.4GHz雙核處理器,感覺超快,但對於我家中只有8Mbps寬頻的上網(下載)速度這似乎太浪費,何不買價錢平一半的AC1200/AC1900的級數。原因無他,因為它有我想要的Steaming、快的處理器及最重要的Device Priority的功能而已,當然其他品牌可能也有這樣的功能。我買這款時只是因為當時在商場看了好幾個型號及品牌之後,發現這個品牌我以前未用過以及原來它是美國的大品牌及專業級型號,所以想試一下。

我肯花貴一半的價錢去買這款專業級其實是有原因的,所以前段先會講經過,之後才會介紹這部機的某些功能,所以如果你只想看有關Netgear的資料分享那直接跳去以下【功能】那部份就可以了。


【事源】
以前8Mbps寬頻只有我自己一個人用,由於我這幾年連BT也沒有做,最忙可能在FB打Game而已,所以8Mbps還足夠用。就算有了智能電話因為當年還有無限流動上網計劃,所以我家人用家中寬頻的需求也不多。但自從多了用Smart TV、手機看影片或睇youtube以及沒有了無限流動上網計劃之後,他們已轉用家中寬頻也對上網速度的要求漸漸增大。那當時剛巧Router壞了所以買了新款有Dual Band功能的Cisco EA2700(300+300 802.11n) Router,發現用了4.5GHz Wifi連接Smart TV之後畫面的流暢度大大改善,由之前出現有時停頓而換新之後就沒再出現了。但當我媽學識用iPad去看電視劇之後,麻煩就開始了,每當轉片出問題或LOAD片時間有點慢時她就投訴,甚至我正在公司工作的時候她也打電話來。所以當時我決定如果要換新一部Router時首要先解決我媽的問題才可選購。

用了差不多兩年的Cisco EA2700 Router在幾個月前就開始慢,但其實是否上網連線的問題,我當時都未算太肯定,因為家中的數據用量真的比以前用多了,再者看影片時出現短暫停頓,我還是覺得正常。但問題愈來愈嚴重,連我看普通(HTML)網頁都有時沒有反應,之後發現PCCW Modem的燈號相隔15-30分鐘就會出現一次紅燈,原來真的是線路問題。之後叫師傅上來維修後,雖然沒有出現紅燈但上網的問題依然存在,那當時我就懷疑是否Router有問題呢?那當時又發現有時LOAD不到網頁的時候,Router的Wifi也同時會在網絡消失,等待一陣Wifi又會出現之後用了一陣又會消失,奇怪是沒有人按關機或reset鍵,當時認為那部Router應該是壞了,所以換了另一部Belkin AC750(300+433 802.11ac) Router它比舊的Router傳輸速度更新、更快,理論上新的機不應會有Wifi消失的問題,但消失的問題還在之外,另有一個我認為是好大的問題是當它無故disconnect上網之後沒有自己重新接駁的功能,所以我每次也要關掉電源再開機才可以重新接駁。真是惡夢的開始!

小插曲:雖然上面講Cisco EA2700用了兩年,但其實它未夠一年已經壞了,之後拿去維修當時他們說換過一部新機給我,我心想果然是大公司即時換一部新機給我。當時他給我的Router是沒有任何包裝的,而我信他的品牌所以也沒有仔細驗貨就走了,回家試用發現有問題,想嘗試按reset鍵,那時才發現reset鍵有幾點的原子筆跡,之後打電話去問清楚,他們說只能給一部維修過的機給我,如果要新機的話要等再一步測驗先再決定是否給我,但現在我已收貨不會再換機。但當時換機的人不單沒有講這一點,還用次機當新機給我。真的不舒服因為未到一年就要用次貨,回想當年以為付多少少錢選購Cisco品質及服務一定有所保證,原來也不外如是。<小插曲完>


【小測試】
師傅維修完之後還是出現問題,所以做了一個簡單的測試就是去Speed Test的網頁驗查一下上網速度,結果平均速度是5-6Mbps也有時跌至得1Mbps以下,另也發現有幾個時段每日都是超慢,但這樣還未能可以找師傅來維修。突然連續幾日大雨後發現PCCW Modem又出現紅燈,再次打電話去維修部,但這次他們將上門時間更改了幾次,足足等了三星期才有師傅上門來維修。

以為第二次維修個問題應該會完全地解決,但可惜不是。這次寫了一個Batch的檔案內每隔1-2秒就ping pccw.com當出現有timeout的話就將當時時間記錄在一個log的檔案,經兩日之後發現結果是有時1分鐘1-2次timeout、有時幾個小時之後先會有1-2次timeout。由於有問題之前我沒有相關的記錄,所以也不知道這些timeout記錄是否近日增多或一向也是這樣,另外會否被攻擊現在也不肯定。網上有人說除了可以ping 街外之外還可以ping router看看問題是否出於router本身,那我又試試看ping新及舊兩部router。結果是如果ping 舊的Cisco Router是經常出現timeout,而ping 新的Belkin Router就少好多timeout,基本上幾小時才出現一次timeout,這結果我假設舊的Router似乎真的壞了,而新的Router還是正常。新的Router雖然還會出現timeout,不過有人提到有些Router內有防護功能,可能會將大量的ping視為攻擊而將它攔截,所以假設幾小時出現的timeout可能是因為防護功能。

我不是這方面的專家,他們是否可以根據以上的測試也能夠肯定地知道那裡出現問題?回去根本的問題由於我不能將8Mbps加大,也沒有另一間網絡商可以換,所以我只能在有限的範圍內作出改善。針對Wifi就只有更換Router,另外還要針對我媽看影片的問題,只要她可以順利地收看,那我就應該會有好日子過。


【選購】
我習慣當Router壞了之後會選購另一個品牌,所以轉用過好幾個品牌包括Buffalo, TP-Link/D-Link, Totolink, Cisco, Belkin等。自己最中意是Buffalo的無天線及直立式的設計因為它佔用的地方不多,但也因為無天線而導致接收訊號不佳。TP-Link/D-Link/Totolink都是走平價路線,雖然如此但它們的功能比起同級的貴品牌多好多。Totolink AC1200(A2004NS) 我是幫朋友買及setup所以只試用了2-3個月,但感覺是功能多價錢平,而TP-Link/D-Link(不太記得是甚麼link)雖然這是功能多及價錢平但我只用了一年左右就壞了。選購Cisco也是朋友介紹說好穩定用了兩年也未壞所以我先買,不過我發現它的功能很少,但價錢比Totolink還要貴,只可以說這類型號只適合一些不識用電腦的人士去選購,而Belkin也同Cisco一樣不用多說。
註:以上的型號分析,價錢是在1仟以下,所以可當是入門機。

在商場走了一轉搜查當時那些款式是在1仟以下的,而最少要有Dual Band + 802.11ac的功能。Tenda AC1900及Totolink(記憶中好似有一款比AC1200更高的型號)我比較有興趣,因為對Tenda不認識所以問售貨員兩者有何分別,他說Tenda的確快過Totolink那款,但Totolink是最多人選購的品牌因為它價錢平,建議我買Totolink。我即時疑心起,為何售貨員會建議我買一部速度慢及價錢又平的貨品,價錢貴那部他們不是會賺得更多利潤嗎?所以我離開那店去其他地方看,之後我看見有一盒印有Streaming,雙核的字眼,再看清楚原來是Netgear Nighthawk X4 AC2350 Router,但價錢超過1仟元,這個價錢是否值得用在只有8Mbps的網速呢?出了商場後我即時用手機上網搜查有關這款的資料,是一部評價很高的專業級型號。而當時我在想Streaming應該是強項,可能幫助到我媽看影片的問題,另除了功能多之外,最主要是自己可以去做setting,所以最後以盡地一煲的心情選購了這款。


【功能】
這款是專業級型號所以有好多功能已經包括在內,例如DHCP, Wireless AP, Wireless Bridge, Port Forwarding, Dynamic DNS, VPN Service, Remote Management, IPv6, Traffic Meter及LED Control Settings等。另外以下幾點我想特別介紹一下。

四條天線+雙核處理器
我上文提及過我上網(下載)速度平均在6Mbps左右,好采的話也會去到7Mbps,最高只有8Mbps。所以我只能用Wifi的傳輸速度去改善自家上網問題。Totolink的AC1200(300+867Mbps)當時試用感覺上網是快了,所以當知道它Wifi的傳輸速度有AC2350(600+1733Mbps)再加上有雙核處理器的時候實在太高興了,因為當傳輸速度快的時候而處理器不夠快而未能有效地運作將會導致數據有遺失的問題,所以以雙核處理器去配合是絕對有需要的。

Twin USB3.0+eSATA with ReadyShare
由於我有部NAS所以這部份自己暫時未試不過也想講一講。USB多數都會用來接駁Printer,但它是3.0其實速度比2.0快好多倍,再者現在好多Printer已經可以用Wifi連接,除非列印的文件是大型圖案,否則以高速Wifi接收應該也不太慢,所以個人覺得這個USB3.0還是用來接駁External Harddisk來得實際。另eSATA是需要另外接電源所以用來做Backup或固定的storage會比較好。

ReadyShare是Router內的功能,當你開啟(Enabled)了ReadyShare及接駁好External Harddisk之後,你就可以在你的電腦的"Network"找到一部名叫"ReadySHARE"的電腦,之後就可以用到那裡的檔案。另外也有設定定期Backup的功能,還可以用Email來通知有沒有Backup error。另外也可以下載他們的手機App將手機的檔案直接抄去那幾個External Harddisk內。

這功能我很中意,對於不太想架設一部NAS但又想做Share或Backup,這功能確實幫助不少。

Dynamic QoS & Speedtest
QoS全名Quality of Service(服務質素),作簡單的解釋就是根據服務類別而分配不同的等級從而得到更好的上網效果。舉例某隻Online Game & Youtube同時使用,假設服務協定了這隻Online Game的等級為高級,而Youtube的等級為中級的話,那數據傳輸就會以Online Game為先,之後再分配給Youtube,那麼Online Game就可以穩定地上網。但如果用家想將資源先分配給Youtube先之後才到Online Game的話這QoS現時是不可能讓用家自行更改等級次序,因為決定等級是由某個協會界定而不是用家。所以如果想要以Youtube為先的話,那就需要到另一個叫Devices Priority的功能來幫手(請看Attached Devices & Device Priority那部份)。雖然好多Router已經包括了QoS,例如我之前用那隻Belkin AC750就已經包括在內,但它只可以決定開啟/關閉QoS的功能而已,所以對我來說想先分配資源在某部device先還是不可能。而Device Priority是Netgear AC2350內的一個功能,我不知道如果買一部同AC2350同級數的其它牌子的Router是否也會提供類似功能,所以如果你有需要可以在選機前先了解一下才買。

Netgear的Dynamic QoS的功能內包括了Speedtest,它是用來幫助用家去測試當時的上載及下載速度,測試完成之後就可以用作分配數據的用途,那當然你也可以自行輸入有關資料。開啟Dynamic QoS之後就可以在Attached Devices那部份去看看你的Devices(手機、電腦或Smart TV等)的上載及下載速度及等級(Device Priority)。

Dynamic_QoS

經Speedtest測試之後,我的上載速度是6.83Mbps,而下載速度是0.90Mbps。


Attached Devices & Device Priority
Attached Devices主要是用來列出有那些device正在連接Router及它的相關傳輸數據資料,但首先要開啟Dynamic QoS的功能,所以上部份先解釋甚麼是Dynamic QoS。而Device Priority是根據Device(例:手機或iPad)而去分配等級(Priority),同QoS是根據服務來分配等級兩者是有所不同的。設定Device的等級比起設定服務的等級來得簡單,用家只需要知道那部Device的ip address是甚麼之後將它更改等級就可以了,而每次更改也無需重新連線,非常方便。不過有一點要注意的事是先在DHCP那裡將你的device設定為fixed ip方便日後更改等級。

用我的例子我主要想我媽用的iPad看影片時暢通無阻,所以我將iPad設定為最高級(Highest),而Smart TV就設定為高級(High),其他手機設定為中級(Medium),這樣設定是將所有數據先分配給iPad之後是Smart TV到最後是其他手機。

預先準備:
1) 在DHCP內先將重要的device設定為fixed ip。(例如:iPad我設定了fixed ip address是192.168.1.20)
2) 將Dynamic QoS設定為開啟(enable)。
3) 確保你已經更新了新的firmware,因為廠機的firmware是未開放用家更改Device Priority這部份的。我現用正在用的firmware是1.0.0.94的英文版。

在Attached Devices內更改Device Priority的步驟如下:
1) 在右上位置,先disable(untick) "Enable Auto Refreshing"的選項。
2) 用iPad 192.168.1.20為例子,先在Device Name column找出那一行出現192.168.1.20,之後用Mouse click(點擊)一下最左邊第一個Column的圓形位置。
3) 然後在圓形的上方會有一個叫"Edit"的button,在這裡用Mouse click一下,進入更改iPad device的資料。
4) 進入裡面之後,你要更改Priority為Highest之外,還一定要將Device Type設定為Other,而Device Name如果你想清楚一點那可以更改為相關名稱,例如iPad。註:Device Type設定為Other是有需要的,我不肯定是否QoS是會根據device type及數據來自動更正Priority,所以我早期將iPad的Device Type設定為iPad及Priority為Highest之後隔了一段時間發現,那個Priority自動被更改為Medium,可能QoS協會不知道千尋App是用來看影片的所以將它降級。之後我將Device Type改為Other現暫時未見有自行更改Priority。另我也在Dynamic QoS內將"Automactically update performance optimization database"設定disable(untick),雖然好像不太關事但因為我自己分配等級,所以這個自動更新也不需要了。
5) 之後可以用Mouse clicks Apply button。
6) 重複以上1)去更改其他device的設定。
7) 完成所有更改後,在右上位置,可以 enable(tick) "Enable Auto Refreshing"的選項了。

DevicePriority1

上圖你會看到在同一時間內有三個devices一齊上網看影片,其中iPad設定為Highest其他的比較次級。當時用千尋App看影片的iPad只需要用0.96Mbps的數據,而Youtube就要1.53及3.89Mbps的數據,另外當時總下載量是6.42Mbps差不多到了Speedtest的測試值6.83Mbps。可能因為未用盡8Mbps寬頻,所以在這裡三個devices也能順暢地播放。

DevicePriority2

上圖是增加多一個Magic TV Box (高清盒) Device來看HKTV之後的效果,這裡的總數據是7.90Mpbs已經超過了之前Speedtest測試值的6.83Mbps,所以可以放心用Speedtest來設定,也不影響下載速度。如果根據數據來看HKTV當時需要2.16Mbps比起千尋App還要多,照理HKTV應該能順暢地播放,但事實不是如此HKTV在當時畫面已經停頓了,反而千尋App還可以流暢地播放,原因是播放千尋App的iPad的等級設定為Highest,所以先將資源分配給他。


【總結】
所以Device Priority幫了我好大的忙,經這樣設定後用iPad看影片的問題有很大的改善,而我媽已經煩少了我很多。而另外的問題是因為PCCW條線有時會降至得1Mbps以下,看影片時難免要等待一陣,這個不是Router能解決到。

雖然這部Router的外型好大部又佔位置不是我喜歡的類型,但由於它解決了我的煩惱,再加上有很多的功能,所以我個人覺得用這個價錢去買是物有所值。

2015年9月22日星期二

C#.net: How to get a default instance of Outlook and run in Task Scheduler?

The following example represents a function to open and log on to Outlook for getting emails. You can also reference this website "How to: Get and log on to an Instance of Outlook" which is provided by Microsoft. Based on the example of the Microsoft's website provided which occur the following errors in "Marshal.GetActiveObject("Outlook.Application") as Outlook.Application", and when add the program in Task Scheduler running.

1) System.Runtime.InteropServices.COMException (0x800401E3)...
2) 0x800401e3 "Operation unavailable"
3) Object reference not set to an instance of an object
4) System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80080005.
5) Creating an instance of the COM component with CLSID {0006F03A-0000-0000-C000-000000000046} from the IClassFactory failed due to the following error: 80010001.

As GetActiveObject function just work on debug mode. This forum "Marshal.GetActiveObject(“Outlook.Application”) throws MK_E_UNAVAILABLE when debugging with elevated privileges" mentioned that the reason is different user level running which Visual Studio runs as Administrator and Outlook was opened as user. I tried to change Privilege Level of my program and Outlook as "Run this program as an administrator", but it will prompt a User Account Control message box in every start, although I can adjust notification level to lower, but I don't want to do that. Besides, my program file will automatically deleted and copied from server if there is any file changed, so it is not a good practice.

Basically, Outlook.NameSpace function works fine if you don't mind running Outlook in background. Because I have to monitor the status of Outlook whether already got and deleted emails, so the function is also not work for me.

The example code of Microsoft website above describes getting a current instance of Outlook which need use GetActiveObject function, but it is not totally correct. If Outlook application is installed and create an object (Obj = new Outlook.Application) in program, the program can automatically find and assign the current instance of Outlook to the object, therefore I use create an object instead of use GetActiveObject function.

Here's my example.

Minimum requirement for my example:
1) Microsoft Outlook application must be installed in the computer.
2) If the computer has multiple outlook's profiles installed, you should define one of outlook's profile as default in Mail setting otherwise Outlook will prompt a profile screen for selection when open in every time. How to set default: Control Panel->Mail->General->select "Always use this profile".
3) Enable Programmatic Access in Microsoft Outlook. How to: File->Outlook->Trust Center->Trust Center Settings->Programmatic Access->select "Never warn me about suspicious activity".

Pesudo-code
Start a program and call the below function (example code below).
1) Detect whether Outlook is opened.
1.1) If yes then close Outlook process with hidden and shown.
1.2) If no then Open Outlook.
1.3) Waiting up to 5 mins If cannot found any Outlook process then raise error and exit.
2) Create an new object. e.g. oOLApp = new Outlook.Application().
3) Double Check whether Outlook is opened with profile successfully otherwise raise error and exit.
4) Detect Outlook connection status whether already connected to Microsoft Exchange.
4.1) Waiting up to 5 mins if the status is not connected then raise error and exit.
5) Waiting Sync is completed.

Here's the code
using Outlook = Microsoft.Office.Interop.Outlook; 

Outlook.Application oOLApp = null;

private void form1_Load(object sender, EventArgs e)
{
    try
    {
        this.FindnOpenOutlook();
  
        while (this.GetEmail.Count >0)
        {
      // ......
        }
    }
 catch (Exception ex)
    {
     MessageBox.Show(ex.Message); 
    }
}

private void FindnOpenOutlook()
{
    // 1 & 1.1) Find and kill all outlook process.
    foreach (Process p in Process.GetProcesses().Where(x => x.ProcessName.ToString().ToUpper() == "OUTLOOK"))
    {
        p.Kill();
        p.WaitForExit();
    }
    
    // 1.2) Open Outlook application.
    ProcessStartInfo sinfo = new ProcessStartInfo();
    sinfo.UseShellExecute = true;
    sinfo.WindowStyle = ProcessWindowStyle.Normal;
    sinfo.FileName = "outlook.exe";
    
    using (Process exeProcess = Process.Start(sinfo)) { exeProcess.WaitForInputIdle(); }
    sinfo = null;
    
    // 1.3) Waiting up to 5 mins if cannot found Outlook process then raise error.
    dtLast = DateTime.Now;
    while (Process.GetProcessesByName("OUTLOOK").Count() == 0)
    {
        Thread.Sleep(500);
        if (DateTime.Now > dtLast.AddMinutes(5)) { throw new Exception("Cannot open Outlook application."); }
    }
    
    // 2) Create an new object
    // If Outlook application found then oOLApp.Session.CurrentProfileName is not null otherwise oOLApp is null.
    oOLApp = new Outlook.Application();        //instead of oOLApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
    
    // 3) Check whether Outlook application is opened with outlook profile successfully.
    if ((oOLApp.Session.CurrentProfileName == null) || (oOLApp.Session.CurrentProfileName == "")) { throw new Exception("Cannot find Outlook application"); }
    
    // 4 & 4.1) Detect Outlook connection status whether already connected to Microsoft Exchange.
    // If not using Cached Exchange Mode, then check olOnline instead of olCachedConnectedFull.
    dtLast = DateTime.Now;
    while (oOLApp.Session.ExchangeConnectionMode != Outlook.OlExchangeConnectionMode.olCachedConnectedFull)
    {
        Thread.Sleep(500);
        if (DateTime.Now > dtLast.AddMinutes(5)) { throw new Exception("Exchange Connection failed. "); }
    }
    
    // 5) Waiting Sync is completed.
    syncObjs = oOLApp.Session.SyncObjects;
    for (int i = 1; syncObjs.Count >= i; i++)
    {
        syncAObj = syncObjs[i];
        syncAObj.SyncStart += syncObj_SyncStart;
        syncAObj.SyncEnd += syncObj_SyncEnd;
    
        if (syncAObj != null)
        {
            IsSyncFinished = false;
            syncAObj.Start();
    
            while (IsSyncFinished == false) { Thread.Sleep(500); }        // waiting sync completed
        }
        System.Runtime.InteropServices.Marshal.ReleaseComObject(syncAObj);
    }
}
   

Close Outlook function
public void CloseMSOutlook()
{
    try
    {
        if (oOLApp != null)
        {
            oOLApp.Session.Logoff();
            oOLApp.Quit();
        }
    }
    catch (Exception ex)
    { throw ex; }
    finally
    {
        if (oOLApp != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(oOLApp); }

        GC.Collect();
        GC.WaitForPendingFinalizers();

        foreach (Process p in Process.GetProcesses().Where(x => x.ProcessName.ToString().ToUpper() == "OUTLOOK"))
        {
            p.Kill(); p.WaitForExit(); 
        }
    };
} 

Coding in Program.cs
Adding below coding in a Program.cs of C#.net to check whether the application is running, if not found then run the application otherwise ignore.
{
    static class Program
    {
        private static Mutex mutexOLEmail = null;

        [STAThread]
        static void Main()
        {
            string sAppExePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

            try
            {
                mutexOLEmail = new Mutex(true, "{myOLEmailPgm} " + sAppExePath.Replace("\\", ""));
                if (mutexOLEmail.WaitOne(TimeSpan.Zero, false))
                {
                    Application.Run(form1);
                }
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
            finally
            {
                if (mutexOLEmail != null) { mutexOLEmail.Close(); }
                mutexOLEmail = null;
            }
        }
    }
 } 
The above coding will prevent to re-open the program, so now you can add a trigger, for example runs the program at 9am everyday or every 5 minutes, in Task Scheduler.

2015年8月28日星期五

奇怪的 Belkin AC 750 DB Router

今日講一款Router (Belkin AC750DB)的問題,我其實一年前左右已經買了這部機,但Setup完之後就收藏起來作後備之用,待正在使用的Cisco (Linksys) Router (EA2700) 壞了之後可即時更換。大約在幾星期前開始出現無故的無法上網,但等待3-10分鐘後又會回復正常。檢測之後發現當無法上網的同時那部 EA2700 Router的wifi也同時消失,開頭我以為是跳電掣或有人手多突然關了機,但這兩個原因最後都排除了。最後決定換上後備 750DB Router,反正 EA2700 已經過了保養期,不想花時間。

以為換上一部新機(AC750DB Router)問題應該會解決,但反而更加嚴重。同樣是突然無法上網,但10分鐘之後還是無法回復正常,到最後我要人手將部機的電源關掉再開啟才能上網。有朋友會話一定是我的broadband(互聯網)出現問題才會這樣,是的,確實無猜錯。但今次我是針對這兩款Router的功能,為何一部等待一陣會自動復原,而另一部我就要人手去關開機才做到?

對比了EA2700及AC750DB內的功能,我發現有一個功能在AC750DB是沒有出現的,而那個功能我一直以為所有的Router一定會包括在內,那個功能就是自動重撥。甚麼是自動重撥?首先我是用PPPoE的方法來連接上網,它要假扮打電話的方法經modem去網絡商,當接通了之後就可以上網。如果發生訊號干擾或太多用家同時連接的時候,那就可能突然斷線,之後就需要重新打電話一次。自動重撥就是當發現斷線之後,理應不需人手的自動重新接駁上網。所以我懷疑可能AC750DB這款因為沒有這個功能,所以當斷線之後我就需要將電源關掉再開啟。

另外也發現一個奇怪的問題,當我Login去AC750DB的setting page後發現它的日期有時候會出現01 Jan 1970有時候會正確。經多次試驗之後,原來當無法上網的時候這個日期是01 Jan 1970,但接通上網後它就會更新去正確日期。雖然我選了同步sync時間的功能,但也無可能如果不接上網的話就會回去1970。這個問題也令我早期測試時以為這部機無估的還原到廠的設定(Back to factory setting),很驚嚇!

真想像不到一間大牌子公司出的Router會有這樣的問題。昨晚我已經Email去問它們的Support有關以上的問題,如果有消息我會在這裡更新。


後話:在Post這篇文之後我已經轉用了這隻Router,用了差不多兩星期,發現它的表現非常之差。一日斷線(網路無法接通)1-2次,由於沒有自動重撥功能,所以每次也要人手電源關掉再開啟(太煩人),還會無故地不見了Wifi(我懷疑是因為網絡不穩定的原故)。如果你看完這部份覺得這樣的表現是正常的話,我可以講你知你應該不太明白Router的用途。Router除了用來連接上網之外,也可以架設內聯網,例如NAS、分享檔案或影片等。如用內聯網的話是可以在無上網的情況下也能正常運作,意思是"無故地不見了Wifi"的問題是無可能會發生的,因為無Wifi我又甚樣連接去NAS。

已經過了兩星期Belkin都未有人回覆我的Email,我已經放棄再等他們回覆了。昨天我決定去買另一款Router,走了好幾間商場被我發現這款Netgear Nighthawk X4 AC2350 (R7500) Router,試用了兩天非常滿意,而以上的問題也沒有了。

2015年1月28日星期三

睇HKTV用那種機種會比較穩定?

原本我是用MagicTV連駁上網及電視去收看HKTV頻道,MagicTV不好之處是要跟它的時間表去收看及不能錄影,所以如果要收看已經播放完的劇集就要用HKTV的點播功能。但MagicTV是沒有點播的功能,而要在手機App或HKTV的網頁內收看。Android有Mirror的功能可以將手機內的影像及聲音傳送到我的電視內,當然你的電視或接駁到電視的硬件(例如 DVD)也可以支持Mirror的功能才可。

所以當我想睇點播的時候,我會用Android手機內的HKTV app之後接駁到電視收看,不用看那5"的手機。用了一段時間慢慢覺得突然死App的次數多了,最近每一次轉劇集時都會跳出去,有時播放三個廣告之後就會跳出去,之後再入又係睇完三個廣告再跳,真係唔知道要睇幾多次三個又三個才可以睇到劇集。當中試過兩部Android手機 1) Samsung S3 2) HTC Desire Eye 兩部都有跳出來的問題。

在無辦法的程況下,我嘗試用部10"的Ipad 2去看HKTV,點知試了好幾日效果非常穩定,一次都沒有跳出去。但因為我無Airplay或專線這類硬件去接駁電視,為了不想三個又三個的廣告出現,那只好放棄接駁去電視那裡。

雖然沒有測試Iphone機,但在這個經驗中,似乎用 Apple iOS 是穩定好多。

是否應該用Synology的Cloud Station?

這個Cloud Station, DS Cloud令我痛苦了3個月。首先在決定買Synogloy NAS這部機之前,原本設計上主力將會用它的Cloud Station程式來將電腦檔案及手機檔案同步上去NAS,設計非常簡單,但當架設時就出現好多問題如下:

1) Cloud Client的同步信息不清晰:例如某個文件夾內有五個檔案,現在我只更新了一個檔案,雖然它幫我更新了,但更新完之後的信意顯示是"五個檔案已經更新"而不是"一個檔案已經更新",那太令人混淆了。

2) 未能正確地同步大量資料:我有800G資料要同步上去NAS,當時根據Cloud Client所顯示所有資料已經同步後,我將NAS內檔案總數來對比電腦上的總數時兩者數目不符合。之後我試將800G資料分成三個文件夾再分三個同步工作處理,而其中一個文件夾的同步信息顯示發生錯誤,但信息不明。另一個試驗就是用手機同步去那個文件夾,信息顯示同步成功,但事實在NAS這個檔案是不存在。所以我估計如果超過2-300G資料要同步的話,這程式未必能穩定地執行。但令我最擔心是它的信息令人誤以為成功同步,但實際甚麼也沒有。

3) 不明的佔用空間:Cloud Station有一個叫version的功能,這個功能是幫你儲存起多個舊有的版本,有需要時可以救回前幾個版本的檔案。雖然這個功能很吸引,但帶來的影響是佔用了很多的空間。像前例子我有800G的資料,因為做2)出現幾次不能完全同步上NAS的問題,所以我就將所有檔案刪除之後再抄去同一個文件夾再試同步,這個動作我做了幾次,後來發現我NAS的現存空間佔用了1.4TG的資源。因為每次都只是覆蓋在同一個文件夾上,理論上不應該會增加儲存的空間,所以最大可能就是version的功能製造出幾次的版本儲存在某處。事情應該很簡單我只要清除version內的記錄就應該會減少佔用的空間,問題是我找了很久也不知道這個功能在那。最後我只能重新格式過硬碟及放棄同步這800G的資料。

4) 未能同步Android 4.4以上的手機內SD卡的相片/檔案:其實這個問題不關Cloud Station的事,因為自從Android 4.4版本後 Android只容許App在自家的文件夾(例 Android\data\com.synology.dscloud)內儲存,而其它的文件夾一律拒絕。所以如果你將你的相片儲存在SD卡的話,它的文件夾(例 DCIM\Camera)應該不會同 DS Cloud的一樣,所以 DS Cloud 將不能幫你同步上NAS,除非你將相片儲存位置改為在手機內儲存後將不會有這個問題了。

由於問題太多,我無信心確保同步後兩邊(電腦/NAS 或 手機/NAS)是一樣,所以最後放棄了用Cloud Station而改用人手定期抄上NAS或直接在NAS儲存。而手機方面我不想將相片文件夾改為在手機內儲存但又想可以抄上去NAS,所以經測試後在眾多Free App內我選擇了"SyncMe Wireless" 來幫我執行抄錄的工作。雖然它的名稱有Sync這個字,但由於Android 4.4的問題,它也是不能做同步的工作,但它與DS Cloud app不同之處時它可以選擇單向抄檔案(只將手機內的檔案抄至NAS或NAS抄至手機),而不受Android 4.4影響。另一好處是它可以預設多個工作(task)可將幾個的文件夾設定好由手機那裡抄至NAS的某個文件夾,而其它的Free app只能設定一個。但它只可以在內聯網(家中的Wifi)內抄錄,保安上非常好,那當然不方便之處是如果在街上想抄檔案上自己的NAS那就沒可能。因為我主要只想備份相片,所以無需要常常在街上抄檔案,但如果真的有需要的話,那還可以用Synology另一個叫"DS File",這個App可以幫你上載或下載檔案,所以問題也可以解決。那為何不直接用DS File而又多用一個SyncMe Wireless? 因為DS File沒有預設Task的功能,每次都要由選擇檔案(相片)位置、選擇全部檔案、選擇NAS存放位置等的步驟由頭開始,太不方便了。

在短短的三個月內Synology的DSM, Apps 一路都出了很多更新版本,所以以上的問題可能很快可以解決,但現時或短時間內我都不會考慮用它的Cloud功能。

2015年1月21日星期三

World clock app includes alarm and widget features for Android

Today, I've received an email to ask me joining their live class through internet, it starts on 9am in New York. I enrolled this class, so I would set an alarm to remind me watching. My android mobile embedded an clock app with alarm feature but it can set alarm in my local time only. For the case, I can't set alarm on 9am in New York time, as I do not live in USA.

A clock supports alarm and widget is easy to find in play store, but it does not support to set alarm in other country. Finally I found two apps are "Bob's World Clock Widget" and "World Clock" which includes all features. Comparing two apps I like "Bob's World Clock Widget" because their user interface and functions much better than other.

2015年1月15日星期四

How to display text in bold, italic and strike format on Skype

I discovered Skype can send text in bold, italic and strike. I tested on version 6.21.0.104. Below is an example.

Format Input on Skype Output
Bold *Bold* Bold
Italic _Italic_ Italic
Strike ~Strike~ Strike
Bold & Itatic _*Bold & Itatic*_ Bold & Itatic
Bold & Strike ~*Bold & Strike*~ Bold & Strike
Bold, Itatic & Strike ~_*Bold, Itatic & Strike*_~ Bold, Itatic & Strike

2015年1月11日星期日

3rd Master Hard Disk Error when boot

Recently, My computer frequently showed "3rd Master Hard Disk Error" when boot. If I tried to press F1 and it says that insert media and boot. It seems the hard disk is corrupted or boot failure. Captured the screen message below:

Screen Message
Initializing USB Controllers .. Done.

4096MB OK
USB Device(s): 1 Mouse
Auto-Detecting SATA1...Hard Disk
Auto-detecting USB Mass Storage Devices ...
00 USB mass storage devices found and configured.

3rd Master Hard Disk Error
Press F1 to Resume

It has one hard disk in SATA1 and one DVD in SATA3. I thought the problem is in the DVD according the above message which the hard disk was detected successfully, so I tried to plug in the cable to SATA5 instead of SATA3, but the problem is still here.

Finally the problem is solved when I swapped the cables, Hard Disk connects to SATA5 and DVD connects to SATA1.

2015年1月4日星期日

如何用Photoshop自製証件相

護照過期了要再申請。我覺得申請任何東西最麻煩的事就是相片,每一種証件都有它的尺寸及背景顏色的要求。我手頭上已有白色,粉紅色及藍色背景的相片不過已經是7,8年前影下的,已經不能用。現在護照也接受上網申請,所以試試自製証件相之後上載申請。雖然我已用了白色的牆做背景,但影出來的顏色接近淺灰,可能因為沒用打燈(我也沒有這種燈),所以剪裁之後還要調教背景顏色。

首先要準備的東西如下:
1) 相片一張 (最好影一張直向的相片方便剪裁)
2) Photoshop軟件 (我用的是Adobe Photoshop CS4)
3) 証件相的尺寸要求 (我用的是特區護照的相片規格及要求)

我會分兩個步驟,首先會講甚樣將相片剪裁成一張証件相的尺寸,然後再用這張剪裁好的相片的背景調教成白色。

相片剪裁
1) File -> Open -> 選用你將要剪裁的相片。
2) 在 Toolbar 欄內找一個名叫 "Crop Tool"的icon,之後用mouse 點擊(click)一下。
Toobar
3) 點擊完Crop Tool的icon之後,可以輸入証件相的尺寸如下。 Crop Tool Palette
4) 輸入好之後,可以按 "Enter"鍵確定。
5) 如果步驟正確,你應該可以看到一張根據你尺寸要求而剪裁出來的相片。
6) 如剪裁滿意後可將它儲存。 File -> Save as -> Format=*.jpg

調教背景顏色
1) File -> Open -> 選用你的相片。
2) 在 Toolbar 欄內找一個名叫 "Magic Wand Tool"的icon,之後用mouse 點擊(click)一下。
Magic Wand Tool
3) 將mouse移在你將會轉顏色的相片上,之後按mouse的左鍵(Left button)。如果前後景顏色分明的話可以好快幫你分開兩邊。例子如下
Magic Wand Tool 2
因為這個步驟未必可以一次性就可以分開成兩個區域,所以先要認識以下兩種按鍵方法:
3.1) 當第一次點選之後,可能還有其他的位置要點選,那你需要用 連續點選 的方法。
操作:按 Shift 鍵不放,之後再按mouse的左鍵。
3.2) 相反想要更改/取消已點選的位置。
操作:按 Alt 鍵不放,之後再按mouse的左鍵。
3.3) 可以更改 "Tolerance" 的數值(例:10)來處理一些比較細緻位置,例如頭髮。
3.4) 一些改善效果的設定:例如 Anti-alias 及 Contiguous 選擇 tick、Refine Edge ->Radius 改變數值。(自己試試吧!)
4) 以下是兩種改變底色的方法:
4.1) 選擇 "Brightless/Contrast" ,更改 Brightness/Contrast的數值。如果改錯了可以按"Use Legacy"來還原。
4.2) 選擇 "Curves",拉上/下。
5) File -> Save as -> 今次儲存的檔案要根據証件相的要求來儲存。(例:Jpeg、1200x1600 及檔案要在1MB之下。
6) 完成。

2015年1月2日星期五

Whatsapp安裝到新手機之後沒有任何對話記錄

Offical website : 如何還原已被刪除的對話記錄?

首先你可以根據上面link去執行還原,我也是看這個還原的方法,不過有一些步驟與它有所不同,在這我講一講我做的方法。

舊手機(內存記憶體)/SD卡:
1) 開啟 檔案管理Apps,看看有沒有一個Folder(文件夾)的名稱是"WhatsApp",之後內裡有沒有一個叫 "Databases" 的Folder. (例如: /WhatsApp/Databases/)
1.1) 如果找不到 "/WhatsApp/Databases"的話,可能 1) 你不是在舊手機或SD卡內找尋。 2) 你從來沒有執行備份。但可能性好低因為WhatsApp會每天4am會自動執行備份。 3) 你錯手刪除了。
2) 在 "/WhatsApp/Databases/" 之下應該會發現有個檔案名叫 "msgstore.db.crypt7" 或 "msgstore.db.crypt8". 請記下這個檔案的位置,這檔案將會作還原之用。
3) 將 "msgstore.db.crypt7" 或 "msgstore.db.crypt8" 自己複製一個出來做一個保障。例如叫 "msgstore.db.crypt7.bkup"

新手機:
4) 刪除 WhatsApp。
5) 開啟 檔案管理Apps,看看有沒有 "/WhatsApp".
6) 在 "/WhatsApp" 內裡有沒有一個叫 "Databases"的 Folder,如果沒有請自行 增新Folder (Create folder)。
7) 確保 "/WhatsApp/Databases" Folder已經存在之後,請將 "舊手機/SD卡" 內的 "msgstore.db.crypt7" 或 "msgstore.db.crypt8" 複製到這個位置 "/WhatsApp/Databases"。
7.1) 如果 "msgstore.db.crypt7" 或 "msgstore.db.crypt8" 檔案在舊手機內的話,你可以 1) 將它經Bluetooth(藍牙)傳輸到新手機內。 2) 將它抄去舊手機內的SD卡,之後將SD卡插在新手機內。
8) 安裝 WhatsApp 及執行。
9) 點擊 "回復/還原"(Restore)。
10) 完成。