Lập Trình

Duyệt các bài viết được gắn thẻ Lập Trình

1677 bài viết

Thiết kế Messaging Service WhatsApp – P2

Thiết kế Messaging Service WhatsApp – P2

Bài viết được sự cho phép của tác giả Kiên Nguyễn Tiếp theo phần 1 về thiết kế hệ thống Messaging Service WhatsApp . Bài viết thứ hai này sẽ cho ta một cái nhìn toàn diện và sâu hơn về thiết kế tổng quan đã trình bày ở phần trước. Nội dung này có thể xem là High Level Design cho System. Trình bày và giải thích cụ thể hơn cho từng thành phần trong hệ thống. Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào Kiểm tra HTML5 validation message 1. Quay lại với hệ thống Quay lại với hệ thống Messaging Service WhatsApp, ở phần 1 ta đã có cái nhìn tổng quan về các thành phần trong hệ thống. Load Balancer App Servers Memcached APN/GCM Job Queue Workers Tiếp tục đi sâu hơn nhằm trả lời các câu hỏi có thể phát sinh trong thực tiễn khi triển khai hệ thống. 2. Chi tiết Messaging Service WhatsApp Bắt đầu từ gốc tới ngọn, ta sẽ xem xét Database Model trước. Ở hệ thống chat này, ta có thể sử dụng NoSQL, có 2 phương án để lựa chọn: 2.1 Database Model Thứ nhất là Wide-Column Store. Loại này tương tự như HBase và Cassandra Thư hai là NoSQL Key Value Stores , kiểu lưu trữ này chỉ có key và value, phân tán trên nhiều database nhỏ (Distributed Database). Tốt cho scaling, tiêu biểu có thể chọn là DynamoDB Schema User như sau: Java - id - username - password - device_OS // Xác định service gửi notification - device_token // Dùng cho Notification - list<unread_messages> Lưu ý là bảng User cần có thêm 2 cột là device_OS và device_token. Device_OS cho ta biết nên sử dụng Apple APNS hay Google’s GCM. Device_token...

By stationd
Giới thiệu về Gulp JS

Giới thiệu về Gulp JS

Bài viết được sự cho phép của tác giả Tino Phạm 1. Gulp là cái gì vậy? Gulp được biết đến như là một Task Runner , nghĩa là nó sẽ thực hiện các nhiệm vụ mà developer đặt ra cho nó một cách tự động. OK, ví dụ thế này nhé: bạn đang tham gia một dự án web và trong quá trình phát triển dự án bạn muốn là: mỗi khi bạn chỉnh sửa các file html, css, hoặc là js gì bạn sẽ không cần phải nhấn F5 (refresh) browser cho mất công nữa, bạn cũng muốn minify các file css và js khi bạn release package, và bạn còn muốn làm nhiều thứ khi phát triển dự án của mình. Vậy Gulp sẽ giúp bạn định nghĩa các tasks và tự động thực hiện các tasks đó cho bạn. Lợi ích của Gulp là : giúp bạn tự động minify, complile, reload browser,… và nhiều thứ khác rất hay nữa. 10 Công ty hàng đầu thế giới sử dụng Node.js 8 lợi thế khi sử dụng Polymer so với Angular và React 2. Hướng dẫn cài đặt Gulp hoạt động trên môi trường Nodejs nên việc đầu tiên là bạn phải cài đặt Node.js và npm – Download và cài đặt Node.js tại đây . Cài Node.js bao gồm cả npm. – Mở hộp thoại cmd trong window và gõ lệnh: npm install gulp -g Vậy là xong việc cài đặt Gulp rồi. Giải thích lệnh trong npm: npm có 3 loại install – install -g: là global, như thế e có thể truy cập tới package vừa cài ở bất kì đâu trong hệ thống – install –save: là khi install, đồng thời save lại tên package đó vào package.json ở trường dependencies, thường dùng...

By stationd
Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 2)

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh Memory Leaks trong Closure Nếu bạn chưa xem phần 1, vui lòng xem ở đây: Khi chúng ta tạo giá trị 1 closure nó cần giữ 1 tham chiếu mạnh tới các biến mà nó cần thuộc controller. Chúng ta tạo 1 hàm biến optional closure có kiểu () -> Int và gán trong ViewDidLoad. Closure cần a và b để chạy nó. a và b được capture bởi nó và thuộc ViewDidLoad – bên ngoài nó. Promise Memoization useMemo là gì? Hướng dẫn sử dụng React useMemo Hook var someClosure: (() -> Int)? Đầu tiên, chúng ta nói self.someClosure là 1 tham chiếu mạnh. someClosure = { return self.a + self.b } Cả ViewController và Closure đều tăng RC = 1. Khi Controller này push vào navigation controller, nó sẽ tạo 1 tham chiếu mạnh RC = 1 tới controller này. Và đồng thời closure cần a và b để capture cho nên class fererences này có RC = 2. Khi bạn pop ViewController này thì nó bị xóa bởi navigation, đồng thời RC = 1. Lý tưởng là khi đó ViewController sẽ bị hủy tuy nhiên chúng ta tạo ra 1 retain cycle. ARC thấy RC của cả 2 đều là 1 nên không thể giải phóng được. Giải pháp Tạo ra 1 tham chiếu yếu thay thế tham chiếu mạnh. Như hình trên closure capturing 1 giá trị yếu. Do đó lúc này a, b là kiểu optional cho nên chúng ta cần guard để unwrap 2 giá trị này lại. var someClosure: (() -> Int)? self.someClosure = { [weak self] in guard let `self` = self else { return 0 return self.a + self.b} Khi tạo SecondViewController thì RC của nó = 1. Closure...

By stationd
Kiểm thử tính năng Tìm kiếm – bạn làm như thế nào?

Kiểm thử tính năng Tìm kiếm – bạn làm như thế nào?

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh Bài viết này được tham khảo từ nguồn https://www.deviqa.com/blog/7-things-to-test-in-your-search-form . Sau khi mình đọc được đâu đó bản dịch cũng từ nguồn trên thì cảm thấy có gì đó không ổn, phát hiện ra là bài viết tiếng Anh được bê nội dung vào “Gu-gồ” dịch sau đó thì đưa lên làm bài viết. Google dịch giờ thì cũng đã sát nghĩa và đỡ lôm côm rồi, nhưng mà nhiều chỗ cần giải thích, có những đoạn dùng từ hơi đặc thù nên nếu không diễn giải, sử dụng từ phù hợp hơn thì nó vẫn rất là “buồn cười” nhưng nghe vẻ bạn dịch bài viết kia đã không để ý hoặc bạn không quan tâm nên Google dịch thế nào bạn lấy về dùng y như thế khiến mình nghĩ là mình sẽ dịch thử xem sao. Cách tự học code web, tìm kiếm công việc dễ dàng và hạnh phúc mỗi ngày Làm sao Google cho ra kết quả tìm kiếm nhanh đến thế? Đúng là dịch rồi thì mới thấy là hơi mông lung =)) các bạn đọc rồi góp ý cho mình với nhé. Có những đoạn thì mình đoán ý người viết rồi viết ra theo cách hiểu của mình. Đây là bài học và kinh nghiệm khi kiểm thử chức năng tìm kiếm cho các ứng dụng web có tính năng này. Mình cũng hi vọng bài viết có ý nghĩa cho tất cả các bạn mới tìm hiểu và làm về kiểm thử. ——– Hiện nay hầu hết các ứng dụng đều cung cấp chức năng tìm kiếm cho phép người dùng có thể tương tác, tìm kiếm nội dung trên trang web đó. Số lượng các kịch bản...

By stationd
Cách sử dụng properties trong tập tin cấu hình của Spring

Cách sử dụng properties trong tập tin cấu hình của Spring

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Trong những bài viết trước mình đã giới thiệu với các bạn về cách đọc properties files trong Spring sử dụng đối tượng PropertyPlaceholderConfigure, namespace util hay namespace context. Vậy làm thế nào để sử dụng những properties này trong tập tin cấu hình của Spring? Trong bài viết này, mình sẽ hướng dẫn các bạn làm điều đó! Lập trình theo kiểu Aspect Oriented Programming (AOP) sử dụng Spring Framework Tạo hiệu ứng trong react với React Spring Trước tiên, mình sẽ tạo một Maven project mới để làm ví dụ: Spring framework dependency: <dependency <groupId> org.springframework </groupId> <artifactId> spring-context </artifactId> <version> 4.3.9.RELEASE </version> </dependency> HelloWorld class: package com . huongdanjava . springusingpropertiesinspringxml ; public class HelloWorld { private String name ; public void print ( ) { System . out . print ( "Hello " + name ) ; } public String getName ( ) { return name ; } public void setName ( String name ) { this . name = name ; } } Application class: package com . huongdanjava . springusingpropertiesinspringxml ; import org . springframework . context . ApplicationContext ; import org . springframework . context . support . ClassPathXmlApplicationContext ; public class Application { public static void main ( String [ ] args ) { ApplicationContext context = new ClassPathXmlApplicationContext ( "spring.xml" ) ; HelloWorld helloWorld = ( HelloWorld ) context . getBean ( "helloWorld" ) ; helloWorld . print ( ) ; } } configuration.properties name = Khanh spring.xml <beans xmlns = "http://www.springframework.org/schema/beans" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns : context = "http://www.springframework.org/schema/context" xsi : schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" <context:property-placeholder location = "classpath:configuration.properties" /> </beans> Ở đây, mình đã khai báo sử dụng namespace context để đọc file...

By stationd
SourceTree: Công cụ trực quan hóa cho GIT trên Windows/ macOS

SourceTree: Công cụ trực quan hóa cho GIT trên Windows/ macOS

Bài viết được sự cho phép của blogchiasekienthuc.com Chào anh em, Git có lẽ là một công cụ đã không còn xa lạ gì với anh em trong giới lập trình nữa rồi, bởi sự hiệu quả trong việc quản lý mã nguồn (source code) mà nó mang lại là không phải bàn cãi gì thêm. Nhưng việc sử dụng Git thông qua các dòng lệnh (command line) không phải lúc nào cũng tiện và “ngầu” như anh em vẫn nghĩ. Đặc biệt là với các anh em mới tiếp cận với lập trình ! Chính vì vậy trong bài viết này, mình sẽ hướng dẫn cho anh em cài đặt SourceTree – một công cụ GUI giúp trực quan hóa các thao tác với Git, giờ đây các thao tác quản lý sẽ dễ như ăn kẹo Ok, bây giờ thì cùng mình cài đặt thôi nào ! "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing" #1. Download Sourcetree mới nhất Trang chủ: www.sourcetreeapp.com Link từ trang chủ: https://www.sourcetreeapp.com/ . Hiện tại thì Sourcetree chỉ hỗ trợ cho Windows và Mac OS, đây cũng là hai hệ điều hành phổ biến nhất hiện nay. #2. Cài đặt phần mềm Sourcetree Nói chung là quá trình cài đặt cũng không có gì khó khăn cả, đa số là những thao tác rất quen thuộc với anh em lập trình mà thôi. Sau khi download sourcetree xong => anh em bấm vào file vừa tải về để tiến hành cài đặt. + Bước 1: Đầu tiên là phần đăng ký tài khoản thông qua Bitbucket, nhưng nếu anh em có tài khoản Github hoặc Gitlab hay VS Team thì dùng luôn các tài khoản này cũng đươc nhé. Bạn bấm vào nút Skip để sang bước tiếp...

By stationd
Lib requests có gì hay mà dùng thay urllib

Lib requests có gì hay mà dùng thay urllib

Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng Python là một ngôn ngữ già, có thể bạn chưa biết, Python tuổi dê Python ra đời từ thời mới có HTTP , và nổi tiếng là hỗ trợ tận răng , nên không có gì lạ nếu Python có kèm sẵn thư viện standard để thực hiện HTTP request với tên urllib . Vậy nhưng khi lên mạng tìm kiếm hay hỏi quanh đây: dùng gì để gọi HTTP trong Python? , câu trả lời phần lớn đều là cài: pip install requests . Biến toàn cục (global), biến cục bộ (local), biến nonlocal trong Python 11 tip học Python dành cho các “newbie” Requests không phải có từ ngày Python xuất hiện, nhưng vào thời Python 2.6 2.7 (cỡ 2012-2013), requests đã rất phổ biến, ví dụ như câu trả lời trên StackOverFlow năm 2013 . Requests (có chữ s) xuất hiện với một API cực kỳ thân thiệt, với motto (khẩu hiệu): Python HTTP for Humans do urllib có sẵn trong Python2 quá rắc rối. API của requests nổi tiếng đến mức gần như ngôn ngữ lập trình nào cũng có một thư viện “nhái” requests của Python , nó quá đơn giản, tới mức … trước đây không thư viện nào từng làm vậy. (API của thư viện là các function mà thư viện đó public cho người dùng sử dụng, ví dụ requests có: requests.get, requests.post.) Sau gần chục năm phát triển, requests giờ đã nằm dưới mái nhà Python Software Foundation . Với các tính năng được quảng cáo ở bản v1.0.0, cuối năm 2012 International Domains and URLs Keep-Alive & Connection Pooling Sessions with Cookie Persistence Browser-style SSL Verification Basic/Digest Authentication Elegant Key/Value Cookies Automatic Decompression Unicode Response Bodies Multipart File...

By stationd
Hướng dẫn pull images từ docker repository, registry (docker pull)

Hướng dẫn pull images từ docker repository, registry (docker pull)

Bài viết được sự cho phép của tác giả Trần Hữu Cương Hướng dẫn pull images từ docker repository, registry (docker pull) 20 trường hợp sử dụng lệnh Docker cho developer Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains Ví dụ docker pull Để pull docker image ta dùng lệnh sau: docker pull [ OPTIONS ] NAME [ :TAG| @DIGEST ] Trong đó có các OPTIONS sau: --all-tags , -a Tải tất cả các tag của image trong repsitoryDownload all tagged images in the repository --disable-content-trust true Bỏ qua bước verify image --platform experimental (daemon) API 1.32+ Thiết lập platform nếu server cho phép nhiều platform --quiet , -q Thu gọn log của lệnh Ví dụ: pull image ubuntu với tag là 18.04 docker pull ubuntu: 18.04 Okay, Done! References: https://docs.docker.com/engine/reference/commandline/pull/ Bài viết gốc được đăng tải tại stackjava.com Có thể bạn quan tâm: Hướng dẫn cài đặt docker registry server (private registry server) Docker là gì? Kiến thức cơ bản về Docker Hướng dẫn xóa docker image (ví dụ docker rmi) Xem thêm Việc làm IT hấp dẫn trên Station D

By stationd
Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

Hướng dẫn cách tạo kết nối đến SQL Server thông qua SSMS

Bài viết được sự cho phép của blogchiasekienthuc.com Chào các bạn, trong bài viết trước mình đã cùng các bạn cài đặt Microsoft SQL Server và SSMS (SQL Server Management Studio) là một công cụ giao diện hỗ trợ thao tác với SQL Server. Và để tiếp tục cho nội dung của bài hôm trước thì trong bài viết tiếp theo này, mình sẽ cùng các bạn thực hiện việc kết nối tới SQL Server thông qua SSMS. Ok, bắt đầu ngay thôi nào ! #1. Khởi chạy SQL Server Management Studio + Bước 1: Đầu tiên các bạn mở SSMS lên, có rất nhiều cách mở. Các bạn có thể tìm kiếm trên thanh Taskbar hoặc tạo shortcut trên màn hình. Ở đây mình dùng cách đơn giản nhất và nhấn tổ hợp Windows + S để mở Windows Search => và tìm kiếm với từ khóa Microsoft SQL Server như hình bên dưới. + Bước 2: Bạn chờ một lát để cho SQL Server Management Studio khởi động. + Bước 3: Đây chính là giao diện ban đầu khi các bạn khởi tạo SSMS. Các bạn có thể bấm vào Connect như ảnh bên dưới để kết nối đến SQL Server thông qua xác thực của hệ điều hành (được thiết lập trong quá trình cài đặt). #2. Tạo mới một connection + Bước 1: Vâng, sau khi có connection rồi thì các bạn có thể bấm vào tab Connect như hình bên dưới => rồi chọn Database Engine… + Bước 2: Ở đây các bạn bấm vào ô lựa chọn Server name thì sẽ có một drop-down sổ xuống => Các bạn chọn là SQL Server Authentication . => Sau đó bấm Connect để thiết lập một kết nối thông qua xác thực của Server. + Bước...

By stationd
So sánh giữa Native App Development và Hybrid App Development

So sánh giữa Native App Development và Hybrid App Development

Tác giả: Surender Vikram Singh Sự phát triển mạnh mẽ của thị trường điện thoại thông minh trong những năm gần đây đã dẫn đến tỷ trọng truy cập trang web trên điện thoại di động lên đến 52,2% trong năm 2018. Tính sẵn có của điện thoại thông minh hiệu quả về chi phí dẫn theo sự gia tăng sự lệ thuộc của chúng tôi vào điện thoại thông minh, khiến các nhà phát triển khó lựa chọn giữa Native Mobile App Development hay Hybrid App Development. . . . Tầm quan trọng của UI / UX trong phát triển ứng dụng trên thiết bị di động Trước khi chúng tôi xem xét nền tảng phát triển ứng dụng Native & Hybrid, có một khía cạnh quan trọng nhất của việc phát triển ứng dụng này là chính là khách hàng của bạn cần phải được xem xét. Khách hàng của bạn ít quan tâm đến công nghệ cũng như nền tảng cung cấp cho ứng dụng mà họ đang sử dụng. Hầu hết người dùng lo ngại về những gì họ có thể làm với ứng dụng thay vì những thứ tạo ra chúng. Vì vậy, trải nghiệm người dùng và giao diện người dùng ( User Experience and User Interface ) là khía cạnh quan trọng nhất của bất kỳ ứng dụng di động nào. 79% người dùng thử một đến hai lần cho bất kỳ ứng dụng nào nếu nó không hoạt động trong lần thử đầu tiên , trong khi chỉ 16% người dùng sẽ cố gắng thử nhiều hơn hai lần. Trải nghiệm người dùng kém ngăn cản người dùng sử dụng ứng dụng. . . . Ứng dụng Native & Hybrid – Khái quát nhanh Native App Development Ứng dụng di động gốc...

By stationd
5 lý do sinh viên IT nên học Tiếng Anh ngay lập tức

5 lý do sinh viên IT nên học Tiếng Anh ngay lập tứ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, công nghệ thông tin đang dần trở thành một trong số ngành học “hot” nhất, được nhiều bạn học sinh quan tâm và theo học nhất… Cũng đúng thôi, thời đại của công nghệ mà lại. Qua những số liệu thống kê thì chúng ta có thể thấy, một trong những nguyên nhân hàng đầu khiến các bạn trẻ đổ xô vào học công nghệ thông tin đó chính là: Cơ hội việc làm nhiều và lương ngành này tương đối cao so với mặt bằng chung. Nhưng tất nhiên, bất cứ ngành học nào cũng có những ưu và nhược điểm riêng. Ngành IT này cũng vậy. Nếu bạn không trang bị cho mình những kỹ năng khác nữa thì bạn cũng sẽ khó tiến xa hơn được. "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày" Mẫu CV IT tiếng Anh hấp dẫn nhà tuyển dụng Vâng, và một trong số đó chính là khả năng ngoại ngữ của bạn. Ở trong bài viết này mình sẽ chia sẻ với các bạn 5 lý do cực kỳ thuyết phục để bạn học ngoại ngữ (tiếng Anh) ngay lập tức, và ngay bây giờ… #1. Để đọc hiểu tài liệu Ở mức cơ bản nhất, các bạn nên trang bị cho mình khả năng đọc hiểu tài liệu tiếng Anh. Các bạn không cần phải Ielts 7, 8 chấm, vì để đọc hiểu tài liệu chuyên ngành thì phần đa các bạn sẽ gặp các từ ngữ chuyên ngành mà thôi. Thậm chí là các bạn sẽ không có thời gian để đọc hết một tài liệu từ a-z,...

By stationd
Prototype của object

Prototype của object

Bài viết được sự cho phép của tác giả Lưu Bình An Khi chúng ta console.log một object của JS, sẽ thấy một property ẩn đặc biệt [[Prototype]] , nó có thể là null hoặc là trỏ đến một object khác object a = > [ [ Prototype ] ] = > prototype object b Điều này có nghĩa là object a kế thừa từ object b, b có gì thì a sẽ có đó Javascript prototype chuyên sâu Nếu vỗ ngực xưng tên là một javascript developer sành sỏi, mà không giải thích được prototype inheritance thì thật là kỳ Xem thêm nhiều việc làm JavaScript hấp dẫn trên Station D Chúng ta không thể truy xuất trực tiếp thông qua [[Prototype]] , mà thông qua các phương pháp khác let animal = { eats : true , walk ( ) { alert ( "Animal walk" ) ; } } let rabbit = { jumps : true , __proto__ : animal } // hoặc khai báo bằng rabbit . __proto__ = animal ; console . log ( rabbit . eats ) ; // => true; rabbit . walk ( ) ; __proto__ != [[Prototype]] Về bản chất, __proto__ không phải là property [[Prototype]] , chính xác thì nó là getter/setter của [[Prototype]] Thời điểm hiện tại, không khuyến khích dùng __proto__ , thay vào đó dùng Object.getPrototypeOf/Object.setPrototypeOf let user = { name : "John" , surname : "Smith" , set fullName ( value ) { [ this . name , this . surname ] = value . split ( " " ) ; } , get fullName ( ) { return ` ${ this . name } ${ this . surname } ` ; } } let admin = { __proto__ : user , isAdmin : true } alert...

By stationd