April
27th,
2014
最近不斷地為了PyCon APAC 2014在惡補Python,在臉書的討論區裡面看到這邊討論OpenCV for Python的文章.
有介紹到有人為了OpenCV for Python 寫了專門的講解 blog
好奇之下開始去尋找如何去使用python在Windows上面,想不到真是有點麻煩.
於是又把念頭動到Mac上面,想不到比想像中的簡單多了,參考這篇(update-installing-opencv-on-mac-mountain-lion/)
brew tap homebrew/science
brew install opencv
mkdir -p ~/Library/Python/2.7/lib/python/site-packages
echo ‘/usr/local/lib/python2.7/site-packages’ > ~/Library/Python/2.7/lib/python/site-packages/homebrew.pth
找了一篇測試的程式碼搭配著JPEG果然是成功的,於是開始去把自己之前OpenCV Camera Testing Sample拿來改成python版本.
要改其實不難,主要是要去一個一個把API從C++換成Python.可以去官方API列表來找,幾乎都有兩個語言的版本.
要找詳細的code可以去看Github https://github.com/kkdai/python_learning/blob/master/OpenCV_OpenCamera.py
目前開起相機是成功的,不過要抓取keycode有點問題還需要解決,解決完後就可以弄旋轉的部分.
雜話: 我真的不了解,身為一個軟體工程師有什麼理由不買Mac 的.就算你是Windows 的開發工程師,Mac可以直接裝Windows.更何況如果你是非Windows工程師,使用Homebrew任何程式語言都可以馬上裝好.最近安裝不論是Scala或是這次安裝OpenCV或是之前安裝Django就是那麼簡單.
繼續閱讀
April
22nd,
2014
其實比起架設RESTful的django伺服器,撰寫一個client去對它存取似乎是簡單多了.
要用到的東西也很少,因為Python本身對於JSON的處理就相當的簡單.
所有的處理都是使用到原先架設好的伺服器裡面的資料 http://sleepy-plateau-3929.herokuapp.com/snippets/.json
這裡稍微提一下GET需要注意的事情
可以使用urllib2的urlopen來讀取網頁
JSON有個直接可以使用的json.load
處理過來如果一開始是object可以使用 result[“object”] 來找,反之可以用 list 去處理 List Data
context 的部分,可以處理多個以上的context
context = {“context_1” :value1, “context_2” : value2}
接下來直接看code
POST需要注意的事情
要存取網頁上面的表單資料(form)其實很簡單
request.POST[“value_name”]
表單(form)的樣板(template)記得要有csrf_token
先確認你的伺服器支援post 的RESTful Add,如果要上傳JSON你的Content-Type要對
Python requests 是個好用的library,一定要用
接下來看code
最後完整的github在這裏
繼續閱讀
April
16th,
2014
前言:
前幾次開始了Django設計之後,雖然弄出了RESTful的網站,也使用了DjangoRESTFramework.但是,都是依照範例程式來跑出來的.
所以現在決定除了裡面的範例程式之外,另外在同一個網站裡面弄了一個部分是模擬遠端連線
依照著tutorial 1~3 去修改,所以他的架構如下:
tutorial (主要的專案部分)
snippet (RESTful web site)
負責RESTful的部分,裡面都是使用到DjangoRESTFramework所提供的function.
主要的API 是 snippet
webs (模擬的viewer遠端)
主要這裡就是這次開發的部分,主要提供兩個部分:
一個是顯示所有資料的的部分(json get) ,其中全部顯示已經完成但是顯示詳細的部分還沒有.
另外一個是新增資料(使用 json post)(尚未完成)
遇到的問題集錦:
這裡整理一下 ,我這次做出來所遇到的一些問題:
字串的編碼問題
其實這種問題算是基本的,而且也跟我在中文系統上面執行python有關.
json出來的資料想要parse出來會成為一堆list
每個list裡面的格式會是utf8~如果要在中文上面正確顯示成字串需要decode(‘big5’)~據說Heroku 預設是utf8但是我使用big5還是可以跑.這個要持續觀察.
樣板的目錄設定(TemplateDoesNotExist)
問題狀況:
TemplateDoesNotExist: 500.html
主要原因:
之前在設定的時候都只有一個project 叫做tutorial.但是這次另外建立了一個webs所以template的目錄會出現問題.
依照之前的經驗會以為templates資料夾應該就放在目錄下的/templates/app/,結果因為webs是第二個專案.所以template的設定會維持在第一個,也因為我並沒有在setup.py裡面把TEMPLATE_DIRS設定好.所以會發生這樣的錯誤.
解決方法:
在setup.py 加上以下的部分
PROJECT_PATH = os.path.realpath(os.path.dirname(file))
TEMPLATE_DIRS = (
PROJECT_PATH + ‘/templates/’
)
接下來把原本打算放在webs/templates的檔案移到tutorial/template/
參考:
http://stackoverflow.com/questions/4705962/need-help-with-django-tutorial
最後再寫一次如何把你的Django Code上傳到heroku
python manager.py runserver
首先要確定你可以正常的執行
產生Procfile檔案,其內容為
web: python manage.py runserver 0.0.0.0:$PORT –noreload
heroku login
foreman start
確認沒有錯誤訊息
利用 localhost:5000 查看如果任何功能有問題
pip freeze > requirements.txt
vim .gitignore
確認把virtualenv 產生的目錄加入
*.pyc
git init
git commit -m “任何comment”
heroku create
git push heroku master
heroku ps:scale web=1
記得要先把其他的app dyno設成0或是砍掉~因為沒有付錢的時候heroku只允許dyno=1
heroku ps
heroku open
其實成功之後,之後就可以用其他比較熟悉的git client比如說是SourceTree不需要在console mode的下指令.
查看結果:
Server: http://sleepy-plateau-3929.herokuapp.com/snippets/
Client: http://sleepy-plateau-3929.herokuapp.com/webs/
Github: https://github.com/kkdai/DjangoREST_Client/
先寫到目前的狀況~之後會把POST的部分完成當成第二個部分~~~
繼續閱讀
April
11th,
2014
太久沒有去操作UNIX的系統來灌東西,這次決定完整灌一台Ubuntu 13.04來跑一些東西 Jabber(後來稱為XMPP)是一個開放式的即時通訊協定,之前在公司內部則是有在研究延伸出來的另外一個module Jingle service. 這次回頭來灌系統盡量都使用Advanced Packaging Tool[APT] (ex: apt-get/apt-cache)來完成. 不過Jabberd2 本身是不方便使用APT來裝,因為有牽扯一些設定與更改database 與網路安全的設定 所以在我的流程裡面還使用tarball 自行來設定跟compile **小抱怨: ** 只能說~很多東西真的一段時間沒摸就會生疏~ 連個permission 也能搞我半天~更別說一些指令… 加上近幾年都是在mac上面灌一些東西~有些權限的東西也沒在特別注意… 記錄一些容易出錯的東西….. Install command in Ubuntu: 13.04 (using jabberd2 as server) sudo apt-get update sudo apt-get apache2 Check localhost in web browser for validation sudo apt-get mysql-server It will save your mysql root password. using “mysql -uroot -pPASSWORD” to verify it. sudo apt-get install phpmyadmin Web server to reconfiguration choose “apache2” How to verify installation? Check file exist in /usr/share/phpmyadmin make link, in /var/www ln -s /usr/share/phpmyadmin Web browser open http://localhost/phpmyadmin install jabberd2 (refer for more detail) Install wget first: sudo apt-get install wget Install dependency libraries: sudo apt-get install libexpat1-dev sudo apt-get install libidn11-dev sudo apt-get install libudns-dev sudo apt-get install libgsasl7-dev sudo apt-get install libssl-dev sudo apt-get install libmysqld-dev Download package from web side: wget https://github.com/jabberd2/jabberd2/releases/download/jabberd-2.3.2/jabberd-2.3.2.tar.gz unzip files tar -xvf jabberd-2.3.2.tar.gz Enable MySQL, SSL and debug with configure ./configure...
繼續閱讀
April
8th,
2014
Codecademy是一個可以線上學習程式語言的地方,透過許多的線上題目,你可以快速地學習語言.目前支援的語言有Python,Ruby,PHO,CSS與JavaScript. 每天花不到十分鐘,透過接近一個月的時間,我也把兩三百題都做完了. 在此記錄一些心得與比較重要的了解: Codecademy學習Ruby感想: 這裡些先一些使用Codecademy在學習上的感想吧,希望對大家可以帶來一些幫助 題目不難,但是要讀懂題目比較困難: 大部份的概念其實在Wiki可以看到,但是透過一兩百題不斷地教導.很多觀念會慢慢地深入在你的心裡. 題目主要著重在觀念的傳遞,會不斷地教導: 這裡面主要會利用互動的方式(也就是叫你在螢幕上寫一段code)然後跑出他想要的結果. 所以可能~~寫一個 method 會跑了三個題目一步步來教導你,更別說class會有更多的題目來引導 真的看不懂?沒關係有提示: 別怕真的不會寫,他最後通常都有提示會告訴你應該怎麼進行這個題目.基本上全部會用到的語法都會給你. 接下來會寫一些在這個地方學到個概念,其實之前光是靠Ruby Wiki 與一些自己在學習的實作上面就已經把大部份的概念了解.但是一步步仔細去看反而有不少令人驚豔的地方,讓人覺得Ruby真是個有趣的語言: 關於Ruby的學習: Chapter 15: Blocks Procs 跟 Lambda差異 這一章節相當有趣,把三個容易搞錯的概念 Blocks Procs 與 Lambda來比較,這裡先把三種寫法都先寫一次 Block: block_a = { DO_SOMETHING } Proc: proc_a = Proc.new { DO_SOMETHING } proc_a.call Lambda: lambda_a = lambda { DO_SOMETHING } lambda_a.call 接下來會把它們的不同與差異來詳述一下: Proc 與 Lambda都是一種Block但是有一些差異~接下來會提到 跟Block不同,Lambda與Proc都可以當成參數傳遞並使用 .call 來呼叫 Proc與Lambda都可以傳遞參數,但是Lambda會檢查參數的個數,但是Proc會把他裝成nil Lambda的return 會回到caller,但是Proc直接回傳 def batman_ironman_proc victor = Proc.new { return “Batman will win!” } victor.call “Iron Man will win!” end puts batman_ironman_proc #print Batman will win! def batman_ironman_lambda victor = lambda { return “Batman will win!” } victor.call “Iron Man will win!” end puts batman_ironman_lambda #print Iron Man will win! * 更多部分可以參考: [http://www.adamjonas.com/blog/procs-and-lambdas/](http://www.adamjonas.com/blog/procs-and-lambdas/) Chapter 16: Object-Oriented Programming(I) 在物件導向的程式設計上面,根據Wiki 的說法是這樣子(等等會提到一些原因): Ruby的繼承功能相當脆弱,儘管Ruby是一個物件導向語言,Ruby內的許多規則,卻使得子類別有可能不小心就覆寫了父型別的功能,在《The Ruby Programming Language》一書中,建議除非程式設計師對一個型別相當了解,否則盡可能不要使用繼承。 關於繼承 (Inheritance) Ruby只支援單一繼承.. Ruby在繼承上 Child 的constructor (Ruby叫做 initialize) 並不會呼叫Parent的 initialize. 使用上只能自己加上 super或是使用 composition 的做法.. http://ruby.learncodethehardway.org/book/ex44.html 關於變數在繼承上的應用 @ instance variable: 是個別class分開的.. 但是child 卻無法存取parent 的instance variable (會得到 nil) @@ class variable:...
繼續閱讀
April
7th,
2014
其實相當簡單,不過把一些常遇到的問題記錄一下
可以到官方位置去下載 http://ffmpeg.zeranoe.com/builds/
Shared —> DLL檔案需要給執行檔用的
Dev —> include/lib 你在編譯的時候需要用到
把 include / lib 加入相關的VC設定
需要sample code(範例程式 找找 doc/example/avcodec.c)
如果你改成cpp以下需要注意:
前面需要加上,避免C/C++的衝突
#include
extern “C”{
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
}
* 遇到問題snprintf compiler error
* 換成 _snprintf
* 遇到warning C4996: 'sprintf' was declared deprecated
* 加上#pragma warning(disable:4996)
* Release 會遇到 error LNK2026: module unsafe for SAFESEH image.
* Project Property Page —> [Linker] —> [Advanced]—> [Image Has Safe Exception Handler] ==>YES—> NO
記得要把你會用到的lib 加入link 在這裡是 avcodec.lib, avutil.lib
最後記得exe需要跟prebuild 出來的部分放在一起
最後放上改好的sample
參考:
* [http://elvisjeng.blogspot.tw/2011/11/visual-studio-2010-ffmpeg.html](http://elvisjeng.blogspot.tw/2011/11/visual-studio-2010-ffmpeg.html)
* [http://www.cnblogs.com/Jerry-Chou/archive/2011/03/31/2000761.html](http://www.cnblogs.com/Jerry-Chou/archive/2011/03/31/2000761.html)
* [http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010](http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010)
繼續閱讀