Home Blog Page 67

Todo List: Hoàn thiện ứng dụng Todo List

todo list
Todo List: Hoàn thiện ứng dụng Todo List

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

Video trong bài viết

Sau 16 bài học, hôm nay cũng là bài cuối cùng, chúng ta sẽ hoàn thiện những tính năng cuối cùng của ứng dụng Todo List cơ bản. Các công việc đã có thể được tạo ra, cập nhật và xóa khỏi ứng dụng. Tuy nhiên chúng ta chưa có tính năng đánh dấu những công việc nào đã hoàn thành.

Xử lý trạng thái công việc trong Todo List

Trong thiết kế ở bài số 5, bảng todos có trường completed có kiểu dữ liệu Boolean dùng để đánh dấu từng công việc xem đã hoàn thành hay chưa.

Bước 1: Thêm nút Complete vào từng Todo

Trong trang danh sách các công việc /todos, ở mỗi công việc đã có một nút View để xem chi tiết công việc, chúng ta thêm vào một nút Complete để sử dụng chuyển trạng thái khi công việc đã hoàn thành.

Mở view resouces/views/todos/index.blade.php và thêm vào nút Complete:

@extends('layouts.app')

@section('title')
Todos List
@endsection

@section('content')
  <h1 class="text-center my-5">TODOS PAGE</h1>
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card card-default">
        <div class="card-header">
          Todos
        </div>

        <div class="card-body">
          <ul class="list-group">
            @foreach($todos as $todo)
              <li class="list-group-item">
                {{ $todo->name }}

                @if(!$todo->completed)
                  <a href="/todos/{{ $todo->id }}/complete" style="color: white;" class="btn btn-warning btn-sm float-right">Complete</a>
                @endif
                <a href="/todos/{{ $todo->id }}" class="btn btn-primary btn-sm float-right mr-2">View</a>
              </li>
            @endforeach
          </ul>
        </div>
      </div>
    </div>
  </div>
@endsection

Cùng thảo luận chút về đoạn code hiển thị nút Complete:

@if(!$todo->completed)
  <a href="/todos/{{ $todo->id }}/complete" style="color: white;" class="btn btn-warning btn-sm float-right">Complete</a>
@endif

Kiểm tra xem một công việc nếu chưa hoàn thành sẽ hiển thị một nút Complete cho công việc đó, khi nhấp vào nó sẽ thực hiện đường dẫn /todos/{todo}/complete. Quay lại với quy trình 3 bước, bạn nhớ chứ.

Bước 2: Đăng ký đường dẫn

Mở file routes/web.php và đăng ký đường dẫn này:

Route::get('todos/{todo}/complete', 'TodosController@complete');

Đường dẫn này sẽ được thực thi bởi phương thức complete() trong TodosController.

Bước 3: Xử lý nghiệp vụ trong Controller

Phương thức complete() hiện chưa tồn tại, mở controller ra và thêm phương thức này vào (app/Http/Controllers/TodosController.php):

public function complete(Todo $todo)
{
  $todo->completed = true;
  $todo->save();

  session()->flash('success', 'Todo completed successfully.');

  return redirect('/todos');
}

Nhắc lại một chút, trong phương thức complete() chúng ta có sử dụng Route Model Binding để truyền Model vào Route tự động và chúng ta cũng sử dụng Laravel Session để lưu thông tin hiển thị thông báo về trạng thái khi chuyển trạng thái của Todo.

Bước 4: Hoàn thành công việc

Sau khi đã chuyển trạng thái, chúng ta chỉ thực hiện chuyển hướng người dùng về trang danh sách /todos, như vậy là kết thúc một chu kỳ yêu cầu từ phía người dùng.

public function complete(Todo $todo)
{
  ...
  return redirect('/todos');
}

Hoàn thiện ứng dụng Todo List

Source code: Bài 17 – Hoàn thiện ứng dụng Todo List

Tóm lược khóa học Laravel cơ bản

Khóa học Laravel cơ bản cùng với dự án nhỏ ứng dụng quản lý công việc Todo List đã hoàn thành. Đây là một ứng dụng nhỏ nhưng qua đó chúng ta đã nắm bắt được các khái niệm cơ bản trong Laravel:

  • Cài đặt và thiết lập môi trường phát triển Laravel.
  • Làm quen với mô hình MVC thực tế và mô hình MVC được áp dụng trong Laravel thông qua các khái niệm về Route, View, Controller, Model.
  • Làm việc với database với khá nhiều các khái niệm mới như Migration, Factory, Seeder.
  • Nắm bắt được cách thức xây dựng ứng dụng với các file bố cục (layout) và Laravel Blade.
  • Thực hiện một chuỗi các hành động CRUD (Create, Read, Update và Delete) với một đối tượng.

Với những kiến thức nền tảng này, bạn có thể tìm hiểu các vấn đề khác trong Laravel và cũng có thể bắt tay xây dựng những ứng dụng web đơn giản khác.

  Todo App Flutter – Real Code
  Todo List: Hiển thị thông báo trong ứng dụng Laravel

Xem thêm tuyển dụng PHP Laravel lương cao trên TopDev

Mở rộng ứng dụng Todo List

Khóa học đã kết thúc, tuy nhiên để ứng dụng Todo List có thể sử dụng được trong thực tế chúng ta cần thêm một vài tính năng cho nó.

  1. Tính năng người dùng:
    • Chúng ta muốn rằng ứng dụng Todo List này có thể được sử dụng bởi nhiều người dùng khác nhau, do đó cần thêm tính năng về người dùng vào ứng dụng. Mỗi công việc có thể ở dạng public hoặc private để người khác có thể xem hoặc không xem được.
    • Công việc có thể chung cho từng nhóm người dùng.
  2. Mở rộng cho từng Todo:
    • Thêm phần đính kèm, một công việc có thể đính kèm các tài liệu dạng văn bản, file nén, hình ảnh, video…
    • Thay vì trạng thái chưa hoàn thành và hoàn thành, chúng ta thêm vào đánh giá phần trăm hoàn thành.
    • Phân loại công việc theo mức độ như thông thường, khẩn cấp…
    • Xóa Todo: chúng ta sử dụng soft delete thay vì xóa hẳn bản ghi khỏi database.
    • Thời gian hoàn thành dự kiến
  3. Thông báo
    • Thông báo đến người dùng các công việc quá hạn.
    • Cho phép đặt lịch hiển thị các nhắc nhở công việc chung của nhóm người dùng…

Với các tính năng mở rộng trên, ứng dụng Todo list đã có thể đưa lên Internet và sử dụng cho nhiều người khác nhau. Bạn hãy bắt tay vào xây dựng và cùng thảo luận những khó khăn trong phần bình luận nhé. Phần mở rộng ứng dụng Todo List này sẽ tiếp tục trong phần Bonus của Khóa học, các bài viết sẽ sớm public khi hoàn thành.

Chúc các bạn có những bài học hiệu quả, nhớ ủng hộ website thông qua nhấp quảng cáo và subcribe kênh youtube Allaravel nhé!

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

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

Xem thêm các việc làm công nghệ hấp dẫn trên TopDev

NUnit – Thực thi kiểm thử tự động với mã từ Selenium IDE

nunit
NUnit – Thực thi kiểm thử tự động với mã từ Selenium IDE

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

Với Selenium IDE cùng với các phần mở rộng của nó, chúng ta về cơ bản có thể xử lý được một số trường hợp kiểm thử đơn giản và nâng cao (Điều kiện, lặp hay data-driven). Tuy nhiên, với những dự án lớn, chúng ta cần phải xem xét đến quá trình lâu dài và tái sử dụng các đoạn mã kiểm thử tự động hiệu quả. Không thể cứ mỗi lần có thay đổi về mặt UI hay logic, chúng ta lại record các đoạn mã lại từ đầu, right 🙂

Để có thể tái sử dụng các đoạn mã, Seleium IDE hỗ trợ chúng ta xuất những gì đã record ra các ngôn ngữ như Python, Java, C# hay Ruby. Ở bài này, mình sẽ hướng dẫn các bạn thực thi những gì mà Selenium IDE xuất ra bằng ngôn ngữ C#. Chúng ta sẽ sử dụng NUnit framework trên nền Visual Studio.

Lấy mã nguồn C# từ Seleium IDE

  1. Record một trường hợp kiểm thử với Selenium IDE
  2. Chọn menu File > Export Test Case As… > C# / NUnit / WebDriver
  3. Lưu tập tin .cs

Tạo dự án NUnit trên Visual Studio với tập tin cs và thực thi kiểm thử với ứng dụng NUnit

  1. Mở Visual Studio và tạo một dự án mới kiểu Class Library và thêm vào dự án các tập tin dll của NUnitFramework và Selenium WebDriver
  2. Thêm tập tin cs mà Selenium IDE lưu ra vào trong dự án và build dự án
  3. Mở ứng dụng NUnit vời dự án VS vừa được tạo
  4. Thực thi đoạn mã

Chi tiết các bước, các bạn có thể xem clip dưới đây

Bài viết gốc được đăng tải tại vntesters.com
Có thể bạn quan tâm:
Xem thêm các việc làm ngành IT hấp dẫn trên TopDev

Viết test trong Rust the idiomatic way

test trong rust
Viết test trong Rust the idiomatic way

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

Chống chỉ định: cái tiêu đề đặt nữa tây nữa việt là cố ý, để câu view, chứ thực ra không phải tại mình không biết dịch chữ idiomatic ra đâu :v À nhân tiện nói luôn, idiomatic way có nghĩa là một cách chính thống, ở đây bàn về cách viết test được cộng đồng Rustlang công nhận và khuyến khích.Testing là một chức năng quan trọng mà bất kì ngôn ngữ nào cũng cần phải có, viết unit test cũng là một việc mà bất kì lập trình viên nào cũng cần phải làm, thậm chí với một vài cộng đồng như Golang và Ruby thì người ta bảo thủ tới mức xem việc publish một project không có unit test giống như là một cái tội luôn vậy đó :))

Đối với Go thì chúng ta có go test, đối với Ruby chúng ta có thể chạy test thông qua rake (đúng không nhỉ? một thanh niên không code Ruby cho hay), Node thì thôi không nên nhắc tới làm gì 🙁 và tất nhiên là Rust cũng có công cụ testing built-in thông qua lệnh cargo test.

Cách test trong Rust

Để viết test trong Rust thì khá là đơn giản, chỉ cần tại bất kì đâu trong chương trình, viết một hàm theo dạng:

#[test]
fn minh_thich_thi_minh_test_thoi() {
  ...
}

Hàm này có attribute #[test] (dân Java, C#, thường gọi cái này là annotation) để báo cho Rust compiler biết rằng đây là một hàm test, các hàm này sẽ được chạy khi chúng ta gọi lệnh:

cargo test

Ví dụ, ta viết một hàm test như sau:

#[test]
fn this_function_should_drop_all_tables() {
    assert!(1 + 1 == 2)
}

Và chạy test, ta thu được kết quả:

➜  kipalog git:(master) ✗ cargo test
   Compiling testrun v0.1.0 (file:///Users/huy/code/kipalog)
    Finished debug [unoptimized + debuginfo] target(s) in 0.27 secs
     Running target/debug/kipalog-90d752c0679f22d9
 
running 1 test
test this_function_should_drop_all_tables ... ok
 
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

Idiomatic way để viết test trong Rust

Theo cuốn sách The Rust Programming Language, cộng đồng Rust khuyến khích 2 cách viết test “chuẩn” đó là: Viết trong tests module và Viết trong thư mục tests. Vậy tại sao lại có 2 cách viết?

Dùng tests module để viết Unit Test

Để tạo tests module thì chúng ta có thể viết code sau ở bất kì đâu:

#[cfg(test)]
mod tests {
 
}

Từ khóa mod để tạo một module mới, và khi gặp attribute #[cfg(test)], Rust compiler sẽ chỉ compile module này khi chạy test, khi build bình thường thì module này sẽ bị bỏ qua để tiết kiệm thời gian compile.

Giả sử chương trình của chúng ta có một hàm cần test là sum(), chúng ta sẽ viết test cho hàm này như sau:

fn sum(a: i32, b: i32) -> i32 {
    a + b
}
 
#[cfg(test)]
mod tests {
    use super::sum;
 
    #[test]
    fn sum_should_return_something() {
        assert!(sum(1, 2) == 3)
    }
}

Lưu ý lệnh:

use super::sum;

Vì hàm sum của chúng ta không được khai báo bên trong module tests nên trước khi sử dụng nó trong hàm test, chúng ta phải đưa nó vào scope của module hiện hành bằng lệnh use.

Chạy thử bộ test trên sẽ cho kết quả như sau:

➜  kipalog git:(master) ✗ cargo test
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs
     Running target/debug/kipalog-e90e21d36164f8bb
 
running 1 test
test tests::sum_should_return_something ... ok
 
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

Bạn sẽ thấy test case được chạy bây giờ là tests::sum_should_return_something, tức là Rust đã chạy test cho hàm sum_should_return_something thuộc module tests, khác với kết quả được in ra ở ví dụ test một hàm đơn lẻ ở đầu bài.

Các test được viết trong module này thường sẽ là các unit test.

Dùng thư mục tests để viết integration tests

Ngoài cách test ở trên, chúng ta có thể tạo thư mục tests nằm cùng cấp với thư mục src của dự án, và viết các file test ở trong này. Mỗi một file *.rs nằm trong thư mục này được xem như là một crate riêng, và khi compile cũng sẽ nằm ở một target riêng, các bạn lưu ý chỗ này.

  Cài đặt Rust trên Arch Linux
  Dynamic typing trong Rust với std::any::Any

Xem thêm các việc làm SQL hấp dẫn trên TopDev

Để viết các integration test thì chúng ta tạo file tests/integration_tests.rs.

Giả sử chúng ta có module kipalog và có hàm sum() như đã khai báo ở phần trước, nội dung file test của chúng ta sẽ có dạng:

extern crate kipalog;
 
#[test]
fn test_sum_one_and_two() {
    assert!(kipalog::sum(1, 2) == 3);
}

Như đã nói ở trên, vì bên trong thư mục tests, mỗi file là một crate riêng, điều này có nghĩa là chúng ta phải import module kipalog vào, giống với cách sử dụng crate trong thực tế, vì vậy cách này thích hợp để viết integration test.

Chạy test trên thì output sẽ có dạng:

➜  kipalog git:(master) ✗ cargo test
   Compiling kipalog v0.1.0 (file:///Users/huy/Desktop/Code/kipalog)
    Finished debug [unoptimized + debuginfo] target(s) in 0.41 secs
     Running target/debug/integration_tests-e2d20617c9c89446
 
running 1 test
test test_sum_one_and_two ... ok
 
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
 
     Running target/debug/deps/kipalog-f232ef2295608ede
 
running 1 test
test tests::sum_should_return_something ... ok
 
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
 
   Doc-tests kipalog
 
running 0 tests
 
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured

Có thể thấy trong output chia làm 3 phần, phần đầu tiên là kết quả chạy test được viết trong integration_tests.rs của chúng ta, phần 2 là phần code test trong module tests đã viết ở phần trước. Phần cuối cùng là Doc-tests, là một chức năng của Rust cho phép test luôn code trong document, các bạn có thể xem chi tiết tại bài The Rust Programming Language – Testing.

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

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

Xem thêm các việc làm ngành IT hấp dẫn trên TopDev

[Update] Mẫu CV thiết kế đồ họa ấn tượng nhất 2024

mẫu cv thiết kế đồ họa
Tổng hợp những thông tin cần thiết trong mẫu CV thiết kế đồ họa

Thiết kế đồ họa – một ngành nghề được đánh giá rất cao về tính nghệ thuật và sự tinh tế của người làm trong ngành. Chính vì thế, những mẫu CV của ứng viên ngành thiết kế đồ họa cũng nên được trau chuốt hơn về mặt hình thức cũng như thể hiện các nội dung cần thiết liên quan đến công việc của mình.

mẫu cv thiết kế đồ họa

Cách viết CV thiết kế đồ họa đạt hiệu quả cao

CV xin việc thiết kế đồ họa cũng tương tự như mọi loại CV khác về mặt bố cục nội dung. Trước khi muốn gây ấn tượng với người khác bằng những thông tin mình cung cấp, bạn cần đảm bảo mình đã cung cấp đủ những thông tin mà nhà tuyển dụng cần. Dưới đây là một số thông tin cần có trong CV.

1. Thông tin cá nhân

Thông tin cá nhân là một trong những phần quan trọng nhất cần được nhắc đến trong CV. Các thông tin này vừa cho biết một cách cơ bản về bản thân bạn vừa giúp cho nhà tuyển dụng dễ dàng có được thông tin khi liên hệ lại với bạn để mời phỏng vấn. Bạn nên cung cấp những thông tin cơ bản như họ tên, số điện thoại, email, địa chỉ liên lạc, và một số các website chuyên nghiệp mình đang sở hữu nếu có.

2. Kinh nghiệm làm việc

Hầu hết những ai theo đuổi nghề thiết kế đồ họa đều đã đầu tư cho chuyên môn của mình từ rất sớm. Thời sinh viên mọi người đã nhận những công việc bán thời gian có thể thực hiện liên quan đến đồ họa một cách đơn giản để tích lũy kinh nghiệm. Hoặc tham gia những khóa học liên quan đến thiết kế để cải thiện kỹ năng. Bạn đều có thể liệt kê những kỹ năng này vào trong CV của mình để nhà tuyển dụng có thêm thông tin.

Và quan trọng nhất là, đừng nói dối ở phần kinh nghiệm làm việc bạn nhé. Bạn có thể nói quá đôi chút nhưng vẫn đảm bảo là bạn có thể làm được những việc đó. Hầu hết các vị trí thiết kế đồ họa đều yêu cầu ứng viên thực hiện bài test trước để đánh giá về năng lực của bạn. Bên cạnh đó, nếu nói dối về năng lực làm việc thì sẽ rất khó cho bản thân nếu được nhận vào và không thể làm việc.

Xem thêm Giới thiệu bản thân trong CV và bí quyết ghi điểm trong mắt nhà tuyển dụng

3. Kỹ năng chuyên môn

Kỹ năng chuyên môn liên quan đến lĩnh vực làm việc cũng rất quan trọng trong CV của nhân viên thiết kế đồ họa. Các kỹ năng nên đề cập trong CV của nghề thiết kế đồ họa thường sẽ là kỹ năng liên quan đến thiết kế, kỹ năng sử dụng các công cụ thiết kế, kỹ năng quản lý thời gian và khả năng ngoại ngữ, sự tỉ mỉ và tinh tế trong quá trình làm việc,…

4. Mục tiêu nghề nghiệp

Thiết kế đồ họa được đánh giá là nghề có triển vọng phát triển mạnh ở thời điểm hiện tại. Chính vì thế nên ứng viên ngành thiết kế đồ họa nên trình bày mục tiêu nghề nghiệp ngắn hạn và dài hạn của mình trong CV để nhà tuyển dụng có thể đánh giá được phần nào mục tiêu công việc của bạn trong tương lai.

Tạo CV online nhanh chóng, đẹp dành cho dân IT

Mẫu CV thiết kế đồ họa đẹp, mới nhất

Đính kèm bên dưới một số mẫu CV dành cho ứng viên thiết kế đồ họa được yêu thích nhất hiện nay.

cv thiết kế đồ họa
Mẫu 1
cv thiết kế đồ họa
Mẫu 2

Ngoài ra, bạn có thể tham khảo thêm một số template tạo CV chuyên nghiệp trên TopDevCV

cv ngành thiết kếcv ngành thiết kế

mẫu cv cho dân thiết kế

3. Những lưu ý khi viết CV thiết kế đồ họa

Về mặt tổng quan hình thức, chắc chắn đây sẽ không là vấn đề khó với ứng viên ngành thiết kế đồ họa. Làm việc thường xuyên với lĩnh vực có tính nghệ thuật cao nên chắc chắn ứng viên sẽ biết cách để trình bày một bố cục, hình ảnh kết hợp với nội dung tạo được sự ấn tượng với người xem.

Nhưng cũng cần nhớ rằng, hãy đảm bảo chiếc CV hài hòa về hình thức và CV là để nhà tuyển dụng xem, đừng để phong cách cá nhân của bạn ảnh hưởng quá nhiều đến tổng thể. Cần đảm bảo được sự cân bằng cho bố cục và không quá phá cách.

Xem thêm các việc làm tuyển dụng Designer trên TopDev

Bên cạnh đó, gửi CV kèm với portfolio sẽ giúp đơn ứng tuyển của bạn dễ lọt vào “mắt xanh” của nhà tuyển dụng hơn. Vì công việc là thiết kế đồ họa nên những sản phẩm nào bạn đã thực hiện cũng nên được gửi kèm để nhà tuyển dụng có thể xem qua và đánh giá xu hướng thẩm mỹ cũng như khả năng của bạn.

Ngoài ra, việc nên gửi CV bằng tiếng Anh hay tiếng Việt sẽ phụ thuộc vào yêu cầu của công ty ứng tuyển. Nếu công ty không nêu rõ nên gửi bằng ngôn ngữ nào thì bạn nên gửi CV bằng tiếng Việt thay vì tiếng Anh.

Cũng như mọi ngành nghề khác, các mẫu CV thiết kế đồ họa sẽ cần đáp ứng các yêu cầu về mặt hình thức và nội dung. Hy vọng các thông tin trong bài viết này cùng với các mẫu CV được giới thiệu sẽ giúp bạn có thêm các CV tham khảo và định hướng được chiếc CV mà mình nên thiết kế sẽ như thế nào.

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

Xem thêm tuyển dụng các vị trí IT hấp dẫn trên TopDev

Tự học lập trình – Hỏi làm sao để được trả lời?

tự học lập trình
Tự học lập trình - Hỏi làm sao để được trả lời?

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

Vấn đề này thì không hề mới rồi. Bài viết về vấn đề này thì lại càng nhiều nữa. Mình cũng không đưa ra lời khuyên hay gì hết, chỉ copy lại một đoạn liên quan tới vấn đề này trong cuốn The Pragmatic Programmer rồi bình loạn thêm tí xíu cho mọi người dễ tham khảo thôi nhá 😀

Care and Cultivation of Gurus

With the global adoption of the Internet, gurus suddenly are as close as your Enter key. 
So, how do you find one, and how do you get one to talk with you?
 
We find there are some simple tricks.
 
- Know exactly what you want to ask, and be as specific as you can be.
- Frame your question carefully and politely. Remember that you're asking a favor; 
  don't seem to be demanding an answer.
- Once you've framed your questioned, stop and look again for the answer. 
  Pick out some keywords and search the web. Look for appropriate FAQs (lists of 
  frequently asked questions with answers).
- Decide if you want to ask publicly or privately. Usenet news-groups are wonderful 
  meeting places for experts on just about any topic, but some people are wary of these 
  groups' public nature. Alternatively, you can always e-mail your guru directly. Either 
  way, use a meaningful subject line. (" Need Help!!! " doesn't cut it.)
- Sit back and be patient. People are busy, and it may take days to get a specific answer.
 
Finally, please be sure to thank anyone who responds you. And if you see people asking 
questions you can answer, play your part and participate.

Bình loạn

Đại khái thì trích đoạn trên nói là, với tính toàn cầu của Internet ngày nay, thì các guru (các chuyên gia trong lĩnh vực nào đó) trở nên rất gần với bạn. Có lẽ các bạn nào mới học lập trình gần đây không thấm lắm chuyện này, nhưng những ai học lập trình từ thời 99-2002 trở về trước thì sẽ hiểu, chuyện lên Internet đã là cực kì khó, sách báo, tạp chí về CNTT thì không nhiều như bây giờ, có những lúc thắc mắc không biết hỏi ai chỉ biết vò đầu bứt tai. Việc tiếp cận những người giỏi, nổi tiếng trong lĩnh vực này thì cực kì khó vì không có phương tiện để liên lạc, huống hồ là chỉ biết đến qua cái tên trên internet. Còn thế hệ các anh các chú làm CNTT từ trước đó nữa thì không biết họ học như thế nào, mình thực sự rất là phục những người này.

Quay lại bài viết, vì những bác guru thì thường cũng rất nhiệt tình và muốn giúp đỡ người khác, nhưng đa phần các câu hỏi mà các bạn mới học đang hỏi trên mạng hiện này không được ai quan tâm đến, thậm chí hỏi xong có người còn bay vào chửi xối xả xong bỏ đi mà chủ nhân câu hỏi còn không biết tại sao mình bị chửi nữa 😂 đoạn trích trên chỉ ra một số trick để hỏi làm sao cho những bác guru này đọc vào là thấy hứng thú trả lời ngay:

Know exactly what you want to ask, and be as specific as you can be.

Đầu tiên, phải biết rõ bạn muốn hỏi cái gì, và hỏi thật chi tiết, cặn kẽ.

Chẳng ai có thể trả lời một câu hỏi không đầu không cuối, không trách nhiệm kiểu như:

“Có ai làm login Facebook trong Rails rồi cho em hỏi với ạ?”

==> Bạn muốn hỏi vấn đề gì về login Facebook trong Rails?

Game Tic Tac Toe? / Hỏi về Rails? / Hỏi về Unicode / Mọi người giúp mình với / Hỏi về 1 đoạn HTML + CSS / …

==> Bạn đang hỏi đấy à?

Xin source/bài tập lớn môn xxxx

==> 💩

Ai giúp em giải bài tập môn Phân tích thiết kế giải thuật này với ạ?

==> 🖕

Frame your question carefully and politely. Remember that you're asking a favor; 
  don't seem to be demanding an answer.

Bạn cần phải khoanh vùng câu hỏi một cách rõ ràng, không nên hỏi lan man, hỏi trực tiếp vào vấn đề bạn đang gặp, trình bày câu hỏi một cách rõ ràng, mạch lạc, cung cấp đầy đủ thông tin vào bên trong câu hỏi, ví dụ gặp code thì phải cho vào thẻ code cho nó có màu, copy error log thì nên đọc xem đoạn nào chính xác là error log, đừng copy toàn bộ file log lên làm gì, nếu hỏi nhiều vấn đề cùng một lúc thì nên ghi hết ra, mỗi câu hỏi trên một dòng, có đánh số đầy đủ, một bài hỏi cẩu thả không format, câu cú lủng củng thì cũng chẳng có ai thèm đọc để trả lời cả.

Và quan trọng nhất là phải hỏi một cách thật lịch sự, nhã nhặn. Bạn không biết người nào sẽ đọc câu hỏi của bạn, và người đọc câu hỏi cũng sẽ không biết bạn là ai. Nên tốt nhất là phải thật lịch sự, có phần lễ độ, nếu lười gõ nhiều chữ thì không nên đi hỏi. Vì bạn đang đi nhờ sự giúp đỡ của người khác, họ có giúp hay không thì tùy vô thái độ của bạn nữa, người ta không có bổn phận phải trả lời câu hỏi của bạn đâu, nên đừng làm họ phật ý khi đọc câu hỏi.

Once you've framed your questioned, stop and look again for the answer. 
  Pick out some keywords and search the web. Look for appropriate FAQs (lists of 
  frequently asked questions with answers).

Một khi bạn đã khoanh vùng được vấn đề cần hỏi, thì từ từ rồi hãy hỏi, đầu tiên hãy đọc kĩ lại các tài liệu, tra cứu google về nội dung bạn muốn hỏi. Chọn một vài từ khóa trong vấn đề bạn thắc mắc để search.

Ví dụ bạn đang làm bài tập về nhà, thầy giáo yêu cầu viết bài tập tô màu hình chữ nhật bằng C, hãy search Google bằng từ khóa: “thuật toán tô màu”, “tô màu hình chữ nhật”, nếu biết tiếng Anh, có thể dịch cái yêu cầu đó ra tiếng anh và search: “rectangle coloring algorithm”,… bạn không cần phải biện hộ lý do “không biết từ khóa”, vì như đã thấy ở ví dụ kia mình chỉ đơn giản là copy luôn cái đề bài là “tô màu hình chữ nhật” và search nó luôn, Google sẽ tự động suggest cho chúng ta biết rằng chúng ta đang tìm về thuật toán scanline, hay đang tìm hiểu về vấn đề rectangle covering, bằng cách này bạn đã tìm ra đc từ khóa chính xác cho vấn đề đang gặp.

Ví dụ trên cũng là ví dụ cho việc:

Làm bài tập trước khi hỏi, tránh hỏi ngu vì …lười (https://github.com/ruby-vietnam/docs/blob/master/chat_room_law.md)

Decide if you want to ask publicly or privately. Usenet news-groups are wonderful 
  meeting places for experts on just about any topic, but some people are wary of these 
  groups' public nature. Alternatively, you can always e-mail your guru directly. Either 
  way, use a meaningful subject line. (" Need Help!!! " doesn't cut it.)

Quyết định xem nên hỏi ở chốn công cộng (chat room, diễn đàn,…) hay hỏi riêng (PM, chat riêng, email,…) Dù là cách nào thì đầu tiên bạn cần phải chuẩn bị câu hỏi một cách kĩ càng, đặt tiêu đề email hay tiêu đề topic một cách “có nghĩa”, đầy đủ, tóm tắt được câu hỏi, những tiêu đề kiểu “Giúp em với”, “Cứu em với”, “Hỏi về xxxx” chỉ càng giúp cho người ta bỏ qua email/topic của bạn nhanh hơn mà thôi.

Sit back and be patient. People are busy, and it may take days to get a specific answer.

Sau khi đã đặt xong câu hỏi thì ngồi yên đó, tiếp tục tra cứu Google và chờ người ta vào đọc rồi trả lời. Ở nhiều diễn đàn hay có những bạn hỏi xong chờ mãi ko thấy ai trả lời, lại bức xúc reply thêm 1 câu: “Sao cả chục người vào đọc mà không ai trả lời” 😆

Ai cũng bận rộn cả, họ phải tranh thủ chút thời gian rảnh để tranh thủ lên mạng giúp bạn, thì bạn nên tôn trọng họ, không thúc ép, không hỏi dai hỏi lì, việc trình bày câu hỏi cho “đẹp” cũng là một cách để tôn trọng thời gian của người khác. Nếu được hỏi một cách nhã nhặn, lịch sự thì người ta cũng sẽ trả lời bạn một cách lịch sự lại thôi 😀

Hy vọng bài viết này sẽ giúp các bạn mới học hiểu được tại sao mình hỏi mà không ai trả lời, và biết cách hỏi làm sao để người khác vui vẻ trả lời. Chúc các bạn may mắn 😀

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

Rust là gì? Có ăn được không?

rust là gì
Rust là gì? Có ăn được không?

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

Rust (đọc là /rʌst/) là một ngôn ngữ lập trình hệ thống (system programming language) được quảng bá là có tốc độ cực kì nhanh, ngăn chặn được phần lớn mọi bug crash (segfaults), ngăn chặn được data race, rất memory safe mà lại không cần tới garbage collector!

Cú pháp cơ bản của một chương trình Hello World trong Rust như thế này:

fn main() {
  println!("hello, {}", "world");
}

Bạn thấy gì qua đoạn chương trình trên nào? Có vẻ vừa giống C, vừa giống Go hay Swift, Java, C#,… mỗi thứ một tí, đúng không?

Tại sao nên dùng Rust?

Chắc các bạn cũng biết đến khả năng kiểm soát tài nguyên khi làm việc với các ngôn ngữ như C/C++ hay Java, Python, Ruby, JavaScript,…

Với C/C++, bạn được:

  • Toàn quyền kiểm soát mọi thứ (mallocfree,…)
  • Thường xuyên đau đầu với memory leakdata racesegfaults,…

Đối với thiên đường JavaScript hay Ruby, bạn:

  • Chẳng cần phải quan tâm một biến được cấp phát như thế nào và mất đi ra sao
  • Nhưng trade-off của nó chính là performance cực kì tệ hại.

Rust là giải pháp kết hợp cho ưu điểm của cả 2 loại ngôn ngữ trên, khi làm việc với Rust, bạn không cần phải quan tâm tới việc bị memory leak hay segfault, khi làm multi thread, bạn không còn sợ data race vì rust compiler đã lo hết chuyện đó cho bạn, để đảm bảo trong lúc chạy (runtime) thì chương trình sẽ luôn hoạt động một cách an toàn và vẫn đảm bảo được tốc độ và performance tối ưu nhất.

À! Chắc sẽ có bạn hỏi: Rust và Go thì nên chọn ai? Nếu có cùng thắc mắc, thì đương nhiên là chọn Rust rồi, vì mình đang quảng cáo Rust mà :)) xin mời bạn xem bài này nhé.

Rust nhanh tới mức nào?

OK. Đầu tiên phải nói ngay là Rust không phải ngôn ngữ lập trình nhanh nhất, trong số các ngôn ngữ lập trình bậc cao (high level programming language), không có cái nào như thế cả.

Vậy ngôn ngữ nào mới là nhanh nhất? và vì sao nó nhanh?

Kẻ đạt danh hiệu đó chắc phải nói đến Assembly, đó là nơi bạn toàn quyền kiểm soát một biến được tạo ra ở đâu, khi nào. Thích tạo ra trong stack hay trong heap là tùy bạn. Bạn được toàn quyền với bộ nhớ, vì bộ nhớ là của nó luôn, thích xài lúc nào là xài.

Mà khoan đã! Khả năng kiểm soát liên quan gì tới tốc độ?

Trong Assembly, mỗi instruction (lệnh) được viết ra đều được map chính xác với binary code/machine opcode mà từng loại CPU cung cấp (“close to the metal”).

Khi làm việc với Assembly, bạn phải nắm được tập lệnh (instruction set) của loại CPU mà bạn đang làm việc – và với mỗi loại CPU khác nhau thì lại có một tập lệnh khác nhau – và nó một loại cú pháp hết sức gần gũi với máy tính (nhưng xa lạ với con người :)))

C ra đời để khắc phục nhược điểm này của Assembly, đưa sức mạnh kiểm soát của Assembly vào chung với cú pháp thân thiện hơn với các lập trình viên.

Bằng cách lượt bỏ hết những dòng lệnh phức tạp của mã máy, C thay thế bằng các câu lệnh đơn giản hơn (syntax sugar). Ví dụ:

.section	__TEXT,__text,regular,pure_instructions
	.macosx_version_min 10, 12
	.globl	_main
	.align	4, 0x90
_main:                                  ## @main
	.cfi_startproc
## BB#0:
	pushq	%rbp
Ltmp0:
	.cfi_def_cfa_offset 16
Ltmp1:
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
Ltmp2:
	.cfi_def_cfa_register %rbp
	xorl	%eax, %eax
	movl	$100, -4(%rbp)
	popq	%rbp
	retq
	.cfi_endproc
 
 
.subsections_via_symbols

Đoạn mã Assembly trên là những gì sẽ được compiler dịch ra cho đoạn chương trình C sau:

int main() {
  int number = 100;
}

Chỉ với 3 dòng code C (mid level language), bạn sẽ không còn phải vật vã viết từng lệnh để cấp phát bộ nhớ, move giá trị vào từng ô nhớ, giải phóng nó khi kết thúc chương trình trong Assembly nữa. Vì C đã đơn giản hóa vấn đề bằng cách “giấu” đi tất cả những thao tác đó và đưa ra cho bạn một cú pháp vô cùng đơn giản là int number = 100;.

Việc “giấu” bớt các thao tác rườm rà và cung cấp một phương pháp đơn giản hơn để thực hiện một vấn đề được gọi là abstraction, và điều này diễn ra càng nhiều hơn ở các ngôn ngữ lập trình bậc cao như C#, Java, Ruby, JavaScript, Python,…

Lợi thế của abstraction đó là giúp cho lập trình viên rảnh tay để còn tập trung vào những thứ khác quan trọng hơn như code logic, business của chương trình. Nhưng thực chất thì các thao tác phức tạp bên dưới vẫn phải được thực hiện, và compiler của từng ngôn ngữ sẽ có nhiệm vụ “viết” các đoạn code đó ra thay cho bạn. Kết quả là gì?

Như đã nói ở trên thì mỗi nền tảng phần cứng lại có một tập lệnh khác nhau, vậy nên phần code được compiler “thêm” vào phải được viết theo một cách không thể phụ thuộc vào từng loại phần cứng cụ thể. Ví dụ nó không thể chắc chắn được phải truy cập vào đâu để lấy thông tin về chuột/bàn phím, thế là nó phải tốn thêm một bước đó là: Hỏi máy tính xem con chuột nó nằm ở đâu để truy vấn tới. Và thế là, thay vì chỉ làm mỗi nhiệm vụ đọc xem nút nào trên con chuột vừa được nhấn xuống, nó phải làm thêm một vài việc nữa như là chạy tới hỏi anh kernel của hệ điều hành xem nhà anh chuột nằm ở đâu, rồi chạy qua nhà anh chuột gõ cửa xem ảnh có nhà không,… và những việc lôi thôi đó tốn thêm một ít thời gian nữa.

Những gì ở bên dưới thì bạn sẽ không thể kiểm soát hay can thiệp vào để tối ưu hóa nó được, ví dụ: Bạn không bao giờ có thể chủ động giải phóng một vùng nhớ khi dùng Garbage Collector, bạn không thể yêu cầu JavaScript tạo ra một biến nằm trong stack hay heap theo ý bạn được,… và bạn phải chấp nhận với cái cách nó đốt thời gian như là một sự thật hiển nhiên.

Đánh đổi tốc độ, gia tăng các lớp abstraction, giúp cho lập trình viên có thể viết code một cách thoải mái hơn, xây dựng sản phẩm nhanh hơn. Đó là bản chất xấu xa của các high level programming languages :))

  Cài đặt Rust trên Arch Linux
  Triển khai bài toán duyệt cây nhị phân với Rust

Xem thêm các việc làm JavaScript lương cao trên TopDev

Zero-cost Abstraction

Cũng giống như C/C++, bên cạnh khả năng kiểm soát gần như tuyệt đối (vâng, Rust cũng có thể cho bạn kiểm soát đến từng ô nhớ!), Rust chọn zero-cost abstraction làm một trong những nguyên tắc nền tảng của nó.

C++ implementations obey the zero-overhead principle: What you don’t use, you don’t pay for [Stroustrup, 1994]. And further: What you do use, you couldn’t hand code any better.

– Stroustrup

Rust design ra các abstraction dễ dùng, nhưng được compile về machine code một cách rất hiệu quả và không làm ảnh hưởng đến tốc độ của toàn chương trình, các high-level API được compile về machine code một cách ít nhất và tối ưu nhất (you pay for the features you actually use).

Ngoài ra Rust còn giới thiệu khái niệm Traits giúp bạn được làm việc giống như trên các ngôn ngữ lập trình bậc cao nhưng vẫn đảm bảo được khả năng kiểm soát code và tài nguyên như các ngôn ngữ lập trình bậc thấp!

Tốc độ của Rust

Khi so sánh với các ngôn ngữ khác, thực sự thì đây là một việc không cần thiết, nhưng chúng ta có thể tham khảo, bảng so sánh tốc độ thực thi tính tổng dãy số Fibonacci giữa các ngôn ngữ Rust, Go, NodeJS và Swift:

Bảng so sánh thời gian thực hiện, càng nhỏ thì càng xịn

Bạn có thể xem bảng so sánh performance của Rust và một số ngôn ngữ khác tại:

Rust an toàn tới cỡ nào?

Một trong những điểm mà Rust quảng cáo đó là an toàn, không bao giờ bị crash, vậy làm sao Rust đạt được những điều đó?

Câu trả lời nằm ở Rust Compiler.

Thông thường, phần lớn lỗi của một chương trình C/C++ sẽ liên quan đến việc truy xuất bộ nhớ khi thực thi (runtime error – ví dụ bạn truy cập vào vùng bộ nhớ đã bị giải phóng, sử dụng nhầm các biến có giá trị null, lỡ tay tạo ra nhiều thread cùng ghi vào một vùng nhớ,…)

Để ngăn chặn vấn đề này, Rust Compiler đề ra một loạt các quy tắc để kiểm tra ngay khi nó biên dịch chương trình, chúng ta sẽ không đi sâu vào các quy tắc này, nhưng mình sẽ nói sơ qua:

  • Mọi biến mặc định đều là immutable, và không được mang giá trị null (nên không có lỗi NullReferenceException)
  • Trong Rust, một vùng nhớ luôn có một biến sỡ hữu nó.
  • Gán một biến vào một biến khác, tức là bạn chuyển quyền sở hữu vùng nhớ của biến đó cho biến mới. Biến cũ không được quyền truy xuất tới đó nữa.
  • Trong một thời điểm, chỉ có một trong hai trường hợp có thể xảy ra, đó là:
    • Nhiều biến khác có thể mượn vùng nhớ đó chỉ để đọc (read only).
    • Chỉ có một biến có quyền mượn để ghi giá trị lên đó.
  • Một biến chỉ có thể tồn tại bên trong scope của nó, ra khỏi scope đó nó sẽ bị giải phóng ngay lập tức.

Bất cứ khi nào lập trình viên vi phạm các quy tắc này, Rust sẽ báo cho bạn biết ngay khi biên dịch, chứ không để lọt lỗi.

Trong số các quy tắc được liệt kê ở trên, trừ quy tắc đầu tiên ra, thì những mục còn lại chính là Ownership, Borrowing & Lifetime System của Rust.

Ví dụ với đoạn code sau minh họa cho vấn đề chuyển quyền sở hữu đề cập ở trên:

let v = vec![1, 2, 3];
let v2 = v;
 
println!("v[0] is: {}", v[0]);

Theo lẽ thường, chúng ta nghĩ đoạn code trên sẽ in ra số 1, là giá trị của v[0]. Nhưng khi biên dịch thì sẽ gặp ngay lỗi:

error: use of moved value: `v`
println!("v[0] is: {}", v[0]);

Đừng lo nếu bạn không hiểu tại sao lại phát sinh ra lỗi này, ví dụ này chỉ để minh họa cho bạn thấy về khả năng bắt lỗi runtime ngay cả trong compile time của Rust thôi.

Rust không cần Garbage Collector?

Đúng vậy, Rust không có garbage collector (GC), nhưng vẫn đảm bảo được tính an toàn về bộ nhớ, đây là một trong những chức năng đặc biệt của Rust.

Thay vào đó, Rust Compiler sẽ dự đoán được khi nào một biến sẽ hết được sử dụng và tự động chèn thêm code logic để giải phóng nó, giảm thiểu chi phí cho việc quản lý bộ nhớ lúc runtime.

fn main() {
    let score = 10; // Khởi tạo vùng nhớ mới, cấp phát cho biến score
    // Tới đây là hết scope của biến score, mình nên giải phóng nó đi thôi 
}

Đoạn trên là diễn biến suy nghĩ của Rust Compiler qua từng dòng code :))

Và việc này được kiểm soát thông qua Ownership System.

Việc không có GC còn giúp Rust có thể dễ dàng được nhúng vào các ngôn ngữ có GC khác nữa.

Dùng Rust có thể làm được gì?

Đây là câu hỏi mà mình thấy nhiều người hỏi nhất.

Câu trả lời là: Mọi thứ!

Mặc dù là một ngôn ngữ lập trình hệ thống (system programming language), nhưng Rust nhắm tới việc cạnh tranh với C/C++ để tăng độ an toàn và cải thiện performance cho các phần mềm được viết ra, vì thế Rust có thể làm được mọi thứ mà C/C++ làm được, ví dụ:

Giờ bắt đầu học Rust như thế nào?

Ảnh lấy từ: [http://www.slideshare.net/LizBaillie/rustconf-2016-illustrated-adventure-guide-65894363](http://www.slideshare.net/LizBaillie/rustconf-2016-illustrated-adventure-guide-65894363)

Để bắt đầu, các bạn có thể tham khảo một số tài liệu sau:

  • Rust by Example: Trang web tổng hợp đầy đủ các ví dụ từ đơn giản đến phức tạp để giúp bạn làm quen với cú pháp và các kĩ thuật trong Rust.
  • Sách The Rust Programming Language: Đây là cuốn sách chính thức của Rust, trình bày một cách đầy đủ và chi tiết từ A-Z khi học Rust.
  • Slide Rust’s Ownership and Move Semantics: Một slide khá chi tiết trình bày về Ownership System của Rust.

Ngoài ra, các bạn có thể tham gia vào các cộng đồng Rust như:

  • Diễn đàn: Diễn đàn chính thức của Rust
  • IRC: Kênh IRC để hỏi các vấn đề khi học Rust
  • Bản tin This Week in Rust: Nơi cập nhật tin tức hàng tuần về Rust, những thư viện mới, những sự kiện sắp diễn ra,…
  • Rust Blog: Nơi core team của Rust đưa ra các thông báo mới nhất về ngôn ngữ này.
  • Reddit: Subreddit về Rust

For fun, bạn nên biết một số từ vựng nên biết trước khi gia nhập cộng đồng này :))

  • Rustacean: Là từ chỉ những người sử dụng Rust, giống như Gophers hay Rubyist hay Alchemist (của Elixir).
  • Rustlandia: Là khu vực mà các rustaceans hoạt động, cái này chắc chỉ có hội Rust mới có :))

Ngoài ra chúng ta cũng có cộng đồng Rust Việt Nam:

Hẹn gặp lại các bạn ở Rustlandia!!!

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

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

Xem thêm các việc làm ngành IT hấp dẫn trên TopDev

Cấu hình Spring Data JPA với @EnableJpaRepositories annotation

spring data
Cấu hình Spring Data JPA với @EnableJpaRepositories annotation

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

Trong bài viết Tổng quan về Spring Data JPA, mình đã giới thiệu với các bạn Spring Data JPA và cách cấu hình nó sử dụng tập tin XML. Có một cách khác để cấu hình Spring Data JPA đó là sử dụng các annotation mà nó hỗ trợ như @EnableJpaRepositories annotation. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

Chúng ta sẽ sử dụng Java 11 cho project này:

<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
</properties>
Spring Data JPA và Hibernate implementation dependencies như sau:

Mình sẽ sử dụng MySQL database để làm ví dụ:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>

Và Project Lombok nữa:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>

Để làm ví dụ và để đơn giản, mình định nghĩa 1 table trong database chứa thông tin sinh viên với 2 cột như sau:

CREATE TABLE `student` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

Entity của table này:

package com.huongdanjava.springdatajpa.entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Table(name = "student")
@Entity
@Getter
@Setter
public class Student implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@Column
private String name;
}

và Repository class cho nó nữa:

package com.huongdanjava.springdatajpa.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import com.huongdanjava.springdatajpa.entity.Student;

public interface StudentRepository extends JpaRepository<Student, Long> {

}

Bây giờ, mình sẽ tạo mới một class để cấu hình cho phần thao tác với database của ứng dụng sử dụng các class Repository của Spring Data JPA với annotation @EnableJpaRepositories như sau:

package com.huongdanjava.springdatajpa;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@Configuration
@EnableJpaRepositories(basePackages = {"com.huongdanjava.springdatajpa.repositories"})
public class DatabaseConfiguration {

}

Spring khi scan và gặp annotation @EnableJpaRepositories này sẽ tự động khởi tạo các đối tượng cần thiết để chúng ta có thể sử dụng các Repository của Spring Data JPA.

  Sử dụng EclipseLink thay thế Hibernate trong Spring Data JPA Starter
  Authentication trong Spring Security

Xem thêm tuyển dụng Spring hấp dẫn trên TopDev

Thuộc tính basePackages sẽ định nghĩa package mà chúng ta đã định nghĩa các Repository. Có 2 thuộc tính khác của annotation @EnableJpaRepositories mà chúng ta cần cấu hình nữa là entityManagerFactoryRef và transactionManagerRef. Giá trị của những thuộc tính này là tên bean được tạo trong Spring container, lần lượt là của EntityManagerFactory và TransactionManager. Giá trị mặc định của 2 thuộc tính này lần lượt là entityManagerFactory và transactionManager.

Cho EntityManagerFactory, các bạn sử dụng implementation là class LocalContainerEntityManagerFactoryBean như mình như sau:

@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("com.huongdanjava.springdatajpa.entity");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();

return factory.getObject();
}

Phương thức setPackagesToScan() khai báo package sẽ chứa các JPA entity của ứng dụng. Trong ví dụ của mình thì đó là package com.huongdanjava.springdatajpa.entity.

Phương thức setDataSource() sẽ cấu hình thông tin DataSource connect tới database, các bạn có thể khai báo một bean của DataSource với implementation là class DriverManagerDataSource như sau:

@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/jpa_example");
dataSource.setUsername("root");
dataSource.setPassword("123456");

return dataS

Các thông tin database trong cấu hình của DataSource các bạn nên lấy từ tập tin properties. Ở đây, để đơn giản nên mình hardcode những thông tin này các bạn nhé.

Bean cho TransactionManager, các bạn có thể khai báo như sau:

@Bean
public TransactionManager transactionManager() {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource());

return transactionManager;
}

Đến đây thì chúng ta đã cấu hình xong Spring Data JPA cho ứng dụng của mình.

Để kiểm tra kết quả, mình sẽ viết một class với main() method có nội dung như sau:

package com.huongdanjava.springdatajpa;

import java.util.Optional;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.huongdanjava.springdatajpa.entity.Student;
import com.huongdanjava.springdatajpa.repositories.StudentRepository;

public class Application {

public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(DatabaseConfiguration.class);

StudentRepository helloRepository = (StudentRepository) ac.getBean("studentRepository");
Optional<Student> student = helloRepository.findById(1L);

System.out.println(student.get().getName());
}

}

Giả sử trong database, mình đang có những thông tin như sau:

thì kết quả khi chạy ứng dụng sẽ như sau:

Tài liệu hay cho người làm đào tạo tại doanh nghiệp

đào tạo doanh nghiệp
Tài liệu hay cho người làm đào tạo doanh nghiệp

Bài viết được sự cho phép của tác giả Ánh Nguyệt 

Đợi đối tượng UI hoặc sự kiện với Selenium WebDriver

selenium webdriver
Đợi đối tượng UI hoặc sự kiện với Selenium WebDriver

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

Trong bài này, mình sẽ sử dụng mã Selenium WebDriver cho C#

Trong kiểm thử tự động, đôi khi tốc độ của công cụ kiểm thử tự động nhanh hơn tốc độ của ứng dụng cần kiểm thử (AUT/SUT) dẫn đến việc thực thi kiểm thử của chúng ta thất bại (Failed). Hầu hết các công cụ kiểm thử tự động đều hỗ trợ cho chúng ta cách để có thể chờ đợi một đối tượng UI hoặc một sự kiện của đối tượng UI xảy ra. Selenium WebDriver cung cấp cho chúng ta hai phương thức để làm việc này: Explicit (công khai) và Implicit (ngầm).

Chờ đợi Implicit

Chờ ngầm là việc sử dụng một thời gian nhất định để Selenium WebDriver cố gắng tìm một đối tượng UI trong trường hợp đối tượng UI không xuất hiện ngay lập tức. Giá trị mặc định là 0 giây, và giá trị này được gắn kèm với đối tượng IWebDriver. Một khi được thiết lập, giá trị này sẽ bắt đầu ảnh hưởng đến toàn bộ vòng đời của đối tượng IWebDriver, cho đến khi được thiết lập giá trị mới hoặc kết thúc đối tượng IWebDriver. Sau khi thiết lập giá trị này, trong các đoạn mã kiểm thử, chúng ta không cần phải thêm bất kỳ câu lệnh nào nữa. Việc chờ đợi được đối tượng IWebDriver quản lý. Đây cũng là lý do mà chúng ta gọi là chờ “ngầm” :).

Cách thiết lập cho việc chờ này như sau:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

Đối số của hàm ImplicitlyWait là một đối tượng TimeSpan của C#, và chúng ta hoàn toàn toàn quyền thiết lập giá trị tối đa cho việc chờ đợi trước khi trả về lỗi Không-Tìm-Thấy-Đối-Tượng.

Chờ đợi Explicit

Chờ đợi công khai là một phương thức chèn mã ngay trong kịch bản kiểm thử tự động của chúng ta, đặc biệt để đợi một sự kiện của đối tượng UI. Đối với việc chờ ngầm, chúng ta chỉ đợi một sự kiện là đối tượng UI xuất hiện trên trang, hay đúng hơn là trong mã nguồn HTML của trang web. Sử dụng phương thức công khai, chúng ta có thể chờ đợi những sự kiện đặc biệt khác của đối tượng UI, như hiển thị, sẵn sàng để sử dụng, thay đổi kích thước, vị trí, v.v… Chúng ta đặc biệt sử dụng cách này khi tương tác với các đối tượng UI Ajax, vì những đối tượng này thường thay đổi trạng thái khi máy chủ/máy khách hoạt động.

Với cách này, chúng ta cần một đối tượng trong Selenium WebDriver để quản lý thời gian chờ đợi, WebDriverWait. Cách viết mã cho việc này như sau:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementToBeClickable([IWebElement]));

  Download, Export file tự động với Selenium Webdriver
  Giới thiệu công cụ kiểm thử tự động Selenium

Xem thêm tuyển dụng ReactJS hấp dẫn trên TopDev

Đối tượng ExpectedConditions

Để việc sử dụng phương thức chờ đợi công khai này dễ dàng hơn, Selenium WebDriver hỗ trợ chúng ta đối tượng ExpectedConditions, dùng cho việc khai báo các điều kiện chờ đợi trong từng trường hợp cụ thể.

Các điều kiện chờ thường sử dụng:

  • ElementExists: đợi một đối tượng UI tồn tại trong mã HTML của trang web
  • ElementIsVisible: đợi một đối tượng UI hiển thị trên trang
  • ElementToBeClickable: đợi một đối tượng UI sẵn sàng được tương tác
  • TextToBePresentInElement: đợi một đối tượng UI với một đoạn chữ mong muốn
  • FrameToBeAvailableAndSwitchToIt: đợi một đối tượng Frame sẵn sàng tương tác

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

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

Xem thêm các việc làm ngành IT hấp dẫn trên TopDev

Todo List: Xây dựng trang nội dung chi tiết

todo list
Todo List: Xây dựng trang nội dung chi tiết

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

Video trong bài viết

Khái niệm Laravel Route đã được giới thiệu đến các bạn xuyên suốt qua những bài đầu tiên của Khóa học Laravel cơ bản, tuy nhiên mới dừng lại ở mức cơ bản nhất khi đây là những đường dẫn cố định cho một loại nội dung. Ví dụ như ở bài số 2, chúng ta có trang about với đường dẫn /about và bài số 7, chúng ta có trang danh sách todos với đường dẫn /todos. Tuy nhiên, trong ứng dụng không phải lúc nào đường dẫn này cũng là cố định cho một loại nội dung.

Dynamic route là gì?

Đường dẫn động (dynamic route) là đường dẫn thay đổi cho cùng một loại nội dung. Ví dụ như trong trang All Laravel bạn đang xem, chúng ta thấy đường dẫn mỗi bài viết sẽ gồm hai phần:

  • Phần cố định: /blog/
  • Phần động: /tieu-de-bai-viet/

Do vậy, các đường dẫn của bài viết chi tiết là các đường dẫn động. Như vậy làm cách nào để khai báo các đường dẫn này trong Laravel, chẳng lẽ chúng ta có 100 bài viết thì phải khai báo 100 đường dẫn tương ứng trong routes/web.php?

Route::get('/blog/bai-viet-1', function(){
    return view('bai-viet-1');
});
Route::get('/blog/bai-viet-2', function(){
    return view('bai-viet-2');
})
...
Route::get('/blog/bai-viet-n', function(){
    return view('bai-viet-n');
})

Thiết lập Dynamic route trong Laravel

Trong Laravel Route, cho phép chúng ta đưa vào các tham số giúp cho đường dẫn có nội dung thay đổi theo nội dung của trang. Trong ví dụ tiếp theo chúng ta sẽ đi vào trang chi tiết của công việc cần làm, thiết lập routes/web.php như sau:

Route::get('todos/{todo}', 'TodosController@show');

Trong đường dẫn trên chúng ta có hai phần:

  • Phần cố định: ‘todos’
  • Phần động: {todo}

Trong Laravel, phần động của đường dẫn được khai báo theo cấu trúc {ten_tham_so}. Như vậy, khi chúng ta vào đường dẫn nào có cấu trúc kiểu như /todos/phat-trien-todo, khi xử lý qua routes/web.php nó sẽ truyền giá trị ‘phat-trien-todo’ vào tham số {todo}.

  API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth
  Todo App Flutter – Real Code

Xem thêm tuyển dụng Laravel hấp dẫn trên TopDev

Mặc định, Laravel sẽ truyền tham số động của Route vào trong phương thức của Controller đã được khai báo trong Route. Để kiểm chứng, chúng ta tạo ra phương thức show() trong TodosController với nội dung sau:

public function show($todoId)
{
    return $todoId;
}

Bây giờ bạn thử thực hiện một đường dẫn, ví dụ như http://localhost:8000/todos/hoc-laravel-co-ban-o-allaravel

Test đường dẫn động

Kết quả là phần động trong đường dẫn đã truyền đến Controller và được hiển thị ra. Chúng ta cùng xem lại đường đi của nó như sau:

  1. URL http://localhost:8000/todos/hoc-laravel-co-ban-o-allaravel được thực hiện trên trình duyệt.
  2. Laravel kiểm tra trong routes/web.php xem có đường dẫn nào phù hợp thì ở đây thấy /todos/{todo} trùng khớp. Giá trị hoc-laravel-co-ban-o-allaravel được xem là giá trị tham số của Route.
  3. Giá trị tham số {todo} được truyền vào ‘TodosController@show’.
  4. Trong phương thức show() của TodosController có tham số vào là $todoId, lấy giá trị này và trả về cho người dùng.

Trong ứng dụng Todo List, chúng ta sẽ thực hiện hiển thị các thông tin todo chi tiết với đường dẫn /todos/1, /todos/2… ở đây chúng ta sử dụng phần động là id của todo vì các todo có tên có thể giống nhau. Ví dụ: công việc ‘Học Laravel cơ bản ở Allaravel” có thể lặp đi lặp lại nên chúng ta chỉ sử dụng id vì nó là duy nhất.

Toàn bộ các công đoạn chúng ta đã thực hiện xong, giờ chỉ cần xử lý trong phần phương thức show() của app\Http\Controllers\TodosController.php:

public function show($todoId)
{
    return view('todos.show')->with('todo', Todo::find($todoId));
}

Sau khi nhận được ID của todo từ đường dẫn, nó được truyền vào phương thức show() và chúng ta sẽ sử dụng nó để tìm Todo cụ thể trong database. Sau đó, Todo tìm được sẽ được truyền tiếp vào view ‘todos.show’. Tuy nhiên, đến giờ chúng ta chưa tạo view này nên nếu truy cập vào http://localhost:8000/todos/1 chẳng hạn bạn sẽ thấy lỗi “View todos.show not found” mặc dù Todo có ID = 1 kiểm tra có trong database.

Tạo thêm view resources/views/todos/show.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>Todos</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <h1 class="text-center my-5">{{ $todo->name }}</h1>
        <div class="row justify-content-center">
        <div class="col-md-6">
        <div class="card card-default">
            <div class="card-header">
                Details
            </div>

            <div class="card-body">
                {{ $todo->description }}
            </div>
        </div>
    </div>
</body>
</html>

Trong view này chúng ta thấy có những đoạn sử dụng biến todotrongcutrúccaLaravelBladeđinragiátrbiuthctrongngocvàtodotrongcấutrúccủaLaravelBladeđểinragiátrịbiểuthứctrongngoặcvàtodo là biến được truyền vào view ở đoạn code return trong phương thức show().

Kết quả khi vào thử một Todo nào đó, ví dụ Todo có ID=1 chẳng hạn ta được kết quả.

Hiển thị Todo chi tiết

Code: Bài 9 – Đường dẫn động trong Laravel

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

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

Xem thêm các việc làm ngành IT hấp dẫn trên TopDev

CV xin việc gồm những gì? Cách viết CV tạo sự khác biệt cho bạn

cv xin việc gồm những gì
CV xin việc gồm những gì? Làm thế nào để tạo sự khác biệt cho CV của bạn?

CV ngày nay đã trở thành một công cụ quen thuộc được sử dụng trong quá trình ứng tuyển và tìm việc. Ứng viên dùng CV để tìm kiếm công việc, và nhà tuyển dụng dùng CV để đánh giá ứng viên. Vậy một CV xin việc gồm những gì thì sẽ đáp ứng được yêu cầu của cả hai bên? Bài viết này sẽ giúp bạn làm rõ thêm vấn đề này.

cv xin việc gồm những gì
Các thông tin cần có trong CV

CV là gì?

CV – Curriculum Vitae, hiểu theo nghĩa tiếng Việt chính là sơ yếu lý lịch của ứng viên. Trên CV hiện tại về cơ bản sẽ bao gồm các thông tin như: giới thiệu bản thân, kinh nghiệm làm việc, trình độ học vấn cũng như các kỹ năng chuyên môn của bản thân. Các thông tin mà ứng viên đề cập đến trong CV chính là dữ liệu đầu tiên để nhà tuyển dụng xem xét và quyết định lựa chọn ứng viên đi đến vòng phỏng vấn.

Vì đây là bước đầu tiên để ứng viên có thể tạo ấn tượng với nhà tuyển dụng nên đừng bao giờ tỏ ra thờ ơ hay thiếu chăm chút với các thông tin trong CV của bạn nhé. Trong bài viết này sẽ giới thiệu với các bạn những thông tin bắt buộc phải có, nên có trong CV để việc tìm kiếm công việc mới diễn ra thuận lợi hơn.

>>> Xem thêm: Viết CV IT Developer như thế nào là chuẩn?

Thông tin trong CV xin việc gồm những gì?

Muốn gây ấn tượng, trước khi cố gắng tạo ra sự khác biệt bạn cần đảm bảo đã cung cấp đủ những gì nhà tuyển dụng cần. Các thông tin chia sẻ dưới đây sẽ cho bạn biết những thông tin cần có trong CV của mình.

1. Thông tin cá nhân

Vì có vai trò như một sơ yếu lý lịch chính vì thế ứng viên cần cung cấp đầy đủ các thông tin cá nhân cho nhà tuyển dụng. Các thông tin này thường sẽ bao gồm:

  • Họ và tên đầy đủ của bản thân
  • Ngày tháng năm sinh
  • Nơi sinh sống hiện tại
  • Số điện thoại liên lạc
  • Địa chỉ email

Các thông tin này thường được viết đầu tiên và ở trên cùng trong bố cục CV để nhà tuyển dụng dễ dàng quan sát được. Chẳng hạn địa chỉ nhà bạn quá xa với công ty thì có thuận tiện khi đi làm hay không, hoặc độ tuổi của ứng viên có đáp ứng được yêu cầu của công ty hay không… Nếu không thỏa mãn những điều kiện này, CV sẽ được bỏ qua mà không xem tiếp đến các thông tin tiếp theo.

>>> Xem thêm Một Bộ Hồ Sơ Xin Việc Qua Email Có Những Gì?

2. Kinh nghiệm làm việc

Thông tin này bắt buộc phải xuất hiện trong tất cả mọi CV. Với trường hợp bạn là sinh viên mới tốt nghiệp chưa có kinh nghiệm làm việc thực tế tại một công ty ở vai trò chính thức nào thì các thông tin này nên được thay thế bằng kinh nghiệm tham gia các hoạt động khi còn ở trường đại học hoặc việc làm thêm.

Mục đích chính của phần thông tin về kinh nghiệm làm việc là để nhà tuyển dụng có thể dễ dàng quan sát và nắm bắt được những kinh nghiệm bạn sở hữu có đáp ứng được vị trí mà họ đang tuyển hay không. Chính vì thế hãy liệt kê những kinh nghiệm cần thiết thay vì liệt kê một cách dàn trải tất cả mọi thứ. Mục kinh nghiệm làm việc quá dài dòng và dàn trải nhiều thông tin sẽ không được nhà tuyển dụng đánh giá cao.

thông tin trong cv

3. Trình độ học vấn và các chứng chỉ

Trong thông tin này, ứng viên nên đề cập đến việc mình đang học trường nào, đã tốt nghiệp hay chưa và chuyên ngành mình đã theo học. Ngoài ra, nếu đang theo học các khóa học chuyên môn có liên quan đến công việc cũng có thể đề cập đến trong CV như một cách để thể hiện năng lực của bạn.

Thông thường trong phần thông tin học vấn, ứng viên sẽ điền tên trường, ngành theo học và thời gian học (nên điền năm bắt đầu và năm tốt nghiệp). Nếu điểm GPA tốt nghiệp cao bạn hoàn toàn có thể thêm vào trong CV để tạo ấn tượng với nhà tuyển dụng.

Hoặc trong thời gian học, bạn có tham gia nghiên cứu khoa học hay thực hiện các đề án nghiệp vụ có tính chất phục vụ cho công việc mình đang ứng tuyển thì cũng có thể thêm vào trong CV. Một bằng cấp khác quan trọng không kém là chứng chỉ tiếng Anh và tin học. Ứng viên có thể điền thông tin chứng chỉ vào CV nếu cảm thấy cần thiết.

Tạo CV online nhanh chóng, đẹp dành cho dân IT

4. Các kỹ năng chuyên môn

Về kỹ năng chuyên môn, có một sai lầm mà nhiều người mắc phải là tự đưa ra các kỹ năng và thang điểm cho kỹ năng đó của mình. Thực tế thì việc làm này không thể hiện tính khách quan và không có bất cứ tiêu chuẩn nào cho việc chấm điểm đó của bạn cả. Vậy nên hãy từ bỏ cách trình bày kỹ năng như thế này trong CV của mình.

Thay vào đó, hãy liệt kê những kỹ năng quan trọng và theo bạn, là cần thiết cho công việc mà bạn đang ứng tuyển. Chẳng hạn, với vị trí ứng tuyển liên quan đến công việc của lập trình viên, bạn nên trình bày các kỹ năng liên quan đến kỹ thuật như ngôn ngữ lập trình có thể sử dụng,… Kết hợp thêm với một số kỹ năng mềm khác sẽ giúp bạn dễ dàng hơn trong việc chinh phục nhà tuyển dụng.

>>> Xem thêm: Cách viết phần kỹ năng “chất như nước cất” cho CV của bạn

5. Mục tiêu trong công việc

Nội dung này có thể được chia sẻ ngắn gọn trong vài dòng để nhà tuyển dụng có thể thấy được mục tiêu ngắn hạn và dài hạn của bạn trong công việc này là gì, định hướng phát triển của bạn trong tương lai ra sao.

Tuy nhiên, cũng có nhiều ứng viên lựa chọn không chia sẻ về mục tiêu công việc trong CV. Điều này hoàn toàn phụ thuộc vào mong muốn của bạn, nếu CV đã quá dài thì có thể lược bỏ bớt phần thông tin này và trao đổi chi tiết hơn khi đến với buổi phỏng vấn.

  Mẫu CV IT tiếng Anh hấp dẫn nhà tuyển dụng

Hiện nay, có khá nhiều công cụ tạo CV miễn phí khác nhau mà ứng viên có thể tham khảo. Với TopDevCV, các ứng viên trong lĩnh vực CNTT có thể dễ dàng tạo được cho mình chiếc CV với đầy đủ các thông tin cần thiết với vai trò là một lập trình viên.

>>> Xem thêm: Mẫu CV IT Administrator chuẩn nhất 2024

Tất cả các mẫu CV đều được chọn lọc từ mẫu của các devs nổi tiếng và hệ thống hóa thành những trường thông tin cần thiết cho các nhà tuyển dụng dễ dàng theo dõi và đánh giá ứng viên. Biết sử dụng công cụ tạo CV hợp lí và biết một CV xin việc gồm những gì là cách nhanh nhất để bạn chinh phục nhà tuyển dụ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 tuyển dụng các vị trí IT hấp dẫn trên TopDev

MySQL là gì? Giải đáp chi tiết và hướng dẫn cài đặt MySQL

mysql
Giới thiệu về MySQL

MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở được sử dụng rất rộng rãi trên toàn thế giới, được phát triển bởi Oracle Corporation và hiện đang được phát hành miễn phí. Bài viết này của TopDev sẽ giới thiệu chi tiết về MySQL là gì, lịch sử phát triển cũng như những tính năng quan trọng của MySQL và xem MySQL có gì khác với SQL Server.

MySQL là gì?

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ (Relational Database Management System – RDBMS) mã nguồn mở, được sử dụng rộng rãi để lưu trữ, quản lý và truy xuất dữ liệu. MySQL hoàn toàn miễn phí nằm trong nhóm LAMP (Linux – Apache – MySQL – PHP).

MySQL đọc như thế nào? Một số người sẽ đọc là My Sequel một số khác lại phát âm chúng là MY-ES-KYOO-EL. Cả hai cách đọc trên đều đúng và những ai đã biết đến MySQL đều sẽ hiểu.

Vì hệ quản trị cơ sở dữ liệu MySQL ổn định và dễ sử dụng, có tính khả chuyển, hoạt động trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rất mạnh và Mysql cũng có cùng một cách truy xuất và mã lệnh tương tự với ngôn ngữ SQL chính vì thế nên MySQL được sử dụng và hỗ trợ của những lập trình viên yêu thích mã nguồn mở.

Nhưng MySQL không bao quát toàn bộ những câu truy vấn cao cấp như SQL Server. Vì vậy MySQL chỉ đáp ứng việc truy xuất đơn giản trong quá trình vận hành của website, thích hợp cho các ứng dụng có truy cập CSDL trên internet và có thể giải quyết hầu hết các bài toán trong PHP, Perl.

MySQL có nhiều phiên bản cho các hệ điều hành khác nhau: phiên bản Win32 cho các hệ điều hành dòng Windows,Linux, Mac OSX, Unix, FreeBSD, NetBSD, Novell NetWare, SGI Irix, Solaris, SunOS,…

MySQLlà một trong những ví dụ rất cơ bản về Hệ Quản trị Cơ sở dữ liệu quan hệ sử dụng Ngôn ngữ truy vấn có cấu trúc (SQL).

Lịch sử hình thành và phát triển của MySQL

MySQL được phát triển vào năm 1994 bởi công ty Thụy Điển MySQL AB. Sau khi trải qua nhiều giai đoạn phát triển và chuyển giao, với những cột mốc quan trọng như việc trở thành mã nguồn mở vào năm 2000, sau đó Sun Microsystems đã mua lại MySQL vào năm 2008. Nhưng sau đó chỉ hai năm gã khổng lồ Oracle đã giữ quyền sở hữu MySQL vào năm 2010

Sự ra đời của MariaDB như một “fork” của MySQL đã tạo ra một cuộc cạnh tranh lành mạnh, thúc đẩy cả hai hệ thống không ngừng cải tiến. Nhờ tính năng mã nguồn mở, hiệu suất cao, dễ sử dụng và cộng đồng lớn, MySQL đã trở thành một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất thế giới, được sử dụng rộng rãi trong các ứng dụng web và các hệ thống lưu trữ dữ liệu.

Đọc thêm: So sánh MySQL và MariaDB

Đặc điểm của MySQL

Đặc điểm của MySQL

  • Hiệu suất cao và khả năng mở rộng: MySQL được tối ưu hóa để xử lý một lượng lớn dữ liệu một cách nhanh chóng và hiệu quả. Hệ thống có thể dễ dàng mở rộng để đáp ứng nhu cầu lưu trữ và xử lý dữ liệu ngày càng tăng.
  • Bảo mật và tính toàn vẹn dữ liệu: MySQL cung cấp các tính năng bảo mật mạnh mẽ như xác thực người dùng, phân quyền, mã hóa dữ liệu và phát hiện xâm nhập, giúp bảo vệ dữ liệu khỏi các mối đe dọa an ninh.
  • Tính linh hoạt và tùy biến cao: MySQL hỗ trợ nhiều nền tảng, nhiều loại engine lưu trữ và cho phép người dùng tùy chỉnh cấu hình để phù hợp với nhu cầu cụ thể của ứng dụng.
  • Cộng đồng lớn và hỗ trợ mạnh mẽ: MySQL có một cộng đồng người dùng rất lớn, sẵn sàng chia sẻ kinh nghiệm và giải đáp thắc mắc.
  • Mã nguồn mở: MySQL là một phần mềm mã nguồn mở, người dùng có thể tự do sử dụng, sửa đổi và phân phối.
  • Cơ chế quản lý dữ liệu: MySQL quản lý dữ liệu thông qua các cơ sở dữ liệu (database). Mỗi cơ sở dữ liệu có thể chứa nhiều bảng (table), mỗi bảng lưu trữ một loại dữ liệu cụ thể. Các bảng được liên kết với nhau thông qua các khóa (key) để tạo thành các mối quan hệ.
  • Cơ chế phân quyền: MySQL có cơ chế phân quyền người dùng rất chi tiết. Mỗi người dùng có thể được cấp quyền truy cập đến một hoặc nhiều cơ sở dữ liệu, với các quyền hạn khác nhau như đọc, ghi, sửa đổi cấu trúc bảng, v.v.
  • Ngôn ngữ SQL: MySQL sử dụng ngôn ngữ SQL (Structured Query Language) để tương tác với dữ liệu. SQL là ngôn ngữ chuẩn để truy vấn, cập nhật, xóa và quản lý dữ liệu trong các hệ quản trị cơ sở dữ liệu quan hệ.

Xem thêm: Lộ trình học MySQL cơ bản từ A-Z

Xem thêmcác việc làm MySQL lương caotrênTopDev

MySQL hoạt động ra sao?

MySQL hoạt động theo mô hình client-server, nghĩa là có một máy chủ (server) lưu trữ phần mềm MySQL và các cơ sở dữ liệu, và có các máy khách (client) gửi yêu cầu đến máy chủ để thực hiện các thao tác với cơ sở dữ liệu.

MySQL sử dụng ngôn ngữ SQL để thực hiện các tác vụ. Các câu lệnh SQL là các lệnh được gửi đến máy chủ MySQL để đọc, thao tác hoặc kiểm soát dữ liệu được lưu trữ trong các cơ sở dữ liệu của nó. Ví dụ, lệnh SELECT được sử dụng để lấy dữ liệu từ cơ sở dữ liệu. Để thêm dữ liệu mới, lệnh INSERT được sử dụng. Tương tự, các lệnh DELETE và UPDATE được sử dụng để xóa hoặc cập nhật dữ liệu hiện có.

Trong mô hình client-server, máy khách thiết lập kết nối với máy chủ thông qua mạng. Kết nối này cho phép người dùng truy cập vào các cơ sở dữ liệu trên server và thực hiện các thao tác trên chúng bằng cách sử dụng các câu lệnh SQL. Khi một request từ giao diện người dùng (Graphical user interface – GUI), server sẽ phản hồi thông tin và trả về kết quả trên máy client. Quá trình này được minh họa qua sơ đồ sau:

MySQL hoạt động ra sao?

Bài viết liên quan: So sánh MySQL và MongoDB: Nên chọn CSDL nào?

Cách cài đặt MySQL trên hệ điều hành Windows

MySQL có 2 phiên bản:

  • MySQL Community Server: Phiên bản miễn phí, mã nguồn mở, phù hợp cho hầu hết các mục đích sử dụng.
  • MySQL Enterprise Edition: Phiên bản trả phí, cung cấp các tính năng nâng cao và hỗ trợ kỹ thuật chuyên nghiệp.

Dưới đây TopDev sẽ hướng dẫn bạn cài đặt phiên bản Community miễn phí.

Bước 1: Tải về trình cài đặt MySQL

  1. Truy cập trang web official của MySQL chọn MySQL Community(GPL) Download, sau đó chọn tiếp MySQL Community Server. Link download
  2. Chọn hệ điều hành Windows và click tải phiên bản MySQL phù hợp (32-bit hoặc 64-bit).
  3. Click vào nút tải xuống và lưu file cài đặt vào máy tính.

Tải về trình cài đặt MySQL

Bước 2: Thực hiện cài đặt MySQL

Sau khi tải xuống, đến thư mục chứa file vừa tải về và nhấp đúp vào file .msi bạn vừa tải xuống. Sẽ mất vài phút để Windows cấu hình trình cài đặt.

Choosing a Setup Type: từ cửa sổ cài đặt MySQL, bạn sẽ cần chọn một loại thiết lập để cài đặt phù hợp với nhu cầu sử dụng. Nếu bạn chưa rõ nhu cầu của mình có thể chọn Full.

cài đặt MySQL

Tiếp theo nhấp vào nút Execute để bắt đầu cài đặt tất cả các set up bạn đã lựa chọn.

tìm hiểu MySQL

Sau khi complete, nhấn Next để qua bước tiếp theo.

Type and Networking: Chọn type trong phần Config Type, ở đây chúng tôi để chế độ mặc định là Developement Computer. Bạn cũng có thể cấu hình các cổng TCP/IP để kết nối với SQL bằng cách tích vào ô tùy chọn đó. Trong trường hợp bạn không chắc chắn, tốt nhất là để nguyên cài đặt mặc định. Nhấp vào nút ‘Next’ để tiếp tục.

hướng dẫn cài đặt mysql

Authentication Method: Chọn Use Strong Password Encryption for Authentication nếu bạn đang tạo máy chủ mới từ đầu.

my sql

Account and Roles: ở mục này bạn sẽ cần tạo mật khẩu cho tài khoản gốc của mình. Bạn cũng có thể tạo Tài khoản người dùng và phân quyền, nhấp vào nút ‘Add user’ để thực hiện. Sau khi tạo xong, nhấn Next để đến bước tiếp theo

mysql là gì

Windows Service: Các tùy chọn mặc định sẽ được chọn để chạy SQL Server dưới dạng Windows Service. Nếu bạn không muốn chạy dưới dạng Windows Service, hãy nhấp vào hộp kiểm trước Configure MySQL Server as a Windows Service để bỏ chọn và tự cấu hình ở giai đoạn sau.

hệ quản trị cơ sở dữ liệu mysql

Appy Configuration: nhấp vào nút Execute để áp dụng các thiết lập cấu hình.

my sql là gì

MySQL Router Configuration: MySQL Router là một công cụ hữu ích giúp định tuyến lưu lượng giữa các ứng dụng MySQL của bạn và cụm InnoDB. Điều này đặc biệt hữu ích khi bạn đang làm việc với các cấu hình phức tạp hơn, chẳng hạn như các cụm cơ sở dữ liệu phân tán. Nếu bạn không cần đến MySQL Router, chỉ cần nhấp vào nút “Finish” để kết thúc quá trình cài đặt.

cơ sở dữ liệu mysql

Ở màn hình tiếp theo, nhấp vào nút Next để tiếp tục.

Connect to Server: Nhập mật khẩu mà bạn đã đặt khi cấu hình máy chủ và nhấp vào nút ‘Check’ để kiểm tra kết nối.

mysql là phần mềm gì

Khi kết nối tới máy chủ thành công, hãy nhấp vào nút ‘Tiếp theo’ để tiếp tục.

mysql là gì?

Sau đó, trên màn hình Apply Configuration, nhấp vào nút Execute.

giới thiệu về mysql

Sau khi cấu hình được áp dụng, hãy nhấp vào nút Finish để tiếp tục.

Tiếp theo ở bước Product Configuration nhấp vào nút Next để tiếp tục.

mysql la gi

Vậy là quá trình cài đặt MySQL hiện đã hoàn tất, ở cửa sổ cuối cùng bạn chỉ cần bấm Finish là xong.

phần mềm mysql

Bước 3: Kiểm tra cài đặt

  1. Mở cửa sổ lệnh: Nhấn tổ hợp phím Windows + R, nhập “cmd” và nhấn Enter.
  2. Kết nối đến MySQL: Nhập lệnh sau và thay thế “mật_khẩu_của_bạn” bằng mật khẩu root mà bạn đã đặt trong quá trình cài đặt:
mysql -u root -p
  1. Nhập mật khẩu: Nhập mật khẩu và nhấn Enter. Nếu bạn kết nối thành công, bạn sẽ thấy dấu nhắc của MySQL.

Trên đây là cách cài đặt MySQL cho Windown cực kì chi tiết. Nếu bạn vẫn còn gặp khó khăn hay cần giải thích thêm MySQL là gì? Đừng ngần ngại liên hệ với ban biên tập của TopDev chúng tôi sẽ giải đáp giúp bạn. Theo dõi TopDev để cập nhật hàng ngày kiến thức công nghệ mới nhất.

Nguồn tham khảo: https://allthings.how/how-to-install-mysql-on-windows-11/

Bài viết liên quan:

Xem thêm các việc làm ngành CNTT hấp dẫn trên TopDev

Dùng Vim làm REST API client

rest api client
Dùng Vim làm REST API client

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

Thường thì khi cần test API, chúng ta sẽ dùng các HTTP client như là Postman, tuy nhiên cái này có một nhược điểm đó là nó… xài GUI.

Và một Vim user chân chính sẽ rất là không thoải mái nếu cứ phải nhảy qua nhảy lại giữa màn hình terminal và một ứng dụng GUI củ chuối nào đó.

Một giải pháp để bạn vẫn được yên phận với màn hình terminal đen ngòm đó là dùng curl.

Tuy nhiên đời chỉ đẹp nếu ta xài curl với những request đơn giản, vài ba params nho nhỏ. Trong trường hợp một request có hàng chục parameters, hoặc truyền vào vài ba cái header mỗi cái dài hơn trăm kí tự thì chắc không ai đủ kiên nhẫn để xài curl nữa.

Trước thực trạng nhức nhối này thì mình tính viết một plugin cho Vim để xài, ý tưởng là viết sẵn cấu trúc của một request vào buffer của Vim, rồi bấm nút 1 phát cho nó tự gọi curl thay mình.

Rất may cho sếp của mình, vì mình đã tìm được một plugin người ta viết sẵn trên mạng, nên mình ko cần ngồi làm việc riêng trong giờ làm việc nữa.

Mà còn điều này nữa, thực ra nãy giờ bạn không cần phải đọc những gì mình viết trên kia đâu, vì đây mới bắt đầu phần chính nè :v

Plugin: Vim Rest Console

vim-rest-console là một plugin giúp gửi/nhận request tới RESTAPI server, rất tiện dụng để test ngay trong Vim.

Plugin này có thể xài thoải mái với Vim và Neovim, miễn là máy tính cần có curl.

Cài đặt

Cài với các plugin manager như VimPlug hay Vundle:

Plug 'diepm/vim-rest-console'

Hoặc nếu bạn xài pathogen thì cài theo cách sau:

cd ~/.vim/bundle
git clone https://github.com/diepm/vim-rest-console.git
  8 thủ thuật khi làm việc với Object sử dụng resting và spreading
  API là gì? Các nguyên tắc xây dựng Rest API

Xem thêm các việc làm Linux hấp dẫn trên TopDev

Sử dụng

Bạn có thể mở vim ra và gõ ngay hoặc tạo một file có đuôi .rest để dùng hoặc tiện lưu lại về sau.

Nếu mở buffer trực tiếp thì có thể dùng lệnh sau để có syntax highlighting:

:set ft=rest

Sau đó gõ cấu trúc request theo dạng:

http(s)://<host>:<port>
<danh sách header nếu có>
<METHOD> <endpoint>
<request body>

Ví dụ:

https://facebook.com/api/v1
Content-Type: application/json
Pragma: no-cache
POST /delete_user/
{
  "username": "markzuck"
}

Nếu bạn muốn gửi một POST request đến https://facebook.com/api/v1/delete_user với request body là username: markzuck.

Sau khi gõ xong nội dung request, nhấm Ctrl + J để bắt đầu gửi request đi.

Vim sẽ tạo ra một split mới để hiện kết quả request. Rất là tiện lợi.

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

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

Tổng hợp mẫu CV cho sinh viên IT mới ra trường 2024

CV cho sinh viên IT mới ra trường
CV cho sinh viên IT mới ra trường

Ứng viên IT mới ra trường có những lợi thế nhất định trong việc tìm kiếm nghề nghiệp. Thế nhưng, để thuận lợi chinh phục nhà tuyển dụng, CV dành cho sinh viên IT mới ra trường (CV IT student) thật sự quan trọng. Hiện nay, có rất nhiều nền tảng hướng dẫn cách viết và lựa chọn CV IT phù hợp, song vẫn còn nhiều bất cập? Cùng TopDev điểm qua các mẫu CV chất lượng cho sinh viên IT mới ra trường qua bài viết sau.

Mẫu CV chuẩn – chất lừ cho ứng viên IT mới

cv xin việc cntt
CV cho sinh viên IT mới ra trường (CV IT student) cần đảm bảo các nội dung cơ bản nhất.

Những điều các sinh viên ngành IT mới ra trường (CV IT student)  cần nắm trước hết là một CV đúng chuẩn. Một CV xin việc CNTT chuẩn chất lượng sẽ gồm các thông tin cơ bản sau: 

Profile cá nhân

Mục này bạn sẽ điểm qua các thông tin cá nhân như: Họ và tên, địa chỉ liên hệ, số điện thoại, Email,…

Mục tiêu nghề nghiệp

Nội dung này cần bạn truyền tải đầy đủ và đúng trọng tâm vấn đề. Cụ thể, bạn trình bày súc tích 2 mục tiêu: Ngắn hạn và dài hạn.

Hãy cố gắng thể hiện mục tiêu của mình gần với mục tiêu phát triển của công ty. Một điểm quan trọng cần lưu tâm: Nên hoạch định ra một vị trí bạn muốn trở thành trong tương lai thay vì đề cập chung chung, mơ hồ. Điều này giúp cho nhà tuyển dụng sẽ đánh giá cao CV cho sinh viên IT mới ra trường (CV IT student).

Trình độ học vấn

Ghi rõ tên trường học, nơi đào tạo đã và đang học tập. Tùy theo từng vị trí ứng tuyển cụ thể mà bạn nên cân nhắc thêm vào các yếu tố như:

+ Các khóa học chuyên ngành

+ Những dự án phát triển kỹ năng

+ Các chứng chỉ chuyên môn

Kinh nghiệm làm việc

Cho dù bạn viết CV IT tiếng anh (CV English IT/CV IT student) hay CV IT tiếng việt, bạn vẫn phải đầu tư cho mục nội dung này. Hầu như 80% nhà tuyển dụng sẽ soi kỹ phần kinh nghiệm của bạn. Hãy viết và trình bày nội dung một cách chuyên nghiệp, chân thật và cẩn thận.

Đồng thời, viết CV giúp bạn định hình và có những trải nghiệm tốt hơn. Trường hợp bạn ứng tuyển các vị trí khác như freelancer it hay Senior Developer đều sẽ đạt hiệu quả ứng tuyển cao hơn.

Một tip quan trọng, bạn có thể vận dụng bí quyết STAR để chia sẻ về các kinh nghiệm trong CV của mình. Đây thật sự là một chiến lược tốt cho chiếc CV IT của bạn đấy! 

Cụ thể, hãy đi từ tại sao bạn nhận được công việc đó? Công việc đó là gì, quy mô ra sao? Bạn đã làm những gì khi trực tiếp/gián tiếp thực hiện dự án? Kết quả và bài học đạt được sau quá trình làm việc?

Kỹ năng

Đối với CV cho dân IT, bạn nên thành thật chia sẻ về các kỹ năng mà bạn biết. Một ứng viên mới không nên nói khoác về năng lực của mình. 

Dựa vào nhu cầu tuyển dụng, bạn sẽ có sự linh động trong việc lựa chọn, bổ sung các nhóm kỹ năng sau đây: Kỹ năng chuyên môn, kỹ năng mềm và kỹ năng chuyên sâu. Đó cũng chính là lý do tại sao CV IT Administrator, CV IT Manager,… đều có các yêu riêng biệt về những kỹ năng cần có.

Tạo CV online nhanh chóng, đẹp dành cho dân IT

Những điểm cần lưu ý ghi viết CV cho sinh viên IT mới ra trường (CV IT student)

Dưới đây là những điểm ứng viên nên note lại khi viết CV IT student:

+ Check lại lỗi chính tả

+ Format chuẩn, bố cục rõ ràng

+ CV IT cần được gửi dưới dạng PDF

Các mẫu CV cho sinh viên IT mới ra trường trên TopDev

cv cho sinh viên mới ra trường
Mẫu 1
mẫu cv cho sinh viên it mới ra trường
Mẫu 2
mẫu cv cho sinh viên it mới ra trường
Mẫu 3

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:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Các tố chất cần có của người làm Nhân sự

tố chất nghề nhân sự
Các tố chất cần có của người làm Nhân sự
Bài viết được sự cho phép của hrvnacademy.com
Nghề Nhân sự là một nghề nghiệp khá đặc thù, nó đòi hỏi sự chính xác và đồng nhất khi trao đổi thông tin từ tất cả các bộ phận/phòng ban.

Chào mừng các bạn đang đến với series các bài học trong Khóa học Nhân sự cơ bản cho người mới (newbie) hoàn toàn miễn phí. Tôi là Thành HR sẽ đồng hành cùng bạn trong khoá học này. Và chủ đề mà chúng ta cùng nhau tìm hiểu ngày hôm nay là Các tố chất cần có của người làm Nhân sự.

Như mình đã chia sẻ, Nghề Nhân sự được ví như nghề làm dâu trăm họ, bao gồm những nhiệm vụ chính nhưng không giới hạn các công việc không tên khác,…Nên, để trở thành một người làm nghề Nhân sự thành công yêu cầu khá nhiều những tố chất.

Và ở đây, mình không nêu ra các yêu cầu như: Kiến thức nghiệp vụ chuyên môn, vi tính văn phòng, kỹ năng giao tiếp, luật lao động…vì nó là điều bắt buộc bạn phải học và rèn luyện khi làm nghề. Các kiến thức này mình sẽ trình bày vào một bài học chuyên sâu khác. Bạn nhớ đón theo dõi nha!

Vấn đề mình sẽ cùng nhau tìm hiểu trong bài học Các tố chất cần có của người làm Nhân sự nói chung, chứ không nói riêng các vị trí đã được chuyên môn hóa khác như: Chuyên viên tuyển dụngChuyên viên C&B…Nếu bạn là người mới đang tìm hiểu, đang có định hướng theo đuổi nghề này thì cần những tố chất gì để ra quyết định theo đuổi nó hay không?

Sự cẩn thận và chính xác

Nghề Nhân sự là một nghề nghiệp khá đặc thù, nó đòi hỏi sự chính xác và đồng nhất khi trao đổi thông tin từ tất cả các bộ phận/phòng ban. Chỉ cần một thông tin sai lệch có thể làm ứng viên hoặc nhân viên đang làm mất sự tin tưởng vào tổ chức và khó gắn bó lâu dài.

Ví dụ như khi bạn tuyển dụng một nhân viên mới cho Công ty, thì từ khâu phỏng vấn, đến Hội nhập và đào tạo văn hoá, rồi khi họ nhận việc chính thức tại phòng ban nào đó, đến lúc chi trả lương và chế độ cho họ đều phải chính xác các thông tin đã trao đổi như mức lương, KPI, chính sách phúc lợi, nội quy và quy định của công ty…

Luôn chỉnh chu trong mọi thứ

Sự chỉnh chu nó cũng gần như là phải có tâm trong công việc. Các khâu tiếp đón ứng viên, quá trình trao đổi, rồi các hướng dẫn khi bắt đầu nên chỉnh chu. Có bạn khá hời hợt và không đặt mình để thấu hiểu những khó khăn bỡ ngỡ của ứng viên.

Rồi nào là quên lịch phỏng vấn và yêu cầu ứng viên phải đợi, hay nghiêm trọng hơn là bận quá bạn chưa gửi duyệt offer letter (bao gồm duyệt mức lương) nhưng đã mời họ nhận việc. Rồi có trường hợp sếp đổi ý thế là bạn phải xin lỗi ứng viên này nọ…

Và bao gồm cả chỉnh chu về mặt hình ảnh cá nhân: Nó không đồng nghĩa với việc bạn phải đẹp mà là luôn gọn gàng và chú ý về mặt hình thức. Vì người làm nghề nhân sự là hình ảnh của Công ty, là người gặp gỡ đầu tiên và tạo ấn tượng tốt với ứng viên tiềm năng, cũng như là người sẽ hỗ trợ và giải quyết tất cả các quyền lợi, trách nhiệm, quan hệ lao động về sau. Bạn có thể tham khảo thêm bài viết Nghề Nhân sự có yêu cầu ngoại hình hay không?

  20 thuật ngữ chuyên sâu trong Quản lý Nhân sự nội bộ
  3 hướng dẫn để bắt đầu kinh doanh trong lĩnh vực nhân sự

Xem thêm các việc làm AngularJS hấp dẫn trên TopDev

Tính bảo mật

Nhân viên Phòng Nhân sự được tiếp cận rất nhiều thông tin nhạy cảm như: Tăng giảm nhân sự, điều chỉnh lương, thăng chức…của đa số mọi người trong công ty. Đây là một trong những thông tin được dán nhãn bảo mật rất cao, vì nếu bị lộ thông tin ra ngoài một cách không chính thống thì ít nhiều sẽ ảnh hưởng đến tâm lý của Người lao động.

Nếu bạn là type người hay thích “8,8,8” và không giữ được bí mật thì hãy tập ngay tính cách này kẻo không sớm thì muộn sẽ rước hoạ vào thân. Phải thật sự tỉnh táo để không lỡ mồm. Đa số chúng ta hay bị tình trạng: Ê, kể nghe cái này nè nhưng đừng có nói lại với ai nha, chỉ kể mình mày thôi đó…Hãy biết cách nói “Không” trong trường hợp này.

Tính kỷ luật

Nhân viên phòng Nhân sự luôn được xem là kiểu mẫu về cả cách cư xử, kỹ năng giao tiếp, kỷ luật kỷ cương…Nên bạn rất dễ rơi vào tầm ngắm, bao gồm cả soi mói của rất nhiều nhân viên trong công ty. Kiểu như, nhìn ông đó, bà đó thấy không nết na thùy mị, đú đa đú đỡn, đi trễ về sớm như đi chợ, ăn nói bỗ bã… vậy mà làm Nghề Nhân sự là hiểu công ty sao rồi ha…

Tất nhiên, điều này không có nghĩa là bạn phải sống giả dối mà đó gần như là một yêu cầu bắt buộc. Có bạn cảm thấy không muốn như vậy, và thích công việc phóng khoáng, thoải mái thể hiện mình hơn thì nên cân nhắc khi chọn nghề nhân sự này, nó gần gần như nghề giáo vậy. Nên đây cũng chính là lý do để bạn bắt buộc phải rèn luyện tính kỷ luật.

Công bằng và sự tử tế

Sự công bằng: Trong một số tình huống, bạn có một số quyền lực mềm trong tay. Ví dụ như Công ty có đợt đánh giá để cắt giảm nhân sự yếu kém, hay những đợt đánh giá vinh danh nhân viên xuất sắc…ít nhiều bạn có tiếng nói và có thể làm sai lệch kết quả. Nên bạn phải thực sự công tâm để đưa ra lựa chọn cuối cùng dựa trên lợi ích của tập thể chứ không vì lợi ích cá nhân.

Sự tử tế: Trong tất cả các tình huống, người làm nghề nhân sự là cầu nối giữa người lao động và người sử dụng lao động. Nên khi bạn nghiêng quá nhiều về một bên nào đó thì bên còn lại sẽ thiệt thòi. Tất nhiên, đi làm thì phải đảm bảo thực hiện các yêu cầu của Công ty, tuy nhiên sự tử tế giúp bạn đảm bảo yếu tố win-win tốt hơn cho cả hai.

Và tất nhiên những điều mình kể ra ở trên là chưa đủ. Đây chỉ là vài gợi ý về tính chất ngành nghề để mọi người cùng tham khảo. Dựa vào đó để định hình cho bản thân có phù hợp để theo đuổi nghề này hay không, cũng như để khi bạn làm nghề nhân sự rồi thì phải là một thương hiệu mạnh trong nội bộ nói riêng và cộng đồng HR nói chung.

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


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 các việc làm ngành CNTT hấp dẫn trên TopDev

Những từ khóa trong NUnit dùng để phân loại phương thức kiểm thử

từ khóa trong nunit
Những từ khóa trong NUnit dùng để phân loại phương thức kiểm thử

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

Trong bài trước, mình đã nói qua những từ khóa của NUnit dùng để hỗ trợ việc thiết lập thứ tự thực thi các phương thức kiểm thử. Bài này, sẽ tiếp tục giới thiệu với các bạn một số từ khóa hỗ trợ chúng ta phân loại các phương thức kiểm thử trong toàn bộ dự án kiểm thử (test project)

Từ khóa Category

Đây là từ khóa hỗ trợ chúng ta chia các phương thức kiểm thử thành từng phần nhỏ theo các thành phần của phần mềm cần kiểm thử (AUT) – như Creation hoặc Edit/Delete – hoặc là chia phương thức kiểm thử theo loại kiểm thử – như Functionality hay UI.

Từ khóa Category này có thể được sử dụng ở cả hai mức độ, lớp kiểm thử (Test Fixture) và phương thức kiểm thử (Test).

[TestFixture, Category(“Test Fixture Level”)]
public class TestClass_01
{
          [Test, Category(“UI”)]
          public void TestMethod_UI_01()
          {
                    Console.WriteLine(“Test Method UI 01 under Test Class 01”);
          }
}

Từ khóa Property

Từ khóa này không có nhiều ý nghĩa cho chúng ta khi lựa chọn phương thức kiểm thử để thực thi thông qua ứng dụng NUnit. Thông tin của Property sẽ được hiển thị khi chúng ta mở cửa sổ Property của lớp kiểm thử (Test Fixture) và phương thức kiểm thử (Test).

[TestFixture, Property(“Priority”, “1”)]
public class TestClass_03
{
          [Test, Property(“Severity”, “1”)]
          public void TestMethod_Severity1_01()
          {
                    Console.WriteLine(“Test Method Severity1 01 under Test Class 03”);
          }
}
  Kiểm thử đơn vị trong C# với Nunit và .Net Core
  NUnit – Kiểm thử Đơn vị trên Visual Studio

Xem thêm các việc làm iOS lương cao trên TopDev

Từ khóa Suite

Từ khóa Suite này cũng không có tác dụng khi sử dụng thực thi phương thức kiểm thử với ứng dụng NUnit. Tác dụng chính của từ khóa này là khi thực thi các phương thức kiểm thử với command-line. Bằng cách sử dụng từ khóa Suite, chúng ta có thể gom nhóm các phương thức kiểm thử vào chung một nhóm. Từ khóa Suite này không được dùng cho lớp kiểm thử (Test Fixture) hay phương thức kiểm thử (Test); nó được sử dụng trong một lớp bình thường và khai báo một phương thức dạng property trong lớp.

class Test_Suite
{
          [Suite]
          public static IEnumerable Suite
          {
                    get
                    {
                              ArrayList suite = new ArrayList();
                              suite.Add(new TestClass_01());
                              suite.Add(new TestClass_02());
                              return suite;
                    }
          }
}

Từ khóa Explicit/Ignore

Từ khóa Explicit được sử dụng với mục đích đánh dấu một lớp/phương thức kiểm thử không cần thực thi nếu không đặc biệt chọn trong ứng dụng NUnit, xác định lớp/phương thức kiểm thử nên được chạy với một điều kiện cụ thể. Từ khóa Ignore đánh dấu một lớp/phương thức kiểm thử sẽ không được thực thi, thường dùng để xác định lớp/phương thức kiểm thử chưa sẵn sàng để thực thi. Khi hiển thị trên ứng dụng NUnit, lớp/phương thức Explicit sẽ hiển thị màu xám, còn lớp/phương thức Ignore sẽ hiển thị màu vàng.

Explicit_Ignore

Hướng dẫn thực thi chi tiết, các bạn có thể xem trong clip dưới đây. Mã nguồn có thể download tại đây.

[adToAppearHere]

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

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

Xem thêm các việc làm ngành CNTT hấp dẫn trên TopDev

Dân IT đọc sách như thế nào đây?

dân it đọc sách

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

Nhân dịp đầu năm, mình xin viết một bài bàn về chuyện đọc sách, dựa trên những kinh nghiệm cá nhân, dành tặng các bạn nào đã trót đặt ra mục tiêu đọc 10 hay 20 cuốn sách trong năm mới một lần nữa và chưa có cơ hội thực hiện. Và cả những bạn nào chưa có ý định đọc sách. Hy vọng các bạn sẽ hoàn thành mục tiêu mình đặt ra và đọc càng nhiều sách càng tốt trong năm nay 🙂

Mở bài

Như các bạn đã biết, ngay từ khi mới chập chững vào lớp 1 hay từ mẫu giáo cũng đã biết, đến khi lớn lên vào Đại học hay không vào đại học thì cũng biết luôn là đọc sách rất có lợi. Hằng ngày, mọi người vẫn kháo nhau rằng sách là kho tàng kiến thức của nhân loại, đọc sách là một phương pháp thể dục cho trí óc và là cách hiệu quả nhất để tiếp thu kho tàng kiến thức đó.

Và tất nhiên ai cũng muốn đọc sách để xem thử nó có nâng tầm hiểu biết của mình lên được không. Nhưng không phải ai cũng có thời gian để đọc, chắc hẳn chính bạn cũng đã từng rất quyết tâm mua về một tủ sách hoặc một vài ba cuốn sách, đặt ra mục tiêu trong vòng 3 tháng nghỉ hè sẽ lĩnh hội được hết cái đống này, rồi đúng y 3 năm sau cũng vẫn đặt mục tiêu tương tự cho những cuốn sách đó :v Vì một lý do đơn giản, thời gian đâu mà đọc.

Vậy một ngày có 24 tiếng, thời gian đi đâu hết nhỉ? Để xem nào, sáng 8h thức dậy, vội vã ăn sáng đánh răng, 9h phóng xe lên cty, đọc báo, “làm việc nước” trên skype, đến đâu tầm 12h thì rủ nhau ra ngoài ăn trưa, ăn trưa xong vào làm 1 giấc tới 1h30 hoặc có khi là đế chế, half-life, gần đây có cả dota, starcraft đến tận 2h chiều. Đến khi sếp bước xuống thì lật đật alt-tab ra ngoài bật IntelliJ hay Sublime lên ngồi gõ gõ. 6h chiều tắt máy đi về, tới nhà thì tầm 6h30, 7h đêm. Dân FA thì bật máy tính lên và chơi game hoặc lướt Kênh 14 tiếp, các bạn khá khẩm hơn tí thì dẫn gấu đi làm nghĩa vụ hằng ngày là chạy xe quanh thành phố, nộp sưu thuế cho mấy quán trà chanh, cà phê, loáng phát là đến 9, 10h đêm. Hôm nào cãi nhau với gấu thì đùng đùng bỏ về lấy điện thoại ra nhắn tin cãi nhau tiếp đến tận 1, 2h sáng, anh nào ko cãi nhau thì về mở máy ra chiến Freelancer hay 9gag đến tận rạng sáng ngày hôm sau…. Thế đấy, xong bà nó một ngày rồi. Thời gian đâu mà đọc sách nữa…

Dài dòng quá, thân bài

Thực ra đây là cái lịch trình sinh hoạt của mình đúng 1 năm về trước. Lúc đó thời gian thì tiêu biến thật là nhanh nhưng mà chung quy lại một ngày chả làm được cái gì nhiều, mặc dù lịch trình thì luôn sát nút như vậy. Và tất nhiên giấc mơ đọc sách để có ngày viết những bài review hoành tráng như các bậc vĩ nhân trên mạng, hay các bài xã hội học thâm nho như triết học đường phố luôn là cái giấc mơ xa vời, vì chưa bao giờ có cuốn sách nào được lật quá 10 trang đầu tiên…

Và đến lúc đó mình đặt ra câu hỏi, tại sao mình không làm được mỗi một việc đơn giản là đọc sách? Ngày xưa khi chưa có máy tính thì mình cũng đọc rất nhiều, và đọc ngấu nghiện, nào là Doraemon, Tepi, Subasa, Songoku, Kính vạn hoa, 1000 câu hỏi vì sao…  tất nhiên truyện tranh cũng là sách, nhưng không phải là sách đọc vào để học, thêm vào cho vui thôi, nhưng mà hồi đó có thể đọc quên ăn quên ngủ, mặc dù các phương tiện giải trí khác nó có rất nhiều như là máy chơi game, phim hoạt hình,… toàn những thứ đầy sức cám dỗ.

Yếu tố thứ 1: Tìm ra thể loại sách ưa thích

Vậy là mình nghiệm ra một điều, lý do khiến lâu giờ mình không tài nào đọc được, một phần là do thể loại sách không phù hợp. Khi bắt đầu đọc một cuốn sách và thấy nó không có vẻ gì là lôi cuốn, đủ để giữ chân bạn, bạn sẽ mất dần kiên nhẫn và không thể đọc tiếp được nữa. Rõ ràng rồi.

Vậy là bắt đầu đi tìm những loại sách phù hợp với mình. Sau một thời gian lân la trên tiki.vn và các nhà sách, tìm và đọc thử (đọc lướt) các thể loại thì mình đã nhận ra mình không hề phù hợp với các thể loại truyện ngôn tình, sách dạy làm giàu và cả sách tin học, thể thao =))))) mình không chia sẽ các thể loại sách mình thích đọc ra đây vì cái này không phải ai cũng giống nhau, đưa ra sẽ làm ảnh hưởng đến tính khách quan của bài viết =))

Sau khi đã tìm ra thể loại sách ưa thích, mình bắt đầu đọc, nhưng vẫn không thể thoát khỏi chuyện bị phân tâm xao lãng. Đến lúc này mình quyết định tìm hiểu một cách bài bản về chuyện đọc sách. Và rút ra thêm một vài kinh nghiệm khác.

Yếu tố thứ 2: Đọc nhiều sách một lần

Một trong những cản trở lớn nhất trong quá trình đọc sách của mình chính là việc quá quyết tâm hoàn thành 1 quyển sách trước khi đọc sang cuốn sách khác. Và tất nhiên chưa bao giờ mình có đủ thời gian để đọc hết 1 cuốn sách nào cả. Thế nên mãi mãi mình cứ dậm chân tại chỗ.

Sau khi tham khảo nhiều trên các diễn đàn, mình thấy các bạn ấy có chia sẽ một kinh nghiệm đó là đọc nhiều cuốn sách một lần. Nghe qua có vẻ vô lý nhưng khi thử nghiệm thì đúng là nó hiệu quả.

Sỡ dĩ nó hiệu quả là vì, khi chúng ta ép bản thân quá tập trung đọc một loại sách, chúng ta dễ cảm thấy nhàm chán với nội dung cuốn sách đó. Khi đó, nếu chuyển sang đọc một cuốn sách khác với thể loại khác hẳn cuốn sách đang đọc, đầu óc chúng ta sẽ trở nên thoải mái hơn, tiếp thu câu chuyện mới hiệu quả hơn và khi quay trở lại cuốn sách cũ thì cũng cảm thấy tràn trề năng lượng chứ không bị gò bó, mệt mỏi. Giống như là một phương pháp refresh lại não bộ vậy.

Đó là chưa kể, đọc nhiều quyển sách một lần sẽ làm cho tiến độ đọc của bạn tăng lên thấy rõ, giống như trong lập trình, sử dụng nhiều thread để xử lý nhiều việc bao giờ cũng nhanh hơn là xử lý theo lối hàng đợi :v

Xem thêm tuyển dụng UI UX Designer hấp dẫn trên TopDev

Yếu tố thứ 3: Mua càng nhiều sách càng tốt

Yếu tố thứ 3 này là để phụ hoạ cho yếu tố thứ 2, một khi đã chấp nhận việc đọc nhiều cuốn sách một lần thì tại sao lại không mua một đống sách về chất đầy giường mà đọc?

Thực ra việc mua nhiều sách về để dành sẽ tạo ra một tác động tâm lý khá lớn, đó là, đã tốn tiền mua sách về rồi thì phải ráng đọc cho hết. Tác động thứ 2 đó là luôn có động lực phải cố gắng đọc để có thể hoàn thành tủ sách của mình. Bạn không thể có động lực bước đi tiếp trên một con đường tối mù, không biết phía trước có gì. Nhưng nếu thấy phía trước là cả một con đường đầy thức ăn ngon tuyệt vời thì ai lại không muốn bước tiếp, đúng không?

Sẽ có bạn nói là mua nhiều sách quá sẽ làm nản chí không muốn đọc nữa, điều này không đúng. Nếu bạn mua những cuốn sách hợp khẩu vị, thì sẽ không có thứ gì làm bạn nản chí được cả.

Yếu tố thứ 4: Đặt ra những mục tiêu ngắn hạn cho việc đọc

Hầu hết trong chúng ta khi bắt đầu đọc một cuốn sách, đều đặt ra một mục tiêu rất to lớn như là: Hoàn thành cuốn sách này trong vòng một tuần, hoặc đọc 20 cuốn sách trong vòng 12 tháng,… trong khi các bạn chưa hề biết được khả năng của bản thân đọc được bao nhiêu. Điều này dẫn đến mục tiêu kia trở nên quá xa vời và rất dễ gây nản chí.

Đặt mục tiêu một cách khôn ngoan khi đọc sách là một điều quan trọng, vậy, mục tiêu thế nào là khôn ngoan?

Các loại sách thông thường bây giờ có độ dài tầm 250 đến 300 từ trên một trang sách. Và tốc độ đọc trung bình của chúng ta là tầm 400-500 từ một phút. Như vậy Trong vòng một phút các bạn có thể đọc gần 2 trang sách (nếu tập trung cao độ), và một trang sách nếu đang ở trong một môi trường không phù hợp, bị phân tâm.

Dựa vào tốc độ đọc này, chúng ta có thể đặt ra các mục tiêu ngắn như là: Đọc 10 trang sách một ngày (tương đương với hơn 10 phút đọc sách một ngày). Mục tiêu này rất dễ để đạt được, vì vậy dần dần việc đọc sách đối với bạn sẽ không còn là cực hình nữa. Và tại sao không bỏ ra nỗi 10 phút để đọc sách trong khi chúng ta có đến 24 giờ?

Cũng giống như khi tập thể dục. Sau khi đã hoàn thành được mục tiêu đặt ra, chúng ta phải đặt ra các mục tiêu cao hơn. Ngày đầu tiên có thể là 10 phút, nhưng hôm sau có thể dành ra 15 phút, rồi 30 phút, rồi 1 tiếng một ngày cho việc đọc sách. Bước phát triển từ từ sẽ giúp cho não quen dần với việc trích xuất thời gian làm một việc gì đó mới mẻ (đọc sách), và lịch trình làm việc của bạn cũng sẽ dần dần thích nghi với việc này để có thể đọc nhiều hơn mỗi ngày.

Yếu tố thứ 5: Dẹp ngay việc đọc tin lung tung trên internet

Thời gian chúng ta bỏ ra để đọc các tin bài một cách ngẫu nhiên (random articles) trên internet rất nhiều, nhưng thường thì các bài viết này không đem lại bất cứ lợi ích gì về mặt lâu dài cả.

Ví dụ như đọc được một bài báo về Hari Won và Tiến Đạt hay Trấn Thành sẽ chẳng hề giúp bạn thu lượm được kiến thức gì ngoại trừ chuyện đời tư của các nghệ sĩ. Hay đọc một bài viết về cơ chế hạ cánh các tên lửa đẩy của hãng SpaceX cũng là một loại kiến thức quá xa vời và không hề thực tế đối với bạn. Cãi nhau trên internet để bảo vệ quan điểm của mình về việc Trung Quốc có nên từ bỏ việc đưa đồng Nhân Dân Tệ lên thay thế đồng tiền chung của khối Châu Âu không, hay Lỗ đen vũ trụ có phải là manh mối để du hành ngược thời gian không, cũng chẳng đem lại cái gì cho bạn cả…

Nếu các bạn để ý và làm một phép thống kê đơn giản, có lẽ bạn sẽ giật mình vì lượng thời gian tiêu tốn cho việc đọc lung tung đó. Thời gian các bạn lãng phí cho việc đó nếu dành vào việc đọc sách thì sẽ tốt hơn rất nhiều. Hãy đọc để có thêm kiến thức trước khi vác bàn phím lên tham gia vào các cuộc đấu khẩu trên thế giới ảo.

Yếu tố thứ 6: Đọc trên nhiều loại thiết bị

Nhìn qua một lượt, chúng ta có rất nhiều cách để đọc sách trong thời đại này: Sách giấy, máy tính, điện thoại, tablet, máy đọc sách,…

  Các Phần Mềm Dành Cho Dân IT Mà Mọi Lập Trình Viên Nên Biết
  32 cuốn sách học lập trình bạn nhất định phải đọc

Một kinh nghiệm cho việc đọc là bạn nên thử thay đổi qua lại việc đọc cùng một quyển sách trên nhiều loại thiết bị khác nhau. Ví dụ, khi đi ra ngoài đường, đi dã ngoại, các bạn có thể đem bản sách giấy đi theo. Khi đi trên tàu điện hoặc xe bus, lấy máy đọc sách ra mà đọc, khi về đến nhà có thể đọc trên laptop hoặc trên iPad, khi… làm chuyện đại sự, có thể cầm điện thoại vào và đọc ngấu nghiến…

Hầu hết các phần mềm đọc sách như iBook hay Amazon Cloud Reader có khả năng đồng bộ tiến trình đọc của bạn qua nhiều thiết bị giúp cho việc chuyển đổi giữa các thiết bị dễ dàng hơn, bạn có thể đọc liên tục mà không gặp trở ngại gì.

alt text

Hiệu quả ở đây là gì? Việc thay đổi thiết bị khi đọc cũng giống như việc thay đổi môi trường làm việc vậy. Môi trường mới sẽ giúp cho chúng ta không cảm thấy nhàm chán và kích thích khả năng làm việc của chúng ta hiệu quả hơn. Đọc sách cũng cần thay đổi môi trường vậy.

Tuy nhiên, nếu có điều kiện mua các thiết bị máy đọc sách (giá tầm 1tr đến 3tr) thì nên chọn các loại máy chỉ có chức năng đọc sách, không có gì thêm như Kindle Basic, Paperwhite hay Kobo. Ưu điểm thứ nhất là các máy này khá nhẹ, cầm đọc thời gian dài không bị rớt vào mặt nếu lỡ buồn ngủ =)) Việc đọc trên iPad hay các máy Tablet khác đa dụng có thể bị các ứng dụng như Facebook, Twitter, Games,… làm phân tâm không tâp trung được.

Yếu tố thứ 7: Chọn cách đọc phù hợp tuỳ theo loại sách

Kinh nghiệm này đến từ bài viết Đọc sách nhanh trên Blog Khoa học máy tính. Mình vừa mới tìm ra bài viết này cách đây không lâu và chưa có cơ hội áp dụng nhiều, chỉ mới dùng kinh nghiệm này cho 2 cuốn sách gần đây nhất. Tuy vậy mình thấy cách này rất đáng để tham khảo.

Tuỳ thuộc vào mục đích của loại sách mà chúng ta đang muốn đọc, không phải bất cứ quyển sách nào cũng đáng để đọc ngấu nghiến, có những quyển sách chúng ta chỉ nên lướt qua một lần hoặc là bỏ hẳn không nên đọc nữa, hoặc những cuốn sách chúng ta ít quan tâm hơn nhưng vẫn biết nó hữu dụng. Cách tốt nhất là phân loại nó thành các thể loại sách để đọc theo 2 mức độ (trong bài gốc có 3 mức độ nhưng mức độ 3 mình không nghĩ là nó thích hợp):

  • Đọc kiểu Cưỡi ngựa xem hoa: Đọc lươn lướt để biết trên đời này có cái gì, và biết được thứ kiến thức gì nó nằm ở đâu để sau này có thể tiện tra cứu lại. Cách này có thể áp dụng khi đọc các bài viết kĩ thuật trên internet, nhất là các bài về lập trình, đảo mắt nhìn quanh một lượt, liếc qua vài dòng code rồi nếu thích thì đi vào đọc chi tiết nội dung bài.
  • Đọc kiểu Hiểu: Phải đọc và lĩnh hội được cuốn sách ở mức độ có thể tự xây dựng lại nội dung, có thể khái quát cũng được, mà không cần nhìn vào sách nữa. Cần có sự thực hành đi đôi với quá trình đọc sách (chạy thử code, thử giải các câu đố có trong sách, lý giải một hành động nào đó của nhân vật chính trong sách, hoặc thực hành theo các kinh nghiệm làm giàu nếu bạn dám …), đòi hỏi cần phải đọc nghiêm túc hơn.

Kết bài

Trên đây là kinh nghiệm đọc của mình, lần mò ra được trong một năm qua, sau khi vận dụng và thay đổi thì mình cũng đã hoàn thành được kha khá một vài cuốn sách trong vô số cuốn sách mà mình muốn đọc. Hy vọng các bạn sẽ có thêm động lực để đọc sau bài viết này. Và nếu có ai còn những kinh nghiệm quý giá nào khác, xin mời các bạn chia sẽ ở phần comment cuối bài viết 😀

Chúc các bạn một năm mới thành công rực rỡ  đọc nhiều, chơi nhiều và thành công cũng nhiều luôn 😀

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

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

Xem thêm các việc làm ngành CNTT hấp dẫn trên TopDev

Hướng Dẫn Trả Lời Thư Mời Phỏng Vấn Với Nhà Tuyển Dụng

trả lời thư mời phỏng vấn
Hướng Dẫn Trả Lời Thư Mời Phỏng Vấn Với Nhà Tuyển Dụng

Sau khi CV của ứng viên đã hoàn thiện và được gửi đến vị trí mình ưng ý, nếu phù hợp, bạn sẽ được nhà tuyển dụng liên hệ và mời đến vòng phỏng vấn. Khi nhận được thư mời phỏng vấn của công ty, có nên trả lời thư mời phỏng vấn hay không và nên viết như thế nào để tạo ấn tượng tốt trong mắt nhà tuyển dụng? Tham khảo thêm các thông tin này với bài viết dưới đây nhé!

trả lời thư mời phỏng vấn
Cách trả lời thư mời phỏng vấn hiệu quả

1. Hiểu rõ về tầm quan trọng của việc trả lời thư mời phỏng vấn

Thực tế có không ít các ứng viên sau khi nhận được thư mời phỏng vấn từ đơn vị tuyển dụng sẽ không gửi lại phản hồi về việc có đồng ý tham gia hay không. Nhiều người cho rằng chỉ cần đến và tham gia phỏng vấn vào đúng khung giờ đã được đề cập là đủ. Tuy nhiên, việc trả lời thư mời phỏng vấn cũng chính là một yếu tố cực kỳ quan trọng giúp bạn chinh phục nhà tuyển dụng.

Không chỉ thế, việc để nhà tuyển dụng chờ phản hồi quá lâu cũng có thể trở thành một yếu tố khiến ứng viên mất điểm. Thậm chí, nếu đó là vị trí đang cần tuyển gấp thì bạn hoàn toàn có thể đã vuột mất cơ hội vào tay ứng viên khác có cách xử lý thông tin chuyên nghiệp hơn. Vậy nên đừng bao giờ xem nhẹ việc trả lời thư mời phỏng vấn cho nhà tuyển dụng.

2. Nên viết mail trả lời thư mời phỏng vấn như thế nào?

2.1. Về thời gian

Càng sớm càng tốt. Ngay khi nhận được thư mời phỏng vấn hay cuộc gọi mời phỏng vấn, ứng viên nên xác nhận lịch hẹn với nhà tuyển dụng. Trong trường hợp bạn không thể sắp xếp thời gian tham gia vào khung giờ đó thì việc này cũng giúp bạn và nhà tuyển dụng dễ dàng hơn trong việc tìm một thời điểm phỏng vấn khác thích hợp hơn.

Ngoài ra, nếu có bất cứ thắc mắc nào về thời gian, địa điểm hay nội dung làm việc, ứng viên đều có thể đề cập đến trong thư và nhà tuyển dụng sẽ hỗ trợ trả lời bạn vấn đề này một cách tốt nhất. Sự tiện lợi cho cả đôi bên sẽ giúp tiết kiệm được rất nhiều thời gian cho buổi phỏng vấn.

thời gian phản hồi

Một điểm cần lưu ý là trong thư mời phỏng vấn bạn nhận được, nếu thấy mail được đến những địa chỉ email khác trong công ty để cùng tham gia phỏng vấn, thì ứng viên khi trả lời nên chọn Trả lời tất cả – Reply All. Vì họ cũng là thành phần tham gia vào quá trình phỏng vấn bạn nên việc thông báo có thể đến phỏng vấn được hay không là rất cần thiết.

2.2. Cách đặt tiêu đề email

Đối với một email, tiêu đề là điều cực kỳ quan trọng, một bức thư không có tiêu đề sẽ tạo cảm giác khó chịu và khiến người nhận bỏ qua nó. Hoặc nếu có đặt tiêu đề cho email nhưng quá lan man, dài dòng và không thể hiện rõ được nội dung vấn đề, đây cũng là một điểm trừ cho ứng viên.

Bạn nên đặt tiêu đề email theo công thức như sau: [THƯ XÁC NHẬN THAM GIA PHỎNG VẤN – VỊ TRÍ ỨNG TUYỂN – HỌ TÊN]

Ví dụ: THƯ XÁC NHẬN THAM GIA PHỎNG VẤN – MARKETING EXECUTIVE – NGUYEN VAN A

Xem thêm Viết Đơn Xin Việc Như Thế Nào Để Gây Ấn Tượng Với Nhà Tuyển Dụng?

2.3. Viết nội dung trả lời thư mời phỏng vấn như thế nào để tạo ấn tượng?

Hãy mở đầu với phần chào hỏi. Hãy sử dụng những cách chào hỏi quen thuộc khi viết mail như “Dear HR Dept”, “Dear Ms/Mr A”, “Kính gửi phòng Nhân sự”,… Những cách chào hỏi như thế này vừa thể hiện thái độ lịch sự vừa đảm bảo không bỏ sót bất cứ cá nhân nhận thư nào.

Sau khi đã gửi lời chào, điều tiếp theo chắc chắn bạn không nên bỏ qua đó chính là gửi lời cảm ơn đến nhà tuyển dụng về thư mời phỏng vấn. Sau đó hãy đề cập đến lý do viết thư, rằng bạn đang xác nhận có thể đến và tham gia phỏng vấn hay không. Nếu không thể tham gia vào khung giờ nhà tuyển dụng đưa ra, bạn có thể trao đổi thêm về thời gian mình có thể tham gia và đề xuất với nhà tuyển dụng.

Ngoài ra, ứng viên cũng có thể đề cập đến một số vấn đề mình vẫn còn thắc mắc để được nhà tuyển dụng giải đáp và có dữ liệu tốt nhất khi tham gia phỏng vấn. Chẳng hạn như các thông tin cụ thể hơn về công việc ứng tuyển hay chi tiết công việc, hoặc người tham gia phỏng vấn, ngôn ngữ dùng trong buổi phỏng vấn,…

Thank you!

Kết thư bạn nên cảm ơn lại nhà tuyển dụng một lần nữa và thể hiện mong chờ cho một cơ hội hợp tác tốt đẹp trong tương lai.

Nếu có thể, hãy nhớ tạo một chữ ký cá nhân trong email của bạn. Chữ ký có thể không quá cần thiết nhưng nó thể hiện sự chuyên nghiệp và cẩn thận của người gửi mail. Chữ ký email nên bao gồm họ tên đầy đủ, số điện thoại, địa chỉ email và địa chỉ liên lạc cá nhân, vị trí công việc,…

3. Mẫu email trả lời thư phỏng vấn tham khảo

Mẫu 1:

Tiêu đề: THƯ XÁC NHẬN THAM GIA PHỎNG VẤN – MARKETING EXECUTIVE – NGUYEN VAN A

Dear HR Dept / Kính gửi Phòng Nhân sự Công ty…

Tôi rất vui khi nhận được thư mời phỏng vấn vị trí nhân viên Marketing tại quý công ty. Rất cảm ơn sự ghi nhận của công ty với những kinh nghiệm và kỹ năng mà tôi đã đề cập trong CV.

Tôi viết thư này để xác nhận sẽ đến và tham gia buổi phỏng vấn đúng giờ,

Rất mong buổi phỏng vấn sẽ diễn ra tốt đẹp và tôi có cơ hội hợp tác lâu dài cùng công ty,

Trân trọng,

Nguyễn Văn A

——-

Xem thêm Giới thiệu bản thân trong CV và bí quyết ghi điểm trong mắt nhà tuyển dụng

Mẫu 2:

Tiêu đề: THƯ PHẢN HỒI V/V KHÔNG THỂ THAM GIA PHỎNG VẤN – FULLSTACK DEVELOPER – TRẦN VĂN B

Dear HR Dept / Dear Ms A / Kính gửi quý Công ty H

Tôi rất vui khi biết được CV của mình đã được thông qua và được mời tham gia phỏng vấn cho vị trí Full-stack Developer tại công ty. Tuy nhiên, vì một số lý do cá nhân mà tôi không thể tham gia phỏng vấn theo thời gian mà công ty đã thông báo.

Tôi rất lấy làm tiếc vì vấn đề bất khả kháng này. Rất hy vọng có thể hợp tác với quý công ty trong thời gian gần nhất.

Trân trọng,

Trần Văn B.

——–

Trả lời thư mời phỏng vấn nên là điều cơ bản mà bạn cần thực hiện khi nhận được thư mời phỏng vấn. Không cần quá cầu kỳ hay trau chuốt, hãy cố gắng duy trì sự tích cực trong câu trả lời của mình và xác nhận đúng thông tin mà nhà tuyển dụng cần. Hy vọng series các bài viết liên quan đến việc ứng tuyển, soạn CV và trao đổi với nhà tuyển dụng của topdev.vn/blog sẽ giúp ích hơn cho bạn.

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

Xem thêm tuyển dụng các vị trí IT hấp dẫn trên TopDev

Hướng dẫn cài đặt xampp trên windows

cài đặt xampp
Hướng dẫn cài đặt xampp trên windows

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Sau khi sử dụng Xampp + tài liệu cóp được tổng hợp lại Xampp như sau:

– XAMPP là phần mềm tích hợp các phần mềm dành cho Web Server có thể cài đặt được trên nhiều nền tảng khác nhau.

 X đầu tiên trong cụm từ XAMPP ám chỉ cross-platform nghĩa là XAMPP có thể chạy trên Windows,  Linux, Mac OS, Solaris.

A = Apache, XAMPP bao gồm 1 Apache HTTP Server giúp chạy các ứng dụng web.

M = MySQL, hệ quản trị cơ sở dữ liệu My SQL cũng được bao gồm trong XAMPP

P = PHP – ngôn ngữ lập trình PHP

P = Perl – tích hợp thư viện PEAR (Xem thêm thông tin tại http://pear.php.net/)

Ngoài ra XAMPP còn hỗ trợ các thành phần khác như: Webmail – FTP – SSL, OpenSSL, pdf class, mhash, IMAP C-Client….

Ta tiến hành cài đặt phần mềm XAMPP

1. Bạn tải phần mềm XAMPP bản mới nhất 2015 tại địa chỉ: https://www.apachefriends.org

2. Tiến hành chạy file cài XAMPP đã tải về ở trên

3. Bạn nhấn Next để tiếp tục quá trình cài đặt

4. Tiếp tục chọn Next. Hiện tại, trong mục Select a folder, mặc định là C:\xampp, nghĩa là bạn đang cài đặt phần mềm vào thư mục xampp của ổ đĩa C. Tuy nhiên, nếu để ở ổ C, khi bạn cài lại máy tính sẽ có khả năng bị xóa mất thư mục cài đăt đó.

Trong ví dụ này, mình sẽ cài đặt phần mềm XAMPP vào ổ đĩa D: bằng cách xóa đường dẫn “C:\xampp” và thay bằng “D:\xampp” trong phần Select a folder.

Xem thêm tuyển dụng Xamarin lương cao trên TopDev

5. Khi đó, thư mục cài đặt sẽ được chuyển sang ổ D:\xampp. Tiếp tục nhấn Next

6.Chọn Next

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

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

Xem thêm các việc làm ngành CNTT hấp dẫn trên TopDev

Generate API contract sử dụng OpenAPI Generator Maven plugin

generate api contract
Generate API contract sử dụng OpenAPI Generator Maven plugin

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

Sau khi định nghĩa API specs với RAML, chúng ta có thể sử dụng Spring MVC-RAML Maven plugin để generate API contract. Với API specs sử dụng OpenAPI Specification thì các bạn có thể sử dụng OpenAPI Generator Maven plugin để làm điều này. Cụ thể như thế nào? Chúng ta sẽ cùng nhau tìm hiểu trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Spring Boot project với Web dependency:

để làm ví dụ.

Kết quả:

 

Để làm ví dụ, mình sẽ sử dụng API specs được định nghĩa trong bài viết Cơ bản về định nghĩa RESTful Web Service API specs sử dụng OpenAPI Specification. Các bạn có thể lấy nội dung của API specs này ở đây, copy tất cả các tập tin, folder vào thư mục src/main/resources/api của project của chúng ta:

Bây giờ chúng ta sẽ khai báo OpenAPI Generator Maven plugin cơ bản như sau:

<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>5.4.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/api/student.yaml</inputSpec>
<generatorName>spring</generatorName>
<apiPackage>com.huongdanjava.openapispring.web</apiPackage>
<modelPackage>com.huongdanjava.openapispring.dto</modelPackage>
<output>.</output>
<configOptions>
<delegatePattern>true</delegatePattern>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>

Ở phần configuration, tag <inputSpec> sẽ trỏ đến location của tập tin API specs.

OpenAPI Generator Maven plugin cho phép chúng ta có thể generate API contract cho nhiều loại project với ngôn ngữ lập trình khác nhau. Các bạn cần khai báo Generator name để chỉ định loại project mà mình muốn generate. Danh sách Generator ở đây. Ở đây, mình đã khai báo để generate Spring project.

Mỗi Generator định nghĩa rất nhiều config option khác nhau, cho phép chúng ta generate project theo ý muốn của mình. Các bạn khai báo các config option này trong tag <configOptions>. Trong ví dụ trên, mình đang sử dụng spring generator và mình đang sử dụng một configOption của generator này là <delegatePattern> với giá trị true để sử dụng Delegate Design Pattern trong phần implementation cho API specs, tách biệt giữa interface class và phần implementation. Còn rất nhiều config option khác, các bạn có thể take a look thêm ở đây.

Tag <apiPackage> dùng để khai báo tên package mà các Controller class được generate sẽ sử dụng, còn <modelPackage> thì liên quan đến package mà các DTO class được generate sẽ sử dụng.

Tag <output> sẽ là folder chứa các tập tin được generate. Ở đây mình cấu hình tag này với giá trị “.” để chọn thư mục hiện hành. Các bạn có thể sử dụng giá trị “.” hoặc ${project.basedir} đều được.

Một điểm các bạn cần lưu ý là khi OpenAPI Generator Maven plugin generate Spring project cho chúng ta, nó sẽ override cả tập tin pom.xml, nên lúc này các bạn hãy backup lại nội dung của tập tin pom.xml trước. Mình sẽ nói các bạn cách cấu hình để OpenAPI Generator Maven plugin skip generate và override tập tin pom.xml sau!

Lúc này, nếu các bạn run project với “mvn clean compile”, refresh project, các bạn sẽ thấy kết quả như sau:

Như các bạn thấy, OpenAPI Generator Maven plugin đã generate cho chúng ta một Spring project.

Kiểm tra tập tin pom.xml, như mình đã nói ở trên, các bạn sẽ thấy nó override luôn cả tập tin pom.xml. Để skip generate và override tập tin pom.xml này, các bạn hãy mở tập tin .openapi-generator-ignore trong thư mục root của project, và thêm dòng “pom.xml” là được. Copy lại nội dung của tập tin pom.xml mà các bạn đã backup, những lần compile sau, tập tin pom.xml này sẽ không bị OpenAPI Generator Maven plugin override nữa!

Chạy lại “mvn clean compile”, kiểm tra console log, các bạn sẽ thấy những tập tin sau được generate:

INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/dto/Response.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/dto/Student.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/web/StudentsApiController.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/web/StudentsApi.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/web/StudentsApiDelegate.java
[INFO] Ignored /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/pom.xml (Ignored by rule in ignore file.)
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/README.md
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/org/openapitools/OpenAPI2SpringBoot.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/org/openapitools/RFC3339DateFormat.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/resources/application.properties
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/org/openapitools/configuration/HomeController.java
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/resources/openapi.yaml
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/src/main/java/com/huongdanjava/openapispring/web/ApiUtil.java
[INFO] Skipped /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/.openapi-generator-ignore (Skipped by supportingFiles options supplied by user.)
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/.openapi-generator/VERSION
[INFO] writing file /Users/khanh/Documents/code/huongdanjava.com/openapi-generator-spring/.openapi-generator/FILES

Package com.huongdanjava.openapispring.dto sẽ chứa các DTO là các Schema object mà chúng ta định nghĩa trong tập YAML.

Package com.huongdanjava.openapispring.web sẽ chứa các Controller class tương ứng với các request URL, được tổ chức theo Delegate Design Pattern, ngoài ra các bạn còn thấy một class ApiUtil định nghĩa các utilities method sử dụng trong các Controller class.

  Build executable jar sử dụng Maven Shade Plugin
  Chạy ứng dụng web với Liberty Maven plugin

Xem thêm các việc làm Magento hấp dẫn trên TopDev

Package org.openapitools định nghĩa một Controller khác, cho phép chúng ta có thể lấy nội dung của tập tin src/main/resources/openapi.yaml được generate bởi OpenAPI Generator Maven plugin. Nội dung của tập tin openapi.yaml này được convert từ nội dung của tập tin YAML của chúng ta, trong ví dụ này của mình là student.yaml.

Tập tin application.properties cũng bị override để thêm một số properties sau:

server.port=8081
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

Các bạn nên add tập tin application.properties này vào tập tin .openapi-generator-ignore “src/main/resources/application.properties” để khỏi bị override nữa!

Một số dependencies cần được thêm vào tập tin pom.xml để project chúng ta có thể compile được, như sau:

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.6</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

<dependency>
<groupId>org.openapitools</groupId>
<artifactId>jackson-databind-nullable</artifactId>
<version>0.2.2</version>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>

Các bạn cũng cần phải sửa code của class OpenapiGeneratorSpringApplication để ứng dụng của chúng ta scan đầy đủ các Controller như sau:

package com.huongdanjava.openapispring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
//// @formatter:off
@ComponentScan(
basePackages = {
"org.openapitools",
"com.huongdanjava.openapispring",
"org.openapitools.configuration"
}
)
// @formatter:on
public class OpenapiGeneratorSpringApplication {

public static void main(String[] args) {
SpringApplication.run(OpenapiGeneratorSpringApplication.class, args);
}

}

Bây giờ, nếu các bạn chạy ứng dụng và đi đến http://localhost:8081/, các bạn sẽ thấy kết quả như sau:
Đây chính là Swagger API documentation đó các bạn! Sử dụng nó, các bạn sẽ biết ứng dụng của chúng ta có bao nhiêu request URL được expose. Thông tin của mỗi request URL như thế nào, và chúng ta có thể sử dụng Swagger API documentation này để gọi đến các request URL thực tế luôn.

Hiện tại thì chúng ta chưa implement cho các request URL. Các bạn có thể thêm mới class implement interface StudentsApiDelegate để làm điều này. Ví dụ của mình như sau:

package com.huongdanjava.openapispring.web.impl;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import com.huongdanjava.openapispring.dto.Student;
import com.huongdanjava.openapispring.web.StudentsApiDelegate;

@Service
public class StudentApiDelegateImpl implements StudentsApiDelegate {

@Override
public ResponseEntity<Student> getStudentById(String ID) {
Student student = new Student();
student.setId(1L);
student.setCode("123");
student.setName("HDJ");

return ResponseEntity.ok(student);
}

}

Kết quả nếu chúng ta request tới request URL http://localhost:8081/api/students/1 lúc này như sau:

 

Có thể bạn quan tâm:
Xem thêm các việc làm ngành CNTT hấp dẫn trên TopDev