Home Blog Page 194

Top 5 công cụ mã nguồn mở dành cho MySQL administrator

top-5-cong-cu-ma-nguon-mo-danh-cho-mysql-administrator

Sử dụng những công cụ tuyệt vời này để cải thiện CLI và web admin, SQL queries, schema migration, sao chép và phục hồi môi trường MySQL open source của bạn.

Đối với các database administrators (DBA), việc giữ cho cơ sở dữ liệu chạy ở tốc độ tối đa có thể giống như con quay: tốc độ, tập trung, phản ứng nhanh với cái đầu lạnh và thỉnh thoảng hãy nhờ vả từ người xem hữu ích. Database là trung tâm của sự thành công của hầu hết các ứng dụng. Bởi vì DBA chịu trách nhiệm về dữ liệu của tổ chức, việc tìm kiếm các công cụ đáng tin cậy giúp họ hợp lý hóa quá trình quản lý cơ sở dữ liệu và giảm bớt các công việc bảo trì hàng ngày là rất cần thiết. DBAs cần những công cụ đủ tốt để giữ cho hệ thống của họ hoạt động trơn tru.

Vậy các công cụ đáng tin cậy cho các MySQL administrator là gì? Ở đây tôi chia sẻ 5 công cụ mã nguồn mở hàng đầu các MySQL administrator và công dụng của chúng trong việc hỗ trợ các công việc quản trị hàng ngày MySQL. Đối với mỗi công cụ, tôi đã cung cấp liên kết tới kho GitHub và liệt kê số lượng GitHub star tại thời điểm viết.

  Tại sao không bao giờ nên sử dụng utf8 trong MySQL?
  MySQL ngoại truyện

Mycli

Dự án Mycli cung cấp MySQL tự động hoàn thành dòng lệnh và đánh dấu cú pháp. Đây là một trong những công cụ phổ biến nhất của MySQL.

Các hạn chế về an ninh chẳng hạn như jump host và xác thực hai yếu tố để lại nhiều MySQL DBA với lệnh chỉ truy cập vào hệ thống của họ. Trong những trường hợp như vậy, các công cụ GUI yêu thích giống như MySQL Workbench, Monyog, và các công cụ khác không phải là một lựa chọn.

Tại dòng lệnh, ta sẽ tốn nhiều thời gian tại vùng light-on-black terminal. Vì vậy, một trong những điều tuyệt vời về Mycli là sự phong phú của cú pháp. Điều này cho phép bạn, ví dụ, để trực quan seperate function và các nhà khai thác từ chuỗi query trong mệnh đề WHERE. Đối với một truy vấn ngắn, dòng đơn không phải là một vấn đề lớn, nhưng nó sẽ thay đổi khi bạn làm việc với các query thực hiện các JOIN operation trên nhiều hơn một vài bảng. Tôi đang dùng JOIN bằng cách sử dụng các cột index? Tôi có thể lọc bằng cách sử dụng ký tự đại diện trong mệnh đề WHERE? Mycli hỗ trợ các query với nhiều dòng và được đánh dấu cú pháp, điều này có nghĩa là bạn có thể tìm hiểu về các phần quan trọng nhất khi xem xét hoặc tối ưu hóa query. Bạn có thể chọn từ một số cú pháp làm nổi bật hay tạo ra một số của riêng bạn.

Các tính năng đáng giá khác của Mycli thực sự thông minh. Nó này cho phép bạn chọn tên bảng và cột từ danh sách bằng cách nhập chỉ vài ký tự đầu tiên. Đầu vào hiện tại của bạn không bị bỏ qua để chạy lệnh SHOW CREATE TABLE bởi vì bạn quên tên cột mà bạn muốn xuất hiện trong mệnh đề WHERE!

Cách thức hoạt động của Mycli

Với Mycli, bạn có thể ẩn danh các query ưa thích bằng việc sử dụng sử dụng \ fs, ví dụ: \ fs myAlias myQuery. Điều này rất tiện dụng, vì bạn có thể thực hiện tquery bằng cách sử dụng \ f myAlias bất cứ khi nào cần thiết.

Dự án Mycli sử dụng BSD 3 license. Với sự 44 comtributor, 1.2k cam kết, và 5k sao.

Gh-ost

Nếu như 99% người dùng của MySQL DBA phải đối mặt với việc thay đổi đối với bảng MySQL trong khi vẫn lo sợ tác động lên quá trình làm việc thì bạn nên cân nhắc sử dụng Gh-ost (GitHub Online Schema Migration). Gh-ost cung cấp các thay đổi lược đồ MySQL mà không blocking write, hay không sử dụng các trigger, với khả năng tạm dừng và tiếp tục quá trình di chuyển!

Tại sao việc này lại quan trọng đến vậy? Vì MySQL 5.6 được vận chuyển với ALTER TABLE mới … ALGORITHM = INPLACE DDL (Data Definition Language), có thể chỉnh sửa một bảng mà không blocking wite cho các hoạt động chung như thêm một index (B-tree). Tuy nhiên, vẫn còn một vài điều kiện mà ( DML statement) bị chặn, đáng chú ý nhất là việc bổ sung một index ĐẦY ĐỦ, mã hoá không gian bảng và chuyển đổi thành định dạng cột.

Một số công cụ thay đổi giản đồ trực tuyến phổ biến khác, chẳng hạn như trình thay đổi giản đồ-trực tuyến Percona, bằng cách thực hiện một bộ ba trình trigger (INSERT, UPDATE và DELETE) trên máy chủ để giữ một bảng sao chép để đồng bộ với sự thay đổi. Điều này giới thiệu một hình phạt hiệu suất nhỏ nhờ vào viết khuếch đại, nhưng đáng kể hơn yêu cầu bảy trường hợp khóa metadata. Điều này có hiệu quả ngăn chặn DML Data Manipulation Language).

Vì Gh-ost hoạt động sử dụng binary log, nó không dễ bị ảnh hưởng bởi những hạn chế  trigger-based. Cuối cùng, Gh-ost có thể kích hoạt hoạt động một cách hiệu quả đến mức không, cho phép bạn tạm dừng quá trình di chuyển lược đồ một thời gian nếu máy chủ của bạn bắt đầu xảy ra xung đột và tiếp tục khi bubble vẫn hoạt động.

Các chế độ vận hành của Gh-ost

Vậy Gh-ost hoạt động như thế nào? Mặc định, Gh-ost kết nối với một bản sao (slave), xác định chủ, và di chuyển trên máy chủ. Nó nhận các thay đổi trên một bản sao cho bảng nguồn trong binlog_format = ROW, phân tích cú pháp và chuyển đổi các câu lệnh này để được thực hiện lại trên shadow table của Master. Nó theo dõi việc đếm các hàng trên bản sao và xác định khi nào là thời gian để thực hiện một atomic cutover (bảng chuyển đổi).

Gh-ost cung cấp một chế độ thay thế nơi bạn thực hiện việc di chuyển trực tiếp trên master (cho dù nó có slave hay không), đọc lại các sự kiện binlog_format=ROW của Master, và sau đó áp dụng lại chúng vào sahdow table.

Gh-ost general flow.

Tùy chọn cuối cùng cho phép di chuyển chỉ trên bản sao mà không ảnh hưởng đến master, vì vậy bạn có thể thử nghiệm hoặc bằng cách khác xác thực việc di chuyển

Lưu ý rằng nếu lược đồ của bạn ở nước ngoài, thì Gh-ost có thể không hoạt động trơn tru, vì không được hỗ trợ.

Lưu ý rằng oak-online-alter-table là tiền thân của Gh-ost. Bạn có thể đọc một so sánh giữa Gh-ost và pt-online-schema-change performance của Peter Zaitsev, CEO của Percona, cùng với phản hồi từ Shlomi Noach, tác giả và người duy trì bộ công cụ OAK và Gh-ost.

Dự án Gh-ost sử dụng MIT license. Với 29 contributor, gần 1k cam kết, và 3k sao.

PhpMyAdmin

Một trong những dự án chạy dài hơi và trưởng thành nhất trong số các công cụ MySQL là công cụ PhpMyAdmin cho phép quản lý MySQL qua web. phpMyAdmin cho phép DBA để duyệt và chỉnh sửa các đối tượng cơ sở dữ liệu MySQL: database, bảng biểu, view, field, và các index. Có các tùy chọn để thực hiện xuất dữ liệu bằng cách sử dụng một tá định dạng, sửa đổi người dùng MySQL và đặc quyền của họ, và – yêu thích của tôi-thực hiện các ad-hoc query.

PhpMyAdmin status page showing questions, connections/processes, and traffic graphs.
Giao diệnPhpMyAdmin bắt đầu.

Bạn cũng sẽ tìm thấy tab Status với những câu hỏi, kết nối/quy trình và lưu lượng truy cập mạng cho trường hợp cơ sở dữ liệu cho phép, cùng với tab Advisor cho bạn thấy danh sách các vấn đề về hiệu năng có thể cùng với các đề xuất khắc phục.

PhpMyAdmin sử dụng GPLv2 license. Đây là một dự án khổng lồ với hơn 800 contributor, 112k cam kết tuyệt vời, và 2.7k sao. Bản giới thiệu trực tuyến hiện có tại https://demo.phpmyadmin.net/master-config/

Sqlcheck

SQL anti-pattern làm chậm các query, nhưng thường phải yêu cầu DBA có kinh nghiệm và nghiên cứu phát triển qua mã để xác định và giải quyết chúng. Sqlcheck phản ánh những nỗ lực của Joy Arulraj để soạn thảo cuốn sách “SQL Anti-patterns: Avoiding the Pitfalls of Database Programming” của Bill Karwin. Karwin phân loại thành bốn loại anti-pattern:

  1. Thiết kế cơ sở dữ liệu hợp lý
  2. Thiết kế cơ sở dữ liệu vật lý
  3. Query
  4. Phát triển ứng dụng
Sqlcheck khi làm việc.

Sqlcheck trở thành mục tiêu tại nhiều mức độ rủi ro, được phân loại là rủi ro thấp, trung bình hoặc cao. Điều này hữu ích nếu danh sách các anti-pattern của bạn lớn, vì bạn có thể ưu tiên các truy vấn có tác động hiệu quả lớn nhất. Tất cả những gì bạn cần làm để bắt đầu là thu thập một danh sách các truy vấn riêng biệt của bạn vào một tệp tin và chuyển chúng như một đối số cho công cụ.

Tôi đã dùng mẫu lấy từ môi trường PMM Demo để tạo ra kết quả sau:

[michael@fedora ~]$ sqlcheck —file_name PMMDemoQueries.txt
+————————————————————————-+
|                   SQLCHECK                      |
+————————————————————————-+
> RISK LEVEL    :: ALL ANTI-PATTERNS
> SQL FILE NAME :: output
> COLOR MODE    :: ENABLED
> VERBOSE MODE  :: DISABLED
> DELIMITER     :: ;
————————————————————————-
==================== Results ===================

————————————————————————-
SQL Statement: select table_schema, table_name, table_type, ifnull(engine, ‘none’) as engine,
ifnull(version, ‘0’) as version, ifnull(row_format, ‘none’) as row_format,
ifnull(table_rows, ‘0’) as table_rows, ifnull(data_length, ‘0’) as data_length,
ifnull(index_length, ‘0’) as index_length, ifnull(data_free, ‘0’) as data_free,
ifnull(create_options, ‘none’) as create_options from information_schema.tables
where table_schema = ‘innodb_small’;
[output]: (HINTS) NULL Usage
[Matching Expression: null]
...
==================== Summary ===================
All Anti-Patterns and Hints  :: 7
>  High Risk   :: 0
>  Medium Risk :: 0
>  Low Risk    :: 2
>  Hints       :: 5

Sqlcheck được bao gồm trong Apache 2.0 license. Dự án có năm người đóng góp, 187 thành viên, và 1,4k sao.

Orchestrator

Orchestrator là công cụ quản lý sẵn có với khả năng nhân rộng cao. Nó cung cấp khả năng để tìm ra replication topology của một môi trường MySQL bằng cách thu thập dữ liệu thay đổi của chuỗi để xác định các master và slave. Nó cũng có thể được sử dụng để tái cấu trúc lại replication topology thông qua GUI, cung cấp một giao diện drag-and-drop để thúc đẩy một slave cho một master. Quá trình vận hành này rất an toàn. Trong thực tế, Orchestrator từ chối bất kỳ hoạt động bất hợp pháp để không phá vỡ hệ thống của bạn.

Cuối cùng, Orchestrator có thể hỗ trợ khôi phục khi các nodes bị lỗi, vì nó sử dụng khái niệm về trạng thái để lựa chọn phương pháp khôi phục chính xác và quyết định quy trình quảng bá chính phù hợp để áp dụng.

Orchestrator là một công cụ khác được cung cấp bởi Shlomi Noach tại GitHub. Nó được bao gồm trong Apache 2.0 License. Orchestrator có 34 contributor, 2,780 cam kết, và 900 sao.

Orchestrator cung cấp một cửa sổ làm việc vào MySQL để  nhân rộng và phục hồi.

“Keeping the plates spinning”

Percona Monitoring and Management (PMM) đảm nhiệm công việc làm nổi bật các khu vực cần sự chú ý và giúp quản trị cơ sở dữ liệu xác định và giải quyết các vấn đề cơ sở dữ liệu.

PMM kết hợp một số công cụ mã nguồn mở tốt nhất, bao gồm Orchestrator, để cung cấp một cơ sở dữ liệu và quản lý cơ sở dữ liệu toàn diện. Đồ họa của nó giúp dễ dàng đồng hóa những visual clues với trạng thái của các máy chủ dữ liệu theo thời gian, và hỗ trợ các máy chủ MySQL, MariaDB, và MongoDB. Kiểm tra bản public demo của chúng tôi!

Giống như 5 công cụ hàng đầu của tôi và tất cả phần mềm của Percona, PMM hoàn toàn miễn phí và với mã nguồn mở có thể tải xuống từ trang website Percona hoặc từ GitHub.

Với công cụ tôi đã mô tả một khía cạnh khác vai trò của quản trị viên MySQL. Chúng góp phần vào kho vũ khí của bạn các công cụ quản lý cơ sở dữ liệu và cho phép bạn khai thác kinh nghiệm và kỹ năng của những contributor cho các dự án phổ biến. Chúng hoàn toàn miễn phí với mã nguồn mở và có thể được điều chỉnh cho phù hợp với nhu cầu của môi trường của bạn nếu cần thiết, hoặc bạn có thể sử dụng chúng mà không sửa đổi. Nếu bạn chưa khám phá chúng, tôi khuyên bạn hãy xem xét kỹ hơn về những phần mềm này nếu chúng cho bạn ưu thế hơn các phương pháp và công cụ hiện tại hay không.

Bài viết gốc tại Infoworld

Tham khảo thêm các vị trí tuyển dụng My SQL lương cao tại Topdev.

10 lí do để học Scala và FP

Một trong những câu hỏi mà độc giả của tôi thường hỏi là, “Các nhà phát triển Java có nên học Scala không? Scala có tương lai tốt hơn Java không? Tại sao các nhà phát triển Java nên học Scala?”.

Ở đây, chúng ta sẽ nói về những lý do khuyến khích các nhà phát triển Java học Scala.

Đó là ngôn ngữ JVM được lựa chọn, để lại Groovy và Kotlin phía sau, và được ưa thích như ngôn ngữ mà mọi người muốn viết nhất.

Scala có một số điểm mạnh, trong đó có thể nhắc tới là việc nó là một ngôn ngữ đa mô hình (multi-paradigm language). Nó không chỉ giải quyết được nhiều vấn đề của Java ví dụ: bất biến với các từ khóa val và case class.

Hơn nữa, dù nó có sự lưu loát và linh hoạt của các ngôn ngữ như Python, Scala vẫn là một ngôn ngữ statically typed. Điều này giúp bạn ít phạm phải sai lầm hơn.

Tôi chắc rằng các nhà phát triển Scala sẽ có thêm nhiều lý do vào danh sách này, nhưng từ góc nhìn của Java, tôi nghĩ Scala chắc chắn có những lý do sau đây để thu hút các nhà phát triển Java.

Ngôn ngữ đa mô hình – Multi-Paradigm Language

Scala có một chút khác biệt so với Java, vì nó hỗ trợ hai mô hình lập trình: lập trình hướng đối tượng (OOP) và lập trình hàm (FP). Để nâng cao kỹ năng lập trình của bạn, tôi khuyên nên học ít nhất một ngôn ngữ từ các mô hình khác nhau, ví dụ: imperative, logical, functional và OOP. Scala sẽ cung cấp cho bạn một cơ hội để khám phá cả functional và OOP với nhau.

Cuốn Pragmatic Programmer cũng khuyên bạn nên học một ngôn ngữ lập trình mới mỗi năm. Scala cho phép bạn define type với cả data attribute (với các class hoạt động như C++/Java class) và behavior attribute (với các đặc điểm tương ứng với Java interface).

Cũng giống như các ngôn ngữ lập trình chức năng khác (functional programming language), Scala function là hàm hạng nhất (có nghĩa là bạn có thể chuyển chúng thành giá trị) và Scala cũng hỗ trợ các hàm ẩn danh và currying (một phần ứng dụng của các hàm đa đối số).

Sự kết hợp các tính năng này giúp bạn có thể viết các chương trình Scala khá ngắn gọn và thanh lịch. Đây cũng chính là điểm mạnh nhất của Scala, mà Java 8 cũng đã cố gắng bắt chước theo bằng cách giới thiệu các biểu thức lambda, nhưng nó vẫn còn cách Scala một khoản khá xa.

Khả năng tương tác với Java

Theo ý kiến ​​của tôi, sự lựa chọn phát triển cho Scala với khả năng tương tác với Java là điều tốt nhất từng xảy ra với ngôn ngữ này. Scala chạy trên Java Virtual Machine (JVM) và có thể tương thích với code Java. Điều này có nghĩa là các nhà phát triển có thể sử dụng các thư viện Java trực tiếp từ code Scala.

Do đó mà đối với việc các nhà lập trình Java chuyển qua sử dụng Scala thì đây là cách hoàn hảo để tận dụng những năm kinh nghiệm của họ trong lập trình.

Nó cũng có thể gọi Scala code từ Java, và bạn sẽ vẫn dễ dàng viết một phần chương trình trong Scala và phần còn lại trong Java.

Tóm lại, khả năng tương tác với Java mang lại cho Scala tiềm năng to lớn để trở thành ngôn ngữ lập trình mạnh nhất, vì rất nhiều code của thế giới được viết bằng Java và rất nhiều nhà phát triển đang làm việc trên Java.

Các phương pháp hay nhất được đưa vào trong ngôn ngữ

Một điều mà bạn có thể không biết về Scala là nó được phát triển ban đầu tại trường đại học Thụy Sĩ EPFL nhằm với nỗ lực áp dụng các innovation ​​gần đây trong nghiên cứu ngôn ngữ lập trình.

Một số các phương pháp và cấu trúc tốt nhất được xây dựng vào trong Scala, ví dụ: val tuyên bố bất biến mức cao nhất, điều này sẽ tốt hơn nhiều so với việc từ khóa cuối cùng bị quá tải trong Java.

Nó cũng có case classes, giúp dễ dàng tạo ra các class không thay đổi (immutable) trong Scala.

Khả năng biểu cảm – Expressiveness

Khi bạn so sánh Scala với Java, Scala chắc chắn đạt điểm số tốt hơn.

Scala vốn rất biểu cảm. Ngoài ra, nó còn có hàng tấn code thực sự đẹp và hữu ích được viết bằng Scala. Điều này đang thu hút ngày càng nhiều nhà phát triển Java học Scala, những người vốn thích code đẹp.

Để cho bạn dễ hình dùng hơn, đây là chương trình đếm chữ được viết bằng cả Java và Scala, bạn có thể thấy sự khác biệt về tính biểu cảm của chúng.

Scala đã đạt được điều mà Java phải thực hiện tới hơn 10 dòng chỉ với 1 dòng code duy nhất.

Nhu cầu việc làm cao

Lập trình viên nào không muốn có việc là tốt? Một lý do để học một công nghệ hoặc framework mới luôn là để phát triển sự nghiệp.

Học Scala chắc chắn sẽ làm cho bạn dễ kiếm được công việc hơn. Ngày càng có nhiều công ty đang sử dụng hoặc chuyển sang Scala, bao gồm Twitter, LinkedIn, Foursquare và Quora.

Do Scala là ngôn ngữ có thể mở rộng, bạn có thể mong chờ một tương lai không xa khi giới tài chính và ngân hàng cũng sẽ bắt đầu bám lấy Scale làm giải pháp cho độ trễ trong app của họ.

Nếu mọi thứ đang đi đúng hướng thì Scala sẽ phát triển như là giải pháp thay thế chính cho Java.

Statically Typed

Nói chung, một ngôn ngữ statically typed như Java ngăn các lập trình viên phạm phải nhiều sai lầm, trong khi, với một ngôn ngữ động như Python, bạn chỉ biết về lỗi khi chạy chương trình.

Scala có được những điều tốt nhất của cả hai thế giới. Nó vô cùng năng động, nhưng lại rất kỉ luật. Scala compiler thực sự thông minh và sử dụng type-inference đến mức tối đa của nó.

Scala cung cấp type inference cho các variable và function, tốt hơn nhiều so với type inference bị giới hạn trong Java và C #.

Framework phát triển mạnh mẽ

Một điều bạn có thể biết về hệ sinh thái của Scala là nó đang phát triển nhanh chóng với rất nhiều thư viện và framework tốt.

Các công ty đã bắt đầu sử dụng Scala cũng góp phần vào sự phát triển gần đây của nó như một ngôn ngữ chính thống.

Có một số Scala web framework tốt trên mạng, bao gồm cả Lift và Play.

Akka, một Scala framework khác đã tự thiết lập bộ công cụ và thời gian chạy để xây dựng các ứng dụng với khả năng phân tán và chịu lỗi cao trên JVM.

Scala cũng được sử dụng trong Big Data cùng với Apache Spark, nhờ đó mà tiếp tục thúc đẩy sự chấp nhận từ nhiều nhà phát triển Java quan tâm đến Big Data.

Cộng đồng tích cực

Cùng với ngôn ngữ và các framework liên quan, cộng đồng Scala cũng đang phát triển. Rất nhiều lập trình viên, bao gồm cả các nhà phát triển Java, đang tham gia vào nhóm Scala.

Ngày càng có nhiều IDE đã bắt đầu hỗ trợ cú pháp Scala. Ngoài ra còn có hỗ trợ công cụ xây dựng tuyệt vời trong SBT, Maven và Ant.

Trong các cuộc khảo sát gần đây, Scala cũng được xem là giải pháp thay thế số một cho Java. Theo tôi, để phát triển Scala như là sự thay thế thực sự của Java, nó phải thu hút ngày càng nhiều nhà phát triển Java càng tốt. Đồng thời, việc các tổ chức lớn như Twitter áp dụng Scala chắc chắn sẽ giúp cộng đồng, vì họ có nhiều nguồn lực và ảnh hưởng hơn.

Cú pháp ngắn gọn

Java từ lâu đã bị chỉ trích vì cú pháp nặng nề và dài dòng. Mặc dù nó làm cho Java dễ đọc hơn, giống như tiếng Anh, Scala đã thiết lập một chuẩn mực mới với ngắn gọn và dễ đọc cùng một lúc. Scala compiler, được gọi là scalac làm được nhiều thứ hơn bạn mong đợi. Nó có thể tạo ra toString (), equals (), hasCode () và các thứ khác nữa. Hãy xem xét hai đoạn mã của cùng một class được viết bằng Java và Scala để giúp bạn lựa chọn:

public class Book {
    private final String name;
    private final double price;
    public Star(String name, double price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 23 * hash + Objects.hashCode(this.name);
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Test other = (Test) obj;
        if (!Objects.equals(this.name, other.name)) {
            return false;
        }
        if (Double.doubleToLongBits(this.price) != Double.doubleToLongBits(other.price)) {
            return false;
        }
        return true;
    }
    @Override
    public String toString() {
        return "Test{" + "name=" + name + ", price=" + price + '}';
    }
}

Bạn có thể viết cũng với yêu cầu như trên bằng Scala:

case class Book(name: String, price: double)

Nhân tiện, bạn cũng có thể sử dụng thư viện Lombok, một trong những thư viện cần thiết cho các nhà phát triển Java, để loại bỏ các code liên quan đến getters, setters, equals, hashCode và toString. Nó có thể tự động tạo ra những cái đó cho bạn.

Tương đối dễ học

Đối với một nhà phát triển Java, việc học một ngôn ngữ lập trình chức năng cổ điển như Haskell hoặc OCaml sẽ khá khó khăn hơn Scala. Nói cách khác, Scala tương đối dễ học vì chức năng OOP của nó.

Trong khi dành thời gian để học những function mới, các nhà phát triển Java vẫn có thể làm việc hiệu quả trong Scala bằng cách tận dụng kiến ​​thức hiện có của họ về OOP. Giống như Java, Scala có cú pháp rõ ràng, thư viện đẹp, tài liệu trực tuyến tốt và rất nhiều người trong ngành sử dụng nó.

Với một cộng đồng ngày càng phát triển của Scala trên các diễn đàn, không khó để tìm ra câu trả lời cho bất kỳ câu hỏi nào của Scala.

Topdev via dzone

DevOps trend – 8 dự đoán trong nhiều năm tới

DevOps đã trở thành một trọng tâm chính và đã định hình thế giới phần mềm trong vài năm qua. Các chuyên gia nói rằng DevOps sẽ là xu hướng chủ đạo và mức độ phổ biến của nó sẽ đạt đến đỉnh cao trong nhiều năm tới.

1. Trỗi dậy trong sự phát triển vượt bậc của AI, Data Science

Với sự trỗi dậy của AI, rất nhiều ứng dụng dựa trên AI ngày càng tăng từ đó khiến cho các team data science tìm kiếm những phương thức Devops để đẩy nhanh quá trình trainning, deploy, quản lý cũng như kiểm tra các model của họ. Với nhu cầu ứng dụng vào doanh nghiệp ngày càng tăng trong deployment và maintain ứng dụng AI & ML, Devops là thành phần không thể thiếu.

2. Infrastructure as a Service (IaaS)

Với các công ty chọn IaaS và dịch vụ dựa trên đám mây để tiết kiệm chi phí, tích hợp giữa các dịch vụ sẽ đóng vai trò lớn hơn vì phần lớn các nhiệm vụ quan trọng sau đó sẽ được xử lý thông qua phần mềm. Đây là nơi DevOps thực hiện các bước xử lý tích hợp giữa các dịch vụ, mang lại sự linh hoạt hơn. Sự kết hợp giữa quản lý cấu hình và công nghệ container sẽ đóng vai trò chính trong việc tự động hóa quản lý cơ sở hạ tầng.

Video thiết kế và triển khai hệ thống video 1 triệu CCU

3. Tập trung vào Functions-as-a-Service (FaaS)

Sự tập trung vào FaaS sẽ tăng lên trong năm 2019 khi nhiều chuyên gia công nghệ cảm thấy yên tâm khi sử dụng các container trong production. Và, các chuyên gia DevOps sẽ có một vai trò quan trọng ở đây trong việc xác định các trường hợp sử dụng liên quan đến FaaS và serverless trong môi trường của họ.

  Làm thế nào để tìm được những "nhân tài" DevOps phù hợp nhất?

4. Nhu cầu CI/CD ngày càng tăng

Việc tăng cường áp dụng kiến trúc đa đám mây sẽ tạo ra cách tiếp cận phân phối liên tục và sử dụng các công nghệ liên quan đến container (như Docker và Kubernetes) trên các doanh nghiệp lớn.

5. Bảo mật liền mạch trong chuỗi quy trình

Cho phép tích hợp bảo mật liền mạch (seamless security integration), thường được gọi là DevSecOps, ngay ở giai đoạn đầu phát triển ứng dụng, DevOps cho phép các nhóm phát triển tạo secure code với tốc độ nhanh hơn. Tích hợp ở các giai đoạn ban đầu cũng hỗ trợ rất tốt trong giai đoạn thử nghiệm trong quy trình làm việc của nhà phát triển trong suốt chu kỳ. Điều này sẽ tiết kiệm thời gian và sẽ hiệu quả hơn không giống như kiểm tra bảo mật ở cuối và tăng cơ hội cung cấp code không có lỗi.

6. Database Development

Các phiên bản framework hoặc ngôn ngữ lập trình luôn cập nhật đòi hỏi version của DB cũng phải tăng version để tương ứng. Vì vậy việc quản lý version DB tương tự như của bên code cũng là một việc cực kỳ quan trọng để tăng performance của phần mềm.

  DevOps – Giải pháp phát hành phần mềm nhanh chóng

7. Điều phối container

Điều phối container đang được xem là một phương tiện hiệu quả để xử lý các vấn đề phức tạp gắn liền với cơ sở hạ tầng. Do đó, các công cụ điều phối container như Docker, Hibernates, v.v … có khả năng là sự thay thế cho các công cụ quản lý cấu hình như Chef, Ansible, v.v. vào năm 2019.

8. Big data

Dữ liệu lớn luôn cần mở rộng hạ tầng để liên tục xử lý thông tin mà không bị đứt quãng. Devops có thể giúp tự động hóa các quy trình xử lý của Big Data.

Tham khảo việc làm IT lương cao trên TopDev

Vuex là gì? Ứng Dụng Của Vuex?

Vuex là gì?

Vì sao bạn lại cần Vuex trong cuộc đời của mình?

Được biết đến như một Framework tân tiến và ngày càng được đánh giá cao trong cộng đồng lập trình. Điều đặc biệt của VueJS chính là hệ thống component truyền dữ liệu trực tiếp giữa cha và con (người ta hay gọi là parent-children components. Tuy nó vẫn có những hạn chế nhất định như việc không thể đồng bộ dữ liệu các biến. Cụ thể: user, login, username.

Ngoài ra, đội ngũ kỹ thuật của team Facebook cũng đã cho ra mắt một kiến trúc mang tên Flux. Tại đây, luồng dữ liệu sẽ chỉ theo một chiều (one way data flow), khi có một dữ liệu mới, luồng này sẽ bắt đầu lại từ đầu.

Cũng chính vì vậy, Vuex được xây dựng dựa trên ý tưởng của Flux, Redux và kiến trúc Elm, tuy nhiên nó không được tích hợp trực tiếp vào trong lõi framework Vue.js mà được tách biệt thành một thư viện riêng.

Bạn đang cần tìm một biện pháp để giải quyết vấn đề xử lý và đồng bộ dữ liệu toàn cục? Redux không còn xa lạ gì đối với ai đã từng làm việc với React. VueJS cũng cần một phương pháp để quản lý dữ liệu và VueX sẽ giúp bạn điều đó.

Cùng tìm hiểu Vuex là gì nhé!

VueX được biết đến như một thư viện giúp bạn quản lý trạng thái các component trong VueJS, đây cũng là nơi lưu trữ tập trung cho tất cả các component trong một ứng dụng với nguyên tắc trạng thái chỉ có thể được thay đổi theo kiểu có thể dự đoán.

Vuex còn được xem như là một thư viện dùng để quản lý state cho các ứng dụng của Vue bằng cách sử dụng store tập trung hóa và toàn cục cho tất cả component trong một ứng dụng, mang lại những cập nhật nhanh tức thời khi tận dụng hệ thống các phản ứng.

Được xây dựng trên nền tảng không thể thay đổi trạng thái của mình từ bất kỳ component nào, Vuex store giúp đảm bảo rằng trạng thái chỉ có thể biến đổi theo cách có thể dự đoán được. Nhờ vào việc mỗi yếu tố dữ liệu chỉ được phép lưu một lần và chỉ được quyền đọc để tránh các component của ứng dụng sẽ làm hỏng các trạng thái truy xuất từ các component khác giúp cho store của bạn trở thành một nguồn đáng tin. State ở dây được hiểu là trạng thái của ứng dụng ví dụ như app sẽ có state là đã login hay chưa.

Vuex là gì?

Ứng Dụng Của Vuex?

Đầu tiên chúng ta sẽ nói về ứng dụng của Vuex, Vue mang đến rất nhiều lợi ích như dễ dùng lại code, đơn giản hóa ứng dụng, việc test cũng trở nên dễ dàng… bằng cách chia nhỏ state và quản lý trong từng component. Nhưng nếu gặp những trường hợp có 3,4… n component sử dụng cùng một state thì sẽ như thế nào?

Cách đơn giản nhất để giải quyết vấn đề này chính là mỗi component đều sử dụng event send state ra ngoài để các component khác sự dụng và tự trigger khi state này thay đổi. Bạn cũng có thể tạo ra một component cha như một nơi để trung chuyển state. Hai cách này đều khiến workflow trở nên phức tạp và khó kiểm soát hơn rất nhiều ví dụ như việc debug vô cùng khó khăn.

Cài đặt

Ta cần dùng npm để cài đặt vuex

npm install vuex --save

Import thư viện Vuex và thông báo việc sử dụng thư viện cho VueJS bằng hàm Vue.use()

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

Cấu Trúc Của Vuex

Đối với Vuex, store chính là nơi quản lý tập trung state của các ứng dụng bao gồm 5 phần chính: State, Getters, Mutation, Actions, Modules

State (trạng thái)

State chính là nơi “tình yêu bắt đầu”

Vì sao Vuex có thể giúp bạn dễ dàng hơn trong việc xác định các trạng thái và tạo ra các snapshot trạng thái một cách đơn giản? Chính là vì nó chỉ sử dụng một cây trạng thái duy nhất để chứa tất cả các trạng thái của ứng dụng.

const state = {
  numbers: [1, 2, 3, 4, 5]
}

Getters (lọc trạng thái)

Điều mang đến sự khác biệt giữa Vuex và Redux chính là việc ta có thể điều chỉnh dữ liệu trước khi trả về state. Đôi khi chúng ta cần lấy các trạng thái dựa vào việc tính toán, lọc bỏ các trạng thái được cung cấp bởi kho lưu trữ, ví dụ:

const state = {
  getEvenNumbers: state => {
    return state.numbers.filter(item => item%2 === 0)
  }
  hasNumber : state => num => {
    return state.numbers.include(num)
  }
}

Nếu muốn sử dụng trong component thì bạn có thể gọi trực tiếp this.$store.getters.getEvenNumbers hoặc sử dụng mapGetter

Mutations (thay đổi trạng thái)

Điểm mạnh của store chính là nơi compoment chỉ có thể đọc dữ liệu mà không được phép thay đổi trạng thái một cách trực tiếp. Nếu muốn thay đổi trạng thái thì Mutations là nơi duy nhất đảm nhiệm chức năng này bằng cách thay đổi thông qua commit. Dù không khuyến khích nhằm đảm bảo tính Flow chuẩn tuy nhiên tại compoment, bạn vẫn có thể thực hiện được commit đến mutations.

Điểm cần lưu ý chính là mutations là synchronous nhằm kiểm soát được action đã thay đổi state hay thứ tự thay đổi như thế nào

const mutations = {
  add(state, num){
    return state.numbers.push(num)
  }
  remove(state, num) {
    return state.numbers.include(num)
  }
}

Actions (Hành động)

Action cũng tương tự như mutation, tuy nhiên có một vài điểm khác biệt. Thay vì thay đổi trạng thái thì các action commit thay đổi, nó có thể chứa các hoạt động không đồng bộ.

Đây chính là nơi thể hiện bussiness logic, được gọi là API, save vào database, thực hiện các commit (gọi mutation) để thay đổi state…

VD: Thêm một số, nếu số đó đã tồn tại trong state thì xoá rồi thêm lại.

const actions = {
  updateNum({commit, state}, num){
    if (state.includes(num)) {
      commit('remove', num)
    }
    commit('add', num)
  }

  foo ({dispatch}, num) {
    dispatch('updateNum', num)
  }
}

Modules

Vuex chỉ sử dụng duy nhất một cây trạng thái, tất cả các trạng thái của ứng dụng sẽ được đưa vào một đối tượng. Điều này cũng có nghĩa là khi ứng dụng của bạn ngày càng phát triển thì store sẽ to lên rất nhiều. Vì thế Vuex cho phép việc chia nhỏ store thành các module nhỏ hơn, các module này cũng có state, mutation, action, getter và thậm chí còn cho phép các module lồng nhau.

Bạn cần lưu ý điều gì khi sử dụng Vuex

Điều quan trọng nhất khi bạn sử dụng Vuex đó chính là xác định cái nào là state sẽ lưu trữ trong store, cái nào chỉ là local state nằm trong component. Bạn hoàn toàn có thể đưa tất cả vào trong store, tuy nhiên đến khi quy mô của ứng dụng càng lớn kéo theo store cũng sẽ to ra dẫn đến việc khó khăn trong việc quản lý state.

Kết luận

Vậy là chúng ta đã biết Vuex là gì? tìm hiểu sơ về các khái niệm cơ bản trong Vuex, đối với những ai mới đặt chân lên vùng đất Vuex sẽ khó nắm được ngay các vấn đề của công nghệ. Có thể nói Vuex chính là một giải pháp tối ưu dành cho bạn nếu như bạn đang gặp những vấn đề trong việc đồng bộ, hiển thị và update dữ liệu, data được sử dụng bởi nhiều component, khi sử dụng vuejs. Đa số cá sản phẩm vuejs lớn đều cần sử dụng vuex cho việc quản lý và xử lý thay đổi trạng thái hiệu quả nhất.

Topdev via Minh Nhật

Những bài viết liên quan 

  Vue.js: Những điểm tốt, điểm xấu và điểm "tạm chấp nhận được"

  Vue.js vs jQuery: So sánh qua 1 số ví dụ

  3 phút làm quen với Vue.js

Một số mẹo để bắt đầu với Machine Learning

Thực sự cần thiết để bắt đầu việc học về machine learning càng sớm càng tốt nếu bạn muốn không bị tụt hậu.

AI và Machine Learning đã trở thành một trong những giải pháp có tác động mạnh mẽ đến các doanh nghiệp nhất hiện nay và chúng vẫn là một phần quan trọng trong chiến lược phát triển của các công ty công nghệ trong thời gian tới.

Cần phải hiểu rằng việc sử dụng Machine Mearning ( ML) để phát triển sản phẩm dần trở nên cần thiết – và nếu một công ty muốn đạt được mục tiêu của mình, họ sẽ tụt hậu so với các đối thủ cạnh tranh trong thập kỷ tới nếu họ không có ML. Vì vậy, cần bắt đầu tìm hiểu về ML càng sớm càng tốt. Nếu bạn sẵn sàng đạt được mục tiêu này, đây là một số mẹo để bắt đầu.

Tìm việc làm lập trình cho it machine learning

Tạo ra liên kết giữa ML Operations và Data Science

Có nhiều công ty hiểu về ML và data science, nhưng họ không biết làm thế nào để thực hiện. Việc tập trung vào cả hai và giữ chúng riêng biệt là không cần thiết. Bạn có thể đưa data science và các hoạt động ML

Sẵn sàng cho các thử nghiệm mới

Vì đây là nỗ lực đầu tiên để ứng dụng ML vào hoạt động công ty, nên thử những thử nghiệm mới trong các lĩnh vực kinh doanh khác nhau, để học hỏi thêm những điều mới. Ngay khi bắt đầu chiến dịch, nếu bạn đang mong đợi thu được lợi nhuận ngay thì có lẽ bạn sẽ từ bỏ việc tìm hiểu ML ngay từ khi bắt đầu.

Quản lý hiệu quả Data Servers 

Dữ liệu của bạn như là một mặt hàng có giá trị sẽ giúp bạn đảm bảo rằng bạn không đưa ra quyết định vội vàng. Data Servers sẽ giúp thúc đẩy hiệu quả của ML, nhưng bạn cần phải quản lý và bảo vệ dữ liệu được cung cấp. Nhiệm vụ này không dễ dàng như tìm kiếm một lựa chọn lý tưởng để chuyển đổi YouTube sang MP3 – nó phức tạp hơn rất nhiều. Bạn cần phải cẩn trọng với quá trình này.

Không vội vàng để giải quyết toàn bộ vấn đề cùng một lúc

Xây dựng một giải pháp theo thời gian là rất quan trọng, và vì thế, bạn cần có đầy đủ dữ liệu ở từng giai đoạn. Vì vậy, bạn không nên vội vàng để giải quyết toàn bộ vấn đề cùng một lúc. Bắt đầu bằng việc giải quyết phần nhỏ của vấn đề và đảm bảo rằng bạn thực hiện đầy đủ quy trình giải quyết vấn đề.

Để team của bạn biết tầm quan trọng của ML và AI

Thúc đẩy ML và trí tuệ nhân tạo là rất quan trọng, và bạn cần phải bắt đầu bằng cách chỉ cho CEO và đảm bảo rằng chiến lược của họ về ML / AI được cải thiện theo thời gian. Hãy nhớ rằng một hoạt động ML thành công sẽ là chìa khóa cho tương lai thành công và nếu CEO không quan tâm đến ML và AI thì hãy cảnh báo với họ rằng sẽ không có nhiều thay đổi tích cực lớn đến công ty trong thời gian tới.

Topdev via Dzone

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

  Top 10 thuật toán machine learning dành cho newbie
  Áp dụng Machine learning, xây dựng ứng dụng chatbot của riêng bạn
  Machine Learning góp phần cải thiện chiến lược Digital Marketing của bạn như thế nào?

Inside The Mind Of A Product Manager | Experimentation – Driven Product Development

Inside The Mind Of A Product Manager

GÓC NHÌN TỪ VỊ TRÍ CỦA MỘT PRODUCT MANAGER THỰC THỤ

Bạn có biết, hơn 70% các dự án thất bại vì không hiểu người dùng và không truyền tải đúng thông điệp đến đối tượng mục tiêu. “Get it right the first time” thật khó với một chuỗi các hoạt động chủ quan, chứng tỏ một điều rằng sự feedback của khách hàng sẽ là nguyên liệu vô cùng then chốt, ngay cả những sản phẩm được nghiên cứu kỹ lưỡng cũng có thể bị ảnh hưởng do khoảng cách giữa những gì khách hàng nghĩ họ muốn và những gì họ làm. Chính vì thế việc thử nghiệm trong phát triển sản phẩm (Experimentation in Product Development) là bước bắt buộc đối với một tổ chức lấy khách hàng làm trung tâm, một chiến lược phát triển.

Được ví như là một “nhạc trưởng” thực thụ với cái nhìn và tư duy sâu sắc giao thoa giữa 3 trường phái Tech, Business và UX/UI đồng thời cũng là một end-user trung thành, Product Manager (PM) lại là người đặt nhiều tâm tư liệu rằng sản phẩm có mang đến trải nghiệm hoàn hảo nhất cho người dùng? Vậy góc nhìn của một PM sẽ bao quát đến đâu? Bạn có tò mò?

Trong thời đại “có dữ liệu là có tất cả” thì việc sử dụng dữ liệu khách hàng một cách thông minh để nâng cao trải nghiệm người dùng là điều thiết yếu, không chỉ gói gọn trong tiêu chí tốt hoặc xấu, giờ đây sản phẩm được xem là có phù hợp với người dùng hay không mới là điều quan trọng.

Chung quy lại, một hệ thống phát triển sản phẩm phụ thuộc vào nhiều yếu tố, trong đó việc thử nghiệm để tìm ra những yếu tố quyết định sẽ là việc mà mỗi PM phải cân nhắc. Cùng tìm ra câu trả lời cùng các chuyên gia tại sự kiện “INSIDE THE MIND OF A PRODUCT MANAGER | EXPERIMENTATION – DRIVEN PRODUCT DEVELOPMENT” với nhiều case study và kinh nghiệm thực chiến nhé.

Tham khảo tuyển dụng product manager lương cao trên TopDev

THÔNG TIN DIỄN GIẢ

  • Anh VŨ MINH TRÍ hiện là Vice President của VNG & CEO của VINADATA và cũng là người từng giúp Microsoft Vietnam tăng trưởng 300% trong 5 năm. Hơn thế nữa, với 13 năm kinh nghiệm đảm nhận vị trí CEO tại các tập đoàn công nghệ hàng đầu Việt Nam, anh Minh Trí còn giúp Sony Ericsson Việt Nam, Yahoo Việt Nam, Qualcomm Đông Dương và Thái Lan tạo nên những bước ngoặt đáng kể về doanh thu và phát triển đội ngũ con người
  • Anh LÊ ANH QUANG (Quang Phowr) – diễn giả đa tài và nắm giữ nhiều vị trí trong các công ty tại Việt Nam hiện nay như Head of UX/UI của Be Group JSC, Product Director của Websosanh.vn, Design Lead tại Chainfund đồng thời là Founder của Eggcellent Design. Anh sẽ mang đến cho chúng ta Font testing at BE app. Thiêng về product design thuần tuý, dựa trên kinh nghiệm, survey & thử nghiệm để thiết kế ra ứng dụng đăt xe BE – case studies font chữ cho sản phẩm BE (moblie app)
  • Anh TRỊNH XUÂN TUÂN – Founder & CEO | NextSmarty. Anh là Thạc sĩ tốt nghiệp tại trường Uppsala University (Thụy Điển), từng giữ nhiều vị trí như: R&D Engineer tại VEGA, Technical Leader của FPT Software, Consultant của SalesBox, Deep Learning Engineer của Vufind (DBA DeepVu). Lần này anh sẽ chia sẻ cho chúng ta về apply kỹ thuật & phân tích data chuyên sâu vào việc phát triển product.
  • Anh LÊ THIẾT BẢO – Omni Channel Senior Director | Nguyen Kim Trading JSC. Anh đến Fedex Express trong vai trò Giám đốc kỹ thuật vùng Đông Dương, 9 năm làm việc tại Singapore, Lê Thiết Bảo đã gây dựng những trang thương mại điện tử đầu tiên cho Việt Nam như Siêu chợ Sendo.vn, dienmayxanh.com, Deca.vn… Sau 1 năm 8 tháng làm việc tại Nguyễn Kim, thương hiệu này đã đạt được nhiều thành tích đáng kể như Best online of Central Group Worldwide 2017 (công ty đầu tiên đạt hơn 1 triệu USD về doanh số tuần). Anh sẽ chia sẻ về những vấn đề xây dựng, tối ưu product phục vụ sản phẩm ecommerce phức tạp, bao hàm nhiều công tác vận hành, dịch vụ CSKH…
  • Đặc biệt với sự xuất hiện của anh NGUYỄN HỮU BÌNH – CEO của TopDev với vai trò là Moderator trong phần Panel Discussion cuối chương trình, tại đây các diễn giả sẽ cùng bàn luận về quá trình thử nghiệm và tìm ra những yếu tố quyết định mà PM nào cũng nên cân nhắc.

Nhanh tay đăng ký tham dự sự kiện “INSIDE THE MIND OF A PRODUCT MANAGER | EXPERIMENTATION – DRIVEN PRODUCT DEVELOPMENT” vào ngày 23/02 tại TPHCM bạn nhé!

  Bí kíp để trở thành một Product Manager giỏi
  Tui muốn làm Product Manager (PM)! Biết PM là gì chưa mà đòi?

Front end Optimization – 9 tips để cải thiện Web Performance

front-end-optimization-9-tips-de-cai-thien-web-performance

Trong thế giới kĩ thuật số hiện nay, có hàng triệu lí do để truy cập web mỗi ngày. Tuy nhiên, không phải website nào cũng dễ sử dụng và load nhanh chóng. Các website chưa được tối ưu hóa thường gặp phải các vấn đề như thời gian tải chậm, chưa có phiên bản mobile hoặc trình duyệt không tương thích, v.v…

Bài viết này sẽ hướng dẫn cải thiện front end, bạn có thể tăng đáng kể tốc độ và hiệu suất tổng thể trang web của bạn bằng cách tập trung vào mã sạch (clean code), nén hình ảnh, giảm thiểu các external request, triển khai một CDN và một vài phương pháp khác.

1. Dọn sạch HTML document

HTML hay Hyper Text Markup Language là xương sống của hầu hết mọi website. HTML cho phép định dạng trang web với heading, subheadings, danh sách và những tính năng sắp xếp chữ hữu ích khác. Bạn còn có thể tạo ra nhiều graphic thu hút với phiên bản HTML5 mới nhất.

HTML có thể dễ dàng được đọc bởi web crawlers, vì vậy các công cụ tìm kiếm có thể được update các nội dung trang web của bạn kịp thời. Khi làm việc với HTML, bạn nên cố gắng viết theo cách vừa ngắn gọn vừa hiệu quả. Thêm vào đó, khi tham khảo các nguồn khác với HTML document thì sẽ có một vài kiến thức thực tế thật sự hữu ích bạn nên làm theo.

Vị trí CSS thích hợp

Các web design thường tạo các CSS stylesheet sao khi tạo xong sườn của HTML chính. Như vậy, các nhân tố CSS thường được đặt phía cuối tài liệu. Tuy nhiên, chúng ta nên đặt CSS ở phía trên đầu của HTML document để đảm bảo tiến độ render.

<head>
<link href='https://yourwebsite.com/css/style.css' rel='stylesheet' type='text/css'>
</head>

Chiến lược này có thể sẽ không cải thiện tốc độ tải trang, nhưng nó có thể giữ người xem trang web của bạn tránh phải xem một màn hình trắng hoặc một bản text chưa được chỉnh style. Điều đó giúp người vào xem trang của bạn có thể sẽ chấp nhận đợi để load page. Do thế cải thiện front end optimization của bạn.

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

Vị trí Javascript thích hợp

Mặt khác, nếu bạn đặt các thuộc tính Javascript trên head tag hoặc gần đầu của tài liệu HTML, bạn sẽ khóa quy trình loading của các thành phần HTML và CSS. Điều này có thể sẽ khiến nhiều người truy cập vào trang của bạn phải đợi trên 1 trang trống và do vậy sẽ mất kiên nhẫn mà từ bỏ trang web của bạn. Bạn có thể tránh vấn đề này bằng cách đặt các thuộc tính Javascript ở phía dưới HTML.

Thêm vào đó, khi sử dụng Javascript, bạn nên tải async script hơn. Điều này sẽ ngăn bất kỳ <script> tag khỏi quy trình render HTML vd trong trường hợp nó vô tình lướt qua giữa văn bản (?)
Trong khi HTML là một trong những công cụ giá trị nhất với các web designer thường được sử dụng với CSS và các thuộc tính Javascript có thể làm chậm trang web của bạn. CSS và các thuộc tính Javascript có thể chuyển đổi trang web của bạn tốt hơn nhưng bạn nên sử dụng một cách hợp lí và có sự quan tâm đặc biệt. Một ví dụ thực tế với CSS và Javascript là tránh nhúng code. Khi bạn nhúng code, bạn đặt CSS vào 1 style tag, và sử dụng Javascrpit trong một script tag. Điều này gây nên gia tăng số lượng HTML code phải load mỗi lần bạn refresh page

Kết hợp các file? Đừng lo

Trong quá khứ có thể bạn sẽ phải thường xuyên kết hợp các script CSS đã sử dụng sang 1 single file (file riêng) để có thể dễ dàng tham khảo 1 file trong các HTML code thay vì nhiều file. Đây sẽ là một việc làm hợp lí khi sử dụng HTTP1.1 protocol, tuy nhiên, điều này không còn cần thiết nữa.
Nhờ vào HTTP/2, bây giờ bạn đã có thể sử dụng multiplexing để gửi và nhận các HTTP request và response không đồng bộ thông qua một kết nối TCP đơn lẻ.

Điều này nghĩa là bạn sẽ không bao giờ phải kết hợp các script vào một single file nữa.

2. Tối ưu hóa CSS Performance

CSS hay cascading style sheet được sử dụng để chuyển đổi các nội dung có nguồn gốc HTML sang 1 document sạch và chuyên nghiệp. Nhiều tùy chọn CSS yêu cầu các HTTP request (trừ khi sử dụng inline CSS), vì vậy bạn nên cố gắng giảm thiểu các CSS cồng kềnh mà không loại bỏ các tính năng quan trọng

Nếu banner, plugin, và layout của bạn được đặt trọng 1 file CSS riêng, điều này sẽ bắt người truy cập trang của bạn phải load vô số file 1 lúc. Việc này cũng khiến load trang lâu hơn nếu những files này được load từ nguồn bên ngoài, mặc dù bây giờ đã có ít vấn đề xảy ra hơn nhờ vào HTTP/2.

Thêm vào đó, bất kỳ quản trị viên trang web nào sử dụng import directive để gom các stylesheets bên ngoài trên 1 trang web là một phương pháp lỗi thời và nó cản trở việc download song song. Link tag là option tốt nhất của bạn và cũng sẽ cải thiện front end performance của trang web. Hơn thế nữa, các stylesheet bên ngoài được yêu cầu với link tag cũng không chặn các download song song.

3. Cắt giảm các yêu cầu HTTP bên ngoài

Nhiều trường hợp, một lượng lớn thời gian load website đến từ external HTTP requests. Tốc độ load các external resource phụ thuộc rất nhiều vào cơ sở hạ tầng của nhà cung cấp server, địa chỉ, v.v… Mục tiêu đầu tiên khi giảm các external HTTP requests nên là giám định website của bạn với quan điểm tối giản. Hãy nghiên cứu mọi thành phần trong trang web của bạn và loại bỏ bất cứ tính năng nào làm ảnh hưởng đến trải nghiệm người dùng. Các tính năng này có thể là:

  • Các hình ảnh không cần thiết
  • Javascript không cần thiết
  • CSS quá mức
  • Plugin không cần thiết

Sau khi loại bỏ các yếu tố gây loãng, phải tìm cách để làm lượng content còn lại trở nên ngăn nắp, gọn gàng hơn. Các công cụ nén, dịch vụ CDN và tìm nạp trước (Prefectching) sẽ được giải thích bên dưới là lựa chọn tốt nhất để quản lí các yêu cầu HTTP. Thêm vào đó, nên xem qua hướng dẫn về cách giảm tìm kiếm DNS đi cùng với việc giảm external HTTP requests.

4. Tối giản CSS, JS và HTML

Kết quả hình ảnh cho Minification

Kĩ năng tối giản có thể giúp bạn loại bỏ các đặc tính không cần thiết trong file. Khi bạn viết code, bạn thường thụt đầu dòng và viết note – điều này sẽ khiến code của bạn sạch và dễ đọc nhưng cũng vô tình add thêm dung lượng vào file code của bạn.

Ví dụ, đây là đoạn code trước khi áp dụng phương pháp tối giản.

.entry-content p {
font-size: 14px !important;
}
 
.entry-content ul li {
font-size: 14px !important;
}
 
.product_item p a {
 color: #000;
 padding: 10px 0px 0px 0;
 margin-bottom: 5px;
 border-bottom: none;
}

và đây cũng là đoạn code đó sau khi áp dụng phương pháp tối giản

.entry-content p,.entry-content ul li{font-size:14px!important}.product_item p a{col
or:#000;padding:10px 0 0;margin-bottom:5px;border-bottom:none

Bạn có thể dễ dàng giảm dung lượng trong các file CSS, JS và HTML bằng cách sử dụng các công cụ tối giản.

5. Bật tính năng tìm nạp trước (Prefetching) 

Kết quả hình ảnh cho Hệ thống phân giải tên miền

Tính năng tìm nạp trước có thể cải thiện trải nghiệm duyệt web của người truy cập bằng cách nạp trước các nguồn và dữ liệu cần thiết trước khi họ cần. Có 3 loại chính của tính năng tìm nạo trước:
  • Nạp trước Link
  • Nạp trước DNS
  • Prerendering

Với tính năng tìm nạp trước, URL, CSS, hình ảnh, và JS được tổng hợp cho mỗi link thậm chí trước khi bạn rời khỏi trang web hiện tại. Điều này sẽ đảm bảo người truy cập trang có thể sử dụng link để định vị giữa các trang với thời gian load trang nhỏ nhất.

May mắn tính năng tìm nạp trước không khó để kích hoạt. Điều này phụ thuộc vào việc bạn muốn kích hoạt loại tìm nạp trước nào, bạn có thể dễ dàng add các tag  rel="prefetch"rel="dns-prefetch", hoặc rel="prerender" tag vào các thuộc tính trong trang web của bạn.

6. Tăng tốc độ với một CDN và Caching

Bạn hoàn toàn có thể cải thiện tốc độ và hiệu suất website bằng cách sử dụng một hệ thống chuyển giao content. Khi bạn sử dụng một CDN, bạn liên kết các nội dung tĩnh đến một hệ thống mở rộng của server toàn thế gới. Điều này đặc biệt quan trọng nếu trang web của bạn hướng tới lượng khán giả ở toàn thế giới. CDN cho phép người truy cập website của bạn load data từ server gần nhất. Nếu bạn sử dụng một CDN, các file sẽ tự động nén để chuyển giao nhanh hơn trong phạm vi toàn cầu.

Kết quả hình ảnh cho content delivery network caching

CDN là một trong những phương pháp của caching có thể giúp bạn cải thiện đáng kể thời gian chuyển giao tài sản, tuy nhiên cũng có nhiều phương pháp caching khác bạn có thể thực hiện – một trong số đó là nâng cấp cache của trình duyệt

Set up cache của trình duyệt cho phép trình duyệt chứa nhiều file trong cache của nó để chuyển giao nhanh hơn. Việc thực hiện phương pháp này có thể hoàn thành trực tiếp trong file cấu hình server gốc.

7. Nén files

Kết quả hình ảnh cho gzip

Trong khi nhiều dịch vụ CDN sẽ tự động nén file cho bạn, nếu không sử dụng CDN, bạn nên xem xét đến việc nén file bằng phương pháp khác trong server nguồn để optimiaztion front end. Nén file sẽ khiến content của website gọn nhẹ và dễ dàng quản lí hơn. Một trong những phương pháp phổ biến nhất là Gzip. Đây là một trong những phương pháp xuất sắc để co tài liệu, file audio, ảnh PNG và một số file cồng kềnh khác chưa được nén

Brotli là một thuật toán nén file còn khá mới, tuy nhiên càng ngày nó càng trở nên phổ biến. Thuật toán nguồn mở này thường được update bởi các software engineer từ Google và các tổ chức khác. Nó đã tự chứng minh khả năng nén file tốt hơn nhiều so với các phương pháp hiện có. Mặc dù nó còn nhiều hạn chế nhưng chắc chắn sẽ trở thành thuật toán nén mặc định.

8. Tối ưu hóa hình ảnh

Cho những người không quen với front end optimization, hình ảnh có thể là website killer, Các album ảnh lớn và các hình ảnh có độ phân giải cao có thể gây phiền toái cho quá trình render. Những hình ảnh có độ nét cao chưa được optimize có thể nặng tới vài megabytes. Do vậy, việc optimize những file này sẽ cho phép bạn cải thiện hiệu suất front end của trang web.

Mỗi hình ảnh chứa cả tá thông tin không thật sự liên quan tới hình ảnh. Với những tấm hình JPEG, file hình chứa cả ngày tháng, địa điểm, thông số kĩ thuật và một số thông tin không liên quan khác. Bạn có thể sắp xếp độ dài quá trình load file bằng cách xóa các thông tin hình ảnh không cần thiết với các tool optimize như Optimus. Optimus sử dụng tính năng nén thông minh bằng cách sử dụng các hình ảnh PNG nén.

Kết quả hình ảnh cho jpeg before and after compression

Mặt khác, Optimus sử dụng các tính năng nén nhẹ cho các file JPEG. Mặc dù nén bảo toàn loại bỏ các thông tin thêm của hình ảnh, Optimus được cài đặt để nén ở mức độ mà người sử dụng sẽ không thấy hình ảnh bị giảm chất lượng. Điều này cho phép người sử dụng tiết kiệm lượng lớn dung lượng trong khi vẫn giữ nguyên chất lượng hình ảnh cao.

Kết quả hình ảnh cho jpeg before and after compression

9. Sử dụng một frameworks tối giản

Trừ khi bạn xây dựng trang web chỉ với kiến thức code của mình, bạn có thể tránh nhiều lỗi front end optimization bằng cách sử dụng 1 frontend framework tốt. Mặc dù có một số framework nổi tiếng hơn, lớn hơn với nhiều tính năng và lựa chọn thêm nhưng có thể web của bạn không cần thiết.

Đó là lí do tại sao cần phải xác định các tính năng mà website của bạn cần và bắt đầu với 1 framework cung cấp đầy đủ các tính năng đó trong khi vẫn nhẹ kí. Một số frameworks gần đây sử dụng các đoạn code HTML, CSS, và JS khá ngắn gọn

Đây là một trong vài framework tối giản khiến trang web load nhanh:

  • Pure
  • Skeleton
  • Miligram

Một framework không thay thế hoàn toàn việc design web, lập trình và duy trì. Nói đơn giản, hãy tưởng tượng framework là một căn nhà mới. Căn nhà này sạch sẽ và khang trang nhưng nó cũng khá trống trải, khi bạn mua thêm nội thất, vật gia dụng và trang trí, trách nhiệm của bạn là phải đảm bảo căn nhà không trở nên lộn xộn. Trong khi đó, bạn cũng phải đảm bảo framework không bị phá hoại bởi các đoạn code thừa, hình ảnh lớn và các HTTP request quá mức

Tổng Kết

Frontend optimize được coi giống như intimidating endeavor, nhưng bạn có thể cải thiện tốc độ load website bằng cách áp dụng nguyên lí của hướng dẫn này. Hãy nhớ rằng, website load càng nhanh thì trải nghiệm người dùng sẽ càng cao. Vì vậy, lợi ích của bạn và người truy cập trang là như nhau.

Có thể bạn quan tâm

  Roadmap Frontend Developer - "Con đường tắt" để trở thành cao thủ Frontend Developer
  Tương lai của JavaScript ra sao trong thế giới Front-End?
  Tất tần tật các Frontend cheatsheets tốt nhất

Topdev Via keycdn

Xem thêm các việc làm it mới nhất trong tháng

Top 10 thuật toán machine learning dành cho newbie

Top 10 thuật toán machine learning dành cho newbie

Trong machine learning, có một thứ gọi là định luật ” No Free Lunch “. Nói một cách ngắn gọn, điều đó cho rằng không có một thuật toán nào là tốt nhất trong mọi vấn đề và nó đặc biệt phù hợp với supervised learning – việc học dưới sự giám sát ( ví dụ là predictive modeling – mô hình tiên đoán).

Ví dụ, bạn không thể nói rằng các kết nối nơ-ron luôn tốt hơn cây quyết định – decision trees (hay ngược lại). Có rất nhiều yếu tố ảnh hưởng chẳng hạn như kích thước và cấu trúc của bộ dữ liệu.

Do đó, bạn nên thử nhiều thuật toán khác nhau cho vấn đề của bạn, trong khi sử dụng một “ tập kiểm tra ” còn lại để đánh giá hiệu suất và chọn ra giải pháp tối ưu nhất.

Tất nhiên, các thuật toán bạn thử phải phù hợp với vấn đề của bạn, đó là việc bạn chọn đúng công việc cho machine learning. Tương tự, nếu bạn cần dọn dẹp nhà cửa, bạn có thể sử dụng máy hút bụi, một cây chổi hoặc một cái giẻ lau, nhưng bạn sẽ không sử dụng một cái xẻng và đào.

The Big Principle

Tuy nhiên, có một nguyên tắc chung là cơ sở cho mọi thuật toán machine learning được giám sát cho mô hình tiên đoán.

Các thuật toán machine learning được mô tả như việc học một target function (f) để biến bản đồ đầu vào (X) thành biến xuất (Y): Y = f (X)

Đây là một nhiệm vụ học tập tổng quát mà chúng ta muốn đưa ra những tiên đoán trong tương lai (Y) với các ví dụ mới về các biến đầu vào (X). Chúng ta không biết chức năng (f) trông như thế nào hoặc dạng của nó. Nếu chúng ta làm như vậy, chúng ta sẽ sử dụng nó trực tiếp và không cần phải học nó từ dữ liệu bằng cách sử dụng các thuật toán machine learning.

Phương thức phổ biến nhất của machine learning là học cách lập bản đồ Y = f (X) để đưa ra dự đoán của Y cho biến X mới. Điều này được gọi là mô hình tiên đoán hoặc phân tích tiên đoán và mục tiêu của chúng ta là làm cho các dự đoán chính xác nhất có thể được.

Đối với những người mới học về machine learning muốn hiểu được cơ bản của nó, đây sẽ là một chuyến khám phá nhanh về 10 thuật toán machine learning hàng đầu được các nhà khoa học dữ liệu sử dụng.

1. Linear Regression – Hồi quy tuyến tính

Hồi quy tuyến tính có lẽ là một trong những thuật toán nổi tiếng nhất và được hiểu rõ nhất trong thống kê và machine learning.

Mô hình tiên đoán chủ yếu quan tâm đến việc giảm thiểu sai sót của mô hình hoặc đưa ra các dự đoán chính xác nhất có thể, với một chi phí giải trình. Chúng tôi sẽ mượn, sử dụng lại và lấy các thuật toán từ nhiều lĩnh vực khác nhau, bao gồm số liệu thống kê và sử dụng chúng cho những mục đích này.

Biểu diễn hồi quy tuyến tính là một phương trình mô tả một đường thẳng mô tả phù hợp nhất mối quan hệ giữa các biến đầu vào (x) và các biến đầu ra (y), bằng cách tìm các trọng số cụ thể cho các biến đầu vào được gọi là các hệ số (B).

Top 10 thuật toán machine learning dành cho newbie

Ví dụ: y = B0 + B1 * x

Chúng ta sẽ dự đoán y với biến x cho trước và mục tiêu của thuật toán hồi quy tuyến tính là tìm các giá trị cho các hệ số B0 và B1.

Các kĩ thuật khác nhau có thể được sử dụng để tìm mô hình hồi quy tuyến tính từ dữ liệu, chẳng hạn như một giải pháp đại số tuyến tính cho Ordinary least square và việc tối ưu hóa Gradient descent.

Hồi quy tuyến tính đã được phát minh khoảng hơn 200 năm và đã được nghiên cứu rộng rãi. Một số quy tắc tốt khi sử dụng kĩ thuật này là loại bỏ các biến tương tự nhau (correlated) và để loại bỏ bớt yếu tố sao lãng từ dữ liệu của bạn, nếu có thể. Đây là một kĩ thuật đơn giản và nhanh chóng, và là thuật toán tốt đầu tiên để thử.

2. Logistic Regression – Hồi quy logistic

Hồi quy logistic là một thuật toán khác được mượn bởi machine learning từ lĩnh vực thống kê. Đây là phương thức tốt nhất cho các vấn đề phân loại nhị phân (vấn đề với hai lớp giá trị).

Hồi quy logistic giống như hồi quy tuyến tính với mục đích là để tìm ra các giá trị cho các hệ số mà trọng lượng mỗi biến đầu vào. Không giống như hồi quy tuyến tính, dự đoán đầu ra được chuyển đổi bằng cách sử dụng một hàm không tuyến tính được gọi là hàm logistic.

Hàm logistic trông giống như một S lớn và sẽ biến đổi bất kỳ giá trị nào thành 0-1. Điều này rất hữu ích bởi vì chúng ta có thể áp dụng một quy tắc cho đầu ra của hàm logistic để tăng giá trị cho 0 và 1 (ví dụ IF ít hơn 0.5 sau đó đầu ra 1) và dự đoán một lớp giá trị.

Top 10 thuật toán machine learning dành cho newbie

Vì cách mô hình được học, các dự đoán thực hiện bởi hồi quy logistic cũng có thể được sử dụng như là xác suất của một ví dụ dữ liệu nhất định thuộc lớp 0 hoặc lớp 1. Điều này có thể hữu ích cho các vấn đề khi bạn cần đưa ra nhiều lý do cho một dự đoán.

Giống như hồi quy tuyến tính, hồi quy logistic hoạt động tốt hơn khi bạn loại bỏ các thuộc tính không liên quan đến biến đầu ra cũng như các thuộc tính tương tự nhau (correlated). Đó là một mô hình có thể học hỏi nhanh và có hiệu quả với các vấn đề phân loại nhị phân.

Tham khảo thêm các bài viết về Machine learning:

  Chia sẻ cơ bản sử dụng machine learning để giải quyết bài toán.
  Hiểu sâu về trí tuệ nhân tạo & Machine Learning tại Apple

3. Linear Discriminant Analysis – Phân tích phân loại tuyến tính

Hồi quy Logistic là một thuật toán phân loại truyền thống giới hạn vào các vấn đề phân loại hai lớp. Nếu bạn có nhiều hơn hai lớp thì thuật toán phân tích phân loại tuyến tính nên được ưu tiên.

Sự biểu hiện của LDA khá đơn giản. Nó bao gồm các thuộc tính thống kê của dữ liệu của bạn, được tính cho mỗi lớp. Đối với một biến đầu vào duy nhất, nó bao gồm:

  1. Giá trị trung bình cho mỗi lớp.
  2. Phương sai được tính trên tất cả các lớp.

Top 10 thuật toán machine learning dành cho newbie

Dự đoán được thực hiện bằng cách tính giá trị phân biệt cho mỗi lớp và dự đoán cho lớp đó có giá trị lớn nhất. Kĩ thuật giả định rằng dữ liệu có một phân bố Gaussian (bell curve), do đó tốt hơn là bạn nên loại bỏ các giá trị ngoại vi khỏi dữ liệu của bạn trước. Đây là một phương pháp đơn giản và mạnh mẽ để phân loại các vấn đề mô hình dự báo.

4. Classification and regression trees – Cây phân loại và hồi quy

Decision trees là một loại thuật toán quan trọng cho mô hình tiên đoán machine learning.

Sự biểu diễn của mô hình decision tree là một cây nhị phân. Đây là cây nhị phân của bạn từ các thuật toán và cấu trúc dữ liệu, không có gì quá ưa thích. Mỗi node đại diện cho một biến đầu vào duy nhất (x) và một điểm phân chia trên biến đó (giả sử biến đó là số).

Top 10 thuật toán machine learning dành cho newbie

Các node lá của cây chứa một biến đầu ra (y) được sử dụng để dự đoán. Các tiên đoán được thực hiện bằng cách đi trên các nhánh của cây cho đến khi đến một node lá và đưa ra lớp giá trị tại node lá đó.

Cây có thể học rất nhanh và có thể dùng để dự đoán rất nhanh. Chúng thường chính xác cho nhiều loại vấn đề và dữ liệu của bạn không cần bất kỳ sự chuẩn bị đặc biệt nào.

Tham khảo thêm: Tuyển lập trình viên Machine Learning lương cao

5. Naive Bayes

Naive Bayes là một thuật toán đơn giản nhưng mạnh mẽ về mô hình tiên đoán.

Mô hình bao gồm hai loại xác suất có thể được tính trực tiếp từ dữ liệu của bạn:

1) Xác suất của mỗi lớp;

2) Xác suất có điều kiện cho mỗi lớp với mỗi giá trị x.

Sau khi tính, mô hình xác suất có thể được sử dụng để đưa ra dự đoán cho dữ liệu mới bằng Định lý Bayes. Khi dữ liệu của bạn có giá trị thực, giả sử một phân phối Gaussian (bell curve) khá phổ biến nên bạn có thể dễ dàng ước tính được các xác suất này.

Top 10 thuật toán machine learning dành cho newbie

Naive Bayes được gọi là naive vì nó giả định rằng mỗi biến đầu vào là độc lập. Đây là một giả định mạnh mẽ và không thực tế đối với dữ liệu thực, tuy nhiên, kĩ thuật này rất hiệu quả trên một phạm vi rộng lớn với các vấn đề phức tạp.

6. K – Nearest Neighbors – KNN

Thuật toán KNN rất đơn giản và rất hiệu quả. Mô hình đại diện cho KNN là toàn bộ dữ liệu tập huấn. Đơn giản phải không?

Dự đoán được thực hiện cho một điểm dữ liệu mới bằng cách tìm kiếm thông qua toàn bộ tập đào tạo cho hầu hết các ví dụ K giống nhau (hàng xóm) và tóm tắt biến đầu ra cho các ví dụ K. Đối với các vấn đề hồi quy, đây có thể là biến đầu ra trung bình, đối với các vấn đề phân loại, đây có thể là mode (hoặc phổ biến nhất) của lớp.

Bí quyết là làm thế nào để xác định sự giống nhau giữa các trường hợp dữ liệu. Kĩ thuật đơn giản nhất nếu các thuộc tính của bạn có cùng kích cỡ (ví dụ tất cả đều là inch) là sử dụng khoảng cách Euclide, một con số bạn có thể tính toán trực tiếp dựa trên sự khác biệt giữa mỗi biến đầu vào.Top 10 thuật toán machine learning dành cho newbie có thể yêu cầu rất nhiều bộ nhớ hoặc không gian để lưu trữ tất cả dữ liệu, nhưng chỉ thực hiện tính toán (hoặc học) khi một dự báo là cần thiết, chỉ vừa đúng lúc. Bạn cũng có thể cập nhật và tổ chức các bài tập đào tạo theo thời gian để giữ các dự đoán chính xác.

Ý tưởng về khoảng cách hoặc độ gần có thể bị phá vỡ với các quy mô rất cao (rất nhiều biến đầu vào) có thể ảnh hưởng tiêu cực đến hiệu suất của thuật toán đối với vấn đề của bạn. Đây được gọi là lời nguyền của quy mô. Nó cho thấy bạn chỉ sử dụng những biến đầu vào có liên quan nhất đến dự đoán biến đầu ra.

7. Học Vector Quantization

Nhược điểm của K- Nearest Neighbors là bạn cần phải giữ nguyên bộ dữ liệu đào tạo của mình. Thuật toán Quantization về Vector (hay LVQ) là một thuật toán mạng thần kinh nhân tạo cho phép bạn chọn có bao nhiêu trường hợp đào tạo để treo lên và tìm hiểu chính xác những trường hợp này sẽ như thế nào.

Top 10 thuật toán machine learning dành cho newbie

Sự biểu diễn cho LVQ là một tập hợp các codebook vector. Chúng được lựa chọn ngẫu nhiên từ đầu và thích nghi để tóm tắt tốt nhất tập dữ liệu đào tạo qua một số lần lặp của thuật toán. Sau khi học được, các vector mã có thể được sử dụng để tạo ra các dự đoán giống như K- Nearest Neighbors. Các hàng xóm tương tự nhất ( phù hợp với codebook vector nhất ) được tìm thấy bằng cách tính toán khoảng cách giữa mỗi vector và ví dụ dữ liệu mới. Lớp giá trị hoặc (giá trị thực trong trường hợp hồi quy) cho đơn vị kết hợp tốt nhất sau đó sẽ được trả về như dự đoán. Kết quả tốt nhất đạt được khi bạn thay đổi dữ liệu của mình để có cùng phạm vi, chẳng hạn như giữa 0 và 1.

Nếu bạn phát hiện ra rằng KNN mang lại kết quả tốt trên tập dữ liệu của bạn, hãy thử sử dụng LVQ để giảm yêu cầu về bộ nhớ để lưu trữ toàn bộ tập dữ liệu đào tạo.

8. Support Vector machines

Support vector machines có lẽ là một trong những thuật toán machine learning phổ biến nhất và được nói về nhiều nhất.

Một hyperplane là một đường phân chia không gian biến đầu vào. Trong SVM, một hyperplance được chọn để phân tách tốt nhất các điểm trong không gian các biến đầu vào theo lớp của chúng, hoặc là lớp 0 hoặc lớp 1. Trong hai chiều, bạn có thể hình dung nó như một đường thẳng và giả sử rằng tất cả các biến đầu vào của chúng ta có thể được tách hoàn toàn bằng dòng này. Thuật toán SVM tìm ra các hệ số dẫn đến sự phân tách tốt nhất của các lớp theo hyperplance.

Top 10 thuật toán machine learning dành cho newbieKhoảng cách giữa hyperplane và điểm dữ liệu gần nhất được gọi là biên. Hyperplane tốt nhất hoặc tối ưu có thể tách riêng hai lớp là dòng có biên lớn nhất. Chỉ những điểm này có liên quan đến việc xác định hyperplane và trong việc xây dựng các điểm phân loại. Những điểm này được gọi là các vector hỗ trợ. Chúng hỗ trợ hoặc xác định hyperplane. Trong thực tế, một thuật toán tối ưu được sử dụng để tìm các giá trị cho các hệ số tối đa hóa biên.

SVM có thể là một trong những phương pháp phân loại hàng đầu mạnh mẽ nhất và đáng thử trên tập dữ liệu của bạn.

9. Bagging and Random Forest

Random Forest là một trong những thuật toán machine learning phổ biến nhất và mạnh nhất. Nó là một loại thuật toán machine learning được gọi là Bootstrap Aggregation hoặc Bagging.

Bootstrap là một phương pháp thống kê mạnh mẽ để ước lượng số lượng từ một mẫu dữ liệu. Chẳng hạn như một giá trị trung bình. Bạn lấy rất nhiều mẫu dữ liệu của bạn, tính giá trị trung bình, sau đó trung bình tất cả các giá trị trung bình của bạn để bạn ước lượng tốt hơn giá trị trung bình thật sự.

Trong bagging, cách tiếp cận tương tự được sử dụng, nhưng thay vì để ước lượng toàn bộ mô hình thống kê, thường là decision trees. Nhiều mẫu dữ liệu đào tạo của bạn được lấy sau đó các mô hình được xây dựng cho mỗi mẫu dữ liệu. Khi bạn cần dự đoán dữ liệu mới, mỗi mô hình sẽ dự đoán và các dự đoán được tính trung bình để ước lượng tốt hơn giá trị đầu ra thật sự.

Top 10 thuật toán machine learning dành cho newbie

Random forest là một sự tinh chỉnh trên phương pháp tiếp cận này, nơi các decision trees được tạo ra để thay vì chọn các điểm phân chia tối ưu, việc phân chia tối ưu được thực hiện bằng cách đưa ra sự ngẫu nhiên.

Các mô hình được tạo cho mỗi mẫu dữ liệu khác biệt nhiều so với chúng lẽ ra phải như thế, tuy nhiên vẫn chính xác theo những cách độc đáo và khác biệt. Kết hợp dự đoán của chúng dẫn đến một ước tính tốt hơn về giá trị đầu ra cơ bản.

Nếu bạn nhận được kết quả tốt với một thuật toán có độ biến thiên cao (như decision trees), bạn thường có thể nhận được kết quả tốt hơn bằng cách bagging thuật toán đó.

10. Boosting và AdaBoost

Boosting là một kĩ thuật đồng bộ nhằm cố gắng tạo ra một phương pháp phân loại mạnh từ một số phương pháp phân loại yếu. Điều này được thực hiện bằng cách xây dựng mô hình từ dữ liệu đào tạo, sau đó tạo ra một mô hình thứ hai cố gắng sửa lỗi từ mô hình đầu tiên. Các mô hình được thêm vào cho đến khi tập đào tạo được dự đoán hoàn hảo hoặc thêm một số mô hình tối đa.

AdaBoost là thuật toán boosting thành công đầu tiên được phát triển để phân loại nhị phân. Đây là điểm khởi đầu tốt nhất để hiểu về boosting. Các phương pháp boosting hiện đại xây dựng trên AdaBoost, đáng chú ý nhất là các máy boosting gradient ngẫu nhiên.

Top 10 thuật toán machine learning dành cho newbie

AdaBoost được sử dụng với các decision trees ngắn. Sau khi cây đầu tiên được tạo ra, hiệu suất của cây trên mỗi trường hợp huấn luyện được sử dụng để đo độ chú ý của cây kế tiếp được tạo nên chú ý đến từng trường hợp đào tạo. Dữ liệu đào tạo khó dự đoán sẽ có trọng lượng hơn, trong khi những trường hợp dễ dự đoán có ít trọng lượng hơn. Các mô hình được tạo theo thứ tự tuần tự, mỗi lần cập nhật các trọng số trên các trường hợp đào tạo ảnh hưởng đến việc học được thực hiện bởi cây kế tiếp trong chuỗi. Sau khi tất cả các cây được xây dựng, dự đoán được thực hiện cho dữ liệu mới, và hiệu suất của mỗi cây được đo lường bằng cách nó đã được về dữ liệu đào tạo.

Bởi vì rất nhiều sự chú ý được đưa ra để sửa sai lầm theo thuật toán, điều quan trọng là bạn phải có dữ liệu sạch với các giá trị biên.

Last Takeaway

Một câu hỏi điển hình được hỏi bởi những người mới bắt đầu, khi phải đối mặt với rất nhiều thuật toán machine learning, là “Tôi nên sử dụng thuật toán nào?” Câu trả lời cho câu hỏi thay đổi tùy thuộc vào nhiều yếu tố, bao gồm:

1) Kích thước, chất lượng và tính chất của dữ liệu;

2) Thời gian tính toán;

3) Tính cấp bách của nhiệm vụ;

4) Bạn muốn làm gì với dữ liệu.

Ngay cả một nhà khoa học dữ liệu giàu kinh nghiệm cũng không thể biết được thuật toán nào sẽ thực hiện tốt nhất trước khi thử các thuật toán khác nhau. Mặc dù có nhiều thuật toán machine learning khác, đây là những thuật toán phổ biến nhất. Nếu bạn là một newbie trong mảng machine learning, đây sẽ là một điểm khởi đầu tốt để tìm hiểu.

Tham khảo thêm: Tuyển lập trình viên Machine Learning lương cao

Topdev via Towardsdatasience

Update 10 Xu hướng tuyển dụng IT năm 2019 mà bạn không thể bỏ lỡ

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

“Có thể bạn chưa biết theo báo cáo thị trường IT do TopDev nghiên cứu có đến 58% các nhà tuyển dụng IT tiếp cận ứng viên tiềm năng qua kênh giới thiệu nội bộ (referral), 51% các nhà tuyển dụng sẽ sử dụng các kênh chính thống ( TopDev, VietnamWorks, ITViec,..). Hiện nay ngành tuyển dụng không đơn giản chỉ là đăng tin, chờ CV của ứng viên là phỏng vấn sẽ thành công. Năm 2019 sẽ mang đến một loạt xu hướng tuyển dụng IT mới có tác động đáng kể đến quá trình tuyển dụng của các công ty trong ngành. Bạn đã sẵn sàng cập nhật 10 xu hướng tuyển dụng IT này hay sẽ bị bỏ lại phía sau, hãy cân nhắc trước khi tiếp tục đọc!”

Xu hướng đầu tiên: Tiếp thị tuyển dụng (Recruitment marketing)

Một cách hiểu đơn giản, trong bán hàng marketing là chìa khóa mang lại số lượng đơn hàng lớn, doanh thu cao, và lợi nhuận tăng vọt,… Vậy đối với thị trường tuyển dụng recruitment marketing sẽ là quá trình nuôi dưỡng và thu hút các cá nhân tài năng vào tổ chức của anh/chị thông qua nhiều phương pháp và chiến thuật không khác gì một marketer đích thực.

Recruitment Marketing bao gồm việc áp dụng tất cả các nguyên tắc của marketing hiện đại như: truyền thông đa kênh, phân tích dữ liệu cùng các công nghệ tự động hóa để củng cố thương hiệu tuyển dụng và quảng bá EVP,..Chúng ta sẽ mô phỏng quá trình tuyển dụng dưới dạng “cuộc phiêu lưu đến miền đất hứa” của các ứng viên – việc này tương tự như lý thuyết về quy trình mua hàng trong marketing. Anh/chị sẽ có 3 giai đoạn chính lần lượt được gọi là:

Awareness (Thu hút nhận thức): Nhà tuyển dụng phải chủ động để tạo ra những điểm thu hút sự chú ý của ứng viên nhờ vào xây dựng thương hiệu tuyển dụng mạnh và các EVP hấp dẫn. Vậy vấn đề ở đây là nếu bạn đã có đội ngũ HR “xịn” và phúc lợi tốt cho ứng viên thì việc xây dựng thương hiệu cho nhà tuyển dụng có còn cần thiết?

  Xây dựng thương hiệu cho nhà tuyển dụng - Nên hay không?

Consideration (Sàng lọc): Từ nhóm các đối tượng quan tâm nhất định, nhà tuyển dụng cần có các tiêu chí sàng lọc theo đúng chuẩn mục tiêu và nhu cầu công việc sau đó hình thành từng chiến lược tiếp cận và chăm sóc phù hợp.

Interest (Duy trì): Anh/chị cần tối ưu các trải nghiệm của ứng viên trong quá trình tuyển dụng để duy trì tốt mối quan hệ lâu dài. Việc duy trì mối quan hệ với các ứng viên sẽ giúp bạn tạo ra cơ hội hợp tác trong tương lai và có một cơ sở dữ liệu giá trị.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 2: Talent Pool

Talent pool đề cập đến một “danh sách” cơ sở dữ liệu nơi các nhà tuyển dụng và quản lý nhân sự có được một bảng danh sách tất cả các ứng cử viên tiềm năng hàng đầu của mình. Một talent pool tổng của doanh nghiệp bao gồm tất cả các hồ sơ ứng viên với nhiều Pools khác nhau mỗi Pool là một tiêu chí để phân loại ứng viên, có bốn pool tiêu biểu được đặt ra là địa điểm, vị trí công việc, năng lực và thời gian làm việc.

Hãy tưởng tượng nếu mỗi lần công ty open một công việc, anh/chị có sẵn một dữ liệu talent pool trong đó có thể chọn một người phù hợp nhất! Nghe thật tuyệt phải không? Đây là lý do tại sao nhiều nhà tuyển dụng đã áp dụng xu hướng này và bắt đầu xây dựng cơ sở dữ liệu ứng viên chất lượng cao cho nhu cầu hiện tại và tương lai.

Xu hướng thứ 3: Xây dựng thương hiệu nhà tuyển dụng

Thương hiệu nhà tuyển dụng là thuật ngữ thường được sử dụng để mô tả danh tiếng và sự phổ biến của một tổ chức bạn. Tên thương hiệu của bạn xuất hiện càng nhiều sẽ là nỗi ám ảnh lớn với đối thủ cũng là sức hấp dẫn mạnh cho các Developer. Đó là lý do rất nhiều doanh nghiệp trong ngành thường xuyên tham gia tài trợ hoặc đặt booth tại các sự kiện về công nghệ, hội chợ tuyển dụng IT,.. để truyền thông và thu hút nhân tài. Ý tưởng xây dựng thương hiệu tốt, là rất cần thiết để xây dựng một thương hiệu nhà tuyển dụng mạnh mẽ và hấp dẫn.

Nghiên cứu của LinkedIn đã chứng minh rằng hơn 75% người tìm việc nghiên cứu về uy tín của công ty và thương hiệu nhà tuyển dụng trước khi họ nộp đơn. Các công ty có tiếng xấu không chỉ phải đấu tranh để thu hút các ứng cử viên, mà họ còn đấu tranh để giữ “chân” nhân viên của mình. Và điều ngược lại sẽ đến với những công ty xây dựng được lợi thế từ thương hiệu tuyển dụng mạnh.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Một số sự kiện lớn dùng để làm Employer Branding tốt trong ngành IT là Vietnam Mobile Day 2019, Vietnam Web Summit 2019, TechExpo,..

Xu hướng thứ 4: Hợp tác tuyển dụng

Hợp tác với mệt kênh tuyển dụng IT chính thống (TopDev, ITViec, VietnamWorks…) là một phương thức tuyển dụng tiết kiệm thời gian và tăng năng suất. Trong đó phòng nhân sự sẽ làm việc cùng một kênh tuyển dụng uy tín để cùng tìm ra những ứng viên phù hợp nhất. Tất nhiên sẽ phải có sự chọn lựa và sàng lọc đối tác hợp lý thông qua nhiều lợi thế cạnh tranh mà họ cung cấp cho công ty bạn.

Bí quyết tuyển dụng IT thành công luôn quan trong nguồn CV “chất lượng” hơn “số lượng”, để tìm ứng viên tốt cũng giống như “vạch lá tìm sâu” điều này sẽ phụ thuộc vào cam kết và trách nhiệm của đối tác. Vì thế anh/chị cần sáng suốt trong vấn đề sàng lọc và lựa chọn những offer mang lại nhiều giá trị nhất cho công ty anh/chị. Hiện nay hợp tác tuyển dụng vẫn còn nhiều đất dụng võ vì nó cải thiện đáng kể chất lượng ứng viên, tiết kiệm thời gian và chi phí cơ hội.

Xu hướng thứ 5: Trải nghiệm ứng viên

Trải nghiệm ứng viên là tất cả những cảm nhận về ứng viên đối với công ty bạn từ lần tương tác đầu tiên. Nó dựa trên các cảm xúc, hành vi và thái độ mà ứng viên trải nghiệm trong toàn bộ quá trình tuyển dụng, từ tìm nguồn cung ứng và sàng lọc đến phỏng vấn và cuối cùng là gia nhập.

Bởi vì những ứng viên có trải nghiệm tích cực trong quá trình tuyển dụng sẽ có nhiều khả năng chấp nhận lời mời làm việc của bạn, và giới thiệu đến những mối quan hệ về công ty bạn. Mặt khác, một trải nghiệm ứng viên tiêu cực có thể khiến bạn tốn kém hơn khi mất nhiều thời gian và chi phiếu để tuyển lại ứng viên mới. Bạn có thể tham khảo “7 thủ thuật bỏ túi không thể bỏ qua khi tuyển dụng IT” để làm tăng tính trải nghiệm cho ứng viên.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 6: Quản lý quan hệ ứng viên (CRM)

CRM là một hệ thống quản trị mối quan hệ khách hàng. Trong tuyển dụng CRM được xem là phương pháp để quản lý và cải thiện mối quan hệ với các ứng viên trong công việc hiện tại và tiềm năng trong tương lai. Nói một cách dễ hiểu các nhà tuyển dụng phải xây dựng và làm mới quy trình tuyển dụng của mình trong đó CRM là giai đoạn then chốt để thu hút và thuyết phục ứng viên tiềm năng đến với công ty họ.

Xu hướng thứ 7: Recruitment automation tools

Nói một cách đơn giản, các công cụ tự động hóa tuyển dụng là phần mềm sử dụng công nghệ mới giúp hợp lý hóa, đơn giản hóa và tự động hóa quá trình tuyển dụng, làm cho nó nhanh hơn và hiệu quả hơn. Tự động hóa quy trình tuyển dụng đã xuất hiện được một thời gian, nhưng bây giờ nó sẽ vượt xa HRIS, hệ thống theo dõi người nộp đơn (ATS) và Phần mềm tiếp thị tuyển dụng. Xu hướng mới là phần mềm cung cấp các công cụ 2 trong 1 – tích hợp cả giải pháp tiếp thị tuyển dụng và ATS dưới cùng một nền tảng. Đây là một lợi thế so với đối thủ cạnh tranh giúp bạn tiến bộ hơn và chiếm lợi thế hơn trong cuộc chiến tuyển chọn “nhân tài”.

Xu hướng thứ 8: Phỏng vấn cấu trúc

Trong ngành tuyển dụng chúng ta thường sử dụng phỏng vấn Face to Face có thể trực tiếp tại công ty hoặc qua Skype đối với các công ty nước ngoài. Anh/chị sẽ có một bảng hỏi hoàn thiện và đặt ra các câu hỏi đã được chuẩn hóa sau đó ghi nhận thông tin từ ứng viên. Phỏng vấn có cấu trúc đang trở thành loại phỏng vấn phổ biến nhất trong số nhiều nhà tuyển dụng. Tại sao? Đơn giản vì nó đem lại hiệu quả cao, có tính khách quan trong việc đánh giá, thể hiện sự công bằng giữa các ứng viên và được pháp luật bảo vệ.

Update-10-Xu-Hướng-Tuyển-Dụng-IT-2019

Xu hướng thứ 9: Data-driven recruiting and HR Analytics

Đây là các biểu thức được sử dụng để thể hiện các phương pháp tuyển dụng trong đó lập kế hoạch và ra quyết định dựa trên dữ liệu có được thông qua HR technology như hệ thống theo dõi ứng viên (Applicants Tracking Systems) và nền tảng tiếp thị tuyển dụng (Recruitment Marketing Platforms).

Tương tự như hoạt động Marketing đang chuyển đổi mạnh mẽ sang hướng số hóa dữ liệu, hoạt động tuyển dụng nói riêng và nhân sự nói chung sẽ phụ thuộc ngày càng nhiều vào các cơ sở dữ liệu. Josh Bersin – một chuyên gia nhân sự hàng đầu thế giới nhận định: “Những gì chúng ta không đo lường được, chúng ta sẽ không thể quản lý được”. Việc chú ý đến các phân tích dữ liệu của HR và sử dụng data-driven recruiting đã được chứng minh để cải thiện một số chỉ số tuyển dụng quan trọng nhất như thời gian, chi phí và chất lượng tuyển dụng.

Xu hướngthứ 10: Giới thiệu nội bộ

Đã có rất nhiều số liệu chứng minh hiệu quả vượt trội của việc tuyển dụng nhân viên thông qua giới thiệu từ nội bộ. Họ cho biết họ phương thức giới thiệu nội bộ (Referral) rất phổ biến và được HR áp dụng cho tất cả các vị trí, đặc biệt là các vị trí IT. Tuyển dụng IT từ nguồn CV giới thiệu nội bộ nghe có vẻ truyền thống nhưng luôn mang lại hiệu quả nhất định vì thế trong suốt nhiều năm qua nguồn nội bộ luôn nằm trong top xu hướng tuyển dụng nhân sự mới. Để kích thích được sự chủ động từ các nhân viên tài năng trong công ty bạn có thể đưa ra những đề nghị chiết khấu hấp dẫn nếu giới thiệu được ứng viên thành công.

Từ 10 xu hướng tuyển dụng trên bạn có thể nghiên cứu và ứng dụng những phương thức phù hợp với quy trình tuyển dụng của công ty mình.

Deep learning là gì? Những quan niệm sai lầm về Deep Learning

deep-learning-la-gi

Machine Learning đang rất được cộng đồng quan tâm. Theo trang towardsdatascience Sự bão hòa thông tin trên các phương tiện truyền thông, đang che dấu những sự thật đằng sau đó.

Hy vọng bài viết này có thể làm sáng tỏ một số những quan niệm sai lầm về ML. Quan trọng hơn là làm rõ một số quy trình của deep learning cũng như nguyên nhân tại sao nó hoạt động tốt trong một số lĩnh vực như xử lý ngôn ngữ tự nhiên (NLP), nhận diện hình ảnh, và dịch ngôn ngữ trong khi lại không thành công ở những mảng khác.

Deep Learning không phải là phép thuật

Truyền thông thường miêu tả deep learning như là một công thức ma thuật cho tất cả các vấn đề của cuộc sống. Trong thực tế, nó hoàn toàn ngược lại. Hơn nữa, deep learning luôn có những hành vi kỳ lạ mà tới giờ chúng ta vẫn không giải thích hết được.

Bằng cách yêu cầu bằng chứng và lập luận trong quá trình phát triển của mình, bạn có thể xây dựng một framework mạnh mẽ từ hằng hà các mô hình khác nhau.

Những Quan Niệm Sai Lầm Về Deep Learning

Mọi thứ đều có mục đích

Một trong những vấn đề đầu tiên mà những người mới hay mắc phải là việc cứ gộp chung LSTM (Long Short-Term Memory) layers, GRU (Gated Recurrent Unit) layer và vài layer lẻ tẻ khác lại với nhau rồi chờ kết quả xảy ra một cách thần kì. Họ cần phải nhận ra rằng deep learning đòi hỏi cách tiếp cận hợp lý hơn nhiều.

Bằng cách áp dụng một phương pháp dựa trên sự tích hợp của dữ liệu, network design và sự tò mò, bạn sẽ tạo ra các kết quả phi thường. Tôi dành thời gian mỗi ngày để đọc các bài báo về những phương pháp mới nhất và liên tục nhìn thấy rất nhiều thiết kế vô cùng thông minh.

Trong deep learning, layer khác nhau có các mục đích khác nhau. Đây là một khái niệm đơn giản mà thường bị quên bởi những người mới biết về deep learning. Hơn nữa, trong khi tôi có thử nghiệm rất nhiều trong quá trình thiết kế, tôi luôn luôn kiểm tra chúng rất kĩ lưỡng.

Cần có một lý do (hoặc ít nhất là một giả thuyết) hợp lý cho việc bạn thêm một yếu tố mới. Nó nên được kiểm tra với một thước đo rõ ràng, và chỉ sau đó tôi mới chấp nhận đưa nó vào phiên bản chính thức. Ngoài ra, bạn nên lựa chọn các mô hình đơn giản thay vì phức tạp nếu chúng đều đạt được những kết quả tương tự. Các hệ thống nhỏ và đơn giản hơn cũng có nghĩa là quá trình đào tạo chúng sẽ nhanh hơn cũng như là kết quả thu được sẽ rất tối ưu.

Có những công cụ mà bạn có thể tạo ra để thử nghiệm những ý tưởng cho network design, và nó sẽ giúp bạn hiểu rõ hơn về bản chất của chúng. Khi bạn làm việc nhiều hơn với Neural Networks, bạn cũng đang bắt đầu nắm rõ hơn về những gì thúc đẩy hành vi của nó đối với một hành động cụ thể. Mọi thứ chỉ thật sự rõ ràng khi bạn có phương pháp đo đạc chính xác.

Quá trình thiết kế

Tôi nghĩ về quá trình thiết kế cũng giống như cách một đứa trẻ cố gắng xây dựng một cái tháp bằng lego. Thử – ghép – thất bại – thử ( luôn luôn test liệu nó có phù hợp không)

Liệu rằng là layer thứ hai có lay?  Có nên thay đổi phần cơ cấu không? Sẽ rất hữu ích khi bạn nghĩ đến việc tối ưu hóa lượng mảnh ghép. Bởi quy mô càng nhỏ, thì bạn càng có thể thực hiện nó nhanh hơn cũng như kiểm tra dễ dàng hờn. Vì vậy chỉ thêm khi bạn thật sự cần thiết.

Trong deep learning, một vấn đề có vô số các giải pháp giải quyết – Sự phức tạp có khuynh hướng khiến cho ứng dụng bị “bùng nổ” nhanh chóng, và sự gia tăng yêu cầu phức tạp cũng sẽ dẫn tới gia tăng sự kiểm soát. Ví dụ, một pipeline phân tích dữ liệu thăm dò đơn giản có thể là:

NHẬP DỮ LIỆU → LÀM SẠCH DỮ LIỆU → CHUYỂN DỮ LIỆU → HIỂN THỊ DỮ LIỆU

Mỗi bước trên có thể bao gồm nhiều bước nhỏ khác nhau trong đó. Nếu tôi không đảm bảo chất lượng của các quy trình trước thì toàn bộ hệ thống sẽ thất bại bởi data nhận được sai hoàn toàn. Vì vậy, luôn phải kiểm tra từng bước trong quá trình.

Nói cách khác, phải test tất cả mọi thứ – inputs, outputs, classes, functions. Mục tiêu đặt ra là phải đảm bảo mọi thứ hoạt động tốt dù là độc lập hay cùng nhau. Đây không phải là một ý tưởng đột phá gì, nhưng nó thật sự cần được chỉ ra để mọi người hiểu rõ tầm quan trọng của việc này.

Trong deep learning, tôi bắt đầu bằng cách tạo ra mô hình đơn giản nhất. Khi phải dụng tới task phân loại văn bản, tôi sẽ bắt đầu với phiên bản đơn giản nhất của mô hình Embed-Encode-Attend-Predict.

Sau khi nhìn thấy mô hình nền tảng này hoạt động như thế nào, tôi mới bắt đầu xây dựng dựa trên nó. Có thể là tăng kích thước của các layers ẩn, làm sâu thêm network, hay nhập với các network mới cũng như là thay đổi tags và các dữ liệu số khác. Danh sách cứ thế kéo dài tới gần như là vô tận.

Với từng bước, tôi thử để nó chống lại mô hình ban đầu của mình. Quá trình này cho phép tôi nhìn lại sự thay đổi của mô hình, hiểu được nó tốt hơn ở đâu và đưa ra các thay đổi phù hợp cho phiên bản tương lai cũng như đạt tiêu chuẩn đặt ra.

Hãy làm chủ dữ liệu của bạn

Trước khi bạn bắt đầu thử nghiệm với mô hình deep learning của mình, bạn cần hiểu rõ giá trị của nó nằm ở đâu. Có một hệ thống phân chia cấp bậc đơn giản như sau:

Dữ liệu quan trọng hơn model design, và model design quan trọng hơn tối ưu hóa thông số.

Nếu công ty A có mười lần dữ liệu của công ty B, không có mô hình nào trong thế giới này sẽ cho phép công ty B vượt mặt công ty A. Điều này cũng tương tự với chất lượng dữ liệu.

Nếu tôi dành hàng tuần để phát triển mô hình dựa trên dữ liệu có chất lượng thấp, nó sẽ kém hơn mô hình mà tôi đã xây dựng trong vài ngày sau khi có dữ liệu chất lượng cao. Luôn tự hỏi rằng liệu mình có thể nhận được nhiều dữ liệu hơn hay không trước khi dành thời gian cho việc tạo mô hình. Có lẽ bạn có thể thay đổi các bước tiền xử lý để nâng cao chất lượng dữ liệu. Điều này thường dẫn đến hiệu suất nhanh hơn so với việc chỉ điều chỉnh mô hình thôi.

Bạn không chỉ cần dữ liệu có chất lượng cao, mà bạn cũng cần phải hiểu rõ về nó. Bạn nên dành thời gian phát triển các công cụ để phân tích và nghiên cứu dữ liệu nhập của mình. Tránh lối mòn trong suy nghĩ về dữ liệu như là một đầu vào.

Tất cả dữ liệu có các tính năng ẩn chứa sức mạnh dự đoán to lớn nếu bạn có thể trích xuất chúng. Đôi khi bạn phải tự làm điều này, đôi khi bạn có thể phát triển mô hình deep learning theo cách mà nó có thể làm được điều này một mình. Hãy suy nghĩ về dữ liệu của bạn như là một đầu vào cho một thuật toán mật mã – nhưng thay vì mã hóa một văn bản hoặc email, nó là mã hóa cách thế giới hoạt động. Mỗi điểm dữ liệu là một đầu mối để hiểu rõ hơn.

Phân loại văn bản trong NLP là một ví dụ hoàn hảo. Bạn được cung cấp hàng trăm hoặc hàng ngàn từ, và mỗi văn bản có một class hoặc nhiều class. Có lẽ class này là tích cực, tiêu cực, hoặc trung lập, và có lẽ bạn có hàng trăm class phức tạp. Dù bằng cách nào, văn bản sẽ là code mà chúng tôi sử dụng để xác định kết quả đầu ra.

Khi bạn thật sự suy nghĩ về dữ liệu và hiểu được giá trị của chúng thì kết quả đạt được sẽ rất phi thường. Bởi suy cho cùng deep learning là dựa trên mức độ hiểu biết của chúng ta về dữ liệu.

Dành thời gian với các chuyên gia về Domain

Điều này có liên quan đến phần trước và thậm chí còn quan trọng hơn – dành thời gian để nói chuyện với những người có kiến ​​thức về tên miền. Thảo luận kết quả của bạn với họ, thảo luận về dữ liệu với họ. Thu hút sự chú ý của họ trong quá trình thiết kế.

Bạn sẽ bị sốc khi biết việc này sẽ có ích tới dường nào. Bởi những insight cũng như ý kiến từ họ luôn có độ chính xác cao đến kinh ngạc. Nếu bạn không có chuyên gia về miền, hãy dành thời gian để tự học. Tránh cố gắng xây dựng một mô hình deep learning cho một vấn đề bạn không hiểu.

Loại bỏ ý tưởng rằng deep learning giống như việc đi qua một mê cung dựa vào linh tính. Trong thực tế, bạn có thể đặt được sự “hoàn hảo” trong  deep learning bằng cách làm theo đúng phương pháp và cố gắng giải quyết những vấn đề chính xác. Hãy luôn tự hỏi bản thân vì sao lại như vậy?

Mặc dù phương pháp tôi mô tả có thể trái ngược với ý tưởng thiết kế dựa trên số liệu, nhưng tôi thấy nó lại thật sự rất hiệu quả khi bạn bắt tay vào làm. Đôi khi chỉ có thực hành mới đem lại cho ta sự hiểu biết tường tận hơn là chỉ nhìn vào số liệu.

Học như trẻ nhỏ

Khi tôi kiểm tra một thay đổi trong thiết kế, tôi cố gắng tìm ra lý do tại sao nó hoạt động. Phương pháp này cho phép tôi tiếp tục nâng cao hiểu biết của mình. Tôi có thể không phải là một chuyên gia, nhưng với thời gian, mọi chuyện điều có thể miễn bạn luôn cố gắng bám theo nó.

Tôi tiếp tục hỏi lý do tại sao cho đến khi cảm thấy đã thực sự hiểu tường tận cho quyết định đó. Thường thì một câu hỏi luôn dẫn đến câu hỏi khác, và vài ngày sau bạn có một sự hiểu biết mới và sâu sắc về một loạt các khái niệm. Sau đây là một ví dụ khá điển hình cho trường hợp trên:

  •    Tại sao nên sử dụng một LSTM để mã hóa các câu của tôi?
  •    Làm thế nào để một LSTM hoạt động?
  •    Cách tốt nhất để regularize một LSTM là gì?
  •    Tôi nên decode các trình tự từ đầu ra LSTM như thế nào?
  •    Liệu một GRU có thể hoạt động tốt hơn hay nhanh hơn LSTM? Tại sao?
  •    Tôi nên khởi tạo các layer LSTM theo cách nào? Tại sao?
  •    LSTM này chậm, liệu tôi có thể tăng tốc độ nó lên không?
  •    Tại sao một LSTM truyền thống lại hoạt động chậm hơn nhiều so với một layer LSTM tối ưu hóa Cuda trên GPU?

Tôi gọi chúng là những lỗ thỏ vì con đường học tập là ngẫu nhiên và không chắc chắn ngay từ đầu. Đã từng tôi chỉ để cho bản thân mình khám phá những câu hỏi tôi có. Thật ra tôi không lo lắng rằng nó là lộn xộn. Phương pháp này là cách tôi đã học được mọi thứ từ trước tới nay trongcuộc đời của mình, và nó luôn luôn đưa tôi đến đúng nơi.  Tuy vậy, cách tiếp cận này có nhược điểm là mất nhiều thời gian, nhưng phần lớn các nhà khoa học dữ liệu sẽ không hề ngại vấn đề này.

Hỏi đúng câu hỏi

Xác định đúng vấn đề trong deep learning là điều thiết yếu. Deep learning rất giỏi về ngôn ngữ, phân loại hình ảnh, dịch lời nói, thông dịch cho máy và game (cờ tướng, Starcraft). Nó kém hiệu quả hơn ở các lĩnh vực machine learning truyền thống như phát hiện gian lận trong thẻ tín dụng, định giá tài sản và chấm điểm tín dụng.

Có lẽ trong tương lai, chúng ta sẽ có các mô hình hoàn hảo hơn, với những phương pháp tối ưu hóa để làm cho deep learning được áp dụng rộng rãi hơn nhưng hiện tại nó vẫn còn rất giới hạn.

Lý do mà deep learning có khả năng thực hiện những task phức tạp là nhờ vào các mô hình. Với tất cả các bước trong phân tích và liên kết dữ liệu. Một mạng thần kinh nhân tạo sẽ tìm ra và khai thác những dữ liệu này theo cách mà không con người nào có thể làm được.

Hơn nữa, trong khi machine learning truyền thống cũng có thể được áp dụng cho các lĩnh vực này, chúng lại rất hạn chế và không có hiệu quả cao. Đó là lí do vì sao network của machine learning không có được khả năng phân tích tốt với số lượng dữ liệu lớn như deep learning.

Những Quan Niệm Sai Lầm Về Deep Learning

 

Hoang tưởng đôi khi cũng là cần thiết

Chủ đề cuối cùng và có lẽ là quan trọng nhất – Làm thế nào để đảm bảo mô hình của bạn hoạt động tốt? Thật không may bởi không có một giải pháp duy nhất nhưng có những tiêu chí mà bạn có thể dựa vào đó để đánh giá.

Khi thiết kế một mạng lưới, tôi thường nghĩ là nó không hoạt động chính xác. Tôi liên tục tự hỏi liệu các điểm số có đang đánh lừa mình, hoặc có những lỗi hiếm gặp mà tôi không lường trước được. Kết quả là, tôi xây dựng các công cụ xem xét và kiểm tra theo nhiều cách.

Vấn đề là phải nhận ra rằng mô hình của bạn sẽ rất phức tạp cũng như là ta sẽ chỉ hiểu được một phần của quá trình đưa ra quyết định. Đôi khi bạn học được một ít về mô hình của mình và cách kiểm soát chúng.

Đôi khi bạn phải chấp nhận rằng nó không phải lúc nào cũng hiệu quả. Vấn đề thường là giảm nhẹ chứ không phải là loại bỏ. Bất kỳ hệ thống deep learning nào cũng có hệ thống kiểm soát chất lượng thông minh (QA) đứng phía sau. Hệ thống kiểm soát chất lượng đó hoạt động như là hàng phòng vệ cuối.

Bằng cách sử dụng các quy trình QA thích hợp, bạn sẽ có được các số liệu cần thiết cũng như là liên tục cải tiến bản thân và mô hình của bạn. Và như vậy, tỷ lệ thành công của chúng ta sẽ tăng lên rõ rệt.

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

  Muốn biết cách thức hoạt động của Deep Learning? Hãy đọc hướng dẫn nhanh sau!
  5 cách mà Deep Learning ảnh hưởng đến cuộc sống của bạn
  Hiểu thêm về Deep Learning thông qua 12 khóa học online miễn phí

10 thói quen của một lập trình viên thành công

10-thoi-quen-cua-lap-trinh-vien-thanh-cong

Tôi có may mắn được trò chuyện với một số lập trình viên vĩ đại. Tôi gặp họ tại các hội nghị hay trong các buổi ăn tối dành cho nhà tài trợ – nơi mà người tham dự bình thường không được vào. Họ là những người bạn theo dõi trên Twitter. Trong những buổi ấy, họ thoải mái chia sẻ ý kiến ​​và bàn luận về các những câu chuyện thời chiến đại – những thói quen developer thành công.

Qua những buổi nói chuyện cộng thêm những quan sát cá nhân của tôi qua nhiều năm, đã khiến tôi tin rằng chắc chắn có một số bí mật tạo nên thành công của các lập trình xuất sắc. Cùng TopDev lắng nghe chia sẽ của một trong những lập trình viên vĩ đại trên  Webapplog mà tôi được biết.

Bây giờ, bạn có muốn trở thành lập trình viên xuất sắc, tạo ra những sản phẩm để đời được mọi người yêu thích, hay muốn tự giết bản thân bằng việc bằng lòng với chính mình?  nếu vậy hãy bỏ qua bài viết này và tự tìm cách của riêng bạn.

1. Chia sẻ công khai code do bạn viết càng nhiều càng tốt

Bằng cách chia sẻ công khai code của bạn, bạn trở nên đáng tin hơn trong mắt của mọi người (ít nhất là đối với những người đang sử dụng GitHub) và giúp code của bạn tốt hơn từng ngày.

2. Sử dụng Command-line khi có thể

Thông thường, giao diện command-line cung cấp cho bạn nhiều tính năng hơn bất kỳ GUI nào. Hơn nữa, nếu ứng dụng yêu thích của bạn không được hỗ trợ nữa, bạn sẽ cần phải tìm hiểu một công cụ mới; trong khi với CLIs, thường không thể thay đổi. Ngoài ra, bạn có thể làm trên nhiều servers. Một điểm nữa: Nếu làm được, cấp dưới của bạn có thể sẽ nghĩ bạn là một hacker thật sự đấy.

3. Đọc sách làm một thói quen developer

Hầu hết mọi người không đọc nhiều sách, các lập trình viên không phải là ngoại lệ. Một cuốn sách là một là một hình thức ôn tập kiến ​​thức. Tôi thích sách hơn video vì tôi có thể đọc với tốc độ nhanh hơn và không bị phân tâm bởi các video nhảm nhí khác trên YouTube luôn chạy dọc theo các video công nghệ mà tôi đang xem, hay những nhân vật hoạt hình ngớ ngẩn trong một số khóa học Udemy hoặc thậm chí đường truyền (voice, chất lượng video , v.v…).

Do đó, tôi thường đọc hay nghe ít nhất 1 cuốn sách một tuần.

4. Viết nhật kí làm việc

Viết nhật ký làm việc, giúp ghi lại những thành tích của bạn cũng như các bài học kinh nghiệm. Hay tốt hơn, bạn nên để một quyển tạp chí code tại nơi bạn ghi chép lại những điều bạn đã làm và không làm. Viết nhật kí làm việc thật sự rất rẻ và tốt đấy các ông.

5. “Chăm chỉ” giao tiếp hơn

Email là một sự lựa chọn tệ trong giao tiếp. Các ứng dụng nhắn tin còn tệ hơn rất nhiều lần. Emoji giúp người chat biểu lộ nhiều cảm xúc hơn nhưng hiệu quả không lớn. Ngược lại, giao tiếp trực tiếp có thể giúp bạn dễ dàng truyền tải ý tưởng của bạn một cách rõ ràng nhất, kể cả những nội dung phức tạp nhất cũng có thể được giải thích rõ ràng để cho một bé học sinh lớp 5 hiểu “ gật gù “. Giả sử bạn gặp một người đang bị phân tâm, chịu áp lực, hay thiếu ngủ, hãy trò chuyện với họ bằng ngôn ngữ đơn giản nhất có thể. Hãy liệt kê các ý theo gạch đầu dòng và nhấn mạnh những điểm quan trọng bằng cách in đậm và TL; DRs.

Thay vì gửi email, đặc biệt khi bạn biết rằng vấn đề ấy có thể mất nhiều hơn 1 email để trình bày, hãy thường xuyên nói chuyện với mọi người qua điện thoại hoặc đi đến bàn làm việc của họ nếu hai bạn ở cùng một văn phòng, (Đôi khi bạn có thể cài đặt lại email của bạn để chỉ nhận được một phản hồi từ người khác thay vì 7 email qua lại … Bạn không nên xem email như một ứng dụng nhắn tin và cố gắng giữ chúng ngắn gọn nhất có thể).

  Đằng sau thành công của một Tập đoàn Tech: Xem trọng Software developer hơn cả tiền bạc

6. Luôn có một lịch trình cho mọi buổi họp

Mọi người thường xuyên nhắn cho tôi trên LinkedIn hoặc qua email để hẹn tôi uống cà phê hoặc một buổi trò chuyện qua điện thoại. Tất cả họ đều là người lạ. Tôi hầu như luôn luôn hỏi lịch trình để tôi tự đặt ra những kì vọng và mục tiêu cho dù mục đích mời tôi của chương trình là tuyển dụng cho Capital One, giúp đỡ sự nghiệp của họ hoặc cùng họ xây dựng một dự án.

7. Tìm hiểu về Touch Typing

Điều này quá rõ ràng. Chúng ta đang dành thời gian cho những việc gì? Gần như 70-90% ngày làm việc (và kể cả những ngày nghỉ) của chúng ta đều phải đánh máy? Tôi phải há hốc mồm mỗi khi nhìn thấy các đồng nghiệp IT hay tech không đánh máy, thậm chí bằng bàn phím QWERTY. Nếu bạn muốn giỏi hơn những người khác, hãy học Colemak. Đó là thứ tôi đã sử dụng.

8. Sử dụng những công cụ tốt nhất

Bạn phải sử dụng các công cụ tốt nhất. Những thứ như editor, IDEs, thư viện, thiết bị (máy tính), bàn + ghế, WiFi, v.v… Nếu những thứ bạn đang sử dụng không thực sự tốt, bạn sẽ không tài nào có thể tập trung và làm việc hiệu quả trong nhiều giờ.

9. Tránh bị sao nhãng

Tránh theo đuổi những công cụ hào nhoáng được PR là giúp giảm khối lượng công việc khổng lồ của bạn. Bạn nên sử dụng các editor siêu cũ hoặc WiFi cực chậm nhưng vẫn có thể truyền tải hàng tấn code , thay vì sử dụng các công cụ có nền tảng siêu lớn và không thể làm được gì hữu ích.

10. “Làm chủ” các phím tắt

Mỗi giây bạn rút ngắn được có thể giúp bạn tiết kiệm được hàng giờ đồng hồ mỗi ngày . Bạn sẽ đỡ mệt mỏi hơn và có thể làm được nhiều thứ hơn khi sử dụng các phím tắt trong các hoạt động thường ngày như sao chép / dán, tạo mới, tìm, v.v..

Bonus: Tắt thông báo

Mỗi trường hợp ở trên làm bạn mệt mỏi hơn, đồng thời cũng làm giảm chất lượng code của chúng tôi. Chúng ta gần như không thể giải quyết các vấn đề phức tạp và trừu tượng nếu không tập trung cao độ.

Thôi được rồi, bài viết đã hơn 10 điều nhưng … tôi thích thế 🙂 Vậy bí quyết (hoặc thói quen không bí mật lắm) của bạn là gì? Hãy nhận xét bên dưới để chúng tôi biết nhé.

  29 đầu sách mà bất cứ lập trình viên nào cũng phải đọc qua

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

FabricJS (Canvas library) và xây dựng tool chế ảnh – thư viện Javascript

fabric-javscript

Yeah, quay lại series Javascript World đầy hào hứng thật ra thất nghiệp ở nhà viết bậy bạ chơi.  Nay mình giới thiệu cho các bạn 1 library thao tác trên Canvas – FabricJS. Rồi sử dụng thư viện này làm tool chế ảnh đơn giản như Haivl ngày xưa!

Bài viết này không có nhận được xu nào từ FabricJS, Nếu ai đó làm ở FabricJS đọc được tiếng Việt thì có thể liên hệ tui quảng cáo nhé.

Lên kế hoạch thao tác Fabric Javascript

Các nhân vật xuất hiện

  • Bootstrap – Hậu cần xây dựng hậu trường, bối cảnh
  • FabricJS – Nhân vật chính
  • Google & Stackoverflow – Đạo diễn

Tìm hiểu nhân vật chính

Trang chủ : http://fabricjs.com/
Trước khi đọc dòng này thì chắc chắn rằng bạn đã vào trang chủ của nhân vật chính để hiểu sơ sơ về nhân vật chính tham gia bộ tool chế ảnh này nhé. Hehe

Lên kịch bản

Sản phẩm cuối cùng giống giống cái tool chế ảnh này: http://xem.vn/builder/meme/6
Link để chơi thôi không coi cũng không sao đâu! Đây giao diện cuối cùng của app

Hơi xấu, nhưng chịu khó nhìn cũng được

Tiến hành thôi

Chương trình khá lớn nên tui chia ra 1 file HTML (index.html), 1 file JS để xử lý (tool.js), 1 đống file hình ảnh làm Background cho Canvas. Hình là nguồn tài nguyên quý giá và vô tận bạn có thể tìm kiếm trên google mà chưa phải trả phí. Nếu bạn muốn trả phí thì nó không thuộc phạm trù bài viết này

Dựng hậu trường (index.html)

Khúc đầu

Một số thư viện và style nho nhỏ

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <link type="text/css" rel="stylesheet" href="http://getbootstrap.com/dist/css/bootstrap.min.css" />
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
    <script src="http://fabricjs.com/lib/fabric.js"></script>
    <style>
        canvas{
            border: 1px solid #ccc;
            margin: auto;
        }
        .canvas-container{
           margin: auto;
        }
        .thumbnail{
         height: 163px;
        }
    </style>
</head>

Khúc body 6 múi

Giao diện, chia

<body>
<h1 class="text-center">Tool chế ảnh</h1>
<div class="container">
<div class="row">
<div class="col-lg-8">
<h2>Canvas</h2>
<div>
                <canvas width="600" height="400"  id="canvas"></canvas>
            </div>
</div>
<div class="col-lg-4">
<div class="row">
<h2>Editor <a  id="ctrlSave" href="#"><i class="glyphicon glyphicon-save"></i></a></h2>
</div>
<div class="row">
<h3>Text</h3>
<div class="row">
<div class="col-lg-12">  
                         <div class="input-group">
                          <input id="ctrlText" type="text" class="form-control" placeholder="Text">
                          <div id="ctrlAddText" class="input-group-addon"><i class="glyphicon glyphicon-send"></i></div>
                        </div>
                    </div>
 
</div>
</div>
 
<div class="row">
<h3>Background</h3>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg1.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg2.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg3.jpg" />
</div>
<div class="col-lg-6">
<img class="thumbnail img-responsive" src="bg/bg4.jpg" />
</div>
</div>
</div>
</div>
</div>
<script src="js/tool.js"></script>
</body>
</html>

Ta sẽ tập trung vào một số đối tượng class thumbnail, id : canvas, ctrlText, ctrlAddText, ctrlSave

Click thumbnail -> set background Canvas
Click ctrlAddText -> lấy text (value) của ctrlText thêm vào Canvas
Rồi kéo thả chữ vào vị trí các kiểu =))
Click ctrlSave -> Canvas chuyển thành file Hình ảnh rồi tải xuống máy người dùng

Xem việc làm javascript đãi ngộ tốt trên TopDev

Action (tool.js)

Khởi tạo đối tượng Canvas

var canvas = new fabric.Canvas('canvas', {});

Hãy tưởng tượng fabric là nhà máy sản xuất người mẫu. Canvas là người mẫu, còn các hoạt động khác nhằm lên đồ, trang điểm, trang phục các kiểu cho người mẫu này.

Đối tượng xử lý phần Background

var BackgroundImage = {
setEvent: function(){
$('.thumbnail').click(function(){
BackgroundImage.handleEvent(this)
})
},
handleEvent: function(imgElement) {
var src = $(imgElement).attr('src')
    fabric.Image.fromURL(src, function(oImg) {
       canvas.setBackgroundImage(oImg, canvas.renderAll.bind(canvas))
       canvas.setWidth(oImg.width);
       canvas.setHeight(oImg.height);
    });
}
}

Đây là phần mặc đồ cho người mẫu canvas. Ta sẽ chọn những bộ đồ từ mấy .thumbnail. Có cái hơi kỳ, đồ thì nhiều size, nhưng người mẫu thì chỉ có 1 nên người mẫu phải ăn uống tăng giảm ký (setWidth), giảm chiều cao (setHeight) cho vừa với bộ đồ! Haha

Đối tượng xử lý Text

Đối tượng xử lý Download

Lưu ý nhỏ : #ctrlSave phải là thẻ a, chỉ có thể là thẻ a, không gì khác ngoài thẻ a. Vì thế mới set vào thuộc tính href + download.

Khởi tạo Chương trình

Lời kết

Source code thì mình có để ở đây, bạn nào lười đọc có thể vào đây coi, cứ vào đây: Link 16 phút

Mình cũng có viết 1 tool chế ảnh tương tự cũng trên thư viện này, cũng phong cách code này, nhưng bự và bừa bãi hơn nhiều! ( Nên nay mình cũng muốn chia sẽ nhẹ thôi, không muốn phức tạp hóa công cụ gì hết, các bạn cứ thỏa sức tỏa sáng tạo trong việc lập trình. Hehe.

TopDev Via Codedem

Tham khảo các vị trí tuyển dụng lập trình viên hấp dẫn tại Topdev

Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains

symphony-docker

Tác giả: Artem Henvald

Có những tình huống khi Symfony cần định tuyến dựa trên tên miền phụ. Ví dụ, khi chúng ta phân phối các cụm chức năng khác nhau trong một dự án hoặc một kho lưu trữ. Giả sử, ngoài API, có một phần quản trị được viết trong các gói Symfony hoặc một số chức năng cho các url truy cập công khai từ phía máy khách.

Dưới đây là một số tùy chọn:

  • api.project-name.work: một máy chủ API cho các ứng dụng khách (web và các máy khách di động).
  • hub.project-name.work: một máy chủ được sử dụng để kết nối ngược với một máy khách di động khi một số tính năng cần có sẵn URL từ trình duyệt. Ví dụ: trong trường hợp tính năng đặt lại mật khẩu, tính năng xác nhận email, tính năng hủy đăng ký email, xử lý móc nối web từ hệ thống thanh toán, xử lý chuyển hướng hệ thống thanh toán và các trang như thỏa thuận người dùng hoặc điều khoản và điều kiện sẽ mở từ trình duyệt hoặc từ chế độ xem web trong ứng dụng dành cho thiết bị di động. Bạn có thể chia tất cả chức năng này thành các tên miền phụ nếu bạn cần. Nhưng nó là không hợp lý để lưu trữ tất cả các công cụ này trên tên miền phụ API vì nó không liên quan đến các truy vấn của khách hàng và trong hầu hết các trường hợp có một phương thức xác thực khác với API. Các tên miền con với tên ‘hub’ rất phổ biến trên các dịch vụ khác nhau cho các tính năng cùng loại.
  • admin.project-name.work: một máy chủ nơi phần quản trị được lưu trữ. Thật thuận tiện khi bảng quản trị viên được thực hiện bằng văn bản trong Symfony trong cùng một kho lưu trữ với mã API. Các thực thể phổ biến được sử dụng, và cả Symfony thuần hoặc một số gói quản trị có sẵn (như SonataAdminBundle, EasyAdminBundle, vv) đều có thể thực hiện được. Nó rất tiện lợi khi bạn phân phối với các công ty khởi nghiệp nhỏ hoặc trung bình với ngân sách hạn chế.

 

Tùy thuộc vào lĩnh vực của dự án, có thể sử dụng các tên miền phụ khác, như ‘my’, ‘stats’, ‘legacy’,…

Khi bạn cần các tên miền phụ riêng biệt

Có tên miền phụ riêng biệt cho các chức năng khác nhau, việc định tuyến và cân bằng lưu lượng truy cập dễ dàng hơn khi bạn cần tăng băng thông của dịch vụ. Nó cũng cho phép bạn triển khai thực hiện front-end với sự trợ giúp của bất kỳ công nghệ hoặc framework nào khác và đặt nó trên miền gốc project-name.work. Ví dụ: khi khách hàng muốn đặt đích cho ứng dụng dành cho thiết bị di động trên miền gốc. Việc kết thúc có thể được phát triển bởi một nhóm khác mà không có sự tham gia của bạn. Và sau đó dự án Symfony của bạn chỉ sẽ được tách ra từ việc định tuyến tên miền gốc và sẽ chỉ chia sẻ với các tên miền phụ có liên quan.

Cách tùy chỉnh Project với Subdomains cho Docker

Để tùy chỉnh dự án trong Symfony cho Docker, bạn cần một số cấu hình bổ sung. Trong Docker, bạn có thể tạo định tuyến dựa trên các cổng khác nhau, nhưng bạn không thể áp dụng định tuyến từ gói cho các tên miền phụ vì theo mặc định, Docker hoạt động trong phạm vi của một máy chủ.

Với Symfony, có một vấn đề khác: nó không hỗ trợ định tuyến bằng port, nhưng nó hỗ trợ định tuyến phụ. Đó là, cho đến nay, bạn không thể thiết lập Symfony để nó gọi điều này hoặc bộ điều khiển phụ thuộc vào cổng. Và triển khai tùy chọn hỗ trợ này không được mong đợi trong tương lai gần (bạn có thể đăng ký về vấn đề này để theo dõi tất cả các sửa đổi: có thể, họ sẽ quay lại một số điểm của tính năng này).

Từ hai tùy chọn: tùy chỉnh Symfony Router component hoặc thêm hỗ trợ cho các tên miền phụ trong Docker, sau này dễ dàng hơn và nó đã có sẵn một cài đặt sẵn sàng.

Lưu ý: Nó có thể được áp dụng chỉ trong môi trường phát triển cục bộ cho Docker và nó không phải là một giải pháp phổ quát có thể được sử dụng trong thực tế.

Để thêm sự hỗ trợ subdomain trong Docker, bạn cần phải thêm một container dựa trên image jwilder/nginx-proxy và cấu hình cho nó trong file Docker-compose.yml . Hãy xem ví dụ về một phần của cấu hình docker-compose.yml cho hai container: nginxnginx-proxy . Rõ ràng, sẽ có các container khác ngoài những thứ này trong dự án của bạn. Trong ví dụ này, jekakm/nginx-core:201802261 là image của chúng tôi mà chúng tôi sử dụng để phát triển.

docker-compose.yml

version: '2'
services:
    nginx_proxy:
        image: jwilder/nginx-proxy
        ports:
            - "80:80"
        volumes:
            - /var/run/docker.sock:/tmp/docker.sock:ro
 
    nginx:
        image: jekakm/nginx-core:201802261
         environment:
            - "VIRTUAL_HOST=hub.project-name.work,admin.project-name.work,api.project-name.work"
        volumes:
            - "./docker-configs/nginx.conf:/etc/nginx/sites-enabled/default"
            - ".:/app:cached"
        expose:
            - 80
        depends_on:
            - "php"

nginx_proxy sẽ nghe port 80 và đi qua nó vào Docker. Ngoài ra, biến môi trường VIRTUAL_HOST được thêm vào nginx container. Trong đó, phân cách bằng dấu phẩy, bạn cần phải đề cập đến tất cả các máy chủ (có tên miền phụ và không có) nên được proxy vào nginx container. Thông qua proxy này, Symfony sẽ nhận được các yêu cầu từ các host đã được đề cập mà không sửa đổi, và nó sẽ có thể, theo các quy tắc định tuyến, để xác định bộ điều khiển nào sẽ xử lý yêu cầu dựa trên các tên miền phụ.

Ví dụ nhanh về định tuyến Symfony dựa trên miền phụ

easy_admin_bundle:
    resource: "@EasyAdminBundle/Controller/AdminController.php"
    type: annotation
    host: "%admin_host%" # <-- admin panel host
 
api_fos_oauth_server_token:
    resource: "@FOSOAuthServerBundle/Resources/config/routing/token.xml"
    host: "%api_host%" <--  API host
    methods: POST #
 
api:
    resource: ../src/Controller/API
    type: annotation
    host: "%api_host%" <-- API host
    prefix: /v1.0
 
hub:
    resource: ../src/Controller/Hub
    type: annotation
    host: "%hub_host%" <-- host for all "frontend features"
 
admin:
    resource: ../src/Controller/Admin
    type: annotation
    host: "%admin_host%" <-- host for admin panel, the processing of all custom actions which were implemented from the admin panel  
admin_logout:
    path: /logout
    host: "%admin_host%"

Trong cấu hình cho nginx container, có cấu hình máy chủ ./docker-configs/nginx.conf được thay thế vào container. Trong cấu hình này, tham số SERVER_NAME có giá trị tên dự án-docker. Nó quan trọng là vì giá trị này sau này sẽ được sử dụng để thiết lập XDebug trong PhpStorm (chúng tôi sẽ trình bày vấn đề này sau). Tôi cũng đưa ra ví dụ về một cấu hình đầy đủ cho máy chủ nginx để có thể kiểm tra sự khác biệt nếu cần thiết.

Chú ý! Cấu hình được trình bày dành cho Symfony 4 và các phiên bản mới hơn vì nó sử dụng đường dẫn public/index.php đến frontend controller:

server {
        gzip            	on;
        gzip_types      	text/plain text/css application/x-javascript text/xml application/xml application/rss+xml text/javascript image/x-icon application/json;
        gzip_min_length     1000;
        gzip_comp_level     6;
        gzip_http_version   1.0;
        gzip_vary       	on;
        gzip_proxied    	expired no-cache no-store private auth;
        gzip_disable    	msie6;
 
        listen 80;
 
        client_max_body_size 50M;
 
        root /app/public;
 
        rewrite ^/index\.php/?(.*)$ /$1 permanent;
 
        location / {
                index index.php;
                try_files $uri @rewriteapp;
        }
 
        location @rewriteapp {
                rewrite ^(.*)$ /index.php/$1 last;
        }
 
        location ~ ^/(index|config)\.php(/|$) {
                fastcgi_pass   php:9001;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param  SERVER_NAME    	project-name-docker;
                fastcgi_param  SCRIPT_FILENAME	$document_root$fastcgi_script_name;
                fastcgi_param  HTTPS          	off;
        }
 
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|htc)$ {
                expires 	31d;
                add_header  Cache-Control private;
 
                error_page 404 = @rewriteapp;
        }
 
        location ~* \.(css|js)$ {
                expires 	7d;
                add_header  Cache-Control private;
        }

Sau khi bạn đã thêm một container nginx-proxy vào tệp docker-compose.yml , đừng quên build các container mới và khởi động lại các container đang chạy.

$ docker-compose build
$ docker-compose down && docker-compose up -d

Thêm điều hướng

Điều cuối cùng bạn cần làm là thêm điều hướng cho máy chủ cục bộ của mình để các máy chủ bạn sử dụng (hoặc máy chủ có tên miền phụ) chuyển hướng đến máy chủ cục bộ. Bạn có thể làm điều đó bằng cách chỉnh editing /etc/hosts và thêm các dòng sau vào nó:

127.0.0.1   api.project-name.work
127.0.0.1   hub.project-name.work
127.0.0.1   admin.project-name.work

Hoặc bạn có thể sử dụng tiện ích dnsmasq và cấu hình một quy tắc chung trong nó. Ví dụ: nếu bạn sử dụng  tên miền .work cho máy chủ cục bộ, nó được định cấu hình theo quy tắc sau:

address = /. work / 127.0.0.1

Việc thêm các điều hướng cho các máy chủ ảo cục bộ là xa từ những gì được coi là thực hành tốt nhất Docker (cụ thể là khi bạn triển khai môi trường làm việc mà không có bất kỳ lệnh bổ sung nào cho máy cục bộ). Nhưng thật không may, không có giải pháp nào khác cho vấn đề này đối với các miền phụ Symfony trong Docker. Và đây là một giải pháp thỏa hiệp. Nó vẫn còn tốt hơn để sử dụng tiện ích dnsmasq để thiết lập một quy tắc chung cho máy cục bộ.

Để PhpStorm thiết lập kết nối XDebug, bạn cần thêm máy chủ cục bộ vào PHP->Servers configuration:

Để PhpStorm thiết lập kết nối XDebug, bạn cần thêm máy chủ cục bộ vào PHP->Servers configuration

  Sử dụng Docker (và cả Docker Compose) cho dự án Django

Tên của máy chủ phải giống với giá trị của tùy chọn SERVER_NAME từ nginx. Trong trường hợp của chúng ta, nó là project-name-docker.

Vì thế,

Chúng tôi đã thực hành cách thiết lập dự án trong Symfony để làm việc với các tên miền phụ Docker. Hy vọng bài viết sẽ hữu ích cho bạn.

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

9 công cụ siêu tiện lợi cho cả Developer và Designer

9 công cụ siêu tiện lợi cho cả Developer và Designer

Tiếp nối sự thành công của bài viết 30 tiện ích Chrome cho designer và developer, chúng ta sẽ lại tiếp tục điểm qua những công cụ tiện dụng có thể giúp ích rất nhiều cho công việc thiết kế và lập trình của bạn.


Atom

Atom là text editor nguồn mở do Github phát triển. Hỗ trợ nhiều tính năng toàn diện, nổi bật là package manager built-in, auto-completion thông minh, và theme siêu đẹp.

Được phát triển từ Sublime, package manager chính là một làn gió mới. Với Atom, Bạn có thể dùng APM hoặc giao diện GUI. Chả cần phải điều chỉnh file config cứ thích thì dùng thôi.

Thông tin thêm về vấn đề hiệu năng. Khi mới ra mắt, Atom chậm như sên, nhưng giờ lại trái ngược hoàn toàn, chỉ bị chậm khi mở file quá mức lớn mà thôi.


DragDis

Là designer, tôi phải luôn luôn tìm nguồn cảm hứng. DragDis là công cụ cho phép tôi lưu lại bất kỳ nguồn cảm hứng nào mình tìm được. Dễ dùng lắm, chỉ việc cài đặt tiện ích mở rộng Chrome và bắt đầu thả kéo thôi.

DragDis folder của tôi được sắp xếp theo tuần. Mỗi tuần tôi sẽ tạo một inspiration folder mới. Đây là một cách rất hay để theo dõi sự thay đổi trong “thị hiếu nghệ thuật” của bản thân.

DragDis còn có giao diện grid full-page, cơ sở tuyệt vời cho moodboards.


iTerm 2

iTerm là công cụ thay thế đẹp cho Terminal. iTerm 2 có rất nhiều tính năng hay, có thể kể đến split panels không giới hạn, hình ảnh nội dòng, và search. Tuy Terminal có nhiều tính tương tự, nhưng iTerm 2 vẫn đang liên tục cải tiến.


Muzli

Muzli là tiện ích mở rộng cho Chrome giúp tổng hợp các nội dung liên quan đến thiết kế từ các nguồn nổi tiếng: Designer News, Dribbble, Behance,…

Mỗi lần mở tab mới trong Chrome, Muzli sẽ liệt kế những nội dung hay cho từng site.

Một tính năng rất hay nữa là phần staff picks. Giống như bạn có một người trợ lý giúp bạn ghi lại những bài viết hay nhất vậy.


Noiz.io

Với công việc phụ thuộc nhiều vào cảm hứng, người ta thường tìm đến các quán cà phê yên tĩnh cùng không gian nghệ thuật. Noizio sẽ giúp bạn mang không gian này về nhà, bạn có thể chọn một loạt background noise đa dạng như October Rain, Coffee House, Thunderstorm, và Sea Waves. Rất phù hợp để bạn tập trung vào công việc.


Invision

Invision là nền tảng cho workflow và prototyping, môi trường cộng tác hoàn hảo giữa front-ends và designers. Designers có thể upload một loạt màn hình lên một project, sau đó ta lại có thể hot link screens với nhau.

Phần tô xanh là các khi vực được hot linked. Nếu chạm hay click lên đó, bạn sẽ được chuyển đến screen tiếp theo. Đây là một cách rất hay để lập trình viên hướng dẫn clients và developers khi cần thiết. Công cụ cũng tỏ ra rất hữu ích khi thực hiện một số hoạt động test định tính sơ bộ với người dùng.

Invision cũng vừa mới ra mắt tính năng mang lên Boards. Boards cho phép bạn thu thập nguồn cảm hứng và xây dựng moodboards. Khác biệt lớn nhất giữa công cụ này với với DragDis là các Boards cho phép cộng tác làm việc với các thành viên khác.


What the Font

Typography là một phần rất quan trọng trong thiết kế. Bởi lẽ này, What the Font là một trong những chrome extension tôi thích nhất. Công cụ giúp bạn biết được site đó đang dùng loại font gì chỉ qua việc point và click.


Postman

Trong quá trình làm front end developer của mình, chúng tôi thường phải query API hoặc tương tác với API của chính mình. Postman chính là công cụ tiện lợi giúp bạn thực hiện request đến API.

Hãy tưởng tượng phải làm việc với API endpoint. Thay vì phải viết một query front-end tương ứng hay request cURL, Postman có thể trực tiếp query endpoint.


Wappalyzer

Wappalyzer là công cụ giúp bạn xác định một site đang sử dụng thư viện và framework nào. Công cụ có thể được sử dụng ở dạng Chrome extension và là một trong những trợ thủ cực kỳ đắc lực cho front-end developer.

30 tiện ích Chrome (extensions) cho Designer và Developer

30 tiện ích Chrome (extensions) cho Designer và Developer

Với tốc độ ưu việt và nhiều developer tool built-in, Chrome dần phổ biến hơn trong giới designer và developer bên cạnh Firefox. Và cũng chính vì lý do này, số lượng tiện ích Chrome đang gia tăng ngày càng chóng mặt.

1. CSS-Shack

Công cụ mạnh mẽ này cho phép bạn design thoải mái, và suất thành file CSS dùng được ngay cho web. CSS shack có hỗ trợ layer và hầu hết các tính năng thường thấy của một photo editor.

  CSS là gì?

2. Marmoset

Với tiện ích này, bạn có thể xuất code snapshots đẹp lung linh để đưa vào demo và mockup. Bạn cũng có thể thêm theme và nhiều hiệu ứng hình ảnh cho promo và portfolio online.

3. iMacros for Chrome

Với một web developer, công việc test có thể sẽ lặp đi lặp lại rất nhàm chán. Đây chính là cứu tinh của bạn, iMacros sẽ ghi lại và lưu thao tác của bạn. Những công việc lặp lại dài lê thê giờ đây chỉ cần được thực hiện một lần duy nhất. Chỉ với một cú click chuột, bạn có thể test page bao nhiêu lần cũng được.

4. Font Playground

Một tiện ích hoàn hảo cho (web) designer và developer. Với Font Playground, bạn có thể “đùa nghịch” thỏa thích với các font bạn hiện có và thư viện Google font đồ sộ. Font sẽ được áp thẳng lên web mà không cần phải thao tác phức tạp. Không chỉ đơn thuần áp font, tiện ích còn cho phép bạn thử nghiệm thay đổi weight, style và effect tùy thích.

5. Window Resizer

Tiện ích làm việc đúng như tên, resize lại cửa sổ trình duyệt, từ đó giúp bạn theo dõi design của mình chuẩn xác hơn. Bạn có thể chọn từ một danh sách chuẩn màn hình phổ biến có sẵn, hoặc theo thiết lập tùy chỉnh.

6. Project Naptha

Nhờ vào công nghệ OCR thông minh, tiện ích cho phép người dùng highlight, copy, paste, và thậm chí dịch text ra từ ảnh.

7. What Font

What Font giúp developer và designer xác định font dùng cho một web nhất định. Vì vậy, nếu bạn hay thi thoảng bắt gặp vài font đẹp hay ho mà muốn “tái sử dụng”, bạn chỉ cần hơ chuột vào text để biết được.

8. Yslow

Công cụ không chỉ kiểm tra tốc độ load của web, mà còn cho biết lý do web chạy chậm, nếu có. Yslow sẽ kiểm tra đối chiếu với 23 trong số 34 quy luật của Yahoo’s performance team. Đây cũng là công cụ phân tích và tối ưu web vô cùng hiệu quả.

9. Web Developer

“Không dùng cái này thì dev sống sao đây.” Tiện ích thêm hẳn một toolbar vào Chrom với nhiều công cụ lập trình mạnh mẽ.

  Web Developer là gì? Lộ trình để trở thành Web Developer

10. Page Ruler

Page ruler là công cụ đo lường các thành phần trên web “chuẩn từng li”, bạn chỉ việc đặt thước và lấy thông tin của thành phần đó.

11. Web Developer checklist

Công cụ này sẽ kiểm tra web của bạn từ trên xuống dưới (tất nhiên chỉ khi web của bạn là theo chuẩn) về mọi mặt: SEO, khả năng khả dụng, khả năng truy cập, tốc độ,… Ví dụ như, nếu bạn thiếu tag H1 trên page hoặc page thiếu meta title hay meta description, công cụ sẽ thông báo bạn ngay. Nếu bạn click vào link  ‘more info and help’ ở cuối tiện ích, bạn sẽ thấy checklist chi tiết hơn.

12. DevTools Autosave

DevTools AutoSave cho phép tự động lưu bất cứ thay đổi của trang CSS và JS thông qua môi trường Chrome Dev Tools vào file nguồn. Công cụ rất dễ thiết đặt và sử dụng.

13. Instant Wireframe

Biến bất cứ web nào thành wireframe chỉ với một cú click chuột. Bạn giờ đây có thể kiểm tra web, local lẫn live, qua wireframe nhanh chóng.

14. ColorZilla

Tiện ích ColorZillar là một tập hợp eyedropper (đo màu), colour picker(bảng màu), gradient generator (đổ bóng) cùng nhiều công cụ khác cho công việc design.

15. Ripple Emulator

Ripple Emulator là một công cụ giả lập môi trường mobile đa nền tảng giúp test ứng dụng web trên một số thiết bị và màn hình hiển thị. Rippe có thể kết hợp với các công cụ lập trình hiện có để thực hiện debug, kiểm tra DOM và test tự động.

16. Streak

Streak là công cụ quản lý CRM mạnh mẽ có hỗ trợ email trong Gmail. Công cụ biến một hoặc một loạt email thành ticket dễ theo dõi, quãn lý và chia sẻ.

17. Search Stackoverflow

Nếu đã là web developer, chắc hẳn bạn đã nghe qua về Stack Overflow, địa chỉ phải đến khi vấp phải bất cứ vấn đề lập trình nào. Nếu chưa nghe qua, bạn nên vào xem thử ngay đi, cộng đồng Stack Overflow đang phát triển mạnh mẽ với một loạt chủ đề đa dạng từ C#, Java đến PHP và jQuery. Tiện ích này sẽ thêm một search box trực tiếp lên trình duyệt giúp bạn tìm kiếm kho kiến thức khổng lồ của Stack Overflow mọi lúc, mọi nơi.

  Một số mẹo vặt dành cho Developer trên Chrome

18. PHP Ninja Manual

Việc nhớ hết tất cả các hàm gần như là không thể, và đây là công cụ giúp bạn giải quyết vấn đề này. The PHP Ninja Manual là kho tài liệu PHP 5.5 kèm theo ví dụ (của 8 loại ngôn ngữ) ngay trên trình duyệt.

19. PerfectPixel

Design rất bực mình khi thấy sản phẩm sau code lại không đẹp “choáng váng” như thiết kế của mình. Perfect pixel thực sự là công cụ hỗ trợ hay cho các designer đang phát triển web đúng theo như thiết kế. Tiện ích sẽ đặt một hình ảnh mờ chồng lên web như hình, đồng thời so sánh giữa hai ảnh để đảm bảo độ chính xác đến từng pixel.

20. Code Cola

Bên cạnh khả năng hiển thị mã nguồn của đối tượng, công cụ còn một CSS editor cho phép bạn chỉnh sửa CSS style và xem kết quả tại chỗ.

21. Chrome Sniffer

Tiện ích này giúp kiểm tra, xác địch thư viện JavaScript và ứng dụng đang chạy trên web. Cách sử dụng không thể dễ hơn được nữa: một icon sẽ xuất hiện trên thanh địa chỉ cho thấy phiên bản CMS và framework được sử dụng.

22. User Agent Switcher

Một công cụ hay nếu muốn thấy giao diện của web trên nhiều thiết bị truy cập khác nhau như: iPad, iPhone, Android,…

23. IE tab

IE tab là một trong những giả lập IE hàng đầu hiện nay. Cộng cụ giúp developer test page cho nhiều phiên bản IE trực tiếp trên trình duyệt Chrome.

24. PicMonkey

Một tiện ích photor editor cho phép bạn chỉnh sửa hành ảnh và screenshots của web. Nhưng đây chưa phải là tính năng làm ứng dụng nổi tiếng. PicMonkey cho phép bạn tải tất cả hình ảnh và screenshot của cả một trang web trong một cú click chuột. Khi đã lựa chọn một hình ảnh, bạn có thể điều chỉnh tùy thích từ thêm hiệu ứng đến phơi sáng,…

25. Chrome Daltonize

Colour Vision Deficiency (CVD) – khiếm khuyết về thị giác hoặc mù màu đang gây nhiều vấn đề cho hàng triệu người trên thế giới. Tiện ích này sử dụng daltonization, một công cụ cho phép tạo ảnh phù hợp hơn cho người có CVD. Công cụ này sẽ tái thể hiện hình ảnh theo cách nhìn của người có CDV, giúp bạn điều chỉnh thiết kế phù hợp hơn.

26. Appspector

Tiện ích giúp developer kiểm tra thư viện javascript và ứng dụng web. Một icon sẽ hiện trên thanh địa chỉ hiển thị framework được kiểm tra. Tiện ích có khả năng xác định đến hơn 100 thư viên CSS và JS.

27. Check My Links

Bạn đã build xong page? Vậy bạn đã kiểm tra lại đường dẫn chưa? Dù bạn có cẩn thận đến mức nào, bạn sẽ không cách nào đảm bảo được tất cả các link, và kiểm tra lại từng cái một là một công việc kinh khủng. Với Check My Links , bạn chỉ việc chạy tiện ích và ngồi chờ.

28. Flickr Tab

Bạn có phát chán trước những phông tab Chrome đơn điệu? Với, Flickr Tab bạn sẽ không còn chán nữa.

Tiện ích gọn nhẹ này sẽ hiển thị một hình ảnh Flickr nổi tiếng mỗi khi bạn mở một cửa sổ mới. bạn có thể click vào ảnh để xem trên Flickr hoặc username để xem thêm ảnh của người dùng đó.

29. Google Art Project

Nếu bạn không thích thú với Flickr Tab và những hình ảnh màu mè. Bạn có thể sẽ thích Google’s Art Project.

Với mỗi tab mới mở, bạn sẽ được chiêm ngưỡng những kiệt tác phân giải cao từ Van Gogh hay Monet. Nếu bạn muốn tìm hiểu thêm, chỉ việc click vào ảnh và bạn sẽ được dẫn đến website Google Cultural Institute với đầy đủ thông tin của tác phẩm và họa sĩ.

30. Data Saver (Beta)

Data Saver, sẽ giảm lượng dữ liệu tiêu thụ khi duyệt web. khi kích hoạt, Chrome sẽ dùng máy chủ Google nén trang web trước khi bạn tải trang. Tuy nhiên vẫn có hạn chế: các trang SSL và ẩn danh sẽ không được hỗ trợ.

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

Truy cập ngay các công việc IT đãi ngộ tốt trên TopDev

Roadmap Frontend Developer – “Con đường tắt” để trở thành cao thủ Frontend Developer

roadmap front end

Dưới đây là roadmap hiển thị những bước cần thiết để bạn có thể học và trở thành một Frontend Developer thực thụ từ con số không

Bước học nền cơ bản
Nền tảng cơ bản đầu tiên mà bạn phải học qua

Đi sâu hơn với framework và library

Đi sâu vào framework

Sau một chặng đường, bạn đã là 75% Frontend Developer

Chặng cuối roadmap frontend developer

Chặng đường cuối cùng nhưng vẫn còn rất nhiều thứ để bạn có thể phát triểnTiếp tục khám phá

Xem thêm: Roadmap cho các Backend Developer

TopDev via kamranahmedse

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

Học ngay Javascript đi vì nó vẫn sẽ là ngôn ngữ phổ biến nhất 2024

Javascript-hackerrank

Theo một báo cáo gần đây của HackerRank cho thấy JS (Javascript) vẫn là ngôn ngữ phổ biết nhất trong năm 2024. Tuy nhiên GO vẫn là ngôn ngữ được học nhiều nhất. Thống kê cũng chỉ ra AngularJS là framework phổ biến nhất, tuy nhiên thống kê này còn bao gồm cả Angular và AngularJS. VueJS có vẻ thành công trên mặt trận truyền thông nhưng thực tế vẫn kém hấp dẫn hơn so với ReactJS

Javascript vẫn sẽ là ngôn ngữ lập trình mạnh nhất 

Một khảo sát chi tiết từ hơn 100,000 lập trình viên trên thế giới đã chỉ ra rằng, Javascript hiện vẫn đang chiếm một phần quan trọng trên thị trường lập trình thế giới. Dù rất phổ biến, nhưng Javascript ít được phổ biến rộng rãi trong các chương trình đạo tạo chính quy ở các trường đại học trên thế giới.

Ngoài ra, Angular JS và các framework khác cũng vẫn đang nắm thế dẫn đầu trong làng sóng công nghệ năm nay, như React JS và Vue JS. Để có được lợi thế cũng như cơ hội việc làm tốt, các lập trình viên cần nghiên cứu thêm những framework này. Hệ sinh thái của JS đã thật sự trở nên ngày càng vững mạnh hơn.

Xem thêm: 6 thư viện Javascript tốt nhất cho người dùng

Hiện nay, ngoài Python là một công nghệ và ngôn ngữ hấp dẫn nhất cho năm 2022, được nhiều không ít người hướng tới, thì IOT và deep learning cũng đang là một công nghệ mà các lập trình viên cũng như các doanh nghiệp cho là khả dụng và thực tế nhất để có thể theo đuổi. Nhiều chuyên gia dự đoán IOT sẽ là một mũi nhọn không thể thiếu của các công ty công nghệ trong thời gian tới.

Các bạn có thể tham khảo và xem đầy đủ báo cáo của hacker rank, tại đây

Xem thêm các vị trí Tuyển dụng Javascript lương cao mới nhất

5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin

Trong năm 2018, chúng ta đã chứng kiến ngôn ngữ Kotlin ngày càng trở nên phổ biến hơn bao giờ hết. Nó được sử dụng rộng rãi không chỉ trong phát triển ứng dụng di động, mà còn cho các hệ thống server. Như bạn đã biết, Kotlin là một ngôn ngữ lập trình statically-typed trên JVM. Đó là lý do tại sao nó thường được so sánh với ngôn ngữ Java.

Có thể nói, một trong những lý do chính cho sự phổ biến của Kotlin là ở sự đơn giản. Nó thật sự rất tinh gọn và loại bỏ những phần thừa thãi từ Java. Tuy nhiên, Kotlin vẫn cũng  rất giống với Java để bất kỳ nhà phát triển Java có kinh nghiệm nào đều có thể làm quen với Kotlin chỉ trong vài giờ.

Trong bài viết này, tôi sẽ thảo luận về một số tính năng thú vị của Kotlin được sử dụng để phát triển phía server so với Java. Xin lưu ý rằng đây là danh sách cá nhân của tôi về các tính năng yêu thích của Kotlin mà Java không hề có.

Giải quyết vấn đề với mà Java thường gặp phải với các Collections

Tôi thực sự thích Java, nhưng đôi khi phải làm việc với các collection chung chung có thể là một trải nghiệm vô cùng khó chịu, đặc biệt nếu bạn phải sử dụng các loại type lạ. Tin tốt là Kotlin không có bất kỳ loại type nào như vậy. Thay vào đó, nó cung cấp hai tính năng khác được gọi là declaration-site variance và type projection. Bây giờ, hãy xem xét hệ thống phân cấp class sau:

abstract class Vehicle {
}
class Truck extends Vehicle {
}
class PassengerCar extends Vehicle {
}

Tôi defined một repository có chứa mọi objects với một type được cho trước

public class Repository<T> {
  List<T> l = new ArrayList();
  public void addAll(List<T> l) {
    l.addAll(l);
  }
  public void add(T t) {
    l.add(t);
  }
}

Bây giờ, tôi muốn lưu trữ tất cả các vehicle trong repository đó, vì vậy tôi khai báo   Repository r = new Repository().  Tuy nhiên, khi gọi phương thức repository  addAll với List a là một tham số sẽ nhận được lỗi sau:

Ngay cả khi bạn thay đổi khai báo `addAll` bên trong `Repository`, bạn vẫn sẽ nhận được lỗi sau:

Tất nhiên, tình huống này có một lời giải thích hợp lý. Đầu tiên, các kiểu type chung trong Java là bất biến, nói cách khác,  List không phải là một subtype của  List , mặc dù  Truck  là một subtype của f Vehicle. Phương thức addAll  sẽ dựa vào type được cho và mở rộng T làm tham số, qua đó nó chấp nhận một tập hợp các objects của T hoặc một số subtype của T – chứ không chỉ T

List  là một subtype của List<? extends Vehicle>,nhưng list bạn nhắm tới thì vẫn là  List . Tôi không muốn đi vào chi tiết về vấn đề này – Điều quan trọng đối là ta biết được Kotlin giải quyết vấn đề này bằng cách sử dụng một tính năng được gọi là Declaration-site variance. Nếu chúng ta thêm phần `out` modifier vào tham số  MutableList  bên trong khai báo phương thức addAll , trình biên dịch sẽ cho phép thêm một danh sách các objects  Truck

class Repository<T> {
    var l: MutableList<T> = ArrayList()
    fun addAll(objects: MutableList<out T>) {
        l.addAll(objects)
    }
    fun add(o: T) {
        l.add(o)
    }
}
fun main(args: Array) {
    val r = Repository<Vehicle>()
    var l1: MutableList<Truck> = ArrayList()
    l1.add(Truck())
    r.addAll(l1)
    println("${r.l.size}")
}
  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
Ebook Kotlin for Android Developers”]

Data Classes

Bạn có thể biết các POJO của Java (Plain Old Java Object – các object Java cũ và nhàm chán). Nếu bạn đang theo các thực hành tốt nhất của Java, một class như vậy nên thực hiện các phương thức getters, setters,  hashCode, và  equals , cũng như  toString  cho các nhu cầu cho log. Việc triển khai như vậy có thể chiếm nhiều không gian dữ liệu, ngay cả đối với một lớp đơn giản chỉ có bốn field như dưới đây (các phương thức được tạo tự động bằng cách sử dụng IDE Eclipse):

public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private int age;
  public Person(Integer id, String firstName, String lastName) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
    result = prime * result + ((id == null) ? 0 : id.hashCode());
    result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Person other = (Person) obj;
    if (firstName == null) {
      if (other.firstName != null)
        return false;
    } else if (!firstName.equals(other.firstName))
      return false;
    if (id == null) {
      if (other.id != null)
        return false;
    } else if (!id.equals(other.id))
      return false;
    if (lastName == null) {
      if (other.lastName != null)
        return false;
    } else if (!lastName.equals(other.lastName))
      return false;
    return true;
  }
  @Override
  public String toString() {
    return "Person [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
  }
}

Để tránh nhiều dòng mã bổ sung bên trong các lớp POJO, ta có thể sử dụng project Lombok. Nó cung cấp một tập các chú thích có thể được sử dụng trên class để phân phối và triển khai các phương thức getters / setters, equals,  và hashCode . Ngoài ra, bạn cũng có thể chú thích class của mình bằng  @Data, bao gồm tất cả các tính năng của  @ToString@EqualsAndHashCode@Getter/@Setter,  @RequiredArgsConstructor cùng nhau. Vì vậy, với @Data,  của Lombok, POJO sẽ trông giống như hình dưới đây:

@Data
public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private int age;
}

Việc bao gồm và sử dụng Lombok với một ứng dụng Java thật ra khá đơn giản và được hỗ trợ bởi tất cả các IDE của các nhà phát triển chính, nhưng Kotlin giải quyết vấn đề này một cách sáng tạo hơn. Nó cung cấp một tính năng gọi là data classes, được kích hoạt sau khi thêm  keyword  data vào định nghĩa class. Trình biên dịch sẽ tự động lấy ra các phương thức từ tất cả các properties được khai báo trong hàm khởi tạo chính:

  • Phương thứctoString()
  • Các hàm componentN() tương ứng với các properties theo thứ tự khai báo của chúng
  • Hàm copy()

Vì Kotlin tạo getter và setter mặc định cho các thuộc tính có thể thay đổi (được khai báo là  var)  và getter cho các thuộc tính chỉ đọc (được khai báo là  var), việc thực hiện tương tự  Person Java POJO trong Kotlin sẽ giống như hình dưới đây.

data class Person(val firstName: String, val lastName: String, val id: Int) {
    var age: Int = 0
}

Điều đáng nói ở đây là trình biên dịch chỉ sử dụng các thuộc tính được định nghĩa bên trong hàm chính cho các hàm được tạo tự động. Vì vậy, trường  age, vốn được khai báo bên trong phần thân của class, sẽ không được sử dụng bởi  toStringequalshashCode, và copy

Tìm Java job lương cao trên TopDev ngay!

Đặt tên cho một số phương pháp Test

Bây giờ, chúng ta hãy thực hiện một số test thử nghiệm để chứng minh rằng các tính năng hoạt động đúng cách. Ba bài kiểm tra sau đây so sánh hai object với các giá trị khác nhau của property  age, cố gắng thêm cùng một object vào Java  HashSet hai lần và kiểm tra xem phương thức  componentN của data class có trả về các properties theo đúng thứ tự hay không.

@Test fun `Test person equality excluding "age" property`() {
  val person = Person("John", "Smith", 1)
  person.age = 35
  val person2 = Person("John", "Smith", 1)
  person2.age = 45
  Assert.assertEquals(person, person2)
}
@Test fun `Test person componentN method for properties`() {
  val person = Person("John", "Smith", 1)
  Assert.assertEquals("John", person.component1())
  Assert.assertEquals("Smith", person.component2())
  Assert.assertEquals(1, person.component3())
}
@Test fun `Test adding and getting person from a Set`() {
  val s = HashSet()
  val person = Person("John", "Smith", 1)
  var added = s.add(person)
  Assert.assertTrue(added)
  added = s.add(person)
  Assert.assertFalse(added)
}

Như bạn có thể thấy trên đoạn mã trên, Kotlin chấp nhận sử dụng các tên phương thức với những khoảng trống được bao quanh trong các dấu gạch chéo ngược. Nhờ đó, tôi có thể lập ra tên khá đầy đủ và chi tiết cho các test để giúp bạn biết rõ chuyện gì đang xảy ra.

Extensions

Hãy xem xét tình huống mà chúng ta có một thư viện chứa các định nghĩa class, vốn không thể thay đổi được, và chúng ta cần thêm một số phương thức. Trong Java, chúng ta có một số lựa chọn để thực hiện điều đấy. Chúng ta chỉ có thể mở rộng lớp hiện có, thực hiện một phương thức mới, hoặc, ví dụ, thực hiện nó với Decorator pattern.

Bây giờ, chúng ta hãy giả định rằng chúng ta có lớp Java sau đây có chứa danh sách những người tham gia sự kiện với getters / setters.

public class Organization {
  private List<Person> persons;
  public List<Person> getPersons() {
    return persons;
  }
  public void setPersons(List<Person> persons) {
    this.persons = persons;
  }
}

Nếu bạn muốn có phương thức để thêm một đối tượng  Person đơn vào danh sách, ta sẽ phải mở rộng Organization  và thực hiện một phương thức mới ở đó.

public class OrganizationExt extends Organization {
  public void addPerson(Person person) {
    getPersons().add(person);
  }
}

Kotlin cung cấp khả năng mở rộng một class với một chức năng mới mà không cần phải kế thừa từ class cơ sở. Điều này được thực hiện thông qua các khai báo đặc biệt với tên gọi là extensions. Đây là khai báo tương tự với Java class Organization Java  trong Kotlin. Bởi vì Kotlin xem một class  List đơn giản là không thể thay đổi, chúng ta sẽ cần định nghĩa  MutableList.

class Organization(val persons: MutableList = ArrayList()) {
}

Bạn có thể dễ dàng mở rộng nó bằng phương thức  addPerson như hình dưới đây. Các phần mở rộng được giải quyết triệt để và chúng không hề sửa đổi các class mở rộng.

class OrganizationTest {
    fun Organization.addPerson(person: Person) {
        persons.add(person)
    }
    @Test
    fun testExtension() {
        val organization = Organization()
        organization.addPerson(Person("John", "Smith", 1))
        Assert.assertTrue(organization.persons.size == 1)
    }
}

String Templates

Sau đây là một điều nho nhỏ sẽ làm bạn khá vui  mà Java không hề có

println("Organization ${organization.name} with ${organization.persons.size} persons")
  Kotlin - Phiên bản nâng cấp của Java

TopDev via dzone

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

Top 8 công cụ thiết kế web và page cho năm 2024

Nếu bạn chưa có sẵn một list tổng hợp, việc tìm kiếm những website hay công cụ thiết kế web tốt nhất có thể tốn rất nhiều thời gian. Hiện nay có khá nhiều giải pháp phần mềm ” tạm được nhưng không phải thứ tôi cần ” đầy rẫy trên thị trường. Ngoài ra, giá cả cũng có thể là một trở ngại với bạn.

100++ cơ hội lập trình Web với offer cực cao

Vì vậy, chúng tôi đã tạo ra danh sách những công cụ thiết kế website và page tốt nhất trên thị trường. Chúng tôi đã xem xét đến các yếu tố như sức mạnh, hiệu suất và giá cả.

Chúng tôi tin rằng: Bạn sẽ thích những thứ bạn đọc trong bài này.

  1. Mobirise Website Builder

Có nhiều điểm thú vị xoay quanh Mobirise Website Builder. Thứ nhất, nó miễn phí cho tất cả người dùng, cả mục đích cá nhân và thương mại. Cho dù bạn đang xây dựng một trang web cho riêng mình, cho doanh nghiệp của bạn, hoặc cho khách hàng, tất cả đều miễn phí; Bạn hoàn toàn có thể thiết kế theo sở thích của bạn và host nó ở bất cứ nơi nào bạn muốn.

Một điểm nổi bật khác là nó có hơn 800 website blocks và template theo xu hướng của thế giới, bao gồm một thư viện hình ảnh với lightbox, full-screen intro, video backgrounds và parallax scrolling để đặt tên.

Dĩ nhiên còn nhiều điểm thú vị nữa. Thiết kế web ở đây chỉ cần kéo và thả, không yêu cầu kĩ năng code, và bạn có quyền truy cập vào thư viện 7.000 biểu tượng, 100.000 hình ảnh miễn phí và 800 font chữ của Google. Vì các templates của Mobirise dựa trên AMP hoặc Bootstrap framework mới nhất của Google, bạn sẽ được trải nghiệm hiệu suất cực nhanh và có thể thao tác ngay trên điện thoại.

Tải phiên bản miễn phí của Mobirise cho Windows hoặc MacOS ngay. Ngoài ra còn có phiên bản premium.

2.Visual Composer Website Builder 

Mặc dù Visual Composer Builder được thiết kế bởi WPBakery, nó không giống công cụ WPBakery Builder. Hai công cụ thiết kế trang web trên khác nhau hoàn toàn, và độc lập với nhau.

Bạn có thể chọn phiên bản miễn phí hay Premium của Composer Builder. Chúng tôi khuyến khích bạn nên chọn phiên bản miễn phí trước tiên. Tất cả những việc bạn cần làm là vào trang web và tải xuống. Bạn sẽ hài lòng với các tính năng mà Builder cung cấp, cũng như hiệu suất của nó. Sau đó, bạn có thể quyết định xem bạn muốn chuyển và khi nào chuyển sang phiên bản Premium.

Trình thiết kế này không yêu cầu kĩ năng code. Nó tương thích với mọi theme của WordPress, bạn cũng có nhiều tùy chọn thiết kế và nhiều yếu tố khác nhau bao gồm các tiện ích và shortcodes của WordPress.

Hãy thử phiên bản miễn phí của Visual Composer. Bạn sẽ thích nó.

3. Portfoliobox

Nếu bạn quá chán nản với những ràng buộc của các chủ đề tiêu chuẩn, Portfoliobox sẽ cho phép bạn thiết kế theo bất kỳ phong cách nào với mọi trang web. Với Portfoliobox, bạn sẽ dễ dàng xây dựng được một trang web không giống của bất kỳ ai và nổi bật lên giữa đám đông. Bạn không cần phải biết code, và một dự án có thể hoàn thành trong vòng vài giờ.

Portfoliobox cũng cung cấp cho bạn tùy chọn phiên bản Free hoặc Pro. Công cụ thiết kế trang web này cũng có một tuỳ chọn đặc biệt dành cho sinh viên. Tài khoản sinh viên của Porfoliobox cung cấp tất cả các tính năng và templates của phiên bản Pro, với domain cá nhân có giá từ 19 USD / năm.

Phiên bản miễn phí cung cấp hosting cho 30 hình ảnh, 10 sản phẩm, và 10 pages. Bạn cũng có quyền truy cập vào bất kỳ template nào của phiên bản Pro trong 30 ngày. Phiên bản Pro cung cấp hosting cho 1000 hình ảnh, không giới hạn số lượng các page và sản phẩm, một domain cá nhân, tích hợp Easy Google, và được tùy chỉnh CSS / JS.

4. uKit 

uKit là một trình thiết kế web rất linh hoạt dành riêng cho các doanh nghiệp nhỏ. Có hơn 200 templates để bạn lựa chọn triển khai dự án. Bạn chỉ cần kéo và thả các yếu tố cùng nội dung vào từng trang là xong.

Khi xử lý tất cả các trang, bạn có thể hoàn tất dự án chỉ trong vài cú nhấp chuột.

5. Elementor Page Builder 

Elementor là một công cụ thiết kế page chỉ cần kéo và thả. WordPress plugin cho phép bạn thiết kế và xây dựng mọi thứ, mà lại hoàn toàn miễn phí!

Elementor có lẽ là cách dễ dàng nhất để tạo ra một trang web trên WordPress. Nền tảng này chỉnh sửa hình ảnh rất nhanh, trực quan và không yêu cầu kĩ năng coding. Thiết kế các trang pixel landing page với tính năng chỉnh sửa trên thiết bị di động sẽ nâng WordPress lên một tầm mới. Bạn cũng có thể truy cập vào thư viện template đồ sộ của Elementor và các tính năng độc đáo khác.

6. Themify Builder 

Themify Builder giúp bạn tạo layouts dễ dàng và thiết thực hơn. Trình thiết kế này cho phép bạn xem trước những thay đổi trực tiếp và tính năng styling cho phép bạn tùy chỉnh bố cục cho cả phiên bản máy tính để bàn và thiết bị di động.

Themify Builder hoạt động với bất kỳ theme nào và hầu hết các plugins.

7. Pixpa 

Nền tảng ” tất cả trong một ” Pixpa sẽ giúp bạn tiết kiệm thời gian và tiền bạc bởi bạn không phải sử dụng nhiều dịch vụ khác nhau. Giá cả rất phải chăng. Các themes thân thiện với điện thoại di động và các tính năng phong phú có trong cửa hàng eCommerce sẽ giúp bạn tạo ra các trang web và portfolio chuyên nghiệp một cách dễ dàng. Nhiếp ảnh gia, nghệ sỹ, và nhà thiết kế đều thích những thứ trình thiết kế này cung cấp.

Bạn có thể dùng thử Pixpa hoàn toàn miễn phí.

8. IM Creator 

Bạn có thể xây dựng trang web của riêng bạn ngay từ bây giờ mà không còn trở ngại nào – giả sử phương pháp Lego block hấp dẫn bạn. Phương pháp IM Creator dùng để thiết kế page bao gồm việc sử dụng các stripes có sẵn và polydoms. Bạn hoàn toàn có thể trộn, kết hợp và tùy chỉnh chúng theo ý bạn, sau đó thêm nội dung vào là xong.

Một giải pháp eCommerce cũng đi kèm theo gói của nền tảng này. IM Creator hoàn toàn miễn phí cho các nghệ sĩ, tổ chức phi lợi nhuận và sinh viên. Ngoài ra còn có thêm một phiên bản white label.

Phần kết luận

Khi hầu hết các sản phẩm đều miễn phí hoặc miễn phí với một số điều kiện nhất định, hãy xem xét và lựa chọn sản phẩm tốt nhất theo nhu cầu của bạn.

Một trong 8 sản phẩm này đều có thể làm cho ngày làm việc của bạn tuyệt vời hơn. Nền tảng nào cũng có thể đáp ứng nhu cầu và giúp bạn hoàn thành công việc nhanh hơn. Ngoài ra, mỗi sản phẩm đều có thể giúp bạn làm hài lòng khách hàng hơn bằng cách mang lại trải nghiệm web tốt hơn và sáng tạo hơn.

TopDev via

  Các nền tảng tuyển dụng tốt nhất dành cho Software Engineer l Cập nhật năm 2022

Source: Speckyboy

Git là gì? Các lệnh git cơ bản mà mọi lập trình viên nên biết

Git là gì?

Git là một hệ thống quản lý phiên bản phân tán (Distributed Version Control System – DVCS), nó là một trong những hệ thống quản lý phiên bản phân tán phổ biến nhất hiện nay. Git cung cấp cho mỗi lập trình viên kho lưu trữ (repository) riêng chứa toàn bộ lịch sử thay đổi.

>>> Xem thêm: GitHub là gì? Những lợi ích GitHub mang lại cho lập trình viên

Version Control System – VCS là gì?

VCS là viết tắt của Version Control Systemhệ thống kiểm soát các phiên bản phân tán mã nguồn mở. Các VCS sẽ lưu trữ tất cả các file trong toàn bộ dự án và ghi lại toàn bộ lịch sử thay đổi của file. Mỗi sự thay đổi được lưu lại sẽ được và thành một version (phiên bản).

VCS nghĩa là hệ thống giúp lập trình viên có thể lưu trữ nhiều phiên bản khác nhau của một mã nguồn được nhân bản (clone) từ một kho chứa mã nguồn (repository), mỗi thay đổi vào mã nguồn trên local sẽ có thể ủy thác (commit) rồi đưa lên server nơi đặt kho chứa chính.

Và một máy tính khác nếu họ có quyền truy cập cũng có thể clone lại mã nguồn từ kho chứa hoặc clone lại một tập hợp các thay đổi mới nhất trên máy tính kia.

Lập trình viên có thể xem lại danh sách các sự thay đổi của file như xem một dòng thời gian của các phiên bản. Mỗi phiên bản bao gồm: nội dung file bị thay đổi, ngày giờ sửa đổi, người thay đổi là ai, lý do thay đổi hay tên phiên bản…

Tìm việc làm GIT lương cao tại Topdev

VCS có tác dụng như thế nào?

  1. Lưu lại lịch sử các version của bất kỳ thay đổi nào của dự án. Giúp xem lại các sự thay đổi hoặc khôi phục (revert) lại sau này.
  2. Việc chia sẻ code trở nên dễ dàng hơn, lập trình viên có thể để public cho bất kỳ ai, hoặc private chỉ cho một số người có thẩm quyền có thể truy cập và lấy code về.

Vốn là một VCS nên Git cũng ghi nhớ lại toàn bộ lịch sử thay đổi của source code trong dự án. Lập trình sửa file, thêm dòng code tại đâu, xóa dòng code ở hàng nào…đều được Git ghi nhận và lưu trữ lại.

Git hoạt động như thế nào?

Sự khác biệt chính giữa Git và bất kỳ VCS nào khác (bao gồm Subversion…) là cách Git nghĩ về dữ liệu của nó.

Về mặt khái niệm, hầu hết các hệ thống khác đều lưu trữ thông tin dưới dạng danh sách các thay đổi dựa trên file. Các hệ thống này (CVS, Subversion, Perforce, Bazaar, v.v.) coi thông tin chúng lưu giữ dưới dạng một tập hợp các file và những thay đổi được thực hiện đối với mỗi file theo thời gian.

 

git
Image Credit: Stackoverflow

Git không nghĩ đến hoặc lưu trữ dữ liệu của mình theo cách này. Thay vào đó, Git coi thông tin được lưu trữ là một tập hợp các snapshot – ảnh chụp toàn bộ nội dung tất cả các file tại thời điểm.

Mỗi khi bạn “commit”, Git sẽ “chụp” và tạo ra một snapshot cùng một tham chiếu tới snapshot đó. Để hiệu quả, nếu các tệp không thay đổi, Git sẽ không lưu trữ lại file — chỉ là một liên kết đến tệp giống file trước đó mà nó đã lưu trữ. Git nghĩ về dữ liệu của nó giống như dưới đây:

git
Image Credit: Stackoverflow

Đây là điểm khác biệt quan trọng giữa Git và gần như tất cả các VCS khác. Nó khiến Git phải xem xét lại hầu hết mọi khía cạnh của kiểm soát phiên bản mà hầu hết các hệ thống khác đã sao chép từ thế hệ trước. Điều này làm cho Git giống như một hệ thống tệp nhỏ với một số công cụ cực kỳ mạnh mẽ được xây dựng trên nó, thay vì chỉ đơn giản là một VCS.

Git có lợi ích gì?

Các dự án thực tế thường có nhiều lập trình viên làm việc song song. Vì vậy, một hệ thống kiểm soát phiên bản như Git là cần thiết để đảm bảo không có xung đột code giữa các lập trình viên.

Ngoài ra, các yêu cầu trong các dự án như vậy thay đổi thường xuyên. Vì vậy, một hệ thống kiểm soát phiên bản cho phép các nhà phát triển revert và quay lại phiên bản cũ hơn của code.

Cuối cùng, đôi khi một số dự án đang được chạy song song liên quan đến cùng một cơ sở code. Trong trường hợp như vậy, khái niệm phân nhánh trong Git là rất quan trọng.

  • Dễ sử dụng, thao tác nhanh, gọn, lẹ và rất an toàn.
  • Sễ dàng kết hợp các phân nhánh (branch), có thể giúp quy trình làm việc code theo nhóm đơn giản hơn rất nhiều.
  • Chỉ cần clone mã nguồn từ kho chứa hoặc clone một phiên bản thay đổi nào đó từ kho chứa, hoặc một nhánh nào đó từ kho chứa là bạn có thể làm việc ở mọi lúc mọi nơi.
  • Deployment sản phẩm của bạn một cách không thể nào dễ dàng hơn.

Các thuật ngữ Git quan trọng

1. Branch

Các Branch (nhánh) đại diện cho các phiên bản cụ thể của một kho lưu trữ tách ra từ project chính của bạn.

Branch cho phép bạn theo dõi các thay đổi thử nghiệm bạn thực hiện đối với kho lưu trữ và có thể hoàn nguyên về các phiên bản cũ hơn.

2. Commit

Một commit đại diện cho một thời điểm cụ thể trong lịch sử dự án của bạn. Sử dụng lệnh commit kết hợp với lệnh git add để cho git biết những thay đổi bạn muốn lưu vào local repository.

3. Checkout

Sử dụng lệnh git checkout để chuyển giữa các branch. Chỉ cần nhập git checkout theo sau là tên của branch bạn muốn chuyển đến hoặc nhập git checkout master để trở về branch chính (master branch).

4. Fetch

Lệnh git fetch tìm nạp các bản sao và tải xuống tất cả các tệp branch vào máy tính của bạn. Sử dụng nó để lưu các thay đổi mới nhất vào kho lưu trữ của bạn. Nó có thể tìm nạp nhiều branch cùng một lúc.

5. Fork

Một fork là một bản sao của một kho lưu trữ (repository). Các lập trình viên thường tận dụng lợi ích của fork để thử nghiệm các thay đổi mà không ảnh hưởng đến dự án chính.

6. Head

Các commit ở đầu của một branch được gọi là head. Nó đại diện cho commit mới nhất của repository mà bạn hiện đang làm việc.

7. Index

Bất cứ khi nào bạn thêm, xóa hoặc thay đổi một file, nó vẫn nằm trong chỉ mục cho đến khi bạn sẵn sàng commit các thay đổi. Nó như là khu vực tổ chức (stagging area) cho Git. Sử dụng lệnh git status để xem nội dung của index của bạn.

Stagging là một bước trước khi commit trong git.

Một commit trong git được thực hiện theo hai bước: Stagging và commit thực tế. Miễn là những thay đổi nằm trong khu vực tổ chức (stagging area), git cho phép bạn chỉnh sửa nó theo ý muốn (thay thế các tệp được phân đoạn bằng các phiên bản khác của các tệp được phân loại, loại bỏ các thay đổi khỏi phân đoạn, v.v.)

Những thay đổi được tô sáng bằng màu xanh lá cây đã sẵn sàng để được commit trong khi những thay đổi màu đỏ thì chưa.

8. Master

Master là nhánh chính của tất cả các repository của bạn. Nó nên bao gồm những thay đổi và commit gần đây nhất.

master-branch-git
Nhánh Master

9. Merge

Lệnh git merge kết hợp với các yêu cầu kéo (pull requests) để thêm các thay đổi từ nhánh này sang nhánh khác.

10. Origin

Origin là phiên bản mặc định của repository. Origin cũng đóng vai trò là bí danh hệ thống để liên lạc với nhánh chính.

Lệnh git push origin master để đẩy các thay đổi cục bộ đến nhánh chính.

11. Pull

Pull requests thể hiện các đề xuất thay đổi cho nhánh chính. Nếu bạn làm việc với một nhóm, bạn có thể tạo các pull request để yêu cầu người bảo trì kho lưu trữ xem xét các thay đổi và hợp nhất chúng.

Lệnh git pull được sử dụng để thêm các thay đổi vào nhánh chính.

12. Push

Lệnh git push được sử dụng để cập nhật các nhánh từ xa với những thay đổi mới nhất mà bạn đã commit.

13. Rebase

Lệnh git rebase cho phép bạn phân tách, di chuyển hoặc thoát khỏi các commit. Nó cũng có thể được sử dụng để kết hợp hai nhánh khác nhau.

14. Remote

Một Remote (kho lưu trữ từ xa) là một bản sao của một chi nhánh. Remote giao tiếp ngược dòng với nhánh gốc (origin branch) của chúng và các Remote khác trong kho lưu trữ.

15. Repository

Kho lưu trữ Git chứa tất cả các tệp dự án của bạn bao gồm các branch, tags và commit.

16. Stash

Lệnh git stash sẽ loại bỏ các thay đổi khỏi chỉ mục của bạn và xóa stashes chúng đi sau.

Nó có ích nếu bạn muốn tạm dừng những gì bạn đang làm và làm việc khác trong một khoảng thời gian. Bạn không thể đặt stash nhiều hơn một bộ thay đổi ở cùng một thời điểm.

17. Tags

Tags cung cấp cho bạn một cách để theo dõi các commit quan trọng. Các tags nhẹ chỉ đơn giản đóng vai trò là con trỏ trong khi các tags chú thích được lưu trữ dưới dạng các đối tượng đầy đủ.

19. Upstream

Trong ngữ cảnh của Git, upstream đề cập đến nơi bạn push các thay đổi của mình, thường là nhánh chính (master branch).

Xem Git docs reference để biết thêm chi tiết về thuật ngữ liên quan đến Git.

Các lệnh git cơ bản

1) git config

Tác dụng : Để set user name và email của bạn trong main configuration file.
Cách xài : Để kiểm tra tên và kiểu email trong cấu hình dùng git config -- global user.namegit config -- global user.email. Để set email hoặc tên mới git config -- global user.name = “Hải Nguyễn”git config -- global user.email = “hainguyen@gmail.com”

2) git init

Tác dụng : Khởi tạo 1 git repository 1 project mới hoặc đã có.

Cách xài: git init trong thư mục gốc của dự án.

3) git clone

Tác dụng: Copy 1 git repository từ remote source.

Cách xài: git clone <:clone git url:>

4) git status

Tác dụng: Để check trạng thái của những file bạn đã thay đổi trong thư mục làm việc. VD: Tất cả các thay đổi cuối cùng từ lần commit cuối cùng.

Cách xài: git status trong thư mục làm việc.

5) git add

Tác dụng: Thêm thay đổi đến stage/index trong thư mục làm việc.

Cách xài: git add

6) git commit

Tác dụng: commit nghĩa là một action để Git lưu lại một snapshot của các sự thay đổi trong thư mục làm việc. Và các tập tin, thư mục được thay đổi đã phải nằm trong Staging Area. Mỗi lần commit nó sẽ được lưu lại lịch sử chỉnh sửa của code kèm theo tên và địa chỉ email của người commit. Ngoài ra trong Git bạn cũng có thể khôi phục lại tập tin trong lịch sử commit của nó để chia cho một branch khác, vì vậy bạn sẽ dễ dàng khôi phục lại các thay đổi trước đó.

Cách dùng: git commit -m ”Đây là message, bạn dùng để note những thay đổi để sau này dễ dò lại”

  5 tip về GitHub cho lập trình viên

7) git push/git pull

Tác dụng: Push hoặc Pull các thay đổi đến remote. Nếu bạn đã added và committed các thay đổi và bạn muốn đẩy nó lên hoặc remote của bạn đã update và bạn apply tất cả thay đổi đó trên code của mình.

Cách dùng: git pull <:remote:> <:branch:> and git push <:remote:> <:branch:>

8) git branch

Tác dụng: liệt kê tất cả các branch (nhánh).

Cách dùng: git branch hoặc git branch -a

9) git checkout

Tác dụng: Chuyển sang branch khác

Cách dùng: git checkout <: branch:> hoặc ** _ git checkout -b <: branch:> nếu bạn muốn tạo và chuyển sang một chi nhánh mới.

10) git stash

Tác dụng: Lưu thay đổi mà bạn không muốn commit ngay lập tức.

Cách dùng: git stash trong thư mục làm việc của bạn.

11) git merge

Tác dụng: Merge 2 branch lại với nahu.

Cách dùng: Chuyển tới branch bạn muốn merge rồi  dùng git merge <:branch_ban_muon_merge:>

12) git reset

Tác dụng: Bạn đã đưa một tập tin nào đó vào Staging Area nhưng bây giờ bạn muốn loại bỏ nó ra khỏi đây để không phải bị commit theo.

Cách dùng: git reset HEAD tên_file

13) git remote

Tác dụng: Để check remote/source bạn có hoặc add thêm remote

Cách dùng: git remote để kiểm tra và liệt kê. Và git remote add <: remote_url:> để thêm.

14) git add

Tác dụng: Để đưa một tập tin vào Staging Area

Cách dùng: git add tên_file hoặc muốn thêm hết file của thư mục thì git add all

Lời khuyên khi thao tác thường xuyên với Git trong công việc

  1. Git Cheet Sheets

Bạn không thể nào nhớ được hết các lệnh, lúc này bạn nên sử dụng các Git Cheet Sheets để dễ dàng tìm được lệnh Git bạn cần:

2. Nên commit thương xuyên

Tách nhỏ commit của bạn và commit thường xuyên nhất có thể. Điều này giúp các thành viên trong nhóm dễ dàng tích hợp công việc của họ hơn mà không gặp phải xung đột hợp nhất.

3. Test rồi mới commit

Không bao giờ commit nếu chưa hoàn tất process. Cần phải test các thay đổi của bạn trước khi chia sẻ chúng với người khác.

4. Viết ghi chú khi commit

Viết ghi chú khi commit để cho các thành viên khác trong nhóm biết loại thay đổi bạn đã thực hiện. Hãy mô tả càng nhiều càng tốt.

5. Thử nghiệm Branch khác

Tận dụng lợi thế của các branch để giúp bạn theo dõi các dòng phát triển khác nhau.

6. Theo một Git Workflow

Bạn nên chọn theo một Git Workflow để đảm bảo cả nhóm của bạn đều cùng thực hiện như nhau.

Hy vọng với bài viết này bạn sẽ có thêm những thông tin hữu ích về GIT là gì? Và Các lệnh git cơ bản mà mọi lập trình viên nên biết. TopDev Blog sẽ tổng hợp thêm các kiến thức hữu ích hơn tới các bạn đọc. Mong các bạn luôn ủng hộ và yêu thương chúng mình nha

Đừng quên, xem các vị trí tuyển dụng it tại HCM, Hà Nội, Đà Nẵng hấp dẫn tại đây nhé!