Lập trình
Sublime text - The best editor
Tôi đã từng trải qua nhiều trình soạn thảo khác nhau trên nhiều hệ điều hành. Từ những trình soạn thảo đơn giản như notepad++, Scintilla and SciTE, gedit, textmate hay đến với những trình soạn thảo trong các IDE đồ sộ như Visual Studio, Eclipse, Flash Builder. Nhưng đối với tôi Sublime Text là một trình soạn thảo tuyệt vời nhất.

Sublime text là trình soạn thảo hỗ trợ trên cả 3 nền tảng hệ điều hành: Linux, MacOS, Windows. Đây là một trình soạn thảo nhỏ gọn, mở chương trình nhanh, giao diện cũng rất pro. Cải tiến gần đây nhất của Sublime Text là cho phép gõ các ký tự Unicode đặc biệt là gõ và hiển thị tiếng Việt hoàn chỉnh.
Mọi người có thể xem thêm thông tin về Sublime text tại trang web http://www.sublimetext.com để thấy được các tính năng tuyệt với của nó.
Blog's topic:
Blog's tag:
- huyvq's blog
- 1672 reads
Lỗi khi chạy manage.py createsuperuser
Hôm nay quay lại làm một ứng dụng nhỏ trên Django với môi trường MacOS (Mountain Lion). Mọi thứ có vẻ rất ổn cho đến khi gặp lỗi với dòng lệnh để tạo một superuser
python manager.py createsuperuser
Lỗi được hiển thị ra như sau:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 70, in handle
default_username = get_default_username()
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 105, in get_default_username
default_username = get_system_username()
File "/HuyVu/study/workenv/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 85, in get_system_username
return getpass.getuser().decode(locale.getdefaultlocale()[1])
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 496, in getdefaultlocale
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 428, in _parse_localename
ValueError: unknown locale: UTF-8Hoá ra django không lấy được Locale mặc định của hệ thống. Để khắc phục lỗi này, chúng ta khai báo thêm biến LANG và LC_ALL vào môi trường bằng cách cho thêm 2 dòng sau vào ~/.bash_profile
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
Sau đó nhớ kích hoạt sự thay đổi này
source ~/.bash_profile
Và bây giờ có thể thực hiện tạo superuser một cách bình thường.
Blog's topic:
Blog's tag:
- huyvq's blog
- 1569 reads
Làm quen JDeveloper
Dạo này mình phải làm việc nhiều với JDeveloper nên mình cố gắng viết vài bài biết đâu có người mới bắt đầu làm quen có thể tìm được những điều hữu ích. Cảm xúc đầu tiên về JDeveloper của mìh cũng như với những công cụ thuộc về Java đó là sự cồng kềnh và nặng nề, may mà công ty đầu tư cho máy thuộc loại khủng nên đỡ được phần nào. Nhưng vì máy làm việc không được phép kết nối với Internet nên mình cũng đành phải cài JDeveloper lên con Mac của mình. Chạy trên nền Mac OS cũng ổn, mỗi tội khi compile thì phải chờ hơi lâu một chút, nhưng như vậy cũng đủ để viết vài tutorial nho nhỏ.

Khi mình làm việc với JDeveloper mình mới chỉ làm quen với Java ở mức độ cơ bản, tức là về ngôn ngữ lập trình và có kiến thức về hướng đối tượng. Còn lại mình chưa làm việc nhiều với các IDE Java khác. Do vậy sẽ có một vài khái niệm mới để làm quen như Bean (mình hiểu nôm na như một file code behind của .NET vậy, nhưng trong Bean sẽ có pham vị (scope) hoạt động), task flow, Bean scope,... Khi làm việc với JDeveloper thì mình ấn tượng nhất với task flow, khái niệm này giống với khái niệm workflow trong .NET (đang được hoàn thiện dần, lâu rồi mình không update .NET nên không rõ nữa). Task flow chính là định nghĩa những hành động của người dùng bằng công cụ trực quan kéo thả. Ví dụ như trên một Form, chúng ta có thể định nghĩa, button A sẽ mở đến Form X1, button B mở Form X2 mà không cần đụng tí nào vào code, hoặc cao cấp hơn là button C được định nghĩa là một task flow khác.
JDeveloper 11 được tích hợp với ADF (Application Development Framework) của Oracle cùng với JSF 2.0, cung cấp cho người phát triển nhiều component tiện ích để làm ra một ứng dụng doanh nghiệp nhanh và ổn định. Nếu bạn có điều kiện hãy thử trải nghiệm với JDeveloper.
Blog's topic:
Blog's tag:
- huyvq's blog
- 1317 reads
Git Basic
Hôm nay mình đóng gói xong quyển sách Git Basic (tiếng Việt), giờ có thể cho lên Tablet (iPad, Kindle Fire or Kindle) để đọc được rồi. Đây là một quyển sách rất đáng đọc dành cho những ai đang muốn học và làm việc với Git. Sách viết rất dễ hiểu và thực tiễn. Mọi người có thể tải về miễn phí tại địa chỉ dưới đây
Cập nhật: Mình đã cho lên amazon phiên bản cho kindle, nhung do chưa biết làm sao để sách này Free đây.
Blog's topic:
- huyvq's blog
- 1600 reads
Sử dụng Drush
Bài viết này hướng dẫn cách sử dụng Drush trong môi trường Ubuntu. Để cài đặt Drush, chúng ta chạy 2 lệnh dưới đây trong terminal
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }pear channel-discover pear.drush.org pear install drush/drush{/syntaxhighlighter}
Để kiểm tra drush đã được cài hay chưa chúng ta chạy lệnh drush, tôi chạy trên Ubuntu 11.10 thì có thông báo lỗi Console_Table, thì tôi chạy mấy lệnh dưới đây để nâng cấp bản mới cho Console_Table
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }pear upgrade --force Console_Table pear upgrade --force pear{/syntaxhighlighter}
Như vậy chúng ta đã cài xong Drush. Nếu muốn cải bản Drush mới hơn ta có thể chỉnh định rõ phiên bản của Drush trong quá trình cài đặt. Ví dụ như pear install drush/drush-5.0.0
Từ bây giờ công việc cài đặt Drupal trở nên đơn giản và nhanh chóng. Ví dụ để lấy bản bản Drupal 6 chúng ta gõ lệnh
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }drush dl drupal-6.20{/syntaxhighlighter}
Lệnh này sẽ tải về bản Drupal và cho vào thư mục Drupal-6.20. Để cài đặt ta làm theo các bước sau
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }cd drupal-6.20 drush site-install --db-url=mysql://user:pass@localhost/db_name{/syntaxhighlighter}
Với lệnh trên chúng ta cài đặt Drupal với thông tin CSDL được cho vào tham số --db-url. Sau khi hoàn tất tài khoản quản trị mặc định sẽ là admin/admin (Bạn nên thay đổi mật khẩu để tăng tính bảo mật)
Để cài đặt thêm các mô-đun, chúng ta chạy lệnh sau
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }drush dl views cck panels drush en views cck panels{/syntaxhighlighter}
Với lệnh này chúng ta đã tải về các mô-đun views, cck, và panels sau đó cài đặt chúng vào Drupal.
Blog's topic:
- huyvq's blog
- 1100 reads
Giới thiệu về Drush
Với những ai làm việc nhiều với Drupal chắc cũng sẽ chán ngấy với những công việc nhàm chán khi phải cài đặt các phiên bản mới của core hay các module. Mặc dù những công việc này đơn thuần chỉ là tải về rồi duyệt trang web để lựa chọn và cài đặt nhưng cũng làm cho to thấy tẻ nhạt. Nhưng giờ đây những chúng ta sẽ đỡ tốn công sức hơn để cài đặt quản quản lý Drupal với công cụ mang tên Drush (tên này được tạo từ Drupal + Shell).
Drush là một tập lệnh và kịch bản để tương tác với Drupal, với công cụ này, quản lý các dự án Drupal sẽ trở nên dễ dàng, thuận tiện và trông guru hơn bao giờ.
Một vài tính năng cốt lõi của Drush:
- Drush Project Manager cho phép bạn tải về, kích hoạt, vô hiệu hóa, gỡ bỏ cài đặt, cập nhật các modules/theme/profiles hay các bản dịch từ dòng lệnh theo một cách rất đơn giản (giống phong cách apt-get đối với ai đã sử dụng Ubuntu) - ví dụ: chỉ cần gõ drush dl views và drush pm-enable views trong một thư mục Drupal để cài đặt mô-đun Views! Ngoài ra, Drush cũng cho phép bạn cập nhật tất cả các mô-đun và thậm chí là nhân (core) Drupal chỉ với một lệnh - drush pm-update.
- Drush Core: một số tiện ích hữu dụng cho các quản trị trang web và phát triển (ví dụ như drush cron hoặc drush cache-clear). Cũng bao gồm lệnh bash để tùy biến cho drush với lệnh drush cli.
- Drupal SQL giúp bạn các vấn đề về truy vấn tới bất kỳ cơ sở dữ liệu nào của bạn và thậm chí giúp bạn di chuyển (migrate) cơ sở dữ liệu giữa các môi trường khác.
Bài viết này tôi không nói chi tiết về Drush, chỉ giới thiệu sơ qua để các ban thấy được các tính năng mà Drush giúp những người làm việc với Drupal trở nên dễ thở hơn. Trong các tính năng của Drush tôi thích nhất là việc có thể dùng Drush để cài đặt và đồng bộ hóa giữ site đang được phát triển và site đang được hoạt động (live site). Tôi sẽ cố gắng để viết về điều này trong bài tiếp theo khi nói về Drush.
Thông tin thêm về Drush mọi người có thể tham khảo tại địa chỉ dưới đây
Blog's topic:
- huyvq's blog
- 1006 reads
Amazon SES dễ dàng hơn với SMTP
Mới đây Amazon đã thông báo đưa SMTP vào trong Amazon SES giúp làm đơn giản quá trình gửi mail từ dịch vụ của SES. Đây quả là một điều mình đã mong chờ từ lâu. Nếu trước để gửi mail từ Amazon SES thì phải cấu hình khá nhiều thứ, ví dụ như trong bài "Sử dụng Amazon SES với Django" mình có trình bày.
Việc đầu tiên để gửi mail từ SES chúng ta cũng phải xác thực địa chỉ email gửi đi, tiếp theo đó là tạo một tài khoản SMTP từ trong console Amazon SES. Khi đã những thông tin này thì việc gửi mail trở nên dễ dàng và thuận tiện. Dưới đây là một ví dụ gửi mail viết trên Python.
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }import smtplib FROMADDR = 'email@me.com' TOADDRS = ['hell@god.com'] CONTENT = 'Somethings' SUBJECT = "Test" msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT)) msg += CONTENT + "\r\n" # Credentials (if needed) username = '*******' password = '*******************' # The actual mail send server = smtplib.SMTP_SSL('email-smtp.us-east-1.amazonaws.com', '465') server.ehlo() server.login(username,password) server.sendmail(fromaddr, toaddrs, msg) server.quit(){/syntaxhighlighter}
Blog's topic:
Blog's tag:
- huyvq's blog
- Log in to post comments
- 1532 reads
Quản lý subsite với django
Khi phát triển một website cho các hệ thống quản lý và thương mại, chắc hẳn mọi người sẽ gặp một bài toán như sau: "Ví dụ bạn xây dựng một website abc.com và muốn khi người dùng đăng ký với tên là xyz thì sẽ tự động tạo ra một site cho người dùng dưới dạng http://abc.com/xyz hoặc tên miền mà người dùng lựa chọn". Với bài toán như vậy chúng ta sẽ xây dựng website ra sao để có thể quản lý được các site con như vậy?
Đây là một bài toán mà nhiều người đã và đang giải quyết. Nếu sử dụng các hệ thống có sẵn như Joomla, Drupal, Wordpress hay Plone thì đã được hỗ trợ phần nào. Với Django thì bạn thực hiện bài toán đó như thế nào? Được truyền cảm hứng từ bài viết của pduyha (Cấu hình Apache với nhiều Django site), với cách làm trên thì mỗi lần tạo một site mới chúng ta phải restart lại Apache (hoặc có cách reload). Nhưng khi số lượng site lớn dần thì công đoạn đó sẽ mất thời gian đáng kể. Bên cạnh đó sẽ có sự lãng phí tài nguyên và tốn công cho việc nâng cấp.
Bài viết này sẽ cố gắng đưa ra một cách giải quyết khác để quản lý được các site con mà không ảnh hưởng đến Apache và tiết kiệm được không gian lưu trữ vì tất cả các site sẽ được chạy chung một mã nguồn, do vậy cũng thuận tiện cho việc sửa đổi và nâng cấp.
Ý tưởng của phương pháp này đó là chúng ta sẽ xử lý url của site trước khí trả về cho django xử lý. Ví dụ chúng ta có trang web http://abc.com, trang about có địa chỉ là http://abc.com/about. Giờ chúng ta muốn tạo một site còn là xyz và muốn khi vào địa chi http://abc.com/xyz/about thì sẽ ra trang thông tin của ông xyz. Vậy chúng ta phải làm sao phân biệt được url đó là của trang chính hay là của trang con? Đơn giản là chúng ta phải phân tích url để đưa ra quyết định. Có 2 việc chúng ta phải giải quyết
- Phân tích URL trước khi cho Django xử lý
- Quản lý thông tin site con
Về vấn đề quản lý thông tin của site con chúng ta có thể tận dụng luôn được đối tượng Site có sẵn của Django. Đối tượng này có 2 thông tin là domain và name. Ở đây chúng để phân biệt doamain và subsite, mình sẽ lưu subsite thêm ký tự / ở đầu. Ví dụ nếu một trang web là http://abc.com/xyz thì thông tin sẽ được lưu trong trường domain của Site là /xyz.
Việc tiếp theo là tạo một Middleware cho Django (tài liệu về Middleware có thể đọc tại đây). Chúng ta sẽ tạo một app với file middleware.py có nội dung như sau
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }from django.conf import settings import re from django.contrib.sites.models import Site class MultiSiteMiddleware: def process_request(self, request): r = re.match("^/([^/]*)($|(/.*$))", request.path) found = False if r: possible_subsite = r.groups()[0] real_action = r.groups()[1] if len(real_action) > 0 and real_action[0] == '/': real_action = real_action[1:] sites = Site.objects.all() for site in sites: if site.domain[0] == '/': # neu duoc dang ky la subsite /subsite subsite = site.domain[1:] # Loai bo / o dau if subsite == possible_subsite: found = True break # thoi ra ngoai thoi, xg roi request.META['SUB_SITE'] = '' if found: request.path = '/%s' % real_action request.path_info = '/%s' % real_action # cho them mot so thong tin de su dung request.META['SUB_SITE'] = possible_subsite request.META['SUB_SITE_ID'] = site.id else: request.META['SUB_SITE'] = '' request.META['SUB_SITE_ID'] = 0{/syntaxhighlighter}
Như trong code, khi url có dạng /xyz/function1 thì chương trình sẽ nhận diện đây là site /xyz và chạy chức năng function1, cùng với đó là các thông số được thiết lập thêm trong biến request (SUB_SITE và SUB_SITE_ID) để giúp các ứng dụng biết là hiện tại đang ở site nào.
Chúng ta cũng sẽ phải khai báo middleware này lên trên cùng khi khai báo Middleware của Django để đảm bảo luôn được thực thi đầu tiên. Việc khai báo này sẽ được làm trong phần settings của Django
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }MIDDLEWARE_CLASSES = ( 'my.apps.appmultisite.middleware.MultiSiteMiddleware', # Khai bao o tren cung!!! 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ){/syntaxhighlighter}
Như vậy giờ đây chúng ta có thể áp dụng cho các project với nhiều subsite. ^^
Blog's topic:
- huyvq's blog
- Log in to post comments
- 2444 reads
Xóa tất cả thư mục .svn
Làm việc trên svn đôi lúc nảy sinh bài toán là muốn xóa tất cả các thư mục .svn (kể cả trong các thư mục con), mà việc này mình cũng gặp nhiều nên viết lên đây để thỉnh thoảng copy cho nhanh.
Để tìm tất cả các thư mục .svn ta dùng lệnh sau trong console
{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }$ find . -type d -name .svn{/syntaxhighlighter}
Vậy để xóa tất cả thư mục .svn ta chạy lệnh
{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }$ rm -rf `find . -type d -name .svn`{/syntaxhighlighter}
Chú ý trên là dấu ` cạnh phím số 1 ^_^.
- huyvq's blog
- Log in to post comments
- 2609 reads
Tạo môi trường làm việc ảo với virtualenv
Virtualenv là một công cụ để xây dựng môi trường độc lập khi phát triển với Python. Đó là một cách tuyệt vời để nhanh chóng kiểm tra các thư viện mới mà không làm lộn xộn các package có sẵn của bạn hoặc chạy nhiều dự án trên cùng một máy phụ thuộc vào một thư viện đặc biệt nhưng không phải cùng một phiên bản của thư viện đã có.
Ví dụ bạn có thể cài đặt phiên bản X của thư viện trong một môi trường và phiên bản Z của cùng một thư viện trong môi trường khác, mà không gây ảnh hưởng đến cái khác. Mỗi môi trường cung cấp thực thi Python riêng của nó và thư mục của site-package (không được chia sẻ giữa các môi trường).
Để cài đặt virtualenv, chỉ cần sử dụng easy_install với lệnh sau đây:
easy_install virtualenv
Một khi virtualenv được cài đặt, bạn có thể sử dụng lệnh virtualenv để tạo ra môi trường ảo. Các lệnh sau đây sẽ tạo ra một môi trường được gọi là "working":
virtualenv working
Bạn có thể kích hoạt các môi trường bằng cách chạy script kích hoạt nó, nằm trong thư mục bin của môi trường:
source working/bin/activate
Nếu bạn cài đặt một package trong môi trường ảo của bạn, bạn sẽ thấy script thực thi được đặt trong bin/working/ và egg trong working/lib/python2 .X/site-package/
Như bạn thấy, môi trường ảo sẽ kế thừa các gói từ thư mục site-packages mặc định của hệ thống. Điều này đặc biệt hữu ích khi dựa vào những package có sẵn, vì vậy bạn không cần phải cài đặt lại chúng trong mọi môi trường.
Tôi cố gắng giữ cho thư mục site-package của hệ thống tối giản và chỉ cà đặt các package mà tôi sử dụng trong gần như mọi dự án. Nó bao gồm giao diện làm việc với cơ sở dữ liệu như MySQLdb hoặc psycopg2 cũng như setuptools, tất nhiên là cả virtualenv.
Tuy nhiên, bạn cũng có thể thay đổi điều này bằng cách truyền --no-site-packages khi tạo ra một môi trường ảo. Điều này sẽ tạo ra một môi trường sạch sẽ mà không kế thừa các gói từ site-package của hệ thộng:
virtualenv --no-site-packages working
Để thoái khỏi một môi trường, chỉ cần chạy câu lệnh:
deactivate
Như vậy với virtualenv chúng ta có thể tạo ra những môi trường làm việc độc lập, thoải mái có thể thử nghiệm các package và chạy các ứng dụng lặt vặt khác. Điều này rất hữu ích cho việc học Django nói riêng và học Python nói chung.
Blog's topic:
Blog's tag:
- huyvq's blog
- Log in to post comments
- 3072 reads