Đơn xin nghỉ phép dành cho IT có những điểm gì đáng lưu ý? Đâu là những điểm đáng lưu ý của mẫu đơn xin nghỉ phép lập trình viên? Cách viết đơn xin nghỉ phép như thế nào?
Như chúng ta đều biết, việc nghỉ phép là một nhu cầu thiết yếu của người lao động. Tùy vào quy mô tổ chức, các quy định về hình thức nghỉ phép sẽ có những thể chế khác nhau. Và đơn xin nghỉ phép lúc này đóng một vai trò rất quan trọng. Cùng TopDev giải đáp những thắc mắc ban đầu nhé!
Mẫu đơn xin nghỉ phép dành cho IT là gì?
Đơn xin nghỉ phép dành cho IT là loại giấy tờ có hiệu lực và giá trị hiện hành tốt nhất về yêu cầu nghỉ phép của một cá nhân trong lĩnh vực IT. Loại văn bản này giúp nhân viên trực tiếp hoặc gián tiếp phản ánh thông điệp về sự vắng mặt trong một thời gian nhất định.
Đơn xin nghỉ phép dành cho it là loại giấy tờ có hiệu lực quan trọng khi cá nhân có nhu cầu vắng mặt.
Tương tự như CV và sơ yếu lý lịch cho dân IT, hay đơn xin nghỉ việc, đơn xin nghỉ phép lập trình viên có những đặc trưng riêng biệt. Có thể xem nó là một loại văn bản quan trọng cần có trong quy trình quản lý tổ chức nhân sự của doanh nghiệp. Đơn xin nghỉ phép thể hiện hiệu lực của nó khi đúng thời điểm, tránh những tình trạng lạm dụng. Chính thực tế này sẽ phản ánh tính trách nhiệm của mỗi cá nhân với công việc của mình.
Cách viết mẫu đơn xin nghỉ việc của lập trình viên
Tương tự như CV ngành IT, đơn xin nghỉ việc, CV IT tiếng anh, CV cho sinh viên IT mới ra trường,… format của đơn xin nghỉ việc có ý nghĩa quan trọng. Một đơn xin việc mẫu được trình bày logic, khoa học sẽ đảm bảo về tính hiệu quả và hiệu lực của nó.
Phần mở đầu
1. Quốc hiệu, tiêu ngữ
Trước khi đến với phần nội dung chi tiết, bạn cần phải triển khai viết quốc hiệu, tiêu ngữ. Cụ thể như sau:
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc
2. Tên đơn: Đon xin nghỉ phép… (Đơn nghỉ phép sẽ gắn với mục đích cụ thể tùy trường hợp thực tế).
3. Kính gửi: Đơn xin phép được gửi cho ai? Người viết đơn cần xác định rõ đối tượng cần gửi đơn. Đó có thể là cấp trên, người quản lý, Team Lead, trưởng nhóm,…
Phần nội dung
Phần này rất quan trọng và cần đảm bảo đầy đủ các nội dung như sau gồm:
– Các thông tin liên quan đến người viết đơn
– Mục đích của việc viết đơn xin nghỉ phép: Tùy từng mục đích cụ thể
– Lý do xin nghỉ phép: Các lý do phải thật sự chính đáng và hợp lý trong hoàn cảnh hiện thời của tổ chức/doanh nghiệp
– Lời cam kết về sự thật và lởi cảm ơn
– Xác nhận minh chứng thông qua chữ ký (ký và ghi rõ họ tên)
Những lưu ý khi viết đơn xin nghỉ phép dành cho IT
Nắm bắt các lưu ý sau đây sẽ giúp bạn có một lá đơn xin nghỉ phép thật sự thuyết phục.
Văn phong lịch sự
Thái độ quyết định mọi thứ. Khi bạn viết đơn xin nghỉ phép của lập trình viên, bạn cần có một thái độ lịch sử, phong thái nhẹ nhàng khi sử dụng văn phong và ngôn ngữ. Không ngoại trừ các trường hợp vì lý do chưa chính đáng, bạn có thể không được xem xét duyệt nghỉ phép.
Đừng mất bình tĩnh mà cáu gắt! Hãy giữ một thái độ hòa nhã trước việc không được đáp ứng nhu cầu. Đó là một nước đi thông mình hơn dành cho bạn.
Một lý do hợp lý
Bạn dễ dàng đưa ra một lý do phù hợp nếu bạn đang thật sự rơi vào tình thế cấp bách. Có một sự thật rằng, việc nêu rõ lý do là cách bạn nuôi dưỡng sự tin tưởng từ tổ chức. Đồng thời, đó cũng là lợi thế trong những kỳ bạn quyết định viết đơn xin nghỉ phép dành cho IT tiếp theo.
Nội dung rõ ràng và chi tiết
Ví dụ, như bạn ứng tuyển các vị trí như Mobile App Developer, bạn cần nắm bắt cách viết một CV IT Developer phù hợp. Dù là loại văn bản, giấy tờ nào thì cách tổ chức nội dung cần phải được chú trọng. Nó phải dễ hiểu và chi tiết.
Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.
Do vậy, hãy cung cấp rõ cho người quản lý về thời gian mà bạn sẽ trở lại với công việc. Đó được hiểu là lời cam kết mang dấu ấn uy tín và trách nhiệm của bạn với công việc. Đừng quên chia sẻ các thông tin liên lạc của mình. Điều này giúp cấp trên có thể liên hệ bạn trong các tình huống phát sinh.
Nếu trong trường hợp, bạn đang trực tiếp quản lý các dự án lớn, làm việc với các đối tác. Hãy bàn giao cho các đồng nghiệp hoặc cấp dưới cùng chuyên môn. Việc làm này sẽ đảm bảo cho tiến độ công việc sẽ không bị ảnh hưởng. Đồng thời, không tạo ra sự thay đổi và ảnh hướng tiêu cực đến mọi người xung quanh bạn.
Gửi email thông báo sớm – Hành động nhỏ nhưng chuyên nghiệp
Khi đã hoàn tất các nội dung, hãy gửi một email đến cấp trên để thông báo về sự vắng mặt của bạn. Gửi càng sớm sẽ giúp cho việc lập kế hoạch dự phòng cho các công việc một cách tốt hơn.
Do vậy, hãy gửi kèm đơn xin nghỉ phép dành cho IT của bạn thông qua email nhé! Dù là hành động nhỏ nhưng bân nên làm. Hành động này cũng cho thấy bạn đang tôn trọng người cấp trên và chu đáo trong mọi việc.
Chúng ta thấy <Header name=”CODEGYM”/> sẽ tạo ra thuộc tính name có giá trị là CODEGYM. Nhìn thì giống như cách gọi hàm, đúng như vậy props chuyển đến component tương tự như một đối số chuyển đến hàm.
Ngoài ra props cũng có thể được tạo mặc định như dưới:
Bạn có thể thay đổi props bằng cách sử dụng setProps hay replaceProps nhưng nó không được khuyến khích (https://reactjs.org/blog/2015/10/07/react-v0.14.html#new-deprecations-introduced-with-a-warning)
Kể từ lúc chúng ta truyền props vào component thì chúng không được thay đổi. Điều này giúp bạn nghĩ đến sẽ sử dụng props cho bất kì component nào mà luôn hiển thị cùng 1 đầu ra cho cùng 1 đầu vào. Điều này giúp chúng ra dễ dàng kiểm soát nó.
State
Giống như props thì state cũng lưu giữ thông tin cho component. Tuy nhiên cách hoạt động khác với props, state là thành phần của component còn props là tham số được truyền từ bên ngoài vào.
Khi nào thì sử dụng state?
Bất kể khi nào dữ liệu thay đổi trong component thì sử dụng state. Có một lưu ý nhỏ là chúng ta không nên cập nhật state bằng cách sử dụng trực tiếp this.state mà luôn sử dụng setState để cập nhật state của các đối tượng. Sử dụng setState để re-renders một component và tất cả các component con.
Bài viết được sự cho phép của tác giả Nguyễn Chí Thức
Thư viện Python là gì?
Đầu tiên, bạn nên hiểu rằng các thư viện Python không khác với các thư viện thông thường chứa những cuốn sách. Cả hai đều là bộ sưu tập các nguồn thông tin.
Learning about python libraries
Tuy nhiên, thay vì sách, bạn sẽ truy xuất các mô-đun áp dụng trong quá trình coding của mình. Tất cả các nhà phát triển chuyên nghiệp tận dụng các mô-đun tài liệu thường được ghi lại cho quá trình học Python của mình. Nếu có một cách dễ dàng như vậy, tại sao không nên thực hiện theo cách này?
Trong quá trình học Python và khi bắt đầu nghiên cứu các thư viện Python, bạn sẽ bị chìm đắm bởi số lượng thư viện chính và bên thứ ba. Có rất nhiều bộ sưu tập các mô-đun có sẵn. Bạn có thể cảm thấy băn khoăn khi không biết phải quyết định khám phá cái nào trong số chúng. Nếu đang cố gắng học những lĩnh vực khác nhau trên con đường lập trình thì khá khó để chọn một thư viện phù hợp nhất.
Bạn nên biết rằng Python là một ngôn ngữ linh hoạt. Nó là một viên ngọc quý trong thế giới lập trình. Vì cách sử dụng của nó sẽ được sử dụng từ khoa học dữ liệu, phát triển web và thậm chí đến cả học máy. Nếu là một lập trình viên Python mới bắt đầu, chúng tôi khuyến khích bạn tham gia khóa học dưới đây để có thêm được kiến thức sâu hơn.
Nhìn chung, các thư viện Python khác nhau sẽ bao gồm các mô-đun cho các lĩnh vực cụ thể. Chúng ta sẽ cùng bắt đầu tìm hiểu các thư viện TensorFlow, PyTorch, Numpy, Sklearn và một số thư viện phổ biến khác là gì?
Trước đó, có phải bạn đã rất cố gắng để tìm một công việc lập trình viên Python phải không? Trong những trường hợp như vậy, chúng tôi khuyên bạn nên đọc một số câu hỏi phỏng vấn Python mà nhà tuyển dụng thường hỏi. Nếu không trả lời được chúng thì có thể bạn sẽ bị đánh giá là không có sự chuẩn bị. Giả sử một trong những câu hỏi phỏng vấn Python yêu cầu trình bày về các thư viện Python. Sau khi đọc bài viết này, bạn sẽ có thể trình bày một số điểm chính về chúng.
API (application programming interface) là tên viết tắt của giao diện lập trình ứng dụng. Nó mở ra cửa sổ cho các tương tác giữa các ứng dụng thông qua giao tiếp giữa máy với máy. Python có các khung framework làm tăng tốc quá trình tạo API. Do đó, nhiệm vụ của chúng tôi là thảo luận ngắn gọn về các thư viện Python phổ biến nhất có thể cho trong quá trình làm việc và học lập trình Python:
Flask
Flask là một framework trang web phát triển nhanh, được tạo ra cho quy trình thiết kế API hiệu quả hơn. Đây chỉ là một trong những cách sử dụng của Flask.
Nói chung, nó là một khung framework để phát triển ứng dụng web.
Flash rất nhẹ, cung cấp hỗ trợ để kiểm tra đơn vị và cookie an toàn cho các phiên phía khách hàng.
Các nhà phát triển khen rằng khung framework này là tài liệu tốt, có nghĩa là bạn sẽ tìm thấy nhiều trường hợp sử dụng để tìm hiểu.
Django
Django là một khung framework trang web bên thứ ba dựa trên Python khác.
Trong số các thư viện Python khác, mục đích chính của Djangos trong khung framework này là đơn giản hóa quá trình phát triển các trang web dựa trên cơ sở dữ liệu phức tạp.
Thư viện Django cung cấp nhiều công cụ quản lý. Do đó, các nhà phát triển sẽ có thể tạo ra các phần mã code mà không phải chuyển sang các công cụ khác.
Django REST là khung framework để tạo các Web API với mã code tối thiểu.
Falcon
Falcon là một khung framework trang web nhẹ, tuân thủ SWGI, được thiết kế để xây dựng các RESTful API.
Người mới bắt đầu đánh giá cao các hướng dẫn tài liệu cung cấp nhiều hướng dẫn cho việc tạo dự án đầu tiên.
Falcon chạy trên bất kỳ phần cứng nào và chỉ phụ thuộc vào hai phụ thuộc của bên thứ ba.
Eve
Eve là một khung framework REST API dựa trên Python miễn phí, được cung cấp bởi Flask và Cerberus.
Nó cho phép phát triển nhanh chóng các dịch vụ web RESTful độc đáo, giàu tính năng.
Khung framework hỗ trợ MongoDB và tương thích cao nhờ các tiện ích mở rộng.
Ngành công nghiệp CNTT đang thúc đẩy sự phát triển của máy móc thông minh, có khả năng thể hiện hành vi giống con người khi nó được học. Mô phỏng trí thông minh của con người này được cung cấp bởi nhiều thư viện Python được thiết kế đặc biệt để thúc đẩy ngành khoa học máy tính. Nếu muốn làm cho một cỗ máy suy nghĩ, học hỏi và có khả năng giải quyết vấn đề được thì hãy nên ghi nhớ các thư viện có thể giúp tạo ra bước đột phá đó dưới đây:
TensorFlow
TensorFlow là một thư viện mã nguồn mở.
Tính toán số trong mô-đun này tích hợp việc sử dụng biểu đồ luồng dữ liệu.
Đưa ra một viễn cảnh khác về khái niệm hóa các hành động toán học.
Với khung framework này, bạn có thể tạo các mạng nơ-ron và đào tạo chúng.
PyTorch
PyTorch là một thư viện mã nguồn mở.
Nó là một khung framework dựa trên Lua (là một ngôn ngữ lập trình thông dịch với đặc điểm nhỏ gọn, đa nền tảng), được thiết kế để xây dựng các mô hình và quy mô sản xuất.
Mô-đun này cung cấp một loạt các thuật toán học máy.
PyTorch cho phép người dùng thực hiện các tính toán tenor phức tạp.
Ngoài ra, nó là đối thủ lớn nhất của TensorFlow.
Theano
Theano là một thư viện dựa trên Python để thực hiện các hoạt động toán học cho các mảng đa chiều.
Khung framework sử dụng GPU thay vì CPU, dẫn đến mức năng suất cao hơn.
Với Theano, các nhà phát triển tạo ra các mô hình học tập sâu hoặc thư viện wrapper library.
Một lợi thế khác là khả năng quản lý các loại tính toán cần thiết cho các thuật toán mạng nơ-ron lớn.
Keras
Keras là một thư viện dựa trên Python để phát triển các mô hình học tập sâu.
Nó cũng tương thích với các thư viện Python khác (TensorFlow hoặc Theano).
Mục đích chính của khung framework này là tạo mẫu nhanh của các mạng nơ-ron.
Các nhà phát triển có thể thử nghiệm với các mạng nơ-ron sâu và đào tạo chúng.
Scikit-learn
Scikit-learn hoặc Sklearn là một thư viện dựa trên Python để xây dựng các mô hình học máy.
Nó cung cấp nhiều thuật toán học tập cho phép hồi quy, phân cụm và phân loại.
Sklearn tương thích với NumPy và SciPy. Điều đó có nghĩa là có thể tương tác với các thư viện khác nhau cho Python một cách dễ dàng. Thông tin thêm về thư viện này sẽ được cung cấp trong các phần sau trong hướng dẫn Python này.
PyTorch và TensorFlow
Một cuộc tranh cãi gay gắt về sự vượt trội giữa hai thư viện này đã diễn ra trong một thời gian. Tuy nhiên, không ai có thể phủ nhận rằng chúng là những thư viện Python hàng đầu. Cả PyTorch và TensorFlow đều được thiết kế để cung cấp các mô-đun cho máy học, học sâu và quản lý mạng nơ-ron.
Vì cả hai khung framework này hoạt động trong các lĩnh vực tương tự nhau nên sẽ có sự cạnh tranh lành mạnh giữa chúng. Hãy xem xét những khác biệt chính, ưu điểm của chúng và cố gắng giải quyết tranh luận này.
Facebook và Google: Hai “ông trùm” sáng tạo và nổi tiếng
Đây là hai “ông trùm” trong ngành kinh doanh CNTT đã tạo ra các thư viện này. PyTorch là một kiệt tác của Facebook và nó dựa trên Torch. Và TensorFlow là gì? Nó là một viên ngọc được cung cấp bởi Google. Nó dựa trên Theano. Nói cách khác, cả hai thư viện này đều có cha mẹ là những “ông trùm” giàu có và nổi tiếng.
Hỗ trợ cho Windows
Đôi khi, người dùng hệ điều hành Microsoft Windows không được hỗ trợ bởi thư viện PyTorch. Thư viện máy học mã nguồn mở này đã phát hành hỗ trợ Windows PyTorch vào tháng 4 năm 2018. TensorFlow đã tiến hành bước này để thu hút người dùng Windows trước đó, vào năm 2016.
Hỗ trợ cho các hệ điều hành khác
Danh sách các hệ thống được hỗ trợ vẫn khác nhau giữa hai thư viện Python này. Mặc dù bổ sung hỗ trợ Windows PyTorch đã được đón nhận rất tốt, nhưng TensorFlow vẫn có nhiều thứ để cung cấp hơn. Trong khi PyTorch hỗ trợ Linux, macOS và Window thì TensorFlow có thể sử dụng được trên Linux, macOS, Windows, Android và JavaScript. Google đã phát hành một TensorFlow.js 1.0 dành cho học máy bằng JavaScript.
Sự khác biệt trong đồ thị tính toán
Khi cố gắng giải quyết sự tranh luận giữa PyTorch với TensorFlow, không thể không nhắc đến sự khác biệt trong cách chúng xử lý các computational graph (biểu đồ tính toán). Các biểu đồ như vậy là rất quan trọng để tối ưu hóa các mạng mã code nơ-ron. Tại sao? Vì chúng làm ta có thể thấy được dòng chảy của hoạt động và thông tin.
Với PyTorch, các lập trình viên tạo dynamic graphs (các biểu đồ động), được thiết kế bằng cách diễn giải các dòng mã code đại diện cho các phần cụ thể của biểu đồ. TensorFlow chọn một cách tiếp cận khác để sản xuất đồ thị. Các biểu đồ phải tuân theo quy trình biên soạn. Sau đó, họ phải chạy bằng Công cụ thực thi TensorFlow.
Nghe có vẻ như sẽ có nhiều công việc phải thực hiện hơn đúng không nào? Nếu muốn tạo đồ thị bằng cách sử dụng TensorFlow, bạn sẽ được yêu cầu tìm hiểu về kiểm tra biến. Ngoài ra, PyTorch cho phép bạn sử dụng trình gỡ lỗi Python thông thường. TensorFlow thì lại không sử dụng tiêu chuẩn đó. Vì vậy, nếu cần phải chọn giữa các thư viện Python này và muốn tạo biểu đồ mà không phải tìm hiểu các khái niệm mới, PyTorch nên là sự lựa chọn của bạn.
Trực quan hóa các mô hình học máy
Ấn tượng đầu tiên là tất cả. Khi đang thuyết trình về dự án của mình, việc cung cấp trực quan chính xác và dễ theo dõi là rất hữu ích. TensorFlow cung cấp cho các nhà phát triển TensorBoard, cho phép trực quan hóa các mô hình học máy. Các lập trình viên sử dụng công cụ này để phát hiện lỗi và để thể hiện tính chính xác của đồ thị. PyTorch không có chức năng như vậy, nhưng bạn có thể sử dụng các công cụ được thiết kế cho nền tảng khác để đạt được kết quả tương tự.
Cộng đồng người dùng
Các thư viện Python này cũng khác nhau về mức độ phổ biến hiện tại của chúng. Đừng quá ngạc nhiên. TensorFlow đã tồn tại lâu hơn, có nghĩa là nhiều lập trình viên đang sử dụng khung này cho các mục đích học máy và học tập sâu. Do đó, nếu gặp phải một loạt các vấn đề khó khăn trong quá trình làm dự án thì nên tìm đến cộng đồng TensorFlow vì nó lớn hơn PyTorch.
Vậy giữa PyTorch và TensorFlow, thư viện nào tốt hơn?
Chúng tôi đã tuyên bố sẽ kết thúc cuộc trang luận PyTorch và TensorFlow với số điểm so sánh rõ ràng. Tuy nhiên, nói thì dễ hơn làm. Các lập trình viên nên chọn khung framework phù hợp với nhu cầu nhất. Ngoài ra, đây là một giới thiệu ngắn gọn về cả hai thư viện. Chúng tôi không thể đưa ra các giả định dựa trên một số khác biệt. Bạn sẽ phải chọn khung framework nào là người bạn mới tốt nhất trong quá trình làm việc và học lập trình Python.
NumPy là gì?
Bạn sẽ có thể hiểu mục đích chung của thư viện này sau khi biết tên đầy đủ của nó: Numerical Python (Python số). Nó có nghĩa là các mô-đun xử lý số. NumPy là phần mềm mã nguồn mở để tạo và quản lý các mảng và ma trận đa chiều. Thư viện này bao gồm một loạt các chức năng để xử lý các mảng phức tạp như vậy.
Vậy, NumPy là gì? Đây là một trong những thư viện Python, chuyên cung cấp các hàm toán học cấp cao để quản lý các mảng đa chiều. Bằng cách truy xuất các mô-đun từ NumPy, bạn sẽ hoàn thành các tính toán đúng đắn và chính xác. Hơn thế nữa bạn sẽ cải thiện đáng kể việc sử dụng Python với các cấu trúc dữ liệu này.
Thư viện Sklearn: mục đích sử dụng
Ví dụ cuối cùng của các thư viện Python là Sklearn, được phát triển vào năm 2007. Tuy là cuối cùng nhưng không kém phần quan trọng, vì nó cũng được đánh giá cao bởi các nhà phát triển làm việc với học máy. Sklearn (còn được gọi là scikit-learn) là một thư viện, để nhóm một nhóm các đối tượng không được gắn nhãn, ước tính mối quan hệ giữa các biến và xác định phân loại các quan sát mới.
Nói cách khác, có thể lấy một số lượng lớn các thuật toán học tập để học máy hiệu quả hơn. Thư viện Python miễn phí – Sklearn là một công cụ rất hữu ích cho mô hình thống kê và, tất nhiên, học máy!
Bài viết được sự cho phép của BQT Kinh nghiệm lập trình
Chào mọi người, tiếp tục với phần chia sẻ lần trước (phần 1), hôm nay mình xin tiếp tục chia sẻ với các bạn thêm một vài tool mà mình thường dùng cho web developer.
1. Image Fillter
Đối với những bạn thích selfie hay thích chụp hình đều biết đến photoshop, lightroom hay muốn nhanh gọn thì dùng instagram hoặc B612… Giờ đây bạn cũng có thể ứng dụng một vài bộ lọc này lên hình ảnh để có một bộ ảnh đẹp tuyệt vời không kém. Yên tâm nó rất nhẹ, vì chỉ với vài dòng CSS thôi.
Lại nói về Photoshop… web developer mà kiểu gì không dính tới photoshop phải không các bạn. Ở photoshop muốn style cho chữ lung linh thật đơn giản với blending option thì ở css mình cũng không thua kém khi dùng biết kết hợp giữa background, color, text-shadow… à mà thôi bỏ đi. Mình có tool này rất hay đây.
Đây là một thư viện mình đã bookmark từ lâu, và thường xuyên dùng cho những layout yêu cầu độ thẩm mỹ. Về effect mình thấy lib này khá đẹp và thuần css rất nhẹ.
Với những website của Nhật ở phần first view họ yêu cầu effect phong phú làm Dev đau đầu. Mình xin giới thiệu một lib css khá xịn, đa số những bài tủ của mấy anh Nhật đều gói gọn ở đây.
Frontend dev ngoài vấn đề về layout hiển thị trên nhiều browser đã khổ, nay còn phải mất nhiều thời gian cho việc “makeup” website thật phong phú và lộng lẫy. Chính vì vậy mình muốn cùng đóng góp một vài tool hữu ích hơn nữa. Hy vọng những công cụ này có thể hỗ trợ phần nào cho công việc lên ý tưởng, hoàn thiện thiết kế UI và phát triển phần code Frontend cho các dự án của các bạn.
Sơ yếu lý lịch cho IT là một yếu tố quan trọng trong bộ hồ sơ xin việc. Liệu bạn đã biết mẫu sơ yếu lý lịch cho IT gồm những gì? Cách viết sơ yếu lý lịch cho IT thế nào để tạo được sức hút? Đừng lo lắng vì qua bài viết sau đây, TopDev sẽ cho bạn những thông tin bổ ích nhất về sơ yếu lý lịch
Sơ yếu lý lịch là gì?
Sơ yếu lý lịch là một thuật ngữ mô tả tên gọi không quá xa lạ. Tuy nhiên, ở mỗi ngành nghề thuộc từng lĩnh vực chuyên môn khác nhau, sơ yếu lý lịch có nhiều cách định nghĩa. Chính điều này cũng tạo nên các góc nhìn đa dạng hơn về quy chuẩn.
Hiểu một cách đơn giản nhất, sơ yếu lý lịch (còn được gọi là lý lịch trích ngang). Nó là một bản được trình bày vắn tắt nhằm kê khai các thông tin của một cá nhân. Cụ thể các thông tin bao gồm: tên, tuổi, ngày tháng năm sinh, hoàn cảnh cá nhân; các thông tin chi tiết tương ứng từng danh mục.
Và trong giới hạn bài viết này, TopDev sẽ đề cập đến sơ yếu lý lịch cho IT.
Có điều gì đặc biệt ở Sơ yếu lý lịch cho IT?
Sơ yếu lý lich cho IT vẫn giữ các format thông thường của một mẫu lý lịch. Tuy nhiên, điểm khác là tùy vào vị trí ứng tuyển sẽ quyết định phần nội dung chi tiết của một mẫu sơ yếu lý lịch cho lập trình viên. Đó có thể là những nội dung về trình độ chuyên môn, các khoa học cho dân IT. Chính điều này tạo nên đặc điểm chuyên biệt của bản sơ yếu lý lịch cho lập trình viên.
Sơ yếu lý lịch cho IT là một trong những yếu tố cần có trong bộ hồ sơ nghề nghiệp
Trong bộ hồ sơ xin việc của một ứng viên, ngoài CV, và các dữ liệu lưu trữ quan trọng (sẽ bổ sung dựa trên các yêu cầu từ các tổ chức/doanh nghiệp ứng viên ứng tuyển) thì mẫu sơ yếu lý lịch cho IT được xem là một “thành tố” không thể thiếu.
Bạn hiểu gì về Sơ yếu lý lịch cho IT bằng tiếng Anh?
Việc ứng viên dùng tiếng anh để hoàn thiện mẫu lý lịch cho lập trình viên được xem là một lợi thế lớn. Đặc biệt là trong thị trường tuyển dụng cạnh tranh như hiện tại.
Thế nhưng, bạn đã từng hiểu rõ về Sơ yếu lý lịch cho IT tiếng anh chưa? Có một sự thật là sơ yếu lý lịch cho lập trình viên trong tiếng anh được hiểu là “Curriculum Vitae” hay “CV”. Chính điều này đã khiến các ứng viên dễ nhầm lẫn giữa sơ yếu lý lịch cho IT với CV xin việc trong tiếng việt. Đồng thời cũng thắc mắc liệu CV là gì? Thế nào là CV IT tiếng anh?Tất nhiên, chúng hoàn toàn khác nhau.
Phân biệt Sơ yếu lý lịch dân IT và CV xin việc CNTT
Nếu bạn có những hiểu biết cơ bản về mẫu sơ yếu lý lịch cho lập trình viên và CV xin việc CNTT, bạn sẽ không nhầm lẫn giữa chúng.
CV tập trung thể hiện nhiều khía cạnh về giá trị từ các yếu tố: trình độ học vấn, các mục tiêu nghề nghiệp thông qua các quan điểm (thể nghiệm cá nhân), các năng lực – kỹ năng,…
Ví dụ như đối với một CV IT Developer, ứng viên phải trình bày cho nhà tuyển dụng thấy được các mục nội dung phản ánh các giá trị về trình độ năng lực, các kỹ năng từ cơ bản đến chuyên sâu thuộc lĩnh vực chuyên ngành IT, những mục tiêu và các kế hoạch phát triển tiếp theo khi theo đuổi ngành lập trình, và nhiều hơn thế,…
Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.
Trong khi đó, một bản sơ yếu lý lịch cho lập trình viên lại được chuẩn hóa một cách chi tiết hơn về tất cả các thông tin. Nó đi từ góc độ bao quát đến chi tiết tất tần tật từ thông tin cá nhân. Từ thời gian được đào tạo (training) đến quá trình công tác của một ứng viên. Nhiều cơ quan doanh nghiệp nhận thấy sơ yếu lý lịch cho lập trình viên thật sự quan trọng. Vì nó giúp nhà tuyển dụng nói riêng và tổ chức nói chung tối ưu hóa quy trình quản lý ứng viên/nhân viên của mình một cách tốt hơn.
Hướng dẫn viết mẫu sơ yếu lý lịch cho lập trình viên siêu chuẩn
1. Bìa của sơ yếu lý lịch
Các thông tin lần lượt bao gồm”
Ảnh 4×6 (có đóng dầu giáp lai của cơ quan có thâm quyền)
Thông tin về: ngày tháng năm sinh, giới tính, hộ khẩu thường trú, CMND, số điện thoại
Thông tin về người liên hệ cá nhân khi cần (Khi cần báo tin cho ai?), địa chỉ liên lạc (Ở đâu?)
Số ký hiệu và ký tự
Đây là phần bạn chỉ cần liệt kê các thông tin cơ bản của mình. Lưu ý, phải điền thật chuẩn xác. Kiểm tra lại sau khi viết, tránh sai sót và tẩy xóa.
2. Nội chung chi tiết sơ yếu lý lịch
Bước nền cơ sở – Sự chuẩn bị đầu tiên
Để không mất quá nhiều thời gian cho công đoạn đầu, bạn hãy chuẩn bị sẵn các giấy tờ như: CMND, giấy khai sinh, thẻ đoạn viên, đảng viên (nếu có),… để có thể nhập thông tin một cách chính xác và nhanh chóng nhất.
Nội dung sơ yếu lý lịch tự thuật
Không khó để tìm các mẫu sơ yếu lý lịch IT theo mẫu chuẩn. TopDev sẽ hướng dẫn các bạn cách viết và điền sơ yếu lý lịch.
Các thông tin được trình bày và bổ sung theo thứ tự như sau:
Ảnh 4×6, thông tin về họ tên, ngày tháng năm sinh, nguyên quán, hộ khẩu thường trú và tạm trú, số CMND.
Trình độ phổ thông, trình độ thảo luận chính trị, ngày vào Đoàn, ngày vào Đảng.
Thông tin gia đình: ghi rõ họ tên, năm sinh, ngành nghề nghiệp, môi trường công tác của thành viên gia đình bạn.
Tóm lược quá trình và thời gian đào tạo, cố vấn, hoạt động – công tác. Tên tổ chức/doanh nghiệp, ngành nghề, vị trí, các văn bằng có liên quan,…
Phía dưới cùng là chữ ký của người khai và dấu xác nhận minh chứng của cơ quan có thẩm quyền (địa phương của bạn).
Lưu ý những tip viết sơ yếu lý lịch cho lập trình viên
Đây cũng được xem là các hướng dẫn chi tiết giúp bạn có một bản sơ yếu lý lịch dân lập trình viên.
Một vấn đề cần lưu tâm chính là hãy khai thông tin một cách trung thực. Các nội dung (content) và format (cách trình bày) đều được chuẩn hóa theo các trình tự (order). Do vậy, đừng viết sai lệch sự thật. Không nên sửa đổi vị trí nội dung; trình bày sai định dạng mẫu sơ yếu lý lịch ngành IT. Không tẩy xóa và nhờ người không hiểu rõ về bạn khai thông tin.
Trình tự hướng dẫn quá trình khai lý lịch
Các thông tin cơ bản
Họ và tên: Cần viết đúng chính xác, rõ ràng. Ghi chữ in hoa tương ứng với thông tin trong CMND
Giới tính: Ghi “nam” là là nam và “nữ” nếu là nữ.
Ngày tháng năm sinh: Viết chính xác từng con số.
Địa chỉ thường trú: Viết rõ các thông tin về nguyên quán được đối chiếu chính xác trong CMND .
Địa chỉ hiện tại: Viết rõ các thông tin về nơi ở: số nhà, tên đường, phường (xã), quận (huyện), tỉnh (thành phố).
Thông tin về CMND: Ghi chính xác rõ dãy số, ngày tháng năm cấp CMND.
Khi cần báo tin cho ai, ở đâu: ghi rõ tên, địa chỉ, số điện thoại liên lạc của người cần báo tin.
Bí danh: điền bí dạnh đã sử dụng (nếu có)
Nguyên quán: Thông tin về nơi ở được ghi trong chứng minh thư.
Dân tộc: viết chính xác dân tộc như: Kinh, Thái, Tày, Nùng, Mường…
Trường hợp nếu là con lai người nước ngoài thì ghi rõ quốc tịch, dân tộc của bố, mẹ là người nước ngoài).
Tôn giáo: ghi rõ đạo Phật, đạo Thiên chúa, đạo Hồi, đạo Cao Đài, đạo Hoà Hảo,… ghi cả chức sắc trong tôn giáo (nếu có). Nếu không theo đạo nào thì ghi “không”.
Các thông tin chi tiết
Trình độ chuyên môn: ghi rõ trình độ cao nhất của bản thân. Các gợi ý thực tế: bổ túc văn hóa, đào tạo trung cấp nghề, 12/12, cử nhân, thạc sĩ, tiến sĩ… Cụ thể gắn các cấp bậc học vấn với các trị ngành IT.
Tuy thuộc một số doanh nghiệp sẽ yêu cầu chi tiết hơn. Lúc đó, bạn cần ghi rõ chuyên môn được đào tạo là gì? Thuộc ngành nghề nào? Theo hệ chính quy hay các hệ khác.
Trình độ luận chính trị: sơ cấp, trung cấp,…
Trình độ ngoại ngữ: viết theo văn bằng hoặc chứng thực đã được cấp. Thực tế theo hệ hiện hành có hai hình thức trình bày: Dạng chứng chỉ các ngoại ngữ (Anh, Hàn, Trung, Nhật,..) A,B,C; dạng chứng chỉ quốc tế IELTS, TOEIC,…
Cấp bậc: Bậc lương đang hưởng (nếu có)
Lương chính bây giờ: theo ngạch chuyên viên,…(nếu có)
Hoạt động của bản thân: Tóm sơ lược các hoạt động học tập, làm việc, vị trí làm việc, nơi làm việc.
Khen thưởng: viết rõ tháng năm, hình thức được khen thưởng. (nếu có)
Kỷ luật: viết rõ tháng năm, lý do sai phạm, hình thức kỷ luật (nếu có).
Các mẫu Sơ yếu lý lịch IT chuẩn
1-Mẫu sơ yếu lý lịch IT2-Mẫu sơ yếu lý lịch IT3-Mẫu sơ yếu lý lịch IT4-Mẫu sơ yếu lý lịch IT
Hẳn là có nhiều lúc bạn sẽ đắn đo suy nghĩ về những side project vui, thú vị mà mình có thể tự tay build, mà chưa thật sự có ý tưởng gì hay ho nên cảm thấy chán và nản dần. Vậy tại sao không thử build project gì đó vừa vui mà vừa luyện thêm vài kỹ năng mới?
Mình sẽ liệt kê một danh sách những thứ theo mình là vừa vui vừa hơi hóc búa để luyện trình, từ đó có thể cải thiện kỹ năng của bạn rất nhiều:
Xe Lego tự lái
Xe logo tự lái
Một thời gian trước mình từng làm một dự án tương tự thế này, mục tiêu là tạo ra chiếc xe đồ chơi từ Lego mà có thể viết một từ nào đó lên mảnh giấy.
Thì cái project này hướng đến việc làm chiếc xe hơi từ Lego (hay Lego Technic) có thể tự lái mà không va chạm vào các vật khác. Với project này, bạn sẽ cần một Raspberry Pi (hoặc Arduino) hay thiết bị cảm biến sóng siêu âm (ultrasonic sensor) để tránh vật cản. Nếu bạn chưa bao giờ đụng đến Raspberry Pi (hoặc Arduino) thì mình cực kỳ recommend sử dụng và làm quen thiết bị này, bởi sự kết hợp giữa phần cứng và mềm là điểm thú vị của project này.
Bạn sẽ học được:
Cách sử dụng cơ bản Arduino (hay Raspberry Pi)
Đọc cảm biến
Tương tác giữa software và hardware
Ứng dụng catalog
Ứng dụng catalog
Tạo catalog thì đã có khá nhiều dự án rồi, nhưng bạn có thể thêm thắt vào vài chi tiết như sử dụng Flutter.
Flutter là bộ toolkit UI từ Google, cho phép bạn tạp một native mobile application với một codebase duy nhất. Nó sử dụng ngôn ngữ lập trình Dart. Flutter hiện nay đang khá hot và được nhiều người quan tâm đấy.
Giải đố sudoku thì không cần giới thiệu nữa, nó là ứng dụng khá hay khi tập build thuật toán. Mục tiêu của project này là tạo một thuật toán có thể tự động tạo ra câu đố Sudoku hợp lệ.
Nếu dễ quá thì bạn có thể làm thêm 1 bước nữa đó là build thuật toán giải Sudoku với thuật toán quay lui: Backtracking alogorithm.
Thậm chí bạn có nâng trình hơn bằng cách thêm level khó hơn vào câu đố Sudoku
Phân loại xe hơi
Car classification
Phân cụm và phân loại (Clustering và Classification) là một phần trong Machine learning. Mục tiêu của proect này là phân loại độ an toàn của xe hơi dựa trên data của chúng. Nếu bạn chưa quen với giới ML thì project này khá ổn để bạn luyện trình của mình đó. Và để bắt đầu thì bạn có cần có data set.
Nếu bạn từng muốn thử sức với lập trình game thì ban có thể cân nhắc build một game 2D. Vì là những buớc đầu tiên trong quá trình làm quen với lập trình game nên bạn sẽ học được nhiều cái thú vị lắm, từ đó đẩy mạnh kỹ năng lập trình của mình.
Bạn cũng chưa cần phải nghĩ ra một ý tưởng nào đó hoàn toàn mới, bạn có thể build lại game rất nổi tiếng Flappy Bird của Nguyễn Hà Đông – phiên bản dành cho mobile hay máy tính.
Progressive Web App đang khá hot, mà kiểm soát phạm vi của PWA cũng không phức tạp nên hoàn toàn phù hợp cho một side-project. Nếu có ý định build một PWA thì đây là lúc thích hợp để kết hợp với một trong top JavaScript framework hiện nay – là Angular, React, Vue. Có thể research trước và chọn ra framework phù hợp với mình.
Bạn sẽ học được:
Mọi thứ cần cho PWA
Một framwork JavaScript theo ý mình
Xây web cơ bản như HTML/CSS
Bắt tay vào thôi! project vui
Hy vọng bạn đã tìm được một project thú vị mà không kém phần thử thách trong list của mình. Chắc chắn bạn sẽ học được rất nhiều điều mới khi bắt tay làm dù chỉ là một trong những project như vầy.
Để đạt được những điều đó thì mình đã đặt ra các tiêu chuẩn code như sau:
Khi so sánh thì dùng === thay vì ==
== và === dù chỉ khác nhau 1 dấu bằng, nhưng sẽ dẫn đến các kết quả rất khác nhau trong JavaScript.
Không nên:
if (val == 2)
Nên:
if (val === 2)
Đừng dùng var mà hãy dùng let
Lý do đơn giản là vì let có thể xử lý các vấn đề phạm vi (scoping issue) của var trong JavaScript
Không nên:
var myVar = 10;
Nên:
let myVar = 10;
Dùng const thay cho let
Cái này sẽ ngăn chặn dev thay đổi những thứ không cần thiết và giúp cải thiện readability.
Không nên:
let VAT_PERCENT = 20;
Nên:
const VAT_PERCENT = 20;
Luôn luôn dùng dấu chấm phẩy (;)
Dù dấu chấm phẩy không bắt buộc trong JavaScript khi kết thúc câu lệnh như các ngôn ngữ khác, tuy nhiên nếu dùng ; sẽ giữ tính nhất quán ở các dòng code, giúp phân cách giữa các dòng lệnh.
Sử dụng template literal (template strings) để khai báo chuỗi
Template literal thực chất cũng là string literal, cú pháp để khai báo chuỗi trong JavaScript. Đây là tính năng mới có trong ECMA6, cho phép embed biểu thức JavaScript bên trong chuỗi mà không cần dùng phép cộng.
Không nên:
let fullName = firstName + " " + lastName;
Nên:
let fullName = `${firstName} ${lastName}`;
Ưu tiên dùng arrow function ES6
Khi viết biểu thức hàm (function) thì dùng arrow function sẽ có cú pháp ngắn gọn hơn, chúng là hàm nặc danh và thay đổi con trỏ this bind đến functions.
Với các cấu trúc điều kiện (ví dụ như if, else, for, do, while,…) thí dùng ngoặc nhọn {} là điều bắt buộc. Bởi nếu không dùng thì sẽ gây hiện tượng tạo nên 1 statement bên dưới như sau:
Ví dụ:
if (myNumber === 0)
doSomething();
doSomethingElse(); // Đây là câu lệnh//
Nhưng đây mới là cách nó chạy
if (myNumber === 0) {
doSomething();
}
doSomethingElse();
If lồng trong if rất dễ gây nhầm lẫn và khá khó để đọc, hãy cố gắng lựa chọn cách viết khác để thay đổi cấu trúc này, biết đâu có lúc cần kiểm lại code và thay đổi code thì sao:
Không nên:
if (myNumber > 0) {
if (myNumber > 100) {
if (!hasDiscountAlready) {
return addDiscountPercent(0);
} else {
return addDiscountPercent(10);
}
} else if (myNumber > 50) {
if (!hasDiscountAlready) {
return addDiscountPercent(5);
}
} else {
if (!hasDiscountAlready) {
return addDiscountPercent(0);
} else {
return addDiscountPercent(1);
}
}
} else {
error();
}
Tuy rằng mỗi dự án mỗi khác nên sẽ rất khó để thực hiện điều này, nhưng hãy cân nhắc mỗi khi thấy vài đoạn code đang trở nên phình to hơn, khi có kinh nghiệm rồi bạn sẽ tìm được độ dài phù hợp.
Ví dụ:
files chứa tối đa 80 dòng code
functions chứa tối đa là 15 dòng code
Tên file viết thường
MyFile.js nên để là myFile.js
Dùng tham số mặc định
Trong JavaScript nếu bạn không gán giá trị bới tham số khi gọi function thì nó sẽ thành undefined
Không nên:
myFunction(a, b) {
return a + b;
}
Nên:
myFunction(a = 0, b = 0) {
return a + b;
}
Shorthand cho boolean
Không nên:
if (isValid === true)
if (isValid === false)
Nên:
if (isValid)
if (!isValid)
Hạn chế ternary statements không cần thiết
Thay vì:
const boo = a ? a : b;
Hày dùng:
const boo = a || b;
Dùng một biến duy nhất mỗi lần khai báo
Có nhiều ý kiến khác nhau về việc tách ra kiểu vầy nhưng mình thì cảm thấy khai báo nhiều cái một lúc sẽ dễ bị nhầm lẫn hay sót.
Thay vì viết:
let a = 1, b = 2;
Thì mình làm:
let a = 1;
let b = 2;
Kết luận
Coding standard trong bất kỳ ngôn ngữ nào đều giúp cải thiện độ readability và maintainability – tính bảo trì của application. Bạn có thể gặp rào cản trong việc thống nhất coding standard trong team, thì hãy thử qua những cách sau:
Desk review (nghiên cứu tại bàn), xem xét từng dòng code một
Tạo một application thống nhất từ đầu đến cuối, để các lập trình viên biết cần thêm/update cái gì
Khi tạo cái gì mới thì hãy để senior dev bắt đầu để tạo nên guideline cho các thành viên khác trong team.
TL;DR: Abstractions (tính trừu tượng) sẽ là chìa khóa giúp code được đơn giản hóa đến mức tối đa. Khi code đơn giản, số lượng code cũng từ đó giảm đi. code trở nên dễ đọc, dễ adapt và duy trì hơn.
Liệu rằng có phím tắt nào đẩy hiệu quả lên gấp 10 lần hay không? Nếu bạn biết bí mật này – sẽ mở ra một thế giới hoàn toàn mới về hiệu quả và khả năng phát triển phần mềm cho bạn?
Có nhiều ý kiến cho rằng, Thật ra chẳng có lối tắt nào đi đến thành công cả, tất cả mọi người đều phải luyện tập và luyện tập rất siêng năng. Điều này cũng đúng nhưng các chuyên gia bây giờ họ đang luyện cái gì, họ có bí kíp gì không?
Bí mật của các chuyên gia là họ biết đâu là sự khác biệt giữa năng suất trung bình và năng suất gấp 10. Với nó, bạn có thể viết code có thể tái sử dụng nhiều lần hơn, thậm chí ngay cả thêm requirements và thay đổi một số cấu trúc.
Bí quyết đẩy nhanh năng suất gấp nhiều lần chính là nắm vững tính trừu tượng – abstraction. Rất nhiều app bây giờ chứa hàng tấn code. Ví dụ nếu bây giờ in ra source code của top 10 app ra giấy thì bạn có tưởng tượng ra được số lượng giấy nhiều đến mức nào, có thể xếp thành tòa nhà cao tầng. Trong thực tế với số lượng code khổng lồ như vậy thì việc duy trì cũng rất tốn kém. Vì vậy càng nhiều code thì chi phí dành cho chúng càng nhiều.
Tính trừu tượng (abstractions) chuẩn sẽ tạo ra code dễ đọc, dễ thích ứng và duy trì bằng các ẩn những chi tiết không quan trọng lắm với ngữ cảnh hiện tại, giảm số lượng code trùng lặp thực hiện cùng một việc.
Tính trừu tượng được hình thành bởi 2 yếu tố chính:
Generalization: loại bỏ các phần lặp và ẩn sau phần trừu tượng
Specialization: áp dụng tính trừu tượng cho trường hợp cụ thể, và chỉ thêm những gì khác biệt
Hãy xem qua đoạn code này:
const doubleList = list => {
const newList = [];
for (var i = 0; i < list.length; i++) {
newList[i] = list[i] * 2;
}
return newList;
};
Đoạn code trên không có gì sai nhưng nó chứa khá nhiều chi tiết không cần thiết mấy:
Bao gồm chi tiết cấu trúc dữ liệu container/transport đang đuợc sử dụng (mảng), nghĩa là nó chỉ có thể hoạt động với mảng mà thôi. (state shape dependency).
Bao gồm logic lặp lại, nếu thực hiện thao tác khác mà cần truy cập các phần tử trong cấu trúc dữ liệu, bạn cần phải lặp lại logic trong đoạn code đó. Mà điều này sẽ vi phạm nguyên tắc DRY (Don’t Repeat Yourself).
Thay vì mô tả khai báo operation được thực hiện thì nó bao gồm nhiệm vị cụ thể và rõ ràng (thay vì dài dòng)
Tất cả những điều này đều không cần thiết và có thể đuợc ẩn sau abstraction. Trong trường hợp này thì abstractions trở nên phổ biến và biến đổi cách build app hiện nay, giảm số lượng for-loops.
Junior devnghĩ rằng phải viết rất nhiều code để sản xuất ra giá trị, còn senior devthì hiểu giá trị của những dòng code mà không cần được viết ra,
Hãy tưởng tượng một lập trình viên đã quen thuộc với việc sử dụng phương thức map trong các ngôn ngữ lập trình như JavaScript. Map tóm tắt các chi tiết như kiểu dữ liệu, kiểu cấu trúc dữ liệu, .. từ đó cải thiện độ hiệu quả của ứng dụng.
Jeremy Ashkenas đã giúp những phương thức như vậy phổ biến trong JavaScript, mở đường cho nhiều phím tắt, cú pháp đang được sử dụng hiện nay trong JavaScript (bằng cách tiên phong trong CoffeeScript). Ngoài ra ông đã tạo ra Underscore, Lodash và Backbone, phổ biến cấu trúc MVC trong JavaScript và tạo tiền đề cho Angular và React.
John Resig tạo ra jQuery rất phổ biến và có sức ảnh huởng, hình thành bộ sưu tập JavaScript module có thể tái sử dụng (plugin jQuery) mãi cho đến khi các Node module ES6 modules xuất hiện nhiều năm sau đó. Bộ API của jQuery có ảnh hưởng tới mức chúng tạo nền tảng cho DOM API hiện nay.
Abstraction phù hợp có thể là chiếc đòn bẩy – tác động đáng kể lên năng suất của những dòng code. Module, functions, variables, classes đều là các các dạng của abstraction lý do tồn tại của chúng là để làm abstractions/thành phần của abstraction dễ dàng hơn. Có thể nói không thể nào build một software phức tạp mà không dùng đến abstraction, đến những ngôn ngữ bậc thấp cũng sử dụng abstractions.
\ đặt trước các ký tự đặc biệt, dấu . là một ký tự đặc biệt
| là câu điều kiện or
$ là điều kiện phải xuất hiện ở cuối string
Đoạn nằm giữa /đoạn-nằm-giữa/, là chổ chúng ta viết các điều kiện. Đoạn-nằm-giữa có tên tiếng mỹ là pattern
Chữ i ở cuối, phía sau / là một dạng setting, i là điều kiện chỉ hợp lệ nếu xuất hiện đúng một lần duy nhất. Có nhiều dạng setting khác nữa, phía dưới sẽ đề cập.
Trong javascript, regex là một object, có thể định nghĩa bằng 2 cách
// tạo 1 object mớiconst regex1 =newRegExp('football');// dùng regular expression literal const regex2 =/football/
Kiểm tra regex
Regex ở trên chúng ta đang tìm string football, không giới hạn gì cả, chữ football nằm ở đâu không quan trọng.
Kiểm tra regex bằng RegExp.test(string), sẽ trả về giá trị true/false
/^\d+$/// là các số từ 0-9/^\d+$/.test('1')//✅/^\d+$/.test('14')//✅/^\d+$/.test('144343')//✅/^\d+$/.test('')//❌/^\d+$/.test('1a')//❌
Chỉ đúng hoặc sai, không có thể cả đúng và sai: *
Nói vậy hơi khó hiểu, để giải thích rõ hơn nè, ví dụ yêu cầu phải là số từ 0-9, nếu kiểm tra 1a => false vì nó có 1 là đúng, a là sai, còn '' => true vì nó chỉ có sai không có đúng
// \w bao gồm ký tự chữ và số// \d tương tự như `[0-9]`/^\d{3}\w?$//^\d{3}\w?$/.test('123')//✅/^\d{3}\w?$/.test('123a')//✅/^\d{3}\w?$/.test('123ab')//❌
Nhóm điều kiện
Để nhóm các điều kiện lại, đặt giữa ()
Ví dụ bên dưới, điều kiện thõa khi có đúng 3 ký tự số và theo sau đó là ký tự số hoặc chữ
Để xác định ngôn ngữ cho dự án của bạn thì bạn có thể sửa tại config/app.php và thay đổi các cài đặt sau
/**
*Bạn sửa 'en' thành 'vn' để thay đổi ngôn ngữ sang Tiếng Việt hoặc khác, tùy bạn
* 'en' hay 'vn' hay ký tự khác tùy vào thư mục mà bạn sẽ tạo phía sau
*///Đây là ngôn ngữ thay đổi cho dự án'locale'=>'en',//Ngôn ngữ dự phòng, phòng khi ngôn ngữ đang sử dụng bị lỗi'fallback_locale'=>'en',
Trong Laravel có cách khác để thay đổi ngôn ngữ là sử dụng
App::setLocale($locale);
Với cách này bạn có thể lấy từ DB rồi đẩy vào $locale để các thành viên tự đổi ngôn ngữ theo ý riêng. Nhưng trong phạm vi bài này, mình sẽ hướng dẫn cách để viết đa ngôn ngữ như thế nào, còn việc thay đổi Options sẽ có một bài khác.
Ok, giờ vào phần chính, bạn vào /resources/lang bạn sẽ thấy một folder có sãn là ‘en’ đây là thư mục chưa file ngôn ngữ “Tiếng Anh” của dự án bạn trong đấy có file “validation.php” chứa các nội dung tiếng anh khi các bạn Validation trong dự án bạn nên Dịch hết theo cách bạn muốn.
Ngoài ra trong đó có các chuổi tên kiểu có hai chấm trước từ đó như :
:attribute
:date
:min
:max
:other
:digits
:value
thì các bạn nhớ chừa ra đừng có dịch. vì nó sẽ thay thế giá trị vào đó nha!
ok! Khoan hãy việt hóa nha, các bác phải tạo một folder khác ngang hàng với ‘en’ đã tạo tên trùng với tên các bạn đã config trong file app.php mình tạo folder tên là ‘vn’. Ok giờ các bạn copy hết các file trong thư mục ‘en’ vào thư mục ‘vn’ rồi việt hóa nó đi.
Xong! các bác đã việt hóa các thứ có thể việt hóa. Bây giờ đến phần các bạn tự tạo ra các text riêng để dịch đây.
Các bạn sẽ tạo một file có tên là ‘content.php’ hoặc khác tùy bạn nội dung như sau:
<?phpreturn[//Nội dung các chuổi text được dịch ở đây];
Nội dung thật ra là tương tự như 4 file đã có.
Tiếp theo, mình sẽ sử dụng các template auth có sẵn khi các bạn tạo đăng nhập sẵn mà laravel có để đỡ mất công tạo template khác. :D. Ví dụ template Login.balde.php
Mình sẽ lấy chữ E-Mail Address làm ví dụ.
bạn sửa {{ __(‘E-Mail Address’) }} lại thành{{ __(‘content.E-Mail Address’) }} chỗ content thêm vào chính là file content.php mà bạn đã tạo, bạn đặt tên file như nào thì thêm vào như vậy. Rồi trong file content.php
Bạn viết như trên. Ta sẽ có thành quả như sau:
Tương tự các bạn có thể làm với các từ khác các kiểu nhé. Hoặc chia file ra.
Ngoài cách có sãn bạn cũng có thể dùng 2 cách còn lại mà mình đã ghi ở phần đâu nha.
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Clean Architecture là một cách viết code, tổ chức code được giới thiệu bởi Robert C. Martin. Nói nôm na cho các bạn hiểu thì thông thường, khi xây dựng một Java project để expose ra các RESTful APIs, chúng ta sẽ build một project với nhiều package khác nhau như sau:
Package com.huongdanjava.cleanarchitecture.rest sẽ chứa các Controller để handle request từ người dùng.
Package com.huongdanjava.cleanarchitecture.rest.dto sẽ chứa các Java class để handle data từ request của người dùng và data sẽ response lại cho người dùng.
Package com.huongdanjava.cleanarchitecture.service sẽ chứa các class handle việc xử lý business.
Package com.huongdanjava.cleanarchitecture.db sẽ chứa các class dùng để thao tác với database.
Package com.huongdanjava.cleanarchitecture.db.model chứa các model mapping database table với Java class.
Package com.huongdanjava.cleanarchitecture.security chứa các class liên quan đến xử lý security của ứng dụng.
Tất cả các dependencies của ứng dụng sẽ được khai báo trong tập tin pom.xml.
Đối với các ứng dụng nhỏ, việc tổ chức code như thế này sẽ không có vấn đề gì lớn lao. Nhưng đối với các ứng dụng lớn, nhiều chức năng, các bạn hãy tưởng tượng chỉ cần 1 thay đổi nhỏ, sẽ cần phải thay đổi code của toàn bộ project. Việc này sẽ rất khó quản lý và nếu như bạn là một người mới join vào dự án, sẽ rất khó khăn để bạn hiểu được ứng dụng đang làm gì và được viết code như thế nào.
Clean Architecture giới thiệu một cách viết code, tổ chức code mới, đảm bảo nguyên tắc separation of concerns khi viết code, dễ dàng thêm mới, mở rộng, loại bỏ các tính năng của ứng dụng mà không cần phải thay đổi nhiều code. Các bạn hãy xem hình ảnh dưới đây:
Đây là hình ảnh tổng quan về ý tưởng của Clean Architecture.
Lớp trong cùng nhất là lớp Entities (màu vàng), sẽ đảm nhận nhiệm vụ định nghĩa các Java POJO chứa các thông tin liên quan đến business của ứng dụng. Ví dụ như ứng dụng của bạn là về quản lý thông tin sinh viên thì lớp này sẽ chứa một Java class định nghĩa thông tin sinh viên gồm có những gì?
Lớp tiếp theo bên ngoài lớp Entities là lớp Use Cases, (màu hồng) lớp này sẽ chứa các class định nghĩa các business cases cần thiết cho ứng dụng. Với ứng dụng quản lý sinh viên ở trên thì các use cases mà chúng ta có thể định nghĩa trong lớp này là các class cho phép chúng ta thêm, xoá, sửa, cập nhập thông tin sinh viên.
Một điều lưu ý với 2 lớp trên, Entities và Use Cases, là chúng ta sẽ không sử dụng bất kỳ một external library hay framework nào, ngoài trừ lớp Use Cases thì có thể cần sử dụng các library liên quan đến Unit Testing.
Để các use cases có thể nói chuyện với các external system như database, web service, MQ server, chúng ta cần một lớp gọi là lớp Adapter (màu xanh lá cây). Sử dụng Java thì lớp Adapter này chứa những interface để cho lớp Use Cases sử dụng. Những interface này sẽ được implement bởi những thành phần ở lớp ngoài cùng trong hình vẽ trên (màu xanh dương) tuỳ theo nhu cầu của ứng dụng. Trong ví dụ về ứng dụng quản lý sinh viên thì chúng ta có thể định nghĩa các interface để lấy thông tin sinh viên từ database, cập nhập thông tin sinh viên,…
Có một nguyên tắc khi viết các ứng dụng theo Clean Architecture đó là, như các bạn thấy trong hình vẽ trên chỗ các dấu mũi tên từ ngoài vào trong, những thay đổi của lớp bên ngoài sẽ không ảnh hưởng gì đến code của những lớp bên trong. Những lớp bên trong sẽ không biết code của những lớp bên ngoài có gì.
Để áp dụng ý tưởng của Clean Architecture, đối với các ứng dụng Java, các bạn có thể xây dựng project với Maven Module project và thêm một lớp ngoài cùng tên là Configuration đảm nhận việc cấu hình cho ứng dụng sẽ chạy như thế nào. Không có lớp này thì ứng dụng không thể chạy được.
Trên đây là những ý tưởng cơ bản về Clean Architecture, trong bài viết sau, mình sẽ đi vào thực tế cách hiện thực một project sử dụng Clean Architecture sẽ như thế nào các bạn nhé!
Packet sniffer – còn được gọi là bộ phân tích gói, bộ phân tích giao thức hoặc bộ phân tích mạng – theo dõi lưu lượng truy cập internet của bạn – bao gồm các trang web bạn truy cập và bất kỳ thứ gì bạn tải xuống hoặc tải lên – trong thời gian thực, khiến chúng có khả năng xâm nhập vào máy bạn khá mạnh. Nhưng có nhiều loại sniffer khác nhau, chúng có thể là phần cứng hoặc phần mềm.
Sniffers hoạt động bằng cách kiểm tra các luồng data packet (gói dữ liệu) truyền giữa các máy tính trong mạng cũng như giữa các máy tính nối mạng Internet. Packet Sniffer hay Protocol Analyzer là những công cụ thường được các kỹ thuật viên sử dụng để chuẩn đoán và phát hiện lỗi hệ thống mạng và các vấn đề liên quan. Còn các hacker thì sử dụng chúng với mục đích xấu như theo dõi bí mật network traffic và thu thập thông tin mật khẩu người dùng.
Vậy Sniffer “xấu tính” cụ thể là gì?
Nhưng nếu bạn đang ở đây tự hỏi “virus sniffer là gì”, thì có lẽ bạn đang quan tâm nhiều hơn vào kiểu sniffer độc hại: mã gián điệp. Hacker có thể “đánh hơi” được vòng đời truy cập của bạn, cho phép chúng ghi lại và phân tích mọi thứ bạn đang làm bằng sniffer. Trong đó bao gồm tên người dùng, mật khẩu, chi tiết thẻ tín dụng và các thông tin cá nhân ngoài ra còn nhiều thông tin nhạy cảm khác. Rõ ràng là bạn không muốn bị dính kiểu sniffer đó bây giờ và kể cả sau này. Chúng tôi sẽ tìm hiểu một số mẹo để giúp bạn ngăn chặn thủ đoạn ấy. Đầu tiên, chúng tôi sẽ trình bày chính xác cách thức hoạt động tính năng dò tìm của sniffer và phân tích các kiểu ứng dụng khác nhau của sniffer.
Nhưng trước khi tiếp tục -chúng ta cần phân biệt rõ sniffer và virus không hề giống nhau. Virus là một loại phần mềm độc hại chiếm quyền điều khiển các phần mềm khác trên thiết bị của bạn và sửa đổi phần mềm đó để sao chép và lây lan virus. Sniffer không hoạt động theo cách đó và đôi khi, chúng thậm chí còn không phải là phần mềm. Có rất nhiều sniffer tồn tại dưới dạng là các thiết bị phần cứng riêng lẻ.
Sniffer có nhiều tên gọi, bao gồm bộ phân tích gói, bộ phân tích giao thức hoặc bộ phân tích mạng như đã nói ở trên, cũng như máy dò mạng, máy dò tìm không dây và máy dò Ethernet. Từ đó hành động lợi dụng sniffer có thể được thực hiện thông qua phần mềm hoặc phần cứng, tùy thuộc vào mục đích của người sử dụng. Về cơ bản, chúng sử dụng sniffer để nắm bắt, giải mã và diễn giải các gói dữ liệu được gửi qua mạng bằng TCP / IP hoặc các giao thức khác.
Phần mềm sniffer dò tìm mạng được sử dụng để làm gì?
Sniffer ban đầu được thiết kế dành cho các kỹ sư mạng (network engineer) chuyên nghiệp sử dụng để theo dõi lưu lượng và đảm bảo quá trình sử dụng mạng phù hợp. Nhưng thật không may, những hacker là những kẻ rất xảo quyệt, và hiện chúng đang lợi dụng các phần mềm sniffer có sẵn trên mạng (đôi khi thậm chí là miễn phí!).
Sniffer là công cụ được sử dụng bởi:
Kỹ sư mạng (Network engineer): Để tối ưu hóa mạng của họ, các kỹ sư phải theo dõi lưu lượng truy cập của họ.
Quản trị viên hệ thống (System administrator): Tương tự, quản trị viên cần quan sát lưu lượng truy cập để thu thập dữ liệu về các chỉ số như băng thông khả dụng. Họ cũng có thể kiểm tra xem các hệ thống cụ thể đang hoạt động như thế nào, chẳng hạn như tường lửa, cũng như khắc phục sự cố.
Các chuyên gia an ninh mạng (Cybersecurity professional): Nhân viên Cybersec có thể học được nhiều điều từ việc giám sát mạng của họ. Tăng đột biến bất thường hoặc các loại lưu lượng truy cập khác nhau có thể chỉ ra phần mềm độc hại hoặc tin tặc trong hệ thống.
Chủ sở hữu công ty: Người sử dụng lao động có thể sử dụng phần mềm sniffer để theo dõi nhân viên của họ và tìm hiểu xem họ có đang chill Netflix trong khi lượng công việc họ còn dang dở.
Hacker: Nói chung, mọi tin tặc đều khai thác phần mềm sniffer để theo dõi mọi người và đánh cắp dữ liệu cá nhân của họ, thường với mục tiêu cuối cùng là đánh cắp danh tính hoặc để chiếm đoạt tài sản. Ngoài ra còn uy hiếp tống tiền bằng những thông tin nhạy cảm.
Tóm lại, đây chỉ là một số trong nhiều cách mà các trình sniffer dò tìm mạng được sử dụng:
Đối với mục đích bảo trì mạng, các mục đích sử dụng hợp pháp của trình sniffer là:
Nắm bắt các gói dữ liệu
Ghi lại và phân tích lưu lượng truy cập
Giải mã gói tin
Khắc phục sự cố mạng
Kiểm tra tường lửa
Đảm bảo lưu lượng truy cập thông suốt
Việc sử dụng sniffer bất hợp pháp, về cơ bản là do thám thông tin, bao gồm:
Nắm bắt thông tin cá nhân như tên người dùng, mật khẩu, số thẻ tín dụng, v.v.
Ghi lại các liên lạc như email và các tin nhắn theo thời gian thực
Giả mạo danh tính
Đánh cắp tiền từ những thông tin mật về tài khoản, ..v.v
Cách Sniffer vận hành?
Đầu tiên, một số thông tin cơ bản về “lưu lượng truy cập” trên internet mà chúng tôi đã đề cập. Cũng giống như khi ô tô (chở người) tạo nên luồng giao thông di chuyển trên đường, lưu lượng truy cập internet bao gồm các gói (mang dữ liệu) di chuyển qua một mạng. Khi bạn đang ngồi ở nhà, bạn hầu như không biết mặt mũi người đang lái các chiếc oto ngoài kia, nhưng nếu có một chiếc xe tải đậu trước nhà của bạn, bạn có thể kiểm tra xem ai đang ở bên trong. Tương tự như vậy, máy tính của bạn bỏ qua hầu hết lưu lượng truyền qua mạng và chỉ kiểm tra các gói dữ liệu cụ thể được gửi đến nó.
Do đó, có thể xem những sniffer giống như một trạm thu phí – chúng được cử đến để kiểm tra tất cả những chiếc xe đang chạy trên đường, không chỉ những chiếc chạy trong làn xe tải mà cả xe máy. Những sniffer không có bộ lọc sẽ kiểm tra mọi chiếc oto – chúng thu thập tất cả lưu lượng truy cập đi qua một mạng. Còn những sniffer có bộ lọc có thể được cài đặt cấu hình để chỉ kiểm tra một số loại lưu lượng nhất định. Điều này giống như một trạm thu phí chỉ dừng xe BMW hoặc chỉ xe oto màu xanh lam, tùy thuộc vào loại phương tiện giao thông mà chủ nhân của trạm thu phí / sniffer này quan tâm.
Nhưng chúng ta hãy đi sâu vào các chi tiết kỹ thuật hơn nữa về cách thức hoạt động của sniffer dò tìm mạng. Và việc sniffer có thể được thực hiện bằng phần mềm hoặc phần cứng.
Người quản lý mạng hoặc quản trị viên hệ thống có thể sử dụng phần cứng, chẳng hạn như bộ định tuyến có khả năng dò tìm được tích hợp sẵn. Sniffer dưới dạng phần cứng bao gồm một bộ adapter đặc biệt kết nối với mạng hiện có. Bộ adapter thu thập dữ liệu và lưu trữ hoặc gửi dữ liệu cùng đến người đang thu thập chúng để kiểm tra thêm.
Thay vào đó, các hacker có xu hướng sử dụng sniffer dưới dạng phần mềm. Thông thường, máy tính sẽ bỏ qua tất cả lưu lượng truy cập đến nơi khác trong mạng, nhưng các ứng dụng này về cơ bản sẽ thay đổi cài đặt và quyền của máy tính để thu thập và sao chép tất cả các gói dữ liệu có sẵn trên mạng. Điều này cho phép hacker lưu trữ tất cả dữ liệu mạng và phân tích chúng sau đó. Phương thức này được gọi là chế độ “lăng nhăng” (promiscuous), nó hoạt động lén lút và không hạn chế.
Người dùng máy tính bình thường có thể gặp phải những kẻ “dòm ngó” này qua việc truy cập các trang web không an toàn, tự động tải xuống các ứng dụng bất chính hoặc tự mắc vào một trò lừa đảo nào đó bao gồm các tệp đính kèm, liên kết bị nhiễm hoặc sử dụng mạng Wi-FI không an toàn ở những nơi công cộng.
Tấn công Sniffer chủ động và thụ động
Tùy thuộc vào loại mạng bạn đang sử dụng, hacker sẽ sử dụng các phương pháp sniffer khác nhau.
Nếu mạng của bạn được cấu trúc bằng cách sử dụng các hub – kết nối nhiều thiết bị với nhau trên một mạng – thì tất cả lưu lượng truy cập đều di chuyển tự do. Điều đó có nghĩa là máy tính của bạn hiện đang nhận được tất cả lưu lượng truy cập trên mạng, nhưng nó bỏ qua mọi thứ không liên quan đến nó. Hacker sẽ chèn một sniffer thụ động và thay vì bỏ qua những lưu lượng truy cập không liên quan, nó sẽ hấp thụ tất cả. Kiểu sniffer thụ động này khá khó để phát hiện.
Nếu bạn đang sử dụng một hệ thống mạng lớn hơn, với nhiều máy tính được kết nối hơn, thì không phải tất cả lưu lượng truy cập đều có thể đến được tất cả các thiết bị. Trong trường hợp này, bộ chuyển mạch mạng (switch) được sử dụng để chỉ lưu lượng truy cập đến thiết bị cụ thể mà nó được sử dụng. Để một hacker có thể thu thập dữ liệu thành công trong loại môi trường này, chúng phải bỏ qua các ràng buộc được thực thi bởi các thiết bị chuyển mạch, bắt đầu cấu hình cho sniffer một cách chủ động. Điều này thường được thực hiện bằng cách thêm lưu lượng bổ sung vào mạng, tuy nhiên điều này cũng làm cho nó dễ dàng phát hiện hơn là sniffer thụ động.
Cách bảo vệ hệ thống của bạn khỏi sniffer
Như người ta đã nói, phòng bệnh hơn là chữa bệnh, và điều này chắc chắn đúng khi nói đến những kẻ lợi dụng sniffer để đánh cắp thông tin trên mạng. Dưới đây là những cách tốt nhất để trang bị hàng phòng thủ của bạn:
Sử dụng phần mềm chống virus mạnh: Phần mềm chống virus mạnh sẽ ngăn mọi phần mềm độc hại xâm nhập hệ thống của bạn. Nó cũng sẽ phát hiện bất kỳ thứ gì không nên có trên máy tính của bạn, chẳng hạn như sniffer và giúp bạn xóa nó
Tránh sử dụng Wi-Fi nơi công cộng: Các mạng Wi-Fi mở, chẳng hạn như các mạng Wi-Fi trong quán cà phê hoặc sân bay, chúng đều không đáng tin cậy. Việc các hacker lợi dụng sniffer lên toàn bộ hệ thống mạng là quá dễ dàng. Bạn nên tránh hoàn toàn việc sử dụng chúng, trừ khi bạn chắc chắn rằng … điện thoại, máy tính của bạn không có thông tin gì “nguy hiểm”.
Sử dụng VPN: Mạng ảo riêng đã được mã hóa kết nối và ẩn tất cả dữ liệu được gửi từ máy tính của bạn qua internet. Điều đó có nghĩa là kẻ theo dõi lưu lượng truy cập của bạn sẽ chỉ thấy thông tin xáo trộn và dữ liệu của bạn sẽ vẫn an toàn.
Tránh các giao thức không an toàn: Một cách khác để đảm bảo dữ liệu của bạn luôn được bảo vệ là khi bạn lướt web hãy kiểm tra link bạn truy cập có HTTPS không. Khi nhìn vào thanh địa chỉ của một trang web (ví dụ: https://topdev.vn/blog/), bạn sẽ thấy HTTP hoặc HTTPS. Một số trình duyệt sẽ hiển thị biểu tượng khóa để biểu thị HTTPS (và nếu bạn nhấp vào thanh địa chỉ để mở rộng URL, bạn cũng sẽ thấy HTTPS ở đó). Chỉ HTTPS là an toàn, có nghĩa là thông tin liên lạc của bạn đã được mã hóa. HTTP thì không an toàn và trình duyệt của bạn có thể hiển thị một chữ i thay vì biểu tượng khóa. Bạn nên tránh HTTP khi có thể, và đặc biệt nên làm như vậy khi mua sắm trực tuyến.
Cẩn thận với mọi thứ trên mạng: Như đã lưu ý trước đó, tội phạm mạng sử dụng các phương pháp như email lừa đảo và các trang web bị nhiễm để lừa nạn nhân vô tình tải xuống trình sniffer. Luyện tập các thói quen sử dụng trình duyệt web thông minh và tránh xa bất cứ điều gì khiến bạn khó hiểu.
Cách phát hiện sniffer trên hệ thống mạng của bạn
Như đã nói ở trên, sniffer thụ động rất khó bị phát hiện. Sniffer chủ động có thể nhìn thấy rõ hơn một chút, nhưng bạn vẫn sẽ cần một số hiểu biết về công nghệ. Nếu bạn nghi ngờ có thể có một trình sniffer ở trong máy bạn, bạn có thể dùng chính sniffer của riêng mình để khắc chế lại và theo dõi tất cả lưu lượng DNS trong mạng của bạn để phát hiện bất kỳ hoạt động đáng ngờ nào.
Một lựa chọn dễ dàng hơn là dựa vào các phương pháp phòng chống được đề cập ở trên, đặc biệt là sử dụng phần mềm chống virus và mạng riêng ảo (VPN) để mã hóa kết nối của bạn.
Xóa/gỡ sniffer như thế nào
Nếu bạn phát hiện ra mình bị nhiễm một phần mềm sniffer chuyên nghiệp, bạn cần phải gỡ bỏ phần mềm độc hại ngay. Bạn có thể thực hiện việc này thủ công bằng cách kiểm tra tất cả các ứng dụng hiện có trên máy tính của mình. Nhìn vào thư mục Tải xuống của bạn và sắp xếp theo ngày. Nếu bạn tìm thấy một số chương trình gần đây mà bạn không nhớ là mình đã cài đặt, hãy xóa chúng ngay lập tức. Tuy nhiên, bạn có thể sẽ gặp một phần mềm sniffer không cho phép gỡ cài đặt.
Trong trường hợp đó, bạn sẽ cần sử dụng công cụ chống phần mềm độc hại mạnh khác (đừng tải bậy trúng thêm cái sniffer nữa đó), các công cụ này sẽ quét và xóa phần mềm độc hại. Nó cũng có các biện pháp bảo vệ đặc biệt chống lại các bản tải xuống tiềm ẩn sniffer, các liên kết không an toàn và các tệp đính kèm email có hại, ngăn chặn những sniffer và virus khác.
Vài ví dụ về packet sniffers
– tcpdump (một công cụ dòng lệnh cho Linux và các hệ điều hành dựa trên Unix khác)
Có một số công cụ sniffer miễn phí hoặc rẻ tiền trên mạng. Hầu hết chúng đều được bán trên thị trường với mục đích giúp bạn tìm hiểu về cách nắm bắt và phân tích lưu lượng mạng để khắc phục sự cố. Các giải pháp như Wireshark và CloudShark chỉ được cung cấp cho các mục đích sử dụng hợp pháp. Bên cạch đó thì cũng tồn tại những cái bất hợp pháp, chẳng hạn như BUTTsniffer.
Miễn là bạn làm theo các mẹo phòng tránh của chúng tôi ở trên, hy vọng bạn sẽ không gặp phải bất kỳ kẻ “dòm ngó” nào trong quá trình lướt web hằng ngày.
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Trong bài trước chúng ta đã tìm hiểu về Component API. Trong bài này, chúng ta sẽ tìm hiểu về vòng đời của một React Component (Component Life Cycle) và các methods để quản lý vòng đời.
componentWillMount đây là method sẽ được thực thi trước khi một component được render trên cả server side và client side
componentDidMount method này được thực thi khi 1 component được render trên client side. Đây là nơi các hàm AJAX, DOM hoặc update state được thực thi. Method này cũng được sử dụng để kết nối tới các JS Framework khác và các function với delayed execution như setTimeout hoặc setInterval.
componentWillReceiveProps sẽ được thực thi ngay khi thuộc tính props được update và trước khi component được render lại.
shouldComponentUpdate sẽ trả về kết quả true or false. Phương thức này sẽ xác định một component có được update hay không. Mặc định là true, nếu bạn không muốn một component render lại khi update state hay propst thì return giá trị thành false.
componentWillUpdate được gọi khi chúng ta update state của component trước khi nó render lại.
componentDidUpdate sau khi componentWillUpdate ở trên được gọi xong thì đến lượt method này được gọi.
componentUnmount được gọi khi một component được xóa khỏi React.
Bây giờ chúng ta comment lại code component Form ở các bài trước để tránh rối.
Xong rồi thì chúng ta tạo một component như đoạn code sau:
Và cuối cùng chúng ta vào console log để kiểm tra mỗi lần chúng ta click vào button increment
Khi load trang thì chỉ có 2 method này được thực thi:
Khi chúng ta click vào button INCREMENT quá trình update state xảy ra và các life cycle methods khác sẽ được thực hiện.
Còn quá trình unmounting xảy ra khi component bị remove khỏi DOM, hay nói một cách khác là hàm componentWillUnmount sẽ được gọi khi render ra không có component nào hoặc người dùng chuyển hướng trang web.
Thế là chúng ta đã xong. Hãy cùng chờ đợi bài tiếp theo nhé.
Sau khi mở Panel Network trên DevTools, ấn Ctrl+R để refresh lại trang, lúc này các sự kiện của network sẽ được ghi lại và hiển thị trên tab
Bên dưới cùng, là thông tin về tổng số request đã gửi, tổng dung lượng đã down về
Cái chart phía trên sẽ cho thấy cái nhìn khái quát về các sự kiện của network theo biểu đồ thời gian
Trong table network log
Status: mã response của HTTP
Type: resource type
Initiator: cho biết đứa nào đã gây ra request
Size: size của resource
Time: tổng số thời gian dùng để download/upload resource
Waterfall: chart mô tả thời điểm request, thời gian request của một resource
Click vào để hiển thị thêm thông tin trên từng resource, cột size sẽ cho biết là resource này đã được compress chưa.
Giá trị ở trên là size chưa compress, ở dưới là đã compress, nếu cả 2 giá trị này bằng nhau thì compress không chạy
Network log sẽ liên tục record thông tin khi có network request mới, nếu đã có đủ thông tin muốn lấy, click Stop Record để dừng việc record này lại
Các column hiển thị trên Network log có thể tùy biến dễ dàng bằng cách click chuột phải lên tên cột
Để giả lập môi trường mạng của mobile, sử dụng Network Throttling
Để kiểm tra lần load đầu tiên, trước hết chúng ta xóa cache của trình duyệt bằng cách click và giữ vào nút refresh , chọn “Empty Cache and Hard Reload”, nó sẽ xóa hết cache trên trang hiện tại trước khi load
Chúng ta có thể dùng tab Network để tìm một string trong header và message body.
Thí dụ, chúng ta muốn kiểm tra các resource có sử dụng cơ chế cache phù hợp chưa, nếu resource không thay đổi thường xuyên, trình duyệt nên được thông báo để cache các resource này. Cơ chế cache này được thiết đặt trong header, click nút search để hiển thị ô search, nhập Cache-Control rồi enter, chúng ta sẽ có toàn bộ thông tin Cache-control: max-age của từng resource
Với ô filter, chúng ta cũng có vài tip trên ô filter này
Có thể dung regex, ví dụ /.*\.[cj]s+$/ sẽ bỏ qua resource ko có chữa chữ c hoặc j
Thêm dấu - phía trước để loại bỏ, như -main.css sẽ bỏ qua các resource có chứa main.css
domain:*anluu.com để lọc các resource load từ anluu.com
Trường hợp muốn block một resource nào đó để kiểm tra xem chuyện gì sẽ xảy ra khi chúng ta ko load nó.
Thí dụ chúng ta sẽ bỏ qua file stylesheet khi load trang, ấn tổ hợp phím Ctrl+Shift+P để mở menu, gõ Blocking -> chọn Show Request Blocking
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Chắc hẳn các bạn khi nghe về cách sử dụng biến trong CSS sẽ nghĩ ngay đến các CSS Preprocessors như SASS hay LESS. Hoặc nếu không thì cũng suy nghĩ sử dụng biến trong CSS làm sao mà được nhỉ ?
Sau một thời gian dùng biến với SASS mình có tìm tòi và nghiên cứu liệu trong CSS thuần có thể sử dụng biến không nhỉ mà không cần phải dùng SASS hay LESS.
Nếu được như thế thì tiện lắm, các bạn mới học chưa biết cách dùng SASS hay LESS thì có thể học cách sử dụng biến trong CSS để làm quen trước sau này vào làm với SASS hay LESS đỡ bỡ ngỡ khi sử dụng biến.
Vì thế hôm nay mình xin chia sẻ những kiến thức về biến trong CSS để các bạn có thể hiểu rõ nó như thế nào, cách dùng ra sao nhé.
# Tại sao nên sử dụng biến
Có rất nhiều lý do để sử dụng biến trong CSS. Nhưng theo bản thân mình thấy thì khi sử dụng biến thì số lượng code bị lặp lại được hạn chế và dễ dàng tùy chỉnh. Chỉ cần dùng biến và thay đổi giá trị biến thì tất cả các elements dùng biến đó đều thay đổi theo.
Khi làm chắc chắn các bạn sẽ gặp các trường hợp như thế này. Cả 3 elements này đều dùng chung 1 mã màu, khiến code bị lặp đi lặp lại.
Cách khai báo cũng đơn giản thôi các bạn sử dụng theo cú pháp này: --tênbiến: giá trị. Tên biến bắt buộc phải bắt đầu bằng 2 dấu - nhá. Ví dụ --color-red: red.
Thường thường khi dùng biến trong CSS mình hay khai báo biến trong pseudo :root(thẻ <html>) tức là ở vị trí cao nhất, để các thành phần trong trang có thể kế thừa từ nó. Tại sao để trong thẻ <html> vì thẻ <html> là phần tử cao nhất, các thành phần trong trang đều là phần tử con của thẻ <html>.
:root{
--ten-bien: gia tri;
--background-main-color: #ffa400;
}
Cách sử dụng cũng đơn giản nốt theo cú pháp sau: var(tên biến).
Có nghĩa là khi code các bạn có thể kế thừa từ thẻ <html> để sử dụng các biến từ nó. Tuy nhiên các bạn cũng có thể set riêng cho chính phần tử mà các bạn đang làm hoặc phần tử cha bọc nó. Để mình ví dụ cho các bạn dễ hiểu.
Giờ ở thẻ <html> mình tạo 1 biến là --red có giá trị là red và thẻ div có class other-box sử dụng thuộc tính background-color và dùng biến --red từ thẻ <html> thì lúc này box này sẽ có background màu đỏ đúng không?
Tuy nhiên nếu mình muốn set biến cho chính cái box đó riêng mà không cần phải sử dụng từ thẻ <html> có được không ? Xin thưa các bạn là được nha. Các bạn có thể sử dụng như này
:root {
--red: red;
}
.other-box {
/* dùng biến --red ở bên trong để ghi đè ở :root*/
--red: pink;
background-color: var(--red);
}
Lúc này biến mà div có class other-box sử dụng là --red của chính nó chứ không phải của thẻ <html> nữa. Nó ưu tiên từ trong ra ngoài, giống kiểu đơn vị em mà mình nói ở bài sự khác nhau giữa đơn vị em và rem.
Nếu nó hoặc phần tử cha chứa nó không có thuộc tính font-size thì nó cứ lấy ra ngoài cho đến khi tới thẻ <html>.
Ở đây biến cũng thế. Nó cũng ưu tiên từ trong ra ngoài. Vì thế nên giờ cái other-box sẽ có màu hồng.
Nếu các bạn làm mà không dùng em hay rem hay % mà chỉ sử dụng px thì các bạn có thể dễ dàng làm responsive với biến như thế này. Các bạn có thể áp dụng tương tự với đơn vị em và rem hay % nha.
Đó là điểm hay đó các bạn. Khi xuống màn hình các bạn mong muốn chỉ cần thay đổi giá trị của biến lại là mọi thứ sẽ thay đổi theo ý muốn của các bạn. Quá tuyệt vời phải không nào.
Ảnh lấy từ CSS Tricks để demo
Vậy thì so với các CSS Preprocessors thì như thế nào ? Nó có khác biệt gì hay ưu điểm nhược điểm gì so với SASS hay LESS không ? Các bạn có thể đọc bài này của CSS Tricks viết rõ ràng chi tiết lắm nha.
# Trình duyệt hỗ trợ
Hiện tại thì số lượng sử dụng CSS Variables toàn cầu là 87.52%. Hỗ trợ hầu hết trong các trình duyệt hiện đại nhưng không hỗ trợ đối với IE và Opera Mini. Các bạn cẩn thận khi làm việc với khách hàng hay công ty yêu cầu phải đáp ứng IE hay Opera Mini nhé.
# Sử dụng biến với @supports
Nếu các bạn thích dùng biến trong CSS quá mà lại sợ trúng IE hay Opera Mini thì toi mạng. Vì thế cách tốt nhất đó là sử dụng thuộc tính @supports trong CSS để xử lý trường hợp trình duyệt không hỗ trợ biến trong CSS. Các bạn có thể tìm hiểu về thuộc tính @supportstại đây.
Sau khi các bạn tìm hiểu rồi thì chắc hẳn các bạn cũng biết sơ sơ cách dùng. Mình sẽ áp dụng chúng vào trong bài này. Nếu máy bạn nào không có Opera Mini hay IE thì dùng giả lập test thử coi sao hoặc làm cho khách hàng dùng mấy trình duyệt đó là biết kaka.
Ở trên mình làm 1 ví dụ nhỏ là nếu trình duyệt hỗ trợ biến trong CSS bằng cách sử dụng @supports (--css: variables) {} thì thẻ <h1> mới có thể sử dụng biến và lúc này thẻ <h1> sẽ có chữ màu đỏ. Còn nếu trình duyệt không hỗ trợ thì thẻ <h1> sẽ có chữ màu xanh.
Các bạn có thể xem demo Codepen dưới đây. Nếu các bạn có các trình duyệt IE hay Opera thì Test thử xem nó hiển thị đúng không nha. À Codepen chỉ chạy được từ IE 11 trở đi, nếu các bạn muốn Test ở IE 10 hay thấp hơn thì copy code về máy rồi chạy thử nha.
# Lời kết
Phù!!! Bài này dài phết cũng may là mình có tìm được 2 bài nói về thuộc tính @supports và sự khác nhau giữa biến trong CSS so với SASS hay LESS chớ viết vào nữa chắc dài lắm.
Ah trang web của mình có sử dụng biến đó các bạn. Các bạn có thể Inspect Code(F12) để coi nha. Do mình tập trung chủ yếu ở Việt Nam nên chắc hầu hết dùng Chrome và Firefox nên mình không dùng thuộc tính @supports hihi.
Hi vọng bài viết sẽ cung cấp thêm cho các bạn nhiều kiến thức mới để ngày càng giỏi hơn và làm việc tốt hơn nhé. Nếu các bạn có ý kiến gì hay, hoặc góp ý thì bình luận bên dưới giúp mình để mình có động lực viết bài tiếp nè. Chúc các bạn ngày làm việc năng động và tốt lành nà.
Hằng số là một giá trị cố định và không thay đổi. Cũng như các ngôn ngữ lập trình khác để khai báo hằng số trong Go chúng ta sử dụng từ khóa const. Go hỗ trợ hằng số cho ký tự (character), chuỗi (string), kiểu bool (boolean), và các giá trị số (numeric values).
Từ khóa const có thể khai báo ở bất cứ đâu mà từ khóa var có thể.
Go cũng có vòng lặp For nhưng không có vòng lặp While, chúng ta có thể sử dụng cú pháp của vòng lặp For để thay thế cho While.
package main
import "fmt"
func main(){
fmt.Println("Go does not have While loop we should use For instead:")
i:=5
for i > 0{
fmt.Printf("%d\t",i)
i--
}
fmt.Println("\nBreak out of the loop:")
for {
fmt.Printf("loop \t")
break
}
fmt.Println("\nContinue to the next iteration of the loop:")
for n := 0; n <= 5; n++ {
if n%2 == 0 {
continue
}
fmt.Printf("%d\t",n)
}
fmt.Scanf("Pause")
}
Go does not have While loop we should use for instead:
5 4 3 2 1
Break out of the loop:
loop
Continue to the next iteration of the loop:
1 3 5
Câu lệnh điều khiển If/Else trong Golang
If/Else trong Golang có 1 điểm đặc biệt là có thêm sự ngắn gọn, chúng ta có thể gán giá trị hoặc lấy giá trị từ một hàm nào đó trên cú pháp của lệnh If.
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
)
var (
PASSWORD = "123456"
)
func getRandNumber(n int) int {
return rand.Intn(n)
}
func main() {
var password string
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Enter your password:")
for scanner.Scan() {
password = scanner.Text()
break
}
if password == PASSWORD {
fmt.Printf("Your password is correct\n")
} else {
fmt.Printf("Your password is incorrect\n")
}
//Call a function get assign value to num variable.
if num := getRandNumber(20); num < 19 { fmt.Printf("number %d is smaller than 19\n", num) } if num := getRandNumber(20); num > 10 {
fmt.Printf("number %d is greater than 10", num)
} else if num < 10 {
fmt.Printf("number %d is smaller than 10", num)
} else {
fmt.Printf("number %d is equal to 10", num)
}
fmt.Scanf("Pause")
}
Enter your password:123456
Your password is correct
number 1 is smaller than 19
number 7 is smaller than 10
Switch Case trong Golang
Chúng ta có thể sử dụng nhiều điều kiện trong một case bằng dấu phẩy như ví dụ 1 bên dưới. Và chúng ta cũng có thể sử dụng switch như câu lệnh If/Else như ví dụ 2, và cũng giống như câu lệnh điều khiển If/Else Go cho phép ta gán hoặc gọi hàm để gán giá trị cho biến tại switch, như ví dụ 3.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var say string
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Say something:")
for scanner.Scan() {
say = scanner.Text()
break
}
// 1. We can use commas for multiple expressions in the same case
switch say {
case "hello", "hi":
fmt.Println("Greetings")
case "good bye":
fmt.Println("Bye")
default:
fmt.Println("Unknow")
}
// 2. Switch without an expression
x := 10
switch {
case x < 10: fmt.Println("x is smaller than 10") case x > 10:
fmt.Println("x is greater than 10")
default:
fmt.Println("x is equal to 10")
}
// 3. Assign a value in the expression of switch
whatIsMyType := func(i interface{}) {
switch t := i.(type) {
case string:
fmt.Println("You are a string")
case int:
fmt.Println("You are an integer value")
default:
fmt.Printf("Your are %T", t)
}
}
whatIsMyType("Hello World")
whatIsMyType(1000)
whatIsMyType(true)
fmt.Scanf("Pause")
}
package main
import "fmt"
//Chu vi hình chữ nhật
//Rectangle Perimeter
//Cách khai báo 1
func rectPerimeter(a int, b int) int {
return (a + b) * 2
}
//Diện tích hình chữ nhật
//Rectangle Area
//Cách khai báo 2
func rectArea(a, b int) int {
return a * b
}
func main() {
a := 2
b := 3
rectPeri := rectPerimeter(a, b)
fmt.Printf("Perimeter of rectangle is %d\n", rectPeri)
rectAr := rectArea(a, b)
fmt.Printf("Area of rectangle is %d\n", rectAr)
fmt.Scanf("Pause")
}
Perimeter of rectangle is 10
Area of rectangle is 6
Hàm trả về nhiều giá trị (Multiple Return Values) trong Golang.
Hàm trả về nhiều giá trị trong Golang có các cách viết sau
Cách 1: Hàm với giá trị trả về
func [tên Hàm]([tên biến 1] , [tên biến 2] [kiểu biến]) ([kiểu trả về 1], [kiểu trả về 2]){
//thân hàm…
//logic tính toán…
return [giá trị trả về 1], [giá trị trả về 2]
}
Cách 2: Hàm khai bào trước tên của giá trị trả về, nếu đã khai báo trước giá trị trả về thì chỉ cần có return mà không cần phải bỏ các giá trị bên cạnh từ khóa return
func [tên Hàm]([tên biến truyền vào 1] , [tên biến truyền vào 2] [kiểu biến truyền vào]) ([tên biến trả về 1] [kiểu trả về 1], [tên biến trả về 2][kiểu trả về 2]){
//thân hàm…
//logic tính toán…
return
}
Cách 3: Hàm khai báo trước tên giá trị trả về với cách viết rút gọn kiểu trả về nếu tất cả các giá trị trả về cùng kiểu.
func [tên Hàm]([tên biến truyền vào 1] , [tên biến truyền vào 2] [kiểu biến truyền vào]) ([tên biến trả về 1], [tên biến trả về 2][kiểu trả về]){
//thân hàm…
//logic tính toán…
return
}
package main
import "fmt"
//Chu vi hình chữ nhật
//Rectangle Perimeter
func rectPerimeter(a int, b int) int {
return (a + b) * 2
}
//Diện tích hình chữ nhật
//Rectangle Area
func rectArea(a, b int) int {
return a * b
}
//Chu vi và diện tích hình chữ nhật cách 1
func rectPeriAndArea1(a, b int) (int, int) {
rectPeri := rectPerimeter(a, b)
rectArea := rectArea(a, b)
return rectPeri, rectArea
}
//Chu vi và diện tích hình chữ nhật cách 2
func rectPeriAndArea2(a, b int) (rectPeri int, rectAr int) {
rectPeri = rectPerimeter(a, b)
rectAr = rectArea(a, b)
return
}
//Chu vi và diện tích hình chữ nhật cách 3
func rectPeriAndArea3(a, b int) (rectPeri, rectAr int) {
rectPeri = rectPerimeter(a, b)
rectAr = rectArea(a, b)
return
}
func main() {
a := 2
b := 3
rectPeri1, rectAr1 := rectPeriAndArea1(a, b)
fmt.Printf("rectPeri1=%d, rectAr1=%d\n", rectPeri1, rectAr1)
rectPeri2, rectAr2 := rectPeriAndArea2(a, b)
fmt.Printf("rectPeri2=%d, rectAr2=%d\n", rectPeri2, rectAr2)
rectPeri3, rectAr3 := rectPeriAndArea3(a, b)
fmt.Printf("rectPeri3=%d, rectAr3=%d\n", rectPeri3, rectAr3)
fmt.Scanf("Pause")
}
Hàm bất định (Variadict Function) là một hàm chấp nhận số lượng đối số khác nhau và không biết trước.
Chúng ta có thể thấy có dấu … ngộ ha. Nhưng nó có ý nghĩa để khai báo số phần tử không biết trước của đối số truyền vào hàm.
Hàm này cũng nhận giá trị là một array nhưng sau array này lại có dấu … vậy nó có ý nghĩa là gì nhỉ? Dấu … này sẽ tự động phân tách các phần tử tròng mảng thành các đối số vào hàm.
Ví dụ:
myArray = [1,2,3,4]
myArray… = 1,2,3,4
package main
import "fmt"
func min(numbers ...int) int {
result := numbers[0]
for _, num := range numbers {
if result > num {
result = num
}
}
return result
}
func main() {
fmt.Printf("min of 5,3,2 is %d\n", min(5, 3, 2))
fmt.Printf("min of 5,3,2,1 is %d\n", min(5, 3, 2, 1))
numbers := []int{5, 3, 2, 1, 0}
fmt.Printf("min of array [5,3,2,1,0] is %d", min(numbers...))
fmt.Scanf("Pause")
}
Từ khóa static trong Java chủ yếu được sử dụng để quản lý bộ nhớ. Chúng ta có thể áp dụng từ khóa static với các biến, phương thức, khối và các lớp lồng nhau. static có vai trò quan trọng trong lập trình Java, đặc biệt trong việc quản lý tài nguyên và hiệu suất của ứng dụng. Cùng tìm hiểu Static trong Java là gì?
Trong Java, từ khóa static được sử dụng để xác định rằng một thành viên của lớp (biến hoặc phương thức) thuộc về chính lớp đó, thay vì đối tượng (instance) của lớp. Điều này có nghĩa là thành viên static có thể được truy cập mà không cần khởi tạo đối tượng.
Chúng ta có thể áp dụng từ khóa static với các biến, các phương thức, các khối, các lớp lồng nhau(nested class).
Biến static (static variables): khi bạn khai báo một biến là static, thì biến đó được gọi là biến tĩnh, hay biến static.
Phương thức static (static methods): khi bạn khai báo một phương thức là static, thì phương thức đó gọi là phương thức static.
Khối static (static blocks): được sử dụng để khởi tạo thành viên dữ liệu static.
Lớp static (static class): một class được có thể được đặt là static chỉ khi nó là một nested class. Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).
Import static: từ phiên bản Java 5, cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.
Biến static (static variables) trong Java
Trong Java, biến có thể được khai báo cùng với từ khóa static, và lúc đó nó có thể được gọi là class variable.
Việc cấp phát bộ nhớ cho biến static chỉ xảy ra một lần khi class được nạp vào bộ nhớ
Giá trị mặc định khi khai báo và khởi tạo biến static và non-static là giống nhau, cụ thể:
primitive integers (long, int, short, byte): 0
primitive floating points (double, float): 0.0
boolean: false
object references: null
Biến static có thể được sử dụng làm thuộc tính chung, để dùng chung dữ liệu cho tất cả objects (hoặc instances ) của lớp đó và điều đó giúp cho chương trình tiết kiệm bộ nhớ hơn
Nếu một biến vừa khai báo từ khóa final vừa khai báo từ khóa static thì nó được xem như là một hằng số. Một hằng số nên được viết hoa và nếu có nhiều từ thì phân cách bằng dấu gạch dưới (_)
public static final PI = 3.14;
Trong Interface, mặc định một biến sẽ được khai báo là public static final.
Nếu một biến được khai báo với từ khóa static thì bạn có thể truy cập trực tiếp thông qua lớp.
Ví dụ: Website gpcoder.com có rất nhiều bài viết, mỗi bài viết cần hiển thị địa chỉ của website dưới mỗi bài viết, địa chỉ này giống nhau và có nhiều lớp cần sử dụng. Để tiết kiệm bộ nhớ, dễ dàng chia sẻ và sử dụng ở các lớp khác. Chúng ta có thể sử dụng từ khóa static như sau:
MyWebsite.java
public class MyWebsite {
public static String WEBSITE = "gpcoder.com";
}
UsingStaticExample.java
public class UsingStaticExample {
private String subject;
UsingStaticExample (String subject) {
this.subject = subject;
}
public void print() {
System.out.println("Subject = " + subject);
System.out.println("Website = " + MyWebsite.WEBSITE);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample("Core Java");
ex1.print();
System.out.println("----");
UsingStaticExample ex2 = new UsingStaticExample("Object Oriented Programing");
ex2.print();
}
}
Một ví dụ khác thường hay được sử dụng để minh họa cho việc sử dụng từ khóa static là bộ đếm Counter. Bạn có một website và bạn cần đếm số lượt truy cập vào trang. Bạn viết chương trình như sau:
public class Counter {
int count = 0;
public Counter() {
}
public void visit() {
count++;
this.print();
}
public void print() {
System.out.println("count = " + count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
c1.visit();
Counter c2 = new Counter();
c2.visit();
Counter c3 = new Counter();
c3.visit();
}
}
Kết quả thực thi chương trình trên
count = 1
count = 1
count = 1
Bạn thắc mắc tại sao kết quả ra kỳ vậy, rõ ràng là tôi đã tăng số lượng truy cập lên rồi mà.
Đó là bởi vì, biến count lấy bộ nhớ tại thời điểm tạo đối tượng, mỗi đối tượng sẽ có bản sao của biến instance, nếu biến count được tăng lên, nó sẽ không ảnh hướng đến các đối tượng khác. Vì thế mỗi đối tượng sẽ có giá trị 1 trong biến count.
Như bạn đã thấy ở trên, biến static sẽ lấy bộ nhớ chỉ một lần, nếu bất cứ đối tượng nào thay đổi giá trị của biến static, nó sẽ vẫn ghi nhớ giá trị của nó.
public class Counter {
static int count = 0;
public Counter() {
}
public void visit() {
count++;
this.print();
}
public void print() {
System.out.println("count = " + count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
c1.visit();
Counter c2 = new Counter();
c2.visit();
Counter c3 = new Counter();
c3.visit();
}
}
Nếu một phương thức được khai báo với từ khóa static thì phương thức đó được gọi là phương thức static.
Một số đặc điểm:
Một phương thức static thuộc lớp chứ không phải đối tượng của lớp.
Một phương thức static có thể được gọi mà không cần tạo khởi tạo (instance) của một lớp.
Phương thức static có thể truy cập biến static và có thể thay đổi giá trị của nó.
Một phương thức static chỉ có thể gọi một phương thức static khác, không thể gọi được một phương thức non-static.
Một phương thức static không thể được sử dụng từ khóa this và super.
Người dùng không thể override (đè) phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi khi chương trình đang chạy (runtime) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override (đè).
Khi nào sử dụng từ khóa static cho một phương thức?
Khi phương thức không phụ thuộc vào trạng thái của đối tượng, nghĩa là không cần sử dụng bất kỳ dữ liệu thành viên nào của đối tượng, mọi thứ được truyền như các tham số (parameter).
Các phương thức tiện ích là một trường hợp thường được sử dụng nhất trong Java vì chúng có thể được truy cập trực tiếp bằng tên lớp mà không cần tạo bất thể hiện nào. Lớp java.lang.Math là một ví dụ trường hợp sử dụng static method.
Khối static được dùng để khởi tạo hoặc thay đổi giá trị của các biến static.
Nó được thực thi trước phương thức main tại thời gian tải lớp.
Một class có thể có nhiều static blocks.
Ví dụ:
public class UsingStaticExample {
private static String subject;
static {
System.out.println("Khối static được gọi");
}
static {
subject = "Khối static (static blocks)";
}
UsingStaticExample () {
System.out.println("hàm main() được gọi");
System.out.println("Subject = " + subject);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample();
}
}
Kết quả:
Khối static được gọi
hàm main() được gọi
Subject = Khối static (static blocks)
Lớp static (static class)
Một class được có thể được đặt là static chỉ khi nó là một nested class (tức nằm trong một lớp khác). Một nested static class có thể được truy cập mà không cần một object của outer class (lớp bên ngoài).
Ví dụ:
public class UsingStaticExample {
private String subject;
UsingStaticExample (String subject) {
this.subject = subject;
}
// nested static class
static class MyWebsite {
public static String WEBSITE = "gpcoder.com";
}
public void print() {
System.out.println("Subject = " + subject);
System.out.println("Website = " + MyWebsite.WEBSITE);
}
public static void main(String[] args) {
UsingStaticExample ex1 = new UsingStaticExample("Core Java");
ex1.print();
}
}
Kết quả:
Subject = Core Java
Website = gpcoder.com
Import static trong Java
Java cho phép import các thành viên tĩnh (static member) của một class hoặc package vào một class khác bằng cách sử dụng từ khóa import và sau đó sử dụng chúng như là thành viên của lớp đó.
Ví dụ:
SystemConfig.java
package com.gpcoder;
public final class SystemConfig {
public static final String USER_NAME = "gpcoder";
public static final String PASSWORD = "123";
public static final String EMAIL = "gpcodervn@gmail.com";
private SystemConfig() {
}
}
StaticImportDemo.java
package com.gpcoder;
import static com.gpcoder.SystemConfig.*;
public class StaticImportDemo {
public static void main(String[] args) {
System.out.println("Username: " + USER_NAME);
System.out.println("Password: " + PASSWORD);
System.out.println("Email: " + EMAIL);
}
}
Như bạn thấy, khi sử dụng import static chúng ta có thể gọi trực tiếp các thành viên mà không cần phải thông qua tên class, chẳng hạn SystemConfig.USER_NAME
Ứng dụng của static
Tiết kiệm bộ nhớ: Các biến và phương thức static chỉ có một bản sao duy nhất được lưu trong bộ nhớ, do đó giúp tiết kiệm bộ nhớ khi bạn có nhiều đối tượng của lớp sử dụng chung dữ liệu.
Tính toán hoặc tiện ích: Phương thức static thường được sử dụng cho các phương thức tiện ích, chẳng hạn như các phương thức toán học trong lớp Math của Java (Math.sqrt(), Math.abs(), v.v.).
Đồng nhất dữ liệu: Khi có các biến cần được chia sẻ giữa các đối tượng và không thay đổi giữa các lần sử dụng, static là lựa chọn hợp lý để đảm bảo sự đồng nhất của dữ liệu.
Hạn chế của static
Thiếu tính linh hoạt: Các phương thức static không thể truy cập trực tiếp vào các biến và phương thức non-static, do đó bạn không thể sử dụng chúng khi cần thao tác với dữ liệu cụ thể của từng đối tượng.
Quá tải bộ nhớ: Mặc dù static giúp tiết kiệm bộ nhớ, nhưng nếu không sử dụng đúng cách (ví dụ: quá nhiều biến static), chúng có thể chiếm một lượng bộ nhớ lớn vì luôn tồn tại trong suốt thời gian chạy chương trình.
Sự khác biệt giữa static và non-static
Tiêu chí
static
non-static
Thuộc về
Thuộc về lớp (class-level).
Thuộc về đối tượng (instance-level).
Truy cập
Có thể truy cập mà không cần tạo đối tượng của lớp.
Phải tạo đối tượng của lớp để truy cập.
Số lượng bản sao
Chỉ có một bản sao cho tất cả các đối tượng của lớp.
Mỗi đối tượng có bản sao riêng của các biến và phương thức.
Truy cập biến và phương thức khác
Chỉ có thể truy cập các thành viên static khác trong lớp.
Có thể truy cập cả biến và phương thức static lẫn non-static.
Một số câu hỏi thường gặp khi đi phỏng vấn liên quan đến từ khóa static
Ý nghĩa của từ khoá static trong Java là gì? Chúng ta có thể override (đè) một hàm private hoặc static trong Java không?
Từ khoá static biểu thị cho biến hoặc phương thức có thể được truy cập (sử dụng) mà không cần tạo ra thực thể của lớp chứa nó. Người dùng không thể override phương thức static trong Java, bởi vì kỹ thuật đè (overriding) phương thức được dựa trên quá trình gán (binding) động khi runtime (khi chương trình đang chạy) và những phương thức static được gán tĩnh trong thời gian biên dịch. Phương thức tĩnh không ràng buộc với thực thể của lớp nên phương thức tĩnh sẽ không thể override.
Chúng ta có thể truy cập một biến không tĩnh (non-static) trong một ngữ cảnh static được không?
Một biến static phụ thuộc vào lớp của nó và giá trị của nó sẽ tồn tại (giữ) cho tất cả các thực thể của lớp đó. Biến static được tạo ra khi lớp chứa đó được tải (load) bởi JVM. Nếu cố gắng truy cập vào một biến non-static (trong hàm static) mà không có trong thực thể (instance) nào thì trình biên dịch sẽ báo lỗi, bởi vì những biến đó (non-static) chưa được khởi tạo và chúng không có ràng buộc với bất kỳ thực thể nào.
Tại sao phương thức main trong Java là static?
Trả lời: Bởi vì không cần thiết phải tạo đối tượng để gọi phương thức static. Nếu nó là phương thức non-static, JVM đầu tiên tạo đối tượng và sau đó gọi phương thức main() mà có thể gây ra vấn đề về cấp phát bộ nhớ bộ nhớ phụ.
Chúng ta có thể thực thi một chương trình mà không có phương thức main()?
Trả lời: Có thể, một trong các cách đó là khối static trong phiên bản trước của JDK 1.7.
Ví dụ:
public class ProgramWithoutMain {
static {
System.out.println("static block is invoked");
System.exit(0);
}
}
Kết quả:
Trường hợp chạy ở JDK < 1.7
static block is invoked
Trường hợp chạy ở JDK >= 1.7
Error: Main method not found in class com.gpcoder.ProgramWithoutMain, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
Từ khóa static trong Java là một công cụ mạnh mẽ để giúp quản lý tài nguyên và hiệu suất của ứng dụng. Nó cho phép chia sẻ dữ liệu và phương thức giữa các đối tượng của một lớp mà không cần khởi tạo chúng mỗi lần. Qua bài viết này, hi vọng đã giúp bạn hiểu về Static và cách sử dụng static để đảm bảo chương trình của bạn hoạt động hiệu quả.
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng
Series bài viết giúp lập trình viên đã biết Python bắt đầu code Go mượt mà hơn – tài liệu bổ trợ cho Go tour chứ không để thay thế – phần 1.
Golang là gì
Go (hay còn gọi là Golang theo tên trang chủ golang.org) là một ngôn ngữ lập trình mới xuất hiện trong công chúng vào năm 2009 (vs: Python 1991, Java 1995), tại Google.
Go được thiết kế ra với mục tiêu thay thế cho C++, nhưng khi tung ra cộng đồng, nó lại trở thành ngôn ngữ hấp dẫn đối với các lập trình viên dùng ngôn ngữ bậc cao hơn như Python, Ruby, PHP, NodeJS… nhờ khả năng chạy code nhanh, dùng ít tài nguyên hơn, deploy dễ hơn so với các ngôn ngữ này.
Go trở thành một trào lưu (trend) công nghệ trên internet, với các bài viết “Write X in Go” luôn trở thành bài hot (và giờ thì tới Rust). Go được sử dụng như một ngôn ngữ “backend”, rất thịnh hành tại các startup công nghệ để viết “service” trong các hệ thống “microservice”, web API. Go còn được dùng phổ biến để viết các câu lệnh command line.
Go đã ở giai đoạn “production ready”, đủ ổn định và đã được chạy trên các hệ thống lớn trên toàn cầu. Các sản phẩm opensource viết bằng Go được dùng rộng rãi như: Kubernetes, Docker, Terraform, InfluxDB, Prometheus, Grafana, …
Những lĩnh vực khác cũng đã có mặt Go nhưng chưa thực sự thành công: mobile, frontend (JavaScript), làm website (như Django/RubyOnRails), Machine Learning.
Những ưu điểm nổi bật của Go
Ngôn ngữ đơn giản: Go có ít khái niệm hơn các ngôn ngữ lập trình khác C++/Java/Python/Ruby… Go tại năm 2020 có 25 keywords, Python 3.8 có 35 keywords. Hầu hết các công ty tuyển lập trình viên Go đều không yêu cầu kinh nghiệm code Go, chỉ cần tuyển 1 lập trình viên đã dùng ngôn ngữ khác, qua training 1-2 tuần là đã có thể viết code production, trông không khác gì lập trình viên lâu năm.
Compile nhanh: so với các ngôn ngữ C/C++/Java/C#… thì Go compile nhanh gấp nhiều lần
Sản phẩm compile tạo ra là 1 file binary. Sau đó chỉ cần mang file này đi chạy là xong – điểm này khác biệt lớn so với Python, NodeJS, Ruby – phải cài các “dependency” (pip/npm/gem) rồi mới chạy được code (Go cũng cần tải các dependency, nhưng chỉ cần thực hiện trước khi compile ra file binary).
Code chạy nhanh: Go tuy không nhanh bằng C/C++/C#/Java trong hầu hết các trường hợp, chậm hơn cỡ 2-5 lần, nhưng nhanh hơn Python/Ruby cỡ 20-100 lần,
Vậy nên cách nhanh nhất để thử 1 đoạn code trong Go có lẽ là viết unittest. test rất phổ biến với một Go project, là một phần có sẵn trong bộ công cụ dev.
Với 1 file code đơn giản, có thể dùng lệnh go run main.go để làm gộp 2 bước, compile rồi chạy file kết quả luôn.
Auto format – go fmt
Go là ngôn ngữ lập trình đầu tiên đưa 1 công cụ format code tự động vào tiêu chuẩn, chấm dứt mọi tranh cãi về code-style/format code. Ý tưởng tuyệt vời này sau được copy sang nhiều ngôn ngữ khác (như Python black)
go fmt
Static typing
Python là ngôn ngữ dynamic typing, Go là static typing. Nếu chưa từng code ngôn ngữ static typing hay chưa dùng type annotation của Python, khác biệt này sẽ gây chút khó khăn lúc bắt đầu code Go.
In a statically typed language, the type of variables must be known (and usually declared) at the point at which it is used. Attempting to use it will be an error. In a dynamically typed language, objects still have a type, but it is determined at runtime. You are free to bind names (variables) to different objects with a different type. So long as you only perform operations valid for the type the interpreter doesn’t care what type they actually are.
Static/dynamic typing nói tới kiểu (type) của 1 biến (variable/name). Trong dynamic typing, kiểu của 1 biến có thể thay đổi:
x=10x="PyMi"
Trong static typing, kiểu của 1 biến là cố định, và được khai báo ngay từ trước khi dùng, code sau sẽ gặp lỗi khi compile, và không tạo ra binary nào để chạy.
varxint=10x="PyMi"
cannot use "PyMi" (type untyped string) as type int in assignment
$ mypy typetest.py
typetest.py:2: error: Incompatible types in assignment (expression has type"str", variable has type"int")
Found 1 error in 1 file (checked 1source file)
Kiểu của các biến trong Go nói chung phải khai báo (declare), Go có thể tự suy luận (type inference) được trong một vài trường hợp đơn giản.
x:=10s:="PyMi"
Low level
Được thiết kế nhằm thay C/C++ pha lẫn sự đơn giản dễ đọc của Python, code Go thường đơn giản hơn code C/C++ nhưng khá “thủ công”/”low level” so với code Python. Lập trình viên Python code Go nên quen với việc bỏ bớt đi nhiều tính năng tiện lợi, phải viết nhiều code hơn.
Sort trong Go chắc chắn dài hơn L.sort(reverse=True)
Reverse string sẽ không phải làs[::-1] mà dài cả mét
Không đơn giản chỉ json.loads để biến str thành dict mà phải định nghĩa struct theo cấu trúc của JSON.
Code Go nhìn chung sẽ dài hơn code Python, vậy nên lập trình viên nên sắm cho mình một IDE xịn (như GoLand/IntelliJ IDEA , VSCode hay vim + vim-go), với khả năng dùng snippet để sinh code.
Sự bất tiện này sẽ đỡ khó chịu đi nhiều khi đã quen dùng snippet.
Học lập trình Go (khi đã biết Python)
Bao nhiêu là đủ? Em vui là được có phải không!
Không ai đọc hết quyển từ điển tiếng Việt rồi mới ra nói câu đầu tiên, không ai học lên tiến sỹ âm nhạc rồi mới chạm tay vào đánh đàn. Khi học Python tại PyMi.vn, ta học từng chút, dùng từng chút, chứ không học hết lý thuyết cả Python rồi mới thực hành. Cũng không phải học async, threading, metaclass rồi mới chịu đi làm.
Học Go cũng vậy, dùng gì học đấy, cần gì học đấy. Cần gì thì phụ thuộc vào bạn định làm gì, một Python web developer sẽ học Django, ORM, làm việc với database trong khi một SysAdmin/DevOps engineer lại làm việc với file, process…
Go dùng camelCase, với ý nghĩa đặc biệt khi chữ cái đầu viết hoa hay viết thường. Nếu viết hoa, var/function/type đó sẽ trở thành “public”, code bên ngoài package hiện tại truy cập được, còn không viết hoa sẽ là “private”.
Data types
Built-in
nil: nil là một giá trị, không có kiểu, đại diện cho sự “không tồn tại”.
bool: kiểu boolean gồm 2 giá trị truefalse, các boolean operator && (and), || (or) tuân theo short-circuit.
int: các kiểu số trong Go đều có kích thước, int có kích thước 32 hoặc 64 bits tùy theo bản (chủ yếu 64 bits). Các kiểu cụ thể int8 int16 int32 int64, có kích thước là 2 mũ n, int8 int16 thường chỉ dùng khi tối ưu về memory. int64 biểu diễn được giá trị trong khoảng (-2**64/2, 2**64/2), muốn tính giá trị lớn có thể sử dụng package có sẵn math/big.
float32 hoặc float64: chú ý không có kiểu float. Tuân theo chuẩn IEE754 nên x, y, z := 0.1, 0.1, 0.1 thì x + y + z == 0.3 sẽ trả về false. Chú ý ở trên tạo các biến để các giá trị 0.1 có kiểu float64, nếu viết trực tiếp 0.1 + 0.1 + 0.1 == 0.3 sẽ là so sánh constants và trả về true https://play.golang.org/p/TWRRr_lM7jk. Đọc thêm về constants tại blog Go.
string: giống như string của Python, immutable, có thể truy cập các chữ cái bằng cách chuyển thành runes (s := []rune(sting)) rồi dùng index: s[3]. String bên dưới là 1 chuỗi các byte, hay một byte array/byte slice []byte{'h', 'e', 'l', 'l', 'o'}, có thể convert thành string: string(bytes). Python cũng có kiểu bytes, cũng chuyển thành str bằng cách decode b'abc'.decode('utf-8').
array/slice: Go array giống như C, các phần tử phải cùng kiểu, và kích thước cố định không đổi. Array ít được dùng trực tiếp nó được dùng bên dưới slice và slice linh hoạt như list trong Python. Ví dụ về slice
ns:=[]int{0,1}fmt.Printf("%v\n",ns)ns=append(ns,2)fmt.Printf("%v\n",ns)ns=append(ns,ns...)// như extend trong python listfmt.Printf("%v\n",ns)
map: giống dict của Python, key phải so sánh == được, map và slice không làm key được, key không theo thứ tự (unordered). Map trong Go dùng khi cần nối key-value, tìm kiếm nhanh, nhưng không dùng như 1 object như dict Python. Do map phải có kiểu cố định cho key, value. Xem code
Các kiểu khác struct, pointer, function, interface, channel sẽ được nhắc tới sau, xem đầy đủ tại spec.
Struct & method
Python có class, cung cấp đủ các tính năng tiêu chuẩn của OOP (object-oriented programming – lập trình hướng đối tượng). Định nghĩa 1 class tạo ra 1 kiểu dữ liệu mới và cho phép đóng gói dữ liệu (data) với tính năng (method) lại với nhau.
Go struct: A struct is a collection of fields.
struct không cung cấp các tính năng của OOP (như inheritance), nhưng cũng tạo ra 1 kiểu dữ liệu mới và cho phép đóng gói dữ liệu (data) với tính năng (method) lại với nhau. https://play.golang.org/p/tQMPLn9OXcj
Trong Go, function gắn với các struct gọi là method, (r Rectangle) gọi là receiver, đứng trước tên Area() trông lạ so với các ngôn ngữ khác, nhưng nó đóng vai trò như self trong Python method.
Remember: a method is just a function with a receiver argument.
interface, type assertion, type switch
Một interface type định nghĩa 1 tập hợp các method.
An interface type is defined as a set of method signatures.
Một value của type interface có thể chứa bất kỳ giá trị nào implement các method qui định trong interface đó.
Empty interface interface{} là trường hợp đặc biệt, nó có thể chứa mọi giá trị do không cần có method nào.
Một value kiểu interface{} đánh sập mọi đảm bảo về type trong Golang, biến Go thành dynamic typing như Python. Nó như lối thoát linh hoạt giữa mọi sự cứng nhắc/static.
Sử dụng type assertion để truy cập giá trị ẩn dưới interface{}:
Cách duy nhất để gọi function là đưa vào các argument theo thứ tự, không có keyword argument như Python (python_function(x=5, y=7)).
Có thể dùng function làm argument của function khác, việc này rất phổ biến trong Go, khái niệm này có tên first class function. Function nhận function khác làm argument được gọi là higher order function.
Error handling
Go không có exception, lỗi không được xử lý khiến chương trình kết thúc qua việc gọi function “panic” (runtime error). Ví dụ khi dùng type assertion để truy cập kiểu string dưới 1 empty interface chứa giá trị int.
Các function thay vì tạo ra exception, thường trả về giá trị Error kèm kết quả. Ví dụ function trong package strconv dùng để convert string thành int:
funcAtoi(sstring)(int,error)
Nếu thành công, error sẽ là nil còn biến kiểu int chứa giá trị, nếu s không phải dạng string của 1 số int, error sẽ có giá trị khác nil và thường chứa chi tiết về lỗi xảy ra. error là kiểu dữ liệu interface.
typeerrorinterface{Error()string}
mọi kiểu dữ liệu có method Error() return string đều có thể là 1 error.
Do các function đều viết theo cách này, nên code gọi 1 function trong Go thường đi kèm với 1 đoạn kiểm tra error ngay sau đó rồi mới xử lý giá trị nhận được:
Cách làm này gây nhiều tranh cãi, nhưng vẫn là cách làm chính thống của Go. Go dễ dãi hơn so với Java (khi 1 function xảy ra exception gì thì phải khai báo có thể xảy ra exception, và code gọi bắt buộc phải xử lý). Bỏ qua giá trị của err là chuyện hoàn toàn làm được, như viết code Python không xử lý exception, khi có error xảy ra, chương trình thường sẽ… chết.
Cách return error này không ÉP được lập trình viên phải xử lý mọi lỗi, nhưng tạo ra 1 nền văn hóa trong cộng đồng code Golang: luôn xử lý (hay ít nhất là nghĩ tới) error mọi lúc, mọi nơi.
Import
Cú pháp tương tự Python
import"packagename"import"fmt"
rồi gọi function qua package.Function, vd: fmt.Println
Package & Install 3rd packages
Đầu mỗi file code Go phải bắt đầu bằng
packagepackagename
Tất cả các file go trong cùng 1 thư mục (không tính thư mục con) phải khai báo cùng package, chúng sẽ được gộp lại làm một (trừ phần import, mỗi file phải tự import thư viện mình dùng). Có thể coi việc các file khác nhau chỉ để thuận tiện tổ chức code, chứ vẫn là trong 1 file. Các function trong cùng 1 package (khác file) có thể gọi nhau thoải mái, không cần import lẫn nhau.
Việc này khác với Python, mỗi file.py tự động là 1 module riêng biệt.
Go cài package bằng lệnh go get, sau đó import tên package – là một đường dẫn theo cấu trúc URL online.
Package “testing” của Go không có “assert”, cài package từ github rồi dùng assert.Equal để kiểm tra 2 giá trị có bằng nhau không, và message hiển thị khi chúng không bằng nhau.
// main_test.gopackagemainimport("github.com/stretchr/testify/assert""testing")funcTestSomething(t*testing.T){// assert equalityassert.Equal(t,123,123,"they should be equal")}
$ go test -v
=== RUN TestSomething
--- PASS: TestSomething (0.00s)
PASS
ok _/home/hvn/MyData 0.002s
What is the sum of the digits of the number 2 to the power of 1000?
packagemainimport("fmt""math/big""strconv")funcmain(){vartwoToThePowerOf1000big.InttwoToThePowerOf1000.Exp(big.NewInt(2),big.NewInt(1000),nil)// Có thể tính sum luôn nhưng bài này minh họa slicedigits:=[]int{}for_,c:=rangetwoToThePowerOf1000.String(){digit,_:=strconv.Atoi(string(c))digits=append(digits,digit)}sum:=0for_,v:=rangedigits{sum=sum+v}fmt.Printf("%d\n",sum)}
People & Community
Go có cộng đồng trên toàn cầu, có forum/slack/IRC để thảo luận, xem tại help – có cả bằng Tiếng Việt.
Những nhân vật đáng chú ý/follow trong cộng đồng Go gồm các tác giả, core dev, …
Go là một ngôn ngữ lập trình đơn giản và thú vị, với những kiến thức trong bài này, ta đã có thể bắt đầu dùng Go để viết các chương trình không hề đơn giản. Phần tiếp sẽ trình bày chi tiết về các khái niệm chỉ có trong Go mà không có trong Python như Pointer, sự khác biệt về cách tổ chức package trong Go, declaration & initialization (khai báo và khởi tạo variable), cùng các standard library quan trọng nhất cho một SysAdmin/DevOps.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Lập trình là một công việc có khá nhiều các hành động được lặp lại, chính vì vậy lựa chọn được tập hợp các công cụ sử dụng trong viết mã nguồn, thực hiện debug, thực hiện build… phù hợp giúp bạn tiết kiệm nhiều thời gian. Các công cụ kể đến được chia thành một số nhóm như sau:
Trình soạn thảo mã nguồn
Code editor hay trình soạn thảo mã nguồn là nơi chúng ta dành nhiều thời gian nhất để viết mã nguồn, có hai dạng trình soạn thảo là IDE và lightweight editor. IDE (Integrated Development Environment) môi trường phát triển tích hợp là ứng dụng lớn có thể kiểm soát mọi thứ trong dự án web từ việc viết code đến hỗ trợ debug, kiểm thử, triển khai sản phẩm… tuy nhiên IDE thường sẽ rất nặng nề và cần cấu hình máy tương đối. Lightweight editor là những phần mềm soạn thảo text thông thường được nâng cấp thêm các chức năng cho việc viết code được dễ dàng hơn. Cả hai dạng trình soạn thảo này đều đáp ứng được một số các tính năng tiêu chuẩn cho viết mã nguồn như sau:
Phân tích cú pháp và bôi màu văn bản (syntax highlighting): mã ứng dụng không có tính năng này thật là thảm họa, chúng ta có thể đọc một cuốn sách in chữ đen trắng cả ngày nhưng không thể đọc một đoạn code không highlight trong 10 phút.
Tìm kiếm và khớp nối các ký tự đóng mở (bracket matching): rất cần thiết cho các đoạn, khối code và các biểu thức logic, không có tính năng này rất khó tìm ra lỗi soạn thảo.
Gợi ý các câu lệnh, cú pháp (autocompletion).
Ẩn hiện mã nguồn theo nhóm (code folding): tính năng này có thể có hoặc không nhưng nếu có nó cũng giúp bạn khá nhiều trong các dự án lớn.
Một số các trình soạn thảo thông dụng nhất hiện nay mà bạn nên sử dụng nếu dự án của bạn có liên quan đến PHP và Javascript:
IDE: NetBean, PHPStorm, Zend Studio…
Lightweight editor: SublimeText, Notepad++…
Trong suốt khóa học Vue.js này chúng ta sẽ sử dụng Sublime Text, nó rất nhẹ nhàng và theo cảm nhận thì tôi thấy đầy đủ tính năng cho các dự án web tầm trung. Mặc định Sublime Text không highlight mã nguồn cho các template Vue với phần mở rộng .vue, chúng ta có thể cài đặt gói Vue Syntax Highlight, các bước cài đặt như sau: Trong Sublime Text chọn Preferences -> Package Control
Tiếp theo chọn Package Control: Install Package, trong phần tìm kiếm gõ vào từ khóa Vue Syntax Highlight.
Như vậy chúng ta đã cài đặt xong, tắt ứng dụng đi mở lại, các template của Vue đã được highlight.
Công cụ debug Vue.js
Framework Vue.js có một công cụ sử dụng để debug riêng là DevTools, nó là một extension trên Chrome. Sau khi cài đặt sẽ xuất hiện biểu tượng Vue ở góc trên bên phải trình duyệt. Tuy nhiên, lúc này khi click vào biểu tượng đó thì sẽ có thông báo Vue.js not detected do extension này chưa có quyền truy xuất file URL. Thêm quyền này bằng cách ấn vào biểu tượng 3 dấu chấm phía trên bên phải chọn More tools, sau đó chọn Extensions và tìm đến Vue.js devtools, chọn vào Allow access to file URLs.
Chúng ta cùng khám phá DevTools với ví dụ đầu tiên Hello world trong phần giới thiệu Vue.js xem thế nào? Ví dụ này sử dụng phiên bản triển khai sản phẩm (product version) do đó DevTools không thể làm việc được, cần chuyển sang phiên bản phát triển (development version). Rất đơn giản bạn chỉ cần thay “vue.min.js” thành “vue.js”. Chúng ta cũng đã thống nhất với nhau sẽ chủ yếu dùng CDN để demo các đoạn mã cho tiện.
<!DOCTYPE html><html><head><title>Ví dụ đầu tiên Vue.js - allaravel.com</title></head><body><div id="app"><h1>{{ message }}</h1><input v-model="message"></div><script src="https://unpkg.com/vue@2.5.16/dist/vue.js"></script><script type="text/javascript">newVue({
el:'#app',
data:{
message:'Xin chào, tôi là Vue.js'}})</script></body></html>
Mở trang này trên trình duyệt và mở cửa sổ Console của trình duyệt lên (với Chrome phím tắt là Ctrl + Shift + I) và tìm đến tab Vue.
Công cụ này cho phép sửa trực tiếp dữ liệu trong Model, ở đây là đối tượng message, khi thực hiện sửa dữ liệu chúng ta thấy ngay lập tức trên View dữ liệu cũng thay đổi theo. Trong ví dụ đơn giản này không có gì cần debug nhưng khi vào các dự án lớn, số lượng đối tượng nhiều với dữ liệu phức tạp DevTools hỗ trợ rất tốt phần debug.
Các công cụ CLI
CLI (Command Line Interface) Giao diện dòng lệnh là các công cụ hữu ích giúp cho một số công việc đơn giản hơn, trong Laravel chúng ta biết đến các khái niệm Composer, Laravel Artisan thì trong Vue.js chúng ta có Npm, Vue CLI. Ở đây chúng ta chỉ liệt kê ra, còn chi tiết các bạn xem trong Cài đặt môi trường Vue.js.
Cmder
Các bài viết được soạn thảo trên Windows do có một số phần mềm không có trên Linux, công cụ dòng lệnh cmd của Windows quả là lởm do đó bạn có thể sử dụng Cmder một công cụ dòng lệnh tuyệt vời, giao diện rất đẹp với text được highlight như trong trình soạn thảo, việc cóp dán cũng dễ dàng, thiết lập các tham số cho công việc rất tiện lợi. Nếu bạn kết hợp Vue.js với Laravel thì có thể tham khảo Cài đăt Laragon cho môi trường Laravel. Cmder đã được tích hợp làm công cụ dòng lệnh mặc định trong Laragon.
Kết luận
Như vậy chúng ta đã bước qua phần đầu tiên của Khóa học Vue.js, tôi tin chắc bạn đã biết được Vue.js là gì, biết cách cài đặt môi trường Vue.js và sử dụng các công cụ cho công việc phát triển Vue.js. Phần giới thiệu bao giờ cũng tẻ nhạt nhất, chúng ta muốn nhanh chóng vào phần cấu trúc ngôn ngữ, các khái niệm cơ bản và có thể viết ngay các ví dụ. OK, không mất thời gian các bạn nữa, chúng ta tiếp tục với “Khái niệm cơ bản trong Vue.js”.
Theo thống kê của SlashData, năm 2019, thế giới có tới 26,4 triệu Software Developer. Bên cạnh những kỹ năng kỹ thuật thì điều đầu tiên giúp bạn có được công việc trong ngành này là một chiếc IT programmer CV sao cho thật ấn tượng trong mắt nhà tuyển dụng. Sau khi đạt được mong muốn, nhiều dev mải miết làm những công việc quen thuộc mỗi ngày, nhưng trong suốt quá trình làm việc của mình, bạn đã bao giờ tự hỏi bản thân: Mình đã thật sự hiểu hết về lập trình chưa?
Với cá nhân mình, tôi đã gặp 2 kiểu lập trình viên trong đời mình: những kẻ mạo danh và những dev đầy tự tin.
Có 2 kiểu lập trình viên dễ bắt gặp
2 kiểu lập trình viên
Những “kẻ mạo danh” – thể hiện trong IT Programmer CV
Đây là những lập trình viên khi mới bắt đầu công việc luôn cảm thấy nghi ngờ về kỹ năng cũng như kiến thức của mình. Họ luôn có cảm giác mình chưa đủ giỏi, chưa đủ hiểu biết để bắt kịp với sự phát triển thần kỳ của công nghệ. Cũng vì thế mà họ thường dành rất nhiều thời gian để nghiên cứu thêm về công việc của mình, do đó “tay nghề” của họ sẽ ngày càng nâng cao hơn.
Việc bạn bị ảnh hưởng bởi hội chứng những kẻ mạo danh cũng không phải là việc gì đáng xấu hổ. Có đến 70% các dev đều đã trải qua cảm giác này ít nhất một lần trong đời. Nó khá phổ biến ở giai đoạn đầu sự nghiệp của các lập trình viên, khi mà chúng ta vẫn đang ý thức rằng kỹ năng và kinh nghiệm của mình chỉ là “giọt nước giữa đại dương”. Bạn nên cố gắng đầu tư hơn cho CV xin việc CNTT của mình để có được một công việc tốt, những đồng nghiệp giỏi, họ sẽ giúp bạn nhiều hơn trong quá trình làm việc.
Những lập trình viên tự tin
Ngược lại với nhóm người trên, đây là những lập trình viên thường tự tin thái quá về kỹ năng làm việc của mình. Với nhóm người này họ tin rằng từ IT programmer CV của họ đến cách họ làm việc, kiến thức họ có đều là xuất sắc hơn với đồng nghiệp. Cảm giác đạt được thành tựu sau khi viết thành công một chương trình có thể khiến bạn thấy bản thân mình tài giỏi, tuy nhiên nếu không biết kiềm chế cảm xúc và sống trong quá khứ quá lâu dễ khiến lập trình viên trở nên kiêu ngạo và lười biếng.
Kiêu ngạo: khi bạn cảm thấy những gì mình làm luôn đúng và chỉ phương án của mình mới là tốt nhất, bạn nghi ngờ và cho rằng kỹ thuật của người khác là sai, là chưa thật sự ấn tượng. Đây là tư duy khiến bạn không phát triển được trong ngành IT vì đây là lĩnh vực đòi hỏi sự sáng tạo và tiếp thu nhiều kiến thức, nhiều giải pháp khác nhau cho cùng một vấn đề.
Lười biếng: Bạn có CV cho dân IT được nhận xét là ấn tượng nhất, bạn có vị trí cao trong công ty hay vừa hoàn thành xuất sắc một dự án không có nghĩa là bạn đã ở trên đỉnh cao của sự nghiệp và được phép dừng học hỏi, làm mới kiến thức mỗi ngày. Không ai đủ thông minh để biết được tất cả mọi thứ và thời điểm bạn cảm thấy không còn tò mò với công việc nữa cũng là lúc quá trình phát triển thật sự của một lập trình viên trong bạn đã dừng lại.
Tôi cũng đã từng như vậy nhưng may mắn là tôi gặp được những lãnh đạo tốt, họ giúp tôi hiểu ra chính mình và nhắc nhở tôi nên học cách lắng nghe nhiều hơn, để có thể trau dồi thêm cho IT programmer CV của mình. Khi bạn dành thời gian lắng nghe người khác và không vội vàng đưa ra ý kiến của mình, bạn sẽ bất ngờ, vì những gì bạn nhận được sẽ nhiều hơn với những gì bạn nghĩ đó.
Làm thế nào để viết được code tốt?
Không có lập trình viên tồi chỉ có những lập trình viên ít kinh nghiệm hơn. Và ứng viên nào có IT programmer CV nhiều kinh nghiệm làm việc, nhiều dự án hoàn thành tốt chắc chắn sẽ được chú ý hơn. Vậy làm thế nào để biết mình đã thật sự viết được code tốt?
Đầu tiên bạn cần đảm bảo được chất lượng code của mình. Các thủ thuật, cú pháp ngắn và lạ mắt, làm sao để viết được những dòng code dễ hiểu, dễ đọc là điều các dev cần tìm hiểu để nâng cao kỹ năng của mình. Bên cạnh đó, việc đảm bảo tính nhất quán của code cũng quan trọng như cách viết được những code sạch vậy. Bạn có thể viết code theo cách mình muốn nhưng cần giữ cho code được viết có sự thống nhất và dễ đọc là tuân theo phong cách mã hóa đó để những người khác đọc codebase của bạn có thể dễ dàng điều hướng nó.
Code được viết dễ đọc, dễ test và có hiệu suất cao sẽ giúp nâng trình kinh nghiệm cho dev
Lập trình viên cũng cần đảm bảo tính chính xác của code, code viết ra cần phải chạy được, không gặp lỗi. Khi viết xong một đoạn code, các dev cần xử lý được những câu hỏi như có bug trong code hay không, nếu có thì xử lý nó như thế nào, các đoạn code đã thực hiện đúng chức năng của nó chưa,… để đảm bảo tối ưu code. Tất nhiên không ai có thể hoàn hảo để làm mọi thứ chính xác tuyệt đối, nhưng điều quan trọng là dev có ý thức cố gắng tìm ra những lỗi sai, những điểm hạn chế của mình để trở thành một lập trình viên thực thụ.
Sau khi đã đáp ứng được các yêu cầu trên, bạn cần xem xét đến khả năng làm việc hiệu quả của code. Nhiều dev thường cố gắng viết code nhanh và đúng, suy nghĩ quá mức về việc làm sao thực hiện chuyện ấy lại khiến code của bạn không đạt được hiệu suất làm việc thật sự của nó. Do đó, bạn nên bắt đầu bằng việc viết code có thể chạy được, sau đó refactor và cuối cùng mới optimize chúng. Xem xét kỹ về các cấu trúc dữ liệu và kiểm tra cách code hoạt động trước khi tối ưu hóa để code đạt được năng suất làm việc cao nhất.
Nhân tố chính – Kỹ năng Giao tiếp thể hiện trong IT Programmer CV
Mọi thứ sẽ trở nên khó khăn hơn nếu dev không thể giải thích được với đồng nghiệp hay khách hàng của mình cách những đoạn code được viết ra sao và hoạt động như thế nào, nhất là với khách hàng, những người chỉ quan tâm đến kết quả và hiệu năng làm việc. Những dev xuất sắc nhất trên thế giới là những người có khả năng giao tiếp và giải thích dễ dàng code của họ hoạt động như thế nào, biến những thứ phức tạp trở nên đơn giản hơn.
Như Albert Einstein đã nói: “Nếu bạn không thể giải thích nó một cách đơn giản nghĩa là bạn chưa thật sự hiểu hết về nó”. Cũng như cách bạn thể hiện trong IT programmer CV sao cho thật rõ ràng để nhà tuyển dụng có thể dễ dàng hiểu được những kinh nghiệm bạn có, những dự án bạn đã trải qua.
Hi vọng rằng với những chia sẻ trên đây của tôi có thể giúp bạn có thêm một số kiến thức và trả lời được câu hỏi “Mình đã thật sự hiểu về lập trình hay chưa?” Ngoài ra, nếu bạn muốn có một công việc lập trình viên tốt, được làm những việc với những dev tài năng ở môi trường chuyên nghiệp, bạn nên đầu tư hơn cho IT programmer CV của mình. Đây sẽ là chìa khóa để bạn nắm bắt cơ hội tốt hơn với mình đấy.