Friday, July 29, 2016

對自己狠一點!成功的人,一定留給自己

「斬斷一切纏繞在自己身上的鎖鏈,
唯獨忠於自我」── 金鎮愛
「狠心」在韓文裡用「毒」字來表示,

「狠心」的意思,就是「遵守對自己的承諾」。

說得仔細一點,

就是

「斬斷一切纏繞在自己身上的鎖鏈,

唯獨忠於自我」,

首先你要學習的就是

「嘗試離開眾人獨處」。

──金鎮愛

獨處時間、獨處空間的力量
人要有獨處的時間,才會成長。
守護自己最簡單的方式,就是「獨處」。

獨處,和睡覺是同一個道理。

只能獨自入睡的睡眠時間裡,

人會將當天所學、所體驗過的事情,

在腦子裡接二連三銘記下來,

並啟動潛意識,做夢的同時,

也將新的刺激和新的能量填補進去。

睡眠對人的成長與生存不可或缺;

獨處對成長和生存,

也同樣是絕對需要的。



「脫離分內之事」的狀態 才是獨處
所謂獨處,

基本上就是「離群而出的狀態」。

對一個人來說,

人可以是最美好的天國,

也可以是最可怕的地獄;

可以給我們帶來無限的喜悅,

卻也可能拖住我們的腳步。

另外,

真正的獨處,

是指「脫離分內之事的狀態」。

當我們

從每天不斷重複的

各種分內之事中脫離的時候,

才能感受到生活操之在我。

任何人都需要,別說你例外
然而,

想要一個人獨處,

就非得去旅行嗎?

搞不好比起出發去旅行,

我們更需要的,

是在日常生活的枷鎖裡

擁有「自己的樂園」。

那就是「獨處的時間、獨處的空間」。

任何人都需要自己的時間、自己的空間。

不管是學生、教師、受雇者、

雇主、上班族、自由工作者、

妻子、丈夫、少男、少女,

更別說是兒童,甚至是嬰兒,

全都一樣。



人們想盡辦法 不讓自己獨處,
同時也不想讓 別人獨處?!


有趣的是,

人們卻傾向想盡辦法不讓自己獨處,

同時也不想讓別人獨處。

因為這個社會裡,

大家都害怕遭人「排擠」的關係嗎?

還是怕被人貼上不合群、沒人情味的標籤?

也可能是

因為我們文化中特有的「拉幫結派」社會特性,

或者是因為,

有太多人混雜在一起、太多資訊在空中交流,

形成了這時代的「群癮症」。



必須「狠下心」來才能擁有 獨處的時間
因此,

我們更迫切需要「獨處」的時間。

在無人妨礙,

只屬於自己的時間、空間裡,

好好品嘗沉浸在自己的時間、空間裡的滋味。

無論如何想辦法享受一下獨處時間和獨處空間吧!

獨處空間,

相較之下比較容易獲得。

但獨處時間,

就必須狠下心來才能擁有。

好好學習獨處空間和獨處時間的力學吧!

與自己對決的黎明時分
我的獨處時間,

只能選在黎明時分。

每天黎明,

是我和自己面對面,

與內在的我相遇的時間。

這一段時光充斥著煩惱與角力,

也讓我回顧各種折磨我的痛苦。

同時,

更是讓我集中精神處理非分內工作、

做我自己想做的事情的時間。

要不是有這段完全屬於我的時間,

我想我大概早就瘋掉,或逃到天涯海角去了。



當萬籟俱寂,
眾人皆睡我獨醒之際
我對黎明的崇拜,

可說如滔滔江水,一瀉千里。

當萬籟俱寂,

眾人皆睡我獨醒之際,

讓我有一種隱隱的喜悅。



沒有人找我,

也沒有討厭的電話,

只要能好好活用黎明的時間,

會覺得一天真的很夠用。

不管怎樣,

傍晚或夜裡的時間,

還是屬於消耗性質的。

邀約遊玩的人很多,

可玩可去的地方也很多,

燈火輝煌,充滿誘惑的地方更多。

悠哉地吃完一頓晚飯後,

想再回頭工作就很難。

想多玩點,是入夜後的心理;

相反地,

想多做點事情,就是黎明時的心理。

孤單,也是有好處的。

醒著的人一個都沒有,

營業的地方也不多。

因此,

黎明可說是一個沒有外界誘惑,

只能沉浸在自己世界的自我誘惑時間。

當然,

不是任何人都能成為「黎明型」,

個人情況上實在無法成為早鳥的話,

請繼續擠出其他的時間。

每個人都需要一段隱密又激烈地面對自己、

與自己對決的時間,

不管是晚上十二點前後,

還是上班前、上班後或下班後的時光。



一天至少兩個小時的時間
無論什麼人,

一天裡至少需要兩個小時這樣的時間。

為什麼是兩個小時,

因為去掉進入狀況的十五分鐘,

從狀況裡出來的十五分鐘,

集中精神大約九十分鐘,

就可以做很多事情,

所以兩個小時的時間差不多。

一天花兩個小時,

一年就有七百到八百個小時,

一個禮拜以

工作四十個小時來計算的話,

就等於至少有四個月的時間

是為了自己在工作,

如此累積下來的力量是很驚人的。



所以,
狠下心來讓自己擁有獨處的時間吧!
以自己幽禁自己的方式,

尋找自己的存在感,

擺脫日常生活的羈絆所導致的消耗感。

那麼,

你就能在人生的

分內之事與想做之事中間,

找到平衡點。

與妨礙獨處的事物對抗
這麼多想奪走我時間的誘惑,
該如何擺脫?
然而,

這個世界不肯放我一人獨處,

總以各種方式干涉我,

想剝奪我的時間。

這麼多想奪走我時間的誘惑,

該如何擺脫?



電話最容易干擾我,我該怎麼做?
就以這個時代算得上妨礙獨處時間

排行榜第一名的「電話」為例吧!

我對於找上門來的電話,

訂下了幾項防禦原則。



(1)請託電話,一律以電子郵件連絡
請託電話,例如邀稿、邀約演講或訪談的,

一律以電子郵件連絡,

如此就能明快地在短時間內

傳遞資訊和掌握內容。



(2)訂好不接電話的時間。
例如當我必須全心投入工作的時候,

乾脆就把電話切斷幾天。

或是一天中有幾個小時不接電話,

就當作自己去旅行了。



(3)主要利用簡訊連絡。


(4)沒有來電顯示的電話,盡可能不接,
當作對方會另傳簡訊來。



(5)手機最好只用來撥出用。


要想堅持這些原則,

我自己也有必須盡力做到的原則,

就是「一定回信」。

不把時間 花在沒意義的事情上
不只是業務方面的電話,

連邀約性質的電話也隨即回覆。

因為從我自己無數次拜託他人,

也無數次被拒絕的經驗來看,

就算是被拒絕也想早點知道,

才能尋求其他管道。

不過,對於一些不著邊際的邀約,

也就沒有非得回覆的必要了。

不久之後我就了解到,

電話接到手軟,

不代表工作也接個不停。

有時反而是「如留言般簡短的電話」,

獲取實質機會的可能性更高。



這裡雖然舉了電話為例,

但對於不時剝奪我們時間的所有事物,
都必須建立起自己的原則。
推特、臉書等通訊軟體也可能使人上癮,

因此要有自己活用這些軟體的原則。

Reference:

http://www.cmoney.tw/notes/note-detail.aspx?nid=58236

Tuesday, July 26, 2016

代碼覆蓋率 (code coverage) 是開發流程蠻重要的一環

代碼覆蓋率 (code coverage) 是開發流程蠻重要的一環,用來評估專案內測試的覆蓋率,也代表了自己寫的程式,至少要測試過一次。在 Github 上面最常用的一套就是 Coveralls 相信大家對於此服務並不陌生,一個好的 Open Source 專案一定會在 Readme 上附上 Coveralls badge,證明自己寫的專案都有經過測試,請安心使用。

Coveralls https://coveralls.io/

codecov https://codecov.io/

Travis https://travis-ci.org/

Reference:

https://blog.wu-boy.com/2016/07/new-coverage-service-codecov-io/

Monday, July 25, 2016

How to create a Symbolic Link on Windows 10?

What's the correct way to make symlinks in Windows 10?

You can use either mklink (cmd built-in) or junction (from Windows SysInternals, which is part of Microsoft) in Windows 10 to create junctions.

Notes:

junction can also list junctions and determine if a file is a junction unlike mklink.

mklink is an internal command only available within a cmd shell.

By default Administrator privileges are required to create symbolic links.

It can also be granted to other users. The security setting "Create symbolic links" can be granted at:

Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment\

Using mklink:

F:\test>mklink /j test-junction test

Junction created for test-junction <<===>> test

Using junction:

F:\test>C:\apps\NirSoft\SysinternalsSuite\junction.exe test-junction test

Junction v1.06 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2010 Mark Russinovich
Sysinternals - www.sysinternals.com

Created: F:\test\test-junction
Targetted at: F:\test\test

Reference:

http://superuser.com/questions/1020821/how-to-create-a-symbolic-link-on-windows-10

Saturday, July 23, 2016

Debian Quick Start

Network configuration:

# vi /etc/network/interfaces

// for ipv4

iface eth0 inet static
address 192.168.6.11
netmask 255.255.255.0
network 192.168.6.0
broadcast 192.168.6.255
gateway 192.168.6.1

// for ipv6, you just need to add the entires below the segment as

iface eth0 inet6 static
address 2001:db8::c0ca:1eaf
netmask 64
gateway 2001:db8::1ead:ed:beef

DNS configuration:

# vi /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4

Advanced networking:

Create alias for eth0 to have multiple IP address.

#IP Aliasing
auto eth0:0
iface eth0:0 inet static
 name Ethernet alias LAN card
 address 192.168.6.12
 netmask 255.255.255.0
 broadcast 192.168.6.255
 network 192.168.6.0

Restart Networking Service:

# service networking restart

Install tmux:

# apt-get install tmux

Update apt to ensure we have the latest packages:

# apt-get update

Remove any Vim cruft that might already be on your system:

# dpkg --get-selections | grep -i vim
# dpkg -l | grep -i vim
# apt list --installed | grep -i vim

# apt-get remove vim vim-runtime gvim vim-tiny vim-common vim-gui-common

Install Vim:

# apt-get install vim-nox

Install Git:

# apt-get install git

Monday, July 18, 2016

v.IDOrder undefined (type interface {} is interface with no methods)

v.IDOrder undefined (type interface {} is interface with no methods)

  var f = struct {
    IDOrder   int64
    IsClose   bool
    IsConfirm bool
    IDUser    int64
  }{}
  fPtr := util.StructFieldPtrArr(&f)
  outArr := []interface{}{}

  for rs.Next() {
    if err := rs.Scan(fPtr...); err != nil {
      return nil, err
    }

    outArr = append(outArr, f)
  }

  for k, v := range outArr {
    // incorrect
    log.Printf("%v: %v, %v\n", k, v.IDOrder, v.IsConfirm)

    // correct
    log.Printf("%v: %v\n", k, v.(struct {
      IDOrder   int64
      IsClose   bool
      IsConfirm bool
      IDUser    int64
    }).IDOrder)

  }

Friday, July 15, 2016

To debug InnoDB lock waits for transaction or show how many rows are locked (look under transaction):

To debug InnoDB lock waits for transaction or show how many rows are locked (look under transaction):

Method 1:

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

https://dev.mysql.com/doc/refman/5.5/en/innodb-information-schema-transactions.html

Method 2:

Enabling the InnoDB Lock Monitor

To enable the InnoDB Lock Monitor for periodic output, create the innodb_lock_monitor table:

CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB;

To disable the InnoDB Lock Monitor, drop the table:

DROP TABLE innodb_lock_monitor;

As of MySQL 5.6.16, you can also enable the InnoDB Lock Monitor by setting the innodb_status_output_locks system variable to ON. As with the CREATE TABLE method for enabling InnoDB Monitors, both the InnoDB standard Monitor and InnoDB Lock Monitor must be enabled to have InnoDBLock Monitor data printed periodically:

set GLOBAL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

When you shut down the server, the innodb_status_output and innodb_status_output_locks variables are set to the default OFF value.

To disable the InnoDB Lock Monitor, set innodb_status_output_locks to OFF. Set innodb_status_output to OFF to also disable the standard InnoDB Monitor.

Note: To enable the InnoDB Lock Monitor for SHOW ENGINE INNODB STATUS output, you are only required to enable innodb_status_output_locks.

https://dev.mysql.com/doc/refman/5.6/en/innodb-enabling-monitors.html

Method 3:

Run MySQL command in shell under console:

# mysql -u root -p -e 'SHOW ENGINE INNODB STATUS\G'


------------
TRANSACTIONS
------------
Trx id counter 381
Purge done for trx's n:o < 37F undo n:o < 0
History list length 39
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 84, OS thread handle 0x7f5b66aff700, query id 975 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0, not started
MySQL thread id 50, OS thread handle 0x7f5b66c23700, query id 838 192.168.6.112 jun
---TRANSACTION 32E, not started
MySQL thread id 33, OS thread handle 0x7f5b8c04a700, query id 693 192.168.6.112 jun
---TRANSACTION 35F, not started
MySQL thread id 31, OS thread handle 0x7f5b66c6c700, query id 518 192.168.6.112 jun
---TRANSACTION 340, not started
MySQL thread id 28, OS thread handle 0x7f5b66bda700, query id 381 192.168.6.112 jun
---TRANSACTION 380, ACTIVE 1 sec starting index read
mysql tables in use 2, locked 2
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 83, OS thread handle 0x7f5b66b91700, query id 973 127.0.0.1 go_erp statistics
SELECT   SO.idOrder , SOLine.changed , SOLine.orderQty FROM SO INNER JOIN SOLine ON SO.idOrder = SOLine.idOrder WHERE SO.idOrder = 1 ORDER BY SO.idOrder FOR UPDATE
------- TRX HAS BEEN WAITING 1 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 323 n bits 72 index `PRIMARY` of table `go_erp`.`SO` trx id 380 lock_mode X locks rec but not gap waiting
------------------
---TRANSACTION 37F, ACTIVE 2 sec
5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1
MySQL thread id 82, OS thread handle 0x7f5b66b48700, query id 969 127.0.0.1 go_erp
----------------------------

Method 4:

Install innotop:

# yum install innotop

Reference:

https://dev.mysql.com/doc/refman/5.5/en/innodb-information-schema-transactions.html

https://dev.mysql.com/doc/refman/5.5/en/innodb-trx-table.html

http://www.xaprb.com/blog/2007/09/18/how-to-debug-innodb-lock-waits/

Monday, July 11, 2016

excluding .svn .git files from find command

# find . -type d '(' -name .git -o -name vendor ')' -prune -o -type f

Note: Using -prune to avoid recursing into .svn and .git directories is better than using a regex.

Reference:

http://stackoverflow.com/questions/15883563/excluding-svn-git-files-from-findxargsgrep-pipe

Saturday, July 9, 2016

蘇格拉底的「詭辯」:乾淨的人 與 髒的人,我請這 2 個人 洗澡,誰會 先去洗澡?

在哲學課上學生們向蘇格拉底請教:
「老師,能不能用實例說明一下究竟什麼叫詭辯?」

蘇格拉底稍作考慮一下,然後說:
「有兩個人到我這裡來做客,
一個人很乾淨,一個人很髒。
我請這兩個人洗澡,
你們想想,他們兩個人誰會先去洗澡?」

繼續看下去...

從洗澡看什麼叫「詭辯」

「那還用說,當然是那個髒人。」
一個學生脫口而出。

「不對,是乾淨人。」
蘇格拉底反駁道,
「因為乾淨人養成了洗澡的習慣,
髒人卻認為沒什麼好洗的。」

「再想想看,究竟是誰會先洗澡了呢?」
「是乾淨人。」兩個學生接著說。

「不對,是髒人。
因為髒人比乾淨人更需要洗澡。」
蘇格拉底又反駁道。

然後蘇格拉底再次問道:
「如此看來,兩個客人中究竟誰會先去洗澡呢?」

「髒人!」
三個學生喊著重複了第一次的回答。
「又錯了。當然是兩個都洗了。」
蘇格拉底說,
「乾淨人有洗澡的習慣,而髒人需要洗澡。」

「怎麼樣,到底誰會先去洗澡了呢?」
「那看來是兩個人都洗了。」
四個學生猶豫不決地回答。
「不對,兩個人都沒洗。」
蘇格拉底解釋說,
「因為髒人沒有洗澡的習慣,
而乾淨人不需要洗澡。」

「老師說得都有道理,
但是我們究竟該怎樣理解呢?」
學生們不滿地說,

「你講的每次都不一樣,而又總是對的!」


蘇格拉底說:
「正是如此。你們看,

外表上、形式上好像是運用正確的推理手段,

實際上違反邏輯規律,

做出似是而非的結論,

這就是詭辯!
常見的詭辯手法有偷換論題、
捏造論據、循環論證、
機械類比、強詞奪理、斷章取義等等。」

再從洗澡看出詭辯中的「邏輯錯誤」

學生們又向蘇格拉底請教:
「老師,詭辯就是有意識地為某種謬論做論證,
其中有巧妙的不易發現的邏輯錯誤。
能不能用實例說明一下怎樣才能識破詭辯中的邏輯錯誤?」
蘇格拉底思考了一會兒,
給學生們出了下面的智力測驗題:

「有兩位工人,
一同維修一個多年沒有維修過的又老又舊的破煙囪。
當他們從煙囪裡爬出來的時候,
一位很乾淨,另一位卻滿臉滿身的煤灰。
請問你們:誰會先去洗澡呢?」

一位學生說:
「當然是那位滿臉滿身煤灰的工人會先去洗澡嘍!」

蘇格拉底說:
「是嗎?請你們注意,
乾淨的工人看見另一位滿臉滿身的煤灰,
覺得從煙囪裡爬出來真是骯髒;
另一位看到對方很乾淨,就不這麼想了,
而認為自己一定也很乾淨。
我現在再問你們,誰會先去洗澡?」

兩位學生很興奮地爭先恐後地回答:
「哦!我知道了!
乾淨的工人看到骯髒的工人時,
覺得他自己必定也是骯髒的。
但是骯髒的工人看到乾淨的工人時,
卻覺得自己並不髒啊!
所以一定是那位乾淨的工人先跑去洗澡了。」

蘇格拉底看了看其他的學生,
所有的學生似乎都同意這個答案。

只見蘇格拉底慢條斯理地說:
「這個答案也是錯的。
兩個人同時從又老又舊的破煙囪裡爬出來,
怎麼可能一個是乾淨的,
而另一個是髒的呢?
這就叫做不合邏輯,
也就是詭辯中的邏輯錯誤。」

學生們又向蘇格拉底請教:
「老師,應該怎樣看待詭辯的作用呢?」

蘇格拉底回答:

「會說的不如會聽的。

詭辯有效,但有限。

巧詐不如拙誠,千般巧計不如本份為人。」

Reference: http://www.cmoney.tw/notes/note-detail.aspx?nid=57994

Friday, July 8, 2016

Multiple SSH Keys settings for different github account

Multiple SSH Keys settings for different github account =================================================================
create different public key
---------------------------------

create different ssh key according the article [Mac Set-Up Git](http://help.github.com/mac-set-up-git/)

 $ ssh-keygen -t rsa -C "your_email@youremail.com"

Please refer to [github ssh issues](http://help.github.com/ssh-issues/) for common problems.

for example, 2 keys created at:

 ~/.ssh/id_rsa_activehacker
 ~/.ssh/id_rsa_jexchan

then, add these two keys as following

 $ ssh-add ~/.ssh/id_rsa_activehacker
 $ ssh-add ~/.ssh/id_rsa_jexchan

you can delete all cached keys before

 $ ssh-add -D

finally, you can check your saved keys

 $ ssh-add -l


Modify the ssh config
---------------------------------

 $ cd ~/.ssh/
 $ touch config
 $ subl -a config

Then added

 #activehacker account
 Host github.com-activehacker
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_activehacker

 #jexchan account
 Host github.com-jexchan
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_jexchan


Clone you repo and modify your Git config
---------------------------------------------

clone your repo
 git clone git@github.com:activehacker/gfs.git gfs_jexchan

cd gfs_jexchan and modify git config

 $ git config user.name "jexchan"
 $ git config user.email "jexchan@gmail.com" 
 
 $ git config user.name "activehacker"
 $ git config user.email "jexlab@gmail.com" 

or you can have global git config
 $ git config --global user.name "jexchan"
 $ git config --global user.email "jexchan@gmail.com"


then use normal flow to push your code

 $ git add .
 $ git commit -m "your comments"
 $ git push


Another related article in Chinese

1. http://4simple.github.com/docs/multipleSSHkeys/
Reference: https://gist.github.com/jexchan/2351996