Tự tạo SSH tunnel để forward port ra remote server
Bài viết được sự cho phép của tác giả Huy Trần
Khi làm việc, đôi lúc bạn chạy server ở localhost nhưng cần truy cập vào nó từ một thiết bị khác không cùng trong mạng nội bộ, ví dụ chạy web để demo cho khách hàng xem, hoặc muốn test API trên localhost của bạn từ mobile app.
Khi đó bạn cần phải forward port mà server app của bạn đang sử dụng (localhost) ra một server bên ngoài (remote server) để người khác có thể truy cập vào.
Để làm điều này thì bạn có thể sử dụng các dịch vụ như ngrok, PageKite, Forward.
Nhưng nếu có một server riêng thì chúng ta hoàn toàn có thể tự setup một dịch vụ như vậy để xài riêng mà không cần phải phụ thuộc vào ai. Bằng cách sử dụng SSH tunnel.
Setup từ phía server
Yêu cầu đầu tiên là server phải được setup để truy cập được từ bên ngoài (giả sử có domain là kipalol.com) và phải hỗ trợ SSH.
Truy cập vào server và thêm dòng cấu hình GatewayPorts vào file /etc/ssh/sshd_config như sau:
Giả sử trên localhost của bạn đang chạy một Rails app ở cổng 3000, và bạn muốn mọi người có thể truy cập vào Rails app này thông qua cổng 9000 từ phía server của bạn. Ví dụ: http://kipalol.com:9000
Ta chạy lệnh sau trên máy localhost:
ssh -N -R 9000:localhost:3000 user@kipalol.com
Các tham số:
-N để đảm bảo là bạn không kết nối ở chế độ login vào SSH server
-R để tạo tunnel tới server
9000 là cổng ở server mà bạn muốn mở để truy cập vào Rails app ở localhost
localhost:3000 là địa chỉ truy cập và cổng của Rails app
user@kipalol.com là user và địa chỉ truy cập mà bạn dùng để SSH vào server
Từ bây giờ, user có thể truy cập vào http://kipalol.com:9000 để truy cập trực tiếp vào Rails app mà bạn đang chạy trên máy cá nhân của mình.
Ngoài ra các bạn có thể tìm hiểu thêm về các ứng dụng khác của SSH tunnel qua bài này
Người làm tuyển dụng sẽ phải đảm bảo các yêu cầu: Tuyển được người phù hợp, đúng thời gian và với chi phí rẻ nhất. Để làm được điều này đòi hỏi người làm nghề này phải có những kỹ năng gì để hoàn thành công việc?
Chào mừng các bạn đang đến với series các bài học trong Khoá học Tuyển dụng cơ bản cho người mới (newbie) hoàn toàn miễn phí. Tôi là Thành HR sẽ đồng hành cùng bạn trong khoá học này. Và chủ đề mà chúng ta cùng nhau tìm hiểu ngày hôm nay là Các kỹ năng cần có của người làm Tuyển dụng.
Trong bài học Công việc tuyển dụng là làm gì, chúng ta đã cùng nhau điểm qua các công việc chính mà một Chuyên viên tuyển dụng phải làm. Bao gồm:
B1/ Tiếp nhận yêu cầu tuyển dụng từ các phòng ban
B2/ Lập kế hoạch tuyển dụng
B3/ Sàng lọc hồ sơ ứng viên và mời phỏng vấn
B4/ Phỏng vấn đánh giá và thủ tục nhận việc
B5/ Hội nhập nhân viên mới
B6/ Theo dõi đánh giá thử việc và báo cáo tổng kết
Nếu nhắc đến đây mà bạn không có ấn tượng gì, thì hãy quay trở lại bài học số 1 để học lại, khi nào nắm kỹ những điều trên hãy qua tiếp bài số 2.
Người làm tuyển dụng sẽ phải đảm bảo các yêu cầu: Tuyển được người phù hợp, đúng thời gian và với chi phí rẻ nhất. Để làm được điều này đòi hỏi người làm nghề này phải có những tố chất sau để luôn hoàn thành tốt công việc. Mọi người cùng tham khảo và đóng góp ý kiến nhé!
Nắm bắt và biết khai thác thông tin nhanh
Khi bạn nhận một JD (Job Description) – Bản mô tả công việc thì không phải lúc nào bạn cũng hiểu về công việc mình cần tuyển là gì, dù nó có nội dung chi tiết đến đâu đi nữa. Vậy kỹ năng đầu tiên yêu cầu bạn phải đọc hiểu và nắm bắt thông tin nhanh.
Bằng cách ghi chú lại những ý chính của yêu cầu công việc, các thuật ngữ chuyên nghành để tìm hiểu thêm trên internet. Đồng thời liệt kê ra những câu hỏi thật cô đọng và đúng trọng tâm mà bạn cần đặt với quản lý phòng ban yêu cầu tuyển nhân sự để khai thác thêm thông tin. Vì họ không có quá nhiều thời gian cho bạn hỏi lan man.
Social Network, Marketing là một lợi thế
Tại sao làm công việc tuyển dụng lại nên có yêu cầu biết Social Network, Marketing? Vì đã qua rồi cái thời treo banner trước cổng công ty, dán tờ rơi ở các trung tâm việc làm và chờ ứng viên mang hồ sơ đến. Đó là cách làm truyền thống trước đây để tìm ứng viên, và nó đang dần ít hiệu quả đi nhiều và sắp lỗi thời.
Và còn một số cách khác từ trước đến nay để tìm ứng viên là đăng tin lên các website tuyển dụng. Thì hiện tại, việc sử dụng mạng xã hội như Facebook, Zalo, Linkedin…để tiếp cận và đưa thông tin tuyển dụng đến ứng viên đang dần chiếm ưu thế nhiều hơn.
Có thể Công ty bạn có bộ phận marketing riêng để đăng tin lên các kênh social network cho bạn. Tuy nhiên để chủ động hơn và đẩy nhanh tiến độ hơn thì việc bạn có các kỹ năng sử dụng social network là một lợi thế. Ví dụ như cách viết content thu hút, làm sao phải theo trend một chút, có một hình ảnh bắt mắt nhưng vẫn đảm bảo tính chuyên nghiệp…
Các kỹ năng mềm, kỹ năng quan sát
Tất nhiên là làm công việc nào cũng sẽ cần các kỹ năng mềm chứ không riêng gì công việc tuyển dụng cả. Ở đây mình liệt kê lại một lần nữa để bạn nào chưa hình dung được sẽ nắm rõ ràng hơn:
Kỹ năng lắng nghe, kỹ năng đặt câu hỏi, kỹ năng quan sát: Nó sẽ giúp ích bạn rất nhiều trong quá trình phỏng vấn. Bạn có thể đánh giá toàn diện ứng viên từ những hành động của ngôn ngữ cơ thể, biểu cảm khuôn mặt, phân biệt được sự thật trong cách giao tiếp của ứng viên.
Kỹ năng quản lý thời gian: Để đảm bảo bạn hoàn thành deadline, không bị quên task quan trọng vì rất nhiều công việc linh tinh cần bạn phải giải quyết trong một quy trình tuyển dụng. Đặc biệt là không bị quên các cuộc hẹn với ứng viên vì điều này là vô cùng nghiêm trọng. Nếu là sự cố vì lý do bất khả kháng thì không sao. Nhưng nếu cứ lặp đi lặp lại vì bận không biết sắp xếp thời gian thì cần phải xem lại cách bạn sắp xếp công việc cho hợp lý hơn.
Kỹ năng thuyết trình: Tạo sự tin tưởng cho ứng viên trong quá trình bạn trao đổi và phỏng vấn. Hoặc trong buổi hội nhập nhân viên mới vào ngày nhận việc đầu tiên của ứng viên, nếu bạn có khiếu nói chuyện trước đám đông và khả năng thuyết trình sẽ làm ứng viên hào hứng và thích thú hơn.
Sự công bằng và sự tử tế
Sự công bằng: Giúp bạn công tâm khi đánh giá và lựa chọn ứng viên, không bị cảm tính với những ứng viên có khả năng nói quá hay, ngoại hình bắt mắt, hoặc ưu tiên các ứng viên có mối quan hệ, cùng quê…Điều này khá quan trọng khi ra quyết định tuyển dụng ai là người phù hợp nhất cho công ty.
Sự tử tế: Đảm bảo bạn không vì áp lực đảm bảo tuyển đủ số lượng mà có sự gian dối trong việc cung cấp thông tin cho ứng viên. Kiểu như là phóng đại lên mức thu nhập quá đà, vẽ ra viễn cảnh màu hồng khi làm công việc mà bạn đang tuyển,… Việc này sẽ tạo hình ảnh xấu, các khiếu nại về sau hoặc ứng viên khó gắn bó lâu khi phát hiện ra sự thật.
Và, rất nhiều các kỹ năng cần khác nữa. Không quá khó nếu thực sự bạn nghiêm túc với công việc, đam mê với nghề, luôn cố gắng học hỏi cái mới và rút tỉa kinh nghiệm sau những sai lầm trong thực tế bạn làm nghề.
Phần thực hành
Trong phần gợi ý thực hành này, bạn hãy nhớ lại các công việc mà một Chuyên viên tuyển dụng phải làm. Sau đó viết các mục chính công việc đó ra giấy thành các gạch đầu dòng. Tương ứng với mỗi công việc phải làm đã liệt kê, sẽ đi kèm với một kỹ năng cần có để hoàn thành nó. Hãy làm thật nhuần nhuyễn để kết hợp nội dung hai bài vừa học bạn nhé! Chúc các bạn thành công.
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Có một sự thật phũ phàng là cái ngành khoa học xuất hiện từ những năm 1959 không ai quan tâm giờ lại được bà con đổ xô đi học nhờ ơn của báo giới lúc nào cũng ra rả về Deep Learning này Deep Learning nọ…
Mình thấy nhiều bạn bây giờ cứ muốn học là đâm đầu vào học Deep Learning, hoặc tuyên bố là sẽ học Deep Learning, trong khi chắc kí hiệu này θθ chưa chắc đã biết đọc tên như thế nào… mình cảm thấy quan ngại sâu sắc :v
Deep Learning chỉ là 1 mảng con của Machine Learning, và để tiếp cận được Deep Learning thì cần phải nắm được rất nhiều khái niệm cơ bản từ Machine Learning. Nếu không thì trong quá trình học các bạn sẽ rất dễ bỏ qua một vài keyword quan trọng, dẫn tới ko hiểu gì hết luôn.
Sau gần 1 năm theo đuổi việc tự học Machine Learning và thử nghiệm hết các thể loại course online, mình trích lược lại thành lộ trình học như sau, hy vọng sẽ giúp ích được cho nhiều bạn đang quan tâm và muốn bắt đầu tìm hiểu:
Học lý thuyết
Đầu tiên: Học course ML trên Coursera của Andrew Ng kết hợp đọc tài liệu course CS299 (đây là course chính của Andrew, cái course trên Coursera chỉ là trích lược từ course này)
Tất nhiên các khóa trên đều thuộc phạm trù Machine Learning Lý Thuyết (theo như phân loại trên lộ trình học Machine Learning của a @ZuzooVn), trong thời gian ôn luyện lý thuyết, bạn có thể order vài cuốn sách thiên về Machine Learning thực hành để làm quen ví dụ như cuốn:
Và học thêm Sci-Kit hoặc TensorFlow qua loạt bài ví dụ này để tự implement thử vài thứ cho dễ hiểu thêm. Hoặc máu thì có thể tự implement thủ công hoàn toàn, trong trường hợp này mình khuyên nên dùng Swift hoặc Ruby vì cả 2 ngôn ngữ này đều có sẵn một vài cấu trúc dữ liệu cũng như hàm tính toán có thể vận dụng ngay, tránh tốn thời gian implement những cái vặt vãnh, để focus vào cái thuật toán toàn cục.
Hai bước thực hành và lý thuyết bạn có thể tiến hành song song, nhưng tuyệt đối ko đc bỏ phần lý thuyết nếu bạn muốn học ML một cách nghiêm túc 😀
Có thể nói, web là một từ ngữ đã trở nên quá phổ biến trong thời đại kỹ thuật số này. Thế giới đã và đang cố gắng tạo ra vô số ứng dụng web để phục vụ cho nhiều mục đích, trên nhiều thiết bị, với nhiều ngôn ngữ và hỗ trợ mọi thứ công nghệ mà người ta có thể nghĩ ra được. Do đó, kiến thức chuyên môn về phát triển và kiểm thử web gần như là hành trang không thể thiếu khi bạn muốn bước chân vào con đường kiểm thử chuyên nghiệp. Qua cộng đồng vntester, Thông xin hệ thống một số kiến thức về kiểm thử web mà 1 tester nên có, hi vọng các bạn mới có thể định hình trong việc tự học và nghiên cứu của mình.
Xem thêm các vị trí tuyển Tester lương cao trên TopDev
Các công nghệ/ngôn ngữ lập trình và trình diễn Web
Web protocols: HTTP, FTP, IMAP vs POP, TLS/SSL
Ngôn ngữ trình diễn web: html, css, javascript
Database: MSSQL, MySQL, Oracle, DB2
Extensible Markup Language – XML
Single Sign-On (SSO)
Một số chủ đề chuyên môn 1 web tester nên tìm hiểu thêm
Khai thác công cụ hỗ trợ để kiểm thử Web hiệu quả
Scan lỗi broken link
Kiểm tra chính tả
Http request parsing
CSS checker
Web translator với Localization testing
Những điều nên và không nên khi kiểm thử Web
Phân tích và báo cáo chất lượng ứng dụng Web
Những trở ngại thường gặp khi kiểm thử web
Kiểm thử Web với Agile
Trên đây là tổng hợp những chủ đề kiến thức chính yếu mà 1 web tester cần biết và cũng là những hành trang các bạn cần có để tham gia phỏng vấn thành công vào vị trí web tester cũng như đảm đương tốt công việc web testing của mình. Chúc các bạn thành công!.
Joomla là gì? Vì sao Joomla lại được sử dụng phổ biến?
Joomla xuất hiện vào năm 2005 đến nay đã không còn quá xa lạ đối với những lập trình viên lâu năm. Joomla là một bộ giải pháp giúp cả những người chuyên và không chuyên có thể tự xây dựng website. Để hiểu rõ hơn Joomla là gì? Joomla có những ưu điểm nào? Hãy theo dõi bài viết bên dưới.
Joomla là gì? Công cụ thiết kế web hiệu quả
Joomla là gì?
Kể từ khi ra đời cho đến nay Joomla đã phát triển thành công và trở nên phổ biến với người dùng. Mã nguồn này được sử dụng từ website cá nhân cho đến website doanh nghiệp mang tính phức tạp. Với những điểm sáng như dễ dàng cài đặt, quản lý, cung cấp nhiều dịch vụ và có độ tin cậy cao, Joomla đã mang về cho mình hơn 99 triệu lượt tải xuống.
Vậy, Joomla là gì? Joomla là hệ thống quản trị nội dung (CMS) bằng mã nguồn mở. Bộ mã nguồn này được viết bằng ngôn ngữ PHP kết hợp với bộ quản trị cơ sở dữ liệu MySQL, cho phép người dùng dễ dàng xuất bản nội dung lên Internet hoặc Internet. Bên cạnh đó, Joomla được xây dựng trên khung ứng dụng web dạng Model-View-Controller (MVC) giúp website hoạt động nhanh hơn.
Joomla có phải là phần mềm không? Thật tiếc, Joomla không phải là phần mềm mà nó bao gồm bộ mã code với hàng chục ngàn file. Khi tạo web, bạn có thể sửa đổi sâu hơn các dòng code bên trong và đưa ra trang web theo ý muốn.
Các tính năng của Joomla
Để có thể phổ biến như hiện tại, hẳn Joomla sẽ phải mang đến cho người dùng những tính năng hiệu quả. Những tính năng nổi bật của Joomla bao gồm:
1. Tính tương thích cao (Responsive)
Tương thích ở đây có nghĩa là một website được hiển thị phù hợp với tất cả thiết bị cũng như mọi độ phân giải màn hình. Website chuẩn Responsive thì nội dung sẽ dễ đọc và điều hướng cụ thể hơn. Từ đó, tính tương thích cao của website Joomla giúp giữ chân người dùng tiềm năng dù họ sử dụng bất kỳ thiết bị truy cập nào.
Website Joomla thân thiện với mọi thiết bị
2. Đa ngôn ngữ
Không phải người dùng nào cũng biết sử dụng tiếng anh, hiểu được điều đó Joomla hỗ trợ đến 75 ngôn ngữ trên thế giới. Tính đa ngôn ngữ này giúp người dùng cảm thấy hài lòng khi sử dụng website của bạn.
3. Dễ sử dụng và update thường xuyên
Joomla hiện đang sử dụng trình giao diện WYSIWYG (What You See Is What You Get). Công cụ này hiển thị chính xác những thay đổi mà bạn đang chỉnh sửa giúp bạn hình dung rõ hơn sản phẩm cuối cùng của mình như thế nào. Mặt khác, Joomla còn là công cụ được cập nhật thường xuyên nhất và để chuyển sang bản đã cập nhật bạn chỉ cần hai đến ba lần nhấp từ bảng điều khiển quản trị.
4. Bảo mật
Để phòng trừ trường hợp bị hacker tấn công, Joomla cung cấp tính năng xác thực hai yếu tố giúp bạn yên tâm phát triển website của mình. Hơn thế nữa, cho dù thông tin đăng nhập và mật khẩu bạn để quá phổ biến dẫn đến việc bị kẻ xấu chiếm mất website, Joomla cũng hỗ trợ bạn khôi phục trang web một cách dễ dàng.
Từ những tính năng ở trên, cũng như hiểu rõ được định nghĩa Joomla là gì bạn có thể hình dung được những lợi ích mà mà Joomla mang lại như:
Website của bạn sẽ nhanh chóng leo lên top tìm kiếm nhờ vào sự thúc đẩy của các thủ thuật SEO trên Joomla.
Dễ dàng quản lý người dùng vào trang web của bạn nhờ công cụ ACL (Access Control List) của Joomla
Thu hút khách hàng tốt hơn vì giao diện web thiết kế tại Joomla rất thân thiện với khách hàng. Bên cạnh đó là việc hỗ trợ nhiều ngôn ngữ giúp cho khách hàng ở bất cứ nơi đâu trên thế giới đều có thể sử dụng website của bạn.
Tiết kiệm chi phí: Joomla là hệ thống cung cấp rất nhiều tiện ích nhưng được sử dụng hoàn toàn miễn phí.
Sử dụng Joomla có những ưu điểm gì?
Ưu điểm
Cài đặt đơn giản chỉ với 1 click chuột.
Tính ổn định.
Tích hợp TMDT thay vì chỉ là một addon
Nhiều template có sẵn.
Khả năng mở rộng linh hoạt, có thể xử lý traffic khi có cấu hình và kiến trúc phần cứng phù hợp.
Nhược điểm
Với người mới sử dụng thì cần thời gian để làm quen.
So với WordPress, người dùng cần có kỹ năng cao hơn.
Cả Joomla và WordPress đều là hai mã nguồn phổ biến được dùng để xây dựng website. Lời khuyên sử dụng Joomla hay WordPress còn tùy vào nhu cầu của bạn. Có thể kể đến những điểm đáng chú ý như sau:
Joomla cung cấp nhiều chủ đề, plugin để bạn lựa chọn khi tạo website. Trong khi đó, WordPress lại không phổ biến về những điều này.
Nếu bạn xây dựng website phức tạp, có nhiều người dùng đăng ký thì việc sử dụng Joomla sẽ giúp bạn quản lý tốt hơn.
Tuy nhiên, như đã đề cập điểm hạn chế của Joomla, hệ thống này dành cho những người đã có kinh nghiệm, nếu là người mới bạn cần phải đầu tư thời gian để tìm hiểu nó. Còn WordPress dành cho cả dân chuyên và không chuyên.
Nên sử dụng Joomla cho những website nào?
Joomla có thể được sử dụng cho nhiều website, cụ thể bạn có thể sử dụng cho:
Cả Joomla và WordPress đều có thể giúp bạn SEO website. Tuy nhiên, nếu bạn đang tìm kiếm một hệ thống giúp quản lý hiệu quả nhất thì Joomla sẽ mang đến cho bạn những lợi ích kinh doanh đáng kể.
Trong bài trước, Kiểm thử ứng dụng Web – Cái nhìn tổng quát, Thông đã khái quát một số nội dung chính về chủ đề kiểm thử web nhằm giúp các bạn định hình hệ thống kiến thức về mảng kiểm thử web. Trong bài này, chúng tôi xin giới thiệu tiếp một số kiến thức phổ thông về ứng dụng Web nhẳm giúp các bạn mới có thể tiếp cận dễ dàng hơn các định nghĩa căn bản.
Định nghĩa Web
World Wide Web
Hẳn chúng ta đã quá quen thuộc với việc gõ lên thanh URL trên màn hình Internet Explorer (IE), Firefox, Chrome những dòng chữ: http://www.blah blah…com. Từ “Web” mà chúng ta đang tìm hiểu là tên gọi tắt của “World Wide Web” (vâng, chính là chữ www bạn thấy trong URL bên trên). Khi mạng máy tính toàn cầu internet ra đời, nó mở ra một môi trường mạng lưới ảo kết nối mọi máy tính (như mạng nhện – web). Trong đó, tất cả máy tính trở thành những đầu mút kết nối lẫn nhau, mỗi đầu mút chia sẻ thông tin, tài liệu mà nó lưu trữ để tất cả đầu mút khác có thể truy cập và ngược lại. Khi ta kết nối máy tính của mình vào bất kỳ đầu mút nào, ta cũng có thể tiếp cận thông tin của tất cả nơi khác trên mạng lưới. Ta gọi mạng lưới đó là “World Wide Web” – một không gian ảo kết nối tất cả thông tin từ mọi nơi trên thế giới.
Cùng với sự phát triển không ngừng, theo thời gian tất cả máy tính kết nối trong mạng lưới được phân hóa theo 2 mục đích chuyên biệt:
Server: có dung lượng lưu trữ lớn và cấu hình rất mạnh chỉ nhằm mục tiêu chia sẻ thông tin
Client/Workstation: đây chính là máy tính cá nhân/thiết bị của chúng ta khi kết nối internet, chỉ nhằm mục đích truy cập thông tin từ nơi khác và chia sẻ một lượng rất nhỏ thông tin.
Thêm vào đó, các loại hình chia sẻ thông tin trực tuyến không chỉ dừng lại ở việc trao đổi và truy cập dữ liệu. Sự phát triển của công nghệ đã mở ra các loại hình dịch vụ trực tuyến mới với đa dạng mục đích hơn: báo chí, tìm kiếm, kinh doanh trực tuyến, thanh toán trực tuyến, email, mạng xã hội…
Vậy ứng dụng Web là gì?
Ta hãy xem xét một ví dụ đơn giản: khi bạn “lướt Facebook”
Bạn mở Firefox hoặc Internet Explorer và gõ vào URL của trang Facebook https://www.facebook.com/
Màn hình Firefox sẽ hiện ra trang chủ quen thuộc của Facebook. Trên đó hiển thị logo Facebook, dòng slogan “kết nối và chia sẻ” quen thuộc, một form đăng nhập username password và một form đăng ký cho những user mới.
Bạn gõ username, password vào form đăng nhập và click “Log In”
Màn hình Firefox chuyển đến trang cá nhân của tài khoản mà bạn vừa đăng nhập, trên đó hiện ra các dòng status của bạn và bạn bè
Chúng ra nói rằng trang Facebook mà bạn vừa đăng nhập ở trên là một “Ứng dụng Web” (Web Application – xin gọi tắt là WebApp). WebApp này cung cấp cho bạn (là người dùng – một end-user) một dịch vụ mạng xã hội đến từ tập đoàn Facebook. Tất cả mọi WebApp khi được xây dựng đều nhằm mục đích cung cấp một dịch vụ nào đó mà chủ nhân nó muốn (vd: mạng xã hội Facebook, hộp Mail Google, báo điện tử VNExpress, trang mua sắm Lazada). Hãy cùng phân tích chuyện gì đã xảy ra đằng sau màn hình desktop khi bạn thực hiện 4 hành động trên:
Ở bước 1: Facebook, cũng như tất cả mọi WebApp khác, để kết nối và hoạt động được trên mạng internet nó cần được cài đặt lên một máy chủ (Host – Server) và đăng ký một tên miền (vd: “www.facebook.com”). Khi bạn (một end-user) gõ đường URL “https://www.facebook.com/” vào Firefox trên máy mình, ta nói rằng bạn đang thực hiện gửi một yêu cầu (request) đến tên miền “www.facebook.com” nhằm xin phép truy cập vào WebApp Facebook. Tuy nhiên, máy móc không hiểu tiếng người và để phía Server kia giao tiếp được với bạn thì request của bạn cần được thông dịch qua một thứ ngôn ngữ giao tiếp mà server đó có thể hiểu được. Các trình duyệt web (browser) như Firefox, IE, Chrome ra đời nhằm mục đích này. Chúng được cài đặt trên máy tính của bạn (client) để thông dịch các request của bạn qua mã máy, gói đoạn mã máy lại thành từng gói dữ liệu và gửi đến địa chỉ www.facebook.com. Hiện nay, ngôn ngữ giao tiếp thông dụng nhất dùng để giao tiếp với các server trên internet là HTTP (Hypertext Transfer Protocol)
Một gói request http thường có định dạng tương tự như sau:
GET / HTTP/1.1
Host: facebook.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
…
Ở bước 2: Khi server Host kia nhận được gói dữ liệu request của bạn, nó phân tích và chuyển đến một trung tâm điều phối được cài sẵn trên chính nó gọi là Web Server. Trung tâm điều phối này là một phần mềm có nhiệm vụ quản lý và điều phối các tài nguyên của WebApp (resource). Ta hiểu tài nguyên là các thành phần cấu thành một WebApp, trong đó có các trang web (webpage), các file hình ảnh, các file video, các hiệu ứng chữ chạy, chữ nổi .… Web Server này đọc gói request của bạn và nó sẽ hiểu rằng bạn đang cần truy cập vào WebApp “Facebook”. Nó bắt đầu áp dụng quy trình thủ tục được lập trình sẵn là yêu cầu bạn khai báo xem bạn có tài khoản chưa trước khi cho bạn đi xa hơn. Nó soạn ra một gói dữ liệu trả về (response) bao gồm mã cho phép truy cập và nội dung trang web homepage của Facebook.
Một gói response http thường có định dạng tương tự như sau:
HTTP/1.1 200 OK
Date: Sat, 31 May 2015 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354
<html>
<body>
(Nội dung trang web homepage Facebook).
</body>
</html>
Bạn sẽ thấy rằng ngoài thông tin quy định về ngày giờ và mã truy cập, gói dữ liệu này còn kèm theo 2 đoạn tag <html><body>…</body></html>. Giữa 2 đoạn tag này thường là nội dung một webpage được viết dưới định dạng HTML, CSS và Javascript. Đây là các ngôn ngữ trình diễn nội dung web thông dụng và cũng có thể được đọc hiểu bởi browser. Browser nhận gói dữ liệu này, biên dịch nội dung kẹp trong gói response và vẽ lên màn hình trang web Login Facebook với đầy đủ hình ảnh và màu sắc trên máy bạn. Và với những thông tin trình diễn trên màn hình, bạn sẽ hiểu là server muốn bạn đăng nhập với một tài khoản để đi xa hơn. Trên webpage vẽ sẵn form để bạn nhập username và password. Form đăng ký cũng được vẽ sẵn bên dưới để bạn hiểu là bạn cần đăng ký nếu chưa có tài khoản.
Ở bước 3: Khi bạn nhập username, password và click “Log In”, cũng giống như ở bước 1 ở trên, bạn đã thực hiện 1 thao tác gửi request để yêu cầu được truy cập vào trang tài khoản cá nhân của tài khoản mà bạn nhập vào. Browser cũng sẽ biên dịch request của bạn thành 1 gói http request và gửi đến server kia. Tuy nhiên, lần này có một chút khác biệt là request này còn kèm theo 2 trường usersername và password bạn nhập vào. Ta sẽ có một gói request đại loại như:
POST / HTTP/1.1
content-type:application/x-www-form-urlencoded;charset=utf-8
host: facebook.com
content-length: 1354
Action=GetUserHome&Username=HmacSHA256&Password=45rffdd33yyd35ggd&SignatureVersion=2&Versi
Ở bước 4: Tương tự như quy trình giao nhận bước 1 và 2, gói dữ liệu request lại được chuyển đến Web Server và tại đây bắt đầu quá trình phân tích/điều hướng để gom những tài nguyên (resource) cần thiết nhằm nhào nặn ra nội dung trang wall facebook của bạn. Trong trường hợp này, thông tin cần được xử lý phức tạp hơn vì cần phải truy xuất những bài post và status, hình ảnh liên quan đến tài khoản của bạn. Webserver có thể huy động đến các cổng xử lý khác để xử lý thông tin, hiệu ứng và truy xuất đến cơ sở dữ liệu (database) của Facebook để lấy ra những dữ liệu cần thiết từ tài khoản của bạn. Toàn bộ quá trình xử lý này sẽ dẫn đến một kết quả cuối cùng là tạo ra nội dung trang wall facebook dưới dạng html, css và javascript để đưa vào gói trả về response. Browser trên máy bạn lại nhận response và bung ra trang wall facebook cá nhân của bạn với đầy đủ status, hình ảnh và comment phong phú.
Cứ như thế, ta thấy rằng lướt web thực ra là một vòng tuần hoàn khép kín giữa việc yêu cầu (request) và gửi trả (response) dữ liệu giữa phía người dùng (client) và server. Phía server tạo ra nội dung web dưới dạng mã html, css. Browser ở phía client sẽ đảm nhận vai trò nhận và vẽ lên màn hình người dùng các nội dung sống động. Khi ta nói rằng ta xây dựng và kiểm thử một WebApp, có nghĩa rằng ta xây dựng và kiểm thử toàn bộ hệ thống giúp tạo nên vòng tuần hoàn khép kín trên.
Mô hình hoạt động của 1 ứng dụng web (web application)
Nếu bạn hiểu đúng những nội dung trên, bạn sẽ hình dung được khi test 1 ứng dụng web:
Chúng ta không test browser vì đó chỉ là 1 trình biên dịch thông dụng cho tất cả ứng dụng web. Chúng ta test “dịch vụ” mà server cung cấp cho client.
Quy trình (có thể) sẽ dẫn chúng ta đến việc kiểm thử ở cả 2 phía: máy client và server.
Tùy vào độ lớn của dịch vụ được xây dựng, chúng ta có thể sẽ làm việc với một vòng trao đổi dữ liệu khép kín phức tạp thông qua nhiều trình ứng dụng, đi qua nhiều cơ sở dữ liệu, và thông qua nhiều máy chủ khác nhau trước khi có thể tạo ra một response đến client cho user.
Phạm vi chúng ta cần test sẽ trải dài trên nhiều mảng kiến thức: test trên một ứng dụng server (application), test trên một cơ sở dữ liệu (database), test phần nội dung hiển thị trên trình duyệt client, test việc truyền tải dữ liệu qua lại giữa client và server hoặc (có thể) giữa các server với nhau (API), test các nội dung số và có thể bao gồm cả những quy trình mã hóa dữ liệu (web standards & encryptions).
Ở bài trước mình có giới thiệu về kĩ thuật lập trình GPU với OpenCL bằng C/C++. Hôm nay mình sẽ giới thiệu tiếp kĩ thuật này trên Go.
Sử dụng C/C++ trong Go
Một đặc điểm của Golang là chúng ta có thể thoải mái import các thư viện C/C++ và biên dịch bằng sự hỗ trợ của Cgo, các bác có thể xem lại bài Một số kinh nghiệm làm việc với Cgo để biết thêm chi tiết.
Về cách sử dụng thì chúng ta chỉ đơn giản là viết đoạn code C/C++ trong phần comment đầu file và biên dịch:
Cho nên chúng ta hoàn toàn có thể include thư viện OpenCL từ bên phía C/C++ vào Go để chạy bằng Cgo. Tất nhiên phải chỉ định framework cần dùng ở đầu chương trình luôn, ví dụ:
Bạn có thể lập trình cho Host Program bằng Golang, tuy nhiên, đối với Kernel Program thì nó vẫn là một file .cl và nó vẫn phải dùng cú pháp của C, hoàn toàn không có sự thay đổi nào ở đây cả.
Sử dụng Go Wrappers
Nếu cảm thấy việc khai báo cú pháp theo Cgo là hơi phức tạp và gây rối cho chương trình thì bạn có thể sử dụng các wrapper có sẵn mà cộng đồng Golang đã xây dựng, bản chất các wrapper này vẫn là sử dụng Cgo không có gì khác, chúng chỉ cung cấp cho bạn cú pháp dễ nhìn hơn và dễ build hơn mà thôi.
CUDA Wrapper cho Go
Bài viết này không có ý định tìm hiểu sâu hơn về CUDA cho nên mình sẽ dẫn link để các bạn tham khảo.
Tác giả Arne Vansteenkiste có viết một thư viện tên là mumax3mumax3 hỗ trợ lập trình GPU bằng CUDA, các bạn không nhất thiết phải sử dụng MuMax tuy nhiên có thể sử dụng CUDA wrapper mà MuMax cung cấp.
package mainimport "github.com/mumax/3/cuda"func main(){ N := 3 a := cuda.NewSlice(N) b := cuda.NewSlice(N) c := cuda.NewSlice(N) defer a.Free() defer b.Free() defer c.Free() a.CopyHtoD([]float32{0, -1, -2}) b.CopyHtoD([]float32{0, 1, 4}) cfg := Make1DConfig(N) add_kernel(a.Ptr(), b.Ptr(), c.Ptr(), cfg) fmt.Println("result:", a.HostCopy())}
Với OpenCL thì chúng ta cũng có kha khá là nhiều các wrapper, tuy nhiên ở đây mình chọn sử dụng go-gl/cl vì dự án này được phát triển khá là nghiêm túc và rất active, tài liệu + community đầy đủ.
Cách sử dụng thì rất đơn giản, đầu tiên bạn chỉ cần cài đặt gói go-gl/cl mới nhất, hoặc là bản stable nhất (là bản v1.2):
go get github.com/go-gl/cl/v1.2/cl
Hoặc có thể download và compile lại gói này với lệnh sau để đạt performance tốt hơn:
go install -gcflags="-l -l -l -l" github.com/go-gl/cl/v1.2/cl
Lệnh trên sẽ inline hầu hết mọi function trong package go-gl/cl và vì việc gọi function thì rất tốn kém (xem ở đây), nên inline sẽ giúp giảm thiểu chi phí cho vụ này, tuy nhiên nhược điểm của cách này là dung lượng binary khi build sẽ lớn hơn nhiều.
Cách dùng thì chỉ cần import thư viện trên vào code, và gọi hàm thông qua đối tượng cl:
Mẫu CV IT tiếng Anh (CV English IT) chuẩn là như nào? Bạn đang gặp những khó khăn khi viết CV IT? Đừng lo lắng vì chỉ với vài phút đọc bài viết sau, các bạn sẽ tham được các mẫu CV IT ấn tượng nhất.
Thế nào là một CV IT English chuẩn?
Việc đảm bảo các nội dung cơ bản của một CV rất quan trọng. Vì nó sẽ là yếu tố quyết định CV của bạn có chỉn chu, chuyên nghiệp hay không? Đồng thời, CV cũng là tấm vé để bạn tạo ấn tượng với nhà tuyển dụng.
Dù là CV IT tiếng Anh (CV IT English) hay tiếng Việt, bạn vẫn phải đảm bảo những nội dung cơ bản dưới đây:
Thông tin cá nhân (Personal details)
Liệt kê ngắn gọn họ tên, ngày tháng năm sinh, số điện thoại, địa chỉ nơi ở, email, một số kênh liên lạc khác. Đặc biệt, bạn nên có hình đại diện. Lưu ý hình ảnh phải rõ mặt, email phải đặt đúng quy chuẩn. Bạn có thể tăng thêm dấu ấn cá nhân bằng một vài câu châm ngôn mình yêu thích.
Mục tiêu nghề nghiệp (Career Objective)
Nêu rõ các định hướng mà bạn đang lập ra cho kế hoạch phát triển nghề nghiệp. Sau đó, hãy tóm tắt trong vòng 2-3 câu mục tiêu ngắn hạn/dài hạn.
Trình độ học vấn (Education and Qualifications)
Trình bày ngắn gọn các nội dung như bằng cấp học học thuật, tên trường và ngành học.
Kinh nghiệm làm việc (Work Experience)
Hãy thông minh trong việc lựa chọn và liệt kê những kinh nghiệm có liên quan đến vị trí ứng tuyển hiện tại. Lưu ý, bạn nên sắp xếp chúng theo một trình tự logic.
Sở thích và thành tích hoạt động ngoại khóa (Interests and Achievements)
Tuyệt đối không đưa những sở thích quá trẻ con. Thay vào đó, bạn hãy quan đưa các sở thích rèn luyện về chuyên môn, hoạt động ngoại khóa phát triển kỹ năng mềm,…,
Kỹ năng (Skills)
Đây là mục để bản thể hiện ra những kỹ năng chuyên môn, kỹ năng mềm và khả năng ngoại ngữ của bạn. Phần này cũng quan trọng không kém trong CV ngành công nghệ thông tin.
Người tham khảo/người giới thiệu (References)
Mục này không nhất thiết phải có. Nhưng đối với các vị trí nhiều kinh nghiệm, các thông tin của người giới thiệu rất có giá trị đối với CV English IT của bạn.
Ngoài ra, bạn cũng có thể tham khảo các mẫu CV IT đẹp và cách viết CV xịn dành cho lập trình viên được cập nhật mới nhất.
Ngoài việc đảm bảo về thông tin chính xác, đầy đủ; kiến thức chuyên môn lĩnh vực, những định hướng cụ thể, các lập trình viên Front End cần tập trung nhấn mạnh các kỹ năng như sau:
Kỹ năng sử dụng các ngôn ngữ đánh dấu tiêu chuẩn HTML5, CSS3
Thành thạo ngôn ngữ lập trình JavaScript hay Jquery
Nắm vững toàn bộ quy trình phát triển web
Kỹ năng thiết kế và triển khai responsive ở phần coding
Kỹ năng phân tích và xử lý rủi ro
Chịu được áp lực cao
Devops
Sẽ có khá nhiều thứ bạn phải quan tâm, nắm bắt và chia sẻ nếu muốn CV tiếng Anh cho lập trình Devops của mình trở nên thu hút đấy. Hãy thể hiện trong CV bạn là người có các thế mạnh về system cũng như coding cùng nhiều kỹ năng sau đây:
Biết và sử dụng thành thạo Linux, window, macOS; và các lệnh tương ứng.
Kiến thức cơ bản về: DNS, HTTP, HTTPS, FTP, SSL.
Biết cài đặt và sử dụng vài Web Server phổ biến như: Apache và Nginx. Am hiểu tổng quan về các khái niệm: Caching Server, Load balancer,…
Code một số ngôn ngữ hệ thống như Bash Script, Java, Javascript, Python, PHP…
Tester
Nhiều kỹ năng được chú trọng, tuy nhiên để tạo điểm thu hút trong CV tiếng Anh cho lập trình Tester, bạn cần thể hiện rõ performance của bản thân qua những kỹ năng thực tế:
– Năng lực về Automation framework – yếu tố quan trọng đánh giá về mức độ kiểm thử tự động
– Kỹ thuật kiểm thử bạn đã áp dụng (Boundary, Equivalence, Độ bao phủ code)
– Xử lý các trường hợp hợp – Thiết kế và thực thi; các hoạt động bạn tham gia thể hiện kỹ năng: tìm bug, review bug với khách hàng, quản lý vòng đời bug.
Những chú ý về thể thức và cách trình bày cực kỳ quan trọng trong CV tiếng Anh cho Dev
– Đúng chính tả và đặc biệt lưu tâm về tính đơn giản là quan trọng nhất.
– Đảm bảo không dùng nhiều hơn 2 font chữ khác nhau
– Không nên trình bày quan điểm quá dài dòng dưới dạng đoạn quá nhiều. Ưu tiên việc sử dụng dấu gạch đầu dòng để liệt kê nhằm thể hiện rõ ràng về bố cục.
– Tiếng lóng hay các cách sử dụng thủ pháp nghệ thuật nên được cân nhắc khi đưa vào CV của bạn.
– Nếu có thể, hãy tạo nguồn email chuyên nghiệp ứng vị trí ứng tuyển hiện tại. Ví dụ: “phamanhkhoa.frontenddeveloper”. Tuyệt đối không dùng những email thiếu chuyên nghiệp (vi phạm các cách đặt tên cơ bản về email)
– Lựa chọn kích cỡ ảnh chân dung phù hợp, 3×4 hay 4×5 sẽ là những kích thước phù hợp cho CV của bạn.
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Giới thiệu Cơ Sở Dữ Liệu (CSDL) – Hệ Quản Trị CSDL
Bài viết được TopDev tổng hợp và chỉnh sửa của tác giả Lê Chí Dũng
Cơ sở dữ liệu là gì? Bạn đã thật sự nắm được các kiến thức chuyên sâu về Database. Vậy hãy cùng TopDev tìm hiểu từ A-Z về CSDL thông qua bài viết này nhé.
CSDL là gì?
Cơ sở dữ liệu (database) là một tập hợp các dữ liệu rời rạc được tổ chức, lưu trữ và quản lý theo hệ thống để có thể dễ dàng truy xuất, chỉnh sửa và cập nhật. Chúng thường được sử dụng để lưu trữ thông tin trong các hệ thống phần mềm và ứng dụng, từ dữ liệu cá nhân cho đến thông tin doanh nghiệp quan trọng. Cơ sở dữ liệu giúp các tổ chức và cá nhân tổ chức dữ liệu một cách có cấu trúc, nhằm mục đích quản lý và xử lý dữ liệu hiệu quả hơn.
VD: Trong cuộc sống bạn có thể thấy rất nhiều cơ sở dữ liệu đó, nếu bạn vào thư viện thì ở trên đó là một cơ sở dữ liệu, phân loại sách theo chủ đề: xã hội, tự nhiên, khoa học … đó cũng là một dạng cở sở dữ liệu đơn giản.
Mục đích ta sử dụng CSDL là vì cho dễ quản lý và tìm kiếm, thống nhất việc lưu trữ thông tin. Có thể tìm kiếm một cách nhanh chóng khi cần thông tin nào đó và cũng có thể lôi các thông tin liên quan với thông tin đó ra luôn.
Đặc điểm của Cơ sở dữ liệu
Cơ sở dữ liệu (CSDL) có nhiều đặc điểm quan trọng giúp quản lý, tổ chức và xử lý dữ liệu một cách hiệu quả. Những đặc điểm này đảm bảo rằng dữ liệu được lưu trữ, truy xuất và bảo mật một cách tối ưu, đồng thời hỗ trợ các ứng dụng và hệ thống trong việc quản lý thông tin. Dưới đây là các đặc điểm chính của cơ sở dữ liệu:
Tính tổ chức và cấu trúc: CSDL tổ chức dữ liệu theo một cấu trúc có hệ thống, thường được thiết kế dưới dạng bảng, đối tượng hoặc mô hình dữ liệu khác. Cấu trúc này giúp dữ liệu được tổ chức một cách hợp lý, dễ dàng truy cập và quản lý.
Khả năng truy xuất và tìm kiếm: CSDL cho phép người dùng truy xuất và tìm kiếm dữ liệu nhanh chóng và hiệu quả thông qua các truy vấn. Các hệ quản trị cơ sở dữ liệu (DBMS) cung cấp ngôn ngữ truy vấn, chẳng hạn như SQL, để thực hiện các thao tác này.
Tính nhất quán và toàn vẹn: CSDL đảm bảo rằng dữ liệu luôn được duy trì một cách chính xác và nhất quán thông qua các ràng buộc toàn vẹn. Các quy tắc này bao gồm khóa chính, khóa ngoại và các hạn chế khác để bảo vệ dữ liệu khỏi lỗi và mất mát.
Khả năng mở rộng: CSDL có thể mở rộng để xử lý khối lượng dữ liệu ngày càng tăng và đáp ứng nhu cầu của ứng dụng. Điều này có thể được thực hiện thông qua việc thêm phần cứng hoặc sử dụng các kỹ thuật phân tán và phân mảnh dữ liệu.
Bảo mật và quyền truy cập: CSDL cung cấp các cơ chế bảo mật để bảo vệ dữ liệu khỏi các truy cập trái phép. Điều này bao gồm việc thiết lập quyền truy cập, mã hóa dữ liệu và theo dõi các hoạt động của người dùng.
Khả năng sao lưu và phục hồi: CSDL hỗ trợ sao lưu dữ liệu định kỳ và phục hồi dữ liệu khi xảy ra sự cố. Các chức năng này giúp đảm bảo rằng dữ liệu có thể được khôi phục về trạng thái trước đó trong trường hợp mất mát hoặc hỏng hóc.
Quản lý giao dịch: CSDL hỗ trợ quản lý giao dịch, đảm bảo rằng các thao tác trên dữ liệu được thực hiện một cách nguyên tử, nhất quán, tách biệt và bền vững. Điều này giúp duy trì tính toàn vẹn của dữ liệu ngay cả khi xảy ra lỗi hệ thống.
Khả năng hỗ trợ đồng thời: CSDL có khả năng xử lý nhiều yêu cầu và giao dịch đồng thời từ nhiều người dùng mà không làm giảm hiệu suất hoặc làm mất dữ liệu. Điều này được thực hiện thông qua các cơ chế khóa và quản lý đồng thời.
Tính tương thích: CSDL có thể tương thích với các ứng dụng và hệ thống khác thông qua các giao thức và giao diện chuẩn. Điều này cho phép tích hợp dữ liệu từ nhiều nguồn khác nhau và hỗ trợ các quy trình doanh nghiệp.
Những đặc điểm này giúp cơ sở dữ liệu đáp ứng nhu cầu quản lý dữ liệu trong các ứng dụng và hệ thống đa dạng, từ các hệ thống nhỏ lẻ đến các ứng dụng quy mô lớn và phức tạp.
Cơ sở dữ liệu có cấu trúc (Structured Database): Dữ liệu được tổ chức theo cấu trúc cố định, thường là các bảng với hàng và cột. Ví dụ: Cơ sở dữ liệu quan hệ (RDBMS) như MySQL, PostgreSQL.
Cơ sở dữ liệu phi cấu trúc (Unstructured Database): Dữ liệu không có cấu trúc cố định, chẳng hạn như văn bản tự do, email, hình ảnh. Ví dụ: Dữ liệu trong các hệ thống lưu trữ đám mây.
Cơ sở dữ liệu bán cấu trúc (Semi-Structured Database): Dữ liệu có cấu trúc nhưng không hoàn toàn theo quy tắc cố định. Ví dụ: Dữ liệu JSON, XML.
Phân loại theo mô hình tổ chức và lưu trữ
Cơ sở dữ liệu quan hệ (Relational Database): Dữ liệu được lưu trữ trong các bảng và có thể được liên kết với nhau thông qua các khóa. Ví dụ: MySQL, Oracle, SQL Server.
Cơ sở dữ liệu phân cấp (Hierarchical Database): Dữ liệu được tổ chức theo cấu trúc cây với các mối quan hệ cha-con. Ví dụ: IBM Information Management System (IMS).
Cơ sở dữ liệu mạng (Network Database): Dữ liệu được tổ chức theo mạng lưới với các mối quan hệ linh hoạt hơn giữa các bản ghi. Ví dụ: Integrated Data Store (IDS).
Cơ sở dữ liệu hướng đối tượng (Object-Oriented Database): Dữ liệu được lưu trữ dưới dạng các đối tượng, tương tự như lập trình hướng đối tượng. Ví dụ: ObjectDB, db4o.
Cơ sở dữ liệu NoSQL (Not Only SQL): Dữ liệu được lưu trữ theo nhiều mô hình khác nhau không phải là bảng. Ví dụ: MongoDB (dữ liệu tài liệu), Cassandra (dữ liệu cột), Redis (dữ liệu key-value).
Phân loại theo mục đích sử dụng
Cơ sở dữ liệu hoạt động (Operational Database): Dùng để xử lý và lưu trữ dữ liệu giao dịch hàng ngày trong doanh nghiệp. Ví dụ: Các hệ thống ERP, CRM.
Cơ sở dữ liệu kho (Data Warehouse): Lưu trữ dữ liệu từ nhiều nguồn để phân tích và báo cáo. Ví dụ: Amazon Redshift, Google BigQuery.
Cơ sở dữ liệu ngữ nghĩa (Semantic Database): Lưu trữ dữ liệu với ý nghĩa ngữ nghĩa để hỗ trợ tìm kiếm và truy vấn thông minh. Ví dụ: Cơ sở dữ liệu RDF, OWL.
Phân loại theo mô hình triển khai
Cơ sở dữ liệu tập trung (Centralized Database): Được lưu trữ và quản lý tại một địa điểm duy nhất. Ví dụ: Cơ sở dữ liệu trong các hệ thống máy chủ trung tâm.
Cơ sở dữ liệu phân tán (Distributed Database): Dữ liệu được lưu trữ và xử lý tại nhiều địa điểm khác nhau, kết nối qua mạng. Ví dụ: Google Cloud Spanner, Apache Cassandra.
Cơ sở dữ liệu tập trung có bản sao (Centralized with Replica Database): Kết hợp giữa cơ sở dữ liệu tập trung và phân tán, với một cơ sở dữ liệu chính và các bản sao ở các địa điểm khác. Ví dụ: Hệ thống sao lưu dữ liệu trong các dịch vụ đám mây.
Mô hình cơ sở dữ liệu
Cơ sở dữ liệu là phần quan trọng trong việc tổ chức và quản lý dữ liệu. Các mô hình cơ sở dữ liệu khác nhau cung cấp cách tiếp cận khác nhau để lưu trữ, truy xuất, và quản lý thông tin. Dưới đây là ba mô hình cơ sở dữ liệu phổ biến: phân cấp, quan hệ và mạng.
Mô hình cơ sở dữ liệu
Mô Hình Cơ Sở Dữ Liệu Phân Cấp (Hierarchical Database)
Mô hình cơ sở dữ liệu phân cấp (Hierarchical Database) tổ chức dữ liệu theo cấu trúc cây, nơi các bản ghi dữ liệu được sắp xếp theo mối quan hệ cha-con. Đây là mô hình cơ sở dữ liệu đầu tiên được phát triển và đã được sử dụng rộng rãi trong những năm 1960 và 1970.
Trong mô hình phân cấp, mỗi bản ghi (hoặc nút) có thể có một số bản ghi con, nhưng mỗi bản ghi con chỉ có một bản ghi cha. Cấu trúc này giống như một cây gia đình hoặc một danh mục thư viện, nơi các mục lục con nằm dưới các mục lục lớn hơn. Ví dụ, một cơ sở dữ liệu phân cấp có thể tổ chức thông tin nhân viên trong một công ty, với các phòng ban là các nút cha và các nhân viên là các nút con.
Mô Hình Cơ Sở Dữ Liệu Phân Cấp (Hierarchical Database)
Ưu điểm:
Dễ dàng và trực quan trong việc mô hình hóa các mối quan hệ có cấu trúc rõ ràng.
Hiệu suất tốt với các truy vấn theo cấu trúc cây.
Nhược điểm:
Kém linh hoạt trong việc xử lý các mối quan hệ phức tạp hoặc nhiều cấp độ.
Khó khăn trong việc thực hiện các thao tác thay đổi cấu trúc dữ liệu.
Cơ Sở Dữ Liệu Quan Hệ (Relational Database)
Mô hình cơ sở dữ liệu quan hệ (Relational Database) là mô hình phổ biến nhất hiện nay. Dữ liệu được tổ chức trong các bảng (hay còn gọi là thực thể), mỗi bảng bao gồm các hàng và cột. Các bảng có thể liên kết với nhau thông qua các khóa (keys), chẳng hạn như khóa chính (primary key) và khóa ngoại (foreign key).
Trong mô hình quan hệ, dữ liệu được lưu trữ trong các bảng với định dạng cấu trúc rõ ràng, và các mối quan hệ giữa các bảng được quản lý thông qua các thuộc tính chung. Ví dụ, một cơ sở dữ liệu quan hệ có thể có một bảng lưu thông tin về khách hàng và một bảng khác lưu thông tin về đơn hàng, với khóa ngoại liên kết đơn hàng với khách hàng.
Cơ Sở Dữ Liệu Quan Hệ (Relational Database)
Ưu điểm:
Tính linh hoạt cao trong việc quản lý và truy xuất dữ liệu nhờ vào các mối quan hệ giữa các bảng.
Dễ dàng thực hiện các truy vấn phức tạp bằng cách sử dụng ngôn ngữ truy vấn SQL (Structured Query Language).
Nhược điểm:
Có thể gặp khó khăn với hiệu suất khi làm việc với khối lượng dữ liệu rất lớn hoặc cấu trúc dữ liệu phức tạp.
Đòi hỏi phải quản lý cấu trúc dữ liệu và các mối quan hệ một cách chặt chẽ.
Cơ Sở Dữ Liệu Mạng (Network Database)
Mô hình cơ sở dữ liệu mạng (Network Database) là một mô hình tiến hóa từ mô hình phân cấp, cung cấp sự linh hoạt cao hơn trong việc tổ chức dữ liệu. Trong mô hình mạng, dữ liệu được lưu trữ theo dạng mạng lưới, cho phép các bản ghi có thể có nhiều mối quan hệ cha-con, không bị giới hạn như trong mô hình phân cấp.
Mô hình mạng sử dụng các liên kết để kết nối các bản ghi với nhau, cho phép một bản ghi có thể liên kết với nhiều bản ghi khác. Điều này làm cho mô hình mạng phù hợp với các ứng dụng có yêu cầu xử lý mối quan hệ phức tạp giữa các phần tử dữ liệu.
Ưu điểm:
Linh hoạt trong việc xử lý các mối quan hệ phức tạp và đa chiều giữa các bản ghi.
Có thể cải thiện hiệu suất khi xử lý các truy vấn yêu cầu liên kết dữ liệu từ nhiều nguồn.
Nhược điểm:
Cấu trúc dữ liệu có thể trở nên phức tạp và khó quản lý, đặc biệt là khi mở rộng hệ thống.
Cần có sự hiểu biết sâu về mô hình mạng để thiết kế và duy trì cơ sở dữ liệu hiệu quả.
Ứng Dụng Của Cơ Sở Dữ Liệu
Cơ sở dữ liệu (CSDL) là công cụ quan trọng trong việc quản lý và tổ chức thông tin, cung cấp các lợi ích và ứng dụng rộng rãi trong nhiều lĩnh vực khác nhau. Dưới đây là các ứng dụng tiêu biểu của cơ sở dữ liệu
Quản lý doanh nghiệp
Trong môi trường doanh nghiệp, cơ sở dữ liệu được sử dụng để quản lý thông tin khách hàng, đơn hàng, hàng tồn kho và các quy trình kinh doanh khác. Ví dụ, hệ thống ERP (Enterprise Resource Planning) sử dụng cơ sở dữ liệu để tích hợp và quản lý các chức năng kinh doanh như tài chính, nhân sự và sản xuất.
Ngành ngân hàng và tài chính
Ngành ngân hàng sử dụng cơ sở dữ liệu để quản lý tài khoản khách hàng, giao dịch, báo cáo tài chính và các hoạt động ngân hàng khác. Hệ thống cơ sở dữ liệu giúp theo dõi các giao dịch trong thời gian thực và đảm bảo tính chính xác của thông tin tài chính.
Ngành y tế
Trong ngành y tế, cơ sở dữ liệu được sử dụng để lưu trữ hồ sơ bệnh nhân, kết quả xét nghiệm, lịch sử điều trị và thông tin y tế khác. Cơ sở dữ liệu giúp cải thiện khả năng truy cập và chia sẻ thông tin giữa các cơ sở y tế, hỗ trợ trong việc chẩn đoán và điều trị bệnh.
Ngành giáo dục
Các tổ chức giáo dục sử dụng cơ sở dữ liệu để quản lý thông tin sinh viên, điểm số, lịch học và tài nguyên học tập. Hệ thống quản lý học tập (LMS) thường sử dụng cơ sở dữ liệu để cung cấp các công cụ hỗ trợ học tập và quản lý lớp học.
Thương mại điện tử
Trong thương mại điện tử, cơ sở dữ liệu được sử dụng để lưu trữ thông tin sản phẩm, đơn hàng, khách hàng và giao dịch. Các hệ thống cơ sở dữ liệu giúp quản lý các hoạt động kinh doanh trực tuyến và cung cấp trải nghiệm mua sắm hiệu quả cho người tiêu dùng.
Khoa học và nghiên cứu
Cơ sở dữ liệu được sử dụng trong các lĩnh vực khoa học và nghiên cứu để lưu trữ và phân tích dữ liệu thí nghiệm, nghiên cứu và các thông tin liên quan khác. Các cơ sở dữ liệu khoa học hỗ trợ việc lưu trữ dữ liệu lớn và cung cấp công cụ phân tích mạnh mẽ.
Tóm lại, cơ sở dữ liệu đóng vai trò quan trọng trong việc quản lý và sử dụng thông tin trong nhiều lĩnh vực khác nhau. Các đặc điểm nổi bật của cơ sở dữ liệu giúp tổ chức dữ liệu một cách hiệu quả, bảo mật và dễ truy cập. Theo dõi TopDev để tiếp tục seri về CSDL bạn nhé!
Bài viết được sự cho phép của tác giả Kien Dang Chung
Video trong bài viết
Sau 16 bài học, hôm nay cũng là bài cuối cùng, chúng ta sẽ hoàn thiện những tính năng cuối cùng của ứng dụng Todo List cơ bản. Các công việc đã có thể được tạo ra, cập nhật và xóa khỏi ứng dụng. Tuy nhiên chúng ta chưa có tính năng đánh dấu những công việc nào đã hoàn thành.
Xử lý trạng thái công việc trong Todo List
Trong thiết kế ở bài số 5, bảng todos có trường completed có kiểu dữ liệu Boolean dùng để đánh dấu từng công việc xem đã hoàn thành hay chưa.
Bước 1: Thêm nút Complete vào từng Todo
Trong trang danh sách các công việc /todos, ở mỗi công việc đã có một nút View để xem chi tiết công việc, chúng ta thêm vào một nút Complete để sử dụng chuyển trạng thái khi công việc đã hoàn thành.
Mở view resouces/views/todos/index.blade.php và thêm vào nút Complete:
Kiểm tra xem một công việc nếu chưa hoàn thành sẽ hiển thị một nút Complete cho công việc đó, khi nhấp vào nó sẽ thực hiện đường dẫn /todos/{todo}/complete. Quay lại với quy trình 3 bước, bạn nhớ chứ.
Nhắc lại một chút, trong phương thức complete() chúng ta có sử dụng Route Model Binding để truyền Model vào Route tự động và chúng ta cũng sử dụng Laravel Session để lưu thông tin hiển thị thông báo về trạng thái khi chuyển trạng thái của Todo.
Bước 4: Hoàn thành công việc
Sau khi đã chuyển trạng thái, chúng ta chỉ thực hiện chuyển hướng người dùng về trang danh sách /todos, như vậy là kết thúc một chu kỳ yêu cầu từ phía người dùng.
Khóa học Laravel cơ bản cùng với dự án nhỏ ứng dụng quản lý công việc Todo List đã hoàn thành. Đây là một ứng dụng nhỏ nhưng qua đó chúng ta đã nắm bắt được các khái niệm cơ bản trong Laravel:
Cài đặt và thiết lập môi trường phát triển Laravel.
Làm quen với mô hình MVC thực tế và mô hình MVC được áp dụng trong Laravel thông qua các khái niệm về Route, View, Controller, Model.
Làm việc với database với khá nhiều các khái niệm mới như Migration, Factory, Seeder.
Nắm bắt được cách thức xây dựng ứng dụng với các file bố cục (layout) và Laravel Blade.
Thực hiện một chuỗi các hành động CRUD (Create, Read, Update và Delete) với một đối tượng.
Với những kiến thức nền tảng này, bạn có thể tìm hiểu các vấn đề khác trong Laravel và cũng có thể bắt tay xây dựng những ứng dụng web đơn giản khác.
Khóa học đã kết thúc, tuy nhiên để ứng dụng Todo List có thể sử dụng được trong thực tế chúng ta cần thêm một vài tính năng cho nó.
Tính năng người dùng:
Chúng ta muốn rằng ứng dụng Todo List này có thể được sử dụng bởi nhiều người dùng khác nhau, do đó cần thêm tính năng về người dùng vào ứng dụng. Mỗi công việc có thể ở dạng public hoặc private để người khác có thể xem hoặc không xem được.
Công việc có thể chung cho từng nhóm người dùng.
Mở rộng cho từng Todo:
Thêm phần đính kèm, một công việc có thể đính kèm các tài liệu dạng văn bản, file nén, hình ảnh, video…
Thay vì trạng thái chưa hoàn thành và hoàn thành, chúng ta thêm vào đánh giá phần trăm hoàn thành.
Phân loại công việc theo mức độ như thông thường, khẩn cấp…
Xóa Todo: chúng ta sử dụng soft delete thay vì xóa hẳn bản ghi khỏi database.
Thời gian hoàn thành dự kiến
Thông báo
Thông báo đến người dùng các công việc quá hạn.
Cho phép đặt lịch hiển thị các nhắc nhở công việc chung của nhóm người dùng…
Với các tính năng mở rộng trên, ứng dụng Todo list đã có thể đưa lên Internet và sử dụng cho nhiều người khác nhau. Bạn hãy bắt tay vào xây dựng và cùng thảo luận những khó khăn trong phần bình luận nhé. Phần mở rộng ứng dụng Todo List này sẽ tiếp tục trong phần Bonus của Khóa học, các bài viết sẽ sớm public khi hoàn thành.
Chúc các bạn có những bài học hiệu quả, nhớ ủng hộ website thông qua nhấp quảng cáo và subcribe kênh youtube Allaravel nhé!
NUnit – Thực thi kiểm thử tự động với mã từ Selenium IDE
Bài viết được sự cho phép của vntesters.com
Với Selenium IDE cùng với các phần mở rộng của nó, chúng ta về cơ bản có thể xử lý được một số trường hợp kiểm thử đơn giản và nâng cao (Điều kiện, lặp hay data-driven). Tuy nhiên, với những dự án lớn, chúng ta cần phải xem xét đến quá trình lâu dài và tái sử dụng các đoạn mã kiểm thử tự động hiệu quả. Không thể cứ mỗi lần có thay đổi về mặt UI hay logic, chúng ta lại record các đoạn mã lại từ đầu, right
Để có thể tái sử dụng các đoạn mã, Seleium IDE hỗ trợ chúng ta xuất những gì đã record ra các ngôn ngữ như Python, Java, C# hay Ruby. Ở bài này, mình sẽ hướng dẫn các bạn thực thi những gì mà Selenium IDE xuất ra bằng ngôn ngữ C#. Chúng ta sẽ sử dụng NUnit framework trên nền Visual Studio.
Lấy mã nguồn C# từ Seleium IDE
Record một trường hợp kiểm thử với Selenium IDE
Chọn menu File > Export Test Case As… > C# / NUnit / WebDriver
Lưu tập tin .cs
Tạo dự án NUnit trên Visual Studio với tập tin cs và thực thi kiểm thử với ứng dụng NUnit
Mở Visual Studio và tạo một dự án mới kiểu Class Library và thêm vào dự án các tập tin dll của NUnitFramework và Selenium WebDriver
Thêm tập tin cs mà Selenium IDE lưu ra vào trong dự án và build dự án
Chống chỉ định: cái tiêu đề đặt nữa tây nữa việt là cố ý, để câu view, chứ thực ra không phải tại mình không biết dịch chữ idiomatic ra đâu :v À nhân tiện nói luôn, idiomatic way có nghĩa là một cách chính thống, ở đây bàn về cách viết test được cộng đồng Rustlang công nhận và khuyến khích.Testing là một chức năng quan trọng mà bất kì ngôn ngữ nào cũng cần phải có, viết unit test cũng là một việc mà bất kì lập trình viên nào cũng cần phải làm, thậm chí với một vài cộng đồng như Golang và Ruby thì người ta bảo thủ tới mức xem việc publish một project không có unit test giống như là một cái tội luôn vậy đó :))
Đối với Go thì chúng ta có go test, đối với Ruby chúng ta có thể chạy test thông qua rake (đúng không nhỉ? một thanh niên không code Ruby cho hay), Node thì thôi không nên nhắc tới làm gì 🙁 và tất nhiên là Rust cũng có công cụ testing built-in thông qua lệnh cargo test.
Cách test trong Rust
Để viết test trong Rust thì khá là đơn giản, chỉ cần tại bất kì đâu trong chương trình, viết một hàm theo dạng:
#[test]fn minh_thich_thi_minh_test_thoi() { ...}
Hàm này có attribute #[test] (dân Java, C#, thường gọi cái này là annotation) để báo cho Rust compiler biết rằng đây là một hàm test, các hàm này sẽ được chạy khi chúng ta gọi lệnh:
Theo cuốn sách The Rust Programming Language, cộng đồng Rust khuyến khích 2 cách viết test “chuẩn” đó là: Viết trong tests module và Viết trong thư mục tests. Vậy tại sao lại có 2 cách viết?
Dùng tests module để viết Unit Test
Để tạo tests module thì chúng ta có thể viết code sau ở bất kì đâu:
#[cfg(test)]mod tests {}
Từ khóa mod để tạo một module mới, và khi gặp attribute #[cfg(test)], Rust compiler sẽ chỉ compile module này khi chạy test, khi build bình thường thì module này sẽ bị bỏ qua để tiết kiệm thời gian compile.
Giả sử chương trình của chúng ta có một hàm cần test là sum(), chúng ta sẽ viết test cho hàm này như sau:
Vì hàm sum của chúng ta không được khai báo bên trong module tests nên trước khi sử dụng nó trong hàm test, chúng ta phải đưa nó vào scope của module hiện hành bằng lệnh use.
Bạn sẽ thấy test case được chạy bây giờ là tests::sum_should_return_something, tức là Rust đã chạy test cho hàm sum_should_return_something thuộc module tests, khác với kết quả được in ra ở ví dụ test một hàm đơn lẻ ở đầu bài.
Các test được viết trong module này thường sẽ là các unit test.
Dùng thư mục tests để viết integration tests
Ngoài cách test ở trên, chúng ta có thể tạo thư mục tests nằm cùng cấp với thư mục src của dự án, và viết các file test ở trong này. Mỗi một file *.rs nằm trong thư mục này được xem như là một crate riêng, và khi compile cũng sẽ nằm ở một target riêng, các bạn lưu ý chỗ này.
Như đã nói ở trên, vì bên trong thư mục tests, mỗi file là một crate riêng, điều này có nghĩa là chúng ta phải import module kipalog vào, giống với cách sử dụng crate trong thực tế, vì vậy cách này thích hợp để viết integration test.
Có thể thấy trong output chia làm 3 phần, phần đầu tiên là kết quả chạy test được viết trong integration_tests.rs của chúng ta, phần 2 là phần code test trong module tests đã viết ở phần trước. Phần cuối cùng là Doc-tests, là một chức năng của Rust cho phép test luôn code trong document, các bạn có thể xem chi tiết tại bài The Rust Programming Language – Testing.
Tổng hợp những thông tin cần thiết trong mẫu CV thiết kế đồ họa
Thiết kế đồ họa – một ngành nghề được đánh giá rất cao về tính nghệ thuật và sự tinh tế của người làm trong ngành. Chính vì thế, những mẫu CV của ứng viên ngành thiết kế đồ họa cũng nên được trau chuốt hơn về mặt hình thức cũng như thể hiện các nội dung cần thiết liên quan đến công việc của mình.
Cách viết CV thiết kế đồ họa đạt hiệu quả cao
CV xin việc thiết kế đồ họa cũng tương tự như mọi loại CV khác về mặt bố cục nội dung. Trước khi muốn gây ấn tượng với người khác bằng những thông tin mình cung cấp, bạn cần đảm bảo mình đã cung cấp đủ những thông tin mà nhà tuyển dụng cần. Dưới đây là một số thông tin cần có trong CV.
1. Thông tin cá nhân
Thông tin cá nhân là một trong những phần quan trọng nhất cần được nhắc đến trong CV. Các thông tin này vừa cho biết một cách cơ bản về bản thân bạn vừa giúp cho nhà tuyển dụng dễ dàng có được thông tin khi liên hệ lại với bạn để mời phỏng vấn. Bạn nên cung cấp những thông tin cơ bản như họ tên, số điện thoại, email, địa chỉ liên lạc, và một số các website chuyên nghiệp mình đang sở hữu nếu có.
2. Kinh nghiệm làm việc
Hầu hết những ai theo đuổi nghề thiết kế đồ họa đều đã đầu tư cho chuyên môn của mình từ rất sớm. Thời sinh viên mọi người đã nhận những công việc bán thời gian có thể thực hiện liên quan đến đồ họa một cách đơn giản để tích lũy kinh nghiệm. Hoặc tham gia những khóa học liên quan đến thiết kế để cải thiện kỹ năng. Bạn đều có thể liệt kê những kỹ năng này vào trong CV của mình để nhà tuyển dụng có thêm thông tin.
Và quan trọng nhất là, đừng nói dối ở phần kinh nghiệm làm việc bạn nhé. Bạn có thể nói quá đôi chút nhưng vẫn đảm bảo là bạn có thể làm được những việc đó. Hầu hết các vị trí thiết kế đồ họa đều yêu cầu ứng viên thực hiện bài test trước để đánh giá về năng lực của bạn. Bên cạnh đó, nếu nói dối về năng lực làm việc thì sẽ rất khó cho bản thân nếu được nhận vào và không thể làm việc.
Kỹ năng chuyên môn liên quan đến lĩnh vực làm việc cũng rất quan trọng trong CV của nhân viên thiết kế đồ họa. Các kỹ năng nên đề cập trong CV của nghề thiết kế đồ họa thường sẽ là kỹ năng liên quan đến thiết kế, kỹ năng sử dụng các công cụ thiết kế, kỹ năng quản lý thời gian và khả năng ngoại ngữ, sự tỉ mỉ và tinh tế trong quá trình làm việc,…
4. Mục tiêu nghề nghiệp
Thiết kế đồ họa được đánh giá là nghề có triển vọng phát triển mạnh ở thời điểm hiện tại. Chính vì thế nên ứng viên ngành thiết kế đồ họa nên trình bày mục tiêu nghề nghiệp ngắn hạn và dài hạn của mình trong CV để nhà tuyển dụng có thể đánh giá được phần nào mục tiêu công việc của bạn trong tương lai.
Về mặt tổng quan hình thức, chắc chắn đây sẽ không là vấn đề khó với ứng viên ngành thiết kế đồ họa. Làm việc thường xuyên với lĩnh vực có tính nghệ thuật cao nên chắc chắn ứng viên sẽ biết cách để trình bày một bố cục, hình ảnh kết hợp với nội dung tạo được sự ấn tượng với người xem.
Nhưng cũng cần nhớ rằng, hãy đảm bảo chiếc CV hài hòa về hình thức và CV là để nhà tuyển dụng xem, đừng để phong cách cá nhân của bạn ảnh hưởng quá nhiều đến tổng thể. Cần đảm bảo được sự cân bằng cho bố cục và không quá phá cách.
Bên cạnh đó, gửi CV kèm với portfolio sẽ giúp đơn ứng tuyển của bạn dễ lọt vào “mắt xanh” của nhà tuyển dụng hơn. Vì công việc là thiết kế đồ họa nên những sản phẩm nào bạn đã thực hiện cũng nên được gửi kèm để nhà tuyển dụng có thể xem qua và đánh giá xu hướng thẩm mỹ cũng như khả năng của bạn.
Ngoài ra, việc nên gửi CV bằng tiếng Anh hay tiếng Việt sẽ phụ thuộc vào yêu cầu của công ty ứng tuyển. Nếu công ty không nêu rõ nên gửi bằng ngôn ngữ nào thì bạn nên gửi CV bằng tiếng Việt thay vì tiếng Anh.
Cũng như mọi ngành nghề khác, các mẫu CV thiết kế đồ họa sẽ cần đáp ứng các yêu cầu về mặt hình thức và nội dung. Hy vọng các thông tin trong bài viết này cùng với các mẫu CV được giới thiệu sẽ giúp bạn có thêm các CV tham khảo và định hướng được chiếc CV mà mình nên thiết kế sẽ như thế nào.
Vấn đề này thì không hề mới rồi. Bài viết về vấn đề này thì lại càng nhiều nữa. Mình cũng không đưa ra lời khuyên hay gì hết, chỉ copy lại một đoạn liên quan tới vấn đề này trong cuốn The Pragmatic Programmer rồi bình loạn thêm tí xíu cho mọi người dễ tham khảo thôi nhá 😀
Care and Cultivation of Gurus
With the global adoption of the Internet, gurus suddenly are as close as your Enter key. So, how do you find one, and how do you get one to talk with you?We find there are some simple tricks.- Know exactly what you want to ask, and be as specific as you can be.- Frame your question carefully and politely. Remember that you're asking a favor; don't seem to be demanding an answer.- Once you've framed your questioned, stop and look again for the answer. Pick out some keywords and search the web. Look for appropriate FAQs (lists of frequently asked questions with answers).- Decide if you want to ask publicly or privately. Usenet news-groups are wonderful meeting places for experts on just about any topic, but some people are wary of these groups' public nature. Alternatively, you can always e-mail your guru directly. Either way, use a meaningful subject line. (" Need Help!!! " doesn't cut it.)- Sit back and be patient. People are busy, and it may take days to get a specific answer.Finally, please be sure to thank anyone who responds you. And if you see people asking questions you can answer, play your part and participate.
Bình loạn
Đại khái thì trích đoạn trên nói là, với tính toàn cầu của Internet ngày nay, thì các guru (các chuyên gia trong lĩnh vực nào đó) trở nên rất gần với bạn. Có lẽ các bạn nào mới học lập trình gần đây không thấm lắm chuyện này, nhưng những ai học lập trình từ thời 99-2002 trở về trước thì sẽ hiểu, chuyện lên Internet đã là cực kì khó, sách báo, tạp chí về CNTT thì không nhiều như bây giờ, có những lúc thắc mắc không biết hỏi ai chỉ biết vò đầu bứt tai. Việc tiếp cận những người giỏi, nổi tiếng trong lĩnh vực này thì cực kì khó vì không có phương tiện để liên lạc, huống hồ là chỉ biết đến qua cái tên trên internet. Còn thế hệ các anh các chú làm CNTT từ trước đó nữa thì không biết họ học như thế nào, mình thực sự rất là phục những người này.
Quay lại bài viết, vì những bác guru thì thường cũng rất nhiệt tình và muốn giúp đỡ người khác, nhưng đa phần các câu hỏi mà các bạn mới học đang hỏi trên mạng hiện này không được ai quan tâm đến, thậm chí hỏi xong có người còn bay vào chửi xối xả xong bỏ đi mà chủ nhân câu hỏi còn không biết tại sao mình bị chửi nữa 😂 đoạn trích trên chỉ ra một số trick để hỏi làm sao cho những bác guru này đọc vào là thấy hứng thú trả lời ngay:
Know exactly what you want to ask, and be as specific as you can be.
Đầu tiên, phải biết rõ bạn muốn hỏi cái gì, và hỏi thật chi tiết, cặn kẽ.
Chẳng ai có thể trả lời một câu hỏi không đầu không cuối, không trách nhiệm kiểu như:
“Có ai làm login Facebook trong Rails rồi cho em hỏi với ạ?”
==> Bạn muốn hỏi vấn đề gì về login Facebook trong Rails?
Game Tic Tac Toe? / Hỏi về Rails? / Hỏi về Unicode / Mọi người giúp mình với / Hỏi về 1 đoạn HTML + CSS / …
==> Bạn đang hỏi đấy à?
Xin source/bài tập lớn môn xxxx
==> 💩
Ai giúp em giải bài tập môn Phân tích thiết kế giải thuật này với ạ?
==> 🖕
Frame your question carefully and politely. Remember that you're asking a favor; don't seem to be demanding an answer.
Bạn cần phải khoanh vùng câu hỏi một cách rõ ràng, không nên hỏi lan man, hỏi trực tiếp vào vấn đề bạn đang gặp, trình bày câu hỏi một cách rõ ràng, mạch lạc, cung cấp đầy đủ thông tin vào bên trong câu hỏi, ví dụ gặp code thì phải cho vào thẻ code cho nó có màu, copy error log thì nên đọc xem đoạn nào chính xác là error log, đừng copy toàn bộ file log lên làm gì, nếu hỏi nhiều vấn đề cùng một lúc thì nên ghi hết ra, mỗi câu hỏi trên một dòng, có đánh số đầy đủ, một bài hỏi cẩu thả không format, câu cú lủng củng thì cũng chẳng có ai thèm đọc để trả lời cả.
Và quan trọng nhất là phải hỏi một cách thật lịch sự, nhã nhặn. Bạn không biết người nào sẽ đọc câu hỏi của bạn, và người đọc câu hỏi cũng sẽ không biết bạn là ai. Nên tốt nhất là phải thật lịch sự, có phần lễ độ, nếu lười gõ nhiều chữ thì không nên đi hỏi. Vì bạn đang đi nhờ sự giúp đỡ của người khác, họ có giúp hay không thì tùy vô thái độ của bạn nữa, người ta không có bổn phận phải trả lời câu hỏi của bạn đâu, nên đừng làm họ phật ý khi đọc câu hỏi.
Once you've framed your questioned, stop and look again for the answer. Pick out some keywords and search the web. Look for appropriate FAQs (lists of frequently asked questions with answers).
Một khi bạn đã khoanh vùng được vấn đề cần hỏi, thì từ từ rồi hãy hỏi, đầu tiên hãy đọc kĩ lại các tài liệu, tra cứu google về nội dung bạn muốn hỏi. Chọn một vài từ khóa trong vấn đề bạn thắc mắc để search.
Ví dụ bạn đang làm bài tập về nhà, thầy giáo yêu cầu viết bài tập tô màu hình chữ nhật bằng C, hãy search Google bằng từ khóa: “thuật toán tô màu”, “tô màu hình chữ nhật”, nếu biết tiếng Anh, có thể dịch cái yêu cầu đó ra tiếng anh và search: “rectangle coloring algorithm”,… bạn không cần phải biện hộ lý do “không biết từ khóa”, vì như đã thấy ở ví dụ kia mình chỉ đơn giản là copy luôn cái đề bài là “tô màu hình chữ nhật” và search nó luôn, Google sẽ tự động suggest cho chúng ta biết rằng chúng ta đang tìm về thuật toán scanline, hay đang tìm hiểu về vấn đề rectangle covering, bằng cách này bạn đã tìm ra đc từ khóa chính xác cho vấn đề đang gặp.
Decide if you want to ask publicly or privately. Usenet news-groups are wonderful meeting places for experts on just about any topic, but some people are wary of these groups' public nature. Alternatively, you can always e-mail your guru directly. Either way, use a meaningful subject line. (" Need Help!!! " doesn't cut it.)
Quyết định xem nên hỏi ở chốn công cộng (chat room, diễn đàn,…) hay hỏi riêng (PM, chat riêng, email,…) Dù là cách nào thì đầu tiên bạn cần phải chuẩn bị câu hỏi một cách kĩ càng, đặt tiêu đề email hay tiêu đề topic một cách “có nghĩa”, đầy đủ, tóm tắt được câu hỏi, những tiêu đề kiểu “Giúp em với”, “Cứu em với”, “Hỏi về xxxx” chỉ càng giúp cho người ta bỏ qua email/topic của bạn nhanh hơn mà thôi.
Sit back and be patient. People are busy, and it may take days to get a specific answer.
Sau khi đã đặt xong câu hỏi thì ngồi yên đó, tiếp tục tra cứu Google và chờ người ta vào đọc rồi trả lời. Ở nhiều diễn đàn hay có những bạn hỏi xong chờ mãi ko thấy ai trả lời, lại bức xúc reply thêm 1 câu: “Sao cả chục người vào đọc mà không ai trả lời” 😆
Ai cũng bận rộn cả, họ phải tranh thủ chút thời gian rảnh để tranh thủ lên mạng giúp bạn, thì bạn nên tôn trọng họ, không thúc ép, không hỏi dai hỏi lì, việc trình bày câu hỏi cho “đẹp” cũng là một cách để tôn trọng thời gian của người khác. Nếu được hỏi một cách nhã nhặn, lịch sự thì người ta cũng sẽ trả lời bạn một cách lịch sự lại thôi 😀
Hy vọng bài viết này sẽ giúp các bạn mới học hiểu được tại sao mình hỏi mà không ai trả lời, và biết cách hỏi làm sao để người khác vui vẻ trả lời. Chúc các bạn may mắn 😀
Rust (đọc là /rʌst/) là một ngôn ngữ lập trình hệ thống (system programming language) được quảng bá là có tốc độ cực kì nhanh, ngăn chặn được phần lớn mọi bug crash (segfaults), ngăn chặn được data race, rất memory safe mà lại không cần tới garbage collector!
Cú pháp cơ bản của một chương trình Hello World trong Rust như thế này:
fn main() { println!("hello, {}", "world");}
Bạn thấy gì qua đoạn chương trình trên nào? Có vẻ vừa giống C, vừa giống Go hay Swift, Java, C#,… mỗi thứ một tí, đúng không?
Tại sao nên dùng Rust?
Chắc các bạn cũng biết đến khả năng kiểm soát tài nguyên khi làm việc với các ngôn ngữ như C/C++ hay Java, Python, Ruby, JavaScript,…
Với C/C++, bạn được:
Toàn quyền kiểm soát mọi thứ (malloc, free,…)
Thường xuyên đau đầu với memory leak, data race, segfaults,…
Đối với thiên đường JavaScript hay Ruby, bạn:
Chẳng cần phải quan tâm một biến được cấp phát như thế nào và mất đi ra sao
Nhưng trade-off của nó chính là performance cực kì tệ hại.
Rust là giải pháp kết hợp cho ưu điểm của cả 2 loại ngôn ngữ trên, khi làm việc với Rust, bạn không cần phải quan tâm tới việc bị memory leak hay segfault, khi làm multi thread, bạn không còn sợ data race vì rust compiler đã lo hết chuyện đó cho bạn, để đảm bảo trong lúc chạy (runtime) thì chương trình sẽ luôn hoạt động một cách an toàn và vẫn đảm bảo được tốc độ và performance tối ưu nhất.
À! Chắc sẽ có bạn hỏi: Rust và Go thì nên chọn ai? Nếu có cùng thắc mắc, thì đương nhiên là chọn Rust rồi, vì mình đang quảng cáo Rust mà :)) xin mời bạn xem bài này nhé.
Rust nhanh tới mức nào?
OK. Đầu tiên phải nói ngay là Rust không phải ngôn ngữ lập trình nhanh nhất, trong số các ngôn ngữ lập trình bậc cao (high level programming language), không có cái nào như thế cả.
Vậy ngôn ngữ nào mới là nhanh nhất? và vì sao nó nhanh?
Kẻ đạt danh hiệu đó chắc phải nói đến Assembly, đó là nơi bạn toàn quyền kiểm soát một biến được tạo ra ở đâu, khi nào. Thích tạo ra trong stack hay trong heap là tùy bạn. Bạn được toàn quyền với bộ nhớ, vì bộ nhớ là của nó luôn, thích xài lúc nào là xài.
Mà khoan đã! Khả năng kiểm soát liên quan gì tới tốc độ?
Trong Assembly, mỗi instruction (lệnh) được viết ra đều được map chính xác với binary code/machine opcode mà từng loại CPU cung cấp (“close to the metal”).
Khi làm việc với Assembly, bạn phải nắm được tập lệnh (instruction set) của loại CPU mà bạn đang làm việc – và với mỗi loại CPU khác nhau thì lại có một tập lệnh khác nhau – và nó một loại cú pháp hết sức gần gũi với máy tính (nhưng xa lạ với con người :)))
C ra đời để khắc phục nhược điểm này của Assembly, đưa sức mạnh kiểm soát của Assembly vào chung với cú pháp thân thiện hơn với các lập trình viên.
Bằng cách lượt bỏ hết những dòng lệnh phức tạp của mã máy, C thay thế bằng các câu lệnh đơn giản hơn (syntax sugar). Ví dụ:
Đoạn mã Assembly trên là những gì sẽ được compiler dịch ra cho đoạn chương trình C sau:
int main() { int number = 100;}
Chỉ với 3 dòng code C (mid level language), bạn sẽ không còn phải vật vã viết từng lệnh để cấp phát bộ nhớ, move giá trị vào từng ô nhớ, giải phóng nó khi kết thúc chương trình trong Assembly nữa. Vì C đã đơn giản hóa vấn đề bằng cách “giấu” đi tất cả những thao tác đó và đưa ra cho bạn một cú pháp vô cùng đơn giản là int number = 100;.
Việc “giấu” bớt các thao tác rườm rà và cung cấp một phương pháp đơn giản hơn để thực hiện một vấn đề được gọi là abstraction, và điều này diễn ra càng nhiều hơn ở các ngôn ngữ lập trình bậc cao như C#, Java, Ruby, JavaScript, Python,…
Lợi thế của abstraction đó là giúp cho lập trình viên rảnh tay để còn tập trung vào những thứ khác quan trọng hơn như code logic, business của chương trình. Nhưng thực chất thì các thao tác phức tạp bên dưới vẫn phải được thực hiện, và compiler của từng ngôn ngữ sẽ có nhiệm vụ “viết” các đoạn code đó ra thay cho bạn. Kết quả là gì?
Như đã nói ở trên thì mỗi nền tảng phần cứng lại có một tập lệnh khác nhau, vậy nên phần code được compiler “thêm” vào phải được viết theo một cách không thể phụ thuộc vào từng loại phần cứng cụ thể. Ví dụ nó không thể chắc chắn được phải truy cập vào đâu để lấy thông tin về chuột/bàn phím, thế là nó phải tốn thêm một bước đó là: Hỏi máy tính xem con chuột nó nằm ở đâu để truy vấn tới. Và thế là, thay vì chỉ làm mỗi nhiệm vụ đọc xem nút nào trên con chuột vừa được nhấn xuống, nó phải làm thêm một vài việc nữa như là chạy tới hỏi anh kernel của hệ điều hành xem nhà anh chuột nằm ở đâu, rồi chạy qua nhà anh chuột gõ cửa xem ảnh có nhà không,… và những việc lôi thôi đó tốn thêm một ít thời gian nữa.
Những gì ở bên dưới thì bạn sẽ không thể kiểm soát hay can thiệp vào để tối ưu hóa nó được, ví dụ: Bạn không bao giờ có thể chủ động giải phóng một vùng nhớ khi dùng Garbage Collector, bạn không thể yêu cầu JavaScript tạo ra một biến nằm trong stack hay heap theo ý bạn được,… và bạn phải chấp nhận với cái cách nó đốt thời gian như là một sự thật hiển nhiên.
Đánh đổi tốc độ, gia tăng các lớp abstraction, giúp cho lập trình viên có thể viết code một cách thoải mái hơn, xây dựng sản phẩm nhanh hơn. Đó là bản chất xấu xa của các high level programming languages :))
Cũng giống như C/C++, bên cạnh khả năng kiểm soát gần như tuyệt đối (vâng, Rust cũng có thể cho bạn kiểm soát đến từng ô nhớ!), Rust chọn zero-cost abstraction làm một trong những nguyên tắc nền tảng của nó.
C++ implementations obey the zero-overhead principle: What you don’t use, you don’t pay for [Stroustrup, 1994]. And further: What you do use, you couldn’t hand code any better.
– Stroustrup
Rust design ra các abstraction dễ dùng, nhưng được compile về machine code một cách rất hiệu quả và không làm ảnh hưởng đến tốc độ của toàn chương trình, các high-level API được compile về machine code một cách ít nhất và tối ưu nhất (you pay for the features you actually use).
Ngoài ra Rust còn giới thiệu khái niệm Traits giúp bạn được làm việc giống như trên các ngôn ngữ lập trình bậc cao nhưng vẫn đảm bảo được khả năng kiểm soát code và tài nguyên như các ngôn ngữ lập trình bậc thấp!
Tốc độ của Rust
Khi so sánh với các ngôn ngữ khác, thực sự thì đây là một việc không cần thiết, nhưng chúng ta có thể tham khảo, bảng so sánh tốc độ thực thi tính tổng dãy số Fibonacci giữa các ngôn ngữ Rust, Go, NodeJS và Swift:
Bảng so sánh thời gian thực hiện, càng nhỏ thì càng xịn
Bạn có thể xem bảng so sánh performance của Rust và một số ngôn ngữ khác tại:
Một trong những điểm mà Rust quảng cáo đó là an toàn, không bao giờ bị crash, vậy làm sao Rust đạt được những điều đó?
Câu trả lời nằm ở Rust Compiler.
Thông thường, phần lớn lỗi của một chương trình C/C++ sẽ liên quan đến việc truy xuất bộ nhớ khi thực thi (runtime error – ví dụ bạn truy cập vào vùng bộ nhớ đã bị giải phóng, sử dụng nhầm các biến có giá trị null, lỡ tay tạo ra nhiều thread cùng ghi vào một vùng nhớ,…)
Để ngăn chặn vấn đề này, Rust Compiler đề ra một loạt các quy tắc để kiểm tra ngay khi nó biên dịch chương trình, chúng ta sẽ không đi sâu vào các quy tắc này, nhưng mình sẽ nói sơ qua:
Mọi biến mặc định đều là immutable, và không được mang giá trị null (nên không có lỗi NullReferenceException)
Trong Rust, một vùng nhớ luôn có một biến sỡ hữu nó.
Gán một biến vào một biến khác, tức là bạn chuyển quyền sở hữu vùng nhớ của biến đó cho biến mới. Biến cũ không được quyền truy xuất tới đó nữa.
Trong một thời điểm, chỉ có một trong hai trường hợp có thể xảy ra, đó là:
Nhiều biến khác có thể mượn vùng nhớ đó chỉ để đọc (read only).
Chỉ có một biến có quyền mượn để ghi giá trị lên đó.
Một biến chỉ có thể tồn tại bên trong scope của nó, ra khỏi scope đó nó sẽ bị giải phóng ngay lập tức.
Bất cứ khi nào lập trình viên vi phạm các quy tắc này, Rust sẽ báo cho bạn biết ngay khi biên dịch, chứ không để lọt lỗi.
Ví dụ với đoạn code sau minh họa cho vấn đề chuyển quyền sở hữu đề cập ở trên:
let v = vec![1, 2, 3];let v2 = v;println!("v[0] is: {}", v[0]);
Theo lẽ thường, chúng ta nghĩ đoạn code trên sẽ in ra số 1, là giá trị của v[0]. Nhưng khi biên dịch thì sẽ gặp ngay lỗi:
error: use of moved value: `v`println!("v[0] is: {}", v[0]);
Đừng lo nếu bạn không hiểu tại sao lại phát sinh ra lỗi này, ví dụ này chỉ để minh họa cho bạn thấy về khả năng bắt lỗi runtime ngay cả trong compile time của Rust thôi.
Rust không cần Garbage Collector?
Đúng vậy, Rust không có garbage collector (GC), nhưng vẫn đảm bảo được tính an toàn về bộ nhớ, đây là một trong những chức năng đặc biệt của Rust.
Thay vào đó, Rust Compiler sẽ dự đoán được khi nào một biến sẽ hết được sử dụng và tự động chèn thêm code logic để giải phóng nó, giảm thiểu chi phí cho việc quản lý bộ nhớ lúc runtime.
fn main() { let score = 10; // Khởi tạo vùng nhớ mới, cấp phát cho biến score // Tới đây là hết scope của biến score, mình nên giải phóng nó đi thôi }
Đoạn trên là diễn biến suy nghĩ của Rust Compiler qua từng dòng code :))
Và việc này được kiểm soát thông qua Ownership System.
Việc không có GC còn giúp Rust có thể dễ dàng được nhúng vào các ngôn ngữ có GC khác nữa.
Dùng Rust có thể làm được gì?
Đây là câu hỏi mà mình thấy nhiều người hỏi nhất.
Câu trả lời là: Mọi thứ!
Mặc dù là một ngôn ngữ lập trình hệ thống (system programming language), nhưng Rust nhắm tới việc cạnh tranh với C/C++ để tăng độ an toàn và cải thiện performance cho các phần mềm được viết ra, vì thế Rust có thể làm được mọi thứ mà C/C++ làm được, ví dụ:
Cấu hình Spring Data JPA với @EnableJpaRepositories annotation
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Trong bài viết Tổng quan về Spring Data JPA, mình đã giới thiệu với các bạn Spring Data JPA và cách cấu hình nó sử dụng tập tin XML. Có một cách khác để cấu hình Spring Data JPA đó là sử dụng các annotation mà nó hỗ trợ như @EnableJpaRepositories annotation. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Bây giờ, mình sẽ tạo mới một class để cấu hình cho phần thao tác với database của ứng dụng sử dụng các class Repository của Spring Data JPA với annotation @EnableJpaRepositories như sau:
package com.huongdanjava.springdatajpa;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@EnableJpaRepositories(basePackages = {"com.huongdanjava.springdatajpa.repositories"})
public class DatabaseConfiguration {
}
Spring khi scan và gặp annotation @EnableJpaRepositories này sẽ tự động khởi tạo các đối tượng cần thiết để chúng ta có thể sử dụng các Repository của Spring Data JPA.
Thuộc tính basePackages sẽ định nghĩa package mà chúng ta đã định nghĩa các Repository. Có 2 thuộc tính khác của annotation @EnableJpaRepositories mà chúng ta cần cấu hình nữa là entityManagerFactoryRef và transactionManagerRef. Giá trị của những thuộc tính này là tên bean được tạo trong Spring container, lần lượt là của EntityManagerFactory và TransactionManager. Giá trị mặc định của 2 thuộc tính này lần lượt là entityManagerFactory và transactionManager.
Cho EntityManagerFactory, các bạn sử dụng implementation là class LocalContainerEntityManagerFactoryBean như mình như sau:
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("com.huongdanjava.springdatajpa.entity");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();
return factory.getObject();
}
Phương thức setPackagesToScan() khai báo package sẽ chứa các JPA entity của ứng dụng. Trong ví dụ của mình thì đó là package com.huongdanjava.springdatajpa.entity.
Phương thức setDataSource() sẽ cấu hình thông tin DataSource connect tới database, các bạn có thể khai báo một bean của DataSource với implementation là class DriverManagerDataSource như sau:
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/jpa_example");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataS
Các thông tin database trong cấu hình của DataSource các bạn nên lấy từ tập tin properties. Ở đây, để đơn giản nên mình hardcode những thông tin này các bạn nhé.
Bean cho TransactionManager, các bạn có thể khai báo như sau:
@Bean
public TransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource());
return transactionManager;
}
Đến đây thì chúng ta đã cấu hình xong Spring Data JPA cho ứng dụng của mình.
Để kiểm tra kết quả, mình sẽ viết một class với main() method có nội dung như sau:
package com.huongdanjava.springdatajpa;
import java.util.Optional;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.huongdanjava.springdatajpa.entity.Student;
import com.huongdanjava.springdatajpa.repositories.StudentRepository;
public class Application {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(DatabaseConfiguration.class);
StudentRepository helloRepository = (StudentRepository) ac.getBean("studentRepository");
Optional<Student> student = helloRepository.findById(1L);
System.out.println(student.get().getName());
}
}
Giả sử trong database, mình đang có những thông tin như sau:
Lâu rồi không chia sẻ gì nhiều về chuyên môn, hơn 2 năm nay, mình chỉ chuyên tâm vào đào tạo, những mảng khác trong nhân sự đều không quan tâm cập nhật lắm
Đào tạo & phát triển trên thế giới rất thịnh hành, đã đi trước Việt Nam cả một chiều dài gần 100 năm, học ở họ thì thấy gì nhỉ?
Thấy nhiều thứ phải học, thấy mình chỉ là một phần nhỏ bé, rất nhỏ trong thế giới rộng lớn này, nhưng nếu bạn xác định làm đào tạo một cách nghiêm túc thì nên tự phát triển bản thân mình trước khi ở Việt Nam có một trường lớp đào tạo nào đó chuyên nghiệp, hoặc giả trước khi bạn có điều kiện và cơ hội đi học tập ở nước ngoài hoặc có chuyên gia nước ngoài về Việt Nam dạy bạn.
Có 2 seri tạp chí của Anh và Mỹ mà bạn có thể đọc hàng ngày để nắm bắt xu thế của thế giới, đó là:
=> bạn có thể download về từng số, in ra và đọc mỗi ngày
Ngoài ra có website khá nổi tiếng về đào tạo dành cho các giám đốc đào tạo và phát triển tài năng cũng như những người định hướng sự nghiệp theo ngành này có thể học hàng ngày đó là http://td.org – hàng ngày bạn đều đọc được những điều thú vị trên trang này, và họ cũng có khá nhiều khóa học hay ho về đào tạo để bạn theo dõi – trang này nếu trở thành member của họ thì bạn cũng được đọc những tạp chí dành riêng cho người làm Talent Mangement cũng như Chief Talent Development Officer
Tặng bản 1 bản báo cáo về học tập của tổ chức 2017 do Linkedin làm https://learning.linkedin.com/content/dam/me/learning/en-us/pdfs/lil-workplace-learning-report.pdf
Một tài liệu đào tạo về Năng lực của những người làm đào tạo và phát triển trong doanh nghiệp của Canada http://performanceandlearning.ca/ipl/wp-content/uploads/2015/10/Competencies-for-Training-and-Development.pdf
Ví dụ 1 mô hình năng lực của những người làm đào tạo bạn có thể tham khảo để định hướng phát triển bản thân
Định nghĩa rõ hơn cho từng năng lực ở mô hình trên có thể đọc tại https://www.atdchatt.org/resources/Documents/Event%20Flyers/071489.Competency%20Model.pdf
Ví dụ năng lực Business Skill: Demonstrate business understanding and drive business results and outcomes
Be able to:
o Analyze needs and propose solutions.
o Apply business skills.
o Drive results.
o Plan and implement assignments.
o Think strategically.
o Innovate
Hiện tại mình đang phát triển một group những người làm Đào tạo & Phát triển tại Việt Nam, cùng nhau chia sẻ tri thức để nâng cao năng lực của những người làm đào tạo, các bạn cùng tham gia nếu cùng định hướng nhé https://www.facebook.com/groups/HRDVietnam/
Nếu các bạn muốn trao đổi chuyên môn hàng ngày có thể add skype anhnguyet_hro của mình, nếu có thời gian mình sẵn lòng chia sẻ ^^
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Đợi đối tượng UI hoặc sự kiện với Selenium WebDriver
Bài viết được sự cho phép của vntesters.com
Trong bài này, mình sẽ sử dụng mã Selenium WebDriver cho C#
Trong kiểm thử tự động, đôi khi tốc độ của công cụ kiểm thử tự động nhanh hơn tốc độ của ứng dụng cần kiểm thử (AUT/SUT) dẫn đến việc thực thi kiểm thử của chúng ta thất bại (Failed). Hầu hết các công cụ kiểm thử tự động đều hỗ trợ cho chúng ta cách để có thể chờ đợi một đối tượng UI hoặc một sự kiện của đối tượng UI xảy ra. Selenium WebDriver cung cấp cho chúng ta hai phương thức để làm việc này: Explicit (công khai) và Implicit (ngầm).
Chờ đợi Implicit
Chờ ngầm là việc sử dụng một thời gian nhất định để Selenium WebDriver cố gắng tìm một đối tượng UI trong trường hợp đối tượng UI không xuất hiện ngay lập tức. Giá trị mặc định là 0 giây, và giá trị này được gắn kèm với đối tượng IWebDriver. Một khi được thiết lập, giá trị này sẽ bắt đầu ảnh hưởng đến toàn bộ vòng đời của đối tượng IWebDriver, cho đến khi được thiết lập giá trị mới hoặc kết thúc đối tượng IWebDriver. Sau khi thiết lập giá trị này, trong các đoạn mã kiểm thử, chúng ta không cần phải thêm bất kỳ câu lệnh nào nữa. Việc chờ đợi được đối tượng IWebDriver quản lý. Đây cũng là lý do mà chúng ta gọi là chờ “ngầm” :).
Đối số của hàm ImplicitlyWait là một đối tượng TimeSpan của C#, và chúng ta hoàn toàn toàn quyền thiết lập giá trị tối đa cho việc chờ đợi trước khi trả về lỗi Không-Tìm-Thấy-Đối-Tượng.
Chờ đợi Explicit
Chờ đợi công khai là một phương thức chèn mã ngay trong kịch bản kiểm thử tự động của chúng ta, đặc biệt để đợi một sự kiện của đối tượng UI. Đối với việc chờ ngầm, chúng ta chỉ đợi một sự kiện là đối tượng UI xuất hiện trên trang, hay đúng hơn là trong mã nguồn HTML của trang web. Sử dụng phương thức công khai, chúng ta có thể chờ đợi những sự kiện đặc biệt khác của đối tượng UI, như hiển thị, sẵn sàng để sử dụng, thay đổi kích thước, vị trí, v.v… Chúng ta đặc biệt sử dụng cách này khi tương tác với các đối tượng UI Ajax, vì những đối tượng này thường thay đổi trạng thái khi máy chủ/máy khách hoạt động.
Với cách này, chúng ta cần một đối tượng trong Selenium WebDriver để quản lý thời gian chờ đợi, WebDriverWait. Cách viết mã cho việc này như sau:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementToBeClickable([IWebElement]));
Để việc sử dụng phương thức chờ đợi công khai này dễ dàng hơn, Selenium WebDriver hỗ trợ chúng ta đối tượng ExpectedConditions, dùng cho việc khai báo các điều kiện chờ đợi trong từng trường hợp cụ thể.
Các điều kiện chờ thường sử dụng:
ElementExists: đợi một đối tượng UI tồn tại trong mã HTML của trang web
ElementIsVisible: đợi một đối tượng UI hiển thị trên trang
ElementToBeClickable: đợi một đối tượng UI sẵn sàng được tương tác
TextToBePresentInElement: đợi một đối tượng UI với một đoạn chữ mong muốn
FrameToBeAvailableAndSwitchToIt: đợi một đối tượng Frame sẵn sàng tương tác
Bài viết được sự cho phép của tác giả Kien Dang Chung
Video trong bài viết
Khái niệm Laravel Route đã được giới thiệu đến các bạn xuyên suốt qua những bài đầu tiên của Khóa học Laravel cơ bản, tuy nhiên mới dừng lại ở mức cơ bản nhất khi đây là những đường dẫn cố định cho một loại nội dung. Ví dụ như ở bài số 2, chúng ta có trang about với đường dẫn /about và bài số 7, chúng ta có trang danh sách todos với đường dẫn /todos. Tuy nhiên, trong ứng dụng không phải lúc nào đường dẫn này cũng là cố định cho một loại nội dung.
Dynamic route là gì?
Đường dẫn động (dynamic route) là đường dẫn thay đổi cho cùng một loại nội dung. Ví dụ như trong trang All Laravel bạn đang xem, chúng ta thấy đường dẫn mỗi bài viết sẽ gồm hai phần:
Phần cố định: /blog/
Phần động: /tieu-de-bai-viet/
Do vậy, các đường dẫn của bài viết chi tiết là các đường dẫn động. Như vậy làm cách nào để khai báo các đường dẫn này trong Laravel, chẳng lẽ chúng ta có 100 bài viết thì phải khai báo 100 đường dẫn tương ứng trong routes/web.php?
Trong Laravel Route, cho phép chúng ta đưa vào các tham số giúp cho đường dẫn có nội dung thay đổi theo nội dung của trang. Trong ví dụ tiếp theo chúng ta sẽ đi vào trang chi tiết của công việc cần làm, thiết lập routes/web.php như sau:
Trong Laravel, phần động của đường dẫn được khai báo theo cấu trúc {ten_tham_so}. Như vậy, khi chúng ta vào đường dẫn nào có cấu trúc kiểu như /todos/phat-trien-todo, khi xử lý qua routes/web.php nó sẽ truyền giá trị ‘phat-trien-todo’ vào tham số {todo}.
Mặc định, Laravel sẽ truyền tham số động của Route vào trong phương thức của Controller đã được khai báo trong Route. Để kiểm chứng, chúng ta tạo ra phương thức show() trong TodosController với nội dung sau:
Kết quả là phần động trong đường dẫn đã truyền đến Controller và được hiển thị ra. Chúng ta cùng xem lại đường đi của nó như sau:
URL http://localhost:8000/todos/hoc-laravel-co-ban-o-allaravel được thực hiện trên trình duyệt.
Laravel kiểm tra trong routes/web.php xem có đường dẫn nào phù hợp thì ở đây thấy /todos/{todo} trùng khớp. Giá trị hoc-laravel-co-ban-o-allaravel được xem là giá trị tham số của Route.
Giá trị tham số {todo} được truyền vào ‘TodosController@show’.
Trong phương thức show() của TodosController có tham số vào là $todoId, lấy giá trị này và trả về cho người dùng.
Trong ứng dụng Todo List, chúng ta sẽ thực hiện hiển thị các thông tin todo chi tiết với đường dẫn /todos/1, /todos/2… ở đây chúng ta sử dụng phần động là id của todo vì các todo có tên có thể giống nhau. Ví dụ: công việc ‘Học Laravel cơ bản ở Allaravel” có thể lặp đi lặp lại nên chúng ta chỉ sử dụng id vì nó là duy nhất.
Toàn bộ các công đoạn chúng ta đã thực hiện xong, giờ chỉ cần xử lý trong phần phương thức show() của app\Http\Controllers\TodosController.php:
Sau khi nhận được ID của todo từ đường dẫn, nó được truyền vào phương thức show() và chúng ta sẽ sử dụng nó để tìm Todo cụ thể trong database. Sau đó, Todo tìm được sẽ được truyền tiếp vào view ‘todos.show’. Tuy nhiên, đến giờ chúng ta chưa tạo view này nên nếu truy cập vào http://localhost:8000/todos/1 chẳng hạn bạn sẽ thấy lỗi “View todos.show not found” mặc dù Todo có ID = 1 kiểm tra có trong database.
Tạo thêm view resources/views/todos/show.blade.php:
Trong view này chúng ta thấy có những đoạn sử dụng biến todotrongcấutrúccủaLaravelBladeđểinragiátrịbiểuthứctrongngoặcvàtodotrongcấutrúccủaLaravelBladeđểinragiátrịbiểuthứctrongngoặcvàtodo là biến được truyền vào view ở đoạn code return trong phương thức show().
Kết quả khi vào thử một Todo nào đó, ví dụ Todo có ID=1 chẳng hạn ta được kết quả.
CV xin việc gồm những gì? Làm thế nào để tạo sự khác biệt cho CV của bạn?
CV ngày nay đã trở thành một công cụ quen thuộc được sử dụng trong quá trình ứng tuyển và tìm việc. Ứng viên dùng CV để tìm kiếm công việc, và nhà tuyển dụng dùng CV để đánh giá ứng viên. Vậy một CV xin việc gồm những gì thì sẽ đáp ứng được yêu cầu của cả hai bên? Bài viết này sẽ giúp bạn làm rõ thêm vấn đề này.
Các thông tin cần có trong CV
CV là gì?
CV – Curriculum Vitae, hiểu theo nghĩa tiếng Việt chính là sơ yếu lý lịch của ứng viên. Trên CV hiện tại về cơ bản sẽ bao gồm các thông tin như: giới thiệu bản thân, kinh nghiệm làm việc, trình độ học vấn cũng như các kỹ năng chuyên môn của bản thân. Các thông tin mà ứng viên đề cập đến trong CV chính là dữ liệu đầu tiên để nhà tuyển dụng xem xét và quyết định lựa chọn ứng viên đi đến vòng phỏng vấn.
Vì đây là bước đầu tiên để ứng viên có thể tạo ấn tượng với nhà tuyển dụng nên đừng bao giờ tỏ ra thờ ơ hay thiếu chăm chút với các thông tin trong CV của bạn nhé. Trong bài viết này sẽ giới thiệu với các bạn những thông tin bắt buộc phải có, nên có trong CV để việc tìm kiếm công việc mới diễn ra thuận lợi hơn.
Muốn gây ấn tượng, trước khi cố gắng tạo ra sự khác biệt bạn cần đảm bảo đã cung cấp đủ những gì nhà tuyển dụng cần. Các thông tin chia sẻ dưới đây sẽ cho bạn biết những thông tin cần có trong CV của mình.
1. Thông tin cá nhân
Vì có vai trò như một sơ yếu lý lịch chính vì thế ứng viên cần cung cấp đầy đủ các thông tin cá nhân cho nhà tuyển dụng. Các thông tin này thường sẽ bao gồm:
Họ và tên đầy đủ của bản thân
Ngày tháng năm sinh
Nơi sinh sống hiện tại
Số điện thoại liên lạc
Địa chỉ email
Các thông tin này thường được viết đầu tiên và ở trên cùng trong bố cục CV để nhà tuyển dụng dễ dàng quan sát được. Chẳng hạn địa chỉ nhà bạn quá xa với công ty thì có thuận tiện khi đi làm hay không, hoặc độ tuổi của ứng viên có đáp ứng được yêu cầu của công ty hay không… Nếu không thỏa mãn những điều kiện này, CV sẽ được bỏ qua mà không xem tiếp đến các thông tin tiếp theo.
Thông tin này bắt buộc phải xuất hiện trong tất cả mọi CV. Với trường hợp bạn là sinh viên mới tốt nghiệp chưa có kinh nghiệm làm việc thực tế tại một công ty ở vai trò chính thức nào thì các thông tin này nên được thay thế bằng kinh nghiệm tham gia các hoạt động khi còn ở trường đại học hoặc việc làm thêm.
Mục đích chính của phần thông tin về kinh nghiệm làm việc là để nhà tuyển dụng có thể dễ dàng quan sát và nắm bắt được những kinh nghiệm bạn sở hữu có đáp ứng được vị trí mà họ đang tuyển hay không. Chính vì thế hãy liệt kê những kinh nghiệm cần thiết thay vì liệt kê một cách dàn trải tất cả mọi thứ. Mục kinh nghiệm làm việc quá dài dòng và dàn trải nhiều thông tin sẽ không được nhà tuyển dụng đánh giá cao.
3. Trình độ học vấn và các chứng chỉ
Trong thông tin này, ứng viên nên đề cập đến việc mình đang học trường nào, đã tốt nghiệp hay chưa và chuyên ngành mình đã theo học. Ngoài ra, nếu đang theo học các khóa học chuyên môn có liên quan đến công việc cũng có thể đề cập đến trong CV như một cách để thể hiện năng lực của bạn.
Thông thường trong phần thông tin học vấn, ứng viên sẽ điền tên trường, ngành theo học và thời gian học (nên điền năm bắt đầu và năm tốt nghiệp). Nếu điểm GPA tốt nghiệp cao bạn hoàn toàn có thể thêm vào trong CV để tạo ấn tượng với nhà tuyển dụng.
Hoặc trong thời gian học, bạn có tham gia nghiên cứu khoa học hay thực hiện các đề án nghiệp vụ có tính chất phục vụ cho công việc mình đang ứng tuyển thì cũng có thể thêm vào trong CV. Một bằng cấp khác quan trọng không kém là chứng chỉ tiếng Anh và tin học. Ứng viên có thể điền thông tin chứng chỉ vào CV nếu cảm thấy cần thiết.
Về kỹ năng chuyên môn, có một sai lầm mà nhiều người mắc phải là tự đưa ra các kỹ năng và thang điểm cho kỹ năng đó của mình. Thực tế thì việc làm này không thể hiện tính khách quan và không có bất cứ tiêu chuẩn nào cho việc chấm điểm đó của bạn cả. Vậy nên hãy từ bỏ cách trình bày kỹ năng như thế này trong CV của mình.
Thay vào đó, hãy liệt kê những kỹ năng quan trọng và theo bạn, là cần thiết cho công việc mà bạn đang ứng tuyển. Chẳng hạn, với vị trí ứng tuyển liên quan đến công việc của lập trình viên, bạn nên trình bày các kỹ năng liên quan đến kỹ thuật như ngôn ngữ lập trình có thể sử dụng,… Kết hợp thêm với một số kỹ năng mềm khác sẽ giúp bạn dễ dàng hơn trong việc chinh phục nhà tuyển dụng.
Nội dung này có thể được chia sẻ ngắn gọn trong vài dòng để nhà tuyển dụng có thể thấy được mục tiêu ngắn hạn và dài hạn của bạn trong công việc này là gì, định hướng phát triển của bạn trong tương lai ra sao.
Tuy nhiên, cũng có nhiều ứng viên lựa chọn không chia sẻ về mục tiêu công việc trong CV. Điều này hoàn toàn phụ thuộc vào mong muốn của bạn, nếu CV đã quá dài thì có thể lược bỏ bớt phần thông tin này và trao đổi chi tiết hơn khi đến với buổi phỏng vấn.
Hiện nay, có khá nhiều công cụ tạo CV miễn phí khác nhau mà ứng viên có thể tham khảo. Với TopDevCV, các ứng viên trong lĩnh vực CNTT có thể dễ dàng tạo được cho mình chiếc CV với đầy đủ các thông tin cần thiết với vai trò là một lập trình viên.
Tất cả các mẫu CV đều được chọn lọc từ mẫu của các devs nổi tiếng và hệ thống hóa thành những trường thông tin cần thiết cho các nhà tuyển dụng dễ dàng theo dõi và đánh giá ứng viên. Biết sử dụng công cụ tạo CV hợp lí và biết một CV xin việc gồm những gì là cách nhanh nhất để bạn chinh phục nhà tuyển dụng.
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products