about 5 years ago

Yesterday, I try to use i18n in django 1.4 and I face into a bottleneck immediately.

The basic steps are:

  1. Use ugettext to translate the word you want.
  2. Make a locale folder in your django project folder.
  3. Make .po files through django-admin.py makemessages -l en
  4. Compile the messages through django-admin.py compilemessages

It seems that I did everything mentioned in the official guild. And it works
on django 1.3. But, it is not work in 1.4. Why?

Because, in 1.4, django won't discover the translation in project folder. All
you have to do is adding the locale path in settings.py.

LOCALE_PATHS = (  
    os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'locale'),  
)
 
about 5 years ago

前言

最近因為接觸到 Knockout.js 而看到 MVVM。因而想起好一陣子前,曾經試著了解 MVC,但卻一知半解。經過一些努力,總算比較了解 MVC (Model-View-Controller) 與 MVVM (Model-View-ViewModel) 的運作模式。

Controller and ViewModel

MVC 與 MVVM 這類 Design Pattern 主要的作用是將一個軟體分成三部分,讓設計師能專注於介面的設計 (View),工程師專注於程式邏輯 (Controller or ViewModel),提昇工作的效率。

流程

一般來說,使用者的操作通常有兩種進入點,一是以 Controller 為進入點的 Pure Web Application,另一則是以 View 為進入點的 Plugin Web Application,如:Flex。

以 Controller 為進入點的流程大致如下:

  1. 使用者操作 UI 觸發一個動作 (請求) ,發出一個請求 (Request) 至 Server
  2. Controller (View fucntion) 處理 Request,更新 Model 的資料
  3. Controller 將 Model 套入用以顯示的 View
  4. Controller 回傳整個 render 完成後的 View 給使用者

以 View 為進入點的流程大致如下:

  1. 使用者操作 UI 觸發一個動作 (指令)
  2. View 通知對應的 Controller 動起來
  3. Controller 執行相對的運算,並在有需要時修改 Model
  4. 如果 Model 有被更動,Model 會發現並通知 View
  5. View 得知 Model 已經經過修改,抓取資料並更新 UI 上的顯示

結論

MVVM 從字面上來看,其不同點在於將 Controller 換成 ViewModel。二者之間的工作是類似的,都是處理請求。其最大的差異在於顯示於 View 中的資料是如何綁定的。

從上面 MVC 的流程可以發現,View 的資料來源是 Model。但在 MVVM 中 View 與 Model 沒有任何的綁定,反而,它與 ViewModel 綁定。當 ViewModel 收到指令,與 Model 互動完後,會利用 Model 的資料更新自身的 state (data),並通知 View 狀態已改變,此時,View 則立刻從 ViewModel 獲取資料並顯示在 UI 上。

 
about 5 years ago

Today, I need to transform the CIDR into netmask. The key point is the formula of transformation. The rest work are string handling. I record it there. Maybe, I will use it in the future.

def cidr_2_submask(cidr):  
    cidr_in_hex = "%x" % (0xffffffff - ((2 ** (32 - int(cidr)) - 1)))  
    masks = []  
    for x in range(0, 8, 2):  
        masks.append(str(int(cidr_in_hex[x:x + 2], 16)))  
    return ".".join(masks)