poltava

rong phát biểu nhậm chức, Belousov đem tính mạng ra bảo đảm hoàn thành trách nhiệm được giao! Như ngày xưa Vasily Chuikov được giao nhiệm vụ bảo vệ Stalingrad vậy… Hỏi: anh nhận thức như thế nào về nhiệm vụ này? Đáp: hoặc là hoàn thành nó, hoặc là chết khi làm điều đó!

Người Nga là dân tộc rất, rất nghiêm túc, nói thế nào thì làm đúng như thế ấy, không có đùa đâu! Xem ra lần này ku Nga đã quyết tâm chơi lớn! Mạnh dạn dự đoán là họ sẽ không dừng lại cho đến khi tới được Poltava, là nơi 300 năm trước, Peter-the-great đã làm nên chiến thắng!

telecentric

ỗi ngày biết thêm một tí, trong video là một loại ống kính rất đặc biệt – telecentric lens, vật thể nằm trong trường nhìn của nó có kích thước giống nhau dù ở xa hay ở gần! Tức nó không tạo ra một phép chiếu phối cảnh (perspective projection) mà kỳ lạ thay, có thể tạo ra một phép chiếu đẳng cấu (isometric projection)! Điều này có vẻ khá là khó hiểu và khó tin nhưng phép chiếu đẳng cấu, thực ra nó không xa lạ như mọi người nghĩ! Thậm chí tôi còn cho rằng, bản năng đầu tiên của chúng ta khi diễn họa cấu trúc một vật thể là đẳng cấu chứ không phải phối cảnh. Xem thêm về một bức tranh vẽ trong không gian đẳng cấu ở đây!

Nhưng cụ thể, ống kính này được dùng để làm gì? Nó được dùng trong các ứng dụng đo lường, kiểm định, các ứng dụng computer vision, pattern recognition, etc.. sẽ tránh được rất nhiều lỗi sai về kích thước, vì dù có chụp gần hay chụp xa thì kích thước nó vẫn y như thế, xem như đã chuẩn hóa đầu vào! Một ví dụ khác là in vi mạch bằng phương pháp quang khắc đều dùng loại ống kính này để tránh sai số! Một chút suy luận là sẽ thấy ngay, ống kính không thể nhìn thấy được vật thể to hơn nó (lớn hơn đường kính ống), nên quên chuyện dùng để chụp phong cảnh đi, chủ yếu chỉ dùng để chụp những vật thể nhỏ và macro mà thôi!

bilge pump

ới cách đây độ 5 ~ 7 năm, cần mua một cái bơm chìm (bilge pump) để bơm nước cho chiếc xuồng, đây là loại tương đối đơn giản, chạy điện AC 12V và không cần phải có chất lượng quá cao ngoại trừ việc có thể đặt chìm trong nước! Nhưng tìm khắp Sài Gòn không có, phải lên Amazon đặt hàng, mà Amazon lúc đó thì không ship thẳng về VN! Và thế là quy trình để có được cái bơm như sau, lòng vòng nhiều bước: trước hết là đặt hàng trên Amazon, hàng bắt đầu được gởi đi từ… TQ sang Mỹ, đến một cái địa chỉ ở Mỹ! Tất cả những bước này, Amazon nó thể hiện ra chi tiết quá trình vận chuyển hàng cho mình biết! Địa chỉ này thực chất là một công ty logistics nhỏ, do một số người bạn tôi làm trong ngành logistics hùn hạp với nhau mở ra, xem như việc kinh doanh phụ thêm cho công việc chính! Công ty này sẽ gom nhiều đơn hàng và chuyển về VN một lần cho giảm chi phí! Về VN rồi vẫn chưa hết chuyện, còn phải ra Hải quan nhận hàng! Là cái công ty logistics kia có đường dây làm việc với Hải quan luôn, hàng giao nếu không có gì đặc biệt thì sẽ tính phí theo trọng lượng!

Còn nếu là dạng hàng hóa gì đặc biệt, lạ mắt, mà Hải quan nó để ý, thì sẽ còn phiền phức nhiều chuyện nữa! Và thế là lòng vòng mất hơn 2tr VND cho một cái bơm nhỏ xíu mà giờ đây lên Shoppee mua mất 200K kể cả tiền ship! Mà mới có mấy năm thôi, cái xứ gì mà thủ tục nhiêu khê, tác phong lề mề, làm gì cũng thấy bụi bay mù trời chứ chẳng thấy tiến triển! Thấy cái gì mới lạ thì phản ứng đầu tiên là sợ: ah, “nước ngoài” họ làm được chứ “ta” làm không được đâu, lúc nào cũng chỉ chực cơ hội “gian” và “ăn”, tự bản thân không muốn vận động, còn hễ mà thấy ai làm được cái gì là ghét và tìm cách phá! Thế nhưng ai phỉnh nịnh một vài câu chữ rẻ tiền đánh vào “cái tôi” là lấy làm sướng, có bao giờ tự nhìn cho rõ mình đâu!? Kỳ rồi đặt mua 2 miếng nhựa giá tổng cộng 20K, đặt xong mới để ý công ty nó ở Thượng Hải, ấy thế mà 7 ngày sau nó ship về tới nơi, không chê cả cái đơn 10 xu (cents), người ta làm ăn như thế thì mình chỉ có nước đi bán muối! 🙁 Về thành ngữ “đi bán muối”… ở các thành phố ven biển miền Trung, muối là thứ gì đó rất rẻ, phổ biến, thừa thãi, nên làm cái công việc đi bán muối dạo, tính từ góc độ hiệu quả làm ăn là hết sức kém, vô cùng kém!

overclock

huê con server của Amazon EC2 cấu hình 32 vCPU, 64 GB RAM, so với con Aquarium-PC của mình: 36 vCPU, 64 GB RAM, con của Amazon chạy nhanh hơn một chút, vì dù sao 2 con CPU Xeon của mình là đời cũ lắm rồi. Nhưng khi ép xung – overclock từ 2.3 lên 3.8 GHz thì con Aquarium-PC cho máy của Amazon “ngửi khói” lập tức! Nhưng ép xung cũng có nghĩa là tăng nhiệt, từ 60°C nhảy lên 75°C thường trực, và cũng phải tăng tốc độ quạt, tăng tiếng ồn. Đây là điều đành phải chấp nhận thôi, hoặc là phải có giải pháp tản nhiệt tốt hơn!

Giải pháp thì có, nhưng… kỳ công, phải học thêm nhiều kỹ năng nữa, nhất là cơ khí và CNC, mà tôi hiện tại chỉ có mấy kỹ năng làm mộc quèn mà thôi! Nói chung, xác nhận là tản nhiệt dầu vẫn có thể chạy tốt với máy ép xung được, nhưng thiết kế khâu tản nhiệt phải thật sự thông minh, thật sự hiệu quả! Viết một cái script nhỏ để bật / tắt việc ép xung cho Linux, chạy script là overclock + overvolt, tăng điện thế cấp cho các thành phần máy, chạy lần nữa là tắt tính năng này đi! Mới có mấy hôm mà kỹ năng viết shell-script của mình tăng lên thấy rõ!

vtables

rong post trước có nói về v-table, v-table là gì!? Với lập trình procedural truyền thống, gọi hàm thực chất là một lệnh hợp ngữ (Assembly), chỉ cần một lệnh JMP – Jump là nhảy ngay đến vùng nhớ chứa đoạn mã – hàm cần thực hiện! Nên gọi hàm trong ngôn ngữ C có tốc độ nhanh, nhanh đến mức không tưởng. Nhưng sự việc không đơn giản như vậy với các ngôn ngữ hướng đối tượng, như C++. Lấy ví dụ như: a->some_function(), trong trường hợp đơn giản nhất, ta cần nhảy 2 lần, lần đầu đến vùng nhớ chứa đối tượng (object) ‘a’, sau đó mới tìm trong vùng nhớ đó con trỏ đến hàm ‘some_function’ và nhảy thêm một lần nữa. Nhưng sự việc không đơn giản như vậy vì OOP có tính kế thừa, có nhiều phiên bản khác nhau của cùng một hàm ảo, những phiên bản này được chứa trong một cái bảng gọi là v-table, và việc gọi hàm lúc này bao gồm: 1. nhảy đến vùng nhớ bắt đầu đối tượng ‘a’, 2. tìm xem trong v-table của ‘a’ địa chỉ của hàm cần gọi, 3. nhảy đến vùng nhớ chính xác của hàm đó. Và cái bảng v-table này càng ngày càng lớn nếu kế thừa nhiều cấp, 20 ~ 30 cấp cũng là việc đã từng thấy! Sự việc bắt đầu trở nên phức tạp hơn nữa với những ngôn ngữ hỗ trợ đa kế thừa, đối tượng ‘a’ có thể kế thừa từ 1, 2 hay nhiều lớp khác nhau!

Lúc đó, compiler sẽ phải tạo ra nhiều v-table, và việc gọi hàm là một công cuộc tìm kiếm, tra bảng dài lê thê, thay vì chỉ một lệnh hợp ngữ JMP đơn giản! Thời gian tiêu tốn cho việc gọi hàm có thể giao động đâu đó trong khoảng 5 ~ 50% toàn bộ thời gian chạy chương trình. Đến tận ngày hôm nay, mấy chục năm sau khi các ngôn ngữ hướng đối tượng ra đời, bản chất của việc gọi hàm vẫn không đổi, và vẫn chưa có cải tiến nào mang tính cách mạng xảy ra! OOP đúng là một mô hình rõ ràng, dễ hiểu đối với lập trình viên, nhưng cực kỳ đau khổ cho những người làm compiler! OOP sinh ra, đầu tiên và trên hết là cho lập trình UI, mỗi cửa sổ, mỗi nút bấm trên UI là một đối tượng – object, nguyên thủy là vậy, về sau người ta mới mở rộng OOP từ UI sang những lĩnh vực khác! Nên những người làm ứng dụng lớn, cần tính lớp lang, cấu trúc rõ ràng, những người đó sẽ cảm thấy khó hiểu khi những coder ở mức thấp bên dưới chỉ thích procedural mà thôi! OOP đúng là rõ ràng và tiện lợi, nhưng không phải là cách tiếp cận duy nhất đối với các vấn đề lập trình, mọi việc có thể sẽ thay đổi! Và nhiều coder không hiểu vì sao một số người cố sống cố chết bám vào một số phong cách xưa cũ, vì… bản năng mách bảo rằng làm như thế mới là đúng! 🙂

thôi thủ

acebook nhắc lại ngày này năm trước… Không phải là lười xuống nước, nhưng đúng là gần một năm vừa qua cảm thấy thiếu ý tưởng và thiếu cả động lực, cảm thấy không tìm ra được ý tưởng gì mới mẻ. Mùa mưa coi như là đã về đi, chuẩn bị khởi động lại chương trình ra sông tập luyện! Một trong những điều cốt yếu của kỹ thuật brace và roll là sự tự nhiên, mềm dẻo…

Cơ thể mà căng cứng, lo sợ là sẽ không làm được! Nói theo một nghĩa nào đó thì giống như bạn đang “thôi thủ – 推手 – pushing hands” với nước vậy, mà nước thì vô cùng mềm dẻo! Không biết “thôi thủ” là gì thì tìm xem một vài phim tài liệu về Thái cực quyền nhé, các cao thủ chỉ cần chạm nhẹ cánh tay vào nhau là đã biết đối phương cao thấp như thế nào!

multiltool

ạn Trung Quốc, đôi khi bạn làm người ta thất vọng vì chất lượng quá bèo, nhưng cũng có đôi khi bạn làm người ta ngạc nhiên về hiệu quả, chất lượng trên giá thành. Chuyện là tôi đi mua cây kìm, nhãn hiệu NO-BRAND, hay VN ta hay dùng cái từ là hiệu… OEM! Giá mấy trăm ngàn, mới xài có một tí mà nó cong luôn cán, cong rõ luôn không xài được nữa, nói của đáng tội, tại xài việc mới hơi nặng nặng tí mà tay tôi lại hơi mạnh.

Lại đi mua cây khác, cũng thương hiệu NO-BRAND, giá 120K, hàng cứng cáp, xài tốt, hài lòng! Nên tình trạng là bỏ ra 2~5tr để mua 1 cây chất lượng châu Âu thì thấy nó không đáng, vì tầm chất lượng đó hiếm khi cần tới. Phân khúc còn lại thì nói tới nói lui… đều là hàng TQ nhập về, do kiểm soát chất lượng như thế nào mà thôi! Tình hình ở VN là có rất nhiều loại gian thương, bán hàng bèo nhèo nhưng với giá cao!

rust

hững cái thuộc về ngôn ngữ, 10 năm là ít, 30 năm chưa phải là nhiều, thời gian để cho một ngôn ngữ trưởng thành, trở nên chính chắn, cẩn trọng từng câu, từng lời, bảo đảm mọi điều nói ra phải có nghĩa chính xác. Nhiều người bảo, chỉ là một tập cú pháp – syntax thôi mà, nói sao không được!? Không phải vậy, đã từng có vô số cú pháp “nhảm” bị đào thải sau vài năm, đơn cử như là C#, C# đã từng có vô số cú pháp nhảm, nhảm đến mức thiểu năng, ngu xuẩn! Và cũng đã có một số cú pháp kiểu “chữa lành – chảnh lừa” như async – await vẫn tiếp tục lừa người thêm độ chục năm, cho đến khi người ta nhận ra chẳng có lợi ích gì ngoài những câu chữ oang oang, trơn tuột! Và cũng đã có những ngôn ngữ đã dùng trên hai mươi năm nhưng rồi cuối cùng thì người ta quyết định: thôi, tốt hơn là… bỏ, không đi tiếp nữa, ví dụ như Obj-C, Flash, thậm chí có thể cả Java! Nhưng chừng đó năm cũng đủ cho người ta mường tượng ra được một ngôn ngữ “tốt” tương lai nó sẽ trông như thế nào!

ầu tiên là nó phải giống C, điều này… đơn giản như chân lý vậy, cứ phải giống C thì mới tốt! Thứ hai, ngôn ngữ phải strong-type, có kiểu rõ ràng và kiểm tra kiểu khi biên dịch, không đợi đến khi chạy. Thứ ba, dù gọi tên gì: reference, optional, thì cũng phải làm cho người ta hiểu rằng đây là con trỏ – pointer, ở điểm này thì C thẳng thắn đến mức trần trụi! Thứ tư là quản lý bộ nhớ bằng RC (reference counting) và thêm lần nữa, phải làm từ lúc biên dịch (compile time), đừng đợi đến đến lúc run-time, quên garbage collector và những thứ khác đi! Thứ năm là làm sao để lập trình concurrent, thread, process dễ hiểu hơn! Và cuối cùng, rất quan trọng, là dù thời đại đã đi tới mức zettabyte, nhưng một ngôn ngữ vẫn phải thật sự hiệu quả, hiểu theo nghĩa phải đếm từng bits khi cần. Xét những tiêu chí đó thì có lẽ Rust sẽ là ngôn ngữ phổ thông kế tiếp, dần thay thế C++! Đã nói rồi, phải cải tiến trước rồi hãy dùng, đừng dùng xong mới cải tiến, gọi là ++C có phải đã tốt rồi không!? 😀

Đương nhiên, đây là ngôn ngữ phổ thông (general purpose) ở mức thấp (low level), những lĩnh vực đặc thù vẫn sẽ có những ngôn ngữ riêng! Nhưng với một ngôn ngữ phổ thông cấp thấp, ưu tiên hàng đầu là performance, những thứ khác vẫn chỉ là phụ. Rust thậm chí còn chưa phải là một ngôn ngữ OOP – hướng đối tượng đúng nghĩa, theo nghĩa ta thường hiểu trong C++ hay Java. Nói cho đúng hơn là mô hình OOP của Rust được thiết kế để ưu tiên cho performance, chứ không phải cho sự tiện lợi của người viết code! Thậm chí ta còn có thể đặt câu hỏi rằng, có thực sự cần OOP hay không, ví dụ như glibc chỉ dùng “struct” chuẩn của C để biểu diễn “class” đó thôi! Nhưng qua đó cho thấy rằng, đã rất nhiều thế hệ, phiên bản khác nhau của C++ rồi, mà vẫn không giải quyết được bài toán vtable – gọi hàm hướng đối tượng làm sao cho hiệu quả. Nên Rust nó đành phải đổi một cách tiếp cận khác, mang tính chất lai lai, một nửa là OOP và nửa còn lại vẫn là functional theo kiểu C truyền thống!

Quá trình hình thành một ngôn ngữ thực chất phản ánh muôn mặt của cái cộng đồng làm ra và sử dụng nó. Đầu tiên là từ góc độ tương đối hàn lâm, ngôn ngữ phải thể hiện được tính đúng đắn và hiệu quả tính toán! Cái yếu tố “hiệu quả – performance” này là yếu tố quyết định, đôi khi nó phủ quyết (veto) tất cả những yếu tố khác. Tiếp nữa mới đến chuyện cú pháp rõ ràng, tiện lợi, thân thiện với lập trình viên. Kế đến nữa mới là chuyện tổ chức, lớp lang, các hệ thống thư viện phụ trợ để dễ dàng phát triển phần mềm! Phần lớn lập trình viên chỉ tranh luận phía trên bề mặt, cú pháp như thế này, lớp lang như thế kia, họ không hiểu rằng yếu tố tiên quyết của một ngôn ngữ là vấn đề hiệu suất (performance). Những ngôn ngữ bỏ lơ vấn đề này… đều có kết cục thê thảm!!! Như Objective-C, người ta bỏ vì nó đã trở thành một con quái vật, phức tạp đến mức vô lý, hay như một số code React – TypeScript, mới viết có cái app Hello-World là đã chiếm mất hơn 3GB đĩa cứng.

khổ đế

ó một ku trên mạng xã hội nhảy vào làm quen, em cũng học Khoa CNTT, Đại học KHTN, em học chuyên ngành xử lý ảnh, blablabla các kiểu. Mình bèn gởi cho một cái ảnh và giả vờ hỏi: bạn đã từng gặp người này chưa, có biết người trong hình là ai không? Và nhận được câu trả lời: em không biết là ai, còn chưa thấy cái hình này bao giờ! Trong hình là người mẫu Lena Forsén, nhưng là ai không quan trọng, quan trọng là từ suốt mấy chục năm nay, học nhập môn xử lý ảnh là người ta đã dùng cái hình này để test thuật toán, nó là cái hình đầu tiên trong bộ dữ liệu test chuẩn! Nên kiểu nói “đam mê” bộ môn xử lý ảnh các kiểu, mà không biết cái hình này là chuyện không bao giờ có, tuyệt đối tào lao! Nên ta nói, không có cái giống nào như cái giống Việt, luôn mạo danh, luôn ra vẻ, lúc nào cũng có muôn ngàn cái mặt nạ khác nhau, luôn tỏ ra nguy hiểm dù không tự ý thức, không tự luận ra được ngu chỗ nào!

Có những chuyện người ta chỉ cần thoáng qua vài giây hay làm vài phép thử đơn giản là nhìn ra chân tướng ngay! Đó là còn chưa kể đến những cái não trạng bệnh hoạn, và những dạng bệnh lý lan truyền, phản ảnh, phản chiếu lẫn nhau giữa các tấm gương méo mó trong cộng đồng! Haiza, đúng là khổ mà, chính là chữ “khổ” trong “khổ đế” mà Đức Phật đã đề cập với Tứ diệu đế! Khổ ở đây không mang nghĩa đắng cay, cực khổ, như chúng ta vẫn thường hiểu. Nguyên nhân gây ra sự hiểu sai lệch này là do đọc thông qua Hán văn chứ không hiểu từ nguyên văn Phạn ngữ. “Khổ” theo những diễn giải hiện đại hơn là sự hoang mang giữa những giá trị nội tâm, là sự vô minh, loay hoay không tự định hướng, không tự xác tín được, là sự luôn luôn vọng động, chấp nhặt vào muôn ngàn điều giả tạo! Nói một cách gần đúng, chính sự không quán chiếu được nội tâm nên tự gây ra “khổ” cho bản thân mà thôi!

parade

hông lệ hàng năm, 9 tháng Năm là ngày Gấu Nga trình diễn, khoe cơ bắp! Xem mãi các cuộc diễu binh cũng chán, mời các bạn xem trích đoạn bộ phim Người thợ hớt tóc ở Siberia, đoạn Sa-hoàng Alexander-3 dự lễ tốt nghiệp của các sĩ quan. Phim dựng lại theo đúng lịch sử, Alexander-3 là người to lớn, vạm vỡ với sức mạnh phi thường, cầm nguyên bộ bài Tây 54 quân, ông ta xé nó thành 2 mảnh. Hay đang ăn với chiếc đĩa bạc, ông ta dùng tay cuộn tròn cái đĩa lại như người ta cuộn miếng bánh tráng vậy! Cái trò dùng tay cuộn đĩa kim loại này, đã có nhiều đời Sa-hoàng biểu diễn trên các bàn tiệc ngoại giao như một cách… hù dọa đối phương!

Phim có đoạn Sa-hoàng Alexander-3 trò chuyện với hoàng hậu Maria Feodorovna bằng tiếng Anh: – Em còn phải lặp đi lặp lại bao nhiêu lần nữa, tại sao anh không bao giờ nghe em, Michael còn quá nhỏ, nó rất dễ bị kích động bởi các cuộc diễu binh cũng như các trò chơi quân sự. Alexander 3 trả lời rất hóm hỉnh, cũng bằng tiếng Anh: – Nếu tôi mà nghe theo em á, thì đến tận bây giờ chúng ta còn chưa có con được đâu! 😀 Haiza, xem phim để thấy rằng, đây đúng là một dân tộc kiêu hãnh và mạnh bạo, một nền văn hóa đầy màu sắc, một loại âm nhạc sinh động, tuôn chảy, phức tạp! Luôn tràn đầy sức sống, luôn luôn tiến về phía trước!