Chào 2020

Chào 2020, cầu mong cho một năm mới sức khoẻ, an bình, vạn sự hanh thông.

Năm mới, cầu mong cho bản thân tìm lại được chính mình – stay hungry, stay foolish – khéo léo hơn.

Năm mới, cố gắng duy trì thể thao điều độ hơn, ít nhất cũng được như 2019

Năm mới gắng đi bôn ba nhiều hơn, đọc nhiều sách hơn, viết nhiều bài kỹ thuật hơn, humble hơn, bền bỉ hơn.

Năm mới hi vọng son sẻ hơn (cái này quan trọng nhất).

Happy new year 2020!

On the way to scale and stabilize AhaMove API Systems

Notice: drafting version

Old architecture

AhaMove old architecture

Old issues:

  • without dockerization
  • only 1 ec2 c5.4xlarge (1 nginx)

Pros:

  • moving super fast
  • features rollout fucking fast

Cons:

  • Waste of resource (only utilize 70% peak time)
  • Can’t scale

On the way to stabilize and scale up API system

1 main api, and 1 backup api, nginx proxy on main api

1 main instance (c5.2xlarge) + 1 back up instance (c5.2xlarge)

Cons:

  • Fixed resources thus no utilize resource when low traffic


AhaMove old arch - CPU utilization

Avg rps: 500

Then, we move the API to aws eks

We want to resolve:

  • Auto scale up when traffic increase
  • Resource utilization when low traffic

New architecture

AhaMove eks architecture

Dashboard and Logs

AhaMove EKS Production Cloud Watch Dashboard
Cloud watch Logs Insights

Todo/improvements:

  • Not yet

Fixing aws eks pod evicted (DiskPressure)

When working with AWS EKS, using this cloudformation template might cause the issue as below when describing the “Evicted” pod (out of resource warning from aws eks).

kubectl describe pod ingress-nginx-controller-xxx -n ingress-nginx

Status: Failed
Reason: Evicted
Message: Pod The node had condition: [DiskPressure].

describe pod
describe pod

You can edit the volume size param as below (via cloudformation)

eks worker node cloud formation
eks worker node edit cloudformation stack (increase to 20GB – EBS volume size)

The cloudformation template above related to this template file

aws eks  node volume size
aws eks node volume size

link: https://github.com/awslabs/amazon-eks-ami/blob/master/amazon-eks-nodegroup.yaml#L23

After increasing the storage size of the node (~ an ec2 instance), now “Evicted” pod (DiskPressure) will disappear.

Hope this well hope who is facing with this issue on AWS EKS 😉

Ref(s):

  1. https://medium.com/faun/kubelet-pod-the-node-was-low-on-resource-diskpressure-384f590892f5
  2. https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/

Note lại vài dòng rơi rớt sau chuyến đi Thẩm Quyến 2019

Cuối năm, cũng đang loay hoay càm pen cho mấy ì ven đặc biệt, thì được sếp cho đi tham quan Thẩm Quyến (vé vớt :D). Con người như được bừng tỉnh vì lại được đi đây đi đó.

Trung Quốc, một nước lớn, gã khổng lồ trên thế giới … Những kỳ tích trong những thập niên vừa qua làm tăng thêm sự tò mò cho những nae AhaMove cùng chuyến đi.

Nếu bạn đến du lịch Trung Quốc, người bản địa sẽ nói với bạn rằng: “Nếu muốn xem Trung Quốc cổ một nghìn năm thì hãy đến Bắc Kinh, xưa một trăm năm thì đến Thượng Hải, còn muốn xem những kì tích vài thập niên trở lại đây thì nên đến Thẩm Quyến”. Câu nói này thực sự có ý nghĩa, đối với người dân Trung Quốc Đại Lục, Thẩm Quyến thực sự là miền đất hứa.

trích dẫn

Ấn tượng đầu tiên khi đặt chân đến Thẩm Quyến (Shenzhen) là sự hiện đại, ngăn nắp … đường phố không chật hẹp, ko có hiện tượng kẹt xe, nhiều cây xanh 2 bên đường, qui hoạch của họ rất nhiều công viên, cây xanh … Hệ thống tàu điện ngầm của họ đầy đủ, hiện đại, tiện nghi, đúng giờ …

QR code được áp dụng khắp nơi, từ vỉa hè cho đến nhà hàng, …

Còn nhiều và rất nhiều cảm nhận, suy nghĩ. Nhưng giờ chỉ còn rơi rớt đâu đó dưới những tấm hình được chụp bởi những nae AhaMove

Hội chứng ITB và cách khắc phục của cá nhân

Sau giải HCM Run 2019, bị đau phần phía sau bên phải trục cúi (đầu gối). Lân la hỏi khắp 500 ace đồng run, mỗi người chỉ mỗi cách. Không dám chạy nặng, chỉ đạp và bơi là chính, nếu có chạy thì cũng chỉ lê lết nhè nhẹ hi vọng qua con đau rồi hi vọng hồi phục bằng niềm tim @@, nhưng kết quả không khả quan hơn, chân vẫn đau vùng bên hông phải khớp gối chân phải và trái.

Tuần rồi đi brick với ace hội 3D, nêu rõ triệu chứng với ace trong hội, xâu chuỗi là quá trình tập recovery thì ~80% mình dính chưởng ITBS. Sau đó, mình có tìm hiểu các liệu pháp khác phục trên mạng, và cũng tham khảo lời khuyên từ các ace bạn đồng run, mình note lại đây hi vọng sẽ giúp được ai đó bị ITBS.

ITBS là gì?

ITBS là viết tắt Iliotibial Band (IT Band) Syndrome (tạm dịch là hội chứng đau dải cơ IT, IT này ko phải là “i tờ” trong CS đâu nhe :P).

IT Band là dải cơ kéo dài từ hông đến đầu gối (mặt phía ngoài) của mỗi chân, dải này dày lên ở phần trục cúi (đầu gối) mỗi chân. Trong quá trình tập luyện, nếu băng bó quá chật, hoặc vận động quá mức, cường độ cao và lâu, IT band (dải cơ IT) này có thể cạ(cà, ma sát) quá mức vào xương đùi hoặc xương chậu bên trong trục cúi (đầu gối) dẫn đến bị sưng, viêm gây ra đau dải IT này.

Các bài tập giảm đau:

Phòng tránh và các bải tập bổ trợ:

Chế độ ăn uống:

Bên cạnh chế độ tập luyện để phục hồi, chế độ ăn uống cũng quan trọng không kém, bạn có thể tăng thêm đậu bắp, hạt mè đen trong khẩu phần ăn, để bổ trợ thêm cho xương khớp.

Vật lý trị liệu:

Ngoài ra, bạn cũng có thể đi đến các trung tâm vật lý trị liệu, để được matxa chân, đây là cơ sở matxa ở HCM mình đi và thấy rất hiệu quả, cơ sở này của Viện Vật Lý Y Sinh học (109A Pasteur, Phường Bến Nghé,Quận 1, Tp. Hồ Chí Minh)

Tham khảo & credits:

Thanks to anh Hung DinhTim Marbach đã góp ý và gửi các tài liệu liên quan đến ITBS.Kết:Chấn thương là điều không thể tránh khỏi khi tập luyện thể thao, vì vậy hãy nên khởi động kỹ trước khi tập.

Khi bị chấn thương, hãy thả lỏng, nghỉ ngơi, nặng thì nên đến thẳng bệnh viện để chuẩn đoán kỹ càng và kịp thời, nhẹ và lầy lội thì tự binh liệu pháp cho hợp với cơ địa của mỗi người (có chọn lọc trên các ý kiến tham khảo).Bài viết theo quan điểm và trải nghiệm cá nhân, có tham khảo nhiều ý kiến tư vấn của nhiều ace đồng run, hi vọng giúp đỡ được ai đó bị ITBS giống mình.

Link đến bài viết trên facebook cá nhân: https://www.facebook.com/notes/long-kaht/hội-chứng-itb-và-cách-khắc-phục-của-cá-nhân/2620215474718303/

Tổng kết năm 2018, chào đón 2019

Một năm 2018 chuẩn bị sang trang, cho năm 2019 đầy háo hức sắp tới, ngồi xem lại một năm ảm đạm, chạy nhiều nhất từ trước đến giờ.

– Năm nay, chuyển về làm gần nhà, công việc cũng okay

– Năm nay, thể thao nhiều, sức khoẻ lên

– Năm nay, học được nhiều về cách thức vận hành, build up công ty từ ý tưởng đến thực tế, move fast failed fast

– Năm nay bớt bay bay, mơ mộng, thiếu thực tế

– Năm nay gặp được nhiều cao nhân giúp đỡ, góp ý

– Năm nay gặp được em, năm sau biết đâu được … 😉 xD

– Năm nay đọc được nhiều sách hay, ý nghĩa, thực tế …

Looking forward to exciting 2019 year ahead! xD

Cầu mong an yên, hạnh phúc cho gia đình. Nhớ ba nhiều!

Sài gòn 31/12/2018

Mở source API – hệ thống cho thuê xe hơi (xe máy) tự lái (người tự lái)

Cuối năm, rì viu một năm nhiều sự kiện, rồi chuẩn bị tinh thần chiến đấu cho năm mới.

Sáng tính chạy 21km ủng hộ vnuwillrun, cơ mà cái mũi lại bị đau một cách vô duyên khó hiểu làm nóng sốt và ảnh hưởng đến thể trạng. Rồi cũng lết được cỡ 16km vừa đi bộ vừa chạy. Nói chung cũng tạm được …

Nhìn lại một năm chả có j hay ho, bể kèo này nọ, thôi thì cứ vô vi đi mà sống cho thanh thản, đọc lại cái bản báo cáo 2019-2025 của google, cuộc chiến những năm tới sẽ rất hấp dẫn và nhiều thử thách. Về với đội đại ka Ngôn học được nhiều thứ: thực tế, move fast, failed fast, Long hạn chế bay bay … Nói chung là học được nhiều thứ lắm …

Thấy còn dư tí năng lượng đang hype do chạy bộ chưa đã, chỉnh sửa luôn xiu source cho thuê xe tự lái (người thue xong rồi tự lái, chứ không phải thuê bác tài, hoặc xe có khả năng tự lái nhe), rồi opensource cho anh chị em nào cần …

https://github.com/nguyentienlong/wolverine

Về cơ bản, thì khi đưa lên github, mình chỉ hide những thông tin sensitive, còn nhiều thiếu sót, hi vọng được nhận nhiều feedback từ các bạn.

Happy weekend 😉

Áp dụng GnuPG vào việc bảo mật giao tiếp giữa 2 server

Tôi may mắn có dịp được làm vài dự án có liên quan đến mã hoá, lĩnh vực mà tôi chả biết gì, nhớ lại thời đi học cứ mỗi lúc thầy Khang Võ (khoa mạng máy tính dạy) thì nổ lùng bùng cái đầu (có lẽ thời đó quá gà, hoặc có thể thầy dạy khó hiểu quá xD :))). Rảnh rổi, ngồi gom góp tổng hợp lại, biết đâu ai đó lại cần, mà cũng có thể diễn giải theo cách của dân không chuyên lại dễ hiểu hơn cho các bạn cần tìm hiểu về mã hoá, và các ứng dụng thực tế của nó.

GnuPG là gì, và các thuật ngữ liên quan (theo RFC 4880):

Theo tôi hiểu, khi giao tiếp giữa 2 bên Lan và Điệp một cách bình thường thì chả có gì bàn ở đây, trường hợp 2 bên có bí mật gì đó thì sẽ áp dụng phương pháp sau:
– Lan và Điệp cùng dùng phần mềm GnuPG để tạo cặp private & public keys (cặp khoá bí mật và công khai), và trao đổi 2 khoá public cho lẫn nhau.

longka key list
longka key list

– Lan soạn tin nhắn, mã hoá bằng pub-key của Điệp, ký(sign) bằng khoá bí mật của chính Lan, gửi qua email cho Điệp.
– Điệp nhận được email của Lan, chột miệng thốt lên “Oát đờ heo”, bụng thì nghĩ có lẽ nào máy Lan bị hách(hacked). Bình tâm lại, Điệp rít hơi thuốc lào, nhớ lại lần hẹn hò hôm trước trong CGV Lan có gửi cho Điệp cái pub-key trong cái hộp con đum. Điệp từ tốn, import pub-key của Lan, rồi decrypt (giải mã) email Lan gửi qua. Điệp hớn hở đọc tin nhắn.
– Điệp đọc xong, lại dùng pub-key của Lan để encrypt (mã hoá) nội dung email, và ký bằng khoá bí mật của Điệp rồi gửi qua Lan.
– Lan cũng follow trình tự các bước Điệp làm, rồi đọc tin nhắn Điệp gửi.

Tại sao nên dùng GPG
Tại sao là GPG, mà không dùng các phương pháp khác, câu hỏi này xin phép được để ngõ, vì tôi chưa có điều kiện tiếp các phương pháp mã hoá khác khi giao tiếp trên phía server.

Ví dụ:

Đầu tiên, hãy tạo ra 2 cặp khoá(pub, secret) ở máy của bạn trước:

gpg –gen-key, sau đó nhập tên kêy, email

Sau đó, list lại những key đã tạo, ở bước này bạn đã có 2 id cho 2 keys với id lần lượt:  longka, và alien

Tiếp đến export pulic key dạng armor:

Sau khi đã có pub-key bạn có thể public nó, gửi cho những người mà bạn cần liên lạc.

Giờ tôi sẽ gửi thông điệp sau đến Lan, dùng gpg cmd như sau:

Thông điệp (do longka@longka.info gửi đến alien@mar.com) được mã hóa như sau:

Sau đó, longka@longka.info in ra và nhờ bồ câu gửi đến cho alien@mars.com, nhận được, chạy lệnh sau để giải mã nội dung

Public GPG key của tôi 😉

Tài liệu tham khảo

https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages

https://tools.ietf.org/html/rfc4880#section-1.1

Kết luận: khi thiết kế API cho clients sử dụng, nhiều khi dữ liệu truyền dữ clients và API có thể bị chôm và sử dụng vào mục đích chơi không đẹp (ko fair). Thì việc mã hóa thông tin truyền, nhận là một điều cần thiết. GPG là một phương pháp hợp lý, giải quyết được vấn đề.

Bài viết viết vội khi chuẩn bị đi xem trận chung kết lượt đi tại KUL, mong được các bạn, anh, chị cao nhân góp ý và chỉ giáo nếu thấy còn điều nào chưa đúng, chưa chuẩn.

TSN, 11Dec2018 – Việt Nam Chiến Thắng!!! 🇻🇳🇻🇳🇻🇳🇻🇳🇻🇳

Check python syntax within nodejs application

Sometimes , we need to check the python script syntax in a NodeJS application. For eg: a formular is stored in a database (via NodeJS application) as a python script syntax, then we use python eval() function to execute that python function.

We can use NodeJS child process to call to python (py_compile module) to check the syntax only (not exec)

Python code to check the syntax:

Here is the result:

Full code on github:
https://github.com/nguyentienlong/python_syntax_cheker_with_nodejs

Hope this will help anyone facing with the same use case to me!

php – is isset way is faster than array_search?

Theory speaking, looking into hashmap (isset) is faster than array_search or in_array.

But, let’s see how it work in php in practice.

Look at this code block:

Given a keyword in a language, then the function return the gender code (1: men, 2: women).

Make thing done with above code, yeah! But can we optimize it a bit: faster, and easier to read??

Why not? So, take a look at this block of code:

It takes O(n*logn) for time complexity!

if we change the data structure of it a bit like this

$genderKeywords array now acts as a hashmap[1]. Which O(1) for looking the key in it. Finally, check it out

It’s O(1) for time complexity, and easier to read, isn’t it ??

Testing performance:

optimize wayhttps://3v4l.org/Iavgv/perf#output

normal wayhttps://3v4l.org/okDoD/perf#output

Well, the optimize way in theory is not faster than the normal way in practice :D. So, at this point, we can’t see much improvement here, but at least the code of new implementation (hashmap way) is cleaner.

So, theory isn’t always perform well in practice! is it?

References:

[1]: https://nikic.github.io/2014/12/22/PHPs-new-hashtable-implementation.html