Bài viết được sự cho phép của BBT Tạp chí Lập trình
1. Nếu bạn từng đi uống trà đá, thì bạn đã hiểu được MVC rồi
Model – View – Controller (MVC) là một mô hình thiết kế web hiện đại đã trở nên quá đỗi quen thuộc. Cứ thử bước vào một phòng làm việc của các lập trình viên xem, bạn sẽ bị “dội bom” bởi hàng đống thứ khủng khiếp mà bạn có khi còn chưa từng nghe tên như là Ruby on Rails, Angular hay Django.
Nhìn rộng hơn, logic của mô hình MVC được sử dụng để mô tả quá trình làm web của đại đa số các ngôn ngữ như là PHP, Ruby, Python hay JavaScript.
Nhiều ông lập trình web mà cứ theo kiểu nhìn đời qua kẽ lá. Cứ thử để mấy ông lập trình viên khác nhìn vào code của họ xem, họ sẽ cho ngay một bài thuyết trình dài cả tiếng toàn những giáo điều quen thuộc.
Mà rõ ràng là mấy thứ đấy không thực tế. Trong khi mô hình MVC hiện tại hoàn toàn có thể được giải thích dễ dàng bằng hình thức trà đá vỉa hè. Vậy nên, nếu bạn từng đi ngồi trà đá với bạn bè, thì bạn có thể hiểu được cấu trúc của các ứng dụng web hiện đại rồi đấy.
M là Model: một cấu trúc dữ liệu chắc chắn, chuẩn bị dữ liệu để cung cấp cho Controller
V là View: nơi hiển thị dữ liệu cho người dùng theo cách mà người dùng có thể dễ dàng hiểu và tương tác được
C là Controller: nhận về lệnh từ người dùng, gửi lệnh đến Model để lấy hay cập nhật dữ liệu, rồi truyền lệnh đến View để cập nhật giao diện hiển thị cho đúng với dữ liệu đã cập nhật
Trên sơ đồ thì nó sẽ như thế này
Ôi giời lằng nhằng phức tạp quá. Làm cốc trà đá cho hạ nhiệt
Bạn bước vào quán trà đá. Giữa mùa hè, quán nào quán nấy nóng nực đông đúc. Bạn luồn lách qua đám đông để gọi cho bằng được bà chủ quán “cho cháu một cốc trà đá cô ơi”.
Lúc này, bạn là “người dùng” và “cốc trà đá” là “yêu cầu từ phía người dùng”. Đối với bạn, cốc trà đá là thứ đồ uống ưa thích, mát lạnh, quá phù hợp để xua tan cái nóng thủ đô 40 độ C.
Bà chủ quán gật đầu “ô kê em nhớ”. Đối với bà chủ quán, cốc trà đá không chỉ ngon lành mát lạnh, mà còn là một mớ quy trình các bước:
Lấy cái cốc
Cho đá vào
Cho trà vào
Cho thêm nước lọc cho trà loãng bớt
Khuấy đều lên
Đưa cốc trà cho bạn
Thanh toán
Bộ não của bà chủ quán lúc này đóng vai trò Controller. Kể từ thời điểm bạn nói “một cốc trà đá” bằng tiếng Việt và bà chủ quán hiểu được, công việc bắt đầu. Trà đá, nước mía hay cocktail thì cũng như nhau, nhưng nguyên liệu thì hoàn toàn khác biệt. Bà chủ quán chỉ có thể sử dụng những công cụ và nguyên liệu của quán, và những công cụ đó sẽ đóng vai trò Model, bao gồm:
Đôi tay của bà chủ
Các nguyên liệu pha chế (trà, nước …)
Đá lạnh
Bia, nước ngọt, thuốc lá…
Chanh, sấu, gừng…
Các ly cốc để đựng đồ uống
Những nguyên liệu và công cụ này, thông qua một loạt các bước, đã trở thành cốc trà đá mát lạnh đến tay bạn. Cốc trà đá lúc này đóng vai trò “View”. “View” được làm nên từ những công cụ, nguyên liệu trong “Model”, được chế biến và bàn giao tới tay bạn thông qua “Controller” (chính là bộ não của bà chủ quán)
3. Bài học rút ra là gì?
1 cốc không đủ, bạn muốn gọi cốc nữa? Rõ ràng là bạn không thể hét to vào cái cốc đã hết (chính là “View”) được, bạn phải gọi bà chủ quán “Controller”.
– Thời gian từ lúc bà chủ quán nhận được yêu cầu tới khi làm xong phải tối thiểu nhất có thể. Đó chính là “skinny controller”, có thể hiểu là “controller” nên chứa tối thiểu lượng logic cần xử lý và được quản lý lượng model nhiều nhất có thể. Một bà chủ quán “thiện nghệ” không chỉ ghi nhớ chính xác cách làm, mà còn chuẩn bị đầy đủ công cụ và nguyên liệu để không mất nhiều thời gian tìm kiếm và chế biến.
– Vậy nếu bà chủ quán đưa hết nguyên liệu cho bạn rồi bảo bạn tự pha? Chẳng ai làm thế cả. Do vậy, bạn cần phải để việc xử lý logic trên model nhiều nhất có thể, và tối giản hóa view. Nói cách khác, được phục vụ tận miệng thì vẫn thích hơn là phải đi pha.
Nếu bạn gọi 1 lon bia thì sao? Bà chủ chắc chẳng phải làm gì nhiều, bật nắp lon bia rồi đưa bạn là xong. Nhưng mà rõ ràng bạn vẫn phải gọi bà chủ quán, vì lon bia không thể tự nhảy ra trước mặt bạn được.
4. Quay trở lại vấn đề lập trình web
Giờ thử xem một ứng dụng web hiện đại có quy trình thế nào nhé
– Người dùng tạo ra một yêu cầu thông qua đường dẫn, ví dụ /home
– Controller nhận yêu cầu và đưa ra một mệnh lệnh để xử lý yêu cầu đó. Nếu lệnh thực thi với phần View thì cập nhật lại màn hình hiển thị, với Model thì để trình diễn logic. Giả sử yêu cầu của người dùng có yếu tố logic
– Model thực thi phần logic lấy từ một cơ sở dữ liệu nào đó và gửi trả lại phản hồi theo hướng dẫn từ Controller
– Controller truyền dữ liệu này ra phần view và cập nhật lại giao diện cho người dùng.
– Mọi yêu cầu đều phải đi qua Controller trước khi chuyển hóa thành lệnh thực thi cho View hay Model.
5. Tổng kết
Bất cứ khi nào bạn học một framework lập trình web mới, bạn sẽ gặp mô hình MVC. Nói cách khác, một khi bạn đã lập trình dựa trên MVC thì không cần phải ngán bất cứ framework mới nào cả
Một trong những cách đơn giản nhất để tạo masonry layout là dùng flexbox, tất cả những gì cần làm là set flex-flow: column wrap và height: giá-trị-độ-cao-nào-đó, là bạn có kiểu layout nổi tiếng của pinterest.
/* hiển thị theo dạng column, rớt dòng khi cần thiết */.container{display: flex;flex-flow: column wrap;align-content: space-between;/* fixed height, cao hơn độ cao của item cao nhất */height:960px;}
Cách này bị một vấn đề, thứ tự các item chúng ta sẽ là như thế này
Đây không phải là kết quả chúng ta mong muốn, nó phải xếp các item từ trái qua phải mới hợp gu
Nếu chuyển giá trị flex-direction: row, thứ tự sẽ đúng như mong muốn, tuy nhiên nó lại bị khoảng trống khi các item có độ cao không đồng nhất, như thế này
Sử dụng kết hợp với 2 thuộc tính :nth-child() và order để giải quyết vấn đề này
Column 1
Column 2
Column 3
Row 1
1
2
3
Row 2
4
5
6
Row 3
7
8
9
Row 4
10
11
12
Chúng ta có 3 cột, chúng ta sẽ xếp các item theo từng cột, nhưng order nó theo hàng
/* sắp xếp lại theo từng dòng */.item:nth-child(3n+1){order:1;}// set order = 1 cho các item 1, 4, 7, 10,...
.item:nth-child(3n+2){order:2;}// set order = 1 cho các item 2, 5, 8, 11,...
.item:nth-child(3n){order:3;}
// set order = 1 cho các item 3,6,9,12,...
Với các item có cùng giá trị order như 1, 4, 7, 10 trình duyệt sẽ render theo thứ tự xuất hiện của html, một cách ngắn gọn với đoạn css trên chúng ta đã xếp các item lại theo thứ tự là 1,4,7,10,2,5,8,11,3,6,9,12
Còn một trường hợp có thể xảy ra là item có độ cao ko fill hết chỗ trống trong cột, khi ấy nó sẽ dồn item đó về cột phía trước
Để xử trí vụ này, đây là một cái trick khá vi diệu, chúng ta sẽ chèn 2 element before và after có giá trị order: 2 để các item sẽ theo thứ tự 1, 4, 7, 10, <break>, 2, 5, 8, 11, <break>, 3, 6, 9, 12
/* bắt buộc chèn vào cột mới */.container::before,.container::after{content: “”;flex-basis:100%;width:0;order:2;}
/* hiển thị theo dạng column, rớt dòng khi cần thiết */.container{display: flex;flex-flow: column wrap;align-content: space-between;/* fixed height, cao hơn độ cao của item cao nhất */height:600px;}.item{width:32%;margin-bottom:2%;}/* sắp xếp lại theo từng dòng */.item:nth-child(3n+1){order:1;}// set order = 1 cho các item 1, 4, 7, 10,...
.item:nth-child(3n+2){order:2;}// set order = 1 cho các item 2, 5, 8, 11,...
.item:nth-child(3n){order:3;}
// set order = 1 cho các item 3,6,9,12,...
/* bắt buộc chèn vào cột mới */.container::before,.container::after{content:"";flex-basis:100%;width:0;order:2;}
Bitbucket là gì? – Bitbucket và GitHub đang là 2 code repository phổ biến nhất trong giới lập trình viên hiện nay. Tại sao lại cần code repository? Nói tóm tắt là quản lý source code. Nếu như bạn đang update code base hoặc đang làm việc với người khác, thì bạn sẽ cần review những thay đổi về code và cấp access cho đồng nghiệp hay đối tác. GitHub thì phổ biến hơn một chút với hơn 100 triệu code repositories.
Giải thích một số thuật ngữ thường dùng
Repo: viết tắt của repository – kho chứa code
Origin: repository gốc, nếu có clone code thì là clone từ origin.
Pull: kéo code mới từ origin về máy.
Commit: cập nhật những sửa đổi của code vào repo trong máy của bạn
Push: đẩy những sửa đổi mà bạn đã commit lên origin.
Bitbucket là gì?
Được đặt lên bàn cân với GitHub, Bitbucket cũng là một loại hệ thống để quản lý các phiên bản code, dịch vụ cung cấp kho lưu trữ source code cho các dự án. Bitbucket hỗ trợ cả Git và Mercurial VCS, được viết bởi ngôn ngữ lập trình Python và sử dụng web framework là Django, có thể dùng trên Mac, Windows và Android qua các app.
Bitbucket trình làng vào năm 2008 tại Úc, lúc này chỉ mới là một startup chỉ cung cấp hosting cho các dự án Mercurial. Sau đó vào năm 2010, Atlassian – một công ty của Úc đã mua lại và update thêm tính năng hỗ trợ Git repository khoảng 1 năm sau đó.
Nhiều user đã chuyển từ GitHub qua Bitbucket do lo ngại về mặt private của các source code khi Microsoft mua lại GitHub với 7,5 tỷ USD.
Bitbucket có thể tích hợp rất tốt với Jira (Jira cũng là sản phẩm của Atlassian), lúc đầu được dùng với chức năng bug tracker – tìm bug, sau đó mới tới các chức năng khác như: track bug, track issue, service desk và quản lý dự án.
Những tính năng quan trọng nhất của Bitbucket là:
Pull Request và review code
So sánh branch và commit history
Số lượng private repo miễn phí không giới hạn (lên đến 5 user)
Mac và Windows client dùng SourceTree, đối với app Android thì có thể dùng BitBeaker
Bitbucket dành cho doanh nghiệp có thể dùng Stash
Tích hợp sâu với Trello (qua Bitbucket Cloud có thể tích hợp liền mạch các branch, commit và pull request lên Trello board).
Cấp quyền cho branch. Thay vì cấp quyền cho mọi branch trong repo, Bitbucket cấp quyền hạn chế vào từng branch, ngăn các tình huống vô tình push master, cũng là điểm khác biệt của Bitbucket.
Bitbucket Snipperts cho phép tạo và quản lý mọi loại snippets multi-file (đa tệp).
Bitbucket hỗ trợ Git Large File Storage (LFS) đồng nghĩa với clone nhanh hơn và dành thời gian cho các file nặng.
Ưu điểm của Bitbucket so với GitHub là gì?
Trước khi đi vào chi tiết thì bạn có thể tham khảo bảng so sánh tóm tắt sau:
Bitbucket linh hoạt hơn GitHub
Trong khi GitHub có khá nhiều tính năng và cho phép bạn tự tạo workflow của riêng mình, Bitbucket có tính năng built-in linh hoạt hơn.
Ví dụ, Bitbucket có nhiều option về hệ thống kiểm soát phiên bản (kết hợp Mercurial cũng như Git). Điều này có nghĩa là bạn có thể làm đúng theo những gì bạn muốn mà không phải cố nhét mình vào chốt hình vuông hay tròn. Bitbucket có thể import từ GIt, CodePlex, Google Code, HG, SourceForge và SVN, còn Git chỉ giới hạn ở Git, SVN, HG và TFS.
Bitbucket cho bạn số lượng private repo vô hạn
Việc quản lý sẽ trở nên đơn giản hơn rất nhiều nếu chỉ có một account trên một nền tảng duy nhất. Về mặt này thì bitbucket cho phép bạn số lượng private repo theo ý muốn và có thể share với 5 người khác. Ngoài ra thì bạn cũng có thể phân chia giữa project cá nhân và project cho công việc, hay phân chia công việc cho các khách hàng khác nhau mà không phải suy nghĩ về vấn đề quản lý.
Ưu điểm về giá
Ừ thì GitHub cũng free nhưng với điều kiện là bạn phải làm ở chế độ public. Còn nếu muốn set private các repo của mình trên GitHub thì cần một khoản chi phí.
Ngược lại, Bitbucket thì hoàn toàn miễn phí với 5 user, bao gồm vô số private repo được nhắc đến bên trên. Điều đáng ngạc nhiên là có vô số project open-source trên nền tảng này.
Ngay từ đầu, source code của bạn đã được gắn với CI/CD trong Bitbucket, đồng nghĩa với việc là không cần bận tâm đến chuyện thiết lập và quản lý đối với người dùng, repositories và máy chủ.
Còn với GitHub thì mọi thứ phải được thiết lập theo từng trường hợp cụ thể và thông tin cuối cùng sẽ được lưu ở những tool khác nhau.
Thuật ngữ tìm kiếm thông minh hơn
Đây là tính năng tuy nhỏ nhưng rất khác biệt, khi Bitbucket sẽ thu thập cú pháp (syntax) để tìm các định nghĩa phù hợp với query, hơn là chỉ dừng ở tên biến.
Bitbucket tích hợp Jira mạnh mẽ hơn
Forbes từng đánh giá như sau “Tầm ảnh hưởng của Atlassian tới phần mềm chẳng khác gì tầm ảnh hưởng của Apple tới thiết kế”
Kể từ khi trình làng năm 2017 với giá trị thị trường lên đến 10 tỷ USD, tốc độ tăng trưởng của Atlassian dường như không hề chững lại, và sản phẩm chính của họ chính là Jira. Lúc đầu Jira chỉ dùng để track bug nhưng sau này linh hoạt hơn với các tính năng: Quản lý dự án, kiểm soát và theo dõi lỗi, kiểm soát và theo dõi vấn đề phát sinh trong một tổ chức.
Nếu dùng Jira và Bitbucket cùng lúc thì bạn có thể set code tự động update các lỗi Jira. Và bạn có thể tạo nhánh thẳng từ Jira để workflow nhanh và linh hoạt hơn. Đây cũng là ưu điểm khi tích hợp Bitbucket x Jira – liên kết toàn bộ quá trình develop với một bộ tools được tích hợp và đồng bộ hóa.
Bitbucket tích hợp Trello mạnh mẽ hơn
Trello là một công cụ quản lý công việc hiệu quả khi làm việc theo nhóm, nói một cách dễ hiểu Trello là công cụ quản lý công việc cần làm của một team do ai đảm nhiệm, hoàn thành hay chưa và deadline khi nào, trong mỗi task thì chia nhỏ các to do checklist.
Khuyết điểm của Bitbucket
Đặt lên bàn cân thì Bitbucket vẫn còn kém hơn GitHub ở hai điểm:
Cộng đồng
Không thể phủ nhận GitHub vẫn đang phổ biến hơn Bitbucket, đồng nghĩa với việc cộng đồng lập trình viên rộng lớn hơn, từ đó có việc recommend và tìm tips và chia sẻ code cũng nhanh chóng và dễ dàng hơn.
Plugins
GitHub đang vượt xa Bitbucket về số lượng native plugins để mở rộng platform. Tuy nhiên Bitbucket cũng có vài plugin khá ổn, ví dụ như Bitbucket Connect (đơn giản hóa các tích hợp sâu – deep integration), SourceTree (trực quan hóa giao diện cho project), app Slack (cho phép pull info và comment, merge và prompt review code trong cùng channel), và các sản phẩm khác từ Atlassian.
Lựa chọn khác ngoài Bitbucket và GitHub là gì?
Là hai nền tảng hosting Git phổ biến nhất nhưng không có nghĩa đây là 2 platform duy nhất. Có thể kể đến các low-key player khác như:
Gitlab
Trình làng năm 2011 và là đối thủ nặng ký đối với cả GitHub và Bitbucket, GitLab đã nâng cấp từ nền tảng cung cấp dịch vụ quản lý source code lên full DevOps Lifecycle – từ project planning đến CI/CD và giám sát, là platform DevOps hoàn chỉnh.
LaunchPad là platform quản lý software collaboration được Canonical, nhà sản xuất của Ubuntu Linux và các software liên quan sử dụng. Canonical là tên tuổi lớn trong phong trào open-source, nên nếu bạn đang làm việc với open-source thì LaunchPad khá thích hợp hỗ trợ cả Git và Bazaar.
SourceForge
Cũng là cái tên nổi bật trong giới open-source, SourceForge cho phép developer host code và distribute software của họ thông qua nền tảng này. Ngoài ra SourceForge còn có tools để import GitHub repo cùng các data liên quan như wiki.
Kết luận
Khác biệt cơ bản nhất giữa Bitbucket và GitHub có thể được tóm tắt như thế này: GitHub thì tập trung xung quanh public code còn Bitbucket thì về private code. GitHub có cộng đồng open-source khổng lồ còn Bitbucket thì phần lớn là người dùng doanh nghiệp.
Tài khoản GitHub nhiều khi là tấm danh thiếp của developer. Nếu có viết blog thì dev có xu hướng sẽ chia sẻ ví dụ code trên GitHub, góp phần xây dựng cộng đồng GitHub lớn mạnh. Tuy nhiên điều đó cũng đồng nghĩa là các doanh nghiệp phải “chăm” kỹ hơn để quản lý user và cài đặt access control, đảm bảo không ảnh hưởng đến an ninh mạng – cyber resilience.
Bitbucket và Github khá tương tương đồng về mặt tính năng và cả hai đều là dịch vụ host code repo. Cho nên tùy vào lựa chọn và nhu cầu mà bạn có thể chọn lựa phù hợp hơn: nếu VCS bạn là Mercurial hay tích hợp với Jira thì nên dùng Bitbucket, còn với những project về web-hosting nhỏ nhỏ thì có thể dùng GitHub.
Với các thông tin trên thì chắc hẳn bạn đã biết Bitbucket là gì? và mối quan hệ với Github. Hy vọng bạn đọc đã những kiến thức hữu ích cho mình nhé!
Trong thập kỷ qua, SharePoint đã phát triển thành một nguồn lực vô cùng hùng hậu —hơn 250,000 organizations và gần 85% các công ty trong danh sách Forbes Fortune 500 đều đang sử dụng nó. Sự phát triển hùng hậu và ứng dụng của SharePoint trên toàn thế giới hiện đã xuất hiện nhiều hơn tại thị trường Việt Nam. Nhiều công ty và lập trình viên không khỏi tìm hiểu SharePoint là gì và tìm hiểu sâu hơn về lợi ích và cách học cho người mới bắt đầu SharePoint.
SharePoint là gì?
SharePoint là một nền tảng cộng tác làm việc trên web (web-based) tích hợp đồng bộ với Microsoft Office. Ra mắt vào năm 2001, SharePoint chủ yếu được ra mắt dưới dạng hệ thống quản lý và lưu trữ tài liệu, tuy nhiên sản phẩm cũng có cấu hình cao và việc sử dụng có thể khác nhau đáng kể tuỳ vào mô hình tổ chức.
SharePoint là một nền tảng quản lý và phối hợp nội dung dựa trên Cloud có khả năng tùy chỉnh cao, giúp đội ngũ làm việc từ xa, làm việc cùng nhau và thông minh hơn. SharePoint hiện đang được áp dụng tại hơn 250.000 công ty trên toàn cầu với hơn 190 triệu user, là một nền tảng quản lý nội dung khuyến khích teamwork và làm việc nhóm bất kể các thành viên ở đâu trên thế giới.
Nói một cách dễ hiểu, SharePoint là một hệ thống website phối hợp nội dung và công việc trên trang web sử dụng các workflow application, danh sách cơ sở dữ liệu và các thành phần website và tính năng bảo mật khác để trao quyền cho các team làm việc cùng nhau. SharePoint cũng cung cấp cho doanh nghiệp một nền tảng để kiểm soát quyền truy cập vào thông tin và tự động hóa quy trình làm việc giữa các đơn vị kinh doanh.
Những sản phẩm và công nghệ SharePoint phổ biến nhất hiện nay
SharePoint trong Microsoft 365
Một dịch vụ nền điện toán đám mây, được lưu trữ bởi Microsoft, dành cho các doanh nghiệp thuộc mọi quy mô. Thay vì cài đặt và triển khai SharePoint Server tại chỗ, bất kỳ doanh nghiệp nào có thể đăng ký vào một gói Microsoft 365 hoặc đối với dịch vụ SharePoint Online độc lập. Nhân viên của bạn có thể tạo các website để chia sẻ tài liệu và thông tin với các đồng nghiệp, đối tác cùng khách hàng. Để bắt đầu lưu trữ các tệp của bạn trên site nhóm của bạn, hãy xem thiết lập lưu trữ và chia sẻ tệp của Microsoft 365. Cung cấp cho Microsoft 365 một thử.
SharePoint Server
Các tổ chức có thể triển khai và quản lý SharePoint Server tại chỗ hoặc với đăng ký Office 365 Enterprise để tận dụng các tính năng mới nhất. Và nó cung cấp các tính năng và chức năng bổ sung, chẳng hạn như các trang site hiện đại, phần web hiện đại và tác giả, danh sách và thư viện hiện đại, tìm kiếm hiện đại, tích hợp với PowerApps, Power BI và MS, và trang chủ SharePoint. Tải xuống SharePoint Server 2019.
SharePoint Designer 2013
Một chương trình miễn phí được phát hành gần nhất vào năm 2013. Được dùng để xây dựng các giải pháp hỗ trợ dòng công việc hiệu quả. Đồng thời, được dùng để chỉnh sửa các loại nội dung ngoài cho giải pháp dữ liệu bên ngoài dựa trên Business Connectivity Services. Hãy tải xuống SharePoint Designer 2013.
Đồng bộ OneDrive
Một chương trình trên máy tính mà bạn có thể dùng để đồng bộ các tài liệu từ một site nhóm hoặc OneDrive cho cơ quan hoặc trường học vào máy tính của bạn để sử dụng ngoại tuyến. Tìm hiểu thêm về OneDrive.
Xem thêm Các công cụ giúp tăng tốc Workflow cho developer tại đây
Tại sao nên dùng SharePoint?
Tại thời điểm hiện tại, đội ngũ của bạn sẽ cần phải giải quyết các vấn đề như sau:
Công ty bạn có làm việc từ xa không?
Team bạn có cần truy cập vào nhiều thiết bị để làm việc không?
Hiện tại team bạn đang sử dụng thiết bị như thế nào? Có dễ dàng không?
Bạn có thường nhận các yêu cầu cần sự phối hợp của khách hàng, ví dụ một nơi chia sẻ thông tin, catalogue online, form thông tin để request online để khách hàng có thể nhập vào?
Bạn có hay share tài liệu với Khách hàng không?
Nhân viên của bạn có bao giờ phàn nàn / mong muốn có cách truy cập tài tư liệu và công việc dễ dàng hơn không?
Tin vui cho bạn đó là, SharePoint hoàn toàn có thể thực hiện các thao tác và đáp ứng được những yêu cầu trên, và đó cũng sẽ là những lợi ích của SharePoint mà TopDev sẽ phân tích chi tiết hơn bên dưới.
SharePoint có nhiều tính năng lớn bao gồm khả năng co-authoring (đồng chỉnh sửa và quản lý) thời gian thực hiện, các tính năng gắn thẻ và đánh tag nâng cao giúp team dễ dàng tìm kiếm tài liệu, quyền truy cập bất cứ lúc nào – cho bất cứ thiết bị nào bạn sử dụng, và tích hợp hoàn toàn với bộ Office 365, giúp bạn làm việc hiệu quả hơn mỗi ngày.
Ứng dụng của SharePoint
Quản lý tài nguyên và tài liệu Doanh nghiệp
SharePoint cho phép lưu trữ, truy xuất, tìm kiếm, lưu trữ, theo dõi, quản lý và báo cáo về các loại tài liệu và record số. SharePoint còn cung cấp chức năng tìm kiếm và tính năng ‘đồ thị hoá’. Sự tích hợp SharePoint với Microsoft Windows và Microsoft Office cho phép chỉnh sửa thời gian thực cùng lúc và đồng bộ hóa quyền được mã hóa /thông tin.
Mạng nội bộ và social
Mạng nội bộ SharePoint hoặc cổng mạng nội bộ là một cách để tập trung quyền truy cập thông tin và ứng dụng của doanh nghiệp. Nó là một công cụ giúp một tổ chức quản lý thông tin liên lạc nội bộ, ứng dụng và thông tin của mình dễ dàng hơn.
Như một phần mềm Collaborative
SharePoint gồm các chức năng phần mềm cộng tác nhóm (team collaboration), bao gồm: lên lịch dự án (tích hợp với Microsoft Outlook), share hộp thư và lưu trữ và cộng tác tài liệu liên quan đến dự án.
Tuỳ chỉnh web app
Khả năng developer tùy chỉnh của SharePoint cung cấp thêm một lớp tính năng dịch vụ cho phép các developer sử dụng khả năng quản lý thông tin và bảo mật của SharePoint được trên nhiều nền tảng và kịch bản phát triển khác nhau. SharePoint cũng có sẵn một “app store” nhiều ứng dụng ngoài được quản lý để truy cập vào các tài nguyên khác như dữ liệu người dùng của công ty và dữ liệu tài liệu.
Lợi ích SharePoint so với các collaboration software khác
1. SharePoint bảo mật RẤT CAO
Microsoft rất nghiêm túc coi trọng vấn đề bảo mật. Các hoạt động điện toán đám mây của họ phát hiện gần 1,5 triệu lần attempt mỗi ngàyđể đột nhập vào hệ thống của họ, vì vậy họ đã đầu tư ngân sách 1 tỷ USD hàng năm chỉ dành cho việc bảo mật.
SharePoint là một trong số rất nhiều thành phần của Microsoft, nó đi kèm với một số tính năng bảo mật tích hợp, như tính năng giới hạn người ngoài tổ chức không thể xem nội dung của bạn, đặt quyền đối với những người trong tổ chức của bạn có quyền truy cập vào một số nội dung nhất định, tự tạo cơ chế cho phép hoặc chặn hành vi người dùng nhất định & cho phép hoặc chặn quyền truy nhập vào nội dung dựa trên vị trí nhất định.
2. SharePoint giúp doanh nghiệp phối hợp nghiệp vụ hiệu quả hơn
SharePoint đã được thiết kế để nâng cao trải nghiệm làm việc cộng tác, đặc biệt là khi nó kết hợp với các ứng dụng và dịch vụ khác của Office 365. Khi được triển khai như một phần của Office 365, SharePoint tạo nên không gian làm việc ảo cho phép các nhóm gặp gỡ, hoàn thành nhiệm vụ và cộng tác với nhau.
Cụ thể dưới đây là một số cách mà SharePoint có thể giúp các tổ chức cộng tác nhiều hơn:
Bằng SharePoint, tài liệu của bạn nằm ở một nơi share chung để có thể truy cập được từ bất kỳ thiết bị nào, bất kỳ lúc nào (tất cả những gì bạn cần là kết nối Internet).
Tính năng co-authoring (đồng thao tác) theo thời gian thực, nghĩa là nhiều người có thể làm việc và chỉnh sửa trên cùng một document một lúc.
SharePoint sẽ luôn hiển thị phiên bản mới nhất của document, với option revert về phiên bản cũ nếu cần.
Các thành viên trong team và leaders có thể thiết lập task theo cá nhân hoặc theo nhóm, giao nhiệm vụ cho các thành viên khác trong nhóm và theo dõi nhiệm vụ nào đã được hoàn thành.
Bạn có quyền truy cập vào lịch dùng chung, các note và comment được chia sẻ (thông qua OneNote), conversation được chia sẻ (thông qua Yammer) và các công cụ cộng tác khác.
SharePoint đóng vai trò như một “co-working space ảo” vì bạn không cần phải setup hoặc có team Tech để xây nên một nền tảng làm việc nhóm chung – tất cả chỉ cần được phân chia và assign từ team leader.
3. SharePoint hỗ trợ tự động hoá các công việc “tay chân”
SharePoint giúp tiết kiệm cho bạn nhiều thời gian và nỗ lực, đồng thời cũng mang lại sự đồng nhất và hiệu quả cho các công việc bạn đang thực hiện hàng ngày. Các công việc / task cấp thấp như thu thập các chữ ký hay xác nhận, theo dõi trạng thái của các tài liệu, thông báo cho bạn khi có gì thay đổi nội dung,… để bạn tập trung vào các tác vụ cao và phức tạp hơn.
Ai nên sử dụng SharePoint?
Với quy mô và những lợi ích quản lý đa năng hiện tại, SharePoint đang dần được hầu hết các công ty công nghệ ứng dụng về cho đội ngũ.
Với Cấp Tech leads/ IT Managers/ Lập trình viên: Nhóm team công nghệ sẽ sử dụng SharePoint phiên bản có phần được nâng cao hơn so với các bản thông thường. Phục vụ trực tiếp cho các sản phẩm và project công nghệ của công ty nên sẽ được cấp Lead phân chia lại rồi phân chia assign cho đồng đội.
Với lập trình viên thì họ thường sử dụng các tính năng đã có nhưng có phần mở rộng, phát triển dựa trên các tính năng mới của nền tảng SharePoint.
User thông thường: Đa phần đối tượng này sử dụng với những tính năng cơ bản, có sẵn khá là dễ sử dụng và tiện lợi mà SharePoint đã cung cấp đến. Có thể kể đến một số tính năng đáp ứng được nhu cầu thông thường: Lập kế hoạch, tìm kiếm thông tin, bảng biểu…
Tham khảo 10 công cụ Go-To mà Developer phải có năm 2020tại đây
Biết sử dụng SharePoint để làm gì?
Là mùa tuyển dụng của năm 2020, hệ thống TopDev đã ghi nhận không ít các vị trí tuyển dụng ưu tiên nhiều cho các bạn biết và hiểu về SharePoint, là cơ hội để các bạn tìm được vị trí việc làm IT tốt hơn và cơ hội “trả giá” vị trí lương cao hơn so với các bạn khác. Vì thể quan trọng nhất vẫn là cơ hội nghề nghiệp tốt hơn cho bất kì developer nào hoặc IT-er nào.
Chưa kể đến rằng cả các công ty công nghệ trong nước, trong khu vực như công ty IT Hàn tuyển dụng, hay quốc tế như Mỹ và châu Âu đều ứng dụng và ưu tiên tuyển dụng người có kinh nghiệm sử dụng SharePoint. Đây là điểm cộng rất lớn cho các bạn đang tìm kiếm cơ hội mới, một điểm “Nice to have” nhưng cũng đang dần trở thành điểm “Must have” tại một số doanh nghiệp công nghệ mới.
Ngoài ra, biết sử dụng SharePoint sẽ giúp lập trình viên nhanh chóng tiếp cận các xu hướng công nghệ mới mới thông qua các nhu cầu và sản phẩm của doanh nghiệp. Đây cũng là cơ hội để bạn nâng cao kỹ năng mềm và kiến thức công nghệ liên tục cập nhật trên thị trường – là cơ hội phát triển sự nghiệp IT mà bạn cần nắm bắt.
Bắt đầu học SharePoint như thế nào?
Không thiếu tài liệu ngon để khởi động đâu, tuy nhiên bước đầu tiên bạn phải làm đó là trực tiếp làm thử trên SharePoint. Sau khi chọn được source tài nguyên phù hợp, hãy thử cài đặt và sử dụng SharePoint luôn để hiểu hơn cấu trúc, cơ chế hoạt động và phối hợp trên platform.
Nếu cần thêm tutorial hoặc giải đáp trực tiếp về platform bạn có thể tìm đến các nguồn tham khảo sau:
Các cộng đồng Sharepoint
Tại Việt Nam: Vietnam SharePoint User Group, Vietnam SharePoint Developer Group, SharePoint Saturday Vietnam
Bài viết được sự cho phép của tác giả Trần Hữu Cương
YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java)
Cũng giống như KISS, YAGNI và DRY là 2 nguyên tắc quan trọng để lập trình.
1. DRY
DRY: “Don’t Repeat Yourself” – Đừng bao giờ lặp lại code.
Bạn cũng có thể đã nghe về sự so sánh: DRY cod vs WET code (Don’t Repeat Yourself and Write Everything Twice)
Bạn đã bao giờ viết các đoạn code giống nhau nằm ở các phần, module khác nhau của project? bạn đã bao giờ có 2 màn hình giống nhau nhưng lại dùng tới 2 đoạn code để hiển thị 2 màn hình đó?
OK, Nguyên tắc DRY chính là đang nói về vấn đề này.
Đừng lặp lại code ở đây là không lặp lại các đoạn code giống nhau, các method thực hiện chức năng như nhau, cố gắng gom chúng lại 1 cách gọn gàng và có thể dùng lại khi cần.
2 method trên thực hiện 2 chức năng khác nhau nhưng có rất nhiều code bị lặp lại, đây là case bị lặp code cơ bản ít người mắc phải. Ta có thể tránh lặp code trường hợp này bằng cách tách phần in thông tin user ra thành 1 method và gọi tới nó:
publicvoidshowUser(User user){System.out.println("first name: "+user.getFirstName());System.out.println("last name: "+user.getLastName());System.out.println("age: "+user.getAge());System.out.println("email: "+user.getEmail());System.out.println("address: "+user.getAddress());System.out.println("gender: "+user.getGender());System.out.println("exprience: "+user.getExperience());}publicvoidprint(User user){showUser(user); // do something: print user info}publicvoidpreview(User user){showUser(user); // do something: review user}
Sau khi tách ra method showUser thì ta có thể dùng lại nó hoặc nếu cần chỉnh sửa, lỗi trong việc in ra thông tin user thì ta chỉ cần sửa method showUser là được.
Ví dụ 2
Dưới đây là 1 đoạn code thực hiện tìm kiếm đối tượng User theo name, email, theo cả name và email
public List<User> findByName(String name){if(name == null){return null;}String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% "; // do something}public List<User> findByEmail(String email){if(email == null){return null;}String sql = "SELECT u FROM User u WHERE u.email like %"+email+"% "; // do something}public List<User> findByNameAndEmail(String name, String email){if(name == null || email == null){return null;}String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% AND u.email like %"+email+"%"; // do something}
Cái gì thế này? có vẻ như cả 3 method này đều thực hiện một việc khá giống nhau.
Sao không chuyển thành hàm dưới đây:
public List<User> find(String name, String email){if(name == null && email == null){return null;}String sql = "SELECT u FROM User u WHERE u.name like %"+name+"% AND u.email like %"+email+"%";if(name != null && email == null){ sql = "SELECT u FROM User u WHERE u.name like %"+name+"% ";}if(name == null && email != null){ sql = "SELECT u FROM User u WHERE u.email like %"+email+"% ";} // do something}
Ngắn gọn hơn đúng không, lại vừa có thể search theo name, theo email và theo cả 2.
Vậy là việc suy tính trước method của mình sẽ làm gì sẽ giúp bạn trành việc lặp code, phải viết thêm method mới.
(Chú ý, giả sử bạn có method findByName, bây giờ cần thêm method search theo email thì phải giữ nguyên method findByName và viết mới method find chứ không được xóa method cũ đi nếu không nó sẽ vi phạm nguyên tắc “open for extension but closed for modification” tức là ưu tiên thêm mới và hạn chế sửa đổi).
YAGNI: “You Aren’t Gonna Need It”: Bạn không cần nó.
Đôi khi bạn nghĩ rằng cần phải thêm 1 số chức năng mới, bạn nghĩ nó cần thiết, có thể sẽ dùng trong tương lai và bạn làm nó. Stop, hãy dừng lại, như thế là bạn đang phạm phải sai lầm.
Bạn không nên lãng phí thời gian vì hành động đó, cái chức năng mà bạn thêm mới đó có thể không làm ưng ý khách hàng hoặc cấp trên, thậm chí không bao giờ được dùng tới. Hãy confirm nó trước khi làm, và tập trung vào các task hiện tại thay vì đi làm 1 cái mới mà chưa chắc đã dùng tới rồi lại phải mất thêm công test nó.
YAGNI, DRY là gì? (Nguyên tắc YAGNI, DRY trong Java) stackjava.com
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Gần đây lướt Facebook thấy nhiều bạn hỏi về vấn đề làm sao tạo được giao diện Dark Mode cho website, để khi người ta vào website thì có thể tuỳ chỉnh nền tối hay là sáng. Nên hôm nay tranh thủ viết một bài về cách làm giao diện Dark mode cho website từ a-z cho các bạn luôn.
Ta sẽ có giao diện lúc này như sau. Các bạn để ý nút Toggle nhé để sau này chúng ta dùng Javascript để viết sự kiện khi nhấn vào thay đổi màu sắc cho website đó. Còn các mũi tên xanh dương mình chỉ là để chúng ta CSS cho chúng bằng cách dùng biến trong CSS dưới đây.
Mấu chốt để làm được giao diện đổi màu đó chính là sử dụng biến trong CSS, mình có viết về nó rồi. Các bạn có thể xem lại tại đây nha. Khi sử dụng biến chúng ta sẽ tạo ra 2 lựa chọn về màu sắc, mặc định là các mã màu ban đầu từ thằng :root và thứ 2 là từ thằng [data-theme="dark"] mà chúng ta sẽ chuyển qua. Cũng là các biến từ :root thôi tuy nhiên ở Dark Theme các bạn sẽ đổi các biến đó thành các mã màu khác mà các bạn thích, ở đây mình đổi trắng thành đen và đen thành trắng.
Sau đó ta áp dụng chúng vào các class mà chúng ta đã khai báo ban đầu như thế này
.wrapper {...background-color:var(--white);}.content {...background-color:var(--gray);}.title {color:var(--black);...}.title + p {color:var(--black);...}
Việc tiếp theo cần làm đó là viết một đoạn Javascript để bắt sự kiện khi nhấn vào nút Toggle để nó chuyển các mã màu sang màu tối ở [data-theme="dark"] mà chúng ta đã tạo ở trên. Mình có Javascript như sau
Mình sẽ giải thích Javascript một chút cho các bạn hiểu nhé. Đầu tiên mình khai báo 1 biến là toggleSwitch truy xuất tới DOM là Toggle, và một biến là currentTheme để truy xuất tới một localStorage có tên là theme.
Sau đó mình kiểm tra xem có localStorage nào tên là theme không, nếu có thì mình thiết lập cho thẻ html (root) có thuộc tính data-theme là currentTheme, đồng thời mình kiểm tra xem theme hiện tại có phải là dark không, nếu phải thì mình sẽ thiết lập cho Toggle đó checked là true, tức là đã nhấn vào.
Tiếp theo mình viết một hàm có tên là switchTheme để khi nhấn vào Toggle thì sẽ gọi hàm này. Hàm này kiểm tra 2 điều kiện, nếu Toggle được nhấn vào thì sẽ thiết lập theme là dark đồng thời tạo localStorage theme là dark luôn, ngược lại thì thiết lập theme là light.
Và cuối cùng là sự kiện change của Toggle, nghĩa là khi các bạn nhấn vào nó sẽ gọi hàm switchTheme viết ở trên để xử lý. Lúc này chúng ta sẽ có kết quả như mong đợi
Chúc các bạn một ngày tốt lành, và đừng quên tham khảo Codepen dưới đây nhé
Đọc bài viết dưới đây của TopDev từ kinh nghiệm của anh Calvin Cảnh Trần –Senior Data Engineer tại Grab, để hiểu rõ hơn về Quy trình và kinh nghiệm phỏng vấn Data Engineer cập nhật mới nhất trong năm 2020.
Data Engineer (Kỹ sư dữ liệu) hiện đang là ngành phát triển và nhận được sự quan tâm lớn. Nhiều cơ hội bắt đầu mở ra cho các ứng viên theo đuổi ngành nghề này. Và để có sự chuẩn bị tốt nhất, bạn cần nắm bắt rõ quy trình tuyển dụng của vị trí này.
Cùng TopDev khám phá ngày những điều thú vị xoay quanh cuộc tuyển chọn cho vị trí Data Engineer nhé!
Những hiểu biết cơ bản về Data Engineer
Kỹ sư dữ liệu (Data Engineer) là người phát triển, xây dựng, kiểm tra và duy trì kiến trúc. Đồng thời, họ cũng là người đề xuất và đôi khi đảm nhậm việc cải thiện chất lượng dữ liệu. Để hoàn thiện và phát triển nguồn dữ liệu, nhóm những Data Engineer cần cải biến các quy trình thiết lập dữ liệu để mô hình hóa, khai thác và sản xuất dữ liệu.
Nhóm các công cụ mà một Kỹ sư dữ liệu cộng tác bao gồm: SAP, Oracle, Cassandra, MySQL, Redis, Riak, PostgreSQL,…
Xét về tiềm năng phát triển, ngành Kỹ sư dữ liệu dường như phát triển mạnh mẽ hơn tại thị trường quốc tế. Tại Việt Nam, nguồn lực tuyển dụng của ngành này chưa nhiều. Mức lương trung bình dành cho vị trí này cũng lên đến $124.000/năm. Song, với những đặc thù công việc, tính khoa học thực tiễn, ngành Kỹ sư dữ liệu hứa hẹn là một ngành rất có triển vọng trong tương lai.
Bài viết là những trải nghiệm thực tế của quy trính tuyển dụng vị trí Data Engineer tại thị trường quốc tế. Tại Việt Nam, việc tuyển vị trí này vẫn chưa trở thành xu hướng. Tuy nhiên, mô hình tuyển dụng vẫn đảm bảo những vòng thi cơ bản. Vì thế, bài viết này sẽ khá hữu ích cho bạn dù bạn apply vị trí tại Việt Nam hay thị trường nước ngoài.
Vòng 01 – Thách thức HackerRank
HackerRank là một trong những trang web thực hành – đánh giá coding hàng đầu hiện nay.
Bài test HackerRank sẽ được diễn ra trong vòng 90 phút, gồm 3 câu hỏi giải thuật và 1 câu SQL. Đặc biệt, chỉ các ứng viên hoàn thành trên 80% tổng số bài thi mới được nhận cơ hội tham gia vòng tiếp theo.
Các bài tập này là những thách thức được xây dựng trên nền tảng lập trình tích hợp. Thách thức được đặt ra chủ yếu tập trung vào thuật toán và cấu trúc dữ liệu đơn giản, không quá phức tạp. Các lời giải cho thách thức gửi đi sẽ được chấm tự động và kết quả được gửi về nhà tuyển dụng nhân sự IT xem xét, đánh giá.
Vòng 02 – Giải toán lập trình trên bảng trắng (Whiteboard Coding)
Khi vượt qua vòng đầu tiên, bạn sẽ tiếp tục phỏng vấn vòng 2. Ở vòng này, ứng viên sẽ được gặp trực tiếp một Engineer nào đó của công. Đồng thời, thực hiện thử thách qua 2 phần nhỏ như sau:
Phần 1: Câu hỏi về phân tích chuyên môn
Với phần này, nhà tuyển dụng muốn đánh giá sự am hiểu của bạn về mức độ phức tạp của thuật toán; cách bạn lựa chọn, xử lý giải thuật ra sao.
Các bạn sẽ phải giải toán lập trình trên bảng trắng thông qua mã giả. Các giàm khảo – nhà tuyển dụng sẽ yêu cầu ứng viên tối ưu hóa câu trả lời của mình.
Ví dụ:
Mức độ phức tạp (Compacity) thay vì O(n)^2, nhà tuyển dụng phỏng vấn sẽ yêu cầu ứng viên tối ưu hóa thành O(nlogn) hoặc O(n).
Phần 2: Câu hỏi về thiết kế hệ thống (System Design)
Một điểm lưu ý: Phần phỏng vấn có thể thay đổi tùy vào mục đích của nhà tuyển dụng. Thông thường, 70 – 90% các thách thức sẽ rơi vào các dạng câu hỏi về kỹ thuật(Technical Questions). Cụ thể bao gồm: Câu hỏi về thuật toán (Algorithms); câu hỏi về cấu trúc dữ liệu (Data Structure);Câu hỏi về khả năng thiết kế hệ thống (System Design)
Trong phần này, giám khảo sẽ đưa ra một số bài toán kinh điển dành cho bạn như: thiết kế thang máy, thiết kế máy bán hàng tự động, tthiế kế ứng dụng uber,… Và tổng thời lượng dành cho bài test này sẽ vào khoảng 2 tiếng.
Đây đều là 2 vòng khá cơ bản mà các bạn cần phải lưu tâm. Vì hầu như nó được áp dụng cho hầu hết các vị trí: Backend, Frondend, Software Engineer,…
Vòng 03 – Phỏng vấn với Data Engineer
Sau khi vượt qua vỏng 2, ứng viên sẽ được phỏng vấn trực tiếp với Data Engineer.
Hỏi về những trải nghiệm thực tế
Mục đích của vòng 3 chính là thảo luận để tăng sự tương tác. Đồng thời, làm rõ hơn về những mong muốn từ phía nhà tuyển dụng lẫn ứng viên.
Người phỏng vấn sẽ xem xét liệu ứng viên có thật sự phù hợp với vị trí này hay không. Trong khi đó, ứng viên cũng cân nhắc về tính việc những công việc ở công ty có đúng với những yêu cầu mà bản thân mong muốn trải nghiệm.
Người phỏng vấn sẽ hỏi ứng viên về những dự án đã từng tham gia hoặc các công việc nào mà họ tâm đắc nhất. Đây là cách khai thác các kỹ năng chuyên môn thông qua việc kích thích sự gợi nhớ đối với ứng viên.
Càng về sau, các câu hỏi ngày càng cụ thể hơn. Khả năng vận hành, tổ chức, xử lý các dự án, công việc đó ra? Hỏi càng xoáy, ứng viên càng có nhiều “đất” để thể hiện bản lĩnh của mình. Điều này cũng đồng nghĩa, nhiều ứng viên “chém gió” suốt cuộc hội thoại sẽ nhanh chóng bị loại bỏ.
Xem thêm: Kinh nghiệm Phỏng vấn Data Engineer của anh Calvin Cảnh Trần
Thách thức về lĩnh vực chuyên môn
Dường như ít nhà tuyển dụng sẽ hỏi về tool. Điều họ đặc biệt quan tâm hơn là về MapReduce. Mục đích của nhà tuyển dụng là tìm hiểu mức độ chuyên môn và cách ứng viên giải quyết một vấn đề thực tế.
Các thách thức có thể được đặt ra xoay quanh các vấn đề như sau:
1. MapReduce: Ứng viên sẽ thực hiện yêu cầu code một đoạn nhỏ trên giấy, trên máy tính hoặc thậm chí bảng trắng về MapReduce. Thách thức đặt ra: Đọc số lượng chữ xuất hiện trong một câu?
2.Tối ưu hóa Spark Job: 1 Spark Job với 1 column với format tương đương là year/month/day. Thách thức đặt ra: Hãy chuyển sang 3 column khác nhau ngày/tháng/năm. Điều kiện đi kèm: Spark Job được xử lý trên một nguồn dữ liệu nặng 50 TB. Đồng thời, ứng viên cần đảm bảo Spark Job được chạy với thời gian ít nhất.
3. Schema: Ứng viên được cung cấp 1 schema. Và toàn bộ thông tin của schema đó. Thách thức đặt ra: Thiết kế một Data Mark hoặc Data Warehouse với các yêu cầu tương ứng a,b,c,…
Nếu vượt qua vòng 3, các ứng viên sẽ được gặp Hiring Manager. Ứng viên sẽ được đánh giá về tính cách, khả năng đồng hành và phát triển với team. Sau cùng, nhân sự liên lạc chính thức với ứng viên để thương lương về lương và kế hoạch làm việc chi tiết.
Lời kết
Quy trình phỏng vấn tuyển dụng Data Engineer có thể thay đổi tùy vào các vị trí tuyển dụng. Nếu vị trí là fresher, kiến thức nền tảng và khả năng học hỏi sẽ được chú trọng nhiều hơn. Nếu vị trí cần tuyển là junior hoặc mid-level, tính trải nghiệm thực tế lại là yếu tố được nhà tuyển dụng ưu tiên khai thác. Do vậy, yêu cầu tuyển dụng sẽ khắc khe hơn.
TopDev hi vọng với những chia sẻ từ bài viết, các ứng viên sẽ có những hình dung cơ bản về quy trình tuyển dụng. Từ đó, các bạn sẽ có sự chuẩn bị kỹ lưỡng nhất cho cuộc phỏng vấn của mình.
Tuyển Dụng Nhân Tài IT Cùng TopDev Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products
Công nghệ Cloud tuy chỉ mới phổ biến ở Việt Nam những năm gần đây, tuy nhiên tại Singapore, cloud đã được triển khai rộng rãi. Hãy cùng tìm hiểu về bối cảnh, kinh nghiệm và lợi ích mà cloud, infrastructure as code mang lại qua buổi trò chuyện cùng anh Tuấn Lê – Cloud SA @Orient Software.
Về khách mời
Anh Tuấn Lê, hiện là Cloud Solution Architect của Orient Software – một công ty chuyên về Software Development.
Công việc Cloud SA của anh hiểu cơ bản là Solution Architect trên cloud, những thứ mà anh thiết kế hoàn toàn xoay quanh cloud.
Anh Tuấn có hơn năm kinh nghiệm 10 năm làm về Solution Consultant và hiện tại vừa chuyển qua in-house ở Orient Software được 1 năm..
Cung & Cầu trong mảng Cloud Consulting Việt Nam ra sao?
Hiện tại, những công ty đang sử dụng cloud ngày càng xuất hiện nhiều, đặc biệt là ở những startup. Còn những công ty chuyên làm về Cloud Consulting thì cũng đã có những cái tên, chẳng hạn như FSoft, tuy nhiên họ làm ở thị trường Nhật là chủ yếu.
Trong quá trình làm Solution Consultant tại Việt Nam và cả ở Singapore, có một điều mình nhận ra khi làm consulting đó là mình không thực sự hiểu về chuyên môn của khách hàng, không hiểu về Software Development Knowledge của khách hàng. Vì vậy khi tư vấn, mình không thực sự sâu sát với những thứ đang diễn ra với khách hàng, cả khách hàng Việt lẫn Sing.
Theo anh, khi xây dựng hệ thống Cloud sẽ có những thách thức nào?
Đầu tiên, Cloud khác hẳn so với on-premise ở chỗ tất cả những dịch vụ sử dụng (theo các best practices) đều đã có sẵn. Tuy nhiên, thách thức lớn nhất là làm sao để biết tất cả những dịch vụ ấy, mỗi cái dùng để làm gì. Riêng như AWS khoảng 200 services và features sử dụng là khoảng 7000 cái. Bạn buộc phải biết tất cả những thứ đó để làm gì, mức độ làm như thế nào, có thể thay thế bằng alternative solutions (giải pháp thay thế) nào khác hay không hay là bản thân nó dùng đủ tốt rồi.
Trong nhiều trường hợp, bạn buộc phải tuân theo best practices để research và test xem hiện tại nó đã adapt theo nhu cầu của mình ra làm sao. Nghĩa là nhu cầu của bạn phải có trước và bạn phải tự định nghĩa nhu cầu ấy thật chi tiết về mặt kỹ thuật. Tóm lại là bạn sẽ không phải tự hỏi là mình đang cần cụ thể một giải pháp gì, mà câu hỏi sẽ là setup như vậy để làm việc gì.
Còn để làm được việc đó trên Cloud sẽ có nhiều phương án:
Hoặc là phương án server-based
Hoặc là cái phương án trên một service có sẵn
Hoặc là một phương án third-party nào đó
Mình sẽ chọn những phương án này sau. Vấn đề trước mắt là làm sao để biết được cái nào đang có sẵn để lựa chọn. Bởi vì một trong những ưu điểm của Cloud là khả năng tích hợp và đưa bất kỳ phương án nào rất là nhanh, và gọn, và biết nó tồn tại để bạn có thể sử dụng.
Ví dụ như với một số dịch vụ về AI/Maching Learning, như Speech to Text chẳng hạn. Thì trong phần lớn trường hợp là bạn sẽ phải tự build platform bằng một số workload bên dưới để training trước, tìm nguồn để mà train và rồi sau đó là chạy. Còn khi đã đưa lên cloud rồi thì top 3 Cloud như AWS, Google Cloud Platform và Azure luôn có sẵn rất nhiều dịch vụ. Bạn chỉ cần đẩy dữ liệu qua API xuống, họ đã train sẵn, mình chỉ việc dùng thôi.
Nói một cách đơn giản, mình chỉ việc đẩy API xuống vào file audio đó và mình sẽ có file text ra. Vấn đề ở chỗ là dùng service đó nó có chất lượng đủ tốt với mình hay chưa, và một số cái liên quan, chẳng hạn như chi phí đã phù hợp với dự án của mình hay chưa.
Vậy nếu mình muốn extract audio tiếng Việt hoặc ngôn ngữ khác ít resource thì mình làm như thế nào ạ?
Thực ra, đây là một vấn đề liên quan đến PM (Project Management) nhiều hơn là liên quan đến cloud.
Khi mình đã có những dịch vụ có sẵn và biết được mỗi dịch vụ đó nó đáp ứng như thế nào. Ví dụ Transcribe của AWS đang có sẵn tiếng Anh rồi. Trong trường hợp đó thực sự là công việc của PM; có nghĩa là mình phải test xem phương án nào đáp ứng được đúng nhu cầu của mình hơn là cố pushing là một cái cloud nào đang phù hợp với khách hàng, đó không phải là vấn đề.
Anh có thể chia sẻ một vài service của AWS mà anh hay sử dụng được không ạ?
Trước đây, khi làm cho những công ty Cloud Consultant bên Singapore thì gần như khách hàng dùng cái nào, mình sẽ research trước để tư vấn (như về server-based, serverless, Transcribe,…), và mình phải làm rất nhiều về network và security bởi vì hầu như tất cả các doanh nghiệp ở đây họ đều quan tâm đến network và security. Như về việc nó sẽ chuyển đổi kết nối giữa hệ thống mạng của công ty và cloud như thế nào; Còn security thì nó liên quan đến tiền bạc và một số quy tắc phải tuân thủ rồi.
Hiện tại, khi đã chuyển qua công ty software thì mọi thứ lại đi sâu hơn rất nhiều vào các service hỗ trợ dev.
Ví dụ như:
Về S3 cách sử dụng, resign URL trên đó, làm sao để lấy file và upload một cách bảo mật, hệ thống CDN CloudFront
Một số service thuần riêng của dev thì có một số service về message là SQS, rồi một số service gửi email, notification và có cả Elasticsearch… rất nhiều.
Hầu như đều xoay quanh các service của dev sẽ chạy như thế nào, trên cloud có sẵn sẽ làm những thứ đó.
Những trải nghiệm “nhớ đời” cùng các Service của Cloud?
Trước đây, phần lớn khách hàng có xu hướng sử dụng server-based. Họ xem EC2 instance như là một cloud server bình thường. Họ tự cài đặt trên đó và họ tận dụng cái phần của cloud (môi trường) vì đơn giản nó liên quan và có sẵn để chạy.
Về kinh nghiệm sử dụng, khi anh làm in-house tại Orient Software thì mọi thứ đang dần chuyển dịch rất nhiều từ phía cloud server sẽ bắt đầu chuyển sang container, Docker như thế nào… nên bắt buộc phải sử dụng những dịch vụ Container as Service như là EKS, ECS trên AWS. Hiện nay, với định hướng mà container đang theo là serverless, mọi thứ đều chạy trên service hết. Không có quản lý trên server nào cả. Thế thì, một cái kinh nghiệm là gần như bạn phải có một cái nhìn tổng thể rằng là những thứ mình đang làm, khi chuyển đổi sang serverless thì nó sẽ như thế nào. Có một số thứ sẽ cần lưu ý, ví dụ như không bị attached quá nhiều vô một phiên bản software nhất định nào đó chẳng hạn. Ví dụ cố gắng là dùng những standard protocol hoặc standard configuration thì việc chuyển đổi sẽ tốt hơn rất nhiều.
Cái thứ 2 là phải luôn đảm bảo một số tiêu chuẩn, chẳng hạn như hệ thống của bạn phải sẵn sàng có thể được clone, được scale bằng cách nào đấy. Thì những thứ liên quan đến log hay một số thông tin, một số loại storage khác là bắt buộc bạn phải tách riêng độc lập ra để có thể sẵn sàng cho việc sử dụng những dịch vụ ngoài chứ không chỉ dồn hết vào một node. Một số kinh nghiệm cơ bản mình chia sẻ là như thế.
Có một “bài học” mà anh muốn chia sẻ với mọi người khi làm việc với AWS không?
Khi còn làm bên Singapore, lúc ấy là làm dịch vụ billing – nghĩa là bên công ty anh sẽ trả tiền cho AWS và sẽ charge bill khách hàng như kiểu hóa đơn đỏ. Lúc ấy là anh làm cho một khách hàng thôi, là một MNC ở Singapore, Ấn Độ và Hàn Quốc.
Câu chuyện là vào thời điểm ấy, khi bên mình chưa kịp làm dịch vụ security và optimization hay bất kỳ thứ gì cho họ thì đã xuất hiện một sự cố. Đó là một user của họ để upload lên S3, nhưng trong cấu hình, user này là để full quyền admin. Thông tin đăng nhập của user đó (access key & secret key) bị lộ và đột nhiên cuối tháng cái bill bình thường của họ bị tăng thêm $10.000 và họ không biết làm sao cả.
Thì lúc này, client họ phải request partner gần nhất thôi là công ty billing – công ty anh. Sau khi research một vòng, coi cái log audit lại thì phát hiện ra họ bị lộ vấn đề như vậy. Lúc này có 2 vấn đề cần xử lý, một là phải khắc phục sự cố ngay. Người mà đã lấy access key & secret key đó, họ cũng hiểu về AWS và họ làm một việc là đến cái region ở châu u và tạo một đống EC2 để mining Bitcoin. Họ làm như vậy gần như là một động tác rửa tiền một cách hoàn hảo, bởi vì không thể nào truy vết được ai làm gì, như thế nào, ở đâu hết. Nó sẽ chuyển thẳng vô phần chi phí của phía khách hàng bị hack account và bill thì vẫn do công ty bên này chịu.
Bởi vì cách thiết kế của AWS là khi mình view một cái region này thì không thấy thông tin của region khác cho nên khi khách hàng chỉ coi 3 cái region ở châu Á thôi là sẽ không biết bất kỳ việc gì xảy ra ở region ở châu Âu cả.
Sau đó việc cuối cùng cần làm là xử lý lại, gọi là “xây chuồng lại sau khi đã mất bò”, thì nó đơn giản. Đó là bắt đầu apply một số security alert về tiền bạc, đảm bảo giới hạn quyền thấp nhất cho tất cả các function, các user, đặt cảnh báo về chuyện tiền bạc rồi có mở thêm cái audit log của tất cả các nơi. Nhưng đây vẫn là chuyện đơn giản. Việc phức tạp hơn rất nhiều đó là phải giải trình với AWS là tôi đã bị hack và để AWS trả lại số tiền đó. Nghĩa là mình vẫn phải trả số tiền đó trước và sau khi đã giải trình xong, AWS sẽ claim lại bởi việc này là vẫn có thể đáp ứng được. Nhưng có nhiều trường hợp nó phức tạp ở chỗ là bạn phải giải trình toàn bộ sự việc bằng văn bản kỹ thuật.
Vậy cuối cùng nó có thành công không ạ?
Và cuối cùng, case này đã thành công. Bởi vì AWS, anh đã từng làm việc nhiều với họ, họ không làm việc quá máy móc nguyên tắc mà chỉ đơn giản dựa trên kết quả cuối cùng. Nếu thật sự bạn thể hiện được case đó là khách hàng bị hack và partner hỗ trợ khách hàng show tất cả mọi thứ bằng evidence (chứng cứ) đầy đủ là được. Nó chỉ khó ở chỗ là làm đúng thủ tục và chứng minh qua những chứng cứ đó.
Có những công nghệ thú vị nào mà anh muốn chia sẻ cùng mọi người không?
Đó là Infrastructure as Code & Terraform.
Có một điều thú vị anh nhận thấy khi mới qua Singapore làm việc, đó là ngoại trừ các công ty MNC – họ đem toàn bộ adaptation có sẵn từ phía headquarter về Singapore làm, thì những người bên đó đã biết quá rành về Cloud và mọi thứ bên đó diễn ra như thế nào rồi. Còn đối với những công ty ở Singapore mà họ chỉ mới bắt đầu muốn sử dụng Cloud, thì mức độ adaptation ở những công ty này tại Singapore không hơn Việt Nam là mấy, nếu có hơn thì cũng chỉ hơn về số lượng, như các dự án làm rất nhiều thôi, còn về mức độ hiểu và sẵn sàng adapt Cloud thì giống hệt với VN thôi.
Câu chuyện là như lúc trước, sau khi làm optimization và propose, là một số activity mà công ty có thể làm cho khách hàng như: Professional Service thì sẽ charge thêm manday qua đó trên cái web console click kéo thả, cấu hình gì đấy để tương ứng, và sau đó screenshot lại các bước lại gửi cho khách hàng; Việc này cũng có thể tạm gọi là nhanh hơn so với cách cũ trên on-premise: phải cài đặt server, đưa server đến. Tuy nhiên, từ khi anh sử dụng Infrastructure as Code (IaC) thì các dự án thường từ mất vài ngày để thực hiện, nay nó chỉ mất vài tiếng để code Infrastructure, vài phút để plan và chạy.
IaC đem lại sự hiệu quả khủng khiếp, ít nhất là đối với Cloud Consulting. Ngoài ra còn rất nhiều lợi ích khác như nó sẽ không bị phụ thuộc vào 1 người. Ví dụ: anh có 2 người, làm 2 dự án cùng lúc. Nhưng khi chạy được code như vậy, 10 dự án hay 100 dự án nó vẫn chạy được.
Thứ hai nữa là về thời gian, nó sẽ nhanh hơn, một số ví dụ như về version, versioning như có làm sai thì việc rollback lại là việc cực kỳ dễ dàng.
Tiếp đến là về Document.
Document cũng đơn giản vì không cần screenshot các thao tác. Bởi thực ra, việc screenshot thao tác chỉ là để chứng minh tôi đã thực hiện đầy đủ dự án, chỉ vậy thôi. Còn việc document hóa toàn bộ những cái phần code và giải trình lại nó dễ hơn rất nhiều.
Sau đó khi làm việc tiếp một dự án của chính phủ Singapore, một điều thú vị là do đặc trưng địa lý của Singapore, toàn bộ cloud đã có ở Singapore, chính phủ Singapore khuyến khích sử dụng cloud rất mạnh. Toàn bộ các dự án, ít nhất là từ năm đó đều phải sử dụng cloud hết, không một dự án nào được triển khai ở các center. Vào thời điểm đó, có một điều khá buồn cười là trước những năm khoảng 2010s muốn sử dụng workload trên cloud phải giải trình bằng văn bản, nhưng hiện tại thì ngược lại, nếu còn triển khai trên data center là phải phải trình ngược lại.
Để hỗ trợ cho toàn bộ mọi thứ diễn ra suôn sẻ, Singapore đã hình thành một công ty GovTech. Họ hỗ trợ và audit các dự án để đưa lên cloud. Lúc ấy, Singapore đưa ra 1 framework là Government Commercial Cloud Infrastructure (GCCI), nghĩa toàn bộ tất cả các dự án chính phủ phải tuân theo framework đó. Nó bao gồm 1 bộ tiêu chuẩn gồm: các cách thiết kế bắt buộc phải có, các cách làm việc quy chuẩn phải có, đảm bảo traffic không bị lộ, dữ liệu không bị thất thoát, toàn bộ traffic phải được kiểm soát….
Lúc này, Singapore bắt buộc áp dụng một quy trình làm việc cực kỳ mới đó là toàn bộ các dự án triển khai phải bằng Infrastructure as Code. Tức là việc triển khai (cài đặt, cắm, gõ…) sẽ không còn do con người can thiệp nữa mà gần như là đưa vào khoảng code => bên phía GovTech review => nếu được thì mới triển khai. Nhờ vậy, mọi thứ trở nên nhanh chóng nhờ Infrastructure as Code. Bởi gần như, có những thứ chỉ IaC mới có thể làm được như vậy.
Còn nếu làm theo cách bình thường, tức là thuê một team vào làm, rồi phải cử một người review, xem ai đang làm gì thì nó sẽ tốn thời gian rất nhiều và khó rollback được khi có sự cố xảy ra.
Trước khi làm cùng Cloud cần biết những gì?
Mới đây, anh có phỏng vấn một số bạn cho vị trí DevOps thì thấy có những suy nghĩ của nhiều bạn chưa hợp lí lắm khi sử dụng dịch vụ Cloud là như thế này: Các bạn vẫn còn tìm cách manual quá nhiều.
Đối với cloud thì gần như mọi thứ, nó đã có API sẵn và có thể programming được, thì điều này đồng nghĩa việc chúng ta có thể automation được mọi thứ. Đặc biệt, điều cơ bản nhất là bạn phải biết cách để cài đặt package cho phía server chạy được.
Bạn sẽ phải viết mọi thứ thành bash script, đẩy vào user data của EC2 để sau đó tự cài đặt mọi thứ đó lên và chỉ việc review xem nó chạy có đúng hay không. Điều này sẽ hạn chế tối đa việc phải remote SSH vô từng server để cài đặt. Tất nhiên có những cái tool đã làm điều đó rất tốt rồi, giống như Ansible. Nhưng với cái cách thiết kế của cloud, bạn sẽ không cần phải làm những cái manual đó nữa. Cho dù manual đó đã tự động hóa bằng một configuration management rồi nhưng điều đó cũng không cần thiết.
Tiếp theo cần hiểu một xu hướng compute nó thay đổi và nâng dần. Trong cách thiết kế ngay từ đầu, cần phải gỡ từng workload ra. Ví dụ như storage, service này là phải tách riêng ra như thế nào. Điều này cũng giống như triết lý của monolithic chuyển sang microservice nhưng mà nó ở cơ chế rộng hơn, mở rộng hơn cho toàn bộ system. Ví dụ như là log có thể ghi được rất nhiều và cũng có thể ghi thêm một hệ thống khác, như cloud chẳng hạn.
Bên cạnh đó, có một điều bạn cần biết thêm nữa, đó là security và monitor trên cloud rất là rẻ. Nó rẻ bởi vì với một quy mô nhất định, nếu triển khai on-premise cho performance chừng đó về monitor và lâu chừng đó thì phải đâu đó $x00,000 cho một cái dự án như vậy, cho vài năm. Trong khi ở trên cloud chỉ tốn nhiều nhất vài chục đô đến vài trăm đô/tháng cho toàn bộ với quy mô chừng đó. Thì đó cực kỳ hiệu quả và nên tận dụng càng sớm càng tốt, càng nhiều càng tốt. Bởi vì nó available nhưng không có nghĩa nó turn on by default. Mình phải biết và phải turn on nó trước, để khi mà có sự cố, mình có thể coi lại log, coi lại bất cứ thứ gì để kiểm tra được ngay.
Về công ty Orient Software Development
Công ty Orient Software Development đã thành lập được 15 năm và hoạt động chuyên về Software Development trên web và mobile.
Thành công nhất là về các mảng AI, Machine Learning, IoT cho khách hàng, đặc biệt ở Châu Âu và Mỹ. Hiện tại anh Tuấn cùng công ty đang thực hiện một dự án cùng chính phủ Singapore.
Orient Software đang mở rộng mảng Cloud Consultant tại Việt Nam, cụ thể là AWS. Chuyên hỗ trợ khách hàng về Cloud Transformation Journey: từ hệ thống On-premise đang sử dụng như thế nào, lên cloud sẽ chuyển đổi ra làm sao, tối ưu trên cloud, quan trọng nhất là về Cost Optimization và Cloud Security.
Cảm ơn anh vì những chia sẻ với khán giả của TopDev TV!
Retrofit trong Android – Luôn là một chủ đề mà các Android Developer luôn thắc mắc. Vậy Retrofit là gì? Ngắn gọn, Retrofit là một công nghệ được phát triển bởi Square, nó được xây dựng dựa trên rất nhiều công nghệ mạnh mẽ cho phép giải quyết tốt các yêu cầu từ phía client và server một cách nhanh và hiệu quả nhất. Tóm lại, Retrofit là một REST Client dành Android và cả Java. Retrofit được phát triển giúp cho quá trình kết nối client – server trở nên dễ dàng, nhanh chóng. Đối với Retrofit bạn có thể GET, POST, PUT, DELETE …
Ngoài ra Retrofit ngày càng được phổ biến hơn với nhiều ưu điểm mà nó đem lại, ví dụ như là hiệu năng, thời gian hoàn thành task nhanh hơn các thư viện phổ biến khác như AsyncTask và Volley.
So sánh Retrofit với các thư viện khác
1. Retrofit là gì?
Nói một cách dễ hiểu hơn, Retrofit chính là một type-safe HTTP Client cho Java và Android. Nó làm cho việc truy xuất và tải lên JSON (hoặc dữ liệu có cấu trúc khác) tương đối dễ dàng thông qua một dịch vụ web dựa trên REST. Trong Retrofit, bạn định cấu hình bộ chuyển đổi nào được sử dụng để tuần tự hóa dữ liệu. Thông thường, đối với JSON, bạn sử dụng GSon, nhưng bạn có thể thêm bộ chuyển đổi tùy chỉnh để xử lý XML hoặc các giao thức khác. Retrofit sử dụng thư viện OkHttp cho các yêu cầu HTTP.
Ngoài ra những tiện lợi nêu trên, Retrofit còn hỗ trợ bạn phân tích chuỗi JSON bằng các thư viện chuyển đổi như thế này. Ở phần 4 bên dưới mình sẽ nói rõ hơn về các converter này.
-Moshi: com.squareup.retrofit:converter-moshi
-Jackson: com.squareup.retrofit:converter-jackson
-Gson: com.squareup.retrofit:converter-gson
Trên thế giới hiện nay, Retrofit rất phổ biến với ưu điểm của nó chính là hiệu năng, thời gian thực thi task nhanh hơn AsyncTask hay Volley. Một ví dụ về Retrofit.
// Retrofit turns your HTTP API into a Java interfacepublicinterfaceGitHubService{@GET("users/{user}/repos")Call>listRepos(@Path("user")Stringuser);}// the Retrofit class generates an implementation of the above interfaceRetrofit retrofit=newRetrofit.Builder().baseUrl("https://api.github.com/").build();GitHubService service=retrofit.create(GitHubService.class);// each Call from the created GitHubService can make a synchronous or// asynchronous HTTP request to the remote webserverCall>repos=service.listRepos("octocat");// let's use the Call asynchronouslycall.enqueue(newCallback>(){@Override voidonResponse(Response>contributors){// ...}
});
Một lưu ý nhỏ là Retrofit không hỗ trợ tải hình ảnh, đa phần các lập trình viên sẽ sử dụng các giải pháp khác như dùng thư viện Glide hoặc Picasso để làm những tác vụ đấy.
Sử dụng Retrofit
Để làm việc với Retrofit về cơ bản, bạn cần ba lớp sau:
Lớp mô hình được sử dụng làm mô hình JSON
Các giao diện xác định các hoạt động HTTP có thể có
Lớp Retrofit.Builder – Phiên bản sử dụng giao diện và API Builder để cho phép xác định điểm cuối URL cho các hoạt động HTTP
Mỗi phương thức của một giao diện đại diện cho một lệnh gọi API khả thi. Nó phải có chú thích HTTP (GET, POST, v.v) để chỉ định loại yêu cầu và URL tương đối. Giá trị trả về bao bọc phản hồi trong một Call object với loại kết quả mong đợi.
@GET("users")
Call<List<User>> getUsers();
Bạn có thể sử dụng các khối thay thế và tham số truy vấn để điều chỉnh URL. Một khối thay thế được thêm vào URL tương đối với {}. Với sự giúp đỡ của @Path chú thích trên tham số phương thức, giá trị của tham số đó được liên kết với khối thay thế cụ thể.
@Body chú thích trên một tham số phương thức yêu cầu Retrofit sử dụng đối tượng làm nội dung yêu cầu cho lệnh gọi.
@POST("users")Call<User>postUser(@BodyUseruser)
2. Điều kiện tiên quyết
Các ví dụ sau đang sử dụng Eclipse IDE cùng với hệ thống xây dựng Gradle. Bài tập này giả định rằng bạn đã quen thuộc với Gradle và Using Gradle với Eclipse.
Trong bài tập này, bạn sẽ tạo một ứng dụng khách REST độc lập. Các phản hồi được tạo bởi một mock server (server giả lập).
3.1. Tạo và thiết lập Project
Tạo Gradle project mới gọi com.huongdancode.retrofitgerrit. Thêm một package mới vào src/main/java với tên là com.huongdancode.retrofitgerrit.
Thêm các phần dependency sau vào file build.gradle.
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
// Junit
testImplementation("org.junit.jupiter:junit-jupiter-api:5.0.0")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0")
// to run JUnit 3/4 tests:
testImplementation("junit:junit:4.12")
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0")
3.2. Xác định API và Retrofit adapter
Trong cái JSON trả về từ Gerrit, chúng tôi chỉ quan tâm đến subject của những thay đổi. Do đó, hãy tạo lớp data trong default package đã thêm trước đó.
Retrofit có thể được cấu hình để sử dụng một converter cụ thể. Converter này xử lý data (de)serialization. Một số converter đã có sẵn cho các định dạng serialization khác nhau.
Với việc áp dụng adapter này, các giao diện Retrofit có thể trả về các RxJava 2.x, như: Observable, Flowable hoặc Single, v.v.
@GET("users")Observable<List<User>>getUsers();
5. Xác thực Retrofit
Retrofit hỗ trợ các lệnh gọi API cần xác thực. Việc xác thực có thể được thực hiện bằng cách sử dụng tên người dùng và mật khẩu (xác thực HTTP Basic) hoặc API token.
Có hai cách, cách bạn có thể xử lý xác thực. Cách một là xác thực có thể dụng username và password (HTTP Basic authentication) hoặc sử dụng Token. Một khả năng khác sẽ là sử dụng OkHttp interceptor cho việc đó.
5.1. Xác thực bằng annotation
Giả sử rằng bạn muốn yêu cầu thông tin chi tiết người dùng của mình, yêu cầu bạn xác thực. Bạn có thể làm điều này bằng cách thêm một tham số mới vào định nghĩa API của mình, như sau:
Với sự giúp đỡ của @Header("Authorization") annotation mà bạn yêu cầu Retrofit thêm vào mảng Authorization request header với giá trị bạn cung cấp cho credentials.
Để tạo thông tin xác thực cơ bản, bạn có thể sử dụng class Credentials với method basic(String, String). Method này lấy tên người dùng và mật khẩu và trả về thông tin xác thực cho basic.
Credentials.basic("ausername","apassword");
Nếu bạn muốn sử dụng API token và không có Basic authentication, chỉ cần gọi phương thức getUserDetails(String) với token của bạn.
5.2. OkHttp interceptor
Phương pháp trên chỉ thêm thông tin đăng nhập, nếu bạn yêu cầu chi tiết người dùng của mình. Nếu bạn có nhiều cuộc gọi yêu cầu bạn xác thực, bạn có thể sử dụng interceptor cho việc này. Một interceptor được sử dụng để sửa đổi từng request trước khi nó được thực hiện và thay đổi request header. Ưu điểm là bạn không phải thêm @Header("Authorization") cho mỗi API.
Khi phát triển ứng dụng trên nền tảng Android có những việc ta sẽ thấy khá nhàm chán như kiểm soát kích thước file download và thời gian download file đó, bắt lỗi và exception, xử lý kết nối mạng, ..v.v. Tuy nhiên có thứ giúp ta giải quyết những vấn đề đó một cách nhanh chóng, đó là OkHttp.
Để thêm một interceptor, bạn sẽ sử dụng method okhttp3.OkHttpClient.Builder.addInterceptor(Interceptor) trên OkHttp Builder.
Bạn có thể nhận thấy việc sử dụng lớp Credentials cho Basic authentication. Một lần nữa, nếu bạn muốn sử dụng API token, chỉ cần sử dụng token thay thế.
6. Bài tập: Sử dụng Retrofit để truy vấn Gerrit trong Java
Phần sau đây mô tả cách tạo một ứng dụng Java tối thiểu sử dụng Retrofit để truy vấn các đối tượng từ API Gerrit. Kết quả được in trên console.
Tạo một dự án Gradle mới với tên com.huongdancode.java.retrofitgerrit. Thêm một package mới vào src/main/java với tên com.huongdancode.java.retrofitgerrit.
Thêm dependency vào file build.gradle
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
// Junit
testImplementation("org.junit.jupiter:junit-jupiter-api:5.0.0")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0")
// to run JUnit 3/4 tests:
testImplementation("junit:junit:4.12")
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0")
6.2. Xác định API và Retrofit adapter
Trong cái JSON trả về từ Gerrit, chúng tôi chỉ quan tâm đến subject của những thay đổi. Do đó, hãy tạo lớp data trong default package đã thêm trước đó. (Xem để hiểu rõ hơn JSON là gì?)
<?xml version="1.0" encoding="UTF-8"?><rssversion="2.0"><channel><title>Eclipse and Android Information</title><link>https://www.huongdancode.com</link><description>Eclipse and Android Information</description><language>en</language><copyright>Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany (CC BY-NC-SA 3.0)</copyright><pubDate>Tue, 03 May 2016 11:46:11 +0200</pubDate><item><title>Android user interface testing with Espresso - Tutorial</title><description> This tutorial describes how to test Android applications with the Android Espresso testing framework.</description><link>https://www.huongdancode.com/tutorials/AndroidTestingEspresso/article.html</link><author>minhvu@huongdancode.com (minh vu)</author><guid>https://www.huongdancode.com/tutorials/AndroidTestingEspresso/article.html</guid></item><item><title>Using the Gradle build system in the Eclipse IDE - Tutorial</title><description>This article describes how to use the Gradle tooling in Eclipse</description><link>https://www.huongdancode.com/tutorials/EclipseGradle/article.html</link><author>minhvu@huongdancode.com (minh vu)</author><guid>https://www.huongdancode.com/tutorials/EclipseGradle/article.html</guid></item><item><title>Unit tests with Mockito - Tutorial</title><description>This tutorial explains testing with the Mockito framework for writting software tests.</description><link>https://huongdancode.com/tutorials/Mockito/article.html</link><author>minhvu@huongdancode.com (minh vu)</author><guid>https://www.huongdancode.com/tutorials/Mockito/article.html</guid></item></channel></rss>
Bên cạnh XML header, file này còn chứa các phần tử XML khác nhau. rss-element không chỉ chứa channel-element mà còn chứa các phần tử khác (như title, description, pubDate) và một số item-element.
Lớp Article đại diện cho một bài báo duy nhất và chỉ lưu trữ tiêu đề và liên kết đến nó. Đây là mảng duy nhất chúng tôi quan tâm.
Với annotation @Root class được đánh dấu là (de)serialized. Tùy theo lựa chọn, bạn có thể cung cấp tên trong annotation @Root đại diện cho tên của XML element.
Khi strict được set là false, strict parsing sẽ bị tắt. Điều này báo cho trình phân tích cú pháp không bị lỗi và đưa ra một ngoại lệ, nếu element hoặc attribute XML được tìm thấy mà không có ánh xạ nào được cung cấp.
Trên đây là bài giới thiệu sơ lược qua việc ứng dụng Retrofit trong lập trình Android, cảm ơn các bạn đã đọc tới đây. Nếu các bạn có góp ý gì cho bài viết này, hãy comment ở bên dưới nhé!
Bài viết được sự cho phép của tác giả Võ Xuân Phong
ReactJS là gì, có ăn được không?
ReactJs là một thư viện được tạo ra bởi Jordan Walke, một kỹ sư làm việc tại Facebook. Ông thần này đã cho ra mắt phiên bản mẫu đầu tiên của React được gọi với cái tên mỹ miều là FaxJS, nghe lạ quá nhỉ.
React đã được áp dụng trên New Feed của Facebook vào năm 2011 và không lâu sau đó là trên Instagram vào năm 2012.
ReactJS là một thư viện hỗ trợ xây dựng các thành phần của giao diện người dùng (UI library).
Quay lại ngày trước thời chúng ta mới mày mò học làm web, phía front end (giao diện người dùng – UI – User Interface) chúng ta đã học HTML, CSS, Javascript và Jquery. Để tạo ra một giao diện đẹp như tầm hot girl trở lên thì phải viết code quá trời là viết, mà việc tái sử dụng lại cũng như việc tìm code để bảo trì những hậu quả đó cũng lòi con mắt và rất chi là khó khăn.
Để có trải nghiệm người dùng tốt hơn (UX – User Experience) chúng ta thường hay sử dụng AJAX của thư viện Jquery để tạo ra các hiệu ứng cũng như thay đổi dữ liệu hiển thị mà không phải load lại toàn bộ trang web, điều đó thật tuyệt vời phải không. Nó giống như chức năng giỏ hàng của các trang thương mại điện tử khi chúng ta ấn thêm vào giỏ hàng thì giỏ hàng được cập nhật ngay trước mắt mà không phải load lại toàn bộ trang web hoặc thấy rõ hơn là New Feed của Facebook khi chúng ta lướt Facebook thì các tin của những người bạn được hiển thị lên một cách mượt mà mà không có dấu hiệu load lại trang như chúng ta nhấn phím F5.
Ok, vậy việc sử dụng Jquery để làm những điều đó vẫn được mà phải không? Đúng là vẫn được nhưng đó là một cách tự sát vì càng sinh ra nhiều chức năng thì số lượng code rối rắm tăng và khả năng bảo trì và phát triển về sau sẽ giảm. Và mình cũng xin nói thêm là Jquery là một thư viện hỗ trợ giao diện người dùng tốt nhưng để tạo được sự rõ ràng rành mạch trong việc code một dự án lớn thì Jquery phải nhường bước cho các thư viện và framework hiện đại như Angular, VueJS, ReactJS. mình sẽ tập trung vào chủ đề chính là ReactJS nha, ở bài viết này mình sẽ chưa so sánh giữa Angular, VueJS và ReactJS.
Các thư viện và framework hiện đại này đem lại trải nghiệm người dùng (UX) tốt cũng như code sẽ rõ ràng và dễ bảo trì hơn là code với Jquery.
Tại sao code ReactJS lại đem lại trải nghiệm người dùng (UX) tốt? Bởi vì nó được sinh ra để hướng đến một khái niệm gọi là Single Page Application tức có nghĩa là việc thao tác của người dùng sẽ ở trên cùng một trang và các thao tác này thay đổi dữ liệu hiển thị nhưng không bị load lại toàn bộ trang việc này ReactJS cung cấp giải pháp khá tốt đó là quản lý việc hiển thị bằng cây DOM ảo (Virtual DOM), những thành phần giao diện sẽ được quản lý bởi cây DOM ảo này và nó sẽ thay đổi dựa vào các state (trạng thái). Khi các state (trạng thái) của các thành phần giao diện (components) thay đổi thì các thành phần giao diện trong cây DOM ảo này cũng thay đổi theo.
Tại sao code ReactJS lại dễ dàng bảo trì và mở rộng hơn? Bởi vì ReactJS chia một giao diện lớn thành nhiều thành phần giao diện (components) riêng biệt, và giữa các thành phần giao diện này giao tiếp với nhau thông qua props (properties) hoặc state. Khi một giao diện phức tạp được phân chia nhỏ thành các component thì sẽ dễ phát triển cũng như có thể tái sử dụng lại các component này ở một project khác hoặc một trang khác cần đến nó, như vậy thì code sẽ ngắn gọn hơn và có thể tái sử dụng được.
Ban đầu mình học ReactJS và cũng thắc mắc câu hỏi này, ReactJS dùng để xây dựng ứng dụng Single Page Application mà vậy việc phát triển web bằng ReactJS có SEO được không? Câu trả lời là hoàn toàn được nha các bạn.
Single Page Application (SPA) được biết là các code phía giao diện là do client đảm nhiệm việc render, điều này giúp giảm tải lượng công việc phải làm cho Server, khi giao diện cần Server cung cấp gì để hiển thị lên thì Client sẽ gửi các yêu cầu (request) lên Server để lấy dữ liệu và hiển thị ra giao diện người dùng.
Nhắc tới Single Page Application thì cũng cần nhắc tới Server Side Rendering (SSR). SSR tức có nghĩa là việc render code hoàn toàn do Server phụ trách toàn bộ, nhưng SSR hiệu quả cho việc SEO hơn là SPA bởi vì bot index của Google sẽ đọc được các thông tin từ phía Server render ra như các thẻ meta data hay đường dẫn thân thiện (URL Friendly), còn những đoạn code Javascript được render từ phía client SPA, do nó không có cấu trúc cụ thể, rõ ràng thì bot Google sẽ không hiểu và không thèm đọc đến.
Với các doanh nghiệp làm SPA như Facebook hay Gmail của Google thì việc SEO đối với họ không quan trọng mà quan trọng là trải nghiệm người dùng(UX) với những trang bán hàng như Tiki, Lazada, Shopee, Sendo thì lại khác họ cần SEO để người dùng có thể tìm thấy sản phẩm của họ trên các công cụ tìm kiếm như Google, Bing, Yahoo điều này giúp tăng doanh thu bán hàng của họ.
Nhưng câu hỏi đặt ra là ReactJS hướng tới phát triển ứng dụng SPA mà sao các doanh nghiệp này vẫn dùng, làm sao họ có thể SEO sản phẩm được kia chứ?
Bạn cứ bình tỉnh nghe mình giải thích nhé, theo mình biết thì có 2 cách như vầy. Nếu bạn xây dựng một ứng dụng ReactJS thuần SPA luôn thì không nói, bạn sẽ viết code và toàn bộ code của bạn sẽ được đóng gói vào trong 1 file Javascript duy nhất hay gọi là file bundle.js và gắn nó vào trang của bạn.
Nhưng để một trang web có thể SEO được nó cần nhiều yếu tố nhưng những yếu tố hàng đầu là các thẻ meta phải được render từ phía Server, thì người ta mới nghĩ ra cách là:
Cách 1:
Thay vì sử dụng toàn bộ ứng dụng là code ReactJS thì người ta sẽ code ReactJS cho những thành phần nào quan trọng và phức tạp đòi hỏi trải nghiệm người dùng cao thì họ sẽ viết code ReactJS và sau đó build, đóng gói và cho nó hiển thị vào một phần nào đó của giao diện mà thôi, phần code còn lại thì không sử dụng ReactJS.
Cách 2:
Sử dụng SSR cho toàn bộ ứng dụng tức có nghĩa là render code ReactJS từ phía Server luôn. Nó có một số thư viện ở một số ngôn ngữ sẽ hỗ trợ chúng ta điều này. Theo mình biết với NodeJS thì có NextJS nó giúp chúng ta viết code ReactJS thoải mái và nó sẽ phụ trách việc render code ReactJS từ phía Server, hỗ trợ SEO cực tốt giống như cách mà Tiki đang sử dụng. Nếu các bạn không tin thì các bạn có thể vào trang https://tiki.vn và nhấn Ctrl + U để xem nguồn trang.
Đây là hình ảnh mà mình nhận biết Tiki sử dụng NextJS để render code ReactJS từ phía Server.
Kiểm tra lại xem Lazada, Tiki, Shopee, Sendo, Chợ Tốt có sử dụng ReactJS không?
Để kiểm tra các trang web sử dụng ReactJS hay không cách đơn giản là chúng ta hãy cài đặt Google Chrome Extension có tên React Developer Tools. Sau đó vào nhưng trang web nếu icon React hiện lên thì trang đó có sử dụng ReactJS. Như các hình bên dưới mình có khoanh ô vuông đỏ nơi mà icon của React đã sáng lên.
Chợ tốt có sử dụng ReactJS nhưng phiên bản hơi cũ rồi thì phải.
Tóm lại:
Nếu bạn nào có hứng thú thì hãy thử học ReactJS, ReactJS là một thư viện được bảo trợ bởi Facebook và nó rất ổn định qua các phiên bản. Code rành mạch rõ ràng và dễ bảo trì, thích hợp cho những dự án lớn. Cũng như mình muốn tóm lại là viết code ReactJS hoàn toàn có thể SEO được với các cách mình đã nói ở trên, và code ReactJS cũng có thể render từ phía server nhờ thư viện NextJS như Tiki.vn đang sử dụng.
Chắc hẳn nhiều người cũng đã từng làm 1 ứng dụng trả lời Survey bằng việc sử dụng thư viện hay service bên thứ 3 như Google Form.
Nếu không có yêu cầu gì đặc biệt thì Google Form quả thực quá đủ. Nhưng mà để hiển thị kết quả Survey bằng realtime thì có lẽ Google Form không phải là sự lựa chọn hợp lý.
Vậy cùng xem các kĩ sư ZOZO đã tạo ra ứng dụng Survey realtime như thế nào nhé.
ZOZO là 1 trang web bán hàng online gần như lớn nhất Nhật Bản. Công ty được thành lập vào năm 1998, đến nay đã đạt hơn 1000 nhân viên.
Đa số các công ty Nhật bản, họ thường tổ chức bữa tiệc tổng kết cuối năm để báo cáo tình hình tài chính, giới thiệu dịch vụ công ty đang vận hành đến toàn thể nhân viên.
Và ZOZO cũng vậy. Vào buổi tổng kết cuối năm, họ quay video giới thiệu về dịch vụ trong công ty. Và mỗi khi kết thúc 1 phần nào đó trong video, họ tổ chức 1 cái Survey thăm dò ý kiến của toàn bộ nhân viên, và sẽ hiển thị kết quả ra màn hình 1 cách realtime. Và cái Survey này sẽ được chèn vào giữa các đoạn trong video.
Đây là toàn bộ khung cảnh hội trường lúc đó. Công ty to có khác, hội trường trông hoành tráng quá.
Điều kiện khi thực hiện Survey
Trước buổi tổng kết 2 tuần thì đã nhận được 1 số request từ bên admin như sau:
Ở hội trường sẽ thực hiện làm survey ở trên web 1 cách realtime, kết quả thống kê sẽ hiển thị ngay lập tức trên màn hình hội trường.
Câu trả lời chỉ có YES hoặc NO
Có khoảng từ 7 đến 8 câu hỏi
Có thể trả lời thông qua smartphone bằng cách quét mã QR Code
Muốn hiển thị kết quả trên màn hình hội trường với UI dễ nhìn, bắt mắt.
Câu hỏi và câu trả lời sẽ thực hiện giữa các đoạn video.
Hướng giải quyết
Sau khi nhận được 1 số request từ bên quản lý, các kĩ sư ZOZO đã đưa ra 1 số giải pháp như sau:
Dùng tool Polly trên Slack, mọi người vào đó trả lời Survey. Rồi thông qua Slack API sẽ thống kê và hiển thị kết quả lên màn hình.
=> Ở công ty cũng có người không có account slack nên việc thực hiện là không thể. => Loại
Dùng 1 dịch vụ của bên thứ 3 chuyên về Survey đó là respon. Nhưng mà tool này lại không biết là có thể dễ dàng customize được hay không, với cả thời gian lần này chỉ có 2 tuần nên có thể sẽ không thể làm xong hoàn toàn được => Loại
=> Vì team này đã từng có kinh nghiệm với Firebase, hơn nữa Firebase có thể thống kê kết quả realtime. Nên team đã quyết định chọn Firebase để giải quyết vấn đề này.
Tổng kết lại điều kiện khi làm Survey
Sau khi chọn Firebase làm giải pháp chính, thì mình sẽ tổng hợp lại yêu cầu khi làm Survey như sau:
Có tổng từ 7 đến 8 câu hỏi
Chèn câu hỏi vào giữa các đoạn trong video
Đáp án trả lời sẽ có 2 lựa chọn là YES và NO
Có thể quyét mã QR code để hiển thị trang web Survey.
Kết quả trả lời Survey sẽ được thống kê và hiển thị ra màn hình hội trường ngay lập tức
Khi chuyển sang câu hỏi tiếp theo sẽ không reload lại page
Việc thay đổi câu hỏi sẽ được thực hiện thông qua màn hình quản lý
Trên smartphone chỉ được trả lời 1 lần duy nhất, và không thể xoá
Thời gian trả lời câu hỏi là 15s (Thời gian hiển thị câu hỏi là 10s, còn 5s sẽ hiển thị count down)
Kết quả sẽ hiển thị tỉ lệ phần trăm của YES/NO
Những việc cần chuẩn bị
Để buổi tổng kết không có vấn đề gì xảy ra, các kĩ sư ZOZO đã tổng kết lại quy mô hệ thống và những việc cần thiết nên chuẩn bị như sau:
Số lượng người tham gia: 1000 người
Chuẩn bị mạng Internet có thể chịu được 1000 người
Spec về độ phân giải màn hình: 1920×1080
Số lượng màn hình: 4 màn hình
Buổi hôm đó có thể demo được không? => Từ 15:00 có thể demo được từ 30~40p
Thực hiện việc test tải hệ thống (với quy mô là 1000 người)
Nếu có bug xảy ra thì làm thế nào? => Chuẩn bị 1 slide về toàn các câu hỏi, và nhờ mọi người làm trên đó.
Thực hiện test việc hiển thị trên 1 số loại smartphone
Công nghệ sử dụng
Vì team Frontend ZOZO quyết định tự build lấy nên họ đã quyết định chọn 1 số công nghệ dưới đây:
Sẽ enable/disable màn hình khi câu hỏi bắt đầu và kết thúc
Màn hình kết quả
Hiển thị câu hỏi và kết quả ra màn hình
Màn hình quản lý
Màn hình dùng cho Admin thể thay đổi được câu hỏi
Khi thay đổi câu hỏi thì cũng setting luôn thời gian kết thúc câu hỏi
Setting Firebase
Điều kiện: Cần phải có tài khoản Google.
Đầu tiên cần login vào trong tài khoản Google, sau đó từ Firebase Console sẽ tạo ra 1 project.
Nhập tên project
Check vào những mục điều khoản sau đó ấn vào nút Create Project
Sau khi tạo xong sẽ đi đến màn hình Project Dashboard.
Mặc định thì đang dùng Plan là Spark. Với ứng dụng nào ít request thì mình thấy plan này cũng đủ dùng.
Nhưng mà do quy mô lần này là 1000 người, nên để an toàn ZOZO đã quyết định dùng plan Blaze (Pay as you go – dùng đến đâu trả tiền đến đó)
Setting FireStore
Tiếp theo mình sẽ đi cài đặt thằng FireStore.
Ở menu bên trái màn hình, chọn Develop -> Database
Về chỗ Security rules: Do lần này thực hiện ở trong công ty nên không cần để ý đến security cũng được. Do đó sẽ chọn Start in test mode.
Sau khi tạo xong thì 1 database (Giống như RDS) đã được tạo ra. FireStore là NoSQL nên không cần thiết phải tạo schema.
Bước tiếp theo mình sẽ liên kết với phần Web Application. Trong màn hình chính, chúng ta click vào cái nút </> ở trong hình ảnh bên dưới.
Và thực hiện theo các bước trong hình, cuối cùng chúng ta sẽ add cái đoạn javascript vào trong file src/main.js.
Do ở phía Application mình vẫn chưa tạo, ở đây mình sẽ tạo bằng VueJs. Về cách tạo ứng dụng VueJS ở trên mạng khá nhiều nên ở đây mình sẽ không nói lại nữa. Các bạn có thể Google để tìm hiểu nhé.
Sau khi có ứng dụng VueJS rồi thì bước tiếp theo là nhúng đoạn Javascript phía trên vào file src/main.js.
Setting Firebase Hosting
Về hosting của web application, ZOZO cũng quyết định dùng luôn hosting của firebase.
So với Firestore thì Firebase Hosting cài đặt khá đơn giản.
Ở menu, chọn **Develop -> Hosting. **Sau đó ấn vào nút **Get Started **và thực hiện 1 số câu lệnh ở bên dưới màn hình.
$ firebase login
$ firebase init hosting
Sau khi thực hiện xong 2 câu lệnh trên thì chúng ta sẽ thấy 1 file được tạo ra đó là firebase.json. Trong file này thì **hosting.public **đó chính là đối tượng sẽ được deploy.
Nhưng do VueJS đang sử dụng webpack để build, và thư mục sau khi build xong là dist nên trong firebase.json chúng ta sẽ chuyển hosting.public thành dist. Cụ thể sẽ như sau:
Tiếp theo chúng ta cùng thực hiện deploy firebase nhé
$ npm run build
$ firebase deploy
Sau khi deploy xong thì ở màn hình Hosting sẽ hiển thị ra domain đã được deploy, và có thể access được từ URL đó.
Vậy việc cài đặt Firebase đến đây là kết thúc.
Liên kết màn hình với Firestore
Tiếp theo chúng ta đến bước liên kết màn hình web với firestore nhé.
Cấu trúc của FireStore sẽ đặt như sau:
id của câu hỏi hiện tại
thời gian kết thúc câu trả lời
câu trả lời của người dùng
・Thực tế cấu trúc dữ liệu không phải dạng JSON, nhưng để dễ hiểu mình sẽ viết lại dưới dạng JSON
{
"questions": {
"current": {
"id": 1, // id câu hỏi hiện tại
"endTime": 1545906141 // thời gian kết thúc câu trả lời
},
},
"votes": { // câu trả lời của mỗi người dùng
"001EjYAwtSMXlrWWTP5r": { // (ID mà Firestore đã sinh ra)
"answerId": 0, // id câu trả lời
"questionId": 2 // id câu hỏi
},
"004gO0YzXUJ2bNFSbc5y": {
"answerId": 1,
"questionId": 3
},
.
.
.
}
}
Tại màn hình kết quả sẽ đi thống kê dữ liệu dựa vào từng id câu hỏi. Đối với dữ liệu của câu trả lời, để làm tối thiểu cost nên ZOZO đã sử dụng hàm docChanges() để chỉ lấy cái sự khác nhau của từng kết quả.
・ Ở màn hình Admin, sẽ tiến hành việc ghi dữ liệu câu hỏi vào trong FireStore
Ở màn hình Admin khi mà bắt đầu 1 câu hỏi, khi đó nó sẽ ghi question_id với endTime vào trong FireStore.
Sau khi ghi vào FireStore xong, ngay lập tức sẽ gửi thông báo đến toàn bộ smartphone và thời gian bắt đầu câu hỏi sẽ được bắt đầu. Và khi thời gian kết thúc, màn hình hiển thị câu hỏi sẽ bị mất đi và sẽ đi đến màn hình kết quả.
OK, vậy phần liên kết FireStore với màn hình đến đây đã xong.
Và đây là phòng điều hành buổi tổng kết. Nhìn đã thấy sự chuyên nghiệp rồi. Đúng là nước ngoài có khác. Họ làm gì cũng thấy chuyên nghiệp
Về Pricing của Firebase
Sau khi event kết thúc, vào màn hình Firebase để xác nhận xem mất bao nhiêu tiền.
0.02$
Làm đc 1 ứng dụng như vậy mà chỉ mất có 0.02$. Quá kinh khủng.
Tổng kết
Nếu bạn nào đang có ý định làm 1 ứng dụng trả lời survey realtime thì có thể tham khảo bài viết này nhé.
Kỹ năng giao tiếp là một kỹ năng quan trọng. Để thành công, bạn phải là một người giao tiếp hiệu quả. Không phải ai cũng may mắn có được một khả năng giao tiếp nhanh nhạy, linh hoạt. Nguyên tắc 7C được xem là quy tắc vàng giúp bạn nhận biết và phát triển kỹ giao tiếp tiếp của bản thân. Cùng TopDev phân tích checklist sau đây để có cái nhìn sâu sắc hơn về nguyên tắc này.
Dù là dân freelancer, làm remote hay trực tiếp trải nghiệm teamwork, bạn cũng không cần e ngại khi nắm bắt tốt nguyên tắc 7C.
Clear – Rõ ràng
Giao tiếp được thể hiện dưới nhiều hình thức khác nhau. Một buổi họp nhóm, buổi phỏng vấn, viết email, bài thuyết trình, báo cáo,… Nhưng dù cho nội dung là gì, bạn cần phải làm rõ cho người tiếp nhận thông điệp hiểu những điều bạn đang nói; mục tiêu của nó ra sao. Nếu không, cuộc giao tiếp ấy đã thất bại ngay từ những bước đi đầu tiên.
Hãy nói ngắn gọn, trình bày vấn đề đúng trọng tâm. Nội dung cần được cô đọng, súc tích, tránh dàn trải. Mọi thứ chỉ cần có điểm nhấn (on-point).
Đặc biệt, nếu là những nội dung về khoa học chuyên ngành, bạn cần đảm bảo cấu trúc nội dung và tính logic.
Tuy vậy, tính dễ hiểu vẫn là tiêu chí đầu tiên cần được được thỏa mãn. Nếu đi quá xa so với giới hạn phạm vi/định hướng nội dụng ban đầu, bạn sẽ đánh mất sự chú ý của người nghe chỉ sau 2 phút hoặc thậm chí nhanh hơn.
Concise – Ngắn gọn
Để đảm bảo cuộc giao tiếp diễn ra hiệu quả, hãy tập trung vào nội dung quan trọng.
Đừng “chém gió” với những ngôn từ thừa thải. Khi bạn cố “cuốn hút” người nghe bằng những lời nói dài dòng, không có nội dung, bạn càng chứng tỏ bản thân là người thiếu khả năng phân tích và đánh giá. Chưa kể, việc nói quá nhiều cũng khiến bạn dễ bị gán mác “nói thì dễ hơn làm” (easier said than done). Đừng để sự thiếu sót về kỹ năng (dù bạn không cố tình) khiến bạn trở thành tâm điểm của những cuộc bàn luận không tích cực.
Một điểm đáng lưu ý bạn cần lưu tâm, hãy hạn chế sử dụng các những từ không cần thiết; thể hiện sự mơ hồ: có vẻ như là, hình như, ý em là.
Việc chú trọng đến tính ngắn gọn sẽ giúp bạn chọn lọc những nội dung hữu ích, thật sự mang lại giá trị cho cuộc hội thoại. Đồng thời, bạn sẽ tránh được những nội dung trùng lặp. Từ đó, cuộc giao tiếp được duy trì một cách tốt hơn.
Concrete – Cụ thể
Tính cụ thể là một điều quan trọng khi giao tiếp.
Bạn không thể nói liên hoàn các câu chuyện, đó là cách liên kết thiếu hiệu quả. Hơn hết, đừng áp đặt tính chung hóa (hiêu ứng đám đông tiêu cực) lên mọi vấn đề. Đó là cảm nhận chủ quan của chính bạn. Nó sẽ làm bạn mất điểm đối với người tiếp nhận thông tin.
Lưu ý, bạn nên sử dụng những nguồn dữ liệu có độ chính xác cao. Càng cụ thể hóa, nội dung của bạn càng được làm rõ và dễ hiểu hơn. Giao tiếp hiệu quả trước tiên phải đúng, phải chuẩn, phải thật gãy gọn. Dù cho bạn nói, bạn viết, bạn sử dụng ngôn ngữ hình thể (body language),… vẫn phải đảm bảo các tiêu chí về tính cụ thể.
Correct – Chính xác
Giao tiếp chuyên nghiệp không cho phép nói những gì sai sự thật.
Vì thế, trước khi quyết định truyền tải một điều gì đó, bạn cần ghi nhớ: Kiểm tra, kiểm tra và kiểm tra… thông tin ấy có chính xác hay chưa. Hoặc nếu trong trường hợp không chắc chắn về nó, bạn không nên nói ra.
Tất nhiên, tính chính xác rất quan trọng. Tuy vậy, hãy ứng biến linh hoạt trong một vài trường hợp. Nếu một từ chuyên ngành đối với đối phương quá khó hiểu, bạn có thể giải thích cho họ. Sử dụng các từ ngữ đồng nghĩa, từ toàn dân; các ví dụ nhằm mô tả sinh động, trực quan để người nghe có thể nắm bắt nội dung bạn muốn đề cập. Đó là trường hợp bạn hiểu về thuật ngữ. Còn nếu không hãy cân nhắc trước khi giao tiếp bất cứ điều gì.
Coherent – Mạch lạc, chặt chẽ
Thiếu tính liên kết, không chặt chẽ về nội dung; thậm chí tổ chức nội dung cũng không có sự logic, đây là những biểu hiện của sự thiếu mạch lạc, chặt chẽ.
Tính mạch lạc thật sự rất quan trọng. Và sự logic chính là biểu hiện phản ánh tính mạch lạc rõ ràng nhất. Cuộc hội thoại sẽ vô nghĩa nếu bạn nói những thứ không liên đến nhau. Hoặc đơn giản, những gì bạn nói sẽ trở nên lộn xộn, không có định hướng. Người nghe sẽ đánh giá không tốt về kỹ năng của bạn. Do vậy, hãy thật sự tỉnh táo trong việc xác định nội dung, sắp xếp các ý tưởng để việc fiao tiếp không bị cản trở.
Complete – Hoàn chỉnh
Liệu rằng các thông tin bạn cung cấp, mục đích bạn giao tiếp; những phản ứng hay hành động bạn mong muốn từ người nghe là gì (call-to-action) đã đầy đủ chưa?
Đừng giao tiếp nửa vởi, lưng lửng, hời hợt,… Hãy nói hết nội dung bạn muốn truyền tải để người nghe nhận biết các thông tin. Đó là cơ sở dữ liệu quan trọng để họ biết cách phản hồi và thực hiện những gì tiếp theo. Cung cấp cho người nghe đầy đủ các thông tin để họ dễ dàng nắm bắt thông điệp của bạn.
Có như thế, cuộc giao tiếp mới thật sự thành công khi tính đa chiều thể hiện qua các phản hồi hợp tác được thực hiện.
Courteous – Lịch sự
Đây là tip cuối trong 7 điều quan trọng hình thành nên nguyên tắc 7C. Giao tiếp không thể hiệu quả nếu bạn chỉ quản tâm đến nội dung và cách thức truyền tải.
Tính lịch sự là một yếu tố cần thiết giúp cho cuộc giao tiếp của bạn trở nên chuyên nghiệp.Có thể bạn có những thiếu sót trong cách thức truyền tải nội dung. Nhưng đổi lại, bạn có một thái độ chân thành, giọng điệu hay khi giao tiếp, cách dùng từ ngữ rất khéo léo, phù hợp với từng chủ đề, đối tượng giao tiếp thì bạn vẫn được đánh giá tốt.
Đừng dùng những từ ngữ thiếu tinh tế, sắc thái tiêu cực,… điều đó ảnh hưởng đến chất lượng cuộc giao tiếp của bạn.
Lời kết
Mỗi ngày bạn đều giao tiếp! Thông qua bài viết phân tích về nguyên tắc 7C, TopDev hi vọng bạn có thể đánh giá được mức độ giao tiếp thành công của bản thân. Từ đó lập kế hoạch rèn luyện để việc giao tiếp trở nên tốt hơn. Hãy để giao tiếp không còn là nỗi lo! Chủ động, tự tin và kiên trì các bạn nhé!
CEO & CMO Summit Vietnam sẽ trở lại và đây là năm thứ ba sự kiện này được tổ chức tại Việt Nam. Nếu bạn chưa biết đến sự kiện thường niên này thì đây là ngày mà các nhà lãnh đạo lớn trong ngành hội tụ và kết nối với nhau để xây dựng tương lai của ngành tiếp thị. Đây cũng là sự kiện offline đầu tiên của MMA trong năm 2020 với sự tham gia của gần 30 đối tác và nhà tài trợ.
Sau khoảng thời gian khó khăn khi dịch COVID bùng phát, đã có một sự thay đổi chưa từng có trong cách tương tác giữa thương hiệu, nhà tiếp thị và khách hàng của họ. Với toàn bộ khách tham dự cấp cao từ các nhãn hàng trong hệ sinh thái, chương trình MMA CEO & CMO Summit sẽ xoay quanh chủ đề làm thế nào mà các thương hiệu đã xoay chuyển và thích ứng thành công trong thời điểm đặc biệt này. Bạn cũng sẽ được nghe những nhà lãnh đạo thảo luận về những xu hướng tiêu dùng sẽ tồn tại bền vững và cho chúng ta cái nhìn chung về trạng thái “bình thường mới” ít nhất là trong tương lai gần.
Với sự hướng dẫn và chia sẻ từ một số tên tuổi lớn nhất trong ngành, cụ thể là các diễn giả từ Facebook, Google, Abbott và nhiều nhà lãnh đạo khác trên thị trường, bạn sẽ có thể hiểu thật chi tiết hành vi của người tiêu dùng đã thay đổi như thế nào trong thời gian đại dịch và tại sao mọi thứ đang dần chuyển sang omni-channel và E-commerce, cũng như cách tái cơ cấu doanh nghiệp của bạn để ngăn chặn sự gián đoạn kinh doanh trong tương lai.
Hãy tham gia MMA CEO & CMO Summit Việt Nam lần thứ 3, cơ hội duy nhất, nơi các nhà lãnh đạo trong ngành hội tụ, giúp bạn có bước tiến trên thương trường và cùng nhau kiến tạo tương lai của ngành tiếp thị. Với tất cả những chủ đề nóng hổi nhất và chào đón 300 đại biểu VIP offline, sự kiện cũng sẽ được livestream trên 2 cộng đồng marketing lớn nhất Việt Nam bên cạnh kênh MMA, sự kiện hứa hẹn sẽ truyền cảm hứng và những ý tưởng mới, sáng tạo.
Sứ mệnh của MMA là thúc đẩy các nhà tiếp thị đổi mới và phát triển giá trị kinh doanh lâu dài trong bối cảnh thế giới ngày càng năng động và luôn được kết nối qua di động. Bao gồm hơn 800 công ty thành viên trên toàn cầu và 14 văn phòng khu vực, MMA là hiệp hội thương mại tiếp thị duy nhất tập hợp đầy đủ hệ sinh thái gồm các nhà tiếp thị, nhà cung cấp công nghệ và thương gia, cùng nhau hợp tác để kiến tạo tương lai của tiếp thị, đồng thời không ngừng mang lại tăng trưởng. Sứ mệnh của MMA được định hướng bởi bốn trụ cột cốt lõi: Nuôi dưỡng cảm hứng qua thúc đẩy sự đổi mới cho các CMO, Củng cố tiềm năng tiếp thị di động cho các tổ chức tiếp thị thông qua việc chia sẻ bí quyết và sự tự tin; nâng cao hiệu quả và tác động của thiết bị di động thông qua nghiên cứu thực tiễn, và ủng hộ các nhà tiếp thị di động.
Có bao giờ khi đi làm mà bạn gặp bug, chức năng khó không biết code như thế nào, đọc tài liệu không hiểu và muốn nhờ người khác giúp đỡ hay chưa và có khi nào bạn giải thích vấn đề của mình mà họ không hiểu chưa. Chắc chắn là những bạn mới vừa đi làm hoặc những bạn đã đi làm đều gặp phải, khi bạn nhờ người khác giúp đỡ mà bạn trình bày vấn đề của mình quá lan man, người nghe không hiểu gì thì sẽ không thể nào giúp bạn được. Vì vậy nay mình sẽ viết một bài chia sẻ về vấn đề này.
Nguyên nhân vì sao bạn trình bày mà người khác không hiểu?
* Bạn không đủ kỹ thuật để hiểu về vấn đề của mình
Trước đây thì tôi cũng đã từng trải qua, khi mới đi làm tôi chưa biết gì về javascript, jquery. Trong lúc làm task thì research thêm, tuy nhiên tôi lại không làm được. Khi tôi đi hỏi một người anh trong công ty, tôi lại không biết cách hỏi như thế nào để anh đó chỉ cho tôi làm vì kỹ thuật không nắm chắc.
* Bạn không hiểu về task của mình
Khi bạn không hiểu về luồng nghiệp vụ của task thì bạn cũng rất khó trình bày được những vấn đề phát sinh trong đó cho người khác hiểu.
* Bạn không biết cách trình bày vấn đề của mình
Ngày trước tôi cũng không biết cách trình bày vấn đề của mình, tuy nhiên nhờ có kinh nghiệm đi làm, học hỏi từ các anh chị đi trước mà cách trình bày vấn đề của tôi đã tốt lên rất nhiều.
Cách khắc phục
* Bạn không đủ kỹ thuật để hiểu về vấn đề của mình
Cách duy nhất là cần phải nâng cao kỹ thuật của bản thân lên rồi, chịu khó tìm tòi và học hỏi những cái mình đang làm.
* Bạn không hiểu về task của mình
Khi mới đi làm thì kỹ năng phân tích task còn yếu, tuy nhiên nó sẽ cải thiện dần sau khi đi làm nhiều dự án.
* Bạn không biết cách trình bày vấn đề của mình
Cái này chính là chủ đề chính của bài viết này, tôi sẽ chỉ cho bạn cách làm sao để trình bày được vấn đề của mình một cách mạch lạc, có đầu, có đuôi để cho người khác hiểu.
Phương pháp trình bày vấn đề cho người nghe hiểu một cách chuyên nghiệp
Các bạn cùng theo dõi ví dụ sau nhé.
VD1 : Tèo đang code task của mình và gặp một vấn đề đang rất là đau đầu đó là việc đổ dữ liệu bằng ajax ra màn hình html, tuy nhiên data lại hiển thị lên bị sai. Tèo lân la dùng nhan sắc chim sa cá lặn của mình để hỏi anh senior.
Tèo : “Anh ơi chỉ em chỗ này với, chỗ này hiển thị bị sai.”
Anh senior : “Chỗ này em đang muốn làm gì?”
Tèo : “Thì nó hiển thị sai đó anh”
Anh senior : “WTF, Biết là sai rồi nhưng nó sai làm sao, nhưng thế nào là đúng”.
Tèo giải thích một hồi lâu, anh senior đập đầu tự vẫn vì không hiểu tèo đang nói gì.
VD2 : Tí cũng đang code task của mình và gặp một vấn đề giống như tèo và cũng dùng nhan sắc của mình để đi hỏi chị Senior
Tí : “Chị ơi em có một vấn đề này muốn hỏi”.
Chị Senior : “Hỏi gì vậy em”
Tí : “Vấn đề của em là như vầy. Em đang code task hiển thị danh sách sinh viên lên màn hình, hiển thị ra các thông tin như là tên, tuổi, năm sinh… Tuy nhiên phần hiển thị format năm sinh bị sai, em đang điều tra mà chưa ra, chị support em chút được không ạ”
Chị senior : “À oke được chứ em”
Tí : “À hiện tại phần format ngày em đang code ở service A ở packge B, chị xem giúp em nhé”
Sau khi Tí chỉ đúng chỗ đó với kinh nghiệm senior thì trong 5p chị đã thấy cái sai của Tí.
Sau khi đọc hai ví dụ trên thì các bạn có rút ra được điều gì không? Về Tí thì đang hiểu rất rõ vấn đề của mình đang gặp phải, biết được nơi xảy ra vấn đề của mình ở chỗ nào nhằm thu gọn lại phạm vi điều tra cho chị Senior, tiết kiệm được thời gian khi đi làm là rất cần thiết nhé.
Túm lại, thì khi trình bày vấn đề của mình để người khác hiểu thì có những bước như sau.
1. Nói rõ chi tiết mà cái task của mình đang làm là gì, tóm gọn lại chức năng chính là được.
2. Nói rõ vấn đề gặp phải là gì, nói rõ càng chi tiết càng tốt.
3. Mô tả thêm một số thông tin nhằm thu gọi lại phạm vị điều tra nhằm tiết kiệm thời gian của cả hai bên. Tốt nhất là nên nói ra hết những cái gì mình biết nhằm để cho người support dễ dàng hỗ trợ mình.
Đến đây là kết thúc bài viết chia sẻ về kỹ năng trình bày vấn đề, hy vọng sẽ giúp các bạn trình bày vấn đề của mình một cách cho người nghe dễ hiểu nhé. Và nhớ like fanpage chickencode nhé.
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Trong thế giới bùng nổ thông tin như hiện nay thì việc tìm kiếm trên Internet trở nên quan trọng hơn bao giờ hết. Vì vậy, việc website của bạn có thêm chức năng tìm kiếm nhanh không chỉ tăng trải nghiệm người dùng mà còn thể hiện sự chuyên nghiệp trong thiết kế. Tuy nhiên, khi các chức năng cơ bản của 1 website đã quá phổ thông như hiện nay thì trải nghiệm người dùng là vấn đề được ưu tiên hàng đầu. Việc tìm kiếm thông tin phải đạt được yêu cầu nhanh, chính xác, đáp ứng mục đích của người dùng. Và kĩ thuật hỗ trợ đầy đủ các yêu cầu đó chính là phương thức Autocomplete của jQuery.
Nếu bạn đang có nhu cầu tìm kiếm một sản phẩm nào đó trên một website bán hàng chẳng hạn, thì việc tìm thấy thông tin sản phẩm hoặc ít nhất là có thể thấy danh sách các kết quả được lọc ra ngay khi gõ tên sản phẩm sẽ tiện lợi hơn nhiều so với việc chúng ta phải bấm nút “Tìm kiếm” rồi chờ lọc kết quả trong một rừng sản phẩm được show ra màn hình. Đặt vị trí của mình vào người dùng, chắc chắn điều đó sẽ ảnh hưởng đến cảm quan của họ tới website của bạn. Để giải quyết vấn đề này, ta có thể dùng phương thức Autocomplete của jQuery., một kĩ thuật đơn giản nhưng lại đem đến trải nghiệm tuyệt vời cho website của bạn.
Thông thường, sau khi nhập từ khóa và bấm tìm kiếm, client sẽ gửi request kèm theo thông tin là từ khóa ta vừa nhập, sau đó, server sẽ xử lý và trả về kết quả hoặc danh sách kết quả phù hợp cho client ở một trang HTML mới, tất cả quá trình được diễn ra kèm theo hiện tượng chuyển trang, hay nói đơn giản là website phải load lại. Điều này tưởng chừng như bình thường nhưng sẽ đem đến sự khó chịu nhất định với người dùng, đặc biệt là những người cần sự mượt mà và không thể chờ đợi lâu. Do đó, thay vì đưa ra một trang mới, ta có thể hiển thị kết quả tìm kiếm ngay tại ô input mà không cần bấm enter để có thể tăng trải nghiệm. Tất nhiên, để website không bị load lại, ta sẽ sử dụng Ajax với mô hình thiết kế là Spring MVC.
Bài toán đặt ra là, cần gửi thông tin và nhận kết quả ngay tại View. Vì vậy, ta cần viết một hàm Ajax thực hiện hai việc đó cùng lúc. Giả sử ta có hàm search() ở phía controller, hàm này sẽ được thực thi khi có request gửi tới đường dẫn URL/search/key_search (key_searrch là từ khó mà ta tìm kiếm). Đầu tiên cần import thư viện jQuery. Lưu ý mỗi phiên bản sẽ cho ra một trải nghiệm khác nhau tùy vào nhu cầu sử dụng. Bạn có thể thử với các phiên bản để chọn ra kết quả phù hợp. Ở đây tôi dùng bản 1.12.1:
Sau khi đã có thư viện, ta tiến hành viết hàm nhận từ khóa và gửi request như sau:
<script>
const apiBaseUrl = URL //đây là đường dấn tới controller của bạn
function search_product() {
let keySearch = document.getElementById("search").value;
$.ajax(`${apiBaseUrl}/search/` + keySearch)
.done(function (result) {
console.log(result)
$("#search").autocomplete({
source: result
});
})
.fail(function (error) {
console.log(error);
});
};
</script>
Hàm này có nhiệm vụ nhận từ khóa tại ô input có id là”search” và gửi request kèm từ khóa đó, sau khi server trả kết quả về, ta sẽ hiển thị kết quả đó tại chính ô input với đại diện là biến “result”.
Tuy nhiên, để mọi việc diễn ra liên tục, ta cần thêm lời gọi hàm tại ô input như sau:
Thuộc tính oninput() sẽ gọi hàm của chúng ta mỗi khi ta thay đổi nội dung của ô input. Vậy là xong, từ việc xử lý cồng kềnh khi phải reload lại trang, hiển thị cả đống kết quả thì người dùng có thể tìm thấy nội dung họ muốn ngay tại cửa sổ tìm kiếm rồi.
Email là phương tiện trao đổi quan trọng trong công việc. Trong thời đại phát triển mạnh mẽ của kỹ thuật số, nó được xem như một sản phẩm mang tính ứng dụng đáp ứng gần như tuyệt đối nhu cầu trao đổi thông tin.
Thế nhưng, liệu bạn đã biết về văn hóa giao tiếp thông qua email hay chưa? Cùng TopDev tìm hiểu nhé, nó đôi khi là cả một nghệ thuật đấy!
Những yếu tố cơ bản cần nắm bắt
Tiêu đề Email
Đừng để tiêu đề của bạn trở nên xáo rỗng. Đồng thời, cũng nên loại bỏ cách đặt những tiêu đề quá dài dòng. Điểm mấu chốt của tiêu đề là tính ngắn gọn, có chức năng thông báo chính xác nội dung của email.
Nếu tiêu đề là những báo cáo được thiết lập theo một chu trình quản lý thời gian, bạn cần bổ sung thời gian trong tiêu đề. Từng tuần, từng tháng, từng quý hay từng năm, bạn cần đặt theo một quy chuẩn thống nhất.
Tránh các tiêu đề không dấu, viết hoa tùy tiện, có các ký tự lạ nhằm làm mất đi tính nhận diện email. Người nhận sẽ nghĩ đó là spam và tất nhiên, việc xóa mất dữ liệu quan trọng có thể xảy ra. Một lưu ý nữa chính là bạn phải thay đổi tiêu đề sao cho phù hợp với từng nội dung nếu có những thay đổi, chỉnh sửa muốn nhấn mạnh, đề cập đến.
Cấu trúc Email
Hãy quan tâm đến 3 phần chính làm nên 1 email.
+ Lời chào mở đầu thể hiện sự tôn trọng của bạn là điều cần thiết thực hiện.
+ Nội dung cần được phân bổ hợp lý với các trình tự logic. Phải đảm bảo các nội dung bảo các vấn đề được đề cập cô đọng, ngắn gọn. Nội dung email cần đúng trọng tâm, tránh lan man. Đồng thời, bạn nên kiểm tra song song hai vấn đề chính tả và ngữ pháp của nội dung email. Điều này giúp nội dung email đạt tính chuẩn xác
+1 dòng kết email với câu kết, kèm theo đó là lời cảm ơn chân thành. Tất nhiên, không thế những lời nhắc về việc phản hồi của người nhận email. Hãy bổ sung một lời chúc tốt đẹp để gia tăng sự trân trọng.
Ví dụ: “Regards” hoặc “Your faithfully” hoặc Thân mến; Chúc bạn một ngày tốt đẹp…
Tính thận trọng – Yếu tố tạo ra sự chuyên nghiệp
Sự thận trọng là yếu tố quyết định và chính nó thúc đẩy bạn tạo ra sự chuyên nghiệp. Cùng điểm xem tính thận trọng được thể hiện như thế nào?
Biểu hiện phản ánh yếu tố chuyên nghiệp
– Thêm chữ ký được xem là cách thức thông minh để người nhận dễ dàng phản hồi bạn.
– Kiểm tra – hiệu chỉnh sau khi viết nội dung đồng thời điền email của người nhận sau cùng. Check lại mọi thứ từ nội dung, câu chữ, lối diễn đạt,… đã thật sự phù hợp hay chưa? Khi đảm bảo mọi thứ không có gì sai sót, hãy bắt đầu điền email của người nhận. Đây là thao tác giúp giảm thiểu tình trạng email được gửi đi khi bạn chưa kịp ra soát nội dung tổng thể.
– Quan tâm và cân nhắc các chức năng khi gửi email: Như các bạn đã biết, phần thêm địa chỉ email được phân loại thành 3 phần: To, Cc và Bcc.
Thực tế, mỗi phần đều có ý nghĩa riêng của nó. Do vậy, hãy cân nhắc để không điền sai vị trí địa chỉ email người nhận.
– To: Vị trí email gửi trực tiếp cho người chịu trách nhiệm chính quản lý và giải quyết thông tin, công việc.
– Cc: Vị trí email của người có liên quan. Người gửi muốn họ cũng biết được thông tin về email này cùng với người trực tiếp xử lý vấn đề.
– Bcc: Vị trí email mà người gửi muốn người nhận biết thông tin này một cách bí mật. Trường hợp người nhận muốn phản hồi, không nên chọn “Reply to all”. Đồng thời, nên xem xét kỹ lưỡng khi đưa ra các quyết định “Reply”, “Forward”. Điều này liên quan đến câu chuyện bảo mật thông tin, vì thế, bạn cần thật sự lưu tâm.
Tính chuyên nghiệp trong từng trường hợp thực thế
Phân loại theo từng trường hợp
A. Lần đầu gửi Email cho người khác
Văn bản mẫu và những lưu ý kèm theo:
Chủ đề Email: “Về việc(nêu ra trọng tâm vấn đề nhưng cần tinh gọn)”
Nội dung:
Chào chị …. (Ghi rõ tên người nhận, tránh dùng Dear anh/chị; tuyệt đối không ghi sai tên người nhận)
Em là…. đến từ….(cơ quan/ đoàn thể/ nơi cộng tác tương ứng). Em biết được email của chị do anh… bên công ty…. giới thiệu (nêu ra hoàn cảnh hoặc gợi nhắc về dịp/sự kiện nào đó mà người gửi biết được)
Em viết email này để(nếu ra vấn đề cần thảo luận; triển khai vấn đề chi tiết nhưng không dài dòng, lan man).
Từng ý 1…
ý 2…
……..
Tuy nhiên, một bất cập có thể xảy ra là….
Vì vậy, em đề xuất mình có thể…
Bước tiếp theo, mong chị gửi em … . Nếu cần bổ sung thêm thông tin, chị cứ nói với em hoặc liên hệ với em tại… (kênh liên hê của bạn: Facebook, Skype, Linkedin,…)
Mong sớm nhận được phản hồi của chị.
Cảm ơn anh/chị,
B. Email phản hồi người khác
Văn bản mẫu và những lưu ý kèm theo:
Gửi chị…
Cảm ơn email của chị. Về các vấn đề mà chị đưa ra, em xin phản hồi như sau: (triển khai từng việc)
Thứ nhất,…
Thứ hai,…
…….
Để em có thể tiến hành…xin chị phản hồi giúp em một số điểm như sau: (triển khai từng phần nhỏ)
– (Trình bày thắc mắc)
– (Trình bày thắc mắc)
Sau khi nhận được những thông tin trên từ chị, bước tiếp theo của em sẽ là…
Mong nhận được phản hồi của chị trước ngày…để kịp tiến hành … đúng hạn.
Email này em có cc chị… và….đến từ phòng ban… để giải đáp giúp chị về vấn đề… nếu chị có thêm yêu cầu. (Lưu ý về ý nghĩa của các vị trí Cc, Bcc). Cảm ơn chị.
Thân gửi,
(Tên của bạn hoặc chữ ký của bạn)
C. Trường hợp đối với Email dạng Follow-up
Văn bản mẫu và những lưu ý kèm theo:
Gửi chị…
Em là…. đến từ….(cơ quan/ đoàn thể/ nơi cộng tác tương ứng). Em gửi chị email này xin được follow-up về việc,…
Em cần chị phản hồi giúp em về vấn đề … và gửi cho em … để có thể tiến hành … trước ngày…/…/…
Email trước em đã forward phía dưới để chị tiện xem lại. File đính kèm trong email này là giấy tờ A, B và C
Mong sớm nhận được phản hồi của chị.
Cảm ơn chị,
(Tên của bạn hoặc chữ ký của bạn)
Bước kiểm tra cuối cùng
Sau khi đảm bảo cấu trúc email với đầy đủ các nội dung được triển khai. Bạn sẽ thực hiện bước cuối cùng để Email của mình chuyên nghiệp, tạo sự thuyết phục đối với người nhận.
– Liệu Email đã giải quyết hay nêu ra được vấn đề chính một cách rõ ràng chưa? Nội dung đã đặt ra yêu cầu hành động cụ thể tiếp theo với người nhận?
– Số lượng file đính kèm (nếu có) đã đầy đủ chưa? Định dạng file có bị chính xác?
– Kiểm tra sự đồng nhất về format hình thức lẫn nội dung.
– Rà soát lỗi chính tả lại một lần nữa đồng thời đọc lại xem văn phong có phù hợp với mục đích của email hay không?
Lời kết
Việc giao tiếp qua email cũng có thành công, và cũng có thất bại. Do vậy, để giao tiếp thành công, bạn cần thật sự đầu tư cho “cuộc giao tiếp” này. Điều quan trọng là bạn cần nắm vững những kỹ năng cơ bản; các kiến thức để có thể tổ chức, xử lý nội dung một cách phù hợp. TopDev hi vọng với những tip chia sẻ trong bài viết, các bạn sẽ có những điều bổ ích trong việc hoàn thiện kỹ năng viết email của bản thân. Đồng thời, biết cách phát triển để việc giao tiếp email của bạn chuyên nghiệp hơn mỗi ngày.
Java là ngôn ngữ lập trình thuộc top phổ biến nhất thế giới, Java không chỉ phổ biến trong lập trình ứng dụng web và di động mà còn là xương sống của nhiều hệ thống lớn như các nền tảng giao dịch tài chính, hệ thống quản lý doanh nghiệp, và các ứng dụng nhúng. Vậy Java là gì? Java hoạt động ra sao và ứng dụng như thế nào? Cùng TopDev tìm hiểu tổng quan về ngôn ngữ lập trình Java này thông qua bài viết bên dưới nhé!
Java là gì?
Java là một trong những ngôn ngữ lập trình hướng đối tượng. Ngôn ngữ Java được sử dụng phổ biến trong phát triển phần mềm, trang web, game hay ứng dụng trên các thiết bị di động.
Java được khởi đầu bởi James Gosling và bạn đồng nghiệp ở Sun MicroSystem năm 1991. Ban đầu Java được tạo ra nhằm mục đích viết phần mềm cho các sản phẩm gia dụng, và có tên là Oak. Java được chính thức phát hành năm 1994, đến năm 2010 được Oracle mua lại từ Sun MicroSystem.
Java được thiết kế với tiêu chí “Write Once, Run Anywhere” (viết một lần, chạy mọi nơi), tức là mã nguồn Java sau khi biên dịch có thể chạy trên bất kỳ nền tảng nào hỗ trợ Java Virtual Machine (JVM), mà không cần thay đổi lại mã. Điều này giúp Java trở thành một ngôn ngữ lập trình đa nền tảng và rất phổ biến.
Trong quá trình tạo ra một ngôn ngữ mới phục vụ cho mục đích chạy được trên nhiều nền tảng, các kỹ sư của Sun MicroSystem muốn tạo ra một ngôn ngữ dễ học và quen thuộc với đa số người lập trình. Vì vậy họ đã sử dụng lại các cú pháp của C và C++.
Tuy nhiên, trong Java thao tác với con trỏ bị lược bỏ nhằm đảo bảo tính an toàn và dễ sử dụng hơn. Các thao tác overload, goto hay các cấu trúc như struct và union cũng được loại bỏ khỏi Java.
Độc lập phần cứng và hệ điều hành
Một chương trình viết bằng ngôn ngữ Java có thể chạy tốt ở nhiều môi trường khác nhau. Gọi là khả năng “cross-platform”. Khả năng độc lập phần cứng và hệ điều hành được thể hiện ở 2 cấp độ là cấp độ mã nguồn và cấp độ nhị phân.
Ở cấp độ mã nguồn: Kiểu dữ liệu trong Java nhất quán cho tất cả các hệ điều hành và phần cứng khác nhau. Java có riêng một bộ thư viện để hỗ trợ vấn đề này. Chương trình viết bằng ngôn ngữ Java có thể biên dịch trên nhiều loại máy khác nhau mà không gặp lỗi.
Ở cấp độ nhị phân: Một mã biên dịch có thể chạy trên nhiều nền tảng khác nhau mà không cần dịch lại mã nguồn. Tuy nhiên cần có Java Virtual Machine để thông dịch đoạn mã này.
Ngôn ngữ thông dịch
Ngôn ngữ lập trình thường được chia ra làm 2 loại (tùy theo các hiện thực hóa ngôn ngữ đó) là ngôn ngữ thông dịch và ngôn ngữ biên dịch.
Thông dịch (Interpreter) : Nó dịch từng lệnh rồi chạy từng lệnh, lần sau muốn chạy lại thì phải dịch lại.
Biên dịch (Compiler): Code sau khi được biên dịch sẽ tạo ra 1 file thường là .exe, và file .exe này có thể đem sử dụng lại không cần biên dịch nữa.
Ngôn ngữ lập trình Java thuộc loại ngôn ngữ thông dịch. Chính xác hơn, Java là loại ngôn ngữ vừa biên dịch vừa thông dịch. Cụ thể như sau
Khi viết mã, hệ thống tạo ra một tệp .java. Khi biên dịch mã nguồn của chương trình sẽ được biên dịch ra mã byte code. Máy ảo Java (Java Virtual Machine) sẽ thông dịch mã byte code này thành machine code (hay native code) khi nhận được yêu cầu chạy chương trình.
Ưu điểm : Phương pháp này giúp các đoạn mã viết bằng Java có thể chạy được trên nhiều nền tảng khác nhau. Với điều kiện là JVM có hỗ trợ chạy trên nền tảng này.
Nhược điểm : Cũng như các ngôn ngữ thông dịch khác, quá trình chạy các đoạn mã Java là chậm hơn các ngôn ngữ biên dịch khác (tuy nhiên vẫn ở trong một mức chấp nhận được).
Cơ chế thu gom rác tự động
Khi tạo ra các đối tượng trong Java, JRE sẽ tự động cấp phát không gian bộ nhớ cho các đối tượng ở trên heap.
Với ngôn ngữ như C/C++, bạn sẽ phải yêu cầu hủy vùng nhớ mà bạn đã cấp phát, để tránh việc thất thoát vùng nhớ. Tuy nhiên vì một lý do nào đó, bạn không hủy một vài vùng nhớ, dẫn đến việc thất thoát và làm giảm hiệu năng chương trình.
Ngôn ngữ lập trình Java hỗ trợ cho bạn điều đó, nghĩa là bạn không phải tự gọi hủy các vùng nhớ. Bộ thu dọn rác của Java sẽ theo vết các tài nguyên đã được cấp. Khi không có tham chiếu nào đến vùng nhớ, bộ thu dọn rác sẽ tiến hành thu hồi vùng nhớ đã được cấp phát.
Java hỗ trợ lập trình đa tiến trình (multithread) để thực thi các công việc đồng thời. Đồng thời cũng cung cấp giải pháp đồng bộ giữa các tiến trình (giải pháp sử dụng priority…).
Tính an toàn và bảo mật
Tính an toàn
Ngôn ngữ lập trình Java yêu cầu chặt chẽ về kiểu dữ liệu.
Dữ liệu phải được khai báo tường minh.
Không sử dụng con trỏ và các phép toán với con trỏ.
Java kiểm soát chặt chẽ việc truy nhập đến mảng, chuỗi. Không cho phép sử dụng các kỹ thuật tràn. Do đó các truy nhập sẽ không vượt quá kích thước của mảng hoặc chuỗi.
Quá trình cấp phát và giải phóng bộ nhớ được thực hiện tự động.
Cơ chế xử lý lỗi giúp việc xử lý và phục hồi lỗi dễ dàng hơn.
Tính bảo mật
Java cung cấp một môi trường quản lý chương trình với nhiều mức khác nhau.
Mức 1 : Chỉ có thể truy xuất dữ liệu cũng như phương phức thông qua giao diện mà lớp cung cấp.
Mức 2 : Trình biên dịch kiểm soát các đoạn mã sao cho tuân thủ các quy tắc của ngôn ngữ lập trình Java trước khi thông dịch.
Mức 3 : Trình thông dịch sẽ kiểm tra mã byte code xem các đoạn mã này có đảm bảo được các quy định, quy tắc trước khi thực thi.
Mức 4: Java kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn truy xuất trước khi nạp vào hệ thống.
Như đã giới thiệu, Java hoạt động dựa trên một quy trình đặc biệt là “Compile Once, Run Anywhere“, nhờ vào việc sử dụng Máy ảo Java. Cụ thể, khi bạn viết một chương trình Java, quy trình hoạt động của Java có thể được chia làm ba bước chính:
Viết mã nguồn: Lập trình viên viết mã nguồn Java trong các tệp .java.
Biên dịch mã nguồn: Mã nguồn Java được biên dịch bởi trình biên dịch Java (Java Compiler) thành bytecode (tệp .class). Bytecode này không phải là mã máy mà máy tính có thể hiểu ngay, nhưng nó là dạng trung gian có thể được hiểu bởi bất kỳ hệ điều hành nào có JVM.
Chạy chương trình: Bytecode sau đó được JVM thực thi. JVM dịch bytecode này thành mã máy (machine code) để hệ điều hành và phần cứng cụ thể có thể hiểu và thực thi chương trình.
Máy ảo Java (JVM – Java Virtual Machine)
Để đảm bảo tính đa nền, Java sử dụng cơ chế Máy ảo của Java.
Khi thực hiện một chương trình, máy ảo Java lần lượt thông dịch các chỉ thị dưới dạng Bytecode thành các chỉ thị dạng nhị phân của máy tính thực và thực thi thực sự chúng trên máy tính thực (còn gọi là khả năng khả chuyển).
Máy ảo thực tế đó là một chương trình thông dịch. Vì thế các hệ điều hành khác nhau sẽ có các máy ảo khác nhau. Để thực thi một ứng dụng của Java trên một hệ điều hành cụ thể, cần phải cài đặt máy ảo tương ứng cho hệ điều hành đó.
JVM cung cấp môi trường thực thi cho chương trình Java (còn gọi là khả năng độc lập với nền).
Có nhiều JVM cho các nền tảng khác nhau chẳng hạn như: Windows, Liux, và Mac.
Một số thuật ngữ thường gặp trong Java
Bytecode
Bytecode là mã trung gian mà trình biên dịch Java tạo ra sau khi biên dịch mã nguồn. Nó không phụ thuộc vào hệ điều hành cụ thể và có thể chạy trên bất kỳ hệ thống nào có Java Virtual Machine (JVM). JVM sẽ dịch bytecode thành mã máy để chạy trên hệ điều hành đó, giúp Java đạt tính độc lập nền tảng.
Garbage Collection (GC)
Garbage Collection là cơ chế tự động quản lý bộ nhớ trong Java. GC tự động dọn dẹp các đối tượng không còn sử dụng nữa, giúp giải phóng bộ nhớ và ngăn ngừa rò rỉ bộ nhớ, đảm bảo ứng dụng hoạt động ổn định mà không cần lập trình viên phải quản lý thủ công.
JDK (Java Development Kit)
JDK là bộ công cụ dành cho lập trình viên Java, bao gồm trình biên dịch (compiler), thư viện chuẩn, và JVM để giúp phát triển và chạy các ứng dụng Java.
JRE (Java Runtime Environment)
JRE là môi trường giúp chạy các chương trình Java đã được biên dịch, bao gồm JVM và các thư viện cần thiết để thực thi chương trình.
API (Application Programming Interface)
API trong Java là tập hợp các thư viện và công cụ hỗ trợ lập trình viên phát triển các ứng dụng, cung cấp các chức năng sẵn có để giải quyết nhiều tác vụ như xử lý dữ liệu, lập trình mạng, và quản lý giao diện người dùng
ClassPath
ClassPath là biến môi trường (environment variable) mà JVM sử dụng để tìm kiếm các file .class hoặc file bytecode được sử dụng bởi ứng dụng Java.
Các loại ứng dụng được phát triển sử dụng Java
Java là một ngôn ngữ lập trình phổ biến, mạnh mẽ và được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau nhờ vào tính độc lập nền tảng, hiệu suất ổn định và bộ thư viện phong phú. Dưới đây là các ứng dụng chính của Java trong nhiều lĩnh vực:
Phát triển Game
Java được sử dụng để phát triển nhiều game đơn giản cho cả máy tính và di động. Nhờ vào các thư viện như LibGDX và LWJGL (Lightweight Java Game Library), Java cung cấp môi trường phát triển mạnh mẽ cho các trò chơi 2D và 3D.
Đám mây (Cloud Computing)
Java là ngôn ngữ chính được sử dụng trong các dịch vụ và hệ thống đám mây (cloud computing) do khả năng xử lý song song mạnh mẽ và bảo mật cao. Các hệ thống như Amazon Web Services (AWS), Google Cloud và Microsoft Azure đều hỗ trợ Java cho việc phát triển và triển khai các ứng dụng trên đám mây.
Dữ liệu lớn (Big Data)
Trong lĩnh vực dữ liệu lớn (Big Data), Java đóng vai trò quan trọng nhờ vào các công cụ và framework mạnh mẽ như Apache Hadoop, Apache Spark. Những framework này chủ yếu được viết bằng Java và Scala, cho phép Java có thể xử lý và phân tích lượng dữ liệu lớn một cách hiệu quả.
Phát triển Web
Java là lựa chọn hàng đầu trong phát triển ứng dụng web nhờ vào các framework như Spring, Hibernate, và Struts. Java giúp xây dựng các ứng dụng web mạnh mẽ, bảo mật và có khả năng mở rộng tốt.
Trí tuệ nhân tạo (Artificial Intelligence – AI)
Java cũng được sử dụng trong trí tuệ nhân tạo (AI) nhờ vào tính năng đa luồng và khả năng mở rộng. Các thư viện Java hỗ trợ các mô hình học máy, xử lý ngôn ngữ tự nhiên và các thuật toán AI như Deeplearning4j, Weka, và Apache Mahout.
Internet of Things (IoT)
Java là một ngôn ngữ phổ biến trong Internet of Things (IoT) nhờ vào khả năng tương thích với các thiết bị nhúng và hệ thống nhúng nhỏ gọn. Các hệ thống IoT yêu cầu tính bảo mật, độ ổn định, và khả năng hoạt động trên nhiều nền tảng, điều mà Java có thể đáp ứng tốt.
Ứng dụng Doanh nghiệp
Java từ lâu đã là lựa chọn hàng đầu trong việc xây dựng các hệ thống quản lý doanh nghiệp như ERP, CRM, và các hệ thống quản lý quy trình kinh doanh phức tạp. Với Java Enterprise Edition (Java EE), các doanh nghiệp có thể phát triển các ứng dụng lớn, phức tạp và bảo mật.
Các phiên bản của Java
Java Standard Edition (Java SE) – Là một nền tảng cơ bản cho phép phát triển giao diện điều khiển, các ứng dụng mạng và các ứng dụng dạng Win Form.
Java Enterprise Edition (Java EE) – Được xây dựng trên nền tảng Java SE, giúp phát triển các ứng dụng web, các ứng dụng ở cấp doanh nghiệp, …
Java Mobile Edition (Java ME) – Là một nền tảng cho phép phát triển các ứng dụng nhúng vào các thiết bị điện tử như mobile,…
Hướng dẫn tải và cài đặt Java trên Windows
Việc tải về và cài đặt Java trên máy tính Windows của bạn không hề phức tạp nếu bạn làm theo từng bước hướng dẫn của chúng tôi. Quá trình này khá giống nhau trên tất cả các phiên bản Windows, ở đây TopDev sẽ thực hiện trên Windows 11.
Chọn phiên bản JDK mới nhất. Trong ví dụ này, phiên bản mới nhất có sẵn là JDK 22 .
Truy cập vào tab Windows .
Nhấp vào liên kết tải xuống x64 Installer
Lúc này tệp JDK sẽ bắt đầu tải xuống (bao gồm JRE).
Bước 2: Setup Java trên hệ thống Windows
Nhấp đúp vào tệp Java đã tải xuống để bắt đầu cài đặt.
Khi màn hình chào mừng của trình hướng dẫn cài đặt xuất hiện, hãy chọn Next để tiếp tục.
Chọn thư mục đích cho các tệp cài đặt Java hoặc giữ nguyên đường dẫn mặc định và nhấp vào Next.
Quá trình cài đặt hoàn tất khi thông báo Successfully Installed xuất hiện. Nhấp vào Close để thoát khỏi trình hướng dẫn.
Tới đây bạn đã cài đặt thành công JDK 22 trên hệ thống Windows của mình. Để cho phép biên dịch chương trình từ bất kỳ thư mục nào, bạn phải thiết lập biến môi trường Java.
Bước 3: Thiết lập biến môi trường trong Java
Thực hiện theo các bước trong phần bên dưới để cấu hình biến môi trường Java trong Windows.
Thêm Java vào Biến Hệ thống
Bước này đảm bảo rằng Java có thể truy cập được từ dòng lệnh trong bất kỳ thư mục nào.
Mở menu Start và tìm kiếm “environment variables”
Chọn Edit the system environment variables.
3. Chọn Advanced.
4. Nhấp vào Environment variables.
5. Chọn biến Path trong danh mục System variables và nhấp vào Edit.
6. Nhấp vào New.
7. Nhập đường dẫn đến thư mục Java bin..
8. Nhấp vào OK để lưu các thay đổi và thoát khỏi cửa sổ chỉnh sửa biến.
Thêm biến JAVA_HOME
Nhấp vào New trong danh mục System variables để tạo biến mới.
2. Đặt tên biến là JAVA_HOME.
3. Nhập đường dẫn đến thư mục Java JDK của bạn vào trường giá trị biến.
4. Nhấp vào OK.
Bây giờ bạn đã tạo thành công biến môi trường Java trên thiết bị Windows 11 của mình.
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Một namespace trong C# được thiết kế để phân nhóm toàn bộ các kiểu dữ liệu theo một cấu trúc phân cấp. Nhờ có namespace kiểu dữ liệu được quản lí tốt hơn và tránh được hiện tượng xung đột tên. Các tên được khai báo trong một namespace không xung đột với cùng tên đó nhưng được khai báo ở một namespace khác.
Định nghĩa một namespace trong C#
Một định nghĩa namespace trong C# bắt đầu bằng từ khóa namespace theo sau là tên của namespace
Ví dụ 1:
namespace tên_namespace
{
// Khai báo code
}
Để sử dụng các namespace sử dụng toán tử dot (.) sau tên namespace
Ví dụ 2:
namespace Code
{
class Program
{
public static void Print()
{
System.Console.WriteLine("CodeGym");
}
}
}
namespace Gym
{
class Program
{
public static void Main(string[] args)
{
Code.Program.Print();
}
}
}
Ở hàm Main gọi đến phương thức Print của lớp Program nằm trong namespace Code. Kết quả hiển thị lên màn hình là chuỗi kí tự CodeGym.
Từ khóa Using trong C#
Sử dụng từ khóa using để khai báo sử dụng các lớp trong namespace.
Với ví dụ 2 để sử dụng phương thức WriteLine thuộc lớp Console trong namespace System cần phải khai báo đầy đủ là:
System.Console.WriteLine();
Sửa lại mã ở ví dụ 2 sử dụng using:
using System;
using Code;
namespace Code
{
class Class1
{
public static void Print()
{
Console.WriteLine("CodeGym");
}
}
}
namespace Gym
{
class Program
{
public static void Main(string[] args)
{
Class1.Print();
}
}
}
Kết quả hiển thị lên màn hình là chuỗi kí tự CodeGym.
const number =12345.6789// sẽ lấy local mặc định của trình duyệtconsole.log(number.toLocaleString());// 12,345.679 (en-US)console.log(number.toLocaleString('vi-VN'));// 123.456,789
Định dạng tiền tệ
Nếu muốn định dạng tiền tệ, bạn cần sử dụng thêm tham số thứ 2 của hàm toLocaleString
{
style:'currency',
currency:[giá trị ISO4217]// tham số bắt buộc, ko truyền lỗi}
Chuyển đồi thành đơn vị phần % ngoài việc nhân với 100, ns còn thêm 2 tùy chỉnh cũng vui là minimumFractionDigits và maximumFractionDigits (mặc định là 0 và 2 cho kiểu tiền tệ) để lấy số lượng ký tự muốn lấy
Nếu hông ưu Number.prototype.toLocaleString() có thể dùng constructor Intl.NumberFormat. Nếu như thấy sao phải lăng tăng giữa 2 thằng này? Trong trường hợp bạn cần làm việc định dạng này tới lui nhiều lần cho cùng một locale, cùng một tùy chọn cố định, thì bạn nên dùng Intl.NumberFormat cho chuẩn tốc độ.