2014年12月30日 星期二

Python logging (一)

以下是python logging的徹底研究,大家可以一條一條的讀下去,相信會對logging模組的使用有幫助。
  1. 為何要使用logging?
    • 程式執行中,有時需要輸出一些訊息來記錄執行狀態、錯誤、...
    • 訊息可以寫在檔案中,較緊急的訊息可能同時要寫檔案、console顯示、寄email提醒、(或其它管道)
    • 使用logging模組,可以讓我們方便達成單一訊息送至多個管道的功能(個人覺得是最大的好處)
  2. 只在console顯示 (stderr, 預設等級warning以上才顯示,從輕到嚴重分成debug, info, warning, error, fatal/critical 五級)
  3. >>> import logging
    >>> logging.debug('Hi')
    >>> logging.info('Hi')
    >>> logging.warning('Hi')
    WARNING:root:Hi
    >>> logging.error('Hi')
    ERROR:root:Hi
    >>> logging.fatal('Hi')
    CRITICAL:root:Hi
    >>>
  4. 改成從sys.stdout輸出,層級是debug以上就顯示,可使用logging.basicConfig:
  5. >>> import sys
    >>> import logging
    >>> logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
    >>> logging.debug('Debug Msg')
    DEBUG:root:Debug Msg
    >>> logging.info('Info')
    INFO:root:Info
    >>> logging.warning('This is a warning')
    WARNING:root:This is a warning
    >>> logging.error('錯誤發生了')
    ERROR:root:錯誤發生了
    >>> logging.fatal('快來救人阿')
    CRITICAL:root:快來救人阿

  6. 注意:logging.basicConfig 必須在輸出訊息之前呼叫,而且只能呼叫一次。第二次就沒效了。
  7. logging.basicConfig 的詳細介紹,請呼叫 print(logging.basicConfig.__doc__),可看到它還有哪些參數可以使用。
  8. 如何將訊息輸出至檔案?
  9. # 輸出至 log.txt,如果已存在會接著記錄
    logging.basicConfig(filename='log.txt')
    # 輸出至 log.txt,同上
    logging.basicConfig(filename='log.txt', filemode='a')
    # 輸出至 log.txt,會開新檔案
    logging.basicConfig(filename='log.txt', filemode='w')
  10.  如何同時輸出至console和檔案?下例會同時輸出在console和log.txt中。當只有單一輸出時,可以用filename來指定目標檔案,或用stream來指定目標stream。如果要輸出至多個目標,就要將它們以list of handlers當參數傳入。
  11. >>> import sys
    >>> import logging
    >>> logging.basicConfig(handlers=[logging.StreamHandler(sys.stderr), logging.FileHandler('log.txt')], level=logging.CRITICAL)
    >>> logging.debug("Let's debug")    # 無輸出
    >>> logging.critical("Let's go crazy")
    CRITICAL:root:Let's go crazy
  12.  練習一下,如果要同時輸出到stdout和stderr,可以這麼作(當然我們應該不會真的這麼作):
  13. >>> import sys, logging
    >>> logging.basicConfig(handlers=[logging.StreamHandler(sys.stdout), logging.StreamHandler(sys.stderr)])
    >>> logging.warning('你確定要這麼作嗎?')
    WARNING:root:你確定要這麼作嗎?
    WARNING:root:你確定要這麼作嗎?
  14.  輸出的訊息格式是可以改的。例如我們如果要將訊息放在最前面,可以這麼作:
  15. >>> import logging
    >>> logging.basicConfig(format='%(message)s:%(levelname)s:%(name)s')
    >>> logging.warning('倒過來看會有些不習慣')
    倒過來看會有些不習慣:WARNING:root

  16. format當中,可以使用的參數有:
  17. %(name)s            logger名稱(之後介紹)
    %(levelno)s         10, 20, ... 50 =>DEBUG, INFO, WARNING, ERROR, CRITICAL
    %(levelname)s    DEBUG, INFO,  WARNING, ERROR, CRITICAL
    %(pathname)s    呼叫logging的執行原始碼的完整路徑
    %(filename)s       %(pathnames)s 中的檔名部份
    %(module)s          Module
    %(lineno)d           原始碼正執行到的行數
    %(funcName)s     Function name
    %(created)f         一筆log訊息的產生時間(time.time()  return value)
    %(asctime)s        一筆log訊息的產生時間(文字格式)
    %(msecs)d           一筆log訊息的產生時間的毫秒部份
    %(relativeCreated)d  從logging載入算起,至一筆log訊息產生所經毫秒數
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s       log訊息
  18. 時間的格式可以更改,方式是使用 datefmt 參數:
  19. >>> import logging
    >>> logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
    >>> logging.warning('Warning msg')
    2014/12/30 21:51:44 Warning msg
  20. 如果要印出milliseconds,不能使用datefmt='%Y/%m/%d %H:%M:%S.%f',而是要這麼作(參考 10 當中的 %(msecs)d ):
  21. >>> import logging
    >>> logging.basicConfig(format='%(asctime)s.%(msecs)d %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
    >>> logging.warning('印出milliseconds的方法如上')
    2014/12/30 21:58:30.869 印出milliseconds的方法如上
待續.....
(目前個人自己並沒有更進階的需求,所以暫時就到此為止)

2014年12月29日 星期一

林海峰與藤澤朋齋的東坡棋故事

在Wikipedia上的林海峰先生介紹中,看到了他與藤澤朋齋的東坡棋故事。Wikipedia上寫的是錯的。我又試在用Google找了一下,發現看到的內容和Wikipedia上的差不多,也是錯的。Wikipedia寫說:
五勝一敗的林海峰於名人挑戰權中關鍵賽中遭遇藤澤朋齋九段,其師吳清源料中藤澤必以東坡棋(模仿棋)應戰,乃教之搶佔天元的破解法,使藤澤無從模仿。歷經十多小時之纏鬥,藤澤棄子投降。另外,棋界人士發現此戰從第一手至第七十三手竟與八年前吳清源對戰藤澤朋齋之對戰下位完全相同,為棋界至今津津樂道。
小時候在家裡看過三四十年前出版的「林海峰的人和棋」,當中有正確的版本。那本書應該還在,不過要花時間找一下。實際情形是,那一步天元是他自己臨場想的
林海峰在和藤澤朋齋比賽之前,去找了吳清源。吳清源擺了自己之前和藤澤朋齋的棋,那一局藤澤朋齋下東坡棋,而且最後吳清源輸了。因此,受其思路之影響,林海峰前面下出了和吳清源相同的棋。
但是,林海峰臨場想說:「這樣下去不是辦法。當年老師輸了,我如果照老師的棋繼續下,最後也難逃敗局。」於是,他花了一兩個小時的時間(忘記是一個多或兩個多小時),思考下一手棋。長考後,他下在天元,讓對手無法再模仿。最後仍經過波折才贏得了該局,而非wikipedia所說,好像搶了天元就贏了(棋靈王看太多?)
先記錄在此,哪天找到了書,再去幫wikipedia改一下。

2014年11月23日 星期日

python 3.4 tkinter widgets (整理中)

以下是我用 dir(module name)撈出來整理的widgets資料,人工過濾了一些底層不大會直接用到的 class,仍可能有一些還沒濾掉。目前至少可以看出有哪些可能可以使用的widgets。

在簡易說明中,只有提示簡單的用法。如果完全沒使用過tkinter,可能要先去找Hello world之類的範例來起步。如果要看widgets有什麼屬性,可以用 widget_obj.config() 來顯示。

使用tix的widgets時,要記得使用tkinter.tix.Tk(),不然會有錯誤訊息。

其它可參考之資訊:
http://effbot.org/tkinterbook/tkinter-index.htm (有點舊,但是有助於觀念)
http://www.tkdocs.com/  (有持續更新,如果能夠看英文,建議看它的Tutorial)

tkinterttktix簡易說明或範例(日後補充)
Balloon 例如滑鼠移至按鍵時,冒出說明文字。
ba = Balloon()
ba.bind_widget(btn, balloonmsg='Hello', statusmsg='Hi')
Button btn = Button(text='Hello')
ButtonBox 方便一次新增多個按鍵
btnbox=ButtonBox()
btnbox.add('ok', text='OK', command=lambda : root.destroy())
btnbox.add('close', text='Cancel', command=lambda : root.destroy())
Canvas 此處有不錯的範例
CheckList chklist=CheckList()
chklist.hlist.add('choice1', text='This is Choice1') chklist.hlist.add('choice2', text='This is Choice2') checklist.setstatus('choice1', 'on') # or 'off' checklist.getstatus('choice1') # 回傳 'on', 'off'
Checkbutton ckbtn_var = IntVar()
ckbtn=Checkbutton(text='btn1', variable=ckbtn_var)
ckbtn_var.get() # 之後取值,值為 0, 1
ComboBox str_var = StringVar()
cb = ComboBox(variable=str_var)
cb.insert(tix.END, '一月')
cb.insert(tix.END, '二月')
cb.insert(tix.END, '三月')
str_var.get() # 讀取值
Combobox str_var = StringVar()
cb = comboBox(textvariable=str_var)
cb['values'] = ('一月', '二月', '三月')
str_var.get() # 讀取值
Control 一個輸入數字的文字框,附加上下鍵按紐。
v1 = IntVar()
ctrl = Control(variable=v1)
v1.get() # 讀取值
DialogShell 會跳出一個視窗。 ds = DialogShell() ds.popup() # 跳出 ds.popdown() # 消失
DirList Segmentation fault....
DirSelectBox Segmentation fault....
DirSelectDialog Segmentation fault....
DirTree Segmentation fault....
Entry 單行的文字輸入框
str_var = StringVar()
entry = Entry(textvariable=str_var)
str_var.get() # 讀取值
entry.get() # 也可以
ExFileSelectBox Segmentation fault....
ExFileSelectDialog Segmentation fault....
FileEntry Segmentation fault....
FileSelectBox Segmentation fault....
FileSelectDialog Segmentation fault....
Frame f1 = Frame() # container功用
Grid Layout manager
gd = Grid()
for x in range(3):
  for y in range(3):
    Label(text='{0}-{1}'.format(x,y), master=gd).grid(row=x, column=y)
gd.pack()
HList hl = HList()
hl.add('Item1', text='Item1 Text') # 最上層項目
hl.add('Item1.SubItem1', text='SubItem1 Text') # 第二層
# CheckList當中也有HList,可作出階層效果
InputOnly Segmentation fault....
Label Label(text='要顯示的文字')
LabelEntry Label + Entry。
le = LabelEntry()
le.label['text'] = '請輸入帳號'
le.entry.get() # 之後用這行來讀取值
LabelFrame Label + Frame
ttklf = LabelFrame()
ttklf['text'] = '標籤'
#### (tix.LabelFrame測試時不大能正常顯示)
tixlf = LabelFrame()
tixlf.label['text'] = '標籤'
LabeledScale 用Scrollbar的方式讓人輸入數字。
l_s = LabeledScale() # 預設是0~10的整數
l_s.scale['from'] = -10 #改成 -10~10
l_s.scale['to'] = 100        # -10~100
l_s.label['text']                # 取得目前的數字
Labelframe 參考LabelFrame
ListNoteBook
Listbox
Menu
Menubutton
Message
Meter
Misc
NoteBook
NoteBookFrame
Notebook nb = ttk.Notebook()
#新增兩個tab
nb.add(ttk.Label(nb, 'Hello'), text='Tab 1')
nb.add(ttk.Label(nb, 'Hi'), text='Tab 2')
#目前所在的tab id
tab_id = nb.index(nb.select())
# 刪除 tab
nb.forget(tab_id)
OptionMenu
PanedWindow
Panedwindow
PopupMenu
Progressbar
Radiobutton
ResizeHandle
Scale
Scrollbar
ScrolledGrid
ScrolledHList
ScrolledListBox
ScrolledTList
ScrolledText
ScrolledWindow
Select
Separator
Shell
Sizegrip
Spinbox
StdButtonBox
Studbutton
TList
Text
Toplevel
Tree
Treeview
Tributton

  • 其它: (root = Tk())
    • 使用 Label 來顯示png檔:
      • 安裝 PIL (for python3)
        • sudo apt-get install python3-pil
        • sudo apt-get install python3-pil.imagetk
      • 程式碼:
        • from PIL import ImageTk, Image
          resized_image = Image.open(檔名) 
          img = ImageTk.PhotoImage(resized_image)
          label = Label(root, image=img
      • 注意事項:
        • 上方程式碼中的img,必須要是global variable或是依附在不會消失的物件上(例如 label.image = img),才不會在garbage collection時被清掉,導致無法顯示。
      • 同時顯示圖和文字:Label(text='....', image=img, compound=TOP/BOTTOM/LEFT/RIGHT/CENTER)
    • 修改 Label 的字型、大小、與加強效果
      • label = tk.Label(root, text='Hello')
      • label['font'] = (字型, 大小, 效果)
        • 字型:字串,例如 Times, arial
        • 大小:數字
        • 效果:normal, bold, italic, underline, overstrike,可一次使用多個
      • Example: label['font'] = ('Times', 20, 'bold italic')
    • 視窗最大化/全螢幕:
      • root.attributes('-zoomed', True)  # 最大化
      • root.attributes('-fullscreen', True) # 全螢幕
    •  

2014年8月29日 星期五

紐西蘭開車與台灣開車本質上的不同

在紐西蘭和台灣開車,表面上的不同,是紐西蘭靠左行駛,而台灣靠右。另外,還有幾個口訣, 例如大彎讓小彎、幹道優先行等等。除了表面上的不同,如果能夠認清本質上的差異,在紐西蘭開車就能更得心應手。

開車是一群人的事,那一群人要有共識,才不容易出事。在台灣的市區,因為地狹人稠,大家開車的車速不會特別的快,但是常常會鑽來鑽去、切換車道。經過沒紅綠燈的交叉路口常會減速,以防有其它車子衝出來。有個美國人說:「在台灣,車子都離你很近,但是不會撞到你;在美國,車子看起來離你很遠,但是會撞到你。」大家多少都不大守規則,但是也提防人家不守規則,這就是台灣市區的開車。

在紐西蘭的路上,優先順序是很嚴格的。在行人優先的地方,行人過馬路常是不看路的,因為他覺得司機一定會讓他;在大小路交會處,大路的車優先,經過交會處是不會減速的,因為他覺得小路的車子一定會讓他。台灣人剛去紐西蘭,就算身處幹道,經過交會處仍會減速以防萬一,但是後方的當地人可能就不習慣了,他們不會減速,反而有可能撞上你。另外,紐西蘭人比較少換車道,但是他們在自己的車道上,會習慣性的超速。相對的,他們也不會預期其他人會沒事換車道。在那兒,大家比較遵守規則,但是不大會去提防人家不遵守規則。當你不遵守規則會有危險,甚至你去提防人家不守規則時也可能有危險。當路權是你的,你就是不要減速。

當兩種習慣不同的人,在路上開車時,就容易出事。去紐西蘭開車時,認清本質上的差異,就容易理解他們的規矩,進而以紐西蘭的方式在紐西蘭開車,如此就可以減少出事的機率,可以快樂出門,平安回家。

2014年8月28日 星期四

今天灌了ubuntu14.04...

灌完之後,想要在panel新增一些東西。
發現mouse右鍵按下去,居然沒有反應。
上網路查,發現很多人也有類似的問題。
有人說要按Windows+Alt+右鍵,但是我試了仍然不行。
我的mouse右鍵是好的,在其它地方按右鍵都有用。

現在,決定要改灌 lubuntu 了.....

2014年7月10日 星期四

lubuntu筆記

  • 開機時自動登入 (auto login)
    • 編輯  /etc/lightdm/lightdm.conf 如下(新增反白區的兩行,USERNAME改成欲login 的使用者帳號):
    • [SeatDefaults]
      autologin-user=USERNAME
      autologin-user-timeout=0
      user-session=Lubuntu
      greeter-session=lightdm-gtk-greeter

2014年6月18日 星期三

目前在唸黃帝外經

近期知道原來還有一本黃帝外經,好像是三十年前從漢代的古墓中出土的。前天買來看了一下,還沒看完。

此書很有意思,內容主要是幾位大臣向歧伯請益。當中還有類似「為何內經這麼寫....」之語,有明確的提到「內經」、「素問」、「靈樞」。當中的語句似乎比內經還容易懂,而且是在內經之後才完成的。對內經有興趣的人,千萬不可錯過黃帝外經。

2014年6月5日 星期四

不負責之黃帝內經略讀筆記(一)

前言

看了一些今人對黃帝內經的解釋和引申,覺得人人都很厲害,但是各個說的都有些不一樣。最後決定自己來唸原文。原文聽說是從口耳相傳開始,所以難免會有一些錯誤,這也是在唸的時候要注意的事。目前先進行一次略讀的工作,希望對於陰陽氣血、五行生剋等等,有進一步的認識,以便於融會貫通中醫知識。


上古天真論篇第一

  1. 腎受五臟六腑之精而藏之
    • 腎有精、五臟六腑亦有精
  2. 五臟盛,有多餘的精,就能生子、髮不白、身不重。
    • 精會帶給身體能量
    • 今之小女生常常生理期過早:營養太過。
  3. (原文供參考) 女子七歲,腎氣盛,齒更髮長;二七而天癸至,任脈通,太衝脈盛,月事以時下,故有子;三七腎氣平均,故真牙生而長極;四七筋骨堅,髮長極,身體盛壯;五七陽明脈衰,面始焦,髮始墮;六七三陽脈衰於上,面皆焦,髮始白;七七任脈虛,太衝脈衰少,天癸竭,地道不通,故形壞而無子也。
  4. (原文供參考) 丈夫八歲腎氣實,髮長齒更;二八腎氣盛,天癸至,精氣溢寫,陰陽和,故能有子;三八腎氣平均,筋骨勁強,故真牙生而長極;四八筋骨隆盛,肌肉滿壯;五八腎氣衰,髮墮齒槁;六八陽氣衰竭於上,面焦髮鬢頒白;七八肝氣衰,筋不能動,天癸竭,精少,腎臟衰,形體皆極;八八則齒髮去。
  5. (原文供參考) 腎者主水,受五臟六腑之精而藏之,故五藏盛乃能寫。今五臟皆衰,筋骨解墮,天癸盡矣。故髮鬢白,身體重,行步不正而無子耳。

四氣調神大論篇第二

  1. 春夏秋冬、生長收藏。逆之傷肝心肺腎。
  2. 春夏養陽,秋冬養陰。

生氣通天論篇第三

  1. 陽:
    1. 人之氣通於天之氣,人若順著天之氣,則陽氣(衛氣)固。另一想法是人順天氣,可吸收日月精華,除了從食物之外,還可從天氣來補氣(食氣)。
    2. 陽氣若天與日,遇到寒暑濕氣(氣滯、氣虛?)會傷陽氣,造成神氣浮、躁喘、傷筋、身腫。
    3. 煩勞時,需要更多的陽氣,所以會消耗更多的精。當精絕時,會使人目盲耳聾。
    4. 大怒時,陽氣與形分離而造成腦溢血(陽不足時,血會流出管外)。
    5. 汗出不澈,會有皮膚的病變。
    6. 陽氣不行,營氣不從,易受風而生百病。
    7. 陽氣的量如太陽之運行,日暮之後就該少勞動多休息。
  2. 陰:
    1. 藏精供應陽之所需
    2. 陰太少,陽太多,血脈會太快、人會發狂。
      • (陽氣帶動血,血少較輕所以流速快? 心臟查覺血少而加速流動?)
    3. 陰太多,陽太少,五臟氣爭,九竅不通。
      • 陽無法透達至九竅,所以九竅不通?
      • 五臟本身也要氣,所以氣就少了。多的氣才會分給其它部位。
    4. 風入體內傷精傷肝(造成陰陽不和),此時某臟腑過度使用也會被波及,例如吃太飽易下痢生痔,出力過度傷腎傷骨。
    5. 陰由五味而生,酸苦甘辛鹹會補臟之氣,但是也可能因此剋到其它的臟。
     

金匱真言論篇第四

  1. 和四氣調神大論提到類似的論調,觀念猜測大概是:
    •  春季天氣通肝,情志與外邪易傷肝之精,進而影響到木生火,所以夏季易病洞泄寒中。
    • 夏秋冬同理。
    • 再強調精是身之本,藏於精者不病。
  2. 陰與陽
    • 外為陽,內為陰
    • 背為陽,腹為陰
    • 腑為陽,藏為陰
    • 平旦至日中/日中至黃昏/合夜至雞鳴/雞鳴至平旦:陽中之陽/陽中之陰/陰中之陰/陰中之陽,人也要順應著日的變化。
    • 冬病在陰(腎為陰中之陰),夏病在陽(心為陽中之陽),春病在陰(肝為陰中之陽),秋病在陽(肺為陽中之陰)。(脾為陰中之至陰)。
  3. 五藏應四時,各有收受乎?
    • (原文) 東方青色,入通於肝,開竅於目,藏精於肝,其病發驚駭。其味酸,其類草木。其畜雞,其穀麥。其應四時,上為歲星,是以春氣在頭也。其音角,其數八,是以知病之在筋也。其臭臊。
    • 南中西北類似,查書。

 陰陽應象大論篇第五

  1. 治病必求於本:陰陽者,天地之道、萬物之綱紀、變化之父母、生殺之本始、神明之府。
    • 不過,現在很多人都不那麼講陰陽。例如發汗能治感冒發燒,就說將病邪排出、皮表有停水....等等。
    • 不究根本的後果,就是藥愈開愈多,一帖複方當中十幾二十味藥。現在科中作成了粉,更方便這種亂槍打鳥法。有些名醫,甚至一次的藥當中混了五六個複方,每次再看症狀作加減。雖然說也是有人被看好了,但總覺得如果有究本,應該不會作出這種事。
    • 我個人是理論派,傾向將病情歸類到陰陽再處理。還在體會中。
  2. 積陽為天,積陰為地。陰靜陽躁,陽生陰長,陽殺陰藏。陽化氣,陰成形。
    • 陽是什麼? 陰又是什麼? 一般的說法,像氣為陽血為陰、肉體是陰功能是陽。那傷寒論說的「太陽中風,陽浮而陰弱,陽浮者熱自發,陰弱者汗自出」,汗自出像是毛孔不閉,為何是陰弱而非陽有問題?
    • 從「陽化氣,陰成形」來看,其實功能也是有陰陽的。化氣功能屬陽,成形功能屬陰。陽功能的產出也被視為陽,而陰功能的產出也被視為陰。
  3. 地氣上為雲,天氣下為雨之討論
    • 讓氣上天為陽功能,讓雨下地為陰功能。
    • 陽功能有問題,地很多水,但是天空乾燥。
    • 陰功能有問題,水都蒸上天了,地面乾燥。
    • 有一點很重要:如何才能讓天氣地氣循環? 套用物理學,下熱上冷,氣就會對流了。氣正常對流,就不會肺苦氣上逆,可治咳嗽。
  4. 陽為氣,陰為味,味歸形,形歸氣,氣歸精,精歸化....
    • 一般人解釋說,味是食物,形是人體的形。但是我覺得形可能也是食物的形,是否道理是一樣的? 意思是說,例如這個果實長這個樣子,其實和它本身的味和氣有關。
    • 後面提到:形不足者,溫之以氣,精不足者,補之以味。所以味是可補精的。
  5. 陽勝陰病,陰勝陽病。陽勝則熱,陰勝則寒。
    • 陽勝:熱、陰病
    • 陰勝:寒、陽病
    • 本篇最後提到「陽病治陰,陰病治陽」,感覺這兩句的「陽病」「陰病」,和陽勝陰病、陰勝陽病的「陽病」「陰病」定義不同。我覺得這裡的陽病是陽勝,陰病是陰勝。古人傳授這麼多東西,在用詞上難免會有不一致,而且也可能是後人傳錯。是否用「陽症治陰,陰症治陽」較好?
     
     
其於未完成之部份,有些超出負荷不知如何融會貫通。待唸了一輪之後再來領悟。(2014/6/11)
     

2014年5月18日 星期日

關於 \xbb 字元的處理

在使用python時,曾遇到 print \xbb 出錯的問題:
UnicodeEncodeError: 'cp950' codec can't encode character '\xbb' in position 0: illegal multibyte sequence
從來查了一下,得到以下資訊:
  1. \xbb 字元就是「»」這個字元。
  2. windows環境中的命令提示字元,是使用cp950字元集,會有以上錯誤。
  3. 在ubuntu環境下的terminal,是使用utf-8字元集,可以正確顯示。
所以怎麼辦呢?
  • 方法一:將'\xbb'替換掉 (字串的replace)。
  • 方法二:在命令提示字元輸入 chcp65001,會切換成utf-8字元集。它會有輸出,不會有Error,但是輸出結果看似亂碼而非「»」。

2014年5月10日 星期六

皮內針刺神門

昨天自刺,留針8小時。
睡覺時有些燥熱感,排便也不大順,偏乾。
 

2014年5月9日 星期五

在python中交換兩個變數的值(swap)

在比較古老的程式語言中,
如果我們要交換 a, b 兩個變數的值,
標準的方法是:
tmp = a;
a = b;
b = tmp;
使用python不用這麼麻煩。
python有這樣的語法:
a, b = b, a

2014年4月22日 星期二

台灣公投法的明顯問題

以下這一段來自Wiki的公民投票法:

公民投票的結果:公民投票案投票結果,投票人數達全國、直轄市、縣 (市) 投票權人總數二分之一以上,且有效投票數超過二分之一同意者,即為通過。投票人數不足前項規定數額或未有有效投票數超過二分之一同意者,均為否決。

假設我國只有100人,請各位考慮以下兩例:
  1. 公投議題A的投票,有26人投贊成票,25人投反對票
  2. 公投議題B的投票,有50人投贊成票,0人投反對票
按照台灣的公投法,議題A會通過,議題B是否決。

但是我們稍微想一下,就可以發現這個問題:議題B和議題A相比,贊成的人更多,反對的人更少,為何議題A能通過,議題B卻不能通過?

網路上有一些文章說公投法不合理,有些很冗長,有些只是說門檻高,我自認為我這篇這是最短最清楚的。

那該怎麼修正呢? 以下是建議:
公民投票的結果:公民投票案投票結果,有效同意投票數達全國、直轄市、縣 (市) 投票權人總數分之一以上,且有效投票數超過二分之一同意者,即為通過。有效同意投票數不足前項規定數額或未有有效投票數超過二分之一同意者,均為否決。
 「有效同意投票數達全國、直轄市、縣 (市) 投票權人總數分之一以上」的「四分之一」是怎麼來的呢? 是來自於我們期待至少1/2的人來投票,而人數剛好過1/2,而且都投有效票時,要通過大約需要剛好過1/4的同意票,因此以此作為門檻。如果我們認為1/3的人來投票就可以決定議題是否通過,那麼同意投票數只要達1/6就好。

按照這個版本,就可以化解上述的問題,造成議題A和議題B都會過關。

2014年4月18日 星期五

「黑馬」的英文

  • dark horse: 黑馬
    • dark: 暗色、黑色
    • The team is a dark horse in the competition.

2014年4月16日 星期三

制胃酸:旋覆花與海螵蛸的比較

常常在半夜(大約01:00)會因為胃酸逆流而睡不著,一定要起來吃一些東西才能入睡。
因為知道旋覆代赭石湯有制胃酸的效果,加上手上有旋覆花的單方科學中藥,
所以就拿來試用看看。

睡前吃大約1g,吃了兩天,有效果。
但是第三天起,半夜變成會口很渴,又會容易起來上廁所。
一停藥,胃酸逆流當晚又發生。

最近用「胃潰瘍」來找網路文章,發現有幾篇提到海螵蛸很好用。
買了回來,吃了兩晚,覺很比旋覆花好用,晚上沒有口渴的現象。

以上是自身體驗。

2014年4月11日 星期五

如何讓自己的python模組在python2和python3環境下皆可執行

考慮以下的情境:
  • 您有兩個projects,使用python語言,簡稱為PA與PB
  • PA用到別人的舊module(非用不可),用python2.7的語法,所以您使用python2.7 (M1)
  • PB用到別人的新module(非用不可),用python3的語法,所以您使用python3 (M2)
  • 兩個projects有共用的程式碼,您當然將它們抽出來,寫成您自己的module (M3)
因為python3和python2之間,有語法不同的差異,也有module名稱改變的差異,所以您的M3要寫成同時在PA和PB都能使用才行。當然拆成兩份也是可以,不過往後的管理維護上比較麻煩。

  • 化解print function和字串編碼原則的不一致
    • 在python3中,字串統一是使用unicode來儲存;在python2中則是有彈性,但是這個彈性會造成您的module要時時留意編碼問題。在使用python2的大型程式開發,其實就有公司採取「一律先轉成unicode再處理」的原則。
    • 處理方法:在程式碼開頭輸入以下,就可以使用python3的print與字串編碼原則(在使用python3時,該行不會有錯誤)
from __future__ import print_function, unicode_literals 

  • 一般性的處理
    • 在import sys之後,程式碼可以使用sys.version_info取得python的版本。如果只需要分辨python2.x與python3.x,大致上可以這麼作(臨場應變):
if sys.version_info.major == 2:
# codes for python2
elif sys.version_info.major == 3:
# codes for python3

以開utf-8檔為例,只需要 python2 的部份就好了(臨場應變,讓程式碼簡潔):
from __future__ import print_function, unicode_literals
import sys
if sys.version_info.major == 2:
    import codecs
    open = codecs.open

# ....
# 之後可以這麼用

with open(f_name, 'r', encoding='utf-8') as f_in:
    for line in f_in:
        print(line)

2014年4月9日 星期三

中藥如何幫助戒煙

要把煙戒掉,需要很大的意志力。

市面上有一些戒煙產品,例如戒煙貼片,讓戒煙者體內保持尼古丁濃度,來減少從香煙吸入焦油;例如無焦油尼古丁的煙,讓戒煙者逐漸排除對尼古丁和焦油的依賴。聽起來好像都有些道理,不過感覺速度不會很快。

最近試了中藥,十分的速效,只是科學中藥,一兩劑就有不同的感覺(不過藥方不能公佈)。它的原理是清肺,清肺之後,吸同樣的煙會有不同的味道。以前吸煙時覺得很棒的味道,變成了不對勁的酸苦味。

不管大家是用什麼方法,如果加上這樣的中藥處理,相信效果會更快更顯著。

2014年4月1日 星期二

和「skirt」相關的英文整理

  1. skirt: 裙子(n.), 裙子乃圍繞在雙腿外之物,引申有「圍繞」和「避開」的意思(v.)
    1. She wears a skirt. (國小英文)
    2. The road skirts the mountain. (道路「裙子(環繞)」這座山)
    3. The company skirted 1 billion in taxes. (這家公司「裙子(避開、繞過)」了十億的稅)

2014年3月28日 星期五

和「欠」相關的英文整理

  1. indebted:欠錢的、欠的
    1. indebted country (欠錢的國家)  indebted person (欠錢的人)
    2. I am indebted to you for your help. (我感謝你的幫助、類似我欠你一次)
    3. 讀音:in-dE-tid,b不發音
  2. debt:負債(n. 可數、不可數)
    1. one billion foreign debt (十億外債)
    2. He is in debt(他在負債中) He is out of debt (他還完債了)
    3. I owe you a debt / I am in your debt (類似我欠你一次)
    4. 讀音:dEt

2014年2月15日 星期六

胸式呼吸與腹式呼吸

現在大家都很流行說要「腹式呼吸」,
說腹式呼吸可以按摩腹部,
有利胃腸蠕動。

雖然這個觀念應該沒有錯,
但是多數好像一窩蜂的被洗腦了,
所以特作此文說明一下「胸式呼吸」與「腹式呼吸」。

  1. 腹式呼吸
    • 當我們深呼吸時,想像肺是往下擴張的,氣就會吸到深處,造成橫隔膜下降
    • 橫隔膜下降時,會擠壓到腹部,腹部會向外微微擴張
    • 聲樂家多是使用腹式呼吸(目前沒聽過不是的)
  2. 胸式呼吸
    •  當我們深呼吸時,想像肺是前後擴張的,氣就會吸到較淺處,造成橫隔膜上昇
    •  橫隔膜上昇時,會拉到腹部,腹部會向內縮
    •  有些中國功夫,練功時要求作胸式呼吸
它們有一個共同處,就是呼吸要深,才會明顯影響到腹部。
讓腹部擴張是按摩,讓腹部內縮也是按摩啊!

另外,胸式呼吸有一個比腹式呼吸明顯的好處:
作胸式呼吸時,會有擴胸和上下拉脊椎的感覺,我個人覺得有像使用牽引機的功用。
(我個人覺得這可以自我矯正脊椎,可能早就有古書這麼說了)

個人的經驗是,三不五時作個深呼吸,
自己選擇用腹式或胸式,都有助於健康。
「胸式呼吸」並不是「非腹式呼吸」,而是另一種深呼吸的方法。

2014年2月8日 星期六

真的有邪氣嗎?

讀中醫時,唸到虛與實,常會看到類似這樣的說明:「病邪入侵時,正氣與之相抗,是實症」。還有唸到得到表邪時,如果被攻下,會造成表邪入裡。今人可能會以「病毒」來解釋病邪入侵這件事。

最近在試著融會貫通所唸的東西,突然想到大家也常說的「病氣」。例如,按摩師幫客人按摩,可能會接受到客人的病氣。一般人可能會認為,這是因為距離太近而傳染。但是,如果是得到癌症,傳染說就有些無法解釋。(這類情形,一般會被解釋成巧合)

想到後來,覺得最有可能的情形,就是病氣邪氣是存在的。例如病毒入侵而不適,可能是病毒干擾了體內的氣。如此一來,很多東西就能解釋通了。我個人的看法,是病氣邪氣真的存在。

最後,和大家分享三點:
  1. 手心和腳心是病氣最容易散出的地方,探病時避免久站在該處。
  2. 有些按摩師在施術之後,會甩手散病氣,那好像真的是有用的。
  3. 如果身邊有人倒下要急救,又不敢用電擊器,可以試著用力按壓腳心的湧泉穴。這種書上的招式,平時根本沒機會使用,也不知是否有效。最近,有個高中老師用這招,真的把沒氣的同事救起來了。承1與2,處理之後要排病氣。那位老師忘了,結果也生了好幾天的病。

2014年2月4日 星期二

瞑眩反應的解釋

《尚書》〈說命〉篇上:「若藥弗瞑眩,厥疾弗療。」
  1. 瞑眩就是吃了藥之後覺得頭暈,頭不暈的話厥疾不會好。
  2. 厥疾指的應是手足冰冷的問題,起因是氣血不暢通,心熱無沒傳到四肢。
在此以搭遊輪來解釋頭暈:
  1. 遊輪啟航之後,一開始可能覺得頭暈,之後就慢慢習慣了它的搖晃。
  2. 下船之後,一開始也可能覺得頭暈,因為身體習慣了遊輪的環境,反而不適應陸地。
對於氣血不通的病人而言:
  1. 體內的氣血本應是通暢的。不通暢久了,身體就習慣了。
  2. 用藥用針之後,氣血變得通暢,身體一時反而不習慣。
這就是「藥弗瞑眩,厥疾弗療」的解釋。不過,古時候的人常是喝湯藥的,藥效較強,體內的改變較大所以會覺得瞑眩;今日醫生使用科學中藥較多,藥效通常比較弱,可能造成身體有改善,但是程度緩慢所以不覺得瞑眩。