PKC

ôm na về mã hoá khoá công khai (public-key cryptography) cho nhiều người dễ hiểu, cái này chỉ cần toán cấp 2, 3 thôi! Ta lấy hai số nguyên tố rất lớn: p1 và p2 nhân với nhau, kết quả được một số nguyên siêu lớn: n = p1 x p2, n được gọi là khoá công khai (public key), còn bộ (p1, p2) được gọi là khoá bí mật (private key)! Đây cũng giống như hai mặt của một đồng xu, nếu biết trước (p1, p2) thì tính ra n rất dễ (chỉ là một phép nhân), nhưng ngược lại, khai triển luỹ thừa, từ n lần ngược trở lại (p1, p2) là siêu khó, ngay cả siêu máy tính cũng có thể mất nhiều triệu năm mới giải mã được! Về bản chất toán học, vấn đề chỉ đơn giản là như thế!

Đi sâu vào sẽ có nhiều điều phức tạp hơn! Nếu anh X được cấp bộ 2 khoá, thứ nhất là khoá công khai: n, và thứ nhì là khoá bí mật: (p1, p2), anh ta sẽ bỏ cái khoá công khai n đó lên internet hay ở nơi nào đó để ai cũng đọc được, và đương nhiên, giữ bí mật cặp (p1, p2). Nếu Y muốn gởi mật thư cho X, Y sẽ mã hoá dùng khoá công khai n (của X), và thông điệp đã mã hoá đó chỉ có thể được giải bằng (p1, p2) mà thôi! Điều ngược lại cũng đúng, nếu X gởi đi một thông điệp có thể giải mã thành công nhờ khoá n, thì điều đó có nghĩa là: chắc chắn nó đã được mã hoá bằng (p1, p2), xác nhận được gởi đúng từ anh X, đây chính là cách xác thực chữ ký số!

Ưu điểm của mã hoá khoá công khai chính là… nó công khai, không mất công phân phối, chuyển giao “khoá” như các phương pháp khác, và khoá bí mật chỉ giữ riêng cho chủ nhân của nó! Ưu điểm cũng là khuyết điểm, cần có một tổ chức đứng ra xác thực khoá công khai này đúng là thuộc về ai đó! Ngoài ra, mã hoá khoá công khai có thể được dùng để bổ trợ cho mã hoá khoá bí mật (như các phương pháp dùng trong quân sự), chính là dùng phương pháp công khai để truyền tải khoá bí mật, rồi dùng khoá bí mật để mã hoá / giải mã tài liệu, như thế có thể đổi khoá bí mật định kỳ, thường xuyên một cách dễ dàng, nhanh chóng mà vẫn an toàn!

Quốc phòng vẫn chuộng sử dụng các phương pháp mã hoá khoá bí mật, đơn giản là vì tốc độ xử lý! Khoá công khai dùng những số nguyên cực lớn nên tính toán tương đối mất thời gian, nhất là với dữ liệu lớn như âm thanh, hình ảnh! Có người lo ngại những thế hệ máy tính lượng tử mới có thể giải các loại khoá này, điều đó là có thật, nhất là với các khoá đã dùng, có sẵn! Nhưng nếu ta tăng p1 & p2 lên, dùng những số nguyên tố lớn hơn, thì tính toán lượng tử cũng sẽ bó tay! Năng lực “lượng tử” dùng để phá mã đó thực ra cũng có thể được dùng để tìm ra những số nguyên tố lớn hơn, “ma cao một thước thì đạo vẫn có thể cao lên một trượng”! 🙂

retina

ấy chục năm ôm máy tính, đủ các chủng loại, kích cỡ, tự hào là có con mắt tốt, không hề hấn gì dù một ngày cả chục tiếng nhìn màn hình! Một mai thức dậy, mắt mờ mờ, đầu điểm bạc, mới hay thời gian không đùa với ai bao giờ. Hãi quá bèn chạy đi mua cái màn hình mới, chất lượng xấu nhưng kích thước to hơn. Giờ thì xài con Macbook như… desktop, màn hình, phím, chuột gắn ngoài (không dây)!

Nguyên nhân chính là cái màn hình Retina, chữ quá mịn, nhưng cũng quá nhỏ, cực kỳ hại vì mắt phải điều tiết liên tục! 🙁 Tuy chỉ là giải pháp tạm thời, nhưng chứng đau nhức mắt giảm bớt ngay lập tức! Được dịp quay trở về với cái bàn phím truyền thống, dù đã làm việc trên nền MacOS hơn 10 năm nhưng thỉnh thoảng vẫn còn nhớ phím Home và End, mới hay thói quen hình thành lâu đời không dễ bỏ!

hồi quy

á ơi, đúng vào cái môn ghét và dốt nhất thời đại học, xác suất thống kê (XSTK), nào là hồi quy tuyến tính (linear regression), nào là định lý Gauss-Markov, nào là phương sai (variance) và hiệp phương sai (covariance), nào là đa cộng tuyến (multi-collinearity)… Thuật ngữ toán học thì mình khá rành về phần hình, số, đại số, những phần khác thì nói chung là mù. Hơn 20 năm sau khi rời ĐH, lại rơi vào cái môn XSTK trời đánh… 🙁

Ở Việt Nam, trong giảng dạy các ngành, Toán khác hẳn với tất cả các môn còn lại ở chỗ… nó đã xây dựng được một bộ thuật ngữ tiếng Việt tương đương, tương đối đầy đủ. Và xin nói để các bạn cùng biết, mỗi một khái niệm “đơn giản” kể ra trên đây, phát biểu vô cùng đơn giản, nhưng cần nhiều năm để hiểu, để “ngộ” nó… Cho đi lại từ đầu, chưa đi vội về sau, xin đi từ thơ ấu, đi vui và bên nhau… (Kỷ niệm – Phạm Duy)

Kỷ niệm - Thái Thanh 

chatgpt

hân chuyện ChatGPT và các thể loại AI xôn xao dư luận gần đây. Có nhiều cách nhận định khác nhau, đương nhiên không nên đánh giá thấp vai trò của trí tuệ nhân tạo và ứng dụng của nó, nhưng bảo máy móc có trí tuệ thì chắc chắn là không! Nói ngắn gọn thế này: sáng tạo là đặc quyền của con người (hay đúng hơn là của một số người), là khả năng đi vào những vùng chưa biết, những lỗ đen kiến thức, khai phá, lập thuyết, chứng minh, etc… Chừng nào mà AI nó chứng minh được Bổ đề cơ bản, ví dụ như thế, thì tôi mới tin là máy có trí tuệ. Còn lại, máy nó chỉ lặp lại những kiến thức thu thập được, càng ngày càng nhiều, dùng khả năng siêu tốc độ của mình để xử lý, tối ưu, và trình bày ra dưới một dạng khôn khéo mà thôi! Mấy ông già “biết tuốt” VN chắc khoái con ChatGPT này lắm, cái gì cũng biết…

Có người đưa các ví dụ AI có thể tối ưu hoá những đoạn code, rồi vẽ ra viễn cảnh máy có thể code được! Chuyện này theo tôi vẫn còn xa, xa lắm! Máy nó chỉ lặp lại một số “bài” được học thôi, vì học quá nhiều nên đôi khi còn có vẻ “giỏi” hơn cả coder – con người! Và thực ra cũng có một số coder giống như thế (giống máy): rất giỏi logic, test IQ, giỏi xử lý các “câu đố” được đưa ra, nhưng kỳ lạ thay, không code được, hoặc code nhưng không giỏi, tại sao thế? Tại vì cái anh chàng “thông minh” đó thực ra chỉ “thuộc bài”, phỏng vấn các vòng đều rất ấn tượng, và cũng đôi khi là “thông minh” thật, giỏi “làm tính, giỏi logic”! Nhưng code, hiểu theo nghĩa rộng, là đi giải một bài toán thực tế, mà giải quyết vấn đề thực tế thì đôi khi “thông minh” chưa đủ, như trên đã nói, “phát minh, sáng tạo” là đặc quyền của con người.

Việc lặp lại “như vẹt” một số kiến thức đã biết chỉ tạo ra được sự “thông minh”, hay “có vẻ thông minh”, chứ không tạo ra được “phát minh, sáng kiến”, không tìm ra hướng đi mới, cách tiếp cận đúng, tìm ra giải pháp hữu ích giữa những cái “hỗn mang, vô tri, bất định”. Cuộc đời của mỗi con người đều giống như “Miếng da lừa” (tiểu thuyết của Honoré de Balzac), có bao nhiêu sinh lực dành để nhớ những kiến thức không thực sự cần thiết, những thông tin vụn vặt cốt chỉ để “loè người” hay để theo đuổi những mục đích “bất chính, bất thiện” thì đương nhiên không còn năng lực để theo đuổi những tri thức hữu ích đích thực. Thông tin thì càng ngày càng nhiều, “Hằng hà sa số” như thế, làm sao mà nhớ hết nổi?! Chuyện học “nhồi nhét kiến thức” đã nói rồi, chuyện “trọc phú tri thức” cũng bàn rồi…

Nhưng tiếc thay, lại sa đà vào mớ trừu tượng “kiến thức nguyên bản” một cách vô bổ, không đưa ra được kết luận gì hữu ích. Nhưng không ai nói cho rõ “kiến thức thật sự, kiến thức có thể sáng tạo” nó là như thế nào, bắt nguồn từ đâu, làm sao để có. Tôi cũng không hiểu lắm, nhưng cho rằng nó liên quan mật thiết đến cảm hứng sống, đến động cơ, mục đích của con người, đến sự can đảm đối diện với bản thân, và có lẽ là, từ trong sâu thẳm, liên quan đến bản chất “hướng thiện” của mỗi người! Trở lại chuyện ứng dụng ChatGPT, chuyện chẳng có gì to tát, các bác cứ làm quá lên! Chỉ là một cỗ máy thuộc bài, lặp lại như vẹt mà thôi! Nói cho đúng là một phần lớn báo chí và cư dân MXH VN về dân trí cũng cỡ đó, như cái thùng rỗng vọng lại những thứ người ta dội vào, viết tiếng Việt thì trúc trắc đọc không được…

Dịch tiếng Anh thì ngô nghê, tối nghĩa, trình ngôn ngữ e là chưa bằng máy! Và chính vì dân trí đang là như thế… nên ChatGPT rồi cũng là công cụ như Wikipedia mà thôi, ý tôi tức là một công cụ… nô dịch tư tưởng! Ví như đám lưu manh trên mạng, mỗi lần có tranh cãi gì là chăm chăm đi sửa Wiki theo hướng có lợi cho mình! Không thể phủ nhận Wiki cũng là nguồn thông tin hữu ích, nhưng nó cũng chỉ là “cái chợ” của con người, có đủ thứ “thượng vàng hạ cám” ở trên đó. ChatGPT rồi cũng sẽ được dùng như một công cụ “nô dịch tư tưởng”, dùng cho những loại óc “bã đậu”, chuyển giao “thông tin” dưới dạng “mì ăn liền”, cái “thông tin” đó được nguỵ trang là “kiến thức”, “tri thức”, là “chân lý”. Nếu có sợ là sợ cho những thành phần dân trí quá thấp, nói gì cũng nghe, chứ ai lại đi sợ cái máy!?

Ai cũng biết, sự học thuộc lòng (dù nhồi nhét) chính là điểm khởi đầu của giáo dục, trẻ con đâu có biết gì nên cứ phải ép nó học thuộc một số “nguyên liệu thô” ban đầu, kiểu như: Nhân chi sơ, tính bản thiện, tính tương cận… ChatGPT, tôi xem như đứa trẻ 3, 4 tuổi, bắt đầu bi bô những kiến thức đầu tiên. Và kệ mịa nó nói gì, lớn lên rồi thì nhiều người sẽ dễ dàng đồng ý là: Nhân chi sơ, tính bản ác! Trở lại với ChatGPT, tôi vẫn xem nó là “con vẹt” học tiếng người, thấy con chuột đến giả tiếng mèo để đuổi chuột đi, thấy con mèo tới giả tiếng người nạt nộ để đuổi mèo đi. Nếu là vẹt thì người ta kêu là nó thông minh, nhưng nếu là người, mà suốt ngày lặp lại mãi một số ngôn từ vay mượn, máy móc, vô nghĩa, chả có tí nội hàm, nội tâm nào, cứ mãi “giả tiếng”… thì người ta kêu bằng: “thiểu năng trí tuệ”.

games

Thực ra viết con game để chơi là phụ, chính yếu vẫn là muốn thử nghiệm các kỹ thuật khác nhau với “lambda function – anonymous function – hàm không tên”!

ự viết con game Solitaire này mấy năm trước, nhưng lười, không bỏ lên AppStore. Game mà tôi tự viết để tự chơi thì cũng khá nhiều, viết vì kiếm không được game tương tự đúng ý, cái thì quảng cáo quá nhiều, cái thì đồ hoạ quá xấu, cái thì nặng nề, tốc độ quá chậm, chạy không mượt, mà tôi chơi Solitaire, mấy ngón tay bấm liên hồi như đánh piano vậy! Trò Solitaire chuẩn chơi trên máy Windows tối đa chỉ 24K điểm, nhưng cầm cái iPad mà chơi thì trên 30K điểm là chuyện thường! 🙂 Game này viết chỉ một source code, chạy trên tất cả các nền Apple (Mac, iPhone, iPad…), làm cái engine sẵn, đọc game rules từ file lên, hiện tại hỗ trợ đến 99 biến thể (variant) Solitaire khác nhau!

Nhớ lại đợt Sài Gòn giãn cách XH vì Covid-19, suốt ngày chỉ có chơi game giải trí, hoặc làm mộc, cưa bào, đục đẽo để vận động tay chân! Nói về chơi game, căn bản đó không phải là chuyện gì xấu, nhưng tôi thường chỉ chơi game logic đơn giản, mỗi ngày chơi 15 ~ 30 phút tối đa, không chơi các game có kịch bản hay những game mất quá nhiều thời gian! Tác hại của game đối với giới trẻ không cần phải nói, nhưng lỗi không nằm ở game, lỗi ở xã hội và giáo dục, tạo ra cho chúng nó một môi trường nghèo nàn, một tâm hồn trống rỗng, như cái lỗ đen sâu hoắm, nên ngoài những thứ vớ vẩn, nhảm nhí ra, chúng nó không còn biết điều gì khác, riết rồi thành thần kinh, bệnh hoạn và tệ nạn! 😢

toán

ối tiếp post trước, minh hoạ bằng một screenshot – chụp màn hình. Đến tận bây giờ vẫn còn xài khá nhiều toán, không phải là Toán cao cấp (vi phân, tích phân, đạo hàm, xác suất thống kê, etc…) mà chủ yếu là Toán rời rạc (discrete mathematics) và Thuật toán, thuật giải, thêm một chút Hình và Số… Chính là vì mấy cái này nên code vẫn còn có vài niềm vui, ngoài những chuyện debug phức tạp, nhức đầu, mệt mỏi và vô số những công việc… trâu bò khác!

Ở một góc nhìn khác, có thể… nhìn code đoán tuổi! Những người viết mã thành khối 80 cột như tôi có nguyên nhân sâu xa từ cái thời còn trên x86 và DOS, lúc đó màn hình text có kích thước 16 (dòng) x 80 (cột), còn màn hình thời bây giờ viết đến 160 cột có khi vẫn chưa xuống hàng! Đến tận giờ tôi vẫn cho rằng bắt đầu từ tầng thấp – low level là một điều nên làm, phần lớn coder bây giờ cái gì cũng biết, công nghệ nào cũng rành, chỉ một điều là không… rành code! 😅

The fallacy of high-level programming

For the last 5 years or so, I’ve stopped writing on technical subjects on this blog. But that doesn’t mean I stop writing completely, in fact, I keep on writing a lot, but keep them to myself instead of posting out. For reasons too numerous to tell, or to be short, just because… I’m lazy… Software engineering is a still a relatively – young industry, hence… naivety, untruthfulnesses, deceptions, myths, lies, and dogmas are… countless. In that environment, writings could be controversial and misleading, so I choose to note down my ideas in private.

started with Turbo-C on DOS, then move on to different dialects of the C language: Watcom C, Borland C++, C++, glibC, Obj-C… For me, the most important thing in programming is… crashes. It crashes right away to tell you that you’ve done something wrong! It crashes when you access a null pointer, it crashes when you use an API the wrong way, it crashes when you allocate an infeasible amount of memory, it crashes when you access a dangling pointer referencing to an object which has gone out of scope, just because you can’t keep a right tracking on the life-cycle of that object. It doesn’t even throw an exception and try going on until the situation is unmanageable. Simply put, there’s NO exception, you’re punished immediately, as soon as you’ve done something wrong!

I strongly advocate the use of ARC for memory management, in fact, I would call it the most brilliant feature of the Obj-C language for the last 25 years or so, ARC makes life much more easier. But I also advocate the use of crashes as a “graceful” way to tell that you’ve done something wrong with the deallocated blocks. It crashes right away when you allocate an unbearable amount of memory so that you would know that your algorithms and data – structures are not efficient enough, and you will need to improve, to do tuning, optimization! For me, modern languages are good and friendly, the down side is that it’s also too friendly to the developers, without punishments, how can the devs’ skills could be improved!

Thus, by the interacting between you – the coder and the computer & compiler combination, the reward – punishment model will help greatly boost the devs’ skills over time, and help producing good code. There’re huge differences between an experienced programmer who write good code, and foresee possibilities of bugs, and a novice one who only try to make it… just run. I really want to emphasize here, that the “reward – punishment” model of programming is what made a good programmer! Also by learning to handle memory problems by yourself give you opportunities to follow and understand the life cycles of objects, of memory blocks, understand the precise flows of code, understand the cost-and-benefits of each coding approaches.

To summarize about languages, C is like Sanskrit, extremely precise and accurate, rigid grammar, strong types, all syntaxes has profound implications. High level languages such as Swift, .NET, JavaScript, etc are like… Vietnamese, lacking a good grammar, and quite vague and inconsistent in meanings. Of course, learning C is hard, not everyone want to do things the hard way. On the other hand, it’s too easy to quickly draft up some simple apps in high-level languages, which would naturally give a fallacy that devs are good, whatever they write, it seems to run “smoothly and perfectly”! Of course, high-level languages have their roles, for examples, to make some prototyping… until things get huge and complex!

e-ink display

iện tại, giá còn hơi chát, nhưng tương lai 1, 2 năm nữa, có một viễn cảnh như thế này: máy tính của coder nên có hai màn hình, một LCD truyền thống, và một e-ink, trong ảnh là màn hình e-ink Dasung, cty trụ sở tại Bắc Kinh, TQ (đã có màn hình kích cỡ 25.3 inch). Tất nhiên, nhiều thao tác máy tính vẫn cần đến màn hình đầy đủ mầu sắc.

Nhưng với một coder – lập trình viên mà nói, một ngày có khi hơn 12 tiếng, phần nhiều chỉ edit text, thì màn hình e-ink hoàn toàn không phát sáng, đúng nghĩa là “giấy trắng mực đen”, có thể bảo vệ mắt tốt hơn rất nhiều, càng tốt hơn nữa nếu có thể hiển thị 256 mức xám! Xứ sở phát minh ra giấy, đương nhiên sẽ làm giấy điện tử thật tốt! 😀

giáo dục thể chất – 1

ây là hệ quả của cái lối: “chơi thể thao một cách triết học, và suy nghĩ triết học một cách thể thao”! 😃 😛 Ai cũng biết sức khoẻ, thể chất là nền tảng của mọi điều, ấy thế mà vẫn chỉ “thể dục, thể thao” trên giấy, vẫn cố viết “sách”! Riết rồi suốt ngày chỉ loanh quanh với ba cái ngôn từ vớ vẩn thôi, tìm cách “chơi chữ”, tìm cách “hơn người” bằng hoạt ngôn xảo ngữ, chứ động tay động chân thì không muốn và không làm được!

Không chỉ như thế, nó ảnh hưởng suốt về phần đời sau của đứa học sinh! Học cái gì cũng không có “hành”, chỉ lải nhải một mớ lý thuyết, ngôn từ chết! Học cái gì cũng lớt phớt bề mặt, không có chiều sâu, không có công phu! Nói đâu xa, ngay trong giới lập trình viên hiện tại, 10 người thì hết 9.5 người, hỏi cái gì cũng biết, công nghệ nào cũng biết, trên trời dưới đất, chỉ có điều là những kỹ năng lập trình phức tạp, thực tế thì không làm được!

CMM

hớ lại cách đây 15~20 năm, các công ty phần mềm, nhà nhà trưng bảng CMM level 5. Ai nấy đều tung hô như kiểu tiêu chuẩn vàng thần thánh! Mà tôi là kiểu dị ứng với kiểu hình thức rỗng không có nội dung! Ai đọc spec CMM rồi sẽ hiểu, đến giờ ý kiến cộng đồng về CMM cũng đã rõ!Ngay lúc đó tôi đã nói với các anh em kỹ thuật: CMM5 cũng giống như “5 điều Bác Hồ dạy”, nghe thì rất hay, có cũng tốt!

Vấn đề là chẳng có gì bảo đảm đứa trẻ làm theo sẽ trở thành người tốt, cũng như không có gì bảo đảm có CMM5 thì làm phần mềm có chất lượng! Bao giờ chúng ta tự nghĩ được nội dung, tự tạo được giá trị, thì lúc đó chúng ta mới thôi bị người khác áp đặt tư tưởng, thôi bị lung lạc trong mớ sáo rỗng! CNPM mới có vài chục năm lịch sử, vẫn rất non trẻ so với những ngành khác, nên giáo điều, sáo rỗng là… vô số!