Năm mức ngu dốt

Bài báo Five levels of ignorance ở Communications of the ACM (số 10, năm 2000) của Phillip G. Armour nhìn quá trình phát triển phần mềm như việc nắm bắt tri thức và giảm sự ngu dốt. Lý luận của ông rằng phần mềm là phương tiện thứ năm chứa tri thức rất hay (bốn phương tiện kia là DNA, não, phần cứng các loại, và sách).

Ông chia sự ngu dốt (về vấn đề X nào đó) nói chung, và dốt trong phát triển phần mềm nói riêng ra là năm mức:

  • 0OIkhông dốt: để đạt mức này ta phải biết X và chứng minh được rằng ta biết X. Ví dụ: tôi biết viết blog!
  • 1OIthiếu kiến thức: để … đạt được mức dốt này thì ta phải biết là ta thiếu kiến thức về X. Ví dụ: tôi biết là tôi không biết gì về cơ học lượng tử. Đạt được mức dốt này cũng đã tốt, vì nếu có nhu cầu tôi có thể đi tìm sách vở tài liệu về cơ học lượng tử để học thêm.
  • 2OI – thiếu nhận thức: ở mức dốt này thì ta không biết là ta không biết gì về X. Hiển nhiên là ta không thể cho ví dụ về 2OI nào! Tuy nhiên, thỉnh thoảng đọc sách đọc báo,đọc blog KHMT (!), tôi có thể tìm ra được nhiều thứ chưa bao giờ biết là mình không biết, và như thế tôi chuyển các thứ đó lên 1OI. Dù rằng với cơ học lượng tử nói chung thì tôi ở mức 1OI, chắc chắn là có các đối tượng cụ thể nào đó trong cơ học lượng tử mà tôi ở mức 2OI.
  • 3OI – thiếu quá trình: ở mức dốt này thì ta thiếu một quá trình cụ thể để khám phá ra rằng mình đang không biết rằng mình đang không biết về X. Nói cách khác, ở mức dốt này thì ta không biết cách nào để tìm ra các thứ mà ta không biết rằng ta không biết :-).
  • 4OI – siêu dốt: chữ này tôi dịch bừa từ chữ meta-ignorance, vì meta-physics người ta dịch là siêu hình (học). Ở mức dốt này thì ta không biết gì về năm mức ngu dốt.

Đến đây thì tôi không còn ở mức 4OI được nữa. (OI viết tắt của Order of Ignorance.)

Dân máy tính thường phải đọc/học rất nhiều để theo kịp sự phát triển với tốc độ ánh sáng của ngành mình. Trong quá trình này, với mỗi vấn đề X của ngành, ta sẽ chuyển dần dần từ 3OI xuống 1OI. Sau đó, nếu X là cái mà ta thật sự thích hoặc cần cho công việc thì sẽ chuyển nó lên 0OI.

Rất nhiều sinh viên và nghiên cứu sinh KHMT ở mức 3OI khi mới bắt đầu đi học. Sau đó họ tìm hiểu về quá trình nghiên cứu, quá trình tìm các vấn đề và hướng nghiên cứu mới, quá trính cập nhật kiến thức về ngành của mình, và chuyển dần các thứ lên 2OI. Để có một quá trình hiệu quả từ 3OI lên 2OI không dễ chút nào. Ví dụ đơn giản: các journals, conference nào trong ngành mình là có giá trị, làm thế nào để tìm đọc các bài trong chúng, phương pháp lọc bài đọc thế nào, vân vân.

Sau khi học được quá trình này rồi, ta có phương tiện để chuyển dần các khối kiến thức khác nhau lên 1OI. Đến khi sắp ra trường, chuẩn bị làm luận án Ph.D về cái gì đó thì (hy vọng rằng) ta đã có vài thứ ở 0OI.

Nguồn procul.org

Đổi NLS_CHARACTERSET trong Oracle

Khi chuyển đổi dữ liệu Oracle từ máy này sang máy khác. Tôi gặp một số trường hợp bị lỗi font Tiếng Việt trên máy đích.

Có một nguyên nhân sinh lỗi font đó là do NLS_CHARACTERSET trên máy nguồn và máy đích khác nhau.

1, Kiểm tra NLS_CHARACTERSET trên mỗi máy.

$sqlplus /nolog

$conn / as sysdb

>SELECT value$ FROM sys.props$ WHERE name = ‘NLS_CHARACTERSET’ ;

2, Nếu NLS_CHARACTERSET trên mỗi máy khác nhau, cách khả thi nhất là chuyển NLS_CHARACTERSET

máy đích về AL32UTF8

2.1 Đăng nhập tài khoản quản trị sysdba giống như bước 1

2.2 Tắt hệ thống,  sao lưu dữ liệu.

> SHUTDOWN IMMEDIATE;

2.3 Bật dưới chế độ RESTRICT

> STARTUP RESTRICT;

2.4 Chuyển các tham số về mặc định:

> ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
> ALTER SYSTEM SET AQ_TM_PROCESSES=0;

2.5 Chuyển NLS_CHARACTERSET

> ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;

2.6 Tắt CSDL và khởi động lại CSDL ở chế độ bình thường:

> SHUTDOWN IMMEDIATE;
> STARTUP;

Import export dữ liệu trên Oracle sử dụng exp, imp

Cuyển dữ liệu oracle schema từ máy này sang oracle schema trên máy khác sử  dụng exp, imp

Giả định:

Máy 1: user1, passwd1

Máy 2: user2, passwd2

Bước 1: Đăng nhập bằng tài khoản chạy oracle trên linux terminal vào máy 1.

Chạy lệnh sau:

$exp user1/passwd1 file=data_from_m1.dmp log=export_data.log

Sau khi chạy xong ta được file data_from_m1.dmp.

Bước 2: Copy file này sang máy 2. Đăng nhập bằng tài khoản chạy oracle trên linux terminal máy 2.

Chạy lệnh sau:

$imp user2/password2 file=data_from_m1.dmp log=import_data.log fromuser=user1 touser=user2

Giới thiệu về NoSQL

NoSQL là gì?nosql-databases

NoSQL bao gồm một loạt các công nghệ cơ sở dữ liệu khác nhau và đã được phát triển để đáp ứng với sự gia tăng khối lượng dữ liệu được lưu trữ về người sử dụng, các đối tượng và các sản phẩm, tần suất truy cập, hiệu suất và nhu cầu xứ lý. Cơ sở dữ liệu truyền thống – SQL, không được thiết kế để đối phó với những thách thức về sự tăng trưởng về mặt quy mô và những thay đổi nhanh chóng mà các ứng dụng hiện đại đang phải đối mặt, SQL cũng không được thiết kế để tận dụng lợi thế của việc lưu trữ giá rẻ và khả năng xử lý hiện nay.

Các loại Cơ sở dữ liệu NoSQL phổ biến

  • Document databases (CSDL kiểu tài liệu): Dữ liệu được lưu trữ dưới dạng một cặp khóa và dữ liệu có cấu trúc được gọi là document (tài liệu). Trong mỗi tài liệu có thể chứa nhiều cặp key-value. Mỗi cặp key-value này có thể chứa các cặp key-value lồng nhau.
  • Graph stores (CSDL kiểu đồ thị) được sử dụng để lưu thông tin về mạng kết nối, ví dụ như kết nối trong mạng xã hội. CSDL đồ thị được biết đến gồm: Neo4J và HyperGraphDB.
  • Key-value là kiểu CSDL NoSQL đơn giản nhất. Mỗi mẩu dữ liệu được lưu với thông tin về tên (hoặc “key”), và giá trị tương ứng . Ví dụ về CSDL key-value là Riak và Voldemort. Một số CSDL key-value khác,  như Redis, cho phép các giá trị được lưu trữ theo kiểu khác nhau ( kiểu “integer”, …).
  • Wide-column giống như Cassandra và HBase được thiết kế để tối ưu cho việc truy vấn trên tập dữ liệu cực kỳ lớn. Thay vì lưu trữ dữ liệu trên các hàng(rows), nó lưu trữ dữ liệu theo cột (columns).

Lợi ích của NoSQL

Khi so sánh với CSDL quan hệ (SQL),  CSDL NoSQL dễ dàng mở rộng hơn và tốc độ nhanh hơn rất nhiều. Bởi vì, thiết kế mô hình dữ liệu tập trung vào các vấn đề mà CSDL quan hệ không được thiết kế:

  • Khối lượng lớn dữ liệu có cấu trúc, bán-cấu-trúc(semi-structure), và không có cấu trúc
  • Ứng dụng thay đổi thường xuyên dẫn đến mô hình dữ liệu thay đổi thường xuyên
  • Lập trình hướng đối tượng mềm dẻo và dễ dàng sử dụng
  • Tính hiệu quả, kiến trúc theo hàng-ngang bằng nhiều thiết bị giá rẻ thay vì kiến trúc theo hàng-dọc với một số ít các thiết bị cấu hình mạnh, đắt tiền.

(Tobe cont…)

Giới thiệu về mô hình MVC, ví dụ sử dụng ngôn ngữ Python

MVC là gì?

MVC là cách thiết kế ứng dụng thành  các phần với các chức năng riêng biệt.

MVCinAction

Lịch sử của MVC

MVC là  viết tắt của Model-View-Controller. MVC được mô tả đầu tiên bởi  Trygve_Reenskaug  vào năm 1979. Tuy đã hơn 30 năm qua, nhưng khái niệm này không những bị lãng quên,… ngày nay, nó được dùng vào hầu hết các web framework và GUI framework, gồm có:

  • Ruby On Rails: Một web-framework viết trên Ruby rất thịnh hành.
  • Apple Cocoa: Apple’s framework cho phát triển các ứng dụng Mac OS và iOS.
  • ASP.Net Framework: Microsoft’s web-framework để phát triển các ứng dụng web trên .NET.
  • Apache Struts: Một Java web-framework rất phổ biến
  • … và rất nhiều framework khác.

Các thành phần trong MVC

Model-View-Controller theo đúng như  tên gọi của nó, được chia  thành 3 phần chính:

Model: Kết nối với cơ sở dữ liệu và thực hiện các tương tác với cơ sở dữ liệu

View: Hiển thị trên giao diện(UI) các kiểu dữ liệu đó.

Controller: Nhận các tương tác của người dùng, điều hướng, gọi các hành vi từ Model và hiển thị lên View tương ứng.

Tuy rằng chưa có mẫu chuẩn MVC, nhưng các framework áp dụng MVC cũng không khác nhau nhiều. Các framework này đều cố gắng đạt được:

  • Tách lớp trình diễn (Presentation) với lớp thao tác dữ liệu (Model)
  • Tách lớp điều hướng(Controller) với lớp hiển thị (View)

Ví dụ sử dụng MVC trong Python


import sqlite3
class MVCModel:
def request(self, id):
# Would query database…
conn = sqlite3.connect('querydb')
c = conn.cursor()
results = c.execute('''select name from data where id = %d''' %id)
conn.commit()
c.close()
for row in results:
name = row[0]
return { "id" : id, "name": name}
class MVCController:
def __init__(self):
self.model = MVCModel()
self.view = MVCView()
def main(self):
post = self.model.request(1)
self.view.show(post)
class MVCView:
def show(self, post):
print "%(id)s %(name)s" % post
Controller = MVCController()
Controller.main()

view raw

gistfile1.py

hosted with ❤ by GitHub

Bỏ chế độ cài đặt đóng gói egg trong python

Khi chạy python với công cụ IDE. Có một số thư viện đã được cài đặt.

Tuy nhiên, IDE lại không tìm thấy mã nguồn để thực hiện autocomplete.

Sau một hồi tìm hiểu, tôi xác định được nguyên nhân là do có một số thư viện được cài dưới dạng .egg

nên phát sinh tình huống như vậy.

Cách để bỏ chế độ đóng gói khi cài bằng pip hoặc easy_install

sửa file pydistutils.cfg trong thư mục “$PYTHON_PATH/lib/python2.7/distutils”

thêm dòng sau:

zip_ok = false

Nếu không được có thể dùng lệnh

easy_install -Z <tên-thư-viện>

Sử dụng Cache Pip Downloads trong Python

Khi sử làm việc với Python trên môi trường virtualenv và pip. Ta cần cài đặt một gói thư viện python, ta có thể tạo thư mục cache để pip tìm trong thư mục đó trước khi lên mạng để giảm thời gian download và công việc cài đặt sẽ nhanh hơn:
$ vi .bash_profile
thêm dòng sau:
export PIP_DOWNLOAD_CACHE=$HOME/.pip-download-cache

Mật khẩu cho màn hình quản trị Tomcat 7 trong Debian

1, Sửa file sau:
/etc/tomcat7/tomcat-users.xml
Thêm các dòng:

<role rolename=”manager-gui”/>
<user username=”tomcat” password=”tomcat” roles=”manager-gui”/>

2, /etc/init.d/tomcat7 restart

Tiếng Việt trong Django model phiên bản 1.4

Mình theo tài liệu này để hiển thị tên Model trong phần quản trị của Django
https://docs.djangoproject.com/en/1.4/topics/i18n/translation/
của Django. Tuy nhiên, mình thấy dài dòng quá, đọc rất mất thời gian.
Mình tóm tắt lại như sau:

Bước 1,
Vào settings.py, đổi, hoặc thêm mới:
    LANGUAGE_CODE = ‘vi-vn’
    LOCALE_PATHS = (‘PATH_TO_LOCALE’,)
    USE_I18N = True

Bước 2:
Với mỗi Model
Thêm class Meta  với các trường thuộc tính
    verbose_name
    verbose_name_plural
Thêm verbose_name vào trường thuộc tính.
Ví dụ: name = models.CharField(max_length=128, verbose_name=_(“Category name”))

Bước 3,

Đứng tại thư mục  gốc của project
Tạo một thư mục là “locale”. Sau đó, chạy lệnh sau
$django-admin.py makemessages -l vi
Lệnh này sẽ tự động sinh ra file
locale/vi/LC_MESSAGES/django.po

Bước 4,
Mở file bằng PlainText Editor (Notepad++, EmEditor, …), dịch.
Chạy lệnh sau để complile thành file django.mo :
$django-admin.py compilemessages

Hướng dẫn cài đặt Sun Java trên Debian 6 Squeeze

Khi cài Aptana Studio 3 trên Debian 6, tôi có gặp một số lỗi.
Nguyên nhân là: ở chế độ mặc định, Debian chỉ cài Java 1.5. Sau khi googling tôi tìm được hướng dẫn cài đặt Sun Java 6.
1, Đăng nhập với acc root, thêm dòng sau vào file /etc/apt/source.list
deb http://ftp.us.debian.org/debian/ squeeze main non-free
2, Cập nhật
#apt-get update
3, Cài đặt
#apt-get install sun-java6-jdk

4, Sau khi cài đặt xong, kiểm tra phiên bản Java
#java -version
Nếu vẫn là 1.5. Bạn cần chạy thêm câu lệnh sau:
#update-alternatives –config
chọn java-6-sun