Simple life, Complicated mind

Sunday, August 31, 2014

盤點 Design Patterns

前一陣子有朋友問 Teddy 能否去教他們公司的工程師 design patterns。想起 Design Patterns 這本書  Teddy 已經有一陣子沒有去看它了,最近一次仔細重看書中的 Memento 是為了研究 exception handling 裡面關於 state restoration(狀態回復)的問題,那是多久以前的事現在回想起來居然沒有任何印象...Orz。只依稀記得當年在看 Memento 的時候其實搞不太懂這個 pattern 可以用來幹麼,所以好像從來也沒用過它。一直到 10 幾年後突然發現 Memento 可以應用在例外處理設計,算是替 Memento 找到一份工作了...XD。


Design Patterns 這本書是 Teddy 在 1997年10月24日在天瓏書局買得,算一算已經是14 年前了事了。當初會買這本書,好像是在 BBS 討論區看到某位前輩提到這本書,後來去天瓏翻了一下覺的寫得真棒就買回家。一看之下真的不得了,讀完之後(其實沒有整本全部讀完啦)覺的自己的軟體設計功力大增。書中所講得設計觀念,現在看起來可能覺的是「常識」,可是有好多 patterns 可是 Teddy 自己慢慢在專案中一一自己實做過之後,才體會到這些 patterns 的意義(剛開始自己學習的時候也是一頭霧水)。


***


10 幾年前 Teddy 也有做了一些投影片,在自己還是一知半解的情況下,跟公司的同仁分享 Design Patterns(好東西要跟好朋友分享啊)。當年 Teddy 還是個年輕小伙子,被問到自己也不懂的地方,就說一聲「不會」也就沒事了。但是現在「年事已高」,如果還被問到不會的地方就有點尷尬了(年紀大有年紀大耍無賴的方式...XD)。所以才想說把書拿出來「盤點」一下,看看那些 patterns 是自己很熟的,那些是很少實做而且已經忘得差不多的。
  • Creational patterns:幾乎稍微大一點的案子都會用到裡面的五種 patterns,尤其是 Singleton,Factory Method 和 Builder。
  • Structural patterns:除了 Decorator、Flyweight 以外,其他的 patterns 用到的機會都滿多的。
  • Behavioral patterns:Command、Observer、State、Strategy、Template Method、Visitor 用到的機會最多,Iterator、Mediator 次之,Chain of Responsibility、Interpreter、Memento 比較少用到(後面這三個有用過嗎?)。

對於一個剛接觸 design patterns 的新人,Teddy 會建議學習順序為:

  1. Singleton、Factory Method、Adapter、Composite、Command、Observer
  2. Builder、Abstract Factory、Facade、Proxy、State、Template Method。
  3. Bridge、Strategy、Visitor、Mediator、Iterator、Prototype。
  4. Decorator、Flyweight、Chain of Responsibility、Interpreter、Memento

上述建議純粹為 Teddy 個人的偏見,鄉民隨便看看就好,不用太在意。


寫到這邊突然有一個問題:真的有鄉民把這 降龍18掌 23 個 patterns 一口氣全部都派上用場嗎?有的話請介紹給 Teddy 認識一下,要跟他學習。

http://teddy-chen-tw.blogspot.ca/2012/01/design-patterns.html

Friday, August 29, 2014

MySQL trigger write data to file

Solution 1:

CREATE TRIGGER `insert_cust_fedex_trackernum_lead` AFTER INSERT ON `cust_fedex_trackernum` FOR EACH ROW BEGIN
IF NEW.invoiceNum != '' AND NEW.invoiceNum IS NOT NULL AND NEW.leadTracker = NEW.trackerNum THEN
INSERT INTO cust_fedex_trackernum_lead (idInvoice, idDealer, invoiceNum, trackerNum, created) SELECT tITRec.lId, tITRec.lVenCusId , NEW.invoiceNum, NEW.trackerNum, NOW() FROM tITRec WHERE tITRec.sSource1 = NEW.invoiceNum AND tITRec.nJournal = 8 AND tITRec.bReversed = 0 LIMIT 0, 1;
SELECT NOW() INTO OUTFILE 'd:\\test.txt' LINES TERMINATED BY '\n';
END IF;
END;

Note: If you use INTO DUMPFILE instead of INTO OUTFILE, MySQL writes only one row into the file, without any column or line termination and without performing any escape processing. This is useful if you want to store a BLOB value in a file.

Solution 2:

MySQL UDF (User-defined function)

You can add functions as native (built-in) MySQL functions. Native functions are compiled into the mysqld server and become available on a permanent basis.

http://www.mysqludf.org/

Wednesday, August 27, 2014

How to convert date format in MySQL

SELECT DATE_FORMAT(STR_TO_DATE('08/07/2014', '%m/%d/%Y'), '%Y-%m-%d')

SELECT DATE_FORMAT(STR_TO_DATE('8/7/2014', '%c/%e/%Y'), '%Y-%m-%d')

Saturday, August 23, 2014

1744 追蹤橘報: 切換至简体 程式設計師的時光傳話筒:過去的我,希望你能夠在工作前學會這 9 件事!

(本文為 Medium 駐站作家 Manual Elbert 撰寫,以下以第一人稱敘述)
三年前我在巴塞隆納的神經科學實驗室工作,忙著把電極貼到人身上、教認知系統的課,而現在我靠著設計、編寫軟體維生。
當然從前我在研究科學時就寫過很多軟體。如果你想要看懂 40G 的腦部掃描資料,你必須捲起袖子寫些語法來處理這些數據,而我一直都是個很好的程式編寫者。但直到我辭去了我的學術工作(可能也告別了我的學術生涯)並開始在一個小而有野心的新創公司工作之後,我才真正知道什麼是軟體工程師,以及在這一行是怎麼回事,並不是知道更多程式語法、資料庫、演算法跟設計模型就好。
如果我在讀研究所之前就知道這些事情就好了,將會讓我的工作生涯變得更輕鬆。這是一些對年輕的我的忠告,是我過去三年所學到的經驗,不得不說,有些實在不是那麼美好。
  • 1. 不要高估聰明的價值
年輕的時候,如果你很聰明,你便可以遙遙領先其他人,如同小池塘裡的一隻大魚。如果你那半調子的口才很好的話,那麼聰明的功效還能加倍。事實上,聰明加上口才好能夠讓你不用念什麼書就順利度過高中跟大部份的大學課程。(不過你還是得念物理,你總不能說服一個等式轉彎)。
恭喜你,你很幸運,同時卻也十分不幸運。因為當你毫無阻礙的就衝過了求學的終點線,對待學習如反掌折枝。在這同時別人必須去學習勤勞、堅持、人際網路這些之後遠遠比學識更加重要的東西。
我們的社會太過重視聰明才智了。當我跟人們提到我以前專攻神經科學,大家都會說:「哇,你一定很聰明」。的確我不是笨蛋,但我知道很多人也許不如我這麼聰明,卻是遠比我好的神經科學家。
聰明才智當然還是能幫你打開一扇門,但絕不會幫你做好工作。勤勞、嚴謹、可靠的人際關係都是不只軟體工程師,而是你跨出研究所的美好泡泡之後要成為任何專家都必須擁有的特質。
  • 2. 對你的專業感到驕傲、樂在其中
這句話可能有點老梗,但對年輕的你來說仍然很重要:無論你做的是什麼,都以它為傲,沒有任何事情應該只被視為達成目的的手段。
不論對象是人或是試管,你都必須嚴謹分析你的資料並使你的統計數據有效,然後再重來一遍,因為有時候你會發現你犯了哪些愚蠢錯誤。如果你無法樂在其中,僅把這些步驟視為出版論文或發行產品的必須過程,那麼你永遠無法真正擅長這件事。
如果你是寫軟體的,這代表你要規畫你的特色、研究現有的開源代碼、學習新的模型與程式語言、修復你的錯誤、重建程式碼並且維護它。如果你沒有想要精通你工作的野心,那無論你是科學家、工程是或是任何你在做的工作,可能都只是浪費時間。
你可以擁有一些「寵物計畫」,一些小小的、有點蠢的、並不一定能滿足你的即時目標、你只是因為「享受」在做這件事情。有趣的是,這在軟體社群裡似乎很常見:許多我們現今正在使用的產品大部分都來自某人的寵物計畫,而幾乎不是來自科學圈。我最喜歡的名言之一是來自奧地利動物學家 Konrad Lorenz:
「對一個研究科學家來說,每天早上吃早餐前都拋棄一個寵物假設是好的晨間運動。」
如果你覺得這聽起來很蠢,也許你不該當一個研究科學家。
  • 3. 學習新工具
作為上一點的延伸:投注時間學習新工具。不只是拓展你的抽象知識,而是實際去學那些能幫助你完成事情的工具。這很快就能見效。
一個學習新工具的好方法是上述的「寵物計畫」。每次你要建造新東西時,也用新的方法建造它。記住,寵物計畫就是拿來失敗用的,你投資不多、你學到一點東西;如果計畫不成功,或是你失去興趣、或是你發現實在有點太難了,你不會有損失,不會傷到自己。
如果你從事學術工作,以下是我強力推薦的好東西:
(1) Git 跟 Github
Git 幫助你管理你的工作,再也不用擔心備份問題;而 Github 上有一堆很好用的程式碼,你不需要自己重造輪子。噢,請記得跟你的同伴再確認一次你的程式碼。絕對不要用程式碼來分析那些只有你看過的資料。(我不敢相信我得告訴你這件事情啊,年輕的自己。你一直以來都是一個好的程式編寫者,但我仍然做了那些可能會被忽視的錯誤。如果不是有再檢查一遍,我不會發現因為程式錯誤,有百分之三十的科學結果可能是假的。)
(2) 一個繪圖軟體
我通常都用 Inkscape,但標準的 Adobe Illustrator 跟新的 Sketch其實也一樣好。用這些繪圖軟體來先處理你的圖表和計畫,這通常都比你在 Matlab 或是 matplotlib 上寫繪圖指令來得容易。
(3) 學習如何有效的利用你的文字與代碼編輯器
Sublime Text 是個比 VIM 或 Emacs 來得容易學會的編輯器。知道捷徑能夠幫你省下一堆時間。
(4) 學習如何說話
看看 TED 上的演講並注意這些講者如何在十五分鐘內就抓住觀眾,同時說出那些吸引人的故事。你可以在鏡子前面練習,你的肢體與聲音都是工具。
(5) 知道基本的 Python、R、HTML 跟 Javascript
這些工具可以幫上不少忙。如果你對寫程式並非一竅不通,那學個新的面向編程或資料庫。玩玩計算機視覺、自然語法編寫、網頁擷取、音樂合成跟機器人!
你所能看見解決問題的方法,永遠都會被你所使用的工具所限。學習新工具代表你用新的角度看問題。如果你是大學生,我強力建議你一周之間撥出一天來學習新工具。如果你開始做碩博士研究,那就撥兩天出來。長期來看,你會省下很多時間,而人們會被你的效率所驚艷。如果你覺得這聽起來太困難、你沒有時間、其他壓力太大,那就跟你的老朋友談談,看看到底什麼才是值得你花時間去做的。
  • 4. 成為真正的局內人
正常來說,你的長官或 CEO 會做出對機構或公司最有利益的事情,畢竟那是他的職責。
當我們說到「公司的最大利益」,其實我們是說某些局內人的最大利益。真正的問題是,你的長官或 CEO 到底把誰當局內人?這些利益共享者的利益又有多重要?
如果你的老闆認為他自己是唯一的獲利者(越出名越好、越快獲利越好),你最好快點逃走,逃得越快越好,不然你會被當成犧牲品。那誰才有資格利益共享?你的投資者或贊助者?員工?學生?人類?重點是:快點找出來。如果你不被當成受益者之一,那就快走。無論你有多愛你的工作,那都只是一廂情願、被濫用的關係。
  • 5. 學會展現成果
「Shipping it」變成科技界一個相當流行的詞彙,意即把你的產品從倉庫拿出來給客人。但除了字面上的意思,它其實還有一種精神層面的意涵:你的東西要到了客人手上才會有價值,而這應該是你一直以來的目標。
在學術範疇中,我寫的大部分軟體都只會在一個系統上執行一次。為了產品而寫的程式則是完全不一樣的東西,這會讓五十萬人使用,而當寫程式成為我的專業時,我發現我並不擅長這件事。
但這同時也代表琢磨好幾年,直到完美產品誕生是沒有意義的。你只要做出一點成果,就把它送出去,寫一份最簡單的報告你就有可能被錄取。晚點再擔心更複雜的學問吧,先搞定基礎,盡快發表它。Just ship it。
  • 6. 懂得 80/20 守則
80/20 守則基本上是說,達成你預期目標的 80% 需要花你整個企畫 20% 的時間,而剩下的 80% 時間就是拿來搞定剩下的 20% 目標。這就像你從郊區開車進城市,你用兩成的時間開了八成的距離,但只要你遇到塞車,最後的兩成距離會花你超久的時間。
這重要在哪?因為人們總是低估計畫所需的時間,科學家跟工程師尤其常這樣。這部分要歸因於經驗:你知道得越多,你越能預測之後有什麼會出錯、以及有什麼是人們一開始不會注意到的有趣東西。
如果你還沒有這些經驗,只要把你預期所需的時間乘以五倍,並且預想五倍時間過後你就能達到「快成功了」的階段
  • 7. 你沒出賣你的靈魂
我念博士全都是因為一些錯誤的原因,其中一個我現在稱之為「學術之罪」。我相信如果我沒有追求博士,我就是浪費了我的天份,我覺得我虧欠所以在求學過程中給我幫助的人:教授們、幫我出獎學金的人等等。但我並沒有,他們也許投資了我的學術未來,也或許對他們的投資沒有兌現、沒製造出一個偉大科學家而感到失望,但那是他們的問題,不是我的問題。
這跟做工作是一樣的道理。人們總是會投資你,但那常常是因為這對他們最有利,而不代表他們買走了你的靈魂。
  • 8. 脫離你的舒適圈
以下是我如何看待這個世界的:

如果身邊一切看起來很熟悉,代表你能學的東西極少。但如果你現在處於非常驚慌的狀態,你可能什麼都沒學到。
在舒適圈內,你熟知圈子裡的每個人、那裏是你的歸屬,你知道如何應付問題,太陽底下沒有新鮮事。如果你想學些新知並成長,你必須離開你的舒適圈,那才是學習的開始、有趣的事情發生的地方。那是一個你無法對每件事立即反應過來的地方。
當然也有某些時刻你會被壓垮,那就是驚恐圈,你在那裏昏倒、你所能做的只有勉強維生,並期待某人快來救你。
最棒的地方就正在你的驚恐圈正前面,那裏才有挑戰、你會在那裏學到最多、改變最多。想辦法去到那裏吧。
「忘記安全。在你所畏懼之處住下。摧毀你的名聲。變得惡名昭彰。」-魯米,伊斯蘭神祕主義詩人
  • 9. 學會馴服你的躁動
舒適坐好、閉上眼睛並正常呼吸。專注在你吐出的空氣,通過你的鼻腔撫過你的上唇,沒別的,就專心做這件事。
你剛剛專心了多久?五分鐘?恐怕不到。
一分鐘?很好。
比二十秒更少?恭喜你,你是正常人。你的腦袋就像猴子一樣,會抓住最近的樹枝。在學術上我會換句話說 …… 說好聽一點是「聯想思考」。如果你想要有創意,聯想思考是很好的事情,但它卻是專注力的殺手。
好消息是,你能學會如何專注。外面有一卡車的「提升生產力的技巧」,但他們都只抓到皮毛,你不會想要一個分心自由寫作的軟體,你想要永遠撫平你猴子般跳來跳去的思緒。
對我有效的跟對你有效的可能完全不同。對我來說,定期靜坐冥想非常有效(同時有其他許多優點與副作用),但就算是冥想靜坐也有很多種不同的形態與傳統,而我不可能找到一個對大家來說都適用的。我所建議的,是讓你的意識保持一定的型態,並且很認真的對待它。你認為靜坐是浪費時間嗎?你會去健身房健身,但你應該要兩倍的時間在腦力運動上。
只有好好地集中精神,你才能一步一步完成所有的目標。
(資料來源:Medium;圖片來源:Paul Kline, CC Licensed)

http://techorange.com/2014/08/13/9-things-i-learned-as-a-software-engineer/

Monday, August 18, 2014

7Zip does not terminate exit close after finished completion

Try adding the -y switch (assume Yes on all queries)

Or try to redirect the output content to a file:

cmd /c "C:\\Program Files\\7-Zip\\7z.exe" x Src.7z -oD:\\tmp -r -y > out.txt

Note: sometimes the problems with calling processes is that you need to process / clear the output the produce. once their output buffer is full, they wait for the buffer to come free again.

http://stackoverflow.com/questions/4564367/7zip-does-not-exit-after-processing-large-zip-file-compression

Wednesday, August 13, 2014

C# start run external process program

        private void startSQL(string datadir)
        {
            ProcessStartInfo sqlprocessinfo = new ProcessStartInfo()
            {
                CreateNoWindow = true,
                UseShellExecute = false,
                WindowStyle = ProcessWindowStyle.Hidden,
                FileName = "bin\\mysqld.exe",
                Arguments = "--defaults-file=\"" + datadir + "-my.ini\" --datadir=\"" + datadir + "\""
            };

            try
            {
                Process sqlprocess = Process.Start(sqlprocessinfo);

                if (sqlprocess.HasExited)
                {
                    MessageBox.Show("Start MySQL failed.");
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw;
            }
        }

Tuesday, August 12, 2014

rename move database on MySQL

show tables from old_db;

rename table old_db.tableName1 to new_db.tableName1, old_db.tableName2 to new_db.tableName2, old_db.tableName3 to new_db.tableName3;

SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
' TO ','new_schema.',table_name,';')
FROM information_schema.TABLES
WHERE table_schema LIKE 'old_schema';