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

Gửi private message với @SendToUser annotation trong Spring WebSocket

Gửi private message với @SendToUser annotation trong Spring WebSocket

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Ở bài viết hướng dẫn các bạn cách hiện thực WebSocket với Spring WebSocket , ứng dụng ví dụ của mình sẽ cho phép tất cả các client nhận được tất cả các message khi chúng subscribe vào endpoint, còn ở bài viết hướng dẫn gửi message tới một user cụ thể nào đó, ứng dụng ví dụ của mình cho phép client có thể gửi một message tới một user gắn liền với một sessionId cụ thể. Điểm hơi bất tiện ở đây nếu nhu cầu của chúng ta chỉ là gửi một request tới WebSocket server, cần nó xử lý business logic và trả về kết quả cho chính chúng ta mà thôi, tất nhiên là các bạn cũng có thể giải quyết bài toán này bằng cách gửi STOMP message như mình đã hướng dẫn, nhưng chúng ta cũng phải gán thêm user gắn liền với sessionId để có thể làm được điều này. Sử dụng @SendToUser annotation của Spring WebSocket các bạn sẽ không cần gán thêm thông tin user này. Cụ thể như thế nào? Mình sẽ hướng dẫn các bạn trong bài viết này các bạn nhé. Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào Giới thiệu JMS – Java Message Services Mình cũng tạo mới một Spring Boot với Web và WebSocket dependency. Kết quả như sau: Mình cũng khai báo để sử dụng WebJars với JQuery , SocketJS client và Stomp WebSocket dependencies như sau: <dependency> <groupId>org.webjars</groupId> <artifactId>webjars-locator-core</artifactId> </dependency> <dependency> <groupId>org.webjars.npm</groupId> <artifactId>jquery</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>sockjs-client</artifactId> <version>1.5.1</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>stomp-websocket</artifactId> <version>2.3.4</version> </dependency> Class WebSocketConfiguration để cấu hình WebSocket: package com.huongdanjava.springboot.websocket; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class...

By stationd
Một số tiện ích mở rộng hữu ích trên Google Chrome #1

Một số tiện ích mở rộng hữu ích trên Google Chrome #1

Bài viết được sự cho phép của blogchiasekienthuc.com Bạn có biết? Google Chrome hiện đang là trình duyệt web mã nguồn mở được sử dụng nhiều nhất trên thế giới hiện nay. Theo Statista thì có khoảng 66% người sử dụng Internet trên toàn cầu sử dụng trình duyệt web này, đó là chưa kể đến các trình duyệt web sử dụng lõi Chromium nữa. Có rất nhiều lý do để khiến nó trở thành trình duyệt web phổ biến nhất thế giới, như là: tốc độ tải trang nhanh, độ bảo mật cao, tính năng mới được bổ sung và update liên tục… và hơn hết, nó có một kho ứng dụng khổng lồ do nhiều nhà phát triển trên thế giới đóng góp. Chúng được thiết kế để phục vụ cho những nhu cầu cụ thể của một cá nhân, hay một nhóm người, thậm chí là cả cộng đồng. Hiện tại, có đến hàng triệu ứng dụng hữu ích trên Chrome Web Store, cả miễn phí lẫn có phí. Trong bài viết này, mình sẽ giới thiệu với các bạn một số Extension (tiện ích mở rộng) đang được sử dụng yêu thích và được khá nhiều người sử dụng hiện nay. 30 tiện ích Chrome (extensions) cho Designer và Developer Chrome: Giả lập mạng internet chậm lại trong testing #1. LastPass Nói tới tiện ích mở rộng thì không thể nào không nhắc tới LastPass, một trình quản lý mật khẩu phổ biến nhất thế giới, với hơn 10 triệu người đang sử dụng hàng ngày. Tiện ích này hỗ trợ lưu trữ các tài khoản và mật khẩu trực tuyến của bạn, hỗ trợ đăng nhập vào các website mà bạn đã đăng ký. Bạn sẽ chỉ đăng ký hay đăng nhập một lần trên...

By stationd
Tìm hiểu về đối tượng String trong Java

Tìm hiểu về đối tượng String trong Java

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Đối tượng String, được định nghĩa trong package java.lang, là một đối tượng cơ bản trong Java. Các bạn sẽ sử dụng nó thường xuyên và là một đối tượng không thể thiếu đối với tất cả chúng ta khi lập trình với Java . Trong bài viết này, mình sẽ trình bày với các bạn sâu hơn về đối tượng String này để các bạn hiểu rõ thêm về nó các bạn nhé! Khởi tạo đối tượng String Chúng ta có nhiều cách để khởi tạo một đối tượng String, đó là: – Sử dụng toán tử new Ví dụ: String a = new String("Khanh"); – Sử dụng toán tử gán (“=”) Ví dụ: String b = "Khanh"; – Khai báo trong dấu nháy kép Ví dụ: System.out.println("Khanh"); Sự khác nhau giữa các cách khai báo trên, đó là: Nếu các bạn khai báo đối tượng String sử dụng toán tử new thì Java sẽ tạo ra những đối tượng Java riêng biệt, lưu trữ ở những vị trí khác nhau trong bộ nhớ. Do đó, khi các bạn so sánh những đối tượng này sử dụng toán tử quan hệ (“==”) thì kết quả sẽ là false. Hãy xem ví dụ sau nhé các bạn: package com.huongdanjava.javaexample; public class Example { public static void main(String[] args) { String a = new String("Khanh"); String b = new String("Khanh"); System.out.println(a == b); } } Kết quả: Nếu các bạn khởi tạo đối tượng String bằng cách sử dụng toán tử gán (“=”) thì khi so sánh những đối tượng này sử dụng toán tử quan hệ (“==”) thì kết quả sẽ là true. Hãy xem xét ví dụ sau nhé các bạn: package com.huongdanjava.javaexample; public class Example {...

By stationd
Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Xử lý Authentication Popup Window sử dụng Selenium WebDriver

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh Bạn có thể gặp Authentication popup này khi thực hiện truy cập vào một trang ứng dụng hay địa chỉ nào đó, ở đây bạn cần phải nhập tên đăng nhập và mật khẩu đúng để có thể thực hiện tiếp các thao tác, tác vụ tiếp theo trên trang đó. Loại popup này không phải là popup thông thường được sinh ra từ java-script của ứng dụng đó, mà là một loại hộp thoại của trình duyệt, do đó mà Selenium không thể thực hiện với cách mà chúng ta vẫn làm là sử dụng sendKey() được. Để giải quyết vấn đề này, chúng ta có hai cách như dưới đây là những cách mà mình tổng hợp được, các bạn có thể tham khảo và nếu có thêm cách nào khác thì vui lòng chia sẻ cho mình và các bạn khác nữa nhé! JavaScript Executor trong Selenium Webdriver Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing 1. Sử dụng Selenium webdriver Cách đơn giản nhất là truyền trực tiếp username và password cùng với đường dẫn trang web yêu cầu theo cú pháp: http://Username:Password@SiteURL Mình có ví dụ: http://msanh:12121221@www.thichanbanhcuon.com.vn Trong đó: msanh là username của mình 12121221 là mật khẩu Và trang web đăng nhập của mình ở đây là http://www.thichanbanhcuon.com.vn Code thì sẽ như thế này: String URL = "http://" + msanh + ":" + 12121221 + "@" + www.thichanbanhcuon.com.vn; driver.get(URL); Alert alert = driver.switchTo().alert(); alert.accept(); 2. Sử dụng AutoIT Bằng cách sử dụng AutoIT ta cũng có thể xử lý được với trường hợp popup này như sau. Nếu bạn chưa cài đặt AutoIT thì tham khảo qua các bước mình đã đề cập ở bài viết này nhé!...

By stationd
Một vài thay đổi đáng chú ý của Chrome 90

Một vài thay đổi đáng chú ý của Chrome 90

Bài viết được sự cho phép của tác giả Lưu Bình An Công cụ debug CSS Flexbox xịn xò hơn Giờ nếu có một HTML element có dạng display: flex hoặc display: inline-flex , bạn sẽ thấy một cái nút bé bé flex trên cái Element panel Bên dưới Style panel , sẽ có thêm một icon nhỏ kế bên display: flex , click vào đó sẽ mở ra một menu để lựa chọn như trên hình. Trong Layout Panel sẽ có thêm một khu vực cho Flexbox liệt kê tất cả các element đang có dạng hiển thị flex 30 tiện ích Chrome (extensions) cho Designer và Developer 30 tiện ích Chrome cho designer và dev Đo performance bằng Core Web Vitals Core web vitals là một bộ hướng dẫn do google khởi xướng để đánh giá thế nào là một trang web xịn xò. Ctrl + Shift + P để mở Command menu trong DevTools, tìm mục Show Rendering , click vào checkbox Core Web Vitals Một ô màu đen nho nhỏ sẽ xuất hiện chứa các thông tin quan trọng sau: Largest Contentful Paint (LCP) : đo thời gian load. Trong khoản 2.5 giây cho lần load đầu tiên là ngon. First Input Delay (FID) : thời điểm có thể tương tác . FID vào dưới 100 mili giây . Cumulative Layout Shift (CLS) : độ ổn định của UI, ví dụ như việc bạn load quá nhiều font khác nhau sẽ tác động tới con số này. CLS dưới 0.1 . Tab Issue Số issue có trên trang được move lên trên cùng của Console Panel để nhắc nhở chúng ta ngày này quá tháng nọ. Bổ sung Trusted Web Activity , lại nhắc nhẹ chúng ta về chất lượng của ứng dụng Xem thêm video...

By stationd
Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server?

Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình Hi mọi người, mình trở lại rồi đây. Hôm nay mình chia sẻ 1 trick siêu siêu nhỏ nhưng lại vô cùng hữu ích nhất là khi chúng ta chẳng may gặp phải tình huống này nhé. Chả là đôi khi chúng ta cần fix 1 cái gì đó, install thêm cái nọ cái kia mà sau khi hỏi bác Gu Gồ, anh em đồng đảng bảo cần bật SQL SERVER INSTALLATION CENTER lên rồi làm abc, xyz… Nhưng ô hay, bật nó lên ở đâu nhỉ???? Sau khi mày mò đủ kiểu và tìm đủ mọi nơi, cuối cùng cũng tìm được chỗ ẩn náu của nó anh em ạ. Mọi người chỉ cần truy cập đường dẫn bên dưới và khởi chạy SQL SERVER INSTALLATION CENTER thủ công nhé. C:Program FilesMicrosoft SQL Server110Setup BootstrapSQLServer2012 Hi vọng giúp đỡ được cho những ai đang tìm kiếm. 🙂 Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com Có thể bạn quan tâm: Elasticsearch là gì? Tìm hiểu về Elasticsearch Làm quen với kiến trúc Serverless Docker to Serverless (Google Cloud Platform) Xem thêm IT Jobs for Developer hấp dẫn trên Station D

By stationd
Xin đừng return mảng kết hợp!

Xin đừng return mảng kết hợp!

Người dịch: Trần Thanh Dân Tôi ghét phải xử lý mảng kết hợp khi đang viết code cho client. Vấn đề với mảng là nó không có ngữ cảnh, không có kiến thức gì đặc biệt. Mảng đơn giản là một phần data được gói gọn theo một format nhất định không được thuận tiện lắm. Tồi tệ nhất là chúng ràng buộc ta vào một cách triển khai nhất định. Tôi không có ý nói rằng bạn không nên trả về các mảng có dữ liệu thống nhất ( return arrays that have uniform data ). Việc trả về mảng của một loại đối tượng là tốt, dù cho bạn không dám chắc được là nó sẽ chỉ chứa một số loại data nhất định qua API. Mảng có thể hoạt động như phần dữ liệu đại diện cho một số lớp (class) nội bộ, và xin nhấn mạnh là nội bộ – là state hợp lí nhất mà nó nên xuất hiện. Cái tôi muốn nói tới là Xem xét đoạn mã sau: class AcmeFileSender implements FileSender { public function sendFiles(FileCollection $files): array { $sent = 0; $errors = []; foreach ($files as $file) { try { $this->send($file); $sent++; } catch (SenderException $exception) { $errors[] = $exception->getMessage(); } } return [ "sent" => $sent, "failed" => count($errors), "errors" => $errors ]; } public function send(File $file): void {//...} } Vấn đề trong trường hợp này là, Chúng ta không thể biết được cấu trúc chính xác của mảng này. Điều này có nghĩa là khi chúng ta viết code ở phía client chúng ta sẽ phụ thuộc vào việc thực hiện phương thức sendFiles() . Chúng ta phải biết được chính xác khóa (key) là gì và loại dữ liệu (sort of data) của khóa đó. Trong hướng...

By stationd
Thêm Firebase vào Flutter và login với Facebook

Thêm Firebase vào Flutter và login với Facebook

Bài viết được sự cho phép của tác giả Khiêm Lê Tại sao cần phải login Facebook Facebook – đây đã là cái tên không còn xa lạ gì nữa đối với mỗi chúng ta, nó đang là trang mạng xã hội lớn nhất hành tinh. Facebook không chỉ dừng lại ở đó, họ còn cung cấp các SDK, API cho các lập trình viên để có thể tích hợp các dịch vụ của mình vào các dịch vụ của họ, phổ biến nhất trong số đó là Login with Facebook. Tại sao chúng ta cần phải tích hợp Facebook trong khi chúng ta có thể tự tạo một phương thức bảo mật riêng cho ứng dụng của mình? Có rất nhiều lý do, nhưng điều dễ thấy nhất chính là tính tiện dụng của nó. Hãy tưởng tượng bạn dùng một ứng dụng mà phải đăng ký tài khoản, rồi phải nhớ tài khoản, mật khẩu đăng nhập… Vậy tại sao bạn không dùng facebook login chỉ với một nút nhấn? Trong bài viết này mình sẽ hướng dẫn các bạn tích hợp facebook login vào flutter . Hãy cùng bắt đầu nào! Tạo project Flutter Đầu tiên, chúng ta cần có một project Flutter androidX và có tích hợp Firebase . Ở đây mình sử dụng androidX bởi vì trong bài viết mình có sử dụng một plugin để login facebook, nhưng plugin đó đã cũ đối với bản thông thường (không có androidX), do đó để tránh bị lỗi không mong muốn, mình khuyên bạn nên dùng androidX. Bạn nào có sẵn project rồi thì migrate sang androidX, bạn nào chưa thì tạo project theo lệnh “flutter create –androidx <project_name>”. Mình sẽ tạo project là flutter_login_with_facebook và tích hợp Firebase Authentication vào, bạn nào chưa biết thì...

By stationd
Tạo ứng dụng Java RESTful Client không sử dụng 3rd party libraries

Tạo ứng dụng Java RESTful Client không sử dụng 3rd party libraries

Bài viết được sự cho phép của tác giả Giang Phan Trong bài này tôi sẽ giới thiệu với các bạn cách gọi Restful web service sử dụng thư viện chuẩn java.net của Java, không sử dụng bất kỳ 3rd party libraries nào khác. Các bước thực hiện Để gọi restful web service thông qua lớp java.net chúng ta lần lượt thực hiện các bước sau: Tạo 1 java.net.URL object. Mở HttpURLConnection từ URL trên. Set các Request property cần thiết. Gửi Request data lên server (nếu có). Nhận Response từ server gửi về (nếu có). 10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java 10 tips để trở thành Java Developer xịn hơn Xem thêm chương trình tuyển dụng Java lương cao trên Station D Ví dụ tạo ứng dụng Java RESTful Client sử dụng java.net Trong ví dụ này, chúng ta sẽ gọi lại các Restful API chúng ta đã tạo ở bài viết trước “ JWT – Token-based Authentication trong Jersey 2.x “. Đầu tiên, chúng ta cần gọi API /auth để lấy token và sau đó chúng ta sẽ attach token này vào mỗi request để truy cập resource. package com.gpcoder; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpClientExample { public static final String BASE_URL = "http://localhost:8080/RestfulWebServiceExample/rest"; private static String token; public static void main(String[] args) throws IOException { token = getToken(); System.out.println("token: " + token); createOrder(); retrieveOrder(); updateOrder(); deleteOrder(); } /** * @POST http://localhost:8080/RestfulWebServiceExample/rest/auth */ private static String getToken() throws IOException { // Create A URL Object URL url = new URL(BASE_URL + "/auth"); // Open a Connection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // Set the Request Content-Type Header Parameter connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Set Response Format Type connection.setRequestProperty("Accept", "application/json");...

By stationd
Proxy là gì? Phân loại, tính năng và cách cài đặt đơn giản

Proxy là gì? Phân loại, tính năng và cách cài đặt đơn giản

Với đời sống phát triển và phụ thuộc vào công nghệ như hiện nay, hàng ngày ta truy cập vào internet mà đã quên đi tính an toàn khi sử dụng. Proxy ra đời để đảm bảo quá trình truy cập mạng diễn ra mượt mà và bảo mật. Cùng Station D tìm hiểu Proxy là gì , các tính chất cũng như cách sử dụng Proxy như thế nào. Proxy là gì? Proxy (còn được gọi là Proxy server) là máy chủ trung gian, đóng vai trò như một cổng kết nối giữa người dùng và internet. Proxy có chức năng tương tự như một bức tường lửa (firewall) hay một bộ lọc truy cập trang web, đảm bảo các kết nối được an toàn khi sử dụng. Cách hoạt động của Proxy Khi một người dùng gửi yêu cầu truy cập tài nguyên từ một trang web, yêu cầu đó sẽ được gửi đến máy chủ proxy trước, thay vì trực tiếp đến trang web đích. Sau đó, máy chủ proxy sẽ gửi yêu cầu đến trang web, nhận phản hồi và chuyển đáp án về cho người dùng. Như hình minh họa dưới đây: Phân loại Proxy Server chính Proxy có thể được phân loại theo nhiều tiêu chí khác nhau. Dưới đây là một số phân loại phổ biến Phân loại Proxy theo loại kết nối Forward proxy Forward Proxy đại diện cho các máy clients. Nó đại diện cho clients gửi request tới các webserver, sau đó nó nhận dữ liệu mà các target site trả về và chuyển tới clients nếu hợp lệ. Chúng ta xem xét ví dụ sau: Chúng ta có 3 máy tính: X, Y, Z. X: là clients Y: proxy server Z: target site Bình thường, sẽ có kết nối...

By stationd
Vue.js là gì?

Vue.js là gì?

Bài viết được sự cho phép của tác giả Nguyễn Xuân Tài Vue.js trong lập trình website quan trọng như thế nào? Xin chào tất cả anh em đam mê ngành công nghệ thông tin. Chắc hẳn là anh em ít khi thấy người ta chia sẻ nhiều về bất cứ tài liệu nào nói về framework của vue.js. Hôm nay viết mã bug sẽ chia sẻ cơ bản về nó nhé. Nhưng trước khi muốn học được nó thì ae phải biết qua htm, css, javascript một chút đã nhé. Mẫu cú pháp câu lệnh trong Vue.js 3 phút làm quen với Vue.js Giới thiệu Vue.js là gì? Vue (phát âm là / vjuː /, like view ) là một khung tiến bộ để xây dựng giao diện người dùng. Không giống như các framework nguyên khối khác, Vue được thiết kế từ đầu để có thể áp dụng dần dần. Thư viện lõi chỉ tập trung vào lớp xem và dễ dàng lấy và tích hợp với các thư viện khác hoặc các dự án hiện có. Mặt khác, Vue cũng hoàn toàn có khả năng cung cấp năng lượng cho các Ứng dụng Trang đơn khi được sử dụng kết hợp với các công cụ hiện đại và các thư viện hỗ trợ . Nếu bạn muốn tìm hiểu thêm về Vue trước khi đi sâu vào, chúng tôi đã tạo một video hướng dẫn về các nguyên tắc cốt lõi và một dự án mẫu. Nếu bạn là một nhà phát triển giao diện người dùng có kinh nghiệm và muốn biết Vue so với các thư viện / khung công tác khác như thế nào. Hướng dẫn cài đặt: Hướng dẫn chính thức giả định kiến ​​thức trình độ trung cấp về HTML, CSS và...

By stationd
Mybatis separator – tiện lợi và nguy hiểm

Mybatis separator – tiện lợi và nguy hiểm

Bài viết được sự cho phép của tác giả Kiên Nguyễn Trước khi bắt đầu tìm hiểu Mybatis separator là gì?. Nếu yếu sinh lí , ý lộn, nếu chưa biết về Mybatis thì các ông có thể đọc bài giới thiệu về Mybatis ở Kieblog . Tựa đề bài viết là Mybatis – chim nhỏ nhưng làm được lâu! . Đọc thôi là đã thấy cường dương bổ thận như rocket 1h rồi. “Sống chung” với sếp siêu nóng tính, bí kíp nào là khôn ngoan? Cải thiện mối quan hệ giữa lập trình viên với sếp: dễ hay khó? (P1) Trong quá trình làm việc tại công ty, gặp phải một dự án sử dụng Mybatis. Va vấp khá nhiều, rút ra không ít kinh nghiệm khi làm việc với chim nhỏ, nên viết ra bài này chia sẻ chút kinh nghiệm nhỏ nhoi khi làm việc với Mybatis separator . Mong anh em đón đọc, có gì chưa đúng xin vui lòng bình luận phía dưới. Đm, tôi thề là ông nào chửi tôi cũng rep lại lịch sự nhé!. Nhìn quen không?. Dynamic với Mybatis rõ ràng render động giấu phẩy giữa các điều kiện IN BẮT ĐẦU NHA! 1. Mybatis separator là gì? Trường hợp sử dụng foreach, seperator giúp thêm các dấu phân tách khi thực hiện loop bằng foreach. Cùng xem xét trường hợp dưới đây. <select id="searchCoursesByTutors" parameterType="map" resultMap="CourseResult"> SELECT * FROM COURSES <if test="tutorIds != null"> <where> tutor_id IN <foreach item="tutorId" collection="tutorIds" open="(" separator="," close=")"> #{tutorId} </foreach> </where> </if> </select> Trong trường hợp này seperator giúp thêm các dấu phẩy giữa các điều kiện IN. SQL sẽ generate ra như sau: SELECT * FROM COURSES WHERE tutor_id IN (1,2,3) Không phải chỉ mỗi cho các điều kiện WHERE IN, seperator còn...

By stationd