[python][django] 自己開始寫符合RESTful的server與client(1)

前言:

前幾次開始了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/

    • 參考:

最後再寫一次如何把你的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的部分完成當成第二個部分~~~   

[UNIX] 關於在Ubuntu 13.04上面安裝XMPP server Jabberd2 (Jaberd-2.3.2)

太久沒有去操作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 –enable-mysql –enable-ssl –enable-debug –enable-sqlite –enable-db
    • Make and install

      • sudo make

      • sudo make install

  • Prepare to setting jabberd2

    • configure system path setting.

      • make sure pid/log folder ownership.

        • su jabber

        • sudo mkdir -p /usr/local/var/jabberd/pid

        • sudo mkdir -p /usr/local/var/jabberd/log

        • chown -R jabber /usr/local/var/jabberd

        • Make sure it works well via “touch”

      • Link path

        • sudo ln -s /usr/local/etc/ /etc/jabberd 
    • Create MySQL DB for jabberd

      • cd [Install_Source_Path]/tools/ (cd ~/jabberd2-3.2/tools

      • mysql -uroot -p

      • . db-setup.mysql

      • exit mysql, goto http://localhost/phpmyadmin/ to verify if exist a DB name jabberd2

      • ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

    • Editing sm.xml for storage setting.

      • Change DB driver from sqlite to mysql

        • sudo vi /etc/jabberd/sm.xml

        • search sqlite

        • Change in for your mysql account.

      • Change in for your service holder user name. (default setting as jabber)

      • Un-comment  to enable auto create user account via client.

      • Change in the first from "sm" to your server name. (ex: Jabber-Server)

    • Editing c2s.xml

      • sudo vi /etc/jabberd/c2s.xml

      • Change to 'mysql'

      • Change in for your service holder user name. (default setting as jabber)

    • Editing rounter.xml

      • sudo vi /etc/jabberd2/rounter.xml

      • Change for your service holder user name. (default setting as jabber)

    • Editing s2s.xml

      • sudo vi /etc/jabberd/s2s.xml

      • Change in for your service holder user name. (default setting as jabber)

      • Change register server name <id register-enable=”mu> to your server name (ex: Jabber-Server)

  • Launch jabber service:

    • Switch to jabber and run /usr/local/bin/jabberd2 -D (if you want to debug)

    • Verify if jabber server works well

      • sudo netstat -an grep -E ‘5222 5269’
      • Check if both port should be listened.
  • Visit here for more detail.

_
_

Verify Jabberd2 server with jabber client

  • Using Pidgin Client

    • Change “Hosts” setting for host name

      • Editing /etc/hosts in Ubuntu

      • Editing Windowssystem32driveretchost in windows

        • add “yourip  Jabber-Server”
    • Add users as following note:

      • Remember to check option “Create this new account on the server”

      • When you try to add friend (Buddy), remember to add as name@servername

    • For this for other setting

  • Troubleshooting:

    • When user XMPP client add friend and send message . It will occur “XMPP Message Error Message delivery : (Code 404)”

      • Answer: 

        • Make sure friend ID with “username@servername”.
    • Permission for /user/local/var/jabberd2/pid/…

      • Answer:

        • Make sure you run “jabberd” with user name “jabber”

        • Make sure folder access for user “jabber”

[Ruby] 關於Codecademy學習Ruby的心得

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/)

[Visual Studio 2013][ffmpeg] 如何在 VS2013上面使用 ffmpeg

其實相當簡單,不過把一些常遇到的問題記錄一下

  • 可以到官方位置去下載 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)

[Python][Django]開始學習DjangoRestFramework (1)

對於如何架設一個可以使用JSON來讀取與存取資料的Django 
如果要快速的可以使用JSON的部分,可以去使用DjangoRestFramework 

這裡稍微記錄一下,整理流程: 可以參考http://www.django-rest-framework.org/tutorial/quickstart

  • 建立準備環境

    • virtualenv env

    • source env/bin/activate

    • pip installl django

    • pip install djangorestframework

  • 開啓project

    • django-admin.py startproject tutorial

    • cd tutorial

    • python manage.py startapp quickstart

  • 修改Project設定

    • edit tutorial/setting.py (這裡要注意一下, database 的Name跟Engine是否對應)

    DATABASES ={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':os.path.join(BASE_DIR, 'db.sqlite3','USER':'','PASSWORD':'','HOST':'','PORT':''}}

  • 設定資料庫

    • python manage.py syncdb
  • 修改其他的部分就繼續參考原來的說明部分

  • 啟動測試:

    • Python manage.py runserver

    • 直接打開 http://127.0.0.1:8000/users 就可以看結果

接下來應該會弄更複雜的部分,還有去把RESTful關於 post 的部分弄起來….. 

[Python] 如何在Heroku上架設Django- 快速筆記跟錯誤解決方法

自從上次開始重新學習python之後,現在繼續開始把python學習之旅延伸到Django
學習Django 主要是為了要架設所謂的RESTful的server而鋪路
主要也是為了之後可以把server架設起來後,不論是透過行動裝置或是其他的伺服器可以抓取到放在Heroku上面的資料
這邊由於自己也還在摸索,所以對於上列所有的專有名詞請自行點進去觀看

在前一篇文章中,裡面有提到兩個奇怪的指令 virtualenv 與 source  與Procfile
尋找了一下相關的教學文件,這裡可以摘錄一下:

> > Virtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。 Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後,透過 `pip` 安裝的套件會被放在虛擬環境中,專案就可以擁有一個獨立的環境。簡而言之,Virtualenv 可以幫你做到: > > > > > * 在沒有權限的情況下安裝新套件 > > * 不同專案可以使用不同版本的相同套件 > > * 套件版本升級時不會影響其他專案 取自: [http://www.openfoundry.org/tw/tech-column/8516-pythons-virtual-environment-and-multi-version-programming-tools-virtualenv-and-pythonbrew](http://www.openfoundry.org/tw/tech-column/8516-pythons-virtual-environment-and-multi-version-programming-tools-virtualenv-and-pythonbrew) >

另外一篇也有提到: 

> > Virtualenv 可以建立虛擬的 Python 環境,虛擬環境彼此之間互不干擾,也可避免搞亂 Python 主要安裝路徑,可以使用 `virtualenv --distribute venv` 來建立一個虛擬環境路徑,其中 venv 可以是任意的環境名稱,這會建立一個 venv 目錄,進入該目錄後,執行 `source bin/activate` 可以啟動虛擬環境,輸入 `deactivate` 可以關閉虛擬環境。 > > > > [http://www.codedata.com.tw/python/python-tutorial-the-1st-class-3-hello-world-traditional-chinese-edition/](http://www.codedata.com.tw/python/python-tutorial-the-1st-class-3-hello-world-traditional-chinese-edition/) > >

所以依照這兩種意思,可以清楚地了解為了不要混淆到各個專案的套件,所以可以利用virtualenv來做個簡單的隔離.

快速筆記

這裡相當推薦CoreData這篇文章,不論是他的Django版本比較不容易有相容性的問題,之後也有簡單的介紹關於RESTful與Python架構的文章.
我這裡只註解一些比較容易忽略的地方

  • 小心使用另外一篇OpenFoundry的文章由於他的設定文件都是針對Django 1.4.2 如果你的環境比較新.在設定資料庫就會發生問題.

  • 建議的循序漸進的方式如下:

    • 先用python 架設起來,並且可以正確的使用 python manage.py runserver正常執行.

    • 在開始設定Heroku 的檔案 Procfile 或是requirements.txt然後用 foreman start來測試是不是可以正常執行.

    • 最後才用heroku create 跟 git 來push 到Heroku 主機上面去.

  • 這理由這篇文章有提供教學(當然Heroku官方也有) 裡面有提供 Procfile 的設定

    • web: python manage.py runserver 0.0.0.0:$PORT —noreload 

 

git push heroku master 發生錯誤時候的解決方法:

  • No such app as XXXXX-XXXX

    • 原因:

      • 可能是因為執行heroku create兩次
    • 解法:

      • 首先,查看git remote 設定

        • git remote -v  
      • 確定之後移除

        • git remote rm heroku
      •  然後加上新建立的id

        • git remote add heroku YOUR_APP_ID
      • 參考: iT邦幫忙 http://ithelp.ithome.com.tw/question/10061577

  • Push rejected, no Cedar-supported app detected

    • 原因:

      • 這個東西我找了很久,原因可能是任何一種.這邊提供檢查方法跟解決方法.
    • 解法:

      • 先確認local tool “foreman start” 是可以正常執行,來確認 Procfile 跟 requirements.txt沒有任何問題…

        • 如果發生問題,在去這兩個檔案去尋找問題點.
      • 接下來可能是因為你已經開啟了第二個heroku app,由於heroku只能接受開啟一個app,去Heroku控制台去把另外的都砍掉.然重新試試看.