Tạo thư viện bằng Swift Package Manager trong Xcode
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
Thường thì dev iOS chúng ta đều đã biết về CocoaPods và Carthage. Hôm nay mình sẽ giới thiệu tới các bạn một thế lực mới được Apple công bố tại WDDC 2019 là Swift Package Manager. Chúng ta đi vào từng nội dung chính thôi nào.
I. Swift Package Manger là gì ?
Swift Packager Manager là một công cụ giúp quản lý việc phân phối mã nguồn, giúp cho việc chia sẻ và dùng lại code được dễ dàng. Được Apple tích hợp từ Xcode 11 giúp cho việc chúng ta quản lí dependency một cách đơn giản hơn. Mình chỉ nói sơ qua còn các bạn tìm đọc thêm ở https://swift.org/package-manager nhé.
II. Demo project và hướng dẫn sử dụng Swift Package Manager
Đầu tiên mình sẽ tạo package kế thừa UITextField giúp format string về VNĐ ( chắc hẳn nhiều dev sẽ cần điều này)
Mở Xcode ➞ File ➞ New ➞ Swift Package
chọn tên của Package như trên là “VNDTextField” ở đây chúng ta đã tạo được Swift Package
Sau khi tạo xong, chúng ta vào file package và sẽ tiến hành config trong như sau:
Ở đây chúng ta chú ý:
products đây là phần định nghĩa chúng ta có thể thấy các file của package khi dùng vào project khác
platforms chúng ta thêm tham số vào cho hệ điều hành mình muốn build
Sau khi chỉnh sửa và setup file xong chúng ta tiến hành push code lên GitHub, và sau đó import lại cho project mà bạn muốn sử dụng. Đơn giản phải không nào !
1.Đầu tiên chúng ta nhấn chuột vào fiel .xcodeproj -> chọn Swift Packager, chúng ta sẽ có như hình, ở đây mình đã thêm package mình vào project demo.
2. Sau đó chúng ta nhấm vào dấu cộng(+) ở góc trái phía dưới để thêm package bạn muốn vào project, còn nếu muốn xóa package mà bạn đang sử dụng thì nhấn vào dấu trừ(-) nhé. Đây là lúc chúng ta bấm dấu +
Ở đây bạn paste vào link package của bạn đã tạo trên github, chờ đợi trong vài giây chúng ta sẽ có kết quả như mình đây:
Mình đã thêm package VNDTextField vào class của mình, và sử dụng lại nó như sau:
Đây là class mình demo sử dụng lại VNDTextField. Chúng ta cần import lại package ở class mình muốn sử dụng, sau đó bạn có thể sử dụng thoải những gì package cung cấp. Sau khi sử dụng VNDTextField đây là kết quả mà mình đạt được.
Thật đơn giản, với Swift Packager bạn có thể tự custom cho mình những class common, tái sử dụng lại nhiều lần, giúp giảm chí phí build lại từ đầu, dynamic hơn. Đồng thời cũng dễ dàng cho bạn thoải sức custom và mong muốn nhiều người sử dụng lại dễ dàng. Từ nay việc sử dụng 1 third party hay class common đã trở nên dễ dàng hơn rất nhiều.
Qua bài viết, hi vọng các bạn có cái nhìn cơ bản về cách tạo Swift Packager và sử dụng lại nó. Đồng thời cũng thêm vào bộ kĩ năng dev iOS của càng bạn trên hành trang fix bug. Hi vọng các bạn yêu thích bài viết này
Diễn ra ba ngày liên tiếp 25 – 27/08/2021, sự kiện công nghệ lớn nhất trong lĩnh vực Mobile chính thức trở lại cùng nhiều điểm nổi bật & chương trình quà tặng hấp dẫn cho người tham dự.
MOBILE TECH – Ba ngày với hơn 15 chủ đề
Sự kiện công nghệ Vietnam Mobile Day trở lại dưới hình thức Online Event, tổ chức công khai, không thu phí và diễn ra trong 3 ngày liên tiếp từ ngày 25 – 27/08/2021 cùng nhiều chương trình quà tặng hấp dẫn khác.
Sự kiện hướng đến những người làm & đam mê trong lĩnh vực lập trình, kinh doanh, công nghệ. Nội dung dự kiến của sự kiện năm nay có thể kể đến các lĩnh vực và từ khóa như:
Mobile Marketing:#DataDriven #AppGrowth #Privacy #DataPower #OnlineBehavior
Mobile Business:#mCommerce #eCommerce #Phonosapiens
Sự kiện năm nay với tên gọi chính thức: Vietnam Mobile Day 2021 – Intelligent Touch
INTELLIGENT TOUCH – Những ‘cú chạm’ thông minh trong kỷ nguyên di động
Trong bối cảnh công nghệ liên tục cải tiến và đổi mới, cùng với sự xuất hiện của 5G và những đột phá mà trí tuệ nhân tạo (AI) mang đến, đặc biệt bên cạnh sự phổ biến của các thiết bị di động cùng nhiều công nghệ khác (blockchain, cloud, AR/VR, IoT…), tất cả đã tạo ra một cơ hội lớn cho sự phát triển của công nghệ di động (Mobile Technology), trong một kỷ nguyên mới mang tên “kỷ nguyên di động”.
Tận dụng xu thế này, nhiều mô hình kinh doanh và dịch vụ mới ra đời. Các doanh nghiệp ứng dụng sức mạnh của công nghệ để thấu hiểu và chạm đến người dùng thông qua sức mạnh của dữ liệu (Data Power). Đồng thời, chính sự phát triển của công nghệ cũng tạo ra động lực lớn lên các doanh nghiệp truyền thống dẫn đến câu chuyện về “chuyển đổi” trong vận hành và kinh doanh (Digital Transformation).
Thông qua các hệ thống công nghệ và thiết bị di động, doanh nghiệp và người dùng liệu có thể kết nối và hiểu nhau hơn thông qua những cái chạm trên các màn hình cảm ứng? Đội ngũ cần nắm vững những kiến thức, công nghệ nào từ năm 2021 để giúp doanh nghiệp đạt được mục tiêu của mình?
Development: Xu hướng phát triển ứng dụng & hệ thống công nghệ trong doanh nghiệp trong thời đại mới để gia tăng tính cạnh tranh.
Business: Doanh nghiệp cần làm gì để hiểu người dùng và đưa ra chiến lược kinh doanh đúng đắn? Lựa chọn công nghệ nào và triển khai thế nào?
Marketing: Làm sao để người dùng biết đến, sử dụng và trung thành với sản phẩm, dịch vụ thông qua thiết bị di động?
Trong sự kiện năm nay, Vietnam Mobile Day 2021 – Intelligent Touch với hơn 15 chủ đề được livestream trực tiếp, liên tiếp ba ngày từ ngày 28 – 30/07/2021, tập trung vào những câu chuyện kể trên, thông qua 3 nhóm chủ đề (theme):
Rise of Mobile Technologies: Innovate Your Future
Mobile Commerce Revolution: Transform Your Business
Những Kinh Nghiệm Phỏng Vấn Hữu Ích Cho Sinh Viên Mới Ra Trường
Phỏng vấn là một cơ hội quan trọng để ứng viên có thể trực tiếp trao đổi thông tin với nhà tuyển dụng và nâng cao giá trị năng lực của mình. Nếu thật sự muốn được thông qua buổi phỏng vấn và tìm được công việc mới, bạn phải dành nhiều tâm sức và thời gian để đầu tư và trau dồi các lưu ý khi phỏng vấn. Do đó với các sinh viên mới ra trường, trau dồi kỹ năng phỏng vấn ngay từ bây giờ càng là điều quan trọng. Cùng tìm hiểu những kỹ năng xin việc cho sinh viên mới ra trường với bài viết này cũng TopDebv nhé!
Những vấn đề cần chuẩn bị trước khi bắt đầu buổi phỏng vấn cho sinh viên mới ra trường
Để buổi phỏng vấn có thể diễn ra suôn sẻ và đạt được kỳ vọng, việc chuẩn bị và checklist ra những vấn đề quan trọng là rất cần thiết.
Tìm hiểu các thông tin cơ bản về công ty ứng tuyển
Đây chắc chắn là thao tác cần thiết nếu bạn muốn thể hiện sự tâm huyết của mình với vị trí đang ứng tuyển. Việc tìm hiểu trước các thông tin của công ty như sứ mệnh phát triển, mục tiêu kinh doanh và các sản phẩm sẽ giúp bạn linh hoạt hơn trong quá trình trao đổi thông tin. Bên cạnh đó, nó cũng giúp cho nhà tuyển dụng thấy rằng bạn đã dành thời gian để nghiên cứu về công ty và nắm được vấn đề một cách cơ bản nhất.
Đây chắc chắn là phần không thể thiếu đối với bất cứ cuộc phỏng vấn nào. Nhà tuyển dụng sẽ khai thác kiến thức chuyên môn của bạn với công việc này thông qua một số câu hỏi hoặc các tình huống cần giải quyết. Do đó, bạn nên xem qua về những kiến thức căn bản liên quan đến vị trí mình ứng tuyển để không bị bối rối khi được hỏi. Nếu có thời gian bạn có thể tham khảo thêm một số vấn đề tình huống thường gặp ở công việc chuyên môn của mình để khi được hỏi, có thể xử trí một cách dễ dàn và chuyên nghiệp hơn.
Ứng viên nên chuẩn bị một bản cứng CV để có thể sử dụng trong trường hợp cần thiết. Đa phần các nhà tuyển dụng sẽ tự chuẩn bị CV và xem qua trước buổi phỏng vấn. Tuy nhiên để chuẩn bị cho mọi tình huống có thể xảy ra thì tốt hơn hết bạn vẫn nên có một bản CV mang theo để gây ấn tượng với nhà tuyển dụng. Việc chuẩn bị đầy đủ các loại giấy tờ cũng cho thấy bạn là người chu đáo và cẩn thận hơn.
Mang CV và các giấy tờ cần thiết cho buổi phỏng vấn
Trang phục tươm tất và đúng giờ
Đây chính là hai yếu tố cực kỳ quan trọng mà bất cứ ai cũng không nên bỏ qua để gây ấn tượng với nhà tuyển dụng. Hãy chuẩn bị những bộ quần áo lịch sự, tươm tất và sạch sẽ để có tạo thiện cảm trong mắt nhà tuyển dụng. Đừng nên ăn mặc quá se sua nhưng cũng không nên ăn mặc quá tùy tiện vì nó sẽ khiến bạn trở nên kém chuyên nghiệp hơn. Tốt hơn hết bạn nên mặc trang phục công sở lịch sự, vì vẫn chưa biết văn hóa làm việc và ăn mặc ở trang phục đó như thế nào.
Đừng bao giờ đi muộn. Rất nhiều nhà tuyển dụng đã chia sẻ rằng họ đánh rớt ứng viên dù ứng viên thể hiện rất tốt trong buổi phỏng vấn vì họ không đúng giờ. Đặc biệt đối với các công ty có văn hóa nước ngoài, yếu tố này càng được yêu cầu cao hơn. Hãy sắp xếp đi sớm hơn so với thời gian phỏng vấn từ 10 – 30 phút để đề phòng có thể xảy ra vấn đề kẹt xe hay xe hỏng,…
Những kinh nghiệm phỏng vấn cho Junior Developer hay ho
Với những sinh viên công nghệ thông tin vừa ra trường, việc phỏng vấn vào các vị trí liên quan Junior Developer sẽ được chia sẻ trong phần này.
Thể hiện đam mê của bản thân với công việc
Khi nhắc đến đam mê với công việc chúng ta thường nghĩ đến những vấn đề lớn lao và trừu tượng. Đặc biệt là đối với các junior developer, hoặc những lập trình viên không có kỹ năng giao tiếp tốt thì đây dường như sẽ là trở ngại lớn để thể hiện đam mê của mình với công việc. Vậy nên làm thế nào để thuyết phục nhà tuyển dụng?
Hãy tận dụng nó thông qua những câu hỏi tương tự như “Tại sao bạn muốn trở thành lập trình viên?” – đây chính xác là câu hỏi để bạn thể hiện đam mê với công việc đúng không? Hãy cho nhà tuyển dụng thấy sự hào hứng và nhiệt huyết của bạn với việc lập trình, coding hay các xu hướng công nghệ thông tin mới nhất. Ngắn gọn, rõ ràng nhưng thành thật và đúng trọng tâm chắc chắn sẽ giúp bạn ghi điểm trong mắt nhà tuyển dụng.
Việc tạo dựng hình ảnh là một yếu tố rất quan trọng và là kinh nghiệm phỏng vấn cho junior developer được nhiều người đánh giá cao. Hãy thể hiện những dự án nổi trội nhất mà bạn đã từng thực hiện trong CV để nhà tuyển dụng có thể khai thác và tìm tòi nhiều hơn về kỹ năng của bạn. Lúc đó bạn có thể tự tin chia sẻ về những gì bạn có, những gì bạn đã học hỏi được cũng như những gì bạn mong muốn đạt được trong thời gian tới.
Bên cạnh đó, hãy tận dụng các nền tảng mạng xã hội cũng như các nền tảng tuyển dụng để chia sẻ về những gì bạn đã làm được. Đây cũng được xem là yếu tố quan trọng để nhà tuyển dụng có cái nhìn và đánh giá tổng quan nhất về bạn. Câu hỏi phỏng vấn phổ biến liên quan đến vấn đề này mà bạn có thể gặp đó là “Dự án nào đã từng tham gia khiến bạn tâm đắc nhất? Bạn đã đóng góp và học hỏi được gì từ dự án đó?” Hãy chia sẻ thành thật với nhà tuyển dụng về những trải nghiệm của bạn, đó là bí quyết để bạn ghi điểm với người phỏng vấn.
Hãy luyện tập coding thường xuyên hơn
Rõ ràng mục đích cuối cùng mà nhà tuyển dụng cần ở bạn vẫn là kỹ năng làm việc. Rất nhiều junior developers lại thường bỏ qua bước này mà quên rằng luyện tập coding thường xuyên chính là cách duy nhất để bạn nâng trình chuyên môn của bản thân. Hãy nhớ rằng bạn sẽ không thể biết hết được tất cả mọi thứ, mà công nghệ thông tin lại là lĩnh vực được cập nhật thông tin mỗi giờ, mỗi ngày. Nếu không chịu khó bỏ thời gian để học hỏi, việc thành công hay đạt được những thành tựu đáng kể trong lĩnh vực này gần như là rất khó khăn.
Hãy chịu khó đầu tư nhiều hơn để luyện tập viết code, đó cũng là kinh nghiệm để bạn chinh phục nhà tuyển dụng trong quá trình phỏng vấn. Thậm chí, bạn có thể chia sẻ với họ những chương trình hay những dự án cá nhân bạn đã đạt được để chứng minh kỹ năng làm việc của mình. Một điều cần lưu ý là hãy chia sẻ những gì bạn đã thật sự làm việc được và đừng tâng bốc bản thân quá đà vì nhà tuyển dụng đều là những người đã dày dặn kinh nghiệm, họ sẽ dễ dàng nhận ra và đánh giá được năng lực của bạn mà thôi.
Công việc lập trình luôn đòi hỏi rất nhiều yếu tố kỹ năng và chuyên môn, điều quan trọng là bạn cần thể hiện được tinh thần và thái độ cầu tiến trong công việc, không ngại khó ngại khổ, đó chính là con đường của một lập trình viên thành công.
Không có một quy chuẩn chung nào cho các junior developers hay kỹ năng xin việc cho sinh viên mới ra trường về việc phỏng vấn và chắc chắn thành công. Tuy nhiên, nếu biết trước một số kinh nghiệm hay ho sẽ giúp bạn chuẩn bị tốt hơn cho buổi phỏng vấn cũng như có được sự tự tin khi đối diện với nhà tuyển dụng. Những kỹ năng xin việc cho sinh viên mới ra trường trong bài viết này có thể phần nào giúp bạn làm tốt hơn trong buổi phỏng vấn của mình. Đón đọc nhiều bài viết hấp dẫn khác tại TopDev trong lĩnh vực nhân sự bạn nhé!
Cách Import dữ liệu từ các bảng khác nhau trong MySQL Workbench
Bài viết được sự cho phép của blogchiasekienthuc.com
#1. Đặt vấn đề
Khi làm việc với các hệ quản trị cơ sở dữ liệu, chắc hẳn có không ít lần các bạn muốn sao chép dữ liệu của một bảng từ cơ sở dữ liệu này sang bảng tương tự của cơ sở dữ liệu khác.
Nhiều bạn sẽ trích xuất (Export) dữ liệu thành file Script => và mang sang cơ sở dữ liệu khác, rồi đổi tên và Import ngược lại. Có đúng không ạ !
Cách làm này không sai, nhưng đôi khi nó hơi mất thời gian và tốn nhiều công sức nếu như số lượng dữ liệu tương đối nhiều.
Vì vậy, ở trong bài viết này mình sẽ cùng các bạn tìm hiểu về một cách làm khác, để thực hiện thao tác này trong công cụ MYSQL WORKBENCH.
#2. Hướng dẫn Import dữ liệu từ các bảng khác nhau
Ví dụ ở đây mình đang có hai cơ sở dữ liệu là store và store_copy. Trong đó, mỗi cơ sở dữ liệu có một bảng là products với cấu trúc giống nhau.
Bài toán là bảng store.products trong cơ sở dữ liệu store của mình đang có dữ liệu, giờ mình muốn sao chép toàn bộ dữ liệu đó sang bảng store_copy.products của cơ sở dữ liệu store_copy
+ Bước 1: Đầu tiên chúng ta sẽ phải Export dữ liệu đó ra một file có định dạng *.csv hoặc là một file *.json bằng cách chuột phải vào table => và chọn Table Data Export Wizard như hình bên dưới.
+ Bước 2: Các bạn chọn những trường dữ liệu nào được Export (có thể chọn tất hoặc một vài trường) => sau đó bấm Next để tiếp tục.
+ Bước 3:
(1) Ở bước tiếp này các bạn sẽ lựa chọn loại file các bạn muốn Export ra.
(2) Sau đó bấm vào Browse… để chọn vị trí lưu file.
(3) Các bạn đặt tên file (các bạn nên đặt tên file viết liền không dấu).
(4) Bấm Save để lưu file.
+ Bước 4: Tiếp theo, các bạn xác nhận các lựa chọn ở Bước 3 => rồi bấm Next để sang bước tiếp theo.
+ Bước 5: Tiếp tục bấm Next để bắt đầu kết xuất dữ liệu ra file *.csv
+ Bước 6: Bấm Finish để hoàn tất việc kết xuất dữ liệu (các bạn có thể thấy thời gian Export là 0.468s và số lượng bản ghi là 110 bản ghi).
+ Bước 7: Tiếp theo ở trong bảng store_copy.products mình kiểm tra thì chưa có bất kỳ bản ghi nào.
+ Bước 8: Để Import dữ liệu từ file .cvs vào trong bảng store.products thì chúng ta nhấn chuột phải vào Table đó => và chọn Table Data Export Wizard.
+ Bước 9: Bước tiếp theo chúng ta sẽ chọn file .cvs mà chúng ta đã Export ra từ bước trước. Sau đó bấm Next để chuyển sang bước tiếp theo.
+ Bước 10:
(1) Các bạn chọn bảng sẽ Import dữ liệu vào (mặc định là bảng chúng ta chọn products)
(2) Các bạn có thể lựa chọn tạo một bảng bảng mới khi chọn lựa chọn này.
+ Bước 11:
(1) Sau khi chọn được bảng chúng ta sẽ chọn các trường trong bảng xem trường nào sẽ được Import dữ liệu.
(2) Sau khi chọn xong các trường dữ liệu thì bấm Next để tiếp tục.
+ Bước 12: Ở bước này các bạn bấm Next để tiếp tục.
+ Bước 13: Tiếp tục bấm Next sau khi data được Import xong.
+ Bước 14: Vậy là toàn bộ bản ghi từ file đã được Import vào bảng store_copy.products. Bạn bấm Finish để hoàn thành.
+ Bước 15: Bây giờ mình quay lại kiểm tra dữ liệu trong bảng thì thấy bảng đã có đầy đủ dữ liệu từ file Import đầu vào.
#3. Kết luận
Okay, vậy là trong bài viết này mình đã cùng các bạn tìm hiểu về cách để Export và Import dữ liệu từ các bảng khác nhau trong cơ sở dữ liệu MySQL thông qua công cụ MySQL Workbench rồi ha.
Đây sẽ là một thủ thuật khá hay trong nhiều trường hợp chúng ta có dữ liệu mẫu được lưu dưới dạng file *.csv hoặc *.json
Hi vọng là thủ thuật nhỏ trong bài viết này sẽ hữu ích với bạn. Xin chào vào hẹn gặp lại các bạn trong các bài tiếp theo nhé !
Dưới đây là bảng so sánh nhanh giữa Selenium và QTP dựa trên một số tiêu chí cơ bản để so sánh các công cụ kiểm thử tự động
STT
Tiêu chí
Selenium
QTP
1
Chi phí bản quyền
Đây là công cụ mã nguồn mở cho nên không có chi phí bản quyền, hoàn toàn miễn phí
Rất mắc…khoảng 5000USD cho 1 máy
2
Thực sự mô phỏng hành động của người dùng cuối
Selenium thực hiện hành động trong nền của trình duyệt tức là người sử dụng, có thể thực hiện các kiểm thử tự động với trình duyệt được thu nhỏ tối thiểu (minimized).
QTP thực hiện kiểm thử tự động tương đương với một người thực hiện các thao tác vào ứng dụng. Vì vậy, các trình duyệt không có thể được giảm thiểu (người sử dụng không thể thực hiện bất kỳ hành động nào khác trên máy tính trong khi kiểm thử đang chạy).
3
Plug-ins
Có và hoàn toàn miễn phí
Có. Người sử dụng phải trả tiền bản quyền
4
Nỗ lực và kỹ năng để sử dụng công cụ
Người dùng cần phải có kỹ năng tốt về lập trình và coding vì đây là điều kiện cần.
Đòi hỏi nỗ lực ít h ơn để tạo ra một kịch bản kiểm thử, vì nó có một môi trường phát triển rất tốt, thân thiện với người sử dụng.
5
Dễ dàng tạo ra các kịch bản kiểm thử?
Tốt. Selenium IDE Recorder không mạnh mẽ như QTP nhưng là một công cụ miễn phí, nhiều hành động không được ghi lại bởi các IDE và có thể tự nhập vào.
Hoàn hảo.
6
Hỗ trợ trên các HĐH
Windows, Linux, Unix và Macintosh.
Windows.
7
Loại ứng dụng
Web based applications.
Web-based và desktop applications.
8
Trình duyệt
IE, Firefox, Safari, Opera và một vài trình duyệt khác
IE, Chrome và Firefox.
9
Ngôn ngữ phát triển kịch bản kiểm thử
Java, Ruby, Python, C#, Perl, Groovy và nhiều ngôn ngữ khác
VBScript và/hoặc JavaScript.
10
Tích hợp với các công cụ quản lý thử nghiệm
Khi phát triển kiểm thử (test case) sử dụng C# trong VS thì có thể sử dụng MTM để quản lý test cases
HP Quality Center và TestDirector
11
Môi trường phát triển kiểm thử
Kịch bản thử nghiệm có thể được phát triển trong nhiều trình soạn thảo như Eclipse, Visual Studio, Netbeans…
Kịch bản thử nghiệm chỉ có thể được phát triển trong QTP.
12
Hỗ trợ kỹ thuật
Vì đây là công cụ m ã nguồn mở nên không có hỗ trợ kỹ thuật chính thức.
QTP cung cấp hỗ trợ kỹ thuật rất tốt qua điện thoại, mail, web, forum.
13
Quản lý và lưu trữ đối tượng giao diện (UI-Object)
Không. Đối tượng có thể được quản lý bằng cách sử dụng giao diện người dùng mở rộn g (UI-Element user extension) hoặc properties files. Tất cả các phương pháp trên đểu phải sử dụng code cứng (hard-code)
Có. QTP được xây dựng trong với Object Repository. Quản lý Object repository là khá dễ dàng trong QTP
14
Hỗ trợ cho các hộp thoại
Chỉ hỗ trợ 1 phần. Không thể thực hiện một số hành động như lấy tiêu đề của hộp thoại.
Có. QTP hỗ trợ tất cả các loại hộp thoại.
15
Hỗ trợ cho các kịch bản tải lên tập tin
Không. Selenium không hỗ trợ kịch bản này vì hạn chế JavaScript.
QTP không có vấn đề gì trong việc mô phỏng
Selenium là lựa chọn hoàn hảo nếu…
Developer chịu trách nhiệm phát triển và bảo trì các kiểm thử
Những kiểm thử bạn đang phát triển sẽ là 1 phần của một cơ sở hạ tầng lớn hơn
Chắc chắn là bạn sẽ thử hiện những kiểm thử trên trình duyệt mà thôi
Bạn nghĩ là bạn sẽ thực hiện những kiểm thử trên những môi trường khác ngoài Windows
Bạn muốn sử dụng những công cụ miễn phí
QTP có lẽ là lựa chọn tốt nếu…
Bạn muốn phát triển và duy trì các kiểm thử một cách nhanh chóng và dễ dàng.
Nếu bạn cần kiểm thử đáng kể bên ngoài trình duyệt
Hôm nay ngày 12/03, nhân kỷ niệm ngày World Wide Web, hãy cùng tìm hiểu về kiến trúc web (Web Architecture). Thiết nghĩ, với một thứ chúng ta làm việc, sử dụng hàng ngày, không ít thì nhiều, cũng nên hiểu về em nó đôi chút.
Duis id ante elit. Aliquam quis tellus id orci eleifend finibus. Donec consequat justo ligula, eget sodales purus hendrerit at.
Ut at interdum nunc. Maecenas commodo turpis quis elementum gravida.
Nunc ac sapien tellus. Quisque risus enim, tempus eget porttitor in, pellentesque vel urna.
Donec nibh massa, rutrum a sollicitudin eu,
lacinia in lorem.
1. DNS (Domain name server)
Graphic design is the paradise of individuality, eccentricity, heresy, abnormality, hobbies, and humors. — George Santayana
Vim te case nihil oblique, has partem interpretaris ne, ad admodum accusamus nam. Usu utinam dissentias referrentur ne, vim accusam voluptua pertinacia no. Est no posse utinam inermis, brute errem mentitum et ius, te prompta albucius quo. In pro simul soleat regione.
Ne reque offendit singulis mea, ad eos ferri doming nostrud. Duis suscipit usu ut, fuisset pericula ex est, et porro prompta his. Audire definiebas voluptatibus et duo, aperiam ocurreret ad nec. Vel ad nostrud principes. Ad liber congue iracundia sed, eirmod erroribus eam te, has veniam epicurei ea.
Pri probo alterum aliquando an. Duo appetere laboramus intellegat ea, ex suas diam exerci vix. Mel simul debitis id, est nusquam fuisset mentitum in. Te mei iudico iisque.
2. Load balancer
3. Web app servers
4. Database
5. Caching service
6a. Job queue
6b. Job servers
7. Full text search service
8. Services
9a. Data “firehose”
9b. Copy of data
9c. Data warehouse
10. Cloud storage data
11. CDN (Content delivery network)
Content delivery network, tạm dịch là Mạng lưới truyền tải nội dung. Tạm thời bỏ qua các khái niệm. Hằng ngày, chúng ta vẫn đọc báo, xem youtube, giao dịch online,… Chính những hoạt động này bản thân nó đã tương tác trực tiếp với CDN.
Vậy CDN ra đời với mục đích gì?.
Một buổi sáng đẹp trời, bạn truy cập website http://bbc.com. Tuy nhiên, do origin server nằm ở United Kingdom (khoảng cách xa, nội dung trang báo lại nặng), nên thời gian từ khi ấn enter cho tới khi thấy được nội dung tờ báo là 5s. Thời gian này tuy nhỏ, nhưng nếu phải làm việc nhiều, sẽ rất tốn thời gian. Để giảm thời gian tải này, CDN ra đời.
Ý tưởng:
Ở mỗi khu vực địa lý nhất định (ví dụ: cấp châu lục), đặt một serverCDN đóng vai trò như client trong mạng lưới Content Network, người dùng sẽ request tới serverCDN gần nhất mà mình có thể tiếp cận nhằm giảm thời gian và quá trình request tới origin server ở xa.
Thay request phải vượt Đại Tây Dương (3s), với CDN, chỉ mất 1s cho CDN Server ở UK
Nhưng làm gì có nội dung BBC ở serverCDN!
Xin thưa là có, server ở mỗi nơi đều có lưu trữ bộ đệm (cached), bao gồm hình ảnh, tài liệu, video, … Mỗi khi chúng ta request, thay vì tới thẳng origin server, sẽ chuyển qua request tới serverCDN, từ đó giảm thời gian truy xuất. Nếu số lượng request nhiều, việc sử dụng CDN còn giúp giảm tải cho origin server.
Tăng Tốc Và Bảo Mật Website Với vStack WordPress Plugin
Với hơn 60% website trên thế giới được xây dựng trên nền tảng WordPress, nhu cầu tăng tốc và bảo mật website bằng các plugin hiện nay luôn được các doanh nghiệp ưu tiên hàng đầu. VNG Cloud giới thiệu giải pháp vStack WordPress plugin, hỗ trợ doanh nghiệp tăng tốc và bảo mật toàn diện, nâng cao 60% tốc độ của website.
Với các tính năng nổi bật như:
Hỗ trợ tăng tốc website
Cấu hình tường lửa theo chuẩn
Tự động lọc mã độc và bảo vệ khỏi các cuộc tấn công
Với vStack plugin của VNG Cloud, website của bạn sẽ được tăng tốc và bảo vệ chỉ bằng vài thao tác click đơn giản:
Bước 1: Cài đặt plugin
Cài trực tiếp trên kho plugins: Bằng cách tìm “vStack” trên plugins của wordpress.org. Bạn chọn “Active” để cài đặt.
Upload plugin vào source code
Trong trường hợp “vStack” plugin không tìm thấy trên plugins của wordpress.org bạn có thể tải plugin từ github của vngcloud và giải nén vào wp-content/plugins.
Bước 2: Active Plugin
Khi plugin được hiển thị trong danh sách plugins, bạn chọn “Active” để sẵn sàng sử dụng, và chọn “Settings” để tiến hành xác thực và cấu hình.
Bước 3: Đăng nhập vào tài khoản VNG Cloud
Nếu bạn chưa có tài khoản VNG Cloud, chọn “Create Your Free Account” để tạo tài khoản VNG Cloud, một cửa sổ đăng kí sẽ giúp bạn tạo tài khoản.
Nếu bạn đã có tài khoản VNG Cloud, chọn “Sign in here”, một cửa sổ đăng nhập sẽ giúp bạn đăng nhập bằng cách chọn “Save API Credentials”.
Ở đây, bạn sẽ phải đăng nhập bằng tên tài khoản của VNG Cloud, và một TOKEN.
Nếu bạn chưa có TOKEN, bạn chọn “Get Your API Key from here”, một cửa sổ đăng nhập sẽ hiện ra.
Đăng nhập thành công, bạn sẽ được trả về mã TOKEN. Vui lòng lưu dự phòng TOKEN này, trong trường hợp bạn cần gỡ hoặc cài lại plugin, TOKEN này sẽ giúp bạn đăng nhập lại.
Bước 4: Quản lí plugin
Sau khi đăng nhập xong, bạn sẽ vào được trang quản lí.
Phía trên góc trái màn hình, bạn sẽ thấy tên miền có dạng “xxx.wp.vngstack.com”.
Đây là tên miền được khởi tạo định danh cho website của bạn trên vStack. Bằng cách tạo record CNAME domain website của bạn về đây, website của bạn đã sẵn sàng sử dụng dịch vụ.
Giả lập Google Cloud Storage sử dụng fake-gcs-server
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Khi làm việc với các Cloud Provider, chúng ta cần tính toán đến các giải pháp để tiết kiệm chi phí, ít nhất là ở giai đoạn development. Vì đa số các service của các Cloud Provider mà chúng ta cần sử dụng, sẽ ít nhiều tốn tiền. Một giải pháp mà mình giới thiệu với các bạn trong bài viết này là về giả lập Google Cloud Storage sử dụng một open-source tên là fake-gcs-server, phù hợp cho những dự án nào có sử dụng Google Cloud Platform. Nó giúp chúng ta có thể start lên một standalone server có chức năng gần giống với Google Cloud Storage. Các bạn có thể sử dụng các thư viện của Google provide để làm việc với Google Cloud Storage, để làm việc với open-source này luôn.
fake-gcs-server cung cấp cho chúng ta một Docker Image, giúp chúng ta có thể dễ dàng start nó lên chỉ với vài bước.
Cụ thể, các bạn cần chạy Docker command sau:
docker run -d --name fake-gcs-server -p 4443:4443 fsouza/fake-gcs-server
Lúc này, nếu các bạn request tới URL để lấy thông tin Buckets list với host port sử dụng fake server: https://localhost:4443/storage/v1/b, các bạn sẽ thấy kết quả như sau:
Items hiển thị empty vì chúng ta chưa có một bucket nào trong fake-gcs-server.
Các bạn có thể mount một số data có sẵn và chạy fake-gcs-server như sau:
docker run -d --name fake-gcs-server -p 4443:4443 -v ${PWD}/examples/data:/data fsouza/fake-gcs-server
${PWD} là thư mục hiện hành các bạn đang chạy lệnh Docker cộng với thư mục example/data, sẽ được map với thư mục /data bên trong container của fake-gcs-server. Các bạn có thể thay đổi ${PWD}/examples/data thành bất cứ thư mục nào mà các bạn muốn. Những thư mục trong thư mục ${PWD}/examples/data này sẽ là những bucket, và tất nhiên những tập tin nằm trong các bucket sẽ là những object của những bucket này.
Ví dụ mình có tập tin test.txt nằm trong thư mục /Users/khanh/Document/data/sample-bucket, mình chạy câu lệnh start fake-gcs-server như sau:
docker run -d --name fake-gcs-server -p 4443:4443 -v /Users/khanh/Documents/data:/data fsouza/fake-gcs-server
thì lúc này sample-bucket sẽ là một bucket trong fake-gcs-server, và tập tin test.txt sẽ là một object trong bucket này.
Request lại URL https://localhost:4443/storage/v1/b, các bạn sẽ thấy kết quả như sau:
Lấy thông tin tất cả các object của bucket với URL https://localhost:4443/storage/v1/b/sample-bucket/o, các bạn sẽ thấy kết quả như sau:
Các bạn có thêm tuỳ ý bao nhiêu bucket cũng được, bao nhiêu object cũng được.
Mặc định thì fake-gcs-server sử dụng HTTPS, các bạn có thể sử dụng HTTP bằng cách thêm vào command start nó tham số scheme như sau:
Lúc này chúng ta có thể sử dụng fake-gcs-server với HTTP:
Sử dụng Spring Cloud GCP Storage để access vào bucket của fake-gcs-server
Để access vào các bucket trên Google Cloud Storage, các bạn có thể sử dụng thư viện spring-cloud-gcp-storage. Chúng ta cũng có thể sử dụng thư viện này với fake-gcs-server.
Một điều các bạn cần lưu ý là chúng ta không cần sử dụng credentials để access vào các bucket của fake-gcs-server.
Mình sẽ tạo một Maven project đơn giản, khai báo sử dụng spring-cloud-gcp-storage để access vào fake-gcs-server mà mình đã start ở trên, như sau:
Ở đây, mình không sử dụng credentials để access vào bucket của fake-gcs-server. Các bạn có thể thao tác trên bucket của fake-gcs-server tương tự như trên Google Cloud Storage sử dụng thư viện này.
Học cái gì đó mục đích cuối cùng là để có một nghề nghiệp hoặc sự nghiệp ổn định. Đó cũng là định luật muôn thuở và luôn đúng với bất kỳ người nào đang tìm kiếm các trung tâm hay học viện để học một cái gì đó? Vậy sau khi học lập trình, chúng ta có thể làm những nghề nào? Chia buồn với bạn, không phải cứ học xong thì Coder có thể làm bất cứ nghề nào về lập trình cũng được.
Bởi thế, trả lời cho câu hỏi “Tôi học cái này để làm gì?” luôn cần thiết ngay từ những bước chân đầu tiên. Câu trả lời chung chung thì rất nhiều. Nhưng câu trả lời chính xác là xác định mục đích cuối cùng và mong muốn của bạn là gì sau khi học lập trình xong. Sau đây, mình sẽ cho bạn những gợi ý về nghề nghiệp phù hợp con đường mà bạn đang theo đuổi.
Đây là công việc khá phổ biến về lập trình. Một Software Engineẻ cần phải học JavaScript, Ruby, HTML, và CSS. Ranh giới giữa Software Engineer và Software Developer khá mờ nhạt, vì vai trò của họ gần như tương đương nhau. Bạn có thể tìm hiểu kỹ hơn trên Reddit để có cái nhìn sâu hơn.
Đối với hầu hết mọi trường hợp, Software Engineer cần phải học lập trình và hiểu sản phẩm cuối được thiết kế và quản trị như thế nào. Thông qua những kiến thức đã học, kỹ sư phần mềm sẽ tìm ra hướng giải quyết hay phát triển phần mềm của mình.
Đối tượng phù hợp: Coder từng trải hay chuyên môn cao.
Đây là một nghề nghiệp đang hấp dẫn trong giới lập trình, theo điều tra của Glassdoor hay LinkedIn và một số người khác được khảo sát. Sở dĩ những người này khó kiếm vì yêu cầu kỹ năng đa dạng. Một người làm công việc này phải vừa là software engineer, vừa thực hành và học lập trình, vừa phân tích thống kê và trình bày số liệu để kể những câu chuyện và khám phá những thông tin đầy sức mạnh từ một lượng lớn dữ liệu thu thập được.
Data Scientist phải học Python, SQL, R và Java và sử dụng chúng thành thạo để xây dựng thuật toán và xây những model được sử dụng để phát hiện vấn đề mới và dự đoán hành vi người tiêu dùng.
Đối tượng phù hợp: Coder sáng tạo và thích hiện thực hóa các ý tưởng
Nếu bạn muốn tạo ra thứ gì đó để mọi người có thể xem trên mạng Internet, bạn nên là một Front-End Developer. Những người này sẽ phải học Front-end như JavaScript, HTML và CSS để hoàn thiện bề nổi của website. Ngoài ra, công việc của Front-End Developer còn liên quan tới thiết kế website và Back-End Developer để có thể hoàn thiện mọi thứ từ giao diện ấn tượng cho tới các chức năng độc đáo.
Bạn muốn là một Back-End Developer
Đối tượng phù hợp: Coder có kỹ năng tổ chức và đáng tin cậy
Back-End Developer vẫn thường bị đánh giá thấp. Họ sẽ phải xây dựng các nền tảng đặt nền móng cho các Front-End Developer thông qua các ngôn ngữ PHP, Java, Ruby, Python hay SQL. Ngoài ra, Back-End Developer còn sử dụng các ngôn ngữ server-side để kéo thông tin từ cơ sở dữ liệu và chuyển lại cho người dùng thông qua định dạng của ngôn ngữ Front-End.
Bạn muốn là một Full-Stack Developer
Đối tượng phù hợp: Coder trọn gói, hay còn gọi Coder “bao sô”
Full-Stack Developer nổi lên cùng với phong trào khởi nghiệp trên toàn cầu. Các công ty khởi nghiệp cần cả Front-End lẫn Back-End Developer, nhưng không đủ nguồn lực dành cho hai team độc lập. Full-Stack Developer cũng không phải là bậc thầy về ngôn ngữ lập trình. Họ biết mọi thứ ở mức vừa đủ để tạo ra và vận hành một website, đồng thời có thể xử lý sự cố ở Back-End khi có phát sinh.
Đối tượng phù hợp: Coder yêu thích ứng dụng di động
Đây là những người được sinh ra dành cho các ứng dụng di động. Mobile Developer cần ngôn ngữ Swift để tạo ra ứng dụng cho hệ điều hành iOS , trong khi với Android, họ cần ngôn ngữ Java, C# hoặc C/C++. Với sự phố biến của các thiết bị di động, số lượng Mobile Developer đã tăng trưởng đáng kể trong thời gian vừa qua, tỉ lệ thuận với số lượng ứng dụng phục vụ cho cộng đồng cũng ngày một nhiều hơn
Bạn muốn là một UI/UX Designer
Đối tượng phù hợp: Coder quan tâm đến trải nghiệm của người dùng và không quan tâm đến chức danh của mình
Chức danh của những Coder này vẫn còn gây ra rất nhiều tranh cãi và có không ít chủ đề bàn luận nên có hay không sự tồn tại vị trí UI/UX Designer trong lĩnh vực IT. Vì thế chúng ta sẽ không đi sâu về phương diện này, thay vào đó là cách một UI/UX Designer có thể tận dụng code vào trong công việc hằng ngày.
UX Designer tập trung hơn vào trải nghiệm tổng thể của người dùng, họ sẽ thiết kế các phiên bản test và bản thử nghiệm trước khi chuyển chúng đến tay của Front-End Developer. UI/UX Designers cũng thường không phải lập trình, nhưng hiểu biết coding sẽ giúp công việc của họ hiệu quả hơn. Ví dụ họ cần hiểu một chút về HTML hay Swift để hạn chế những trở ngại về công việc của mình.
Bạn muốn là một Product Manager
Đối tượng phù hợp: Coder thông thường nhưng có kỹ năng lãnh đạo và khả năng đọc mã code.
Product Manager có thể không phải là một Coder trong thời điểm hiện tại năm 2018. Nhưng họ có khả năng hiểu các đoạn mã và chức năng của nhiều ngôn ngữ khác nhau, để có thể hỗ trợ nhiều nhóm khi cần thiết. Product Manager làm sao có thể hiểu được những gì Software Engineer giải thích nếu không nắm các kiến thức căn bản về lập trình. Họ không cần phải là Coder, nhưng họ giúp xử lý các vấn đề hiệu quả hơn.
Đối tượng phù hợp: Coder sở hữu tất cả đáp án và tạo ra những kho dữ liệu khổng lồ
Ngay tên của chức danh này đã nói lên tất cả công việc của họ. Họ tạo ra và quản lý dữ liệu trong môi trường IT. Database Developer có thể làm việc như Database Administrator, đảm bảo khả năng lưu trữ thông tin, đảm bảo sự an toàn và khả năng truy xuất những thông tin này. Những người này cũng có thể phải liên tục nâng cấp hệ thống, và chịu trách nhiệm cập nhật liên tục dữ liệu trong hệ thống này.
Bạn muốn có vị trí trong DevOps
Đối tượng phù hợp: Coder nhanh nhẹn, thích làm việc với các quy trình vận hành
DevOps là viết tắt của Developement and Operations, kết nối quá trình phát triển và vận hành một ứng dụng hay website theo một quy trình thống nhất. Theo truyền thống, phải mất rất nhiều thời gian để một sản phẩm chuyển đổi từ bộ phận phát triển qua bộ phận triển khai. Và bộ phận DepOps giúp cho quá trình này diễn ra nhanh hơn, giúp người dùng không bị gián đoạn thông tin và các doanh nghiệp tăng khả năng cạnh tranh trong môi trường IT đang ngày một đông đúc hơn.
Bạn muốn làm bất cứ việc gì mình thích, ở nơi mà mình muốn
Bạn có thể thấy sự đa dạng về nghề nghiệp của một Coder, không đâu xa mà ngay từ danh sách này. Chưa từng có một quan điểm hay chỉ dẫn cho việc lựa chọn ngôn ngữ lập trình tiếp theo sau khi hoàn thành xong một ngôn ngữ lập trình nào đó. Ví dụ một Graphic Designer có thể học thêm kiến thức cơ bản về Front-End để giúp tăng khả năng cạnh tranh trong nghề nghiệp của mình. Ít nhiều cũng giúp cho họ có cái nhìn rõ ràng hơn trước những mô tả của bạn Front-End.
Có nhiều điều thú vị nhưng cũng tùy vào cách Coder lựa chọn công việc của mình. Không phải công ty nào cũng giống nhau và công việc coding ở công ty này tương tự công ty kia, chưa kể hàng ngàn các lĩnh vực khác nhau sẽ có cách lập trình khác nhau. Data Scientist có thể là nghề được biết đến nhiều nhất trong khoa học dữ liệu, nhưng vẫn còn đó vị trí Phân tích dữ liệu, Kỹ sư tự động hóa hay kỹ sư Big Data.
Tuy nhiên hãy thoải mái vì hiện tại có rất nhiều nghề nghiệp dành cho Coders. Bước tiếp theo của tiến trình chính là các định sở thích của mình và ngôn ngữ lập trình phù hợp nhất. Cách hay nhất chính là tham gia các sự kiện coding để có cái nhìn và tiếp cận rõ hơn về hướng đi cho tương lai. uCode.vn cung cấp cho bạn rất nhiều khóa học để nắm vững các kiến thức nền tảng thông qua các công cụ và ví dụ thực tiễn. Chúng tôi cũng có những buổi hội thảo cũng như tư vấn nhằm giúp các bạn tìm ra hướng đi phù hợp cho bản thân.
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
Tuần trước, chúng ta đã xem qua 1 cách custom về thư viện bàn phím hiển thị gợi ý tiền Việt Nam. Hôm nay tôi sẽ hướng dẫn cách tạo 1 thư viện để gọi network dạng restful API. Thư viện tên là Qnetwork. Bạn có thể tải trên github tại đường dẫn:
Đầu tiên, bạn cần biết rằng tôi xây dựng thư viện này tốt nhất cho kiến trúc MVVM. Tuy nhiên bạn vẫn có thể sử dụng nó cho các architecture khác mà bạn muốn. Nếu hiểu theo cách đơn giản, bạn dùng thư viện này, bạn tạo các service để gọi API. Sau đó, bạn dùng nó để gọi bất cứ ở đâu bạn muốn.
Trong 1 bài viết trước đây, tôi đã giới thiệu khá kỹ càng cách viết API cho nó. Các bước tiến hành như sau:
Tạo 1 module Github. Mỗi module sẽ phục vụ cho 1 màn hình riêng biệt. Trong thiết kế MVVM tôi hay làm như vậy, module bao gồm View, Model, servive gọi API và view model. Bạn có thể mở souce code ở trên ra xem.
Tạo 1 file GithubAPI. File này chứa cụm API cần gọi. Thông thường trong ứng dụng của tôi sẽ có nhiều file dạng *API. Mỗi 1 file chứa 1 cụm, ví dụ AuthenAPI sẽ chứa cụm đăng nhập, đăng xuất. FeedAPI chứa cụm API liên quan đến feed. Cách đặt tên sẽ sát nghĩa nó làm gì. Mô tả file này như sau:
//
// GithubAPI.swift
// QNetworkDemo
//
// Created by Xuân Quỳnh Lê on 2021/06/26.
//
import Foundation
import QNetwork
import Moya
enum GithubAPI {
case searchRepositories(q: String, sort: String, order: String, page: Int)
}
extension GithubAPI: TargetType {
var baseURL: URL {
let url = URL(string: Configs.Network.baseUrl)!
return url
}
var path: String {
switch self {
case .searchRepositories:
return "search/repositories"
}
}
var method: Moya.Method {
return .get
}
var sampleData: Data {
var dataUrl: URL?
switch self {
case .searchRepositories:
if let file = Bundle.main.url(forResource: "SearchRepositoriesResponse", withExtension: "json") {
dataUrl = file
}
}
if let url = dataUrl, let data = try? Data(contentsOf: url) {
return data
}
return Data()
}
var task: Task {
switch self {
case .searchRepositories:
if let parameters = parameters {
return .requestParameters(parameters: parameters, encoding: parameterEncoding)
}
}
return .requestPlain
}
var headers: [String: String]? {
return ["Content-type": "application/json"]
}
var parameters: [String: Any]? {
var params: [String: Any] = [:]
switch self {
case .searchRepositories(let q, let sort, let order, let page):
params["q"] = q
params["sort"] = sort
params["order"] = order
params["page"] = page
}
return params
}
// For json encode. Use in post request
var jsonEncoding: JSONEncoding {
return JSONEncoding.default
}
// For param encode. Use in get request
var parameterEncoding: ParameterEncoding {
return URLEncoding.default
}
}
Sau đó bạn tạo tiếp file GithubSearchService. Ở đây bạn cần truyền 1 struct Codable để lúc API có response, bạn cần đưa nó vào và chuyển json sang struct này. Cụ thể là struct GithubSearchResponse:
// MARK: - GithubSearchResponse
struct GithubSearchResponse: Codable {
let totalCount: Int?
let incompleteResults: Bool
let items: [GithubSearchItem]?
enum CodingKeys: String, CodingKey {
case totalCount = "total_count"
case incompleteResults = "incomplete_results"
case items
}
}
// MARK: - Item
struct GithubSearchItem: Codable {
let id: Int
let name: String?
let htmlURL: String?
let itemDescription: String?
enum CodingKeys: String, CodingKey {
case id, name
case htmlURL = "html_url"
case itemDescription = "description"
}
}
Nhiều bạn hỏi tôi sao có thể từ json chuyển sang struct được như trên. Tôi là 1 người lười biếng, nên tôi hay vào trang này để chuyển: https://app.quicktype.io
Sau đó bạn chỉ cần chỉnh sửa tên cho hợp lý là được. Bạn làm nhiều sẽ quen tay thôi.
Sau khi xong cụm service ở trên, bạn cần tạo GithubViewModel:
import Foundation
class GithubViewModel {
// Service call API
let service: GithubSearchService!
// Callback to view
var needReloadTableView: (() -> Void)?
var needShowError: ((String) -> Void)?
var needSetStateBottomIndicatorView: ((_ show: Bool) -> Void)?
private var page: Int = 0
private var language = ""
private var incompleteResults = false
// Datasource
private var githubSearchItem: [GithubSearchItem] = []
init() {
// Turn on is test is true if you need test for API
self.service = GithubSearchService(isTest: false)
}
/// Clear tableview data source
func clearTableView() {
self.page = 0
self.incompleteResults = false
self.githubSearchItem.removeAll()
self.needReloadTableView?()
}
/// Request repositories
func requestRepositories(language: String, loadMore: Bool = false) {
// Check when load more
if self.incompleteResults {
return
}
if !loadMore {
self.page = 0
self.githubSearchItem.removeAll()
}
self.language = language
// Default param
let sort = "stars"
let order = "desc"
self.service.searchRepositories(language: language, sort: sort, order: order, page: self.page) { [weak self] result in
guard let strongSelf = self else { return }
// Check when load more
if loadMore {
strongSelf.needSetStateBottomIndicatorView?(false)
}
switch result {
case .success(let githubResponse):
strongSelf.incompleteResults = githubResponse.incompleteResults
if let items = githubResponse.items {
items.forEach( {strongSelf.githubSearchItem.append( $0 )})
}
strongSelf.needReloadTableView?()
case .failure(let error):
strongSelf.needShowError?(error.description)
}
}
}
func numberOfRowsInSection(section: Int) -> Int {
return githubSearchItem.count
}
func cellForRowAt(indexPath: IndexPath) -> GithubSearchItem {
// Check if the last row number is the same as the last current data element
if indexPath.row == self.githubSearchItem.count - 1 {
self.page += 1
self.requestRepositories(language: language, loadMore: true)
self.needSetStateBottomIndicatorView?(true)
}
return githubSearchItem[indexPath.row]
}
}
Nhiều bạn sẽ tò mò tại sao tôi lại viết được như trên. Cũng tương tự, tôi hay tải source của người khác về xem. Sau đó tôi clone y hệt, người ta viết gì, tôi viết nấy. Lâu dần quen tay, có phản xạ. Cuối cùng là hiểu được ý nghĩa mà người ta làm. Dù sao thì thực hành vẫn là cách tốt nhất để học lập trình.
Bạn xem kỹ video, làm theo anh ấy, bạn sẽ tạo được 1 swift package và có thể đưa cho người khác sử dụng thông qua 1 đường dẫn. Với Qnetwork, đơn giản bạn chỉ cần thêm đường dẫn này vào phần swift package của bạn(Xcode ➞ File ➞ New ➞ Swift Package):
Đm, ví dụ đọc chán đời vcl, lớn hơn 4 kiểu gì chả lớn hơn 0. Nhưng tui chán nghĩ cái ví dụ cụ thể, nên các ông đọc tạm. Ok, lúc này ta cần bind class cho end user biết lúc nào email input đúng, khi nào sai
Teleport provides a clean way to allow us to control under which parent in our DOM we want a piece of HTML to be rendered, without having to resort to global state or splitting this into two components.
Teleport cung cấp một cách hoàn hảo để control component cha nào muốn render thêm HTML ở trên DOM, nhưng không cần phải resort lại global state hoặc chia nó thành 2,3 component nhỏ.
Teleport ở đây cũng được hiểu như đường ống bên Mẽo hay ArabSaudi đã suy nghĩ và có plan để hiện thực hóa.
Thay vì chuyển người hay chuyển hàng thì ta chuyển code ra ngoài Vue application (ra ngoài <div id=”app”>)
Kinh Nghiệm Khi Phỏng Vấn Với Người Nhật Giúp Ứng Viên Ghi Điểm Tuyệt Đối
Đối với nhiều ứng viên, phỏng vấn luôn là phần căng thẳng và khó khăn vì cần phải cố gắng thể hiện tốt nhất năng lực của bản thân trực tiếp với nhà tuyển dụng. Đặc biệt, với người Nhật – những người được xem là có lối sống quy củ và tác phong nghiêm túc bậc nhất, việc phỏng vấn sẽ càng trở nên quan trọng hơn. Ở Việt Nam hiện nay đã xuất hiện khá nhiều các công ty IT đến từ Nhật Bản. Vậy có những kinh nghiệm phỏng vấn với người Nhật nào mà các ứng viên nói chung mà các lập trình viên nói riêng không nên bỏ qua nếu muốn đậu phỏng vấn?
Kinh Nghiệm Khi Phỏng Vấn Với Người Nhật Giúp Ứng Viên Ghi Điểm Tuyệt Đối
Cần chuẩn bị thật tốt trước khi bắt đầu buổi phỏng vấn
Khi biết mình được lên lịch để tham gia phỏng vấn với doanh nghiệp Nhật Bản, bạn cần ngay lập tức chuẩn bị cho mình mọi “hành lí” một cách chỉn chu nhất. Với người người Nhật, cái nhìn đầu tiên, sự tiếp xúc từ những giây đầu tiên ảnh hưởng khá nhiều đến thái độ và sự đánh giá của họ đối với bạn. Chính vì thế, việc có được một vẻ ngoài gọn gàng, thái độ lịch sự và chuẩn bị đầy đủ mọi tài liệu là rất cần thiết.
Đến đúng giờ là yếu tố tuyệt đối nên tuân thủ trong mọi cuộc phỏng vấn, nhất là với người Nhật. Ứng viên nên chuẩn bị cho mình một bộ Tây phục gọn gàng và vừa vặn để giúp bạn trông chuyên nghiệp và thành thạo hơn. Đầu tóc nên được cắt và buộc gọn gàng, phái nữ có thể trang điểm nhẹ nhàng để gây ấn tượng tốt hơn với nhà tuyển dụng. Khi gặp người phỏng vấn bạn nên cúi nhẹ người để chào và nở nụ cười thân thiện. Các kỹ năng mềm được phát huy khi giao tiếp sẽ giúp bạn rất nhiều trong quá trình phỏng vấn nhờ thái độ hòa nhã và cởi mở này.
Một số lưu ý khi trả lời phỏng vấn với người Nhật
Trả lời thành thật khi giới thiệu về bản thân và những điểm mạnh, điểm yếu
Người Nhật có khả năng phán đoán thái độ và biểu cảm của người đối diện khá tốt, vậy nên những ứng viên trả lời về bản thân theo kiểu nói quá hay quanh co thường rất dễ bị phát hiện. Khi trả lời, ứng viên hãy cố gắng giới thiệu một cách ngắn gọn và rõ ràng các thông tin về bản thân mình cũng như những kinh nghiệm làm việc đã có được. Hãy tự tin và nhìn thẳng vào đối phương khi trả lời, đó cũng là một cách để thể hiện bản lĩnh và sự mạnh mẽ của ứng viên.
Nhắc đến các điểm mạnh và điểm yếu của bản thân một cách thành thật. Nếu có thể, hãy khéo léo cho nhà tuyển dụng thấy được rằng những điểm mạnh này của bạn sẽ đóng góp được gì cho công ty và các điểm yếu sẽ được bạn khắc phục như thế nào trong tương lai. Sự thành thật khi trả lời những câu hỏi này sẽ giúp bạn rất nhiều khi nhà tuyển dụng tiếp tục đặt những câu hỏi từ câu trả lời của bạn và khai thác sâu hơn.
Việc đạt được thành tựu trong công việc hay các bằng cấp bạn tích lũy được trong quá trình trau dồi kiến thức chuyên môn của mình là rất tốt. Điều đó chứng tỏ năng lực chuyên môn của bạn đủ giỏi và bạn hoàn toàn có thể đảm nhận công việc ở vị trí mới, công ty mới. Tuy nhiên, với người Nhật, họ đánh giá cao tinh thần ham học hỏi, sự khiêm tốn và sẵn sàng chấp nhận những thách thức hơn là các thành tích của một cá nhân.
Người Nhật rất khiêm tốn. Người Nhật không phủ nhận năng lực của một cá nhân nhưng điều họ thích thú vẫn là sự hài hòa, do đó đây cũng là lưu ý quan trọng bạn cần nắm về kinh nghiệm phỏng vấn với người Nhật. Hãy kể về những thành tích của mình một cách vừa đủ và chia sẻ với người phỏng vấn tinh thần sẵn sàng cống hiến và không ngại học hỏi của bạn để buổi phỏng vấn thành công hơn nhé!
Lịch thiệp và thoải mái trong cách ứng xử
Đừng quá gồng mình hay căng thẳng vì lo sợ trong buổi phỏng vấn. Hãy thoải mái với chính mình và người đối diện để buổi phỏng vấn diễn ra suôn sẻ hơn, hai bên có thể trao đổi thông tin cho nhau một cách dễ dàng để hiểu rõ nhau hơn. Hãy tự tin về những gì mình chia sẻ và thoải mái trao đổi với nhà tuyển dụng mọi vấn đề mà bạn gặp phải để tìm được hướng đi chính xác nhất cho mình nhé.
Ngoài ra, trong các buổi phỏng vấn, ứng viên cũng có thể mang theo sổ tay để ghi chú các vấn đề cần thiết hoặc muốn lưu ý. Nhà tuyển dụng sẽ không có vấn đề gì với việc này mà thậm chí còn đánh giá cao những người chú trọng đến việc ghi chép để tránh quên thông tin sau này. Điều này cho thấy bạn là người cẩn thận và luôn biết cách chuẩn bị tốt trong mọi tình huống.
Mỗi đất nước, mỗi con người đều có nhiều tính cách khác nhau và nhiều thái độ khác nhau với việc phỏng vấn. Để thành công trong một buổi phỏng vấn, kinh nghiệm phỏng vấn với người Nhật là bạn hãy chia sẻ thành thật và thẳng thắn để hai bên có thể hiểu rõ nhau và làm việc tốt đẹp hơn trong thời gian sau này. Đón đọc thêm nhiều bài viết hấp dẫn khác tại TopDev dành cho dân IT nhé!
Cách cài đặt plugin gợi ý code Tabnine, thuật toán AI thông minh
Bài viết được sự cho phép của blogchiasekienthuc.com
Chào các bạn, chúng ta đều biết rằng, ngày nay việc viết mã nguồn (code) đối với lập trình viên không còn là việc quan trọng hàng đầu nữa.
Chính vì vậy, ngày càng có nhiều công cụ ra đời để hỗ trợ cho lập trình viên giảm bớt thời gian vào những việc không cần thiết, như gõ cọc cạch từng dòng mã nguồn.
Còn ở trong bài viết này thì mình sẽ cùng các bạn cài đặt plugin Tabnine trên các phần mềm soạn thảo code hàng đầu tiện nay như: VS Code, InteliJ Idea, Sublime Text. Tabnine cũng là một AI gợi ý code khá hay mà các bạn nên thử.
I. Tabnine là gì?
Tabnine bản chất là một công cụ được phát triển dựa trên các thuật toán học sâu (Deep Learning), với dữ liệu đào tạo được lấy từ hơn hai triệu tệp từ mã nguồn trên Github.
Hiện tại thì plugin Tabnine hỗ trợ khoảng hơn ba mươi ngôn ngữ lập trình khác nhau. Các bạn có thể tham khảo danh sách mà nó hỗ trợ trong hình bên dưới.
Ngoài ra thì Tabnine cũng hỗ trợ nhiều công cụ lập trình khác nhau, trong số đó hầu hết là các công cụ lập trình phổ biến. Cụ thể là:
II. Cài đặt Tabnine trên các công cụ VS Code, InteliJ Idea, Sublime Text
Okay, trong phần tiếp theo này mình sẽ cùng các bạn cài đặt Tabnine trên VS Code, IntelliJ Idea và Sublime Text – đây đều là những công cụ lập trình phổ biến hàng đầu hiện nay.
#1. Cài đặt Tabnine trên Visual Studio Code (VS Code)
+ Bước 1: Các bạn vào mục Extension => sau đó tìm kiếm từ khóa Tabnine như hình bên dưới.
+ Bước 2: Chọn kết quả đầu tiên => và sau đó bấm Install để bắt đầu cài đặt.
Quá trình cài đặt diễn ra tự động, nếu trong trường hợp bạn không muốn dùng nữa thì có thể nhấn Disable để vô hiệu hóa tạm thời, hoặc nhấn Uninstall để gỡ bỏ Plugin nhé.
#2. Cài đặt Tabnine trên InteliJ Idea
+ Bước 1: Đối với phần mềm lập trình IntelliJ thì đầu tiên, các bạn vào phần: File => chọn Setting => và chọn Plugin
+ Bước 2: Ở bước tiếp theo, các bạn chọn Plugins => chọn Tab Marketplace => sau đó tìm kiếm từ khóa Tabnine => và bấm Install để cài đặt.
Các bạn lưu ý là khi cài đặt một plugin trên IntelliJ thì bạn phải Restart lại để active plugin đó như hình bên dưới nhé.
#3. Cài đặt Tabnine trên Sublime Text
+ Bước 1: Đầu tiên các bạn vào mục Tools => chọn Install Package Control… để cài đặt Package Control..
+ Bước 2: Các bạn tiếp tục vào mục Tools => Command Palette… Hoặc phím tắt là Ctrl + Shift + P
+ Bước 3: Tiếp tục các bạn tìm kiếm từ khóa Install Package trong thanh tìm kiếm hiện ra như hình bên dưới.
+ Bước 4: Cuối cùng các bạn gõ Tabnine => và chọn kết quả đầu tiên như hình bên dưới sau đó bấm vào để cài đặt.
III. Kết luận
Vâng, như vậy là việc cài đặt plugin Tabnine trên VS Code, InteliJ Idea và Sublime Text cũng tương đối đơn giản phải không nhỉ 🙂
Việc sử dụng các công cụ gợi ý mã nguồn thực sự đem lại nhiều lợi ích về mặt tốc độ cũng như sự chính xác trong cú pháp. Các bạn có thể thấy rõ trong hình bên dưới.
Tuy nhiên, nói đi cũng phải nói lại, chúng ta vẫn nên nắm được các cú pháp cơ bản của các ngôn ngữ lập trình, bởi vì bản chất lập trình viên hay nhà phát triển vẫn là người quyết định.
Và chỉ khi nắm rõ được những gì chúng ta muốn thì lúc đó các công cụ hỗ trợ mới có ý nghĩa thực sự và thể hiện đúng vai trò của nó. Hẹn gặp lại các bạn trong các bài viết tiếp theo nha !
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
Xin chào, lại là codetoanbug.com đây. Hôm nay chúng ta sẽ cùng sử dụng 1 design system framework cho iOS. Cụ thể chúng ta sẽ xây dựng màn hình giao diện như sau:
Giao diện này thư viện đã làm sẵn, việc của bạn là thay đổi chữ trên màn hình. Hoàn toàn đơn giản và không mất thời gian.
Nếu bạn là 1 developer thích quan tâm về trải nghiệm người dùng, các phong cách thiết kế, thì có lẽ bạn đã nghe qua khái niệm design system. Mình xin phép chia sẻ các bài viết dễ hiểu về design system tại đây của tác giả An:
Vậy FinniversKit là chuyển thể 1 design system trên figma hay các công cụ thiết kế khác thành framework có thể sử dụng được trên iOS.
Cùng dạo qua về framework này 1 chút:
Color – Font – Spacing
Chúng ta có dải màu như sau:
Đây là toàn bộ những màu có thể sử dụng ở trong framework này, hay nói cách khác nếu bạn dùng 1 màu khác dải màu này bạn đã không tuân thủ design system của nó.
Nếu như bạn đã đọc về POP trong 1 bài viết trước của tôi, thì hãy theo dõi đoạn code dưới đây bạn sẽ thấy sự quen thuộc:
public protocol ColorProvider {
var bgPrimary: UIColor { get }
var bgSecondary: UIColor { get }
var bgTertiary: UIColor { get }
var bgBottomSheet: UIColor { get }
var bgAlert: UIColor { get }
var bgSuccess: UIColor { get }
var bgCritical: UIColor { get }
var btnPrimary: UIColor { get }
var btnDisabled: UIColor { get }
var btnCritical: UIColor { get }
var btnAction: UIColor { get }
var textPrimary: UIColor { get }
var textSecondary: UIColor { get }
var textTertiary: UIColor { get }
var textAction: UIColor { get }
var textDisabled: UIColor { get }
var textCritical: UIColor { get }
var accentSecondaryBlue: UIColor { get }
var accentPea: UIColor { get }
var accentToothpaste: UIColor { get }
var textCTADisabled: UIColor { get }
var textToast: UIColor { get }
var tableViewSeparator: UIColor { get }
var imageBorder: UIColor { get }
var decorationSubtle: UIColor { get }
var iconPrimary: UIColor { get }
var iconSecondary: UIColor { get }
var iconTertiary: UIColor { get }
}
Bạn sẽ thấy họ thiết kế 1 protocol để định nghĩa tất cả các màu có thể sử dụng. Định nghĩa mã màu như sau:
public struct DefaultColorProvider: ColorProvider {
public var bgPrimary: UIColor {
.dynamicColorIfAvailable(defaultColor: .milk, darkModeColor: UIColor(hex: "#1B1B24"))
}
public var bgSecondary: UIColor {
.dynamicColorIfAvailable(defaultColor: .ice, darkModeColor: .darkIce)
}
public var bgTertiary: UIColor {
.dynamicColorIfAvailable(defaultColor: .marble, darkModeColor: UIColor(hex: "#13131A"))
}
public var bgBottomSheet: UIColor {
.dynamicColorIfAvailable(defaultColor: .milk, darkModeColor: .darkIce)
}
public var bgAlert: UIColor {
.banana
}
Với POP chúng ta sẽ không cần phải kế thừa, nhưng vẫn đảm bảo tính đóng gói của data, cụ thể là màu sắc ở trên.
Còn muốn apply chúng vào project của chúng ta, hãy xem demo của họ:
hay đơn giản là UIColor.ice
Thứ 2 hãy nói về Font. Hay nói cách khác là Typography – kiểu chữ.
Đây là những kiểu chữ mà chúng ta có thể sử dụng. Để vận dụng cách apply vào, đơn giản vào file FontDemoView.swift.
Về các components trong framework này, là phần rất quan trọng để chúng ta có thể tái sử dụng nó ở nhiều nơi. Các components phổ biến nhất như button, textfield, loading… sẽ tiết kiệm rất nhiều thời gian cho chúng ta. Thay vì bạn sẽ phải vẽ lại 1 nút: về độ bo, đổ bóng, shadow, hiệu ứng… thì việc đơn giản là tái sử dụng lại các dạng nút mà họ đã hỗ trợ:
Để hiểu cách dùng, chúng ta lại đơn giản vào màn hình demo ButtonDemoView.swift của họ. Nếu bạn thực sự không biết nó thuộc phần demo nào, hãy sử dụng công cụ debug UI xem
Còn rất nhiều components khác mà bạn có thể chạy ứng dụng demo của họ để xem. Tôi rất thích framework này, vì nó còn hỗ trợ cả dark mode – chế độ tối:
Nhiều components khác, ví dụ loading:
Sử dụng FinniversKit vào project iOS
Để sử dụng framework này, trong phần readme có nhiều cách, trong đó có cách đơn giản là sử dụng pod.
Riêng bài viết này tôi sẽ sử dụng Carthage. Lý do vì tôi bị ám ảnh việc pod build rất chậm khi sử dụng quá nhiều pods trong Podfile. Và bài hướng dẫn này cũng có mục đích cho bạn tham khảo triển khai Carthage như thế nào.
Lệnh trên để nó không build lại các framework Carthage đã build và chỉ build cho iOS. Đợi chờ lần đầu build, sau đó Carthage sinh ra thư mục framework đã build cho iOS:
../Carthage/Build/iOS/FinniversKit.framework
Phần còn lại là thêm thư viện vào.
Đầu tiên Tab vào General của project và nhấn vào nút “+” của phần Linked Frameworks and Library
Sau khi đã add Lib cần thiết vào, chúng ta đi chuyển đến Build Phases, nhất vào nút +, chọn New Run Script Phase:
/usr/local/bin/carthage copy-frameworks
Và điền như hình:
Việc này để Xcode copy framework vào project và sử dụng.
Sau khi đã thêm FinniversKit thành công, chúng ta hãy tạo màn hình login demo chẳng hạn:
Lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Một nhu cầu mà chúng ta thường gặp là làm sao để biết được ứng dụng mà chúng ta đang chạy có version là bao nhiêu, giúp chúng ta có thể biết được những feature mà ứng dụng đang hỗ trợ cho tới version này. Trong Java thì tuỳ theo ứng dụng mà các bạn đang sử dụng là gì, Web application hay Desktop application thì cách lấy thông tin version của ứng dụng sẽ khác nhau. Đối với các ứng dụng Java Desktop hoặc Java Console, các bạn có thể lưu trữ và lấy thông tin version của ứng dụng từ tập tin META-INF/MANIFEST.MF bên trong tập tin jar của ứng dụng.
Ví dụ như mình có một ứng dụng Java Console khi chạy sẽ in ra dòng chữ “Hello from Huong Dan Java”:
Mình đã sử dụng Maven Shade Plugin để build ứng dụng này, và khi build ứng dụng, mình đã thêm một số thông tin liên quan đến ứng dụng vào tập tin META-INF/MANIFEST.MF bên trong tập tin jar như sau:
Earthly là cú pháp để định nghĩa bản build cho hệ thống của bạn và dùng lại nó để dựng lại ở nơi khác như các server, cloud,…. Nó hoạt động giống với build đã cài đặt trong hệ thống hiện tại của bạn. Các bản build đóng gói có thể dễ dàng dùng lại.
Khi dùng Earthly bạn sẽ dễ dàng build system cho server mà không cần quá nhiều kiến thức như chuyên gia dựng server và rút ngắn thời gian build. Vì tất cả đều chứa trong build đều được đóng gói và dc sử dụng lại bất kỳ ngôn ngữ nào.
Bạn có quá nhiều instants trên các Cluster server khác nhau nằm trên nhiều khu vực và trong mỗi instant thì cài docker, build abc đễ hỗ trợ các kiểu giống nhau.
Việc này thì đòi hỏi DevOps có nhiều kinh nghiệm để remote vào từng cluster build lại hệ thống mới để integration, bla bla. Thay vì lặp lại 1 việc nhiều lần mà lại có rủi ro sai sót khi miss 1 bước hay 1 package nào đó thì dùng Earthly chỉ cần build 1 bản tốt nhất rồi để nó rebuild trên các cluster khác một cách nhanh gọn.
Xem thêm nhiều chương trình tuyển dụng VueJS hấp dẫn trên TopDev
1. Naming components – Vuejs Anti pattern
Về việc đặt tên cho components, thường một số bạn đặt tên component vô tội vạ, thích đặt gì thì đặt cái đó
Đặt tên component quá chung chung và không thể hiện được ý nghĩa của component có thể ảnh hưởng lớn tới project sau này. Cũng gây khó khăn không nhỏ cho việc maintain.
// This would not be an appropriate name as it conflicts with HTML elements.
Vue.component('form', Form)
// This is a better name as it's multi-word and there are less chances to conflict.
Vue.component('signup-form', Form)
Component nếu chỉ đặt tên form sẽ gây confuse cho người sử dụng. Best idea là thêm vào purpose của component, signup-form.
Pattern này là một Vuejs Anti pattern khá nhỏ và đơn giản, tuy nhỏ nhưng không kém phần quan trọng.
2. Template expressions
Often times, when we’re displaying items on the screen, we may have to compute values and call functions to change the way our data looks.
Thi thoảng, khi hiển thị items lên màn hình, ta có thể tính toán giá trị và gọi function để thay đổi data nếu cần thiết
Thay vì gọi thẳng function ở phía template hoặc viết logic ở phần này, ta có thể đem function tính toán này vào computed.
Việc này giúp việc maintain và đọc source sau này trở nên cực kì đơn giản và gọn gàng
Việc này theo đánh giá thì khá là tệ. Props thì định nghĩa ở component con, nhưng việc truyền props vào cho component con lại do thằng cha quản lý
Nếu gửi props sai thì sao?, props gửi không đúng hoặc sai có thể gây ra nhiều con bug ảo lòi