Home Blog Page 136

Function-Score trong Elasticsearch

Function-Score trong Elasticsearch

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

Function-Score trong Elasticsearch

function_score

Khi search trong elasticsearch, đôi khi chúng ta mong muốn sẽ chấm điểm dựa trên những điều kiện đã đặt ra để lấy ra một danh kết quả chính xác.

Ví dụ khi bạn search những người có tên có chứa cụm từ “ste” và mong muốn nếu first_name tên đó là “steph ” thì + thêm 3 điểm hoặc nếu first_name của tên đó là “stephen” thì + 5 điểm, …vv, lúc này bạn chắc hẳn sẽ dùng đến function-score để custom hàm chấm điểm.

Như hình trên mỗi function-score là một kiểu “query”, chỉ là nó hơi đặc biệt, trong function-score, field “query” quy định điều kiện để mỗi index được chấm điểm như đoạn code trên.

Điều này có nghĩa là mọi index sẽ được chấm điểm dựa, hoặc nếu như đoạn code đưới thì nếu index đáp ứng điều kiện là first_name hoặc last_name là “do” thì index sẽ được chấm điểm. Function-Score sẽ kết hợp điểm của query và điểm của function.

Trong mỗi “function-score” những thông số như

  • score_mode : định nghĩa các kết quả điểm được tạo ra bằng query và điểm tạo ra trong function (function trong function-scrore) sẽ được kết hợp như thế nào, có 6 kiểu nhân, cộng , trung bình cộng, max và min, hoặc là lấy điểm của function đầu tiên có filter match với index.
  • boost_mode : định nghĩa cách tính điểm khi mà có các điểm mới được tạo ra bằng function score, có 6 kiểu, nhân, cộng, trung bình cộng, thay thế, min, max
  • boost : điểm để tăng dùng để tính điểm cho các kết quả truy vấn bằng query ( query trong function_score)
  • functions : tập hợp các function để tính thêm với các index đã được chọn và tính điểm bằng “query”

Function trong Functions của Function-score là nơi chấm điểm cho các kết quả đã được trả về từ query, mỗi index được chấm điểm nếu nó match vs filter của function.

Như đoạn code trên nếu mỗi index sau khi chọn mà thoả mã filter trên thì sẽ được weight = 5 điểm trả về từ function. 5 Điểm này sẽ kết hợp với điểm của các function khác qua giá trị của “score-mode” ví dụ cộng lại điểm của các function hay lấy trung bình cộng, hoặc lên min,max … để trả về kết quả của “functions”.

Ngoài cách dùng functions tính điểm ta còn có thể dùng “script-score” để chấm điểm.

Nhìn sơ qua thì script score sẽ chạy một đoạn code với Index, dùng những tham số đã được truyền qua từ bên ngoài để trả về điểm.

Code demo, sau đây mình sẽ viết một query để chấm điểm cho những kết quả trả về khi mình search những user mà first_name hoặc last_name có chứa chữ “shar”, trả về 1 điểm và nếu first_name hoặc last_name là “sharland” thì mình sẽ cộng thêm 5 điểm.

{
	"query":{
		"function_score":{
			"query":{
				"bool":{
					"should":[
						{
							"match":{
								"first_name":"shar"
							}
						},
						{
							"match":{
								"last_name":"shar"
							}
						}
					]
				}
			},
			"boost":1,
			"boost_mode":"replace",
			"score_mode":"sum",
			"functions":[
				{
					"filter":{
						"term":{
							"first_name":"sharland"
						}
					},
					"weight":5
				},
				{
					"filter":{
						"term":{
							"last_name":"sharland"
						}
					},
					"weight":5
				}
			]
		}
	}
}

Ở trên câu query trên, mình chỉ ra rằng, đầu tiền cần tìm ra những index có first_name hoặc last_name có chứa cụm từ “shar” và nếu có thì trả về 1 điểm cho những index này, sau đó tiếp tục tính điểm tiếp với function có filter, nếu index thoả mãn filter thì sẽ trả về 5 điểm.
Do mình setup “boost_mode = replace “ nghĩa là điểm của function score sẽ thay thế điểm của query trên, “score_mode = sum “, nhưng do chỉ có một function nên tổng điểm của functions = điểm của function.

Và sau đây là kết quả

{
    "took": 14,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 30,
            "relation": "eq"
        },
        "max_score": 5.0,
        "hits": [
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9a87",
                "_score": 5.0,
                "_source": {
                    "first_name": "Dolly",
                    "last_name": "Sharland"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd99f4",
                "_score": 1.0,
                "_source": {
                    "first_name": "Sherwood",
                    "last_name": "Epsly"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9a07",
                "_score": 1.0,
                "_source": {
                    "first_name": "Evy",
                    "last_name": "Sharpless"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9a0b",
                "_score": 1.0,
                "_source": {
                    "first_name": "Hewett",
                    "last_name": "Shimon"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9a12",
                "_score": 1.0,
                "_source": {
                    "first_name": "Sheffy",
                    "last_name": "Dwelley"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9a73",
                "_score": 1.0,
                "_source": {
                    "first_name": "Shermie",
                    "last_name": "Canedo"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9b3f",
                "_score": 1.0,
                "_source": {
                    "first_name": "Shaylyn",
                    "last_name": "Goodread"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9b40",
                "_score": 1.0,
                "_source": {
                    "first_name": "Norrie",
                    "last_name": "Shearmur"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9b61",
                "_score": 1.0,
                "_source": {
                    "first_name": "Sherlocke",
                    "last_name": "Webley"
                }
            },
            {
                "_index": "users",
                "_type": "_doc",
                "_id": "5e0966c1964c7c6f51fd9b6c",
                "_score": 1.0,
                "_source": {
                    "first_name": "Shannon",
                    "last_name": "Ramirez"
                }
            }
        ]
    }
}

Và đúng như kì vọng, index có điểm cao nhất là 5 điểm thoả mãn tất cả các điều kiện, còn lại đều nhận chung 1 điểm vì không thoả mãn function filter.

Như các bạn thấy đó, function rất hữu dụng khi bạn muốn custom score trả về theo mong muốn, để tìm hiểu về function-score bạn có thể ghé thăm tại đây.

Cá nhân mình cũng mới tìm hiểu và không tránh khỏi nhiều sai sót, trong tương lai nếu có cơ hội mình sẽ chia sẻ tiếp về những điều thú vị của elasticsearch. Mình xin dừng bút tại đây, cảm ơn các bạn đã đọc bài ^_^

Chúc các bạn một ngày tốt lành 😀

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

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

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

Vài lời khuyên và cách làm tốt cho kiểm thử tự động

Vài lời khuyên và cách làm tốt cho kiểm thử tự động

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

Đây là bài cuối trong loạt các bài về kiểm thử tự động. Bài này sẽ tổng hợp lại một số cách làm tốt nhất và các chiến lược để làm kiểm thử tự động.

Mặc dù những bài trước đã có đề cập đến vài cách làm hay (và vài điều sẽ được nhắc lại ở đây), bài này chỉ liệt kê vài điều, nhưng quan trọng nhất, để làm kiểm thử tự động.

  Automation skills cho tester già mà lười
  Biện hộ: Vì sao các Developer không test phần mềm của họ?

Những chiến lược này không chỉ là từ kinh nghiệm bản thân mà còn từ những chuyên gia kiểm thử như Micheal Bolton, James Back và Cem Kaner. Những cách làm việc này nên được áp dụng trong mọi dự án kiểm thử tự động.

Thuê một đội ngũ hay kỹ sư kiểm thử chuyên trách

Đây là một điều cơ bản. Đừng đòi hỏi kỹ sư kiểm thử thủ công trong dự án tham gia vào kiểm thử tự động. Nếu chúng ta muốn họ phải làm được kiểm thử tự động, hãy giải phóng họ khỏi các công việc kiểm thử thủ công. Kiểm thử tự động là một công việc toàn thời gian. Để đạt được điều đó, chúng ta cần những nhân sự chuyên trách.

Một công cụ kiểm thử tự động là quan trọng, nhưng nó không phải là giải pháp cho tất cả

Chúng ta đã nói về cách lựa chọn một công cụ kiểm thử. Nhưng lựa chọn được một công cụ đúng chỉ là bước khởi đầu. Vài người quản lý có hiểu lầm rằng, nếu có một công cụ đúng, mọi chuyện về kiểm thử tự động sẽ dễ dàng. Hãy cẩn thận, công cụ kiểm thử tự động không cho chúng ta mọi thứ. Chúng chỉ làm cho quá trình tự động hóa dễ dàng hơn. Và chúng ta cần những nhân sự có kỹ năng để hoàn thành quá trình đó.

Thông thường, những công cụ kiểm thử tự động cũng có lỗi của nó và chúng gặp vấn đề khi xác định những đối tượng UI phức tạp của ứng dụng. Nhân sự mà chúng ta có, nếu họ có kỹ năng, sẽ đưa ra những giải pháp để đẩy nhanh quá trình làm việc. Ngược lại, nếu nhân sự không tốt, chỉ với công cụ không thể đảm bảo cho một dự án kiểm thử tự động thành công.

Lựa chọn công cụ kiểm thử quen thuộc với nhân sự đang có

Nếu nhân sự của chúng ta quen thuộc với C# và ứng dụng cần kiểm thử cũng phát triển bằng C#, vậy thì không có lý do nào để chúng ta lựa chọn một công cụ kiểm thử không hỗ trợ viết mã bằng C#.

Học ngôn ngữ lập trình là một quá trình tốn kém thời gian. Bỏ qua được bước này bằng cách sử dụng một công cụ hợp lý sẽ tối thiểu hóa thời gian làm quen với công cụ.

Hiểu biết về ứng dụng cần kiểm thử

Lựa chọn công cụ kiểm thử tự động phụ thuộc vào độ nặng của công nghệ được dùng trong ứng dụng. Hiểu biết về ứng dụng từ trong ra ngoài trước khi bắt đầu việc kiểm thử tự động.

Nếu là một ứng dụng web, biết về những trình duyệt mà nó sẽ hỗ trợ. Biết về những công nghệ được sử dụng trong nó. Nếu là một ứng dụng Desktop, biết về ngôn ngữ để xây dựng nó. Những đối tượng của bên thứ ba được dùng trong ứng dụng. Những điều này sẽ giúp chúng ta lựa chọn công cụ chính xác và kiểm thử tự động trong tương lai sẽ dễ dàng hơn.

Kiểm thử tự động tốt nghĩa là các kịch bản kiểm thử thủ công tốt

Những kịch bản kiểm thử thủ công tốt sẽ tiết kiệm công sức tự động hóa những kịch bản dễ được làm tự động nhưng không đủ mạnh để tìm lỗi.

Đây là một câu nói trong quyển sách “Lessons Learned in Software Testing“:

Kết quả của việc tự động hóa mà không dựa vào thiết kế kiểm thử tốt là có quá nhiều việc để làm nhưng giá trị mang đến lại chẳng bao nhiêu.

Luôn luôn nên viết kịch bản kiểm thử ở định dạng dành cho kiểm thử thủ công. Xác định tất cả các điều kiện quyết định và dữ liệu kiểm thử. Viết các bước rõ ràng và viết các kết quả mong muốn cho các bước. Mục tiêu của từng kịch bản nên rõ ràng và nó nên độc lập với những kịch bản kiểm thử khác. Kỹ sư kiểm thử tự động nên thực thi kịch bản kiểm thử một cách thủ công, ít nhất một lần, để quyết định các đối tượng nào cần xác định và luồng làm việc. Nên tham khảo thêm từ những kỹ sư kiểm thử thủ công.

Hoạt động này, đôi khi, giúp xác định lỗi ngay cả trước khi bắt đầu viết mã kiểm thử. Những chuyên gia cho rằng, đa số các lỗi được xác định trong giai đoạn phát triển mã kiểm thử hơn là giai đoạn thực thi các mã đó.

Xác định mọi cơ hội với tự động hóa

Nếu chúng ta được giao kịch bản kiểm thử để tự động hóa, đừng chỉ tự động hóa bản thân kịch bản đó. Thay vào đó, hãy tìm kiếm những cơ hội trong việc tự động hóa đó, mở rộng giới hạn của kịch bản kiểm thử đó.

Ví dụ, nếu kịch bản kiểm thử yêu cầu chúng ta đăng nhập vào một hệ thống. Chúng ta có thể mở rộng kịch bản này bằng cách sử dụng hướng-dữ-liệu. Liệt kê toàn bộ nhựng kịch bản khả thi của việc đăng nhập như mật khẩu không hợp lệ, mật khẩu rỗng, tên đăng nhập rỗng, tên đăng nhập không hợp lệ, v.v… liệt kê nhưng kịch bản khả thi này vào trong một tập tin Excel và xem tập tin đó như một nguồn dữ liệu cho kịch bản kiểm thử. Và giờ, với một kịch bản kiểm thử ban đầu, với tự động hóa, chúng ta có thể kiểm thử toàn bộ kịch bản khả thi với một lần thực thi. 

Luôn luôn tìm kiếm những cơ hội có thể làm với tự động hóa, những việc khó làm với cách làm thủ công. Như kịch bản kiểm thử sức tải, kiểm thử hiệu suất, cùng một kịch bản trên nhiều môi trường khác nhau, cấu hình khác nhau, v.v… đó là những kịch bản khó có thể làm với kiểm thử thủ công.

Chúng ta không thể tự động hóa mọi thứ

Kiểm thử tự động chỉ thực thi những kịch bản nào mà yêu cầu phài thực thi thường xuyên. Chúng ta bắt đầu với bộ kịch bản Smoke trước. Sau đó, đến bộ kịch bản cho kiểm thử chấp nhận. Rồi đến những kịch bản phải sử dụng thường xuyên, và những kịch bản mà tốn nhiều thời gian. Nhưng phải đảm bảo rằng mỗi kịch bản mà chúng ta đã tự động hóa, nó phải tiết kiệm thời gian cho kỹ sư kiểm thử thủ công để tập trung vào những thứ quan trọng khác.

Tự động hóa ở đây không phải để thay thế kỹ sư kiểm thử thủ công. Nó không thể. Tự động hóa có mặt để làm những công việc lặp đi lặp lại thay cho kỹ sư kiểm thử thủ công để họ dành sự tập trung và sức lực cho việc tìm kiếm những kịch bản kiểm thử mới và lỗi mới.

Tự động hóa những kịch bản giá trị và tiết kiệm thời gian hay khó để làm với kiểm thử thủ công. Nếu chúng ta làm được điều đó, công việc của kiểm thử tự động đã hoàn thành.

Bỏ qua kiểm thử tự động GUI khi có những giải pháp thay thế

Kiểm thử tự động GUI luôn là phần khó khăn hơn những kiểu kiểm thử tự động khác. Vậy nên, nếu có những tình huống mà chúng ta có thể đạt được mục tiêu mà không cần đụng đến GUI, bằng cách dùng các phương pháp khác như câu lệnh, thì chiến lược chính xác là bỏ qua phần kiểm thử tự động trên GUI.

Ví dụ, chúng ta cần kiểm thử sự cài đặt của một ứng dụng. Mục tiêu là kiểm tra ứng dụng có được cài đặt hay không trên một môi trường cụ thể. Một cách tiếp cận là khởi động chương trình cài đặt và nhấn vào “Next” liên tục thông qua công cụ kiểm thử tự động. Cách này khá khó để áp dụng, tốn kém thời gian và nó là một vấn đề khi bảo trì khi mà UI thay đổi. Một cách tiếp cận khác là khởi động quá trình cài đặt bằng câu lệnh với một tham số “silent”. Ứng dụng sẽ được cài đặt mà không có một GUI nào. Mục tiêu của kiểm thử sẽ đạt được với thời gian ít hơn và đáng tin cậy hơn.

Tự động hóa

Dùng tự động hóa cho những mục đích hữu ích khác

 là một thứ tuyệt với. Chúng ta có thể đạt được nhiều thứ từ nó mà có thể chúng ta chưa từng nghĩ đến. Tự động hóa không chỉ là viết mã cho một kịch bản kiểm thử thủ công. Hơn thế, chúng ta có thể dùng tự động hóa để làm nhanh những hoạt động khác trong dự án.

Ví dụ, chúng ta có thể dùng tự động hóa để tạo những dữ liệu chính và thiết lập cấu hình môi trường một cách tự động cho kỹ sư kiểm thử thủ công. Sau đó, họ có thể bắt đầu việc kiểm thử của họ sớm nhất có thể. 

Tôi có thể đưa cho các bạn một ví dụ từ công ty của tôi. Chúng tôi muốn thay đổi công cụ quản lý kiểm thử. Chúng ta đã dùng “Test Director” (HP ALM) và muốn chuyển sang dùng TFS (Team Foundation Server). Chúng ta có khoảng 4000 kịch bản kiểm thử và báo cáo lỗi trong Test Director. Chuyển toàn bộ dự liệu này sang TFS có thể mất cả tháng nếu làm thủ công. Do đó, quản lý của tôi yêu cầu tôi thử vài cách tự động hóa. 

Tôi tìm hiểu vài công cụ và thấy rằng, Test Director sử dụng SQL Server làm cơ sở dữ liệu. Với TFS, tôi tìm ra một công cụ cho phép đọc kịch bản kiểm thử và báo cáo lỗi từ tập tin Excel, nếu nó có một định dạng cụ thể, và có thể ghi vào TFS. Phần còn lại của câu chuyện thật đơn giản. Tôi viết một đoạn SQL để lấy toàn bộ kịch bản kiểm thử và báo cáo lỗi, và ghi nó ra một tập tin Excel với một định dạng xác định. Sau đó, tôi dùng công cụ để đọc những dữ liệu này và ghi vào TFS. Toàn bộ quá trình chỉ mất khoảng 3 giờ. Quản lý của tôi rất hài lòng. Tôi hy vọng bạn thấy được vấn đề tôi đang nói ở đây.

Kiểm thử tự động là phát triển phần mềm

Nếu chúng ta phát triển một ứng dụng chất lượng, nó cần những bài thực hành tốt. Nó cần xem xét mã nguồn để viết mã có chất lượng. Nó cần một khuôn khổ để đi theo. Nó cần bảo trì liên tục.

Kiểm thử tự động về cơ bản là việc phát triển phần mềm. Do đó, những bài thực hành tốt nhất mà chúng ta đi theo khi phát triển ứng dụng cũng nên được áp dụng khi làm kiểm thử tự động. Khuôn khổ kiểm thử tự động nên có. Xem xét mã nên được tiến hành. Lỗi của kiểm thử tự động nên được báo cáo trong kho lỗi. Mã nguồn của kiểm thử tự động nên được để trong một hệ quản lý mã nguồn, v.v… chúng ta càng xem việc kiểm thử tự động giống phát triển ứng dụng, kiểm thử tự động càng thành công.

Kết luận

Đây là kết thúc bài này cũng như toàn chuỗi bài về kiểm thử tự động. Tôi đã học được nhiều thứ khi viết chuỗi bài này và tôi hy vọng bạn cũng học được khi đọc chúng. Kiểm thử tự động là một sự nghiệp đầy hứng khởi và xứng đáng. Làm nó đúng không chỉ mang lại lợi ích cho chúng mà còn cả cho công ty/dự án.

Mỗi ngày làm việc với kiểm thử tự động và những kỹ thuật của nó, tôi tìm thấy nhiều thách thức mới và hấp dẫn cần giải quyết. Chuỗi bài này chỉ đánh dấu vài thứ trên con đường kiểm thử tự động. Tôi hy vọng tôi chuyển tải nó đến các bạn một cách chính xác và rõ ràng.

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

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

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

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Bài viết được sự cho phép của tác giả Vân Anh

Cơ bản là dạo này nhiều việc linh tinh lớn chiếm nhiều thời gian quá, thành ra không còn nguồn lực dành cho viết bài được, vẫn là tranh thủ thời gian chờ thang máy đọc mấy cái linh tinh thì mới lại nhớ ra mấy trò hay ho này nên tổng hợp thành một bài, danh sách có nhiều thứ và ở nhiều chủ đề khác nhau cơ, nhưng cơ bản là lười với lại vẫn là không sắp xếp được thời gian nên là chỉ có nhiêu đây thôi :))

  10 câu nói cực hay về lập trình
  10 hiểu lầm tai hại về lập trình

Ngoi lên chút để thấy là mình vẫn không quên cái trang blog này, đã bao lâu rồi, đã bao nhiêu món nợ chưa trả được… ây za.. nhưng mà yên tâm, mình sắp trở lại rồi đây!!!!!

1. Sinh tự động chuỗi ký tự trong Word và Excel

Chắc hẳn là trong chúng ta đã từng rơi vào trường hợp kiểu như là muốn ghi nháp một vài từ nào đó mà tự dưng ko biết ghi cái gì đành gõ bừa bàn phím một cách loạn xạ và nhanh nhất có thể. Từ nay khi biết đến sự tồn tại của hàm này bạn sẽ có thể nhanh chóng tạo ra được một đoạn ký tự mẫu đẹp mắt và chuyên nghiệp hơn.

Trong MS Word, chỉ cần gõ: =rand() sau đó nhấn enter, lúc này Microsoft Word sẽ tự động sinh ra một đoạn ký tự ngẫu nhiêu mà bạn không cần phải gõ thêm tí nào nữa.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Với hàm trên, ta cũng có thể thêm các đối số cho nó ví dụ như =rand(2,3), lúc này đoạn ký tự được sinh ra sẽ có 2 đoạn, mỗi đoạn sẽ có 3 câu.

Bên cạnh =rand(), MS cũng cung cấp một số hàm khác mà bạn có thể sử dụng với tính năng tự như:

=lorem() và =rand.old()

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Còn với MS Excel, hàm =rand() sẽ giúp bạn sinh một số thập phân ngẫu nghiên nằm trong khoảng từ 0 đến 1. :D. Hoặc có thể sinh một số ngẫu nhiên trong một khoảng số nào đó thì có thể dùng hàm =randbetween(lớn hơn số này, nhỏ hơn số này), ví dụ: =randbetween(45;80) – thì có nghĩa là sinh ngẫu nhiên 1 số nằm trong khoảng từ 45 đến 80, ta có thể kéo công thức này cho các ô phía dưới hoặc bên cạnh như hình minh họa phía dưới.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

2. Tìm kiếm linh hoạt và chủ động hơn với Google

Đơn giản như bạn muốn tìm nhanh thông tin hoặc tài liệu theo định dạng file cụ thể nào đó, thì chỉ cần gõ từ khóa tìm kiếm đó vào ô tìm kiếm của Google với cú pháp sau:

Filetype:file_format

Ví dụ gõ: ISTQB filetype:pdf > nhấn Enter => Kết quả tìm kiếm sẽ hiển thị tương tự như hình phía dưới đây.

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

Tương tự đối với các loại định dạng file khác nhau, có thể là doc, pttx, xlsx… bất kỳ định dạng nào mà bạn muốn tìm kiếm đều có thể sử dụng cách tìm kiếm này để tối ưu hơn.

Bên cạnh tips nhỏ phía trên, ta còn có thể sử dụng trực tiếp công cụ tìm kiếm nâng cao của Google bằng cách nhấn nào link Cài đặt > Tìm kiếm nâng cao. (https://www.google.com/advanced_search)

Ở tìm kiếm nâng cao, chúng ta có thể tùy chọn việc tìm kiếm còn linh hoạt hơn nữa, với các tiêu chí cụ thể hơn. Các bạn tham khảo hình, và thử tìm kiếm vài thứ xem sao nhé! 😀

Vài thứ hay ho, thân thuộc cơ bản mà cũng hữu ích

3. Hẹn giờ tắt máy

Có khá là nhiều cách để tắt máy tính sau khi làm việc, thường thi sau khi làm việc xong thì chỉ cần nhấn nút nguồn là máy tắt, chọn Start > Shutdown là xong. 😀 Còn không thì cứ để máy ngâm đó, sau khoảng thời gian máy sẽ tự sleep… 😀

Trò này thì có thể không phải chị em nào cũng biết, vậy thì hôm nay mình giới thiệu thêm cho các bạn một trò tắt máy khác là dùng run, gõ lệnh shutdown –s

Có cái này còn hay hơn là hẹn giờ để tắt máy, nghĩa là mình muốn sau khi mình đi khỏi chỗ 30 phút thì mới thực hiện tắt máy, vẫn dùng run, gõ lệnh “shutdown -s -t 1800″ (Sau 30 phút = 1800 giây) 😀

Hihi, chắc hẳn cái này không có gì là mới, nhưng cũng có thể là không nhiều người biết, cứ chia sẻ thôi nha 😀

4. Một vài phím tắt hay ho có thể dùng trong các trình duyệt

Alt+D → Address bar – Bôi đen nhanh địa chỉ web tại tab đang mở

Ctrl+N → New Window – Mở nhanh của sổ trình duyệt mới

Ctrl+Shift + N → New Incognito Window – Mở cửa sổ trình duyệt ẩn danh mới

Ctrl+T → Open New Tab – Mở một tab mới tại trình duyệt đang mở

Ctrl+Tab → Toggle between Tabs – Chuyển qua lại giữa các tab đang mở trong cửa sổ trình duyệt

Ctrl+Number → Switch to the numbered tab (Ex: Ctrl+2 → Switch to 2nd tab) – Chuyển sang trình duyệt ở số thứ tự tương ứng, ví dụ nhấn Ctrl +2 thì trình duyệt sẽ nhảy sang tab thứ 2 trong cửa sổ trình duyệt đó.

Ctrl+F4/Ctrl+W→ Close current tab – Đóng tab hiện tại

Ctrl+Shift+T → Reopen recently closed tab – Mở lại tab vừa đóng. – Hữu ích khi mà nhỡ tay đóng mất tab không muốn đóng.

Ctrl+Left_Click → Open link in a New Tab – Nhấn để mở link trong tab mới

Ctrl+H → History – Hiển thị lịch sử duyện web

F11 → Full Screen Browsing – Hiển thị trình duyệt toàn màn hình

Ctrl+Enter → Adds “www.” at start and “.com” at the end of the word you type in address bar –  Sau khi nhập vào một chuỗi ký tự, nhấn tổ hợp phím này thì thanh địa chỉ trình duyệt sẽ add thêm “www.” vào đầu và “.com” vào cuối chuỗi ký tự mình nhập vào trước đó.

Ví dụ: khi gõ chữ “pinterest” sau đó nhấn tổ hợp phím “Ctrl+Enter” thì trình duyệt sẽ tự thêm và duyệt đến địa chỉ web là www.pinterest.com

Nói chung thì có khá là nhiều trò hay ho nhưng mà để tổng hợp dần dần, bản thân mình thấy các phím tắt sử dụng với trình duyệt kia không phải là ít người biết đến, với cũng thường dùng chuột quen rồi, tuy nhiên nếu hạn chế chuột thì mình thấy sử dụng phím sẽ nhanh và tiện hơn rất nhiều. 😀

Hầu hết trong bài viết này là những cái mà mình đã từng và có cái là sử dụng liên tục, có thể nói là hàng ngày (trừ thứ 7, chủ nhật) vậy nên cũng rất vui nếu giúp ích ai đó trong việc làm cho công việc thường ngày đỡ nhàm chán đôi khi mang đi thể hiện với những người không chuyên còn thấy rất ngầu nữa =)) Haha

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

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

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

Ghi chú về JWT

Ghi chú về JWT

Bài viết được sự cho phép của tác giả Lưu Bình An

Cơ bản, cần nắm

JWT có thể nhớ nôm na là một JSON đã encrypt => gọi là token, chứa thông tin giúp backend có thể định danh bạn là ai, bạn có quyền gì

Ghi chú về JWT

Nguyên nhân ra đời của JWT là để giải quyết bài toán định danh trong microservice

Phía Back end

Ở phía Backend có 2 vấn đề chính cần quan tâm

  1. Tạo như thế nào
  2. Validate ra làm sao
  Hiểu rõ về JSON là gì? Cách lấy dữ liệu từ JSON
  JSON Web Token (JWT) là gì ?

Việc tạo, thật ra sử dụng những thư viện có sẵn (jsonwebtoken nếu bạn đang dùng Node.js), bạn chỉ cần quan tâm những giá trị đã hoặc muốn nhét thêm trong JSON

Một trường tối quan trong trong JSON là expiresIn, cho phép token sẽ expire sau bao lâu.

Việc validate, thì dùng thư viện nào tạo token, nó sẽ có luôn phương thức để kiểm tra token đó có hợp lệ không.

Phía client dùng SPA

So sánh định danh bằng Session và Token

Giống nhau

  1. Chức năng như nhau, để định danh
  2. Sau khi định danh ở Backend, nó trả về token cho client
  3. Gửi kèm token trên khi muốn dùng một service ở phía backend

Khác nhau

  • Session thì dữ liệu và trạng thái đăng nhập của user được lưu ở bộ nhớ phía server. Không phù hợp với RESTful APIs, mỗi service đều phải stateless, anh là ai, anh từ đâu tới đều phải đưa chứng minh nhân dân chứ chúng tôi không ai rảnh đầu ngồi nhớ mặt hết những ai ra vào service.
  • Session sẽ lưu thông tin về user ở cookie của trình duyệt, vấn đề là các service có thể khác domain, trình duyệt không biết và sẽ không đưa thông tin cookie cho các domain khác

Vấn đề với XSS và CSRF khi dùng JWT

Hết sức thận trọng khi xử lý JWT trong code, token là mồi ngon cho XSS và CSRF

Tuyệt đối không dùng local storage để lưu JWT trên phía frontend. Localstorage có thể được truy xuất bằng JS cùng domain, attacker có thể dùng điểm này để inject thêm mã để lấy local storage. (XSS)

Vì cookie được gửi trên tất cả request, attacker có thể lợi dụng điểm này để gửi một link yêu cầu đổi password (CSRF)

Nếu không còn lựa chọn nào khác, lưu trong bộ nhớ, lưu ý sẽ mất khi user refresh.

Cookie thật ra không phải là không dùng được, nhưng dùng thì phải kiểm tra

  • Dùng httpOnly để cookie không thể được truy cập thông qua JS
  • Dùng SameSite để hạn chế cấp phát cookie đi các domain chỉ định. Nếu phải đưa qua nhiều domain khác nhau, dùng Lax, nó cho phép gọi truyền cookie khác domain nếu là GET

Nếu muốn 100% an toàn tuyệt đối, một số cái giá phải trả, như tắt cross-domain request.

Nếu sử dụng axios, và backend tạo cookie đúng chuẩn, để axios lo phần đó cho an toàn, không cần lo việc xử lý token, cookie một cách thủ công, thiếu chuyên nghiệp.

axios.defaults.withCredentials = true;

Code tham khảo

Có cần HTTPS với JWT?

HTTPS có đảm bảo an toàn tuyệt đối cho site, là yêu cầu bắt buộc khi sử dụng JWT?

100% bảo mật là con số chưa ai giám nhận, hay nói tẹc ra là không thể. Sẽ luôn có đâu đó một con người tài giỏi, thông minh hơn bạn, họ sẽ tìm được cách tấn công phù hợp. May mắn thay những người xuất chúng như vậy họ cũng có đạo đức cao và không rảnh để làm những việc quá tầm thường. Đừng có lên mạng mà “Anh đố chú hack được site anh!”

HTTPS là cơ chế encrypt thông tin đi-về giữa client và server, đảm bảo không có người ngoài nào có thể dòm ngó và đọc được bạn đang gửi gì, nhưng nếu nó đã chui được vào nhà bạn rồi thì thành thật mà nói HTTPS cũng không phải là cánh cửa chỉ có bạn mở được.

Khi nào không nên dùng JWT

Nếu bạn đang muốn sử dụng một stateful backend, JWT là thừa thãi không cần thiết.

JWT sinh ra và phù hợp nhất với stateless API

Thư viện ngon

Vue: vuejs-jwt

React: react-jwt

Angular: angular-jwt

Ghi chú từ bài viết JWT Authentication Best Practices

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

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

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

6 Công cụ miễn phí cực hay cho Startup

Khái niệm transaction trong database

Bài viết được sự cho phép của tác giả Trung Đức

1. Beetle.email – EMAIL MARKETING INSIGHT

Đúng như tên gọi, hệ thống này giúp bạn follow rất nhiều chiến dịch của các thương hiệu lớn cũng như timeline triển khai dự án và analytics của từng chiến dịch.

Dựa vào những campaign này, và những số liệu thực tế, bạn hoàn toàn có thể có những chiến dịch Email Marekting phù hợp

>>> Link: https://beetle.email/

13907058_1167149149974920_6330693835639545302_n

2. Templated.co

Website cung cấp template viết bằng CSS và HTML5 miễn phí nhưng cực kì chất lượng Hiện website có khoảng 845 template, tất cả đều được thiết kế theo phong cách hiện đại.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

Những template này đều hỗ trợ giao diện responsive, được thiết kế và code bởi Cherry + AJ và được xuất bản theo giấy phép Creative Commons. Bạn có thể sử dụng miễn phí những template này cho nhu cầu cá nhân hoặc thương mại.

>>> Link: https://templated.co/

3. Ruzzit.com

Trang web giúp bạn nắm bắt xu hướng content “hot” nhất của các mạng xã hội hàng đầu thế giới.

>>> Link: http://www.ruzzit.com/

4. Compressor.io

Công cụ giúp bạn có thể nén tối đa kích thước của ảnh mà vẫn giữ được một chất lượng “high quality” cho chúng

>>> Link: https://compressor.io/

5. EMOTIFY – EMOTIONAL INTELLIGENCE FOR YOUR WEBSITE

Bạn thấy các tương tác cảm xúc của Facebook rồi chứ? Hệ thống này cũng tương tự, nó sẽ giúp bàn chèn những icon cảm xúc và người dùng sau khi đọc xong hoặc sử dụng xong sản phẩm của bạn, họ có thể phản hồi về những điều họ cảm thấy.

Vì hệ thống này free, nên bạn hãy cứ thử nghiệm đi nhé 😉

>>> Link: https://www.goemotify.com/

6. Google PageSpeed Insights

Đây là một công cụ kiểm tra hiệu suất website từ Google. Công cụ này sẽ hiển thị trạng thái, hiệu suất hoạt động của blog/website và hướng dẫn cho bạn cách để cải thiện nó.

>>> Link: https://developers.google.com/speed/pagespeed/insights/


Nguồn: MediaZ

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

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

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

Có nên học Kotlin?

Có nên học Kotlin?

Bài viết được sự cho phép của tác giả Trần Duy Thanh

Mấy ngày này cái tên Kotlin đã tạo nên một cơn địa chấn làm rung chuyển giới công nghệ, bạn đã xem phim “Đường Sơn Đại Địa Chấn” chưa? nếu bộ phim vô cùng hay này đã cướp đi không biết bao nhiêu nước mắt của khán giả thì Kotlin làm điều ngược lại, nó lan tỏa không biết bao nhiêu nụ cười cho giới lập trình viên bởi nhiều tiện ích mà nó đem lại. Đặc biệt ngày 17/05/2017 vừa rồi Google đã công bố Kotlin trở thành ngôn ngữ lập trình Android chính thống giáo, từ phiên bản Android Studio 3.0 các lập trình viên có thể tha hồ tung hoành!

  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
  Java đang ngăn cản sự phát triển của Android và Kotlin không phải là cách giải quyết

Và Tui dự đoán rằng: Trong tương lai sẽ có làn sóng mạnh mẽ về tuyển dụng lập trình viên Android bằng ngôn ngữ Kotlin, các công ty sẽ rất khát nhân lực, các bạn cần nhanh chóng nghiên cứu Kotlin để đi đầu về công nghệ.

Nếu bạn còn bảo lưu quan điểm Chậm Mà Chắc, thì Tui nghĩ nó không còn đúng nữa. Thời đại này khác xưa rồi, các bạn phải Nhanh Mà Chắc mới hơn người ta được, đừng chờ cho tới khi Kotlin quá phổ biến thì lúc đó bạn là người đến sau. Hãy chiến đấu ngay từ bây giờ để đi đầu về công nghệ!

Hi hi hi, nghe tới đây bạn Đã Ghiền Kotlin chưa? Ngày xưa Tui học Văn là dốt nhất lớp, toàn bị 4.5 điểm, nên cố gắng lắm mới viết được một chút ít giới thiệu về Kotlin

Có nên học Kotlinha ha – nhìn hình này có vẻ Toptal nói Java già cỗi

Kotlin có nhiều ưu điểm, ở đây Tui liệt kê một số để các bạn tham khảo (dĩ nhiên các bạn có thể tìm hiểu thêm):

Có nên học KotlinNgắn gọn như thế nào?

  • Ta có thể dễ dàng viết các POJO (Plain Old Java Object) trên một dòng :
data class Customer(val name: String, val email: String, val company: String)
  • Ta có thể dùng Lambda để lọc dữ liệu một cách nhanh chóng:
val positiveNumbers = list.filter { it > 0 }
  • Ta có thể tạo đối tượng bằng SingleTon:
object ThisIsASingleton {
    val companyName: String = "https://ssoftinc.com/"
}

Và còn nhiều cách viết ngắn gọn khác nữa, các bạn có thể tham khảo thêm trên http://kotlinlang.org/

An toàn như thế nào?

Kotlin tự động kiểm tra lỗi biễn dịch Null pointer exception, các hành vi trên tập dữ liệu null, tự động ép kiểu đúng một cách chính xác cho ta, ví dụ so sánh:

Có nên học KotlinĐa năng như thế nào?

Phải nói Kotlin có thể làm các multiplatform applications. Có thể build Kotlin cho Server-side , cho Android, cho Javascript, Native….

Khả năng tương tác như thế nào?

Kotlin có thể sử dụng được 100% các thư viện từ JVM, có thể dễ dàng từ Kotlin triệu gọi Java và từ Java triệu gọi Kotlin. Giúp các Lập trình viên không lo lắng về việc chuyển đổi coding, tăng khả năng tương tác mạnh mẽ trong hệ thống.

Ngoài ra Kotlin còn có thể dễ dàng lập trình trên nhiều công cụ khác nhau: Website, Eclipse, Netbeans, Android Studio, JetBrains… Tài liệu lập trình phong phú, cộng đồng hỗ trợ Kotlin ngày càng không ngừng phát triển.

Các cuốn sách Lập trình viên có thể nghiên cứu:

1.Kotlin in Action

Có nên học KotlinCuốn sách có 11 chương, giúp bạn hiểu rõ về Kotlin từ cơ bản tới nâng

2.Kotlin for Android Developers

Có nên học KotlinSách dành cho những ai đã rành về Kotlin, tiếp tục phát triển Kotlin bên Android (phần đầu vẫn dạy về Kotlin), được xé nhỏ thành 26 chương giúp ta dễ dàng học

3.Modern Web Development with Kotlin

Có nên học KotlinCuốn sách dạy về Web với Kotin, đặc biệt EcmaScript 6 chuẩn mới nhất, Json….Các bạn quan tâm có thể học, khoảng 115 trang.

4.Programming Kotlin

Có nên học KotlinCuốn này cũng tương tự, giúp ta có thể học tốt Kotlin. Bố trí thành 13 chương (420 pages ) các bạn có thể bám theo cuốn này để học

5.Fundamental Kotlin

Có nên học KotlinCuốn sách này khá hay, bạn có thể tham khảo.

Chúc các bạn nhanh chóng học tốt Kotlin, hẹn gặp các bạn ở những bài sau

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

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

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

Low Coupling và High Cohesion là gì?

LOW COUPLING VÀ HIGH COHESION LÀ GÌ?

Bài viết được sự cho phép của Edward Thiên Hoàng

Low coupling và high cohesion là 2 thuộc tính đi cùng với nhau như là mục tiêu cần đạt được trong thiết kế, trong bài viết này, cùng tìm hiểu xem chúng là gì, làm sao để đạt được và tránh các lỗi liên quan đến coupling và cohesion khi thiết kế phần mềm.

COUPLING

Low couplingloose coupling hay high coupling và tight coupling, ắt hẳn ai trong chúng ta khi học về các nguyên lý lập trình căn bản đều biết về khái niệm coupling này. Coupling đề cập đến vấn đề phụ thuộc lẫn nhau giữa các component. Low coupling, loose coupling có nghĩa là các component ít phụ thuộc vào nhau, sự thay đổi trong component này ít khi, hoặc không ảnh hưởng đến component kia. Ngược lại, high coupling và tight coupling cho thấy các component phụ thuộc nhiều vào nhau, khi thay đổi 1 component thì các component kia đều bị ảnh hưởng và có khả năng phải thay đổi theo. Tất nhiên, low coupling là mục tiêu chúng ta cần hướng đến để đảm bảo cho hệ thống ít bị ảnh hưởng khi có thay đổi và do đó, tăng tốc độ thực hiện công việc và bảo trì.

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  20 trường hợp sử dụng lệnh Docker cho developer

Thêm một ví dụ nữa về coupling

Trong câu hỏi trên StackOverflow có một câu trả lời cho thấy một mô tả hài hước nhưng khá chính xác và rõ ràng về những gì 1: 1 coupling là:

iPod là một ví dụ tốt về tight coupling: một khi pin chết bạn cũng có thể mua một chiếc iPod mới vì pin được hàn cố định và sẽ không bị lỏng, do đó thay thế rất tốn kém. Một cái máy có tính loosely coupled sẽ cho phép thay đổi pin dễ dàng.

iPods are a good example of tight coupling: once the battery dies you might as well buy a new iPod because the battery is soldered fixed and won’t come loose, thus making replacing very expensive. A loosely coupled player would allow effortlessly changing the battery.

Tương tự, 1: 1, trong phát triển phần mềm.

Chúng ta sẽ xem xét diagram dưới đây:

tight_coupling

Nếu chúng ta nhìn vào hình trên, nó cho chúng ta thấy một mối liên hệ giữa hai class được gọi là tight coupling. Class1 ở trên tạo ra các đối tượng của Class2 trực tiếp, và thậm chí là đi đến các biến thành viên và truy cập vào. Điều này làm cho nó rất phụ thuộc vào Class2. Điều gì sẽ xảy ra nếu chúng ta quyết định rằng chúng ta muốn thêm tham số thêm vào trong constructor của Class2 và đặt mặc định là private? Sau đó, chúng ta phải thay đổi mọi cách sử dụng Class2 ở mọi nơi. Không đẹp lắm, heh? Có thể là một cơn đau đầu rất lớn và là một trong những vấn đề đầu tiên trong thiết kế.

Dưới đây là ví dụ bằng code:

public class ClassA {

    private boolean attributeA;

    public int methodA() {
        if(attributeA) {
            return new ClassB().attributeB;
        }
        return -1;
    }

    public String getValue() {
        return new ClassB().getValue();
    }

}

public class ClassB {

    public int attributeB;

    public String getValue() {
        return "Heh?!?";
    }

}

MỘT SỐ GIẢI PHÁP

DEPENDENCY INVERSION

Ví dụ trong Java, ta sẽ thêm một interface. Đó là cách Class1 sẽ chỉ phụ thuộc vào interface đó, chứ không phải là implementation thực tế của Class2, do đó giảm thiểu sự phụ thuộc trực tiếp giữa 2 class với nhau.

LAW OF DEMETER (DON’T TALK TO STRANGERS!)

Lợi điểm của Law of Demeter là nó giúp hệ thống của chúng ta đứng vững trước những thay đổi bằng cách giảm coupling hay còn gọi là cách design loose coupling, mọi sự thay đổi sẽ là nhỏ nhất nếu có thể.

COHESION

Còn high cohesion (trái ngược với nó là low cohesion) là gì? Khi nói đến cohesion chúng ta nghĩ đến nhiệm vụ của từng module. Nhiệm vụ của từng module càng rõ ràng và tách biệt thì cohesion càng cao (high cohesion), và đó là mục tiêu cần đạt tới khi thiết kế. Giải thích bằng code có lẽ sẽ không rõ ràng, hãy xem xét câu dưới đây:

Tại kỳ họp Quốc hội thứ năm, khi thảo luận về quản lý chất lượng vệ sinh an toàn thực phẩm có vị đại biểu Quốc hội đã ví việc có tới 5 bộ chịu trách nhiệm chính như vậy cũng giống như “nhiều sãi không ai đóng cửa chùa”.Bởi thế, làm rõ trách nhiệm của từng cơ quan quản lý Nhà nước về an toàn thực phẩm là một yêu cầu được nhấn mạnh khi xây dựng Dự Luật An toàn thực phẩm.

Nguồn: http://vneconomy.vn/thoi-su/an-toan-thuc-pham-bo-nao-trang-trai-bo-nao-ban-an-20100519102635734.htm

Nếu xem Dự Luật An toàn thực phẩm là một feature thì rõ ràng nó đã không đạt được tính high cohesion trong thiết kế vì nó phải dàn trải và phụ thuộc vào rất nhiều module (5 bộ, phòng ban) khác nhau. Do đó, khi cần chỉnh sửa bổ sung dự luật sẽ rất khó khăn vì phải sửa 1 lúc 5 module, mà bạn thấy đó, điều đó rõ ràng là rất khó. Nếu quy trách nhiệm xây dựng bộ luật này cho một bộ ban duy nhất thì sẽ giảm tính phức tạp và do đó, tăng tính cohesion. High cohesion thường đạt được nếu ta tuân thủ theo nguyên tắc đơn nhiệm (Single responsibility principle), mỗi module, khi đó chỉ đảm nhiệm một nhiệm vụ duy nhất, không hơn không kém, và không có chuyện 2 module cùng làm một nhiệm vụ, một tính năng.

Đến đây chắc ai cũng hiểu được rồi đúng không? Ít nhất là về mặt lý thuyết, hãy xem xét bảng sau trước khi mình đi vào các dẫn giải tiếp theo.

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

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

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

Laravel 8: dễ dàng đổi giá trị auto increment mặc định database

Laravel 8: dễ dàng đổi giá trị auto increment mặc định database

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

Laravel 8 bổ sung một phương thức hoàn toàn mới để giúp việc thay đổi giá trị auto increment trở nên dễ dàng và đây là thông báo chính thức được đưa ra trên Twitter của Taylor Otwell:

Sneaking this into Laravel 8.x today… 👨‍🔬 pic.twitter.com/Bg24S7iX4j

— Taylor Otwell 🛸 (@taylorotwell) September 6, 2020

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id()->startingValue(1200);
        ...
    });
}

Việc thay đổi auto-increment thông qua các nền tảng cơ sở dữ liệu (database platforms) khác nhau luôn có thể thực hiện được, nhưng bạn cần thực hiện điều đó thông qua một lệnh thô (raw command). Với việc bổ sung phương thức startValue, điều này cho phép bạn thiết lập số đầu tiên để tăng tự động sẽ bắt đầu.

Đối với hầu hết các ứng dụng, bạn có thể sẽ không cần điều này nhưng trong những trường hợp bạn không muốn người dùng biết rằng ứng dụng của bạn chỉ có 10 người dùng, thì đây là một tùy chọn rất hữu ích phải k nào.

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

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

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

                                        Việc làm laravel chất nhất các ngành hot

Khái niệm transaction trong database

Khái niệm transaction trong database

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

Khái niệm transaction trong database là một khái niệm quan trọng mà tất cả các lập trình viên nên biết bởi vì chúng ta sẽ làm việc rất nhiều với khái niệm này. Trong bài viết này, mình xin trình bày với các bạn về khái niệm này!

Để dễ hình dung, mình xin lấy một ví dụ như sau: chúng ta đang làm việc với một ứng dụng bên ngân hàng, ứng dụng này có một tính năng đó là chuyển tiền giữa các tài khoản ngân hàng với nhau, ví dụ chuyển tiền cho tài khoản A sang tài khoản B. Đây là một tính năng mà quá trình xử lý sẽ gồm 2 bước:

Tuyển database lương cao hấp dẫn trên TopDev

Tuyển dụng IT lương cao nhiều ngành nghề

  • Thứ nhất là trừ tiền trong tài khoản A
  • Và bước thứ hai là cộng tiền vào tài khoản B.

Rõ ràng, như các bạn thấy, đây là một quá trình nếu gọi là thành công thì bắt buộc 2 bước trên phải thành công, hoặc nếu thất bại thì bắt buộc 2 bước trên cũng phải thất bại luôn. Nếu chỉ một trong 2 bước trên thành công hoặc thất bại thì chúng ta sẽ gặp vấn đề ngay. Và chúng ta khi xây dựng ứng dụng cũng phải đảm bảo 2 điều kiện trên.

Đây chính là ý tưởng chính của khái niệm transaction trong database. Trong database, một transaction là một tập hợp các thao tác mà ở đó hoặc là các thao tác đó được thực hiện thành công, hoặc là không một thao tác nào được thực hiện thành công cả. Khi các bạn suy nghĩ về transaction trong database, các bạn hãy hình dung nó là “hoặc là tất cả hoặc là không gì hết”.

Ở đây, chúng ta có một chữ viết tắt ACID (Atomicity, Consistency, Isolation, Durability) định nghĩa các tính chất của một transaction trong database.

Trong đó:

  • Atomicity: tính chất này thể hiện khái niệm “hoặc là tất cả hoặc là không gì hết”. Toàn bộ các bước được thực hiện trong một transaction nếu thành công thì phải thành công tất cả, nếu thất bại thì tất cả cũng phải thất bại. Nếu một transaction thành công thì tất cả những thay đổi phải được lưu vào database. Nếu thất bại thì tất cả những thay đổi trong transaction đó phải được rollback về trạng thái ban đầu.

Trong ví dụ của mình, rõ ràng khi đã trừ tiền trong tài khoản A thì bắt buộc việc cộng tiền vào tài khoản B phải xảy ra. Còn không thì không có gì xảy ra hết, đã không trừ tiền trong tài khoản A thì chắc chắn rồi, việc cộng tiền vào tài khoản B cũng không xảy ra.

  • Consistency: dữ liệu từ thời điểm start transaction với lúc kết thúc phải nhất quán.

Trong ví dụ của mình thì, nếu đã trừ 10$ trong tài khoản A thì trong tài khoản B phải được cộng 10$.

  • Isolation: nếu chúng ta có nhiều transaction cùng một lúc thì phải đảm bảo là các transaction này xảy ra độc lập, không tác động lẫn nhau trên dữ liệu.

Trong ví dụ của mình, giả sử cùng môt lúc xảy ra 2 transaction như trên thì rõ ràng chúng ta không xác định được trạng thái của tài khoản A và tài khoản B sau khi thực hiện cùng 1 lúc. Mà điều này thì rất nguy hiểm.

  • Durability: điều này có nghĩa dữ liệu sau khi thực hiện transaction sẽ không thay đổi nếu chúng ta gặp vấn đề gì đó liên quan đến database.

Ví dụ sau khi chuyển tiền vào tài khoản B thành công thì dù database có gặp bất cứ vấn đề gì thì tài khoản B vẫn đảm bảo đã nhận đủ 10$.

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

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

Tất tần tật về Apache Cassandra

Tất tần tật về Apache Cassandra

Bài viết được sự cho phép của tác giả Ngo Thang

Nói về cơ sở dữ liệu thì chắc ai cũng nghĩ ngay đến hệ quản trị cơ sở dữ liệu quan hệ như Mysql, PostgreSQL, hay NoSQL như MongoDB, DynamoDB, Cassandra…

Và theo mình nghĩ đa số anh em ở đây cũng đang sử dụng chủ yếu là MySQL. Mình cũng vậy, từ lúc đi làm đến giờ toàn phang MySQL, chưa có cơ hội làm việc với NoSQL (tự tìm hiểu thì có còn dùng trong dự án thật thì chưa)

  Maven Apache
  20 trường hợp sử dụng lệnh Docker cho developer

Kể cả các công ty to như Pinterest hay Instagram cũng vậy, họ vẫn đang dùng MySQL.

Còn NoSQL thì hiện nay thấy rất nhiều công ty đã dùng vào hệ thống chính của họ. Ví dụ như Netflix, Discord, Spotify …

Nên hôm nay quyết định viết bài này để tìm hiểu xem thật sự thằng Cassandra này nó có ưu điểm, nhược điểm gì, dễ scale hay không …

Khái quát qua về Cassandra

Cassandra là NoSQL, được phát triển bởi Facebook vào năm 2007. Sau đó nó được tặng cho quỹ Apache vào 2/2010 và nâng cấp lên thành dự án hàng đầu của Apache.

Cassandra là hệ cơ sở dữ liệu phân tán, kết hợp những gì tinh tuý nhất của Google Bigtable và Amazon DynamoDB. Ngôn ngữ phát triển Cassandra là Java.

Cassandra được thiết kế có thể chạy trong phần cứng giá rẻ, và cung cấp write throughput khá là cao (latency tầm 0.5ms), trong khi read throughput thì thấp hơn (latency tầm 2.5ms).

Nếu nói đến NoSQL thì chắc ai cũng đều có chút liên tưởng nó hoạt động thế nào rồi. Cassandra cũng vậy, dữ liệu được lưu vào table, sau đó dùng 1 ngôn ngữ query như SQL để thực hiện thao tác với dữ liệu.

Cassandra là hệ cơ sở dữ liệu phân tán, dữ liệu được lưu trữ trên nhiều node của nhiều máy khác nhau, theo cơ chế P2P. Hiệu năng xử lý của hệ thống cũng tăng theo số node (nếu càng nhiều node thì càng xử lý được nhiều request).

Điều đó sẽ giúp cho Cassandra dễ dàng scale theo chiều ngang.

Về hiệu năng thì Netflix cũng đã thực hiện đo benchmark, kết quả ngoài mong đợi. Với 288 nodes, Casandra đã đạt được throughput lên đến 1 triệu write/s. Khá kinh khủng.

Kết quả thực hiện đo benchmark ở đây: https://medium.com/netflix-techblog/benchmarking-cassandra-scalability-on-aws-over-a-million-writes-per-second-39f45f066c9e

Use Cases của Cassandra

Cassandra là 1 hệ cơ sở dữ liệu không quan hệ, và thường được sử dụng trong nhiều loại ứng dụng khác nhau. Dưới đây là 1 số use cases mà Cassandra thường hay được sử dụng.

Messaging

Cassandra rất thích hợp trong những ứng dụng hay service làm về chat. Hiện nay có 1 số công ty đang dùng như Facebook, Discord.

Internet of things

Cassandra cũng rất thích hợp cho những dòng ứng dụng mà có tốc độ dữ liệu gửi đến cực khủng từ nhiều thiết bị khác.

Social Media Analytics and recommendation engine

Cassandra cũng rất thích hợp cho những chức năng về recommendation hay 1 vài chức năng liên quan đến analytics.

Điểm mạnh của Cassandra

Hệ thống phân tán

Do Cassandra được kế thừa từ Amazon DynamoDB nên tính mở rộng của nó là khá lớn. Khi tốc độ xử lý của hệ thống không đủ thì ta chỉ cần thêm node mới vào là được.

Partitioning

Là kiến trúc phân phối dữ liệu trên nhiều node bên trong cluster.

Dựa theo thuật toán Consistent Hashing thì mỗi node sẽ được cấp phát 1 token, và dựa vào token này sẽ phân phối dữ liệu đến từng node.

Dữ liệu được tạo ra nhờ replication sẽ tự động phân chia đến từng node.

Tất tần tật về Apache Cassandra

Gossip Protocol

Là giao thức truyền thông giữa các node trong cluster. Cơ bản là truyền thông P2P.

Cơ chế lưu dữ liệu

Cassandra thực hiện việc lưu dữ liệu thông qua 2 chỗ:

  • Không gian bộ nhớ (được gọi là memtable)
  • Không gian đĩa (được gọi là SSTable)

Khi write dữ liệu thì đầu tiên sẽ lưu trên memtable. Sau khi dữ liệu trên memtable full thì khi đó sẽ thực hiện ghi toàn bộ dữ liệu trên memtable xuống SSTable.

Khi read dữ liệu thì đầu tiên sẽ tìm trong memtable trước. Nếu không có thì lại tìm xuống SSTable để lấy.

→ Chính vì dữ liệu được lưu trên memory nên việc việc lấy dữ liệu trên Cassandra trở lên khá là nhanh.

Khi xoá dữ liệu thì thực tế dữ liệu không được xoá, mà nó được gán 1 cái cờ gọi là tombstone. Sau 1 khoảng thời gian nào đó sẽ có 1 con batch chạy đi scan và thực hiện xoá.

Tính nhất quán dữ liệu trong cluster

Khi nhận được request đọc ghi đến DB của Cassandra, khi đó cái node nhận được request này sẽ đảm nhiệm 1 chức vụ được gọi là coordinator, và tiến hành xử lí request đọc ghi đến những node liên quan.

Dựa vào cấp độ của tính nhất quán (Consistency Level) mà việc kết nối đến từng node sẽ khác nhau.

Cấp độ của tính nhất quán sẽ được set trên mỗi câu truy vấn đọc ghi. Do đó giúp nhà phát triển ứng dụng sẽ dễ dàng điều chỉnh Consistency Level cho phù hợp với yêu cầu của họ: muốn kết quả trả về nhanh hay muốn dữ liệu trả về chính xác.

  • Nếu Consistency Level được set là 1 thì khi đó coordinator chỉ cần kết nối trực tiếp đến 1 node -> kết quả trả về nhanh
  • Nếu Consistency Level đươc set là ALL thì khi đó coordinator phải kết nối đến toàn bộ node và thực hiện xử lý dữ liệu. -> dữ liệu trả về chính xác

Tính dư thừa

Các node trong cluster có vai trò như nhau, không có node nào làm node chính cả. Hơn nữa dữ liệu không chỉ được lưu trên 1 node mà nó được lưu trên toàn bộ các node, do đó độ chịu lỗi của nó là khá cao.

Cho dù có 1 node bị lỗi đi chăng nữa thì khi truy vấn kết quả, nó sẽ được điều hướng sang các node khác để lấy.

Trong trường hợp mà chúng ta phục hồi dữ liệu từ 1 node bị lỗi thì nó sẽ xử lý như thế nào?

Giả sử như trong khi đang phục hồi thì có dữ liệu mới đến, khi đó dựa vào cơ chế Hinted Handoff thì cái node nhận được dữ liệu mới này sẽ thực hiện việc lưu tạm thời dữ liệu lại. Và cái node bị lỗi sau khi phục hồi dữ liệu xong thì sẽ tiến hành update dữ liệu dựa vào cái thông tin đã lưu lúc trước.

Ngoài ra dựa vào cơ chế Read Repair, khi chúng ta query dữ liệu. Chẳng may cái dữ liệu nhận được nó cũ hơn dữ liệu đang có ở các node khác. Khi đó nó sẽ tự động tiến hành update dữ liệu.

Cấu trúc dữ liệu

Dữ liệu được lưu trữ trong DB của Cassandra thuộc dạng Key value store (KVS).

Có thể tạo được nhiều table trong database nhưng mà giữa các table sẽ không có mỗi quan hệ nào. Nhiều table được tổng hợp lại thành keyspace.

Thông thường database trong NoSQL thì không cần thiết phải tạo schema ngay lúc đầu. Thế nhưng Cassandra thì lại khác. Trước khi insert dữ liệu thì cần phải tạo keyspace và schema của table.

Có thể thực hiện được 1 số câu query như select, update, insert, delete, drop.

Tổng kết

Mình tổng hợp lại 1 số đặc tính của Cassandra như sau:

  • Là NoSQL
  • Dữ liệu được phân tán trên nhiều node khác nhau.
  • Node càng nhiều thì throughput của nó càng tăng.
  • Write throughput luôn luôn cao hơn read throughput.
  • Tính chịu lỗi khá cao, cho dù node bị chết đi chăng nữa thì khi truy vấn sẽ được chuyển hướng đến node khác.
  • Backup, restore dữ liệu 1 cách đơn giản.
  • Tốc độ truy vấn cao

Đọc đến đây chắc hẳn các bạn cũng biết Cassandra nó làm việc thế nào rồi phải không.

Bài sau mình sẽ đi đào sâu vào 1 số hệ thống lớn xem họ đang áp dụng nó thế nào.

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

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

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

Giới thiệu React Router

Giới thiệu React Router

Bài viết được sự cho phép của tác giả Lưu Bình An

Giới thiệu về React Router

Cách tiếp cận của React Router không khác mấy so với các thư viện Router trước đây

Ví dụ với 1 component Home

class Home extends React.Component{
  render(){
    return(
      <h1>Welcome Home</h1>;
    )
  }
}
ReactDOM.render( (<Home/>), document.getElementById('root'));

Sử dụng với React-Router

ReactDOM.render((
  <Router>
    <Route path="/" component={Home} /> 
  </Router>
), document.getElementById('root'));

Câu khai báo trên có thể diễn giải là với route “/” (tương đương với trang chủ), thì gọi render component Home

2 component <Router> và <Route> là những component React không render trong DOM, nếu path khớp với uri, nó render ra component chúng ta truyền vào cho nó (qua props component), chúng ta sẽ gặp lại khái niệm này thường xuyên: Một component bản thân không render trong DOM, mà render một component khác

Xem thêm tuyển dụng lập trình viên React lương cao

Nhiều Route

Xét ví dụ

ReactDOM.render((
  <Router>
    <Route path="/" component={Home}></Route>
    <Route path="/tags" component={TagsPage}></Route>
    <Route path="/post/:id" component={Post}></Route>
  </Router>
), document.getElementById('root'));
  • Với URL yourpage.com/ -> render component Home
  • Với URL yourpage.com/tags -> render component TagsPage
  • Với URL yourpage.com/post/12 -> render component Post

Tái sử dụng component với Nested Route

Khai báo nested Route

ReactDOM.render((
  <Router>
    <Route component={MainLayout}>
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));

Khi user truy cập đường dẫn /users, React Router sẽ render component <UserList /> bên trong component <SearchLayout/>, cả 2 component này lại đặt trong component <MainLayout/>

Nếu muốn trang chủ cũng render <MainLayout/> cùng với component <Home/>

ReactDOM.render((
  <Router>
    <Route component={MainLayout}>
      <Route path="/" component={Home} />
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
        <Route path="widgets" component={WidgetList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));
  3 bước tối ưu hiệu năng React App bằng các API mới của React
  3 tools giúp bạn tăng hiệu năng của React App một cách bất ngờ

IndexRoute

Thay vì viết như trên, có thể sử dụng component IndexRoute cũng cho cũng kết quả

ReactDOM.render((
  <Router>
    <Route path="/" component={MainLayout}>
      <IndexRoute component={Home} />
      <Route component={SearchLayout}>
        <Route path="users" component={UserList} />
        <Route path="widgets" component={WidgetList} />
      </Route> 
    </Route>
  </Router>
), document.getElementById('root'));

Một số cách khai báo với Route

Nếu có một khai báo cho trang User như bên dưới

<Route path="user/settings" component={UserSettings} />
<Route path="user/inventory" component={UserInventory} />
<Route path="user/orders" component={UserOrders} />

Viết lại cho gọn

<Route path="user">
  <Route path="settings" component={UserSettings} />
  <Route path="inventory" component={UserInventory} />
  <Route path="orders" component={UserOrders} />
</Route>

Cần bổ sung thêm component cho trang /user

<Route path="user">
  <IndexRoute component={UserProfile} />
  <Route path="settings" component={UserSettings} />
  <Route path="inventory" component={UserInventory} />
  <Route path="orders" component={UserOrders} />
</Route>

Khi đã định nghĩa với Route, nếu muốn dẫn đến một route nào đó, sử dụng component <Link to="" /> thay cho tag <a/>

<div className="app">
  <header className="primary-header"></header>
  <aside className="primary-aside">
    <ul>
      <li><Link to="/">Home</Link></li>
      <li><Link to="/user">Users</Link></li>
      <li><Link to="/user/settings">Settings</Link></li>
    </ul>
  </aside>
  <main>
    {this.props.children}
  </main>
</div>

Với <Link> nó biết khi nào đang active

<Link to="/users" activeClassName="active">Users</Link>

Browser History

<Router> muốn hoạt động được, phải khai báo với ReactRouter.browserHistory

var browserHistory = ReactRouter.browserHistory;

ReactDOM.render((
  <Router history={browserHistory}>
  </Router>
), document.getElementById('root'));

Những version trước đây của React Router, attribute history có giá trị mặc định là hashHistory giống như router của Backbone.js, các version sau này, attribute history sẽ không có giá trị mặc định và bắt buộc phải khai báo khi sử dụng

Nếu muốn redirect user đến một route nào đó

browserHistory.push('/some/path');

Route với parameter string

<Route path="users/:userId" component={UserProfile} />

Component UserProfile sẽ được render trong các trường hợp: users/1users/145users/abc, React Router sẽ truyền vào giá trị userId vào UserProfile như một props, access đến giá trị này bằng this.props.params.userId

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

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

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

Sử dụng Google Keep hiệu quả A-Z

Bài viết được sự cho phép của tác giả Trung Đức

Dễ nhất là viết về 1 cái mà ai cũng biết, và khó nhất cũng là viết về 1 cái mà ai cũng đang xài, vì nó không còn gì mới mẻ, không còn gì hay ho để người ta có thể khám phá.

Google Keep là một công cụ như thế các bạn ạ!

Mình dùng Google Keep đến nay đã sang năm thứ 5, mỗi tháng mình checked khoảng 500 checklists, toàn bộ công việc cá nhân, công ty, và gia đình thú thực mình đều quản lý trên Google Keep, vô cùng đơn giản, hiệu quả, và tiết kiệm thời gian.

Đầu tiên chúng ta vẫn cứ phải nhắc lại Google Keep là gì đã nhé…

  Ứng dụng mới cực hot từ Google: Android Sunflower
  10 Add-on Google Sheets phải có dành cho các Recruiters

1. Giới thiệu về Google Keep

Google Keep là dịch vụ ghi chú được phát triển bởi Google. Ra mắt vào ngày 20 tháng 3 năm 2013, Google Keep có sẵn trên web và có các ứng dụng di động cho hệ điều hành di động Android và iOS. Keep cung cấp nhiều công cụ để ghi chú, bao gồm văn bản, danh sách, hình ảnh và âm thanh.

_ Trích Wikipedia

571819-7-reasons-to-actually-start-using-google-keep.jpg (1280×720)

Google có giới thiệu về công cụ Google Keep của mình như thế này: [bg_collapse view=”button-blue” color=”#fff” expand_text=”Click để xem thêm thông tin” collapse_text=”Rút gọn lại” ]


Ghi lại nội dung quan trọng và làm được nhiều việc hơn.

Sắp xếp. Ghi lại cảm hứng và việc cần làm một cách dễ dàng. Cộng tác trên ghi chú với các thành viên trong nhóm và đặt nhắc nhở để luôn theo kịp tiến độ. Mọi thứ đều đồng bộ hóa trên các thiết bị của bạn nên nội dung quan trọng luôn trong tầm tay.

Cùng nhau làm được nhiều việc hơn.
Với Keep, bạn có thể dễ dàng cộng tác với đồng nghiệp trên các ghi chú, danh sách, ảnh, âm thanh và bản vẽ. Ghi lại các ý tưởng đột phá một cách nhanh chóng, giữ trong tầm tay khi bạn làm việc và xem những việc cần làm được đánh dấu hoàn thành trong thời gian thực.

Cập nhật ghi chú mọi lúc, mọi nơi.
Truy cập, tạo và chỉnh sửa ghi chú ở bất cứ đâu — từ máy tính, điện thoại hay máy tính bảng — ngay cả khi không có kết nối. Mọi chỉnh sửa bạn thực hiện sẽ được lưu và cập nhật tự động trên tất cả các thiết bị.

Tìm nhanh nội dung bạn cần.
Keep giúp bạn dễ dàng sắp xếp ghi chú và tìm thấy nội dung mình đang tìm kiếm nhanh hơn nữa. Lọc nhanh ghi chú theo màu, nhãn hoặc thuộc tính như danh sách có hình ảnh, ghi chú âm thanh có nhắc nhở hoặc ghi chú được chia sẻ. Hoặc ghim các ghi chú quan trọng vào đầu danh sách của bạn.

Không bao giờ bị lỡ thời hạn.
Nhắc nhở trong Keep giúp bạn hoàn tất công việc mọi lúc, mọi nơi bạn cần. Bạn có dự thảo thuyết trình phải hoàn thành lúc 3 giờ chiều? Hãy đặt nhắc nhở theo thời gian. Bạn cần mua đồ ăn nhanh cho chuyến dã ngoại của nhóm? Hãy thêm nhắc nhở theo vị trí để thông báo cho bạn khi bạn đi qua cửa hàng tạp phẩm.

Làm cho ý tưởng trở nên sống động.
Nhanh chóng ghi lại các ghi chú và ý tưởng trong Keep, sau đó dễ dàng tham chiếu để lấy cảm hứng khi bạn cộng tác với các thành viên nhóm trong Tài liệu. Chỉ cần truy cập giấy ghi chú Keep qua menu Công cụ của Tài liệu và bạn sẽ thấy tất cả ghi chú Keep trong một bảng điều khiển bên.

[/bg_collapse]


Vậy tại sao 1 phần mềm ghi chú lại hữu dụng, được nhiều người tin tưởng sử dụng đến vậy?

2. Ai có thể sử dụng Google Keep?

69CFF8C1-98C1-4D39-AFDD-FDBEAAE4B14C.png (2476×1552)

Bất cứ ai nếu có nhu cầu quản lý công việc và các ghi chú cá nhân hiệu quả hơn, ngoài ra:

  • Bạn muốn miễn phí
  • Bạn muốn đồng bộ giữa nhiều thiết bị để có thể ghi chú cũng như theo dõi ở bất cứ đâu
  • Muốn làm việc nhóm, lên ghi chú và mục tiêu với team của mình
  • Bạn có xu hướng và mong muốn quản lý và giao tiếp công việc theo mục tiêu (OKRs) để có thể linh hoạt và sáng tạo, thay vì bó hẹp theo đừng đầu mục chi tiết có trước.
  • Bạn muốn tối ưu thời gian và không bao giờ quên việc!!!

3. Tại sao lại là Google Keep?

Đương nhiên bạn sẽ hỏi câu hỏi này, vì có rất nhiều công cụ ghi chú khác như Evernote, OneNote, hay thậm chí Sticky Note trên Windows 10, Ghi chú trên IPhone… [bg_collapse view=”button-blue” color=”#fff” expand_text=”Click để xem so sánh Google Keep vs Evernote vs One Note” collapse_text=”Rút gọn nội dung” ]

OneNote Evernote Keep
Developer Microsoft Evernote Google
Delivery Web, Mobile, Desktop Web, Mobile, Desktop Web, Mobile
Windows Yes Yes Online Only
Mac OS X Yes Yes Online Only
Android Yes Yes Yes
iOS Yes Yes Online Only
Windows Phone Yes Yes Online Only
Blackberry Online Only Yes Online Only
# of Devices Per License Unlimited Unlimited Unlimited
Packages and Cost in USD Free Free or Premium Available ($5 to 10 USD/user/month) Education or Business version also available (varied) Free
Microsoft Office Document Compatibility Can Attach Can Attach Can’t Attach Files
Open Document Compatibility Can Attach Can Attach Can’t Attach Files
Portable Document Format (PDF) Can Attach Can Attach Can’t Attach Files
Autosave and Backup Excellent Excellent Excellent
Security, Document Password Protection, Encryption Excellent Excellent Excellent
Accessibility Excellent Poor (Your device may have some features) Good (Your device may have more)
Update Process Excellent Excellent Excellent
Support Good Good Good
Web Clipper App OneNote Web Clipper Evernote Web Clipper Chrome App or “Share via”
News App Several including Feedly and News 360 Several including Feedly and News 360 No
Email App Email to OneNote, CloudMagic and Powerbot CloudMagic and Powerbot Gmail
Printing / Scanning App Several including OfficeLens and NeatConnect Several including ScannerPro and CamScanner Google Drive Apps available
SmartPen App Livescribe and ModNotebooks Livescribe and ModNotebooks LiveScribe to Google Docs (not Keep)
Connection to Other Major Web Apps IFTTT and Zapier IFTTT and Zapier IFTTT and Zapier (though with fewer options)
Home Screen Display Widget Available Available Available
Annotation / Quick Sketch App Skitch Skitch and Penultimate Sketch for Keep
User Interface & Customization Excellent Excellent Excellent
Text & OCR Excellent (with Office Lens) Excellent Good
Handwriting Excellent Excellent Poor
Images Excellent Excellent Excellent
Audio Excellent Excellent Good
Task Lists and Alerts / Reminders Excellent Excellent Good
Notebooks, Tags, & Categories Excellent Excellent Good (hashtags available but not as many organization tools)
References Poor Poor Poor
Comments Poor Poor (Markup available though) Poor
Spelling & Grammar Check Excellent Excellent Excellent
Printing & Exporting Good (requires cloud printing) Good (requires cloud printing) Good (requires cloud printing)
Cloud Environment Microsoft OneDrive Evernote Cloud Google Drive
Asynchronous Collaborative Editing Excellent – available in free version Good – available in Shared Notes (Premium version) or Related Notes (Business version) Poor (share to Google+ but no collaborative editing)
Online to Offline Syncing & Editing Excellent Good in Free, Excellent in Premium Only in the Chrome app
Social Sharing With Zapier app Depends on device (Facebook, Google+, Twitter, LinkedIn) Google+
Templates Excellent (page templates) Excellent (download from Evernote site) Poor

Nguồn tham khảo: https://www.lifewire.com/comparison-evernote-microsoft-onenote-google-keep-2512005

[/bg_collapse]

Nhìn vào bảng trên chắc bạn sẽ thắc mắc: “ủa thế google keep hơn onenote hay evernote ở điểm nào?”, thì câu trả lời cho câu hỏi này có lẽ sẽ không bao giờ có thể thuyết phục được tất cả người dùng! Chúng ta chỉ là đang đi tìm câu trả lời cho câu hỏi: “Công cụ nào phù hợp với mình nhất?” mà thôi!

Xem thêm 1 bài so sánh khác: https://usefyi.com/google-keep-vs-evernote/

Bảng trên giúp bạn xem các tính năng hiện có của Google Keep, và xem xét trên nhu cầu của bản thân để xem có phù hợp không, không quan trọng nhiều hay ít tính năng, quan trọng có đủ dùng không!!!  Có 2 lợi thế không có trong bảng so sánh, đó là:

  • Google Keep nhẹ hơn 2 công cụ kia
  • Google Keep thuộc hệ sinh thái của Google nên nếu bạn quen sử dụng các công cụ của Google rồi thì thực sự rất rất tiện.

4. Sử dụng Google Keep như thế nào?

Như lúc đầu mình có viết, Google Keep thực sự rất dễ dùng, bạn chỉ cần truy cập: https://keep.google.com và đăng nhập tài khoản Google mà mình muốn sử dụng.

15-Ways-for-Students-to-Use-Google-Keep-5.png (850×2000)

Có một số tính năng quan trọng mà bạn cần phải lưu ý, vì nếu ứng dụng đủ sâu, Google Keep sẽ mang lại những hiệu quả cực lớn cho cách bạn quản lý và sắp xếp công việc:

  1. Ghim ghi chú: Hiểu đơn giản là bạn đánh dấu ghi chú nào là quan trọng, ưu tiên hiển thị lên đầu tiên.
  2. Tiêu đề ghi chú: Tên chủ đề của mỗi ghi chú / công việc để bạn có thể phân loại và làm việc tập trung hơn.
  3. Ghi chú: Bạn sẽ có 2 lựa chọn tạo Ghi chú mới hoặc Danh sách mới (Checklist), thường là những cái cần note nhanh hoặc lưu tạm.
  4. Danh sách mới: Hầu hết mọi người đều ưu tiên sử dụng tính năng này, tạo một danh sách các đầu việc cần đánh dấu hoàn thành, đây là một tính năng đơn giản nhưng cực hữu dụng.
  5. Lời nhắc: Nhắc bạn lưu ý hoặc hoàn thành các ghi chú/danh sách trong thời gian phù hợp, có thể chọn ngày giờ và địa điểm (liên kết đến Google Calendar)
  6. Cộng tác viên: Thêm người cùng theo dõi các ghi chú, cùng sửa đổi, cùng hoàn thành.
  7. Thay đổi màu: Nghe là hiểu rồi nhỉ 😀
  8. Thêm hình ảnh: Thêm hình ảnh vào Ghi chú để có thể tiện theo dõi, thảo luận, trao đổi, tương tác hơn.
  9. Lưu trữ: Khi một ghi chú hoàn thành, bạn có thể ấn Lưu trữ để tối ưu số lượng Ghi chú có trên Google Keep của bạn, nhiều sẽ loạn, sau này tìm vẫn ra!
  10. Thêm nhãn: Đánh dấu các ghi chú theo mức độ liên quan đến chủ đề, một dạng danh mục ghi chú, rất tiện nếu bạn muốn xem tập trung vào mục nhãn (danh mục) cụ thể
  11. Thêm bản vẽ: Thêm bản vẽ tay trên ghi chú để tương tác và thảo luận trên đó.
Keep.jpg (640×360)

Hướng dẫn sử dụng Google Keep hiệu quả

5. Case Study sử dụng Google Keep

Cách sử dụng

  • Áp dụng nguyên tắc đánh giá công việc, tạo các keep với mức độ quan trọng [PIN] và không quan trọng
  • Để phân loại hiệu quả: Tên Keep / màu săc / tag
  • Share cho người khác để cùng tương tác

TIPS

  • Liên tục note việc mới và checked việc đã hoàn thiện
  • Review mỗi sáng và mỗi tối trong ngày
  • Khi đã note việc lên: cần phải biết rõ lúc nào hoàn thành thì hợp lý, hoàn thành như
  • thế nào, và chất lượng hoàn thành ra sao.
  • Tạo 1 keep có title: “Việc trong ngày” – mọi việc trong ngày (only today) hãy note
  • vào đây và nghiêm túc với điều đó!!!
  • Sử dụng Google Header (hình ảnh đầu ghi chú) để tăng hiệu quả làm việc: https://meredithakers.com/2017/08/01/organizing-google-keep-with-headers/

Nguyên tắc chung

1. Hãy nhớ nguyên tắc đánh giá công việc:

Sử dụng Google Keep hiệu quả A-Z 5

Việc quan trọng là việc có ảnh hưởng trực tiếp tới công việc, đời sống cá nhân, gia đình, các mối quan hệ xã hội, và quyền lợi của bạn.

Việc gấp là việc cần phản hồi sớm trong tối đa 1 ngày, tùy vào yêu cầu phản hồi.

Ví dụ: 

  • Đi làm, có khách tiềm năng mới, luật của công ty là phải liên hệ không quá 3h đồng hồ kể từ khi khách liên hệ, đây là việc gấp.
  • 30p nữa bạn có lịch đi pitching 1 dự án lớn vài tỷ đồng – đây là việc quan trọng, tuy nhiên gia đình bạn lại đang xảy ra 1 sự cố và rất cần bạn có mặt – đây là việc gấp và quan trọng.
  • Có 1 email từ 1 ai đó gửi cho bạn để hẹn cafe – đây là việc không gấp và không quan trọng.

2. Hãy nhớ nguyên tắc ưu tiên công việc

Sử dụng Google Keep hiệu quả A-Z 6

Sức khỏe có thể không phải là tất cả, nhưng nếu thiếu sức khỏe thì tất cả không có ý nghĩa gì!

  1. Sức khỏe

(kaka phần này là quan điểm cá nhân thôi, anh chị em tùy biến thứ gì là quan trọng nhất với mình nhé, sức khỏe có thể cho xuống cuối cũng được :D)

CASE STUDY

1. Làm sau để follow tất tần tật việc trên Google Keep?

a. Hãy tạo Các nhãn theo chủ đề:

  • Việc cá nhân
  • Việc gia đình
  • Việc công ty (trong này có thể lại chia nhỏ ra nhiều nhanh nữa)

Sử dụng Google Keep hiệu quả A-Z 7

Ví dụ nhãn của mình…

b. Hãy lưu ý chỉ Ghim (PIN) những ghi chú quan trọng

c. Những công việc trong ngày, hãy tạo riêng 1 ghi chú là Việc trong ngày:

  • Mỗi đầu ngày hãy note tất cả việc cần làm vào đây
  • Mỗi cuối ngày hãy checked hết tất cả việc đã làm xong, chưa làm xong cần tính toán phân bổ về các ghi chú khác phù hợp hơn hoặc cam kết ngày hôm sau phải hoàn thành.

Sử dụng Google Keep hiệu quả A-Z 8

d. Tất cả các công việc không quan trọng, hãy cứ note ra nhưng đừng bao giờ ghim, cũng đừng bao giờ bỏ, vì đó là cơ hội.

2. Làm sao để quản lý một dự án trên Google Keep?

Đầu tiên chúng ta cần phải hiểu OKR là gì, bạn có thể xem thêm ở đây: https://hocvienagile.com/okr-la-gi/, nôm na là:

Tôi có một yêu cầu triển khai dự án với mục tiêu như thế này, anh tự bóc tách đầu việc, tự xác định thời gian, rồi anh hoặc người của anh tự làm. Luôn luôn nhớ rằng phải đảm bảo đúng deadline.

Nghe có vẻ quan liêu vl, nhưng thực sự OKR đã giúp các doanh nghiệp tiết kiệm vô cùng nhiều thời gian cũng như tăng khả năng sáng tạo lên max level. Tại sao vậy:

  • Vì OKR tập trung vào tính cam kết và những nỗ lực về thời gian cũng như hiệu suất
  • Vì OKR chỉ hiệu quả với người thực sự hiểu việc và biết phải bắt đầu từ đâu (thường chỉ work với ban lãnh đạo cấp cao của 1 doanh nghiệp ở VN)
  • VÌ OKR hướng đến một mục tiêu chung và tất cả cùng tự giác triển khai công việc của mình.

Vậy ứng dụng vào Google Keep như thế nào?

Khi bạn Start 1 dự án, hãy tạo 1 Keep (ghi chú) mới và invite (mời) tất cả người liên quan vào Keep đó.

  1. Tạo checklist các đầu việc và để tên người triển khai ở trước mỗi checklist, ví dụ: [DucNT] Hoàn thành Landing Page launching 1-11/2019
  2. Ai hoàn hoàn checklist nào thì check done vào đó.
  3. Mục tiêu cuối cùng là không còn checklist nào nữa -> ấn lưu trữ -> hoàn thành

3. Mua sắm hiệu quả hơn?

Chúng ta thường mua sắm vô tội vạ và trong nhất thời vì thích một món đồ theo cảm xúc mà chi tiêu không hợp lý. Google Keep giúp bạn được việc đó, hãy thử theo cách này:

  1. Tạo 1 Keep mới với tên Shopping Whistlist
  2. Hãy nhớ đừng bao giờ cho Keep này vào mục cần phải ghim
  3. Cứ khi nào bạn cần mua 1 món đồ gì hãy note nó ra + cả giá + link mua nhé -> note để đấy thôi
  4. Ít nhất 24h sau vào xem lại, nghĩ kỹ xem có thực sự cần mua không? -> Nếu cần hãy mua và check done, nếu không hãy cứ check done…
  5. Rồi để xem, sau 3 tháng bạn tiết kiệm được bao tiền 😀

Thực ra, còn cả trăm ngàn ví dụ nữa cơ, nhưng do mình ngại viết quá, không ngờ rằng bài viết này cũng ngốn hơn 2h đồng hồ của mình!!! Hy vọng nó đáng và hữu ích với anh chị em bạn bè!!!

Nếu các bạn cần viết thêm case study, hãy comment nhé, mình sẽ update trong thời gian sớm nhất. Chúc một ngày thật nhiều niềm vui ^^!

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

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

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

Thiết lập sự nghiệp mới tại Stratavo – Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Đón đầu xu hướng công nghệ, Stratavo là công ty start up đang ngày càng khẳng định vị thế của bản thân trên thị trường với các sản phẩm phần mềm và dịch vụ Công nghệ cao cấp, trở thành “điểm đến” lý tưởng cho các lập trình viên phát triển tiềm năng. Cùng với sự ra đời của trung tâm công nghệ tại Thành phố Hồ Chí Minh và Đà Nẵng, Stratavo hứa hẹn là nơi thắp lên ngọn lửa nhiệt huyết cho các tài năng công nghệ tỏa sáng sự nghiệp.

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Góp mặt vào đường đua công nghệ, Stratavo không ngừng tăng tốc giành lấy ngôi vị dẫn đầu

Stratavo là startup trẻ đến từ xứ sở “Sương mù” (Vương quốc Anh), chuyên cung cấp các dịch vụ tư vấn công nghệ mới với các phần mềm và dịch vụ Cloud chất lượng, hướng đến việc kiến tạo một cuộc sống dễ dàng và tiện nghi hơn.

Sở hữu đội ngũ nhân viên đến từ nhiều quốc gia trên thế giới, yếu tố cốt lõi giúp gắn kết con người tại Stratavo chính là mục tiêu tạo ra những sản phẩm và dịch vụ tuyệt vời. Đối với mỗi thành viên tại Stratavo, đam mê chính là bí quyết giúp làm việc hăng say, không ngừng học hỏi và sẵn sàng vươn mình tỏa sáng.

Xây dựng một nền văn hóa đề cao sự tôn trọng và quyền tự chủ của mỗi nhân viên, Stratavo mang đến cho các “phần tử” tài năng của mình cơ hội bứt phá tài năng, vững bước trên con đường xây dựng sự nghiệp rực rỡ của bản thân.

Giờ đây, với sự phát triển không ngừng, Stratavo mở rộng thị trường và đồng thời trao cơ hội cho các tài năng công nghệ, những người với cùng niềm đam mê và lòng nhiệt huyết phát triển sự nghiệp rực rỡ tại trung tâm nghiên cứu của Stratavo.

Stratavo đang rộng cửa chào đón nhân tài công nghệ cùng phát triển và “chạm đích” thành công

Thiết lập sự nghiệp mới tại Stratavo - Cơ hội và thách thức “gõ cửa” các tài năng công nghệ

Và nếu bạn đã sẵn sàng để trở thành một phần quan trọng của Stratavo, chớ nên bỏ qua những vị trí hấp dẫn mà “ngôi nhà” Stratavo đang tìm kiếm:

Bạn tự tin với kỹ năng sáng tạo và giải quyết vấn đề xuất sắc cùng với khả năng quản lý con người? Các vị trí sau đây sẽ là sự lựa chọn tuyệt vời cho bạn tại bứt phá năng lực và đạt đến những giới hạn mới:

Bạn mong muốn tạo ra các thiết kế UX/ UI có tầm ảnh hưởng và mang lại trải nghiệm tuyệt hảo cho người dùng? Đừng ngại phát triển tài năng của mình với vị trí Senior English Speaking UX/UI Designer tại Stratavo để cùng nhau tạo nên những sản phẩm đỉnh cao.

Bạn vững vàng với 5 năm kinh nghiệm áp dụng công nghệ để giải quyết bài toán kinh doanh của khách hàng? Hãy để tài năng của bạn được đồng hành với sự phát triển của công ty, vị trí Senior English Speaking Solution Architect vẫn rộng mở cơ hội cho bạn.

Bạn tìm kiếm cơ hội tỏa sáng tài năng với những kiến thức và kinh nghiệm về OpenStack? Stratavo có ngay vị trí OpenStack Developer với nhiều dự án hấp dẫn, hứa hẹn là bệ phóng cho tài năng của bạn vươn tầm cao mới.

Bạn mong muốn phát triển các sản phẩm web nổi bật và sáng tạo? Cơ hội phát triển sự nghiệp tại vị trí Senior English Speaking Web & Graphic Designer đang rộng mở chào đón sự góp mặt của bạn.

Bạn có khả năng phân tách số liệu với lối tư duy logic? Vị trí Senior English Speaking Business Analyst tại Stratavo hứa hẹn là nơi giúp sự nghiệp bạn thăng hoa. Tài năng của bạn chính là yếu tố quan trọng góp phần cho những sản phẩm chất lượng của công ty. 

Chỉ cần bạn dám chấp nhận cùng Stratavo đương đầu với những thách thức sắp tới, những điều bạn sẽ nhận được tại đây là vô cùng xứng đáng. 

  • Đến với Stratavo, bạn được thỏa sức thể hiện tài năng, bởi mỗi đóng góp của bạn chính là chiếc chìa khóa để Stratavo ngày càng phát triển. 
  • Trải nghiệm cuộc sống hiện đại với các công cụ, thiết bị mới nhất. Bạn sẽ sẽ luôn được cập nhật các xu hướng hiện đại, tiên tiến về công nghệ.
  • Cơ hội làm việc cùng những người đồng đội thân thiện, trẻ trung, làm việc hết mình, ăn chơi hết mức và không quên hỗ trợ nhau cùng phát triển tốt hơn. Đội ngũ công nghệ hàng đầu với đội ngũ nhân viên giàu kinh nghiệm để hỗ trợ ứng viên mới Vận hành văn hóa học hỏi và cải tiến liên tục để cho phép …

Bên cạnh đó, những đãi ngộ cực tốt tại Stratavo sẽ giúp kích hoạt động lực trong bạn:

  • Về tay mức lương xứng đáng với năng lực lên đến $4,000 + lương tháng 13 hấp dẫn;
  • Trải nghiệm văn phòng đầy tiện ích với khu vực thư giãn, cà phê và trà miễn phí cùng hồ bơi tuyệt đẹp;
  • Phát triển sự nghiệp với nhiều cơ hội làm việc với các đối tác nước ngoài;
  • Và nhiều phúc lợi, đặc quyền hấp dẫn chờ bạn tại gia đình “Stratavo”.

“Lên dây cót” cho sự nghiệp mới và chiến ngay chờ chi!

 Nộp CV ngay hôm nay!

Làm thế nào để thiết lập kế hoạch nhân sự chuyên nghiệp?

freelancer IT
freelancer IT

Tháng 11 – 12 được xem là thời gian “vàng” để thiết lập kế hoạch tuyển dụng nhân sự.freelancer it hay bất kỳ một vị trí chuyên về tuyen dung it nào cũng cần đảm bảo một quy trình khoa học. Vậy đâu là một kế hoạch nhân sự chuyên nghiệp? Cùng TopDev tìm hiểu bài viết sau đây!

Nắm rõ thị trường và nhu cầu nguồn nhân lực

freelancer it
Tìm hiểu về nhu cầu nguồn nhân lực rất quan trọng.

Thị trường tuyen dung it luôn biến động. Ví dụ như việc các freelancer it ngày càng nhiều tạo ra sức ép cạnh tranh lớn. Freelancer it không chỉ cạnh tranh với các đối thủ thuộc cùng lĩnh vực freelancer it. Họ còn có những đối thủ là những ứng viên it với nhiều chuyên môn khác nhau. 

Ngoài ra, nhu cầu nguồn nhân lực lại rất quan trọng. Tăng – giảm, những biến động đều thể hiện nguồn nhân lực thay đổi ra sao. Vì thế, phòng kế hoạch nhân sự cần lập các kế hoạch tuyển dụng nhân sự.

Rà soát và tổng hợp nguồn dữ liệu liên quan: khối lượng công việc, mô tả công việc, chế độ lương thưởng,… Phân tích rõ về môi trường làm việc, các yêu cầu  – chính sách liên quan đến hợp đồng lao động, phúc lợi,… Tổng hợp nhu cầu tuyển dụng nhân sự từ các trưởng bộ phận/ phòng ban.

Để thiết lập một kế hoạch tuyển dụng nhân sự hoàn hảo, định hướng phát triển thật sự quan trọng. Do vậy, nên đặt nhu cầu nguồn nhân lực gắn liền với định hướng hoạt động. Từ cơ sở đó, xác định rõ các số lượng chi tiết về nhu cầu: số lượng nhân sự mới cần tuyển, chất lượng chuyên môn và các kỹ năng cần có; thời gian phù hợp để tuyen dung it.

Đánh giá “trình” tuyển dụng tại doanh nghiệp

Đây được xem là bước quan trọng của quy trình thiết lập kế hoạch nhân sự hiệu quả. 

freelancer IT
Liệu bạn có đánh giá chính xác Level tuyển dụng tại doanh nghiệp?

Ban nhân sự cần đánh giá lại tình hình chung cùa doanh nghiệp: Hệ thống nhân sự, cơ cấu doanh nghiệp gồm những ai? Liệu những nhân sự đều thật sự phù hợp với vị trí đó? Họ có sự thay đổi gì về sự thể hiện của bản thân?

Xem thêm các việc làm NTQ Solution tuyển dụng

Giải đáp những thắc mắc đó giúp bộ phận nhìn lại tổng quan đến chi tiết mỗi nhân viên trong tổ chức. Đồng thời, đó cũng là cách thức phù hợp giúp thiết lập một hệ thống tổ chức hoàn chỉnh hơn. Một điều lưu tâm là nhân sự nên xem xét vấn đề này trong cùng một khía cạnh về chế độ đãi ngộ, chính sách quản lý,..

Thách thức đặt ra – Bài toán tăng hay giảm nhân sự?

Từ những phân tích trên, các nguồn cứ liệu quan trọng đã được tập hợp. Bộ phận nhân sự bắt đầu xác định liệu nhân lực. Từ cơ sở đó, thực trạng thiếu hay thừa dựa trên hiệu suất của công việc.

freelancer IT
Vấn đề tăng hay gia giảm nhân sự là câu chuyện riêng của từng doanh nghiệp.

Các phán đoán, đề xuất và việc quyết định chính thức bổ sung hay cắt giảm đều dựa trên nguồn dự liệu thu thập. Ví dụ như tuyển dụng Data Scientist hay freelancer it.

Nhân sự cần đặt ta các cơ sở liệu có nên tuyển thêm họ không nếu có sự bất ổn định trong việc thực hiện các nhiệm vụ.

Triển khai kế hoạch thực hiện chiến lược

Một chiến lược phát triển kế hoạch tuyen dung it sẽ gồm các trình tự như sau:

– Đưa ra bản kế hoạch chi tiết tuyển dụng nhân viên:

+ Về số lượng, vị trí và các yêu cầu

+ Mô tả từng nhiệm vụ

+ Mức lương phù hợp, thời gian và hình thức tuyen dung it

+ Dự trù kinh phí

Ví dụ: một dự án đó cần bao nhiêu freelancer it, Senior Developer,…

– Phương án tái cơ cấu nhân sự: Phân bổ, sắp xếp lại nhân sự thuộc các phòng ban phù hợp với năng lực, kinh nghiệm, trách nhiệm.

– Kế hoạch, chỉ tiêu thăng tiến phù hợp với năng lực

– Vấn đề cắt giảm nhân sự: Đưa ra những cơ sở rõ ràng, có cơ sở pháp lý, tránh tranh chấp nảy sinh.

Đây là một kế hoạch dài hạn. Do vậy, nó cần đảm bảo tính khả thi. Bộ phận nhân sự cần thảo luận để đưa ra những đánh giá bổ sung. Mặt khác, nên có những back-up phù hợp để tối ưu hóa hiệu quả thực hiện dự án. Điều này có ý nghĩa rất quan trọng. Vì tổ chức cần theo dõi và tìm ra các rủi ro tiềm ẩn có thể xảy ra. Đồng thời, lên kế hoạch thiết lập các giải pháp hoàn thiện nhất trong các trường hợp thực tế không lý tưởng.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

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

Xem thêm việc làm Developers hàng đầu tại TopDev

Tại sao bạn lại muốn trở thành Product Manager?

product manager là gì
Tại sao bạn lại muốn trở thành Product Manager?

Tác giả: Dr. Nancy Li

Mục đích của nhà tuyển dụng khi đặt câu hỏi này với Product Manager là gì?

Lý do nhà tuyển dụng muốn hỏi bạn câu hỏi này là để tìm hiểu xem tại sao bạn muốn làm việc ở vị trí này, bạn sẽ làm gì để sử dụng những kinh nghiệm trước đây vào công việc Product Manager hiện tại. Nội dung bài viết này sẽ chia sẻ với bạn cách để trả lời câu hỏi “Lý do bạn muốn trở thành Product Manager là gì?” với những ứng viên chưa từng có kinh nghiệm.

Product Manager
Công việc của PM có sự kết hợp giữa business và tech

Cách trả lời giúp ứng viên ghi điểm với nhà tuyển dụng

Biết cách kết hợp giữa business và tech trong câu trả lời

Đầu tiên là bạn cần làm rõ vai trò quản lý sản phẩm chính là sự kết hợp giữa yếu tố kinh doanh và công nghệ. Vì một Product Manager cần làm việc với các kỹ sư phần mềm để build MVP và phát hành sản phẩm. Bên cạnh đó, bạn cũng cần phải trao đổi thường xuyên với bộ phận sales và marketing để lên ý tưởng cho chiến lược thị trường và lộ trình phát triển của tất cả các sản phẩm.

Chẳng hạn bạn có thể chia sẻ rằng “Cá nhân tôi đã có kinh nghiệm 5 năm làm việc ở vai trò là dev và cũng là một leader nên tôi đã có quen khi làm việc với những team khác như dev, marketing để tìm kiếm những kế hoạch tốt nhất cho lần phát hành sản phẩm sắp tới. Vậy nên tôi tin rằng mình chính là ứng viên phù hợp nhất nhờ khả năng teamwork với các bên liên quan khá tốt”.

  Bí kíp để trở thành một Product Manager giỏi
  Con đường trở thành Product Manager từ lập trình viên tại Amazon

Bạn thấy gì trong câu trả lời vừa rồi của tôi? Tôi vừa trình bày được Product Manager là gì, vừa giới thiệu được những kinh nghiệm mình có. Đó là cách PR bản thân tốt nhất để nhà tuyển dụng nhìn thấy tiềm năng trong bạn.

product manager tuyển dụng
Team work và nắm bắt nhanh suy nghĩ người khác giúp công việc PM trôi chảy hơn

Nêu được bản chất công việc của Product Manager là gì

Lấy ví dụ, Product Manager là một CEO của sản phẩm. Điều này đồng nghĩa với việc họ phải dẫn dắt và làm việc với các bên liên quan đa chức năng để phát hành sản phẩm ra thị trường.

Xem thêm Phỏng vấn Product Manager: Giới thiệu về bản thân sao cho ấn tượng?

“Vì tôi đã từng là một leader trong công việc trước đây nên tôi rất hứng thú với việc phát triển ý tưởng và làm việc với các bên để thực hiện nó. Bản thân tôi là một người có tư duy kinh doanh, vai trò quản lý sản phẩm có thể cho tôi cơ hội lên kế hoạch tăng doanh thu cho công ty. Cùng lúc đó, tôi cũng có thể quản lý nhiều công việc ở các bên khác. Do đó tôi nghĩ rằng cơ hội làm việc với vai trò là một Product Manager khiến tôi rất hứng thú.”

Thấu hiểu khách hàng

Khi lựa chọn chương trình Product Manager tuyển dụng của bất cứ công ty nào, bạn sẽ phải tiếp xúc thường xuyên với khách hàng và là người làm việc trực tiếp với họ cho một dự án.

“Tôi có khả năng nắm bắt được suy nghĩ của người khác. Tôi hiểu được khách hàng muốn gì và họ thật sự thích gì, nhờ vậy mà tôi biết cách để giải quyết vấn đề cho họ. Trở thành một Product Manager có thể cho tôi cơ hội gần hơn với khách hàng và phát hành một sản phẩm mà họ thật sự thích”.

Xem thêm các việc làm product manager lương cao cho bạn

product manager
PM cần nắm bắt tâm lí khách hàng

Rõ ràng với cách trả lời rõ ràng như thế này, bạn sẽ vừa thể hiện được hiểu biết của mình về trách nhiệm của một Product Manager là gì, lại vừa cho thấy nhiệt huyết và đam mê trong mong muốn được trở thành một Product Manager của bạn.

Kết luận

Quan trọng nhất là khi trả lời những câu hỏi như thế này, bạn nên thể hiện nhiều nhất những hiểu biết của mình về vị trí Product Manager và khẳng định được bản thân mình là ai, có thể đáp ứng được những gì mà vị trí này cần. Trên đây là một số chia sẻ về cách để trả lời phỏng vấn tạo ấn tượng nhất. Dù không quyết định tất cả nhưng nếu làm tốt ở vòng này sẽ mở ra cho bạn nhiều cơ hội để được nhận vào làm việc ở những công ty tốt, như các chương trình của KMS Technology tuyển dụng.

Bài viết được transcript từ video gốc

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

Xem thêm việc làm tuyển dụng IT hấp dẫn tại TopDev

Kiểm thử một đối tượng Textbox

Kiểm thử một đối tượng Textbox

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

Đối tượng textbox là một trong những đối tượng UI mà kỹ sư kiểm thử phần mềm hay tương tác nhất. Đối tượng này khá quan trọng vì nó cho phép người dùng nhập liệu dữ liệu xuống hệ thống, nên khả năng làm cho hệ thống không hoạt động như mong muốn ban đầu.

  4 lý do để VS Code là Text Editor ưa thích của mọi lập trình viên
  10 theme Sublime Text tốt nhất

Xác định loại hình của đối tượng textbox

Để có thể lên kế hoạch kiểm thử và viết kịch bản kiểm thử, trước hết, chúng ta cần xác định đối tượng textbox của chúng ta ở dạng như thế nào. Textbox không chỉ là một đối tượng UI đề người dùng nhập liệu đơn thuần, mà nó còn bao gồm cả định dạng cho dữ liệu được đưa vào phụ thuộc vào mục đích của đối tượng UI đó. Về cơ bản, chúng ta có một số loại textbox với định dạng như sau:

  • Dành cho tên – Chỉ được nhập ký tự alphabel
  • Dành cho số – Chỉ được nhập số
  • Dành cho địa chỉ – Được nhập cả số, ký tự alphabel và ký tự đặc biệt
  • Dành cho địa chỉ thư điện tử – Phải theo định dạng của thư điện tử
  • Dành cho mật khẩu – Không hiển thị giá trị nhập liệu
  • Textbox bất kỳ – Không giới hạn định dạng nhập liệu
  • Và cuối cùng, chúng ta không thể không để ý đến việc “bắt buộc phải có” (mandatory field) của đối tượng textbox.

Ý tưởng cho việc kiểm thử textbox

Sau khi chúng ta xác định được kiểu và định dạng của textbox, chúng ta có thể lên kế hoạch kiểm thử cho đối tượng này:

Đầu tiên, chúng ta phải tạo ra các dữ liệu kiểm thử – chấp nhận và không chấp nhận – cho textbox với câu hỏi “ký tự nào có thể nhập vào textbox này?

  • Về số, số tự nhiên, số nguyên hay số thập phân. Có thể nhập số logarit hay không. Có định dạng cho số nhập liệu hay không. Ví dụ như, nhập giá trị trên 1000 thì sẽ có dấu phẩy phần ngàn. Hoặc, có giới hạn (lớn nhất và nhỏ nhất) cho giá trị nhập liệu hay không.
  • Về ký tự, chúng ta cần xem xét đến độ dài của chuỗi được nhập liệu, có cho phép ký tự hoa, thường hay đặc biệt. Xa hơn, chúng ta cũng cần xem xét đến các chuỗi giá trị mã lập trình web hoặc java (trường hợp kiểm thử web) hoặc các giá trị SQL.

Sau khi xác định được dữ liệu kiểm thử, chúng ta có thể tiến hành kiểm thử với các cách nhập liệu khác nhau.

  • Gõ bàn phím: Cách này thì như bình thường rồi hen.
  • Sao chép và dán. Phương pháp này nên được kiểm thử hai chiều, đặc biệt là với textbox dành cho mật khẩu.
  • DragnDrop. Một số textbox hiện nay cho phép chúng ta dùng chuột để di chuyển một khối văn bản từ bên ngoài lên trên nó.

Bên cạnh đó, chúng ta cũng có thể kiểm thử vài trường hợp đặc biệt khác:

  • Dấu con trỏ được hiển thị trên textbox hay không
  • Dữ liệu sau khi nhập vào có được canh lề hay không
  • Textbox có chấp nhận giá trị rỗng hay không – Đặc biệt cho đối tượng được xác định là cần thiết – mandatory
  • Textbox có chấp nhận khoảng trống ở đầu và cuối của dữ liệu nhập vào hay không.

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

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

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

Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?

Loại bỏ các phần tử trùng trong một ArrayList như thế nào?

Bài viết được sự cho phép của tác giả Giang Phan

Trong bài viết Loại bỏ các phần tử trùng trong một ArrayList , tôi đã giới thiệu với các bạn các cách để loại bỏ phần tử trùng trong một ArrayList với Java <= 7. Trong bài này, tôi sẽ giới thiệu với các bạn một số cách khác với sự hỗ trợ của các tính năng mới trong Java 8.

Sử dụng phương thức distinct() trong Stream API

Phương thức distinct() trả về một Stream gồm các phần tử duy nhất, việc xác định các phần tử trùng lặp được so sánh theo theo phương thức Object.equals(Object).

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Đối với ordered Stream, thứ tự sắp xếp các phần tử là ổn định (stable) : đối với các phần tử trùng lặp, phần tử xuất hiện đầu tiên trong vùng gặp phải được giữ nguyên.

Đối với các unordered Stream, không đảm bảo tính ổn định (unstable) thứ tự các phần tử.

Ví dụ:

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class RemoveDuplicateInArrayList1 {

    public static void main(String[] args) {
        List listWithDuplicateElements = new ArrayList();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");

        List listWithoutDuplicateElements = listWithDuplicateElements
                .stream()
                .distinct()
                .collect(Collectors.toList());
        System.out.println(listWithoutDuplicateElements); // [JAVA, J2EE, JSP, SERVLETS, STRUTS]
    }
}

Sử dụng phương thức removeIf()

Phương thức removeIf() : chấp nhận đối số là 1 Predicate, nó loại bỏ tất cả các phần tử của Collection thỏa mãn điều kiện đã cho.

Ý tưởng cách này là lợi dụng tính năng không chứa phần tử trùng của HashSetLinkedHashSet để kiểm tra tồn tại và loại bỏ phần nó.

Ví dụ:

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class RemoveDuplicateInArrayList2 {

    public static void main(String[] args) {
        List listWithDuplicateElements = new ArrayList();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");

        Set elementsAlreadySeen = new LinkedHashSet<>();
        listWithDuplicateElements.removeIf(s -> !elementsAlreadySeen.add(s));
        System.out.println(elementsAlreadySeen); // [JAVA, J2EE, JSP, SERVLETS, STRUTS]
    }
}

Sử dụng phương thức collect() với Collectors.toCollection

Phương thức collect() chấp nhận đối số là một Collector. Trong Java 8, chúng ta có thể sử dụng phương thức Collectors.toCollection() để tạo ra Collector. Phương thức này, chấp nhận đối số là Supplier. Ý tưởng cách này cũng là lợi dụng tính năng không chứa phần tử trùng của HashSetLinkedHashSet / TreeSet.

Ví dụ bên dưới dùng để loại bỏ các sinh viên có cùng email với TreeSet.

package com.gpcoder.remove_duplicate;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

class Student {
    private String name;
    private String email;

    public Student(String name, String email) {
        super();
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", email=" + email + "]";
    }
}

public class RemoveDuplicateInArrayList3 {

    public static void main(String[] args) {
        List studentsWithtDuplicate = new ArrayList<>();
        studentsWithtDuplicate.add(new Student("Nguyen Nhat", "nguyennhat@gmail.com"));
        studentsWithtDuplicate.add(new Student("Le Van", "levan@gmail.com"));
        studentsWithtDuplicate.add(new Student("Tran Khoa", "trankhoa@gmail.com"));
        studentsWithtDuplicate.add(new Student("Le Vo", "levan@gmail.com"));
        studentsWithtDuplicate.add(new Student("Ly Nguyen", "lynguyen@gmail.com"));

        Set studentsWithoutDuplicate = studentsWithtDuplicate.stream()
                .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getEmail))));
        studentsWithoutDuplicate.forEach(s -> System.out.println(s));
    }
}

Output của chương trình:

Student [name=Le Van, email=levan@gmail.com]
Student [name=Ly Nguyen, email=lynguyen@gmail.com]
Student [name=Nguyen Nhat, email=nguyennhat@gmail.com]
Student [name=Tran Khoa, email=trankhoa@gmail.com]

Trong thực tế, người ta thường sử dụng phương thức distinct() để loại phần tử trùng. Sử dụng removeIf() hay collect() không tốt về performance so với distinct() và nó trả về một Set thay vì List như mong muốn, cần phải chuyển Set sang List. Tuy nhiên trong một số trường hợp chúng ta cũng có thể sử dụng cách này, nên tôi cũng giới thiệu với các bạn để thêm lựa chọn khi sử dụng.

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

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

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

Làm việc với cơ sở dữ liệu trong Laravel

Làm việc với cơ sở dữ liệu trong Laravel

Bài viết được sự cho phép của tác giả Kien Dang Chung

Trong rất nhiều các bài viết trước, chúng ta phải thực hiện việc cập nhật dữ liệu vào cơ sở dữ liệu một cách giả tưởng. Chờ đợi và giờ là lúc chúng ta cùng tìm hiểu làm việc với CSDL trong Laravel.

Nếu như bạn đã từng lập trình PHP hoặc các ngôn ngữ khác, kết nối đến CSDL là một trong những việc quan trọng, phần lớn các project đều phải có CSDL chứa dữ liệu cho dự án. Làm việc với CSDL trong Laravel hết sức đơn giản, Laravel hiện đang hỗ trợ 4 loại CSDL phổ biến hiện nay: MySQL (Oracle) đã chuyển lên MariaDB, Postgres, SQLite, SQL Server (Microsoft). Laravel hiện chưa hỗ trợ kết nối đến CSDL Oracle, tuy nhiên có rất nhiều các gói thư viện hỗ trợ kết nối đến Oracle trên Github, tôi sẽ có một bài riêng về Làm việc với CSDL Oracle trên Laravel.

Truy vấn đến CSDL trong Laravel có 3 phương thức là truy vấn SQL thuần túy, sử dụng Query Builder và sử dụng Laravel Model (Eloquent ORM). Trong bài viết này chúng ta sẽ tập trung vào cấu hình kết nối Laravel đến CSDL và sử dụng truy vấn SQL thuần túy để truy xuất dữ liệu.

Tìm việc làm Laravel lương cao đến 2000 USD

Thiết lập cấu hình kết nối cơ sở dữ liệu trên Laravel

Trong bài viết Thiết lập cấu hình Laravel chúng ta cũng đã nói sơ qua về cấu hình kết nối CSDL, tất cả các thiết lập kết nối CSDL được đưa vào trong file config/database.php và kết hợp cùng với các biến môi trường được thiết lập trong file .env ở thư mục gốc của project. Ví dụ về một thiết lập trong .env và config/database.php:

DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE='adshare'
DB_USERNAME='admin'
DB_PASSWORD=secret
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
  ...

        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'adshare'),
            'username'  => env('DB_USERNAME', 'admin'),
            'password'  => env('DB_PASSWORD', '12345678'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
  ...
],

Laravel hỗ trợ các kiến trúc đa máy chủ CSDL, ví dụ trong hệ thống máy chủ đã định sẵn một máy chủ CSDL chuyên cho các tác vụ đọc dữ liệu và một máy chủ CSDL khác chuyên cho tác vụ ghi dữ liệu, chúng ta có thể thiết lập cấu hình như sau:

'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
  ...

        'mysql' => [
            'read' => [
                'host' => '192.168.1.1',
            ],
            'write' => [
                'host' => '196.168.1.2'
            ],
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'adshare'),
            'username'  => env('DB_USERNAME', 'admin'),
            'password'  => env('DB_PASSWORD', '12345678'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
  ...
],

Các tác vụ đọc dữ liệu sẽ được chuyển đến máy chủ 192.168.1.1 và ghi dữ liệu được chuyển đến 192.168.1.2. Ngoài ra Laravel còn cho phép kết nối đến nhiều CSDL đồng thời, sử dụng phương thức connection() với tham số truyền vào là tên connection được khai báo trong config/database.php.

$users = DB::connection('foo')->select(...);

Raw SQL query trong Laravel

Facade DB cung cấp các phương thức để thực hiện truy xuất dữ liệu như sau: select(), insert(), update(), delete() và statement(). Chúng ta sẽ tìm hiểu lần lượt từng phương thức này.

Phương thức select()

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Danh sách người dùng trong hệ thống
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::select('select * from users where active = ?', [1]);

        return view('user.index', ['users' => $users]);
    }
}

Tham số thứ nhất của select() là một câu truy vấn SQL thuần túy, tham số thứ hai là các giá trị cần đưa vào câu truy vấn. Phương thức này sẽ trả về một mảng, mỗi kết quả trong mảng là một đối tượng StdClass trong PHP, để truy xuất vào các giá của kết quả sử dụng cú pháp như ví dụ dưới:

<table>
    <tr>
        <th>User ID</th>
        <th>User name</th>
    </tr>
@foreach($users as $user)
    <tr>
        <th>{{ $user-> id }}</th>
        <th>{{ $user->name }}</th>
    </tr>
@endforeach
<table>

Với id, name là các trường trong bảng users trong CSDL. Để truyền giá trị vào trong một câu truy vấn sử dụng ?, ví dụ:

$results = DB::select('select * from users where email = :email', ['email' => 'myemail@gmail.com']);

Phương thức insert()

Thực hiện đưa một bản ghi vào một bảng trong CSDL

DB::insert('insert into users (id, name) values (?, ?)', [13, 'FirebirD']);

Phương thức update()

Sử dụng để cập nhật dữ liệu vào một bản ghi có sẵn trong CSDL.

$updated = DB::update('update users set name = 'Đặng Kiên' where id = ?', [13]);

Phương thức delete()

Xóa các bản ghi khỏi CSDL

$deleted = DB::delete('delete from users where active = 0');

Phương thức statement()

Sử dụng để chạy bất kỳ một câu lệnh SQL nào.

DB::statement('drop table users');

Ví dụ sử dụng raw SQL query trong Laravel

Chắc bạn đang chờ đợi đến phần ví dụ, chúng ta quay lại với ví dụ đăng ký thành viên trong bài Laravel Form validate kiểm soát thông tin nhập liệu. Trong ví dụ này, chúng ta chưa làm gì ở phần lưu thông tin người dùng vào CSDL. (Bạn nào mới nên đọc lại Laravel Form validate kiểm soát thông tin nhập liệu để xem ví dụ đang làm đến đâu) Đầu tiên chúng ta thực hiện tạo một database tên laravel-test và tạo một bảng users như sau:

Làm việc với cơ sở dữ liệu trong Laravel

 Tạo bảng users

Làm việc với cơ sở dữ liệu trong Laravel

Ok, tiếp theo cấu hình kết nối đến database. Mở file config/database.php và thiết lập:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'laravel-test',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],

Vì cài đặt trên máy dev, tôi vẫn để user root có mật khẩu mặc định là rỗng, để cấu hình cho nhanh đưa hết cấu hình vào config/database.php mà không qua file .env. Tiếp theo, chúng ta cập nhật phương thức storeUser() trong UserController (xem file app\Http\Controllers\UserController.php).

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Validator;
use DB;

class UserController extends Controller
{
    //
    public function showRegisterForm(){
      return view('fontend.register');
    }

    public function storeUser(Request $request){
      //dd($request->all());

      $messages = [
        'required' => 'Trường :attribute bắt buộc nhập.',
        'email'    => 'Trường :attribute phải có định dạng email'
    ];
    $validator = Validator::make($request->all(), [
            'name'     => 'required|max:255',
            'email'    => 'required|email',
            'password' => 'required|numeric|min:6|confirmed',
            'website'  => 'sometimes|required|url'

        ], $messages);

        if ($validator->fails()) {
            return redirect('register')
                    ->withErrors($validator)
                    ->withInput();
        } else {
          // Lưu thông tin vào database, phần này sẽ giới thiệu ở bài về database
          $name = $request->input('name');
          $email = $request->input('email');
          $password = $request->input('password');
          $website = $request->input('website');

          DB::insert('insert into users (name, email, password, website) values (?, ?, ?, ?)', [$name, $email, $password, $website]);
          return redirect('register')
              ->with('message', 'Đăng ký thành công.');
        }
    }

}

Truy cập http://laravel.dev/register và nhập thông tin đăng ký

Làm việc với cơ sở dữ liệu trong Laravel

Click đăng ký sau đó mở bảng users chúng ta thấy dữ liệu đã được cập nhật vào CSDL.

Làm việc với cơ sở dữ liệu trong Laravel

  Các Laravel route tips giúp bạn cải thiện routing
  Cách sử dụng Laravel với Socket.IO

Quản lý transaction trong CSDL

Giao dịch (transaction) là một nhóm các hành động có thứ tự trên CSDL nhưng lại được người dùng xem như là một đơn vị thao tác duy nhất. Ví dụ: một giao dịch thanh toán trực tuyến cho một món hàng trên mạng sẽ bao gồm nhiều hành động trên CSDL:

  • Trừ tiền từ tài khoản người dùng.
  • Cộng tiền vào tài khoản nhà cung cấp.
  • Giảm số lượng hàng trong kho.

Khi đó, bất kỳ một hành động nào bị lỗi sẽ dẫn đến giao dịch lỗi. Trong thực tế khi lập trình, người ta thường nhóm các nhiều các hành động trên CSDL vào thành một nhóm và thực hiện chúng như một giao dịch, nếu một hành động lỗi, hệ thống sẽ thực hiện các lệnh sao cho quay về trạng thái ban đầu (rollback). Laravel cũng hỗ trợ quản lý transaction, thực hiện chúng khá đơn giản với cú pháp:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
}, 5);

Chú ý tham số thứ 2 của phương thức transaction() là số lần thử thực hiện lại khi gặp tình trạng deadlock. Ngoài ra bạn có thể thao tác quản lý transaction một cách thủ công như khi nào mới rollback hoặc khi nào mới commit một cách tùy ý:

DB::beginTransaction();
// Bắt đầu các hành động trên CSDL

...
//Gặp lỗi nào đó mới rollback
DB::rollBack();
...

//Commit dữ liệu khi hoàn thành kiểm tra
DB::commit();

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

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

Xem thêm Việc làm it hồ chí minh hấp dẫn trên TopDev

Tổng hợp một số mẫu CV đẹp mắt dành cho lập trình viên

tuyen dung it da nang
tuyen dung it da nang

CV được xem là vũ khí bí mật để giúp bạn ghi điểm với các nhà tuyển chọn. Vậy thế nào là một CV IT chuẩn? Cùng TopDev điểm qua một số mẫu CV đẹp chất nhờ vào sự đẹp mắt và tính chuyên nghiệp. Đây sẽ là những CV đẹp giúp các bạn nổi bật hơn trong mắt các nhân sự của các công ty tuyển dụng.

Mẫu CV tuyển dụng được thiết kế phong cách

Nếu bạn là một tín đồ của sự sáng tạo thì mẫu CV này thật sự dành cho bạn. Với những mẫu thiết kế đậm tính thời trang, bạn hoàn toàn dễ dàng chiếm cảm tình từ nhà tuyển dụng.

mẫu CV

Với đặc trưng về màu sắc, đường nét và hiệu ứng khác nhau, đây là mẫu CV phù hợp với những con người về nghệ thuật như nhà thiết kế, nhiếp ảnh gia, nhà sáng tạo nội dung,…

mẫu CV

Bố cục được sắp xếp một cách khá khoa học với sự sắp xếp không gian, thứ tự về kiểu chữ, từ ngữ, nội dung thông tin. Bạn có thể dễ dàng chỉnh sửa hoặc thêm những nội dung bất kỳ.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Mẫu CV/Resume A4 hiện đại được thiết kế gọn gàng và tỉ mỉ

Đây được xem là mẫu CV được sử dụng ưa chuộng vì tính chuyên nghiệp của nó. 

Mẫu CV tuyển dụng
M3 – mẫu CV đẹp

Nhiều doanh nghiệp không quá để tâm đến việc một CV quá được trang trí về hình thức mà chỉ cần đảm bảo CV chuẩn format, đủ nội dung. Dù cho bạn ứng tuyển bất kỳ vị trí nào trong các tổ chức với mô hình hoạt động ra sao thì mẫu CV này vẫn đáp ứng ứng được nhu cầu và tiêu chuẩn chung.

Mẫu CV tuyển dụng
M4 – mẫu CV IT đẹp

Mẫu CV tuyển dụng thiết kế kết hợp

Nếu tạo ra sự phá cách và nổi bật, bạn có thể sử dụng kiểu CV này.  Đây là mẫu CV có thiết kế chữ cái bìa giúp bạn để một ấn tượng khó quên đối với các nhà tuyển dụng các lập trình.

Mẫu CV tuyển dụng
M5 – tuyen dung it da nang

Việc lựa chọn mẫu CV còn phụ thuộc vào yêu cầu từng trị vị khác nhau như tuyển dụng Data Scientist, freelancer it; sở thích và mục đích cá nhân của từng ứng viên. TopDev giới thiệu đến bạn giải pháp hỗ trợ bạn thiết kế CV hiệu quả, đơn giản và nhanh chóng mang tên TopCV – Online. Nền tảng đang từng bước hoàn thiện và phát triển nhiều hơn.

TopDev hy vọng, các bạn sẽ có những thông tin bổ ích. Từ đó, chuẩn bị cho mình một CV thật chuyên nghiệp. Hy vọng các bạn sẽ chinh phục thành công nhà tuyển dụng it da nang.

Tải ngay những mẫu CV đẹp dành cho lập trình viên tại đây

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

Xem thêm tuyển dụng ngành IT hàng đầu tại TopDev

Xu Hướng Kiểm Thử Phần Mềm

Xu Hướng Kiểm Thử Phần Mềm

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

Cũng như các lĩnh vực công nghệ sôi động khác, software development và cụ thể là ngành công nghiệp software testing thay đổi từng ngày. Là một tester, bạn cần phải cập nhật những kiến thức gì để tiếp tục làm chủ cuộc chơi? Thức xin chia sẻ một số xu hướng Kiểm Thử Phần Mềm mới để các bạn testers có thể “sharpen the saw”.

Blockchain app testing

Bạn có lẽ đã nghe nhiều về Bitcoin, Ethereum và Blockchain. Những buzzwords đang làm mưa làm gió những năm gần đây, đặc biệt là năm 2017 vừa qua. Ngày càng có nhiều các khoản đầu tư đổ dồn vào việc phát triển các ứng dụng dựa trên Blockchain. Điều này đồng nghĩa với nhu cầu kiểm thử các ứng dụng dựa trên Blockchain ngày càng tăng và càng cấp thiết. Bạn đã sẵn sàng kiểm thử ứng dụng blockchain chưa?

  Các mức độ kiểm thử được sử dụng trong kiểm thử chức năng của một phần mềm
  Kịch bản kiểm thử trang Login

Expert Tip: “Mastering Bitcoin: Unlocking Digital Cryptocurrencies” của Andreas Antonopoulos là quyển sách rất đáng đọc nếu bạn vừa bắt đầu tìm hiểu về Blockchain. Quyển sách cung cấp những lý giải và ví dụ đơn giản dễ hiểu về Bitcoin, ứng dụng đầu tiên và lớn nhất của Blockchain up to now.

Smart product testing

Các thiết bị có cảm biến (đồ chơi thông minh như Anki Overdrive), các thiết bị dựa trên giọng nói & Artificial Intelligence như Amazon Alexa đang ở giai đoạn hưng thịnh. Hàng triệu thiết bị Amazon Echo và Google Home đã được sản xuất và tung ra thị trường. Trong năm nay, các nhà nghiên cứu dự đoán sẽ có 24.5 triệu sản phẩm voice-based được bán ra thị trường. Gartner dự đoán thị trường sản phẩm thông minh toàn cầu sẽ đạt 2 tỷ USD vào năm 2020. Đây là cơ hội vô cùng to lớn cho cả developers và testers.

Expert Tip: Bạn có thể bắt đầu học cách viết “skills” (tên gọi khác của apps trên Alexa Marketplace) bằng việc đăng ký tài khoản Amazon Webservices (free, bạn chỉ cần cung cấp số thẻ tín dụng) và viết ngay một Lambda function (guide). Kiến thức về cloud services là nền tảng cơ bản của smart product testing.

More test automation

Công việc dành cho Manual testers ngày càng ít đi. Lĩnh vực kiểm thử phần mềm đòi hỏi testers phải có nhiều kỹ năng technical hơn như khả năng tạo ra các framework kiểm thử tự động.

Expert Tip: Nếu bạn đang là Manual tester, vẫn chưa muộn để bắt đầu học Test Automation hôm nay. Bạn có thể tham khảo guideline này: http://qr.ae/TbSswT

Wiring automated tests into the pipelines

Trong thế giới DevOps ngày nay, các bản hotfixes và features mới được liên tục released trực tiếp cho người dùng cuối (continuously). Sẽ là thảm họa nếu sản phẩm không được kiểm thử một cách chu đáo (regression test). Nhưng con đường để đạt được Continuous Testing không phải là đơn giản.

Expert Tip: Bạn không cần phải là chuyên gia về code để có thể ráp nối automated tests của bạn vào trong pipeline. Hầu hết các tools như Jenkins, Concourse, TFS… đều hỗ trợ giao diện command line.

Service-oriented testing

Đây không phải là trend quá mới của năm 2018. Xu hướng này đã bắt đầu từ rất lâu: số lượng API tests tăng lên trong khi GUI testing tiếp tục giảm. API testing rõ ràng là sâu hơn (để tìm lỗi), chạy nhanh hơn và đáng tin cậy hơn.

Expert Tip: Hãy bắt đầu nghiên cứu cách sự dụng những REST endpoints bằng tools như POSTMAN hoặc curl ngay hôm nay. Ngoài việc thấu hiểu cách sử dụng REST API, bạn nên tìm hiểu thêm về cách viết API test bằng RestAssured.

Involvement of non-engineering testers

Ngày càng nhiều “test analysts” hoặc “domain experts” tham gia vào quá trình kiểm thử phần mềm mặc dù họ không có nền tảng kỹ thuật. Xu hướng này đòi hỏi một scripting language hiệu quả, để những testers không có nền tảng kỹ thuật có thể đọc hiểu, tạo và chạy automated tests.

Expert Tip: Tập trung vào business flows và logics của phần mềm bạn đang test thay vì code. Hãy để việc code những test cases đó cho các chuyên gia automation. Ngoài ra, hãy làm quen với phương pháp kiểm thử keyword-driven. Đây là giải pháp để non-technical testers có thể hợp tác hiệu quả với automation experts.

Lời Kết

Các xu hướng kiểm thử phần mềm này sẽ là trọng tâm cho sự phát triển của lĩnh vực kiểm thử phần mềm trong những năm tiếp theo. Để bắt kịp các xu hướng thay đổi thường xuyên của software testing, bạn có thể đọc một số kênh thông tin dưới đây. Thứ tự sắp xếp chỉ là quan điểm cá nhân của tác giả. Các bạn VNTesters có thể bổ xung hoặc điều chỉnh bằng cách để lại bình luận.

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

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

Xem thêm IT jobs for Developer hấp dẫn trên TopDev