Những Câu Hỏi Phỏng Vấn Tiếng Anh Thường Gặp Trong Các Buổi Phỏng Vấn
Ngày nay, việc dùng tiếng Anh làm ngôn ngữ chính trong buổi phỏng vấn trở nên khá phổ biến do sự cần thiết của ngoại ngữ trong công việc. Để có thể tự tin trả lời những câu hỏi bằng tiếng Anh, việc có sự chuẩn bị trước để sắp xếp ý tưởng và logic cho câu trả lời của mình là yếu tố khá quan trọng mà bất cứ ứng viên nào cũng cần để tâm đến. Do đó, những câu hỏi phỏng vấn tiếng anh thường gặp được chia sẻ trong bài viết này sẽ giúp người đọc có sự chuẩn bị tốt hơn cho bản thân.
Một số câu hỏi phỏng vấn bằng tiếng Anh thường gặp
1. Can you introduce yourself? Tell me about yourself (Hãy giới thiệu về bản thân bạn)
Đối với câu hỏi này, người phỏng vấn chủ yếu muốn ứng viên khái quát một cách tổng quan những thông tin cơ bản của bản thân và thể hiện được mong muốn của mình với công việc. Về cơ bản cách trả lời câu hỏi này cũng tương tự như cách bạn trả lời trong buổi phỏng vấn bằng tiếng Việt. Tuy nhiên, với những ứng viên đã có kinh nghiệm làm việc, ứng viên có thể bổ sung thêm những kinh nghiệm mình đã có và cách bạn có thể áp dụng những điều ấy cho vị trí mà mình đang ứng tuyển.
Chẳng hạn với vị trí ứng tuyển liên quan đến Content Marketing, bạn có thể tham khảo mẫu câu trả lời như sau:
Hello, my name is Han. I’m 22 years old and I graduated from the University of Social Sciences and Humanity where I majored in International Relations. I have been working as a Content Creator at a small Vietnamese company for 2 years since I was a sophomore. My main duties were creating content for blogs, brochures, and social posting and also taking care of others’ social fanpages. I’m interested in writing and making creative products, that’s the reason I choose to follow this career path.
2. What are your strengths and weaknesses? (Điểm mạnh và điểm yếu của bạn là gì?)
Câu hỏi này gần như luôn xuất hiện trong tất cả các buổi phỏng vấn. Mục đích của việc đặt câu hỏi điểm mạnh và điểm yếu là để người phỏng vấn có thể xem xét khả năng tự đánh giá về bản thân của ứng viên như thế nào. Bạn có đủ tự tin với những điểm mạnh của mình không cũng như có dám tiết lộ một cách chân thật điểm yếu của mình không?
Tham khảo:
I have the ability to adapt very quickly to work and withstand pressure well. Due to the characteristics of working in the IT industry, I often work overtime to solve my assignments, but this has never been a thing that makes me feel depressed.
However, I am still not really satisfied with my professional knowledge. That’s also the reason I signed up for more external courses to upgrade my coding skills.
3. Why do you want to apply for this position? (Tại sao bạn lại muốn ứng tuyển vào vị trí này?)
Nếu như ở câu hỏi điểm mạnh, bạn có thể kể một cách thoải mái những điều ưu tú nhất của bản thân, thì với câu hỏi này, ứng viên nên đi sâu vào khai thác điểm mạnh ấy. Với những điểm mạnh ấy, bạn có thể đóng góp được gì cho công việc này. Đó là cách để ứng viên có thể thuyết phục nhà tuyển dụng rằng bạn phù hợp với vị trí này.
Tham khảo:
I have more than 3 years of experience in the field of information technology. And I think that’s one of my advantages when applying for this position. It will be easier for me to receive information as well as handle the professional work of a developer in my company. Besides, I also have experience working with the programming language that the current company is applying.
4. What are your short term goals in your career path? (Các mục tiêu ngắn hạn của bạn trong lộ trình sự nghiệp của bạn?)
So với mục tiêu dài hạn, mục tiêu ngắn hạn sẽ cụ thể và thực tế hơn rất nhiều. Nhà tuyển dụng nhờ thế cũng có thể đánh giá ứng viên một cách chính xác hơn, do đó họ thích đặt câu hỏi này hơn so với mục tiêu dài hạn. Vậy nên kể cả khi câu hỏi không nêu cụ thể mục tiêu ngắn hạn hay dài hạn, ứng viên vẫn nên ưu tiên các mục tiêu ngắn hạn để gây ấn tượng với nhà tuyển dụng cũng như có tính thuyết phục cao hơn.
Tham khảo:
I want to develop to a higher position and improve my knowledge of software programming with Python language. My specialty is computer sciences, I also have knowledge of SQL server databases, Postgres, knowledge of Linux centos operating system, Ubuntu, Odoo Framework and Python programming language. I want to continue to explore new languages at work.
5. What is your expected salary? (Bạn mong đợi mức lương bao nhiêu?)
Đây là câu hỏi mang tính chủ quan từ phía ứng viên do đó tốt hơn hết ứng viên nên có sự chuẩn bị trước với những câu hỏi như thế này. Bạn nên tham khảo mức lương thị trường với vị trí này để biết năng lực của mình đang ở đâu và có thể thương lượng được mức lương như ý nhất.
Tham khảo:
My salary expectations are commensurate with my experience and qualifications. In addition, I have also searched about the market salary for this position as well as the jobs that I can do, so I would like to receive a salary in the range from 12.000.000 VNĐ to 15.000.000 VNĐ.
Hi vọng một số câu hỏi tiếng Anh thường gặp trên đây sẽ giúp ứng viên trang bị thêm cho mình một số kiến thức để chuẩn bị cho những cuộc phỏng vấn quan trọng sắp tới. Đón đọc thêm các bài viết hữu ích khác về công nghệ và nhân sự tại TopDev nhé!
Bài viết được sự cho phép của tác giả Tô Thị Vân Anh
Nhân một sự kiện đáng nhớ của mình đã diễn ra hơn nửa năm về trước, đã khá là lâu rồi mà đến bây giờ mới có được chút sức mạnh để đánh bay cơn trì hoãn và cái sự lười đã bén rễ bên trong cơ thể này, để viết về một chủ đề quen thuộc đối với nhiều người theo con đường tester đó là chứng chỉ ISTQB (International Software Testing Qualifications Board).
À thì cái sự kiện đáng nhớ trên của mình ấy mà, thực ra cũng không có gì to tát đâu và đâu đó bạn sẽ phát hiện ra sau khi đọc xong bài viết này nhé!
Quay lại chủ đề liên quan đến mục đích của bài viết này, mình sẽ tổng hợp một số thông tin liên quan đến việc thi lấy chứng chỉ ISTQB, mình nghĩ là thông tin này sẽ khá là hữu ích dành cho bạn nào đang có ý định tìm hiểu và thi lấy chứng chỉ này đó. Bên cạnh những thông tin đưa ra dưới đây, các bạn có thắc mắc hay ý kiến đóng góp gì thì cũng cứ thoải mái để lại bình luận cho mình ở phần bình luận phía dưới nhé.
Bài viết của mình tập trung vào phần CORE của ISTQB Advanced level bao gồm các Module: TM (Test Management), TA (Test Analyst), TTA (Technical Test Analyst).
1. Nội dung kiến thức trong bài thi
Câu hỏi trong bài thi Advanced level sẽ dựa vào kiến thức có trong các Syllabus tương ứng. Theo thông tin từ trên trang chủ của istqb thì:
Với bài thi TA và TTA thì sẽ tham khảo Syllabus TA, TTA 2019 – có các thông tin được cập nhật, chỉnh sửa.
Ngoài ra còn có một số tài liệu khác nữa có thể tìm kiếm qua Google, hoặc nếu bạn thực sự cần để ôn luyện thì có thể liên hệ cho mình
Để có thể làm tốt được bài thi thì tất nhiên phải nắm được, hiểu được và vận dụng được kiến thức đã được tóm lược trong tài liệu đó để trả lời các câu hỏi trong bài thi. Bài thi bao gồm các câu hỏi bao hàm lượng kiến thức từ nhiều chương kết hợp. Đây là mức độ nâng cao nên tất nhiên câu hỏi sẽ không thể ở mức quá đơn giản được, đúng không nào. Hehe, có một cách khác đó là cày đề và học thuộc đáp án nha các bạn :v nhưng mà đề ở đâu để cày mới là vấn đề =)) thế là lại phải tốn thêm ít chi phí để đi học trung tâm. Hehehe.
Nếu xác định đi lên bằng thực lực thì chính bạn phải biết cách chắt lọc và nắm bắt nội dung kiến thức một cách đầy đủ và khoa học. Vấn đề là làm thế nào, câu trả lời đầu tiên đó là phải chăm chỉ cái đã. ;))
Một thông tin khác, không liên quan đến kiến thức trong bài thi, nhưng mình cũng bổ sung thêm ở đây để các bạn có thể cân nhắc thêm, đó là kinh phí dành cho bài thi này (Lưu ý: chi phí này mình tham khảo năm 10/2020, đơn vị được ủy quyền tổ chức thi là QRS):
Phí đăng ký hồ sơ thi: 3,000,000 VND (Ba triệu đồng). Hồ sơ này đóng 1 lần bao gồm: bằng đại học, chứng chỉ ISTQB Foundation (nếu chưa có thì bạn phải thi để có cái này trước đã nhé), một giấy xác nhận đã làm trong ngành CNTT được tối thiểu 3 năm – đối với người tốt nghiệp đúng chuyên ngành CNTT, và 5 năm đối với người tốt nghiệp ở ngành nghề khác). – Bạn sẽ được hỗ trợ thông tin khi đăng ký thi ở đơn vị được ủy quyền tổ chức thi nhé.
Lệ phí thi cho từng Module, mỗi Module là 4,500,000 VND (Bố triệu rưỡi đồng), nếu bạn thi cả 3 Module thì là 3×4,500,000. Phí này bao gồm việc xuất hóa đơn đỏ nếu bạn có nhu cầu.
Vì thi ở đơn vị ủy quyền nên trung tâm có một loại phí khác nữa là phí chuyển đề thi – phí này là 4,000,000/lần thi cho tất cả những người tham gia thi lần đó, do vậy sẽ tùy vào số người thi mà bạn sẽ cần phải đóng lượng phí tương ứng. Khoản số 3 này mình không chắc ở các đơn vị tổ chức ủy quyền thi khác có giống nhau đâu nhé!
2. Cấu trúc chung của các bài thi
Mỗi module sẽ bao gồm một bộ các câu hỏi theo các chương của Syllabi. Số lượng câu hỏi và độ khó (K-level) sẽ được lựa chọn và phân phối tương ứng dựa theo chương đó. Các câu hỏi có thể có một đáp án hoặc nhiều đáp án đúng. Theo như mình biết được thì hiện giờ các câu hỏi nếu có nhiều hơn 1 đáp án đúng, thì nó sẽ nói rõ yêu cầu là mình cần chọn 2 đáp án hoặc 3 đáp án đúng luôn, khác với trước đây là mình sẽ phải tự xác định số lượng đáp án đúng cho câu hỏi đó.
Điểm số cho một câu hỏi phản ánh độ khó của câu hỏi đó. Một câu hỏi K2 tương ứng với 1 điểm, thông thường thì K3 là 2 điểm và K4 là 3 điểm. Tuy nhiên, một câu hỏi K3 cũng có thể tương ứng với 1, 2 hoặc 3 điểm, một câu hỏi K4 cũng có thể tương ứng với 2 hoặc 3 điểm, tùy thuộc vào sự đánh giá của người ra đề.
Một câu hỏi khó yêu cầu người làm bài phải có sự hiểu biết sâu rộng, đa chiều nhất định, tức là bạn phải biết vận dụng kiến thức lý thuyết để suy luận, xử lý tốt một tình huống cụ thể nào đó chẳng hạn, mà không chỉ đơn thuần hỏi định nghĩa hay những cái có thể tra cứu trong tài liệu được. Và ngược lại với một câu hỏi dễ thì sẽ dễ dàng tìm được câu trả lời hơn.
Thông thường, trung bình một câu hỏi K2 sẽ cần khoảng 2 phút để đọc và trả lời, K3 thì 3 phút và K4 là 4 phút. Và vì đó là con số trung bình theo lý thuyết thế nên có thể có câu hỏi cần nhiều hơn hoặc ít hơn thời gian mong đợi trên kia.
Thời gian cho mỗi bài thi sẽ dựa vào số lượng câu hỏi và K-level của module đó. Nếu người thi không sử dụng ngôn ngữ của bài thi là ngôn ngữ chính thì thời gian đc tăng thêm 25%. Ơ nhưng mà mình đã thi 3 bài thì thời gian vẫn là 180p cho TM và TA và 120p cho TTA. Các bạn yên tâm, nhiều người cùng phòng thi với mình chưa dùng hết nửa thời gian kia đã nộp bài đi về rồi ấy nhé hehe.
Lười kẻ lại bảng nên chụp lại luôn từ file gốc -.-
3. Phân phối câu hỏi trong các bài thi
Với mỗi chương (Chapter), sẽ có các nội dung bài học cụ thể cần phải nắm được trong chương đó gọi là Learning Objective (viết tắt là LO) – mình hiểu nôm na thì đây là phần kiến thức lõi của chương đó – hay mục tiêu bài học cần đạt được của chương, phần này được tóm tắt ở mỗi đầu Chapter (Tham khảo hình phía dưới). Mỗi LO cũng được đánh dấu độ K tương ứng [K1, K2, K3…]. Các câu hỏi trong bài thi sẽ bám sát vào các LO của mỗi chương này:
Một chương sẽ truyền tải tương đối nhiều nội dung kiến thức cần phải nắm được (Lười quá nên cũng chụp lại từ Syllabus cho tiện)
Ví dụ ở Chapter 2 (hình bên trên), có 21 LO, số lượng câu hỏi cho chapter này có tối thiểu 24 câu và tối đa là 25 câu, ta có thể hiểu rằng trong 21 LO này sẽ có LO nào đó có 2 câu hỏi, LO có 1 câu hỏi và có thể có thể có LO không có câu hỏi nào. J Những LO nào mà có dấu (*) có nghĩa là nó thuộc dạng tùy chọn rằng nó mang tính ngẫu nhiên do người ra đề sắp xếp, do đó có thể xuất hiện ở bài thi hoặc không. Miễn sao đảm bảo số câu hỏi tối thiểu và tối đa của chương đó. Có hơi loằng ngoằng một chút nhỉ, nhưng các bạn có thể xem minh họa ở hình dưới đây:
Lại một pha lười nữa nên các bạn chịu khó xem hình mà không có Vietsub nhé!
Tóm tắt nhanh số lượng câu hỏi theo Chương cho từng Module sẽ như sau:
Bài thi TM:
Tổng điểm của bài thi TM là 115 điểm, điểm đỗ là 75 điểm trở lên.
Chapter
Số lượng câu hỏi
Chapter 1
Tối thiểu 13 câu, Tối đa 14 câu.
Chapter 2
Tối thiểu 24 câu, Tối đa 25 câu.
Chapter 3
6 câu hỏi
Chapter 4
4 Câu hỏi
Chapter 5
Tối thiểu 3 câu
Chapter 6
Tối thiểu 3 câu, Tối đa 4 câu.
Chapter 7
Tối thiểu 7 câu hỏi
Tổng số câu hỏi trong bài thi TM
65 câu
Bài thi TA:
Tổng điểm của bài thi TA là 120 điểm, điểm đỗ là 78 điểm trở lên.
Chapter
Số lượng câu hỏi
Chapter 1
Tối thiểu 9 câu.
Chapter 2
Tối thiểu 3 câu.
Chapter 3
Tối thiểu 31 câu
Chapter 4
Tối thiểu 4 câu
Chapter 5
Tối thiểu 4 câu, Tối đa 5 câu
Chapter 6
Tối thiểu 4 câu.
Chapter 7
Tối thiểu 1 câu (Có thể có hoặc ko)
Tổng số câu hỏi trong bài thi TA
60 câu
Bài thi TTA:
Tổng điểm của bài thi TTA là 80 điểm, điểm đỗ là 52 điểm trở lên.
Chapter
Số lượng câu hỏi
Chapter 1
2 câu hỏi.
Chapter 2
9 câu hỏi.
Chapter 3
7 câu hỏi.
Chapter 4
12 câu hỏi.
Chapter 5
5 câu hỏi.
Chapter 6
10 câu hỏi..
Tổng số câu hỏi trong bài thi TTA
45 câu
Trên đây là cấu trúc bài thi theo tài liệu hướng dẫn 2012. Tuy nhiên, theo cập nhật trên trang chủ ISTQB đã có thay đổi cho cấu trúc bài thi của TA và TTA phiên bản 2019, ở Việt Nam có vẻ như là chưa áp dụng cấu trúc mới này, tại vì hồi mình thi hồi tháng 10/2020 thì đề vẫn theo cấu trúc cũ.
Theo hướng dẫn mới 2019 thì TA sẽ có 40 câu hỏi – với 120 phút làm bài tiêu chuẩn (+25% thời gian với người thi ko sử dụng ngôn ngữ bài thi là ngôn ngữ chính), TTA sẽ có 45 câu hỏi và 120 phút (hoặc +25%) làm bài tiêu chuẩn:
Các bạn có thể xem đầy đủ và chi tiết thông tin bảng phân phối câu hỏi theo Chapter và LO phiên bản 2019 tại đây.
Hoặc xem mình tóm tắt ở hai bảng dưới này cũng được:
Bài thi TA (2019):
Tổng điểm cho bài thi TA này là 80 điểm, điểm đỗ là 52 điểm trở lên
Chapter
Số lượng câu hỏi
Chapter 1
6 câu hỏi.
Chapter 2
1 câu hỏi.
Chapter 3
17 câu hỏi.
Chapter 4
11 câu hỏi.
Chapter 5
3 câu hỏi.
Chapter 6
2 câu hỏi..
Tổng số câu hỏi trong bài thi TA
40 câu
Bài thi TTA (2019):
Tổng điểm cho bài thi TTA này là 76 điểm, điểm đỗ là 49 điểm trở lên.
Chapter
Số lượng câu hỏi
Chapter 1
2 câu hỏi.
Chapter 2
8 câu hỏi.
Chapter 3
7 câu hỏi.
Chapter 4
13 câu hỏi.
Chapter 5
5 câu hỏi.
Chapter 6
10 câu hỏi.
Tổng số câu hỏi trong bài thi TTA
45 câu
Tóm lại là việc thông tin các câu hỏi được phân bổ trong các chương khá là chi tiết như vậy sẽ giúp cho quá trình ôn tập kiến thức và lên chiến lược học tập của chúng ta được phù hợp hơn. Ví dụ như việc tập trung nỗ lực vào chương có phân phối nhiều câu hỏi nhất để có thể trả lời được đúng nhiều nhất chẳng hạn. Việc rèn luyện thực hành cũng giúp chúng ta khi đọc câu hỏi có thể suy luận ra được rằng câu này thuộc kiến thức của chương nào để vận dụng tương ứng.
4. Thông tin bên lề khác
Thông tin bên lề này là thông tin dựa theo kinh nghiệm và những trải nghiệm của mình trong quá trình ôn luyện và đi thi, xin phép được chia sẻ thêm với các bạn.
Thông thường sẽ có hai hướng chiến lược cho người xác định thi lấy chứng chỉ. Một là tự ộn tập và sau đó đăng ký thi. Hai là đăng ký học một khóa học tại trung tâm ôn luyện nào đó rồi mới thi.
Vậy thì tự ôn tập thì có khả năng thi đỗ được hay không?
Câu trả lời đơn giản lắm, chỉ cần bạn chăm chỉ ôn luyện là được. Hehe. Nói thế ai mà chả nói được. Tuy nhiên, mình lại xin phép chia sẻ ý kiến của mình đó là bạn nên tập hợp được một nhóm những người cùng mục tiêu và ý chí, ngồi lại và ôn tập cùng với nhau sẽ hiệu quả hơn nhiều. Có thể các bạn cùng công ty, hoặc khác công ty. ISTQB Advanced không chỉ có lý thuyết mà còn là những bài tình huống để bạn vận dụng những kiến thức lý thuyết đó để xử lý, trừ trường hợp bạn quá giỏi, quá nhiều kinh nghiệm thực tế rồi thì mình không đề cập ở đây, nhưng trong một nhóm sẽ có nhiều người với những góc nhìn khác nhau sẽ giúp chúng ta có cái nhìn đa chiều hơn đối với một vấn đề hoặc tình huống nào đó, điều này sẽ giúp ích cho quá trình ôn luyện rất nhiều.
Tất nhiên sẽ có lợi thế hơn nhiều nếu bạn có thể thu thập được một ngân hàng câu hỏi ôn tập nào đó, nhưng kiếm ở đâu ra được, đành phải nhờ vào kỹ năng tìm kiếm sử dụng Google và đặc biệt là các mối quan hệ. hehe.
Cách đơn giản hơn là đăng ký đi học trung tâm ôn luyện, họ đã soạn sẵn bài giảng, giáo trình, có người hướng dẫn, người học từ nhiều công ty khác nhau, trình độ và kinh nghiệm khác nhau cũng là một trải nghiệm vô vùng thú vị đấy các bạn, nhiều trung tâm còn cam kết cho bạn học đến khi nào đỗ thì thôi, chỉ có điều lại tốn xèng một chút thôi. – Một khóa đâu đấy 4-5tr thì phải.
Ôn tập bao nhiêu lâu thì có thể đăng ký thi được một Module?
Điều này tùy thuộc vào khả năng học tập của bạn, bạn mất ít thời gian ôn luyện thì bạn có thể đăng ký thi sớm, tuy nhiên với trường hợp vừa đi làm vừa ôn luyện thì chắc cũng phải cần bỏ ra 2-3 tháng đó. Không nên để thời gian học quá lâu vì có thể nó sẽ rơi vãi đâu đó mất nếu bạn không thường xuyên ôn luyện lại kiến thức.
Có nên thi cùng lúc nhiều Module?
Cái này cũng còn tùy thuộc vào mục đích, định hướng nghề nghiệp và nhu cầu của từng người. Có người chỉ thi TM, có người thì TM, TA, cũng có những người thi cả ba TM, TA, TTA. Mình thuộc nhóm thi cả 3 cùng một lúc vì mình thích sưu tầm chứng chỉ và quan trọng là mình cũng có tiền để thi nữa. Haha.
Nhưng câu hỏi là có nên hay không cơ mà nhỉ. Mình chia sẻ một số ý kiến liên quan, còn nên hay không thì do bạn tự quyết định nhé. Ở nội dung kiến thức TM và TA có một vài điểm chung theo đánh giá thì khoảng 60-65% là giống nhau, phần khác nhau là do đặc thù của từng mảng 1 cái là Management (Quản lý), một cái là Analyst (Chuyên môn), thế nên nếu mà bạn xác định chỉ thi TM thì bạn chỉ học chuyên kiến thức của TM, và nếu bạn có dự định thi cả TA thì bạn chỉ cần ôn luyện thêm phần khác của TA tức là khoảng 35-40% lượng kiến thức còn lại thuộc về TA thôi ;)) thế nên nhiều người thường nghĩ là thôi mất công học rồi thì học luôn một thể. Không thi, nhỡ đâu sau này cần lại phải học lại từ đầu thì lại tiếc =)), đấy nhiều người hay nghĩ thế.
Còn TTA, số lượng câu hỏi ít hơn hẳn so với 2 Module trên kia mà lại còn là Technical, nên nhiều người nghĩ là nó sẽ khó hơn và mất thời gian ôn tập hơn, rồi nghĩ là có 2 cái trên kia là ổn rồi. Với lại bỏ ra thêm tận 4 triệu rưỡi nữa thì tốn quá nhỉ, thế là thôi. ;))
Mình thì mình nghĩ mất công học rồi thì học luôn, vất vả luôn một lần cho xong. Có trong tay một lúc 3 cái liền chả vui hơn à. Hehehe, nhưng mà lúc học ôn cũng vất hơn đấy nhé à cả lúc chuyển tiền lệ phí thi cũng buốt ví, lại nhưng nữa là lúc nhận điểm đỗ cả 3 thì thấy nó cũng xứng đáng đấy chứ. >.*
Hi vọng là bài tổng hợp ngắn này có thể giúp các bạn có một cái nhìn tổng quan về bài thi Advanced này. Theo mình thấy thì hầu như mọi người khi đi học thì ko ai tìm hiểu cái này mấy, cũng có thể là do nó không có trong bài thi nên không cần quan tâm =)) tự tìm hiểu làm chi cho mất thời gian. Ơ hơ buồn thế, mất công viết cả bài dài thế này rồi cơ mà, thân dành cho những những bạn nào mà mới nung nấu ý định thi thôi thì có thể tham khảo bài viết này của mình để hiểu được sơ bộ và sau đó lên kế hoạch học tập cũng sẽ tiết kiệm được chút thời gian đó.
Bài viết được sự cho phép của blogchiasekienthuc.com
Sự khác biệt giữa việc cài đặt Driver hoặc nâng cấp Driver thông qua Windows Update, phần mềm bên thứ 3 và các trang Driver của chính các hãng máy tính hoặc Laptop là gì?
Nếu bạn thuộc thế hệ 8x, 9x đời đầu thì bạn sẽ hiểu rất rõ điều này 😀
Đối với phiên bản Windows 7, Windows XP hoặc các phiên bản thấp hơn nữa thì việc cài đặt driver sau khi cài Windows là điều bắt buộc phải làm để có thể sử dụng được loa, kết nối mạng Internet và nhiều thứ khác.
Việc cài đặt driver chuẩn cho máy tính sẽ giúp các thành phần phần cứng trên máy hoạt động được đúng cách, đồng thời giúp máy tính hoạt động được ổn định và mượt mà hơn.
Tuy nhiên, kể từ phiên bản Windows 8 trở lại đây, nhất là trên các phiên bản Windows 10 hay Windows 11 hiện tại, bạn gần như không phải làm gì sau khi cài đặt Windows nữa.
Tuy nhiên, trong quá trình sử dụng, nếu bạn có gặp lỗi gì, hoặc đơn giản là bạn muốn nâng cấp driver cho máy thì bạn sẽ làm theo cách nào?
Bạn sẽ nâng cấp driver thông qua Windows Update, sử dụng phần mềm cài đặt driver của bên thứ 3, hay là lên trang chủ của hãng máy tính mà bạn đang sử dụng để tải và cài đặt?
Vâng, trong bài viết này chúng ta hãy cùng xem ưu và nhược điểm của những cách làm này nhé 😀
#1. Cài đặt Driver thông qua việc Update Windows
Cách này là sử dụng Windows Update hoặc Device Manager để cài đặt và nâng cấp Driver. Nếu bạn chưa biết cách làm thì xem phần #1 trong bài hướng dẫn này nhé !
Ưu điểm:
Được tự động cập nhật nếu Driver đó có sẵn trong Windows Update.
Nhanh chóng, dễ dàng.
Dễ sử dụng cho hầu hết mọi người vì không cần các thao tác phức tạp.
Nhược điểm:
Các Driver đôi khi không được ổn định, đôi khi bị lỗi.
Đã có trường hợp sử dụng Windows Update để cài Driver và đã gây ra lỗi Win. Trường hợp này là có nhưng không nhiều.
Không được da dạng và đầy đủ Driver, không hỗ trợ Driver các đời máy quá cũ.
Không thể sử dụng được cách này nếu máy không có mạng.
Lời khuyên:
Đây là các gói driver được Microsoft tích hợp sẵn hoặc update thông qua các bản vá và bản cập nhật. Vậy nên, nếu bạn không có nhiều kinh nghiệm trong việc chọn lựa driver chuẩn thì sử dụng cũng OK, không vấn đề gì cả.
#2. Cài đặt Driver bằng các phần mềm thứ 3 như Driver Easy, Driver Booster,…
Cách này ngày trước rất được ưa chuộng do nó nhanh, đỡ phức tạp hơn so với những cách làm khác. Một vài phần mềm cài đặt driver online rất phổ biến lúc đó như Driver Easy, Driver Booster, Snappy Drive Install…
Các phần mềm cài driver online này thì yêu cầu máy tính bạn phải có kết nối Internet thì mới có thể cài được.
Còn một số gói driver cài OFFLINE rất nổi tiếng như WanDriver, DriverPack Solutio….. Đây có thể có 2 bộ driver huyền thoại của những người hay cài Win 🙂
Ưu điểm:
Driver đa dạng, hỗ trợ hầu hết các đời máy.
Cách sử dụng đơn giản, chỉ cần vài click chuột là đầy đủ Driver.
Dành cho những người dùng có chút kiến thức về máy tính.
Đối với WanDriver và DriverPack Solutio thì bạn thậm chí không cần mạng để sử dụng, có thể lưu trữ cho những lần cài đặt sau.
Nhược điểm:
Nếu là phần mềm tốt (driver online) thi hầu hết là phần mềm trả phí, nếu có điều kiện thì bạn có thể mua để sử dụng, tuyệt đối không dùng hàng c.r.a.c.k cho việc này nhé, vì nó không đáng để làm như vậy (xem lý do).
Trong vài trường hợp Driver được cài không tương thích với máy gây ra lỗi Windows.
Không thể sử dụng nếu máy không có mạng (đối với các phần mềm cài driver online).
Còn đối với các bộ cài đặt driver offline như WanDriver, mặc dù không cần mạng nhưng khá nặng để tải về, thường từ 2.5GB trở lên.
Lời khuyên: Để so sánh giữa việc sử dụng theo Cách 1 và Cách 2 thì mình sẽ chọn Cách 1. Điều kiện mà mình đang nói tới là trên các phiên bản Windows mới như Windows 10 và Windows 11 nha các bạn !
#3. Lên Google tìm kiếm Driver máy tính của bạn
Vâng, cách làm này thì hên xui. Đôi khi bạn sẽ tìm được driver ngon lành trên những trang web uy tín luôn. Còn ngược lại thì bạn biết rồi đó.
Để tìm kiếm Driver theo cách này thì bạn hãy làm theo mục #3 trong phần II của bài viết này nhé các bạn !
Ưu điểm:
Tìm được hầu hết tất cả Driver, kể cả là các máy đời cũ từ đời nhà Tống :D. Bởi việc tìm kiếm trên Google là không giới hạn mà 😀
Khả năng tương thích sẽ tùy thuộc vào trình độ tìm kiếm của bạn, nếu biết cách tìm kiếm thì sẽ rất hiệu quả và tốn ít thời gian hơn so với các cách khác.
Nhược điểm:
Tốn thời gian để tìm kiếm và cài đặt Driver với những người dùng phổ thông.
Cần phải biết cách tìm Driver, cài đặt Driver thông qua Device Manager.
Dễ dính phải virus nếu tải ở các nguồn chưa qua kiểm duyệt, các nguồn không uy tín.
#4. Vào trang chủ của phần cứng hoặc Laptop/ PC đó để tải Driver của hãng
Đây là cách mà bạn sẽ phải lên trang chủ của phần cứng, tải và cài đặt Driver của phần cứng đó. Đây là cách tuyệt vời nhất và mình cũng khuyên bạn nên làm theo.
Tuy hơi mất thời gian một chút nhưng đổi lại hiệu suất máy tính sẽ được cải thiện đáng kể: Tất cả những gì cần làm thì Admin đã chia sẻ với các bạn trong bài viết này rồi: Cách CÀI ĐẶT DRIVER chuẩn nhất cho LAPTOP và PC
Ưu điểm:
Do nguồn tải về chính chủ. Chính vì vậy, độ tương thích và ổn định gần như là 100%.
Khá đơn giản để cài đặt dành cho các máy tính đồng bộ hoặc Laptop.
Nhược điểm:
Dành cho những người hiểu biết về máy tính một chút.
Sẽ khó khăn hơn trong quá trình cài đặt nếu đó là máy tính dô bạn tự build, bởi mỗi phần cứng đều cần Driver ở trang chủ riêng dành cho phần cứng đó.
Lời khuyên:
Đây chính là cách mà mình khuyên các bạn nên sử dụng nhất do tính ổn định và tương thích cao, gần như không bị lỗi vặt khi sử dụng.
#5. Lời kết
Trên đây là những cách cài đặt driver cho máy tính phổ biến nhất hiện nay. Mỗi cách đều có những ưu và nhược điểm riêng, tùy từng trường hợp mà bạn áp dụng cho phù hợp với nhu cầu sử dụng của bạn.
Hi vọng là bài viết này sẽ hữu ích với bạn, chúc các bạn thành công và đừng quên comment những cách mà bạn đang áp dụng để anh em cùng thảo luận thêm nhé !
Lập trình là một trong những kỹ năng có giá trị nhất mà bạn có thể học trong thời hiện đại này, cho dù mục đích của bạn là phát triển sự nghiệp hoặc thử thách trí tuệ hay để tạo ra một sản phẩm tuyệt vời nào đó. Nếu bạn vừa mới bắt đầu chuyến hành trình của mình vào thế giới lập trình, thì đây là danh sách 10 bí quyết và tài nguyên giúp bạn học lập trình một cách hiệu quả nhất.
1. Nhận ra lý do tại sao bạn muốn học lập trình
Hướng đi của bạn sẽ phụ thuộc phần lớn vào lý do tại sao bạn muốn học lập trình và bao nhiêu thời gian bạn có thể chuyên tâm dành cho việc học. Nếu bạn muốn trở thành một lập trình viên chuyên nghiệp thì việc đăng ký các khóa học tại các trường đại học có thể là lựa chọn tốt nhất dành cho bạn. (Google có một danh sách những kỹ năng và khóa học đề nghị đối với những người muốn trở thành kỹ sư phần mềm.) Nếu bạn muốn xây dựng các trang web hoặc các trò game cho vui (và có thể sinh lợi) trong thời gian rỗi, thì các tutorial dạng tương tác có thể là một lựa chọn tốt hơn.
2. Lựa chọn đúng ngôn ngữ lập trình
Không có ngôn ngữ lập trình nào là “tốt nhất” cả, và khi bạn đã học được một ngôn ngữ thì rất dễ để học sang ngôn ngữ khác, vì vậy đừng phân vân quá nhiều trong việc chọn ngôn ngữ đầu tiên của mình. Tuy nhiên có một số ngôn ngữ thân thiện với người mới bắt đầu hơn những ngôn ngữ khác. Ngôn ngữ bạn chọn để bắt đầu có thể phụ thuộc vào mục đích của bạn. (Ví dụ, nếu bạn muốn viết một ứng dụng iOS, bạn sẽ cần học Swift hoặc Objective-C). Nếu bạn muốn học lập trình một cách nghiêm túc thì hãy bắt đầu với C, mặc dù có những ngôn ngữ bậc cao hơn như Python khá là dễ học.
3. Bắt đầu nhỏ (và phải kiên nhẫn)
Không quan trọng việc bạn chọn ngôn ngữ lập trình hoặc phương thức nào để học, bạn nên bắt đầu ở mức cơ bản nhất. Ví dụ, khi David Sinsky tự học lập trình trong 8 tuần, anh ta đã dành ra một ngày cuối tuần để nắm kiến thức giới thiệu về Python và một ngày để hiểu sơ bộ về framework Django – thực hành theo những tutorial, sau đó xóa tất cả các code mẫu của tutorial, và tự làm lại thông qua trí nhớ. Bắt đầu với những thứ cơ bản và hãy kiên nhẫn với bản thân trong quá trình học tập. Để cho dự án lập trình đầu tiên của mình được hoàn thành, hãy chia nhỏ dự án đó thành nhiều bước đơn giản. Và nếu một phương thức học tập nào đó không mang lại hiệu quả cho bạn thì hãy thử những cách thức khác trước khi bỏ cuộc.
4. Thử một ứng dụng dành cho trẻ em
Ngày nay thậm chí những đứa trẻ mới tập đi cũng đã bắt đầu học lập trình rồi. Đó thực sự là một điều tuyệt vời cho tất cả chúng ta. Mặc dù nhiều chương trình được thiết kế để dạy trẻ em lập trình rất đơn giản, nhưng có nhiều phần mềm như Scratch phù hợp cho mọi lứa tuổi. Không quan trọng bạn bao nhiêu tuổi; thậm chí những ứng dụng hiệu ứng động dành cho trẻ em có thể giúp bạn bắt đầu với những kiến thức cơ bản trong lập trình (edX có một khóa học mới là Lập trình bằng phần mềm Scratch).
5. Sử dụng các trang web dạy lập trình trực tuyến miễn phí
Các trang web dạy học trực tuyến miễn phí như ucode.vn có thể giúp bạn viết chương trình máy tính đầu tiên của mình. Các tutorial từ những trang như KhanAcademy, Codecademy, Code.org, và nhiều tổ chức khác sẽ giới thiệu tới bạn những kiến thức lập trình cơ bản – trong khi tạo ra một trò game mới, một trang web, hoặc dự án khác. Tìm những tài nguyên cần thiết về những ngôn ngữ mà bạn đang học. Đây là những điểm bắt đầu rất tốt, nhưng bạn sẽ cần tiếp tục học xa hơn sau những phần sơ lược này.
6. Tham gia một khóa học lập trình
Bạn có thể tham gia các khóa học tại chính trường đại học của các bạn hoặc bây giờ có rất nhiêu các khóa học lập trình online về tất cả các ngôn ngữ. Các khóa học lập trình sẽ trang bị cho bạn một nền tảng vững chắc về một lĩnh vực nào đó trong ngành lập trình nói chung, từ đó bạn sẽ dễ dàng phát triển khả năng của mình trong lĩnh vực này.
7. Đọc sách lập trình miễn phí
Khi bạn bị mắc kẹt trong một vấn đề hoặc cần tìm kiếm một điều gì đó, thì những cuốn sách tham khảo là rất tiện dụng. Có một tuyển tập đồ sộ của trên 500 cuốn sách lập trình miễn phí được đăng trên GitHub, và tuyển tập ebook chứa nội dung về 24 ngôn ngữ lập trình khác nhau.
8. Chơi các trò game về lập trình
Thường thì cách tốt nhất để học là thông qua các trò chơi. Trong khi có rất nhiều các tutorial lập trình hướng dẫn bạn tự xây dựng các trò game từ đơn giản đến phức tạp, một số trang dạy học cũng chính là những trò game: Code Combat và CodinGame là 2 trang mang lại nhiều niềm vui khi học ở đó.
9. Tìm một người hướng dẫn (hoặc dạy một người nào đó)
Cộng đồng lập trình có rất nhiều người rất sẵn lòng giúp đỡ để tạo ra thế hệ lập trình viên tiếp theo. Hack.pledge() là một trang sẽ kết nối bạn với một người gia sư, hoặc bạn cũng có thể đăng ký trở thành gia sư của một ai đó. Thậm chí chỉ là lên kế hoạch để dạy những điều mà bạn đã học được, điều đó cũng giúp bạn ghi nhớ thông tin được tốt hơn.
10. Hack code của người khác
Khi bạn đọc code của một người khác, kiểm thử mỗi dòng để xem cách nó làm việc ra sao, bạn sẽ có được sự hiểu biết tốt hơn về toàn bộ bức tranh tổng thể. Nhờ rất nhiều dự án mã nguồn mở, bạn có thể học được về hầu hết mọi thứ – và luôn học hỏi để tiến bộ thêm từng ngày. Chỉ nên nhớ là hãy chia sẻ code của bạn tới cộng đồng nếu bạn đã cải tiến được một chương trình nào đó.
Arrays.asListtrả về một danh sách có thể thay đổi trong khi danh sách được trả về List.oflà không thay đổi :
List<Integer> list = Arrays.asList(1, 2, null);list.set(1, 10); // OK List<Integer> list = List.of(1, 2, 3);list.set(1, 10); // Fails with UnsupportedOperationException
Arrays.asListcho phép các phần tử null trong khi List.ofkhông:
List<Integer> list = Arrays.asList(1, 2, null); // OKList<Integer> list = List.of(1, 2, null); // Fails with NullPointerException
contains cư xử khác với null
List<Integer> list = Arrays.asList(1, 2, 3);list.contains(null); // Returns false List<Integer> list = List.of(1, 2, 3);list.contains(null); // Fails with NullPointerException
Arrays.asListtrả về một khung nhìn của mảng đã qua, vì vậy những thay đổi đối với mảng cũng sẽ được phản ánh trong danh sách. Đối với List.ofđiều này là không đúng sự thật:
Integer[] array = {1,2,3};List<Integer> list = Arrays.asList(array);array[1] = 10;System.out.println(list); // Prints [1, 10, 3] Integer[] array = {1,2,3};List<Integer> list = List.of(array);array[1] = 10;System.out.println(list); // Prints [1, 2, 3]
Trong những năm qua, Việt Nam là đối tác hợp tác kinh tế hàng đầu trong Chính sách hướng Nam mới và là một trong những đối tác kinh tế lớn nhất của Hàn Quốc tại khu vực ASEAN. Không chỉ có các doanh nghiệp lớn, tập đoàn đang từng bước xây dựng các chuỗi cung ứng chiến lược tại Việt Nam mà các doanh nghiệp nhỏ và vừa của Hàn Quốc cũng tăng cường xúc tiến đầu tư tại đây.
Tiếp nối thành công của dự án hợp tác 2020, KICC HCMC cùng TopDev tiếp tục mang đến chương trình hợp tác năm 2021 với thông điệp “Make Your IT Career Outstanding – Khởi sắc sự nghiệp IT của bạn”. Theo đó là những hoạt động phối hợp với mục đích kết nối các việc làm ngành CNTT tại các doanh nghiệp IT Hàn Quốc với đối tượng Lập Trình Viên Việt Nam. Từ đó hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty Hàn Quốc và tạo thêm nhiều cơ hội để các tài năng IT Việt Nam sở hữu những tấm vé gia nhập vào các doanh nghiệp công nghệ hàng đầu của Hàn Quốc hiện đang có mặt tại Việt Nam.
Vậy cơ hội nào đang rộng mở cho các tài năng lập trình viên Việt Nam trong kỳ này? Hãy cùng TopDev khám phá ngay nhé:
1. Cyberlogitec Vietnam
CyberLogitec Vietnam là một Offshore Development Center chuyên cung cấp các dịch vụ và giải pháp Công nghệ thông tin cho các doanh nghiệp thuộc lĩnh vực logistics business: vận tải biển, bến bãi, kho bãi, vận tải đường bộ và giao nhận. Với hơn 10 năm kinh nghiệm trong ngành, công ty tự hào đã mở rộng quy mô hoạt động tại hơn nhiều quốc gia trên thế giới: Hàn Quốc, Mỹ, Thái Lan, Trung Quốc, Ả Rập Xê Út, Thổ Nhĩ Kỳ, UAE, Malaysia, Ấn Độ, Nhật Bản, Brazil và Singapore.
Đến với CyberLogitec, bạn sẽ được hòa nhập vào môi trường quốc tế và được thử thách năng lực của bản thân khi chinh chiến với các dự án quốc tế. Ngoài ra, đây chính là cơ hội giúp bạn tiếp thu thêm nhiều kiến thức mới về Logistics và hệ thống quản lý chuyên nghiệp thông qua quá trình thực hiện dự án.
>>> Bùng nổ năng lực tại CyberLogitec ngay hôm nay tại vị trí Java Developer
2. Space T
Space T là nền tảng thương mại điện tử về nội thất, tập trung vào 3 danh mục: Nội thất, trang trí nhà và sinh hoạt. Space T tự hào là nơi bạn có thể tìm thấy mọi thứ mình cần với mọi mức giá đồng thời phù hợp với thiết kế về không gian sống của bạn.
⇒ Bạn mong muốn được thử sức trong lĩnh vực thương mại điện tử? Đây chính là cơ hội tốt để bạn trổ tài! Khám phá ngay các vị trí đang tuyển tại Space T:
BrickMate Group (BMG) là cơ quan phát triển CNTT toàn cầu có trụ sở chính tại Seoul, Hàn Quốc, với các văn phòng vệ tinh và liên minh tại Thành phố Hồ Chí Minh, Việt Nam. Công ty hiện đối tác phát triển web/ app với một số doanh nghiệp nổi tiếng như Kyobo, Samsung, LG, Megazone,…
Với đà phát triển nhanh chóng, hiện công ty đang gấp rút tìm kiếm các ứng viên tài năng gia nhập. Và nếu bạn mong muốn theo đuổi đam mê công nghệ tại môi trường làm việc chuyên nghiệp, quốc tế nhưng không kém phần năng động cùng đội ngũ trẻ tài năng, hãy tham gia BrickMate Group ngay hôm nay!
⇒ Khám phá các vị trí đang tìm kiếm nhân tài IT Việt Nam tại BrickMate Group:
DaouKiwoom là một trong những tập đoàn hàng đầu trong lĩnh vực CNTT và dịch vụ tài chính tại Hàn Quốc. HIện tập đoàn đang hoạt động tại nhiều quốc gia khác trên thế giới: Nhật Bản, Trung Quốc, Pháp, Indonesia và Việt Nam.
DaouKiwoom Innovation được thành lập vào năm 2018, với mục tiêu phát triển các hoạt động kinh doanh đa dạng tại Việt Nam bằng những trải nghiệm tuyệt vời và năng lực của dịch vụ CNTT tốt nhất của Hàn Quốc.
Cơ hội làm việc toàn cầu cùng hàng loạt đãi ngộ xuất sắc tại DaouKiwoom Innovation đang trao đến tay các tài năng:
⇒ Đâu sẽ là vị trí phù hợp với bạn? Nhanh chóng click ngay link để khám phá nhé!
5. Tourpik Vina
Tourpik Vina có trụ sở chính tại Hàn Quốc, chuyên cung cấp các dịch vụ CNTT liên quan đến du lịch trên toàn thế giới. Có mặt tại Việt Nam, Tourpik Vina mong muốn quảng bá du lịch, phát triển các địa điểm du lịch mới và các tuyến du lịch độc đáo cũng như cung cấp những thông tin hữu ích này cho tất cả các bạn để có một chuyến đi tự do, dễ dàng và thoải mái tại Việt Nam.
Hiện Tourpik Vina đang tìm kiếm Product Owner tài năng cùng chinh phục mục tiêu lớn của công ty tại Việt Nam. Nếu đó là bạn, hãy nhanh chóng gửi CV ngay hôm nay nhé!
Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của các công ty công nghệ Hàn Quốc trong kỳ này, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê công nghệ.
⇒ Và đừng quên KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!
Thông tin chi tiết về dự án vui lòng truy cập tại đây.
Về KICC HCMC và NIPA:
Được thành lập vào ngày 23 tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).
NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.
Địa chỉ: 135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh
Về TopDev – nền tảng tuyển dụng IT
Với hơn 300.000 profile lập trình viên đồng thời sở hữu Cộng đồng Lập trình viên lớn nhất Việt Nam, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam. Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam. (Báo cáo thị trường IT tại đây)
x = 42 trong Python đọc là bind name x tới object 42. Tham khảo thêm tại bài Python call by gì?
3 loại variable trong Python
global variable
Đoạn code sau
print(x)x=42
x viết sát lề, gọi là global variable. Chạy đoạn code trên sẽ hiện ra exception:
NameError:name'x'isnotdefined
do code dùng x trước khi x được bind tới object 42.
local variable
Đoạn code tiếp theo, chạy sẽ thấy gì? Gợi ý: không phải NameError:
deffoo():print(x)x=42foo()
x = 42 nằm trong 1 block (trong thân function hay class), gọi là local variable. Trong 1 block, dùng 1 variable/name trước khi bind nó (tức là có bind, nhưng bind sau khi dùng), exception sẽ xảy ra là
Việc dùng các công cụ (phần mềm/chương trình) để phân tích/tìm lỗi code bằng cách đọc code (text) – mà không cần chạy code, gọi là static analysis. Trong Python phổ biến các công cụ như pep8, flake8, pylint, mypy cũng có thể tính luôn, hay các tính năng tích hợp sẵn của IDE như Pycharm.
flake8 cơ bản giống pep8 (tên mới là pycodestyle), thêm tính năng phát hiện thư viện không dùng tới/ hay biến không tồn tại.
importmathdeffoo():print(x)x=42foo()
khi chạy flake8 với file code, flake8 sẽ phát hiện ra thư viện math được import nhưng không dùng, tên x chưa được định nghĩa.
flake8 rất hữu ích khi dễ dàng phát hiện các lỗi đơn giản như gõ nhầm tên biến hay dùng biến không tồn tại như trên. Nhưng khi x là free variable, không công cụ nào của Python có thể phát hiện ra lỗi này cho tới khi chạy mới thấy exception:
Do x là free variable, các công cụ phải quét hết cả file code để tìm x, và nó tìm thấy, nên tin rằng x có tồn tại, nhưng đã quá muộn rồi. Một ví dụ vô lý hơn nữa, để thấy sự bất lực của các công cụ static analysis:
Hạn chế hết mức việc sử dụng global variable, free variable, cần biến gì thì đưa argument vào function biến đó, code “sát tường” cho hết vào 1 function main và gọi main() nếu cần chạy.
flake8 sẽ làm tốt nhiệm vụ phát hiện ra x chưa được định nghĩa trong ví dụ trên: F821 undefined name 'x', và đoạn code này có thể viết lại để không còn dùng global/free variable nữa:
Tính dynamic của Python khiến các công cụ khó có thể xử lý mọi trường hợp, công cụ sẽ chỉ giúp một phần, phần còn lại là sự cẩn thận của lập trình viên.
Bài viết được sự cho phép của tác giả Trần Anh Tuấn
Sau loạt bài về css flexbox toàn tập chắc hẳn các bạn cũng nắm được kiến thức khá tốt về tạo layout. Tuy nhiên ứng dụng web ngày nay giao diện ngày càng phức tạp nên việc chỉ sử dụng flexbox thực sự vẫn chưa tối ưu, cần nhiều giải pháp hơn để tạo ra layout một cách nhanh nhất , đẹp mà lại không tiêu tốn nhiều sức.
Vì thế mà CSS Grid được sinh ra để giải quyết vấn đề này. Việc tạo layout không còn khó khăn nữa với CSS Grid ta có thể làm được nhiều layout phức tạp một cách dễ dàng, nhanh chóng tuy nhiên nó cũng chưa được nhiều trình duyệt hỗ trợ như flexbox nên việc sử dụng vẫn còn chưa rộng rãi.
Trong series CSS Grid này, mình sẽ tập trung chia sẻ rõ ràng về các thuộc tính trong CSS Grid, cách sử dụng hiệu quả và xử lý khi trình duyệt không hỗ trợ cũng như kèm theo một bài demo kèm giải thích để các bạn dễ hiểu hơn trong khi đọc.
# CSS Grid
Để dễ hình dung trong việc đọc hiểu và học tập mình vẫn sẽ làm trên Codepen cho các bạn tiện xem demo và có thể sửa trên nó cho mau hiểu. Mình sẽ giải thích rõ các thuộc tính và công dụng của chúng thông qua ví dụ dưới đây xuyên suốt bài viết các bạn chú ý nha.
Để sử dụng Grid thì đơn giản chúng ta dùng thuộc tính display: grid; thế là chúng ta đã dùng grid rồi giống như flexbox display: flex; vậy. Đơn giản quá nhỉ keke. Giờ chúng ta đi sâu vào từng thuộc tính một khác của CSS Grid nhá.
DÀNH CHO BẠN:
Mình có khoá học HTML CSS từ cơ bản tới nâng cao cho người mới, nếu bạn quan tâm thì bạn có thể học thử miễn phí bằng việc nhấn vào đây nha.
# grid tracks
Grid tracks hiểu nôm na là các đường được đánh dấu theo thứ tự theo các cột và các hàng để thiết lập vị trí cho các phần tử một cách dễ dàng hơn. Mình khuyến khích các bạn mở Firefox lên để Inspect Code(F12) của demo Codepen ở trên để thấy các grid tracks một cách rõ ràng nhất nha
Các đường đánh dấu theo hàng và cột tương ứng từ trên cùng hoặc ngoài cùng bên trái. Cách để nhớ đơn giản là cứ lấy số cột + 1 sẽ ra tổng tracks theo cột và số hàng + 1 sẽ ra tổng tracks theo hàng. Các bạn thấy đó có 2 cột thì có 3 tracks line cột đánh dấu 1 2 3, còn 5 hàng thì 6 tracks line hàng. -1 là cuối cùng.
Ở đây các bạn chỉ cần hiểu nó là các đường như hình trên là được. Ở bài sau mình sẽ nói chi tiết về công dụng rất quan trọng của nó trong việc tạo layout như thế nào. Do CSS Grid khá nhiều thuộc tính nên mình không gom vào một bài được.
# grid-template-columns
Columns đúng như tên gọi là cột, khi sử dụng thuộc tính này grid container sẽ chia cột cho các phần tử bên trong nó. Ở đây các bạn có thể chia bao nhiêu cột tùy các bạn, thường dựa vào design thiết kế là 12 cột bằng nhau, có khi 8….
Ví dụ ở đây mình có 10 phần tử, mình muốn chia mỗi cột có 2 phần tử thì mình sẽ chia cho 5 cột. Đơn vị ở đây các bạn có thể dùng px, %, em rem, auto hay gì tùy các bạn. Tuy nhiên ở đây có một giá trị mới chỉ dùng trong css grid đó là fr(fractional unit). Giá trị này mình sẽ giải thích ở một phần sau nha.
Các bạn muốn chia bao nhiêu cột thì cứ điền vô thêm như thế này grid-template-columns: cột1 cột2 cột3.... cộtN tương ứng grid-template-columns: 10px 100px 1fr auto... Đấy các bạn nên áp dụng thử xem để mau hiểu hơn nha, dùng cái Codepen của mình ở trên có note sẵn cho các bạn để điền vào thử rồi á chớ đọc không mà không làm là mù màu với nó đấy.
# fraction-unit
Đây là một giá trị mới và dùng trong CSS Grid nha các bạn. Giá trị này sẽ chiếm khoảng trống lớn nhất có thể để mình giải thích cho các bạn dễ hiểu nà. Giả sử container có độ rộng là 100% và lúc này grid-template-columns: 1fr thì sẽ tạo ra một cột là 100%. Nên các phần tử sẽ nằm cùng một cột như dưới đây
Tuy nhiên nếu mình thêm vài đơn vị fr vào nữa lúc này sẽ là grid-template-columns: 1fr 2fr 1fr chẳng hạn thì layout nó sẽ tạo ra 3 cột với cột giữa là 2fr sẽ gấp đôi 2 cột còn lại. Nghĩa là container 100% sẽ chia cho 4 và cột đầu tiên và cột cuối cùng sẽ chiếm 25% còn 50% còn lại là cột ở giữa.
.container{
grid-template-columns: 1fr2fr1fr;
}
Các bạn có thấy nó quen quen không, khá là giống cái thuộc tính flex-grow trong css flexbox mình nói ở phần 3 của series css flexbox toàn tập ý. Khác cái là đây nó áp dụng cho grid và để chia cột nhá nên đừng hiểu nhầm nha.
# grid-template-rows
Cũng tương tự như grid-template-columns nhưng thuộc tính này là chia hàng(row). Các bạn có thể chia container thành nhiều hàng tùy vào thiết kế hoặc có thể không cần set, để tự động(auto) cũng được.
Các bạn thấy nó cũng khá đơn giản chứ nhỉ. Các bạn có thể tạo bao nhiêu hàng tùy ý và có thể dùng các đơn vị như ở thuộc tính grid-template-columns mà mình đã nói ở trên. Ở đây mình có 10 phần tử thì mình muốn chia thành 3 cột và 3 hàng thì nó sẽ như thế này
Tuy nhiên còn một phần tử cuối cùng nó không còn chỗ vì chia 3 cột 3 hàng thì được 9 phần tử thôi nên nó sẽ tự động rớt xuống tạo nên đường Implicit Tracks. Trong grid có 2 khái niệm về tracks đó là Implicit và Explicit, vậy nó là gì ? Các bạn kéo xuống dưới đọc để hiểu nha.
# grid implicit và explicit tracks
Hai đường này hơi lằng nhằng chút nhưng cũng dễ hiểu thôi thường khi làm mình không để ý lắm, nhưng viết bài thì mình phải nói rõ cho các bạn biết thêm. Như phần trên mình nói do có 10 phần tử, mà mình chỉ tạo 3 cột 3 hàng thì phần tử cuối sẽ rớt xuống tạo thành 1 hàng mới.
Các bạn mở giúp mình cái Codepen ở phần grid-template-rows lên bằng Firefox rồi F12 mở layout Grid lên được như hình trên. Các bạn zoom trình duyệt lên cho thấy rõ là có 1 đường đen ở trên cùng và những đường có dấu gạch ngang – cho tới một đường đen ở hàng số 4 đây chính là Explicit Tracks.
Còn một đường dấu … ở hàng số 5 đó là do container không đủ chỗ chứa cho phần tử số 10 nên nó rớt xuống tạo nên 1 hàng mới và tạo nên đường dấu… chứ không phải đen hay gạch ngang – như ở Explicit Tracks đây chính là Implicit Tracks.
Hai đường này giúp chúng ta nhận biết được vị trí của các phần tử để hiển thị cho đúng nha anh em. Để việc chia cột hay hàng trong layout được hiển thị chính xác nà.
# grid-auto-flow
Như ở trường hợp trên khi có một hoặc nhiều phần tử bị dư do không đủ cột hay hàng thì nó sẽ rớt xuống tạo nên hàng mới. Thì mình muốn set cho các phần tử bị rớt ra tạo nên Implicit Tracks có chiều cao nhất định nào đó. Chúng ta sẽ dùng thuộc tính grid-auto-flow: row kết hợp với thuộc tính grid-auto-rows để set cho các phần tử đó
Ở đây mình muốn cho phần tử số 10 khi rớt xuống tạo nên hàng mới có chiều cao là 100px thì mình set grid-auto-rows: 100px. Các bạn xem demo Codepen là sẽ hiểu ngay thôi.
Còn nếu các bạn muốn các cột đều nằm trên một hàng và tạo thành nhiều cột khác cho dù ban đầu bạn chỉ set có 2 cột mà thôi thì cũng tương tự chúng ta sử dụng thuộc tính grid-auto-flow: column nhưng giá trị là column.
Mình muốn các cột được tạo thêm đều bằng nhau và có giá trị là 250px thì mình sẽ code như thế này
Nếu các bạn bỏ thuộc tính grid-template-columns ra thì nó cũng sẽ tự động tạo ra các cột tương ứng với số phần tử và độ rộng các cột là 250px.
# grid-gap
Thuộc tính này giúp chúng ta tạo khoảng cách giữa các phần tử với nhau theo cột và hàng. Thuộc tính này bao gồm thuộc tính grid-row-gap và grid-column-gap được viết như sau grid-gap: grid-row-gap grid-column-gap.
Các bạn có thể thấy hình minh họa dưới đây mình cho grid-gap: 20px. Nó sẽ tạo khoảng cách giữa các phần tử 20px theo cột và hàng luôn rất đều và đẹp
# Tạm kết
Phù!!! Bài viết tạm đến đây thôi. CSS Grid hại não lắm nên mình viết thành nhiều phần, đây mới chỉ là bước dạo đầu thôi các bạn ah. Đó mình học mãi mới hiểu được nó giờ thì hiểu tàm tạm rồi nên viết để chia sẻ cho các bạn.
Mình biết là nó hơi khó hiểu, các bạn chịu khó đọc và làm theo nha. Nếu không hiểu thì cứ comment hoặc inbox hỏi mình nhé. Nếu có góp ý hay gì thì comment cho mình phát để có động lực viết bài nha. Xin cám ơn và chúc các bạn một ngày tốt lành..
docker run -d --name registry -p 5000:5000 -v /data/registry:/var/lib/registry registry:2
Với câu lệnh trên mình thực hiện expose port 5000 trên container với port 5000 trên host; mapping folder /data/registry trên host với folder /var/lib/registry (các images được push lên server registry sẽ lưu tại folder này)
Trên máy mình đang có một images ubuntu:18.04, Nếu chưa có thì bạn có thể pull về bằng lệnh:
docker pull ubuntu:18.04
Bây giờ mình sẽ đánh tag lại để push lên server registry vừa chạy.
docker image tag ubuntu:18.04 localhost:5000/ubuntu:18.04
trong đó localhost:5000 là địa chỉ registry server, ubuntu:18.04 là tên và tag mới của image (phần này các bạn đặt tùy ý)
Thực hiện push image localhost:5000/ubuntu:18.04 lên server registry
Để kiểm tra các image được lưu trên server registry ta truy cập vào url localhost:5000/v2/_catalog
Bây giờ muốn sử dụng image trên server registry ta pull về như bình thường:
docker pull localhost:5000/ubuntu:18.04
Khi đó, hệ thông sẽ connect tới server registry ở địa chỉ localhost:5000 để lấy image chứ không lấy image từ docker repository.
Bài viết được sự cho phép của BQT Kinh nghiệm lập trình
Hầu hết các website đều không thể thiếu Javascript vì đây là thành phần quan trọng giúp tạo hiệu ứng riêng cho từng trang. Tuy nhiên, sự kết hợp giữa Javascript và CSS với những đoạn code dài dòng, phức tạp đã gây không ít rắc rối cho người dùng. Và jQuery được ra đời như một phương thức mới giúp đơn giản hóa mọi thao tác trên website. Vậy jQuery là gì? Ứng dụng jQuery và các thư viện jQuery phổ biến nhất hiện nay ra sao? Hãy cùng tìm hiểu ngay sau đây nhé.
jQuery là một thuật ngữ được dùng rất nhiều trong thời đại công nghệ hiện nay. Kể từ khi phát triển 2.0, cụm từ này đã được dùng khá phổ biến. Vậy jQuery thật sự là gì? Nói một cách dễ hiểu, jQuery là một thư viện được xây dựng trên Javascript. Chúng được tạo ra mới mục đích hỗ trợ các lập trình viên giải quyết các khó khăn khi sử dụng Javascript. jQuery được tích hợp từ nhiều module chuyên biệt, bao gồm cả module hiệu ứng đến module truy vấn selector.
jQuery với phương châm ưu việt “ viết ít làm nhiều” đang rất phổ biến hiện nay
Đồng thời cũng có thể hiểu jQuery là một thư viện Javascript đa tính năng, nhanh chóng, tiện dụng. Thư viện này được tạo ra bởi John Resig vào năm 2006 với phương châm hoạt động vô cùng ưu việt: viết ít hơn – năng suất hơn. jQuery đơn giản hóa các thao tác duyệt tài liệu HTML, tăng cường tương tác Ajax để có thể nâng cao tối đa hiệu quả phát triển website. Hiện nay công cụ hỗ trợ này được sử dụng vô cùng rộng rãi. Theo thống kê, có đến 99% các website trên thế giới sử dụng thư viện này, trừ những trang dùng JS Framework.
jQuery – một số tính năng quan trọng
Thao tác DOM: jQuery cho phép người dùng đơn giản hóa việc lựa chọn các phần tử DOM để duyệt như khi dùng CSS. Cùng với đó, người dùng cũng có thể sử dụng phương tiện selector mã nguồn mở để chỉnh sửa nội dung của chúng.
Xử lý sự kiện: thư viện jQuery xử lý các sự kiện một cách nhanh chóng chính xác và hiệu quả mà không làm HTML code rối với các Event Handler. Nhờ đó nâng cao khả năng tương tác với người dùng một cách tối đa.
Hỗ trợ AJAX: bằng việc sử dụng công nghệ AJAX, jQuery cho phép lập trình viên phát triển website với đa dạng các tính năng và phản hồi tích cực hơn.
Tạo hiệu ứng động: jQuery cho phép cung cấp đa dạng các hiệu ứng động đẹp mắt, độc đáo cho website, giúp trang trở nên sinh động và chuyên nghiệp hơn
Kích thước cực kỳ gọn nhẹ: thư viện này vô cùng gọn nhẹ, vì vậy chạy rất mượt và nhanh. jQuery chỉ có 19KB
Được hỗ trợ cho hầu hết các trình duyệt hiện nay: ứng dụng này làm việc cực tốt trên IE 6.0+, FF 2.0+, Safari 3.0+, Chrome và Opera 9.0+ và hầu như được hỗ trợ ở tất cả các trình duyệt khác.
Cập nhật và hỗ trợ các ứng dụng mới nhất: hỗ trợ CSS3 Selector và cú pháp XPath cơ bản giúp lập trình viên có thể tiếp cận với những công nghệ tân tiến nhất của thời đại khoa học – máy tính 4.0
Những cách sử dụng jQuery hiện nay
Có hai cách sử dụng jQuery phổ biến nhất hiện nay chính là cài đặt cục bộ và sử dụng từ CDN:
Cài đặt cục bộ: bạn có thể thư viện jQuery từ máy chủ và đưa vào hệ thống HTML. Lập trình theo cú pháp sau để có thể đưa jQuery vào HTML file:
Sử dụng CDN: người dùng có thể tự thêm jQuery vào trong HTML code trực tiếp từ Content Delivery Network (CDN) một cách vô cùng đơn giản. Google và Microsoft đều cung cấp những phiên bản mới nhất để mang đến những tính năng đột phá. Chỉ cần nhập lệnh sau khi sử dụng CDN Google:
Với hai cách sử dụng trên, kết quả trả ra đều sẽ là “Xin chào bạn”
Cách để gọi một hàm thư viện jQuery
Trước khi sử dụng các đoạn code của jQuery để chỉnh sửa hoặc đọc DOM, cần đảm bảo thêm vào các sự kiện khi DOM đã sẵn sàng. Điều kiện sử dụng này cũng tương tự như JavaScript. Và để một sự kiện hoạt động tốt trên website, lập trình viên cần gọi tên chúng trong Hàm $(document).ready(). Các dữ liệu bên trong sẽ được tải lên trước khi nội dung trang được tải và khi DOM sẵn sàng
Những lý do lập trình viên nên sử dụng thư viện jQuery
Không phải ngẫu nhiên mà jQuery lại được sử dụng trong hầu hết các website trên thế giới. Thư viện lập trình này cho phép người dùng nâng cao tối đa khả năng tương tác và hoạt động của trang nhờ sở hữu những tính năng ưu việt:
jQuery rất nhanh và có khả năng mở rộng
Đơn giản hóa việc viết code. Giúp người dùng có thể viết các mã chức năng liên quan đến giao diện một cách dễ dàng
Cho phép các ứng dụng web tương thích với trình duyệt cùng phát triển.
Sử dụng hầu hết các tính năng hiện đại của các trình duyệt mới
Hỗ trợ trên hầu hết các trình duyệt
Trên đây là những kiến thức lập trình liên quan đến jQuery. Hy vọng các chia sẻ này có thể cung cấp đến quý bạn đọc những thông tin bổ ích.
Nhìn logo thôi cũng thấy con chim này nóng tính vcl. Bé tẹo tèo teo nhưng thực ra võ nghệ đầy mình.
MyBatis là một persistence framework mã nguồn mở. Được tạo ra nhằm đơn giản hóa việc kết nối đến CSDL của JDBC. Ngoài ra nó còn cung cấp các API để giúp việc thao tác với Database được dễ dàng hơn.
Tất nhiên, để hiểu được về MyBatis, các bạn cần có một chút kiến thức về JDBC (Java Database Conectivity), hãy tham khảo bài viết này.
Thật sự đây là một trong những điểm mình thích nhất ở MyBatis. Nhớ trước đây làm 3 dựa án convert từ Database từ Oracle sang Postgres. Mở đống source sử dụng JDBC toàn cộng chuỗi String bằng “+”, nhìn vào thôi là chả muốn cơm nước gì nữa. Dự án như là cực hình, phải thật cố gắng mới kết thúc dự án được (rất may không lỗ).
Sử dụng “+” để tạo chuỗi String query, nỗi ám ảnh một thời của lập trình viên.
Trớ trêu thay, việc Concat String kiểu này lại chỉ là nỗi ám ảnh cho người maintanance code, chứ người phát triển dự án từ đâu lại không có vấn đề gì =))).
2.2 Dễ hiểu, dễ sử dụng.
Một khi đã nắm chắc kiến thức về SQL và Java, rất dễ dàng để sử dụng MyBatis. Ngoài một lượng lớn document, chỉ có một số ít kiến thức mới cần phải học thêm.
Có rất nhiều tài liệu viết về MyBatis rất dễ đọc.
2.3 Dễ tích hợp cho Spring và Guice framework
Mặc dù các dự án Spring thường được “đính kèm” sử dụng với Hibernate. Tuy nhiên, cả Eclipse và IntelliJ đều hỗ trợ cài đặt con chim ngáo ngơ như là một plugin. Không jar, không file download, rất tiện. Ngoài ra, việc thay đổi giữa các phiên bản cũng không quá khó khăn.
Cài đặt MyBatis trên IntelliJ cũng như Eclipse tương đối dễ dàng.
2.4 Hiệu năng truy vấn cao (High perfomance)
Với cơ chế cache và polling connection. MyBatis cho hiệu năng truy vấn cao hơn hẳn so với JDBC. Tuy nhiên, khi thực hiện Select ở lần đầu tiên, JDBC vẫn chưa hề tìm ra đối thủ, nó chỉ hụt hơn do lần nào SELECT cũng phải gọi tới Database, tất nhiên không thể bằng lấy kết quả từ cache.
“Con chim của chúng ta” xem ra thực sự vượt trội khi thực hiện update và delete nhiều record.
Hiệu năng chính là vấn đề chính chúng ta tìm hiểu ở bài viết này. Có 3 yếu tố làm tăng perfomance, chi tiết sẽ có ngày sâu đây.
3. Performance (hiệu năng).
Performance is one of the key factors for the success of any software application. There are lots of things to consider for better performance, but for many applications, the persistence layer is a key for overall system performance.
Hiệu năng chính là chìa khóa cho thành công đối với mọi phần mềm. Có rất nhiều thứ có thể làm tăng hiệu năng. Đối với nhiều ứng dụng, lớp đặc tả giao diện chính là chìa khóa cho hiệu suất tổng thể của hệ thống.
Vậy tại sao sử dụng mybatis lại làm tăng hiệu suất của hệ thống?. Có 3 yếu tố ảnh hưởng trực tiếp:
3.1 Hỗ trợ connection polling.
MyBatis supports database connection pooling that eliminates the cost of creating a database connection on demand for every request.
MyBatis hỗ trợ kết nối database polling, điều này giúp giảm chi phí khởi tạo connection tới database cho tất cả request.
Đối với các biện chưa biết về polling có thể tham khảo thêm bài viết về http polling và connection pool. Bình thường mỗi request yêu cầu mở kết nối tới database sẽ được tạo connection riêng. Khi sử dụng Mybatis, với cơ chế polling (sau khi một kết nối được tạo và sử dụng xong nó sẽ không đóng lại mà sẽ duy trì trong connection pool để dùng lại cho lần sau và chỉ thực sự bị đóng khi hết thời gian timeout). Chính việc sử dụng polling đã giảm bớt đáng kể chi phí khởi tạo connection, qua đó tăng perfomance của application.
Mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.
<environments default = "development">
<environment id = "development">
<transactionManager type = "JDBC"/>
<dataSource type = "POOLED">
<property name = "driver" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/details"/>
<property name = "username" value = "root"/>
<property name = "password" value = "password"/>
</dataSource>
</environment>
</environments>
Cấu hình polling trong MyBatis tương đối đơn giản. Kiểu của dataSource chỉ cần thiết lập type = “POOLED”.
3.2 Sử dụng cache cho query trùng lặp.
MyBatis has an in-built cache mechanism which caches the results of SQL queries at the SqlSession level. That is, if you invoke the same mapped select query, then MyBatis returns the cached result instead of querying the database again.
MyBatis có cơ chế cache lại kết quả từ SQL queries, trên cấp độ SqlSesssion. Điều đó có nghĩa răng, nếu bạn gọi lại một câu select query đã được ánh xạ vào bộ đệm (cache), thì Mybatis sẽ không thực hiện query ở database nữa, nó sẽ lấy kết quả trực tiếp từ cache.
Khi thực hiện, Mybatis sẽ chỉ thực hiện firstSelectWithCache. Tuy nhiên, khi gặp câu SQL thứ 2 giống hệt SQL1 và trong cùng sqlsession, nó sẽ lấy kết quả trực tiếp từ cache. Việc này tuy nhỏ, nhưng đối với những ứng dụng cần query dữ liệu nhiều lần, trùng lặp từ database, sử dụng Mybatis giúp tăng hiệu năng lên đáng kể.
The results of all queries are stored in the cache. Tất cả kết quả của queries đều được lưu vào cache.
End a transaction (or at the end of a query configured with autoCommit = true). Cache chỉ được xóa khi kết thúc transaction (hoặc khi query được thiết lập autoCommit = true).
Whenever an insert / update / delete query is made. Khi thực hiện các câu insert/ update/ delete.
Chi tiết hơn, Mybatis hỗ trợ 2 tầng cache. Thứ nhất là session cache, hai là global cache. Vấn đề này sẽ được tìm hiểu sâu hơn ở bài viết tiếp theo.
3.3 Không sử dụng proxy.
MyBatis doesn’t use proxying heavily and hence yields better performance compared to other ORM frameworks that use proxies extensively.
4. Kết luận.
MyBatis may not be the ideal or best solution.If your application is driven by an object model and wants to generate SQL dynamically, MyBatis may not be a good ft for you. Also, if you want to have a transitive persistence mechanism (saving the parent object should persist associated child objects as well) for your application, Hibernate will be better suited for it.
Mybatis có thể không là lựa chọn tốt nhất. Nếu ứng dụng của bạn cung cấp những cấu SQL động (dynamically), MyBatis có thể không tốt cho bạn. Tuy nhiên, nếu bạn muốn một cơ chế lưu trữ lâu dài (các object cha được lưu trữ và giữ liên kết tới các object con) thì Hibernate sẽ là trong những lựa chọn không tồi.
Nếu câu query cần sử dụng nhiều điều kiện if else, hoặc cần for loop một dãy giá trị IN. Hiển nhiên MyBatis là lựa chọn tốt nhất.
2. document tuân thủ định dạng BSON (gần giống JSON), một document gồm một hay nhiều cặp field:value như đã trình bày ở trên.
Chúng ta bắt đầu các thao tác với dữ liệu:
Gõ Windows + R, gọi tiện ích Run.
Gõ cmd, gọi tiện ích dòng lệnh (command line).
Cần 2 cửa sổ cmd, một để khởi chạy MongoDB bằng lệnh
mongod
một cửa sổ cmd khác để khởi chạy MongoDB client bằng lệnh
mongo
CSDL test mặc định được gọi ra (sau khi cài đặt MongoDB thì đã có sẵn CSDL này).
Mẹo: Các thao tác thực hành sẽ sử dụng dòng lệnh nhiều, khi câu lệnh dài, khó nhớ, bạn bấm phím Tab để có gợi ý câu lệnh, có thể bấm phím Tab nhiều lần để xuất hiện câu lệnh mong muốn.
Hiển thị các database hiện có:
show dbs
Có nhiều database trong MongoDB, để sử dụng thao tác với database nào thì cần khai báo bằng lệnh
usetên_database ví dụ
Để xóa database restaurants, gõ lệnh
db.dropDatabase()
TẠO MỚI CƠ SỞ DỮ LIỆU
Để tạo một Cơ sở dữ liệu hoàn toàn mới, bạn sử dụng câu lệnh insert vào một database chưa sẵn có:
usesmartJob
Để chèn collection employee (collection này có một document) đầu tiên cho CSDL smartJob, sử dụng câu lệnh:
Chúng ta đã tạo mới CSDL smartJob có một collection đầu tiên, collection đầu tiên có một document. Kiểm tra bằng cách gõ lệnh
show dbs
Chúng ta sẽ thêm mới 2 document mới vào collection có tên employee (thuộc về CSDL smartJob)
db.employee.insert({fullname:"Hoang Thi Hong Nhung",birth_year:"1990",email:"nhunghth@smartJob.vn",group:["van_phong","nhan_su"]})db.employee.insert({fullname:"Nguyen Thi Van Anh",birth_year:"1992",email:"anhntv@smartJob.vn",group:["van_phong","ke_toan"]})
Để xem dữ liệu nằm trong collection employee của CSDL smartJob, gõ lệnh
db.employee.find();
hoặc
db.employee.find().pretty();
phương thức pretty() sẽ giúp nội dung dễ đọc hơn do đã được tự động định dạng
Để cập nhật năm sinh cho nhân viên “Nguyen Thi La”, từ năm 1987 thành 1970, ta sử dụng câu lệnh:
Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh
Mình đã giới thiệu với các bạn về OAuth 2.0 và OAuth 2.0 chỉ là một framework liên quan đến Authorization, nghĩa là nó chỉ định nghĩa những resources nào mà một Client Application có thể sử dụng trong access token, để khi request tới Resource Server, Resource Server sẽ căn cứ vào access token để quyết định có cho phép Client Application access tới resource hay là không?
Thế nhưng nói về security, các bạn có thể biết, chúng ta còn có cả authentication và OpenID Connect là một extension của OAuth 2.0 được giới thiệu để bổ sung phần authentication này. Sử dụng OpenId Connect thì nội dung của access token mà Client Application sử dụng để request tới Resource Server sẽ bao gồm cả thông tin user đang grant quyền truy cập tới những resources này.
Trong OpenID Connect thì Authorization Server được gọi là Identity Provider. Identity Provider sẽ đảm nhận chức năng authentication và authorization.
Access token được issue bởi một Identity Provider như mình đã nói, sẽ chứa thông tin của authenticated user, những thông tin này gọi là Idenitity Token hay gọi tắt là ID token.
Dưới đây là nội dung của một access token mà mình đã decode sử dụng trang web https://jwt.io/:
Phần nội dung phía dưới claim ‘scope’, mà mình đánh dấu trong access token ở trên, chính là nội dung của ID token đó các bạn. Các bạn có thể thấy đây là những thông tin về user đã đăng nhập và grant access cho Client Application. Các bạn có thể xem thông tin những standard claims của ID token tại đây.
Các open source Identity and Access Management hiện nay ví dụ như Keycloak đều hiện thực OpenID Connect luôn chứ không chỉ OAuth 2.0.
Bài viết được sự cho phép của blogchiasekienthuc.com
Ngoài có sự thay đổi gần như hoàn toàn về giao diện người dùng so với Windows 7 thì Windows 10 cũng nhận được rất nhiều cải tiến về tính năng, hiệu năng và sự ổn định của toàn hệ thống trong suốt quá trình sử dụng và làm việc của người dùng chúng ta.
Nhưng đó là trên những chiếc máy tính với cấu hình tầm trung và có sử dụng ổ cứng SSD, còn với số còn lại, cụ thể là những máy tính cấu hình thấp, sử dụng ổ cứng HHD thì thực sự, Windows 10 đúng là một cơn ác mộng ◔◡◔
Những chiếc máy tính cũ sử dụng hệ điều hành Windows 7 khi nâng cấp lên Windows 10 thì hiệu năng sẽ bị giảm sút rõ rệt, thường xuyên bị treo, đơ và Full disk 100% trong quá trình sử dụng. Thậm chí tình trạng này còn xảy ra ngay cả khi vừa mới khởi động vào hệ thống.
Để khắc phục được điều này, các bạn phải áp dụng rất nhiều thủ thuật để tối ưu hiệu năng Windows 10, và trên Blog thì admin cũng đã chia sẻ với chúng ta một bài viết rất hay, bạn có thể tham khảo lại tại đây nhé !
Nguyên nhân gây ra vấn đề này thì có rất nhiều, nhưng phổ biến và được các bạn biết đến nhiều nhất có lẽ là dịch vụ Superfetch.
Vậy Superfetch là gì? và tại sao nó lại gây ra tình trạng giật lag và treo máy đối với các máy tính đời cũ có sử dụng hệ điều hành Windows 10?
Câu hỏi đó cũng chính là nội dung mà mình muốn chia sẻ với các bạn ngày hôm nay. Vâng, bài viết này chúng ta sẽ cùng tìm hiểu kỹ hơn về tiến trình Superfetch trên hệ điều hành Windows.
#1. Tiến trình Superfetch trên Windows là gì ?
Superfetch thực tế đã xuất hiện từ lâu, mình nhớ không nhầm thì có từ phiên bản Windows Vista nhưng mãi tới phiên bản Windows 10 thì nó mới được chú ý…
Đơn giản vì nó là một trong những nguyên nhân gây ra lỗi Full Disk 100% cho các máy tính sử dụng ổ cứng HDD truyền thống.
Theo như Microsoft, Superfetch có tác dụng duy trì và cải thiện hiệu năng của hệ thống theo thời gian sử dụng nên khó có thể thấy được hiệu năng thực sự của nó trong thực tế.
Thay vào đó, chúng ta thường có thói quen tắt hẳn dịch vụ này đi ngay sau khi cài đặt Windows 10.
Kể từ phiên bản cập nhật Windows 10 version 1803 trở đi, có lẽ tiến trình này bị người dùng tắt nhiều quá nên Superfetch đã được Microsoft đổi tên thành Sysmain để người dùng không tìm thấy Superfetch mà tắt nữa 😛
Bố ông kễnh Microsoft 🙂
Superfetch khi hoạt động sẽ luôn chạy nền (chạy ngầm) trong suốt quá trình bạn sử dụng máy tính và từ từ phân tích dữ liệu sử dụng RAM và các ứng dụng bạn thường xuyên sử dụng nhất.
Qua nhiều lần phân tích, các ứng dụng đó sẽ được phân loại thành “thường xuyên sử dụng” và được ưu tiên tải trước dữ liệu vào bộ nhớ RAM để cải thiện hiệu năng.
Từ đó, mỗi khi bạn khởi động những ứng dụng này, nó sẽ load nhanh hơn rất nhiều vì tất cả dữ liệu cần thiết đã được tải sẵn vào bộ nhớ RAM, mà tốc độ của RAM nhanh cỡ nào thì bạn biết rồi đó 😀
Mặc định thì Superfetch sẽ có xu hướng chiếm hết những phần bộ nhớ còn trống mà Windows chưa sử dụng đến để lưu dữ liệu ứng dụng.
Nhưng ngay khi hệ thống cần, chẳng hạn như để tải dữ liệu của ứng dụng khác thì tất cả dung lượng bộ nhớ RAM mà Superfetch đang chiếm sẽ được nó giải phóng ngay nếu cần.
Trên Windows cũng có một tính năng tương tự như Superfetch có tên là Prefetch và có thể coi Superfetch là một sự kế thừa của Prefetch.
Khác biệt là ở chỗ, Prefetch không thực hiện phân tích dữ liệu sử dụng theo thời gian và điều chỉnh các thông số tải trước dữ liệu một cách hợp lý mà thôi.
#2. Superfetch có thực sự cần thiết với PC Windows?
Đa số chúng ta đều sẽ tắt dịch vụ Superfetch đi vì cho rằng nó là nguyên nhân chính gây ra lỗi Full Disk cực kỳ khó chịu cho các máy tính sử dụng ổ cứng HDD. Nhưng trong thực tế, Superfetch thực sự rất hữu dụng đối với quá trình hoạt động của Windows 10.
Và như bạn có thể thấy ở hình bên trên, nếu bạn có một chiếc máy tính với cấu hình tầm trung hay cùi cùi giống mình cũng được, và có sử dụng ổ cứng SSD thì Superfetch hoạt động cực kỳ trơn tru mà đến nỗi bạn cũng chẳng nhận ra sự tồn tại của nó nữa.
Ở trạng thái bình thường, nó chỉ sử dụng 1.1 MB RAM và hầu như không động chạm đến các tài nguyên khác của hệ thống như CPU, ổ cứng, mạng và GPU.
Tuy nhiên, vẫn có một vài vấn đề mà bạn sẽ gặp phải khi Superfetch được kích hoạt trên Windows 10:
1/ Vì Superfetch luôn chạy nền nên thỉnh thoảng nó sẽ ngốn rất nhiều RAM và tài nguyên hệ thống gây giật lag trong quá trình sử dụng, tất nhiên điều này rất ít khi xảy ra với ổ SSD và dung lượng RAM >4GB.
2/ Việc tải trước một lượng lớn dữ liệu ứng dụng từ ổ cứng HDD vào RAM cũng sẽ khiến cho quá trình khởi động bị chậm đi đáng kể, vì tốc độ của ổ HDD rất chậm.
Và đồng thời, đây cũng chính là nguyên nhân gây ra lỗi Full Disk 100% làm cho máy tính bị đơ trong một thời gian ngắn sau khi khởi động xong, vậy nên cách khắc phục mà đa số mọi người chọn lựa sẽ là tắt hẳn Superfetch đi như các bạn đã biết rồi.
3/ Thêm vào đó, nếu bạn đang sử dụng Windows 10 với ổ cứng SSD thì gần như sẽ không nhận thấy được những sự khác biệt về hiệu năng mà Superfetch mang lại, vì tốc độ của SSD đã rất nhanh rồi, việc tải trước dữ liệu là điều không cần thiết nữa.
Ngoài ra, Superfetch cũng có thể gây ra tình trạng giật lag khi chúng ta chiến game, đặc biệt là với các máy tính chỉ có 4GB hoặc ít hơn.
Lý do thì đến hiện tại vẫn chưa được tìm ra vì không phải tất cả chúng đều gặp hiện tượng này, nhưng tình trạng này có liên quan tới các game “ngốn RAM” vì các tựa game này liên tục yêu cầu thêm RAM khiến dịch vụ Superfetch phải tải rồi lại giải phóng dữ liệu khỏi RAM liên tục và liên tục.
Vậy tóm lại, Superfetch có ích như vậy thì tắt nó đi có làm sao không ? Có ảnh hưởng gì không ? Câu trả lời là: Không, sẽ không có ảnh hưởng gì tới Windows 10 của bạn nếu Superfetch bị tắt.
Trong trường hợp máy tính hoạt động trơn tru và không gặp những vấn đề mà mình kể trên thì cứ để như vậy, không cần phải tắt Superfetch đâu nha các bạn.
Nếu bạn vẫn thường xuyên gặp tình trạng Full Disk 100%, chiếm rất nhiều bộ nhớ RAM và hiệu năng tổng thể bị giảm khi chạy các tác vụ cần nhiều RAM thì việc tắt Superfetch sẽ giúp khắc phục được phần nào. Còn không hãy bật lại dịch vụ này trên Windows 10.
#3. Lời kết
Như vậy là mình và các bạn đã vừa tìm hiểu xong về dịch vụ Superfetch hay còn gọi là Sysmain trong các phiên bản cập nhật mới của Windows 10, một dịch vụ hệ thống mà có lẽ đã quá quen thuộc với nhiều bạn trên Blog Chia Sẻ Kiến Thức rồi 🙂
Hy vọng là qua bài viết này các bạn sẽ hiểu hơn về tiến trình Superfetch (Sysmain), cũng như là ý nghĩa thực sự của Superfetch và có nên tắt dịch vụ Superfetch (Sysmain) hay không?
Nếu thấy bài viết này hay và hữu ích thì đừng quên chia sẻ nó để ủng hộ cho Blog nha các bạn. Chúc các bạn thành công !
Trước khi phát hành Java 8, lập trình viên Java phàn nàn nhiều về API xử lý thời gian. Nhiều class, method DateTime API cũ đã được đánh dấu bằng annotation @Deprecated (“Bị phản đối”). Các class, method xử lý thời gian cũ vẫn dùng được (để đảm bảo tính tương thích ngược của JDK) tuy nhiên không khuyến khích sử dụng.
Trước Java 8, lập trình viên Java xử lý các bài toán thời gian phức tạp, cần sự chính xác thì dùng thư viện nào? Dùng thư viện Joda-time [2]. Hiện nay, với JDK 8 [3], DateTime API mới mang đến sự đơn giản và mạnh mẽ.
Các class mới trong package java.time.*
java.time.Clock: Đồng hồ xử lý thời gian, ngày, giờ có xét đến múi giờ (time-zone) java.time.Duration: Xử lý dựa trên thời lượng của thời gian (ví dụ: Thời lượng 42.3 giây) java.time.Instant: Điểm thời gian trên Lịch biểu LocalDate: Thời gian địa phương (tính theo múi giờ), tuân theo hệ thống lịch quy chuẩn ISO-8601, ví dụ: 2016-02-02
v.v..
Ví dụ minh họa tính linh hoạt, dễ dùng của DateTime API mới
package vn.smartJob.newDateTime;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.Year;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
public class LifeIsShort {
public static void main(String[] args) {
// Khởi tạo đối tượng Thời gian là hiện tại (Giờ địa phương).
LocalDateTime now = LocalDateTime.now();
System.out.println("[1] Giờ hiện tại: " + now);
System.out.println("[2] Năm nay có phải là năm nhuận không? " + Year.isLeap(now.getYear()));
Year twoYearsAfter = Year.of(2016).plusYears(2);
System.out.println("[3] Hai năm sau đó là năm " + twoYearsAfter + ", có phải là năm nhuận không? "
+ twoYearsAfter.isLeap());
// Khởi tạo ngày địa phương từ ba giá trị: Năm + Tháng + Ngày.
LocalDate today = LocalDate.of(2016, Month.FEBRUARY, 11);
System.out.println("[4] Hôm nay là ngày: " + today);
// Khởi tạo giờ địa phương từ xâu ký tự.
LocalTime tenHourPM = LocalTime.parse("22:44:30");
System.out.println("[5] Mười giờ 44 phút buổi tối: " + tenHourPM);
// Khởi tạo giờ địa phương, từ Giờ + Phút. Ví dụ: 2 giờ 42 phút chiều.
LocalTime twoHour42minsPM = LocalTime.of(14, 42);
System.out.println("[6] Hai giờ 42 phút chiều: " + twoHour42minsPM);
// Ngày được lấy làm mốc trong hệ thống máy tính là 01/01/1970.
LocalDate mileStone = LocalDate.ofEpochDay(0);
Temporal ldt1 = LocalDateTime.of(1987, 10, 2, 0, 0, 0);
Temporal ldt2 = LocalDateTime.of(1970, 01, 01, 0, 0, 0);
Duration duration = Duration.between(ldt2, ldt1);
System.out.println("[7] Khoảng cách từ 01/01/1970 đến 02/10/1987 là " +
"bao nhiêu ngày? " + duration.toDays());
// Bích Vân sinh vào ngày thứ 6483 tính từ mốc thời gian 1/1/1970.
LocalDate bichVanDateOfBirth = LocalDate.ofEpochDay(6483);
System.out.println("[8] Bích Vân sinh vào ngày thứ 6483 tính từ mốc " +
"thời gian " + mileStone
+ ", tức là ngày " + bichVanDateOfBirth);
System.out.println("[9] Bích Vân sinh vào ngày thứ " + bichVanDateOfBirth.getDayOfMonth() +
" của tháng " + bichVanDateOfBirth.getMonth());
System.out.println("[10] Bích Vân sinh vào ngày thứ " + bichVanDateOfBirth.getDayOfYear() +
" của năm " + bichVanDateOfBirth.getYear());
System.out.println("[11] Năm đó tháng " + bichVanDateOfBirth.getMonth() + " có "
+ bichVanDateOfBirth.lengthOfMonth() + " ngày.");
System.out.println("[12] 2 tháng 5 ngày sau là ngày " +
bichVanDateOfBirth.plusMonths(2).plusDays(5));
// VyDN sinh ngày 26/08/1987 (Ngày địa phương).
LocalDate vyDate = LocalDate.of(1987, Month.AUGUST, 26);
// 1 giờ 15 phút chiều (Giờ địa phương).
LocalTime vyTime = LocalTime.of(13, 15);
// Tạo múi giờ dựa trên offset. Hà Nội ở múi giờ GMT+7.
ZoneId HaNoi = ZoneOffset.of("+07:00");
// Tạo đối tượng thời gian có gắn kèm múi giờ.
ZonedDateTime VyDN_DateOfBirth = ZonedDateTime.of(vyDate, vyTime, HaNoi);
System.out.println("[13] Ngày sinh VyDN giờ địa phương: " + VyDN_DateOfBirth);
// ZoneId.of("Z") là múi giờ UTC/Greenwich.
ZonedDateTime VyDN_DateOfBirth_UTC = VyDN_DateOfBirth.withZoneSameInstant(ZoneId.of("Z"));
System.out.println("[14] Ngày sinh VyDN tính theo giờ UTC/Greenwich: " + VyDN_DateOfBirth_UTC);
// Tính khoảng cách giữa hai điểm thời gian.
long vyDN_BichVan_Offset = Duration.between(VyDN_DateOfBirth,
ZonedDateTime.of(bichVanDateOfBirth, LocalTime.of(0, 0), HaNoi)).toDays();
System.out.println("[15] Hai người sinh cách nhau " +
String.valueOf(vyDN_BichVan_Offset) + " ngày.");
}
}
// Kết quả:
// [1] Giờ hiện tại: 2016-02-12T08:53:39.827
// [2] Năm nay có phải là năm nhuận không? true
// [3] Hai năm sau đó là năm 2018, có phải là năm nhuận không? false
// [4] Hôm nay là ngày: 2016-02-11
// [5] Mười giờ 44 phút buổi tối: 22:44:30
// [6] Hai giờ 42 phút chiều: 14:42
// [7] Khoảng cách từ 01/01/1970 đến 02/10/1987 là bao nhiêu ngày? 6483
// [8] Bích Vân sinh vào ngày thứ 6483 tính từ mốc thời gian 1970-01-01, tức là ngày 1987-10-02
// [9] Bích Vân sinh vào ngày thứ 2 của tháng OCTOBER
// [10] Bích Vân sinh vào ngày thứ 275 của năm 1987
// [11] Năm đó tháng OCTOBER có 31 ngày.
// [12] 2 tháng 5 ngày sau là ngày 1987-12-07
// [13] Ngày sinh VyDN giờ địa phương: 1987-08-26T13:15+07:00
// [14] Ngày sinh VyDN tính theo giờ UTC/Greenwich: 1987-08-26T06:15Z
// [15] Hai người sinh cách nhau 36 ngày.
Nguyên nhân gây ra giây nhuận (leap second) là do Trái Đất quay với tốc độ không đều dẫn đến lệch giờ đồng hồ đo chuẩn của con người và giờ tính theo bóng nắng mặt trời. Các nhà khoa học sử dụng “giây nhuận” để đồng bộ và chính xác hóa thời gian ( https://en.wikipedia.org/wiki/Leap_second#Slowing_rotation_of_the_Earth ). Sự chính xác của thời gian là quan trọng, sự cố Y2K (Year 2000) từng xảy ra là do vấn đề thời gian trong các hệ thống máy tính.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Có vẻ chúng ta thực hiện hơi ngược quy trình viết code cho ứng dung Todo List, nếu chúng ta thực hiện việc tạo từng bản ghi Todo trước thì không cần đến tạo dữ liệu mẫu cho hiển thị danh sách Todo và chi tiết từng Todo. Bố cục chương trình Khóa học Laravel cơ bản qua ứng dụng Todo List muốn nhắm đến các khái niệm cơ bản về Laravel, do đó theo bố cục này bạn sẽ được học nhiều hơn. Thứ hai, viết code như chúng ta làm từ đầu đến giờ giống với các bước mà người dùng sẽ sử dụng ứng dụng hơn.
Các bước thực hiện rất đơn giản, nhưng trước khi thực hiện code, bạn hãy cùng tôi đúc kết ra quy trình tạo một chức năng mới trong ứng dụng Todo List. Đa số trong chúng ta đều muốn nhanh chóng đi đến đích, nhưng đó không phải là cách nhanh nhất. Đôi khi dừng lại, đúc kết kinh nghiệm để lần sau khi gặp lại có thể tăng tốc độ gấp đôi, gấp ba mới là cách hiệu quả.
Các bước tạo ra một chức năng mới trong Todo List
URL: Nghĩ ra định dạng đường dẫn đến trang mới (chức năng mới), đăng ký với Laravel Route (routes/web.php).
Xử lý nghiệp vụ: Trong bước đăng ký ở trên, để xử lý đường dẫn này sẽ là một phương thức nào đó trong TodosController. Tạo phương thức này và viết code xử lý nghiệp vụ như tương tác với database, thực hiện một hành động…
Hành động kết thúc: Hành động kết thúc có thể là trả về một view, chuyển hướng đến một trang… Nếu View không tồn tại, chúng ta cần tạo ra view này.
Chúng ta đã áp dụng quy trình 3 bước này với việc tạo ra trang danh sách công việc (view index) và cả với trang thông tin chi tiết công việc (view show). Hôm nay, chúng ta sẽ áp dụng để xây dựng trang tạo ra công việc mới trong database, dự định đường dẫn sẽ là http://localhost:8000/new-todos.
Bước 1: Đăng ký URL vào Route
Mở file routes/web.php thêm vào định nghĩa cho URL mới.
Route::get('new-todos','TodosController@create');
Bước 2: Xử lý nghiệp vụ trong Controller
Thực hiện tạo ra phương thức create() trong TodosController (nằm trong thư mục app/Http/Controllers).
publicfunctioncreate(){}
Ở tình huống này chúng ta chưa cần xử lý gì nên để trống.
Bước 3: Xây dựng View
Phương thức create() sẽ trả về một View hiển thị form nhập liệu cho công việc cần làm (Todo).
Đầu tiên, thực hiện “kế thừa” bố cục chung ứng dụng bằng câu lệnh @extends(‘layouts.app’). Tiếp theo chúng ta có một form để nhập liệu Todo. Form này có phương thức gửi dữ liệu là POST và gửi về đường dẫn /store-todos (đầy đủ là http://localhost:8000/store-todos). Trong form này có một câu lệnh @csrf, nó để phục vụ cho việc gì, nếu không có nó được không?
CSRF viết tắt của Cross-Site Request Forgery là một dạng tấn công tiềm ẩn nhiều nguy hại. Hacker có thể lợi dụng kiểu tấn công này để thực hiện các hành động trong Form nhập liệu với một người dùng đã xác thực, do vậy để ngăn chặn người ta sử dụng một token (một chuỗi mã) giữa máy chủ và trình duyệt để đảm bảo chỉ có form nhập liệu nào chứa token này mới là do máy chủ web sinh ra và an toàn.
Laravel giúp phòng chống tấn công CSRF dễ dàng, nó tự động sinh ra một token cho mỗi session người dùng và được quản lý bởi ứng dụng. Token này giúp kiểm tra xem người dùng được xác thực và có thể tạo ra các yêu cầu đến ứng dụng. Khi viết code form nhập liệu chúng ta chỉ cần sử dụng câu lệnh Blade @csrf là nó tự động sinh ra trường token cho chúng ta.
Phần trên đây, chúng ta đã hoàn thành được 1/2 công việc của tạo bản ghi mới, phần còn lại chúng ta cần xử lý dữ liệu gửi từ form và lưu vào CSDL. Vậy tại sao có Quy trình 3 bước tạo một chức năng ở trên, nó sử dụng để tạo ra một chức năng vậy tại sao chưa hoàn thành. Câu trả lời là quy trình này áp dụng cho một chu trình khép kín từ user -> server -> user.
Thật vậy, user thực hiện đường dẫn /news-todos -> server xử lý -> trả về trang (view) tạo todo cho user. Như vậy với 1/2 công việc còn lại chúng ta sẽ lại áp dụng tiếp Quy trình 3 bước.
Bước 1: Đăng ký URL
Form nhập liệu ở phần trên gửi dữ liệu đến đường dẫn /store-todos với phương thức gửi là POST. Việc gửi dữ liệu này cũng bắt nguồn từ user. Chúng ta đăng ký URL này vào routes/web.php:
Do phương thức yêu cầu là POST nên chúng ta sử dụng static function post() trên class Route. Cú pháp bên trong vẫn giống như chúng ta đăng ký URL trước đây.
Bước 2: Xử lý nghiệp vụ trong Controller
Trong TodosController chúng ta sẽ tạo ra phương thức store() với nội dung:
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/publicfunctionstore(){$data=request()->all();$todo=newTodo();$todo->name=$data['name'];$todo->description=$data['description'];$todo->completed=false;$todo->save();returnredirect('/todos');}
Trong phương thức store ở trên, đầu tiên thực hiện lấy tất cả dữ liệu được gửi đến từ form thông qua Laravel Request với phương thức all(). Tiếp đó, tạo một Model Todo và thiết lập dữ liệu có được từ form nhập liệu, lưu trữ xuống database. Cuối cùng là chuyển hướng người dùng về trang danh sách todos.
Bước 3: Hành động kết thúc
Ở đây sau khi lưu dữ liệu xong chúng ta chuyển hướng người dùng về trang danh sách todos cũng giống như trả về view index, tuy nhiên nếu trả về view chúng ta phải thực hiện thêm việc lấy danh sách view mà công việc này đã làm trong trang danh sách todos do đó chúng ta chuyển hướng về trang này.
Kết luận
Qua bài học hôm nay, chúng ta đã đúc kết được cách tạo một chức năng mới trong ứng dụng thông qua một Quy trình 3 bước. Các bạn hãy thực hiện lại các đoạn code trong bài học để nắm vững và hiểu rõ hơn các khái niệm, hẹn gặp lại trong bài học tiếp theo.
Bài viết được sự cho phép của tác giả Edward Thien Hoang
Trong bài viết trước, chúng ta đã khảo sát mô hình kiến trúc Model-View-Controller, Kiến trúc MVP chúng ta sẽ bàn dưới đây cũng dựa trên tư tưởng cơ bản của MVC nhưng với cách tiếp cận khác nhằm mục đích khắc phục các khuyết điểm đã có.
Mẫu kiến trúc Dolphin Smalltalk Model-View-Presenter chia ứng dụng thành các phần dữ liệu (data), trình bày (presentation) và các xử lý logic thuộc phần trình bày (presentation logic) thành những thành phần riêng biệt.
LỊCH SỬ
Phiên bản Dolphin Smalltalk Model-View-Presenter (gọi tắt là Dolphin MVP) là phiên bản của MVP được xây dựng dựa trên phiên bản Taligent MVP xuất hiện trước đó. Dolphin MVP được xây dựng về cơ bản bên ngoài tương tự như MVC cổ điển nhưng khác nhau ở vai trò của Controller và Presenter.
CẤU TRÚC
CÁC THÀNH PHẦN
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).
View là thành phần đảm nhận trình bày từ những dữ liệu của Model. View bao gồm những gì thể hiện trên màn hình như các control, form, widget,…
Presenter là thành phần đảm nhận các xử lý về trình bày mà nó cần đến sự tương tác trên dữ liệu.
PHỐI HỢP CÁC THÀNH PHẦN
Trong khi vai trò của Model không thay đổi so với MVC cổ điển. Thành phần View của Dolphin MVP cũng thực hiện việc trình bày từ nội dung của Model và gắn kết với Model thông qua Observer Pattern. Tuy nhiên, nó thực hiện bắt các sự kiện xảy ra ngay bên trong nó. Một vài trường hợp đơn giản như TextView, dữ liệu nhập được xử lý trực tiếp và cập nhật thay đổi trực tiếp vào Model còn hầu hết các trường hợp khác, việc xử lý được chuyển giao cho Presenter đảm trách khi cần thao tác đến Model.
Trong khi View đảm nhận trình bày thì Presenter đảm trách cách Model được thao tác và thay đổi như thế nào bởi giao diện người dùng. Presenter là nơi chứa các xử lý đặc trưng của ứng dụng (application logic so với business logic của Model). Một điểm đáng chú ý khác là Presenter có khả năng thao tác trực tiếp lên View mà nó gắn kết, điều này khác biệt với phiên bản Taligent MVP xuất hiện trước đó.
SO SÁNH DOLPHIN MVP VÀ MVC CỔ ĐIỂN
Điểm khác biệt cơ bản của Dolphin MVP và MVC cổ điển là sự khác nhau về vai trò của Presenter và Controller, nó cũng dẫn đến sự khác nhau về vai trò giữa hai thành phần View. Trong Dolphin MVP, sự hiện diện của Controller bị loại bỏ, thay vào đó, việc xử lý các dữ liệu input được View đảm nhận và được chuyển cho Presenter khi có yêu cầu tương tác đến Model.
MẪU KIẾN TRÚC MVP CỦA MARTIN FOWLER
TÓM TẮT
Martin Fowler là một trong những người đâu tiên đi sâu và nghiên cứu về các phiên bản của MVP. Vào năm 2006, Fowler tuyên bố sự kết thúc của các kiến trúc MVP cổ điển và tự chia MVP thành hai phiên bản mới là Passive View và Supervising Controller.
Martin Fowler dùng thuật ngữ Controller thay vì Presenter trong mẫu của mình
Trong mẫu Passive View, thành phần View được loại bỏ hoàn toàn các xử lý logic và tương tác đến Model. Thay vì vậy, nó chuyển giao các xử lý cho Controller đảm trách. Controller đảm nhận tương tác đến Model và cập nhật View khi có thay đổi từ Model. Controller là thành phần trung gian liên lạc giữa View và Model.
Trong mẫu Supervising Controller, View đầu tiên bắt lấy các sự kiện và sau đó chuyển giao cho controller xử lý. Để cập nhật thay đổi từ Model, View dùng data-binding và Observer pattern cho các xử lý đơn giản còn đối với các xử lý phức tạp sẽ nhờ đến Controller đảm nhận.
So với Supervising Controller chứa View đảm nhận xử lý sự kiện đơn giản thì với Passive View, thành phần View được tách rời hoàn toàn khỏi các xử lý, kể cả các xử lý cơ bản ở mức giao diện cũng được giao hoàn toàn cho Presenter xử lý. Điều này tạo thuận lợi hơn cho việc testing vì khi đó các thành phần Model và Presenter có thể được kiểm tra một cách độc lập mà không phụ thuộc vào giao diện. Phiên bản MVP của Microsoft đầu tiên được xây dựng dựa trên Passive View sau đó mẫu Supervising Controller cũng được hỗ trợ với một số điều chỉnh.
PHIÊN BẢN MVP CỦA MICROSOFT
LỊCH SỬ
Khởi đầu từ các framework Smart Client Software Factory and Web Client Software Factory dựa trên kiến trúc MVP được các nhóm nghiên cứu về pattern của Microsoft tạo ra từ năm 2006, Microsoft sau đó bắt đầu đưa MVP vào các tài liệu hướng dẫn và ví dụ về lập trình giao diện trong .NET framework. Mô tả dưới đây dựa trên phiên bản MVP được mô tả trong tạp chí MSDN vào năm 2006 (tham khảo 2) và có thể xem là kiến trúc cơ bản cho các framework trên. Ngoài ra, còn có một số framework MVP khác cũng được phát triển trên nền tảng .NET như MVC# hay NMVP.
Xin lưu ý là phiên bản cũ của Web Client Software Factory ban đầu được tổ chức dựa trên Passive View (cấu trúc bên dưới) nhưng với phiên bản hiện tại thì cấu trúc dựa trên Supervising Controller cũng được hỗ trợ.
CẤU TRÚC
CÁC THÀNH PHẦN
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).
View là thành phần đảm nhận trình bày từ những dữ liệu của Model và là tổng hợp của các form, control được sử dụng.
Presenter là thành phần đảm nhận các xử lý về trình bày cũng như tương tác đến dữ liệu bên dưới và có thể tương tác để thay đổi View trong quá trình xử lý.
PHỐI HỢP CÁC THÀNH PHẦN
Mẫu kiến trúc MVP của Microsoft tương tự như Passive View nhưng nó bổ sung thêm ràng buộc là các Presenter chỉ có thể truy cập đến View thông qua các interface IView. Điều này giúp Presenter không phụ thuộc đến cài đặt cụ thể của View và có thể dễ dàng test Presenter một cách độc lập. Điều này đạt được do sử dụng IView, chúng ta có thể dùng kĩ thuật “Mock” để thay thế các xử lý cụ thể của View khi test Presenter. Ngoài ra, mối quan hệ giữa Presenter và Model là quan hệ một chiều (chiều còn lại là gián tiếp). Hệ quả của các liên kết là chúng ta có một mô hình đa lớp (multi-layer) như cấu trúc ở trên theo ý nghĩa các thành phần ở một layer chỉ phụ thuộc và sử dụng các thành phần ở layer ngay bên dưới nó.
Theo mẫu Microsoft MVP, khi một View gắn liền với một interface IView. Khi View được tạo ra, nó tạo ra một đối tượng private Presenter và gắn nó vào đối tượng này thông qua IView. Khi một sự kiện xảy ra, View bắt lấy và sau đó kích hoạt một phương thức của Presenter mà sau đó, nó có thể tương tác với Model. Một số sự kiện như bắt đầu hiển thị và đóng của View cũng được gửi tới để Presenter kích hoạt một số phương thức tương ứng, điều này giúp cho một số công việc như khởi tạo và giải phóng dữ liệu cho View được dễ dàng hơn.
Model theo Microsoft MVP cũng thường được tổ chức bổ sung một lớp Service nằm bên trên để tương tác với Presenter, qua đó giảm bớt sự phụ thuộc đến các xử lý data nằm sâu bên dưới. Ngoài ra, để điều khiển việc liên lạc giữa các View hay các Presenter, một thành phần thường được bổ sung gọi là Application Controller. Trong một ứng dụng có thể có nhiều Application Controller để quản lý các nhóm MVP. Ngoài ra, thay vì sử dụng Presenter để tương tác với Model, một cách là giao tất cả các thao tác này cho Application Controller đảm trách.
MỘT VÍ DỤ MINH HỌA ĐƠN GIẢN
Để minh họa mẫu Microsoft MVP, chúng ta sẽ cùng khảo sát một ví dụ đơn giản: tạo một form hiển thị danh sách sinh viên cùng chức năng thêm mới trên danh sách sinh viên đó. Với mục tiêu là minh họa cách tổ chức và liên kết giữa các thành phần là chủ yếu, chúng ta không đi sâu vào cài đặt cụ thể (bạn có thể tham khảo source code đi kèm bài viết, source code được tổ chức ở dạng project của VS 2008).
Ứng dụng được tổ chức thành 5 project: View, Presenter, DataService, Model và DataTransferObject. Trong đó, View là application còn các project khác là library. Các project phụ thuộc lẫn nhau theo thứ tự project phía trước sử dụng trực tiếp project phía sau, ngoại trừ DataTransferObject chức các loại dữ liệu được dùng chung cho 3 project View, Preseneter và DataService. Model là project chứa các tương tác trực tiếp đến dữ liệu và không phụ thuộc vào bất cứ thành phần nào khác.
GIẢI THÍCH CÁC PROJECT:
Model: chứa dữ liệu giả lập (StudentData.xml), schema (StudentDataSet.xsd) và lớp tiện ích được xây dựng bên trên (DataAccess.cs).
DataTransferObject: chứa đối tượng dữ liệu được dùng chung cho các project ở mức cao hơn (Student.cs).
DataService: được xây dựng bên trên Model, chuyển đổi dữ liệu từ Model sang DataTransferObject và xây dựng các tiện ích bên trên đối tượng transfer này (Service.cs).
Presenter: chứa interface của View dùng cho Presenter truy cập (IViewForm) và lớp Presenter (StudentPresenter).
View: chứa form view (ViewForm.cs) và Program.cs.
Trong bài viết khác, chúng ta sẽ tìm hiểu phương pháp TDD (Test-driven development) và ứng dụng nó để phát triển ứng dụng theo mẫu Microsoft MVP trong môi trường .NET.
Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.
Làm Gì Để Vượt Qua Khủng Hoảng Sau Khi Trượt Phỏng Vấn?
Trượt phỏng vấn là câu chuyện không của riêng ai. Mỗi người có thể trượt phỏng vấn vì nhiều lý do khác nhau, tuy nhiên đa số mọi người sẽ cảm thấy thất vọng hoặc buồn bã về bản thân, nhất là với những bạn sinh viên mới ra trường chưa có nhiều kinh nghiệm. Bài viết này sẽ giúp bạn tìm được hướng đi đúng đắn và hợp lí hơn cho bản thân với việc nên làm gì khi trượt phỏng vấn.
Nên làm gì để vượt qua khủng hoảng sau nhiều lần trượt phỏng vấn?
Đối diện với cảm giác thất vọng và tìm cách vượt qua
Thất vọng chắc chắn là cảm xúc biểu hiện rõ ràng nhất sau khi bạn nhận được kết quả trượt phỏng vấn. Rất nhiều suy nghĩ hiện ra trong đầu rằng bản thân vẫn còn quá kém cỏi, năng lực chuyên môn mình vẫn chưa đủ cứng, đâu là thiếu sót khiến mình không thể thông qua buổi phỏng vấn,… Nhiều câu hỏi được đặt ra một cách liên tiếp để chứng minh cho việc bạn đang lo lắng và thiếu niềm tin vào bản thân.
Nhưng trượt phỏng vấn không hề chứng minh được bất kỳ điều gì về năng lực bản thân của bạn cả. Nó chỉ đơn thuần là những gì bạn có thể đáp ứng vẫn chưa phù hợp với yêu cầu của công ty mà thôi. Do đó, hãy thật bình tĩnh và tìm cách vượt qua chính mình. Hoang mang hay lo lắng sẽ chỉ khiến bạn mất phương hướng hơn.
Trước khi bắt tay vào tìm kiếm một công việc mới, bạn hãy cho bản thân được thư giãn và nghỉ ngơi nhiều hơn một chút. Bạn có thể dành thời gian làm những gì mình thích để thư giãn tinh thần trước khi tìm kiếm cho mình một cơ hội mới, như vậy chắc chắn về mặt tâm lý bạn sẽ làm tốt hơn rất nhiều. Đây chính là câu trả lời chính xác cho vấn đề nên làm gì sau khi trượt phỏng vấn.
Đánh giá lại toàn bộ những vấn đề mình đang gặp phải
Trước khi bắt tay vào tìm kiếm một công việc mới, tốt hơn hết bạn nên dành thời gian để đánh giá lại một cách tổng quan về những gì mà đã làm được và chưa làm được trong hành trình tìm việc vừa rồi. Hãy nhìn nhận một cách thẳng thắn về những gì mình vẫn chưa làm được và nên khắc phục nó như thế nào.
Để có thể đánh giá một cách tốt nhất và có sự cải thiện cho sau này, bạn có thể tham khảo ý kiến từ những người xung quanh hoặc những người làm trong ngành nhân sự mà bạn quen biết. Người khác sẽ cho bạn cái nhìn khách quan về năng lực bản thân. Đặc biệt với những ai làm trong lĩnh vực nhân sự, vì họ thường xuyên làm việc với các ứng viên nên có thể dễ dàng trong việc giúp bạn tìm ra và cải thiện những vấn đề mình chưa làm tốt. Ý kiến của người khác thì luôn khách quan hơn chính vì thế đừng ngần ngại đặt câu hỏi để giúp bản thân trở nên tốt hơn bạn nhé!
Sau khi đã cho bản thân khoảng thời gian thư giãn thoải mái về đầu óc cũng như tìm ra được điểm yếu và điểm mạnh của bản thân, bạn hãy tập trung dành thời gian để tìm kiếm những công việc mới. Công việc không bao giờ là khan hiếm trên thị trường cả, điều quan trọng là bạn có biết tận dụng đúng thời cơ và dành hết sức mình cho cho một công việc, một vị trí mới hay không.
Bên cạnh đó, hãy đọc kỹ các mô tả công việc được đăng tuyển để xem mình có thể đáp ứng được bao nhiêu phần trăm khả năng trong số đó. Tốt hơn hết là từ 70% trở lên, nếu thấp hơn mức này bạn có thể thấy rằng bản thân chưa phù hợp với định hướng của công ty nên tốt hơn hết là không nên ứng tuyển. Việc không đạt kỳ phỏng vấn phần nhiều cũng là do mục tiêu của công ty và của ứng viên chưa thật sự tương xứng với nhau.
Đừng bao giờ cảm thấy khó khăn hay chán nản sau khi trượt phỏng vấn, vì biết đâu được bạn sẽ tìm được những cơ hội mới tốt đẹp hơn so với vị trí mà mình đã từng ứng tuyển. Hãy luôn giữ một tinh thần mạnh mẽ và lạc quan để tìm kiếm cho mình những cơ hội, những công việc mới mà bản thân thật sự cảm thấy yêu thích và phù hợp. Khi một cánh cửa đóng lại sẽ có cánh cửa khác mở ra, hãy tỉnh táo để nắm giữ “cánh cửa” mới này cho mình bạn nhé.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Video trong bài viết
Ứng dụng Todo List của chúng ta đã có hai trang, một trang danh sách các công việc và một trang chi tiết cho công việc cụ thể. Hai trang này tương ứng với hai view là index.blade.php và show.blade.php nằm trong thư mục resources/views/todos. (Bạn nào chưa có source thì tải về nhé, source của bài trước ở đây). Nếu các bạn để ý trong hai file view này có rất nhiều đoạn code giống nhau, vậy làm thế nào chúng ta mô đun hóa và sử dụng lại các đoạn code chung này?
Các website hiện nay thường có rất nhiều trang và có một vài bố cục chung. Ví dụ, như trang All Laravel mà bạn đang xem, ở bất kỳ trang nào chúng ta cũng thấy có 2 phần chung:
Header bao gồm logo, menu, phần các bài viết phổ biến.
Sidebar: bao gồm công cụ tìm kiếm, các thẻ, bài viết phổ biến.
Footer: Thông tin liên hệ, đăng ký nhận tin bài.
Bố cục ứng dụng chung có những ưu điểm như sau:
Những phần chung này sẽ được mô đun hóa đưa ra một file riêng gọi là file layout (bố cục chung). Các file muốn có bố cục này chỉ cần “kế thừa” lại layout này.
Khi cần thay đổi nội dung chung, chúng ta không cần thay đổi tất cả các trang mà chỉ cần thay đổi trong phần bố cục chung. Ví dụ, khi thay đổi Logo mới chẳng hạn, chúng ta chỉ cần vào file layout thay đổi và nó sẽ áp dụng cho tất cả các trang kế thừa bố cục này.
Xây dựng bố cục với Laravel Blade
Laravel Blade cho phép xây dựng file layout và các view sẽ kế thừa lại layout này. Quay lại hai view index và show trong ứng dụng Todo List, chúng ta thấy có rất nhiều phần chung, chúng ta tạo file chứa bố cục này resources/views/layouts/app.blade.php (đặt tên thế nào cũng được miễn là tên diễn giải được ý nghĩa).
Trong file này chúng ta thấy có một số code trông khá lạ như sau:
yield(‘title’)
yield(‘content’)
Diễn giải code, chúng ta thấy có tiêu đề các trang khác nhau (phần title) và phần nội dung trang (phần content) khác nhau do vậy, yield(‘title’) và yield(‘content’) chính là nơi hiển thị các phần khác nhau đó.
Mẹo: Tất cả các phần có nội dung thay đổi được đưa vào một phần riêng với lệnh yield(‘ten_vung_chung’).
Khi đó ở các trang (view) cần “kế thừa” bố cục này, chúng ta sẽ sử dụng câu lệnh extends. Cấu trúc lại code resources/views/todos/index.blade.php:
@extends('layouts.app')
@section('title')
Todos List
@endsection
@section('content')
<h1 class="text-center my-5">TODOS PAGE</h1><div class="row justify-content-center"><div class="col-md-8"><div class="card card-default"><div class="card-header">
Todos
</div><div class="card-body"><ul class="list-group">
@foreach($todos as $todo)
<li class="list-group-item">
{{ $todo->name }}
<a href="/todos/{{ $todo->id }}"class="btn btn-primary btn-sm float-right mr-2">View</a></li>
@endforeach
</ul></div></div></div></div>
@endsection
Trong hai view này, để kế thừa bố cục chung ứng dụng chúng ta dùng câu lệnh extends(‘ten_bo_cuc’), chú ý là một ứng dụng có thể có nhiều bố cục chung khác nhau. Tên bố cục chứa cả đường dẫn đến file bố cục và phân cách bởi dấu chấm, ví dụ ở đây là layouts.app tức là file app.blade.php trong thư mục layouts với thư mục mặc định là resources/views.
Tiếp đến, các phần nội dung khác nhau được định nghĩa bằng câu lệnh yield ở trong layout sẽ được sử dụng trong view và nằm giữa @section(ten_vung_dinh_nghia_trong_yield) và @endsection.
Quay lại ứng dụng và kiểm tra các trang, bạn sẽ thấy ứng dụng khi thay đổi này không khác gì so với ứng dụng của bài học trước (bài số 9). Tại sao phải thực hiện những công việc ở trên?
Thêm menu cho ứng dụng
Trở lại với câu hỏi ở phần trước, tại sao chúng ta lại đưa toàn bộ phần code chung ra file layouts/app.blade.php? Ứng dụng hoạt động trên các trang index và show đã rất ok, tuy nhiên chúng ta cần một menu chung cho toàn bộ ứng dụng để có thể chuyển hướng nhanh chóng đến một trang nào đó. Nếu như chưa có layouts/app.blade.php chúng ta sẽ phải đến từng trang (view) cụ thể và thêm menu vào, thật là mất nhiều công sức, chưa kể là mỗi khi cần thay đổi, chúng ta lại mất nhiều công sức hơn nữa và rất dễ bỏ sót những vị trí cần thay đổi.
Công việc dễ dàng hơn nhiều với file bố cục chung, chúng ta chỉ việc thêm menu vào file layouts/app.blade.php và các view kế thừa lại bố cục này sẽ tự động có thanh menu. Nội dung layouts/app.blade.php sẽ thay đổi như sau:
Không cần thay đổi gì hai index và show trong thư mục view resources/views/todos nhưng khi chạy ứng dụng bạn thấy đấy chúng ta đã có menu cho cả hai view này.
Bài viết được sự cho phép của blogchiasekienthuc.com
DNS là một trong những thành phần rất quan trọng của mạng Internet. Và nếu như bạn đã từng loay hoay với việc truy cập vào Facebook khi bị chặn thì chắc chắn bạn đã tìm hiểu qua về DNS rồi đúng không.
Và trong quá trình sử dụng máy tính, không biết các bạn thế nào chứ mình thì đôi khi gặp phải lỗi DNS Server is not responding khiến mình không tài nào kết nối vào Internet được.
Vậy nên trong bài viết này mình sẽ tổng hợp lại những cách hiệu quả nhất để khắc phục thành công lỗi DNS Server is not responding khó chịu này nha.
Xui xui cho bạn thì sẽ xuất hiện lỗi DNS như hình bên dưới đây 🙂
#1. Khởi động lại máy tính
Đối với mình, điều đầu tiên mà mình làm nếu có bất kì lỗi nào xảy ra với hệ điều hành Windows đó là khởi động lại máy.
Nghe thì có vẻ hơi nhạt, hơi vô lí nhưng đôi khi nó lại có tác dụng không tưởng đó các bạn. Chính vì vậy, bạn cứ khởi động lại máy tính đó trước khi thực hiện các bước tiếp theo nhé.
Đừng đùa với cách làm này nhé, các lỗi thường gặp như máy tự tự nhiên bị mất âm thanh, không chạy được phần mềm, máy tính tự nhiên giật lag lạ thường, máy in tự nhiên không in được… thì khởi động lại sẽ là phương án khá là hay đấy 🙂
#2. Thay đổi DNS Server
+ Bước 1: Mở hộp thoại Run bằng cách bấm tở hợp phím Windows + R => sau đó nhập ncpa.cpl => và nhấn Enter.
+ Bước 2: Sau đó bạn tìm đến đúng kết nối mạng Internet mà bạn đang dùng. Ví dụ như của mình ở đây là mạng Wi-Fi đó (có cột sóng ở bên dưới icon Computer).
=> Sau đó bạn nhấn chuột phải vào mang đó => và chọn Properties.
+ Bước 3: Sau đó bạn nháy đúp chuột vào phần Internet Protocol Version 4 (TCP/IPv4) để chúng ta vào phần thiết lập.
+ Bước 4: Bây giờ bạn tick chọn Use the following DNS Server addresses. Tiếp theo bạn có thể chỉnh các DNS sau:
+ Bước 5: Sau khi đã xong xuôi hết thì bạn bấm OK => Cuối cùng bạn tắt mạng đi và bật lại để thử nha.
NOTE: Để tìm hiểu thêm về phần thiết lập này thì bạn có thể tham khảo thêm bài viết này, chắc chắn nó sẽ rất hữu ích cho bạn!
#3. Cài đặt lại Driver mạng
Lưu ý: Tải Driver mạng trước khi cài đặt lại nha các bạn. Mình đề xuất với các bạn sử dụng phần mềm 3DP NET, một phần mềm có thể cân được mọi thể loại máy tính hiện nay
Nhưng tất nhiên là bạn hãy thử qua phương pháp bên dưới đã, nếu vẫn không đường thì mới dùng đến tuyệt chiêu cuối 3DP NET nhé !
+ Bước 1: Bạn nhấn tổ hợp phím Windows + X => sau đó bấm chọn Device Manager => Bạn bấm vào Network Adapters.
Một cách mở Device Manager khác là nhấn chuột phải vào This PC => chọn Manage => sau đó chọn Device Manager
Tiếp theo, bạn nháy đúp chuột vào adapter mạng đang sử dụng, ví dụ như của mình ở đây đang sử dụng mạng Wi-Fi thì nó là Intel(R) Dual Band Wireless-AC 8230
+ Bước 2: Sau đó bạn chuyển qua tab Driver như hình bên dưới.
+ Bước 3: Tiếp theo bạn bấm vào Uninstall Device, nhớ tick vào Delete the driver software for this device => bấm Uninstall để thực hiện gỡ bỏ Driver hiện tại.
Hoặc bạn có thể làm theo cách nhanh hơn đó là nhấn chuột phải vào mạng bạn đang sử dụng => và chọn Uninstall device (hình ảnh bổ sung bởi Admin):
+ Bước 4: Sau đó bạn nhấn chuột phải lại vào kết nối mạng như hình bên trên => sau đó chọn Scan for hardware changes để máy tính cài đặt lại Driver.
Hoặc là bạn có thẻ khởi động lại máy tính cũng được, lúc này ta có hai trường hợp sau:
Nếu máy tính vào mạng bình thường thì bạn thành công rồi đó.
Nếu máy tính vẫn bị lỗi trên hoặc không nhận Driver thì bạn tải lại Driver mới. Để tải Driver chuẩn nhất theo đúng hãng máy tính của bạn thì bạn xem bài viết này, còn nếu không có nhiều kinh nghiệm thì cứ dùng 3DP NET nha các bạn.
#4. Tắt tường lửa và phần mềm diệt virus
Tường lửa và phần mềm diệt virus đều là bức tường thành bảo vệ máy tính của bạn.
Nhưng đôi khi chính nó lại gây ảnh hưởng đến Internet của bạn. Chính vì vậy, hãy thử tắt tường lửa và phần mềm diệt virus, có thể sẽ tạm thời sửa được lỗi DNS Server is not responding gây khó chịu này đó.
+ Bước 2: Cuối cùng bạn khởi động lại máy để áp dụng thay đổi nha.
#6. Khởi động máy tính ở chế độ Safe Mode
Safe Mode giúp bạn khởi động máy tính với các phần mềm và trình điều khiển (Driver) cơ bản nhất. Đôi khi lỗi DNS này xảy ra do phần mềm hoặc trình điều khiển của một phần cứng nào đó xung đột với nhau.
+ Bước 1: Để truy cập vào chế độ Safe Mode của máy tính thì bạn bấm phím Windows trên bàn phím (cạnh phím ALT) => sau đó bấm vào nút Power, giữ phím Shift => và bấm Restart.
+ Bước 2: Bạn bấm chọn Troubleshoot.
+ Bước 3: Tiếp theo bạn chọn Advanced options.
+ Bước 4: Sau đó bạn bấm chọn Startup Settings => và bấm Restart.
Tiếp theo bạn bấm 5 hoặc F5 để vào chế độ Safe Mode with Networking (đây là chế độ Safe Mode có Internet).
Nếu mạng bình thường trong chế độ này thì đương nhiên là do phần mềm của máy tính gây ra lỗi DNS rồi. Bây giờ bạn chỉ việc tìm phần mềm gây ra lỗi và gỡ cài đặt thôi.
Ngoài cách truy cập vào Safe Mode để kiểm tra máy tính có mạng hay không thì nếu bạn có sẵn một chiếc USB BOOT thì bạn cũng có thể truy cập vào Mini Windows để kiểm tra một cách dễ dàng.
Mà mình đề xuất với bạn bản NHV BOOT, bạn có thể tạo sẵn một chiếc USB BOOT cứu hộ chuyên nghiệp để sử dụng khi cần nhé 🙂
#7. Khởi động lại Moderm hoặc Router
Nếu tất cả các thiết bị kết nối với Moderm đều bị lỗi như trên thì nguyên nhân là do Moderm hoặc nhà cung cấp mạng của bạn đang có vấn đề.
Đầu tiên thì bạn hãy ra đằng sau Moderm, tìm nút Restart để khởi động lại. Hoặc không thì bạn có thể rút dây nguồn ra khoảng 10s sau đó cắm lại. Sau đó kiểm tra lại nhé !
#8. Reset lại Modem hoặc Router mà bạn đang kết nối
Nếu những cách bên trên không có tác dụng thì bạn có thể thử Reset Modem. Cách làm này thì hơi nâng cao một chút, bạn phải có một chút kiến thức về kỹ thuật thì mới có thể làm được.
Tuy nhiên mình nói trước, hiện giờ việc cấu hình Modem đã khác khá nhiều rồi, vì nhiều dòng Modem đời mới nên giao diện khác khá nhiều.
Vậy nên, nêu bạn không am hiểu thì nên chuyển ngay sang bước số #9 bên dưới đây 🙂
#9. Liên hệ CSKH của nhà cung cấp dịch vụ
Đây chính là cách cuối cùng nếu như tất cả các cách trên đều không có tác dụng hoặc không triệt để. Bạn hãy liên hệ đến CSKH của nhà cung cấp dịch vụ để họ có thể sử được triệt để lỗi này cho bạn.
Viettel: Tổng đài hỗ trợ là 1800 8168
VNPT: Tổng đài hỗ trợ là 1800 1166
FPT: Tổng đài hỗ trợ là 1900 6600 hoặc 1800 6000
Nhà mạng sẽ có trách nhiệm Fix lỗi đường truyền giúp bạn, bạn nộp tiền mạng hàng tháng nên được quyền lợi này nhé. Nhưng tất nhiên đó là trong trường hợp bạn là người đứng ra đăng ký dịch vụ Internet.
#10. Một vài Tips nhỏ khác để xác định và khắc phục lỗi DNS Server này
Bạn hãy thử sử dụng một trình duyệt web khác xem sao.
Nếu máy tính bạn đang sử dụng mạng Wi-Fi để kết nối thì giờ thử chuyển sang mạng dây để kết nối xem có được không, hoặc ngược lại, nếu đang dùng mạng dây thì chuyển thử sang Wi-Fi.
Trên đây là toàn bộ những cách và những bước để sửa lỗi The DNS Server isn’t responding trong quá trình sử dụng máy tính.
Bạn đã bao giờ gặp phải lỗi như thế này chưa? và nếu đã gặp thì bạn đã sửa nó như thếnào? Hãy chia sẻ lại cách làm của bạn để am em cùng học hỏi thêm nhé.
Chúc các bạn thành công, và mong mọi người hãy comment để ủng hộ bài viết của mình [đây là một trong những bài viết đầu tiên của mình trên Blog :)], có như vậy mình mới hoàn thiện hơn ở các bài viết sau nha. Thank you !