Công Nghệ
Review và giải thích sâu về framework, ngôn ngữ, AI, blockchain… ngắn gọn, dễ hiểu, cập nhật liên tục như git pull ‑‑rebase.
1826 bài viết

View Hierarchy, Optimize Layout và Custom View (Phần 1)!
Bài viết được sự cho phép của tác giả Nguyễn Trương Trung Tín Bắt đầu với chủ đề custom layout để đẩy nhanh tốc độ vẽ màn hình của ứng dụng. Mình dự định chia chủ đề này ra làm 2-3 bài viết, với bài đầu tiên là bàn lại về kiến thức View của android cũng như view hierarchy, còn 1-2 bài sau để viết về phần optimize layout và custom view. Qua đó giúp cho các bạn tiện theo dõi về chủ đề này hơn. Vì vậy, toàn bộ bài này mình sẽ viết về kiến thức View cũng như View Hierarchy, làm sao android có thẻ vẽ lên giao diện người dùng được, vẽ như thế nào,… Nên nếu có kiến thức tốt về view và view hierarchy thì bạn có thể BỎ QUA BÀI NÀY. Code Review Done Right – Đừng để chỉ Chúa mới hiểu code của bạn! Interview React Developer thì hỏi gì? View là gì? Tạm định nghĩa là 1 class dùng để thế hiện các thành phần giao diện lên màn hình của thiết bị, mỗi view sẽ chiếm 1 ô hình chữ nhật trên màn hình, view chịu trách nhiệm đo kích thước, tìm vị trí, vẽ chính nó lên màn hình thiết bị nếu có lệnh gọi từ người dùng và nhận các sự kiện từ người dùng. View dùng để tạo các thành phần tương tác được với người dùng (Button, TextView, EditText,..) – Widgets. Ngoài ra ViewGroup là 1 lớp con của view dùng để đóng vai trò là các container chứa các view khác, thường thì viewgroup sẽ không hiển thị lên màn hình (RelativeLayout, LinearLayout,…) – Layouts. IDs Để có thể thao tác, chỉnh sữa, cài đặt cho 1 view nào đó thì developer sẽ truy...

Kết nối RabbitMQ sử dụng Web STOMP Plugin
Bài viết được sự cho phép của tác giả Giang Phan Trong các bài viết trước mình đã giới thiệu với các bạn cách kết nối đến RabbitMQ sử dụng Java thông qua giao thức AMQP . Trong bài này, tôi sẽ giới thiệu với các bạn cách kết nối RabbitMQ sử dụng Javascript thông qua WebSocket . Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud Đôi chút về RabbitMQ Web STOMP Plugin là gì? Web STOMP plugin giúp chúng ta có thể sử dụng Javascript để kết nối đến RabbitMQ sử dụng giao thức STOMP thông qua WebSocket connection. RabbitMQ Web STOMP sử dụng giao thức STOMP, được cung cấp bởi RabbitMQ STOMP plugin và expose (hiển thị) nó bằng WebSocket. Để enable RabbitMQ Web STOMP plugin, sử dụng lênh sau: rabbitmq-plugins enable rabbitmq_web_stomp Sau khi enable, chúng ta có thể access một web socket endpoint tại context path: /ws Chẳng hạn: http://127.0.0.1:15674/ws Sử dụng Web STOMP Plugin Trong ví dụ bên dưới, tôi sẽ tạo một ứng dụng Echo server, đơn giản cho phép user gửi một Message lên RabbitMQ server và subscribe để nhận Message từ RabbitMQ Server. Giao diện chúng ta sẽ tạo như sau: Box bên trái: hiển thị thông tin Message nhận được từ RabbitMQ server. Box bên phải: hiển thị thông tin log message giao tiếp giữa client và RabbitMQ server thông qua websocket. Một input cho phép user gửi message lên RabbitMQ server. Để sử dụng STOMP trong Web browser context, chúng ta cần download một JavaScript STOMP library . Link download: https://raw.github.com/jmesnil/stomp-websocket/master/lib/stomp.js Đoạn code của chương trình như sau: index.html Tiếp theo, chúng ta sẽ tạo file javascript để kết nối đến RabbitMQ server, gửi và nhận message: printLogDebug : hiển thị thông tin log message giao tiếp giữa client...

Top 7 cơ hội đến từ các công ty IT Hàn Quốc tại Việt Nam sau cái bắt tay chiến lược giữa KICC HCM và Station D
Ngày 29/07/2020 vừa qua, Korea IT Cooperation Center tại TP. HCM (KICC HCMC) đã ký kết biên bản ghi nhớ cùng Station D – Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam, để hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các Công ty IT Hàn Quốc tại Việt Nam và tạo thêm nhiều cơ hội để các tài năng IT Việt Nam sở hữu những tấm vé gia nhập vào các doanh nghiệp công nghệ hàng đầu của Hàn Quốc hiện đang có mặt tại Việt Nam. Nếu bạn là lập trình viên và đang mong muốn tìm kiếm việc làm tại các công ty IT Hàn Quốc thì đừng bỏ lỡ những cơ hội đầu tiên này nhé! 1. BMG BrickMate Group Tên thương hiệu ‘BrickMate’ thể hiện rõ giá trị của chúng tôi. Việc xây dựng một tòa nhà mang tính bước ngoặt bắt đầu bằng một ‘Brick’. Trụ sở chính của chúng tôi có trụ sở tại Gangnam, Seoul, Hàn Quốc, một trong những trung tâm công nghệ tiên tiến nhất trên thế giới. Trung tâm xây dựng của chúng tôi được đặt tại Thành phố Hồ Chí Minh, Việt Nam – một trong những trung tâm gia công phần mềm CNTT mới nổi nhất thế giới Chúng tôi có thể làm việc trong bất kỳ môi trường nào, nhưng chúng tôi thường đề xuất phương pháp nhanh nhẹn / scrum của phát triển cho một số khách hàng để triển khai nhanh chóng và phản ứng với những thay đổi. Tham khảo ngay các vị trí đang tuyển dụng tại công ty BMG : 20 Web Developer (Javascript, Typescript) tại BMG Group Backend (Java, Spring, Spring Boot) tại BrickMate 10 Android / iOS Developer...

12 loại bàn phím cho lập trình viên (Phần 1)
Bài viết được sự cho phép của smartjob.vn Bàn phím là công cụ không thể thiếu với mỗi lập trình viên . Họ dùng chúng hằng ngày, tiếp xúc với chúng nhiều hơn bất cứ thứ gì khác. Với mỗi người sẽ có những loại bàn phím ưa chuộng riêng tùy theo sở thích, phong cách làm việc của họ. Sau đây là 12 loại bàn phím được rất nhiều lập trình viên muốn sở hữu bởi các style và tính năng riêng biệt mà chúng mang lại. Các bạn sẽ được chiêm ngưỡng những kiểu dáng điển hình nhất của từng thời đại, đã làm nên tên tuổi của các nhà sản xuất và đã gắn bó với giới lập trình trong một khoảng thời gian dài. Ngăn Google Chrome sử dụng các phím Media trên bàn phím Top 7 phương pháp tự học lập trình tốt nhất dành cho Developer IBM Model M (1992) Đươc thiết kế với sự chủ đạo là tính đàn hồi, đem lại cảm giác rất thỏa mãn cho người dùng. Các lập trình viên đã từng rất ưa chuộng model này và rất thích thú với âm thanh của bàn phím. Chúng ta có thể bố trí bàn phím này ở nhiều góc khác nhau trên bàn làm việc bởi sự cơ động của nắp chụp phím. Một đặc điểm khác là độ bền của model này gần như là số 1. Đó là lý do nó đã gắn bó với nhiều lập trình viên trong suốt một khoảng thời gian dài. Nhận xét: “Bạn thích nó bởi phản ứng của từng phím mang lại cảm giác chắc chắn và sẽ cực kỳ thoải mái khi làm việc khi được nghe âm bàn phím kết hợp với tiếng nháy chuột.” Daniel C.Silvertein “Nó...

Phần 1 – Học AWS cơ bản: Quán Net
Bài viết được sự cho phép của tác giả Trần Khôi Nguyên Hoàng Chắc chắn trong đời của các bạn thì đã một lần trốn học đi chơi Net. Và mình cũng thế, mình cũng có một tuổi thơ ăn dầm nằm dề ở quán các quán net cỏ ngày xưa. … Chính vì thế, mình sẽ mượn hình ảnh của quán Net để nói một cách tổng quát các khái niệm của Amazon Web Services (AWS), giúp các bạn có một cái nhìn tổng quát hơn về AWS. Quán Net Amazon Tưởng tượng rằng công ty A muốn mở một chuỗi các cửa hàng kinh doanh quán Net với cấu hình khủng. Vì công ty A giàu vcl nên công ty A muốn mở chuỗi cửa hàng Net trên toàn bộ thế giới. Cứ một quốc gia sẽ có một quán Net ở mỗi thành phố lớn ở quốc gia đó. Quán Net của ông ty A thì to vcl, mỗi quán lại có vài nghìn máy cấu hình khủng , đủ cho các Skys cày view cho sếp hay là đua rank LOL. AWS, Azure và Google Cloud là gì? Chứng chỉ nào tốt nhất cho sự nghiệp của bạn? Công nghệ Cloud: Bối cảnh sử dụng Cloud & kinh nghiệm làm việc với AWS, IaC Cũng như bao quán Net khác, quán Net của công ty A cũng đánh số lên mỗi máy: Máy 1, Máy 2, Máy 3, để nhân viên dễ dàng quản lý và khách hàng cũng dễ dàng tìm được máy mà mình thích hơn. Tuy nhiên, quán Net này lại không có nhân viên kỹ thuật, chính vì thế, khách hàng tới chơi Net phải tự chuẩn bị sẵn bộ cài Window (hoặc bất cứ hệ điều hành nào) để cài lên...

Sync extensions của VSCode
Khi sử dụng VSCode chắc ai cũng cài thêm một mớ extensions, lỡ ngày nào cài lại máy, hay sử dụng máy công ty, máy tính ở nhà muốn VSCode sync mấy cái extention hay sử dụng Cần có Tài khoản Github, danh sách extension sẽ được lưu lên gist Cài thêm extention tên là Settings Sync – tác giả Shan Khan. Tạo access token trên Github Đăng nhập vào tài khoản Github, vào trang Settings / Developer settings / Personal access tokens / Generate New Token Nhập tên và cấp quyền tạo gist cho token này Sau khi tạo xong, nhớ lưu lại token này ở đâu đó Upload những thiết đặt, extensions đã cài cho VSCode Dùng phím tắt Shift + Alt + U hoặc search từ command Palette, search từ sync Nó sẽ yêu cầu nhập giá trị token vừa mới tạo Sau khi upload thành công, nó sẽ trả về gist id, nhớ copy và lưu lại giá trị gist Id này để sử dụng trên máy khác. Download các thiết từ gist về Dùng phím tắt Shift + Alt + D , hoặc gọi từ command palette Nó sẽ yêu cầu nhập lại token và gist id đã tạo, điền vào, xong! Station D via Vuilaptrinh

Những chứng chỉ cần có của một quản lý công nghệ thông tin
Tác giả: Ryan Vergara Giới thiệu Chúng ta đang sống trong thời kỳ công nghệ 4.0 chính vì vậy nên các vị trí công việc dành cho lĩnh vực công nghệ thông tin ngày một nhiều hơn. Và để vươn lên vị trí là một quản lý công nghệ thông tin, bên cạnh kỹ năng và kiến thức, bạn cần có những bằng cấp liên quan để chứng minh năng lực của mình với nhà tuyển dụng. Có thêm những chứng chỉ này giúp việc thăng tiến phần nào “nhẹ nhàng” hơn Những chứng chỉ IT cần có một quản lý công nghệ thông tin Cisco Certified Network Associate (CCNA) CCNA có lẽ là bằng phổ biến và quen thuộc nhất hiện tại dành cho các chuyên gia CNTT. Đây là một khóa học cấp chứng chỉ trung cấp. Người sở hữu bằng CCNA là người có năng lực trong việc định cấu hình, vận hành và khắc phục sự cố mạng được định tuyến. Để có được chứng chỉ này, bạn phải vượt qua kỳ thi CCNA 200-301. Trong đó bài kiểm tra này đề cập đến các nguyên tắc cơ bản về bảo mật mạng, giao thức internet, tự động hóa và các kỹ năng liên quan đến bảo mật khác. Xem thêm các việc làm tại Gear Inc tuyển dụng hấp dẫn với Station D Kỳ thi bao gồm 120 câu hỏi trong đó mỗi câu hỏi có một điểm liên quan. Để vượt qua kỳ thi, bạn phải có số điểm ít nhất là 800 (điểm cao nhất có thể đạt được là 1.000). Chi phí cho kỳ thi này là 300 USD. Chứng chỉ IT Cisco Certified Network Professional (CCNP) Trong khi CCNA là chứng chỉ bao gồm các cấp độ kỹ năng từ cơ...

Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?
Bài viết được sự cho phép của tác giả Kiên Nguyễn Trong những năm trở lại đây, ngành công nghệ thông tin trở nên vô cùng “hot”. Kéo theo đó là các khái niệm đi cùng như “lập trình”, “ngôn ngữ lập trình”.. xuất hiện một cách dày đặc hơn trên các phương tiện thông tin đại chúng. Nếu các bạn đang học công nghệ thông tin (IT) thì sẽ biết rằng, số lượng ngôn ngữ lập trình hiện nay đã lên đến con số hàng trăm và nó sẽ còn tiếp tục tăng nữa. Vậy một câu hỏi đặt ra cho chúng ta là nên chọn học loại ngôn ngữ lập trình nào cho phù hợp với nhu cầu thị trường trong hiện tại và tương lai. Ở đây mình có thống kê một số ngôn ngữ phổ biến như sau: Trong bài viết này mình sẽ giới thiệu với các bạn TOP 5 ngôn ngữ lập trình đáng học nhất năm 2025, những ngôn ngữ lập trình mà mình thấy tiềm năng khá là lớn ở Việt Nam trong khoảng 5-7 năm tới. #1. Python Có thể nói Python đang là ngôn ngữ được khuyến khích học nhiều nhất, không chỉ ở Việt Nam mà còn cả trên thế giới nữa. Câu hỏi là tại sao? Tại sao lại là Python? Python được ra đời vào năm 1991, tính đến hiện tại cũng đã khoảng 30 năm tuổi. Nếu xét về tuổi đời thì python cũng không phải là mới. Nhưng một trong những điểm cộng lớn nhất của python là sự đơn giản, người học dễ dàng tiếp cận, cú pháp khá giống với ngôn ngữ giao tiếp nên python được đánh giá cao trong việc dễ học, dễ sử dụng. Ngoài ra, python có một số...

Awk siêu tốc
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng Nếu bạn đã biết 1 scripting language như Python hay Perl việc học AWK sẽ có vẻ hơi thừa/ hơi ngần ngại. Nhưng AWK – ngôn ngữ lập trình sinh ra từ những năm 1970 luôn có chỗ dùng, và sức mạnh đáng gờm. 10 hiểu lầm tai hại về lập trình 10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết Bài này giới thiệu các khái niệm cơ bản của ngôn ngữ lập trình AWK, một số cách dùng thông dụng, học xong có thể dùng ngay và vô cùng hữu ích với những người xử lý dữ liệu dạng cột/ bảng mà không biết Python. Các lệnh trong bài này dùng mawk vì nó được biết là nhanh hơn các bản awk khác, nhưng về tính năng cơ bản là giống nhau, người đọc dùng bản nào cũng được, VD gawk $ whatis awk awk ( 1 ) - pattern scanning and processing language Dùng trong các câu lệnh hàng ngày AWK rất thích hợp để nhét vào 1 pipe các câu lệnh UNIX, việc mà Python vốn không sinh ra để làm Ví dụ: đếm số dòng trong file /etc/passwd $ wc /etc/passwd 57 95 3193 /etc/passwd Lệnh wc vốn sinh ra để đếm: dòng, số từ, số ký tự. Bạn có thể viết 1 script Python 5-7 dòng làm chuyện này, nhưng 1 dòng? Hãy thử và nếu thành công, hãy comment! Với AWK, làm việc này không khó khăn gì. Hãy bỏ qua nếu không hiểu gì, phần giải thích sẽ theo sau $ cat /etc/passwd | mawk '{ words += NF; chars += length($0) + 1;} END { print NR, words, chars}' 57 95 3193 Một...

Redux selector và vấn đề sử dụng sao cho hiệu quả
Bài viết được sự cho phép của tác giả Lưu Bình An Selector Selector là một hàm với input là ‘state’ của store và trả về một giá trị mong muốn const selectEntities = state => state . entities ; function selectItemIds ( state ) { return state . items . map ( item => item . id ) ; } const selectSomeSpecificField = state => state . some . deeply . nested . field ; function selectItemsWhoseNamesStartWith ( items , namePrefix ) { const filteredItems = items . filter ( item => item . name . startsWith ( namePrefix ) ) ; return filteredItems ; } Về cách đặt tên, không bắt buộc, nhưng đa phần sẽ đặt với prefix select hoặc get Tuyển react lương cao đi làm gấp Khác nhau giữa useSelector và mapState Khi một action được dispatch , useSelector sẽ thực hiện so sánh giữa kết quả trước đó và kết quả hiện tại, nếu khác , component bị force để re-render. useSelector sử dụng so sánh === chứ không dùng phương pháp so sánh shallow (dịch vui là so sánh “nhẹ”) Làm việc với Redux trong ứng dụng lớn Redux là gì? Hiểu rõ cơ bản cách dùng Redux Lý do sử dụng selector Sử dụng lại, một selector có thể sử dụng ở nhiều nơi, nhiều component khác nhau Tinh gọn, ví dụ chúng ta có entity user chứa lastname , fullname , email , nhưng chúng ta chỉ muốn lấy email , một selector getUserEmail sẽ rất rõ ràng tinh gọn Lý tưởng nhất, chỉ có reducer và selector mới biết được structure của redux store, như vậy một khi structure này có thay đổi, chúng ta chỉ việc cập nhập lại ở 2 chỗ này. import { createSelector } from 'reselect'...

CSS Clamp giải thích và ứng dụng
Bài viết được sự cho phép của tác giả Lưu Bình An 11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS 5 điều phiền toái nhất của CSS Diễn giải Lưu ý: hàm clamp không chạy trên IE clamp ( MIN , PREFER , MAX ) ; Trong đó: MIN : là giá trị chặn dưới, nếu giá trị PREFER < MIN => return giá trị MIN PREFER : là giá trị sẽ được return nếu đang nằm trong khoản giữa MIN và MAX MAX : là giá trị chặn trên, nếu giá trị PREFER > MAX => return giá trị MAX Ứng dụng Sử dụng cho giá trị font-size body { font-size : clamp ( 1.1 rem , 1 vw + 1.1 rem , 2.5 rem ) ; } Diễn giải đoạn code chỉnh font-size không thể rắc rối hơn ở trên: “tính dùm tôi cái font size cho nó tự động to nhỏ theo màn hình, với công thức tính là 1% của viewport + 1.1rem, kết quả không được phép nhỏ hơn 1.1rem và lớn hơn 2.5rem” Kết quả nhận được Chúng ta vừa cho phép giá trị font-size linh động theo kích thước màn hình, nhưng vẫn đảm bảo nó không được quá lớn và quá nhỏ với hai giá trị chặn trên, chặn dưới. Sử dụng với thuộc tính width Nếu bạn có đam mê với typography thì thể đọc hết cuốn The element of typographic style . Ở đây mình xin trích một đoạn trong cuốn sách này: từ 45 đến 75 ký tự trên một cột là chuẩn không cần chỉnh. Áp dụng lý thuyết này ta có thể viết div { width : clamp ( 45 ch , 50 % , 75 ch ) ; }...

RxSwift 8: Tạo observable factories
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh Trong bài 7 , chúng ta đã nghiên cứu cách dọn dẹp bộ nhớ cho các observables bằng disposing và những lưu ý để tránh rò rỉ bộ nhớ khi sử dụng chúng. 6 ví dụ để bạn yêu luôn observable "Luật 5 giây" giúp Steve Jobs thách thức mọi giới hạn sáng tạo Thay vì tạo mỗi observable để chờ đợi các subscribers đăng ký, chúng ta có thể tạo 1 factory observable sinh ra các observable cho mỗi lượt đăng ký mới của chúng. Thêm đoạn code sau: example(of: "deferred") { let disposeBag = DisposeBag() // 1 var flip = false // 2 let factory: Observable<Int> = Observable.deferred { // 3 flip = !flip // 4 if flip { return Observable.of(1, 2, 3) } else { return Observable.of(4, 5, 6) } } Tạo 1 biến đánh dấu flip gán giá trị false Tạo 1 factory observable kiểu nguyên bằng toán tử deferred Nghịch đảo flip, mỗi khi factory observable được đăng ký Trả về các Observale khác nhau tùy thuộc giá trị của flip Thêm mã sau vào sau hàm trên: for _ in 0...3 { factory.subscribe(onNext: { print($0, terminator: "") }) .disposed(by: disposeBag) print() } Kết quả như sau: --- Example of: deferred --- 123 456 123 456 Vậy ta hiểu là, mỗi lần khi ta đăng ký tới factory observable, thì ta nhận các giá trị khác nhau của chúng theo thứ tự xen kẽ nhau. Điều này để thể hiện rằng factory observable có thể tạo ra các observable khác nhau cho các subscriber. Vậy là bài hôm nay kết thúc rồi. Trong bài tiếp theo chúng ta sẽ tập trung thực hành các khái niệm chính của Rxswift. Cụ thể bài tới...