2014/09/27

Python 日期時間運用

  開始認真學起Python這個強大的script language ,因為它可以幫我運用在許多方面,像是Blender / Panda3D / Web scraping 等等。拿來運用時就想到以前在用 Java 時都用建立一套日期及時間的 utility library , 現在語言換了,應該也要先熟悉它如何處理日期及時間,以下整理自己常用的用法:

from datetime import date, time,datetime

# 取得今天日期
today = date.today()

# 日期 減一天
dt = today.replace(day=today.day-1)
print dt.year,dt.month,dt.day
# 月份 加一個月
dt = today.replace(month=today.month+1)
print dt.year,dt.month,dt.day
# 年份 加一年
dt = today.replace(year=today.year+1)
print dt.year,dt.month,dt.day
# 年/月/日 各減一
dt = today.replace(year=today.year-1, month=today.month-1, day=today.day-1)
print dt.year,dt.month,dt.day

以上這個年/月/日加減是有問題, 特別是當該日期為某月第1天時, 使用 day=today.day - 1 會出現以下 exception :

 >>> yesterday = date.today().replace(day=today.day-1)

Traceback (most recent call last):
  File "", line 1, in
    yesterday = date.today().replace(day=today.day-1)
ValueError: day is out of range for month


這時候該使用 timedelta , 請看以下示範:

>>> from datetime import date, datetime, timedelta
>>> tomorrow = datetime.now().date() + timedelta(days=1)
>>> print tomorrow
2014-10-02
>>> print datetime.now().date()
2014-10-01
>>> yesterday = datetime.now().date() + timedelta(days=-1)
>>> print yesterday
2014-09-30



# 輸出格式變化
print dt.strftime("%y%m%d")
print dt.strftime("%y/%m/%d")
# 年份為四位西元年 %Y
print dt.strftime("%Y%m%d")
print dt.strftime("%Y/%m/%d")
print dt.isoformat()

# 取得現在日期時間
now = datetime.now()
print now
# 印出現在的 時:分:秒
print now.strftime("%H:%M%S")
# 印出現在的 西元年月日 YYYYMMDD
print now.strftime("%Y%m%d")


前半部日期的加減是個人覺得很實用的一部份,可以用來一天天推移。從這些程式碼片斷可以看出來Python簡單卻很有威力的地方。換成其它語言可能要寫一堆程式碼才能達成相同的功能。

2014/09/24

Web 測試及網路爬蟲的工具 Splinter

  最近在研究如何自動化到一些網站抓資料,一開始某些靜態網頁比較簡單,不管是用Java 或 PHP 都可以抓下來。但遇到一些使用 JavaScript / AJAX 及網頁會重導到其它頁的動態網頁真的是沒法子,特別是一些還要輸入日期或其它資料的表單網頁。參考了"網路機器人,網路蜘蛛與網路爬蟲 PHP/CURL 程式設計指南"這本書中介紹的工具 iMarco ,但仍無法全自動化。接下來把腦筋動到要用 C# 來控制 IE (Internet Explorer) ,可是時間上不允許,只好再找工具,最後找到了 Splinter 這工具,它其實預設是搭配Selenium 這個 web 測試自動化工具,雖然 Selenium 這個工具有 FireFox plugin , 也有 IDE ,Splinter 才能真正做到全自動化。

     根據官方網站(http://splinter.cobrateam.info/)的介紹,它是一個 open source 工具,用來測試 web 應用程式。使用的語言是 Python。可以讓你自動化瀏覽器的行為,例如:變換網址 (URL)及與網頁互動。

    這裡先介紹在 Windows 平台如何安裝,Linux / Mac OS 比較簡單:
  1. 先到 Python 官網(http://www.python.org)下載 Python 來安裝 , Python 2, Python 3皆可
  2. Google 找一下 get-pip.py ,下載到自己指定目錄
  3. 執行 python get-pip.py 將 pip 安裝起來
  4. 安裝 splinter : 執行 python -m pip install splinter
以上步驟完成後就可以參考 splinter 官網中的範例來測試一下。目前我在 Windows 7 中安裝的是 Python  2.7.8,執行以下程式片段可以執行 FireFox 連上 Yahoo 奇摩,還可以自動輸入關鍵字"CSS3"搜尋成功。


from splinter import Browser
b = Browser()
url = "tw.yahoo.com" b.visit(url); url = "http://tw.yahoo.com"
b.visit(url)
b.fill('p', 'CSS3')
btn = b.find_by_id('searchsubmit')
btn.click()



    當然,前題是要對 html 及 Python 有點了解才能發揮 splinter 的功能。能自動輸入與網站互動後找到所要的網頁資料才只是第一步,資料能取回來存放才是後續的工作重點。在尚未找到 splinter 之前,也使用過 crawler4j 及 Scrapy ,現在終於有個簡單的工具可用了,後續會再介紹一些實例。

安裝 get-pip.py 訊息:
D:\download>python get-pip.py
Downloading/unpacking pip
Downloading/unpacking setuptools
Installing collected packages: pip, setuptools
Successfully installed pip setuptools
Cleaning up...

    不建議使用 IE,預設使用FireFox , 若沒有安裝 FireFox 也請先將它裝好,官方網站說也可以使用Chrome 及 IE,但在Windows 下尚未試成功。也不建議在 Windows cmd.exe 下執行 python.exe 會有編碼問題,請使用 IDLE。或是先使用 chcp 將 code page 先改成 utf-8,在Linux 中沒有這個困擾,或是可以使用Eclipse 安裝 PyDev plugin。在Eclipse 中開發Python 程式是很愉快的。

    當然直接使用 Selenium 可以配合其它程式語言如: C#及 Java,但仍然不如使用 Python 這種script language 來得好用,為使麼呢?因為每次遇到一個新的網頁要爬資料時,都會先開啟瀏覽器檢視網頁原始碼的功能,了解到該頁的HTML DOM 結構,特別是你所要抓的資料是屬於那一個Table 或是那一個 id , name 之類的。這時候可以在Python 的IDLE 環境中一步一步慢慢試,不用每次執行前都要編譯,省事多了!

當使用 splinter 連上網站網頁資料時最好搭配 BeautifulSoup 4 。用起來會更方便,但遇到動態網頁時,使用 splinter 搭配JavaScript 才能針對一些AJAX 網頁及forward 網頁或openwindow 做更進一步的控制。特別是一些要輸入查詢條件及選擇日期等,有了JavaScript 的配合幾乎能克服一些難搞的狀況。等工作較不忙時,希望能整理一些心得及實例分享給大家。
     


2014/09/23

Processing 錯誤訊息原因

  最近在學 Processing 2,有一次因為到選單 File > Preferenece調整了記憶使用量造成以下錯誤訊息及程式掛在那裡不動,若沒真的很懂 Increase maximum available memory 這項設定,不要亂勾:
 


Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: GC overhead limit exceeded
at processing.opengl.PGraphicsOpenGL$InGeometry.allocate(PGraphicsOpenGL.java:7164)
at processing.opengl.PGraphicsOpenGL$InGeometry.(PGraphicsOpenGL.java:7136)
at processing.opengl.PGraphicsOpenGL.newInGeometry(PGraphicsOpenGL.java:6855)
at processing.opengl.PShapeOpenGL.(PShapeOpenGL.java:325)
at processing.opengl.PGraphics3D.createShapeImpl(PGraphics3D.java:258)
at processing.opengl.PGraphics3D.createShape(PGraphics3D.java:181)
at processing.core.PApplet.createShape(PApplet.java:11689)
at CubicGridRetained.setup(CubicGridRetained.java:48)
at processing.core.PApplet.handleDraw(PApplet.java:2361)
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.StringBuilder.toString(Unknown Source)
at java.lang.StackTraceElement.toString(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.Throwable.printStackTrace(Throwable.java:658)
at java.lang.Throwable.printStackTrace(Throwable.java:643)
at java.lang.ThreadGroup.uncaughtException(Unknown Source)
at java.lang.ThreadGroup.uncaughtException(Unknown Source)
at java.awt.EventDispatchThread.processException(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
An OutOfMemoryError means that your code is either using up too much memory
because of a bug (e.g. creating an array that's too large, or unintentionally
loading thousands of images), or that your sketch may need more memory to run.
If your sketch uses a lot of memory (for instance if it loads a lot of data files)
you can increase the memory available to your sketch using the Preferences window.


TOEIC (多益) 845 分心得

  一年多前自已讀去考了一次多益,只考了795分。自已覺得很差,因為聽力部份考的不好,沒想到最近去時代美語上二個月的課惡補(完整課程是至少四個月)。兩個老師教的不錯,但文法閱讀的部份多半強調單字量,聽力部份似乎只能多聽,重點還是單字量。考試技巧真的有點幫助,但模擬試題要多做才能在文法閱讀上來的及寫完。這次真的有寫完,剩下約3分鐘竟然放棄做最後確認及修改,結果這部份只進步了二十分。時代美語老師說文法閱讀部分考400分以上就算很讚了,我是不覺得啦!反而是聽力部份,平時多做了官方指南最新模擬試題,分數平均都在450到470中間,反而考出來沒有那麼理想,真的很不開心。也只進步了30分,真的不想再考了,接下來要加強寫作及口說,這兩方面都到一定水平才能把英文當成有力的技能!

  考多益不是學英文的目的,自己一直不斷在學習,閱讀方面固定每週會至少讀三篇以上文章,聽力方面利用每天通車時使用手機聽預先下載好的ESL PODCAST。

  最近去聽了幾場英文演講才發現聽力方面真的進步不少。已經很少有聽不懂的地方,就算講者說的很快也幾乎都跟得上。

  

  

2014/09/21

使用硼酸滅蟑殺蟑有效方法分享

  我家是幾乎每天開伙,不管怎麼清潔還是有蟑螂問題,殺蟑螂問題頭痛了好一陣子,上網查了一堆資料發現硼酸似乎是有效的方法,但有些人做誘餌的方法太繁複,自已試了一下有個簡單又方便方法的分享給大家:
  1. 到西藥房買硼酸,一包(盒)約30元
  2. 收集塑膠飲料瓶蓋三到五個
  3. 保特瓶或塑膠瓶一個
  4.  保特瓶中加入硼酸數克,加點水,加點米酒(我是加小米酒)
  5. 瓶蓋中加入餅干屑,米粒或地瓜塊(熟的)
  6. 將硼酸水加入每個瓶蓋,不要滿過去即可
  7. 瓶蓋放到餐桌及廚房 等可能出現的地方
三天內可以看到蟑螂屍體,幾乎連續幾天都看到四腳朝天的屍體.若有效請大家分享出去,也請給我點寶貴意見。記得保特瓶中的硼酸水要每天少量加在每一個瓶蓋中保持氣味才能持續吸引小強來吃。硼酸水瓶要放到小孩不易接觸的地方,也請用奇異筆劃上有毒記號提醒家人,以免造成危險。




2014/12/07 後記補充:
  這個方法雖有效,但還是無法全面性解決小強。最近太太買了一個叫"一點絶"的產品,那效果更是可怕。三天內到處都看得到小強屍體,但多半是小隻的,因為小小強吃完一點絶還來不及回家都掛點了,大隻的可能可以撐到回家,且將藥效也順便帶回去。已經一個多月沒看到小強出現了,但三個月後要再施放一次才能持續更久。這東西是否對環境有影響我實在不知道,但滅蟑效果真的是立竿見影。實在受不了硼酸這種較慢方法的人可以參考一下。


VMWare 無法安裝 64 位元(bit) 作業系統問題

  前幾天使用 VMWare 在 Windows 7 64 位元版中要安裝 Ubuntu 14.04 64位元版竟然出現以下錯誤訊息:

     VT-x disabled in the BIOS

    本以為是 VMWare 的問題,改用 VirtualBox 一樣也無法安裝 64位元系統。只好重開機進入BIOS 看了一下,還真的是被關閉了,這真是奇怪的現象。這PC 之前是別人使用,自己家中的是好好地不用進BIOS 開啟就可以使用 64 位元虛擬機器的功能,只能說是玄案!


2014/09/14

3D Game Engine (3D 遊戲引擎)的應用評估

如果你要開發一個3D軟體,你會使用DirectX或OpenGL 從無到有開發嗎?

目前非常懂DirectX或OpenGL的人多半在遊戲業發展,這方面的人材真的很少。所以我個人會考慮使用一些open source 3D game engine 來做軟體。但問題來了,評估了幾個 game engine 之後發現有文件可參考,但有些方面似乎無法符合3D 建模的需求,因為它們多半以開發遊戲為導向。另外一方面也發現,不懂3D圖學及OpenGL 似乎也不行,OpenGL書籍雖然市面上英文書很多,但多半不深入,特別是在建模及模這方面。

這下子又回到3D engine 上,市面上的書中文少的可憐,最近出了一本 : 王者歸來:Panda3D、C++、Python商業化3D遊戲引擎大揭秘
  買回來看了,但仍然是在建模方面很少著力,這下子又把腦筋動到 FreeCAD  上了,它很符合需要,但開發人員不是挺積極的,版本進度很緩慢,再加上穩定度待加強,實在很可惜。最後也看上了 Unity3D ,它比起Panda3D 功能更強大,需要多花點時間了解。

Blender 是個很成功的 open source 3D建模軟體,其Python script API 也很完備。目前個人深入研究中...

也因為這陣子在找 open source 3D 軟體,發現許多軟體都以 Python 為 script language ,像是 Blender / FreeCAD / Panda 3D .... 等等,突然發現這個程式語言又引起我的興趣了。看來需要再深入學習它,目前只懂一點皮毛而已。