9 điều Bác Tôm dạy

June 8, 2009

9 điều Bác Tôm (*) dạy:

  • Don’t believe in myths—reason for yourself.
  • Don’t follow “conventional wisdom”—often the things everybody knows are simply wrong!
  • Don’t trust rumors or opinions—test things for yourself and base decisions on proven examples.
  • Break apart a problem into simpler questions, and assemble the answers to each step into an elegant, efficient solution.
  • Don’t do things in your programs when the database can do them better and faster.
  • Understand the differences between the ideal and the real.
  • Ask questions about and be skeptical of unjustified “company policies” for technical standards.
  • Consider the big picture of what’s best overall for the requirements at hand.
  • Take the time to “THINK”

Mình thấy hay nên post để các bạn tham khảo

(*) Tom Kyte

Source: Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions

HN

Advertisements

Chính trị

June 5, 2009

Mấy hôm nay tiệc tùng nhiều quá, đành phải viết một cái gì đó để xả không “very good (*)” thì bỏ mẹ. Đang shock đạm nên thôi không nói chuyện kỹ thuật, mình nói chuyện Chính trị.

Theo Hải Đăng Aristotle, chính trị là “The science of making communities, making them healthy and satisfying for all, is called politics”. Đại khái là một môn khoa học tạo ra một cộng đồng, làm cho cộng đồng đó “khoẻ mạnh” và hạnh phúc.  Hải Đăng cũng nói thêm Chính trị là một trong năm thành phần tạo nên Triết học. Đó là
– Metaphysics (Tính siêu hình)
– Logic
– Ethics (Đạo đức)
– Politics
– Aesthetics (Mỹ học)

Như vậy Chính trị về lý thuyết không xấu như mình tưởng, mặc dù trong thực tế nó cũng điếm bỏ mẹ. Và cái triết học của bọn TB giãy mãi x chết nghe có vẻ khác với Triết học mà chúng ta vẫn ra rả học dưới mái trường XHCN thân yêu các bạn nhỉ? Hay là mình nhớ nhầm?

(*) Bệnh Gút

Source: Chương cuối, Peopleware – Productive Projects and Teams, 2nd Ed

HN

Thesaurus in the database

June 3, 2009

Hôm nọ, tại trung tâm họp báo quốc tế Yahoo Messenger, một “nhà báo nhân dân (*)” chất vấn:

– Giờ nếu tôi muốn search các tác phẩm của Bác Hồ thì làm thế nào ?
– Gõ vào where tacgia = ‘Bác Hồ’ (lưu ý tacgia like ‘%Bác Hồ%’ là không được các bạn nhé, nguyên nhân để các bạn tự hiểu). Mình trả lời ngay
– Nhưng thế thì nó khôngtìm ra các tác phẩm trong trường hợp Bác Hồ lấy các bút danh khác như Nguyễn Tất Thành, Nguyễn Ái Quốc hay Trần Dân Tiên?
– Thế thì gõ vào tacgia in (‘Bác Hồ’,  ‘Nguyễn Tất Thành’, ‘Nguyễn Ái Quốc’ hay ‘Trần Dân Tiên’)
– Thế mỗi lần tìm ra một bút danh mới của Người thì tôi lại phải vào sửa code àh? Mà còn bao nhiêu tác giả nữa chứ?
– Ừ nhỉ, quên (icon cười lăn lộn)

Ý các bạn thế nào? Trong trường hợp này người nông dân phải làm gi? Hay lại

Không có việc gì khó
Chỉ sợ tiền không nhiều
Đào núi và lấp biển
Không làm được thì out? (Out này là outsource chứ không phải là go out nhé :-p)

Đùa các bạn tý thôi, chứ cái này nghe thì có vẻ phức tạp chứ nếu … làm rồi thì cũng đơn giản :). Cách đây mấy năm bọn mình cũng bị một nhân dân hỏi tương tự trong buổi demo sản phẩm của cty mình làm.

Mình nói thầm các bạn nhé: Các bạn vào hỏi người mà ai cũng biết câu hỏi thesaurus cùng với hệ quản trị cơ sở dữ liệu mà các bạn dùng là xong thôi. Nhiều cái hay phết đấy các bạn ạ.

Mình cung cấp cho các bạn một số references nhé
http://www.oracle-base.com/articles/9i/FullTextIndexingUsingOracleText9i.php
http://www.mssqltips.com/tip.asp?tip=1491

Đọc kỹ hướng sử dụng trước khi dùng
Thế các bạn nhé.

(*) Báo cô, cô không la` nhân dân à?

HN

June 2, 2009

Một trong những nguyên nhân khiến cho câu lệnh SQL chạy chậm chính là các lệnh sắp xếp. Do vậy viện Pasteur (@quảng cáo of VTV) khuyên đồng bào chỉ dùng khi cần thiết.

Muốn tránh thì phải biết nguyên nhân gây bệnh. Ở đây các nguyên nhân gây ra sắp xếp là:
– Select distinct ….
– UNION
– GROUP BY
– ORDER BY
– CREATE / REBUILD INDEX
– ANALYZE …. COMPUTE STATISTICS
– EQUAL JOIN

Btw, Bsi Hoa Súng cảnh báo đồng bào lệnh Union khác với Union All đấy nhé.
– Cùng là phép hợp
– Union đưa ra kết quả đã được sắp xếp
– Union all đưa ra kết quả chưa sắp xếp
– Tốc độ của Union All nhanh hơn

Để chữa bệnh thì chúng ta nên Đông Tây y kết hợp với thầy cúng
– select distinct …. ===>  Tạo index trên distinct list
– UNION              ===>   UNION ALL (Nếu biết các giá trị không trùng nhau)
– GROUP BY        ====> WHERE Nếu có thể / InLine view
– ORDER BY        =====> Tạo index
– CREATE / REBUILD INDEX  =====> NOSORT
– ANALYZE …. COMPUTE STATISTICS=====> ESTIMATE
– EQUAL JOIN        ====> Tạo Index trên JOIN

Do vậy khi viết câu lệnh SQL, chỉ khi có yêu cầu sắp xếp thì đồng bào hãy dùng, còn không thì nên loại bỏ nó để tăng tốc độ câu lệnh (tất nhiên là đối với các câu lệnh trả về số lượng lớn bản ghi, chứ bảng bé thì ignore)

Nói thế chắc đồng bào hiểu?

HN

Displaying rows as columns

May 27, 2009

Nhân hôm nay đại ca của mình hỏi về cách chuyển đổi từ ROWs sang Columns trong trường hợp số ROWS tĩnh, chắc cái này các bạn cũng thỉnh thoảng gặp trong Projects nên mình bốt ra đây để cùng “lồng bàn” nhé.

Để cho các bạn dễ hình dung mình show ví dụ nhé:
– Một bảng tbl_Nhanvien
– Một bảng tbl_Giaykhen (bảng này là bảng danh mục chỉ có 6 loại giấy khen)
– 2 bảng trên quan hệ theo kiểu nhiều nhiều nên theo lý thuyết chuẩn hoá của các GS râu rậm, tất yếu phải có một bảng tbl_Nhanvien_Giaykhen quan hệ với 2 bảng kia theo kiểu 1 – many

Nhân viên A có 6 cái giấy khen, nên bảng tbl_Nhanvien_Giaykhen sẽ có 6 bản ghi:
Ma Ten Giaykhen
1    A    GK1
1    A    GK2
1    A    GK3
1    A    GK4
1    A    GK5
1    A    GK6

Bây giờ mình cần hiển thị như thế này
1     A    GK1    GK2    GK3    GK4    GK5    GK6

What will you suggest?

Có nhiều cách để đến Roma, (nói đến đây lại nhớ tối nay Rùa – (MU rùa) đá với Rắn (Bạch Xà) ở Roma :)), mình cứ show ra đây để cho bạn không bảo là mình phét:
C1: Viết 1 Store Procedure, tính tính toán toán làm sao để ra khuôn dạng như trên là được
C2: Dùng hàm build-in như When case trong SQL server, Decode trong Oracle

Mình prefered cách 2. And you?

P/S: Hôm nay Rắn thằng Rùa 2 nháy rồi nên mình vào cập nhật thêm:  Trong trường hợp số Rows động thì làm thế nào? Mình nghĩ nếu chỉ là câu lệnh thuần tuý thì cũng khó mà làm, chắc lại phải dùng Store Procedure sử dụng crosstable để gen câu SQL thôi. Nếu để tạo các report thì dùng trực tiếp Matrix report của Oracle và Cross-Tab Report trong Crystal Report

HN

Index, when?

May 20, 2009

Ở cuộc thi “Ai là triệu phú”, anh Sâm LV hỏi “chung chung” thế này:

“Sử dụng index sẽ làm cho câu SQL của bạn … ”

A. Nhanh lên
B. Chậm lên
C. Chẳng nhanh cũng chẳng chậm
D. x biết

– Em xin lựa chọn hỏi ý kiến khán giả. Anh Sâm quay sang hỏi khán giả. Đáp án của khán giả là A – 60%, B – 30%,  C – 5% và D – 5%. Thế còn bạn, câu trả lời của bạn là gì?

Mình đoán phần lớn các bạn sẽ trả lời là A theo ý kiến khán giả (giả vờ thế). Nếu thế thì các bạn tạch rồi. Mất n triệu rồi. Đau nhỉ.

Đáp án là D: x biết.

Index chỉ useful when
– Cột chứa một khoảng rộng dữ liệu
– Cột chứa một số lượng lớn giá trị null
– Cột thường xuyên được sử dụng cùng nhau trong mệnh đề WHERE hoặc điều kiện join
– Bảng chứa rất nhiều dữ liệu và hầu hết các câu queries với điều kiện Where sẽ lấy dữ liệu trả về nhỏ từ 2% – 4%

Index is not useful when:
– Bảng nhỏ, chứa ít dữ liệu
– Cột ít được sử dụng trong điều kiện WHERE
– Hầu hết các câu queries sẽ lấy dữ liệu trả về lớn hơn 4%
– Bảng thường xuyên được cập nhật
– Cột được index được sử dụng như một tham chiếu trong biểu thức
(Note: con số % thì có thể tuỳ theo database)

Như vậy câu trả lời “x biết” là đúng. Bạn chỉ trả lời nhanh hay chậm khi bạn nhìn vào một câu lệnh cụ thể. Is it right, guys?

HN

Microsoft SOA Solution

May 20, 2009

Yesterday, I went to Microsoft Windows Azure home page, I found it is very interesting and fantastic. Microsoft bring you a platform for cloud computing. I decided to continue studying Windows Azure more. I think Windows Azure provides a platform for cloud computing and our services are available in Internet. Everyone can purchase those services and reduce a lot of cost (like we purchase electricity, water…, these services come popular, so their cost is getting cheaper). But I was considering much about the Internet scope of this platform. If I want to use Windows Azure to deploy a SOA solution in our intranet, how can I do it? By chance, I opened my google reader and read a new article in MSDN Magazine Service Virtualization With The Managed Services Engine. Microsoft has been also providing another SOA Infrastructure offerings and a technical solution referred to as the Managed Services Engine (MSE). I think now we can use MSE for deploying a SOA solution in Intranet and use Windows Azure for deploying a in-the-cloud solution in Internet. I don’t know whether it is correct, but I will continue studying it.

SQL for paging

April 29, 2009

Hôm trước có một anh bạn hỏi mình trong MS SQL server có câu lệnh phân trang không. Mình trả lời là có nhưng chạy chậm. Anh bạn mình bảo, dạo này bọn mạng (http://www.15seconds.com/issue/070628.htm) hay sử dụng các câu lệnh phân trang kiểu này, em xem thế nào.

SELECT *
FROM   (SELECT ROW_NUMBER() OVER(ORDER BY person) AS
rownum, person, income FROM Salaries) AS Salaries1
WHERE  rownum >= 5 AND rownum <= 9
ORDER BY income

Nhìn câu này mình phán luôn câu này chỉ dùng cho các bảng dữ liệu be be’ chứ to to 1 tý là đi về nơi xa ngay. Mình chứng minh cho các bạn thấy ngay đây. Ở sub-query, các bạn phải full-scan table 1 phát, rồi lại thêm 1 cái fake column là cái cột salaries1 kia, tiếp đến câu lệnh Select * where rownum >= 5 AND rownum <= 9, lại phải full scan table phát nữa vì làm gì có index nào trên cái rownum kia. Chưa kể cả ở 2 câu, các bạn đều dùng Order by nữa. Nếu dữ liệu của các bạn vào loại lớn (tất nhiên là tầm vài chục M records, chứ vài K thì nói làm x gì?), tốc độ phân trang của các bạn sẽ là “phố của bò”. Bạn nào không tin thì mời bạn nhòm vào execution plan của câu lệnh.

Cũng có một số trang đề xuất dùng CTE, nhưng kết quả thì cũng như trên thôi, chả hơn x gì.

Theo ý mình thì nên làm thế này. Các bạn nên viết thành một SP, trong đó có 2 câu lệnh:

Câu lệnh đầu tiên chỉ là select top 500, lấy ra 500 bản ghi thôi. Các tips và tricks giời thì cũng không lại được câu lệnh cơ bản này, chả phải where iếc gì mà cũng chả cần subquery làm gì cho nó mệt mỏi. Cá nhân mình cho rằng, câu lệnh tìm kiếm mà trả về hơn 500 bản ghi là câu lệnh vô nghĩa, hơi sức x đâu mà xem chi tiết ngần đấy bản ghi. Muốn tìm chính xác thì mời các bạn thêm điều kiện vào.

Câu lệnh thứ 2, các bạn select count(*) cho mình để trả về chính xác số lượng bản ghi thoả mãn điều kiện tìm kiếm

Như vậy, trên màn hình của các bạn sẽ hiển thị 2 thông tin: cái grid của các bạn chỉ chứa 500 records, nhưng tổng số bản ghi là con số chính xác. Bạn nào thật thà thì nói với nhân dân là tao chỉ hiển thị 500 trên tổng số xxx bản ghi. Còn không thì lờ luôn đi cũng được.

HN

Build MS Outlook Addon 2003 và 2007 trên nền VS 2008

April 29, 2009

Hơn tuần nay mình ngồi đánh vật với cái MS Outlook Addon 2003 và 2007 trên nền VS 2008. Vì máy cài Office 2007 (tất nhiên là có mua của anh Hoá đơn Cổng) nên mình ưu tiên bạn Bẩy trước. Làm việc với bạn Bẩy thật mệt. Bạn ấy chảnh VCD. Chạy trên nền debug thì vô 4, chạy phe phé, kết quả as expected. Nhưng khi bắt tay vào tạo bộ cài đặt lại gặp bao nhiêu vấn đề. Anh bạn lỗi “Not Loaded. A runtime error occurred during load VSTO” lúc nào cũng tay bắt mặt mừng với mình. Thuyết phục kiểu gì cũng không chịu biến đi cho. Mãi về sau có anh Misha Shneerson (*) nhờ anh bạn thân, người mà ai cũng biết là ai đấy (**), nhắn mình địa chỉ thường trú của bạn Bẩy trong sổ đăng ký (registry) là HKCU. Đến đây công viêc bắt đầu thông. Mình đưa bạn đến HKCU\Software\Microsoft\Office\<App>\AddIns\<AddInName> thì coi như xong.

Đến lượt anh Ba, mọi chuyện khác hẳn. Già hơn bạn 7 những 4 niên nên anh khó tính kinh. Anh giống bạn Bẩy ở chỗ chạy trên nền debug cũng gặp bạn Vô 4, nhưng khi vào bộ setup thì 4` ngay. Mình theo cách của ban Misha, nhưng anh ấy đếch chịu, cứ khăng khăng dẫn mình đến gặp bạn Not Loaded. Anh ấy ép mình phải dũng võ bẩn. Mình phải so sánh địa chỉ trong sổ đăng ký giữa nền debug và setup. Mình phát hiện ra anh 3 tuy già nhưng giàu vãi. Anh ấy có 2 nhà các bạn ạ. Một ở phố HKCU và 1 ở phố HKLM. Đến đây cũng mới chỉ là ½ quãng đường, anh bạn Not Loaded vẫn chưa chịu biến. Loay hoay một hồi thì phát hiện ra, anh 3 này đếch chịu tin ai cả. Khác với bạn 7, khi cài đặt xong, chạy chương trình sẽ tự động hiện ra một cái cửa sổ để mình khẳng định niềm tin “In 7 we trust” – (Đô đang lên, tranh thủ làm hàng tý J), anh 3 bắt mình phải làm bằng tay. Anh 3 ơi, anh làm em mệt quá. Cái anh cần là cái lệnh này

caspol -u -ag All_Code -url “<application path>” FullTrust -n “<application name>”

Nếu làm cho em thì em mang cái lệnh của nợ kia ra Command line mà phang ngay, nhưng đây là làm cho “nhân dân dùng” (@THLinh) nên em phải tạo thêm 1 project, tạo key, ghép chuỗi để thực hiện. Nếu Giờ nói thì dễ nhưng cũng làm em mất đứt 2 ngày. Cũng may mà xong không Lý Thông(s) lại kêu ầm ầm.

Tóm lại khi làm các hệ thống MS Office Add-on các bạn phải chú ý 2 điều:

Hệ thống registry, bạn 7 có 1 nhà ở HKCU còn anh 3 có nhà cả ở HKCU lẫn HKLM. Nghe giang hồ đồn trên nền Vista thì cũng khác một tý, mình chưa thử nên chưa confirm được.

Đặt FullTrust cho anh 3, anh 7 hệ thống làm automatically.

(*):http://blogs.msdn.com/mshneer/archive/2007/09/04/deploying-your-vsto-add-in-to-all-users-part-i.aspx

(**): Bạn Google.

HN

PP Links

December 29, 2008

http://www.codeplex.com/AppArch