Home Blog Page 127

Laravel view xây dựng logic trong giao diện

Laravel view xây dựng logic trong giao diện

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

Tìm hiểu về Laravel View

Trong mô hình MVC, V là chữ viết tắt của View. Nó giúp tách biệt giữa application logic và presentation logic giúp quản lý và phát triển mã nguồn tốt hơn. Các view trong Laravel được lưu trữ trong thư mục resources/views. Chúng ta có thể tạo thêm các thư mục trong thư mục resources/views để phân cấp quản lý, trong các ví dụ ở các bài viết trước chúng ta đã tạo thư mục fontend cho tất cả các view liên quan đến fontend, tạo thư mục backend cho các view liên quan đến quản trị. Bạn có thể tạo các thư mục con ở cấp sâu hơn, ví dụ:

  • resources/views/backend/product: Các view liên quan đến quản trị sản phẩm trên website.
  • resources/views/backend/news: Các view liên quan đến quản trị bài viết trên website.

Các view này có thể chứa mã HTML, CSS, Javascript phục vụ cho hiển thị nội dung cho người dùng.

Tham khảo vị trí tuyển dụng lập trình Laravel lương cao cho bạn

  API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth
  Có gì mới trong bản cập nhật Laravel 5.5.33 vừa ra mắt

Tạo view trong Laravel

View trong Laravel không tạo được bằng câu lệnh php artisan mà chỉ đơn giản là tạo một file mới trong các thư mục con của resources/views với cấu trúc tên file như sau:

tên-view.blade.php

Chú ý phần mở rộng .blade.php là bắt buộc, khi gọi đến view này chỉ đơn giản sử dụng code như sau:

view('tên-view');

Với các view nằm ở các thư mục con, chúng ta sử dụng dấu chấm để ngăn cách giữa các thư mục và tên view. Ví dụ view resources/views/backend/product/create.blade.php sẽ được gọi như sau:

view('backend.product.create');

Ok, chúng ta sẽ bắt đầu với ví dụ về view. Tạo một file test-view.blade.php trong resources/views/fontend với nội dung như sau:

<html>
  <title>Ví dụ Laravel View - Allaravel.com</title>
<body>
  <h1>Ví dụ về view trong Laravel</h1>
</body>
</html>

Tạo một route trả về view này (routes/web.php)

Route::get('test-view', function(){
  return view('fontend.test-view');
});

Ok, vào đường dẫn http://laravel.dev/test-view để xem view hiển thị như thế nào?

Laravel view xây dựng logic trong giao diện

Chú ý, đôi khi chúng ta xóa mất một view hoặc đã thay đổi tên view mà không để ý đến các đoạn mã gọi đến view này, khi người dùng truy cập vào các đường dẫn liên quan đến view này sẽ báo lỗi. Để tránh việc này xảy ra, chúng ta nên kiểm tra sự tồn tại của một view trước khi trả về view đó.

use Illuminate\Support\Facades\View;

Route::get('contact', function(){
  if (View::exists('fontend.contact')) {
      return view('fontend.contact');
  } else {
    return 'Trang liên hệ đang bị lỗi, bạn vui lòng quay lại sau';
  }
});

Truyền dữ liệu cho View

Truyền dữ liệu cho view giúp cho view hiển thị các nội dung động, ví dụ view hiển thị chi tiết một bài viết thì tiêu đề bài viết, nội dung mỗi bài viết khác nhau chúng ta sẽ truyền các giá trị này cho view. Chúng ta hãy xem lại ví dụ về truyền dữ liệu cho view trong bài viết Laravel Controller. Nội dung MainController như sau:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MainController extends Controller
{
  public function checkRole(){
    echo "<br>2. MainController@checkRole";
    echo "<br>Main Controller: checkRole function";
    echo "<br>Thực hiện sau khi qua bộ lọc Middleware và trước khi gửi HTTP response";
  }

  public function showNews($news_id_string){
    $news_id_arr = explode('-', $news_id_string);
    $news_id = end($news_id_arr);

    // Thực hiện lấy thông tin về bài viết $news_id, bài viết đưa ra ví dụ ở mức đơn giản
    $news_title = 'Bài viết Laravel mới với ID là ' . $news_id;
    // Các xử lý khác

    return view('fontend.news-detail')->with(['news_id' => $news_id, 'news_title' => $news_title]);
  }
}

Có thể truyền dữ liệu vào view bằng phương thức with, tham số truyền vào là một mảng giá trị.

return view('fontend.news-detail')->with(['news_id' => $news_id, 'news_title' => $news_title]);

Khi đó, muốn in nội dung các giá trị này trong view chúng ta đưa các biến này vào dấu {{ }}, xem nội dung view news-detail.blade.php nằm trong resources/views/fontend

<html>
   <head>
      <title>{{ $news_title }}</title>
      <link href = "https://fonts.googleapis.com/css?family=Arial:100" rel = "stylesheet" type = "text/css">
      <style>
         html, body {
            height: 100%;
         }
         body {
            margin: 0;
            padding: 0;
            width: 100%;
            display: table;
            font-weight: 100;
            font-family: 'Arial';
         }
         .container {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
         }
         .content {
            text-align: center;
            display: inline-block;
         }
         .title {
            font-size: 96px;
         }
      </style>
   </head>
   <body>
      <div class = "container">
         <div class = "content">
            <h1>{{ $news_title }}</h1>
            <p>
               ID bài viết: {{ $news_id }}
               <br> Tiêu đề: {{ $news_title }}
               <br> Nội dung: Chưa có nội dung gì cả
            </p>
         </div>
      </div>
   </body>
</html>

Laravel view xây dựng logic trong giao diện

Chia sẻ dữ liệu cho tất cả các View

Có những lúc bạn muốn chia sẻ một dữ liệu để tất cả các view khi được render bởi hệ thống sẽ sử dụng dữ liệu này. Thực hiện bằng cách sử dụng phương thức share() trong phương thức boot() của service provider, đơn giản là thêm vào app\Provider\AppServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::share('key', 'value');
    }

    ...
    public function register()
    {
        //
    }
}

Khi đó, trong các view bạn chỉ cần sử dụng {{ $key }} là nó sẽ in ra ‘value’.

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

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

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

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

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

Khi các bạn làm việc với CSS đặc biệt là làm những giao diện liên quan đến nội dung như những đoạn chữ ngắn hay dài. Đôi khi trong thiết kế chỉ hiển thị vài ba chữ làm giao diện trở nên rất đẹp, tuy nhiên khi chúng ta đưa vào dự án, nội dung có thể thay đổi dài hơn hoặc ngắn đi làm cho giao diện chúng ta gặp nhiều vấn đề không mong muốn.

  5 điều phiền toái nhất của CSS
  11 công cụ hữu ích để kiểm tra và tối ưu hóa các file CSS

Vì thế trong bài viết này mình sẽ đi vào các vấn đề đó kèm theo là các kỹ thuật để xử lý chúng một cách hiệu quả để kết quả chúng ta làm ra luôn được kết quả tốt nhất nhé. Bắt đầu thôi nào.

Vấn đề

Trước khi đi sâu vào kỹ thuật để xử lý các vấn đề về nội dung liên quan tới chữ, thì mình sẽ trình bày một vài vấn đề trước cho các bạn dễ hình dung, như ở dưới hình này chúng ta có một vertical menu(menu hiển thị theo chiều dọc)

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Như các bạn thấy là nếu bên trái là theo thiết kế rất chi là đẹp, tuy nhiên nếu nội dung dài ra thì sẽ bị xấu đi một chút. Thì lúc này chúng ta cần đặt ra những câu hỏi như là

  • Chúng ta có nên sử dụng kỹ thuật cắt chữ để hiển thị trên một hàng hay không ?
  • Hay là chúng ta cứ để nó hiển thị thành nhiều hàng ? Nếu có thì hiển thị tối đa bao nhiêu hàng là được hay là thích bao nhiêu hàng cũng được.

Đó là trường hợp có nhiều chữ hơn là chúng ta muốn nhưng nếu nội dung là một chữ nhưng kéo dài thì sao? Mặc định thì chắc chắn nó sẽ tràn ra ngoài Container bao ngoài như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Là một Frontend Developer thì chúng ta phải biết cách để giải quyết những vấn đề thế này. Và tất nhiên là trong CSS sẽ có những thuộc tính CSS mà có thể giúp chúng ta xử lý chúng. Như ở trên là mình nói những nội dung dài làm bể layout, tuy nhiên nội dung ngắn cũng có thể luôn nhé nhưng sẽ khác một chút, có thể các bạn thắc mắc là nội dung ngắn sao mà gây ảnh hưởng tới giao diện được chứ, cùng xem giao diện ở dưới đây nha

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Bí kíp tự học thiết kế web hiệu quả chỉ trong 30 ngày mà bạn nên tham khảo( Khoá học của mình, học xong đảm bảo cải thiện trình độ ) bạn nhấn vào đây và đừng quên nhập mã FECOVID để được giảm thêm 100k nha.

Như hai Button ở trên khi nội dung dài bên trái thì giao diện rất là đẹp, nhưng bên phải khi nội dung chỉ có chữ Ok thì nhìn UI nó kỳ kỳ không ổn chút nào cả. Vậy làm sao để giải quyết vấn đề này, có thể sử dụng thuộc tính min-width cho Button được không nhỉ ?

Như bạn vừa mới đọc xong phần vấn đề thì sẽ thấy là không chỉ có những nội dung dài mới làm giao diện bị ảnh hưởng mà những nội dung ngắn cũng sẽ gây ảnh hưởng. Cho nên với việc sử dụng các kỹ thuật trong CSS thì ít nhất chúng ta có thể giảm thiểu được các vấn đề liên quan đến nội dung này. Tiếp tục tìm hiểu thôi nào.

Nội dung dài

Overflow Wrap

Thuộc tính overflow-wrap này sẽ giúp cho chúng ta xử lý khi nội dung chữ bị tràn ra ngoài khi nó quá dài(ví dụ: aaaaaaaaaaaaaaaaaaaa), các bạn xem hình dưới đây sẽ rõ

.card {
  overflow-wrap: break-word;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Hyphens

Một thuộc tính CSS hay ho khác đó chính là hyphens, thuộc tính này sẽ thêm vào dấu  khi chữ dài không vừa với Container bao ngoài, việc thêm dấu  vào tuỳ thuộc vào trình duyệt quyết định là thêm vào khúc nào nên chúng ta sẽ không kiểm soát được nhé.
.element {
  hyphens: auto;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Text Truncation

Nghe cụm từ này thì các bạn có thể hiểu là những thuộc tính CSS nó sẽ cắt chữ sau đó là thêm dấu 3 chấm vào phía sau nha. Coi hình phát là hiểu ngay

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để làm được kết quả như trên thì không có một thuộc tính nào làm ra được cả mà là bao gồm nhiều thuộc tính CSS kết hợp lại với nhau

.element {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Multiple Line Text Truncation

Như ở trên là khi chúng ta muốn hiển thị chữ một dòng rồi kết hợp dấu 3 chấm, nhưng trường hợp chúng ta muốn hiển thị nhiều dòng rồi mới có dấu 3 chấm phía sau thì làm sao ? Thì lúc này chúng ta nên sử dụng thuộc tính line-clamp trong CSS để xử lý vấn đề này như sau

.element {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Để kỹ thuật này hoạt động tốt thì bắt buộc phải sử dụng display: -webkit-box, và thuộc tính -webkit-line-clamp sẽ điền vào giá trị là số dòng mà các bạn muốn hiển thị rồi mới có dấu 3 chấm.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Tuy nhiên kỹ thuật này sẽ gặp một vấn đề đó là nếu các bạn sử dụng kèm thuộc tính padding thì nó sẽ hiển thị ra kết quả không như mong muốn.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Cho nên để khắc phục các bạn nên áp dụng kỹ thuật này cho những thẻ mà không có padding. Mình ví dụ các bạn có HTML như sau

<h2>This is long content</h2>

Nếu thẻ h2 có padding và áp dụng kỹ thuật cắt chữ nhiều hàng ở trên thì sẽ bị lỗi đúng không ? Cho nên lúc này để có thể áp dụng được tốt thì trong thẻ h2 các bạn thêm một thẻ khác bọc lại đoạn chữ đó, như thẻ span chẳng hạn rồi áp dụng kỹ thuật trên cho thẻ span là ngon lành.

<h2><span>This is long content</span></h2>

Horizontal Scrolling

Đôi khi không phải lúc nào cắt chữ hay thêm dấu hyphens(-) cho nội dung là cách tốt nhất. Ví dụ nếu các bạn đọc các bài viết ở blog mình và có các đoạn code mình chia sẻ trong một khung hiển thị, thì nếu mình áp dụng các kỹ thuật trên thì sẽ rất kỳ vì code mà rớt dòng từ chữ hay ký tự thì sẽ không hiểu là viết cái gì.

Ở vấn đề này thì cách tốt nhất là không áp dụng các kỹ thuật mà chúng ta vừa nói đến ở trên mà chỉ đơn giản là cho phép người dùng scroll ngang là được với thuộc tính overflow-x: auto như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Nội dung ngắn

Vấn đề nội dung dài chúng ta đã tìm hiểu và áp dụng các kỹ thuật CSS vào rồi. Ở mục này chúng ta sẽ tìm hiểu các vấn đề liên quan tới nội dung ngắn nha.

Thiết lập độ rộng tối thiểu

Giờ thì quay lại vấn đề mà mình đã đề cập ở đầu bài. Làm sao để có thể xử lý vấn đề này cho Button để giao diện của chúng ta trông ổn hơn khi nội dung Button quá ngắn

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Cách đơn giản nhất là sử dụng thuộc tính min-width cho Button là xong. Lúc này thì giao diện của chúng ta sẽ ổn hơn rất nhiều.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các ví dụ thực tế

Profile Card

Như giao diện thông tin cá nhân dưới đây thì sẽ nảy sinh nhiều vấn đề, giả sử trong thiết kế chỉ có một hàng nhưng ra ngoài nội dung dài quá thì sao ? Chúng ta nên dùng single line truncate hay multiple lines truncate, cái này tuỳ thuộc vào yêu cầu của sếp hay khách hàng nha keke.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

/* Solution 1 */
.card__title {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

/* Solution 2 */
.card__title {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Chúng ta có giải pháp rồi, chỉ áp dụng vào thôi, nếu họ cần một dòng thì áp dụng giải pháp 1, còn nhiều dòng thì áp dụng giải pháp 2. Thế thôi!

Article Content

Khi chúng ta làm việc với nội dung mà hiển thị ở trên điện thoại, và trong nội dung đó có thẻ a(link) với nội dung cực dài, tất nhiên là giao diện chúng ta sẽ bị ảnh hưởng thôi.

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để giải quyết vấn đề này thì chúng ta có thể áp dụng một trong hai cách chúng ta đã nói đó chính là overflow-wrap hoặc hyphens

.article-content p {
  overflow-wrap: break-word;
}

Shopping Cart

Khi các bạn làm việc với giỏ hàng, trong giỏ hàng có thông tin sản phẩm với giao diện gồm có hình ảnh, tên sản phẩm và nút xoá, nếu các bạn không chú ý thì lỡ tên sản phẩm quá dài thì sẽ dính vào nút xoá như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Để khắc phục nó cách đơn giản là dùng padding-right hay margin-righrt là xong xuôi

.product__name {
  margin-right: 1rem;
}

Flexbox And Long Content

Đây là một vấn đề rất hay gặp khi chúng ta làm việc với flexbox khi chúng ta có nội dung nằm trên một hàng nhưng nội dung một bên quá dài làm ảnh hưởng phần tử bên kia như này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

<div class="user">
  <div class="user__meta">
    <h3 class="user__name">Ahmad Shadeed</h3>
  </div>
  <button class="btn">Follow</button>
</div>
.user {
  display: flex;
  align-items: flex-start;
}

.user__name {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}

Chúng ta có thể áp dụng các kỹ thuật đã bàn tới nhưng nó lại không hoạt động, nội dung vẫn bị dài ra và làm ảnh hưởng tới giao diện

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Bí kíp tự học thiết kế web hiệu quả chỉ trong 30 ngày mà bạn nên tham khảo( Khoá học của mình, học xong đảm bảo cải thiện trình độ ) bạn nhấn vào đây và đừng quên nhập mã FECOVID để được giảm thêm 100k nha.

Lý do chính là khi chúng ta làm việc với flexbox thì flex item sẽ không shrink(co lại) dưới độ rộng tối thiểu của nội dung. Để giải quyết nó thì chúng ta sẽ áp dụng min-width: 0 cho thằng bao ngoài user__name là user__meta là ngon lành
.user__meta {
  /* other styles */
  min-width: 0;
}

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Các bạn có thể thắc mắc là tại sao min-width: 0 lại hoạt động khi sử dụng cho flex item trong flexbox, mình xin giải thích cho các bạn luôn nha.

Giá trị mặc định của thuộc tính min-width là auto, có thể hiểu là được tính là 0. Khi một phần tử là flex item(phần tử nằm trong phần tử có sử dụng flexbox), thì giá trị của min-width lúc này không được tính là 0 nữa. Mà độ rộng tối thiểu của flex item lúc này bằng độ rộng của nội dung của nó, tức là nó dài bao nhiêu thì min-width lúc này sẽ bấy nhiêu luôn. Các bạn xem ví dụ này

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Lúc này các bạn sẽ thấy là tên người dùng(class ví dụ là c-person__name) rất là dài cho nên sẽ làm cho nội dung bị tràn và xuất hiện scroll ngang cho nên lúc này mình áp dụng các kỹ thuật đã học vào để cắt chữ lại cho giao diện ổn hơn như sau

.c-person__name {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

Nhưng mà do đây là flex item cho nên nó sẽ không hoạt động, vì thế chúng ta phải dùng thêm thuộc tính min-width để giải quyết nó

.c-person__name {
  /*Other styles*/
  min-width: 0;
}

Tada! Chúng ta sẽ có kết quả đẹp như mong muốn

Các kỹ thuật xử lý vấn đề về nội dung trong CSS mà bạn nên biết

Tạm kết

Mình hi vọng với bài viết này sẽ giúp các bạn nâng cao kiến thức hơn, biết thêm nhiều kỹ thuật mới hơn để có thể xử lý nhiều vấn đề về giao diện mà liên quan tới nội dung nhé.

Bài viết này mình đã xin phép tác giả Ishadeed và xin được viết lại dưới ngôn ngữ tiếng Việt để có thể giúp các bạn hiểu hơn từ bài viết gốc ở đây.

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

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

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

SQL vs NoSQL – Nên chọn gì để quản trị cơ sở dữ liệu

Sql vs NoSql

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

Trong thế giới của CSDL hiện tại ta có hai loại giải pháp chính đó là: SQL và NoSQL (cơ sở dữ liệu quan hệ và cơ sở dữ liệu phi quan hệ). Cả hai đều rất khác nhau về cách chúng được xây dựng, loại dữ liệu nó chúng lưu trữ và cả cách thức lưu trữ dữ liệu của chúng.
Cơ sở dữ liệu quan hệ lưu trữ những dữ liệu có cấu trúc rõ ràng ví dụ như danh bạ điện thoại thì sẽ chắc chắn sẽ chứa tên người và số điện thoại của người đó.

Còn cơ sở dữ liệu phi quan hệ lưu trữ giữ liệu không có cấu trúc, cấu trúc của nó rất động và phân tán, ví dụ như chứa một tệp tài liệu (document) về người dùng như số điện thoại, địa chỉ, hay những activity của họ trên Facebook hay các trang mua sắm trực tuyến. Dữ liệu của nó thường dưới dạng key-value dạng JSON, và những document có thể được tạo mà không cần phải xác định trước cấu trúc.

SQL

CSDLQH chứa dữ liệu theo dạng dòng (rows) và cột (columns). Mỗi dòng sẽ chứa những thông tin của dữ liệu và mỗi cột sẽ chứa những đặc điểm của dữ liệu, giữa các bảng có thể có liên kết với nhau qua khóa ngoại (foreign key). Một số CSDLQH phổ biến là MySQL, Oracle, MS SQL Server, SQLite, Postgres, MariaDB và IMB D2.

Tham khảo ngay các SQL Developer Jobs tại đây

NOSQL

NoSQL được phân thành 4 loại chính sau:

Key-Value Stores

Dữ liệu sẽ được lưu dưới dạng cặp key-value, với ‘key’ là thuộc tính duy nhất để liên kết với giá trị (value) của nó. Các Key-Value stores nổi tiếng bao gồm Redis hay Amazon DynamoDB.

System Design Cơ Bản - Sql vs. Nosql

Document Databases

Là DB chứa dữ liệu dạng theo kiểu các tệp tài liệu (document) để thay thế cho kiểu dòng và cột trong table và nhiều document gộp lại sẽ thành một Collection. Khác với kiểu table là mỗi document sẽ chưa các dạng cấu trúc khác nhau. Ví dụ trong MongoDB thì mỗi document sẽ chứa dữ liệu kiểu JSON, tức là mỗi document là một JSON. Document DB tiêu biểu hiện tại có MongoDB và CouchDB.

System Design Cơ Bản - Sql vs. Nosql

Wide-Column Databases

Wide-Column hay còn gọi là Big-Table là mô hình dữ liệu để lưu trữ dữ liệu với khả năng mỗi rows chứa rất nhiều column(cột) mỗi cột lại là một cặp key-value, và ở đây số lượng cột là tùy biến (dynamic) cho mỗi rows, có nghĩa là số cột ở mỗi rows là khác nhau. Có thể thấy nó giống như kiểu key-value hai chiều với mỗi key lại chứa nhiều cặp key-value bên trong. Các Wide-Column DB tiêu biểu bao gồm Cassandra hay HBase.

System Design Cơ Bản - Sql vs. Nosql

Graph Databases

DB dạng này sẽ lưu dữ liệu dạng cấu trúc dữ liệu kiểu đồ thị (graph) để biểu thị mối quan hệ giữa các dữ liệu với nhau. Dữ liệu được lưu vào các nodes (entities) và thuộc tính của node, liên kết giữa các nodes sẽ qua các lines. Graph DB phổ biến có Neo4J và InfiniteGraph.

System Design Cơ Bản - Sql vs. Nosql

Mô tả quan hệ trên Facebook của người dùng sử dụng Graph DB

  NoSQL là gì? Điểm mạnh vượt trội của NoSQL

SỰ KHÁC NHAU GIỮA SQL VÀ NOSQL

Lưu trữ — Storage

– SQL lưu trữ dữ liệu trong các bảng (tables) trong đó mỗi row đại diện cho một thực thể dữ liệu (entity), và mỗi column sẽ chứa các thuộc tính của entity; ví dụ nếu ta chứa dữ liệu của thực thể xe hơi (car entity) ta sẽ lưu trữ vào một bảng dữ liệu có nhiều column đại diện cho đặc điểm của chiếc xe đó như “màu” “nhãn hiệu” “hãng sản xuất” …
– NoSQL lưu trữ dữ liệu trên rất nhiều loại cấu trúc dữ liệu khác nhau như đã bàn bên trên như dạng key-value, document hay graph.

Lược đồ dữ liệu của thực thể — Schema

– Trong SQL thì mỗi bản ghi có schema là cố định, tức là mỗi column trong table phải được định nghĩa từ trước khi tạo bảng, và mỗi khi dữ liệu được thêm vào một row thì các column của nó phải có giá trị (chấp nhận giá trị NULL). Các schema có thể được thay đổi sau đó (alter table), nhưng sự thay đổi này phải nằm ở phía Database và khi DB thực hiện thay đổi này nó sẽ offline tạm thời.
– Trong NoSQL, schema là động (dynamic) có nghĩa là ta không cần phải định nghĩa một schema nào trước mà schema sẽ được dựa vào cấu trúc của records được đưa vào.

Truy vấn — Querying

– SQL truy vấn thông qua một ngôn ngữ truy vấn mang tính cấu trúc được gọi là Structured Query Language (SQL) thao tác với dữ liệu. SQL là một ngôn ngữ rất mạnh mẽ và lâu đời là đại diện duy nhất cho toàn bộ các RDBMS khác nhau.
– NoSQL truy vấn của nó thường được gọi là UnSQL (Unstructured Query Language) mỗi dạng NoSQL khác nhau sẽ có cấu trúc cú pháp (syntax) khác nhau để có thể lấy ra các dạng dữ liệu khác nhau (collection, key-value, node …)

Khả năng mở rộng — Scalability

– Trong hầu hết các RDBMS thì khả năng mở rộng là theo chiều ngang (vertically scalable) ví dụ như tăng sức mạnh phần cứng của máy chủ hiện tại (tăng CPU, Ram…), tất nhiên rằng cách làm này rất đắt đỏ cũng như tốn thời gian mà đặc biệt là nó luôn có giới hạn nào đó.
– Còn với NoSQL DB thì hỗ trợ rất tốt cho mở rộng theo chiều dọc (horizontally scalable), có nghĩa là đơn giản chỉ thêm server vào các nodes hiện có, cách làm này đơn giản cũng như rẻ tiền hơn. Phần lớn các NoSQL DB công việc này đã được hỗ trợ sẵn và được làm tự động, có nghĩa là rất dễ để triển khai.

Độ tin cậy — Reliability

– Hầu hết các RDBMS đều tuân thủ theo các thuộc tính của ACID (atomicityconsistencyisolation, và durability) vì vậy nó rất đảm bảo độ tin cậy và bảo toàn dữ liệu.
– Còn với NoSQL thì đa phần sẽ hy sinh tính chất ACID để đánh đổi với performance (hiệu năng) và khả năng mở rộng (scalability).

KHI NÀO THÌ CHÚNG TA SỬ DỤNG SQL HAY NOSQL

SQL hay NoSQL đều có những tính chất khác nhau phục vụ cho những nhu cầu đặc biệt khác nhau, do vậy không có DB nào thực sự là hoàn hảo phù hợp cho mọi nhu cầu tùy vào mục đích của hệ thống sở tại. Ngay cả khi hiện tại NoSQL đang trở nên phổ biến rộng rãi về tốc độ và khả năng mở rộng, nhưng vẫn có tình huống mà một SQL DB sẽ hoạt động tốt hơn (ví dụ hệ thống về giao dịch tiền tệ cần đảm bảo về tính ACID)

Lý do sử dụng SQL DB

1. Ứng dụng yêu cầu sử lý dữ liệu theo các transaction để tuân thủ tính ACID để bảo toàn tính nhất quán và toàn vẹn của dữ liệu bằng cách quy định các thuộc tính ACID bắt buộc khi thực hiện một transaction, ví dụ như các hệ thống về tài chính hay thương mại điện tử.
2. Nếu ứng dụng của hệ thống được xác định trước cấu trúc dữ liệu, và nghiệp vụ không đòi hỏi sự mở rộng trong tương lai và đòi hỏi sự nhất quán (consistent) trong dữ liệu.

Lý do sử dụng NoSQL DB

1. Hệ thống đòi hỏi cần lưu một số lượng cực lớn dữ liệu không có cấu trúc rõ ràng ngay từ đầu và tăng dần theo thời gian. Lúc này NoSQL là sự lựa chọn tốt nhất vì tính không rằng buộc trong kiểu dữ liệu (data type) bằng cách lưu trữ dữ liệu dạng document và tính chất mở rộng theo chiều ngang (horizontally scalable).

2. Các hệ thống cần phát triển nhanh (rapid development). NoSQL rất phù hợp với rapid development bởi vì nó không cần mất thời gian chuẩn bị (cấu trúc DB, cấu trúc bảng cột…). Nếu chúng ta cần làm việc với hệ thống nghiệp vụ chưa thực sự rõ ràng ngay từ đầu và đòi hỏi sự linh hoạt thay đổi “data type” giữa các sprint mà không ảnh hưởng cũng như đòi hỏi sự thay đổi hay độ trễ (downtime) tới hệ thống giữa các version, lúc này cơ sở dữ liệu quan hệ (RDBMS) sẽ làm chậm chúng ta lại.

3. Hệ thống được xây dựng và lưu trữ dữ liệu trên Cloud Computing. Lưu trữ dữ liệu trên Cloud là một giải pháp tiết kiệm chi phí tuyệt vời nhưng đòi hỏi dữ liệu phải lưu trữ đồng thời trên nhiều máy chủ để mở rộng quy mô (scale up). NoSQL như Cassandra được thiết kế tối ưu cho việc này mà không cần ta phải động tay động chân quá nhiều.

(*) Bonus: Bên trên tôi nhắc khá nhiều về transaction và ACID, vậy hãy đi qua một chút thế nào là một transaction và ACID?

Một transaction là một quá trình xử lý từ khi bắt đầu tới khi kết thúc thỏa mãn bốn tính chất ACID. Bốn chữ đó viết tắt của bốn tính chất quan trọng sau:

  • Atomicity: tính “nguyên tử” của giao dịch. Nghĩa là mọi giao dịch chỉ thành công khi tất cả các phần thành công All or Nothings.
  • Consistency: tính nhất quán. Nghĩa là mọi dữ liệu được thao tác đều nhất quán với tất cả các quy tắc (rules), các ràng buộc (constraint)… trong toàn bộ quá trình xử lý từ khi bắt đầu tới khi kết thúc.
  • Isolation: tính cô lập. Nó đảm bảo việc thực thi đồng thời của các giao dịch chỉ có thể có kết quả khi các giao dịch được thực hiện tuần tự. Ví dụ: hai giao dịch cùng sửa một table, thì các giao dịch đó phải được thực hiện tuần tự, giao dịch này xong mới tới giao dịch kia.
  • Durability: tính bền. Nghĩa là mọi giao dịch khi commit thì kết quả nó phải được đảm bảo, cho dù ứng dụng bị tắt, mất điện server.

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

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

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

Để tự động hóa kiểm thử thành công – Phần 2

Để tự động hóa kiểm thử thành công – Phần 2

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

Theo Hans, dịch từ opensource.com

Phần 1

Tôi sẽ mô tả một vài bước mà có thể giúp chúng ta giảm thiểu những vấn đề này. Một kiểm thử tự động tốt là dựa trên mệt thiết kế tốt. Cách chúng ta thiết kế kịch bản kiểm thử có tác động lớn đến cách tự động hóa kiểm thử của chúng ta. Nói cách khác, kiểm thử tự động không phải là một thách thức về kỹ thuật mà là thách thức về thiết kế. Nhìn toàn diện, có hai cấp độ lớn của một thiết kế kiểm thử tốt:

  • Cấu trúc của toàn bộ kịch bản kiểm thử
  • Thiết kế của từng kịch bản kiểm thử riêng biệt
  Các mức độ kiểm thử được sử dụng trong kiểm thử chức năng của một phần mềm
  Kiểm thử một đối tượng Textbox

Về cấu trúc của toàn bộ kịch bản kiểm thử, chúng tôi đi theo cách tiếp cận dạng modul, một cách tiếp cận tương tự như cách ứng dụng được thiết kế. Mỗi kịch bản kiểm thử được tổ chức trong một modul kiểm thử. Chúng tôi có các bản mẫu hướng dẫn chi tiết để làm như vây, nhưng tối thiểu, bạn nên thử phân biệt các kiểm thử nghiệp vụ và kiểm thử tương tác. Các kiểm thử chức năng nên thiên về các đối tượng nghiệp vụ và các luồng hoạt động của nghiệp vụ, bỏ qua hoàn toàn bất kỳ kiểm thử hướng giao diện (hay dịch vụ API). Kiểm thử tương tác nhìn vào tính tương tác của ứng dụng từ người dùng hay các hệ thống/ứng dụng khác, do đó giao diện là vấn đề cần quan tâm. Mục tiêu chính là để bỏ qua việc pha trộn các kịch bản kiểm thử nghiệp vụ và tương tác, mà ở đó, mức độ chi tiết của kịch bản kiểm thử tương tác sẽ quá phức tạp để có thể hiểu và duy trì.

Một khi các modul kiểm thử được xác định, chúng có thể được tự động hóa bất cứ khi nào thuận tiện. Thông thường, các kịch bản kiềm thử nghiệp vụ có thể được tạo ra sớm, bởi vì nó phụ thuộc vào các quy tắc nghiệp vụ nhiều hơn cách mà ứng dụng hiện thí chúng ở giao diện. Kiểm thử tương tác có thể được tạo ra khi nhóm phát triển xác định được giao diện và các dịch vụ API.

Một cách có hiệu quả khác là kiểm thử theo hướng BDD hoặc từ khóa (hành động). Trong BDD, kịch bản được viết với định dạng như ngôn ngữ tự nhiên. Các từ khóa là các hành động và so sánh được định nghĩa với các bước cần được làm trong từng bước của kịch bản kiểm thử. Trong cách tiếp cận ABT, các hành động được viết với một định dạng bảng để các bước trong kiểm thử dễ đọc và dễ duy trì hơn so với việc viết kịch bản kiểm thử với ngôn ngữ lập trình. Từ việc sử dụng các từ khóa làm cho kịch bản kiểm thử rõ ràng và dễ quản lý hơn các câu lệnh dài dòng, tôi đã tạo ra một công cụ cho phép chuyển đổi giữa hai định dạng, kết hợp lợi ích của cả hai thế giới: từ khóa và câu lệnh lập trình. Các bạn có thể tham khảo thêm bài viết của tôi cho Techwell Insights về BDD và từ khóa.

Hình dưới đây mô tả cách kiểm thử được quản lý với ABT, với các modul kiểm thử và hành động bên trong nó. Chú ý rằng có sự phân biệt giữa kiểm thử nghiệp vụ và kiểm thử tương tác. Sự tự động hóa tập trung chủ yếu vào việc thiết lập các hành động.

Để tự động hóa kiểm thử thành công – Phần 2

Một yếu tố quan trọng khác để xác định sự thành công của kiểm thử tự động là khả năng kiểm thử của hệ thống. Ứng dụng của chúng ta nên coi việc tạo điều kiện cho việc kiểm thử là một việc quan trọng. Một nhóm Agile rất thích hợp để đạt được điều này khi mà mọi người trong nhóm phát triển đều hợp tác để cho ra một sản phẩm cuối cùng. Tuy nhiên, với các dự án mã nguồn mở không nhất thiết sẽ có một nhóm như vậy, và quyền sở hữu sản phẩm sẽ quyết định khả năng kiểm thử của sản phẩm.

Về khả năng kiểm thử của hệ thống, các bạn có thể tham khảo thêm ở đây. Các khía cạnh chính của khả năng kiểm thử của hệ thống bao gồm:

  • Thiết kế tổng hợp của ứng dụng (bao gồm rõ ràng các thành phần, dịch vụ, v.v…)
  • Tính năng cụ thể của ứng dụng (như API hay các thuộc tính thời gian, tính đơn nhất và ổn định của đối tượng giao diện, các dữ liệu đầu vào và sự kiện của ứng dụng, v.v…)

Tự động hóa là một thách thức, đặc biệt là với giao diện. Tuy nhiên, nó không thể – hay không nên – bị bỏ qua bởi vì nó khó. Hợp tác giữa tất cả mọi người tham gia vào dự án có thể dẫn đến một kết quả tốt, ổn định, dễ duy trì và hiệu quả.

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

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

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

System Design Cơ Bản: Mô hình về tính nhất quán Acid và Base

Mô hình nhất quán dữ liệu

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

Khi nói đến cơ sở dữ liệu NoSQL, các mô hình nhất quán dữ liệu đôi khi có thể khác biệt đáng kể so với các cơ sở dữ liệu quan hệ được sử dụng (cũng như khá khác biệt so với các cơ sở dữ liệu NoSQL khác).

Hai mô hình nhất quán phổ biến nhất được biết đến bởi các từ viết tắt ACID và BASE. Mặc dù chúng thường đọ sức với nhau trong một trận chiến để giành chiến thắng cuối cùng, cả hai mô hình nhất quán đều có ưu điểm – và nhược điểm – và không phải lúc nào cũng phù hợp hoàn hảo.

  12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024
  Crawl dữ liệu bằng JavaScript ngay trên trình duyệt

Chúng ta hãy xem xét kỹ hơn về sự đánh đổi của cả hai mô hình nhất quán cơ sở dữ liệu.

17-1

ACID

Nhiều developer đã quen thuộc với các ACID transaction khi làm việc với các cơ sở dữ liệu quan hệ. Như vậy, mô hình nhất quán ACID đã trở thành chuẩn mực trong một thời gian.

ACID là 1 tập hợp các thuộc tính mà 1 transaction (giao dịch) thao tác với database phải đạt được nhằm bảo đảm tính toàn vẹn, hợp lệ, an toàn, tính bền vững… của dữ liệu ở database.

Nếu 1 transaction không thoả mản 1 trong các thuộc tính này thì sẽ không thể thao tác với database thành công, bị rollback ngay lập tức.

ACID là cụm từ viết tắt của 4 thuộc tính sau: AtomicityConsistencyIsolation và Durability. Giờ cùng nhau tìm hiểu các thuộc tính này nhé:

Atomicity (tính nguyên tử ): dựa vào rule “All or nothing“, như ông bà có câu: được cả ngã về không vậy đó. Khi một chuỗi các transaction lần lượt thao tác với database, nếu 1 transaction đang trong xử lý mà xảy lỗi ở database, hay crash hệ thống, bla bla,… thì toàn bộ các transaction sẽ bị hủy bỏ và bị rollback, dữ liệu ở database vẫn giữ như cũ trước khi có sự thay đổi. Nếu như không xảy ra lỗi hay vấn đề gì trong quá trình xử lý các transaction thì các transaction đó sẽ commit thành công, dữ liệu phía database cũng được cập nhật thành công luôn, nhà trai nhà gái ai nấy đều vui 😀 .

Consistency (Tính nhất quán): 1 transaction phải đảm bảo tính hợp lệ của dữ liệu khi cập nhật vào database. Nếu dữ liệu đưa vào database mà như kiễu dữ liệu không phù hợp, không thỏa mãn constraint, rule, trigger, nhầm table,… thì transaction đó sẽ bị rollback, dữ liệu ở database vẫn được giữ nguyên lúc chưa thay đổi. Chính vì vậy dữ liệu từ transaction phải hợp lệ, đúng đắn, nhất quán với những constraint, cấu trúc table, rule…được định nghĩa hay khai báo từ phía database.

Isolation (Tính cô lập): Mọi thao tác của 1 transaction đều phải được cô lập, tránh xa khỏi “bàn tay” của các transaction khác, kiểu như nhà ai nấy ở, đèn ai nấy sáng vậy đó. 1 transaction này thì không thể đọc dữ liệu ở database mà transaction kia đang update. Nếu 2 transaction đang làm việc đồng bộ với nhau thì sẽ “giả vờ” như đang làm việc tuần tự, 1 transation này sẽ chờ cho đến khi transaction kia commit thành công thì mới bắt đầu xông pha ra mặt trận.

Durability (Tính bền bỉ): Khi 1 transaction update dữ liệu thành công, thì thay đổi của dữ liệu đó phải được đảm bảo lưu trữ ở trạng thái bền vững, vĩnh viễn,…Và ngay cả khi database bị crash, lỗi hay hệ thống restart thì dữ liệu ở database vẫn luôn ở trạng thái thay đổi mới nhất, chính xác.

BASE

Cơ sở dữ liệu NoSQL phù hợp hơn nhiều để lưu trữ dữ liệu như nội dung bài viết, bài đăng trên các kênh media, dữ liệu cần kiểm duyệt và các loại dữ liệu phi cấu trúc khác khó mà xếp vừa trong một bảng. Cơ sở dữ liệu NoSQL được xây dựng với tính linh hoạt, khả năng mở rộng và tuân theo mô hình nhất quán BASE, có nghĩa là:

Basic Availability – Tính sẵn sàng ở mức cơ bản: Trong khi cơ sở dữ liệu đảm bảo tính khả dụng cho dữ liệu, cơ sở dữ liệu có thể không nhận được dữ liệu được yêu cầu, dữ liệu có thể ở trạng thái thay đổi hoặc không nhất quán.

Soft state – Trạng thái mềm: Trạng thái của cơ sở dữ liệu có thể thay đổi theo thời gian.

Eventual consistency – Tính nhất quán: Cơ sở dữ liệu sẽ trở nên nhất quán và dữ liệu sẽ được lan truyền khắp mọi nơi tại một thời điểm nào đó trong tương lai.

Mô hình BASE được xây dựng để tạo ra tính linh hoạt tối đa. Nhưng trên thực tế có một số cơ sở dữ liệu NoSQL vẫn tuân thủ hệ quy chuẩn ACID.

Nhìn chung, mô hình nhất quán BASE cung cấp một sự đảm bảo ít nghiêm ngặt hơn ACID: dữ liệu sẽ nhất quán trong tương lai, tại thời điểm đọc (ví dụ: Rịa) hoặc sẽ luôn nhất quán, nhưng chỉ đối với các ảnh chụp nhanh được xử lý trước đó (ví dụ: Datomic) .

Mô hình nhất quán BASE được sử dụng chủ yếu bởi các aggregate stores, including column family, key-value và document stores

ACID VS. BASE TRADE-OFFS

Không có câu trả lời đúng nào cho việc ứng dụng của bạn cần mô hình nhất quán ACID so với BASE. Các developer và architect nên lựa chọn sự đánh đổi tính nhất quán dữ liệu của họ trong từng trường hợp cụ thể – không chỉ dựa trên những gì chỉ mang tính xu hướng hoặc mô hình nào đã được sử dụng trước đó.

Với tính nhất quán lỏng lẻo của BASE, các developer cần phải hiểu biết nhiều hơn và nghiêm ngặt hơn về dữ liệu nhất quán nếu họ chọn BASE cho ứng dụng.

Mặt khác, việc lập kế hoạch xung quanh các giới hạn của BASE đôi khi có thể là một bất lợi lớn khi so sánh với sự đơn giản của các giao dịch ACID. Một cơ sở dữ liệu ACID đầy đủ là sự phù hợp hoàn hảo cho các trường hợp sử dụng trong đó độ tin cậy và tính nhất quán của dữ liệu là điều cần thiết (ví dụ như ngân hàng).

READ MORE:

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

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

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

Lập trình viên vượt qua rào cản bất lực bằng cách nào?

developer-vuot-qua-rao-can-bat-luc-bang-cach-nao

Ai cũng đã từng trải qua nó.

Sự kiệt sức xảy ra với tất cả chúng ta. Nhưng đầu tiên, làm sao chúng ta phân biệt được giữa kiệt sức và chỉ mệt mỏi đơn thuần? Có rất nhiều nhân tố ảnh hưởng đến việc này.

  • Coding không còn là đam mê sở thích nữa và bạn không thể tập trung làm nó được.
  • Dễ cáu kỉnh (cứ như thể dev chưa đủ chuyện để nóng nảy vậy)
  • Có dấu hiệu trầm cảm

Đây chỉ là một vài trong số nhiều suy nghĩ cảm xúc của một người kiệt sức. Tất cả đều có một điểm chung: Bạn đang bị mắc kẹt một chỗ.

Hằng ngày tôi làm việc nhiều giờ đồng hồ, hiếm khi mới có ngày off. Tôi là chủ doanh nghiệp và là dev duy nhất của các web project. Để có thể hoàn thành các project đúng hạn, tôi thường phải thức rất khuya, hi sinh giờ sinh hoạt và ngủ ít lại.

Chính vì thế mà mọi chuyện còn tệ hơn nữa khi tôi nhận job thứ hai.

Rất nhiều người (nhất là người khởi nghiệp) bị ám ảnh về việc thành công sớm mà hi sinh cả thanh xuân, sức khỏe để làm không ngừng nghỉ. Vượt qua giới hạn của bản thân là tốt nhưng hành hạ nó không đâu là ngu ngốc không đáng.

Sau 6 tuần dằng dẳng làm job thứ hai (kết hợp với việc phải cân bằng project kia), tôi mới nhận ra rằng mình đang lẵng phí thời gian. Tôi làm mà không còn vui thích nữa. Tôi cảm thấy tôi đã phá hủy niềm đam mê tôi từng có. Tôi sẽ như thế này mãi mãi ư?

Câu trả lời là không. Tôi làm rất nhiều thứ khác nhau để hồi phục sau chuyện này. Đây là những gì tôi học được.

Ngừng làm việc quá sức.

Okay fine, tôi biết là câu này quá nhàm chán, nhưng cứ nghe tôi nói đã. Ví dụ bạn là một dev đi làm 5 ngày một tuần từ 9 giờ sáng đến 5 giờ chiều. Làm việc dằng dẳng 8 tiếng một ngày, và có 2 ngày off để làm những việc bạn thích.

Bây giờ tôi sẽ phân chia tính chất công việc ra. Nếu bạn code vì bạn được trả lương cho việc đó (có thể bạn không thực lòng 100% muốn code). Nếu bạn làm dev 40 tiếng một ngày, thì vẫn không sao.

Còn nếu như coding là tình yêu của cuộc đời bạn, hãy học cách biết nghỉ ngơi. Đôi khi hãy code cái gì bạn thích, đưa nó lên các project Open Source. Học cách dừng đúng lúc là điều bạn cần nhất lúc này.

Ưu tiên sức khỏe của mình.

Nói chung programmer là những người không khỏe mạnh. Đây không phải lỗi của chúng tôi nhé. Công việc này không chỉ đòi hỏi hàng giờ gõ máy, mà còn gõ ở nhiều kiểu nhiều mục. May mắn thay chúng tôi có cái “bánh lăn hamster” để vừa code vừa chạy bộ ở bàn làm việc.

Cá nhân tôi thì bởi vì không ảnh hưởng đến tiến độ công việc nên tôi đã mua một thẻ thành viên tập gym và đi tập mỗi ngày trong khi kết hợp giảm cân. Không chỉ tôi cảm thấy đỡ hơn mà cả lúc code cũng tốt hơn rất nhiều. Sau một buổi tập, tôi quyết định viết lại mớ jQuery tôi làm 6 tháng trước, cảm giác tuyệt biết bao.

Thử cái gì đó mới mẻ.

Cuộc sống của tôi là những chuỗi ngày thần kì. Làm, đọc, ngủ, lặp lại. Tôi bắt đầu tập gym vào ban ngày và chạy bộ vào ban đêm để thử cái gì đó khác và tôi cảm thấy cực kì phấn khởi khi quay lại làm việc và làm việc hết mình. Nhờ đó mà dần dần tôi hồi phục khỏi sự bế tắc.

Tôi cùng bạn gái nấu ăn và đi bộ với nhau nhiều hơn. Từ đó cuộc sống của tôi cũng trở nên thú vị hơn hẳn.

Trên đây là những tip giúp phòng tránh căng thẳng. Còn nếu như tôi đã bị thì sao?

Qua quá trình thực hiện những thay đổi trên, lời khuyên tốt nhất tôi có thể cho bạn đó là:

Chìa khóa chính là sự kiên nhẫn. Hãy nói chuyện với người thân về nó.

Trầm cảm là căn bệnh rất nghiêm trọng. Bạn không thể làm việc gì nếu cảm thấy mệt mỏi chán nản với mọi thứ. Sau tất cả bạn sẽ trở nên rất tiêu cực và nghi ngờ bản thân. Tôi chưa bao giờ suy nghĩ nhiều về cuộc đời trong một thời gian ngắn như vậy. Thật buồn.

Bỏ qua những hố đen tiêu cực trong cuộc đời mình, tôi phải không ngừng nhắc nhở bản thân rằng, tôi đã làm việc nhiều đến mức nào để chịu như vậy, thì chắc chắc cũng sẽ tốn rất nhiều thời gian và công sức để thoát khỏi nó. Chính vì thế tôi đã quyết định off 1 tuần để hồi phục lại tâm lý. Đôi khi quá trình hồi phục sẽ chậm hơn một chút nhưng không sao, cứ bình tĩnh đón nhận.

Hãy nói chuyện với người bạn thân yêu nhất về cảm xúc suy nghĩ của mình và để họ giúp bạn trong quá trình hồi phục năng lượng.

  Nếu không biết nói "Không", bạn sẽ chỉ là một "kẻ nô lệ" và mãi "tầm thường"

TopDev

React Native tại Airbnb (Phần 1): Mở đầu

ReactNative Airbnb

Tác giả: Gabriel Peal

Vào năm 2016, chúng tôi đã quyết định dồn hết đầu tư và tâm huyết vào React Native. Và hai năm sau, chúng tôi muốn chia sẻ cho cả thế giới về những trải nghiệm của mình và cả những dự tính của mình trong tương lai.

10 năm trước khi Airbnb ra đời, thì đó là thời kì mới sinh sôi nảy nở của thiết vị smartphone. Kể từ đó, smartphone đã trở thành một thiết bị quá sức cần thiết trong cuộc sống hằng ngày của chúng ta, đặc biệt là khi con người ngày càng vươn xa ra thế giới. Là một cộng đồng cung cấp giải pháp du lịch mới cho hàng triệu người dùng, một app toàn cầu là điều cần thiết. Các thiết bị mobile giờ đây sẽ là ưu tiên hàng đầu, hoặc cũng có thể là công cụ giao tiếp duy nhất mà họ dùng đến khi ở xa nhà.

Khởi điểm với chỉ 3 khách đặt phòng trên đường Rausch Street vào năm 2008, giờ đây con số đã lên đến hàng triệu lượt booking hằng năm. Các app cho phép host (chủ nhà) có khả năng quản lý danh sách đặt nhanh chóng và người đi du lịch nhiều gợi ý và cảm hứng để khám phá các địa điểm mới ngay tầm tay.

Để bắt kịp với lưu lượng sử dụng thiết bị hiện nay, chúng tôi đã phát triển đội ngũ hơn 100 kĩ sư mobile xuất sắc nhất để mang đến những trải nghiệm người dùng mới tuyệt vời hơn và cải thiện cái sẵn có.

Tuyển dụng React, việc làm React Native cho SV mới ra trường

“Đặt cược” vào React Native

Chúng ta phải liên tục phân tích các công nghệ mới để cải thiện trải nghiệm người dùng của cả người đi lẫn host tại Airbnb, và maintain được trải nghiệm tốt cho developer. Trong năm 2016, một trong những công nghệ mới đó chính là React Native. Từ đó chúng tôi đã nhận ra được tầm quan trọng của mobile đối với mình nhưng căn bản là không có đủ kĩ sư để hiện thực hoá nó. Vì thế, chúng tôi bắt đầu tìm đến những option thay thế khác. Website của chúng tôi được build chủ yếu dựa trên React – một web framework cực kì hiệu quả và được ưa chuộng rộng rãi tại Airbnb. Chúng tôi xem React Native như một cơ hội mới mở đường cho sự phát triển của mobile cũng như chuyển code đi nhanh chóng hơn bằng cách tận dụng bản chất cross-platform của nó.

Khi bắt đầu đầu tư vào React Native, chúng tôi cũng biết rằng có rất nhiều rủi ro. Chúng tôi đã add vào codebase của mình một platform mới, nhanh hơn nhưng chưa được kiểm chứng mà có thể tách nó ra thay vì hợp nhất nó lại. Mục tiêu của Airbnb với React Native gồm có:

  1. Giúp Airbnb tiến xa nhanh chóng hơn.
  2. Maintain quality bar được viết bằng native.
  3. Viết product code chỉ một lần cho mobile thay vì phải hai lần.
  4. Cải thiện trải nghiệm của developer.

Trải nghiệm của chúng tôi

Trong vòng 2 năm qua, thí nghiệm này đã biến thành một nỗ lực thực sự. Chúng tôi đã build lên một sự kết hợp cực kì bền vững trong app để kích hoạt được nhiều feature phức tạp như các shared element transitions, parallax, và geofencing cũng như các bridge trong cấu trúc hạ tầng phức tạp hiện có như networking, experimentation và internationalization.

Chúng ta đã cho ra mắt một loạt các sản phẩm cho Airbnb dùng React Native. React Native cho phép chúng tôi launch Experiences, một đứa con mới của Airbnb, cũng như hàng tá feature khác từ review đến quà tặng. Đây là thời điểm chúng tôi đã cho ra lò nhiều feature dù cho chưa có đủ kĩ sư để đạt được mục tiêu mình.

Các team khác nhau sẽ có những trải nghiệm khác nhau với React Native. React Native đã được chứng minh là một tool hết sức tuyệt vời mặc dù vẫn tồn đọng nhiều thách thức về kĩ thuật và tổ chức đối với các team khác. Trong series này, chúng tôi sẽ cung cấp một số kinh nghiệm của mình và những dự định trong tương lai sắp tới.

Trong phần 2, chúng tôi sẽ liệt kê một loạt những thứ hiệu quả và không hiệu quả với React Native.

Trong phần 3, chúng tôi sẽ liệt kê một số thách thức tổ chức hiện tại mà chúng tôi đang đối mặt khi build một mobile team xuyên platform.

Trong phần 4, chúng tôi highlight chỗ đứng hiện tại của mình bằng React Native và tương lai của Airbnb.

Trong phần 5, đúc kết những kinh nghiệm sâu sắc nhất về React Native và tận dụng nó tốt hơn.

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

  Tiki đã dùng React Native như thế nào?

  Đi phỏng vấn vị trí React Native cần trang bị những gì?

Hiểu về null, undefined và NaN trong JavaScript

Tác giả: Kuba Michalski

Hiểu rõ các khái niệm cơ bản trong JavaScript là yếu tố then chốt trong quá trình học và sử dụng JavaScript. Trong số đó, ba giá trị đặc biệt thường gây nhầm lẫn là null, undefined, và NaN. Bài viết này sẽ giải thích chi tiết từng khái niệm, sự khác biệt giữa chúng, và cách sử dụng đúng để cải thiện kỹ năng lập trình của bạn.

Nếu bạn muốn hiểu rõ các ví dụ dưới đây, hãy mở DevTools Console bằng cách nhấn Ctrl+Shift+J (Windows / Linux) or Cmd+Opt+J (Mac).

null là gì?

null là một giá trị đặc biệt trong JavaScript, biểu thị rằng một object hoặc address không chứa giá trị nào cả. Đây là một đối tượng và thường được dùng để gán giá trị không xác định cho một biến. Ví dụ, bạn có thể sử dụng null khi muốn xóa bỏ giá trị của một biến, nhưng vẫn giữ lại biến đó.

null

null không phải một kiểu giá trị, null là một trạng thái không có dữ liệu.

null là một trong những giá trị nguyên thủy của JavaScript và được xử lý như một giá trị “falsy” trong các phép toán boolean. Điều này có nghĩa là khi kiểm tra null trong điều kiện if, nó sẽ được coi là false.

Phủ nhận null sẽ return true, nhưng khi so sánh nó với false (hoặc cả true) thì đưa về false.

null là gì

Theo công thức toán căn bản, null value chuyển về 0.

(null)

undefined là gì?

undefined xuất hiện khi một biến đã được khai báo nhưng chưa được gán giá trị. Khi bạn truy cập một biến mà không có bất kỳ giá trị nào được gán, JavaScript sẽ trả về undefined. Điều này cũng áp dụng khi một hàm không trả về giá trị cụ thể. undefined là một kiểu dữ liệu nguyên thủy trong JavaScript.

undefined là gì

Nếu bạn thử theo phương pháp toán tin bằng undefined, bạn sẽ nhận về NaN. Tương tự như null, phủ nhận undefined sẽ trả về true, nhưng so nó với hoặc true hoặc false sẽ trả về false.undefined

Vậy điểm khác biệt null vs undefined là gì?

Giống nhau undefined and null trong Javascript

  • Cùng là giá trị nguyên thủy: Cả null và undefined đều là các giá trị nguyên thủy trong JavaScript.
  • Cùng có giá trị “falsy”: Cả hai giá trị này đều được coi là “falsy” trong các phép toán boolean, nghĩa là chúng sẽ được đánh giá là false trong các câu lệnh điều kiện.

Khác nhau null vs undefined

Kiểu dữ liệu

  • null: Được coi là một đối tượng (object) trong JavaScript.
  • undefined: Là một kiểu dữ liệu nguyên thủy (undefined).

Gán giá trị

  • null: Thường được lập trình viên gán giá trị một cách có chủ ý để biểu thị không có giá trị.
  • undefined: Tự động được gán bởi JavaScript khi biến chưa có giá trị hoặc khi một hàm không trả về giá trị.

Trong toán tin

  • null đưa về 0 khi vận hành bằng toán
  • undefined trả về NaN

Ngoài ra còn một vài thứ khác cần lưu ý.

null vs undefined

Dòng đầu tiên: undefined == null, trả về true vì JavaScript cố gắng chuyển đổi cả hai giá trị về cùng loại.

Dòng thứ hai: undefined === null, cho chúng ta biết “Hãy so sánh với các loại data” (căn bản là check xem cả hai có giống nhau không) và JavaScript cũng đủ thông minh để thấy được sự khác biệt nên nó trả về “false”.

Và dòng cuối cùng: !undefined === !null, cái này thì đơn giản hơn. Vì cả hai giá trị bị phủ nhận đều trả về true, bạn có hai giá trị true, thì cuối cùng nó là true.

Nghe có vẻ hơi sai sai, và thật ra, đó là cái hay của ngôn ngữ này.

Xem ngay những tin đăng tuyển lập trình viên Javascript lương cao

NaN là gì?

Sau khi đã hiểu null và undefined là gì, và sự khác nhau của chúng, chúng ta sẽ nói về giá trị NaN.

NaNNot a Number. Tôi nghĩ tên gọi cũng chính là định nghĩa của NaN, cũng đủ dễ hiểu nhỉ? JavaScript return giá trị này khi cái chúng ta nhận được không phải số.

Ví dụ, bạn muốn lấy giá trị “cucumber” trừ 10 hoặc lấy “R2D2” chia cho 12 vậy.

NaN js

Dưới đây là một số trường hợp bạn nghĩ sẽ nhận dược giá trị này nhưng thật ra thì không:

  • Khi bạn add cái gì đó vào string. Khi JavaScript thấy và sign vào một string, nó cũng tự động chuyển đổi element thứ hai của cả string được add.
nan là gì
  • Khi bạn làm việc với number và boolean. Boolean được chuyển thành 0 và 1. True = 1. False = 0.
nan javascript
true * false giống như 1 * 0 bằng 0

Bây giờ mới là phần hack não. NaN thật ra là một số.

js nan

Vậy là, nó đại diện cho cái nó thiếu. Nói cho thông minh là nó là cái đối nghịch của chính nó.

nan trong js

Vậy nếu như NaN tự so và trả về false, vậy thì ta có so nó với cái gì đi nữa cũng sẽ trả về false. May thay là chúng ta có một function để check xem nó có phải NaN hay không — isNaN().nan in javascript

Tóm lại về null, undefined và NaN trong JavaScript

Giá trị null đại diện cho nothing, một object hoặc address không tồn tại hoặc không có giá trị. Nó chuyển đổi từ 0 trong phương pháp vận hành toán đơn giản và là một global object.
null == false cho chúng ta false.

Property global undefined đại diện cho gá trị ban đầu undefined. Nó cho biết một cái không được gán giá trị; không được xác định. undefined không chuyển đổi bất cứ gì thành số, nên khi dùng nó dùng tính toán số học sẽ trả về NaN.

NaN (Not-A-Number) đại diện một cái không phải là số, mặc dù bản thân nó thật ra là một số. Nó không bằng chính nó và để check xem có NaN không chúng ta sẽ dùng isNaN() function.

Tất cả những cái trên đều là các giá trị mang tính false nên nó sẽ trả về false.

JavaScript rất giỏi chuyển đổi giá trị vì thế bạn cần phải dùng dấu bằng đến 3 lần (===) để đảm bảo cả hai elements không giống nhau.

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

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

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Bài viết được sự cho phép của tác giả Lương Văn Phúc

Chào hỏi xã giao

Chào các bạn, cho phép mình giật dòng tít câu view tí nhé. Ngày 28 tháng 8 vừa rồi, Chrome 85 đã chính thức hỗ trợ ảnh AVIF. Bạn thử search nhanh trên Google là sẽ thấy ngay cộng đồng developer háo hức và kì vọng vào nó như thế nào (mình không nói điêu đâu). Vậy AVIF là định dạng ảnh gì và nó có gì đặc biệt so với các định dạng ảnh lâu đời như JPEG hay PNG? Hãy cùng mình tìm hiểu nhé.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?

Bối cảnh lịch sử

Hiện tại bạn vẫn còn sử dụng ảnh JPEG và PNG chứ? Không phải chỉ mình bạn đâu, mà cả thế giới này vẫn đang sử dụng chúng. Từ các trang web, cho đến các phần mềm, và cả các thiết bị như điện thoại, máy tính bảng… đều mặc định sử dụng định dạng ảnh này.

JPEG ra đời năm 1992, PNG ra đời năm 1996, nay đã là năm 2020 rồi, chẳng lẽ chúng ta không có định dạng ảnh nào tốt hơn để thay thế sao? Mà khoan đã, điều này có gì đáng quan tâm chứ, chúng vẫn rất tốt mà? Hãy cùng mình điểm qua một vài điểm yếu tiêu biểu khi sử dụng ảnh JPEG và PNG nhé:

  • Dung lượng ảnh quá lớn: hiển nhiên ảnh càng nặng thì web load càng chậm, các thiết bị lưu trữ ảnh cũng sẽ mau chóng bị “đầy” nếu các bạn lưu trữ quá nhiều ảnh. Ngoài ra, dung lượng ảnh quá lớn cũng sẽ khiến dung lượng của video lớn theo.
  • Nén ảnh sẽ giảm chất lượng đáng kể: để web load nhanh hơn, ta thường nén ảnh xuống mức “chấp nhận được” (kết hợp với crop), từ vài MB xuống còn vài trăm KB chẳng hạn, hoặc thậm chí xuống vài chục KB. Đây là một practice thường dùng và “chuẩn mực” của bất kì frontend developer nào khi muốn tối ưu trang web của mình. Tuy nhiên bạn sẽ luôn phải đắn đo giữa dung lượng ảnh và chất lượng ảnh. Giá như có một phép màu giúp nén tấm ảnh xuống siêu thấp, nhưng chất lượng vẫn tương đối cao thì tốt biết mấy.
  • Thiếu các chức năng cần thiết: JPEG là ảnh lossy, PNG là ảnh lossess. JPEG không hỗ trợ transparency, PNG thì có. JPEG không hỗ trợ ảnh động, PNG thì . Bù lại thì PNG dung lượng thường lớn hơn JPEG, nên tùy vào mục đích sử dụng, chúng ta thường phải convert qua lại giữa 2 định dạng ảnh này. Giá như có một phép màu giúp trộn tất cả các chức năng trên vào một định dạng ảnh duy nhất thì tốt biết mấy.

Vì thế, từ lâu đã có rất nhiều dự án (của các công ty hoặc nhóm độc lập) nghiên cứu và phát triển các định dạng ảnh mới thay thế cho JPEG và PNG. Một trong số chúng như HEIF, JPEG XR, JPEG XL, JPEG 2000, WebP, AVIF… Trong bài viết này mình sẽ giới thiệu về định dạng AVIF như một ứng viên cực kì sáng giá, tuy nhiên cũng không thể làm ngơ người anh WebP cũng đã rất thành công. Hãy cùng tìm hiểu định dạng ảnh “không mới cũng không cũ” WebP nhé.

Giới thiệu một tí về tiền bối WebP

WebP ra đời năm 2010 và được phát triển bởi Google, và đến nay ảnh WebP đã được hỗ trợ bởi hầu hết các browser. Chắc chắn bạn cũng đã ít nhiều thấy định dạng ảnh này xuất hiện rồi đúng không.

Ảnh WebP có tất cả các chức năng mà mình liệt kê ở trên. Nó vừa hỗ trợ lossy, lossess, transparency (alpha channel), ảnh động… Và điều đặc biệt, nó được nén rất tốt. Theo Google, nó giúp giảm dung lượng ảnh từ 25-34% so với JPEG.

Nếu bạn thường sử dụng công cụ PageSpeed Insights của Google để đánh giá tốc độ web thì chắc hẳn bạn sẽ thường xuyên nhận được lời hướng dẫn convert ảnh của bạn về các định dạng ảnh hiện đại để giảm dung lượng. Thực tế thì công cụ này sẽ thử chuyển tấm ảnh của bạn về WebP và so sánh sự khác biệt về dung lượng rồi mới đưa ra khuyến cáo.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Gợi ý chuyển đổi định dạng ảnh để tăng tốc độ web của Google

Hậu bối AVIF có gì đặc biệt?

AVIF là viết tắt của “AV1 Image File Format”, và AV1 có thể tạm hiểu là tên của thuật toán nén (không chỉ cho ảnh mà còn cho cả video). AVIF ra đời với sứ mệnh thay thế không chỉ JPEG, PNG hay GIF, mà còn thay thế cả người tiền bối WebP của mình nữa. Đọc đến đây là bạn có thể hiểu ra rằng, AVIF có tất cả các chức năng như WebP mà mình trình bày ở trên, và nó còn “siêu nén” hơn cả WebP nữa. Mình xin liệt kê lại ở đây nếu bạn nào bỏ qua phần giới thiệu WebP ở trên. Các chức năng cơ bản của ảnh đều nằm trong một định dạng duy nhất là AVIF:

  • Hỗ trợ lossy (như JPEG) và lossess (như PNG)
  • Hỗ trợ transparency (alpha channel) như PNG
  • Hỗ trợ ảnh động với định dạng .avifs (như GIF hay APNG)
  • Siêu nén với chất lượng được duy trì tốt (hơn cả người tiền bối WebP)

Có một điều quan trọng bạn cũng nên biết là AV1 và AVIF đều được khởi xướng và phát triển cũng được vài năm rồi, và cũng đã trải qua nhiều cuộc thử nghiệm mang kết quả tốt. Tuy nhiên với góc nhìn của một web developer, nó sẽ chẳng có ý nghĩa gì nếu browser không support ảnh AVIF. Vì thế vào ngày 28-8-2020 vừa qua, Chrome 85 đã chính thức hỗ trợ ảnh AVIF. Ngoài ra Firefox cũng sẽ sớm support mặc định định dạng ảnh này (hiện tại bạn cần bật cờ image.avif.enabled trên firefox để sử dụng). Bạn tham khảo các browser hiện đang support AVIF tại đây

So sánh

Theo kết quả đo của Daniel Aleksandersen tại Ctrl.blog, AVIF có mức giảm dung lượng đáng kể so với JPEG và WebP. Cụ thể AVIF trung bình giảm đến 50% so với JPEG, và 20% so với WebP (bạn có thể suy ra rằng WebP cũng có mức giảm khá tốt là 30% so với JPEG)

Nếu chỉ đưa ra số liệu thôi thì nhàm chán quá, nhìn hình thì sẽ trực quan hơn nhiều phải không. Ở đây mình sẽ chọn một bức ảnh để thử so sánh mức độ nén của AVIF, WebP và JPEG.

Tấm ảnh được đưa lên thớt là tấm ảnh (png) nàng công chúa tóc xù của Disney. Mình tải về với kích thước 800×509, dung lượng 849KB. Vì AVIF vẫn còn kén trình duyệt, nên mình sẽ screenshot lại để mọi người so sánh (sẽ không chính xác lắm), tuy nhiên mình vẫn sẽ đính kèm ảnh gốc nếu bạn nào muốn xem nhé.

Ảnh gốc PNG với 849KB:

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh gốc PNG của nàng công chúa tóc xù là 849KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh JPEG nén đến mức chấp nhận được là 110KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh WebP nén đến mức chấp nhận được là 83.7KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh AVIF nén đến mức chấp nhận được là 78.5KB

Các bạn có thể thấy ảnh AVIF và WebP đều nén khá tốt mà vẫn giữ được chất lượng ở mức chấp nhận được. Thú thật mình không phải chuyên gia nên không thể tùy chỉnh cấu hình để có một so sánh chính xác. Nhưng mình cũng đã cố gắng nén ở mức mà mắt mình thấy hợp lý (góc nhìn của một user thường).

Để bổ sung cho phần so sánh, mình sẽ nén cả 3 tấm ảnh về cùng dung lượng là khoảng 11-12KB, hãy cùng xem kết quả nào:

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh JPEG nén xuống ~11KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh WebP nén xuống ~11KB
Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Ảnh AVIF nén xuống ~11KB

Các bạn thấy đấy, nén sâu sẽ giúp dễ dàng nhận ra sự khác biệt giữa các định dạng. Nếu các bạn muốn tìm hiểu sâu hơn thì có thể đọc bài viết của Netflix Techblog. Bài viết này có rất nhiều thông tin hữu ích, cả về mặt kĩ thuật, thông số kĩ thuật cho đến hình ảnh minh họa trực quan.

Tạo ảnh AVIF như thế nào

Hiện tại công cụ tạo ảnh AVIF không nhiều, nhưng may mắn trang Squoosh của Google đã cho phép chúng ta chuyển đổi và nén ảnh sang nhiều định dạng khác nhau với nhiều mức độ nén khác nhau (có cả AVIF và WebP). Nếu bạn nào chưa biết trang web này, thì nó hoạt động khá giống với trang TinyPNG nhưng đặc biệt hơn là bạn có thể tùy chỉnh định dạng và mức độ nén theo ý muốn. Ngoài ra Squoosh còn cho phép bạn so sánh ảnh trước và sau khi chuyển đổi rất trực quan và tiện lợi.

Định dạng ảnh mới AVIF liệu có soán ngôi vương của JPEG và PNG?
Webapp Squoosh của Google

Nếu bạn muốn vọc sâu hơn về mã nguồn để encode/decode ảnh AVIF, thì có thể tham khảo thư viện libavif.

Browser support?

Như mình có chia sẻ ở trên, Chrome chỉ vừa mới chính thức hỗ trợ AVIF cách đây chưa đầy 1 tháng, nhưng đó đã là một tín hiệu khả quan. Thêm nữa là Firefox cũng đã hỗ trợ với cờ image.avif.enabled được bật. Sẽ sớm thôi là Edge, Opera hay Safari (riêng Safari thì mình không chắc).

Vậy câu hỏi đặt ra là chúng ta có nên sử dụng AVIF cho web của chúng ta không? Câu trả lời này tùy vào tính chất và mục tiêu dự án của bạn. Tuy nhiên tại thời điểm này, nếu không sử dụng AVIF, việc sử dụng người anh WebP cũng là một việc đáng cân nhắc.

Ngoài ra, có một kĩ thuật khá hay ho và an toàn nếu bạn vừa muốn sử dụng công nghệ mới, vừa muốn hỗ trợ các browser cũ hơn, là sử dụng thẻ picture.

<picture>
  <!-- Nếu browser hỗ trợ AVIF, thì load AVIF -->
  <source srcset="image.avif" type="image/avif">

  <!-- Nếu không hỗ trợ AVIF, thì load WebP -->
  <source srcset="image.webp" type="image/webp">

  <!-- Nếu không hỗ trợ cả 2 định dạng ảnh trên, fallback về ảnh jpeg -->
  <img src="image.jpg">
</picture>

Lời kết

AVIF vẫn còn rất trẻ và vẫn đang được tối ưu cả về thuật toán lẫn tốc độ encode/decode. Vì thế chúng ta hãy mong đợi đến ngày AVIF được phổ biến rộng rãi như cách JPEG và PNG đã từng và đang “bá chủ võ lâm” hiện nay. Tuy nhiên để đánh bại được JPEG hay PNG, web là chưa đủ. Nó cần phải được hỗ trợ mặc định bởi nhiều phần mềm, thiết bị điện tử khác (cả ảnh và video) thì mới mong có thể soán ngôi vương được. Hoặc không, sẽ lại có một định dạng khác ra đời và tiếp tục cuộc hành trình dang dở.

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

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

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

10 Add-on Google Sheets phải có dành cho các Recruiters

Tác giả: DENIS DINKEVICH

Dưới đây là 10 Google Sheet Add-ons mà bất cứ recruiters nào cũng cần có được Topdev tổng hợp cho các bạn đọc tham khảo

YAMM

Add-on này cho phép bạn tạo các campaign được cá nhân hóa và mass email mà không cần truy cập vào tập spam của khách hàng. Track tỉ lệ mở mail/ reply, làm các follow-up dựa trên các nhóm lead cụ thể (ai đã mở/ chưa xem,…)
Ngoài ra nó còn tạo các labels riêng có mỗi campaign để nhanh chóng truy cập data. Dưới đây là một tutorial ngắn về cách nó hoạt động.

Power Tools

Đây là một bộ tool dành cho task hằng ngày: thay đổi case; tổng hợp theo màu; loại ỏ trùng lặp; tách, hợp, so sánh, tìm, dọn data và các tool khác.
Bạn đang phải làm việc với một lượng data khủng? Add-on chính là giải pháp. Nó giúp bạn loại bỏ các email trùng lặp từ list tổng hợp email của ứng viên/ người tham dự,… Và nhiều loại data khác bao gồm trong đó.

Split Names

Nó giúp ta tách họ tên ứng viên nhanh chóng thành nhiều cột họ, tên lót, tên, vị trí và/ hoặc bằng cấp.

Crop Sheet

Nếu như bạn đã chán kéo spreadsheet lên xuống, thì add-on này sẽ giúp loại bỏ các hàng và cột thừa trong sheet.

LinkedIn Profiles Search

Add-on này nên được sử dụng khi bạn có data và muốn tìm các gói profile Linkedin tham khảo.
Nó sẽ không cho bạn link URL trực tiếp đến profile nhưng bạn vẫn có được profile của ai đó trong kết quả search.

Blockspring

Với nó bạn có thể làm bất cứ cái gì trên Spreadsheet. Connect Google Sheet với hàng trăm web app và dịch vụ khác để tự động hóa bớt công việc của bạn.
Có rất nhiều hướng dẫn từng bước sẵn có, nhưng nếu bạn chauw từng nghe đến nó, thì video dưới đây sẽ giúp bạn có cái nhìn tổng thể.

Save As Doc

Convert bất kì Google Sheets spreadsheet nào thành Google Document để cải thiện độ dài các ô text phù hợp.

Files Cabinet

Add-on này list tất cả các file của tập Google Drive vào một spreadsheet, và tự động hiển thị nó trong Awesome Table.

FindThatLead

Nó căn bản là một công cụ hướng sale. Tuy nhiên, bạn sẽ dùng khá nhiều tính năng cho sourcing. Extension của nó cho phép bạn tạo/ đoán email (cả cá nhân và doanh nghiệp) trong contact/ các lead/ list người tham dự,… của bạn ngay trong Google Spreadsheet.
Tạo một account, cài add-on, connect với API key, và bạn đã có thể sử dụng nó rồi.

Text2Link

Convert ô thành link dựa trên data của ô. Một cách nhanh và tiện lợi để link nhiều thông tin hơn.

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
Bài viết gốc được đăng tải tại Sourcecon

Bài học tôi rút ra được từ việc “clone” ứng dụng Uber

Tác giả: Shai Almog

Như mọi người đọc ở đây sẽ thấy xuất hiện chữ “Clone”, tôi dùng chữ clone để nói về sự giống nhau giữa 2 sản phẩm này, không phải nói về bản sao 1:1. Uber đã là một ứng dụng quá phổ biến rồi, tuy nhiên cá nhân tôi chỉ mất khoảng một tuần để viết tất cả các code có liên quan … Mục tiêu của tôi là tạo ra thứ hoàn thiện và chi tiết hơn.

Tôi đã học được gì?

Trong quá trình làm, tôi đã khám phá ra khá nhiều thứ bất ngờ. Ví dụ như việc team Uber đã sử dụng và tận dụng khá nhiều material design cho ứng dụng chạy native trên iOS này. Ví dụ:

Ứng dụng của Uber trên iOS

Để ý thử nhé, phiên bản này nhìn gần như giống y đúc phiên bản Android, ví dụ như các staple Android UI, floating action button, material design, v.v…

Trước đó tôi từng nghĩ, những thứ như native widgets chỉ giống nhau về phần engagement thôi. Tôi với bạn của mình thường tranh cãi về vấn đề này khá nhiều, tôi thì thiên về phần “native widget feel” nhiều hơn, trong khi Chen bạn tôi lại nghiên hẳn về single UI trên tất cả các platform.

Lần này Uber đã “ủng hộ” và đứng về phía Chen hơn, có thể nói phần UI của Uber được thiết kế gần như 1:1 giữa iOS và Android

Lý do cho triết lý thiết kế này cũng dễ hiểu thôi, họ có thể dùng đi dùng lại cho các platform. Dùng 1 screenshot dùng chung cho cả iOS và Android cho phần tài liệu training. Nói tóm lại, chỉ cần mọi thứ chạy mượt là ngon.

Ở thời điểm Android 2.x và iOS 6.x, sự khác biệt của 2 hệ điều hành này là khá lớn. Ví dụ chuyện có một vài tính năng khác biệt trên Android thôi cũng là một vấn đề. Nói chuyện hiện tại, nếu bạn không quy hết mọi về chung một nhà bằng các công cụ crossplatform thì sẽ khá tốn kém đấy.

Transition vẫn còn nhiều khác biệt

Không biết có phải cố tình hay không, nhưng các transition giữa Android và iOS lại khá khác biệt. Ví dụ như Android thì dùng nhiều material style transition, trong khi iOS dùng cover và slide transition.

Nếu đây là cố tình, thì điều này có nghĩa là cái họ đã tư duy theo kiểu “feel” đập chết cái “look”. Hoặc cũng có thể họ không quan tâm lắm đến mấy cái transition này.

Bug Portability

Đây là màn hình đăng nhập gốc của Uber trên Android:

Cùng một màn hình trên iOS trông giống nhau nhưng lại có lỗi hiển thị:

Ở đây bạn không nhìn thấy phần text “Enter your mobile number”.

Dù Uber có dùng khá nhiều QA. Nhưng rõ ràng ta thấy rằng lỗi hiển thị này xảy ra ở những quốc gia có 3 mã dial digit. Phiên bản Android (phiên bản của tôi) xử lý vụ này ngon hơn hẳn. Tuy nhiên vì nó được mặc định trong lúc phát triển, nên lỗi này họ đã không chú ý tới.

Dù biết rằng Uber có rất nhiều QA. Nhưng lỗi hiển thị này đa phần vẫn xảy ra với những quốc gia có 3 dial digit. Bản Android của tôi build thì không gặp tình trạng này. Có lẽ vì tính “toàn cầu hóa” và hợp nhất như có đề cập ở trên, mà bên phát triển đã không nhìn ra lỗi này, hoặc không sửa được?

Các bản sửa lỗi được thực hiện cho phiên bản Android không được sửa trên iOS.

Có thể bạn muốn xem:

  Flutter là gì? Ưu điểm vượt trội và cơ hội việc làm hấp dẫn

Một số tính năng khó nhằn hơn trên Android

Nếu bạn chạy bản Uber trên iOS, để ý thử phần login screen ở trên, bạn sẽ thấy phần pattern của background sẽ xoay (rotate). Đây là một phần effect nhìn khá bắt mắt và dễ chịu.

Tuy nhiên không hiểu sao họ lại không làm cái hiệu ứng tương tự cho Android, có lẽ là thiếu lập trình viên để triển khai phần này?

Sau một thời gian triển khai thử trên Android, tôi mới nhận ra vì sao điều này không khả thi trên Android. Android gặp nhiều vấn đề ở phân khúc vector graphic, tức là khi bạn thử generate cái path tương tự và chạy rotation effect thì sẽ gặp error, lỗi báo như thế này

“OpenGLRenderer: Path too large to be rendered into a texture”

Một trong những cách xử lý trong trường hợp của tôi là disable hardware rendering. Vấn đề nằm ở chỗ bạn không thể biết được chuyện gì đã xảy ra. Rendering path không show exception nào cả. Đọc code Android liên quan đến lỗi đó cũng không tìm ra nguyên nhân.

Dù không có được hiệu ứng ngon lành như trên iOS thì cũng đành phải chấp nhận sự khác biệt này.

Không có tính năng SMS trên Android

Điều tôi thích nhất của Android chính là việc nó cho developer có nhiều tự do hơn. Đây tuy nhiên, cũng là con dao 2 lưỡi.

Một ví dụ điển hình là SMS interception support. Khi bạn có một tin nhắn SMS activation, Android có thể lấy luôn thông tin trên SMS và skip luôn bước type in.

Vậy mà, phiên bản Uber Android lại không có tính năng đó, chỉ vì họ không dùng native Android activation.

Sau khi đọc nhiều tài liệu, thì tôi mới nhận ra rằng Uber cũng gặp nhiều vấn đề vì “too many permissions”. Tôi không biết liệu bất cập này có phải do API level 23 (nơi cho phép Android dùng permission) hay không? Dù thế nào đi nữa, tôi cũng đã thêm tính năng này vào phiên bản của mình và cải thiện đáng kể phần signup cho sản phẩm.

Điều tôi yêu thích nhất về Android là mức kiểm soát thấp mà bạn nhận được với tư cách là nhà phát triển. Đây là một con dao hai lưỡi nhưng trong một số trường hợp nó đánh bại tất cả mọi thứ khác …

Một ví dụ tuyệt vời là hỗ trợ chặn chặn tin nhắn SMS. Khi bạn có khả năng kích hoạt với SMS, Android có thể lấy được SMS sẽ đến và nhập nó vào.

Đáng ngạc nhiên là ứng dụng Uber bản địa không làm điều đó. Họ không áp dụng tính năng kích hoạt SMS cho Android.

Sau khi đọc một chút, có vẻ như Uber đã nhận được nhiều flak trong nhiều năm cho “quá nhiều quyền cho phép”. Tôi nghĩ họ chỉ quan tâm đến việc cho phép thực hiện các phone call …

Tôi không chắc chắn nếu điều này sẽ áp dụng nhiều như thế nào với mức API 23 (khi Android chuyển sang lời nhắc cho phép). Dù bằng cách nào tôi đã thêm chức năng này vào phiên bản Uber và làm cho quá trình đăng ký trở nên dễ dàng hơn trên Android.

Potrait Lock ứng dụng

Đây là một tính năng mà tôi khá thích, tuy nhiên Uber đã lock tính năng này. Tôi cũng khá hiểu rằng việc cho phép việc xoay landscape trên điện thoại sẽ khiến sinh ra nhiều vấn đề hơn về mặt tính năng. Điều này cũng vô tình chỉ ra một điểm khá hay rằng, Uber tư duy tập trung vào tính năng nhiều hơn là tốn nhân lực vào trải nghiệm này. Rất đáng nể.

Suy ra, triết lý của Uber chính là function over form (chú trọng tính năng hơn). Gạt bỏ những thứ rườm rà không quá cần thiết, tập trung vào các tính năng chủ lực (core functionality)

Họ thay đổi thiên biến vạn hóa

Cho tới khi nhúng tay vào làm sản phẩm tôi mới thấy sự thay đổi liên tục của Uber là như thế nào. Khi mới bắt đầu, nút history được đặt dưới bottom, nhưng sau đó họ lại dời nó lên nằm ở phần search.

Việc dám thay đổi và thể nghiệm là rất quan trọng với một ứng dụng như Uber.

Khổng Minh nói, phải biết MƯỢN!

Tôi dùng khá nhiều từ những thứ đã được phát triển, đa phần là từ Google. Ví dụ như, native Google Maps widget và một vài Google webservices (geocoding, directions, v.v). Tôi còn dùng Twilio và Braintree cho SMS/billing. Với những trợ giúp này, bạn có thể build những tính năng quan trọng của một sản phẩm lớn như Uber trong khoảng dưới 1 tuần

Việc dùng một API như Google Maps cho các tool crossplatform này sẽ giúp bạn giảm nhân lực đáng kể.

Uber trên Android & ứng dụng clone của Uber. Không có gì khác nhau cả…

Tôi thật sự khâm phục các kỹ sư Uber. Đây là một ứng dụng phức tạp với giao diện tuyệt vời.

Sự đột phá luôn bắt đầu từ việc xây dựng một thứ gì đó mới, nhưng cũng không cần quá mới. Chúng ta có thể cải tiến từ những thứ có sẵn và xây dựng những cái kinh khủng hơn. Tôi nghĩ nếu tư duy việc build app như Uber trở nên đơn giản hơn, thì chúng ta sẽ có cơ hội thấy được những ứng dụng còn khủng hơn.

Chúng ta học được gì

  • Uber có giao diện người dùng gần như giống hệt nhau trong iOS và Android
  • Các bản sửa lỗi được thực hiện cho phiên bản Android không được sửa trên phiên bản iOS
  • Dù có giao diện giống hệt nhau, nhưng các tính năng giữa 2 phiên bản có sự khác biệt
  • Họ không sử dụng tính năng kích hoạt SMS trên Android
  • Uber tin thiên về cải thiện tính năng vận hành hơn là form hiển thị.
  • Việc thao tác nhanh chóng và trải nghiệm rất quan trọng đối với một ứng dụng như Uber
  • Với một số trợ giúp từ các công cụ hiện có, việc xây dựng ứng dụng như Uber thực sự không khó.

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

  5 tips cải tiến chất lượng phát triển Mobile App

Instant AJAX Search với Laravel và Vuejs

Tính năng tìm kiếm tức thì (instant search) hiện là một tính năng khá phổ biến trong web và app. Trong bài đăng này, mình cố gắng trình bày các điểm chính của việc xây dựng một component tìm kiếm theo thời gian thực có các tính năng như debounce* hoặc highlighting các kết quả.

* : Các sự kiện input từ người dùng (thông qua mouse, keyboard,…) thường diễn ra với tần suất rất nhanh. Điều này khiến hàm xử lý sự kiện được thực thi rất nhiều và có thể ảnh hưởng đến performance cũng như user experience (UX), đặc biệt khi việc input tác động đến giao diện trang web. Để khắc phục điều này, ta hãy tìm hiểu và ứng dụng phương pháp “Debounce” trong javascript. Để hiểu rõ hơn bạn vào link tại đây để xem.

Mở đầu:

Tiến trình cũng như kết quả của 1 process như sau: chúng ta gõ bất kỳ vào input field và dữ liệu được truyền đến server side bằng AJAX request. Sau đó chúng ta bắt được keyword tại back end và load những dữ liệu phù hợp với truy vấn đã cho.

Tại đây như ta biết là nó đang diễn ra cả 1 tiến trình ngầm bên dưới front lẫn back-end. Vì vậy chúng ta nên làm 1 chút gì đó để giúp cho người dùng cảm thấy sự phản hồi tức thì, khi đó họ sẽ không cảm thấy confuse nữa.

Dựng back-end:

Tạo controller cái nha

<?php // SearchController.php

public function search(Request $request)
{
    $posts = Post::where('name', $request->keywords)->get();

    return response()->json($posts);
}

Như bạn thấy, nó thực sự đơn giản, nhưng chúng ta nên lưu ý 2 điều sau:

– Đầu tiên, chúng ta trả về với một JSON response, sau đó front-end sẽ nhận và xử lý chúng. Chúng ta nên xuất dữ liệu thông qua API cho dễ làm việc với front-end

– Điều thứ hai, vì chúng ta sử dụng $request->keywords nên chuỗi truy vấn sẽ trong như thế này ?keywords=Some+search+query.

Kết quả là chúng ta get được một tập những dữ liệu phù hợp, convert sang JSON và có thể xử lý tại front-end. Ở đây mình sẽ không nói quá chi tiết việc build API nha mà chỉ hướng dẫn anh em giải pháp.

Thực hiện tìm kiếm với Vue

Để đơn giản hóa mọi thứ, chúng ta sẽ chỉ có một đầu vào và một danh sách các kết quả. Bước đầu tiên, chúng ta tạo 1 Vue instance*, sau đó chúng ta thêm một số hành động khi giá trị của đầu vào thay đổi. Hãy xem nó trông như thế nào:

<template>
    <div>
        <input type="text" v-model="keywords">
        <ul v-if="results.length > 0">
            <li v-for="result in results" :key="result.id" v-text="result.name"></li>
        </ul>
    </div>
</template>

<script>
export default {
    data() {
        return {
            keywords: null,
            results: []
        };
    },

    watch: {
        keywords(after, before) {
            this.fetch();
        }
    },

    methods: {
        fetch() {
            axios.get('/api/search', { params: { keywords: this.keywords } })
                .then(response => this.results = reponse.data)
                .catch(error => {});
        }
    }
}
</script>

Rồi có những gì xảy ra với đoạn code trên? Đầu tiên, chúng ta có 1 khúc template, nơi mà ta gắn Vue model và lặp những kết quả. Ở khúc script, ta set up data mà mình muốn sử dụng, cũng như định nghĩa phương thức nạp dữ liệu (fetch method) và wrapper bao quanh một axios request.

Khi giá trị của keywords thay đổi, chúng ta khởi tạo phương thức nạp dữ liệu lại, với keywords mới và list kết quả mới.

Note*: Instance trong lập trình chính là thể hiện của một class. Nếu bạn khai báo một class Phim và khi bạn tạo một object phim thì đối tượng đó chính là một thể hiện của class Phim. Vậy Vue instance là gì? Đơn giản chúng ta có thể coi Vue là một class có tên gọi là Vue, để khởi tạo một Instance thì sử dụng cú pháp var app = new Vue({});

Debounce cho v-model

Có 1 problem trong đoạn code trên, đó là chúng ta fetch data ngay tức thì sau khi người gõ 1 ký tự. Thường thì đa số người dùng gõ nhiều từ hoặc đôi khi cả 1 đoạn văn bản, nhưng vậy thì sẽ request quá nhiều lên server. Cách tốt nhất là chúng ta thực thi phương thức nạp dữ liệu sau khi họ dừng gõ.

Có nhiều cách, cách đầu tiên là lazy modifier. Với v-model modifier, chúng ta có thể thay đổi sync event từ input. Có nghĩa là dữ liệu sẽ được update giá trị mới nếu người dùng thoát focus trong trường input (blur event) hoặc nhấn enter.  Có cách khác là implement 1 debouncer cho v-model, tuy nhiên Vue ver 2 đã không hỗ trợ nó rồi. Không hỗ trợ nên chúng ta nếu lưới thì có thể sử dụng thư viện bên thứ ba là lodash’s (_) debounce , nhưng theo quan điểm mình, nên tự làm 1 giải pháp debounce để tránh phụ thuộc vào thư viện hen.

Vừa rồi mình có tìm được 1 giải pháp khá ngon, bạn vào post này và repo này để xem thêm và lấy code về xài thôi.

Để em nó chạy được, bạn phải add .lazy modifier vào model nha, đừng quên!

Rồi, già sử chúng ta đã tích hợp debounce. Bây giờ chúng ta có thể delay bất kỳ thay đổi nào trên Vue model nếu muốn. Tưởng tượng xem trong quá trình người dùng gõ nhiều ký tự và họ tạm dừng sau đó, nếu không có bất kỳ thay đổi nào trong khoảng thời gian nhất định, chúng ta commit trạng thái cuối cùng cho v-model. Watch method sẽ được kích hoạt và fetch dữ liệu mới.Tất nhiên là chúng ta chỉ phải thực hiện nó 1 lần thay vì hàng chục lần.

Rồi mình thử add delay 300ms nhé:

<input type="text" v-model.lazy="keywords" v-debounce="300">

Highlight kết quả

Từ khía cạnh UX, phần này rất quan trọng. Nếu chúng ta có thể làm nổi bật các kết quả phù hợp với từ khóa nhất định thì đó sẽ là một cách hay để giúp người sử dụng tìm thấy những gì mình muốn.

highlight(text) {
    return text.replace(new RegExp(this.keywords, 'gi'), '<span class="highlighted">$&</span>');
}

Tóm lược

Nói chung là cũng không quá khó mà còn mang lại nhiều lợi ích, nó cho cảm giác phản hồi nhanh cho người dùng, giảm thiểu request lên server tránh ngốn resource. Dưới đây là ví dụ đầy đủ nhưng là dữ liệu tĩnh nhé, không có back-end.

Html:

<div id="app">
	<input type="text" v-model.lazy="keywords" v-debounce="500" placeholder="Tìm kiếm (VD: gõ Vue...)">
	<ul v-if="results.length > 0">
		<li v-for="result in results" :key="result.id" v-html="highlight(result.title)"></li>
	</ul>
</div>

Css:

.highlighted { color: red }

JS:

function debounce(fn, delay = 300) {
	var timeoutID = null;

    return function () {
		clearTimeout(timeoutID);

        var args = arguments;
        var that = this;

        timeoutID = setTimeout(function () {
        	fn.apply(that, args);
        }, delay);
    }
};

// this is where we integrate the v-debounce directive!
// We can add it globally (like now) or locally!
Vue.directive('debounce', (el, binding) => {
	if (binding.value !== binding.oldValue) {
		// window.debounce is our global function what we defined at the very top!
		el.oninput = debounce(ev => {
			el.dispatchEvent(new Event('change'));
		}, parseInt(binding.value) || 300);
	}
});

new Vue({
	el: '#app',
	
	data() {
		return {
			keywords: null,
			posts: [
				{id: 1, title: 'Front-end Performance – Where should we start?'},
				{id: 2, title: 'Vue Calendar Component with Laravel API'},
				{id: 3, title: 'Optimise Your Front-end Workflow with Prepros'},
				{id: 4, title: 'Affinity Designer vs. Adobe Illustrator – Which One is Better for You?'},
				{id: 5, title: 'Implementing Laravel’s Authorization on the Front-End'},
				{id: 6, title: 'Using CodePen Can Boost Your Front-end Development Workflow'},
				{id: 7, title: 'Connecting GitLab, Codeship and Laravel Forge'},
				{id: 8, title: 'Dynamic Author Email with Contact Form 7'},
				{id: 9, title: 'Impersonating Users in Laravel'},
				{id: 10, title: 'Introduction to Affinity Designer'},
				{id: 11, title: 'Using Contenteditable Attribute'},
				{id: 12, title: 'Using Laravel’s Localization in JS'},
				{id: 13, title: 'CSS Gradient Basics'},
			]
		}
	},
	
	computed: {
		results() {
			return this.keywords ? this.posts.filter(result => result.title.includes(this.keywords)) : [];
		}
	},
	
	methods: {
		highlight(text) {
			return text.replace(new RegExp(this.keywords, 'gi'), '<span class="highlighted">$&</span>');
		}
	}
})

Thêm cái jsfiddle run xem sao:

Tham khảo thêm vị trí tuyển dụng kỹ sư Laravel lương cao cho bạn

Các thủ thuật hữu ích mà bạn có thể không biết về Git stash

git

Tác giả: Srebalaji Thirumalai

Nếu đã sử dụng Git trong một khoảng thời gian ắt hẳn bạn đã sử dụng Git stash. Đây là một trong những tính năng hữu ích của Git.

Dưới đây là một số mẹo hữu ích mà tác giả đã rút ra được từ Git stash tuần trước.

Git stash save

Lệnh này giống như Git stash nhưng đi kèm với các tùy chọn khác. Tôi sẽ đưa ra một số điều quan trọng trong bài viết này.

Git stash cùng với message

git stash save “Your stash message”.

Lệnh trên sẽ đưa ra cùng với một message. Hãy cùng nhau xem nó hữu ích như thế nào.

Ẩn các tệp không theo dõi

Bạn cũng có thể ẩn các tệp không theo dõi.

git stash save -u
or
git stash save --include-untracked

Git stash list

Khi bạn dùng Git stash hoặc lưu Git stash, Git thực sự sẽ tạo một đối tượng Git với một số tên và sau đó lưu nó vào repo.

Vì vậy, nó có nghĩa là bạn có thể xem danh sách các “stash” bạn tạo ra.

git stash list

Hãy cùng xem ví dụ dưới đây:

git

                                                   ví dụ về git stash list 

Bạn có thể xem danh sách các stash mới nhất được tạo ra ở đầu trang.

Và bạn có thể thấy rằng phần trên cùng được đưa ra một thông báo tùy chỉnh (sử dụng Git stash lưu “message”).

Git stash apply

Lệnh này sẽ chiếm phần trên cùng trong stack và apply nó vào repo. Trong trường hợp này là stash@{0}

Nếu bạn muốn áp dụng một số stash khác, bạn có thể chỉ định stash id.

Đây là một ví dụ:

git stash apply stash@{1}

Git stash pop

Lệnh này rất giống với stash apply nhưng nó xóa stash từ stack sau khi nó được áp dụng.

Hãy cùng xem ví dụ:

git

Ví dụ về Git stash pop

Như bạn có thể thấy phần trên cùng đã bị xoá và stash@{0} được cập nhật với phần cũ.

Nếu bạn muốn một stash cụ thể để “pop”, bạn có thể chỉ định stash id.

git stash pop stash@{1}

Git stash show

Lệnh này chỉ ra bản tóm tắt của các stash diff. Lệnh trên chỉ xem xét về stash mới nhất.

Dưới đây là ví dụ:

git

Ví dụ về Git stash show

Nếu bạn muốn xem full diff, bạn có thể sử dụng

git stash show -p

Tương tự như các lệnh khác, bạn cũng có thể chỉ định stash id để có được tóm tắt diff.

git stash show stash@{1}

Git stash branch <name>

Lệnh này tạo ra một nhánh mới với một stash hiện thời, và sau đó xóa các stash mới nhất (như stash pop).

Nếu bạn cần một stash cụ thể bạn có thể chỉ định stash id.

git stash branch <name> stash@{1}

Điều này thật sự hữu ích khi bạn gặp rắc rối sau khi đã áp dụng stash vào phiên bản mới nhất của chi nhánh.

Git stash clear

Lệnh này xóa tất cả các stash được tạo ra trong repo này và có thể không thể revert.

Git stash drop

Lệnh này sẽ xoá stash mới nhất khỏi stack, nhưng hãy dùng nó cẩn thận, có thể sẽ khó để revert.

Bạn cũng có thể chỉ định stash id.

git stash drop stash@{1}

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

  Một vài câu hỏi thông dụng về Git thường gặp

Thiết kế phông chữ và gửi nó lên Google Fonts trong 24 giờ

Tác giả: James Barnard

One Day Builds

Tôi phác họa vài kí tự trong một cuốn sổ tay cũ, vì muốn tạo ra một phông chữ cao, không chân, hiển thị có thể được sử dụng trong các poster, ảnh nghệ thuật lớn. Trong những ngày đầu tiên tại Men’s Health, tôi đã phải sử dụng các phông như ‘Tungsten’ hay ‘Heron’, thật tệ vì những mảnh của nét chữ, nhưng lại tuyệt vời khi sử dụng trong các tiêu đề, hoặc cho quảng cáo. Đây là phong cách thiết kế của tôi.

Nét vẽ thô

Một giờ chiều, thứ Tư

Tôi đã mở ngay Adobe Illustrator với hai, ba kí tự mà tôi đã phác hoạ. Tôi thiết lập năm đường grid line trên Artwork của tôi, một cho mỗi dòng descender, đường cơ sở, x-height, cap height và ascender line. Sau đó tôi quyết định chiều rộng cho chữ in hoa, và từ đó độ dày của thân chữ (ví dụ chiều rộng của chữ I).

Tôi đã thực hiện rất nhiều nghiên cứu về tỷ lệ của các kí tự, và đo một số phông chữ hiện có, tìm ra cách các chữ thường phải liên quan đến “cap”. Từ đây, tôi đã thực hiện một số quy tắc:

  • X-height = 2 x chiều cao ascender/descender.
  • Chiều rộng chân = 1/4 chữ cái in hoa
  • Chữ thường chiều rộng = 3 chữ viết in hoa

Quy luật vẽ
 
Tôi đã tạo ra các chữ O và B đầu tiên. Tôi đã quyết định rằng bất kí tự nào thường có đường cong, sẽ có góc tròn. Hầu hết các kí tự sẽ là hình khối cao, nhưng với các kí tự như O, B và D, các cạnh có đường cong sẽ có góc tròn.
Góc bên ngoài có bán kính 12mm, bên trong là 6mm. Với những quy tắc này, cộng với chiều cao cho thanh ngang (giống chữ H) tôi bắt đầu tạo ra các kí tự viết hoa.
Phông chữ của tôi rất đơn giản, nhưng với một định nghĩa “flourish”, nếu bạn muốn. Với bất kì khẩu độ nào, đó là sự mở đầu trong một kí tự, giống như sự cắt bỏ trong chữ C, , như phần cong ở đuôi chữ J, sẽ bị cắt một góc. Những chữ cái khó tạo ra nhất ở đây là G và K.
Với các kí tự viết hoa đã xong, tôi chuyển sang các kí tự viết thường. Thật khó nhưng với các quy tắc ở trên, chỉ là chuyển từ chữ in hoa sang. Tôi đã sử dụng rất nhiều ‘lourishes’  ở đây, đặc biệt là vào cuối ascender và descender. Các chữ cái f, g, a và e là những kí tự khó nhất, vì chúng hoàn toàn mới.

9 giờ đêm, thứ 4

Bây giờ tôi đã chuyển sang một số ký tự bổ sung, như dấu chấm hỏi và dấu chấm than. Tốc độ đã nhanh hơn, và trước khi đi ngủ, tôi đã có thể tạo ra khoảng 35 kí tự.

Sáng thứ ba

Vào buổi sáng, tôi hoàn thành các con số từ 0 đến 9 khá nhanh, và sau đó bắt đầu tạo ra các tập tin font.

Đây là font hoàn toàn mới. Ian Barnard, một calligrapher trên twitter, đề nghị một chương trình gọi là Glyphs, bạn có thể tải xuống và dùng thử miễn phí trong 30 ngày.

Tôi đã tải Glyphs Mini và theo dõi một vài video hướng dẫn, sau đó nhận ra rằng tôi đã tạo tệp minh hoạ hoàn toàn sai. Vì vậy, tôi đã phải dán mỗi nhân vật bằng tay và mở rộng nó để phù hợp với hướng dẫn.

10 giờ sáng, Thứ ba

Với các kí tự đã có, tôi tiếp tục với spacing và kerning. Phần này tốn rất nhiều thời gian. Có một loạt các phím tắt trong ứng dụng này mà hoàn toàn phải nắm vững trước khi đặt ra về điều này. Và trước khi bắt đầu quá trình kerning, bạn cần phải có khoảng cách chữ cái càng gần càng tốt.

Rõ ràng có một quy luật, đo chiều rộng của chữ O (phần hổng ở giữa) và chia cho ba. Đó là khoảng cách space bạn nên bắt đầu ở bên trái và bên phải của các kí tự với nhau.

11 giờ trưa, Thứ ba

Với khoảng cách đã được cài đặt (chiếm chữ cái rộng hơn như M và W) tôi bắt đầu với kerning. Nó mang lại cho tôi rất nhiều khó khăn. Tôi truy cập website này, và dán vào văn bản kerning.

Sử dụng các phím tắt (sử dụng hướng dẫn này) Tôi lướt qua và điều chỉnh kerning cho mỗi khoảng cách không nhìn thấy. Những khoảng cách rõ ràng là giữa V và A, nhưng có rất nhiều cặp chữ cái mà tôi không nghĩ đến.

Sau khi hoàn tất, tôi đã chuyển đổi kerning sang viết hoa và thực hiện lại toàn bộ, để ghép cặp chữ hoa.

12:59 chiều, Thứ ba

I exported my font and converted it to a .ttf file ready to submit to Google. With quite a few glyphs still missing (like square brackets and copyright symbols), I was certain that it wouldn’t be accepted. I also didn’t have time to include the multitudes of accents required for full language support.

Tôi đã xuất phông chữ ra và chuyển nó sang một tệp .ttf để sẵn sàng gửi tới Google. Với một vài kí tự vẫn còn thiếu (như dấu ngoặc vuông và biểu tượng copyright), tôi chắc chắn rằng nó sẽ không được chấp nhận. Tôi cũng không có thời gian để bao gồm vô số dấu cần thiết cho hỗ trợ ngôn ngữ đầy đủ.

Nó không phải là vấn đề lớn nhất của phông chữ, nhưng nó không phải là xấu cho lần đầu tiên. Và khi xem xét tôi đã phải tự học cách sử dụng phần mềm Glyphs từ đầu, và nó đã được hoàn thành trong một ngày. Thật đáng tự hào

Còn về tên?

Odibee Sans

…đọc là “oh-dee-bee”.

Phần sau

Tôi đã gửi Odibee Sans cho Google Fonts vào tháng 5 năm 2017, và vì nó vẫn còn phông chữ vẫn đang được bổ sung. Team khá đúng khi cho rằng tôi nên dành thêm thời gian cho phông chữ để tinh chỉnh thiết kế (mặc dù họ thừa nhận rằng điều này trái với tinh thần của project).

Tôi đã dành một ngày để chỉnh sửa phông chữ. Tôi đã kể từ khi thêm tất cả các extra glyphs (tôi nghĩ) cần thiết để hỗ trợ latin. Tôi cũng đã thực hiện một số thay đổi lớn cho khoảng 30 kí tự, bao gồm cả phong cách mới cho các kí tự in hoa (mũ) S, B, R, và trường hợp viết thường như s, c, y, a, e, r, f, t, p, q và j, cũng như một vài điều chỉnh số.

Trên hết, bây giờ có hơn 1.500 kerning đôi, đã có một cải tiến lớn cho các font chữ.

Và tôi đã làm một trang web! odibeesans.com

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

Những công cụ quản lý sản phẩm dành cho các Product Manager

product manager là gì
Những công cụ quản lý sản phẩm dành cho các Product Manager

Tác giả: Shaun Juncal

Giới thiệu

Khi nói về các công cụ dành cho người quản lý sản phẩm, chúng ta thường đề cập đến một số tiêu chuẩn mà hầu hết các Product Manager sử dụng hàng ngày. Các công cụ quản lý sản phẩm này thường bao gồm phần mềm phân tích sản phẩm, công cụ theo dõi phát triển và phần mềm lập bản đồ. Chúng cho phép các Product Manager dễ dàng hơn trong việc nắm bắt dữ liệu và quản lý sản phẩm. Vậy những công cụ dành cho Product Manager là gì?

  Những mẹo hay để trở thành một Product Manager giỏi nhất
  Phỏng vấn Product Manager: Giới thiệu về bản thân sao cho ấn tượng?

Các công cụ quản lý sản phẩm tốt nhất cho Product Manager là gì?

Công cụ theo dõi và phân tích người dùng (như Pendo và Amplitude)

Những công cụ này là một nguồn hữu ích và cho bạn cái nhìn sâu sắc về cách người dùng sử dụng phần mềm của bạn hoặc khách truy cập trang web của bạn thực sự tương tác với sản phẩm và nội dung sản phẩm. Trong khi các cuộc khảo sát hoặc phỏng vấn trực tiếp với khách hàng sẽ chỉ cho bạn biết khách hàng nói gì và nghĩ gì, thì các nền tảng phân tích sản phẩm có thể nắm bắt và giúp bạn phân tích những gì khách hàng thực sự đang hướng đến.

Công cụ tạo biểu đồ cho Product Manager là gì? (như ProductPlan)

Phần mềm tạo biểu đồ là thứ cần phải có trong bất kỳ danh sách công cụ quản lý sản phẩm nào. Sử dụng các trình soạn thảo và duy trì lộ trình làm việc với sản phẩm của bạn (chẳng hạn như bảng tính hoặc trang trình bày) sẽ tạo ra nhiều công việc hơn, kém linh hoạt và dễ chia sẻ hơn và dễ gặp các vấn đề về kiểm soát phiên bản có thể làm chậm sản phẩm của bạn phát triển. Biểu đồ sẽ giúp các Product Manager đơn giản hóa những điều này.

product manager
Công cụ tạo biểu đồ giúp thông tin được thể hiện trực quan hơn

Chẳng hạn như ứng dụng ProductPlan giúp bạn dễ dàng xây dựng và chia sẻ lộ trình sản phẩm một cách đẹp mắt. Một lộ trình tương tác, trực quan sẽ hiệu quả hơn nhiều trong việc truyền đạt chiến lược sản phẩm và giúp gắn kết nhóm của bạn với tầm nhìn sản phẩm của bạn.

Xem thêm các việc làm tuyển dụng product manager phúc lợi tốt tại TopDev

Các công cụ khảo sát khách hàng (như SurveyMonkey hoặc Typeform)

Cái hay của các công cụ khảo sát dựa trên web như SurveyMonkey hoặc Typeform là chúng có rất nhiều loại câu hỏi được định dạng trước, cho dù bạn muốn đưa ra câu hỏi trắc nghiệm, danh sách kiểu thả xuống hay chỉ mở các trường nhận xét, bạn có thể tạo một cuộc khảo sát trong vài phút. Sau đó, bạn có thể gửi khảo sát cho khách hàng của mình và dễ dàng theo dõi cũng như phân tích kết quả.

Xem thêm 7 tips để tuyển được những Product Manager xuất sắc nhất!

Công cụ ghi âm (như GoToMeeting hoặc Zoom) và ý nghĩa với Product Manager là gì?

Khi làm việc với khách hàng, ghi âm lại cuộc trò chuyện là một yếu tố cần thiết và quan trọng. Sử dụng những công cụ như GoToMeeting hay Zoom sẽ giúp bạn dễ dàng ghi lại các cuộc hội thoại đó và tham khảo lại sau này. Bạn không bao giờ biết khi nào khách hàng sẽ cung cấp thông tin chi tiết có giá trị, đặt một câu hỏi mà bạn nhận ra rằng nhiều người dùng khác sẽ có, hoặc chỉ chia sẻ với bạn một cuốn tiểu thuyết tại sao họ sử dụng sản phẩm của bạn mà bạn có thể không nghĩ đến.

Ứng dụng làm việc tập thể (như Slack hoặc Confluence)

Việc sử dụng các nền tảng trò chuyện khi làm việc nhóm đương nhiên là rất cần thiết, nhất là với Product Manager và team xây dựng sản phẩm của mình. Khi quá trình phát triển sản phẩm của bạn hoặc bất kỳ sáng kiến ​​phức tạp nào được đưa ra, bạn sẽ muốn có một phương tiện giao tiếp dễ dàng và tức thì cũng như duy trì hồ sơ liên tục về tất cả các thông tin liên lạc liên quan đến vấn đề đó.

Phần mềm trình bày, thuyết trình (như PowerPoint hoặc Keynote)

Với các chương trình Product Manager tuyển dụng, người phỏng vấn rất quan tâm đến kahr năng trình bày vấn đề của ứng viên. Trình bày về kế hoạch làm việc sẽ giúp Product Manager truyền đạt các chiến lược, tầm nhìn và kế hoạch cấp cao trong tổ chức của bạn và cho các đối tượng bên ngoài như khách hàng. Ví dụ, giới thiệu về tầm nhìn sản phẩm sẽ là một cách mạnh mẽ để truyền đạt tầm nhìn về sản phẩm của bạn cho một nhóm các bên liên quan điều hành và thu hút sự quan tâm của họ. Thuyết trình cũng có thể là một cách hiệu quả cao để thực hiện đào tạo bán hàng hoặc giáo dục các nhà phân tích trong ngành về sản phẩm của bạn.

product manager tuyển dụng
Khả năng thuyết trình rất quan trọng với Product Manager

Các công cụ quản lý dự án (như Jira, Pivotal Tracker hoặc Trello)

Giống như các công cụ nhắn tin nhóm đã được giới thiệu ở trên, các ứng dụng quản lý dự án ngày nay mạnh mẽ hơn nhiều và cung cấp một phương tiện đơn giản hóa để theo dõi và ghi lại chi tiết. Các công cụ quản lý dự án phổ biến khác bao gồm Microsoft Project, thường sắp xếp ở định dạng biểu đồ Gantt và Jira, với cấu hình như một công cụ theo dõi vấn đề ít trực quan hơn. Và các công cụ như Pivotal Tracker sẽ giúp bạn thực hiện theo lộ trình của mình và giữ cho công việc tồn đọng của bạn được ngăn nắp.

Công cụ tăng lưu lượng (như Visio) của Product Manager là gì?

Khả năng làm việc và tính dễ sử dụng của các công cụ tăng lưu lượng khiến chúng trở thành một công cụ tuyệt vời để thực hiện một bước mà nhiều Product Manager bỏ qua dù không nên, đó là lập bản đồ hành trình của khách hàng.

Tạo bản đồ hành trình của khách hàng rất hữu ích trong việc cung cấp cho Product Manager và team của họ cái nhìn rõ ràng hơn về trải nghiệm đầy đủ của khách hàng với sản phẩm của công ty. Khi được tạo đúng cách, bản đồ hành trình sẽ hiển thị tất cả các điểm tiếp xúc mà một cá nhân có với tổ chức của bạn từ lần đầu tiên truy cập trang web của bạn (hoặc cuộc gọi đầu tiên từ một trong những đại diện bán hàng của bạn) thông qua việc mua và sử dụng sản phẩm của bạn.

Kết luận

Để quản lý sản phẩm hiệu quả, các Product Manager nên biết cách kết hợp nhiều công cụ khác nhau để cân bằng với “sức người” và cho ra sản phẩm chất lượng, hiệu quả nhất. Trên đây là một số công cụ quản lý sản phẩm mà các Product Manager nên tham khảo.

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

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

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

6 giải pháp tuyển dụng IT giúp thiết lập chiến lược chinh phục ứng viên tài năng

tuyen dung it
tuyen dung it

Tuyen dung IT là ngành có một trong những thách thức lớn hiện nay. Nó bao hàm vấn đề tìm kiếm và thu hút những ứng viên tài năng, đặc biệt là lĩnh vực nhân sự IT.

Đừng lo lắng, vì qua bài viết sau đây, TopDev sẽ bật mí cho bạn về 6 bí quyết tuyển dụng IT giúp thiết lập giải pháp chinh phục các ứng viên tài năng.

Xác định rõ vị trí tuyển dụng IT và nhu cầu cần có ở ứng viên

Để thiết lập được một chiến lược nhân sự IT hoàn hảo, bản thân nhà tuyển dụng phải tự vạch rõ những vị trí nào cần tuyển dụng. Cụ thể sẽ là: mục đích, nội dung công việc mà ứng viên chịu trách nhiệm thực hiện. Đồng thời, một bản đánh giá chi tiết với những tiêu chí cụ thể về các kỹ năng có liên quan là điều cần thiết.

tuyển dụng IT

Đối với các ứng viên, điều này đôi khi họ thường bỏ qua. Tuy nhiên bạn cần phải biết đâu là những đặc điểm quan trọng giúp mình trở thành một ứng viên IT hay freelancer IT thực sự tiềm năng. Từ đó, trau dồi và phát triển bản thân. Đối với nhà tuyển dụng, cần thật sự quan tâm đến vấn đề này vì việc xác lập rõ các vị trí tuyển dụng sẽ giúp quá trình tuyển dụng trở nên hiệu quả hơn.

Tạo ra thách thức cho ứng viên và thiết lập nền tảng đánh giá ứng viên hiệu quả

Thu hút nhiều ứng viên tiềm năng hơn. Và đâu là giải pháp phù hợp cần được áp dụng?

TopDev giới thiệu đến bạn Coding Assessment – Bài thực hành code đánh giá năng lực. Đây được xem là thách thức được tôi ưu trực tiếp; giúp ứng viên trải nghiệm những thử thách về năng lực cá nhân một cách nhanh chóng, hiệu quả.

Đặc thù ngành IT với nhiều kỹ năng quan trọng. Do vậy, Coding Assessment sẽ là bài tập đầy thiết thực với các ứng viên. Thông qua bài test, nhà tuyển dụng có thể đánh giá được điểm mạnh, điểm thiếu sót của từng ứng viên. Từ đó có sự sàng lọc phù hợp, sát với tiêu chí đã đề ra.  

tuyển dụng IT

Ngoài ra, việc tích hợp nền tảng đánh giá ứng IT mới được xem là một nước đi thông minh. Và nền tảng đánh giá ứng viên mới TopDev x HackerRank là giải pháp khá hoàn hảo cho vấn đề này. HackerRank được biết đến là một trong những trang web thực hành code; cung cấp các loại bài tập thực hành – đánh giá coding hàng đầu hiện nay. 

Những bài thực hành đánh giá này có thể giúp đơn giản hóa quá quy trình tuyển dụng IT hay các freelancer IT của bạn rất nhiều. 

Truyền tải những thông điệp quan trọng dưới ngôn ngữ lập trình 

Mối liên hệ sâu sắc giữa một đội ngũ nhân sự đầy nhiệt huyết và nhà quản lý nhân sự sẽ được thúc đẩy mạnh mẽ nếu bạn dành sự quan tâm đến thứ ngôn ngữ của tư duy này. 

Bạn không cần phải là một master về code, đơn giản bạn chỉ cần có những kiến thức cơ bản về ngôn ngữ lập trình và nó đảm bảo tính thông dụng trong đặc thù phát triển của ngành mà thôi.

Việc nắm bắt những kiến thức về ngôn ngữ IT sẽ giúp bạn trình bày và mô tả về các vấn đề một cách chính xác, rõ ràng và hiệu quả hơn. Đừng lo lắng, vì việc tự chuyển mình thành một nhân viên IT dù bạn là người tuyển dụng IT sẽ giúp bạn có thể tiếp cận các ứng viên một cách tốt hơn.

Tuyển dụng IT hiệu quả với các nền tảng phỏng vấn thông minh

Phỏng vấn là một bước quan trọng trong quá trình tuyển dụng nhân sự và đối với nhiều công ty công nghệ, việc tạo ra một quy trình phỏng vấn đánh giá mới là thật sự cần thiết. Trong số nhiều giải pháp đang được ra mắt và không ngừng cải tiến gần đây, phỏng vấn qua video – Video Interview từ TopDev được nhiều nhà quản lý lựa chọn để tăng hiệu quả cho công tác tuyển dụng nhân sự. 

  • Phỏng vấn một chiều (One-way video interviews): Có thể dùng để thay thế phỏng vấn điện thoại (phone call) không hiệu quả. Cho phép các ứng viên ghi lại câu trả lời của họ một cách thuận tiện để gửi cho nhà tuyển dụng; hoặc thuê người quản lý đánh giá khi tuyển dụng IT hay bất cứ tuyển dụng nào. freelancer it
  • Phỏng vấn video hai chiều (Two-way video interviews)Cho phép cả ứng viên và người phỏng vấn/tuyển dụng IT phát trực tiếp trong thời gian thực. Phỏng vấn hai chiều có hiệu quả cao để khắc phục khoảng cách và tình huống khi các cuộc phỏng vấn vật lý có thể không thực hiện được. Chẳng hạn trong mùa vụ dịch COVID-19

“Săn” ứng viên tiềm năng từ các sự kiện lớn về công nghệ

Có thể nói, các sự kiện lớn về công nghệ là một trong những cách hiệu quả nhất để thu hút ứng viên trong lĩnh vực IT.

Các sự kiện không chỉ mở ra những cơ hội gặp gỡ mà còn tạo cầu nối giúp thiết lập các mối quan hệ, giúp những nhà quản lý nhân sự trực tiếp giới thiệu và chia sẻ về con người, văn hóa, định hướng của doanh nghiệp mình.

Đồng thời, các sự kiện IT, sự kiển tuyển dụng IT còn là nơi gặp gỡ, giao lưu và học hỏi giữa các tài năng về công nghệ. Điều này là lợi thế lớn vì nó giúp cho việc tìm kiếm, khoanh vùng và tiếp cận những nhân tố tiềm năng trở nên thuận lợi hơn.

tuyển dụng IT

Một số event nổi bật mà TopDev đã thực hiện và tạo ra sự ảnh hưởng lớn, thu hút nhiều cá nhân có sự quan tâm với ngành IT. Cụ thể như Vietnam Mobile Day, Vietnam Web Summit, Tech Summit,… Đặc biệt hơn, Vietnam Web Summit được đánh giá là sự kiện IT lớn và quy mô nhất Việt Nam tập trung về Công nghệ với diễn giả gồm quản lý cấp cao và chuyên gia hàng đầu. 

Đẩy mạnh phát triển tuyển dụng thông qua Digital Channels 

Việc thúc đẩy các nội dung thông qua các hình thức khác nhau như banner hay email marketing được xem là cách thức hữu hiệu. Đây là giải pháp không chỉ giúp phát triển sự nhận diện về thương hiệu nhà tuyển dụng đồng thời tiếp cận chính xác insight tiềm năng.

Theo Khảo sát toàn cầu của Stack Overflow, có đến tổng số 64% tài năng về công nghệ thích được nhận thông tin và liên hệ về việc làm thông qua địa chỉ email cá nhân của họ. Đồng thời, cũng theo khảo sát này, nền tảng liên lạc qua các mạng xã hội được xếp hạng là kém hiệu quả nhất đối với những ứng viên IT.

Nhiều nhà quản lý cho rằng mối lo hiện tại chính là làm thế nào để có lượng database ứng viên IT dồi dào và sáng tạo được nội dung cực kỳ thu hút? Với cả 2 điều trên đều là những điều cực kỳ quan trọng để có một chiến lược marketing hiệu quả nhất. TopDev được nhiều đối tác tin tưởng và đồng hành vì có thể giúp kế hoạch Email Marketing của doanh nghiệp hiệu quả hơn với kho dữ liệu 300.000 ứng viên IT, tỉ lệ mở (open rate) trung bình lên đến 20% và tỉ lệ chuyển đổi cực ấn tượng.

Lời kết

Tìm kiếm và tuyển dụng những ứng viên IT tài năng trong thời buổi hiện nay là không hề dễ dàng. Nhất là lời thời điểm biến động lớn sau mùa Covid-19.

Để có đủ sức bật cạnh tranh và gia tăng giá trị thương hiệu tuyển dụng trên thị trường, mỗi doanh nghiệp cần có những giải pháp thực sự hiệu quả. TopDev hy vọng bài viết xoay quanh tuyển dụng it vừa rồi sẽ cung cấp những thông tin bổ ích đến bạn đọc. Thị trường tuyển dụng cứ thế mà biến động và vấn đề thu hút các nhân tài công nghệ sẽ là một cuộc đua đầy thú vị.


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

Tạo CV Online hấp dẫn trong mắt nhà tuyển dụng

5 ứng dụng Android tuyệt vời dành cho Android Developer và Designer

Android

Tác giả: Antonis Tsagaris

Với tư cách là Android developer, chúng tôi chủ yếu tạo ra các ứng dụng dành cho người dùng nhưng đừng quên những developer tuyệt vời tạo ra các ứng dụng cho các developer khác.

5 ứng dụng sau đây xuất hiện trong thư mục ‘Developer’ của tôi trên Pixel XL. Chúng không phải là những ứng dụng duy nhất trong thư mục đó nhưng chúng là những app mà tôi thấy không thể thiếu đối khi làm việc.

Xem thêm: Việc làm cho designer chưa có kinh nghiệm nhiều

                                    Việc làm android lương cao cho bạn

Termux

Tôi có thể viết toàn bộ bài viết về Termux để thể hiện sự tuyệt vời của nó.

Termux là một trình mô phỏng Linux terminal với một gói các trình quản lý, các tính năng chủ đề, floating widget – tất cả đều có. Nó có một danh sách khổng lồ các gói có sẵn để tải về và nó đơn giản như

apt-get install { package-name }

Tôi sử dụng Termux để chạy sever đẩy thông báo node.js cho một trong những ứng dụng của mình trên Nexus 7 năm 2013. Điều đó có nghĩa là tôi đã phải cài đặt các node.js, một loạt các node_modules trên Termux.

Hôm qua, tôi tìm cách cài đặt một trình TypeScript bởi vì tôi muốn xem JavaScript nó xuất ra như một bài tập học tập. Tôi đã bị bummed khi đã không làm các trick, cho đến khi tôi nhận ra rằng cài đặt gói typescript thông qua các trick làm ra npm.

apt-get install tsc

Tôi đã bị damned, thực sự có là một node package tuyệt vời.

Termux miễn phí trên Play Store, mặc dù một số tiện ích phải trả phí nhưng hoàn toàn xứng đáng.

Screener

Bạn đã tạo ứng dụng của mình và bây giờ muốn xuất bản ứng dụng đó trong Play Store.

Bạn biết điều gì sẽ làm cho danh sách của bạn trông tuyệt vời? Đưa những ảnh chụp màn hình này vào khung thiết bị!

Screener cho phép bạn tải xuống một khung thiết bị và đặt ảnh chụp màn hình của bạn trong đó. Bạn thậm chí có thể thêm screen glare (loại tốt) và một cái bóng phía sau thiết bị cho sự extra snazziness. Thêm vào đó, nền được tạo ra được tô màu dựa trên ảnh chụp màn hình. Tất cả đều miễn phí.

khi bạn có thể đăng bài này

trừ khi bạn là một người không có khiếu thẩm mỹ?

Material Cue

Nếu bạn định tuân theo các nguyên tắc thiết kế Material Design, bạn sẽ cần Material Cue.

Google không cần Material Cue.

Nhưng bạn cần

“Tôn trọng grid và grid sẽ tôn trọng bạn” – Leviticus 5:12

Material Cue đặt một lớp phủ gird trên màn hình của bạn để bạn có thể kiểm tra vị trí của element. Đối với các nội dung như yếu tố điều hướng, vị trí FAB,… điều này là vô giá.

Graphice

Graphice là một công cụ chiết xuất color của Francisco Franco. Sau một thời gian ngắn làm nhà độc tài phát xít, Francisco đã quyết định tự chuộc lại bằng cách tạo ra các ứng dụng Android và Graphice là một trong những app dẫn đầu mới nhất.

Kể từ khi giới thiệu API Palette, các ứng dụng chiết xuất color đều tốn phí trong Play Store (thậm chí tôi đã có một phần crack), nhưng Graphice có lẽ là một trong những ứng dụng tốt nhất. Vâng, thậm chí còn tốt hơn.

Một điều mà Graphice làm mà tôi đã không nhìn thấy bất kỳ ứng dụng khác có là nó cho phép bạn chọn khu vực trong bức ảnh mà bạn muốn trích xuất các palette. Nó cũng cho phép bạn xác định số lượng màu sắc mà bạn muốn trích ra từ mỗi bức ảnh.

Vì vậy, nếu bạn đang tìm kiếm color palette cho ứng dụng tiếp theo của mình, bạn sẽ biết đi đâu.

Pocket Cast

Ứng dụng podcast tại sao lại ở đây?

Vâng, bạn có thể sử dụng nó để đăng ký để FragmentedDeveloper Android Backstage (ADB! Đó là thông minh, Chet), tự nhiên.

Đây là những người có kiến thức cao với khách hàng rất am hiểu và bạn không thể đủ khả năng để bỏ lỡ buổi biểu diễn của họ.

Extra recommendation: ở giữa các Android show, bạn sẽ muốn nghe Beef & Dairy Network podcast. Tin tưởng tôi, bạn làm. Nhưng đừng nói với ai về Fifth Meat.

Dishonorable mention: AIDE

Tôi đã từng yêu thích AIDE khi đó là một cách tuyệt vời để lập trình các ứng dụng Android, đặc biệt là khi mới bắt đầu.

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

7 lý do Product Manager vẫn sẽ nắm giữ vai trò quan trọng trong công nghệ SaaS

product manager là gì
7 lý do tại sao Product Manager vẫn sẽ nắm giữ vai trò quan trọng trong công nghệ SaaS?

Tác giả: Robin Dechant

Giới thiệu

Trong bối cảnh công nghệ SaaS vẫn sẽ tiếp tục phát triển và là nền tảng cho các mô hình bán hàng tự phục vụ và dịch vụ, vai trò của các Product Manager là gì trong những dự án này? Các Product Manager sẽ vẫn là những nhân vật chủ chốt để đảm bảo rằng công ty đang tạo ra sản phẩm mà khách hàng mong muốn và thực hiện lộ trình sản phẩm để không chỉ đáp ứng tình hình hiện tại mà còn tập trung vào thành công lâu dài.

Những lý do cho vai trò quan trọng của Product Manager là gì với công nghệ SaaS?

Họ là người làm việc trực tiếp với khách hàng

Xây dựng mối quan hệ với khách hàng từ sớm là chìa khóa thành công cho bất cứ dự án nào. Điều quan trọng là thị trường cũng như nhu cầu của khách hàng thay đổi theo thời gian, trong môi trường ngày nay có lẽ còn nhanh hơn bao giờ hết. Và một phần công việc của Product Manager là để nắm được những điều này. Trải nghiệm đầu tiên với sản phẩm có ý nghĩa rất lớn với cả người tạo sản phẩm và khách hàng. Việc dùng thử sẽ tăng cơ hội tạo ra giá trị và cảm nhận tốt hơn về sản phẩm.

product manager
Product Manager phải đảm nhận nhiều vai trò khác nhau

Sản phẩm tốt hơn gấp 10 lần và trải nghiệm người dùng sẽ tuyệt hơn

Điều này còn chính xác hơn nữa nếu sản phẩm mà bạn đang build xuất hiện đầu tiên trên thị trường. Trong một thị trường cạnh tranh khốc liệt, chẳng hạn như trong lĩnh vực nhân sự với hệ thống theo dõi ứng viên, có thể rất khó để làm nổi bật những điểm riêng của sản phẩm nếu sản phẩm của công ty bạn chỉ tốt hơn gấp 2 hoặc 3 lần.

Ở đây, vai trò của Product Manager là phân biệt rõ ràng sản phẩm của công ty bạn với sản phẩm của công ty đối thủ. Các PM phải đưa ra cách tiếp cận mới và suy nghĩ khác biệt. Nếu chỉ nói về việc ai đang làm cho các tính năng của sản phẩm đương nhiệm đẹp hơn, thì thật khó để tạo ra một “doanh nghiệp 100 triệu đô la”.

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

Tạo ra giao diện sản phẩm tốt hơn với suy nghĩ của Product Manager là gì?

Là người tiêu dùng sẽ sử dụng sản phẩm, chúng ta đã quen với trải nghiệm người dùng liền mạch từ tất cả các ứng dụng tuyệt vời mà chúng ta đang sử dụng và có tiêu chuẩn ngày càng cao cho các ứng dụng và sản phẩm mới. Những kỳ vọng cao này đang chuyển ngày càng nhiều vào thị trường phần mềm B2B. Nhất là với những sản phẩm đòi hỏi công nghệ phần mềm cao hơn.

Xem thêm SaaS rồi còn gì nữa?

Điều này thậm chí còn quan trọng hơn đối với các công ty SaaS, nơi người dùng không muốn dành nhiều thời gian để tìm hiểu về cách sử dụng sản phẩm hoặc quy trình làm việc mới. Trong môi trường ngày nay, nếu một Product Manager tuyển dụng vào công ty không thể xây dựng sản phẩm của mình bằng cách sử dụng các mẫu mới nhất, sẽ rất khó để thúc đẩy việc hình thành thói quen của người dùng. Nếu người dùng phải thay đổi thói quen liên quan đến kỹ thuật số của họ, họ khó có thể trở thành thành khách hàng lâu năm của công ty bạn.

Thương hiệu tạo nên tên tuổi sản phẩm

Khách hàng luôn đánh giá cao các thương hiệu nổi tiếng, đã có tên tuổi vì chúng đảm bảo độ tin cậy, tạo ra ý nghĩa và có thể thiết lập các mối quan hệ bền vững dẫn đến việc thu hút khách hàng mạnh mẽ hơn. Thương hiệu là một công cụ mạnh mẽ để giao tiếp với khách hàng. Nó cũng có thể làm cho một thương hiệu B2B hoạt động tốt hơn. Một số thương hiệu B2B SaaS tuyệt vời đã phát triển trong thời gian gần đây như Salesforce, Slack, Mailchimp hoặc Intercom chẳng hạn đã tạo ra những bước đột phá riêng cho sản phẩm của mình. Và vai trò của Product Manager là gì? Chính là xây dựng và tích hợp thương hiệu vào sản phẩm.

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

Đóng góp vào quá trình thiết kế sản phẩm

Các công ty này luôn quan tâm đến trải nghiệm của khách hàng và mỗi tính năng mới của sản phẩm sẽ tác động đến khách hàng như thế nào. Họ phải định hình sản phẩm và lên phương án thiết kế từ rất sớm. Trong suốt quá trình đó, các công ty phải lấy khách hàng làm trung tâm, để áp dụng các đặc tính văn hóa của họ vào sản phẩm. Điều này cũng đúng đối với các công ty B2C và nếu bạn nhìn vào các công ty công nghệ được đánh giá cao hiện nay, bạn sẽ thấy rất nhiều đồng sáng lập có nền tảng thiết kế – có thể là Brian Chesky từ Airbnb hoặc Evan Spiegel từ Snapchat, người đã học Thiết kế sản phẩm ở Stanford.

product manager tuyển dụng
Product Manager cũng chịu trách nhiệm thiết kế sản phẩm

Sự quan trọng của thời gian trong việc hoàn thiện một sản phẩm

Cách hoạt động của phần mềm thường tuân theo chu kỳ. Theo thời gian, các công ty có thể hưởng lợi từ công nghệ mới nhất và có thể tạo ra cùng một sản phẩm và tính năng trong một khoảng thời gian ngắn hơn so với các công ty trước đó. Để hạn chế những điều này khi build một sản phẩm mới, Product Manager nên quan tâm đến dữ liệu để tìm được phương án thích hợp. Có các chỉ số được xác định rõ ràng, học hỏi từ dữ liệu và tối ưu hóa chúng. Trong hầu hết các trường hợp, vấn đề không phải là ai có thể xây dựng nhiều tính năng nhất mà là ai có thể xây dựng sản phẩm tốt nhất.

Trách nhiệm và ảnh hưởng của Product Manager là gì?

Một Product Manager sẽ phải bắt đầu công việc từ việc hiểu và thực hiện theo tầm nhìn của công ty để duy trì lộ trình sản phẩm trong khi luôn tìm hiểu thêm về khách hàng và thị trường của bạn. Bạn cũng đang làm việc trong sự giao thoa giữa kỹ thuật và kinh doanh, cố gắng hoàn thành những kỳ vọng không thực tế.

  Những mẹo hay để trở thành một Product Manager giỏi nhất
  Một ngày làm việc của Google Product Manager

Trong vai trò này, công việc của Product Manager không chỉ là việc liên kết các phần khác nhau lại với nhau mà còn áp dụng các công nghệ mới có thể gia tăng giá trị như machine learning. Mục đích của việc làm này không phải vì lợi ích mà để thực sự giải quyết một vấn đề hoặc cải thiện trải nghiệm của khách hàng. Tóm lại, Product Manager đảm nhiệm nhiều vai trò khác nhau và tôi nghĩ điều này nhấn mạnh ảnh hưởng của họ đối với khách hàng cũng như đối với công ty và tầm nhìn cũng như tương lai của công ty.

Kết luận

Rõ ràng công việc của Product Manager vẫn sẽ tiếp tục có ảnh hưởng đến nhiều quyết định quan trọng trong việc phát triển lộ trình sản phẩm. Nhất là với các sản phẩm liên quan đến phần mềm. Do đó những ai đang quan tâm đến công việc Product Manager trong phát triển công nghệ SaaS, nên có sự tìm hiểu ngay từ đầu để nắm bắt đúng những việc cần làm.

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

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

Xem thêm tuyển dụng IT đãi ngộ tốt trên TopDev

Cách làm HTTPS hoạt động trên local trong 5 phút

Tác giả: Daksh Shah

Hầu như mọi trang web bạn truy cập vào ngày hôm nay đều được HTTPS bảo vệ. Nếu bạn chưa có, hãy setup 1 ssl cert cho web của bạn. Việc sử dụng HTTPS cho web nhà bạn đòi hỏi các request từ đây ra ngoài cũng đòi hỏi các service khác cũng phải sử dụng HTTPS, bằng không nó sẽ không cho phép service hoạt động vì không đảm bảo đồng nhất và bảo mật. Điều này gây ra 1 vấn đề cho các developer coding trên local và cần test trên HTTPS cho đồng nhất với production.

Ngay khi bắt đầu dự án, chúng tôi quyết định secure AWS Elastic Load Balancer với HTTPS như là một phần của việc tăng cường tính bảo mật. Tôi gặp phải một tình huống là request từ local của tôi đến máy chủ bị từ chối.

Trong một cuộc tìm kiếm Google, tôi đã tìm thấy một số bài báo như thế này, đâybài viết này hay hướng dẫn chi tiết về cách giúp tôi triển khai HTTPS trên localhost. Không có hướng dẫn nào làm việc ngay cả sau khi tôi làm từng bước giống y hệt họ. Chrome luôn ném một lỗi  NET::ERR_CERT_COMMON_NAME_INVALID vào tôi.

Vấn đề

Tất cả các hướng dẫn chi tiết tôi đã tìm thấy phù hợp với thời điểm mà họ viết, còn bây giờ đã được thay đổi khá nhiều (nhất là đối với Chrome)

Sau một thời gian Google mãi, tôi phát hiện ra rằng lý do chứng chỉ SSL ở local bị từ chối là Chrome không còn hỗ trợ commonName matching trong certificates, cụ thể là nó còn đòi thêm 1 subjectAltName từ tháng 1 2017.

Cách giải quyết

Chúng ta sẽ dùng OpenSSL để cấp tất cả các chứng chỉ.

Bước 1: Root SSL cert

Bước đầu tiên là tạo một chứng chỉ Root Secure Sockets Layer (SSL). Chứng chỉ này sau đó có thể được sử dụng để chứng thực bất kỳ số chứng chỉ nào bạn có thể tạo ra các tên miền riêng lẻ.

Tạo một RSA-2048 và lưu nó vào một file rootCA.key. Tập tin này sẽ được sử dụng như là một key để tạo ra chứng chỉ Root SSL. Bạn sẽ được nhắc nhập pass để sau này khi tạo chứng chỉ nhưng theo toi bạn cũng cần phải nhập chi cho lằng nhằng.

openssl genrsa -des3 -out rootCA.key 2048.

Bạn sử dụng key mà bạn generate bên trên để tạo mới một chứng chỉ Root SSL. Lưu nó vào một file tên rootCA.pem. Chứng chỉ này sẽ có hiệu lực là 1.024 ngày. Bạn có thể thay đổi nó vào bất kỳ số ngày nào bạn muốn.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

Bước 2: Làm cho root SSL của bạn Trust

Trước khi bạn có thể sử dụng chứng chỉ gốc Root SSL đã được tạo để bắt đầu phát hành cert cho tên miền, thêm một bước nữa. Bạn cần phải cho Mac trust chứng chỉ gốc để tất cả cert được phát hành bởi nó cũng được tin cậy.

Mở Keychain Access trên máy Mac và đi đến mục Certificates trong System keychain. Khi đó, nhập rootCA.pem bằng File> Import Items. Nhấp đúp vào chứng chỉ đã nhập và thay đổi phần “When using this certificate:” thả xuống thành Always Trust vào Trust section.

Chứng chỉ của bạn sẽ trông giống như sau trong Keychain Access nếu bạn đã thực hiện đúng các hướng dẫn cho đến giờ.

Bước 3: Domain SSL certificate

Cert Root SSL có thể được sử dụng để phát hành chứng chỉ đặc biệt cho các thiết bị local tại localhost.

Tạo một tệp server.csr.cnf với cấu hình OpenSSL mới để bạn có thể nhập các cài đặt này khi tạo chứng chỉ thay vì nhập chúng vào dòng lệnh.

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost

Tạo tệp v3.ext để tạo chứng chỉ X509 v3. Chú ý cách chúng tôi xác định subjectAltName.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Tạo mã khóa cho chứng chỉ cho localhost bằng cách sử dụng các cài đặt cấu hình được lưu trữ trong server.csr.cnf và mã khóa này được lưu trữ trong server.key.

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )

Yêu cầu ký chứng chỉ (certificate signing request) được cấp qua cert Root SSL mà chúng tôi đã tạo trước đó để tạo chứng chỉ miền cho localhost. Đầu ra là một tập tin chứng chỉ được gọi là server.crt.

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Sử dụng chứng chỉ SSL mới

Bạn đã sẵn sàng để secure localhost với HTTPS. Di chuyển các tệp server.key và server.crt đến một vị trí dễ access và include chúng khi khởi động web server.

Trong một ứng dụng Express được viết bằng Node.js, dưới đây là cách bạn thực hiện. Hãy chắc chắn rằng bạn làm chỉ cho môi trường local. Không sử dụng trong production.

var path = require('path')
var fs = require('fs')
var express = require('express')
var https = require('https')

var certOptions = {
  key: fs.readFileSync(path.resolve('build/cert/server.key')),
  cert: fs.readFileSync(path.resolve('build/cert/server.crt'))
}

var app = express()

var server = https.createServer(certOptions, app).listen(443)

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

  Hiểu hơn HTTPS với bồ câu đưa thư

Cách tôi nhân rộng một dự án trị giá 86 triệu đô la với 57 dòng code

Tác giả: Tait Brown

Cảnh sát Victoria là cơ quan thực thi pháp luật chính của Victoria, Úc. Với hơn 16.000 xe bị mất cắp ở Victoria trong năm qua – tổn thất khoảng 170 triệu đô – cơ quan này đang thử nghiệm nhiều giải pháp kỹ thuật nhằm giải quyết nạn trộm xe. Họ gọi hệ thống này là BlueNet.

Để giúp ngăn chặn việc bán xe ăn cắp, đã có một dịch vụ dựa trên web tên VicRoads để kiểm tra tình trạng đăng ký xe. Bộ cũng đã đầu tư vào một máy quét tấm giấy cố định – một camera cố định quét qua lưu lượng để tự động xác định các xe bị đánh cắp.

Đừng hỏi tôi tại sao, nhưng một buổi chiều tôi đã có mong muốn mẫu thử nghiệm một chiếc máy quét nhãn đĩa xe gắn máy sẽ tự động thông báo cho bạn nếu một chiếc xe đã bị đánh cắp hoặc đã không đăng ký. Hiểu rằng những thành phần cá nhân này tồn tại, tôi tự hỏi làm thế nào để kết hợp chúng với nhau khó khăn đến thế nào.

Cảnh sát Victoria vừa mới tung ra bản thử nghiệm về một phần mềm tương tự, và chi phí phát hành ước tính đã ở đâu đó trong khoảng 86.000.000 đô. Một người bình luận đã chỉ ra rằng với 86 triệu đô để trang bị cho 220 chiếc xe thì sẽ tính ra trung bình 390,909 đô mỗi chiếc.

Chắc chắn chúng ta có thể làm tốt hơn một chút.

Các tiêu chí làm nên thành công

Trước khi bắt đầu, tôi lên kế hoạch về yêu cầu chính cho thiết kế sản phẩm:

#1: Việc xử lý hình ảnh phải được thực hiện local

Streaming video trực tiếp đến nơi xử lí trung tâm dường như là cách tiếp cận hiệu quả nhất để giải quyết vấn đề này. Bên cạnh tuyệt vời cho lưu lượng truy cập dữ liệu, bạn cũng giới thiệu độ trễ mạng vào một quá trình có thể đã được khá chậm.

Mặc dù một thuật toán về centralized machine learning chỉ có thể có được sự chính xác hơn theo thời gian, chúng ta muốn tìm hiểu nếu một local thực hiện trên thiết bị sẽ là “đủ tốt”.

#2: Phải làm việc với hình ảnh có chất lượng thấp

Bởi vì tôi không có Raspberry Pi hoặc webcam USB nên tôi sẽ sử dụng footage của dashcam – nó có sẵn và là nguồn lý tưởng cho dữ liệu mẫu. Giống như added bonus, dashcam video đại diện cho chất lượng chung của footage mà bạn mong muốn từ các camera gắn trên xe.

#3: Cần được xây dựng dựa trên công nghệ mã nguồn mở 

Dựa trên một phần mềm độc quyền có nghĩa là bạn sẽ get stung mỗi khi bạn yêu cầu thay đổi hoặc tăng cường – và tiếp tục stinging cho mỗi yêu cầu được thực hiện sau đó. Sử dụng công nghệ mã nguồn mở là không cần suy nghĩ.

Relying upon a proprietary software means you’ll get stung every time you request a change or enhancement — and the stinging will continue for every request made thereafter. Using open source technology is a no-brainer.

Kết luận

Ở level cao, giải pháp của tôi lấy một hình ảnh từ dashcam video, đưa nó qua qua một hệ thống nhận dạng tấm giấy phép mã nguồn mở được cài đặt cục bộ trên thiết bị, truy vấn dịch vụ kiểm tra đăng ký, và sau đó trả về kết quả.

Dữ liệu được trả lại cho thiết bị được cài đặt trong xe thực thi pháp luật bao gồm xe và mô hình (mà nó chỉ sử dụng để xác minh các xe đã bị đánh cắp), tình trạng đăng ký và bất kỳ thông báo nào của chiếc xe được báo cáo bị đánh cắp.

Nghe có vẻ đơn giản, đó là bởi vì nó thực sự là. Ví dụ, xử lý hình ảnh tất cả có thể được xử lý bởi thư viện openalpr.

Tất cả được dùng để nhận diện các ký tự trên license plate:

openalpr.IdentifyLicense(imagePath, function (error, output) {
   // handle result
});

Đây là những điều của tôi chứng minh khái niệm như sau:

// Open form and submit enquire for `rego`
function getInfo(rego) {
	horseman
	  .userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0')
	  .open(url)
	  .type('#registration-number-ctrl input[type=text]', rego)
	  .click('.btn-holder input')
	  .waitForSelector('.ctrl-holder.ctrl-readonly')
	  .html()
	  .then(function(body) {
	  	console.log(processInfo(body, rego));
	    return horseman.close();
	  });
}

// Scrape the results for key info
function processInfo(html, rego) {
	var $ = cheerio.load(html);
	var vehicle = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Vehicle:';
	}).next().text().trim();

	var stolen = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Stolen status:';
	}).next().text().trim();

	var registration = $('label.label').filter(function() {
	  return $(this).text().trim() === 'Registration status & expiry date:';
	}).next().text().trim();

	return {
		rego,
		vehicle,
		stolen,
		registration
	};
}

Kết quả

Sự công nhận về giấy phép mã nguồn mở được không được công nhận. Ngoài ra, các thuật toán nhận dạng hình ảnh có thể không được tối ưu hóa cho tấm giấy phép của Úc.

Giải pháp đã có thể nhận diện tấm giấy phép trong một lĩnh vực rộng.

Mặc dù, giải pháp này đôi khi gặp vấn đề với các chữ cái trên biển số.

Nhưng … các giải pháp cuối cùng sẽ có được sự chính xác.

Như bạn thấy trong hai hình ảnh trên, việc xử lý hình ảnh một vài khung hình sau đó đã nhảy lên từ mức độ tự tin là 87% đối với tóc trên 91%.

Với tính chính xác có thể được cải thiện bằng cách tăng tỷ lệ mẫu và sau đó sắp xếp theo thứ hạng độ tin cậy cao nhất. Ngoài ra, một ngưỡng có thể được đặt chỉ chấp nhận sự tự tin lớn hơn 90% trước khi tiếp tục xác nhận số đăng ký.

Đây là các bản sửa lỗi code đầu tiên và không loại trừ việc đào tạo phần mềm nhận dạng license plate với bộ dữ liệu cục bộ.

Còn về 86,000,000 đô

Để công bằng, tôi hoàn toàn không biết có bao nhiêu con số 86 triệu đô – và tôi cũng không thể nói về tính chính xác của công cụ mã nguồn mở của tôi mà không cần đào tạo so với hệ thống BlueNet.

Tôi hy vọng phần của ngân sách đó bao gồm việc thay thế một số cơ sở dữ liệu và các ứng dụng phần mềm để hỗ trợ truy vấn các cấp phép có tần số cao, độ trễ thấp trên mỗi xe.

Mặt khác, chi phí khoảng 391k đô mỗi xe dường như khá tốn kém – đặc biệt nếu BlueNet không chính xác và không có các dự án công nghệ thông tin quy mô lớn để ngừng hoạt động hoặc nâng cấp các hệ thống bị phụ thuộc.

Các ứng dụng tương lai

Mặc dù rất dễ bị cuốn vào bản chất Orwellian của một mạng lưới những người tán thành tấm giấy phép luôn có nhiều ứng dụng tích cực của công nghệ này. Hãy tưởng tượng một hệ thống thụ động quét người cùng đi xe và tự động cảnh báo các nhà chức trách và thành viên gia đình đến vị trí hiện tại của họ.

Xe của Teslas đã được làm đầy bằng camera và cảm biến với khả năng nhận được các bản cập nhật OTA – hãy tưởng tượng biến những chiếc xe này thành một đội quân tốt. Các tài xế của Ubers và Lyft cũng có thể được trang bị các thiết bị này để tăng đáng kể phạm vi bảo hiểm.

Sử dụng công nghệ mã nguồn mở và các component hiện có, có vẻ như có thể cung cấp một giải pháp cung cấp một tỷ lệ lợi nhuận cao hơn nhiều – cho một khoản đầu tư ít hơn 86triệu đô.

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