星期二, 1月 25, 2011

Caught UnicodeDecodeError while rendering ... unexpected code byte

Django的樣板裡頭打上中文的時候,出現了如標題的錯誤

Caught UnicodeDecodeError while rendering ... unexpected code byte

找了各種原因,原來是Vim儲存時沒用utf-8編碼去存。
只要在vim下打
:set fenc=utf-8
再去編輯儲存就可以了。

星期六, 1月 22, 2011

Hello World of Linux Kernel Module Development

花了好些時間從算搞定。

首先先編譯Kernel,參照下列網址

http://blog.avirtualhome.com/2010/11/06/how-to-compile-a-ubuntu-10-10-maverick-kernel/
http://duopetalflower.blogspot.com/2010/10/ubuntu-maverick-64bit-kernel.html

編譯好裝上新Kernel後,就可以在/lib裡頭看到新的kernel了。

接著在home目錄下編輯hello.c
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
接著再編輯Makefile
obj-m := hello.o // 目標module
KERNELDIR = /lib/modules/2.6.35-24-cacore/build // 2.6.35-24-cacore是編譯過的Kernerl名稱
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
接著執行make,應該會出現hello.ko檔
然後
#sudo insmod hello.ko
可以裝上module

#sudo rmmod
會移除module

完成!

後記:用inmod不會去檢查相依性,所以建議改用modprobe
下列是新增及移除的方法
#modprobe module [parameter]
#modprobe -r module

星期四, 1月 20, 2011

Generic Relation in Django

有時候,Model中的某個欄位是ForeignKey,

而偏偏又不能確定該欄位是指向什麼Model的時候該怎麼辦呢?

Generic Relation是在Django裡的好辦法!

使用方法如下:
1.給Model一個ForeignKey欄位,指向ContentType
2.再給Model一個欄位,用來儲存所要指向的Model的Primary。
在這裡注意一下,如果型態給IntegerField,那就不能指向PrimaryKey是CharField的Model囉!
3.再一個欄位,型態是GericForeignKey,然後把上面兩個欄位給它。就可以了。

文件中有個簡單的範例:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class TaggedItem(models.Model):
tag = models.SlugField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')

def __unicode__(self):
return self.tag
可以看到tag本身當然還不確定會去tag什麼model,所以就用Generic Relation是再好不過了!
執行時再決定所指向的是什麼就可以了。
>>> from django.contrib.auth.models import User
>>> guido = User.objects.get(username='Guido')
>>> t = TaggedItem(content_object=guido, tag='bdfl')
>>> t.save()
>>> t.content_object


參考自:http://docs.djangoproject.com/en/1.2/ref/contrib/contenttypes/

星期四, 12月 23, 2010

Do things in Dir by C

C語言中如何處理目錄中每筆記錄

在freeBSD裡面的man中說明:
Sample code which searches a directory for entry ``name'' is:
DIR* dirp;
struct direct* dp;
len = strlen(name);
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL)
if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
(void)closedir(dirp);
return FOUND;
}
(void)closedir(dirp);
return NOT_FOUND;


十分簡單卻有用。

星期三, 11月 10, 2010

修改已經存在的table -- django-evolution

在manage.py syncdb中,他並不會修改已經存在的table。

所幸有位救星出來了:django-evolution

他可以在修改model後,新增或減少欄位,都直接去alter table。

安裝方法如下:
easy_install -U django_evolution

使用步驟如後:
1. Add django_evolution to the INSTALLED_APPS for your project
2. Run ./manage.py syncdb
3. Make modifications to the model files in your project
4. Run ./manage.py evolve --hint --execute

記得,新增的欄位要給default值,否則要設定null=True,
否則會出現initial value沒有指定的錯誤。

參考:django-evolution