Các công ty phần mềm nước ngoài tại Việt Nam đóng góp rất nhiều cho việc tạo ra những sản phẩm công nghệ hiện đại và đáp ứng nhu cầu sử dụng của người dùng. Tìm hiểu thêm top các công ty IT đang phát triển tại Việt Nam sẽ giúp bạn đọc có thêm cái nhìn tổng quan về ngành công nghệ thông tin ở nước ta hiện nay.
*Số thứ tự trong bài viết chỉ nhằm liệt kê các công ty, không nhằm mục đích xếp hạng hay đánh giá
Trực thuộc tập đoàn FPT, FPT Software hiện là công ty xuất khẩu dịch vụ phần mềm lớn nhất nhì ở Việt Nam và đang hiện diện tại 11 quốc gia trên thế giới và lớn nhất Đông Nam Á.
2. KMS Technology
KMS Technology Việt Nam là nhà cung cấp hàng đầu về dịch vụ kiểm thử và tư vấn, dịch vụ thiết kế app cũng như các dịch vụ outsourcing khác.
3. Vinova
Trụ sở đặt tại Singapore, Vinova chuyên cung cấp các dịch vụ phát triển ứng dụng web và thiết bị di động sáng tạo, đẳng cấp.
4. Harvey Nash
Harvey Nash được đánh giá rất cao trong dịch vụ thuê ngoài công nghệ thông tin/ dịch vụ nghiệp vụ doanh nghiệp, lĩnh vực tìm kiếm nhân sự cấp cao.
5. Global CyberSoft
Công ty lập trình app GCS được đánh giá là công ty hàng đầu về thiết kế app tại Việt Nam sau hơn 13 năm chính thức gia nhập thị trường. Chất lượng sản phẩm và hoạt động kinh doanh hiệu quả của công ty đã được ghi nhận qua thời gian.
6. Fujinet Systems JSC
Công ty hoạt động chủ yếu cho các khách hàng đến từ Nhật Bản và đã nhiều năm liên tiếp giành được các giải thưởng là công ty hàng đầu trong lĩnh vực IT outsourcing.
7. Netcompany
Với các chi nhánh đặt tại 10 quốc gia, Netcompany cung cấp các giải pháp CNTT quan trọng đối với doanh nghiệp để hỗ trợ phát triển một xã hội bền vững, các doanh nghiệp thành công và cạnh tranh tốt hơn trong thời đại chuyển đổi công nghệ số hiện nay.
8. E.V.O.L.A.B.L.E Asia (Evolable Châu Á tại Việt Nam)
Công ty hoạt động với hình thức “các phòng Lab” – một hình thức mới mẻ của ngành các công ty IT. Evolable định hướng công ty trở thành nhà cung cấp dịch vụ hàng đầu Châu Á.
9. ASUS Việt Nam
Là một trong những thương hiệu IT luôn đạt doanh thu hàng đầu tại Đài Loạn, ở Việt Nam, ASUS khá phổ biến với các dòng sản phẩm là các thiết bị thông minh, máy tính bảng, điện thoại, máy tính…
10. NashTech Vietnam
NashTech Vietnam là công ty thành viên của tập đoàn Harvey Nash đến từ vương quốc Anh. Đây được xem là nơi tập hợp những chuyên gia trong lĩnh vực công nghệ, cung cấp giải pháp thông minh nhằm tạo dựng giá trị thực tiễn cho khách hàng.
11. HANSEN TECHNOLOGIES
Hansen là nhà cung cấp phần mềm và dịch vụ toàn cầu cho ngành năng lượng, nước và truyền thông. Đến nay đã tiếp cận được hơn 600 khách hàng đến từ 80 quốc gia khác nhau.
12. Techbase Vietnam
Công ty Techbase Việt Nam có 100% vốn đầu tư từ Tập đoàn Yahoo Nhật Bản. Hoạt động chính của công ty là phát triển phần mềm cho các sản phẩm của Tập đoàn Yahoo Nhật Bản (hơn 20 dịch vụ).
13. Bosch Việt Nam
Bosch là một trong những công ty hàng đầu trong mảng IT – Consultant trên thế giới. Bosch Việt Nam bắt đầu hoạt động tại Việt Nam từ năm 1994, từ đó đến nay liên tục là công ty đi đầu trong các hoạt động về tăng trưởng doanh thu và môi trường làm việc phát triển.
14. Axon Active Vietnam
Axon Active Việt Nam là một công ty phát triển phần mềm quốc tế có trụ sở chính tại Thụy Sĩ. Tại Việt Nam, Axon Active không chỉ chú trọng đến chất lượng sản phẩm mà cũng rất để tâm đến phát triển môi trường làm việc cho nhân viên.
15. Absolute Software (Vietnam) Ltd
Có trụ sở đặt tại Vancouver, Canada, hoạt động chính của Absolute Software là cung cấp các giải pháp quản lý rủi ro dữ liệu và bảo mật bền vững cho hàng nghìn khách hàng trên toàn cầu.
16. Nexus Frontier Tech
Với các văn phòng đặt tại London, Tokyo, Singapore, Boston và Hà Nội, Nexus Frontier Tech tập trung vào việc phát triển các giải pháp AI cụ thể, hiệu quả nhất cho khách hàng.
Các công ty phần mềm nước ngoài tại Việt Nam sẽ liên tục được cập nhật để người đọc có thêm các thông tin hữu ích. Đón đọc thêm nhiều bài viết khác tại topdev.vn/blog
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
Xét ví dụ chương trình Hello World (in ra dòng chữ Hello World) sau:
Hello.c
/*
* Hello.c
* Created on: Mar 24, 2019
* Author: stackjava
* Description: Writes the words "Hello World!" on the screen
*/
#include
int main() {
// print 'Hello World' to console
printf("Hello World");
return 0;
}
/* hello.c ...*/ phần mô tả file. Cho biết tác giả, ngày tạo và mục đích của file. Phần này cũng có thể coi là một chú thích.
#include <stdio.h> là lệnh tiền xử lý thực hiện khai báo thư viện stdio.h. Thư viện này cho phép chúng ta sử dụng hàm printf()
int main() {...} là một hàm với tên là main, có kiểu giá trị trả về là int
// print 'Hello Worl' to console là một chú thích, dùng để giải thích code cho người đọc, nó sẽ được trình biên dịch bỏ qua khi biên dịch
printf("Hello World \n"); Thực hiện in ra dòng chữ ‘Hello World‘. Chi tiết việc in ra màn hình của hàm printf() được định nghĩa trong file stdio.h
return 0; kết thúc hàm main và trả về kết quả là 0
Phần mô tả file và phần chút thích không gây ảnh hưởng tới chương trình (có cũng được mà không có cũng không sao)
Khi dùng Google Calendar hoặc Reminder.app của macOS, mình rất thích chức năng tạo nhanh một event bằng cách nhập vào nội dung một cách tự nhiên như khi đang nói, ví dụ:
get hair cut at 10am every Sunday
hoặc là
doctor appointment at 1pm on Monday
Khi nhận được input như này, một event mới sẽ được tạo ra với ngày và giờ tương ứng, còn nội dung của event sẽ là phần text mở đầu, ví dụ “get hair cut”, hoặc “doctor appointment”.
Thường thì cái gì mình thích, mình sẽ tìm cách clone lại, chức năng này cũng ko ngoại lệ.
Vì bài viết này là phần tiếp theo của bài viết trước, chúng ta sẽ tiếp tục dùng Rust và Nom. Recommend các bạn đọc kĩ phần trước, và chuẩn bị những kiến thức cơ bản của Rust, nhất là về Result, Option, cargo test, trước khi đọc tiếp bài này.
Đây không phải là cú pháp mà Google Calendar hay Reminder.app sử dụng, nhưng đây sẽ là cú pháp chúng ta sẽ dùng trong bài viết này, đơn giản là vì nó… đơn giản
Cấu trúc của một event input là một tổ hợp của nhiều token như sau:
Trong đó:
<event-text> là nội dung của event cần tạo.
<time> là thời gian diễn ra event, có thể nhập thời gian ở 2 dạng: at 10pm hoặc 11:32. Từ khóa “at” có thể được bỏ đi, phần meridiem indicator (“am” hoặc “pm”) cũng là optional.Một token <time> sẽ có dạng:
Nếu chỉ có giá trị giờ (hour) mà không có phút (minutes) thì mặc định sẽ là 00 phút.
<repeat> và <date>: Hai token này đi chung với nhau vì đôi lúc, những event sẽ lặp lại định kỳ (ví dụ nhắc trả bill hàng tháng, ví dụ every 15th), cũng có thể chỉ diễn ra một lần (on Monday), giá trị on hoặc every sẽ được dùng để xác định token <repeat>.
date = ?("on"|"every") + date
Để cho đơn giản thì chúng ta sẽ tạm bỏ qua việc xác thực nội dung nhập vào, nên những case như thế này vẫn sẽ được chấp nhận:
32:42pmhoặc
24:59
Trên thực tế, validation cũng không phải là nhiệm vụ của parser.
Thuật toán parse event
Vậy ta sẽ parse nội dung như thế nào sau khi đã xác định được 3 thành phần trên?
Thuật toán parse của chúng ta sẽ duyệt từng kí tự từ đầu đến cuối string, và tìm cách parse ra từng token.
Chạy từ đầu input cho đến trước khi ta gặp phần tử đầu tiên của một <time> token, lưu tất cả kí tự đã gặp lại:
Tiếp theo, khi bắt gặp phần tử đầu tiên của <time> token (là chữ “at”), cho đến cuối (là khi đọc được phần meridiem indicator “am” hoặc “pm”) ta sẽ bắt đầu quá tình parse <time> token.
Sau khi xác định xong <time> token, đi tiếp và nếu gặp “on” hoặc “every”, ta sẽ bắt đầu parse <date> token.
Sau khi đã xác định được <time> token và <date> token, thì phần nội dung chúng ta đã lưu lại từ đầu chính là <event-text>. Đến lúc này ta hoàn tất quá trình parse.
Implementation
Xác định xong cú pháp và thuật toán là coi như giải quyết xong 75% bài toán rồi, 95% còn lại nằm ở việc đánh nhau với Rust bây giờ ta implement thôi.
Việc đầu tiên là define ra cấu trúc dữ liệu cho kết quả sau khi parse, ta sẽ gọi nó là ReminderEvent:
Một ReminderDate sẽ chứa content là một chuỗi thô chưa qua xử lý, ví dụ như “Tuesday”, “14/12”. Bao giờ cần xài thì parse tiếp sau, trong bài viết này mình sẽ lưu raw. Nếu đây là một event diễn ra định kì (có chữ “every” khi parse date), thì trường repeated sẽ là true.
Một ReminderTime chứa các giá trị giờ / phút dưới dạng chuỗi thô, giá trị meridiem indicator sẽ được lưu trong trường meridiem, vì nó có thể có, có thể không tồn tại trong input, mặc định sẽ là true cho “am”, và false cho “pm”.
Vì các giá trị raw được lưu dưới dạng string slice &str, tham chiếu trực tiếp từ input, bản thân Rust compiler không tự suy ra được lifetime cho các giá trị này, nên ta phải tự annotate bằng <'a>.
Tiếp theo, kế hoạch thực hiện sẽ là:
Viết hàm parse ReminderTime
Viết hàm parse ReminderDate
Sau đó kết hợp 2 hàm này để viết hàm parse ReminderEvent
Hàm parse ReminderTime
Ở bài trước ta đã biết, một parser dùng Nom sẽ có dạng fn(&str) -> IResult, hàm parse_time của chúng ta cũng sẽ có dạng như thế:
Trước khi bắt tay vào code, mình có thói quen viết trước một vài test case, để khi implement chúng ta sẽ biết được mình có đi đúng hướng hay không. “Má, chém gió vl! ” — Bình luận từ đồng nghiệp của tác giảĐây là một thói quen tốt, các bạn cũng nên làm như vậy, tốn time chút nhưng hiệu quả.
Trong hàm test_parse_time() ở trên, ta tạo một mảng test_times chứa tập các tuple dạng (input, expected_result). Trong đó, các input là các string mà trên thực tế sẽ được nhập vào từ phía user, expected_result là một giá trị kiểu Result, nếu nó là giá trị Ok(...) có nghĩa là input này parse được, còn giá trị Err() là trường hợp lỗi. Mỗi giá trị Ok(...) sẽ có dạng (hour, minute, meridiem). Trong vòng lặp tiếp theo của hàm test, ta duyệt qua từng test case, lấy ra giá trị thực tế actual từ parser (kiểu ReminderTime) và so sánh nó với từng giá trị trong tuple test.
Có test rồi thì ta có thể implement được rồi, quay lại hàm parse_time, việc đầu tiên là dùng các combinator của nom để đọc input, nhắc lại cú pháp của <time> token:
Trước khi đi vào giải thích, đây là hàm parse_time hoàn chỉnh:
fnparse_time(input: &str) -> IResult<&str, ReminderTime> {
let (remain, (_, _, hour, opt_min, _, am)) = tuple((
opt(tag("at")),
multispace0,
digit1,
opt(tuple((tag(":"), digit1))),
multispace0,
opt(alt((tag("am"), tag("pm")))),
))
.parse(input)?;
let (_, minute) = opt_min.unwrap_or(("", "00"));
let meridiem = am == Some("am") || am == None;
Ok((remain, ReminderTime { hour, minute, meridiem }))
}
Để đọc chuỗi “at”, ta có thể dùng hàm tag() của nom, vì “at” có thể có hoặc không xuất hiện trong input, ta dùng hàm opt() để cho nom biết nó là một giá trị optional.
opt(tag("at"))
Tiếp sau “at” là một hoặc nhiều kí tự space, ta dùng multispace0 để xác định nó. Sau đó là hour, cấu thành từ một hoặc nhiều kí tự số, ta dùng digit1 để parse.
Phần giá trị phút minute, thường sẽ đi sau hour, cách nhau bằng một kí tự ':', nó cũng là optional.
opt(tuple(tag(":"), digit1))
Tiếp theo lại là một mớ khoảng trắng nếu có, tiếp tục dùng multispace0.
Cuối cùng là phần meridiem indicator, có thể có hoặc không, ta dùng hàm alt() để parse lấy một trong 2 giá trị tag("am") và tag("pm").
opt(alt((tag("am"), tag("pm"))))
Các giá trị sau khi parse được lưu vào một tuple, mỗi phần tử của tuple sẽ được gán với một biến, lần lượt là remain, hour, opt_min, am. Trong đó remain là phần chuỗi còn sót lại sau quá trình parse.
Vì phần minute là một giá trị optional, kiểu Option, ta cần một bước hậu xử lý để nếu nó là None thì mặc định nó thành giá trị "00".
let (_, minute) = opt_min.unwrap_or(("", "00"));
Tương tự, giá trị am cũng là optional, nhưng ta sẽ có 2 trường hợp: Hoặc nó là Some("am"), hoặc nó là None, nếu đúng thì giá trị meridiem của kết quả trả về sẽ là true, ngược lại nó là false.
let meridiem = am == Some("am") || am == None;
Cuối cùng, nếu mọi thứ ok hết, ta tạo ra một object ReminderTime từ các giá trị đã được xử lý ở trên, và trả về kết quả.
Chạy thử hàm test, ta sẽ thấy mọi thứ đều pass hết, lý do không phải vì test lụi, mà là vì chúng ta code xịn, chả có mấy khi, cứ tự tin lên.
running 1 test
test test_parse_time ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Hàm parse ReminderDate
Tiếp theo là hàm parse parse_date, như trên, ta cũng bắt đầu bằng:
Khá đơn giản, vì phần <date> nằm sau phần <time> token, hai phần này ngăn cách với nhau bằng một hoặc nhiều khoảng trắng, ta dùng multispace0 để parse các khoảng trắng này.
Tiếp theo, để vì nội dung mở đầu của <date> là “on” hoặc “every”, thay vì lấy luôn giá trị raw của chúng dưới dạng string, ta có thể map các giá trị này thành một giá trị kiểu boolean, và dùng luôn giá trị đó để xác định thuộc tính repeated của <date> token. Ta dùng hàm value() để map giá trị “on” thành false, và “every” thành true. Vì phần “on” || “every” là optional, ta wrap biểu thức trên bằng opt().
Sau đó là bước hậu xử lý, giá trị repeat sau khi parse sẽ có 2 trường hợp: Some(true|false) hoặc None, nếu giá trị trả về là None, ta có thể mặc định nó thành false.
Phần còn lại của input sẽ là phần ReminderDate.content, chúng ta chỉ việc lấy ra dưới dạng raw string, xài rest combinator để lấy toàn bộ ra. Nếu phần content là một chuỗi rỗng (empty), thì ta sẽ mặc định nó thành “today”.
Cuối cùng là khởi tạo object ReminderDate rồi trả về kết quả.
Lại tiếp tục chạy test để thấy khả năng code thần sầu của tác giả:
running 1 test
test test_parse_date ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
Như vậy, chúng ta đã hoàn thành 2 building block quan trọng đó là parse_time() và parse_date() để xác định được <time> và <date> token. Bước cuối cùng là kết hợp 2 parser này và parse nội dung input hoàn chỉnh.
Hàm parse ReminderEvent
Xem lại cú pháp của một input event hoàn chỉnh:
<event-text> <time> <repeat> <date>
Đến đây hẳn các bạn cũng đoán được logic của hàm parse_event(), nhưng mà khoan đã, việc đầu tiên là define ra cái hàm:
#[test]fntest_parse_event() {
let test_events: [(&str, Result<(&str, &str, &str, bool, &str, bool), ()>); 10] = [
("go feed the fish at 10am", Ok(("go feed the fish", "10", "00", true, "today", false))),
("feed the fish at 10:00am", Ok(("feed the fish", "10", "00", true, "today", false))),
("walk the dog 10:00am today", Ok(("walk the dog", "10", "00", true, "today", false))),
("feed the cat at 4 tomorrow", Ok(("feed the cat", "4", "00", true, "tomorrow", false))),
("get haircut at 14:24 pm", Ok(("get haircut", "14", "24", false, "today", false))),
("credit card pay at 8am", Ok(("credit card pay", "8", "00", true, "today", false))),
("credit card pay at 8:00 every 20th", Ok(("credit card pay", "8", "00", true, "20th", true))),
("cafe with Justin at Ginza at 6 on 08/23", Ok(("cafe with Justin at Ginza", "6", "00", true, "08/23", false))),
("pick up books at library at 10am every Sunday", Ok(("pick up books at library", "10", "00", true, "Sunday", true))),
("lorem ipsum doro tata", Err(()))
];
for test_case in test_events {
let result = parse_event(test_case.0);
if test_case.1.is_ok() {
let (_, actual) = result.unwrap();
let expected = test_case.1.unwrap();
assert_eq!(actual.text, expected.0);
assert_eq!(actual.time.hour, expected.1);
assert_eq!(actual.time.minute, expected.2);
assert_eq!(actual.time.meridiem, expected.3);
assert_eq!(actual.date.content, expected.4);
assert_eq!(actual.date.repeated, expected.5);
} else {
assert!(result.is_err());
}
}
}
Trong đó input là nội dung event input sẽ được nhập vào từ user, và các field trong Result sẽ là các field tương ứng của object ReminderEvent, ReminderTime và ReminderDate.
Bằng việc kết hợp các hàm parse_time() và parse_date(), ta có thể implement hàm parse_event() một cách rất đơn giản:
fnparse_event(input: &str) -> IResult<&str, ReminderEvent> {
let (input, (vtask, (time, date))) =
many_till(anychar, pair(parse_time, parse_date)).parse(input)?;
let text = vtask
.iter()
.map(|c| c.to_string())
.collect::<Vec<String>>()
.join("")
.trim()
.to_string();
Ok((input, ReminderEvent { text, time, date }))
}
Ta dùng combinator tên là many_till(anychar, ...) để lấy tất cả các kí tự xuất hiện trong input, cho đến khi parse được <time> hay <date> token.
Giá trị trả về của many_till là một vector chứa nhiều kí tự Vec<char>, việc còn lại chỉ là join() chúng lại để thu về một giá trị kiểu String.
Cuối cùng, chạy lại toàn bộ test:
running 3 tests
test test_parse_date ... ok
test test_parse_time ... ok
test test_parse_event ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Như vậy chúng ta đã hoàn thành việc build một parser hết sức đơn giản, để parse một input event dưới dạng ngôn ngữ tự nhiên thành một data struct hoàn chỉnh. Từ đây ta có thể xây dựng được những ứng dụng triệu đô, dư sức cạnh tranh với Google Calendar hay Reminder.app (tự tin không ai đánh thuế mà).
Input:
"write new blog post at 9am every 14th Dec"
Output:
ReminderEvent{ text:"write new blog post", date:ReminderDate{ content:"14th Dec", repeated:true}, time:ReminderTime{ hour:"9", minute:"00", meridiem:true}}
Hy vọng vẫn có bạn đọc xuống được đến tận đây mà không drop giữa chừng và hy vọng bài viết này giúp các bạn hiểu rõ hơn về Nom Parser, cũng như kĩ thuật Parser Combination. Lần tới, khi cần parse một nội dung gì đó, thay vì đâm đầu vào sử dụng RegEx, hãy thử chậm lại một tí và sử dụng Nom hay một thư viện Parser Combination nào đó để build, mình nghĩ ngoài đồng nghiệp ra, thì chính bạn trong tương lai sẽ rất cảm kích cái quyết định đó của bản thân. Chúc các bạn may mắn
Trong các bài viết trước chúng ta sử dụng thư viện Jersey client để gọi các RESTful API. Trong bài này, tôi sẽ giới thiệu với các bạn thư viện khác, rất mạnh mẽ để gọi các RESTful API là OkHttp.
Giới thiệu OkHttp
OkHttp là một thư viện Java mã nguồn mở, được thiết kế để trở thành một HTTP Client hiệu quả với tốc độ tải nhanh và giảm băng thông đường truyền.
Một số đặc điểm nỗi bật của OkHttp:
Hỗ trợ Http/2 protocol.
Connection pooling : giúp giảm độ trợ của các request.
GZIP compression : hỗ trợ nén dữ liệu khi truyền tải.
Interceptor là một tính năng rất hữu ích nó giúp chúng ta có thể chỉnh sửa request/response, retry call, monitor ứng dụng.
OkHttp hỗ trợ 2 loại Interceptor:
Application Interceptor : loại interceptor này thường được sử dụng để thay đổi headers/query cho cả request/ response. Loại interceptor này chắc chắn được gọi 1 lần ngay cả khi nó được truy xuất từ bộ nhớ đệm (Cache).
Network Interceptor : được sử dụng để giám sát yêu cầu giống như được truyền qua mạng. Nó rất hữu ích để theo dõi chuyển hướng (redirect) , thử lại (retry) và cung cấp quyền truy cập vào các resource của request. Loại interceptor này sẽ KHÔNG được gọi nếu nó được truy xuất từ bộ nhớ đệm (Cache).
Bây giờ chúng ta sẽ sử dụng Interceptor để tự động thêm Token vào mỗi request, chúng ta không cần thêm nó một cách thủ công trong từng request. Ví dụ bên dưới sử dụng 2 Interceptor:
AuthInterceptor : thêm Token vào mỗi request.
LoggingInterceptor : log trước khi gửi request và sau khi nhận response.
String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
longt2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s", response.request().url(),
(t2 - t1) / 1e6d, response.headers()));
returnresponse;
}
}
Để sử dụng Interceptor, chúng ta cần đăng ký với Client thông qua phương thức addInterceptor() hoặc addNetworkInterceptor(). Chương trình bên dưới, tôi đăng ký AuthInterceptor ở mức Application và LoggingInterceptor cho cả 2 mức Application và Network.
Chạy ứng dụng, các bạn sẽ thấy nó có cùng kết quả với ví dụ đầu tiên. Tuy nhiên, chúng ta không cần quan tâm đến token nữa. Mọi thứ đã được handle trong AuthInterceptor.
Trên đây là những thông tin cơ bản về OkHttp, ngoài ra chúng ta có thể upload, download file khi sử dụng retrofit. Trong java thường nếu xử lý trên web thì ít khi dùng đến thư viện OkHttp, thư viện này được sử dụng chủ yếu trong các ứng dụng Android để thao tác từ client đến server. Hy vọng bài viết giúp ích cho các bạn, hẹn gặp lại ở các bài viết tiếp theo.
Xét một tình huống thường gặp trong lập trình: Giả sử ta có một interface kiểu Shape, và 2 class là Rectangle, Circle cùng implement interface Shape, sau đó ta tạo một danh sách tên là shapes để chứa tất cả các đối tượng có implement Shape.
pubtraitShape {}
pubstructRectangle {}
impl Shape for Rectangle {}
pubstructCircle {}
impl Shape for Circle {}
fnmain() {
let shapes: Vec<Box<dyn Shape>> = vec![
Box::new(Rectangle {}),
Box::new(Circle {}),
];
}
Trong quá trình làm việc với mảng shapes, có lúc chúng ta muốn lấy một giá trị ra và cast nó về kiểu Rectangle hoặc Circle để sử dụng, thường thì chúng ta sẽ làm như này:
let rect: &Rectangle = shapes.get(0).unwrap().as_ref();
Xong rồi sẽ bị Rust chửi vào mặt:
error[E0308]: mismatched types
--> src/main.rs:15:28
|
15 | let rect: &Rectangle = shapes.get(0).unwrap().as_ref();
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Rectangle`, found trait object `dyn Shape`
| |
| expected due to this
|
= note: expected reference `&Rectangle`
found reference `&dyn Shape`
Lỗi vì shapes là một vector chứa các object kiểu dyn Shape, nên khi dùng hàm get() để lấy một phần tử ra, phần tử đó sẽ mang kiểu dyn Shape.
Để có thể chuyển một object kiểu dyn Shape thành Rectangle, chúng ta có thể implement trait std::any::Any cho kiểu Rectangle.
Kiểm thử phần mềm đang ngày càng phát triển ở Việt Nam và được nhiều người quan tâm biết đến. Trong quá trình tìm hiểu và phát triển nghề nghiệp, mình thấy có những ngộ nhận về kiểm thử phần mềm mà nhiều người (bao gồm kỹ sư kiểm thử phần mềm, lập trình viên, nhà quản lý) thường mắc phải. Dưới đây là 5 ngộ nhận phổ biến đúc kết từ việc nghiên cứu tìm hiểu và kinh nghiệm cá nhân của một kỹ sư kiểm thử phần mềm được coi như “có chút kinh nghiệm” (7 năm).
Ngộ nhận 1: “Không làm lập trình được thì đi làm kiểm thử”
Đây là một trong những ngộ nhận phổ biến nhất về công việc kiểm thử phần mềm. Rất nhiều ứng viên đã chia sẻ như vậy trong những buổi phỏng vấn vào vị trí kỹ sư kiểm thử phần mềm. Họ chia sẻ rằng họ được đào tạo để trở thành lập trình viên nhưng vẫn chưa tìm được việc cho nên họ muốn chuyển qua công việc kiểm thử. Hoặc một dạng câu trả lời khác là tạm thời làm kiểm thử sao đó để chuyển qua làm lập trình viên. Sở dĩ có sự ngộ nhận này là do mọi người ngầm hiểu công việc kiểm thử là rất dễ làm và không cần kiến thức lập trình hoặc kiểm thử là những bước đầu tiên của lập trình.
Thực ra kiểm thử và lập trình là 2 công việc khác nhau và đòi hỏi những kỹ năng chuyên môn khác nhau. Không có gì đảm bảo một lập trình viên giỏi sẽ làm công việc kiểm thử tốt hơn một lập trình viên bình thường hoặc không phải là lập trình viên
Ngộ nhận 2: “Kiểm thử phần mềm ai làm chẳng được…”
Nhiều người quan niệm làm kiểm thử phần mềm rất dễ, chẳng cần biết lập trình, chỉ cần biết sơ sơ về kiến thức tin học và chút tỉ mỉ. Nếu ai đó có quan niệm như vậy thì cần phải nhìn nhận lại. Không có công việc nào là dễ dàng nếu như mình không có đủ kỹ năng cần thiết để làm nó hoặc chưa bao giờ làm nó. Nhiều người sau một thời gian làm công việc kiểm thử cũng nhận định công việc kiểm thử “cũng dễ thiệt”. Tuy nhiên, họ không nhận ra rằng làm được việc và làm xuất sắc là khác nhau. Kiểm thử phần mềm đòi hỏi những kỹ năng chuyên môn mà không phải ai cũng có sẵn như sự đam mê, tò mò, khả năng sáng tạo, khả năng quan sát, phân tích, trình bày, tranh luận, vv…và cả kiến thức lập trình. Kiểm thử phần mềm là một nghệ thuật mà đã là nghệ thuật thì không phải ai cũng có thể đam mê và làm được.
Ngộ nhận 3: “Cái gì…thời buổi này còn kiểm thử thủ công?”
Trong vài năm trở lại đây, mọi người đã được biết đến nhiều hơn về kiểm thử tự động. “Người người nhà nhà” làm kiểm thử tự động. Đi một vòng mấy website về tuyển dụng, số lượng tuyển dụng cho vị trí kiểm thử tự động tăng cao. Điều đó tạo nên một trào lưu làm kiểm thử tự động khiến cho nhiều người ngộ nhận là đây là thời đại của kiểm thử tự động và kiểm thử thủ công được gọi là “kiểm thử chân tay” mang hàm ý mỉa mai.
Kiểm thử tự động và kiểm thử thủ công thực ra là 2 cách tiếp cận việc kiểm thử hoàn toàn khác nhau. Kiểm thử tự động có thể thích hợp cho việc kiểm thử đệ quy, unit test nhưng kiểm thử tự động không thể giúp tìm được nhiều lỗi sản phẩm hơn. Một điều mà nhiều người vẫn hay quên rằng ngay cả công cụ kiểm thử tự động cũng có lỗi (dĩ nhiên là có rồi, con người phát triển mà) và chắc chắn là ít ra vẫn sẽ cần kỹ sư kiểm thử phần mềm để tìm lỗi cho nó.
Ngộ nhận 4: “Kiểm thử làm chi cho tốn kém”
Rất nhiều người nghĩ kiểm thử là công việc tốn kém không cần thiết. Tại sao phải kiểm thử khi mình đã có những lập trình viên “pro”/”xuất sắc”/“siêu”. Thứ nhất, “pro”, “xuất sắc”, “siêu” hay những mỹ từ nào để nói về năng lực của lập trình viên là những từ ngữ mang tính tương đối. Thứ hai, đã là người là có sai sót.
Những người có quan niệm “kiểm thử là tốn kém” thì họ sẽ nhận ra thế nào tốn kém đúng nghĩa khi sản phảm đưa ra thị trường và bị phàn nàn về chất lượng sản phẩm. Chi phí để vá lỗi thì có thể cân đo đong đếm được còn chi phí để lấy lại niềm tin đã mất của khách hàng thì không biết đo làm sao. Lúc đó nhiều người sẽ nói “ Giá như, giá như có đội kiểm thử thì tốt biết bao…”
Một quan niệm khác cũng nguy hiểm không kém là để lập trình viên kiểm thử luôn sản phẩm. Tại sao không chứ? Không ai hiểu sản phẩm tốt hơn người đã làm ra nó. Có thể đúng nhưng không phải ai cũng có thể nhận ra lỗi của mình hoặc đủ dũng cảm và sự khách quan để thừa nhận lỗi của mình (Ở đây mình đang giả định là lập trình viên có đầy đủ kỹ năng của một kỹ sư kiểm thử phần mềm chuyên nghiệp, có thể làm 16 tiếng/1 ngày và chỉ nhận lương bằng với một lập trình viên chuyên code và làm 8 tiếng/1 ngày).
Ngộ nhận 5: “Kiểm thử rồi mà sao ứng dụng vẫn còn lỗi vậy?”
Oh, mấy sếp hay hỏi câu này. Bất cứ sản phẩm nào cũng sẽ có lỗi cho dù đội kiểm thử có chuyên nghiệp bao nhiêu. Muốn kiểm thử và tìm ra tất cả lỗi thì phải có điều kiện cần và đủ. Cần là kiểm thử hết tất cả mọi thứ liên quan đến công việc kiểm thử như các loại kiểm thử, kỹ thuật kiểm thử, phương pháp tiếp cận, cấp độ kiểm thử (xem thêm https://en.wikipedia.org/wiki/Software_testing). Cho dù có được điều kiện cần thì vẫn phải cần điều kiện đủ là có đủ thời gian để kiểm thử. Ngày nay, dưới áp lực của việc đưa sản phẩm ra thị trường càng sớm càng tốt để tăng tính cạnh tranh cho sản phẩm cho nên nhiều người đã chọn giải pháp là rút ngắn giai đoạn kiểm thử hoặc chấp nhận sản phẩm ra thị trường với những lỗi “chấp nhận được”. Dĩ nhiên, nói như thế không có nghĩa là kỹ sư kiểm thử phần mềm có quyền thở phào nhẹ nhõm và thờ ơ với công việc kiểm thử của mình. Trách nhiệm vẫn sẽ thuộc về kỹ sư kiểm thử phần mềm nếu như những lỗi đó nằm trong phạm vi kiểm thử.
Mình vừa chia sẻ 5 ngộ nhận phổ biến về công việc kiểm thử phần mềm. Những ngộ nhận trên cũng chính là những quan sát nhận định của chính mình trong thời gian làm công việc kiểm thử ở vị trí kỹ sư kiểm thử phần mềm hoặc trưởng nhóm kiểm thử. Những nhận định trên là mang tính chủ quan và có thể chỉ có giá trị tại thời điểm khi viết bài này và không loại trừ khả năng chính mình cũng đang ngộ nhận. Sự ngộ nhận tuy không xấu nhưng đừng để sự ngộ nhận cản trở bạn trở thành một kỹ sư kiểm thử phần mềm chuyên nghiệp hoặc con đường phát triển của công việc kiểm thử phần mềm. Một công việc đầy thử thách nhưng cũng không kém phần thú vị.
Tạo ứng dụng Java RESTful Client với thư viện Retrofit
Bài viết được sự cho phép của tác giả Giang Phan
Trong các bài viết trước chúng ta sử dụng thư viện Jersey client, OkHttp để gọi các RESTful API. Trong bài này, tôi sẽ giới thiệu với các bạn thư viện khác là Retrofit.
Giới thiệu Retrofit
Retrofit là một type-safe HTTP client cho Java và Android được phát triển bởi Square. Retrofit giúp dễ dàng kết nối đến một dịch vụ REST trên web bằng cách chuyển đổi API thành Java Interface.
Tương tự với các thư viện khác, Retrofit giúp bạn dễ dàng xử lý dữ liệu JSON hoặc XML sau đó phân tích cú pháp thành Plain Old Java Objects (POJOs). Tất cả các yêu cầu GET, POST, PUT, và DELETE đều có thể được thực thi.
Retrofit được xây dựng dựa trên một số thư viện mạnh mẽ và công cụ khác. Đằng sau nó, Retrofit làm cho việc sử dụng OkHttp để xử lý các request/ response trên mạng. Ngoài ra, từ Retrofit2 không tích hợp bất kỳ một bộ chuyển đổi JSON nào để phân tích từ JSON thành các đối tượng Java. Thay vào đó nó đi kèm với các thư viện chuyển đổi JSON sau đây:
Một đối tượng có thể được chỉ định để sử dụng làm phần thân yêu cầu HTTP với Annotation @Body.
@POST("/api/v1/users")
Call createUser(@Body User user);
Form encoded and Multipart
Các phương thức cũng có thể được khai báo để gửi dữ liệu được mã hóa và dữ liệu multipart. Dữ liệu được mã hóa theo form được gửi khi @FormUrlEncoded được chỉ định trên phương thức. Mỗi cặp key-value được chú thích bằng @Field chứa tên và đối tượng cung cấp giá trị.
Các yêu cầu multipart được sử dụng khi @Multipart xuất hiện trên phương thức. Các phần được khai báo bằng cách sử dụng @Part. @Multipart thường được sử dụng để truyền tải file.
Các method của chúng ta sử dụng Call để nhận kết quả trả về.
Call : là một invocation của các method trong Retrofit được sử gửi request lên server và nhận kết quả trả về.
ResponseBody : là kiểu dữ liệu của response về từ server. Do tất cả API của Server trả về là String nên chúng ta sẻ sử dụng ResponseBody. Nếu response trả về là json Order, các bạn có thể sử dụng trực tiếp Call<User>.
Để sử dụng các method này, chúng ta sẽ tạo một Retrofit client:
Trong ví dụ này, tôi sử dụng phương thức call.execute() để gửi request lên server và nhận kết quả trả về. Phương thức này được thực thi đồng bộ (Synchronous). Nếu bạn muốn gửi request bất đồng bộ, có thể sử dụng phương thức call.enqueue(callback).
Sử dụng Interceptor với OkHttp
Trong ví dụ trên, ở mỗi phương thức chúng ta đều phải thêm một tham số authentication để gửi lên server. Cách làm này khá là phiền phức. Để giải quyết vấn đề này, chúng ta có thể sử dụng Interceptor, một tính năng đã được hỗ trợ trong OkHttp. Với Retrofit chúng ta cũng có thể sử dụng Interceptor, do nó sử dụng toàn bộ OkHttp như một phần implement của nó.
Bây giờ chúng ta sẽ sử dụng Interceptor để tự động thêm Token vào mỗi request, chúng ta không cần thêm nó một cách thủ công trong từng request. Ví dụ bên dưới sử dụng 2 Interceptor:
AuthInterceptor : thêm Token vào mỗi request.
LoggingInterceptor : log trước khi gửi request và sau khi nhận response.
String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
longt2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s", response.request().url(),
(t2 - t1) / 1e6d, response.headers()));
returnresponse;
}
}
Để sử dụng Interceptor, chúng ta cần đăng ký với Client thông qua phương thức addInterceptor() hoặc addNetworkInterceptor(). Chương trình bên dưới, tôi đăng ký AuthInterceptor ở mức Application và LoggingInterceptor cho cả 2 mức Application và Network.
Chạy ứng dụng, các bạn sẽ thấy nó có cùng kết quả với ví dụ đầu tiên. Tuy nhiên, chúng ta không cần quan tâm đến token nữa. Mọi thứ đã được handle trong AuthInterceptor.
Trên đây là những thông tin cơ bản về Retrofit, ngoài ra chúng ta có thể upload, download file khi sử dụng retrofit. Tương tự OkHttp, Retrofit được sử dụng chủ yếu trong các ứng dụng Android để thao tác từ client đến server. Tuy nhiên, chúng ta hoàn toàn có thể sử dụng nó một cách dễ dàng với Rest Client trong ứng dụng java web.
ps – hiện những tiến trình đang hoạt động tích cực
top – hiện tất cả các tiến trình đang hoạt động
kill pid – ép thoát tiến trình có mã pid
killall proc – ép thoát các tiến trình tên proc *
bg – hiện các công việc đã kết thúc hoặc đang chạy nền; tiếp tục một công việc đã tạm ngừng
fg – ngừng chạy nền (chuyển sang foreground) với công việc gần đây nhất
fg n – ngừng chạy nền với công việc n
Quyền sử dụng tập tin
chmod octal file – thay đổi quyền sử dụng của tập tin file thành octal. Mỗi chữ số ứng với từng tài khoản có được bằng cách cộng các số sau:
4 – đọc (r)
2 – ghi (w)
1 – thực thi (x)
Ví dụ:
chmod 777 – tất cả đều có đủ 3 quyền
chmod 755 – rwx cho người sở hữu, rx cho nhóm sở hữu và các tài khoản khác
Xem man chmod để biết thêm chi tiết.
SSH
ssh user@host – kết nối đến máy host với tài khoản user
ssh -p port user@host – kết nối đến máy host qua cổng port với tài khoản user
ssh-copy-id user@host – thêm khóa công cộng của tài khoản user vào máy host để thiết lập đăng nhập không cần mật khẩu (đăng nhập có khóa) Tìm kiếm
grep pattern files – tìm mẫu lặp pattern trong các tập tin files grep -r pattern dir – tìm mẫu lặp pattern trong thư mục dir và tất cả các thư mục con (recursive)
command | grep pattern – tìm mẫu lặp pattern trong đầu ra của lệnh command
locate file – tìm tất cả các tập tin có tên file
Thông tin hệ thống
date – hiện ngày giờ hiện tại
cal – hiện lịch tháng này
uptime – hiện thời gian từ lúc bật máy
w – hiện những người đang đăng nhập
whoami – hiện tên tài khoản của bạn
finger user – hiện thông tin về tài khoản user
uname -a – hiện thông tin về nhân HĐH
cat /proc/cpuinfo – hiện thông tin về CPU
cat /proc/meminfo – hiện thông tin về bộ nhớ
man command – hiện hướng dẫn cho lệnh command
df – hiện mức sử dụng đĩa
du – hiện dung lượng thư mục
* Hiện top 10 file dung lượng lớn trong thư mục /var: du -a /var | sort -n -r | head -n 10
free – hiện dung lượng bộ nhớ trống và lượng bộ nhớ tráo đổi (swap) đã dùng
whereis app – hiện đường dẫn của ứng dụng
app which app – cho biết lệnh nào sẽ được chạy mặc định thay cho app
Nén
tar cf file.tar files – tạo một tập tar có tên file.tar chứa các tập tin khác
tar xf file.tar – giải phóng các tập tin từ file.tar
tar czf file.tar.gz files – tạo một tập tar có nén bằng Gzip
tar xzf file.tar.gz – giải nén một tập tar bằng Gzip
tar cjf file.tar.bz2 – tạo một tập tar có nén bằng Bzip2
tar xjf file.tar.bz2 – giải nén một tập tar bằng Bzip2
gzip file – nén file và đổi tên thành file.gz
gzip -d file.gz – giải nén file.gz
Mạng
ping host – gửi lệnh ping đến máy host và hiện kết quả
whois domain – kiểm tra thông tin whois của tên miền domain
dig domain – kiểm tra thông tin DNS của tên miền domain
dig -x host – tìm ngược tên miền của máy host
wget file – tải tập tin file
wget -c file – tiếp tục tải tập tin đang dở
Cài đặt
Cài đặt từ mã nguồn:
./configure
make
make install
dpkg -i pkg.deb – cài gói phần mềm (Debian)
rpm -Uvh pkg.rpm – cài gói phần mềm (RPM)
Phím tắt
Ctrl+C – dừng hoàn toàn lệnh đang chạy
Ctrl+Z – tạm dừng lệnh hiện tại, tiếp tục chạy nền bằng lệnh bg hoặc chạy chính với lệnh fg
Ctrl+D – thoát khỏi phiên làm việc hiện tại, giống với exit
Ctrl+W – xóa một từ trong dòng hiện tại
Ctrl+U – xóa cả dòng
Ctrl+R – hiện danh sách các lệnh gần đây !! – lặp lại lệnh gần đây nhất exit – thoát khỏi phiên làm việc hiện tại
Storyboard đồng thời đảm nhiệm việc kết nối các màn hình với nhau.
Mỗi màn hình được quản lý bởi một View Controller và chứa các View để thể hiện giao diện.
Các màn hình được kết nối với nhau bởi các đối tượng segue. Segue giúp bạn tạo hiệu ứng chuyển cảnh và truyền dữ liệu qua lại giữa các màn hình.
Storyboard sẽ thể hiện cho bạn một bức tranh toàn cảnh về các màn hình và mối quan hệ giữa các chúng. Do đó bạn có thể sử dụng Storyboard để thiết kế và quản lý giao diện các màn hình cho ứng dụng của bạn.
II.Cách làm việc với Storyboard
Cách tạo storyboard mới các bạn click vào File –> New –>File –>Storyboard
Và giờ các bạn chọn nơi lưu
Một project chúng ta có thể tạo một hoặc nhiều storyboard để quản lý các màn hình.
Khi làm việc với các tập tin storyboard thì Xcode sẽ sử dụng một công cụ đặc biệt là Interface Builder.
Interface builder cung cấp một môi trường kéo thả giúp lập trình viên có thể dễ dàng thêm, chỉnh sửa và xoá các thành phần UI tham gia vào ứng dụng.
Mỗi một màn hình trong ứng dụng sẽ tương ứng với một scene trong storyboard.
Khi tạo 1 project mới chúng ta chỉ có 1 scene tương ứng với 1 màn hình trống trong ứng dụng.
Mũi tên ở phía tay trái trong cửa sổ interface builder chỉ vào scene này được gọi là điểm bắt đầu của storyboard.
Scene ứng với điểm đầu tiên sẽ được chạy đầu tiên khi ứng dụng bắt đầu chạy.
Hy vọng bài hôm nay sẽ giúp các bạn hiểu rõ về storyboard trong Xcode
Lương là một trong những thước đo quan trọng được nhiều người dùng để lựa chọn công việc cho bản thân. Một công ty có thu nhập tốt luôn là yếu tố thu hút đông đảo các ứng viên ứng tuyển. Vậy ở Việt Nam hiện tại có những công ty nào đang trả lương cao nhất? Bài viết dưới đây sẽ tổng hợp top những công ty trả lương cao nhất Việt Nam cho người đọc có cái nhìn tổng quan hơn về thị trường lao động.
Top các công ty trả lương cao nhất Việt Nam
*Số thứ tự trong bài viết chỉ nhằm liệt kê các công ty, không nhằm mục đích xếp hạng hay đánh giá
1. Hãng hàng không Quốc gia Việt Nam – Vietnam Airlines
Thu nhập bình quân của các nhân viên đang làm việc tại Vietnam Airlines hiện nằm trong khoảng từ 25 – 40 triệu đồng/tháng.
Thu nhập bình quân của nhân viên ngân hàng Vietcombank trong năm 2018 là 35,47 triệu đồng/người/tháng. Ngoài ra, chế độ đãi ngộ hấp dẫn mới tiền thưởng cao là một trong những lý do giúp Vietcombank luôn thu hút nhiều nhân tài.
3. Tổng công ty đầu tư và kinh doanh vốn nhà nước SCIC
Thu nhập trung bình của người lao động tại SCIC là 30,4 triệu đồng/tháng.
Mức lương Samsung trả cho người mới vào làm, không có kinh nghiệm thường ở mức khoảng 15 triệu đồng/tháng. Số năm và chất lượng công việc tăng thì tiền lương cũng theo đó tăng lên.
8. Công ty Tân Cảng Sài Gòn SNP
Thu nhập bình quân của người lao động tại SNP rơi vào khoảng 23 triệu đồng/tháng.
Thu nhập bình quân của người lao động tại MB Bank cũng nằm trong top lương cao của các ngân hàng khi nhân viên nhận trên 18 triệu đồng/tháng.
10. Tập đoàn dầu khí Việt Nam PVN
Thu nhập bình quân của người lao động trên 16 triệu đồng/tháng.
11. Công Ty Cổ Phần Ô Tô Trường Hải
Mức lương cứng nhân viên tại Ô Tô Trường Hải nhận được hàng tháng rơi vào khoảng 10 – 12 triệu đồng/tháng chưa kể hoa hồng.
12. Công Ty Cổ Phần Sữa Việt Nam Vinamilk
Mức lương tại Vinamilk luôn là con số hấp dẫn với các ứng viên, tùy thuộc vào vị trí cũng như năng lực làm việc mà nhân viên tại đây sẽ nhận những mức lương khác nhau, trung bình đều trên 10 triệu đồng/tháng.
Thu nhập trung bình tại FPT Software là trên 20 triệu đồng/tháng, khá cao so với mặt bằng chung mức lương trong ngành IT.
(Tiếp tục update)
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
View Controller gồm 2 loại là Content View Controller và Container View Controller.
Content view controller thể hiện nội dung trên màn hình bằng cách sử dụng một view hay một nhóm các view được tổ chức thành một hệ thống view.
Ví dụ: Một dạng của content view controller là table view, được sử dụng để thể hiện dữ liệu dạng bảng (gồm nhiều dòng dữ liệu).
Container view controller là thành phần có khả năng chứa và quản lý nhiều view controller con bên trong.
Ví dụ: Tab bar là một dạng của container view controller. Bên trong Tab bar chứa nhiều tab con, mỗi một tab con là thể hiện của một view controller mà tab bar quản lý.
III.Vòng đời View Controller
Vòng đời của một view controller là được tính từ lúc nó được nạp vào bộ nhớ(RAM) cho tới khi nó bị huỷ khỏi bộ nhớ.
LoadView
Hàm này sẽ được gọi đầu tiên khi khởi tạo một view controller.
viewDidLoad
Khi view controller đã được nạp vào bộ nhớ, thì hàm viewDidLoad được gọi.
Chỉ được gọi một lần duy nhất trong chu kỳ sống của view đó thôi,giống hàm onCreat() trong Android
Thường dùng để chuẩn bị data hoặc là khởi tạo các giá trị mặc định cho các object cũng như UI trên màn hình.
viewDidUnload
Khi app của bạn nhận được cảnh báo từ hệ thống về trạng thái bộ nhớ đang gần hết thì hàm này sẽ được gọi
Tại hàm này sẽ giải phóng bớt các property không cần dùng, gán nil chúng để giải phóng bộ nhớ.
viewWillAppear
Hàm sẽ được gọi trước khi một view được thêm vào hệ thống view và trước animation hiển thị một view.
viewDidAppear
Hàm sẽ được gọi khi một view đã được thêm vài hệ thống view và đã hiển thị lên màn hình.
viewWillDisappear
Gọi khi một view đã được ẩn khỏi màn hình và amination khi ẩn view đó.
viewDidDisappear
Gọi khi một view đã được ẩn khỏi màn hình.
Lưu ý khi load dữ liệu tại các hàm:
Nếu dữ liệu là dạng tĩnh và không thay đổi nhiều, bạn nên load chúng ở phương thức viewDidlLoad.
Nếu dữ liệu là động và thay đổi thường xuyên, bạn nên load tại phương thức viewDidAppear.
Lưu ý là tại 2 phương thức, dữ liệu cần phải load theo dạng bất đồng bộ ở một thread khác để tránh ảnh hưởng đến UI.
Ví dụ:Giờ ta thiết lập 2 màn hình trắng và đỏ.
import UIKit
class ViewController: UIViewController {
overridefunc viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
print(“Man Hinh 1 : View DidLoad”)
}
@IBActionfunc sangmanhinhDo(_ sender: Any) {
let sb = UIStoryboard(name: “Main”, bundle: nil)
let manHinhXanh = sb.instantiateViewController(withIdentifier: “View2Controller”) as! View2Controller
self.navigationController?.pushViewController(manHinhXanh, animated: true)
}
overridefunc viewWillAppear(_ animated: Bool) {
print(“Man Hinh 1 : viewWillAppear”)
}
overridefunc viewDidAppear(_ animated: Bool) {
print(“Man Hinh 1 : viewDidAppear”)
}
overridefunc viewWillDisappear(_ animated: Bool) {
print(“Man Hinh 1 : viewWillDisappear”)
}
overridefunc viewDidDisappear(_ animated: Bool) {
print(“Man Hinh 1 : viewDidDisappear”)
}
Và đây là kết quả sau khi các bạn chạy và khởi động ứng dụng
sẽ gọi 3 func là viewDidLoad, viewWillAppear, viewDidAppear
Nhiều người lầm tưởng rằng CNTT nói chung và lập trình nói riêng là ngành làm việc với máy móc, mình chọn đi theo con đường lập trình cũng vì thích ngồi làm việc với máy móc hơn là phải deal với loài người. Nhưng lầm tưởng là lầm tưởng. Nói theo Kinh tế học Mác Lê thì máy tính chỉ là Tư liệu lao động — Công cụ để con người sử dụng, tạo ra giá trị khi làm việc cùng với nhau.
Như mọi ngành nghề khác, lập trình là công việc đòi hỏi tính tương tác cao giữa con người với con người, và nó chỉ thực sự trở nên hiệu quả khi giao tiếp giữa các thành viên trong team diễn ra trơn tru, hiệu quả.
Mình đã từng lầm tưởng remote work chỉ đơn giản là ôm cái laptop ngồi ở nhà, và code, và rất hí hửng khi công ty cho phép về nhà làm remote. Và rất chán nản khi số lượng các buổi họp hành tăng lên đáng kể khi công ty chuyển sang remote. Mặc cho bác product manager đã cố gắng, trong phạm vi cho phép, bỏ hết các buổi họp không cần thiết. Trong cái khó ló cái ngu các bạn ạ, nghĩ mình làm dev, chỉ cần biết ngồi code chăm chỉ là được, mình tự tin tắt mic, che camera rồi ngồi làm việc của mình, mặc cho các bạn dev khác thảo luận sôi nổi với product manager. Nghĩ như thế là ngon, cần gì chỉ cần trao đổi qua mail và chat là ok. Càng lúc mình càng cảm thấy xa rời dự án và team, bắt đầu xuất hiện cảm giác đuối. Cuối cùng thì tình trạng này kéo theo nhiều hệ lụy khác, mình cũng đánh mất nhiều cơ hội để đóng góp một cách có ý nghĩa vào dự án đang làm và các dự án mới. Nhìn thấy người khác làm việc hiệu quả hơn mình, đâm ra ganh tị với đồng nghiệp, stress với bản thân, dỗi với sếp, thế là mình burn out, và quit.
May mắn là, sau khi quit thì mình lao vào một giai đoạn phỏng vấn mới, và ở giai đoạn này mình được cơ hội nói chuyện với rất nhiều bạn dev ở nhiều môi trường khác nhau, mình không ngại nói cho họ nghe lý do mình nghỉ việc ở công ty cũ, và các bạn ấy cũng nhiệt tình chia sẻ những kinh nghiệm làm việc trong môi trường remote mà họ đúc kết được, vì họ cũng từng trải qua giai đoạn đi xuống như thế giống mình.
Một số kinh nghiệm mà mình đúc kết được sau quá trình đó:
Phải luôn aware được rằng, giao tiếp là yếu tố then chốt để thành công trong một product team. Đồng thời phải biết giao tiếp qua mạng khó hơn giao tiếp trực tiếp rất nhiều lần.
Email và chat không phải là công cụ thay thế hoàn toàn cho việc giao tiếp trong team, đôi lúc 10,000 dòng chat có thể rút gọn bằng 15 phút nói chuyện trực tiếp. Không nên lạm dụng email, chat để tránh né việc phải gọi điện, video call.
Luôn tìm cách engage trong các buổi họp online, bằng cách bật camera lên để cả mình và mọi người biết rằng mình đang tập trung cho buổi họp, tắt camera cũng được nếu bạn tự tin là mình có thể engage tốt.
Không nhất thiết phải ngồi nói huyên thuyên suốt cả buổi họp, nhưng phải biết rằng, người ta invite mình vô một buổi họp vì muốn mình đóng góp giá trị cho buổi họp đó, nếu join vào chỉ để tắt camera mute mic làm việc riêng thì mình đang việc làm sai cách rồi.
Thường chúng ta có xu hướng im lặng, không đặt câu hỏi, không góp ý, ai nói gì cũng gật hoặc đồng tình, khi người nào đó hỏi: “Có ai có câu hỏi gì không?” thì phần lớn chọn cách im lặng. Có một tip khá hay để thoát khỏi tính im lặng bầy đàn này, đó là không ngại hỏi ngu.
Sẽ có nhiều lúc trong một buổi họp, ta tự hỏi là liệu mình có nên nói hay hỏi về chuyện này không nhỉ? Sau đó lại thôi, im lặng không nói gì vì sợ mọi người biết rồi hoặc sợ bị nói là ngu. Thường những khi tự đặt ra câu hỏi như vậy, thì 99% là nên hỏi.
Có đôi lúc vì thiếu tập trung nên mình không biết cuộc họp đang nói về vấn đề gì, dẫn đến không biết gì để mà phát biểu góp ý, những lúc thế này chúng ta có thể chữa cháy bằng cách nhẹ nhàng hỏi lại vấn đề đang được bàn luận, và hỏi tiếp những câu hỏi follow up để gợi mở được hướng thảo luận. (vẫn là về chuyện willing to look stupid).
Những kinh nghiệm này là một phần những gì mình rút ra được từ đợt burnt out vừa qua, nay tiện tay ghi ra không lại quên hết. Tất nhiên là từ trải nghiệm của bản thân mình, YMMV. Còn bạn thì sao? Thời gian làm việc remote vừa qua các bạn cảm thấy thế nào? Nếu không ngại thì hãy comment để chia sẻ ở bên dưới nhé. 😀
Tại Việt Nam hiện nay đã ghi nhận sự góp mặt của rất nhiều các công ty đến từ Nhật Bản, nhất là trong lĩnh vực công nghệ thông tin. Bài viết dưới đây sẽ cung cấp cho người đọc thông tin về top công ty IT Nhật Bản tại Việt Nam đang phát triển mạnh mẽ. Đây chính là cơ sở để người đọc có thể tham khảo và sử dụng cho công việc hoặc tuyển dụng của mình.
TOP Công Ty IT Nhật Bản Tại Việt Nam
*Số thứ tự trong bài viết chỉ nhằm liệt kê các công ty, không nhằm mục đích xếp hạng hay đánh giá
1. Hybrid Technologies – công ty đã và đang phát triển hàng nghìn dự án liên quan đến công nghệ hybrid, lập trình blockchain hay trí tuệ nhân tạo.
2. SoftBank Telecom Việt Nam – chuyên bán, tư vấn các dịch vụ liên quan đến CNTT và mạng như điện toán đám mây, Internet, thiết bị mạng máy chủ…
3. KDDI Việt Nam – là một thành viên của tập đoàn KDDI chuyên cung cấp cơ sở hạ tầng CNTT và xây dựng hệ thống.
4. Koei Tecmo Việt Nam – chuyên về phát triển game như thiết kế Games 3D, chế tác đồ họa, lập trình và kiểm thử…
5. NTT Communication Việt Nam – chuyên phát triển phần mềm, tích hợp hệ thống và mạng lưới…
6. DTS Software Việt Nam – hoạt động trong hai lĩnh vực chính là dịch vụ phát triển và bảo trì hệ thống IT, phần mềm và Business Process Outsourcing.
7. Framgia Việt Nam – phát triển phần mềm cũng như sản xuất các sản phẩm công nghệ trực tuyến. Ngoài ra, công ty cũng nghiên cứu và phát triển các sản phẩm công nghệ mới sử dụng công nghệ AI, Blockchain, VR & AR.
8. Hanatour Japan System Vietnam – chuyên phát triển các hệ thống web ứng dụng và app di động phục vụ cho các công ty thuộc lĩnh vực du lịch và dịch vụ liên quan.
9. System EXE Việt Nam – chuyên tư vấn thiết kế và sản xuất phần mềm quy mô lớn cho các đối tác hàng đầu tại Nhật Bản.
10. Fujinet Việt Nam – công ty chuyên phát triển các phần mềm nghiệp vụ, phần mềm đóng gói, phần mềm điều khiển, phần mềm nhúng,…
11. Evolable Asia – cung cấp dịch vụ phát triển Offshore và LPO/Coding với hình thức “các phòng Lab” hoàn toàn khác biệt so với các dịch vụ IT truyền thống.
Phần mềm Phương Đông là một công ty phát triển phần mềm chuyên nghiệp và là đối tác có giá trị của bạn trong việc sản xuất nhanh chóng các giải pháp phần mềm.
Chúng tôi có ba nguyên lý cơ bản – Đổi mới, Minh bạch và Nhanh nhẹn – trọng tâm của các tương tác giữa nhân viên và khách hàng của chúng tôi
13. Techbase VietNam – chuyên phát triển các lĩnh vực về thương mại điện tử cũng như các dịch vụ truyền thông.
14. 1PAC Việt Nam – cung cấp các dịch vụ về lên kế hoạch, tư vấn và xây dựng các hệ thống và phần mềm theo yêu cầu của khách hàng.
15. SPLUS-SOFTWARE – là một outsourcing company chuyên cung cấp các dịch vụ hỗ trợ và bảo trì phần mềm, kiểm thử phần mềm,…
Hiện tại công ty đang có tuyển dụng các vị trí như:
Hi vọng các thông tin trên đây đã cung cấp cho người đọc thêm một số cái tên công ty chuyên về IT giúp bạn thuận tiện hơn trong công việc. Đón đọc thêm nhiều bài viết bổ ích khác tại topdev.vn/blog với các thông tin được cập nhật liên tục.
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
‘Đấu trường công nghệ’ trong khuôn khổ FPT Techday 2021 có tổng giá trị giải thưởng đến 1 tỷ đồng, dành cho học sinh THCS, THPT, sinh viên và bạn trẻ yêu công nghệ.
Sự kiện công nghệ lớn nhất năm FPT Techday 2021 của FPT sẽ diễn ra dưới hình thức trực tuyến vào ngày 2 và 3/12 với nhiều hoạt động xoay quanh chủ đề “Tái thiết toàn diện, bứt phá trong bình thường xanh” (Thrive in The Green Normal). Trong đó, sân chơi ‘Đấu trường công nghệ’ hằng năm là một trong ba yếu tố thu hút sự quan tâm của hàng nghìn bạn trẻ đam mê công nghệ, bên cạnh cơ hội trải nghiệm triển lãm và các phiên hội thảo chia sẻ về xu hướng công nghệ chuyên sâu.
‘Đấu trường công nghệ’ trong khuôn khổ FPT Techday 2021 có tổng giá trị giải thưởng đến 1 tỷ đồng. Ảnh: FPT Techday 2021
‘Đấu trường công nghệ’
‘Đấu trường công nghệ’ được tổ chức với hai nội dung thi đấu: Avengers Lockdown và Đấu sĩ Coder, dành cho các bạn trẻ từ 12 đến 25 tuổi, biết sử dụng một trong những ngôn ngữ lập trình sau: C#, C++, Java, Js, Go, Python. Tại đây, thí sinh vừa có cơ hội cọ xát, khẳng định năng lực công nghệ của bản thân vừa có thể nhận các giải thưởng với tổng giá trị lên đến 1 tỷ đồng.
Trong đó, Avengers Lockdown sẽ mô phỏng trận chiến với Covid-19. Các đội thi sẽ lập trình các bot hóa thân thành “siêu anh hùng” có nhiệm vụ tham gia truy vết các ca lây nhiễm để khoanh vùng dịch, đưa đi điều trị, truy tìm người tiếp xúc để cách ly tập trung. Kết quả chung cuộc phụ thuộc vào số lượng người dân được cứu và vật phẩm tìm thấy. Mỗi đội chơi không quá 4 người, thi đối kháng với đối thủ để tìm ra đội thắng cuộc.
Đội chiến thắng sẽ nhận được 20 triệu đồng tiền mặt cùng một năm sử dụng tài nguyên AI, Cloud của FPT, trị giá 500 triệu đồng. Giải nhì và ba có phần thưởng lần lượt là 10 và 5 triệu đồng.
Nội dung Đấu sĩ Coder gồm ba bảng thi cho ba đối tượng học sinh THCS, THPT và sinh viên để tìm ra người có khả năng code nhanh và chính xác nhất đề bài từ ban tổ chức. Thí sinh tham gia các trận đấu sẽ code trên nền tảng CodeLearn để giải quyết một số bài toán do ban tổ chức đưa ra. 150 thí sinh có điểm số cao nhất vòng loại ở mỗi bảng đấu (bảng THCS, THPT và sinh viên) sẽ được sắp xếp vào một trong hai trận chung kết.
Giải thưởng ở phần này có giá trị đến 10 triệu đồng mỗi thí sinh (tùy theo từng bảng), cùng hai điện thoại iPhone 13 và hàng trăm phần quà hấp dẫn khác.
Trải nghiệm triển lãm công nghệ “Thành phố xanh thông minh”
Cộng đồng yêu công nghệ sẽ có cơ hội tiếp cận và trải nghiệm đầy đủ về một mô hình thành phố thông minh và an toàn trong dịch bệnh, bối cảnh mới bình thường xanh – “sống chung với đại dịch” tại hạng mục triển lãm công nghệ trên nền tảng trực tuyến.
Với chủ đề Thành phố xanh thông minh (Green Smart City), người xem có thể chứng kiến các hoạt động của chính quyền, tổ chức, doanh nghiệp và đời sống của cá nhân vận hành theo phương thức mới.
Trong đó, mô hình thành phố này xoay chuyển dựa trên nền tảng cốt lõi là công nghệ, thông qua các giải pháp, sản phẩm công nghệ. Từ đó, tái thiết lại hoạt động của lĩnh vực, tổ chức cá nhân – nơi mọi thứ sẽ được kết nối thông minh, chủ động quản trị, linh hoạt ứng phó và đảm bảo an toàn trong mọi tình huống.
Thành phố Xanh Thông Minh (Green Smart City). Ảnh: FPT Techday 2021
Phiên hội thảo chuyên sâu về xu thế công nghệ
Hội thảo quy tụ hơn 50 diễn giả là lãnh đạo các doanh nghiệp, chuyên gia tư vấn, chuyên gia công nghệ hàng đầu trong và ngoài nước như ông Trương Gia Bình – Chủ tịch Hội đồng quản trị FPT; ông Nguyễn Văn Khoa – Tổng giám đốc Tập đoàn FPT; ông Nguyễn Thành Trung – Giám đốc điều hành Sky Mavis; ông Lê Hồng Việt – Tổng giám đốc FPT Smart Cloud; bà Trần Thị Thanh Vân – Phó tổng giám đốc phụ trách Chuyển đổi số và Marketing của Goldsun Media Group; ông Yuichi Ui – chuyên gia Chiến lược Giải pháp và Kiến trúc đa đám mây của VMware…
Trong đó, ở phiên chuyên đề chính, ông Trương Gia Bình sẽ trình bày Sứ mệnh của công nghệ trong bình thường xanh – Công nghệ vị nhân sinh. Nội dung chính gồm: công nghệ cứu sinh mạng (chatbot AI hỗ trợ truy vết, tư vấn, thu thập thông tin các ca bệnh); công nghệ cứu doanh mạnh (FPT eCovax); công nghệ giúp bứt phá kinh tế (Việt Nam và trên toàn cầu) và công nghệ chỉ huy chống dịch.
Ngoài ra, các phiên hội thảo tập trung bàn sâu về các xu thế công nghệ và đưa ra các định hướng phát triển công nghệ tương lai như Blockchain, AI, Cloud… trong nhiều lĩnh vực như bất động sản, tài chính, ngân hàng hay sản xuất.vvvvvv
Hơn 12 năm vận hành và phát triển tại Việt Nam, Home Credit không ngừng ứng dụng công nghệ nhằm giúp khách hàng “Dự định trong tầm tay – Sống vui thêm mỗi ngày”. Và tối ưu hóa trải nghiệm của người dùng trên ứng dụng di động là một phần quan trọng trong việc hiện thực hóa mục tiêu thay đổi cách thế giới mua sắm.
Tham gia ngay sự kiện “Tech Talk: The Evolution of Scalable Mobile Application Development at Home Credit Vietnam” để tìm hiểu về cách vận hành team và cách triển khai các công nghệ mới mà các chuyên gia công nghệ tại Home Credit đã và đang sử dụng trong việc phát triển ứng dụng di động cho hàng triệu người dùng.
Tham gia sự kiện “The Evolution of Scalable Mobile Application Development at Home Credit Vietnam”, bạn sẽ có cơ hội:
Tìm hiểu về sự phát triển ứng dụng di động tại Home Credit Việt Nam đã thay đổi ra sao.
Khám phá cách áp dụng Flutter vào ứng dụng di động để đồng bộ trải nghiệm người dùng, chia sẻ nguồn lực nhằm tối ưu quá trình phát triển của các chức năng cốt lõi được sử dụng bởi hàng triệu người dùng và hàng ngàn nhân sự tại nhiều quốc gia.
Giao lưu và đặt câu hỏi trực tiếp với các chuyên gia đầu ngành để hiểu rõ hơn về các công nghệ, cách thức triển khai và vận hành chúng.
Tham dự mini game và nhận những phần quà hấp dẫn.
Diễn giả trong sự kiện
🌟 Anh PETER ZAJIC, Chief Information Officer – Home Credit Việt Nam
Anh Peter Zajic là người đảm nhiệm tất cả những công việc liên quan đến ứng dụng doanh nghiệp, cơ sở hạ tầng & hệ thống tại Home Credit Việt Nam. Với chuyên môn sâu, khả năng lãnh đạo và truyền cảm hứng mạnh mẽ cho đội nhóm, anh đã có hơn 15 năm liên tục thành công trong việc lãnh đạo các đội nhóm IT của công ty. Hiện tại anh hiện đảm nhiệm chức vụ CIO tại Home Credit Việt Nam.
🌟 Anh LÊ HOÀNG HẢI, Head Of IT Development – Home Credit Việt Nam
Sở hữu hơn 12 năm kinh nghiệm thực chiến từ các dự án quy mô lớn trong nhiều loại công nghệ & lĩnh vực kinh doanh khác nhau, anh hiện là người đóng vai trò quan trọng trong việc xác định các chiến lược Công nghệ và giám sát thực hiện quy trình đầu – cuối (End-to-end) tại Home Credit.
🌟 Anh LÊ HOÀNG VIỆT, IT Information Security Manager – Home Credit Việt Nam
Với nhiều thành tích ấn tượng trong 9 năm hoạt động tại lĩnh vực Công nghệ Đám mây và An toàn Thông tin, anh đóng góp những giá trị to lớn trong việc đảm bảo an toàn cho các nguồn thông tin và điện toán của Home Credit.
🌟 Anh LƯƠNG ĐỖ MINH HƯNG, Senior Mobile Developer – Home Credit Việt Nam
Anh đã có 7 năm kinh nghiệm vững chắc về chuyên môn, kiến thức chuyên sâu về Android & Flutter trong công việc Phát triển ứng dụng di động. Anh đã từng xây dựng thành công các tính năng cốt yếu cho ứng dụng Sendo, đồng thời đóng vai trò quan trọng trong công việc phát triển ứng dụng di động tại Home Credit.
Agenda sự kiện
18:30 – 18:35 | Đón khách và tham gia mini-game
18:35 – 18:40 | Khai mạc sự kiện | Ông Peter Zajic – CIO
18:40 – 19:40 | Topic: “The Evolution of Scalable Mobile Application Development at Home Credit Vietnam” | Anh Lương Đỗ Minh Hưng – Senior Mobile Developer
*Nhằm đảm bảo chất lượng sự kiện, BTC sẽ đóng cổng đăng ký khi số lượng đăng ký đạt giới hạn. BTC sẽ gửi mail xác nhận kèm link tham dự sự kiện khi bạn đăng ký thành công.
“12 nguyên tắc trong Agile” và “tuyên ngôn của Agile” là những phần cốt lõi trong Agile. “Tuyên ngôn của Agile” có thể chung chung và “cao cấp” nhưng 12 nguyên tắc trong Agile sẽ mang tính thực tiễn nhiều hơn.
Thỏa mãn yêu cầu của khách hàng thông qua việc giao hàng sớm và liên tục
Giao phần mềm chạy được cho khách hàng một cách thường xuyên (giao hàng tuần hơn là hàng tháng)
2 nguyên tắc trên mình gom lại với nhau vì cơ bản nó chia sẻ ý tưởng giống nhau là giao hàng sớm, liên tục và chạy được cho khách hàng. Dĩ nhiên mục đích của dự án phát triển phần mềm là phát-triển-phần-mềm và làm khách hàng hài lòng và không có gì làm khách hàng hài lòng hơn việc cho khách hàng thấy được sản phẩm của mình thường xuyên và chạy được. Trong Agile, sản phẩm sẽ được demo cho khách hàng thường xuyên (thường là hàng tuần) để cho khách hàng thấy được sản phẩm của mình như thế nào. Nếu có chỗ nào không ổn hay cần cải tiến thì sẽ phản hồi với đội dự án ngay lập tức. Do đó sẽ giúp tránh được tình huống dở khóc dở cười sau khi hoàn thành sản phẩm như “tôi tưởng anh muốn ABC”, “tôi nghĩ mặc định anh sẽ làm XYZ”, v.v
Chào đón việc thay đổi yêu cầu, thậm chí là những thay đổi yêu cầu muộn
Dù bạn thích hay không thì việc thay đổi yêu cầu từ khách hàng là dường như không thể tránh khỏi và nhiệm vụ của bạn là phải thích ứng với sự thay đổi đó. Thích ứng không có nghĩa là khách hàng yêu cầu gì mình làm cái đó. Khi khách hàng thay đổi yêu cầu, chắc chắn phải có lý do của họ và nhiệm vụ của đội dự án là phải hiểu được lí do đó để có thể điều chỉnh sự thay đổi, tư vấn hay đề nghị giải pháp cho khách hàng tương ứng
Nhà kinh doanh và kỹ sư lập trình phải làm việc cùng nhau hàng ngày trong suốt dự án
“Nhà kinh doanh” ở đây được hiểu nôm na là khách hàng của dự án, những người tài trợ cho dự án. Đội phát triển phải làm việc thường xuyên và gần gũi với khách hàng để hiểu được nhu cầu của họ cũng như cho phép khách hàng hiểu về công việc của đội phát triển. Đó là một trong những lí do mà Agile dường như khó triển khai trong các dự án offshore trong đó rào cản về địa lý, thời gian, ngôn ngữ là một trở ngại lớn.
Các dự án được xây dựng xung quanh những cá nhân có động lực. Cung cấp cho họ môi trường và sự hỗ trợ cần thiết, và tin tưởng họ để hoàn thành công việc
Như đã chia sẻ, Agile đặt trọng tâm là con người. Con người ở đây chỉ những cá nhân có động lực làm việc với tinh thần cộng tác, chia sẻ và giúp đỡ lẫn nhau. Song song đó, đội dự án sẽ được hỗ trợ những công cụ, môi trường, sự tin tưởng và những đãi ngộ cần thiết để hoàn thành công việc.
Trao đổi trực tiếp mặt đối mặt là phương pháp hiệu quả nhất để truyền đạt thông tin
Sự giao tiếp trao đổi giữa những cá nhân là rất quan trọng và để giao tiếp hiệu quả thì không gì có thể hơn được trực tiếp trao đổi mặt-đối-mặt hay dùng những biểu tượng hình ảnh để chuyển tải thông tin. Bạn sẽ dễ bắt gặp một không khí nhộn nhịp hay những hình ảnh minh họa, biểu tượng, hình vẽ đầy màu sắc trong các dự án Agile vì những điều đó giúp trao đổi thông tin hiệu quả hơn.
Phần mềm chạy được là thước đo chính của tiến độ
Thông tin về tiến độ của dự án rất quan trọng, đặc biệt là đối với Ban quản lý hay các nhà đầu tư cho dự án vì những thông tin đó sẽ giúp họ có thể đưa ra những quyết định. Tuy nhiên, suy cho cùng điều mà họ quan tâm thực ra là sản phẩm đang phát triển có hoạt động tốt hay không. Bạn có thể báo tiến độ là “Đúng kế hoạch” nhưng khi được hỏi sản phẩm chạy được chưa thì câu trả lời là “sắp chạy được” hay “chưa chạy được” sẽ làm khách hàng hoang mang. Do đó, trong Agile bạn phải chuẩn bị tinh thần để “show hàng” cho khách hàng xem.
Phát triển bền vững và duy trì được nhịp độ phát triển liên tục
Trong Agile ưu tiên phát triển bền vững và duy trì nhịp độ phát triển liên tục. Đôi khi dự án cần phải làm thêm giờ nhưng chắc chắc bạn không thể làm 10-12 tiếng/ngày trong nhiều tháng liên tục. Theo mình thấy thì thời gian thực sự cho công việc để mang lại hiệu quả cao nhất là khoảng 4-5 tiếng. Nhiều bạn khi làm thêm giờ thì tự nhủ hay “được hứa” rằng đây chỉ là tạm thời nhưng có khi nhìn lại thì sự tạm thời đó đã được vài tháng rồi. Khi bạn cảm thấy mệt mỏi với cường độ làm việc liên tục và thường xuyên thì đó là dấu hiệu cho thấy dự án Agile của bạn đang có vấn đề.
Liên tục quan tâm đến kĩ thuật và thiết kế để cải tiến sự linh hoạt
Liên tục cải tiến các quy trình, phương pháp, công cụ để tăng mức độ linh hoạt trong dự án. Luôn nghĩ đến những phương pháp mới để code tốt hơn, kiểm thử tốt hơn như TDD (Test-driven development) , ATDD (Acceptance Test-driven development), kiểm thử tự động, CI v.v
Sự đơn giản là cần thiết – nghệ thuật tối đa hóa lượng công việc chưa hoàn thành
Agile có nghĩa là linh hoạt và để linh hoạt uyển chuyển thì bạn phải tối giản hóa các công việc mình làm. Những việc nào cần thiết và mang lại giá trị thì mọi người sẽ cùng làm. Tuy nhiên việc xác định việc nào mang lại giá trị nhiều khi không đơn giản. Do đó, để đơn giản thì việc có giá trị là việc mà cả nhóm thống nhất và sẽ cam kết thực hiện. Chẳng hạn cả nhóm có thể thống nhất không phải viết “Báo cáo tiến độ hàng ngày” nếu như mọi người đều biết tiến độ của nhau và sếp của bạn cũng không có nhu cầu đọc. Tương tự, bạn cũng không nhất thiết phải mô tả một con bug dài lê thê chỉ để theo đúng định dạng của hệ thống bug trong khi bạn đã báo và trao đổi với Dev về con bug đó và họ đã sửa nó. Tuy nhiên hãy cẩn thận. Không phải bạn bỏ đi là bạn linh hoạt và tối ưu hóa công việc. Vấn đề là bạn bỏ đi những thứ không mang lại giá trị.
Nhóm tự tổ chức
Đây là nguyên tắc cốt lõi trong Agile đồng thời cũng là nguyên tắc gây đau đầu nhất. Ý tưởng là nhóm và cách thành viên sẽ tự quyết định việc mình làm, tự cam kết và tự chịu trách nhiệm cho chất lượng công việc mình làm. Mục đích là để tăng tính chủ động trong công việc. Dĩ nhiên “tự tổ chức” không phải là bạn tập hợp các thành viên và tuyên bố “nào, nhóm tự tổ chức nhé”. Do đó, ban đầu nhóm cũng phải được hướng dẫn, đào tạo để có thể “tự tổ chức”. Quá trình đó có thể gian nan và việc nhóm bạn “tự tổ chức” đến đâu còn tùy thuộc vào nhiều yếu tố như năng lực, nhận thức của thành viên, khả năng hướng dẫn của người hướng dẫn Agile, sự tin tưởng và tôn trọng của ban lãnh đạo, v.v
Thích ứng thường xuyên với sự thay đổi
Nhóm thường xuyên nhìn nhận đánh giá về tình hình dự án sản phẩm để có thể điều chỉnh và thích ứng. Ý tưởng là nhìn lại để tiến lên. Đó là những buổi họp tập trung vào những cái hay cái dở trong những việc mình đang làm để rút tỉa kinh nghiệm và học hỏi lẫn nhau. Những buổi họp dạng vậy thường là những câu hỏi và tự trả lời. Chẳng hạn như:
“Việc gì chúng ta làm chưa tốt” – Trả lời: “Nhóm không tự tổ chức và làm việc có sức ỳ”
“Chúng ta đã làm tốt những việc gì” – Trả lời: “Nhóm sau đó tự tổ chức và làm việc sung hơn”
“Chúng ta đã học được bài học gì” – Trả lời: “Tăng lương giúp giải quyết nhiều vấn đề”
Mình vừa chia sẻ xong 12 nguyên tắc trong Agile. Tới đây thì các bạn cơ bản đã có thể hình dung về Agile về những giá trị cốt lõi trong Agile cũng như những nguyên tắc để trở nên linh hoạt. Nhưng vấn đề là làm thế nào để có thể trở lên linh hoạt? Trong phần tới mình sẽ giới thiệu các bạn “tuyệt chiêu” trong Agile – SCRUM.
Rất vui nếu nhận ý kiến đóng góp, phê bình, chia sẻ từ các bạn.
Giới thiệu Feign – Tạo ứng dụng Java RESTful Client không thể đơn giản hơn
Bài viết được sự cho phép của tác giả Giang Phan
Trong các bài viết trước chúng ta sử dụng thư viện Jersey client, OkHttp, Retrofit để gọi các RESTful API. Trong bài này, tôi sẽ giới thiệu với các bạn thư viện khác là Feign. Thư viện này giúp chúng ta dễ dàng hơn nữa trong phát triển ứng dụng Rest Client.
Giới thiệu Feign
Feign là một HTTP client cho Java, được phát triển bởi Netflix. Mục tiêu của Fiegn là giúp đơn giản hóa HTTP API Client.
Tương tự với các thư viện khác, Feign giúp bạn dễ dàng xử lý dữ liệu JSON hoặc XML sau đó phân tích cú pháp thành Plain Old Java Objects (POJOs). Tất cả các yêu cầu GET, POST, PUT, và DELETE đều có thể được thực thi.
Feign được xây dựng dựa trên một số thư viện mạnh mẽ và công cụ khác để xử lý các request/ response trên mạng bao gồm OkHttp, JAX-RS, Gson, Jackson, JAXB, Ribbon, Hystrix, SOAP, … Các bạn xem thêm các thư viện khác: https://mvnrepository.com/artifact/io.github.openfeign
Feign hỗ trợ một số tính năng mạnh mẽ khác như: Error Handling, Retry, hỗ rợ default method, static method với interface trong java 8.
Ý tưởng của Feign tương tự như Retrofit là sử dụng interface và các annotation để định nghĩa các phương thức request đến API. Với Retrofit, chúng ta còn gặp một chút phiền phức khi phải gọi xử lý Call<Respone>. Sử dụng Feign chúng ta sẽ không thấy sự khác biệt giữa call các method trong interface thông thường và call thông qua Feign.
Để sử dụng Feign chúng ta thực hiện các bước sau:
Một class object tương ứng với JSON/ XML data.
Một interface dùng để định nghĩa các các phương thức request đến API.
Sử dụng Annotations để mô tả yêu cầu HTTP.
Tạo một Feign.builder() để khởi tạo các phương thức trong interface đã được định nghĩa.
Các Annotations để mô tả yêu cầu HTTP
Request method
Mỗi phương thức phải có Annotation HTTP cung cấp request method và URL. Feign sử dụng @RequestLine để mô tả các thông tin này.
@RequestLine("GET /api/v1/users?sort=desc")
List getUsers();
Header manipulation
Chúng ta có thể set thông tin static header bằng cách sử dụng annotation @Header ở mức method.
Các yêu cầu multipart được sử dụng khi @Multipart xuất hiện trên phương thức. Các phần được khai báo bằng cách sử dụng @Part. @Multipart thường được sử dụng để truyền tải file.
package com.gpcoder.service;
import java.util.ArrayList;
import java.util.List;
import com.gpcoder.model.Order;
import feign.Headers;
import feign.Param;
import feign.RequestLine;
@Headers({
"Accept: application/json; charset=utf-8",
"Content-Type: application/json" })
public interface OrderService {
@RequestLine("GET /orders/{id}")
String getOrder(@Param("id") int id);
@RequestLine("POST /orders")
String createOrder(Order order);
@RequestLine("PUT /orders")
String updateOrder(Order order);
@RequestLine("DELETE /orders/{id}")
String deleteOrder(@Param("id") int id);
default List getOrders(int... ids) {
List orders = new ArrayList<>();
for (int id : ids) {
orders.add(this.getOrder(id));
}
return orders;
}
}
Tương tự Retrofit, chúng ta có thể sử dụng Interceptor – một tính năng của OkHttp để tự động thêm Authentication Token vào mỗi request, chúng ta không cần thêm nó một cách thủ công trong từng request.
Có một vài cách để gửi Authentication Header token lên server: sử dụng @Header, tạo custom Target, sử dụng Interceptor của Feign, sử dụng Interceptor của OkHttp.
Ví dụ bên dưới sử dụng 2 Interceptor:
AuthInterceptor : thêm Token vào mỗi request.
LoggingInterceptor : log trước khi gửi request và sau khi nhận response.
AuthInterceptor.java
package com.gpcoder.interceptor;
import java.io.IOException;
import com.gpcoder.helper.FeignClientCreator;
import com.gpcoder.service.AuthService;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class AuthInterceptor implements Interceptor {
private static String token = null;
@Override
public Response intercept(Chain chain) throws IOException {
/*
* chain.request() returns original request that you can work with(modify,
* rewrite)
*/
Request originalRequest = chain.request();
// Here we can rewrite the request
// We add an Authorization header if the request is not an authorize request and already had a token
Request authRequest = originalRequest;
if (!originalRequest.url().toString().contains("/auth") && getToken() != null) {
authRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer " + getToken())
.build();
}
/*
* chain.proceed(request) is the call which will initiate the HTTP work. This
* call invokes the request and returns the response as per the request.
*/
Response response = chain.proceed(authRequest);
// Here we can rewrite/modify the response
return response;
}
private String getToken() throws IOException {
if (token != null) {
return token;
}
// Create an implementation of the API endpoints defined by the service interface
AuthService authService = FeignClientCreator.getService(AuthService.class);
// Sends a request to a webserver and return its response
return authService.getToken("gpcoder", "gpcoder");
}
}
Tương tự chúng ta sẽ tạo LoggingInterceptor:
LoggingInterceptor.java
package com.gpcoder.interceptor;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(
String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(String.format("Received response for %s in %.1fms%n%s", response.request().url(),
(t2 - t1) / 1e6d, response.headers()));
return response;
}
}
Để sử dụng Interceptor, chúng ta cần đăng ký với Client thông qua phương thức addInterceptor() hoặc addNetworkInterceptor(). Chương trình bên dưới, tôi đăng ký AuthInterceptor ở mức Application và LoggingInterceptor cho cả 2 mức Application và Network.
Chúng ta sẽ tạo một lớp hỗ trợ cấu hình Feign, đăng ký các Interceptor và tạo instance của Feign service.
FeignClientCreator.java
package com.gpcoder.helper;
import com.gpcoder.interceptor.AuthInterceptor;
import com.gpcoder.interceptor.LoggingInterceptor;
import com.gpcoder.service.OrderService;
import feign.Feign;
import feign.Logger;
import feign.form.FormEncoder;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.okhttp.OkHttpClient;
import feign.slf4j.Slf4jLogger;
public class FeignClientCreator {
public static final String BASE_URL = "http://localhost:8080/RestfulWebServiceExample/rest/";
public static T getService(Class clazz) {
okhttp3.OkHttpClient okHttpClient = new okhttp3.OkHttpClient.Builder()
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new AuthInterceptor())
.addNetworkInterceptor(new LoggingInterceptor())
.build();
OkHttpClient feignOkHttp = new OkHttpClient(okHttpClient);
return Feign.builder()
.client(feignOkHttp)
.encoder(new FormEncoder(new GsonEncoder()))
.decoder(new GsonDecoder())
.logger(new Slf4jLogger(clazz))
.logLevel(Logger.Level.FULL)
.target(clazz, BASE_URL);
}
}
Tiếp theo chúng ta sẽ sử dụng Feign service để call các API.
Như bạn thấy, Feign là một thư viện rất mạnh mẽ nhưng rất đơn giản để sử dụng. Hy vọng bài viết giúp ích cho các bạn, hẹn gặp lại ở các bài viết tiếp theo.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Video trong bài viết
Trong bài trước chúng ta đã sơ lược về mô hình MVC, bạn cũng đã được làm quen với Route và View. Trong bài hôm nay, bạn hãy cùng tôi tìm hiểu về Controller, vậy Laravel Controller có phải là Controller trong mô hình MVC, nó được sử dụng cho mục đích gì?.
Laravel Controller
Chúng ta cùng xem định nghĩa Laravel Controller trên tài liệu chính thức của Laravel: Thay vì định nghĩa tất cả các đoạn xử lý logic nghiệp cho yêu cầu trong các file route dưới dạng Closure, chúng ta sẽ tổ chức nó vào các class Controller. Controller giúp nhóm các logic nghiệp vụ cho yêu cầu liên quan vào trong một class. Controller được lưu trong thư mục app/Http/Controllers. Như vậy chúng ta có thể thấy Laravel Controller mang dáng dấp của Controller trong MVC, tuy nhiên nó được phân lớp nhiều hơn, giúp xây dựng ứng dụng tốt hơn.
Khá rối rắm đúng không, bạn không cần quan tâm sâu bên trong, chỉ cần nhớ Controller trong Laravel là các class PHP nằm trong thư mục app/Http/Controllers, về chức năng chúng ta sẽ tìm hiểu dưới đây. Các controller này có thể tạo ra thủ công bằng cách tạo file hoặc thông qua câu lệnh artisan:
Ở đây, AboutController là tên controller, tham số –resource là tùy chọn, tham số này sẽ tạo ra controller với đầy đủ các phương thức cần thiết như index, create, store, update…
Một chú ý nữa là các file controller được tạo ra này sẽ có namespace theo đường dẫn thư mục đến controller. Ví dụ đường dẫn thư mục là app->Http->Controllers thì namespace ở đây sẽ là:
Tham số thứ hai của phương thức get() có thể là một function ở dạng Closure, ngoài ra nó có thể là một chuỗi bao gồm tên của controller và tên của phương thức trong controller cách nhau bởi ký tự @:
Route::get('about','AboutController@index');
Nếu bạn thực hiện luôn sẽ gặp lỗi “Method index doesn’t exist”, do phương thức index không tồn tại trong AboutController. Thêm phương thức index vào:
Quay lại trang http://localhost:8000/about mọi thứ hoạt động bình thường giống như khi chúng ta sử dụng kiểu Closure.
Trong phương thức của controller chúng ta có thể thực hiện rất nhiều công việc như gọi đến một api ở ngoài, thực hiện truy vấn cơ sở dữ liệu hoặc trả về một view như ví dụ ở trên.
Diễn giải một chút về hoạt động của ứng dụng:
Người dùng vào đường dẫn http://localhost:8000/about
Hệ thống kiểm tra trong routes/web.php xem đã định nghĩa chưa, nếu chưa trả về lỗi 404 không tìm thấy yêu cầu, nếu đã định nghĩa thực hiện tiếp nội dung trong tham số thứ 2 có thể là function dạng Closure hoặc chuỗi tên controller và phương thức trong đó, ở đây là ‘AboutController@index’.
AboutController sẽ được tải lên và thực thi phương thức index().
Phương thức index() trả về View about.blade.php tạo ra ở bài trước.
Laravel Blade sẽ xử lý nội dung file blade và trả về người dùng nội dung thuần HTML.
Tóm tắt
Như vậy, sau bài học hôm nay bạn chỉ cần nắm được:
Laravel Controller là class PHP nằm trong app->Http->Controllers.
Nó có thể tạo thủ công hoặc bằng công cụ artisan.
Khi xử lý Route, có thể truyền vào một function hoặc một Controller.
Trong phương thức của controller có thể thực hiện bất cứ công việc nào có liên quan đến việc cuối cùng là trả về View.
Chia sẻ kinh nghiệm sử dụng trình duyệt web an toàn
Bài viết được sự cho phép của blogchiasekienthuc.com
Trình duyệt Web (Microsoft Edge, Google Chrome, Cốc Cốc, Firefox, …) là một trong những cửa ngõ quan trọng (nếu không muốn nói là quan trọng nhất) khi chúng ta truy cập vào Internet.
Nó quan trọng như cánh cửa nhà bạn vậy, việc bạn sử dụng trình duyệt Web không an toàn cũng tương tự như việc bạn đi ngủ mà không đóng cửa vậy. Và chuyện gì xảy ra sau đó thì chắc có lẽ bạn cũng đoán được rồi, thậm chí còn hơn thế nữa là đằng khác.
Và dưới đây là 8 nguyên tắc an toàn mà bạn nên thực hiện khi sử dụng trình duyệt Web, hãy lưu ý kỹ thật kỹ nha các bạn.
#1. Đăng xuất tất cả các tài khoản ngay sau khi sử dụng
Phần lớn các dịch vụ trên Internet như thư điện tử, mạng xã hội, hội thoại trực tuyến, diễn đàn, sàn thương mại điện tử, ngân hàng điện tử, … đều yêu cầu đăng nhập tài khoản trước khi sử dụng.
Nguyên tắc đầu tiên mà bạn cần ghi nhớ đó là, hãy đăng xuất tài khoản ngay sau khi sử dụng xong – nếu đó không phải là máy tính cá nhân của bạn.
Việc không đăng xuất tài khoản ngay sau khi sử dụng xong sẽ là một điều tai hại cho nhiều người dùng. Chưa nói đến các Hacker mũ đen, chỉ cần là người có chút hiểu biết về Công nghệ thông tin là họ đã có thể chiếm đoạt được tài khoản của bạn rồi.
Ngoài ra, khi trình duyệt Web xuất hiện hộp thoại “Bạn có muốn lưu mật khẩu không?” thì bạn nên chọn “Không bao giờ” nhé, vì người dùng có thể dễ dàng lấy được thông tin tài khoản trong phần quản lý của trình duyệt web.
Có một giải pháp hữu hiệu giúp bạn dễ dàng thực hiện nguyên tắc này là hãy sử dụng chế độ duyệt ẩn danh khi sử dụng máy tính công cộng. Hoặc sử dụng chế độ Guest (khách) trên Chrome (nếu bạn sử dụng Google Chrome).
=> Bởi khi sử dụng chế độ duyệt web này thì ngay cả khi bạn tắt trình duyệt nhưng quên không thoát tài khoản thì nó vẫn không bị lưu lại.
Mình luôn sử dụng chế độ này khi sử dụng các máy tính công cộng (như là ở thư viện, cửa hàng dịch vụ truy cập Internet, cửa hàng Photocopy, …)
Để mở nhanh chế độ duyệt web ẩn danh bạn hãy nhấn tổ hợp phím Ctrl + Shift + N nhé. Rất đơn giản thôi thông có gì phức tạp cả.
#2. Không đăng nhập vào tài khoản Google khi sử dụng Google Search
Rất nhiều bạn có thói quen là đăng nhập vào tài khoản Google trong khi sử dụng công cụ tìm kiếm Google Search.
Chúng ta không nên làm như vậy, dựa vào những gì bạn tìm kiếm thì Google sẽ có cái tổng thể về bạn, đôi khi Google hiểu bạn còn nhiều hơn gia đình bạn hiểu bạn.
Hầu hết chúng ta ít hay nhiều đều có bí mật, đã là bí mật mà để cho “người khác” biết thì thực sự không tốt chút nào. Trong trường hợp đặc biệt bạn không có bí mật thì cũng không nên đăng nhập, bởi những gì bạn tìm kiếm có thể trở thành mục tiêu của quảng cáo.
Vậy nên bạn có thể tìm kiếm với web ẩn danh hoặc trong chế độ Guest. Thao tác chưa đến 1 giây đâu các bạn, nhiều khi nói ra thì các bạn bảo là rườm rà với phức tạp, nhưng thực tế thì gần như không tốn thêm thời gian. Nó là thói quen thôi !
#3. Ẩn danh địa chỉ IP bằng cách sử dụng VPN
Hiểu một cách đơn giản thì địa chỉ IP chính là địa chỉ nhà của bạn trên Internet
Trình duyệt web bạn sử dụng, trang web bạn đang truy cập và các nhà cung cấp dịch vụ Internet mà bạn đang dùng sẽ biết được địa chỉ IP của bạn. Bạn không thể ẩn hoàn toàn địa chỉ IP của mình, vì chúng ta cần nó để giao tiếp với Internet.
Tuy nhiên, chúng ta có thể sử dụng VPN để ẩn danh địa chỉ IP (tức là tạo ra một dải địa chỉ IP giả hay còn gọi là Fake IP), hiện tại có khá nhiều nhà cung cấp dịch vụ VPN nổi tiếng, dưới đây là các nhà cung cấp uy tín mà các bạn có thể tham khảo:
StrongVPN
Hostpot Sheild
CyberGhost VPN
F-Secure Freedome
Ngoài ra thì bạn có thể tham khảo trong chuyên mục này nhé, có link tải và hướng dẫn rất chi tiết cho từng phần mềm.
#4. Cập nhật trình duyệt web ngay khi có phiên bản mới
Các phần mềm mà bạn vẫn đang sử dụng hằng ngày được tạo ra từ hàng nghìn, thậm chí hàng triệu dòng lệnh khác nhau. Trước khi xuất bản, các lập trình viên đều đã kiểm tra một cách rất cẩn thận nhưng vẫn không thể tránh được những sai sót.
Không có gì là hoàn hảo cả, bạn biết điều này mà đúng không. Nhất là đối với những phần mềm có nhiều người dùng, vì đây sẽ là mục tiêu mà hacker hướng đến nhiều nhất.
Vậy nên, nếu là một phần mềm được đầu tư bài bản thì nhà phát triển họ sẽ phát hành các bản cập nhật định kỳ (có thể là hàng tháng hoặc hằng năm), bản cập nhật có thể là các bản vá lỗi, vá các lỗ hổng bảo mật, hoặc là bổ sung thêm các tính năng mới cho phần mềm.
Vâng, và trình duyệt web cũng là một phần mềm, không những thế nó còn là cánh cửa để máy tính kết nối với Internet. Chính vì vậy, việc đảm bảo cho các trình duyệt luôn được cập nhật phiên bản mới nhất là một trong những việc rất nên làm.
Việc cập nhật cũng vô cùng đơn giản, đối với các trình duyệt web như Microsoft Edge, Google Chrome, hay Cốc Cốc đều tự động làm điều này với các cài đặt mặc định. Bạn có thể kiểm tra phiên bản của 3 trình duyệt Web trên bằng cách nhập sử dụng tương ứng:
edge://settings/help hoặc chrome://settings/help hoặc coccoc://settings/help
#5. Tắt Cookie nếu không thực sự cần thiết
Cookie là một file tạm được tạo ra một cách tự động khi bạn truy cập vào một trang web bất kỳ. Lúc này, Cookie sẽ lưu lại toàn bộ thông tin của bạn như là tài khoản cá nhân, lịch sử truy cập các trang web, thiết bị mà bạn dùng để lướt web..
Trên lý thuyết thì Cookie vô hại, nó được sử dụng để mang lại những trải nghiệm tốt hơn, liền mạch hơn.
Tuy nhiên nó đã và đang bị lợi dụng, chủ yếu là để khai thác quảng cáo và bán cho các nhà quảng cáo. Vì vậy chúng ta nên hạn chế hoặc tắt Cookie đi nếu bạn cảm thấy không thực sự cần thiết.
Tùy thuộc vào trình duyệt web bạn sử dụng mà chúng ta sẽ có cách truy cập vào trình quản lý Cookie tương ứng:
Trình duyệt
Địa chỉ truy cập nhanh
Edge
edge://settings/content/cookies
Chrome
chrome://settings/cookies
Cốc Cốc
coccoc://settings/cookies
#6. Cẩn thận với WiFi công cộng và WiFi không yêu cầu mật khẩu đăng nhập
Các WiFi miễn phí thường không yêu cầu mật khẩu đăng nhập, chúng thường được cung cấp miễn phí tại những nơi tập trung đông người như sân bay, nhà ga, công viên, phố đi bộ, …
Việc không yêu cầu mật khẩu đăng nhập giúp chúng ta truy cập dễ dàng hơn, tuy nhiên nếu không cẩn thận thì rất có thể bạn sẽ thể truy cập nhầm vào các mạng WiFi giả mạo.
Wifi giả mạo thường được tạo ra để thực hiện những mục đích xấu xa, một trong những mục đích thường thấy là thu thập thông tin và đánh cắp tài khoản trực tuyến, tài khoản ngân hàng của bạn.
Cá nhân mình thì rất hạn chế sử dụng mạng Wifi miễn phí và không bao giờ đăng nhập các tài khoản quan trọng như ngân hàng điện tử, Google Account hoặc thực hiện các giao dịch tài chính với mạng WiFi công cộng này.
Trong trường hợp bất khả kháng mà bạn thường xuyên phải sử dụng WiFi miễn phí thì giải pháp hữu hiệu nhất chính là sử dụng VPN (phần mềm Fake IP).
Đọc thêm bài viết: Duyệt Web an toàn và riêng tư với F-Secure Freedome (có trong serie này nhé) !
#7. Kiểm tra các quyền đi kèm với các trang web
Một số trang web khi truy cập sẽ yêu cầu cung cấp một hoặc một số quyền như:
Vị trí (sàn thương mại điện tử, dịch vụ bản đồ trực tuyến, …)
Micro và / hoặc Webcam (Messenger, Zalo, Google Meet, Microsoft Teams, …)
Tùy thuộc vào nhu cầu cụ thể mà chúng ta lựa chọn Cho phép hoặc Chặn, nhưng cần chú ý là chỉ cấp quyền cho những trang web chính thống, những trang web đáng tin tưởng thôi các bạn nhé.
Thông báo yêu cầu cấp quyền truy cập sẽ suất hiện ở góc trên bên trái của trình duyệt Web.
#8. Cẩn thận mỗi khi click chuột vào các liên kết
Xem xét, thận trọng trước khi nháy chuột vào các liên kết không rõ nguồn gốc.
Đôi khi trong hộp thư đến, chúng ta sẽ nhận một số thư có tiêu đề kiểu “Tài khoản của bạn đã bị khóa, nháy chuột vào liên kết và làm theo hướng dẫn để khôi phục”, “Bạn là khách hàng may mắn nhất của ngày hôm nay, nháy chuột vào liên kết và làm theo hướng dẫn để nhận thường”, …
Hấu hết chúng đều là lừa đảo, nếu bạn làm theo thì nhiều khả năng bạn sẽ bị khóa / mất tài khoản hoặc bị mất tiền (lúc này mới là thật) (^-^)
Khi gặp một liên kết đáng nghi thì bạn có thể sử dụng công cụ VirusTotal quét qua từ đó có thêm thông tin để đưa ra quyết định chính xác.
#9. Lời kết
Nhìn chung thì các sự cố về an toàn thông tin xảy ra, nguyên nhân chủ yếu đến từ phía người dùng là chính.
Qua bài viết này thì mình đã chia sẻ đến các bạn khá nhiều lời khuyên hữu ích và thực tế, bạn cũng có thể xem đây là các chỉ dẫn để sử dụng trình duyệt web một cách an toàn hơn nhé.
Thời gian đầu bạn nên cố gắng thực hiện theo, lâu dần nó sẽ trở thành một thói quen tốt, khi đó bạn sẽ không bao giờ quên và tất nhiên là lúc này bạn có thể thực hiện một cách dễ dàng mà không cần cố gắng nữa. Xin chào tạm biệt và hẹn gặp lại các bạn trong những bài viết tiếp theo !
Tổng Hợp Các Công Ty Outsourcing Lớn Nhất Việt Nam
Hiện nay, để tối ưu chi phí nhưng vẫn duy trì được hoạt động của công ty, rất nhiều doanh nghiệp đang lựa chọn hình thức outsourcing. Việc sử dụng công ty outsourcing sẽ giúp các công ty có được sản phẩm mình ưng ý nhất mà không phải tốn quá nhiều nhân sự cho công việc. Cùng tìm hiểu thêm các công ty outsourcing lớn nhất Việt Nam trên thị trường.
*Số thứ tự trong bài viết chỉ nhằm liệt kê các công ty, không nhằm mục đích xếp hạng hay đánh giá
1. FPT Software – ra đời với mục tiêu gia công phần mềm để đáp ứng cho nhu cầu phát triển công nghệ thông tin của các hãng phần mềm, các công ty lớn trong nước và tham vọng hơn là xuất khẩu phần mềm trên toàn thế giới cho các công ty nước ngoài.
2. NASHTECH – mục đích đẩy mạnh việc sử dụng các công nghệ tiên tiến trong các lĩnh vực như điện toán đám mây, dữ liệu lớn và an ninh mạng vốn là thế mạnh của NashTech.
3. KMS Technology – chuyên cung cấp các dịch vụ phát triển phần mềm, tư vấn triển khai các giải pháp công nghệ, khởi nghiệp và đầu tư.
4. Tek Experts – cung cấp các gói dịch vụ hỗ trợ kinh doanh về IT
5. Netcompany
6. TMA Solutions – công ty outsourcing có thâm niên hoạt động khá lâu năm và uy tín.
7. Hitachi Vantara Vietnam (tên cũ Global CyberSoft) – cung cấp dịch vụ và giải pháp công nghệ thông tin hàng đầu Việt Nam
8. Fram^ – IT Engineering & Venture Building
9. Axon Active – tiên phong trong lĩnh vực phát triển phần mềm offshore và có trụ sở tại Thụy Sỹ
10. Accenture – tư vấn quản lý, dịch vụ công nghệ và gia công phần mềm toàn cầu
12. Orient Software Development Corp – chuyên phát triển phần mềm và trang web ra nước ngoài
13. ELCA Việt Nam – phát triển sản xuất phần mềm theo mô hình offshore
14. Savvycom – nhà cung cấp các dịch vụ về công nghệ thông tin hàng đầu tại Việt Nam
15. QSoft Việt Nam – cung cấp đa dạng các giải pháp về CNTT cho các doanh nghiệp
16. Tinhvan Group (Công ty Cổ phần Xuất khẩu Phần mềm Tinh Vân) – kinh nghiệm chuyên sâu trong việc triển khai các dự án gia công PM thuộc nhiều lĩnh vực khác nhau.
17. Rikkeisoft – một trong những công ty hàng đầu tại Việt Nam về sản xuất phần mềm, đặc biệt là ứng dụng trên nền tảng web và smartphone
18. Ominext – cung cấp giải pháp và tích hợp hệ thống thông tin Y tế cho đối tác Nhật Bản
22. Ant-Tech – chuyên nhận các dự án thiết kế ứng dụng từ các khách hàng ở Pháp và châu Âu.
Trên đây là thông tin về một số các công ty outsourcing lớn nhất Việt Nam mà bạn có thể tham khảo. Tìm hiểu thêm về các thông tin hấp dẫn khác tại topdev.vn/blog
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