คลังเก็บรายเดือน: ตุลาคม 2008
แยก python environment: Pylons + virtualenv + mod_wsgi
ในเครื่องแม่ข่ายเครื่องหนึ่งอาจจะเป็นไปได้ว่ามีคนใช้ Pylons, Django, Turbogears แถมยังอาจจะใช้ package ของ Python ที่แตกต่างๆ กัน. ถ้าลงทุก package ที่ทุกคนต้องการไว้ในส่วนกลางหมดก็เป็นไปได้ว่าอาจจะมีบาง package ขัดแย้งกัน โดยเฉพาะโปรแกรมเดียวกันที่ต่าง version กัน. มากไปกว่านั้นก็อาจจะต้องกวนให้ sys admin ช่วย install ให้บ่อยๆ ด้วย หรือจะให้ทุกคนลง package ในส่วนกลางได้เองหมด ก็อาจจะกระทบกับเสถียรภาพโดยรวมของระบบ. อย่ากระนั้นเลยใช้ virtualenv มาแยก Python environment ของแต่ละคนเลยดีกว่า.
ผมก็เลยลองลง virtualenv ใช้กับ Apache + mod_wsgi + mod_userdir บน Ubuntu 8.04 บนเครื่องส่วนตัวของผมเองดู. ใน entry นี้ผมสมมุติว่าใช้ Apache + mod_wsgi + mod_userdir ได้อยู่แล้วนะครับ (และ มี setuptools ไว้แล้ว) แต่ถ้าสนใจเรื่องการติดตั้งระบบที่ใช้ mod_wsgi ผมก็เขียนเก็บไว้บ้างเหมือนกันที http://blog.vee-u.com/tag/mod_wsgi/
ลง virtualenv ง่ายมากเพียงสั่ง
$ sudo easy_install virtualenv
ก็เสร็จแล้ว
จากนั้นก็สร้าง directory ไว้ลง package ส่วนตัว โดยสั่ง
$ mkdir $HOME/pyenv
จากนั้นก็เข้าไปจัดการสร้าง enviroment โดย
$ cd $HOME/pyenv
$ virtualenv –no-site-packages BASELINE
แล้วก็สร้าง environment สำหรับลง Pylons
$ virtualenv –no-site-packages PYLONS-1
ก่อนลง Pylons ก็ activate environment นั้นก่อน
$ source PYLONS-1/bin/activate
พอ activate แล้ว prompt จะเปลี่นนเป็น (PYLONS-1)$
จากนั้นก็ลง Pylons 0.9.7 (รุ่นทดลอง), SQLAlchemy 0.4.8 และ PasteDeploy (ไม่ต้อง sudo ด้วย)
(PYLONS-1)$ easy install pylons==0.9.7rc2
(PYLONS-1)$ easy install sqlalchemy==0.4.8
(PYLONS-1)$ easy install PasteDeploy
แล้วก็ไฟล์สำหรับเรียก Pylons จาก wsgi ประมาณนี้
APP_CONFIG = "/home/veer/Develop/pylons/ex1/production.ini" import os os.environ['PYTHON_EGG_CACHE'] = "/home/veer/egg" import sys # บอกให้ python ไปหา package ที่ที่เราเตรียมไว้ sys.path = [] sys.path.append("/home/veer/pyenv/BASELINE/lib/python2.5/site-packages") sys.path.append("/home/veer/pyenv/PYLONS-1/lib/python2.5/site-packages") sys.path.append("/home/veer/Develop/pylons/ex1") from paste.deploy import loadapp application = loadapp("config:" + APP_CONFIG)
อะไรที่เขียน /home/veer ต่างๆ นี้คือสิ่งที่ใช้ในเครื่องผม เครื่องอื่นๆ ก็คงใช้ต่างๆ กันไป
เท่านี้เว็บของแต่ละคนก็มี environment ของตัวเองแล้ว อย่างในกรณีนี้ package ต่างๆ ก็มาอยู่ใน $HOME ของแต่ละ user แทนที่จะไปอยู่รวมๆ กันใน /usr/lib ผู้ใช้แต่ละคนก็แก้ได้ สะดวกสบาย
อ้างอิง http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
ทับศัพท์: Tubsub Web
Tubsub API เอาไว้ให้โปรแกรมเรียกใช้งาน. ส่วน Tubsub Web มีไว้ให้คนใช้งานได้ตรงๆ เลย อยู่ที่ http://vivaldi.cpe.ku.ac.th/~vee/tubsub.php.
ขอบคุณสำหรับการแจ้งข้อผิดพลาด และคำแนะนำนะครับ ^_^. (สามารถ comment ใน blog นี้ได้เลย)
ทับศัพท์: Tubsub API
Tubsub API ของ Naist Lab ที่เกษตรฯ ที่ใช้งานบน HTTP ให้โปรแกรมส่งคำภาษาอังกฤษไปที่ server แล้วก็ตอบกลับไปเป็นภาษาไทย เช่น ส่ง cool ไป ก็ได้ คูลกับมา
tubsube2t_client.py:
import pycurl
import urllib
import sys
import simplejson
def tubsube2t(txt):
class Output:
def __init__(self):
self.o = ""
def write_func(self, buf):
self.o += buf
data = urllib.urlencode(dict(input = txt))
o = Output()
c = pycurl.Curl()
c.setopt(c.URL, "http://vivaldi.cpe.ku.ac.th/~vee/tubsube2t.php")
c.setopt(c.POST, 1)
c.setopt(c.WRITEFUNCTION, o.write_func)
c.setopt(c.POSTFIELDS, data)
c.perform()
c.close()
return simplejson.loads(o.o)
demo.py:
from tubsube2t_client import tubsube2t
print tubsube2t('cool')[0]
พอเอาใช้งานก็จะได้แบบนี้
$ python demo.py
คูล
Download http://vivaldi.cpe.ku.ac.th/~vee/tubsube2t_client-20081024.tar.gz ไปลองเล่นได้. ถ้าเจออะไรผิดพลาด ช่วยแจ้งหน่อยนะครับ ^_^.
แก้ปัญหา C++ บน x86-64
ปัญหา C++ เบา x86-64 ก็คงจะมีได้หลายๆ อย่างแต่ที่ผมเจอคือ
(unsigned int)string.find(“…”) == string::npos()
พอเอา (unsigned int) ออกก็ใช้ได้เลย
. กว่าจะเจอแทบแย่ เจอ method ยาว แบบ 300 บรรทัด มี if มี while ซ้อนๆ กันงงๆ หน่อย.
ค้าหาเมล จาก กล่อง spam ใน gmail
เอา chatlog มาปะเลยละกัน
ans: tips: วิธีการค้น email ใน gmail โดยให้มันค้นในกล่อง spam, ให้ใส่คำค้นเพิ่มลงไปว่า “label:spam”
me: โอว
ผมเอา post blog นะครับ
ans: yes
ans: http://mail.google.com/support/bin/answer.py?hl=en&answer=8872 <– เจออีกวิธีแฮะ.
ดอกไม้สีชมพู
ดอกบัวคู่
ดอกชบาสีชมพูขาวในวันแดดร้อน
gtest + autotools (2)
จาก 3 ตอนที่แล้ว
ทำให้มีโครงๆ แบบเกือบใช้ gtest ได้อยู่แล้ว เหลือแต่แก้ Makefile.am นิดๆ หน่อย + กับเขียน sample1.cpp อีก
แก้ Makefile.am เป็นแบบนี้:
INCLUDES = -I$(top_srcdir)
AM_CPPFLAGS = $(GTEST_CPPFLAGS) # คราวก่อนลืมใส่ include path เลยเติมซะ
AM_LDFLAGS = $(GTEST_LDFLAGS) -lgtest_main # link กับ libgtest_main ที่จะไปเรียก test case ทั้งหมดให้
TESTS = sample1
check_PROGRAMS = sample1
sample1_SOURCES = sample1.cpp
sample1_LDADD = $(top_srcdir)/toto/libtiti.la $(GTEST_LIBS)
อันนี้คือ sample1.cpp
#include
#include
TEST(TitiTest, Happy)
{
EXPECT_EQ(1, 1);
}
เสร็จแล้ว ก็คงมั่วๆ บ้างขออภัย





