Home Blog Page 99

Fix Lỗi FTP Client Windows Server “Current Security Settings Do Not Allow This File To Be Downloaded”

fix lỗi FTP

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Trong bài trước mình đã giới thiệu tới các bạn cách cài đặt FTP Server trên Windows Server. Tuy nhiên không ít người trong chúng ta ngay sau khi setup xong lại không thể download được file từ FTP Server xuống. Chúng ta có thể gặp lỗi như sau:

  10 lời khuyên để giảm thiểu mối đe doạ an ninh nội bộ
  Fix Lỗi "RDP Authentication Error Has Occurred – The Function Requested Is Not Supported"
Current security settings do not allow this file to be downloaded.

Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"

Fix lỗi trên bằng cách nào?

Nguyên nhân của lỗi trên là do cài đặt bảo mật trên máy chủ. Do đó chúng ta sẽ cùng thay đổi cấu hình Internet Options.

  1. Ấn phím Windows + S, sau đó gõ “internet options”
    Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"
  2. Chuyển qua Security tab. Chọn Internet  và click vào Custom level
    Fix Lỗi FTP Client Windows Server "Current Security Settings Do Not Allow This File To Be Downloaded"
  3. Màn hình cài đặt chi tiết sẽ hiển thị ra. Lướt xuống phần Downloads và tích chọn Enable File download và Font download.
  4. Sau khi thực hiện xong, ấn OK để lưu cài đặt.

Xong, như vậy là bạn có thể kết nối lại và download rồi đó.

kinhnghiemlaptrinh.com

Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Javascript empty array – đừng gán [] thêm một lần nào nữa

Javascript empty array – đừng gán [] thêm một lần nào nữa

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Trong quá trình làm việc với Javascript array, tất nhiên sẽ không tránh khỏi trường hợp ta muốn gán array trở thành empty (Javascript empty array).

Có vô vàn cách để làm điều này, nhưng bài viết hôm nay tôi sẽ chỉ cho các ông thấy gán array cho [] tệ tới mức nào!

1. Thường xuyên sử dụng

Nguyên nhân bao gồm nhiều thứ:

  • Tạo array, dùng lại.
  • Gán array xong muốn empty đi cho đỡ rối.
  • Không có nhu cầu truy xuất data nữa.

Tuy nhiên, hãy cẩn thận khi gán [] nhằm empty array. Tại sao?. Câu trả lời có ngay đây:

2. Thử với ví dụ sau đây

Giả sử, qua vô vàn khó khăn vất vả, ta có array sau đây:

let characters = ["A", "B", "C"];

Sau khi cảm thấy không còn dùng nữa, đối với một lập trình viên bình thường, tất nhiên chỉ đơn giản là:

// Gán array với [] - xong
characters = [];

Có vấn đề khi cố gắng Javascript empty array như vậy không?. Tất nhiên là có chứ!. Nếu ta có một array khác được copy từ array này?

// Gán array với [] - xong
let characters = ["A", "B", "C"];
let copyCharacters = characters;

Chà, copy mà kết quả tất nhiên 2 array y hệt nhau.

console.log(characters)
console.log(copyCharacters)

// ["A", "B", "C"]
// ["A", "B", "C"]

Trường hợp thay đổi một item trong array thứ nhất, tất nhiên nó sẽ có ngay ở array hai. Tuyệt cú mèo!

characters[2] = "D";
console.log(characters)
console.log(copyCharacters)

// ["A", "B", "D"]
// ["A", "B", "D"]
  Object Prototype Javascript – Công cụ hỗ trợ OOP cho JS

3. Cuối cùng thì có gì sai với []

Đây, ngay lúc này empty array thứ nhất. Array thứ 2 có empty cùng luôn không?. Rất tiếc, câu trở lời là không!

characters = [];
// Là phiên bản copy ra, nhưng khi gán [] cho array 1, array 2 lại không refect theo.
console.log(characters)
console.log(copyCharacters)

// []
// ["A", "B", "D"]console.log(characters)

Tại sao?. Nguyên nhân nằm ở việc gán characters = [] thực chất CHỈ TẠO THÊM một instance javascript empty array gán cho characters. Chính vì thế copyCharacters không hề được affected sự empy này.

So when we say, array = [], [] is just a short hand way of allocating some space in memory with no data in it and so array will contain only the reference of the allocated memory space.

Chính vì vậy, khi ta gán array = [], đó là việc ta phân bổ một vùng mermory không có data, do đó mảng thực chất được tham chiếu tới tới không gian bộ nhớ 

Việc sử dụng [] trở nên cực kì nguy hiểm khi có array khác được sao chép ra từ array gốc. Dữ liệu được thao tác nhiều, handle các condition rendering trên screen.

Tìm việc làm Javascript mới nhất cho bạn

4. Làm thế nào để Javascript empty array đúng cách?

Đầu tiên, cách dễ dàng nhất, set length cho array là 1.

// Sử dụng length method là cách không thể dễ dàng hơn.
// Tuy nhìn không nuột như [] nhưng chất lượng thì hơn hẳn?.
characters.length = 0;
console.log(characters)
console.log(copyCharacters)

// []
// []

Cách thứ 2 thì hoa lá cành hơn. Sử dụng method splice của Javascript.

Method splice() chưa bao giờ là lựa chọn tồi. Nguồn/Source: javascripttutorial.net
// splice xem ra cũng là một lựa chọn không tồi!
characters.splice(0, characters.length);
console.log(characters)
console.log(copyCharacters)

// []
// []
  JavaScript Runtime Environment là gì?

5. Tham khảo

Chém gió vài hồi vậy thôi chứ đây là con bug tôi đã gặp và fix từ rất lâu.

Mong rằng bài viết này sẽ giúp các ông tránh lạm dùng [] khi muốn empty gì gì đó trong Javascript nhé. Tại sao lại “gì gì”?.

Vì object cũng thếchả khác gì array cả. Các ông cứ gán null cho nó mà xem! Rảnh thì tham khảo thêm một số bài viết dưới đây nha!

Bài viết gốc được đăng tải tại kieblog.vn

Xem thêm Việc làm IT Hà Nội, đà nẵng, hcm hấp dẫn trên TopDev

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Bài viết được sự cho phép của smartjob.vn

Trong phần 2 này, các bạn hãy tiếp tục cùng Smartjob khám phá 5 gương mặt lập trình viên xuất sắc nhất để biết được họ đã làm gì, đã cống hiến những gì cho ngành công nghệ thông tin của nhân loại.

  10 câu nói cực hay về lập trình
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Lập trình viên Doug Cutting – Nhà phát triển của Lucene

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Phát triển công cụ tìm kiếm Lucene cũng như Nutch (một trình thu thập web) và Hadoop (một bộ công cụ cho quá trình thu thập các dữ liệu lớn). Bên cạnh đó, ông cũng là người đề xướng các mã nguồn mở (Lucene, Nutch, Hadoop tất cả đều sử dụng mã nguồn mở. Ông cũng từng là cựu giám đốc của Nền tảng phần mêm Apache.

Nhận xét:

“Ông là người đã tạo ra một khuôn khổ tìm kiếm đặc biệt (Lucene/Solr) và đem cổng dữ liệu lớn đến với thế giới (hadoop).” Rajesh Rao

“Sự sáng tạo của ông với các dự án Lucene và Hadoop (cùng với rất nhiều dự án khác) đã tạo ra lượng tài sản khổng lồ đồng thời đem đến cơ hội việc làm cho vô số người trên thế giới.” Amit Nithianandan

Lập trình viên Sanjay Ghemawat – Kiến trúc sư chính của Google

Những lập trình viên giỏi nhất thế giới đương đại – Phần 2

Thiết kế và điều hành những hệ thống phân phối lớn nhất của Google gồm có MapReduce, BigTable, Spanner và hệ thống file của Google. Tạo ra hệ thống lịch ical của Unix; được bầu vào Học viện kỹ thuật quốc gia trong năm 2009. Đoạt giải thưởng ACM – Infosys Foundation trong Khoa học máy tính năm 2012

Nhận xét: “Đó là người đồng đội của Jeff Dean” Ahmet Alp Balkan

Lập trình viên Jeff Dean – Bộ óc đằng sau công cụ lập chỉ mục tìm kiếm của Google

Jeff Dean là nhà khoa học máy tính và kỹ sư phần mềm của Google. Ông đã có công rất lớn trong việc thiết kế và triển khai nhiều hệ thống quy mô lớn của Google bao gồm tự động lấy dữ liệu, lập chỉ mục và tìm kiếm, AdSense, MapReduce, BigTable và Spanner. Được bầu vào Học viện kỹ thuật quốc gia 2009, đoạt giải ACM SIGOPS Mark Weiser và giải thưởng ACM-Infosys Foundation về Khoa học máy tính.

Nhận xét:

“… đã đem lại những đột phá trong khai thác dữ liệu (GFS, Map and Reduce, Big Table). ” Natu Lauchande

“Hình thành, xây dựng và triển khai MapReduce và BigTable và vô số những thứ khác” Erik Goldman

Lập trình viên Linus Torvalds – Nổi danh với Lunix

Tạo ra các hạt nhân của Linux và Git, hệ thống kiểm soát phiên bản nguồn mở. Trong quá trình làm việc, ông đã giành được rất nhiều giải thưởng và danh hiệu cao quý bao gồm giải thưởng EFF Pioneer năm 1998, Huy chương Lovelace cho việc phát triển Khoa học máy tính Anh năm 2000, Giải thưởng Công nghệ thiên nhiên kỷ nam 2012,….

Nhận xét:

“Để có được thành tựu này, ông đã nghiên cứu các hạt nhân Linux trong vài năm trong khi GNU Hurd (hạt nhân được phát triển bởi GNU) mất tới 25 năm để phát triển mà vẫn chưa chính thức được đưa vào sử dụng.” Erich Ficker

“Torvalds có lẽ là lập trình viên của mọi lập trình viên” Dan Allen

“Anh ấy đã hoàn thành sứ mệnh một cách xuất sắc” Alok Tripathy

Lập trình viên Carmack – Đồng sáng lập của Doom

Là người đồng sáng tạo ra phần mềm id và tạo ra các game ảnh hưởng bởi FPS như Wolfenstein 3D, Doom, Quake. Đi tiên phong trong các kỹ thuật máy tính mang tính đột phá như thích nghi làm mới ngói, phân vùng không gian nhị phân và bộ nhớ đệm bề mặt. Được giới thiệu vào Viện hàn lâm nghệ thuật và Khoa học Interactive Hall of Fame năm 2001, giành giải thưởng Emmy ở hạng mục Thiết kế và Công nghệ năm 2007 và 2008 đồng thời đoạt giải thưởng thành tựu trọn đời của Lựa chọn những sự phát triển game.

Nhận xét:

“ Anh ấy viết công cụ đầu tiên trước khi tròn 20 tuổi. Đó là một thiên tài. Tôi ước có thể làm việc một quý với lập trình viên tài ba đó.” Alex Dolinsky

“ Wolfenstein 3D, Doom, Quake là một cuộc cách mạng vào thời điểm đo và đã ảnh hưởng đến cả một thế hệ các nhà thiết kế game.” Dniblock

“ Ông có thể viết bất cứ thứ gì một cách cơ bản trong một ngày cuối tuần” Greg Naughton

“Ông là Mozart của mã hóa máy tính.” Chris Morris

Bài viết được dịch và tổng hợp từ ITWorld

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Các tập tin JSP, thông thường được sử dụng với InternalResourceViewResolver, có một số limitation khi sử dụng trong các ứng dụng Spring Boot. Theo như documentation của Spring Boot https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.developing-web-applications.embedded-container.jsp-limitations thì JSP file sẽ chỉ work với Tomcat và Jetty server và sẽ chỉ work là WAR file thôi, không work với JAR file. Thế nhưng, thực tế thì chúng ta cũng có cách để make it work với JAR file. Trong bài viết này, mình sẽ hướng dẫn các bạn cách cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file các bạn nhé!

  Cài đặt Spring Boot CLI
  Spring Boot là gì? Demo dự án Spring Boot trong 5 phút

Mình sẽ tạo mới một Spring Boot project:

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

và sử dụng InternalResourceViewResolver cho ví dụ này.

Mình sẽ thêm tomcat-embed-jasper dependency:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

và một controller:

package com.huongdanjava.springboot.internalresourceviewresolver;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

@RequestMapping("/hello")
public String home() {
return "home";
}
}

Tập tin view home.jsp với nội dung như sau:

Hello World!

sẽ không được tạo trong thư mục /src/main/webapp/WEB-INF/views nữa, Spring Boot khi build sẽ không include thư mục này trong JAR file. Các bạn cần tạo nó trong thư mục src/main/resources/META-INF/resources/WEB-INF/views như sau:

Thư mục src/main/resources/META-INF/resources/ sẽ work giống như thư mục src/main/webapp đó các bạn!

Bây giờ thì mình sẽ khai báo trong application.properties như sau:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Kết quả khi chạy ứng dụng:

Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Cryptology “giải phóng” tư duy bó buộc trong lập trình

mật mã học trong lập trình
Cryptology “giải phóng” tư duy bó buộc trong lập trình

Về diễn giả

  • Anh Nguyễn Đạt Thông, hiện đang công tác tại công ty LogiGear Vietnam ở vị trí quản lý công nghệ.
  • Công việc chính là quản lý các công nghệ, các kỹ thuật hoặc các ngôn ngữ lập trình, cũng như tham gia vào các dự án của khách hàng. Tìm hiểu, đánh giá và tư vấn cho khách hàng việc sử dụng công nghệ sao cho phù hợp nhất để đạt được hiệu suất cũng như chất lượng sản phẩm cao nhất.

Vì sao anh quyết định chuyển từ chuyên ngành Toán Tin sang Mật mã học?

Ngày xưa cũng không có nhiều trường để lựa chọn, lúc đó mình học rất khá môn toán và lại thích tin học nên mình quyết định thi vào khoa Toán Tin của trường Đại học Khoa học Tự nhiên TP. HCM. Mình học ở đây 4 năm, điểm đặc biệt ở khoa này đó là mình sẽ được học cân bằng cả hai lĩnh vực vừa Toán học vừa Tin học, nên giúp cân bằng được sở thích và đam mê của mình. Trong quá trình học ở đây mình nhận ra là toán học tốt thì sẽ là nền tảng giúp mình học tin rất nhanh.

Sau đó mình lại có thiên hướng về học tin, mình học về kiến trúc máy tính, về việc lập trình,… dần dần mình nhận thấy bản thân thích hợp với ngành này hơn. Còn việc quyết định theo đuổi Mật mã học là khi mình đang học cao học. Khi bắt đầu học cao hơn, học chuyên sâu về máy tính thì mình lại hiểu hơn về mật mã học, nó khai sáng tư duy mà trước giờ mình vẫn luôn bó buộc. Trước giờ mình cứ nghĩ lập trình là những con số, những số liệu đó mình làm, nhưng khi làm quen với mật mã mình thấy nó không đúng nữa.

Tưởng tượng như lúc trước mình học toán Ơclit trong một không gian nhỏ thì sẽ đúng, nhưng với không gian lớn hơn, ra ngoài vũ trụ thì lại không đúng nữa. Mật mã học cũng như vậy, lập trình những thuật toán nho nhỏ, những số input nho nhỏ thì thấy đúng nhưng khi làm với những số lớn, cực lớn thì nó không chạy được. Khám phá được những điều đó dần dần mình thấy rất thích ngành này và theo đuổi nó, mình cũng hoàn thành luận văn thạc sỹ với chuyên ngành này luôn.

Những kiến thức chuyên ngành Mật mã học có giúp gì cho công việc hiện tại của anh không?

Có rất nhiều nữa là khác đó. Mặc dù khi nói đến mật mã học trong lập trình sẽ thấy trong lúc lập trình, coding hay testing nếu không để ý sẽ không thấy nó nằm ở đâu cả, nhưng thật ra trong tất cả các công việc lập trình của mình, chúng ta đều phải sử dụng tất cả các kiến thức về mật mã học.

Chẳng hạn nếu các bạn cứ sử dụng web, nếu mình không học và không có những kiến thức về mật mã, sẽ không thể hình dung và rất khó hiểu nó là gì. Hay chẳng hạn khi làm về backend, setup một servicate cho web server của mình, nếu không biết mật mã sẽ rất mơ hồ về khái niệm servicate là gìprivatekey là gì, mật mã nằm sâu bên dưới những cái này.

Sau này khi làm việc trong thế giới công nghệ thông tin mình sẽ biết mã hack, và nhiều vấn đề khác, nếu không thể hiểu mục đích của nó sinh ra làm gì. Trong khi đó, việc học và hiểu được mã hóa thông tin sẽ nắm những thứ này rất vững. Hiện tại nếu làm trên web nhiều sẽ thấy có một khái niệm gọi là token.

Có rất nhiều thứ liên quan đến token, trong facebook cũng có hoặc đăng nhập vô google nó cũng setup cho mình một token, sử dụng Cloud Amazon cũng có token. Vậy token từ đâu mà ra? Nếu mình không có kiến thức nền tảng về mật mã thì sẽ rất khó hiểu những chuyện này. Thật sự là sau khi học được nền tảng về mật mã học, mình thấy nó giúp ích rất nhiều cho công việc.

Vì sao anh lại chọn Java và .NET để học thêm sau khi tốt nghiệp?

Mình bắt đầu học chúng vào khoảng cuối những năm 2000. Lúc đó mình mới ra trường khoảng 3 – 4 năm, vẫn đi làm với tư cách là dev bình thường. Sau khi đi làm, bản thân mới nhận ra kiến thức mình học trong trường rất cơ bản và thiếu hụt nhiều nên mình mới quyết định đi học thêm.

Thời điểm đó điện thoại di động chưa phát triển nhiều nên mình không có những khóa học về điện thoại di động nhiều mà chủ yếu là làm web rất nhiều, kiểu như enterprise, các ứng dụng về web và nhiều thứ liên quan. Cũng lúc đó có 2 công nghệ nổi bật là Java và .NET nên mình quyết định học. Học để hiểu được những ứng dụng enterprise nó cần những điều kiện gì, kiến thức và kĩ thuật gì để làm nên nó.

Mình đã học về các công nghệ của Microsoft và Oracle bao gồm cả database, web server và cả lập trình web cho các hệ thống đó và mình thấy nó như nền tảng để phát triển những vấn đề khác. Như khi gặp khách hàng để tương tác, tư vấn về những hệ thống enterprise bạn sẽ tự động hiểu được nó gồm những thành phần gì, cấu trúc như thế nào, kiến trúc ra sao, gồm những cơ sở dữ liệu tập trung hay phân tán. Nhưng mình thấy khi đi làm sẽ học nhanh nhất và tốt nhất.

  8 công cụ miễn phí để bảo mật khi lập trình phần mềm
  Tổng hợp về WannaCry cho người không biết gì

Anh có thể giới thiệu đôi chút về công ty hiện tại anh đang làm việc được không?

LogiGear có xuất phát từ Mỹ, chuyên làm các dịch vụ về kiểm thử, dịch vụ chính của công ty liên quan đến các hoạt động bảo đảm chất lượng phần mềm cho khách hàng. Công ty cung cấp các dịch vụ khác nhau như tư vấn và giúp khách hàng nâng cao năng suất và chất lượng sản phẩm lên bằng cách giúp họ kiểm thử sản phẩm, thiết kế các quy trình làm việc hiệu quả hơn hoặc giúp khách hàng lựa chọn những công nghệ phù hợp để làm việc được hiệu quả nhất.

LogiGear đang là công ty tiên phong trong lĩnh vực kiểm thử ở Việt Nam, sau này cũng đã có thêm nhiều công ty làm về lĩnh vực này. Nhưng cá nhân mình vẫn thấy LogiGear là môi trường rất tốt để đào tạo các ngành nghề trong lĩnh vực kiểm thử. LogiGear có điểm mạnh riêng đó là kiểm thử tự động, công ty tự xây dựng phần mềm kiểm thử tự động dựa trên kỹ thuật, phương pháp đặc trưng của công ty, đặc biệt hiệu quả cho các dự án kiểm thử lớn.

Vì trong kiểm thử tự động có một đặc điểm là nếu không để ý sẽ dễ thất bại, tức là làm tự động thì rất dễ nhưng làm nhiều thì sẽ rất khó, khó hơn hẳn. Ví dụ mình cần tự động 1, 2 test hay 100 test thì rất dễ, hầu như tool nào, công ty nào cũng làm được. Nhưng nếu được giao 1 dự án có 10000 test case, việc tổ chức, cài đặt, chạy thử một thời gian sẽ rất rối, rất phức tạp. Và phương pháp của LogiGear là để dành cho các dự án như vậy.

Công cụ được LogiGear sử dụng là test architect, được phát triển dựa trên nguyên lí của phương pháp này. Hiện tại đây đang là một tool phổ biển trong thị trường test nhưng đặc biệt là chỉ phổ biến cho những doanh nghiệp lớn vì mình hướng đến những dự án “khủng”.

Xem thêm Muốn làm an toàn thông tin tại Việt Nam thì học gì?

Khi chuyển hướng sang automation testing, anh có gặp khó khăn hay thử thách gì không?

Thật ra lúc mới bắt đầu mình cũng khá là bỡ ngỡ. Lúc mới sang LogiGear lần đầu tiên mình nhìn thấy tool chạy tự động mà có cảm giác nó như một ma thuật vậy. Lúc đó mình rất thích việc automate cho máy tính chạy. Mình làm quen với rất nhiều công nghệ, nhiệm vụ ở công ty là cố gắng để nâng cao năng suất làm việc của khách hàng. Khi khách hàng cần test 100 test key một ngày muốn tăng lên thành 1000 test key 1 ngày thì phải tự động hóa nó. Khi tự động mình cần hiểu phần mềm mà khách hàng đang viết rồi mới tìm cách tự động nó được.

Mà những vấn đề khách hàng viết thì muôn hình vạn trạng, rất nhiều công nghệ, rất nhiều kỹ thuật, rất nhiều nền tảng. Có khách hàng thì viết trên Windows, có người viết trên Linus, .NET, Java, sau này còn có khách hàng phát triển ứng dụng trên iOS, trên Android,… Nên khi bắt đầu công việc này mình cảm thấy sẽ có rất nhiều điều mới cần học. Mình tự xác định với bản thân là không cần học sâu vào một công nghệ nào hết mà cần học nhiều, lĩnh vực nào cũng cần học qua, còn khi nào cần mình sẽ học sâu một công nghệ để làm đúng dự án cho khách hàng. Đó cũng là điều đặc biệt nhất của ngành automation.

Anh có thể chia sẻ vài kinh nghiệm thú vị liên quan đến state – of – art tricks được chứ?

Tất nhiên khi làm trong ngành automation sẽ có rất nhiều tricks, mình đã từng làm việc nhiều với các tricks như vậy, trong đó có 2 cái mình vẫn còn nhớ.

Vấn đề thứ nhất liên quan đến iphone. Lúc đầu bên mình bắt đầu với android, nó khá mở nên mình có thể làm nhiều công việc trên đó, cho đến khi iphone ra đời tính bảo mật của nó rất cao. Lúc đó mình làm trên iOS 6, mọi thứ đều đóng kín và tài liệu cũng rất ít, API Apple cung cấp cũng rất hạn chế, mình không được can thiệp vào process, không được can thiệp vào hệ điều hành vì thế nên không thể tự động ứng dụng của họ được.

Mình nhớ lúc đó cả team lật tung internet lên để tìm thông tin, tìm các trang developer, thậm chí là sử dụng tool để dịch ngược lại thư viện của Apple để xem có những API, những hàm nào. Khi đó team phát hiện ra những API ẩn, tức là Apple viết hàm đó nhưng không đưa ra documentation, nó đặc biệt giúp ích cho mình nếu muốn can thiệp vô ứng dụng của họ. Chẳng hạn bây giờ có ai đó phát hiện ra lỗ hổng của Firefox và cài 1 đoạn mã vô đó, mình cũng phát hiện ra những lỗ hổng của iOS 6, cài vào các agent để hỗ trợ cho việc kiểm thử tự động và kết hợp với một số kĩ thuật khác mình đã tự động hóa được nó.

Mình nhớ sự kiện đó như là việc lần đầu tiên công ty mình làm được, tạo được tool để tự động trên iOS 6, nó rất độc đáo và mình cảm thấy hào hứng với việc đó. Tuy nhiên vì là lỗ hổng nên mình tìm và khai thác nó nhưng khi lên đến iOS 7, người ta sẽ dấu hẳn những API đó đi và solution của mình sẽ không thể sử dụng được nữa, mình lại phải mày mò, nghiên cứu tìm một giải pháp khác và cứ phải tiếp tục các công việc như vậy.

Kỷ niệm thứ 2 mình cũng nhớ rất thú vị là mình hỗ trợ khách hàng tự động hóa việc kiểm thử POS. Hệ thống POS thực chất cũng là một hệ thống phần mềm chạy trên máy tính. Giờ họ muốn tăng năng suất, muốn test nhanh hơn thì bắt buộc phải tự động hóa nó. Lúc đó team mình phải tập trung tìm hiểu về Linux, driver trên Linux, ex server và vận dụng rất nhiều kỹ thuật khác để cuối cùng làm được một bộ tự động giúp chạy hệ thống POS đó.

Khi bắt đầu kiểm tra, thay vì có một người phải cầm sản phẩm quét mã code thì bây giờ trên máy tính đã được giả lập luôn việc đó giống như có người đang quét qua thì hệ thống POS sẽ nhận được thông tin vừa có một sản phẩm quét qua. Rồi thay vì một người phải đưa món hàng lên cân cân và coi nó giá bao nhiêu tính tiền thì giờ đây hệ thống cũng tự động làm luôn chuyện đó.

Và thêm nữa khi mình in hóa đơn sẽ cần kiểm tra xem đã đúng sản phẩm chưa, đúng số lượng chưa, vậy mình nghĩ làm sao để những việc này tự động thực hiện. Thế là team mình triển khai việc tự giả lập máy in luôn, nghĩa là hệ thống in ra cái gì mình đều biết hết và có thể kiểm tra những thông tin đó luôn.

Anh có thể chia sẻ thêm về công cụ TestArchitect mà anh đã đề cập khi nãy được chứ?

TestArchitect là một sản phẩm kiểm thử tự động dựa trên phương pháp action page testing – phương pháp đặc trưng của công ty LogiGear. TestArchitect chuyên sử dụng cho các dự án kiểm thử tự động lớn vì khách hàng của công ty cũng hướng đến những công ty có các sản phẩm kiểm thử lớn, số lượng test key cần thực hiện và chạy mỗi ngày rất nhiều, tool cũng dựa trên nguyên lí của phương pháp này.

Tool này đã được phát triển khoảng 11 – 12 năm với rất nhiều công nghệ từ xa xưa cho đến nay. Cứ trên thế giới xuất hiện 1 phương pháp, 1 công nghệ để phát triển phần mềm mới thì tool sẽ tích hợp vào. Từ lúc bắt đầu tool có thể kiểm thử iOS 6 rồi đến 7, 8, 9,… android cũng tương tự. Qua mỗi thế hệ android sẽ có rất nhiều các thay đổi và cần phải thích nghi với điều đó. Hoặc mới đây có thêm React, React Angular JS những công nghệ mới như thế cũng cần làm sao để tool adapt theo để giúp khách hàng test được.

Anh có gặp khó khăn hay thử thách gì trong quá trình xây dựng công cụ đó không?

Thử thách lớn nhất có lẽ là việc mình phải luôn thích ứng với những công nghệ mới. Mỗi khi có công nghệ mới ra đời, mình phải chủ động mày mò, nghiên cứu để làm sao có thể làm chủ công nghệ đó, đồng nghĩa với việc mình dùng những công nghệ đó để điều khiển các phần mềm khác.

Khó khăn ở chỗ khách hàng thì luôn thích những công nghệ mới mà điểm bất lợi là cái gì mới thường các tài liệu liên quan đến nó sẽ rất ít. Do đó, việc quan trọng là phải mày mò, tìm kiếm rất nhiều để nắm được nguyên lí của công nghệ đó cũng như tìm các tricks, các state-of-art để xử lý nó. Đó chính là khó khăn lớn nhất của mình, nhưng tới hiện tại mình và công ty đều đang làm rất tốt chuyện đó, hầu như công nghệ mới nào tool của công ty cũng hỗ trợ rất tốt.

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Nên làm việc ở công ty Product hay công ty Outsourcing?

Nên làm việc ở công ty Product hay công ty Outsourcing?

Bài viết được sự cho phép của blogchiasekienthuc.com

Đối với những anh em làm về phần mềm chắc có lẽ không còn xa lạ gì với hai khái niệm đó là công ty “Product” và công ty “Outsourcing” nữa rồi đúng không.

Có thể nói thì đây là hai hướng đi có nhiều điểm đối lập nhau, mà nhiều anh em trong ngành vẫn thường “tranh cãi” rất nảy lửa.

Công ty Product là công ty làm sản phẩm và sống dựa vào việc bán sản phẩm hoặc dịch vụ liên quan đến sản phẩm đó. Còn ngược lại, công ty Outsource là công ty làm phần mềm thuê cho người khác/ đơn vị khác…

Và ở trong bài viết này, mình sẽ đưa ra một vài lý do để anh em làm lập trình cân nhắc việc chọn lựa một công ty Product để làm việc thay vì công ty Outsource.

  "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing"
  Chuyện bi kịch của công ty code outsourcing

#1. Được sáng tạo nhiều hơn

Nên làm việc ở công ty Product hay công ty Outsourcing?

Có thể nói, sáng tạo chính là linh hồn và cũng là tôn chỉ của các công ty làm produdct. Đơn giản vì nếu sản phẩm bạn làm ra không có gì mới mẻ, không có gì sáng tạo thì sẽ chẳng có ma nào dùng cả.

Quay trở lại với các công ty outsource, chúng ta đều biết rằng công việc chủ yếu mà họ nhận là các dự án của khách hàng, tìm hiểu nghiệp vụ rồi gia công theo yêu cầu của họ.

Từ Developer cho đến Designer hầu như không được làm theo sự sáng tạo của mình. Đôi khi biết rõ chỗ này nên làm như thế này mới tốt, nhưng vì khách hàng họ không thích, họ yêu cầu khác nên buộc phải làm theo ý của họ.

Nhất là các công ty outsource cho Nhật thì điều này càng đúng hơn, họ yêu cầu mức độ chính xác cao và rất chuyên nghiệp. Đôi khi bạn “không được phép” sáng tạo khi chưa được sự cho phép của họ. Khổ thế đấy 🙂

Ngược lại, các công ty product lại rất khuyến khích nhân viên của mình tự do sáng tạo, đóng góp ý kiến, xây dựng sản phẩm theo hướng tích cực.

Nguyên nhân đơn giản là càng có nhiều sự đóng góp thì sản phẩm sẽ càng được hoàn thiện hơn. Hai nữa là, khi được làm việc theo sự sáng tạo thì đội ngũ phát triển họ thường làm rất tốt và làm bằng tất cả năng lực mà họ có => mục đích là để chứng minh rằng ý tưởng của họ là đúng.

#2. Có trách nhiệm hơn với những gì mình làm

Chắc hẳn anh em nào làm outsouce cũng hiểu rõ một điều là, cái mà anh em đang làm – là làm cho thằng khác.

Nên làm việc ở công ty Product hay công ty Outsourcing?

Nếu là một người có trách nhiệm không cao, chỉ quan tâm tới lương cuối tháng thì mình cá là nhiều anh em làm outsource thường rất cẩu thả trong công việc, làm cho xong, khách hàng mà có phàn nàn thì sửa lại sau.. Đấy, toàn thế thôi !

Mà với cái tâm lý đó, dù anh em làm ở công ty nào thì nó cũng đang dần giết chết sự sáng tạo anh em mà thôi !

Ngược lại, khi làm việc ở các công ty product thường anh em sẽ phải chịu trách nhiệm cho sản phẩm mà mình làm ra.

Nó giống như đứa con tình thần mà anh em bắt buộc phải có trách nhiệm xây dựng và phát triển nó một cách tốt nhất có thể.

Không những vậy, nếu anh em là người trực tiếp lập trình và thiết kế cho sản phẩm đó thì mình tin chắc là anh em còn phải nghĩ ra từng chức năng mình đang làm, để xem liệu nó có tiện cho người dùng hay không, có thực sự cần thiết hay không, có cần bổ sung thêm gì không..?

Tất cả những điều đó buộc các anh em làm product phải có trách nhiệm thực sự. Không chỉ là với sản phẩm họ đang làm, mà là với cả người dùng sẽ sử dụng sản phẩm đó nữa.

#3. Làm nhiều sẽ học hỏi được nhiều hơn

Nên làm việc ở công ty Product hay công ty Outsourcing?

Lại so sánh một chút với các công ty outsource, thì anh em biết đấy, khi làm outsource hầu như anh em sẽ không được làm nhiều. Chủ yếu tập trung vào 1-2 modul của sản phẩm mà thôi.

Điều đó có thể khiến anh em có chuyên môn rất cao trong modul đó, nhưng khi phải làm việc với các modul khác thì anh em lại lơ ngơ như lính mới vậy.

Ngược lại, nếu làm ở các công ty product (đặc biệt là những công ty mới thành lập (start-up)) thì đảm bảo anh em sẽ được làm từ A đến Á luôn.

Đọc đến đây nhiều người sẽ phản biện lại là, thà chuyên sâu một cái, còn hơn là cái gì cũng biết mà thực ra chẳng biết mẹ gì?

Đúng là như vậy ! Nhưng hãy nhìn xa hơn một chút, kiến thức công nghệ đang thay đổi hàng ngày. Nếu anh em cứ khư khư một công nghệ, chuyên sâu một cái mà không để ý đến những công nghệ khác thì sớm muộn cũng bị tụt lại phía sau mà thôi.

Làm sản phẩm thì anh em được làm, được học, được sai và trong quá trình làm sản phẩm anh em có thể nắm rõ quy trình và làm nhiều modul của sản phẩm => từ đó hình thành tư duy sản phẩm tốt hơn.

#4. Rèn luyện tư duy về làm sản phẩm

Nên làm việc ở công ty Product hay công ty Outsourcing?

Như mình đã đề cập bên trên, việc làm ở công ty sản phẩm sẽ giúp anh em rèn tư duy làm sản phẩm tốt hơn.

Vậy thế nào là tư duy làm sản phẩm? Thực ra thì cũng chẳng có gì khó hiểu cả, rất đơn giản đó là: “tự mình làm và có trách nhiệm với cái mình làm”. Thế thôi !

Đôi khi tư duy làm sản phẩm nó giống như tư duy làm chủ, nghĩa là bạn phải làm chủ cái bạn đang làm, cái bạn đang phát triển.

Người có tư duy sản phẩm là người luôn muốn phát triển các sản phẩm của riêng mình, tự làm nó và đem nó đi bán để đem về lợi nhuận.

Nói chung, làm việc tại một công ty làm sản phẩm bạn sẽ học được tư duy làm sản phẩm từ những người khác. Biết đâu chính tư duy đó sau này sẽ thôi thúc bạn tự phát triển một sản phẩm của riêng bạn thì sao.

#5. Cơ hội lương cao

Đến đây chắc nhiều anh em lại bảo: làm sản phẩm thì lương lấy đâu ra mà cao. Thậm chí làm ở mấy công ty start-up còn không đủ tiền ăn nữa là…

Điều này thì mình cũng không phủ nhận hoàn toàn, vì làm ở các công ty outsource thường sẽ có mức thu nhập khá là ổn định, thậm chí còn nhỉnh hơn các công ty sản phẩm trong những năm đầu.

Nhưng đó chính là cái giá của sự đánh đổi khi bạn xác định đi theo một công ty làm sản phẩm. Lúc đầu có thể lương chẳng đủ ăn, nhưng hãy kiên trì, nếu sản phẩm mà bạn làm ra được người dùng đón nhận thì lúc đó tiền chẳng còn là vấn đề nữa.

Chính vì vậy mình chỉ có thể nói đó là cơ hội mà thôi, làm sản phẩm đôi khi nó mạo hiểm nhưng mọi thứ đều có cái giá của nó. Việc của bạn là cố gắng hết mình thôi !

#6. Lời kết

Thực ra, việc lựa chọn một công ty làm sản phẩm (Product) hay một công ty outsouce còn phụ thuộc vào tính cách của mỗi người nữa.

Có người thích sự ổn định, ngày làm tám tiếng lương 10 triệu. Có người lại thích mạo hiểm, ham học hỏi, dám đánh đổi để lao đầu vào một công ty start-up non trẻ. Vất vả nhưng cơ hội thăng tiến cao, cơ hội giữa kiếm tiền nhiều và ăn mỳ gói qua ngày là như nhau 🙂

Mọi việc đều có cái giá của nó, nếu bạn biết tính toán thì bạn sẽ lời, còn không thì sẽ lỗ thôi. Xin chào và hẹn gặp lại anh em trong các bài viết tiếp theo nha !

Nguyễn Đức Cảnh – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm tìm việc làm it lương cao hấp dẫn trên TopDev

Date & Time trong Python

Date & Time trong Python

Bài viết được sự cho phép của tác giả Nguyễn Chí Thức

Với Python, bạn có thể dễ dàng thu được Date và Time hiện tại. Chương này sẽ giới thiệu một số phương thức được phổ biến trong khi làm việc với Date và Time bởi sử dụng Python.

Lấy Time hiện tại trong Python

Để lấy Time hiện tại, bạn sử dụng hàm tiền định nghĩa localtime(). Hàm localtime() này nhận một tham số là time.time(). Ở đây, time là module, time() là một hàm mà trả về system time hiện tại được biểu diễn dưới dạng số tick (số tích tắc) từ 12:00 am, 1/1/1970. Về cơ bản, tick là một số thực.

import time;
localtime = time.localtime(time.time())
print "Thoi gian hien tai la :", localtime

Kết quả là:

Thoi gian hien tai la : time.struct_time(tm_year=2015, tm_mon=11, tm_mday=29, tm_hour=19, tm_min=16, tm_sec=54, tm_wday=6, tm_yday=333, tm_isdst=0)

Dưới đây là phần giải thích:
Time được trả về là một cấu trúc gồm 9 thuộc tính. Như trong bảng sau:

Thuộc tính Miêu tả
tm_year Trả về năm hiện tại (ví dụ: 2015)
tm_mon Trả về tháng hiện tại (1-12)
tm_mday Trả về ngày hiện tại (1-31)
tm_hour Trả về giờ hiện tại (0-23)
tm_min Trả về phút hiện tại (0-59)
tm_sec Trả về giây hiện tại (0-61 với 60 và 61 là các dây nhuận)
tm_wday Trả về ngày trong tuần (0-6 với 0 là Monday)
tm_yday Trả về ngày trong năm (1-366 kể cả năm nhuận)
tm_isdst Trả về -1, 0 hoặc 1 tức là có xác định DST không

Lấy Time đã được định dạng trong Python
Bạn có thể định dạng bất kỳ time nào theo yêu cầu của bạn, nhưng phương thức đơn giản nhất là asctime(). Đây là một hàm đã được định nghĩa trong time module. Hàm này trả về một time đã được định dạng bao gồm ngày trong tuần, tháng, ngày trong tháng, thời gian và năm. Ví dụ:

import time;

localtime = time.asctime( time.localtime(time.time()) )
print "Thoi gian da duoc dinh dang la :", localtime

Kết quả là:

Thoi gian da duoc dinh dang la : Sun Nov 29 19:16:30 2015
  Date & Time trong Python
Phần 9 : Kết nối MySQL”]

time module trong Python

Có nhiều hàm được định nghĩa sẵn trong time Module mà bạn có thể được sử dụng để làm việc với time.

STT Hàm và Miêu tả
1 Hàm time.altzone trả về offset của DST timezone (số giây)
2 Hàm time.asctime([tupletime]) Chấp nhận một time-tuple và trả về một chuỗi gồm 24 ký tự có thể đọc được ví dụ như Mon Dec 11 18:07:14 2015
3 Hàm time.clock( ) Trả về CPU time hiện tại dưới dạng số giây dạng số thực
4 Hàm time.ctime([secs]) Giống asctime(localtime(secs)) và nếu không có tham số thì giống như asctime( )
5 Hàm time.gmtime([secs]) Chuyển đổi một time được biểu diễn là số giây từ epoch sang một struct_time trong UTC
6 Hàm time.localtime([secs]) Tương tự như gmtime(), nhưng nó chuyển đổi số giây thành local time.
7 Hàm time.mktime(tupletime) Là ngược với hàm localtime(). Trả về một số thực để tương thích với time()
8 Hàm time.sleep(secs) Dừng trình thực thi trong số giây đã cho là secs
9 Hàm time.strftime(fmt[,tupletime]) Chuyển đổi một tuple hoặc struct_time thành một chuỗi được xác định bởi tham số format
10 Hàm time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’) Parse một chuỗi biểu diễn time theo một định dạng đã cho
11 Hàm time.time( ) Trả về time dưới dạng một số thực được diễn đạt bởi số giây từ epoch, trong UTC
12 Hàm time.tzset() Phục hồi các qui ước về thời gian được sử dụng bởi các chương trình con của thư viện. Biến môi trường TZ xác định cách được thực hiện

Có hai thuộc tính quan trọng có sẵn với time Module là:

time.timezone: Thuộc tính time.timezone là số giây trong local timezone (không DST) từ UTC (>0 trong Americas; <=0 trong Europe, Asia, Africa).

time.tzname: Thuộc tính time.tzname là một cặp các chuỗi biểu diễn locale và biểu diễn phụ thuộc, mà tương ứng là tên của local timezone với và không với DST.

  11 tip học Python dành cho các “newbie”

calendar Module trong Python

Python cung cấp calendar Module để giúp bạn hiển thị Calendar. Ví dụ:

import calendar
print "Thang hien tai la:"
cal = calendar.month(2014, 6)
print cal

Kết quả là:

Thang hien tai la:
   November 2015
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Có rất nhiều hàm và phương thức đã được xây dựng sẵn trong calendar Module giúp bạn làm việc với Calendar. Dưới đây là một số hàm và phương thức:

Hàm Miêu tả
Hàm prcal(year) In cả calendar của năm
Hàm firstweekday() Trả về ngày trong tuần đầu tiên. Theo mặc định là 0 mà xác định là Monday
Hàm isleap(year) Trả về true nếu năm đã cho là năm nhuận, nếu không là false
Hàm monthcalendar(year,month) Trả về một list gồm các ngày trong tháng đã cho của năm dưới dạng các tuần
Hàm leapdays(year1,year2) Trả về số ngày nhuận từ năm year1 tới năm year2
Hàm prmonth(year,month) In ra tháng đã cho của năm đã cung cấp

Dưới đây là ví dụ cho một số hàm:

Hàm firstweekday()

import calendar
print calendar.firstweekday()

Kết quả là:

0

Hàm isleap(year)

import calendar
print calendar.isleap(2000)

Kết quả là:

True

Hàm monthcalendar(year,month)

import calendar
print calendar.monthcalendar(2015,11)

Kết quả là:

[[0, 0, 0, 0, 0, 0, 1], [2, 3, 4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29], [30, 0, 0, 0, 0, 0, 0]]

Hàm prmonth(year,month)

import calendar
print calendar.prmonth(2015,11)

Kết quả là:

   November 2015
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
None

Chúc các bạn thành công!

Bài viết gốc được đăng tải tại ucode.vn

Xem thêm việc làm python hấp dẫn trên TopDev

Mobile Developer làm gì? Lộ trình nghề nghiệp Mobile Developer như thế nào?

mobile developer làm gì

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Web Developer và Mobile Developer là hai lĩnh vực đang nhận được sự ủng hộ nhiệt tình từ các bạn trẻ. Đặc biệt, Mobile Developer phát triển ứng dụng trên điện thoại di động vô cùng hot hiện nay. Vậy Mobile Developer là gì? Lộ trình nghề nghiệp Mobile Developer như thế nào? Tất cả các câu hỏi trên sẽ được giải đáp qua những chia sẻ dưới đây.

Mobile Developer là gì?

Để hiểu rõ hơn về Mobile Developer trước tiên cần tìm hiểu Mobile Developer là gì? Đây là một thuật ngữ chuyên môn để chỉ những lập trình viên phát triển ứng dụng trên thiết bị di động. Và các ứng dụng này sẽ được người dùng download hoặc mua về từ Google Play hoặc App Store. Công việc chủ yếu của Mobile Developer chính là xây dựng, thiết kế và tạo lập các ứng dụng, phần mềm chạy trên điện thoại hoặc máy tính bảng.

Mobile Developer làm gì? Lộ trình nghề nghiệp Mobile Developer như thế nào?

Lộ trình của một Mobile Developer sẽ như thế nào?

Mobile Developer hay còn có tên gọi khác là chuyên viên phát triển ứng dụng di động. Để có thể làm tốt công việc, người này không chỉ cần có trình độ kiến thức chuyên môn về lập trình mà cần phải tinh tế, biết nắm bắt thị hiếu người dùng trong giai đoạn hiện tại. Ngôn ngữ làm việc của Mobile Developer phổ biến nhất chính là Java, Swift và Objective-C. Và các ngôn ngữ này hoàn toàn phù hợp với Android, iOS, Windows Phone.

Việc làm Mobile Developer hấp dẫn trên TopDev

Mô tả công việc của Mobile Developer bao gồm:

    • Quản lý các dự án liên quan đến tạo lập và phát triển ứng dụng trên thiết bị di động
    • Tiếp nhận, chuyển giao công nghệ đối với các ứng dụng thiết bị
    • Nâng cấp, hoàn thiện và mở rộng các tính năng trên thiết bị di động
    • Nghiên cứu các công nghệ mới, ứng dụng vào lập trình thiết bị di động
    • Thực hiện các công việc được phân công trực tiếp từ cấp quản lí

Lộ trình để nghề nghiệp Mobile Developer như thế nào?

Để có thể trở thành một Mobile Developer trước khi bước bên cấp chuyên nghiệp cần bắt đầu từ những kiến thức căn bản. Người lập trình phải từng bước rèn luyện thêm nhiều kỹ năng, chủ động tư duy phát triển và tìm tòi thêm nhiều điều mới lạ về lĩnh vực này.

    • Thi tuyển vào trường chuyên môn về công nghệ thông tin: Đây là bước đầu tiên để có thể tiếp cận với môi trường kiến thức chuyên môn. Mặc dù bằng cấp không quá cần thiết tuy nhiên, nếu tốt nghiệp từ các trường Công nghệ thông tin sẽ là một lợi thế. Trường đại học sẽ là nơi đào tạo bày bản những kiến thức từ căn bản đến chuyên môn.
    • Chọn chuyên môn: Hiện nay, Mobile Developer phát triển trên các nền tảng chính là Android, Apple, Windows, Symbian và RIM (Blackberry). Người học mặc dù có thể học để lập trình trên tất cả các hệ điều hành. Tuy nhiên, để có thể tập trung vào một chuyên môn nhất định, hãy chọn riêng một chuyên môn để chuyên sâu. Hiện nay, Android và Apple là hai thị trường phát triển hàng đầu, đây sẽ là lĩnh vực rộng mở cho bất kỳ ai.

 

  5 tips cải tiến chất lượng phát triển Mobile App
  7 Tip tăng tương tác hiệu quả trên mobile
    • Tận dụng các chương trình phát triển Online: Trên các hệ điều này sẽ cung cấp các video hướng dẫn việc viết code. Ví dụ như Apple cung cấp iOS Dev Center còn Android có một trang web Android Developers Training để chuyên viên lập trình có thể học và tập sự. Bên cạnh đó, người học cũng có thể tìm hiểu thêm trên các nguồn khác hoặc săn những lớp học miễn phí.
    • Có thể đăng ký thêm lớp học về Marketing: Tưởng chừng không mấy liên quan nhưng thật chất các lớp học về Marketing rất thiết thực và cần thiết đối với Mobile Developer. Nếu muốn tự phát triển ứng dụng, lập trình viên cần có kỹ năng tự tiếp thị cho ứng dụng lập trình của mình.
    • Phát triển ứng dụng của riêng mình: Để có thể trở thành một phần của các công ty Công nghệ thông tin có tiếng, trước tiên cần phát triển riêng cho bản thân một ứng dụng. Có thể coi đây như cách vận dụng, thực hành những kiến thức và kỹ năng được học trên lớp. Và nếu có thể tư phát triển ứng dụng sẽ là một trong những điểm sáng trong tất cả các ứng cử viên.
    • Tập đưa ra ý tưởng cho các ứng dụng: Đưa ra ý tưởng cho các ứng dụng chính là bước tư duy để tìm ra những nhu cầu dịch vụ mới của khách hàng. Làm thế  nào để cho thể tạo ra một ứng dụng di động phù hợp với thị hiếu sử dụng của mọi người? Làm thế nào để ứng dụng của bản thân được đánh giá cao?… Đây đều là câu hỏi mà các Mobile Developer cần trả lời.
    • Tập trung vào tính thiết thực của ứng dụng di động: Nhiều người khi phát triển ứng dụng di động thường chỉ tập trung vào độ mới mẻ mà quên mất đi khả năng ứng dụng của app. Hãy thiết kế ra các ứng dụng di động có khả năng sử dụng cao, thiết thực với đời sống hằng ngày. Đặc biệt, các app này nên đơn giản hóa đến mức tối đa. Vì người dùng thường không thích những gì rắc rối.

Vậy là các bạn đọc đã phần nào hiểu được về Mobile Developer cũng như con đường của một Mobile Developer chuyên nghiệp. Hy vọng những chia sẻ trên đây có thể giúp ích cho những bạn đang hành trang trên con đường lập trình viên ứng dụng di động.

Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com

Có thể bạn quan tâm:

Freelancer Developer – được gì và mất gì?

Freelancer Developer – được gì và mất gì?

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Gần đây có một số bạn có hỏi mình một số câu hỏi về Freelancer Developer đại loại như sau:

  • Làm Freelancer Developer thì có giàu không anh?. So ez
  • Em work from home làm Freelancer luôn được không?
  • Có khó không anh, tiếng anh của em hơi yếu thì sao?

Chính vì vậy, một chút ít kinh nghiệm làm việc Freelancer. Mình chia sẻ một vài suy nghĩ về Freelancer Developer. Anh em có gì thắc mắc cứ comment nha. Đừng ném đá nha!

  Freelancer IT là gì? Những điều thú vị về Freelancer lập trình
  Freelancer IT liệu có tồn tại sự tự do trong nghề?

1. Cần gì ở một Freelancer ngành IT?

Đầu tiên, rõ ràng mà nói thì không phải ai cũng trở thành freelancer được. Trước khi muốn trở thành một freelancer, bạn cần có một số điều kiện sau:

  • Có trình độ chuyên môn, kinh nghiệm làm việc các dự án thực tế.
  • Có khả năng giao tiếp với khách hàng (Tiếng Anh hoặc một ngôn ngữ khác).
  • Freelancer đòi hỏi sự tổng hợp của nhiều kĩ năng.

Rõ ràng mà nói, yêu cầu đầu tiên và cũng là tiên quyết của một Freelancer. Trước khi bắt đầu làm việc, cần có một quá trình làm việc để tăng kinh nghiệm của bản thân.

Hầu hết các trang freelancer đều có một quá trình kiểm tra trình độ khá gắt. Nếu không thể thực hiện các bài test, họ sẽ yêu cầu rất nhiều thông tin khác để xác thực kĩ năng của bạn. Một số hình thức phổ biến là

  • Review từ khách hàng, đánh giá từ sếp của bạn.
  • Các bài test chuyên môn về ngôn ngữ.
  • Profile từ các trang uy tín như linkedin.

Freelancer Developer – được gì và mất gì?
Trả tiền cho những gì mình biết – Biết nhiều sẽ trả tiền nhiều – Không biết thì không trả tiền. Trở thành Freelancer đôi khi không dễ dàng như nhiều bạn tưởng.

Chính vì vậy, không nên bắt đầu khi chưa có một số kinh nghiệm nhất định (về một số ngôn ngữ, một số framework, …).

Thứ hai, việc trở thành freelancer cũng đòi hỏi có khả năng giao tiếp tốt (Tiếng Anh). Do hầu hết các khách hàng tới từ các quốc gia nói tiếng anh. Trường hợp như mình làm việc cho các khách hàng Singapore hay Ấn độ cũng đều sử dụng tiếng anh.

2. Thu nhập khá nhưng phục thuộc vào may mắn

Trước tiên, một số ngôn ngữ sau đây hiện đang rất được săn đón, cũng là đang hot để trở thành một Freelancer Developer đít thịt. Ý lộn, đích thực:

Đúng vậy, nếu may mắn gặp đúng khách hàng với các dự án long-term. Bạn hoàn toàn có thể có cho mình những dự án longterm. Con số kiếm được có thể lên đến cả tỷ đồng.

Tiền, tất nhiên là nghề lập trình viên không hề nghèo

Không hề điêu. Một số bạn đã có thu nhập hơn 10 tỷ đông (500.000$) từ các dự án long-term làm theo giờ. Để có các dự án long-term và ngon lành, đòi hỏi kỹ năng tốt và một chút “may mắn”.


Một số dự án trên Truelancer.com có giá trị lớn hơn 500$. Một con số đáng để dành thời gian làm việc hàng ngày. Chỉ trường hợp có quá nhiều thời gian nhàn rỗi mình mới bid những dự án dưới 500$.

Nhìn thì tuyệt, con số không bé (10$/15 phút). Tuy nhiên, để liên tục có người thuê trở thành mentor đòi hỏi phải liên tục cập nhật kiến thức.

Tuy nhiên, nếu không siêng năng không phải lúc nào cũng có sẵn công việc để làm. Việc trở thành Fulltime freelancer developer đòi hỏi phải đánh đổi nhiều thứ. Riêng mình thì chỉ là Part-time freelancer.

Freelancer Developer – được gì và mất gì?
Thu nhập từ Freelancer đôi khi cũng khá hấp dẫn (10$/15 phút). Mình tính để cao hơn là 15$. Tuy nhiên 15-20$ cho 15 phút đòi hỏi kinh nghiệm ít nhất 6 năm.

Ngoài ra, trở thành FullTime Freelancer cũng gây áp lực về mặt tài chính khi không có jobs để bid, để làm. Đôi lúc sẽ đói nhăn răng hoặc nhàn hạ trong cả 2,3 tuần. Mà “nhàn cư thì vi bất thiện”.

Chính vì vậy, một số bạn lựa chọn cách an toàn hơn. Vừa làm việc ở công ty (có thu nhập cố định hàng tháng), kèm theo đó sẽ làm part-time freelancer để lấy thêm kinh nghiệm, …

3. Học hỏi mới là thứ quan trọng

Trở thành Freelancer Developer cũng đồng nghĩa với việc bạn phải luyện tập nhiều hơn. Từ cách giao tiếp với khách hàng cho tới kĩ năng chuyên môn.

Đầu tiên, các freelancer có xu hướng được thuê nhiều nhất là FullStack. Việc trở thành FullStack Developer đòi hỏi một quá trình dài học hỏi, tìm tòi.

Nói vậy không có nghĩa rằng các freelancer chuyên một kĩ thuật nào đó không được thuê. Dưới đây là profile của một anh trên Upwork. Cái title thôi đã thấy ngầu lòi (Only web scraping, nothing else).

Freelancer Developer – được gì và mất gì?
Title rất “ngầu lòi” – Chỉ chuyên một technoly nhất định không phải không tốt. Nhưng đó nên là thứ được nhiều người yêu cầu.

Việc chỉ tập trung chuyên môn hay theo hướng FullStack đều là do bản thân lựa chọn. Tuy nhiên, với mỗi dự án trải qua, các bạn sẽ tích lũy được rất rất nhiều kinh nghiệm.

  • Hầu hết các dự án freelancer là project thực tế -> biết được công nghệ đó sử dụng thực tế như thế nào?
  • Tìm hiểu các công nghệ mới nếu được khách hàng yêu cầu

4. Trải nghiệm tuyệt vời khi trở thành Freelancer Developer

Trở thành Freelancer developer giúp bạn có nhiều cơ hội khẳng định mình. Làm việc với nhiều khách hàng tới từ nhiều quốc gia.

Đặc biệt, vô cùng sướng khi luyện tiếng anh với các khách hàng. Ngoài ra, việc trở thành freelancer developer cũng giúp rèn luyện thêm các kĩ năng mềm khác như:

  • Kỹ năng thương thuyết với khách hàng.
  • Kỹ năng làm việc nhóm đa quốc gia. (nếu có team dev)
  • Kỹ năng trình bày và giải thích vấn đề. Nếu làm freelancer code mentor.

Ôi, viết tới đây là cạn cmn lời luôn rồi. Anh em nào có nhu cầu trở thành Freelancer, hoặc có câu hỏi gì có thể like page rồi contact qua page cho mình nha.

Cảm ơn anh em đã đọc bài – CHÀO THÂN ÁI VÀ QUYẾT THẮNG!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Tìm việc Developer hấp dẫn trên TopDev

Hướng dẫn cấu hình SPF và DKIM cho mail server để xác thực hợp lệ tránh vào spam

Hướng dẫn cấu hình SPF và DKIM cho mail server để xác thực hợp lệ tránh vào spam

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Hiện nay một số nhà cung cấp dịch vụ mail như Gmail, Hotmail … thường kiểm tra hai bản ghi là SPF( SPF Record – Sender Policy Framework) và DKIM( DomainKeys Identified Mail) giảm bớt việc spam mail. Dù không chắc chắn 100% sau khi bạn làm đúng thì thư của bạn sẽ được các nhà cung cấp dịch vụ mail tự động lọc thư cho vào Inbox nhưng mình cùng có hướng dẫn cách để tăng khả năng tránh vào spam nhất có thể.

  Lấy email từ bình luận của bài viết trong Facebook
  Bí quyết phát triển hoạt động nhân sự qua email (Email Marketing) hiệu quả - Bạn đã biết?

1. Yêu cầu nền tảng:

2. Các bước cài đặt SPF Record và DKIM

1. Thêm SPF Record vào DNS:

  • Bước 1: Vào phần quản lý DNS của Domain
  • Bước 2: Thêm bản ghi mới:
    • Kiểu( Record Type): TXT
    • Địa chỉ( Address): v=spf1 a mx ip4:123.123.123.123 mx:example.com ?all

spf

2. Cài đặt DKIM và thêm DNS cho DKIM

Mình đang sử dụng Centos 7 nếu sử dụng phiên bản khác thì có thể câu lệnh start hoặc restart có thể khác đôi chút nhé.

1. Đầu tiên nên cập nhật Centos mới nhất nhé

yum update

2. Do openDKIM lưu thông tin cài đặt trên gói EPEL cho nên chúng ta cần cập nhật lại gói này.

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

3. Cài đặt Opendkim.

yum install -y opendkim 

4. Cấu hình cho opendkim

Lưu ý là bản cài đặt DKIM mình áp dụng cho multi domain nhé nếu sử dụng 1 domain thì bỏ đi cấu hình domain thứ 2 là OK!

Cấu hình Dkim: /etc/opendkim.conf

# Lưu ý chỉ cần chỉnh sửa các dòng sau còn lại thì comment
PidFile	/var/run/opendkim/opendkim.pid
Mode	sv
Syslog	yes
SyslogSuccess	yes
LogWhy	yes
UserID	opendkim:opendkim
Socket	inet:8891@127.0.0.1
Umask	002
SendReports	yes
SoftwareHeader	yes
Canonicalization	relaxed/simple
Domain	lcdung.top
Selector	default
MinimumKeyBits	1024
KeyTable	/etc/opendkim/KeyTable
SigningTable	refile:/etc/opendkim/SigningTable
ExternalIgnoreList	refile:/etc/opendkim/TrustedHosts
InternalHosts	refile:/etc/opendkim/TrustedHosts
OversignHeaders	From

Cấu hình KeyTable: /etc/opendkim/KeyTable

# Cấu hình cho domain mặc định sử dụng DKIM
default._domainkey.lcdung.top lcdung.top:default:/etc/opendkim/keys/default.private
# Cấu hình cho domain thứ 2 sử dụng DKIM
mail._domainkey.luxor.vn luxor.vn:mail:/etc/opendkim/keys/mail.private

Cấu hình SigningTable: /etc/opendkim/SigningTable

# Cấu hình cho domain mặc định
*@lcdung.top default._domainkey.lcdung.top
# Cấu hình cho domain thứ 2
*@luxor.vn mail._domainkey.luxor.vn

Cấu hình TrustedHosts: /etc/opendkim/TrustedHosts

127.0.0.1
::1
#host.example.com
#192.168.1.0/24
# Danh sách domain
*.lcdung.top
*.luxor.vn

Tạo khoá công khai và khoá bí mật.

# Tạo khóa mặc định dành cho domain mặc định là default.private và default.txt
opendkim-default-keygen

# Tạo khóa cho doamin thứ 2 với tên là mail.private và mail.txt
opendkim-genkey -s mail -d luxor.vn

# hoặc dùng lệnh này
opendkim-genkey -D /etc/opendkim/keys/ -d luxor.vn -s mail

Tạo quyền cho khóa để Postfix có thể truy cập đọc được

chown opendkim:opendkim mail.private

Lúc này bạn sẽ có 1 file .private và 1 file .txt. Mở file .txt để lấy thông tin khóa cấu hình trên DNS:

mail._domainkey	IN	TXT	( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGXwAE5jkB63eFI4VqkmODluyTTgRe/PdnqJoD9h9kLDwY081bxATuu78NAJm8R+fJ15gMWKgkpVVXcvV5I9rosSK6wwDonStfQIgiq4nEmbSxbuGYNnbmG3R2/1q9klQ7Lih/Kpaokv+53Wv82y3qBMWbqjQIDAQAB" )  ; 

Và bạn cấu hình DNS như sau:

spf

Tiếp theo cấu hình Postfix nhận openDKIM.

File: /etc/postfix/main.cf

Thêm đoạn mã sau ở cuối file cấu hình

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

Cuối cùng khởi động lại service Postfix và Opendkim

systemctl start opendkim; 
systemctl enable opendkim; 
systemctl restart postfix;

3. Kiểm tra lại SPF và DKIM:

Kiểm tra port 25 sau khi setup thành công:

  • Link kiểm tra: https://www.port25.com/authentication-checker/
  • Tạo email gửi tới: check-auth@verifier.port25.com
  • Sau đó bạn sẽ nhận 1 mail phẩn hồi thông tin port 25 cần nâng cấp thêm những gì.Trước khi cài SPF và DKIMSau khi cài đặt thành công

Chúc các bạn thành công nhé!

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm Jobs Developer hấp dẫn trên TopDev

Vuejs NextTick là gì? – sử dụng khi nào?

Vuejs NextTick là gì? – sử dụng khi nào?

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Nay rảnh rỗi lướt Medium thấy có bài viết rất hay về Vuejs NextTick. Tiện đang code project trên công ty bằng Vuejs. Vietsub luôn cho anh em cùng tìm hiểu, trao đổi.

Năm nay dự là Vuejs hot khỏi bàn rồi. Bỏ xa AngularJs với đe dọa ngôi vương của ReactJs sớm thôi.

Vuejs năm nay dự rất HOT. Nhiều sao lắm rồi. Anh em nên “try hard” học thử

Thật sự thì Vuejs NextTick là gì?. Lúc nào nên sử dụng NextTick?. Có khác biệt gì với setTimeout hay setImmediate không?

Tuốt tuồn tuột được giải thích qua bài viết dưới đây.

  Call API trong VueJS theo cách thông minh nhất
  Những Vuejs concept bắt buộc phải nắm vững – Phần 1

1. Khái niệm

Theo như tài liệu ở trang chủ của Vuejs thì NextTick sinh ra để làm hai việc sau:

Defer the callback to be executed after the next DOM update cycle

Định nghĩa một function callback thực thi sau khi DOM kết thúc một cycle update.

Bạn nào chưa biết hoặc chưa nắm rõ về DOM (Document Object Model) có thể tham khảo qua bài viết – Browser đã render website như thế nào?. Hứa là đọc phát hiểu ngay DOM là cái vẹo gì?.

Ngoài ra, NextTick còn có thể được sử dụng để gọi ngay tức thời khi “vừa mới cập nhật data, nhưng chưa phản ánh thay đổi đó lên DOM

Use it immediately after you’ve changed some data to wait for the DOM update

Sử dụng ngay tức thời sau khi vừa thay đổi data, đang chờ để cập nhật lên DOM

2. Ví dụ

// Cú pháp đơn giản, callback function và context truyền vào.
Vue.nextTick([callback, context])

Vuejs NextTick cũng được sử dụng bất đồng bộ.

// Edit data in here
vm.msg = 'Hello'
// Data is change, but the DOM not updated
Vue.nextTick(function () {
// DOM updated
}

Promise, Async và Await sử dụng như sau:

// Promise with async await
Vue.nextTick()
.then(function () {
// DOM updated
})

Ờ, thì cũng hiểu sơ sơ rồi đấy. Nhưng mà sinh ra cái NextTick() này làm chi vậy?.

Đây, có ngay đây

3. Tại sao lại cần Vuejs NextTick?

3.1 Function đầu tiên sử dụng nextTick()

Xin lỗi, hình hơi nhỏ nhưng vẫn thấy mượt mà, không hề delay. Đây là có sử dụng NextTick. Tí xem ví dụ phía dưới sẽ không sử dụng. Khác ngay.

vuejs nexttickNguồn / Source: Medium What’s Vue.NextTick
// Create a directory
async handleFiles(fileList: FileList): Promise<void[]> {
// Việc gán giá trị cho cờ này chỉ được thực hiện sau khi các Promise được hoàn tất
this.isFileUploaded = true; 

// console.log(this.isFileUploaded) // true
await this.$nextTick(); 

const directory = await carfsModule.setupSubDirectory();
...
}

Đối với function UI upload image ở gif 1 có thể dễ thấy

  • Khi người dùng click button upload, function handleFiles được gọi để thực thi
  • Promise function này thực hiện tạo folder, upload files. Công việc upload tất nhiên là bất đồng bộ.
  • Giá trị isFileUploaded được thay đổi giá trị để bắt sự kiện (trigger) người dùng click button upload. Trông có vẻ khá mượt mà.

3.2 Implement thứ hai không sử dụng nextTick()

Má, cái hình nhỏ dữ cha. Chiu, giờ nó thế, biết sao được. Nhưng mà thấy điểm khác giữa cái một với cái số hai chưa?

vuejs nexttickNguồn / Source: Medium What’s Vue.NextTick
  • Khi người dùng ấn button upload, UI trông như bị treo (frozen)
  • Nguyên nhân là khi click button upload, giá trị this.isFileUploaded chưa hề được thay đổi -> UI không có thay đổi.
  • Tệ về mặt UX (User Experience) – người dùng không biết đã thực hiện hay chưa?

Đầu tiên, khi gặp vấn đề này, hầu hết để chọn cách gán giá trị cho isFileUploaded trước khi gọi createDirectory. Nhưng sự đời trớ trêu thay, không được thế.

  // Việc gán giá trị cho cờ này chỉ được thực hiện sau khi các Promise được hoàn tất
this.isFileUploaded = true; 

// console.log(this.isFileUploaded) // false
const directory = await carfsModule.setupSubDirectory();

Nếu không có nextTick, giá trị isFileUploaded không hề thay đổi thành true -> không có cập nhật ở UI.

À, ra là thế!. Hiểu rồi ba ơi, giờ lúc nào cần cập nhật gì đó tạm tạm thì dùng Vuejs NextTick. Trường hợp đang xử lý bất đồng bộ muốn cập nhật giá trị gì gì tạm thời thì NextTick là perfect, còn không thì thôi, đừng lạm dụng mất hay.

4. Độ ưu tiên – priority

// 
setTimeout(() => {
console.log('timeout');
}, 0);

Promise.resolve().then(() => console.log('promise'));

console.log('helloworld3');

process.nextTick(() => {
console.log('nextTick');
});

console.log('helloworld5');

Output khi run đây:

helloworld3
helloworld5
nextTick
promise
timeout

Cứ in ra console là biết ông nào được ưu tiên nhiều hơn. Ở đây, ông Vuejs NextTick lúc nào cũng ưu tiên chạy trước. Bất kể là gọi ổng ở đâu trong function.

Anh em cần nhớ vì trong những đoạn code xử lý bất đồng bộ phức tạp. Nếu không biết thứ tự thực hiện nhiều khi rất là rối. Có bug cũng chẳng biết kiếm ở đâu, giải quyết thế nào?.

5. Kết luận – tham khảo

Qua bài viết này mong anh em hiểu hơn về NextTick trong Vuejs. Biết sơ nhớ tạm công dụng mục đích cũng tốt. Sau này dev có việc gì cần sẽ biết cách research.

Cảm ơn anh em đã đọc bài, nhớ like và share Facebook page nha.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Giới thiệu công cụ kiểm thử tự động Selenium

Giới thiệu công cụ kiểm thử tự động Selenium

Bài viết được sự cho phép của vntesters.com

Như các bạn đã biết, Selenium là một trong những công cụ kiểm thử phần mềm tự động mã nguồn mở (open source test automation tool) mạnh mẽ nhất hiện nay cho việc kiểm thử ứng dụng Web. Selenium script có thể chạy được trên hầu hết các trình duyệt như IE, Mozilla FireFox, Chrome, Safari, Opera; và hầu hết các hệ điều hành như Windows, Mac, Linux.

Trong loạt bài viết về Selenium, mình sẽ giới thiệu công cụ kiểm thử tự động Selenium ở mức cơ bản dành cho những bạn lần đầu đến với công cụ Selenium này dựa trên những kinh nghiệm mà bản thân mình đã trải qua.

Giới thiệu công cụ kiểm thử tự động Selenium

Đầu tiên, Selenium là một nguyên tố hóa học với số nguyên tử 34 và ký hiệu hóa học Se. Nó là một phi kim, về mặt hóa học rất giống với lưu huỳnh. Từ Selenium xuất phát từ tiếng hy lạp “selene”, có nghĩa là mặt trăng. Cách đặt tên trên có liên quan đến sự phản quang của Selenium được nhân lên khoảng 1000 lần khi Selenium được đưa từ bóng tối ra ánh sáng mặt trời….

Hi… Just joking…..

Selenium

Selenium là một công cụ kiểm thử phần mềm tự động, được phát triển bởi ThoughtWorks từ năm 2004 với tên ban đầu là JavaScriptTestRunner. Đến năm 2007, tác giả Jason Huggins rời ThoughtWorks và gia nhập Selenium team, một phần của Google và phát triển thành Selenium như hiện nay.

Về cấu trúc thì Selenium có 4 phần

  • Selenium IDE
  • Selenium RC (Selenium 1 – Selenium Remote Control)
  • Selenium Gird
  • Selenium WebDriver (Selenium 2)

Selenium Suite

Selenium IDE (Integrated Development Environment) là một công cụ cho phép chúng ta Record/Playback một test script. Đây là một add-on hỗ trợ cho FireFox. Chúng ta chỉ có thể Record trên trình duyệt FireFox, nhưng bù lại, chúng ta có thể Playback trên các trình duyện khác như là IE, Chrome….

Selenium Gird là một hệ thống hỗ trợ người dùng thực thi test script trên nhiều trình duyệt một cách song song mà không cần phải chỉnh sửa test script.

Selenium RC, Selenium WebDriver là một thư viện cho phép chúng ta lập trình (scripting) test script trên các ngôn ngữ lập trình khác nhau như Python, Java, C#, Ruby.

Các đặc điểm của Selenium

  1. Mã nguồn mở. Phải nói điểm này là điểm mạnh nhất của Selenium khi so sánh với các test tool khác. Vì là mã nguồn mở nên chúng ta có thể sử dụng mà không phải lo lắng về phí bản quyền hay thời hạn sử dụng.
  2. Cộng đồng hỗ trợ. Vì là mã nguồn mở nên Selenium có một cộng đồng hỗ trợ khá mạnh mẽ. Bên cạnh đó, Google là nơi phát triển Selenium nên chúng ta hoàn toàn có thể yên tâm về sự hổ trợ miễn phí khi có vấn đề về Selenium. Tuy nhiên, đây cũng là một điểm yếu của Selenium. Cơ bản vì là hàng miễn phí, cộng đồng lại đông nên một vấn đề có thể nhiều giải pháp, và có thể một số giải pháp là không hữu ích. Mặc khác, chúng ta không thể hối thúc hay ra deadline cho sự hỗ trợ.
  3. Selenium hỗ trợ nhiều ngôn ngữ lập trình.
  4. Selenium hỗ trợ chạy trên nhiều OS khác nhau với mức độ chỉnh sửa script hầu như là không có. Thực sự thì điều này phụ thuộc phần lớn vào khả năng viết script của chúng ta.
  5. Chạy test case ở backround. Khi chúng ta thực thi một test scrpit, chúng ta hoàn toàn có thể làm việc khác trên cùng một PC. Điều này hỗ trợ chúng ta không cần tốn quá nhiều tài nguyên máy móc khi chạy test script.
  6. Không hỗ trợ Win app. Selenium thực sự chỉ hỗ trợ chúng ta tương tác với Browser mà không hỗ trợ chúng ta làm việc với các Win app, kể cả Win dialog như Download/Upload – ngoại trừ Browser Alarm. Vậy nên, để xử lý các trường hợp cần tương tác với hệ thống hay một app thứ ba, chúng ta cần một hay nhiều thư viện khác như AutoIt hay Coded UI.

Bài viết gốc được đăng tải tại vntesters.com

Kiến thức kiểm thử phần mềm cho người mới bắt đầu

Kiến thức kiểm thử phần mềm cho người mới bắt đầu

Bài viết được sự cho phép của vntesters.com

Kiểm thử là một thành phần chính của phát triển phần mềm để đảm bảo độ tin cậy và chất lượng của phần mềm. Lĩnh vực này rất rộng lớn với rất nhiều cơ hội cho cả kỹ sư kiểm thử có và chưa có kinh nghiệm. Để trở thành một kỹ sư kiểm thử bạn nên thành thạo với các khái niệm và thuật ngữ khác nhau của kiểm thử. Bên cạnh đó, bạn cần phải có kỹ năng nhất định và kiên trì để thành công trong lĩnh vực này. Dưới đây là một số trong những khía cạnh quan trọng của kiểm thử phần mềm cho người mới bắt đầu.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  5 xu hướng của ngành kiểm thử tự động trong năm 2024

Software Testing

Software Testing

Trước khi bạn “thí mạng” vào nghề kiểm thử phần mềm.

Đối với những người có một nền tảng về lĩnh vực CNTT, không có nhiều khó khăn vì bạn đã biết các thuật ngữ kỹ thuật và các thuật ngữ khác nhau, mặc dù sẽ là tốt hơn nếu bạn có thể tham gia một khóa học về kiểm thử phần mềm để có được một kiến thức chuyên sâu về các khái niệm. Tuy nhiên, những người không có một nền tảng kỹ thuật vững chắc, thực sự có thể khá khó khăn cho họ để hiểu những thuật ngữ có liên quan.

Lĩnh vực khoa học máy tính và công nghệ phần mềm là rất lớn, bạn phải đi qua những điều cơ bản để giúp bạn bắt đầu. Tìm hiểu về các thuật ngữ khác nhau được sử dụng trong công nghệ phần mềm và các lĩnh vực lập trình. Làm quen với thuật ngữ kỹ thuật khác nhau như, phần mềm, hướng dẫn, chương trình, thực thi, lỗi, phát triển và chu kỳ thử nghiệm.v.v sẽ giúp bạn có được đủ động lực để làm việc trong lĩnh vực kiểm thử. Bạn cũng sẽ nhận được một tổng quan về các phương pháp phát triển khác nhau như mô hình thác nước, mô hình xoắn ốc .v.v

Sau khi bạn hoàn thành bước đầu tiên, bắt đầu đọc một số cuốn sách về các khái niệm khác nhau và các nguyên tắc cơ bản của thủ tục kiểm thử và làm thế nào để đưa chúng vào thực tế. Hiểu các loại kiểm thử, chiến lược, phương pháp .v.v Mặc dù hầu hết các định nghĩa / thuật ngữ rất đơn giản và khá dễ dàng để giải thích, bạn nên cố gắng tạo ra một thư mục định nghĩa nhỏ, nó sẽ có ích cho bạn bất cứ lúc nào bạn cần. Việc tham gia vào một lớp đào tạo bài bản sẽ giúp bạn có được một sự hiểu biết tốt hơn về các phương pháp kiểm thử. Bạn sẽ có đủ kiến thức để có thể được thăng tiến nhanh trong lĩnh vực kiểm thử phần mềm.

Tổng quan về kiểm thử phần mềm

Là một kỹ sư kiểm thử phần mềm, bạn cần phải thiết kế trường hợp kiểm thử, các kịch bản và thực hiện chúng để đánh giá kết quả của những phương pháp kiểm thử khác nhau. Bạn cần phải biết trường hợp kiểm thử là gì, mục tiêu của kiểm thử, các phương pháp kiểm thử, mức độ kiểm thử, và các phương pháp tiếp cận… Chúng ta hãy cố gắng hiểu từng khái niệm một.

Mục tiêu (objective): Để kiểm tra xem phần mềm đáp ứng nhu cầu của khách hàng và phù hợp với các đặc tả và đảm bảo chất lượng và tính chính xác của ứng dụng.

Phương pháp kiểm thử (Testing Methods): Có hai phương pháp phổ biến của kiểm thử phần mềm – kiểm tra hộp trắng và kiểm tra hộp đen. Trong kiểm thử hộp màu trắng, cấu trúc mã hoặc thuật toán của chương trình được đưa vào xem xét. Các trường hợp kiểm thử được thiết kế dựa vào cấu trúc mã hoặc cách thức làm việc của chương trình, trong khi đó kiểm thử hộp đen không yêu cầu kỹ sư kiểm thử cần phải có bất kỳ kiến thức về mã hoặc thuật toán của chương trình. Nó kiểm tra các chức năng của hệ thống tức là những gì hệ thống được cho là cần phải làm dựa trên các đặc tả. Các trường hợp kiểm thử thường được xây dựng xung quanh đó.

Mức độ kiểm thử (Testing Levels): được phân loại thành ba loại: kiểm thử đơn vị (unit testing), kiểm thử tích hợp (integration testing) và kiểm thử hệ thống (system testing). Trong kiểm thử đơn vị các đơn vị khác nhau hoặc các thành phần của ứng dụng đang được kiểm thử để kiểm tra các chức năng của các đoạn mã. Trong kiểm thử tích hợp, việc kiểm thử được thực hiện bằng cách tích hợp các mô-đun khác nhau, trong khi đó trong kiểm thử hệ thống toàn bộ hệ thống được kiểm thử cả về chức năng và yêu cầu hệ thống để kiểm tra hành vi của hệ thống ở các cấp độ khác nhau.

Phương pháp tiếp cận kiểm thử  (Testing Approach): Nó có hai loại, phương pháp tiếp cận từ trên xuống và từ dưới lên. Trong phương pháp tiếp cận từ trên xuống, các thành phần cấp cao nhất được kiểm thử đầu tiên đi xa hơn xuống các cấp thấp hơn, trong khi ở dưới lên tiếp cận các thành phần thấp nhất được thử nghiệm đầu tiên tiến dần tới mức cao hơn

Trường hợp kiểm thử (Test Case): Một trường hợp kiểm thử là một tập hợp các điều kiện được sử dụng để xác định xem một ứng dụng đang làm việc tốt hay không. Trường hợp kiểm thử có thể là tích cực hay tiêu cực. Trường hợp kiểm thử tích cực được thiết kế để kiểm tra xem ứng dụng có hoạt động như cách mà nó được dự kiến sẽ hoạt động hay không, trong khi các trường hợp kiểm thử tiêu cực được thiết kế để kiểm tra cách hệ thống phản ứng với chuỗi bất thường của các hành động hoặc giá trị bất ngờ. Một yêu cầu kiểm thử trong một ứng dụng phải có ít nhất hai trường hợp kiểm thử nghiệm – một tích cực và một tiêu cực.

Làm thế nào để trở thành một kỹ sư kiểm thử giỏi

  • Mở rộng kiến thức và sự hiểu biết của bạn về lĩnh vực này, chiều sâu tư duy và sáng tạo.
  • Đảm bảo rằng tất cả các vấn đề được xác định và xử lý trong giai đoạn đầu để tiết kiệm thời gian.
  • Phát triển kỹ năng phân tích và kỹ thuật của bạn, và cố gắng tìm hiểu những mẹo và thủ thuật mới giúp bạn nổi bật trong đám đông.
  • Kiểm tra các hệ thống để tìm ra càng nhiều lỗi, cho kết quả tốt nhất. Cải tiến quy trình bằng cách đưa ra các đề xuất.
  • Bạn cần phải có kỹ năng ngoại giao tuyệt vời và duy trì tốt các mối quan hệ với các kỹ sư lập trình. Mục đích chính là để phát triển một sản phẩm chất lượng.
  • Tìm kiếm lỗi trong một hệ thống đòi hỏi phải có sự tò mò, một con mắt phê phán, giao tiếp tốt với đội ngũ phát triển, và kinh nghiệm.
  • Nếu công việc không chạy, khắc phục sự cố để tìm hiểu lý do. Điều này sẽ phát triển sự tự tin của bạn và giúp bạn tiến về phía trước trong sự nghiệp của bạn.
  • Phát triển kỹ năng giao tiếp của bạn và lịch thiệp. Báo cáo các lỗi cho kỹ sư lập trình một cách xây dựng.
  • Học cách làm việc độc lập. Điều này sẽ giúp bạn có hiệu quả hơn trong việc phát hiện lỗi.
  • Hãy tổ chức và duy trì các tập tin và tài liệu của bạn để ghi lại những phát hiện của bạn.
  • Cập nhật những công cụ kiểm thử và kỹ thuật mới nhất.
  • Học từ những sai lầm của bạn để bạn không lặp lại chúng trong tương lai.

Mẹo và thủ thuật cho các bạn mới bắt đầu

  • Bạn cần phải nắm rõ các đặc tả trước khi bạn bắt đầu kiểm thử.
  • Đừng kiểm thử một hệ thống mà bạn không biết các yêu cầu. Lý do đơn giản là- bạn không biết những gì cần phải có trong hệ thống và những gì không nên có!
  • Nếu bạn thực sự cần kiểm thử một hệ thống mà bạn không có các yêu cầu, bạn hãy sử dụng monkey testing. Bạn không biết gì về hệ thống! Vì vậy, bất cứ điều gì bạn nghĩ một cách hợp lý có thể là một lỗi tiềm năng trong hệ thống, bạn có thể báo cáo.
  • Bạn cần phải biết yêu cầu về phần mềm và phần cứng của ứng dụng mà bạn đang làm việc.
  • Đừng phỏng đoán bất cứ điều gì trong khi kiểm thử một ứng dụng cụ thể.
  • Thực hiện theo các chuẩn mực của công ty bạn về các công cụ và thủ tục kiểm thử, bảo trì tập tin, tài liệu, .v.v
  • Kiểm tra các ứng dụng theo quan điểm của khách hàng.
  • Việc kiểm thử một hệ thống một cách toàn bộ / hoàn toàn là không thể vì các yêu cầu có thể bị thay đổi bất cứ lúc nào.

Có cần thiết phải tìm hiểu công cụ kiểm thử tự động?

Lĩnh vực kiểm thử phần mềm đang phát triển với một tốc độ ngày càng cao hơn. Mặc dù kiểm thử thủ công giúp tìm thấy lỗi tuy nhiên nó có thể tốn nhiều thời gian. Vì vậy, một kiến thức tốt về các công cụ kiểm thử tự động sẽ giúp bạn kiểm thử các ứng dụng nhanh hơn và đáng tin cậy hơn. Bạn càng biết về các công cụ kiểm thử tự động, cơ hội tốt hơn để bạn đánh dấu sự hiện diện của bạn trong ngành công nghiệp này hơn những người khác. Việc này cũng phụ thuộc vào loại dự án bạn đang làm việc. Nếu công việc của bạn đòi hỏi bạn phải hiểu và sử dụng một công cụ kiểm thử tự động, bạn sẽ phải tìm hiểu nó.

Kiểm thử phần mềm là một lĩnh vực rộng lớn với cơ hội nghề nghiệp phong phú. Tuy nhiên, biết khả năng, sở thích của bạn, và kỹ năng trước khi quyết định đi sâu vào trong lĩnh vực này.

VNTesters tổng hợp và biên dịch từ Buzzle

Bài viết gốc được đăng tải tại vntesters.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Vuejs data flow – tam chủng thần khí cần biết

Vuejs data flow – tam chủng thần khí cần biết

Bài viết được sự cho phép của tác giả Kiên Nguyễn

DEV: Thưa bụt, con đang học Vuejs, bụt biết Vuejs data flow không?

BỤT: Tao là thần chứ có phải “đi ven lốp bờ” như m đâu. Biết thế đ** nào được!

DEV: Nhưng mà con muốn học, muốn trở thành dev lương 3k

BỤT: Ta không giúp được, nhưng có 3 món bảo vật (gọi là tam chủng thần khí) có thể giúp con. Nhớ học và thực hành nhuần nhuyễn từng loại thì kiểu gì cũng có người yêu (nhầm, lương cao).

Tìm việc làm VueJS lương cao cho bạn

1. Props và emit

1.1 Ai cũng nên dùng

Một Vuejs Application tất nhiên sẽ chia ra làm nhiều component. Component cha, component con. Trường hợp số lượng component không quá nhiều Emit và Props là hai món bảo vật nên biết cách để sử dụng:

  • Dễ hiểu, dễ sử dụng
  • Khuyến khích sử dụng cho các component quan hệ cha – con (parent – child)
  • Không nên sử dụng khi Application có quan hệ rối rắm
  • Bắt buộc phải biết sử dụng khi học Vuejs

Trong Vuejs, data flow dễ nắm bắt nhất giữa các component là emit và props. Props sử dụng để pass data giữa các component khác nhau. Trong khi đó emit được dùng để gửi các event (có thể kèm data) từ component con lên component cha.

  Cách sử dụng các plugins jQuery trong VueJS
  Call API trong VueJS theo cách thông minh nhất

1.2 Mục sở thị bảo vật

Props và Emit trong Vuejs data flow có thể được hiện thực hóa như sau:

// Component account nhận vào props username
// Do nhận prop nên chỗ này in ra 2000$
<template>
<div id='salary-info'>
{{salary}}
</div>
</template>

<script>
export default {
props: ['salary']
}
</script>
// Component cha gửi qua prop user name
// Chỗ dấu : được hiểu là gửi props
<template>
<div>
<salary-info :salary="user.salary" />
</div>
</template>

<script>
import SalaryInfo from "@/components/SalaryInfo.vue";

export default {
components: {
SalaryInfo
},
data() {
return {
user: {
salary: '2000$'
}
}
}
}
</script>

Đấy, nhẹ nhàng dễ dàng như đẩy xe hàng dưới 500kg

2. EventBus

2.1 Lợi hại không kém

Nhắc tới EventBus thì chỉ cần nhớ trong đầu cái slogan bất tử “From Anywhere to Anywhere”. Gửi tới đâu cũng được.

Sử dụng: Chỉ khi có nhiều hơn 15,20 component với flow phức tạp. Quan hệ parent child phức tạp. Nghe tên thôi là đủ biết bảo bối này cũng khá mạnh.

Nếu cần emit bất cứ sự kiện nào từ component con của parent 1 đến child component của parent 100 vẫn có thể dùng EventBus. Không quá khó để nhớ và hiểu cách sử dụng, EventBus như tuyến Bus nhanh BRT đi khắp Hà Nội, chuyên chở event tới tất cả các component.

Tuy nhiên, thực tế trong quá trình làm việc mình thấy có hai lưu ý nhỏ như sau:

  • Chỉ sử dụng khi các event gửi từ child đến parent lớn hơn 4 cấp. (Emit lúc đó sẽ gây rối rắm)
  • Khuyến khích sử dụng khi Component tree không quá 5 cấp (Nếu số lượng component không lớn – Vuex khó hiểu, rối source)

2.2 Mục sở thị bảo vật

EventBus trong Vuejs data flow có thể được hiện thực hóa như sau:

// Eventbus.js
// Đăng kí sử dụng eventbus
import Vue from 'vue';
export const EventBus = new Vue();
// Component cha gửi qua prop user name
<template>
<div class="pleeease-click-me" @click="emitGlobalClickEvent()"></div>
</template>

<script>
// Import the EventBus we just created.
import { EventBus } from './event-bus.js';

export default {
data() {
return {
clickCount: 0
}
},

methods: {
emitGlobalClickEvent() {
this.clickCount++;
// Send the event on a channel (i-got-clicked) with a payload (the click count.)
// Sử dụng ở đây, arg1 là name, 2 là value
EventBus.$emit('i-got-clicked', this.clickCount);
}
}
}
</script>
}
</script>
// Ở chỗ js khác thì lấy về, không có gì khác
import { EventBus } from './event-bus.js';

// Listen for the i-got-clicked event and its payload.
// Bắt sự kiện on listen
EventBus.$on('i-got-clicked', clickCount => {
console.log(`Oh, that's nice. It's gotten ${clickCount} clicks! :)`)
});

Chi tiết hơn về sử dụng EventBus có thể xem thêm ở Digital Ocean – Creating a Global Event Bus with Vue.js

3. Vuex

3.1 Thật sự quyền năng

Nhắc tới Vuex cũng chỉ cần nhớ tới 3 chữ “Our state manager“. Vuex là nơi chứa tất cả state của một application.

Nói “Quyền năng” bởi vì Vuex như là kho chứa tổng, chứa tất cả các state của các component. Ngoài “Quyền năng”, Vuex còn được support tận răng với Vue dev tools extension. Xem mọi thứ đang diễn ra trong kho chứa như thế nào?

3.2 Mục sở thị bảo vật

Vuex trong Vuejs data flow có thể được hiện thực hóa như sau:

Lời khuyên là đối với các application phức tạp. Việc cập nhật state của các component diễn ra liên tục thì nên sử dụng Vuex.

// Đăng kí store
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
// Lưu state biến count, initial là 0
state: {
count: 0
},
// Lúc nào state thay đổi
mutations: {
increment (state) {
state.count++
}
}
})
// Store không phải muốn đụng là đụng
// Phải commit các kiểu hẳn hoi
store.commit('increment')
// Lưu vào rồi thì cứ this.store là lấy ra thôi
console.log(store.state.count) // -> 1

Một khi ứng dụng trở nên phức tạp với nhiều commponent. Sử dụng emit sẽ khiến component trở nên rối rắm, khó quản lý. Việc truyền dữ liệu giữa các component lại càng khó khăn hơn. Props trở nên quá tải, không thể theo dõi.

Tuy nhiên, với bảo vật thứ ba này, chỉ với mutations, mapGetter, mapActions, việc cập nhật state và data vào component đã trở nên đơn giản hơn nhiều.

  • Cập nhật state và data ở bất cứ đâu
  • Truy xuất value từ store dễ dàng với mapGetter
  • Đồng bộ hóa dữ liệu xuyên suốt trong flow của application

4. Nên sử dụng cái nào trong Vuejs data flow?

Không có bảo vật nào được ưu tiên cao nhất sử dụng trong Vuejs Data flow. Thật sự mỗi bảo vật có một sức mạnh riêng. Có thể chứng tỏ bản thân trong từng tình huống cụ thể.

Yêu cầu chung là phải nắm rõ tường tận các cách này. Một số lưu ý khi sử dụng đúc kết ra như sau:

4.1 Props và emit

  • Sử dụng tốt trong quan hệ trực tiếp giữa parent và child component
  • Không sử dụng được cho các component không có relationship
  • Vue Application không quá phức tạp, không có nhiều component

4.2 Eventbus

  • Như một chuyến xe bus, chuyên chở khắp nơi
  • Sử dụng cho application lớn hơn một cấp
  • Nếu có xử lý active, notification giữa các component không có relation và cách xa, có thể sử dụng

4.2 Vuex

  • Sử dụng cho các application từ medium cho tới large.
  • Nếu phức tạp và có sử dụng value từ API -> nên sử dụng.
  • Kết hợp tốt giữa mutations và actions cho ra kết quả hoàn hảo

5. Tham khảo

Hết rồi. Cảm ơn anh em đã đọc bài. Nhớ like và share Facebook page nha!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

NGINX Amplify là gì? Giới thiệu về NGINX Amplify

NGINX Amplify là gì? Giới thiệu về NGINX Amplify

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Nginx Amplify là hệ thống giám sát hoạt động của server và hỗ trợ việc cấu hình cho nền tảng nginx. Nó là 1 module cài vào Nginx kết nối với api được cung cấp bởi nginx.com để bạn dể dàng theo dõi hoạt động của hệ thống, nhận thông báo về  tình trạng cấu hình trên Nginx và các đề nghị tối ưu dành cho Nginx. Tính năng khá giống với Elasticsearch, Logstash và Kibana (ELK Stack). Cụ thể mình sẽ tìm hiểu rõ hơn bên dưới với các tính năng có trong Nginx Amplify và hướng dẫn cài đặt.

  Hướng dẫn xử lý lỗi 502 Bad Gateway Nginx
  Cách Engineer Nhật Bản thực hiện test như thế nào

Nginx Amplify là một công cụ để giám sát cơ sở hạ tầng phân phối cho ứng dụng của bạn.Với nginx Amplify bạn có thể chủ động xác định các vấn đề trước khi chúng ảnh hưởng lớn đến bất kỳ người dùng đang sử dụng ứng dụng của bạn, cũng như:

  • Hiển thị trực quan chính xác tình trạng server như máy chủ bị quá tải hoặc tiềm năng bị tấn công DDoS
  • Cải thiện và tối ưu hóa hiệu suất Nginx với lời khuyên và gợi ý thông minh
  • Nhận thông báo khi có lỗi xảy ra trong quá trình vận hành và cung cấp các ứng dụng của bạn
  • Dự đoán về khả năng và hiệu suất hoạt động cho các ứng dụng web
  • Theo dõi cùng lúc nhiều hệ thống chạy Nginx

Các tính năng nổi bật NGINX Amplify

1. Biểu đồ

Biểu đồ hiển thị hệ thống NGINX AmplifyBiểu đồ hiển thị hệ thống NGINX Amplify

Với dashboard trực quan bạn dễ dàng, nhanh chóng chọn xem các biểu đồ số liệu ngay lập tức theo khung giờ mình muốn về số liệu hoạt động CPU, RAM, Bộ nhớ ổ đĩa, băng thông,…

2. Báo cáo

Báo cáo hệ thống NGINX AmplifyBáo cáo hệ thống NGINX Amplify

Với bảng báo cáo hệ thống này bạn sẽ khám phá được nhiều hơn kiến thức về Nginx với những đề nghị về cấu hình để cải thiện hiệu suất, tốc độ, và bảo mật các Server (cơ sở hạ tầng) dùng Nginx của bạn. Nó cho bạn biết chính xác vấn đề phát sinh ở đâu, tại sao nó là một vấn đề, và cần làm những gì để khắc phục

3. Thông báo thời gian thực

Thông báo thời gian thực NGINX AmplifyThông báo thời gian thực NGINX Amplify

NGINX Amplify cho phép bạn thiết lập thông báo với các tùy chỉnh cho các số liệu được thu thập trong hệ thống. Để bạn có thể nhận thông báo tức thời về các thông tin thiết yếu và các cảnh báo tức thời trong khi giám sát hệ thống của bạn từ đó dể bạn có những bước xử lý kịp thời tiếp theo. Thông báo sẽ gửi qua mail lúc thiết lập cho từng server.

Nếu bạn thấy quan tâm đến NGINX Amplify Agent bạn cần phải đăng ký tài khoản để xem trên giao diện web của Nginx Amplify tại đây và xem cách cài đặt tại đây.

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Hiểu đúng về hai bên “cán cân” của một Project Lead

công việc của project lead
Hiểu đúng về hai bên “cán cân” của một Project Lead

Về diễn giả

  • Anh Mai Vui đã có kinh nghiệm hơn 10 năm làm việc trong lĩnh vực phần mềm.
  • Hiện tại anh đang công tác tại công ty Persol Process & Technology Vietnam, trụ sở chính tại Nhật và mình làm việc tại chi nhánh ở TPHCM.
  • Công việc chính là các dự án tuyển dụng nhân sự – “săn đầu người”, dự án được triển khai cho cả khu vực châu Á – Thái Bình Dương ở nhiều quốc gia như Ấn Độ, Malaysia, Indonesia, Singapore.

Anh có thể giới thiệu rõ hơn về công ty và công việc của mình được không?

Lĩnh vực hoạt động chính của công ty là phần mềm cung cấp các giải pháp về công nghệ thông tin, cung cấp các phần mềm ứng dụng cho thị trường, chủ yếu là thị trường Nhật Bản. Hiện nay công ty cũng đã khai phá thêm các thị trường khác ở châu Âu. Bên cạnh đó công ty cũng cung cấp các giải pháp công nghệ thông tin một cách toàn diện ở các lĩnh vực tài chính, quản lý doanh nghiệp.

Anh có thể chia sẻ đôi chút về dự án anh và team đang thực hiện không? Chẳng hạn như những dự án, kỷ niệm vui nào khiến cả team phải “vùi đầu” vào?

Hiện anh đang làm dự án về tuyển dụng nhân sự, mục đích chính là để tư vấn viên có thể tìm được những ứng viên phù hợp cho job của mình. Dự án đã được triển khai và hoạt động ở khá nhiều nước.

Dĩ nhiên là dự án nào cũng sẽ có điểm phức tạp riêng, dự án này không khó bằng dự án trước đây mình làm là thiết kế hệ thống kiểm soát các thiết bị trong tòa nhà cho một công ty ở Mỹ. Dự án này không quá khó nhưng đòi hỏi tính bảo mật rất cao. Từ lúc sản phẩm bắt đầu cho đến khi nó hoàn thiện, sau 3 năm hoạt động nó nằm trong top 3 sản phẩm bán chạy của thị trường Mỹ.

Anh có sử dụng mô hình nào để quản lý công việc của team không?

Mình đã áp dụng mô hình scrum để quản lý công việc trong hơn 5 năm rồi. Những lợi ích khi quản lý bằng mô hình scrum giúp mình dự đoán được khoảng thời gian làm việc của một dự án, mình sẽ biết được thời điểm cần hoàn thiện của mỗi task, assign tasks cho các member rất rõ ràng. Chỗ nào, vấn đề nào đang gặp khó khăn, mình có cần join vào để giúp các bạn hay không, tất cả các tính năng giúp project của mình hoạt động rất trôi chảy. Mình sẽ không gặp vấn đề mà các công ty outsourcing hay gặp là release, khiến mình chậm tiến độ trong việc bàn giao sản phẩm cho khách hàng.

Ở góc nhìn cá nhân cùng kinh nghiệm của bản thân, anh có nghĩ Machine Learning là lĩnh vực tiềm năng khi làm outsource không?

Đây là khái niệm đang rất phổ biến. Công nghệ phần mềm đang phát triển mạnh, thế giới đã phát triển machine learning rất nhiều rồi trong khi ở Việt Nam mình chỉ mới bắt đầu thôi, mình tin là khoảng 2, 3 năm nữa thôi nó sẽ nở rộ ở Việt Nam. Machine Learning không khó nhưng đòi hỏi sự đón nhận từ người dùng thì mới có thị trường để phát triển.

Hiện tại nhu cầu cho các sản phẩm có ứng dụng machine learning ở Việt Nam như thế nào so với quốc gia khác?

Theo mình thì hiện tại machine learning vẫn chưa được ứng dụng nhiều do nhiều nguyên nhân:

  • Thứ nhất là lực lượng làm việc trong mảng machine learning chưa cao, chủ yếu vẫn là nghiêng về lĩnh vực làm việc truyền thống.
  • Thứ hai là thị trường cần các sản phẩm machine learning này chưa nhiều, trước tiên là cần có phần mềm chuyên biệt. Hy vọng sắp tới Việt Nam sẽ có nhiều sự thay đổi hơn để áp dụng machine learning nhiều hơn vào lĩnh vực phần mềm.

Đơn cử như hệ thống thu phí trên đường cao tốc, với một phần mềm bình thường chắc chắn sẽ không thể nào làm được. Vì khi chụp hình ở tốc độ cao do xe không dừng để lấy được biển số sẽ rất khó nên mình phải làm để có thể ứng dụng machine learning vào đọc hình ảnh. Kể cả là chữ số bị nhòe nhưng máy vẫn nhận diện được biển số vì đã được học rồi.

Hoặc chẳng hạn trong lĩnh vực ngân hàng, hiện tại mỗi người đều có rất nhiều thẻ ngân hàng, nếu trong thời gian tới mình có thể ứng dụng machine learning vào để rút tiền hay thao tác bằng cách nhận diện gương mặt sẽ đơn giản hơn rất nhiều. Theo mình biết hiện nay đang có một ngân hàng tại Việt Nam đang triển khai hệ thống này.

Hiện nay team anh có đang outsourcing ứng dụng nào liên quan đến machine learning không?

Hiện nay ở team Việt Nam thì vẫn chưa có, còn site bên Nhật đã có ứng dụng rồi.

Hiện tại anh đang sử dụng công nghệ nào trong quá trình làm việc?

May mắn cho mình là từ lúc ra trường đến giờ mình không phải chuyển đổi công nghệ nhiều, chủ yếu là sử dụng DockNET. Mình tiếp cận DockNET từ lúc còn là sinh viên, ra trường đi làm và cho đến giờ vẫn chỉ sử dụng DockNETthôi. Đây vừa là ưu điểm cũng vừa là nhược điểm. Ưu điểm là mình sẽ hiểu biết rất sâu về công nghệ đó nhưng hạn chế là ngoài DockNET, mình sẽ không biết nhiều đến các ứng dụng khác.

Theo anh, sinh viên mới ra trường nên học rộng hay học sâu (về các ngôn ngữ lập trình, công nghệ)?

Theo quan điểm của anh thì nên học sâu. Nếu em muốn biết nhiều thì trong quá trình em đi làm việc ở công ty em sẽ học được nhiều thứ hơn. Với dự án này em làm công nghệ này, dự án kia em làm công nghệ kia thì tự động trong quá trình làm việc em sẽ được tích lũy nhiều công nghệ khác nhau, kiến thức về phần mềm sẽ rộng hơn.

Còn nếu không học sâu em sẽ không có nền tảng để tự học được. Mà với ngành công nghệ thông tin, nhất là lĩnh vực công nghệ phần mềm, nếu em không tự học được thì tự động em bị đào thải. Vì công nghệ phát triển liên tục và không ai dạy em những điều đó cả.

Anh có lời khuyên nào về career path cho các bạn học lập trình mới ra trường hoặc có kinh nghiệm 2 – 3 năm không?

Theo anh thì khi mới ra trường các bạn nên tham gia vào những công ty nào mang tính thách thức một chút, đòi hỏi khả năng sáng tạo nhiều hơn thay vì chỉ làm theo những công việc đã được setup sẵn. Vì nó sẽ khiến bạn không thể nâng cao được kỹ năng của mình.

Bạn nên chọn những công ty có nhiều project để có cơ hội và môi trường để nâng cao kỹ năng của mình, đồng thời sẽ được học những công nghệ mới. Vì có nhiều dự án sẽ đòi hỏi các công nghệ mới để áp dụng và thực hiện.

Nếu theo career path như anh gợi ý thì sau bao lâu có thể trở thành Project Lead?

Điều này phụ thuộc khá nhiều vào kỹ năng cá nhân. Trước tiên là bạn cần có nền tảng cơ bản về lập trình, sau đó bắt đầu vào làm ở các dự án trong khoảng 2 – 3 năm, lúc này bạn đã có background khá tốt về mặt công nghệ rồi. Nhờ vậy bạn sẽ có kỹ năng làm việc tốt, khả năng quản lý task cũng khá ổn và học hỏi thêm được các kinh nghiệm từ leader và những người đi trước. Với một lộ trình như thế thì anh nghĩ em sẽ mất khoảng 5 năm thật sự cố gắng làm việc, học hỏi và nghiên cứu để lên vị trí Project Lead.

Theo anh kỹ năng quản lý là điều cần có cho một Project Lead tốt hay chỉ cần kỹ năng chuyên môn tốt la đủ?

Thật ra để có thể làm một project lead tốt chắc chắn sẽ đòi hỏi em ở 2 khía cạnh là kỹ năng cứng và kỹ năng mềm. Có thể bạn nghĩ rằng khi mình đã là lead thì không cần phải làm nữa mà chỉ cần bàn giao và giám sát tasks của mọi người là được thì không hẳn. Bạn vẫn cần phải biết về technical vì sẽ có các vấn đề phát sinh trong project mà bạn cần tìm ra hướng giải quyết, phải dự đoán được có khả năng xảy ra bug hay không, và phải fix bug như thế nào.

Do đó, điều kiện cần là một leader phải giỏi về technical và điều kiện đủ chính là kỹ năng mềm. Bạn phải có kỹ năng quản lý tasks tốt để có thể bàn giao task cho người phù hợp nhất, để đến khi kết thúc thì các task có thể bổ trợ cho nhau và hoàn thành được dự án.

Trong quá trình làm outsourcing với khách hàng, anh có kỷ niệm hay bài học đáng nhớ nào không?

Làm outsourcing thật sự sẽ không được “êm đềm” như khi tạo ra product cho chính công ty của mình. Outsourcing đồng nghĩa với việc sẽ có rất nhiều dự án cần phải chuẩn bị và áp lực về deadline cũng rất lớn. Đôi khi sẽ gặp phải trường hợp đã đến deadline trả product nhưng vẫn chưa hoàn thành project do bị bug. Nên mình phải vận động các staff tăng ca cùng mình để giải quyết.

Việc OT chắc chắn sẽ ảnh hưởng nhiều đến vấn đề cá nhân của các devs, nên là một người lead bạn cũng cần có kỹ năng để thuyết phục nhân viên cùng giải quyết vấn đề với mình. Mình cũng từng gặp trường hợp này khi phải làm việc đến 3 giờ sáng để hoàn thành dự án và release kịp tiến độ vào sáng hôm sau. Đôi khi làm dự án mình phải chấp nhận những đánh đổi và hi sinh như thế.

Anh có thể chia sẻ kinh nghiệm phỏng vấn vị trí Project Leader?

Trước tiên là bạn cần chịu khó chỉnh sửa lại CV chỉnh chu hơn, update lại những thông tin gần nhất mà bạn đang làm, ưu tiên những dự án mới để người phỏng vấn có thể dễ dàng quan sát được kinh nghiệm của bạn. Và tự tin là một trong những yếu tố quan trọng của buổi phỏng vấn thành công.

Bên cạnh đó, bạn cũng nên tìm hiểu sơ qua về thông tin công ty và vị trí đang ứng tuyển đòi hỏi những kỹ năng gì, tự đánh giá xem mình có thể đáp ứng được những kỹ năng đó không. Tốt nhất nên từ 70% trở lên, vì nếu dưới 70% thì sẽ khó khăn hơn cho bạn vì với vị trí leader, những kỹ năng đòi hỏi rất cao và việc phỏng vấn tuyển chọn cũng rất kỹ.

Ngành CNTT chưa bao giờ hết nóng, song các doanh nghiệp vẫn gặp khó khăn trong việc tuyển dụng lập trình viên phù hợp. Theo anh nguyên nhân của vấn đề nằm ở đâu?

Lượng nhân lực làm việc trong lĩnh vực công nghệ phần mềm của Việt Nam hiện tại rất nhiều và số lượng trường đại học đào tạo ngành CNTT cũng rất lớn, tuy nhiên chất lượng đầu ra lại không cao. Có nhiều lý do khác nhau cho vấn đề này, thứ nhất là không có nhiều thời gian để học chuyên sâu vào một lĩnh vực vì quá nhiều môn học dàn trải. Thứ hai vì người học chưa thật sự chăm chỉ tự research để tìm hiểu và nghiên cứu thêm, và nguyên nhân thứ 3 có thể là trở ngại về tiếng Anh vì đa phần tài liệu của ngành CNTT đều là tiếng Anh.

Do đó, khi tìm việc, các bạn sẽ không được nhà tuyển dụng đánh giá cao vì không thật sự hiểu rõ một lĩnh vực như những gì họ mong đợi. Tùy theo nhu cầu tuyển fresher hay senior của công ty mà ứng viên có thể lựa chọn để phù hợp nhất với khả năng của mình.

Tuy nhiên, đa phần các công ty outsourcing sẽ không ưu tiên fresher vì sẽ mất thời gian để training trong khi dự án phải được hoàn thành chỉ trong vài tháng. Mĩnh nghĩ đó là một số nguyên nhân khiến dù lượng nhân lực khá lớn nhưng việc tuyển dụng vẫn gặp khó khăn.

Hệ thống 23 mẫu Design Patterns

Hệ thống 23 mẫu Design Patterns

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Hệ thống các mẫu design pattern hiện có 23 mẫu được định nghĩa trong cuốn “Design patterns Elements of Reusable Object Oriented Software” (PDF).

Các tác giả của cuốn sách là Erich GammaRichard HelmRalph Johnson và John Vlissides, hay còn được biết đến với các tên “Gang of Four”hay đơn giản là “GoF“. Hệ thống các mẫu này có thể nói là đủ và tối ưu cho việc giải quyết hết các vấn đề của bài toán phân tích thiết kế và xây dựng phần mềm trong thời điểm hiện tại.

  30 tiện ích Chrome cho designer và dev
  9 công cụ siêu tiện lợi cho cả Developer và Designer

Hệ thống các mẫu design pattern được chia thành 3 nhóm: nhóm Creational (5 mẫu), nhóm Structural (7 mẫu) và nhóm Behavioral (11 mẫu).

Danh sách hệ thống 23 mẫu Design Patterns

STT Tên Mục đích
Nhóm Creational (nhóm kiến tạo)
1 Abstract Factory Cung cấp một interface cho việc tạo lập các đối tượng (có liên hệ với nhau) mà không cần qui định lớp khi hay xác định lớp cụ thể (concrete) tạo mỗi đối tượng
Tần suất sử dụng: cao
2 Builder Tách rời việc xây dựng (construction) một đối tượng phức tạp khỏi biểu diễn của nó sao cho cùng một tiến trình xây dựng có thể tạo được các biểu diễn khác nhau.
Tần suất sử dụng: trung bình thấp
3 Factory Method Định nghĩa Interface để sinh ra đối tượng nhưng để cho lớp con quyết định lớp nào được dùng để sinh ra đối tượng Factory method cho phép một lớp chuyển quá trình khởi tạo đối tượng cho lớp con.
Tần suất sử dụng: cao
4 Prototype Qui định loại của các đối tượng cần tạo bằng cách dùng một đối tượng mẫu, tạo mới nhờ vào sao chép đối tượng mẫu này.
Tần suất sử dụng: trung bình
5 Singleton Đảm bảo 1 class chỉ có 1 instance và cung cấp 1 điểm truy xuất toàn cục đến nó.
Tần suất sử dụng: cao trung bình
Nhóm Structural (nhóm cấu trúc)
6 Adapter Do vấn đề tương thích, thay đổi interface của một lớp thành một interface khác phù hợp với yêu cầu người sử dụng lớp.
Tần suất sử dụng: cao trung bình
7 Bridge Tách rời ngữ nghĩa của một vấn đề khỏi việc cài đặt ; mục đích để cả hai bộ phận (ngữ nghĩa và cài đặt) có thể thay đổi độc lập nhau.
Tần suất sử dụng: trung bình
8 Composite Tổ chức các đối tượng theo cấu trúc phân cấp dạng cây; Tất cả các đối tượng trong cấu trúc được thao tác theo một cách thuần nhất như nhau.
Tạo quan hệ thứ bậc bao gộp giữa các đối tượng. Client có thể xem đối tượng bao gộp và bị bao gộp như nhau -> khả năng tổng quát hoá trong code của client -> dễ phát triển, nâng cấp, bảo trì.
Tần suất sử dụng: cao trung bình
9 Decorator Gán thêm trách nhiệm cho đối tượng (mở rộng chức năng) vào lúc chạy (dynamically).
Tần suất sử dụng: trung bình
10 Facade Cung cấp một interface thuần nhất cho một tập hợp các interface trong một “hệ thống con” (subsystem). Nó định nghĩa 1 interface cao hơn các interface có sẵn để làm cho hệ thống con dễ sử dụng hơn.
Tần suất sử dụng: cao
11 Flyweight Sử dụng việc chia sẻ để thao tác hiệu quả trên một số lượng lớn đối tượng “cở nhỏ” (chẳng hạn paragraph, dòng, cột, ký tự…).
Tần suất sử dụng: thấp
12 Proxy Cung cấp đối tượng đại diện cho một đối tượng khác để hỗ trợ hoặc kiểm soát quá trình truy xuất đối tượng đó. Đối tượng thay thế gọi là proxy.
Tần suất sử dụng: cao trung bình
Nhóm Behavioral (nhóm tương tác)
13 Chain of Responsibility Khắc phục việc ghép cặp giữa bộ gởi và bộ nhận thông điệp; Các đối tượng nhận thông điệp được kết nối thành một chuỗi và thông điệp được chuyển dọc theo chuỗi nầy đến khi gặp được đối tượng xử lý nó.Tránh việc gắn kết cứng giữa phần tử gởi request với phần tử nhận và xử lý request bằng cách cho phép hơn 1 đối tượng có có cơ hội xử lý request . Liên kết các đối tượng nhận request thành 1 dây chuyền rồi “pass” request xuyên qua từng đối tượng xử lý đến khi gặp đối tượng xử lý cụ thể.
Tần suất sử dụng: trung bình thấp
14 Command Mỗi yêu cầu (thực hiện một thao tác nào đó) được bao bọc thành một đối tượng. Các yêu cầu sẽ được lưu trữ và gởi đi như các đối tượng.Đóng gói request vào trong một Object , nhờ đó có thể nthông số hoá chương trình nhận request và thực hiện các thao tác trên request: sắp xếp, log, undo…
Tần suất sử dụng: cao trung bình
15 Interpreter Hỗ trợ việc định nghĩa biểu diễn văn phạm và bộ thông dịch cho một ngôn ngữ.
Tần suất sử dụng: thấp
16 Iterator Truy xuất các phần tử của đối tượng dạng tập hợp tuần tự (list, array, …) mà không phụ thuộc vào biểu diễn bên trong của các phần tử.
Tần suất sử dụng: cao
17 Mediator Định nghĩa một đối tượng để bao bọc việc giao tiếp giữa một số đối tượng với nhau.
Tần suất sử dụng: trung bình thấp
18 Memento Hiệu chỉnh và trả lại như cũ trạng thái bên trong của đối tượng mà vẫn không vi phạm việc bao bọc dữ liệu.
Tần suất sử dụng: thấp
19 Observer Định nghĩa sự phụ thuộc một-nhiều giữa các đối tượng sao cho khi một đối tượng thay đổi trạng thái thì tất cả các đối tượng phụ thuộc nó cũng thay đổi theo.
Tần suất sử dụng: cao
20 State Cho phép một đối tượng thay đổi hành vi khi trạng thái bên trong của nó thay đổi , ta có cảm giác như class của đối tượng bị thay đổi.
Tần suất sử dụng: trung bình
21 Strategy Bao bọc một họ các thuật toán bằng các lớp đối tượng để thuật toán có thể thay đổi độc lập đối với chương trình sử dụng thuật toán.Cung cấp một họ giải thuật cho phép client chọn lựa linh động một giải thuật cụ thể khi sử dụng.
Tần suất sử dụng: cao trung bình
22 Template method Định nghĩa phần khung của một thuật toán, tức là một thuật toán tổng quát gọi đến một số phương thức chưa được cài đặt trong lớp cơ sở; việc cài đặt các phương thức được ủy nhiệm cho các lớp kế thừa.
Tần suất sử dụng: trung bình
23 Visitor Cho phép định nghĩa thêm phép toán mới tác động lên các phần tử của một cấu trúc đối tượng mà không cần thay đổi các lớp định nghĩa cấu trúc đó.
Tần suất sử dụng: thấp
 
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem thêm việc làm Developer Hà Nội hấp dẫn trên TopDev

Vue conditional rendering – những điều cần biết

Vue conditional rendering – những điều cần biết

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Đã làm việc với Vue hay VueJs thì không thể không biết tới conditional rendering (các điều kiện để render trên component).

Tại sao lại cần cái này?. Tất nhiên, không có sao ẩn hiện button, sao xử lý hiện ẩn notification?. Việc nắm chắc các điều kiện render trên component gần như là điều bắt buộc với những lập trình viên Front End muốn nắm chắc về Vue.

Hãy cùng KieBlog tìm hiểu qua về các điều kiện render – Vue conditional rendering nhé!

  3 phút làm quen với Vue.js
  8 câu điều kiện khi render trong React

1. Thường dùng nhất v-if, v-else

1.1 V-if

V-if và V-else là hai điều kiện thường được sử dụng nhất khi nhắc tới Vue conditional rendering. Nếu không có thì không thể nhắc tới từ conditional. V-if có thể sử dụng để render một thẻ div, hoặc cả một code block

// Handle để render một text, một thẻ div
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>

// Cũng có thể sử dụng để handle một block
<h1 v-if="awesome">
<div>K</div>
<div>I</div>
<div>E</div>
<div>B</div>
<div>L</div>
<div>O</div>
<div>G</div>
</h1>
<h1 v-else>Oh no 😢</h1>

V-if cũng có thể được sử dụng đối với cả component (sử dụng với template)

// Nếu !ok cả component chứa teamplate sẽ không render
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>

1.2 V-else

Đã nhắc tới v-if tất nhiên không thể không nhắc tới v-else.

// Nếu !ok cả component chứa teamplate sẽ không render
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>

Nếu các điều kiện render có nhiều và cần các điều kiện render chính xác. Vue cũng hỗ trợ sẵn v-else-if

Đôi khi việc sử dụng quá nhiều v-if và v-else gây ra sự rối rắm, khó chịu và khó maintainance. Nhưng v-else-if chỉ xuất hiện trên Vue từ bản 2.1.0+

// Nếu v-if và v-else không handle nổi các case
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>

2. V-show

Cũng sử dụng nhiều không kém và V-show. Để hiển thị ẩn hiện các item trên component, Vue conditional rendering hỗ trợ khá tốt điều kiện ẩn hiện.

// V-show có thể check một biến boolean hoặc các điều kiện phức tạp
<h1 v-show="ok">Hello!</h1>

Điều kiện check trong v-show luôn luôn là boolean. Biến có thể được khai báo, nhận từ props, hoặc là các điều kiện check để render trên component.

// V-show có thể check một biến boolean hoặc các điều kiện phức tạp
<h1 v-show="ok">Hello!</h1>

3. V-if và V-show

Nhắc tới Vue conditional rendering mà quên không so sánh giữa V-if và V-show thì thật là một sai lầm to lớn.

Hiểu rõ và phân biệt được V-if và V-show là cực kì quan trọng. Dễ để nhớ nhất chỉ có hai dòng khi nói về V-if và V-show như sau:

Generally speaking, v-if has higher toggle costs while v-show has higher initial render costs. So prefer v-show if you need to toggle something very often, and prefer v-if if the condition is unlikely to change at runtime.

Nói chung, V-if có chi phí thay đổi cao (làm nhiều thứ để thay đổi), V-show lại có chi phí khởi tạo ban đầu cao (xem xét sự thay đổi của giá trị). Chính vì thế, sử dụng V-show khi một giá trị nào đó thay đổi thường xuyên và sử dụng V-if khi điều kiện không thay đổi khi chạy.

Chạy ở đây không có nghĩa là trong cả application, nếu component cần load lại với thay đổi giá trị A -> sử dụng V-if (component render lại). Nếu component không reload mà giá trị B thay đổi liên tục (sử dụng V-show) để trigger sự thay đổi đó.

Việc hiểu đúng bản chất và phân biệt được V-show và V-if rất quan trọng. Sử dụng đúng tốt cho cả performance, cả review code. Lợi cả trăm bề.

4. Vue conditional rendering rất quan trọng

Rõ ràng mà nói, nắm chắc các kiến thức cơ bản luôn là điều cần thiết.

Nắm chắc các điều kiện render trên Vue (Vue conditional rendering) sẽ giúp:

  • Sử dụng linh hoạt các điều kiện render.
  • Tăng performance cho application.
  • Xử gọn các điều kiện render rối rắm (khi bussiness phức tạp)

5. Tham khảo

Hết rồi. Cảm ơn anh em đã đọc bài. Nhớ like và share Facebook page nha!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Giới thiệu về Java Module System

Giới thiệu về Java Module System

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Java Module System được Java giới thiệu từ Java 9 để giải quyết 1 số vấn đề của Java mà nếu các bạn để ý sẽ thấy nó thật cần thiết như thế nào?

  • Lỗi NoClassDefFoundError: lỗi này xảy ra lúc chương trình Java của chúng ta đang chạy, JVM không thể tìm thấy class cần thiết để execute một tác vụ nào đó. Mặc dù hiện tại chúng ta có các tool để build và fetch tất cả dependencies cần thiết để chạy ứng dụng như Maven, Gradle, … nhưng các bạn có đồng ý với Khanh là: sometime chúng ta cũng gặp lỗi này.
  • Bất kỳ một class hay method nào được định nghĩa với public hoặc protected access modifier trong class Java library mà nằm trong classpath của project của ứng dụng, chúng ta đều có thể access tới chúng. Không có cách nào để các Java library này che giấu chúng, chỉ để các class của các package nằm trong library truy cập được mà thôi.
  • Và còn nhiều vấn đề khác nữa …

Tìm việc Java hấp dẫn lương cao

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

Java Module System được giới thiệu để giải quyết những vấn đề trên:

  • Nó giúp chúng ta có thể quản lý được những module nào sẽ được sử dụng trong code của chúng ta, những module này sẽ được include trong quá trình chúng ta build module, bằng cách sử dụng module directive requires.
  • Chúng ta cũng có thể quyết định được ai, package nào được sử dụng code của mình, bằng cách sử dụng từ khóa module directive exports.

Trong bài viết này, mình sẽ giới thiệu với các bạn tổng quan về Java Module System với một ví dụ nhỏ về cách tạo mới một Java module các bạn nhé!

Đầu tiên, các bạn hãy cài đặt JDK từ Java 9 trở đi nhé.

Hãy mở command line rồi nhập dòng lệnh:

java --list-modules

để xem tất cả những module được cung cấp mặc định bởi Java các bạn nhé!

Kết quả:

khanh@Khanhs-MacBook-Pro ~ % java --list-modules
java.base@15
java.compiler@15
java.datatransfer@15
java.desktop@15
java.instrument@15
java.logging@15
java.management@15
java.management.rmi@15
java.naming@15
java.net.http@15
java.prefs@15
java.rmi@15
java.scripting@15
java.se@15
java.security.jgss@15
java.security.sasl@15
java.smartcardio@15
java.sql@15
java.sql.rowset@15
java.transaction.xa@15
java.xml@15
java.xml.crypto@15
jdk.accessibility@15
jdk.aot@15
jdk.attach@15
jdk.charsets@15
jdk.compiler@15
jdk.crypto.cryptoki@15
jdk.crypto.ec@15
jdk.dynalink@15
jdk.editpad@15
jdk.hotspot.agent@15
jdk.httpserver@15
jdk.incubator.foreign@15
jdk.incubator.jpackage@15
jdk.internal.ed@15
jdk.internal.jvmstat@15
jdk.internal.le@15
jdk.internal.opt@15
jdk.internal.vm.ci@15
jdk.internal.vm.compiler@15
jdk.internal.vm.compiler.management@15
jdk.jartool@15
jdk.javadoc@15
jdk.jcmd@15
jdk.jconsole@15
jdk.jdeps@15
jdk.jdi@15
jdk.jdwp.agent@15
jdk.jfr@15
jdk.jlink@15
jdk.jshell@15
jdk.jsobject@15
jdk.jstatd@15
jdk.localedata@15
jdk.management@15
jdk.management.agent@15
jdk.management.jfr@15
jdk.naming.dns@15
jdk.naming.rmi@15
jdk.net@15
jdk.nio.mapmode@15
jdk.sctp@15
jdk.security.auth@15
jdk.security.jgss@15
jdk.unsupported@15
jdk.unsupported.desktop@15
jdk.xml.dom@15
jdk.zipfs@15

Ở đây, Java chia ra 2 loại modules là những standard modules và các non-standard modules. Standard modules là những module hiện thực Java SE  specification với tên module được bắt đầu với java.* còn những non-standard modules là những module nằm trong Java Development Kit được bắt đầu với jdk.*. Các bạn có thể thấy rõ điều này trong phần kết quả sau khi mình execute câu lệnh “java –list-modules” trên.

Mỗi module name sẽ bao gồm tên module và Java version cho chúng ta biết là module đó thuộc về Java version nào. Như các bạn thấy, mình đang sử dụng Java 15 và trong tên module, các bạn có thể thấy, chúng được kết thúc với @15.

Để xem thông tin về một module nào đó, các bạn có thể sử dụng câu lệnh sau:

java --describe-module <module-name>

Ví dụ, để xem thông tin của module java.logging, mình sẽ nhập câu lệnh sau:

java --describe-module java.logging

Kết quả:

Giới thiệu về Java Module System

Thông tin của một module sẽ bắt đầu với tên module, và tiếp theo là những module directives mà mình có đề cập ở trên như exports, requires, provides, … như các bạn thấy trong hình trên. Tất cả những thông tin này sẽ được định nghĩa trong một tập tin tên là module-info.java các bạn nhé!

Mỗi module directive có tác dụng định nghĩa cách mà module sẽ được build và sử dụng, ví dụ như directive exports giúp chúng ta định nghĩa một package nào đó trong module này được access bởi ai hay directive provides có mục đích chỉ rõ module này đang implement một interface nào đó cho các class khác có thể sử dụng, … Chúng ta sẽ tìm hiểu rõ hơn về từng module directive sau các bạn nhé!

Trong output của ví dụ trên, các bạn có thể thấy module java.logging đang sử dụng một dependency là module java.base. Để xem tất cả các dependencies mà một module đang sử dụng, các bạn cũng có thể sử dụng câu lệnh với công cụ jdeps như sau:

jdeps --print-module-deps --module <module-name>

Hoặc có thể viết tắt –module bằng -m như sau:

jdeps --print-module-deps -m <module-name>

Ví dụ, để xem dependencies mà module java.logging đang sử dụng, mình sẽ chạy câu lệnh như sau:

jdeps --print-module-deps -m java.logging

Kết quả:

Giới thiệu về Java Module System

Bây giờ, mình sẽ hướng dẫn cho các bạn cách tạo mới một module cơ bản các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Java project để làm ví dụ.

Mình sẽ sử dụng Spring Tool Suite để làm điều này.

Trong quá trình tạo mới project, các bạn sẽ thấy Spring Tool Suite hỗ trợ chúng ta tạo mới tập tin module-info.java luôn.

Giới thiệu về Java Module System

và:

Giới thiệu về Java Module System

Như mình nói ở trên, đây là tập tin định nghĩa thông tin của một Java Module.

Kết quả:

Giới thiệu về Java Module System

Nội dung của tập tin module-info.java lúc này các bạn có thể thấy như sau:

module huongdanjava.module.example {
}

Bây giờ mình sẽ thêm một class với phương thức sayHello(), return về chữ “Hello World” như sau:

package huongdanjava.module.example;

public class Example {

public String sayHello() {
return "Hello World!";
}

}

Và export package của class này trong tập tin module-info.java để các module khác có thể sử dụng class Example như sau:

module huongdanjava.module.example {
exports huongdanjava.module.example;
}

Bây giờ, mình sẽ tạo mới một Java module project khác:

Giới thiệu về Java Module System

Mình sẽ khai báo module huongdanjava.module.example.test sử dụng module huongdanjava.module.example bằng cách click chuột phải vào project huongdanjava.module.example.test chọn Build Path, xong chọn Configure Build Path… Trong cửa sổ Java Build Path, mình sẽ select module huongdanjava.module.example để sử dụng như sau:

Giới thiệu về Java Module System

Module huongdanjava.module.example.test này sẽ khai báo directive requires tới package huongdanjava.module.example trong tập tin module-info.java để sử dụng class Example của module huongdanjava.module.example:

module huongdanjava.module.example.test {
requires huongdanjava.module.example;
}

và in ra dòng chữ “Hello World” khi chạy chương trình như sau:

package huongdanjava.module.example.test;

import huongdanjava.module.example.Example;

public class Application {

public static void main(String[] args) {
Example e = new Example();
System.out.println(e.sayHello());
}

}

Kết quả khi chạy chương trình này như sau:

Giới thiệu về Java Module System

Nếu bây giờ trong tập tin module-info.java của module huongdanjava.module.example, mình xoá dòng

exports huongdanjava.module.example;

các bạn sẽ thấy Spring Tool Suite báo lỗi class Application ngay như sau:

Giới thiệu về Java Module System

Đó là bởi vì lúc này, chúng ta không cho phép bất kỳ class nào trong các module khác sử dụng package huongdanjava.module.example của module huongdanjava.module.example nữa!

Chúng ta sẽ tìm hiểu thêm về các module directives trong Java Module trong bài viết sau của Hướng Dẫn Java các bạn nhé.

Bài viết gốc được đăng tải tại huongdanjava.com

Có thể bạn quan tâm:

Xem thêm tuyển dụng ngành it hấp dẫn trên TopDev

Kiểm thử phần mềm là gì? Các phương pháp kiểm thử được áp dụng nhiều nhất

kiểm thử phần mềm
Kiểm thử phần mềm là gì? 10 phương pháp kiểm thử được áp dụng nhiều nhất

Tác giả: Nahla Davies

Kiểm thử phần mềm đang phát triển ngày một nhanh và đòi hỏi người tester phải kịp thời nắm bắt các vấn đề mới nhất.

Tháp công thức kiểm thử phần mềm

Software Testing Pyramid

Công thức kiểm thử phần mềm được mô tả ở trên bao gồm tất cả các giai đoạn của vòng đời phát triển phần mềm (Software Development Life Cycle – SDLC). Nó mở rộng từ unit test ở phần đáy tháp, đến test tích hợp ở phần giữa và kết thúc với test chức năng ở đỉnh.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  5 xu hướng của ngành kiểm thử tự động trong năm 2024

Unit testing là gì?

Kiểm thử đơn vị liên quan đến việc kiểm tra các thành phần code riêng lẻ thay vì toàn bộ code. Nó xác minh hoạt động tính logic của tất cả thành phần để xác định sớm các lỗi trong SDLC, cho phép bạn sửa lỗi trước khi làm tiếp các bước tiếp theo.

Kiểm thử đơn vị được gọi là kiểm thử “hộp trắng”, vì kiểm thử diễn ra với đầy đủ kiến ​​thức về cấu trúc và môi trường của ứng dụng.

Một ví dụ về kiểm thử đơn vị là tạo các đối tượng giả để kiểm tra các phần code, chẳng hạn như các hàm với các biến chưa được tạo.

const mocha = require('mocha')
const chai = require('chai')  // It is an assertion library
describe('Test to check add function', function(){
  it('should add two numbers', function(){
    (add(2,3)).should.equal(5)  //Checking that 2+3 should equal 5 using the given add function
  });
});

Integration testing là gì?

Bước tiếp sau kiểm thử đơn vị là kiểm tra tích hợp, kết hợp các thành phần riêng lẻ và kiểm tra chúng theo nhóm. Kiểm tra tích hợp xác định các vấn đề trong cách các thành phần riêng lẻ tương tác với nhau để xem liệu code có đáp ứng tất cả các thông số kỹ thuật chức năng của nó hay không.

Kiểm thử tích hợp khác với kiểm thử đơn vị ở chỗ nó tập trung vào các mô-đun và thành phần hoạt động độc lập trong mối quan hệ với nhóm tổng thể. Mặt khác, kiểm thử đơn vị tập trung vào việc cô lập các module hoặc thành phần trước khi kiểm thử.

Điểm của kiểm thử tích hợp là để lộ ra bất kỳ vấn đề hoặc lỗ hổng nào trong phần mềm giữa các module hoặc thành phần được tích hợp. Như một ví dụ đơn giản hơn, nếu bạn thực hiện kiểm tra tích hợp của dịch vụ email mà bạn đang xây dựng, bạn sẽ cần kiểm tra các thành phần riêng lẻ như Soạn thư, Lưu bản nháp, Gửi, Chuyển đến Hộp thư đến, Đăng xuất,…

Trước tiên, bạn sẽ thực hiện kiểm tra đơn vị của các tính năng riêng lẻ, sau đó là kiểm tra tích hợp cho từng chức năng có liên quan.

End-to-end Testing – kiểm thử đầu cuối

Việc cuối cùng của testing là kiểm tra end-to-end (E2E). Đúng như tên gọi của nó, kiểm tra end-to-end tái tạo toàn bộ hoạt động của ứng dụng để kiểm tra tất cả các kết nối và phụ thuộc của ứng dụng. Điều này bao gồm kết nối mạng, truy cập cơ sở dữ liệu và các phụ thuộc bên ngoài.

Bạn tiến hành kiểm tra E2E trong môi trường mô phỏng môi trường người dùng thực tế. Bạn có thể xác định mức độ thành công của kiểm tra E2E bằng cách sử dụng một số chỉ số, bao gồm Trạng thái kiểm tra (được theo dõi bằng hình ảnh, chẳng hạn như biểu đồ) và Trạng thái và Báo cáo (phải hiển thị trạng thái thực thi và bất kỳ lỗ hổng hoặc lỗi nào được phát hiện).

Các loại kiểm thử phần mềm

Kiểm tra bảo mật ứng dụng

Một trong những loại kiểm thử quan trọng nhất đối với các ứng dụng là kiểm thử bảo mật ứng dụng. Kiểm tra bảo mật giúp bạn xác định các lỗ hổng ứng dụng có thể bị tin tặc khai thác và sửa chúng trước khi bạn phát hành sản phẩm hoặc ứng dụng của mình.

Có một loạt các bài kiểm tra bảo mật ứng dụng có sẵn cho bạn với các bài kiểm tra khác nhau có thể áp dụng ở các phần khác nhau của vòng đời phát triển phần mềm.

Bạn có thể tìm thấy các loại thử nghiệm bảo mật ứng dụng khác nhau ở các cấp độ khác nhau của kim tự tháp thử nghiệm. Mỗi bài kiểm tra đều có điểm mạnh và điểm yếu riêng. Bạn nên sử dụng các loại thử nghiệm khác nhau cùng nhau để đảm bảo tính toàn vẹn tổng thể của chúng.

Static Application Security Testing (SAST) – Kiểm tra bảo mật ứng dụng tĩnh

Bạn nên sử dụng thử nghiệm bảo mật ứng dụng tĩnh (SAST) sớm trong SDLC. Đây là một ví dụ về kiểm thử đơn vị. SAST phản ánh kiến ​​thức của nhà phát triển, bao gồm thiết kế và triển khai. SAST tự phân tích code thay vì ứng dụng cuối cùng và bạn có thể chạy nó mà không thực sự triển khai code.

Theo định nghĩa của các nhà phân tích bảo mật tại Cloud Defense:

“SAST kiểm tra code của bạn xem có vi phạm các quy tắc bảo mật hay không và so sánh các lỗ hổng được tìm thấy giữa các nhánh nguồn và đích… sau đó bạn sẽ nhận được thông báo nếu các phụ thuộc dự án của bạn bị ảnh hưởng bởi các lỗ hổng mới được tiết lộ.”

Khi bạn đã biết về các lỗ hổng, bạn có thể giải quyết chúng trước khi xây dựng ứng dụng cuối cùng.

Dynamic Application Security Testing (DAST) – Kiểm tra bảo mật ứng dụng động

Một phần khác là kiểm tra bảo mật ứng dụng động (DAST), kiểm tra ứng dụng được biên dịch đầy đủ. Bạn thiết kế và chạy các bài kiểm tra này mà không có bất kỳ kiến ​​thức nào về cấu trúc hoặc code cơ bản.

Bởi vì DAST áp dụng quan điểm của tin tặc, nó được gọi là hộp đen, hoặc bên ngoài trong, thử nghiệm. DAST hoạt động bằng cách tấn công những code đang chạy và tìm cách khai thác các lỗ hổng tiềm ẩn. DAST có thể sử dụng các kỹ thuật tấn công phổ biến như kịch bản trang web chéo và chèn SQL.

DAST được sử dụng muộn trong SDLC và là một ví dụ về thử nghiệm bảo mật tích hợp. Mặc dù chậm (kiểm tra DAST hoàn chỉnh của một ứng dụng hoàn chỉnh có thể mất trung bình từ năm đến bảy ngày), nhưng nó sẽ tiết lộ cho bạn những lỗ hổng có khả năng xảy ra nhất trong các ứng dụng của bạn mà tin tặc sẽ khai thác.

Interactive Application Security Testing – Kiểm tra bảo mật ứng dụng tương tác

Kiểm tra bảo mật ứng dụng tương tác (IAST) là một phương pháp kiểm tra mới hơn kết hợp tính hiệu quả của SAST và DAST trong khi khắc phục các vấn đề liên quan đến các thử nghiệm được thiết lập nhiều hơn này.

IAST tiến hành quét ứng dụng theo thời gian thực liên tục để tìm lỗi và lỗ hổng bảo mật bằng cách sử dụng tác nhân giám sát được chèn. Mặc dù IAST hoạt động trong một ứng dụng đang chạy, nó được coi là một quá trình kiểm tra SDLC sớm.

Bất kể loại phần mềm bạn đang muốn kiểm tra là gì, IAST được sử dụng tốt nhất trong môi trường QA (Đảm bảo chất lượng) hoặc môi trường được thiết kế để tái tạo sản xuất càng gần càng tốt mà không cần khách hàng hoặc khách hàng của bạn thực sự truy cập vào nó.

Compatibility Testing – Kiểm tra khả năng tương thích

Kiểm tra khả năng tương thích đánh giá cách ứng dụng của bạn hoạt động và mức độ an toàn của ứng dụng trên các thiết bị và môi trường khác nhau, bao gồm cả thiết bị di động và trên các hệ điều hành khác nhau.

Kiểm tra khả năng tương thích cũng có thể đánh giá xem phiên bản phần mềm hiện tại có tương thích với các phiên bản phần mềm khác hay không. Thử nghiệm phiên bản có thể quay ngược trở lại hoặc quay về phía trước.

Ví dụ về kiểm tra tính tương thích bao gồm:

  • kiểm tra trình duyệt (kiểm tra để đảm bảo trang web hoặc trang web di động của bạn hoàn toàn tương thích với các trình duyệt khác nhau)
  • thử nghiệm di động (đảm bảo ứng dụng của bạn tương thích với iOS và Android)
  • kiểm tra phần mềm (nếu bạn định tạo nhiều ứng dụng phần mềm cần tương tác với nhau, bạn sẽ cần tiến hành kiểm tra khả năng tương thích để đảm bảo rằng chúng thực sự làm như vậy).

Một số cách thức kiểm thử khác

Performance Testing – Kiểm tra hiệu suất phần mềm

Bạn cần biết ứng dụng sẽ hoạt động như thế nào trong nhiều điều kiện khác nhau và đây là mục đích của việc kiểm tra hiệu suất. Kiểm tra hiệu suất có thể mô hình hóa vấn đề loading và hiệu suất khác nhau để đánh giá mức độ mạnh mẽ của ứng dụng. Loại kiểm tra hiệu suất dựa trên các điều kiện được áp dụng.

Một ví dụ về hiệu suất hoạt động là kiểm tra tốc độ loading, xác định khả năng load tối đa được áp dụng cho hệ thống tại thời điểm xảy ra sự cố.

Mặt khác, một ví dụ khác như kiểm tra khả năng mở rộng, áp dụng tải tăng dần lên hệ thống để đánh giá các cách thích ứng với các ứng suất hệ thống được thêm vào. Và thử nghiệm tăng đột biến đánh giá ảnh hưởng của việc áp dụng các thay đổi tải trọng lớn đột ngột lên hệ thống.

Bạn nên tiến hành kiểm tra hiệu suất trên bất kỳ hệ thống phần mềm nào trước khi đưa nó ra thị trường. Kiểm tra tính ổn định, khả năng mở rộng và tốc độ để bạn có thể xác định những gì cần khắc phục trước khi phát trực tiếp.

Usability Testing – Kiểm tra khả năng phần mềm

Kiểm tra thực tế sử dụng giao diện ứng dụng là một nhiệm vụ quan trọng. Đó là một điều cần hiểu nếu ứng dụng hoạt động như thiết kế. Đó là một điều khác để hiểu xem bản thân thiết kế có được người dùng chấp nhận hay không. Đây là lúc thử nghiệm khả năng sử dụng được đưa vào.

Với kiểm tra khả năng sử dụng, các nhà phát triển có thể đánh giá phản ứng của người dùng đối với các tính năng và chức năng của ứng dụng cụ thể. Điều này bao gồm các tính năng mà bạn có thể biết trước sẽ ít được mong muốn hơn từ góc độ người dùng nhưng cần thiết để bảo mật mạnh mẽ và hoạt động thích hợp (như yêu cầu mật khẩu mạnh).

Kiểm tra khả năng sử dụng không phải là quá nhiều về các vấn đề thẩm mỹ hoặc sửa lỗi ngữ pháp trong bất kỳ văn bản viết nào (mặc dù cả hai vấn đề đó chắc chắn đều quan trọng theo đúng nghĩa của chúng). Thay vào đó là việc người dùng cuối sử dụng ứng dụng đã hoàn thành dễ dàng như thế nào.

Phỏng dịch theo bài viết gốc được đăng tải tại freecodecamp.org

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev