Sắp xếp (sort) string Tiếng Việt

Một vấn đề không hề mới, xưa như năm 1991, và có vẻ đâu đó đã được giải quyết 😒

Vậy nhưng nếu thử hỏi một lập trình viên sử dụng ngôn ngữ lập trình bất kỳ hãy viết một đoạn code sắp xếp những cái tên sau theo thứ tự của tiếng Việt:

Kết quả thu được sẽ khá bất ngờ:

Lẽ ra, thứ mà chúng ta muốn nhìn thấy phải là “Hưng Yên” đứng cuối list, khi mà chữ “ư” đứng sau tất cả các phụ âm khác.

Vậy function sorted có bug?

Hãy thử xem codepoint của từng chữ cái thứ 2 trong mỗi từ:

Vậy sorted hoàn toàn không sai, nó sắp xếp các chữ cái theo thứ tự các xuất hiện trong bảng mã Unicode (codepoint). Chữ “ư” nằm ở vị trí 432, đứng trước chữ “ậ” với vị trí 7853.

sorted đã đúng, nhưng đây không phải cách sắp xếp chúng ta mong muốn.

Vậy điều gì ảnh hưởng đến thứ tự khi sắp xếp của các chữ cái? Rõ ràng nếu theo chuẩn của người Mỹ, người ta sẽ sắp xếp như trên, nhưng trong bảng chữ cái tiếng Việt, thứ tự lại khác. Những thứ liên quan đến ngôn ngữ địa phương như vậy được biểu diễn lên máy tính bằng khái niệm “locale”.

Locale là gì /ləʊˈkɑːl/

  • English: a place where something happens or is set, or that has particular events associated with it
  • Vietnamese: mội nơi mà điều gì đó xảy ra hoặc có những sự kiện gắn liền với nó.
  • Một chương trình hỗ trợ locale là chương trình tôn trọng sự lựa chọn dựa trên nền tảng văn hoá của người dùng, như bảng chữ cái, cách sắp xếp và cách viết số (người Việt Nam thường dùng dấu , trong số thực: 1,5. Người châu Mỹ lại dùng dấu .: 1.5) (Dịch theo tài liệu của Postgresql)
  • Một locale là một bộ luật ngôn ngữ và văn hoá. (theo manpage của Ubuntu)

Locale không chỉ là khái niệm của riêng ngôn ngữ lập trình nào mà đòi hỏi là hỗ trợ của toàn hệ thống. Các hệ điều hành (OS) đều hỗ trợ đặt các và sử dụng locale khác nhau.

Cách biểu diễn một locale

Một locale thường được biểu diễn ở dạng “ngônngữ_quốcgia”:

  • en_US (U.S. English)
  • fr_CA (French Canadian)
  • vi_VN (Vietnamese Vietnam)

Trên hầu hết các hệt thống UNIX (Ubuntu, OSX …), có thể liệt kê các locale đang hỗ trợ trên máy bằng lệnh locale -a:

Các locale có thể được cài thêm, ví dụ trên Ubuntu 16.04, locale Việt Nam không được cài sẵn, phải cài thêm package language-pack-vi để có locale vi_VN:

Nếu có nhiều hơn một bộ ký tự cho một locale, có thể chỉ rõ ra nó ở dạng: “ngônngữ_quốcgia.bộkýtự”: Ví dụ:

  • vi_VN.tcvn (Tiêu chuẩn Việt Nam, hay VNS)
  • vi_VN.utf8
  • vi_VN.vscii (Cho ngang ngửa với ASCII của Mỹ 😜)

Danh sách một số locale phổ biến hỗ trợ bởi GCC, hay danh sách đầy đủ của OS, hay trong code của module locale của CPython

Khi không có locale nào được set, locale mặc định là C hay POSIX.

Locale categories

Đôi khi, người ta lại muốn dùng bảng chữ cái của Việt Nam, nhưng đơn vị tiền tệ của Mỹ, thời gian theo format của Anh, những nhu cầu lẫn lộn này được đáp ứng bởi locale sẽ chia nhỏ thành “locale subcategories” và mỗi category sẽ điều chỉnh một khía cạnh của luật locale:

  • LC_COLLATE: thứ tự sắp xếp string /kəˈleɪt/, ảnh hưởng đến các function strcoll, strxfrm
  • LC_CTYPE: phân nhóm chữ cái (đâu là một chữ cái, chữ cái dùng 1byte hay nhiều bytes? chữ viết hoa tương ứng của mỗi chữ là chữ nào?)
  • LC_MESSAGES: ngôn ngữ của message
  • LC_MONETARY: format (định dạng) của tiền
  • LC_NUMERIC: format của số
  • LC_TIME: format của ngày tháng
  • LC_TELEPHONE: format số điện thoại
  • … còn nhiều
  • LANG: default cho các LC_*
  • LC_ALL: tất cả các category nói trên.

Thứ tự xử lý locale

Các locale category thường được set làm biến môi trường.

  • Nếu LANG không null thì giá trị của LANG được sử dụng làm default cho tất cả các giá trị không được set / null khác.
  • Nếu LC_ALL được set, không null, thì giá trị của LC_ALL sẽ được sử dụng, thay cho tất cả các giá trị khác.
  • Nếu biến nào được set không null thì biến đó được sử dụng. Vậy mức ưu tiên là: LC_ALL > LC_* > LANG

Theo http://manpages.ubuntu.com/manpages/xenial/en/man1/locale.1posix.html

Set/get locale trên Python

Trên một máy có locale vi_VN, có thể thay đổi và xem đơn vị tiền tệ:

Chú ý việc set này chỉ có tác dụng tại phiên làm việc hiện thời. Để thay đổi locale của toàn hệ thống (Ubuntu), phải thay đổi trong /etc/default/locale

rồi chạy locale-gen.

Sắp xếp string theo kiểu Việt Nam

Nếu đã đọc đến đây và hiểu những gì viết trong bài thì bạn sẽ biết rằng thứ tự các chữ cái khi sắp xếp phụ thuộc vào locale category: LC_COLLATE

Giờ thì Hưng Yên đã đứng cuối list 😍.

Tham khảo

Bài viết gốc: https://pymi.vn/blog/sap-xep-tieng-viet/

Tháp nhu cầu của Maslow

Nguồn: Bách khoa toàn thư mở Wikipedia

Tháp nhu cầu của Maslow (tiếng Anh: Maslow’s hierarchy of needs) được nhà tâm lý học Abraham Maslow đưa ra vào năm 1943 trong bài viết A Theory of Human Motivation và là một trong những lý thuyết quan trọng nhất của quản trị kinh doanh; đặc biệt là các ứng dụng cụ thể trong quản trị nhân sự và quản trị marketing.

Căn bản của lý thuyết
Theo Maslow, về căn bản, nhu cầu của con người được chia làm hai nhóm chính: nhu cầu cơ bản (basic needs) và nhu cầu bậc cao (meta needs). Continue reading “Tháp nhu cầu của Maslow”

10 năm Breaking Bad: Cảm ơn vì những điều tồi tệ “tuyệt vời”!

Năm 2008, chúng ta chứng kiến sự ra đời của series huyền thoại Breaking Bad – cũng là tượng đài không thể lung lay của dòng phim Tội phạm thế hệ mới.
Giống như việc ngành công nghiệp âm nhạc thế giới coi 2007 là năm “hoàng kim của mọi thời đại”, 2008 dường như là một năm tuyệt vời của nền điện ảnh thế giới, khi mà có quá nhiều siêu phẩm được ra mắt vào năm này. Chúng ta có phần phim huyền thoại của Trilogy về Batman: The Dark Knight; có sự khởi đầu của vũ trụ điện ảnh Marvel với bộ phim Iron Man, lại có cả Kung Fu Panda và phần kết của siêu phẩm Hellboy. Continue reading “10 năm Breaking Bad: Cảm ơn vì những điều tồi tệ “tuyệt vời”!”

Zidane và thuật đắc nhân tâm ở Real Madrid

Chín danh hiệu, trong đó có ba Cup Champions League, là minh chứng cho tài cầm quân của Zidane, HLV luôn bị cho là kẻ ăn may kể từ khi dẫn dắt Real hai năm rưỡi về trước.

Nếu Zinedine Zidane … có tóc và sống ở Việt Nam, có lẽ ông sẽ được đặt cho biệt danh “Đan tóc đỏ”, tương tự Xuân “tóc đỏ” – nhân vật trong tiểu thuyết của Vũ Trọng Phụng. Đến giờ, nhiều người vẫn không tin vào thực tài của Zidane, dù cho ông vừa đi vào lịch sử với tư cách HLV đầu tiên ba năm liền vô địch Champions League. Ba chức vô địch, tức là vượt qua số Champions League trong cả sự nghiệp của huyền thoại Alex Ferguson, hay hai huấn luyện viên lừng danh khác của thế giới đương đại là Pep Guardiola và Jose Mourinho. Đáng kể hơn, ba danh hiệu vĩ đại ấy tới chỉ trong hai năm rưỡi, kể từ khi ông khởi nghiệp nghiệp cầm quân đỉnh cao trên cương vị HLV trưởng Real Madrid vào tháng 1/2016.

Tờ FourFourTwo thậm chí còn dành một bài báo với tựa đề “Zidane-huấn-luyện-viên giỏi cỡ nào? Tại sao HLV của Real lại liên tục giành chiến thắng như vậy?”. Câu trả lời hợp lý nhất được đúc kết qua lời của HLV Hoffenheim, Julian Nagelsmann: “30% công việc huấn luyện là chiến thuật, 70% còn lại là kỹ năng giao tiếp xã hội”.

Về khả năng “Đắc nhân tâm”, hiếm có nhà cầm quân nào quy phục được lòng người như Zidane. HLV lừng danh Carlo Ancelotti nhận xét ba điểm mạnh nhất của Zidane là “sức hút, nhân cách và kinh nghiệm”. Những phẩm chất ấy tưởng không hề liên quan tới chiến thuật, nhưng trên thực tế, lại chính là chìa khóa mở ra kỷ nguyên thống trị châu Âu của Real Madrid những năm qua.

Continue reading “Zidane và thuật đắc nhân tâm ở Real Madrid”

Những thất bại đáng nhớ nhất của giới công nghệ trong năm 2017

[​IMG]

Thời điểm kết thúc năm 2017 đã gần đến, cũng là lúc mọi người cùng điểm lại những thông tin, sự kiện đáng chú ý nhất trong suốt năm qua, và tất nhiên là không thể không kể đến những điều gây thất vọng nhất đến với người dùng trong suốt năm 2017 vừa qua. Continue reading “Những thất bại đáng nhớ nhất của giới công nghệ trong năm 2017”

The Hidden Roadmap

Introduction

As the tech lead of a startup, a founder-CTO faces many tradeoffs allocating his time. The “business founders” want you to be shipping more features — the visible roadmap. But you need to balance that with many other responsibilities:

  • Recruiting, managing and retaining the right team.
  • Making tech choices, considering their short and long-term implications.
  • Setting and automating processes, paying technical debt, stopping fires when they happen, etc.

Those topics are not visible in the roadmap, but if they are not taken care of in time, they can cause big trouble. They are part of the “hidden roadmap”.

At our SaaSCamp, Samuel Fuentes, CTO at Ontruck, led a discussion about managing those priorities. In this article, I’m going to summarize the areas of consensus and try to open the conversation to a larger audience:

Continue reading “The Hidden Roadmap”

Every Programmer Should Know

This is a copy from https://github.com/mr-mig/every-programmer-should-know/blob/master/README.md

A collection of (mostly) technical things every software developer should know.

☝️ These are resources I can recommend to every programmer regardless of their skill level or tech stack

Highly opinionated 💣. Not backed by science.
Comes in no particular order ♻️

U like it? ⭐️ it and share with a friendly developer! U don’t like it? Watch the doggo 🐶

P.S. You don’t need to know all of that by heart to be a programmer.
But knowing the stuff will help you become better! 💪


Introduction

Falsehoods

Continue reading “Every Programmer Should Know”