0

แยก 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

13

ทับศัพท์: Tubsub Web

Tubsub API เอาไว้ให้โปรแกรมเรียกใช้งาน. ส่วน Tubsub Web มีไว้ให้คนใช้งานได้ตรงๆ เลย อยู่ที่ http://vivaldi.cpe.ku.ac.th/~vee/tubsub.php.

ขอบคุณสำหรับการแจ้งข้อผิดพลาด และคำแนะนำนะครับ ^_^. (สามารถ comment ใน blog นี้ได้เลย)

2

ทับศัพท์: 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 ไปลองเล่นได้. ถ้าเจออะไรผิดพลาด ช่วยแจ้งหน่อยนะครับ ^_^.

4

แก้ปัญหา C++ บน x86-64

ปัญหา C++ เบา x86-64 ก็คงจะมีได้หลายๆ อย่างแต่ที่ผมเจอคือ

(unsigned int)string.find(“…”) == string::npos()

พอเอา (unsigned int) ออกก็ใช้ได้เลย :-P. กว่าจะเจอแทบแย่ เจอ method ยาว แบบ 300 บรรทัด มี if มี while ซ้อนๆ กันงงๆ หน่อย.

0

ค้าหาเมล จาก กล่อง 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 <– เจออีกวิธีแฮะ.