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

Bridge Pattern trong Java – Code ví dụ Composite Pattern

Bridge Pattern trong Java – Code ví dụ Composite Pattern

Bài viết được sự cho phép của tác giả Trần Hữu Cương 1. Bridge Pattern là gì? Bridge Pattern là một mẫu cấu trúc ( Structural Pattern ). Bridge Pattern được dùng khi có sự phân cấp giao diện trong cả thành phần interface lẫn thành phần implement nó. 2. Bridge Pattern UML Diagram Hướng dẫn Java Design Pattern – DAO Hệ thống 23 mẫu Design Patterns 3. Ví dụ Ta có 1 tin nhắn với 2 cách log là ghi ra file và show ra màn hình mỗi cách lại được thực hiện làm 2 kiểu là thực hiện với kết quả là text rõ hoặc text đã được mã hóa. Message: là 1 lớp trừu tượng khai báo chức năng log MessageLogger: là 1 interface thực thi chức năng log của Message ConsoleLogger: thừa kế MessageLogger, có chức năng show message ra console FileLogger: thừa kế MessageLogger, có chức năng ghi message vào file TextMessage và EncryptedMessage: thừa kế Message, quyết định xem việc log tin nhắn là text rõ hoặc text đã được mã hóa. Tham khảo việc làm Fresher Java mới nhất trên Station D Code ví dụ: MessageLogger.java public interface MessageLogger { public void log ( String msg ) ; } ConsoleLogger.java public class ConsoleLogger implements MessageLogger { @Override public void log ( String msg ) { System . out . println ( msg ) ; } } Xem tin tuyển dụng Java mới nhất trên Station D FileLogger.java public class FileLogger implements MessageLogger { @Override public void log ( String msg ) { // viet ham ghi ra file log.txt try { FileWriter fw = new FileWriter ( new File ( "log.txt" ) , true ) ; fw. append ( ( char ) 10 ) ; fw. write ( msg ) ; fw. close...

By stationd
Ứng dụng bạn biết được xây dựng trên nền tảng nào?

Ứng dụng bạn biết được xây dựng trên nền tảng nào?

Ứng dụng bạn biết được xây dựng trên nền tảng nào? Cơ bản về Android App Bundle Flutter vs React Native vs Xamarin – hiện đang là ba trong số các công nghệ phát triển ứng dụng di động cross-platform phổ biến nhất. React Native với cộng đồng lớn và thư viện phong phú, Flutter với nhiều nhận xét tích cực về performance mang lại trải nghiệm gần giống native, Xamarin được backed bởi Microsoft với lực lượng .Net developer hùng hậu. Nếu còn chưa biết chọn Flutter, React Native hay Xamarin cho dự án hay con đường sự nghiệp của bạn, hãy tham khảo thử các ứng dụng sau được xây dựng trên từng nền tảng nhé: 1. Flutter Flutter là mobile UI framework của Google để tạo ra các giao diện native chất lượng cao trên iOS và Android trong khoảng thời gian ngắn. Flutter hoạt động với source code có sẵn, được sử dụng bởi các nhà phát triển và các tổ chức trên khắp thế giới, đồng thời nó open-source và miễn phí. Các lý do để bạn cân nhắc chọn Flutter : Ứng dụng được phát triển một cách nhanh chóng và thống nhất Ngôn ngữ Dart dễ học dễ hiểu UI đẹp và “xịn sò” Framework hiện đại Hỗ trợ cực tốt cho IDE …. 2. React Native React Native là công nghệ được tạo bởi Facebook, cho phép các dev sử dụng JavaScript để làm mobile apps trên cả Android và iOS với cảm nhận và giao diện native. Một ví dụ để làm rõ cách vận hành của React Native là wrapper của code native. Có rất nhiều thành tố được tạo nên khi đang wrapping – “bọc” chức năng native của iOS hoặc Android. React Native đã đạt được rất nhiều...

By stationd
Javascript prototype chuyên sâu

Javascript prototype chuyên sâu

Bài này chỉ phù hợp với các bạn đã có kiến thức trung bình khá javascript trở lên, mình không chỉ đơn giản giải thích cách xài mà còn sâu hơn, bạn sẽ nắm rất rất rõ prototype trong javascript thực chất là gì Object trong javascript rất là vi diệu. Nó là nền tảng của rất nhiều thứ hay ho trong javascript. Object là một cặp giá trị key/value. Cách đơn giản nhất tạo một object là obj = {} , thêm các property và phương thức sử dụng dấu chấm let animal = {} animal.name = 'Leo' animal.energy = 10 animal.eat = function (amount) { console.log(`${this.name} is eating.`) this.energy += amount } animal.sleep = function (length) { console.log(`${this.name} is sleeping.`) this.energy += length } animal.play = function (length) { console.log(`${this.name} is playing.`) this.energy -= length } Quá đơn giản. Giờ chúng ta muốn có thêm một animal khác, chúng ta đưa toàn bộ logic này vào bên trong 1 function, cách này gọi là Functional Instantiation hay constructor function function Animal (name, energy) { let animal = {} animal.name = name animal.energy = energy animal.eat = function (amount) { console.log(`${this.name} is eating.`) this.energy += amount } animal.sleep = function (length) { console.log(`${this.name} is sleeping.`) this.energy += length } animal.play = function (length) { console.log(`${this.name} is playing.`) this.energy -= length } return animal } const leo = Animal('Leo', 7) const snoop = Animal('Snoop', 10) Khi chúng ta muốn tạo một instance mới của Animal , tất cả những gì chúng ta cần làm là gọi lại hàm Animal . Cách làm này có một điểm hạn chế, các phương thức eat , sleep , play là hoàn toàn giống nhau cho các instance, đồng thời khi tạo một instance mới chúng ta cũng đã vô tình lãng phí bộ...

By stationd
Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng

Giới thiệu Java Service Provider Interface (SPI) – Tạo các ứng dụng Java dễ mở rộng

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Hầu hết vòng đời của một ứng dụng xoay quanh việc bảo trì. Một ứng dụng có thể mở rộng cho phép bảo trì dễ dàng, tức là nâng cấp một tính năng mà không ảnh hưởng đến toàn bộ ứng dụng. Trong bài viết này chúng ta sẽ tìm hiểu về Java Service Provider Interface (SPI) và cách chúng ta có thể áp dụng nó vào trường hợp sử dụng thực tế để tạo các ứng dụng dễ dàng mở rộng, tạo ứng dụng theo các kiến trúc module, plugin. Các thành phần của Java Service Provider Interface (SPI) Một Service Provider framework là một hệ thống trong đó nhiều nhà cung cấp dịch vụ (Service Provider) implement một Service và hệ thống này cung cấp các implement cho client sử dụng. SPI giúp giảm kết dính và che dấu thông tin giữa các thành phần của ứng dụng. Java SPI định nghĩa các thành phần chính sau: Service : là một tập hợp các interface/ abstract class mà nó cung cấp quyền truy cập vào một số chức năng hoặc tính năng ứng dụng cụ thể. Service Provider Interface (SPI): là một tập hợp interface/ abstract hoạt động như một proxy hoặc điểm cuối (endpoint) cho service. Service Provider : là một triển khai cụ thể của SPI. Nó chứa một hoặc nhiều class cụ thể implements hoặc extends một Service. ServiceLoader : là thành phần không thể thiếu của SPI. Nó có vai trò tìm kiếm và load các implements khi được yêu cầu. Nó sử dụng context classpath để xác định vị trí các provider implement provider và lưu chúng vào cache để tăng performance. Bridge Pattern trong Java – Code ví dụ Composite...

By stationd
Thủ thuật sử dụng đơn vị viewport trên mobile

Thủ thuật sử dụng đơn vị viewport trên mobile

Để có thể quản lý được state của ứng dụng một cách tốt nhất, chúng ta cần sự phân chia phù hợp giữa local state (internal state của component) và state cửa ứng dụng đặt trong React Context. Một vài điều muốn chia sẽ để nâng cao khả năng bảo trì và trải nghiệm nếu sử dụng đến context trong React. Đơn vị viewport trong css ( vh , vw ) không phải lúc nào cũng chạy đúng trên mọi trình duyệt điện thoại. Giống như chưa đủ khổ cho dev nên mỗi trình duyệt mobile lại có cách xử lý riêng cho đơn vị này. Cách mà w3 định nghĩa cách tính đơn vị này. Với mobile cái chúng ta quan tâm nhiều nhất là đơn vị vh 1vh = 1% độ cao khởi tạo của khu vực trình duyệt dùng để hiển thị trang web. Nghĩa là giá trị này không bao gồm các phần khác của trình duyệt, như thanh address, thanh bookmark ( nếu có ), tab bar, … và những thứ linh tinh khác mà user có thể add thêm vào trình duyệt của họ. Nhưng khi bạn bắt đầu scroll trên điện thoại, câu chuyện trở nên phức tạp hơn, thanh address bar sẽ biến mất, giá trị của vh cần phải cập nhập lại, hiện tượng cà khịa xuất hiện trên màn hình. Trình duyệt Safari trên iOS là người tiên phong sử dụng luôn một giá trị cố định đúng với kích thước màn hình (không phải kích thước khung hiển thị của trình duyệt). Chrome mobile cũng bắt đầu áp dụng cách này để chặn việc nội dung trang nhảy lung tung. Điều này có ý nghĩa như thế nào? Nghĩa là khi bạn đặt giá trị 100vh nó sẽ vượt...

By stationd
Thuật toán Gradient Descent

Thuật toán Gradient Descent

Bài viết được sự cho phép của tác giả Kien Dang Chung Video trong bài viết Trong các bài toán machine learning hoặc các bài toán tối ưu, chúng ta thường phải làm việc với những điểm cực trị (thường là điểm cực tiểu) của một hàm số. Hẳn bạn còn nhớ trong Phần 1 của khóa học này về dự đoán doanh thu phim với Linear Regression , chúng ta đã phải cố gắng tìm giá trị nhỏ nhất của hàm chi phí (cost function) mà đôi khi còn gọi là hàm mất mát (loss function). Vậy Thuật toán Gradient Descent là gì? , Gradien Descent có liên hệ gì với việc tìm kiếm cực trị bài toán tối ưu? , chúng ta sẽ cùng tìm hiểu trong bài học này nhé. Tại sao lại dùng Gradle thay thế Maven và Ant 10 PHP Instagram Scripts & Widgets tốt nhất 1. Thuật toán Gradient Descent là gì? Trong kiến thức toán phổ thông chúng ta đã biết, muốn tìm cực trị một hàm số y = f ( x ) y=f(x) chúng ta sẽ giải phương trình đạo hàm của hàm số f ( x ) f(x) bằng 0. f ′ ( x ) = 0 f′(x)=0 Tuy nhiên phương trình trên không phải lúc nào cũng giải được dễ dàng, có những trường hợp việc giải phương trình trên là bất khả thi. Vậy khi gặp những tình huống này, chúng ta phải làm gì? May thay, thuật toán Gradient Descent cho chúng ta cách thức tìm các điểm cực tiểu cục bộ này một cách xấp xỉ sau một số vòng lặp. Trong thực tế, các giá trị dữ liệu không có đúng 100% mà đôi khi chúng ta chỉ cần những con số gần đúng. Khi...

By stationd
Building Microservices Application – Phần mở đầu: Bức tranh tổng thể

Building Microservices Application – Phần mở đầu: Bức tranh tổng thể

Bài viết được sự cho phép của tác giả Edward Thien Hoang Đây là bài viết đầu tiên trong phần Xây dựng ứng dụng với Microservices . Trong những loạt bài trước , chúng ta đã tìm hiểu qua phần lý thuyết về những “viên gạch” (building block) chủ đạo trong Microservies . Loạt bài tiếp theo sẽ hướng đến việc implement những pattern như API Gateway, Service Discovery, Circuit Breaker trong kiến trúc Microservices như thế nào. Cải thiện hiệu năng cho JavaScript Web Application chỉ trong vòng vài bước đơn giản Security Considerations khi Designing Web Applications Đáng lẽ mình sẽ tự tay implement và giải thích về ý nghĩa của từng phần, tuy nhiên, trong thời gian research đã tìm ra được một nguồn tài liệu viết rất chuyên nghiệp và đầy đủ. Vì vậy mình sẽ dựa trên đó để viết, nhằm mang đến cái nhìn professional và đúng đắn nhất Các bạn có thể đọc các bài viết nguyên bản tiếng Anh tại ĐÂY . Trong bài viết đầu tiên này, hãy cùng xem xét về bức tranh tổng thể khi xây dựng một ứng dụng Microservices, sẽ gồm những thành phần (chính) nào, và cách chúng coordinate với nhau như thế nào. 1. ĐIỀU KIỆN CẦN Điều gì là cần thiết để triển khai một số lượng lớn các microservices trong hệ thống? Hình vẽ dưới đây, theo Martin Fowler , sẽ cho ta biết chính xác điều chúng ta cần đạt được (Nguồn: http://martinfowler.com/articles/microservices.html) Tuy nhiên, trước khi chúng ta có thể bắt đầu tung ra số lượng lớn các microservices trong hệ thống để thay thế các ứng dụng nguyên khối, có một số điều kiện tiên quyết cần được đáp ứng (hoặc ít nhất là ở mức độ nào đó). Chúng...

By stationd
Học Python: Từ Zero đến Hero (phần 1)

Học Python: Từ Zero đến Hero (phần 1)

Trước nhất, Python là gì? Theo người sáng lập, Guido van Rossum, Python là: “Là programming language high-level, và triết lý core design tập trung vào code readability và syntax cho phép các programmers thể hiện được concepts chỉ trong vài dòng code” Với tôi, lý do đầu tiên học Python vì đây là ngôn ngữ đẹp, có thể code & thể hiện suy nghĩ của tôi 1 cách tự nhiên. Lý do nữa chúng tôi có thể tận dụng việc code Python trong nhiều lĩnh vực như: Data Science, Web Development, Machine Learning… Quora, Pinterest & Spotify đều dùng Python để lập trình backend Web của mình. Tuyển python lương cao các công ty hot Kiến thức cơ bản 1. Variables – Các biến số Bạn có thể xem các biến số này như những từ ngữ chứa 1 giá trị. Trong Python, rất dễ để define 1 variable và đặt giá trị cho nó. Hãy tưởng tượng bạn muốn lưu số 1 trong biến gọi là “one”. Bạn có thể làm như sau: one = 1 Quá dễ phải không? Chỉ cần chỉ định giá trị 1 đến biến “one”. two = 2 some_number = 10000 Và bạn có thể chỉ định bất kì giá trị nào đến bất kì biến số nào mà bạn muốn. Như đã thấy ở bảng trên, biến “two” giữ số nguyên 2 , và “ some_number ” giữ 10,000 . Bên cạnh các số nguyên, chúng ta cũng có thể sử dụng booleans (True / False), strings, float, và rất nhiều kiểu dữ liệu khác. # booleans true_boolean = True false_boolean = False # string my_name = "Leandro Tk" # float book_price = 15.80 2. Control Flow: conditional statements (lệnh tùy điều kiện) “ If ” sử dụng 1 expression để xác...

By stationd
Golang toàn tập – Goroutines và Channels

Golang toàn tập – Goroutines và Channels

Bài viết được sự cho phép của tác giả Kiên Nguyễn Được biết tới là một trong những ngôn ngữ hỗ trợ mạnh mẽ concurrency, Golang Goroutines và Channels thật ra có ý nghĩa như thế nào?. Có sự khác biệt nào giữa Golang Concurrency và Java Concurrency hay không?. Channel trong Golang là gì? So sánh Callback function và mutex lock với channel Golang là gì và tại sao bạn nên học Go? Trước khi bắt đầu tìm hiểu sâu hơn, hãy cùng bắt đầu với hai khái niệm cơ bản nhất, Routines và Channels . A hero – Goroutines with channel Ngoài ra, golang cũng hỗ trợ functional programmin g. Có thể tìm hiểu qua về functional programming qua bài viết này . Ok, bắt đầu ngay thôi! 1. Concurrency Trước khi bắt đầu tìm hiểu Routines và Channels, hãy nắm bắt khái niệm về Concurrency (Tính toán đồng thời) . Making process on more than one task simultaneously is known as concurrency Việc thực hiện nhiều hơn một task trên một process được biết tới là concurrency (đồng thời, cùng lúc) Đã hiểu về Concurrency, tuy nhiên nhớ take note luôn là nó khác biệt hoàn toàn với Parallel. Thực hiện mọi việc đồng thời, nhưng có thể chỉ ở trên cùng một core, một process của CPU . Parallel lại tận dụng đa lõi, thực hiện mọi việc đồng thời, nhưng trên nhiều tiến trình. Nguồn ảnh / Source: ednsquare.com 2. Goroutines Muốn một function có thể chạy đồng thời với function tất nhiên phải có khai báo. Không khai báo thì Go không thể biết được khi nào function đó được chạy Concurrency. A goroutine is a function that is capable of running concurrently with other functions Goroutine là function có thể chạy đồng thời...

By stationd
Hướng dẫn mã nguồn Telegram IOS phần 2: SSignalKit là gì?

Hướng dẫn mã nguồn Telegram IOS phần 2: SSignalKit là gì?

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh Tiếp theo bài viết số 1 , trong bài viết lần này chúng ta sẽ nghiên cứu SSignalKit. Bạn có thể tham khảo bản tiếng Anh tại đây: https://hubo.dev/2020-05-11-source-code-walkthrough-of-telegram-ios-part-2/ Telegram-iOS sử dụng Reactive programing trong hầu hết các modules của họ. Sau đây là 3 framework chính sử dụng rx trong dự án: MTSignal : Có thể được coi là reactive programing cho Objective-C. Nó chủ yếu sử dụng module MtProtoKit , implement MTProto – Telegram mobile protocol. SSignalKit : Nó là hậu duệ của MTSignal, với nhiều xử lý phức tạp và toán tử phong phú hơn. SwiftSignalKit : tương tự SSignalKit nhưng nó hỗ trợ cho swift. Hướng dẫn mã nguồn Telegram IOS phần 3: Các nền tảng sử dụng trong ứng dụng Build một ứng dụng Chat cho Android & iOS bằng Contus Fly như thế nào? Bài đăng này tập trung vào SwiftSignalKit để giải thích cách thiết kế với các trường hợp sử dụng. Về lập trình Rx là 1 mindset khá mới lạ so với lập trình hướng đối tượng mà đa số developer đã nắm rõ. Cho nên các bạn nên vào trang chủ của nó để hiểu về các toán tử của nó một cách sâu sắc, trực quan ở đây: https://rxmarbles.com/ Signal Signal là một lớp để giải thích khái niệm “change over time” – xử lý sự kiện theo thời gian thực. Nó được mô tả dưới đây: // pseudocode public final class Signal<T, E> { public init(_ generator: @escaping(Subscriber<T, E>) -> Disposable) public func start(next: ((T) -> Void)! = nil, error: ((E) -> Void)! = nil, completed: (() -> Void)! = nil) -> Disposable } Để cài đặt Signal, nó chấp nhận 1 closure, bao gồm kiểu...

By stationd
Sự thật về 4.0, Trí tuệ nhân tạo & Robots

Sự thật về 4.0, Trí tuệ nhân tạo & Robots

Hầu hết những gì bạn thấy trên báo chí đều là chiêu trò marketing và giật tít. Sự thật về 4.0 Những gì báo chí đang viết về CMCN4.0 hầu hết là không chính xác hay nói nhẹ là không đầy đủ về bức tranh toàn cảnh của CMCN4.0. Những gì CMCN4.0 đang hướng tới, là một CHUỖI các công nghệ mới cho phép con người làm việc và sản xuất hiệu quả hơn. Để có thể áp dụng thành công CMCN4.0, tất cả các công nghệ trong chuỗi đó cần phải được áp dụng. Hãy thử tưởng tượng một nhà máy X nào đó. Để bắt đầu tiến tới 4.0, toàn bộ các thiết bị,công cụ hay những phần quan trọng trong nhà máy đều phải gắn các chip cho phép đo lường các thông số cần thiết, cho phép lưu trữ những thông số này, đồng thời phải nối mạng để cho phép truy suất những thông số này từ xa. Chúng ta cần phải biết được tại một thời điểm hay trong một khoảng thời gian, những máy móc nào hoạt động, năng suất ra sao, công nhân nào sử dụng, hay hỏng những chỗ nào, bao lâu thì hỏng. Những dữ liệu này cần phải sẵn sàng mọi lúc, mọi nơi, và thời gian thực. Đây hay được gọi là Internet of Things (IoT). Để có thể bắt đầu CMCN4.0, IoT là công nghệ bắt buộc phải có, vì nó sẽ cung cấp nguyên liệu đầu vào cho những công nghệ tiếp theo trong chuỗi. Đó là DỮ LIỆU (Data). (Tất nhiên nó cũng cung cấp các tiện ích khác, như cho phép quản lý, điều hành nhà máy từ xa, giảm chi phí..v.v.) Những dữ liệu này được thu thập trên diện rộng và trong...

By stationd
Gitlab CI

Gitlab CI

Bài viết được sự cho phép của tác giả Lê Chí Dũng Đến thời điểm hiện nay, tôi thường yêu cầu các dự án của mình phải có CI. Nếu viết bằng script như nodejs thì CI sẽ có nhiệm vụ check syntax, để các thành viên trong nhóm cùng một kiểu viết giống nhau, và chạy các mức test khác nhau như unit test, CDC test. Điểu tuyệt vời của gitlab là nó đi kèm với bộ CI miễn phí cho cả dự án private (yay). Blog này sẽ trình bày chiến lược để thiết lập ENV test trên Gitlab CI để build docker image, và upload nó lên gitlab registry. CI/CD là gì? Triển khai quy trình CI/CD với Gitlab 34 sản phẩm phần mềm Social Networking tốt nhất Gitlab runner Là nơi chương trình test của bạn sẽ được chạy. Bạn có thể có một PC riêng biệt cho việc build và test. Gitlab cung cấp một chương trình khá tiện https://gitlab.com/gitlab-org/gitlab-ci-multi-runner để thiết lập runner cục bộ. Cá nhân tôi chỉ sử dụng multi runner này khi chương trình cần tài nguyên lớn. Phần lớn thời gian tôi sử dụng shared runner https://about.gitlab.com/gitlab-com/settings/#shared-runners . Xin cảm ơn sự tử tế của Digital Ocean khi cho mỗi build một tài nguyên 4GB chạy trong mỗi máy ảo riêng biệt. Shared runner chạy trên docker, nên có thể khai báo các docker có sẵn khá tiện (yay). . gitlab-ci.yml Là file cấu hình cho gitlab CI. Dưới đây là một ví dụ trong đó khai báo một trạng thái của test pipeline là unit test. Phần sau dựa trên giả thuyết tôi đang xây dựng một web app với nodejs, và chạy unit test với npm run test . image: node:boron-alpine stages: - unit_test unit_test_job: stage: unit_test script:...

By stationd