Home Blog Page 196

Làm thế nào để terminal trông giống như một Hacker?

Tác giả: Caleb Taylor

Bạn là một hacker. Terminal chính là ngôi nhà của bạn. Bạn biết mỗi tổ hợp phím đều có giá trị. Nếu một cái gì đó ít hơn 100% hiệu quả, bạn sẽ dành nhiều giờ để tìm ra công cụ thích hợp để tiết kiệm cho mình thêm vài giây. 

Nguồn: Pablo Stanley via Twitter

Liệu viêc tìm kiếm thường xuyên của bạn cho những cách thức mới hơn có thực sự làm điều đó tốt hơn chăng? Một số có thể nói có, nhưng khi bạn nói điều này. Không có công việc nào đáng làm, trừ khi bạn có thể thuyết trình đồng nghiệp của mình về lý do tại sao bạn có thể làm điều đó một cách hiệu quả (không bao gồm thời gian thiết lập).

Sau đây là danh sách các công cụ / tính năng mà mọi hacker giỏi đều nên biết.

Dislcaimer: Bài viết này được viết với một liều châm biếm nặng. Đó là một bước ngoặt trên meme “Tôi, một trí thức”. Trong khi các đề xuất là chân thành (và không có nghĩa là hoàn thành), các tài liệu tham khảo để trở thành một “hacker” chỉ là cho vui.

Shell (zsh)

Nhà phát triển trung bình: Một Shell là một Shell Nó không thực sự quan trọng mà tôi sử dụng.

Bạn, một Hacker: Shell là mạch máu của công việc của tôi. Niềm đam mê của tôi với hiệu quả và tính năng không có giới hạn. Shell của tôi phải là một trong những xứng đáng của một hacker thực sự.

Bạn sống trong Terminal, bạn muốn sử dụng một Shell terminal tốt . Đó là lý do tại sao bạn sử dụng zsh.

Nó đi kèm với một loạt các tính năng:

  • Tự động sửa các lệnh sai chính tả
  • Dễ dàng thay thế và kéo thả bash
  • Hoàn thành cd tốt hơn bằng cách sử dụng <tab>
  • Mở rộng đường dẫn: cd / u / c / c / j + <tab> = cd / người dùng / caleb / code / jarvis
  • V.v..

Nó cũng đi kèm với một khuôn khổ tuyệt vời để quản lý cấu hình zsh của bạn: Oh My Zsh. Nó bao gồm hơn 200 plugin và hơn 140 chủ đề để thêm tất cả các loại tính năng tuyệt vời cho thiết bị đầu cuối của bạn. Một mẫu nhỏ:

  • git – bí danh và chức năng hữu ích cho git
  • tmux – bí danh và cài đặt để tích hợp zsh với tmux
  • node – thêm lệnh node-docs để mở tài liệu trang web
  • osx – một số tiện ích để làm việc với OSX
  • Web-search – khởi tạo tìm kiếm trên web từ dòng lệnh
  • Auto suggestion – đề xuất nhanh, không phô trương khi bạn nhập dựa trên lịch sử

Bạn có thể tìm thấy danh sách đầy đủ các plugin ở đây.

Session Management (tmux)

Các developer hạng trung: Ok tôi đã mở các tệp của mình cho lame_project_1. Nhưng tôi cũng cần phải làm việc trong boring_project_2. Tôi cũng cần phải ssh vào một máy chủ và nhìn vào các bản ghi. Tôi đoán tôi sẽ chỉ tạo ra một mớ hỗn độn khổng lồ trong thiết bị đầu cuối của mình có tệp / tab từ nhiều dự án mở theo cách mà cuối cùng tôi sẽ mất quyền kiểm soát và buộc phải đóng và bắt đầu lại.

Bạn, một Hacker: Tôi làm việc trên một số dự án cùng một lúc, vì vậy tôi cần một công cụ để giúp tôi tổ chức nó. Nó sẽ hoạt động trên nhiều nền tảng và cho phép tôi tạo không gian làm việc có tổ chức và có rất nhiều tính năng khác giúp nâng cao năng suất.

Bạn biết rằng coding có thể lộn xộn. Đôi khi, bạn phải làm việc trên một số dự án cùng một lúc. Đó là lý do tại sao bạn sử dụng tmux.

Nó cho phép bạn tạo các phiên. Mỗi phiên có thể được tùy chỉnh theo bố cục chính xác mà bạn cần. Bạn có thể đặt tên phiên để dễ dàng chuyển đổi và thậm chí lưu và khôi phục các phiên nếu thiết bị đầu cuối của bạn bị đóng. Thêm vào đó, nó có dòng trạng thái tùy chỉnh riêng cho phép bạn hiển thị những thứ như thời gian, ngày tháng, mức sử dụng CPU và hơn thế nữa. Và nếu bạn không biết mức sử dụng CPU của mình tại bất kỳ thời điểm nào, bạn có phải là một hacker không?

Tổ chức thiết bị đầu cuối của bạn với các phiên và sử dụng fzf để tạo / tìm / xóa mờ các phiên

Nó thậm chí còn có một trình quản lý plugin và một loạt các plugin và các tính năng tuyệt vời sẽ đưa trình độ hack của bạn lên cấp độ tiếp theo.

Tips cho Super-Pro Hacker:

Sử dụng tmux với fzf thông qua một số script tuyệt vời để nhanh chóng tạo / xóa / điều hướng để đẩy mức độ tin tặc của bạn lên hơn 9000.

Search (ripgrep)

Developer hạng trung: Tôi đã xác định hằng số đó ở đâu? Tôi biết nó ở đâu đó ở đây. Tôi sẽ cố gắng grep cho nó. Các đối số một lần nữa là gì? Hãy để tôi google điều đó. Ah crap, bây giờ nó đang tìm kiếm thư mục node_modules của tôi. Đây là điều tồi tệ nhất.

Bạn, một Hacker: Khi tôi tìm kiếm một cái gì đó, nó phải được blazing nhanh. Ngoài ra, nó nên sử dụng các cài đặt mặc định hợp lý, như bỏ qua các tệp nhị phân hoặc tệp ẩn.

Bạn biết rằng tìm kiếm dự án của bạn là một nhiệm vụ phổ biến. Nó sẽ được nhanh chóng, và nó không nên lãng phí thời gian của bạn. Điều này có nghĩa là những thứ như bỏ qua bất cứ điều gì mà tệp .gitignore của bạn bỏ qua và bỏ qua các tệp nhị phân và tệp ẩn. Đó là lý do tại sao bạn sử dụng ripgrep. Nó giống như grep trên steroid.

ripgrep trong hành động

Cha đẻ của nó đã nói: “Sử dụng ripgrep nếu bạn thích tốc độ, lọc theo mặc định, ít lỗi hơn và hỗ trợ Unicode.”

Fuzzy Finding (fzf)

Developer hạng trung: Chắc chắn khó nhớ vị trí chính xác của quá nhiều tệp trong dự án của tôi. Tôi đoán tôi sẽ gặp sơ sẩy cho đến khi tôi tìm được cái đúng.

Bạn, một Hacker: Tôi sẽ có thể tìm thấy các tập tin(fuzzy-find ). Tôi có thể nhập tên tệp hoặc một số đường dẫn hoặc tất cả đường dẫn và tìm nhanh tệp tôi đang tìm kiếm.

Bạn biết bạn không cần phải gõ nhiều hơn mức bạn cần. Vì vậy, bạn sử dụng fzf, một công cụ tìm kiếm dòng lệnh chung. Nó cũng có thể làm nhiều hơn với các tập tin tìm kiếm ,Nó có thể được sử dụng với bất kỳ danh sách nào: “tệp, lịch sử lệnh, quy trình, tên máy chủ lưu trữ, dấu trang, cam kết git, v.v …”.

Mẹo siêu chuyên nghiệp: Bạn biết rằng bí danh là cách tuyệt vời để tạo lối tắt để tận dụng các tính năng của fzf. Ví dụ: nếu bạn muốn tìm kiếm tệp và sau đó mở lựa chọn trong trình chỉnh sửa mặc định của mình, bạn có thể thêm phần này vào cấu hình zsh của mình:

# fo [FUZZY PATTERN] - Open the selected file with the default editor
#   - Bypass fuzzy finder if there's only one match (--select-1)
#   - Exit if there's no match (--exit-0)
fo() {
  local files
  IFS=$'\n' files=($(fzf-tmux --query="$1" --multi --select-1 --exit-0))
  [[ -n "$files" ]] && ${EDITOR:-vim} "${files[@]}"
}

Bây giờ bạn có thể chạy “fo” fuzzy-find và mở một tập tin

Có thể tìm thấy nhiều ví dụ khác trên fzf wiki.

Terminal Prompt (Spaceship)

Developer hạng trung: Ai quan tâm đến lời nhắc thiết bị đầu cuối của tôi như thế nào? Không đời nào nó có thể cho tôi bất kỳ thông tin hữu ích nào. Tôi sẽ chỉ để nó làm mặc định.

Bạn, một Hacker: Tôi muốn lời nhắc của tôi thật tuyệt vời. Nó phải là nhận thức ngữ cảnh. Nó sẽ cho tôi thông tin hữu ích và có thể cấu hình được. Ngoài ra, nó sẽ rất ngọt ngào nếu nó liên quan đến không gian.

Chào mừng đến tương lai… nhưng thực sự là hiện tại. Chỉ tin tặc / phi hành gia.

Bạn biết lời nhắc prompt phải đơn giản, rõ ràng và chỉ cung cấp thông tin có liên quan. Nó cũng hiện trong tâm trí của mọi người khi họ nhìn thấy vẻ đẹp của nó. Đó là lý do tại sao bạn sử dụng spaceship-prompt.. Nó cung cấp tích hợp git / mercurial, chỉ báo mức pin, tên máy chủ thông minh và dữ liệu người dùng, số phiên bản cho nhiều thư viện, biểu tượng tuyệt đẹp và hơn thế nữa.

Changing directories (z)

Developer hạng trung: Tôi cần thay đổi thư mục của mình thành dự án “hacker”, nằm trong thư mục của tôi, nằm bên trong thư mục cá nhân của tôi, nằm trong thư mục mã của tôi, nằm trong thư mục chính của tôi.

cd ~/code/personal/cool/hacker

Bạn, một Hacker: Tôi cần thay đổi thư mục của mình thành dự án “hacker”.

z hacker

Gõ đường dẫn tệp đầy đủ là những gì các nhà phát triển trung bình làm. Bạn là một hacker. Bạn dựa vào z. Sau khi cài đặt, nó sẽ bắt đầu học những thư mục bạn truy cập. Sau đó, bạn có thể cung cấp cho nó một regex (hoặc tên thư mục đơn giản) để nhảy tới ứng cử viên có khả năng nhất.

Bonus Hacker Tools

Các công cụ sau đây là những cách bổ sung để thực sự nâng cao trò chơi hack của bạn.

  1. wttr.in – Chỉ có một cách đúng đắn để kiểm tra thời tiết.

  1. Star Wars — Cool people like Star Wars. Hackers xem nó trong terminal.
telnet towel.blinkenlights.nl

3. haxor-news – Bạn thậm chí là một hacker nếu bạn không đọc Hacker News?

4. Spotify – Sử dụng shpotify, bạn có thể chơi nhạc từ thiết bị đầu cuối (chỉ OSX… Hey, ngừng la ó! Đặt cái ghế xuống! Ai ném cà chua đó !?), hoặc mopidy cho cái gì đó là đa nền tảng.

Bài viết đến đây cũng đã kết thúc. Điều này không có nghĩa là đã liệt kê ra một danh sách toàn diện. Bạn có bất kỳ công cụ hacker tuyệt vời nào khác không? Để lại một bình luận và cho tôi biết.

Nếu bạn muốn thấy nhiều công cụ này hoạt động hơn, hãy kiểm tra dotfiles của tôi mà tôi sử dụng để phát triển. Như một phần thưởng, đây là ảnh chụp màn hình của glorious terminal đang hoạt động:

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

Debug project Yii2 với XDebug và PHPStorm IDE

Tác giả: Ugin Po

Hôm nay chúng ta đang nói về gỡ lỗi và một trình gỡ lỗi. Trước hết, tôi phải thông báo cho bạn rằng bài viết này dành cho người mới bắt đầu muốn có khả năng gỡ lỗi dự án Yii2 của riêng họ trong IDE PHPStorm mạnh mẽ với XDebug.

Bắt đầu. Trong trường hợp của tôi, tôi đã sử dụng các công cụ tiếp theo:

  1. Apache 2.4
  2. PHP 5,5
  3. Trình duyệt Chrome với JetBrains IDE Plugin 2.8
  4. PHPStorm 9
  5. xDebug 2.2.6

Xem tin tuyển lập trình viên PHP đãi ngộ tốt trên TopDev

Bước 1. Trong php.ini của bạn tìm một phần [Xdebug] và các chỉ thị bỏ ghi chú bên dưới:

zend_extension=”YOUR_PATH_TO_PHP/ext/php_xdebug.dll” xdebug.default_enable = 1 
xdebug.remote_autostart = 0 
xdebug.remote_enable = 1 
xdebug.remote_port = 9001

Sau đó bạn nên kiểm tra cấu hình php của bạn thông qua hàm phpinfo (). Nếu bạn có thể tìm thấy xdebug trong danh sách thuộc tính, điều này có nghĩa là bạn đã cấu hình quyền xDebug.

Bước 2. Vào PHPStorm-> File-> Settings-> Language & Frameworks

Bạn nên thiết lập môi trường phát triển trong phần phiên dịch php như sau:

Bước 3. Sau đó vào PHPStorm-> File-> Settings-> Language & Frameworks-> PHP-> Server và thiết lập các tùy chọn máy chủ web của bạn:

Bước 4. Trong PHPStorm-> File-> Settings-> Language & Frameworks-> PHP-> Debug định cấu hình cài đặt xDebug:

Bước 5. Ở góc trên cùng bên phải của PHPStorm chọn tùy chọn “Edit Configurations…”

Bước 6. Trong cửa sổ xuất hiện, nhấp vào “+” và thêm “PHP Web Application”.

Đó là tất cả. Bước tiếp theo là đặt điểm ngắt bằng cách nhấp vào bên trái của trình chỉnh sửa đối với một số chức năng hoặc các thực thể khác mà bạn muốn khám phá.

Nhấp vào biểu tượng lỗi trong bảng điều khiển trên cùng

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

Xem thêm các vị trí tuyển dụng nhân viên it tại Topdev.vn

Cùng Vincere lan tỏa đam mê, vững xây bệ phóng để vươn xa

Sở hữu một lượng lớn khách hàng trên toàn cầu, Vincere vẫn không ngừng mở rộng quy mô phát triển và mang lại những giá trị dịch vụ tốt nhất. Bên cạnh một quy mô tầm cỡ, Vincere còn là môi trường phát triển sự nghiệp tuyệt vời cho những ai đang tìm kiếm cơ hội và theo đuổi đam mê về lĩnh vực công nghệ.

Vincere và những con số biết nói: 500+ khách hàng, 50+ quốc gia và 5 châu lục

Vincere là nền tảng CRM/ ATS dành cho các công ty tuyển dụng đầy tiềm năng thuộc mọi quy mô trên toàn cầu. Được xếp hạng bởi Gartner với vị trí dẫn đầu thị trường trong Báo cáo FrontRunners năm 2018, hệ thống của Vincere được thiết kế đặc biệt dành cho các công ty tuyển dụng bao gồm Temp & Contract, Perm, Executive Search và RPO, với khả năng tích hợp phía trước, giữa và sau.

  • Vincere mang đến phần mềm dịch vụ SaaS  cho các cơ quan tìm kiếm và điều hành nhân sự để tuyển dụng nhân tài trải rộng khắp 5 châu lục;
  • Vincere tự hào khi được hợp tác với hơn 500 khách hàng đến từ 50+ quốc gia bao gồm các tên tuổi lớn như Randstad & Empresaria Group;
  • Vincere đã và đang tiếp tục phát triển dữ liệu cơ sở khách hàng, tạo nên những giá trị khác biệt nhằm mang đến các trải nghiệm dịch vụ tốt nhất;

Với văn phòng hiện đại ở Singapore, Việt Nam và Sydney – Úc; Vincere vẫn tiếp tục mở rộng sự hiện diện ở Anh, Châu Âu, Hoa Kỳ. Và bên cạnh việc mở rộng quy mô thì việc đầu tư vào nguồn nhân lực sẽ là bệ phóng để đẩy tốc độ phát triển của Vincere được đi xa hơn.

Tại Vincere, niềm đam mê là không thể thiếu

Là một phần của đội ngũ Vincere, bạn sẽ cùng đóng góp vào sự phát triển bằng công cuộc xây dựng triển khai dịch vụ, giải pháp công nghệ thông tin cho các nhà tuyển dụng trên toàn cầu.

Vincere luôn trân trọng đam mê của mỗi người. Khi một đội ngũ có cùng đam mê và mục tiêu chung thì tốc độ phát triển sẽ vượt xa khỏi kỳ vọng. Để có thể mang lại cho khách hàng những trải nghiệm tuyệt vời cũng như một chất lượng dịch vụ tốt nhất, Vincere không ngừng chiêu mộ các nhân tài để cùng góp sức. Và để hội tụ được một đội ngũ tài năng, Vincere sẵn sàng mang đến chuỗi lợi ích hấp dẫn nhất dành cho nhân viên.

  • Thu nhập luôn chạm đến con số NGÀN ĐÔ;
  • Thưởng lương tháng 13 và các khoản hấp dẫn khác trong năm;
  • Chăm sóc sức khỏe tận tình cho nhân viên, đảm bảo quyền lợi trọn vẹn với BHYT;
  • Tài trợ hoàn toàn cho mỗi lần cất cánh như: vé máy bay, visa, chỗ ở và chi phí phát sinh khác;
  • Quy trình đào tạo phù hợp giúp người mới dễ dàng theo kịp tốc độ và gắn kết phát triển cùng team;
  • Cơ sở hạ tầng hiện đại và an toàn: phòng làm việc rộng lớn, sạch sẽ, mát mẻ, đảm bảo an ninh cùng với không khí trong lành không lo ô nhiễm;
  • Bung lụa trong team building mỗi quý với sự bao chi của công ty.

Bên cạnh môi trường làm việc thoải mái, những đồng nghiệp tại Vincere luôn hòa đồng, cởi mở, nhiệt tình giúp đỡ lẫn nhau để cùng tiến xa hơn. Nếu bạn đang tìm kiếm một nơi lý tưởng để phát triển sự nghiệp với thu nhập cạnh tranh, môi trường đoàn kết bền vững thì Vincere chính là một trong những lựa chọn sáng giá.

Những cơ hội nào đang được rộng mở tại Vincere?

Ứng tuyển vị trí Website Designer (Web Design) với offer khởi điểm từ $1,000

Mô tả công việc

  • Làm việc chặt chẽ với nhóm tiếp thị và quản lý để khái niệm hóa, tạo và thiết kế các wireframes và hình ảnh trên trang web
  • Thiết kế đồ họa cho tất cả các kỹ thuật số bao gồm: website, landing pages, phương tiện truyền thông xã hội, blog, eblasts và các chiến dịch tiếp thị kỹ thuật số khác;
  • Tham gia vào tất cả các giai đoạn thiết kế trực quan từ khái niệm đến kết quả cuối cùng;
  • Kết hợp các thiết kế UI / UX và xu hướng web hiện đại;
  • Duy trì sự hoạt động của trang web bằng cách phát triển và thực thi nội dung tiêu chuẩn.

Yêu cầu chính:

  • Hồ sơ về công việc thiết kế dựa trên web có liên quan;
  • Hiểu biết vững chắc về các nguyên tắc thiết kế và tâm lý màu sắc;
  • Có ít nhất 2-3 năm kinh nghiệm thiết kế website;
  • Thành thạo với Photoshop, lnDesign, Illustrator, hoặc các công cụ thiết kế hình ảnh khác;
  • Có kiến thức cơ bản về HTMLS, CSS3, JavaScript, công cụ lập trình web và CMS (WordPress hoặc Joomlal);
  • Hiểu về thiết kế di động, có khả năng thiết kế với kích thước/ độ phân giải màn hình khác nhau;

Yêu cầu chung:

  • Khả năng làm việc độc lập và với các đội để hoàn thành dự án; và theo thời hạn chặt chẽ;
  • Được tổ chức tốt, có trách nhiệm và cam kết, với khả năng làm việc trên nhiều dự án và cung cấp các dự án trong một môi trường có nhịp độ nhanh;
  • Tự học, linh hoạt và khả năng suy nghĩ nhạy bén;
  • Thành thạo tiếng Anh;
  • Có bằng Cử nhân về tương tác giữa con người và máy tính, thiết kế tương tác, đồ họa / thiết kế web, hoặc môn nghệ thuật thị giác
  • Có kỹ năng chụp ảnh và quay phim tốt là một lợi thế

Và còn nhiều vị trí hấp dẫn khác tại Vincere với offer từ NGÀN ĐÔ

Nắm chắc cơ hội – tự tin đổi mới tương lai

Channel trong Golang là gì? So sánh Callback function và mutex lock với channel

golang channel

Câu hỏi được đặt ra trong bối cảnh các bạn code NodeJS và các ngôn ngữ khác khi chuyển qua Golang mới được biết tới món đặt sản tên Channel. Thứ được tác giả ngôn ngữ thiết kế từ trong core, là first class language, không cần phải import thêm package để sử dụng.

Channel là gì?

Channel là để các tiến trình bất đồng bộ (trong Go hay gọi là Goroutines) có thể giao tiếp với nhau mà không cần phải dùng biến từ bên ngoài. Nó không được thiết kế để giải quyết mọi trường hợp của concurrent nhưng nó giúp việc này dễ dàng, an toàn và vui hơn. Thậm chí tới những trường hợp không cần dùng channel nhưng các gopher vẫn dùng channel chỉ vì họ thực sự thích nó.

Callback function và mutex lock khác gì với Channel ?

Điều làm Go Channel trở nên đặc biệt là vì nó vừa là kênh giao tiếp (truyền data), vừa là một cơ chế lock/unlock như mutex. Nó giống như hình ảnh của người phục vụ và thực khách, giả sử bàn ăn chỉ để được 1 món duy nhất.

Nếu tốc độ phục vụ đồ ăn nhanh hơn của khách, trên bàn còn món, thì người phục vụ sẽ đứng đợi để đặt lên món mới. Ngược lại người khách phải đợi phục vụ lên món mới ăn tiếp được.

Công việc của cả 2 người này là hoàn toàn bất đồng bộ với nhau, chỉ “giao tiếp” qua channel bàn ăn và đồ ăn trên bàn.

1. So với Callback function:

Khi ta cần chạy 1 task bất đồng bộ (async task), nhưng lại không biết khi nào nó done để lấy kết quả từ nó mà chạy tiếp. CB sẽ là một giải pháp, định nghĩa một function với tham số đầu vào là kết quả của task trên, khi task này chạy xong sẽ call vào hàm này.

Mình tạm coi đây là giao tiếp một chiều từ Async Task -> CB. Để làm được giao tiếp 2 chiều: Async Task <-> CB thì CB phải được định nghĩa có trả về để Async Task lấy nó rồi làm tiếp,…

Nhưng lưu ý là cách giao tiếp này Async Task sẽ gọi CB một cách bình thường, là Sync Call, phải đứng đợi trả về. Nếu ta cố gắng gọi CB như một Async Task nữa thì lại phải phát sinh thêm một CB nữa, việc này là rất rắc rối và dễ bị stackoverflow.

2. So với mutex lock:

Mutex lock vẫn luôn là giải pháp rất tốt và tránh bị data racing khi có nhiều Goroutines cùng đọc và ghi vào 1 biến chung. Đây là phương thức truyền thống, sử dụng share memory như một kênh giao tiếp. Trái ngược với Channel: dùng kênh giao tiếp để share memory.

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

Xử lý JSON với Golang

Server side cache with Go

Có 3 điểm khác biệt chính khi so sánh mutex lock và channel :

  • Channel đưa ra khái niệm give ownership, khi data đã đẩy vào channel, thì Goroutine hiện tại đã “bàn giao”. Goroutine nào nhận nó thì có toàn quyền, không cần care “ai đó” cũng đang xài chung hay không.
  • Nếu cần đồng bộ nhiều Goroutines (>2) thì ta nên dùng mutex lock. Vì mutex không quan tâm shared memory đang được tham chiếu bởi bao nhiêu Goroutines. việc dùng channel lúc này lại vô tình phức tạp hơn.
  • Vì mutex chỉ quan tâm là lock và unlock biến, nên một Goroutine có thể read/write shared memory N lần không care tới các tiến trình khác, miễn không bị lock. Với channel thì có, nó giúp đồng bộ cả số lượng thực thi của 2 tiến trình. Như ví dụ trên, rõ ràng là thực khách không thể ăn nhiều món hơn số lượt phục vụ được, và ngược lại với người phục vụ cũng thế. Đây là cơ chế rất quan trọng trong Streaming Data và pub/sub rất hay dùng trong Go.

Sẽ còn nhiều sự khác biệt khác nhưng có thể mình không kịp nhớ ra. Tuy nhiên việc so sánh không nhằm quảng bá thần thánh hoá Go Channel. Thay vào đó chúng ta sẽ cùng hiểu rõ bản chất của nó để đưa ra lựa giải pháp phù hợp cho bài toán cụ thể.

Việt Trần

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

Software engineer phát triển bản thân như thế nào?

Software engineer phát triển bản thân như thế nào

Lúc đầu định viết về product nhưng xong thế nào lại suy ngẫm nhiều hơn về software engineering, nên mình chia sẻ lại một số quan điểm của mình về software engineering và cụ thể hơn là như thế nào để phát triển bản thân khi bạn là một software engineer:

– Tiếng Anh là một công cụ, và cái công cụ này bạn phải nắm chắc trong tay. Dữ liệu tiếng Anh về lập trình hay kiến trúc, thuận toán… trong SE có thể khẳng định là nhiều hơn tiếng Việt rất rất rất nhiều lần, và độ cập nhật của những dữ liệu này cũng nhanh hơn dữ liệu tiếng Việt rất rất nhiều lần. Khi bạn không đọc hiểu tốt hoặc viết tốt (đơn giản là Google được vấn đề bằng tiếng Anh) thì bạn tự nhốt mình trong một phạm vi rất eo hẹp về kiến thức.
– Làm gì cũng phải hiểu bản chất gốc rễ của vấn đề. Khi bạn code Javascript nếu bạn chỉ biết dùng Jquery bạn sẽ gặp rất nhiều vấn đề sau này vì Jquery là một abstraction (sorry mình không biết dịch cái này ra TV như thế nào), và khi gặp phải khó khăn trong việc tối ưu hóa performance của JS bạn sẽ bị hạn chế trong việc tìm ra tại sao cái này render chậm, tại sao cái kia conflict với cái này. Bản chất gốc rễ ở đây mà mình nói đến là bạn nên tìm hiểu browser hoạt động ra sao và cách browser xử lý script theo trình tự như thế nào, và JS khi single threaded sẽ behave như thế nào.
– Nên tìm hiểu về functional programming và tính bất biến trong lập trình, cái này sẽ giúp bạn và code bạn viết ra dễ debug hơn, và dễ hiểu phần nào hơn cho người khác khi đọc code của bạn. Khi mỗi hàm bạn viết ra không bị “bẩn”, tức là mỗi hàm bạn viết ra khi nó nhận tham số vào thì bạn sure là kết quả của tham số hoặc một bộ tham số đó sẽ cho ra cái gì đó bạn hoàn toàn đoán trước được (tính predictable). Nếu hàm bạn viết ra nhận 3 tham số explicitly và bên trong hàm đó lại có sử dụng một tham số global sẽ thay đổi theo thời gian hay context thì khả năng bạn debug cái hàm này sẽ ăn hành nhiều.
– Viết test không phải là tất cả, nhưng bạn nên viết test. Khi bạn làm ở một startup nhỏ, cần move fast, việc testing có thể không quan trọng đến vậy nhưng ở scale lớn thì nó rất quan trọng vì bạn sẽ không phải mất thời gian và QC cũng không phải mất thời gian test lại cái code bạn viết ra. Nên viết code như thế nào để QC càng ít phải test càng tốt.
– Khi tổ chức lớn dần thì nên có convention trong việc viết code, nên có quy chuẩn, vì một cái code base cũng như một cái tiểu thuyết được viết bởi nhiều người. Khi có nhiều người cùng viết một câu truyện thì nó càng cần sự nhất quán và rành mạch, nếu mỗi người viết theo một kiểu cái câu chuyện sẽ không ăn nhập, cái flow bị gãy và người đọc/user là người ăn hành.
– Làm software engineer không phải là chỉ ngồi code, mà là nghĩ ra cách giải quyết vấn đề. Nếu vấn đề nó không cần phải code và exception sẽ không xảy ra thì càng tốt, một software engineering giỏi là sẽ không nhảy bổ vô vấn đề và viết code mà phải tìm ra vấn đề này thực sự gốc rễ phát sinh ở đâu, có thể nó là business process, có thể nó là UI design…, không nhất thiết nó phải là code. Hãy nghĩ mình là người solve vấn đề và khi nào không thể solve vấn đề bằng code thì mới code.

Bài chia sẽ bởi anh Hoang D Nguyen là Head of commercial Engineering – phụ trách quản lý toàn bộ quá trình xây dựng product mang lại trải nghiệm end to end cho consumer, trên tất cả các nền tảng web, app của Tiki.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

Quote* từ anh Nguyễn Đông:

Functional programming là một loại design, việc lựa chọn FP, OOP,. là design decision mà bạn sẽ quyết định từ đầu dự án và nó sẽ phụ thuộc vào dự án của bạn là gì, skill của members,... 
Còn việc bạn có dirty code hay không lại phụ thuộc vào những khía cạnh khác.

Tóm lại tiêu chí cần đạt được là:

--- Viết ra phần mềm mà mọi người thích sử dụng;
--- Code phải dễ bảo trì;
--- Bạn làm việc tốt với mọi người trong team;
--- It bug;
--- Giải quyết vấn đề bằng cách đơn giản;

Có nhiều tool và cách tiếp cận để đạt được những tiêu chí trên. Một trong đó là:

--- Practice TDD mỗi ngày 30phut;
--- Nắm những kiến thức cần thiết bất biến của software engineering: Là những kiến thức không bị lạc hậu nhanh theo thời gian như: principle knowledges, business knowlegde;
--- Code review;
..................................
Rất nhiều thứ khác. Nói chung phụ thuộc kinh nghiệm và khả năng tự reflect của mỗi người...

 

WordPress – Cách tối ưu web lên 99 điểm trên di động PageSpeed Insights

Wordpress - Cách tối ưu web lên 99 điểm trên di động PageSpeed Insights

Google vừa ra chuẩn đánh giá tốc độ đáp ứng của web mới khiến mọi người lao đao, chuẩn lần này coi bộ khá nặng nề, nhất là trên di động, mà bản thân trải nghiệm thấy hiện tại có trên 80% người sử dụng thiết bị di động, 10% sử dụng máy tính bảng, còn lại là trên máy bàn hoặc laptop vì vậy tối ưu trên di động gần như là điều tiên quyết ai cũng đang hướng tới.
Với những trang web lớn thì việc tối ưu đã diễn ra rất lâu rồi, vì sao ư, họ phải đi trước thời đại, cái gì cũng phải tốt nhất để sau này lớn mạnh thì không phải làm gì nhiều nữa, vì vậy những website cần tối ưu thường là những web mới làm, hoặc những web sài 1 thời gian nó trở nên chậm chạp và phải tối ưu để nó nhanh hơn, tăng trải nghiệm người dùng.

Bản thân là một Coder nên những vấn đề cơ bản bao trùm việc tối ưu mình xin tóm gọn như sau :
1)Tối ưu hoá hình ảnh.
2)Tối ưu hoá css,js.
3)Tối ưu code.
4)Sử dụng Cache và Preload.
5)Sử dụng Hosting hay VPS(máy chủ ảo) tốt.
6)Bật nén trong Hosting(VPS) hoặc Sử dụng CDN.

Mình xin đi vào chi tiết từng vấn đề, nếu các bạn gặp trục trặc ở vấn đề nào thì vui lòng để lại bình luận, trong khả năng mình sẽ trả lời.

1) Tối ưu hoá hình ảnh :

Hầu hết các website đều có hình ảnh chưa tối ưu, thường thì mình sẽ dùng công cụ gtmetrix để check xem hình nào chưa được tối ưu, mình sẽ làm như hướng dẫn của nó, bản thân gtmetrix sẽ tạo ra 1 ảnh đã tối ưu để mình tải về và quăng lên lại, việc này đơn giản và ai cũng có thể làm được.

Còn vấn đề nữa là gtmetrix hay báo “Serve scaled images”, có nghĩa là một ảnh nào đó nên để đúng kích thước của nó, không dùng ảnh có kích thước lớn hơn rồi bóp nhỏ lại để hiển thị, ví dụ ảnh đó chỉ cần 90×90 nhưng lại dùng ảnh kích thước 200×200 để hiển thị, nhưng vậy code nó phải mất thêm thời gian bóp nhỏ ảnh rồi mới hiển thị gây hao tài nguyên và cũng không cần thiết, gặp lỗi này thì cứ tải ảnh cần scaled( bóp lại) về, sau đó dùng photoshop hoặc trang web hoặc plugins(chỉ dùng cho mã nguồn wordpress) để bóp nhỏ kích thước và quăng lên lại, khuyến nghị nên dùng File Zilla để tải về và quăng ảnh lên.

2) Tối ưu hoá css,js:

Đa phần web nào cũng có file css và js, thường thì để load nhanh hơn người ta sẽ dùng cách minify(quá trình này loại bỏ các khoảng trắng của các ký tự trống, ký tự dòng mới, ghi chú và ký tự ngoặc nhọn khỏi mã nguồn của bạn) cho css, js. Với việc có quá nhiều file css và file js, người ta sau khi minify thì thường nối chúng lại để tăng tốc độ tải cho website.

Có rất nhiều website giúp bạn minify file css và js có thể hỗ trợ bạn việc này.
Lưu ý : việc làm này có thể gây vỡ giao diện, hãy luôn có 1 bản backup và sử dụng File Zilla để an toàn hơn.

3) Tối ưu code :

Hiện nay có rất nhiều mã nguồn khác nhau, mỗi mã nguồn lại chứa đựng vô số theme khác nhau, việc tối ưu code sẽ khó khăn hơn rất nhiều, vì vậy, khi thiết kế 1 website bạn nên chú ý đến việc nó sử dụng theme gì, có dễ dàng tối ưu không, cộng đồng hỗ trợ lớn không, có update thường xuyên không, v.v.v…

4) Sử dụng Cache và Preload

Dù bạn sử dụng mã nguồn nào bạn cũng cần phải tạo cache cho web, việc này thì hầu như web nào cũng phải tạo ra, mục đích là để khách truy cập lần đầu tiên web sẽ thực thi bình thường, kể từ lần thứ 2 thì khách truy cập đúng link đó thì nó sẽ thực thi nhanh hơn vì sử dụng lại file đã tạo ra dạng html nên máy chủ không phải xử lý như lần đầu tiên nữa, việc này vừa giúp tăng tốc tải trang vừa giúp cho việc sử dụng thấp nhất tài nguyên của Hosting(VPS).

Với đợt cập nhật Google PageSpeed Insight lần này, Google ưu tiên những web có sử dụng hàm “preload” trong code, nếu bạn muốn cải thiện tốc độ trên di động trên 90 điểm thì không thể bỏ qua việc này , với từ khoá “Preloading content with rel=”preload”+tên_mã_nguồn” mong là các bạn có thể tìm kiếm được thứ bạn cần.

5) Sử dụng Hosting hay VPS(máy chủ ảo) tốt.

Việc này cũng rất quan trọng, nó đảm bảo cho bạn có sự ổn định, trong SEO nó càng quan trọng hơn nữa. Nếu điều kiện kinh tế cho phép hãy mua 1 VPS để phục vụ cho sự ổn định của máy chủ vì SEO là công việc lâu dài, nên thời gian uptime càng cao càng tốt, lý tưởng nhất là 99,99%, thế thì làm sao để đánh giá 1 Hosting hay 1 VPS tốt. Bạn coi thử hosting của bạn có những điều này không nhé:
+ Sự ổn định, chưa thấy hoặc không thấy nó rơi vào tình trạng “Waiting for {tên_web_site}” quá lâu, ngay gốc trái màn hình, nếu bạn thấy nó cứ Waiting hoài, hoặc vô lâu nó đơ và trắng trang hoặc lỗi gì đó bằng Tiếng Anh hoặc tiếng Việt mà không phải giao diện của bạn thì bạn nên cân nhắc thay đổi Hosting (VPS) khác. Mình sử dụng VPS của Linode thấy nó rất ổn định và đảm bảo những gì mình cần.
+Sử dụng SSD
+Dùng NGINX
+Chạy hệ điều hành Centos
+Sử dụng Maria Database
Với Hosting thì chưa có nhà cung cấp nào ở Việt Nam cho mình cảm giác an tâm cả.
Còn với VPS thì Vultr tỏ ra nhanh vượt trội nhưng nó không ổn định, trải nghiệm dùng thử thì mình thấy như vậy.
Nhiều bạn với chi phí thấp nhưng vẫn muốn sử dụng VPS thì có thể góp mua chung để sài hay hơn là sử dụng Hosting Share.
Để kiểm tra VPS có ok không các bạn đăng nhập SSH trong VPS và dùng lệnh này :

curl -Lso- topdev.vn | bash

Có những thông số bạn cần lưu ý để nhận biết 1 VPS tốt :
+Loại ảo hoá tốt nhất là KVM & Cloud OpenStack, các loại ảo hoá khác như OpenVZ, XEN không nên sử dụng.
+Tốc độ trung bình( Average) : cần trên 400 MB/s
+Read IOPS : trên 35k mới gọi là ổn.
+Write IOPS : trên 20k mới gọi là ổn.

6) Bật nén trong Hosting(VPS) hoặc Sử dụng CDN

Khi bạn truy cập vào site của bạn, một request sẽ được gửi tới server để chuyển file xuống. Những file này càng lớn, càng mất nhiều thời gian để tải. Bằng cách nén trang web của bạn và CSS trước khi gửi chúng qua cho trình duyệt sẽ giảm thời gian tải xuống đáng kể vì files sẽ nhỏ hơn.Vì vậy kết quả cuối cùng sau khi gzip nén file, kích thước của trang và CSS có thể giảm tới 60-70%.
Với từng Web Server riệng thì việc bật Gzip cũng khác nhau, có thể kể đến các web server như Apache chúng ta phải chỉnh file .htaccess, với Nginx chúng ta chỉnh file php.ini, với các Web Server khác chúng ta có thể tham khảo anh Google.
Nếu việc bật Gzip khó khăn với bạn, bạn có thể sử dụng CDN, điển hình CDN miễn phí của Cloudflare có thể giúp bạn việc này, với những website có nhiều lượng truy cập từ nhiều nước khác nhau việc sử dụng CDN gần như bắt buộc.

Tham khảo thêm các vị trí tuyển dụng WordPress lương cao

***Tối ưu hoá mã nguồn WordPress :

Với mã nguồn được các SEOER tin tưởng thì việc tối ưu cũng trở nên bức thiết khi web ngày một chậm hơn. Cũng với những công đoạn trên, các bạn nên làm theo từng bước 1 ở trên để có được kết quả tốt nhất.
Một vấn đề tồn đọng mà hầu hết các bạn đang gặp phải là lỗi do không nén những file có nguồn gốc từ live chat của facebook và các ứng dụng như comment facebook hay Chúng tôi trên Facebook, Facebook sử dụng ngôn ngữ lập trình riêng trên nền tảng javascript “ReactJS” nên lúc cần phải truy xuất thì phải tham khảo rất nhiều file *.js để trả về kết quả, việc này là không cần thiết, điều cần nhất là inbox vào hộp thư fanpage facebook mà không phải sử dụng plugins, đơn giản nhất là chèn 1 ảnh có biểu tượng chat facebook và link tới hộp thư FanPage dạng m.me/duong-dan-fanpage-facebook và dùng css cố định ảnh đó chạy theo khi mình cuộn trang. Nó như sau :

<div style="position: fixed; cursor: pointer; width: 50px; height: 50px; top: 50%; left: auto; right: 5px; bottom: 0;">
<a href="https://m.me/duong_dan_fanpage">
<img class="alignnone wp-image-145 size-full" src="https://tenmien.com/…/u…/2018/11/ten-anh-bieu-tuong-chat.png" alt="" width="50" height="50" />
</a>
</div>

Dán vào file funtions.php hoặc 1 widget nào đó mà nó luôn hiển thị ở toàn trang ,nhớ thay đường dẫn fanpage và đường dẫn ảnh nhé, bác nào kỹ thì thêm thuộc tính nofollow cho ảnh và mở 1 tab mới cho link fanpage !
Với các nút tương tác khác như gọi trên mobile hay chat qua Zalo cũng tương tự, nên code bằng html và css, không sử dụng plugins nếu không thực sự cần thiết để tối ưu hoá tốc độ của WordPress. Một đoạn code để các bạn tham khảo :
code html:

<div class="phone">
<a href="#">
<div class="quick-alo-ph-circle"></div>
<div class="quick-alo-ph-circle-fill"></div>
<div class="quick-alo-ph-img-circle"></div>
</a>
</div>

code css :

* {
box-sizing: border-box;
}
.quick-alo-phone .quick-alo-show {
visibility: visible;
}
.quick-alo-phone {
position: fixed;
visibility: hidden;
background-color: transparent;
height: 200px;
width: 82px;
height: 64px;
right: 150px;
top: 60%;
cursor: pointer;
z-index: 200000 !important;
-webkit-backface-visibility: hidden;
-webkit-transform: translateZ(0);
transition: visibility .5s;
}
.quick-alo-phone .quick-alo-green .quick-alo-ph-circle {
border-color: #00A1FF;
opacity: 0.5;
}
.quick-alo-ph-circle {
position: fixed;
width: 160px;
height: 160px;
top: 50px;
left: 50px;
border: 2px solid #00A1FF;
background-color: transparent;
border-radius: 100%;
opacity: .1;
animation: quick-alo-circle-anim 1.2s infinite ease-in-out;
transition: all .5s;
transform-origin: 50% 50%;
}
.quick-alo-phone .quick-alo-green .quick-alo-ph-circle-fill {
background-color: rgb(246, 202, 98);
opacity: .75 !important;
}
.quick-alo-ph-circle-fill {
position: fixed;
width: 100px;
height: 100px;
top: 80px;
left: 80px;
background-color: rgba(0, 161, 255, 0.5);
border-radius: 100%;
border: 2px solid transparent;
opacity: .1;
animation: quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
transition: all .5s;
transform-origin: 50% 50%;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-img-circle {
background-color: #00A1FF;
}
.quick-alo-ph-img-circle {
position: fixed;
width: 60px;
height: 60px;
top: 100px;
left: 100px;
background: #00A1FF url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABrklEQVRYR82XjTEEQRCFX0dABlwEiAARkAEyIAJEoERACETARUAIJwIyeOqptfbm5qeP3lpTdVVXVzPd3/R0v+4zTLxsYv/4XwAkrwDsV6JyZmaLyKj1ESB5AOCpYfzazAQZttYFuDWz8zDvwE8OkNwF8NIwvjCz2SgAMkqSDuOzyDxYqgKSrwB2GhBKxHsHqGtLCiDDJ42Tj2Z27LLu2JQCnAK4a5x7M7Nth23XlhRgE8B74+SemempQtaKEpKsPUPo++sGOYCSIIU7zwJ05ficSLLkV6H/CIn7wEi2GRVkOVwFixEoREE/hz9DsR2TVKkp2zeSsI9bBUNnJNV4bhIA5cFhVCk2B5JCWVYhSEopjwAob6qa4QGQOKkqcj1iJSdIpmoqWEHIhr7Ph1BNgC4haxAPAC7UITPOc1UrCOXR12TlAnBAyKhAdHvPUg4pIn6AAYQc1ebG8QC+LXfD66XHU2HP7yKQlKhGODWu1gCTY/g7wCAaendNyltrRCQOIAERjCc/ejV1V4H3dp2ES4jU1vVJpXxpogoHSEE7oOEIp9G+/3c1OkArcpMDfAIqL6EhVS6JOAAAAABJRU5ErkJggg==") no-repeat center center;
border-radius: 100%;
border: 2px solid transparent;
opacity: .99;
animation: quick-alo-circle-img-anim 1s infinite ease-in-out;
transform-origin: 50% 50%;
}
.quick-alo-phone .quick-alo-green .quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-img-circle {
background-color: #ff0101;
}

@-moz-keyframes quick-alo-circle-anim {
0% {
-moz-transform: rotate(0) scale(.5) skew(1deg);
opacity: .1;
-moz-opacity: .1;
-webkit-opacity: .1;
-o-opacity: .1
}
30% {
-moz-transform: rotate(0) scale(.7) skew(1deg);
opacity: .5;
-moz-opacity: .5;
-webkit-opacity: .5;
-o-opacity: .5
}
100% {
-moz-transform: rotate(0) scale(1) skew(1deg);
opacity: .6;
-moz-opacity: .6;
-webkit-opacity: .6;
-o-opacity: .1
}
}
@-webkit-keyframes quick-alo-circle-anim {
0% {
-webkit-transform: rotate(0) scale(.5) skew(1deg);
-webkit-opacity: .1
}
30% {
-webkit-transform: rotate(0) scale(.7) skew(1deg);
-webkit-opacity: .5
}
100% {
-webkit-transform: rotate(0) scale(1) skew(1deg);
-webkit-opacity: .1
}
}
@-o-keyframes quick-alo-circle-anim {
0% {
-o-transform: rotate(0) kscale(.5) skew(1deg);
-o-opacity: .1
}
30% {
-o-transform: rotate(0) scale(.7) skew(1deg);
-o-opacity: .5
}
100% {
-o-transform: rotate(0) scale(1) skew(1deg);
-o-opacity: .1
}
}
@-moz-keyframes quick-alo-circle-fill-anim {
0% {
-moz-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
50% {
-moz-transform: rotate(0) -moz-scale(1) skew(1deg);
opacity: .2
}
100% {
-moz-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
}
@-webkit-keyframes quick-alo-circle-fill-anim {
0% {
-webkit-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
50% {
-webkit-transform: rotate(0) scale(1) skew(1deg);
opacity: .2
}
100% {
-webkit-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
}
@-o-keyframes quick-alo-circle-fill-anim {
0% {
-o-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
50% {
-o-transform: rotate(0) scale(1) skew(1deg);
opacity: .2
}
100% {
-o-transform: rotate(0) scale(.7) skew(1deg);
opacity: .2
}
}
@-moz-keyframes quick-alo-circle-img-anim {
0% {
transform: rotate(0) scale(1) skew(1deg)
}
10% {
-moz-transform: rotate(-25deg) scale(1) skew(1deg)
}
20% {
-moz-transform: rotate(25deg) scale(1) skew(1deg)
}
30% {
-moz-transform: rotate(-25deg) scale(1) skew(1deg)
}
40% {
-moz-transform: rotate(25deg) scale(1) skew(1deg)
}
50% {
-moz-transform: rotate(0) scale(1) skew(1deg)
}
100% {
-moz-transform: rotate(0) scale(1) skew(1deg)
}
}
@-webkit-keyframes quick-alo-circle-img-anim {
0% {
-webkit-transform: rotate(0) scale(1) skew(1deg)
}
10% {
-webkit-transform: rotate(-25deg) scale(1) skew(1deg)
}
20% {
-webkit-transform: rotate(25deg) scale(1) skew(1deg)
}
30% {
-webkit-transform: rotate(-25deg) scale(1) skew(1deg)
}
40% {
-webkit-transform: rotate(25deg) scale(1) skew(1deg)
}
50% {
-webkit-transform: rotate(0) scale(1) skew(1deg)
}
100% {
-webkit-transform: rotate(0) scale(1) skew(1deg)
}
}
@-o-keyframes quick-alo-circle-img-anim {
0% {
-o-transform: rotate(0) scale(1) skew(1deg)
}
10% {
-o-transform: rotate(-25deg) scale(1) skew(1deg)
}
20% {
-o-transform: rotate(25deg) scale(1) skew(1deg)
}
30% {
-o-transform: rotate(-25deg) scale(1) skew(1deg)
}
40% {
-o-transform: rotate(25deg) scale(1) skew(1deg)
}
50% {
-o-transform: rotate(0) scale(1) skew(1deg)
}
100% {
-o-transform: rotate(0) scale(1) skew(1deg)
}
}
@-moz-keyframes fadeInRight {
0% {
opacity: 0;
-webkit-transform: translate3d(100%, 0, 0);
-ms-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0)
}
100% {
opacity: 1;
-webkit-transform: none;
-ms-transform: none;
transform: none
}
}
@-webkit-keyframes fadeInRight {
0% {
opacity: 0;
-webkit-transform: translate3d(100%, 0, 0);
-ms-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0)
}
100% {
opacity: 1;
-webkit-transform: none;
-ms-transform: none;
transform: none
}
}
@-o-keyframes fadeInRight {
0% {
opacity: 0;
-webkit-transform: translate3d(100%, 0, 0);
-ms-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0)
}
100% {
opacity: 1;
-webkit-transform: none;
-ms-transform: none;
transform: none
}
}

Việc tối ưu file css và js của website với wordpress chúng ta nên sử dụng plugins cache, với những gì kể trên thì plugins cache đó phải đảm bảo các tiêu chí sau :
+Có chức năng Preload
+Minify và nối file js,css
+Lazy Load ảnh và khung iframe
+Nhẹ nhàng
+Tạo cache riêng cho giao diện mobile (cực quan trọng)
+Tối ưu Database
+Disable Emojis
+Hỗ trợ CDN
Tuỳ vào mỗi người sẽ có cách chọn lựa khác nhau, với bản thân thì mình sử dụng Plugins WP Fastest Cache bản Premium để cache, nó chứa các ưu điểm trên và tương thích hầu hết các theme của WordPress.
***************************************************
Câu hỏi : Nếu tôi muốn đạt được 99/100 điểm PSI trên di động sử dụng wordpress, đơn giản nhất tôi sẽ làm gì ?
Trả lời : Bạn chỉ cần cài giao diện Astra phiên bản miễn phí, kết hợp plugins WP Fastest Cache bản Premium ,không sử dụng Page Buider để tuỳ biến trang chủ,dùng VPS tối thiểu 2GB ram, bật CDN từ Clouflare và phải sử dụng chứng SSL có phí, không lên được 99 điểm bán vốn mình ngay và luôn.
P/S : Không phải cứ PSI cao thì website nó tốt ,nó chẳng nói lên điều gì cả, chỉ cần website tải nhanh là được, người phán xét website của bạn suy cho cùng là người dùng, họ là người phán quyết cuối cùng chứ không phải PSI !

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

Bài viết được chia sẽ bởi bạn Trần Quang Nam

 

Cơ hội đổi mới tương lai tại DFO, nỗ lực vươn xa ra thế giới

Direct Focus Online DFO – một công ty agency toàn cầu, là đối tác cung cấp các chiến dịch digital marketing thành công và bùng nổ trên mạng Internet cho nhiều thương hiệu lớn. Với đội ngũ hàng trăm nhân viên trên toàn cầu, có trình độ và kiến thức chuyên sâu về marketing kết hợp cùng công nghệ, machine learning và AI – DFO đã từng bước khẳng định vị thế của mình và viết lên những câu chuyện thành công cho các khách hàng trên thế giới.

DFO – Thành công đã được chứng minh

Theo nhóm các chuyên gia Marketing và chuyên gia công nghệ có kiến thức chuyên sâu về hiệu suất thương mại toàn cầu, DFO đã xây dựng thành công các chiến dịch e-commerce hướng đến hiệu quả tối ưu. Thông qua những sản phẩm chất lượng cao, DFO nhận được nhiều sự đánh giá tốt và hài lòng của những khách hàng tên tuổi.

Tim Shea, Phó Chủ tịch Digital, Tommie Copper đã hết mực bày tỏ sự hài lòng về DFO: “DFO đã giúp chúng tôi phát triển đáng kể trong những năm qua. Họ vẫn liên tục bám sát công việc kinh doanh và tìm ra những cơ hội mới để điều chỉnh hiệu suất công việc theo đúng như những gì các agency mong muốn”.

Bryant Hussey, Phó chủ tịch, Marketing Online, Thương hiệu Atlantic Coast cũng đã đưa ra những đánh giá tuyệt vời cho những gì mà DFO đã mang lại cho  Atlantic Coast: “DFO là những đối tác marketing tuyệt vời của chúng tôi. Họ mang lại cho chúng tôi các kỹ năng chuyên môn cao liên quan đến những gì chúng tôi cần cho việc kinh doanh trong những ngày qua. Chúng tôi còn được hỗ trợ nhiệt tình từ in-house team của họ và nhận thấy được sự khéo léo và đầy trách nhiệm từ khách hàng. Tôi nghĩ rằng DFO là một điểm đến lý tưởng cho bất cứ ai muốn thành công”.

DFO mở cửa cơ hội, trao tấm vé thành công

Hiện diện trên toàn cầu, DFO hiện có văn phòng tại Canada, Hoa Kỳ, Hà Lan, Hồng Kông, Brazil và Philippines. Với việc mở thêm văn phòng mới ở Việt Nam, công ty DFO đang tập trung hướng vào sự đổi mới mạnh mẽ. DFO đang thành lập một đội ngũ gồm những lập trình viên tài năng và sáng tạo, có chuyên môn cao trong lĩnh vực xây dựng chương trình phần mềm với khả năng thay đổi diện mạo của thương mại điện tử tại Việt Nam trong tương lai.

Hơn hết nữa, DFO còn đang trao cơ hội đặc biệt đến những nhân tố tài năng muốn trở thành Software Development Project Manager. Vị trí này được DFO ưu ái trao MỨC LƯƠNG KHỞI ĐIỂM TỪ $2,500, bên cạnh đó đi cùng chuỗi đãi ngộ:

  • Offer cạnh tranh: From $2,500;
  • Lương tháng 13 hấp dẫn vào hàng năm;
  • Nhận trợ cấp giáo dục sau 1 năm làm việc;
  • Chế độ chăm sóc sức khỏe và nha khoa định kỳ;
  • Làm việc với đội ngũ năng động, vui nhộn, đa dạng, đa quốc gia;
  • Tiếp cận, học hỏi với các công nghệ hiện đại và mới nhất;
  • Cơ hội đào tạo toàn cầu và có các chuyến đi đến Hoa Kỳ, Canada, Châu Âu và các khu vực của châu Á.

Gia nhập DFO, thành viên mới sẽ được làm việc tại môi trường quốc tế chuyên nghiệp, mọi đề xuất hay ý kiến luôn được coi trọng và đánh giá cao. Đây là một điều kiện rất tốt để khuyến khích các cá nhân tại DFO thoải mái phát triển, trao quyền bứt phá để vươn tới những thành công trong tương lai.

Bạn đã sẵn sàng nắm giữ cơ hội?

Apply ngay vị trí Software Development Project Manager nhanh thôi

Mô tả công việc:

  • Ghi lại tất cả requirement của dự án;
  • Lên kế hoạch phân công nhân sự cho dự án;
  • Làm việc với các lập trình viên;
  • Lập kế hoạch dự án chi tiết để theo dõi tiến độ;
  • Đảm bảo tính khả dụng và sự phân bổ nguồn lực;
  • Hỗ trợ công tác tuyển dụng nhân viên mới;
  • Cộng tác với những đơn vị kinh doanh liên quan bao gồm marketing;
  • Phân công rõ nhiệm vụ các task và các quyết định trong công việc,

Yêu cầu:

  • Nghiên cứu về lĩnh vực khoa học máy tính hoặc quản lý dự án;
  • Có kinh nghiệm về thương mại điện tử hoặc nghiệp vụ kinh doanh ngân hàng là một lợi thế;
  • Giấy chứng nhận PMP / SCRUM là một lợi thế;
  • Có kinh nghiệm trong quản lý phát triển phần mềm;
  • Có kiến thức về phương pháp quản lý Agile và từng có kinh nghiệm trong việc đưa quy trình quản lí phát triển phần mềm vào phù hợp;
  • Khả năng phân tích và ghi lại các tính năng requirement chi tiết của phần mềm;
  • Khả năng ước tính thời gian hoàn thành cho một phần mềm mới;
  • Theo dõi chi tiết, cam kết kiểm tra và đánh giá chất lượng;
  • Kỹ năng diễn giải bằng văn bản và kỹ năng giao tiếp tốt.

Khám phá các vị trí tuyển it từ DFO hấp dẫn khác tại đây: chi tiết

Software Design, nó có thật sự quan trọng không ?

Sẽ không lạ gì khi chúng ta đi gặp các engineer, rất ít người quan tâm tới kiến trúc, software design. Đa số họ đều không quan tâm rằng mình đang làm việc trên một code base như thế nào. Với họ công việc engineer chỉ là done các tasks nhàm chán mỗi ngày, fix bug của nhau.

Việc này theo quan điểm cá nhân mình thấy có hai nguyên nhân:

Thứ nhất: chúng ta thường chỉ có xu hướng dùng lib và quan tâm nó chạy nhanh hay chậm, có đáp ứng được nhu cầu không. Còn việc contribute cho lib thì sao ?! Hay thậm chí hiểu lib đó chạy thế nào ?! Gần như là không. Việc này lâu ngày sẽ hình thành một thói quen không tốt, cứ xài và chỉ xài thôi, tới khi gặp vấn đề thì … đi tìm lib khác.

Xem thêm các tin đăng việc làm software developer trên TopDev

Có một điều rất thú vị là những lib tốt, có nhiều star trên Github hầu hết là những lib có thiết kế tốt. Hoặc nếu nó chưa tốt, họ sẽ làm nó tốt lên, không chỉ là fix bugs mà còn thiết kế lại và ngày càng hoàn thiện hơn. Thậm chí họ, những người contribute cho lib còn viết rất kỹ phần documentation, làm cả hướng dẫn contribute. Nên nhớ rằng họ đang làm tất cả những việc đó không lương, không thưởng, không KPI.

Thứ hai là nguyên nhân từ các công ty không phải “engineer first”. Với các công ty này, các engineer và coder hay thậm chí editor cũng không có gì khác biệt. Bạn được tuyển vào để đứng vào một vị trí có sẵn, vận hành guồng máy có sẵn, thao tác y chang như quy trình đề ra, thế là xong. Từ thế hệ này tới thế hệ khác, nhiều người ra vào công ty chỉ để “trả nợ kỹ thuật”, cho tới khi các nhà lãnh đạo nhận ra vòng lặp này không giúp họ tạo ra giá trị công ty nữa… họ sẽ bắt đầu nghĩ tới việc tạo ra vòng lặp khác.

Một điều thật kỳ lạ rằng ở các công ty này luôn rất chú trọng tốc độ phát triển sản phẩm, nhưng lại không nhận ra rằng tốc độ ấy đang chậm hơn từng ngày. Việc tuyển thêm nhiều người vào làm thêm tính năng cũng giống như việc chúng ta cố xây thêm nhiều tầng cho căn nhà lá lụp xụp, rào chỗ này chống chỗ kia, miễn nó không sập là tốt.

Rất nhiều vòng lặp như vậy đã đang và vẫn tồn tại.

Việt Trần – Software Architect at Sendo

Xây dựng API với NodeJS không sử dụng Framework và thư viện bên ngoài (Libraries)

NodeJS

Biên dịch: Trần Thanh Dân

NodeJS thường được sử dụng với Express framework. Ngoài ra NodeJS còn được sử dụng một loạt các thư viện bên ngoài khác.

Lý do frameworks và libraries  được sử dụng cùng với NodeJS là làm cho việc phát triển dễ dàng hơn và nhanh hơn nhiều.

Trong khi làm việc trên bất kỳ dự án thực tế nào, tốt nhất là sử dụng Frameworks và libraries khi cần thiết để cho phép phát triển nhanh hơn.

Điều đó nói rằng, trong bài này tôi sẽ chỉ cho bạn cách xây dựng Simple API với NodeJS mà không cần sử dụng frameworks  hoặc bất kỳ libraries nào khác. Bài viết này sẽ chỉ sử dụng những chức năng được cung cấp bởi NodeJS.

Lý do cho điều này là để cho thấy NodeJS có thể được sử dụng như thế nào nếu không có frameworks và libraries. Ngoài ra điều này sẽ giúp hiểu tốt hơn cách hoạt động của NodeJS

Tuyển dụng NodeJS lương cao hấp dẫn cho bạn

Chuẩn bị:

Cài đặt NodeJS tại  https://nodejs.org

Mã của bài viết này được lưu trữ tại github repo.

Tạo một thư mục có tên là simple-rest-apis-nodejs-without-frameworks. Đây sẽ là thư mục project NodeJS của chúng ta.

Vào thư mục simple-rest-apis-nodejs-without-frameworks và sử dụng npm init để làm cho thư mục này trở thành project NodeJS. Các lệnh để thực hiện điều này là

cd simple-rest-apis-nodejs-without-frameworks
npm init

package.json

Sau khi chạy npm init, tệp package.json được tạo trong thư mục simple-rest-apis-nodejs-without-frameworks.

package.json chứa thông tin về project như tên project, phiên bản, mô tả, v.v. Ngoài ra package.json là nơi chúng ta sẽ thêm các dependencies của node. Trong bài viết này, chúng ta sẽ không có bất kỳ dependencies nào vì chúng ta chỉ sử dụng các chức năng được cung cấp bởi chính NodeJS.

server.js

tạo một tệp có tên là server.js bên trong thư mục dự án. Sau đó, sao chép mã sau đây vào server.js

const hostname = '127.0.0.1';
const port = 3000;

const server = require('./controller.js');

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Mã này thực sự dựa vào một tệp được gọi là controller.js mà chúng ta sẽ sớm bổ sung. Mã này cho biết máy chủ cần listen trên cổng 3000 và localhost.

Việc tạo máy chủ được thực hiện trong controller.js

controller.js

Đây là tập tin mà chúng ta sẽ tạo máy chủ và xác định các rest endpoints. Tạo một tập tin là controller.js

Hãy tạo một GET endpoint  đầu tiên trong controller.js

const http = require('http');
const url = require('url');

module.exports = http.createServer((req, res) => {

    var service = require('./service.js');
    const reqUrl = url.parse(req.url, true);

    // GET Endpoint
    if (reqUrl.pathname == '/sample' && req.method === 'GET') {
        console.log('Request Type:' +
            req.method + ' Endpoint: ' +
            reqUrl.pathname);

        service.sampleRequest(req, res);
    } 
});

Module http url được khai báo đầu tiên. Các mô-đun này được cung cấp bởi chính NodeJS.

http module cho phép tạo các ứng dụng web. Nó hỗ trợ hoạt động của client và server.

module url giúp parse url

http.createServer ((req, res) => {chỉ ra rằng máy chủ http cần được tạo với yêu cầu (request) là req và kết quả trả về (response) như res

module.exports được sử dụng để xuất tệp này dưới dạng module. Đây là lý do tại sao chúng ta có thể import controller.js trong server.js bằng cách sử dụng const server = require (‘./ controller.js’);

Có thể thấy rằng tệp này require service.js mà chúng ta sẽ tạo sau.

const reqUrl = url.parse (req.url, true); nhận được url yêu cầu và phân tích cú pháp nó để chúng tôi có thể chạy một số hàm url trên đó.

chúng ta sẽ tạo một routes GET với url là /sample

Để thực hiện định tuyến url (In order to do url routing), chúng ta sẽ sử dụng if else conditions

Dòng if (reqUrl.pathname == ‘/sample’ && req.method === ‘GET’) {kiểm tra nếu url request là /sample và cũng kiểm tra xem phải là phương thức GET hay không

service.sampleRequest (req, res); là hàm được định nghĩa trong service.js

service.js

Tạo file service.js.

Sao chép mã sau vào service.js

const url = require('url');

exports.sampleRequest = function (req, res) {
    const reqUrl = url.parse(req.url, true);
    var name = 'World';
    if (reqUrl.query.name) {
        name = reqUrl.query.name
    }

    var response = {
        "text": "Hello " + name
    };

    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify(response));
};

Mã này kiểm tra xem request URL có tham số truy vấn là name hay không, nếu có thì lưu trữ nó trong biến name. Nếu không có tham số truy vấn thì biến name mặc định có giá trị là World. 

Trạng thái trả về được đặt là 200, Dữ liệu trả về là JSON và cuối cùng dữ liệu được trả về bằng cách sử dụng res.end (JSON.stringify (response));

Vì biến response là một đối tượng JSON, nên đã sử dụng JSON.stringify để chuyển đổi nó thành chuỗi trước khi trả về dữ liệu

Bây giờ chúng ta có thể chạy ứng dụng bằng lệnh

node server.js

mở trình duyệt lên và truy cập url http://localhost:3000/sample?name=aditya, nếu kết quả trả về

 

 

hoặc truy cập url http://localhost:3000/sample và kết quả

Đến đây thì bạn đã biết cách tạo API trong NodeJS mà không cần sử dụng bất kỳ Framework hoặc Libraries bên ngoài nào khác.

Xem thêm các việc làm IT tại Topdev.vn

Cơ hội làm việc tại Tripath Việt Nam: liên tục thách thức, phát triển không ngừng

Cơ hội làm việc tại Tripath Việt Nam

Đem theo luồng khí và hơi thở “lành nghề” về công nghệ từ xứ sở kim chi, Tripath Việt Nam (công ty con của TRIPATH INC, một tập đoàn công nghệ thông tin, thương mại và giáo dục) trở thành môi trường phát triển tiềm năng của nhiều lập trình viên. Tại đây, con người và công nghệ hòa làm một, Tripath luôn mong muốn tạo ra các giá trị mới dựa trên sự hiểu biết về công nghệ, con người và thị trường.

Với khẩu hiệu đắt giá “Tưởng tượng và thách thức” – “Imagine and Challenge”, đại gia đình Tripath luôn làm việc hăng say và liên tục thách thức các lĩnh vực mới để tạo ra những sản phẩm với nhiều tính năng cao cấp, tiện lợi và đem đến cho khách hàng những trải nghiệm chăm sóc tốt nhất.

Không chỉ dừng ở đó, yếu tố mà Tripath xem là tài sản duy nhất và quý giá nhất chính là con người, Tripath luôn tạo mọi điều kiện để nhân viên của mình có thể kiến tạo nên một sự nghiệp vững chắc.

Nếu bạn muốn trở thành “người một nhà” cùng Tripath, bạn sẽ phải lòng ngay từ đầu vì độ tuyệt vời mà môi trường Tripath mang lại:

  • Ở đây bạn được là chính bạn, được tha hồ vùng vẫy thỏa sức khám phá không giới hạn, sáng tạo vô biên;
  • Làm việc với những đồng nghiệp trẻ trung yêu đời, luôn làm việc hết mình và ăn chơi hết cỡ, hỗ trợ nhau những lúc khó khăn;
  • Tripath không quan tâm bạn xuất phát từ đâu vì chính Tripath sẽ vạch ra lộ trình sự nghiệp cho bạn. Có một điều ít ai biết rằng Tổng Giám Đốc của Tripath cũng khởi điểm từ nhân viên IT nên sẽ có chung chí hướng với bạn;
  • Mỗi người đều có phần thưởng xứng đáng cho những thành tựu và đóng góp;
  • Cơ hội được giao lưu làm việc tại Hàn Quốc, được chứng tỏ bản thân trong môi trường làm việc trong nước cũng như quốc tế;

Quá trình không quan trọng bằng kết quả, nhưng không có quá trình liệu bạn có đạt được kết quả cao? Vì thế Tripath luôn sẵn sàng dành những đãi ngộ tốt nhất cho những nhân tố sáng giá, không ngại xông pha và bứt phá hết mình.

Đặc biệt hiện nay, Tripath đang mở ra cơ hội cho các Back-end Developer (HTML5, Ruby on Rails, Ruby) có mong muốn tìm nơi phát triển sự nghiệp bền vững. Trở thành Back-end Developer tại Tripath, bạn sẽ được nhận chuỗi phúc lợi tương xứng với đúng năng lực:

  • Offer hấp dẫn lên đến $2,000;
  • Bonus nóng: lương tháng 13 và những khoản thưởng khác;
  • Cơ hội giao lưu làm việc tại Hàn Quốc;
  • Chăm lo trọn gói các chế độ bảo hiểm lao động và chế độ chăm sóc sức khỏe ;
  • Đồ ăn nhẹ với thức uống miễn phí ngay tại nơi làm việc, đặc biệt còn có trái cây tươi hằng ngày;
  • Môi trường làm việc trẻ trung, năng động và thân thiện;

Link job chi tiết: https://topdev.vn/s/jKx9Z3ym

Mô tả công việc:

  • Xây dựng hệ thống quản lý giáo dục với Rails;
  • Thiết kế giản đồ cho DB với tính linh hoạt cao (cấu hình tốt, hiệu năng cao);

Yêu cầu:

  • Có kinh nghiệm chuyên môn về cấu trúc dự án;
  • Có kinh nghiệm chuyên môn về thiết kế RESTful WS;
  • Có kinh nghiệm chuyên môn về DB (Postgress, MySQL,..), có khả năng hiểu về complex queries trong SQL và EXPLAIN query;
  • Có kinh nghiệm trong việc giải quyết tính không đồng bộ (Cronjob, Delayed Job);
  • Có kinh nghiệm với message queue, memory cache (RabbitMQ, Kafka, Redis, …)
  • Ưu tiên với ứng viên có kinh nghiệm trong việc sử dụng Doker;
  • Kinh nghiệm chuyên môn về Git;
  • Có ít nhất 1 sản phẩm mà bạn tham gia và đóng góp phát triển;

Thách thức không ngừng, vững chắc tương lai

<<Apply Tripath Việt Nam ngay hôm nay>>

Dev cần làm gì để được săn đón?

Dev cần làm gì để được săn đón

Không có đạo lý gì cao siêu cả, chỉ đúc kết lại trải nghiệm của bản thân sau khi đi xin việc nhiều, phỏng vấn tuyển dev cũng nhiều, làm việc trong nhiều môi trường (outsource, product, remote), mỗi môi trường, mỗi công ty lại yêu cầu skill set khác nhau. Và đúc kết từ trải nghiệm của đồng nghiệp là các giám đốc nhân sự, headhunt, recruiter cho các công ty, tổ chức.

Dev cần làm gì để được săn đón

Gồm 2 điểm chính:

  • Kinh nghiệm
  • Tiềm năng

Cùng làm rõ khái niệm kinh nghiệm:

  • Thực tập có tính là kinh nghiệm?
  • Bài tập lớn, đồ án tốt nghiệp có tính là kinh nghiệm?
  • Sản phẩm cá nhân, tự học code có tính là kinh nghiệm? (Ví dụ, tạo blog cá nhân bằng wordpress, tạo chatbot tự động trả lời inbox bằng Node.js)
  • Độ lớn project bao nhiêu thì được tính là kinh nghiệm?
  • Học code PHP 6 tháng có nghĩa là đã có 6 tháng kinh nghiệm với PHP?

Phần lớn các bạn sinh viên khi mình phỏng vấn đều hiểu sai định nghĩa về kinh nghiệm và tự nâng cao kinh nghiệm của bản thân lên cao hơn với thực tế.

Kinh nghiệm là thứ dùng được luôn hoặc trong thời gian ngắn 1,2 tháng.

Quy chiếu sang tiềm năng:

Tiềm năng là thứ dùng được trong tương lai, có thể 6 tháng, 1 năm, 2 năm…

Như thế nào là dùng được? Tự trả lời các câu hỏi dưới đây nhé:

  • Bạn vừa làm bài tập tạo chatbot bằng Node.js xong, công ty cần dev Node.js
  • Bạn vừa làm bài tập tạo chatbot bằng Node.js xong, công ty cần dev Node.js cho sản phẩm chatbot
  • Bạn code outsource PHP, database mysql dự án site blog, tin tức 1 năm. Công ty cần dev xây dựng hệ thống lớn bằng PHP, database Spark??
  • Bạn thực tập code Java 1 năm, đóng góp 5% code production của hệ thống?
  • Bạn thực tập code Java 1 năm, đóng góp 40% code production của hệ thống?
  • Bạn thực tập code Java 6 tháng, đóng góp 60% code development của hệ thống?

Yếu tố production và development, sản phẩm nội bộ, sản phẩm tỉ người dùng cũng là 1 yếu tố quan trọng. Nó thể hiện bạn là thanh niên vừa qua nghĩa vụ hay bộ đội trên chiến trường, độ khốc liệt của chiến trường như nào…

Những điều này sẽ được recruiter đào sâu khi phỏng vấn, sau vài câu hỏi bạn được xác định là dev kinh nghiệm hay dev tiềm năng. Tiếp đó, mỗi nhánh lại có bộ câu hỏi riêng để định giá bạn.

Đây cũng là mẹo để dev tự định giá bản thân. Với mỗi công ty, dev sẽ có giá trị khác nhau, Nhớ: đừng bao giờ fix cứng giá bản thân 🙂

Cùng chào hàng bản thân để được giá nhất nào. Chúng ta lại tiếp tục với các câu hỏi:

  • Dev kinh nghiệm như nhau thì đâu để bạn có giá nhỉnh hơn?
  • Cùng dev tiềm năng, ai sẽ được chọn, mức lương ai cao hơn?
  • Không kinh nghiệm, không tiềm năng, lấy gì để được chọn?

Thước đo cho tiềm năng là thời gian, vậy sau bao lâu thì từ một dev tiềm năng trở thành một dev thực thụ?

Bạn tự tin sau 6 tháng bạn cân cả team dev của công ty, nhưng công ty cần launch sản phẩm trong 3 tháng tới?

Cho dù dev kinh nghiệm cũng cần thể hiện tiềm năng rằng mình sẽ nâng trình độ lên nữa trong thời gian ngắn hơn những dev khác (trả lời câu hỏi thứ nhất)

  • Khả năng học hỏi, đào sâu kiến thức
  • Khả năng teamwork, phối hợp
  • Khả năng kiểm soát cảm xúc

Khả năng kiểm soát cảm xúc giúp nhà tuyển dụng cảm thấy yên tâm hơn về tiềm năng của ứng viên

Trả lời cho câu hỏi cuối cùng, tại sao hàng trung quốc không ngon bằng hàng việt, không bền bằng hàng tây nhưng vẫn được chọn?

Kết luận:

Vẫn như các bài trước, mình vẫn hỏi: Bạn muốn gì?

  • Muốn lương cao, chọn công ty phù hợp skill set
  • Muốn phát triển bản thân, chọn công ty cao hơn skill set, dĩ nhiên tỉ lệ với lương. Đây là thứ công ty cho bạn ngoài tiền, chính là kiến thức
  • Muốn việc nhẹ, lương cao, phát triển được bản thân? Không có đâu bạn, cuộc sống này công bằng lắm 🙂

Ghi chú:

  • Skill set không phải thuần tech nhé, phù thuộc vào công ty. Ví dụ như bọn mình ưu tiên dev biết marketing và business.
  • Thường thì người ta không biết mình muốn gì cho đến khi: 1, mất đi cái đó và 2, dùng thử cái đó
  • Như thường lệ, cuộc sống này rất công bằng, đừng tham lam quá 🙂

Tác giả: Đức Duy – Bài viết gốc được đăng tải tại Medium

f

  Kinh nghiệm đọc tài liệu để trở thành Developer giỏi

Giải mã sức hút từ TEK EXPERTS, văn phòng đáng mơ ước của nhiều lập trình viên

Cách mạng công nghiệp 4.0 bùng nổ, việc phát triển robot và trí tuệ nhân tạo (AI) có khả năng trong tương lai sẽ thay thế con người ở nhiều công việc. Điều này vừa là cơ hội vừa là thách thức với những công ty thuộc lĩnh vực công nghệ. Thế nhưng với Tek Experts, con người luôn là yếu tố quan trọng mà máy móc không bao giờ thay thế được. Chính sự kết hợp hoàn hảo giữa con người và công nghệ mới tạo ra những giá tri cốt lõi, giúp Tek Experts ghi dấu ấn vững chắc trong hành trình chinh phục các khách hàng lớn trên toàn thế giới.

Con người là giá trị hàng đầu tại TEK EXPERTS

Là công ty hàng đầu thế giới cung cấp các gói dịch vụ hỗ trợ kinh doanh và IT, Tek Experts đồng thời cũng là một nhà phát triển các công nghệ hỗ trợ khách hàng đội ngũ nhân viên làm việc chuyên nghiệp, hiệu quả. Các dịch vụ tại Tek Experts luôn được triển khai bởi đội ngũ nhân sự tài năng, có chuyên môn cao, đầy đam mê và nhiệt huyết. Tek Experts hiểu rõ vai trò của công nghệ cũng như tầm quan trọng của đội ngũ, cả 2 yếu tố luôn có thể kết hợp với nhau để phát triển. Công nghệ sẽ hỗ trợ, cung cấp dữ liệu kịp thời, giúp nhân viên phục vụ khách hàng tốt hơn. Đội ngũ chuyên gia kỹ thuật dựa vào công nghệ để đưa ra giải pháp, dễ dàng giao tiếp với khách hàng để có thể hỗ trợ họ một cách hiệu quả nhất.

Dự kiến đến cuối năm 2018, đội ngũ nhân viên ở Việt Nam của Tek Experts sẽ đạt tới con số 1000, và văn phòng tại Việt Nam sẽ trở thành văn phòng lớn thứ 2 trên thế giới của Tek Experts. Để thu hút được nhân lực ngành CNTT ở Việt Nam, Tek Experts mong muốn mang lại những giá trị tốt nhất cho nhân viên của mình, giúp họ tạo dựng được một sự nghiệp chứ không đơn thuần chỉ là công việc. Dưới đây là 3 lợi ích mà bạn sẽ nhận được khi gia nhập đại gia đình Tek Experts:

  • Lộ trình phát triển sự nghiệp: không ngừng nuôi dưỡng các tài năng trẻ, đào tạo chuyên sâu từ chuyên môn đến các kiến thức thương mại và những kỹ năng bổ ích khác. Những sinh viên mới ra trường luôn được chào đón và tạo cơ hội, sau vài năm làm việc sẽ được phát triển ở tầm cao hơn, chính thức bước lên một nấc thang mới trong sự nghiệp.
  • Môi trường làm việc quốc tế: các nhân viên luôn có cơ hội trau dồi kỹ năng giao tiếp tiếng Anh và các ngôn ngữ khác. Vì các đối tác đa phần là các khách hàng doanh nghiệp trên toàn cầu, thành viên của Tek Experts sẽ có cơ hội đi công tác đến nhiều nơi trên thế giới, mở mang học hỏi và khám phá thêm nhiều kiến thức.
  • Văn hóa doanh nghiệp: khi làm việc tại Tek Experts, bạn sẽ được gắn kết với rất nhiều đồng nghiệp vui vẻ, cởi mở và thân thiện. Các nhân viên sẽ luôn hỗ trợ nhau, tạo thành khối thống nhất phát triển để cùng đi xa hơn. Môi trường hợp tác và chia sẻ chính là nét văn hóa của Tek Experts.

Đãi ngộ đặc biệt, phúc lợi cho nhân viên chưa bao giờ thua thiệt!

Tek Experts được biết đến là một môi trường luôn tạo cơ hội phát triển cho đội ngũ nhân viên, đặc biệt là đầu tư phát triển nhân lực để phát triển doanh nghiệp bền vững. Để có thể nâng cấp các trải nghiệm của khách hàng, đội ngũ tại Tek Experts phải luôn không ngừng nâng cao năng lực chuyên môn, chính vì lẽ đó mà nhân viên của Tek Experts sẽ không chỉ được tham gia các khóa đào tạo nội bộ, mà còn có cơ hội phát triển các kỹ năng mới và nhận chứng chỉ thông qua các khóa học bên ngoài công ty.

Vì yếu tố con người luôn được đặt lên hàng đầu, Tek Experts không ngừng mang lại cho nhân viên các chính sách đãi ngộ hấp dẫn nhất, đặc biệt là mức lương cạnh tranh cao hơn so với những công ty trong nước:

  • Thu nhập hấp dẫn dựa theo năng lực của cá nhân;
  • Làm việc hiệu suất cao, nhận thưởng càng hấp dẫn;
  • Cơ hội thăng tiến không ngừng cho những tài năng thực sự;
  • Cơ hội làm việc và học hỏi từ các đối tác CNTT hàng đầu thế giới;
  • Luôn được cập nhật nhiều kiến thức bổ ích, được tạo điều kiện khai phá năng lực bản thân;
  • Ăn chơi hết mình, quẩy thả ga trong nhiều dịp đặc biệt vào hằng năm (summer trip, year-end party, team building).

Với những chính sách hấp dẫn đó, Tek Experts tin rằng sẽ mang lại cho nhân viên động lực phát triển tốt nhất, tạo ra năng suất làm việc thật cao và có thể bứt phá vươn xa. Bằng chứng là có 17,5% số lượng nhân viên được thăng chức lên vị trí quản lý/ chuyên gia cao cấp sau thời gian làm việc trên 3 năm tại Tek Experts đi cùng chế độ lương thưởng ấn tượng, song hành với nhiều hoạt động ngoại khóa thú vị.

Bạn có muốn là mảnh ghép tiếp theo của Tek Experts Việt Nam?

Hiện Tek Experts sở hữu văn phòng tại 7 quốc gia gồm Costa Rica, Nigeria, Mỹ, Bulgaria, Malta, Trung Quốc và Việt Nam. Riêng tại Tek Experts Việt Nam, từ con số vài chục nhân viên ban đầu thì giờ đội ngũ đã lên tới gần 700 nhân viên và sẽ còn tăng mạnh vào cuối năm nay, trở thành một trong 3 văn phòng lớn nhất trên thế giới của Tek Experts.

Đặc biệt Tek Experts Việt Nam còn gây thu hút giới trẻ bởi văn phòng làm việc đáng mơ ước tại Hà Nội, với tổng diện tích 2 văn phòng lên tới 4.000 m2 cùng khu sky garden thiết kế độc đáo. Tại đây còn có các khu không gian mang lại trải nghiệm tuyệt vời như khu chơi game trên máy Xbox 360, không gian test các thiết bị phần mềm để cung cấp các trải nghiệm chuyên sâu về sản phẩm và hỗ trợ các kỹ năng mềm phục vụ khách hàng. Điều này lại càng giúp cho môi trường làm việc tại Tek Experts trở nên thú vị, hiện đại và mang đến những phút giây giải trí hiệu quả cho nhân viên.

Bạn có muốn khám phá năng lực bản thân và tạo cho mình nhiều cơ hội thăng tiến?

Bạn có muốn cùng Tek Experts vừa làm việc tại văn phòng mơ ước, vừa cùng nhau dành thời gian thư giãn giải trí tại Sky Garden hay chơi game xả stress với vài ván Xbox?

Đừng ngại ngần điều gì cả, hãy đến với văn phòng của Tek Experts Việt Nam để quan sát và cảm nhận môi trường làm việc. Nhanh tay gõ cửa – gửi CV ngay để ứng tuyển cho vị trí bạn yêu thích nhất.

TOP các vị trí hấp dẫn tại Tek Experts không thể bỏ lỡ

  • Solution Architect (.NET, SQL Server, Business Intelligence)
  • Senior Database Administrator (MS SQL, SQL Server, Business Intelligence)
  • Software Support Engineer (Technical Support)

Cùng Tek Experts viết tiếp hành trình mới – BẠN ĐÃ SẴN SÀNG?

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

Cách thiết lập một project symfony hỗ trợ làm việc với các subdomain

Tác giả:  Artem Henvald

Có những tình huống khi Symfony cần định tuyến dựa trên subdomain. 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ư điều khoản thỏa thuận người dùng 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 subdomain 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 subdomain 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 subdomain khác, như ‘my’, ‘stats’, ‘legacy’,…

Khi bạn cần các subdomain riêng biệt:

Có subdomain 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 subdomain có liên quan.

Cách tùy chỉnh Project bằng các Subdomain 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 subdomain 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 subdomain 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ị project-name-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 sửa tệp /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:

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ậy 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 codeburst.io

Framework là gì? Tìm hiểu về các Framework

framework-la-gi

Framework là gì?

Framework là các đoạn code đã được viết sẵn, cấu thành nên một bộ khung và các thư viện lập trình được đóng gói. Chúng cung cấp các tính năng có sẵn như mô hình, API và các yếu tố khác để tối giản cho việc phát triển các ứng dụng web phong phú, năng động. Các framework giống như là chúng ta có khung nhà được làm sẵn nền móng cơ bản, bạn chỉ cần vào xây dựng và nội thất theo ý mình.

Các loại Framework

Hiện nay chưa có quy ước về cách phân loại các framework, tuy nhiên để dễ hiểu có thể chia như sau:

  • Theo ngôn ngữ: JavaScript frameworks, HTML & CSS frameworks, NET Framework,…
  • Theo hệ điều hành hỗ trợ: Windows framework, Android framework, iOS framework,…
  • Theo ứng dụng: Web framework, Mobile framework, Front-end framework, Back-end framework,…

Hoặc kết hợp ta có các framework như front-end web framework hay framework java backend

Các framework ứng dụng web là các framework phần mềm được sử dụng để sắp xếp hợp lý các ứng dụng web và phát triển trang web, các dịch vụ web và các tài nguyên web. Một loại framework ứng dụng web phổ biến là kiến trúc Model-View-Controller (MVC). Như chúng ta đã biết để lập trình một website chúng ta sử dụng tới 3 ngôn ngữ thành phần là HTML, CSS và Javascript sau đó kết hợp với một ngôn ngữ kịch bản máy chủ như PHP, ASP.NET, JAVA… với mỗi thành phần này chúng ta có các framework khác nhau.

Framework cho ứng dụng di động giúp bạn có thể viết code một lần và có thể chạy trên iOS và Android. Đó chính là điểm mạnh của nó để giảm thời gian phát triển sản phẩm so với native code. Hiện tại các framework này đa số dùng Javascript làm ngôn ngữ phát triển nổi bật như là React Native của Facebook, ngoài ra còn có Xamarin của Microsoft dùng C#, Flutter dùng ngôn ngữ Dart của Google.

Các tính năng cốt lõi của Framework web

Framework giúp tăng hiệu suất, mở rộng các chức năng và cung cấp các thư viện sẵn có để các nhà phát triển không phải làm lại từ đầu.

Có rất nhiều framework khác nhau từ nhỏ đến lên, từ ngôn ngữ này đến ngôn ngữ khác — nhà phát triển có thể lựa chọn dựa trên nhu cầu dự án hoặc phong cách làm việc của riêng họ. Mỗi ngôn ngữ lập trình có ít nhất một framework. Các thư viện trong mỗi framework cung cấp các gói có thể sử dụng lại của ngôn ngữ đó.

Một framework cho web bao gồm:

  • Libraries: Thư viện là các đoạn mã xây dựng sẵn cho một chức năng nào đó (Design pattern), bạn có thể tái sử dụng chức năng đó mà ko phải code lại. Có nhiều tools quản lý thư viện như NPM, Composer
  • API: là phương thức trao đổi dữ liệu giữa các ứng dụng chính và ứng dụng khác. Đọc thêm RESTful API là gì nhé.
  • Scaffolding: Một bộ khung các quy tắc mà một framework MVC sử dụng quy hoạch cơ sở dữ liệu có thể được truy cập như thế nào.
  • AJAX: update thông tin lên database mà không cần load lại trang.
  • Caching: giúp giảm request đến máy chủ, tăng tốc độ load trang.
  • Security: framework xác thực và ủy quyền user.
  • Compilers : trình biên dịch từ code của bạn qua ngôn ngữ cho máy.

Tham khảo thêm về web framework

Các Framework để phát triển ứng dụng Mobile

“Viết một nơi, chạy muôn nơi” là code được viết một lần duy nhất trên một platform, nhưng có thể chạy trên nhiều platform khác nhau. Với sự đa dạng ngày càng gia tăng của thiết bị di động, lập trình viên hiện đang gặp thêm nhiều khó khăn để cho ra được ứng dụng vì user hiện phân bố ở nhiều platform khác nhau.

Mục tiêu của bài viết là cách viết multi-platform apps (ứng dụng đa nền tảng) với code reuse. Để hỗ trợ các bạn trong quá trình phát triển ứng dụng di động đa nền tảng, chúng tôi xin giới thiệu các framework đa nền tảng tốt nhất hiện nay, có thể làm việt trên nhiều nền tảng thông dụng bao gồm Android, iOS…

1. React Native

React Native là một framework cho phép các lập trình viên phát triển ứng dụng di động thiết kế các ứng dụng di động đa nền tảng với sự trợ giúp của javascript. Với React – Native, lập trình viên có thể sử dụng một bộ mã duy nhất cho cả nền tảng iOS và Android.

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

Ưu điểm:

  • Hiệu quả về mặt thời gian khi mà bạn muốn phát triển một ứng dụng nhanh chóng.
  • Hiệu năng tương đối ổn định.
  • Cộng đồng phát triển mạnh.
  • Tiết kiệm tiền.
  • Team phát triển nhỏ.
  • Ứng dụng tin cậy và ổn định.
  • Xây dựng cho nhiều hệ điều hành khác nhau với ít native code nhất.
  • Trải nghiệm người dùng tốt hơn là hybrid app.

Nhược điểm:

  • Vẫn đòi hỏi native code.
  • Hiệu năng sẽ thấp hơn với app thuần native code.
  • Bảo mật không cao do dựa trên JS.
  • Quản lý bộ nhớ.
  • Khả năng tùy biến cũng không thực sự tốt đối với một vài module.

2. Flutter 

Flutter là mobile UI framework của Google để tạo ra các giao diện native chất lượng cao trên iOS và Android trong khoảng thời gian ngắn sử dụng ngôn ngữ Dart. Flutter hoạt động với source code có sẵn, được sử dụng bởi các nhà phát triển và các tổ chức trên khắp thế giới, đồng thời nó open-source và miễn phí.

3. Xamarin 

Là 1 nền tảng lập trình ứng dụng di động cross-platform (có nghĩa là code một lúc có thể chạy trên được cả iOS lẫn Android). Xamarin có những đặc điểm riêng biệt, hiếm có so với các frameworks hiện tại trên thị trường khi mà khả năng native access và trải nghiệm người dùng native vẫn đang bị đặt nghi vấn.

Ưu điểm:

  • Ứng dụng mẫu của Xamarin giúp công việc khởi đầu suôn sẻ hơn; ứng dụng được viết rất rõ ràng và còn có thể được dùng là mẫu tham khảo.
  • Xamarin có thể chia sẻ đến 75% code được viết ra đến các nền tảng di động lớn, từ đó tiếp kiệm rất nhiều thời gian và chi phí.
  • Cung cấp functionality testing và quality assurance (kiểm tra tính năng và đảm bảo chất lượng) cho vô số thiết bị để đảm bảo tích hợp chuẩn xác (Xamarin thậm chí còn có giả lập Android riêng)

Khuyết điểm: Với Xamarin, vì sự cố tương thích, bạn sẽ vẫn không thể sử dụng được vô số thư viện nguồn mở cho iOS và Android. Phiên bản miễn phí vô cùng hạn chế, rất khó dùng trong các project lớn.

4. PhoneGap

PhoneGap cũng là một framwork ứng dụng di động đa nền tảng nguồn mở cho phép các lập trình viên xây dựng các ứng dụng di động bằng HTML, CSS và Javascript. Nó tập trung một kiến trúc có khả năng bổ trợ để giúp các lập trình viên bằng cách tạo các ứng dụng nổi bật với việc sử dụng các khả năng của thiết bị qua các API.

Ưu điểm:

  • Cho phép tạo ứng dụng lai bằng những công nghệ web phổ biến (HTML5, CSS3 và JavaScript),
  • Cho phép bạn deploy một code base duy nhất lên nhiều nền tảng khác nhau, trong đó có iOS, Android, Windows Phone, BlackBerry, Firefox OS,…
  • Cấu trúc cho phép áp dụng plugin, mở rộng (theo module) APIs thiết bị và nhiều lợi ích khác.
  • Cho phép áp dụng thanh toán tích hợp/in-app thông qua App Store cho iOS, Google Play Store cho Android,…

Khuyết điểm: Khả năng hỗ trợ đồ họa hạn chế cho ứng dụng. Bạn hiển nhiên vẫn có thể tìm một số plugin cho từng yêu cầu cụ thể, nhưng plugin cho một số platform cần thiết có thể bị lỗi thời, hoặc bị bỏ ngang.

Tham khảo thêm việc làm cho lập trình Framework tại Topdev

Cách tạo icon tương thích trên Android bằng Android Studio

Cách tạo icon tương thích trên Android bằng Android Studio

Tôi đã phát hiện ra rằng, các ứng dụng Android của tôi không thể sử dụng các icon tương thích, điều này làm cho các icon của ứng dụng xấu xí và có hình dạng kì lạ trên các launcher khác nhau, vì thế mà, cái cần giải quyết chắc chắn phải là tạo ra các icon tương thích và hoạt động một cách hoàn hảo.

Tuyển dụng lập trình android

Với các API > 26, hệ điều hành android sẽ tự động dùng icon tương thích, có thể từ đó mà dẫn đến vấn đề về app icon trên các app có sẵn, giống như ví dụ sau đây.

Cách tạo icon tương thích trên Android bằng Android Studio

Ví dụ: Các app icon cũ

Để tránh nó thì cần phải tại ra adaptive icon, để làm được thì bạn cần các dữ liệu asset như sau:

  • Icon không có background, như mẫu bên dưới (gọi là foreground)
  • Màu background

Foreground icon image

Ảnh icon Foreground

Với các yếu tố này, hãy làm theo các bước sau để tạo biểu tượng bằng Image Asset Studio.

  1. Mở project trong Android Studio
  2. Chọn tệp app
  3. Trỏ đến File → New → Image Asset
  4. Trong thẻ “Foreground Layer”, chọn hình ảnh đã được cấp và thay đổi kích thước để có được hình dáng phù hợp cho icon
  5. Trong thẻ “Background Layer”, sử dụng background đã có sẵn
  6. Click nút Next và sau đó là Finish
  7. Sau đó, các icon được tạo trong thư mục “mipmap- * * * *”

Cách tạo icon tương thích trên Android bằng Android Studio

Cấu hình của Foreground layer

Cách tạo icon tương thích trên Android bằng Android Studio

Cấu hình Background layer

Cách tạo icon tương thích trên Android bằng Android Studio

Màn hình cuối cùng và các asset đã được tạo

Bạn cần thêm các biểu tượng tròn mới này vào roundIcon tương ứng trên AndroidManifest.xml

   <application
        ...
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        ...>
    </application>

Sau khi thiết lập các thay đổi, icon của ứng dụng sẽ trông giống các icon mẫu của android.

Cách tạo icon tương thích trên Android bằng Android Studio

Ví dụ: Android 9, API 28 stock launcher

Cách tạo icon tương thích trên Android bằng Android Studio

Ví dụ : Android 7.0, API 24, Smart Launcher

Bài viết  được lấy từ nguồn thông tin chính thức của android:

https://developer.android.com/
https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive
https://developer.android.com/studio/write/image-asset-studio#create-adaptive

Chúc may mắn và happy coding!

Tham khảo thêm các vị trí tuyển ngành cntt tại Topdev.vn

Có gì mới trong Babel 7?

Có gì mới trong Babel 7

Biên dịch: Nguyễn Quốc Đại

Đôi nét về Babel

Babel là trình chuyển đổi cho JavaScript phổ biến giữa các nhà phát triển vì khả năng biến ES6 hoặc ES7 thành code có thể chạy trên trình duyệt và thiết bị của bạn.

Điều này rất quan trọng vì hầu hết các thiết bị và trình duyệt vẫn hỗ trợ các chuẩn cũ hơn được thiết lập tốt như ES5. Vì vậy, các nhà phát triển có thể viết code của họ trong các công ước mới nhất và không phải lo lắng về các lỗi do không tương thích.

Ví dụ: nếu bạn viết code JavaScript sau (theo tiêu chuẩn ES6):

const numbers = [ 5, 10, 15];
console.log(numbers.map(number => number + 5)); // [10, 15, 20]

Babel sẽ biên dịch nó thành:

var numbers = [ 5, 10, 15];
console.log(numbers.map(function (number) {
  return number + 5;
})); //

Đây là một điểm cộng khác về việc sử dụng Babel. Bạn là nhà phát triển có thể viết code của bạn trong ES6 hoặc ES7, như chúng ta có thể thấy ở trên, đoạn code ngắn gọn, đơn giản hơn. Babel sẽ biên dịch code của chúng tôi sang mã JavaScript của chúng tôi để code tương thích với trình duyệt.

Để thêm lời khen ngợi cho Babel, nó là tương thích nhất của tất cả các transpilers ES6, vượt xa các transpilers khác như Traceur của Google.

Giờ đến Babel 7!

Babel 6 được phát hành vào năm 2015. Kể từ đó, nó đã trải qua hơn 4000 cam kết và 50 lần phát hành trước. Giờ đây, những người ở Babel đã mang đến cho chúng tôi bản cập nhật lớn tiếp theo: Babel 7.

Babel giờ đây nhanh hơn và đi kèm với công cụ nâng cấp, cấu hình JavaScript, ghi đè cấu hình, tùy chọn giảm kích thước, hỗ trợ cho Phân đoạn JSX của React và quan trọng hơn là … hỗ trợ cho TypeScript! Trong bài này, tôi sẽ giới thiệu một số bản cập nhật và tính năng chính của Babel 7.

babel-upgrade

Như đã đề cập trước đây, Babel 7 đi kèm với một công cụ nâng cấp mới được gọi là babel-upgrade. Công cụ này sẽ tự động thực hiện bất kỳ thay đổi nâng cấp nào trong tệp package.json và tệp .babelrc.

Để sử dụng công cụ này, bạn có thể chạy nó trực tiếp trên kho lưu trữ GitHub:

$ npx babel-upgrade

Hoặc bạn có thể cài đặt nó bằng NPM / Yarn:

$ npm i babel-upgrade -g

JavaScript Configuration Files

Babel 7 giới thiệu một tập tin mới: babel.config.js. Xin lưu ý rằng tệp này không phải là thay thế cho .babelrc. Nó chỉ đơn giản là một bổ sung tuyệt vời có thể hữu ích cho một số trường hợp sử dụng nhất định.

Bạn có muốn lập trình cấu hình cho dự án của mình không? Hay bạn muốn biên dịch dự án node_modules của bạn? Khi đó, file babel.config.js là tệp hoàn hảo cho bạn!

Dưới đây là ví dụ về tệp babel.config.js và loại mã bạn có thể thêm vào bên trong:

module.exports = function () {   
  const presets = [ ... ];   
  const plugins = [ ... ];    
  
  return {     
    presets,     
    plugins   
  }; 
}

File .babelrc mặt khác, là nhiều hơn một tập tin JSON thay vì một tập tin JS:

{   
  "presets": [...],   
  "plugins": [...] 
}

Bằng cách thêm một file babel.config.js, Babel sẽ dễ dàng giải quyết việc cấu hình thay vì tra cứu từ mỗi tệp cho đến khi tìm thấy mã cấu hình. Điều này cũng cho phép chúng ta dễ dàng thực hiện ghi đè.

Overrides

Ghi đè trong Babel sẽ cho phép bạn chỉ định các cấu hình khác nhau trên mỗi glob. Vì vậy, nếu dự án JavaScript của bạn yêu cầu các cấu hình biên dịch khác nhau cho các tệp thử nghiệm, mã máy khách và mã máy chủ, chúng tôi sẽ không phải tạo một file .babelrc riêng biệt cho mỗi tệp. Thay vào đó, chúng ta có thể làm như thế này:

module.exports = {   
  presets: [     
    // default config...   
  ],   
  overrides: [
    {     
      test: ["./node_modules"],     
      presets: [       
        // config for node_modules     
      ],   
    }, 
    {     
      test: ["./tests"],     
      presets: [       
        // config for tests     
      ],   
    }
  ] 
};

Speed

Babel 7 đi kèm với rất nhiều thay đổi cho phép chúng tôi tạo các bản dựng nhanh hơn bao giờ hết!

Output Options

Trong Babel, bạn có thể bọc các plugin trong một mảng và truyền một đối tượng options vào nó như ví dụ dưới đây:

{   
  "plugins": [     
    ["transform-async-to-module-method", {       
      "module": "bluebird",       
      "method": "coroutine"     
    }]   
  ] 
}

Babel 7 đã thực hiện một vài thay đổi đối với các tùy chọn như loose plugin và thêm một vài tùy chọn mới cho các plugin khác.

“Pure” Annotation

Bây giờ, khi Babel transpiles một lớp ES6, nó chú thích lớp transpiled với một /*#_PURE_*/ chú thích. Điều này nói với các bộ phận khai thác như Uglify về một cái gì đó được gọi là Dead Code Elimination.

var C =
  /*#_PURE_*/
  function () {
    // code 
}();

Support for TypeScript! 🙌

Với sự giúp đỡ từ những người ở TypeScript, Babel giờ đây có thể phân tích cú pháp TypeScript bằng cách sử dụng một gói mới có tên @babel/preset-typescript.

Vì vậy, nếu bạn sử dụng TypeScript để viết một ứng dụng như thế này:

interface Hero {
  name: string;
}
function Heroes(hero: Hero) {
  return "I am " + hero.name;
}

Babel sẽ chuyển nó thành:

function Heroes(hero) {
  return "I am " + hero.name;
}

JSX Pragment

React 16 đã cung cấp cùng với Fragment, giúp chúng ta trả về nhiều con từ phương thức render của component mà không cần phải sử dụng một div làm parent.

render() {   
  return (     
    <>       
      <li>Aquaman</li>
      <li>The Flash</li>
      <li>Wonder Woman</li>     
    </>   
  ); 
}

Babel 7 cũng hỗ trợ tính năng tuyệt vời này:

render() {
  return React.createElement(
    React.Fragment,
    null,
    React.createElement(
      "li",
      null,
      "Aquaman"
    ),
    React.createElement(
      "li",
      null,
      "The Flash"
    ),
    React.createElement(
      "li",
      null,
      "Wonder Woman"
    )
  )
}

Automatic Polyfilling

Các polyfills rất quan trọng trong JavaScript vì chúng cho phép chúng ta sử dụng các tính năng khác như PromisesSymbols trong các môi trường thậm chí không hỗ trợ chúng. Bằng cách này, Babel có thể làm nhiều hơn là chỉ thay đổi cú pháp của mã của chúng tôi. Nó có thể thực hiện các hàm và đối tượng dựng sẵn.

Macros

Babel lúc đầu chỉ là một trình chuyển đổi mã ES6 thành ES5. Nhưng hiện nay, nó còn hơn thế nữa. Có hàng trăm plugin có thể được sử dụng cho các thư viện cụ thể và các trường hợp sử dụng để cải thiện hiệu suất tổng thể của ứng dụng của chúng ta.

Nhưng việc thêm các plugin này vào ứng dụng của chúng ta là một nhiệm vụ không đơn giản. Ví dụ: nếu bạn đã tạo Ứng dụng React bằng công cụ create-react-app thì bạn sẽ không thể sử dụng các plugin này. Ngoài ra, bạn là nhà phát triển sẽ phải biết mọi thứ về plugin và cách nó sẽ thay đổi mã ứng dụng của bạn khi bạn build ứng dụng.

Một giải pháp nhanh cho việc này là cài đặt gói babel-plugin-macros trong ứng dụng của bạn. Gói này không chỉ giúp việc cấu hình mã của bạn thành plugin tương thích, nó còn giúp dễ dàng viết các biến đổi tùy chỉnh cho các tình huống cụ thể cho ứng dụng của bạn.

Caller Metadata

Các gói phần mềm @babel/core cũng có một tùy chọn mới được gọi là caller sẽ cho phép chuyển bất kỳ siêu dữ liệu đến các giá trị đặt trước và plugin của chúng tôi .

babel.transform("code;", {   
  filename,   
  presets: ["@babel/preset-env"],   
  caller: {     
    name: "babel-loader",     
    supportsStaticESM: true,   
  }, 
});

Bằng cách này, Babel đã tạo ra một phương pháp mới cho công cụ để cung cấp cho chúng tôi nhiều cấu hình mặc định hơn cho ít cấu hình hơn.

Phần kết luận

Nếu bạn đang băn khoăn tại sao bản cập nhật mới của Babel lại là một bản phân phối lớn, hãy nghĩ rằng ngày nay có hơn 1 triệu kho lưu trữ trên GitHub tùy thuộc vào babel-core. Framework và thư viện như React và Vue và các công ty khổng lồ như Netflix và Facebook sử dụng Babel trong các dự án của họ.

Tôi hy vọng sẽ thấy nhiều cập nhật tuyệt vời hơn từ nhóm tại Babel. Đó là các tính năng mới như hỗ trợ sử dụng TypeScript. Hãy gửi cho họ bất kỳ phản hồi nào có thể giúp họ phát triển Babel lên các cấp độ mới.

TopDev via blog.bitsrc.io

Hướng dẫn cấu hình Xdebug bằng PHPStorm cho Docker

cấu hình Xdebug bằng PHPStorm

Biên dịch: Trần Thanh Dân

Docker đã làm thay đổi đáng kể cách chúng ta phát triển các ứng dụng. Docker thực sự dễ dàng cho bắt kỳ lập trình viên nào có thể chạy các ứng dụng phức tạp chỉ với 1 dòng lệnh mà không cần phải lo lắng về các thông tin chi tiết khác. Những lợi ích này rất tiện lợi khi sử dụng làm việc cùng team hoặc enterprise context.

Tôi vẫn nhớ phải mất đến 3 ngày đầu tiên khi tham gia vào công ty hiện tại để cấu hình project  và tất cả các thư viện,công cụ liên quan khác. Docker có thể giúp việc này dễ hơn, nhanh hơn và có tính nhất quán.

Việc duy trì các công cụ của Docker khá phức tạp, ngoài ra một số thứ có thể sẽ dễ dàng hơn khi chạy ứng dụng trong môi trường phát triển ứng dụng bình thường như là debugging ứng dụng của bạn từ trình soạn thảo (IDE). Khi sử dụng docker thì cần một số cấu hình bổ sung. Và trong trường hợp này là Xdebug, đây không phải là một nhiệm vụ dễ dàng.

Tôi không tìm thấy bất kỳ hướng dẫn nào từ lúc bắt đầu cho đến khi kết thúc. Đó là lý do tại sao tôi viết bài này. Nó sẽ hướng dẫn bạn từng bước thông qua quá trình cài đặt và cấu hình Xdebug bằng PHPStorm với một ứng dụng Dockerized Symfony 4.

Chuẩn bị

  • Chúng ta sẽ thực hiện nó trên một máy tính Ubuntu 18.04, PHPStorm 2018.1.4 và các phiên bản mới nhất của Docker, Docker Compose (Hướng dẫn này có thể không đúng khi thực hiện trên các hệ điều hành khác).
  • Bạn cần có kiến thức cơ bản về Docker, PHP và XDebug.
  • Bạn có thể sao chép kho lưu trữ (repository) này làm cơ sở để theo dõi hướng dẫn vì nó chứa một ứng dụng Symfony Flex cơ bản với tất cả các công cụ Docker được giải thích trong bài viết này.

Cấu hình ứng dụng Dockerize

Tất nhiên, để có thể sử dụng Xdebug, bạn phải cài đặt nó trên Docker container của bạn.

Cách để làm điều này, sẽ phụ thuộc vào basic image của bạn. Tôi luôn sử dụng alpine based images. Tôi sẽ không nói chi tiết về cách Dockerize một ứng dụng Symfony. Bạn có thể làm theo cùng với Dockerfile đã có trong kho lưu trữ demo.

Đây là đoạn trích có liên quan của Dockerfile cài đặt Xdebug:

ARG WITH_XDEBUG=false

RUN if [ $WITH_XDEBUG = "true" ] ; then \
        pecl install xdebug; \
        docker-php-ext-enable xdebug; \
        echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
    fi ;

Tôi không muốn có một Dockerfile riêng biệt cho development and production, vì vậy tôi đã xác định một đối số xây dựng sẽ cho biết liệu chúng tôi có muốn cài đặt Xdebug hay không.

Sau đó, trên tệp Docker-compose của tôi, tôi có định nghĩa sau cho ứng dụng của mình:

version: "3"

services:

  php:
    build:
      context: .
      args:
        - WITH_XDEBUG=true
    env_file: .env
    volumes:
      - .:/var/www/app:rw

Xem tập tin toàn bộ docker-compose.

Quan trọng là lệnh “env_file”, thông báo cho Compose tải các biến môi trường từ một tệp “.env”, là cách tiêu chuẩn cho các ứng dụng Symfony 4.

Chúng tôi sẽ sử dụng tập tin đó để thêm một số biến môi trường cần thiết cho Xdebug. Nếu thích bạn cũng có thể thêm trực tiếp vào tập tin docker-compose bằng cách sử dụng phần “environment”.

Xem tin tuyển lập trình viên PHP đãi ngộ tốt trên TopDev

Các biến Environment

Chúng ta sẽ xác định các biến môi trường sau:

  • PHP_IDE_CONFIG – Biến này định nghĩa cấu hình máy chủ được liên kết với ứng dụng. Chi tiết sẽ được giải thích sau.
  • XDEBUG_CONFIG – Biến này cho phép xác định một số cấu hình Xdebug. Các “remote host” là ip riêng máy chủ của bạn (một trong những PHPStorm của bạn đang chạy). “Remote_port” là cổng PHPStorm sẽ lắng nghe các kết nối Xdebug đến. Hai cài đặt này cho phép PHPStorm và Xdebug giao tiếp. Nó sẽ không làm việc mà không có điều này.

Chúng ta sẽ thêm chúng vào tệp “.env” của chúng ta như sau:

PHP_IDE_CONFIG=serverName=symfony-demo
XDEBUG_CONFIG=remote_host=192.168.1.102 remote_port=9001

Xem thêm việc làm Software Developer mới nhất trên TopDev

Các configuration PHPStorm

Điều đầu tiên bạn nên làm là kiểm tra cài đặt Debug của bạn. Trong PHPStorm, vào File -> Settings -> Languages and Frameworks -> PHP> Debug.

Đảm bảo rằng bạn có một số cổng mà bạn đã định cấu hình trước đó trong “XDEBUG_CONFIG” environment variable:

cấu hình Xdebug bằng PHPStorm

Tiếp theo, chúng ta cần cấu hình một máy chủ. Đây là cách PHPStorm sẽ ánh xạ (map) đường dẫn tệp trong hệ thống cục bộ của bạn tới đường dẫn tệp trong vùng chứa (container) của bạn.

Đi tới File -> Settings ->Languages and Frameworks -> PHP -> Servers

cấu hình Xdebug bằng PHPStorm

Đặt tên cho máy chủ của bạn. Nó phải khớp với giá trị bạn đã xác định trong biến “PHP_IDE_CONFIG” của bạn. Chúng tôi sẽ gọi nó là “symfony-demo”.

“Host” và “port” là cách truy cập ứng dụng của bạn. Trong trường hợp của tôi là localhost: 8888.

Và sau đó là “Path mappings”.

Trong phần “Project files”, bạn phải ánh xạ đường dẫn gốc của ứng dụng của bạn tới đường dẫn bên trong container. Trong trường hợp của tôi là “/var /www /app”.

Nhấp vào “Apply” để lưu cấu hình của bạn.

Phần cuối cùng là cấu hình remote debugger của dự án của bạn.

Ở trên cùng bên phải, nhấp vào “edit configurations”:

cấu hình Xdebug bằng PHPStorm

Nhấp vào ký hiệu “dấu cộng” màu xanh ở trên cùng bên trái và chọn “PHP Remote Debug” từ danh sách.

Bây giờ cấu hình nó như thế này:

cấu hình Xdebug bằng PHPStorm

Đảm bảo bạn liên kết nó với “server” đã tạo trước đó. Sử dụng “PHPSTORM” làm idekey.

IDE của bạn bây giờ sẽ được cấu hình đúng.

Kiểm tra

  • Mở “src/Controllers/ HelloController.php” và đặt breakpoint trong phương thức “hello”.
  • Bắt đầu Docker container của bạn với:

docker-compose up

  • Sau đó nhấp vào biểu tượng “Start Listening for PHP Debug connections” ở góc trên cùng bên phải của PHPStorm.

cấu hình Xdebug bằng PHPStorm

  • Mở http://localhost:8888?XDEBUG_SESSION_START=PHPSTORMNếu thực hiện đúng, bạn sẽ thấy điểm dừng thực hiện tại breakpoint của bạn.

cấu hình Xdebug bằng PHPStorm

Bây giờ bạn đã có một môi trường phát triển được cấu hình đầy đủ với Docker và Xdebug được tích hợp với IDE PHPStorm.

Chúc các bạn may mắn và debug vui nhé!

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

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

Chọn framework và thư viện mới rất thú vị nhưng cũng rất căng thẳng. Ngay cả khi đã phân tích kĩ lưỡng thì bạn cũng không biết được mình sẽ tìm thấy cái gì.

Sau khoảng 2 năm sử dụng Vue, hầu như ngày nào cũng xài, tôi cuối cùng có một vài quan điểm để viết về nó.

Điểm tốt

Khả năng phản ứng

Ràng buộc về dữ liệu là một vấn đề lớn trong thế giới giao diện người dùng. Thay vì quản lý DOM như chúng ta đã làm với jQuery, bây giờ chúng ta tập trung vào dữ liệu. Vue xử lý rất gọn gàng bằng hệ thống ràng buộc dữ liệu phản ứng hai chiều.

Để đạt được nó Vue thêm một số getters và setters cho mọi biến trong state của bạn để nó có thể theo dõi các thay đổi và cập nhật DOM tự động (cough this.setState() cough). Cách tiếp cận này không hoàn hảo, chúng ta sẽ hiểu rõ hơn về nó sau.

Bao gồm cả pin 

Với Vue, bạn không cần phải sử dụng các gói không official như MobX hoặc React Router cho những phần quan trọng trong app của mình. Vue cung cấp Vue RouterVuex , một trình quản lý trạng thái trung tâm phản ứng lấy cảm hứng từ Redux. Đây là những thư viện tuyệt vời, nhưng thực tế là chúng được thiết kế riêng cho Vue khiến chúng trở nên tốt hơn.

Tốc độ

Vue thực sự rất nhanh. Có lẽ không phải là nhanh nhất, nhưng hiệu quả của nó là quá mức cần thiết cho phần lớn các dự án web. Lần cuối bạn cần render và cập nhật hàng ngàn phần tử DOM mỗi giây là khi nào?

Mẫu HTML 

Đây là một chủ đề gây chia rẽ sâu sắc giữa các JavaScript developer. Bất kể sở thích của bạn, các mẫu HTML đã được thử nghiệm trong nhiều thập kỷ bằng nhiều ngôn ngữ và là lựa chọn chính để viết đánh dấu động trong Vue.

Nhưng Vue cũng hỗ trợ JSX.

Các sản phẩm khác

  • Các thành phần tệp đơn với HTML, CSS và JavaScript.
  • Nhẹ. Khoảng 20KB (minified + gzip).
  • Rất mở rộng (mixins, plugins, …).
  • Tài liệu tuyệt vời (với một số ngoại lệ được ghi chú bên dưới).
  • Có thể được áp dụng dần dần, thậm chí được sử dụng như một sự thay thế jQuery.
  • Dễ dàng để bắt đầu.

Điểm chấp nhận được

Thành phần soạn thảo

Chuyển từ React sang Vue có vẻ rất nhẹ nhàng. Không còn bind(this hoặc setState() khắp nơi nữa. Nhưng sau một thời gian, bạn bắt đầu đặt câu hỏi về tính hợp lệ của cú pháp thành phần của Vue.

Các thành phần Vue được tạo ra với các đối tượng và đây là một ví dụ về việc định nghĩa một hàm thành phần:

export default {
 methods: {
  increment () {
   this.count++;
  }
 }
}

Bạn sẽ thêm bản mẫu tương tự cho các thuộc tính được tính toán, trạng thái thành phần, trình theo dõi, v.v. Khá nhiều thứ trong Vue có cú pháp đặc biệt của riêng nó với nhiều bản mẫu.

Ngược lại, đây là điều tương tự đối với Marko, đó là cách dọn dẹp:

class {
 increment() {
  this.state.count++;
 }
}

Quan điểm của tôi ở đây không phải là về việc sử dụng các lớp hay không, nhưng Vue đó đang sử dụng các cấu trúc đối tượng tùy ý thay vì các tính năng ngôn ngữ.

Tôi sẽ không đổ lỗi cho bạn nếu bạn khó chịu khi phải tạo các object gây phiền nhiễu này. Vue cũng cung cấp một cú pháp dựa trên lớp, nhưng nó thực sự là một plan B thôi.

Cộng đồng chat

Cộng đồng Vue giao lưu trên Discord, một cuộc hội thoại được thiết kế cho cộng đồng game thủ. Nếu bạn gặp cản trở, đoạn chat này có lẽ là option tốt nhất của bạn vì các diễn đàn chính thức đều riêng biệt và đừng có liều mạng đi hỏi trên Github.

Chat này hơi lộn xộn, nhưng vấn đề chính là nội dung trò chuyện không thể thông kê được bằng công cụ tìm kiếm. Các câu hỏi tương tự (và các cuộc thảo luận liên quan) sẽ bị xử lý lặp đi lặp lại nhiều lần.

Xu hướng của việc sử dụng các đoạn chat để giải đáp thắc mắc đang làm lu mờ các dự án mã nguồn mở và tôi nghĩ rằng nó cần phải kết thúc. Chả còn ai học tập thể nữa.

Không tuyệt vời quá như người ta nói 

Sau một thời gian sử dụng Vue thì bạn sẽ phải nhiều lần thốt lên “nhưng” và nếu” lắm…

Ví dụ:

  • Hệ thống phản ứng sẽ chỉ theo dõi thay đổi trong những điều kiện nhất định. Đừng kì vọng vào những gì bạn muốn làm. Bạn có thể cần phải thường xuyên san bằng dữ liệu càng nhiều càng tốt để tránh đau đầu. Tất nhiên, tất cả đều được giải thích trong bản tài liệu này.
  • Hệ thống chuyển đổi <vue-transition> không hoạt động đối với các dạng danh sách. Bạn phải dùng đến <transition-group> hoạt động hơi khác và giới thiệu các element mới vào DOM của mình. Ngoài ra, người ta sẽ kỳ vọng là một điều được giải quyết, nhưng bạn phải tự mình thực hiện nó.
  • Nếu bạn cần trạng thái không phản ứng trong một cá thể thành phần, bạn có thể sẽ thích uncharted territory.

Đừng hiểu sai, tui không phải đang tài trợ quảng cáo gì đâu, nhưng có vẻ như mỗi khi bạn bắt đầu dùng nó thì lại pop up một cái gì khác khó chịu.

Điểm xấu

Mẫu kiến trúc không rõ ràng

Đây là một ví dụ: tốt hơn là xử lý các yêu cầu API trong các thành phần của bạn hay trong Vuex?

Tài liệu này cung cấp các ví dụ về cách xử lý logic API trong Vuex. Thậm chí còn có một sơ đồ đẹp và đầy màu sắc như đây:

Vậy liệu điều này có đồng nghĩa là logic xác thực cũng có trong Vuex không? Liệu một nhà quản lý có bắt đầu dàn xếp tất cả các logic ứng dụng ngay bây giờ không?

Đây không phải là vấn đề rõ ràng. Hầu hết mọi người sẽ bắt đầu gắn non-state logic vào hoạt động Vuex hoặc tệ hơn, trực tiếp trong các thành phần bởi vì có một video trên trang chủ của Vue cho biết:

Để trả lời cho câu hỏi ban đầu của tôi: logic API không nên được viết trong Vuex cũng như trong các thành phần. Thậm chí còn có một ví dụ tốt về cách làm điều đó trong một số ví dụ code chính thức.

Phần kết luận

Vue đã không ngừng phát triển và tôi nghi ngờ xu hướng này sẽ sớm ngừng lại. Nó vẫn còn xa React (ít nhất là bên ngoài Trung Quốc) và liên tục cạnh tranh cho một vị trí thứ hai xa với Angular.

Trong quá khứ tôi đã lập luận rằng Vue là một thư viện thực dụng, không giống như React, nó có vẻ lý tưởng hơn. Tôi vẫn nghĩ đó là một phép ẩn dụ tốt.Mặt khác, bây giờ tôi cảm thấy chủ nghĩa thực dụng của Vue cần nhiều hơn nữa việc đánh bóng, tập trung, sang trọng và đơn giản ở cấp độ người dùng.

Sau 2 năm kinh nghiệm của tôi với Vue đã tích cực. Tôi vẫn tin rằng đó là một quyết định tốt để chuyển đội của tôi từ React sang Vue. Không phải vì Vue tốt hơn, mà bởi vì nó phù hợp hơn với chúng ta.Vue chắc chắn thực hiện công việc mà nó dự định làm, và thành công trong những lĩnh vực mà những người khác thất bại, nhưng hôm nay tôi không nghĩ rằng Vue là khách quan tốt hơn hoặc tệ hơn các tùy chọn khác có khả năng trong radar của bạn.

Phụ lục: Vue CLI

Tôi đã không bao gồm Vue CLI trong bài viết này về mục đích và tôi muốn giải thích tại sao.

Vue CLI là một công cụ rất tiện lợi làm giá đỡ cho các dự án Vue .Trong phiên bản 3 mới sắp ra của nó sẽ còn tốt hơn, vì nó là một giải pháp quản lý dự án hoàn chỉnh.

Nhưng, tiện lợi luôn có chi phí và theo tôi, chi phí đó không được hợp lý ở đây.Webpack không phải là khó khăn như rất nhiều người cho rằng đó là việc tạo bộ khởi động của riêng bạn sẽ giảm bớt hầu hết thời gian cấu hình.

Làm cho điều tùy chỉnh của riêng bạn làm cho ý nghĩa hơn rất nhiều khi chi phí làm như vậy là rất thấp.

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

Phiên Bản Web 3.0: Web sẽ có sự chuyển biến lớn trong thời gian tới

Tác giả: Aashish Sharma

Việc chuyển đổi từ web 2.0 sang phiên bản 3.0 sẽ có khả năng không được chú ý bởi hầu hết mọi người. Các ứng dụng sẽ không có sự thay đổi nhiều so với trước đây, nhưng sẽ có sự thay đổi đối với phần back-end. Nếu bạn là một người thích sự dự đoán, bạn sẽ muốn xem sét ứng dụng Siacoin cho Cloud. Steemit như một nền tảng cho phương tiện truyền thông và thậm chí Augur là cách để kiểm tra các sự kiện được dự đoán trong tương lai.

Khi bạn bắt đầu thấy bản phát hành của mục blockchain đầu tiên hoạt động đúng, bạn có thể thấy mọi người chuyển từ 2.0 sang 3.0. Đó là bởi vì các developers cho biết sự chuyển  của công nghệ 3.0 sẽ dễ dàng và thân thiện với người dùng hơn so với web 2.0.

Trong giai đoạn này, chúng ta sẽ xem xét các công ty và các giai đoạn khác nhau của web 2.0 và cho bạn biết dự án nào từ blockchain sẽ có cơ hội này và dẫn đến sự nâng cấp đến web 3.0.

Các phương thức thanh toán mà mọi người đang sử dụng hiện thường đi qua thẻ tín dụng của các công ty, ngân hàng hoặc thậm chí là PayPal. đây sẽ là những nơi có trách nhiệm nhận tiền và đảm bảo rằng nó được chuyển đúng cách, và tránh các hành vi trộm cắp khi giao dich.

Với các công việc như trên, các công ty thường thu phí rất cao. Bạn sẽ phải trả một chi phí khá lớn cho các công ty để được bảo mật.

Theo David Sessford của Ready Steady Sell với sự xuất hiện của tiền điện tử, bạn sẽ nhận thấy rằng rất nhiều mối quan tâm về an ninh sẽ biến mất và chi phí thực hiện giao dịch sẽ thấp hơn một chút. Một số loại tiền tệ hiện đang được sử dụng trên toàn thế giới bao gồm Zcash, Monero, Bitcoin và Litecoin. Chúng ta sẽ có một tài khoản để truy cập Internet và quản lý tài sản trên mạng. Nếu bạn là người bán hàng, bạn sẽ cần phải liên kết với một công ty như Bitpay để tích hợp tiền điện tử vào hệ thống thanh toán của bạn.

Và đây sẽ là một sự chuyển đổi thuận lợi, tuy nhiên, bạn sẽ nhận thấy rằng nó sẽ xảy ra mà không cần sử dụng loaị tiền điện tử. Điều này có nghĩa là bạn vẫn sẽ có thể sử dụng các cách thức giao dịch thông thường, thay vì giao dịch dựa trên giá trị các đồng tiền ảo ở các sàn chứng khoán ở mọi nơi hiện nay.

Bạn sẽ thấy rằng công ty Stellar Lumens phân chia lại cách thức thanh toán bằng cách kết nối tất cả các hệ thống với nhau từ ngân hàng, người dùng và thậm chí cả hệ thống thanh toán. Điều này sẽ cho phép các giao dịch nhanh hơn trên toàn cầu. Điều này không cần phải được thực hiện bằng các loại tiền ảo, nhưng có thể được thực hiện bằng bất kỳ loại tiền tệ nào. Khi bạn  sử dụng Stellar Lumens, bạn thậm chí sẽ không nhận ra rằng bạn đang sử dụng một loại tiền ảo để hoàn thành công việc vì các giao dịch được chạy trên phần phụ trợ của tiền tệ.

The Request Network là một đối thủ cạnh tranh trực tiếp với  PayPal. Đây là một nền tảng giúp bạn thực hiện thanh toán với bất kỳ ai và bất kỳ lúc nào. Khi bạn đang thực hiện thanh toán ở đây chúng được thực hiện bằng cách sử dụng blockchain, bên thứ ba sẽ được loại bỏ, nhưng thanh toán sẽ vẫn diễn ra  một cách thuận lợi an toàn.

Thậm chí còn tốt hơn những gì có ở Request Network, và nên biết rằng mọi người đều không muốn giao dịch với tiền điện tử, và đây là một trong những trường hợp họ đã triển khai các chương trình khác nhau để làm cho yêu cầu của mọi ngừoidễ dàng hơn đối với bât kì loại tiền tệ nào. Vì họ đang sử dụng công nghệ blockchain, tuy nhiên, trong thực tế mạng lưới của họ có một lợi thế lớn khi thực hiện các giao dịch với mức chi phí thấp hơn đáng kể.

Hầu hết mọi người sẽ tiếp tục sử dụng phương tiện truyền thông, nhưng thậm chí sau đó tất cả chúng ta đều thấy nó có một số sai sót nghiêm trọng trong cách nó hoạt động. Một trong số đó bao gồm các vụ bê bối Facebook, các cơ chế được sử dụng để làm cho bạn thấy những gì Instagram hoặc Twitter muốn bạn xem, nhưng cũng là cách quảng cáo được cho  là thiếu sót.

Vấn đề chính mà bạn phải giải quyết ở đây là trên trang web này là thông tin, quyền riêng tư của bạn có bị kiểm soát và dễ dàng xâm nhập,điều khiển hay không. Ví dụ như bạn không muốn để bạn bè xem lịch sử trình duyệt của mình, nhưng các trang mạng xã hội thực hiện điều này bằng cách quét cookie của bạn và sau đó sẽ tạo ra hồ sơ dựa trên lịch sử của bạn và bán nó.

Và trong như những chú mèo dễ thương, chúng tôi muốn sử dụng điện thoại để giải trí và giữ liên lạc với những người bạn ở xa. Vì vậy, điều này khiến chúng tôi không thể nào rời xa các phương tiện truyền thông.

Trong sự phát triển truyền thông và mạng xã hội Steemit sẽ là giải pháp dẫn đầu với công nghệ blockchain cho web 3.0. Nền tảng này là một nền tảng có mô hình riêng của mình mà những người sáng tạo nội dung được sắp xếp bởi một nhóm các cộng sự. Khi nội dung được upvoted sẽ có chất lượng tốt, nó sẽ gây ra một sự thay đổi của Steem, nó sẽ là đồng tiền được sử dụng ở đây.

Đây là một nền tảng không có quảng cáo và thậm chí không lưu trữ thông tin về người dùng, nếu bạn đang hoạt động thì bài đăng sẽ không cần phải kiểm duyệt, bạn thậm chí còn được chi trả bằng tiền điện tử. Steemit là quản lý công nghệ này, nhưng bạn thậm chí còn tìm thấy DTube, đó là sự thay thế YouTube dựa trên blockchain.

Nhược điểm là Steemit đã rất thành công,nên nó đang bắt đầu thu hút rất nhiều sự cạnh tranh. Một trong những đối thủ cạnh tranh là Narrative là một trang web được thiết kế đẹp mắt. Nó tương tự như Steemit, và chủ đề được tạo ra bởi người dùng cũng là người quản trị. Narrative cũng đã quyết định dùng một phần trang web của mình để quảng bá thương hiệu, những nội dung chất lượng sẽ được truyền bá rộng rãi trên diễn đàng để đến với mọi người.

Bạn cũng có thể tìm thấy Sapaien, một diễn đàng tin tức; Indorse sẽ là một sự thay thế cho LinkedIn , và thậm chí là ONG. Social là một chương trình tuyệt vời mang tính xã hội và tập trung khá nhiều vào sự riêng tư của mọi người.

Thông thường,chúng ta sẽ tìm các công ty giải trí khác nhau, một giải pháp thay thế tuyệt vời cho giải trí thông thường và chúng ta thường tìm đến Netflix và YouTube. Phần tồi tệ nhất của các công ty này là sự kiểm soát thị trường và điều này không để lại nhiều chỗ cho sự cạnh tranh. Nó cho phép mọi người tạo ra nhiều nội dung, sau đó các công ty thu thập và bán dữ liệu.

Thông thường, người dùng sẽ xuất bản nội dung trên các nền tảng này và hy vọng họ có thể tạo ra nội dung lớn, nhưng thường những điều họ tạo ra không đáp ứng được như thế. Bạn cũng sẽ thấy mọi người bắt đầu đặt câu hỏi về các kiểm duyệt khác nhau mà YouTube đang thực hiện, cách nó thay đổi kế hoạch thanh toán của mình và thậm chí cả Spotify trả cho các nhạc sĩ đăng bài hát trên mạng như thế nào.

Bạn sẽ thấy rằng có rất  nhiều chương trình  trong blockchain đã sẵn sàng để phá vỡ điều này . Ngành công nghiệp âm nhạc đã thực sự nhìn thấy rất nhiều giao dịch xấu làm tổn thương mọi người và thực sự đang tìm cách dẫn đầu để thay đổi vấn đề này. Imogen Heap, một nhạc sĩ, đã bắt đầu dự án của riêng mình dựa trên blockchain được gọi là Mycelia, có nghĩa là để cung cấp cho các nhạc sĩ và những người sáng tạo  âm nhạc một mức giá hợp lý cho âm nhạc mà họ đã thực hiện. Bạn cũng sẽ nhận thấy rằng bạn có Voise là một nền tảng tuyệt vời được phân cấp và rất dễ dàng để các nghệ sĩ tiếp cận người hâm mộ của họ.

Flixxo là một công ty đang sử dụng Ethereum để cố gắng soán ngôi YouTube, nhưng bạn có Dtube cũng từ Steem. Bạn cũng sẽ thấy rằng  có một ứng cử viên khác để loại bỏ YouTube là Videocoin, một công ty khởi nghiệp đã đạt được rất nhiều sự lôi kéo với 35 triệu đô la trong khoảng thời gian ICO.

Nếu bạn đang tìm kiếm các giải pháp để lưu trữ, bạn sẽ nhận thấy rằng Cloud là một giải pháp tuyệt vời.Bạn sẽ thấy được đây là nơi bạn có thể lưu trữ mọi tập tin và phần cứng một cách dễ dàng với chi phí rẻ, nhưng cũng có thể truy cập chúng từ bất kì đâu trên thế giới.

Vấn đề với cloud là tất cả thông tin sẽ được lưu trữ ở một vị trí tập trung mà mọi người có thể truy cập. Đây là điểm duy nhất của vấn đề, bởi vì làm thế nào để đảm bảo an toàn cloud chỉ với một công ty. Điều này có thể dễ dàng dẫn đến một sự thỏa hiệp trong công ty và khi điều này xảy ra, bạn có thể dễ dàng để tất cả các dữ liệu của bạn tiếp xúc với tất cả mọi người.

Vì đó là một trường hợp, nó sẽ là thời gian tốt để phân quyền lưu trữ . Đây là nơi bạn sẽ thấy Siacoin bước lên như là công ty lớn nhất ở đây. Đây là một công ty cho phép mọi người sẽ có thể thuê thêm bộ nhớ và thanh toán dưới dạng tiền điện tử. Đây là một công ty có thể dễ dàng có một số tăng trưởng mạnh trong tương lai bởi vì nó đã rẻ hơn so với Google hay Amazon.

Bạn sẽ thấy một startup khác cũng được gọi là Filecoin. Đây là một công ty có một ICO lớn và là một trong những công ty lớn nhất trong lịch sử với 257 triệu. Đây là một công ty có mạng phân quyền giữa các tệp được lưu trữ, nhưng với giá cạnh tranh. Bạn sẽ thấy rằng Storj cũng đã ném chiếc mũ của họ vào chiếc nhẫn cũng như với một kế hoạch tuyệt vời mà lại thấp về giá cả, nhưng cao về an ninh chỉ với người dùng nhận được vào dữ liệu.

Mô hình quảng cáo trực tuyến hiện đang được sử dụng một cách không đúng. Thông thường bạn có thể thấy điều này chỉ bằng cách truy cập một số công ty quảng cáo trên trang web như YouTube và Facebook. Khi bạn đang chạy một trang web bạn biết đó là một doanh nghiệp lớn và thường khi bạn yêu cầu mọi người đăng ký, bạn sẽ mất người nhanh chóng. Thường thì cách tốt nhất để kiếm tiền là cho phép quảng cáo được hiển thị trên trang web của bạn và lưu lượng truy cập càng nhiều thì bạn càng nhận được nhiều thu nhập hơn từ quảng cáo.

Nhược điểm là phần lớn thời gian mọi người bỏ qua quảng cáo. Khi mọi người không xem quảng cáo thì điều đó sẽ không tốt đối với bạn, nhưng một số người thậm chí còn có các trình chặn quảng cáo không cho quảng cáo hiển thị. Ngay cả Google, kiếm được nhiều tiền nhất từ ​​quảng cáo đều có tiện ích mở rộng trên trình duyệt Chrome để chặn quảng cáo.

Những thay đổi có thể xảy ra khi đóng góp  không phải là của những người nhấp vào quảng cáo được hiển thị, nhưng lợi nhuận  sẽ nhận được dựa trên lượng khách truy cập. Bạn sẽ thấy rằng một số công ty blockchain đang làm việc về điều này. Một trong những điều lớn nhất đang diễn ra là Basic Attention Token. Đây là một công ty đã tạo ra điểm kết nối những người sáng tạo nội dung, với các nhà quảng cáo, và sau đó là người dùng mà không có bất kỳ công ty lớn nào hoạt động ở giữa.

Bạn sẽ nhận thấy rằng công ty thậm chí còn có trình duyệt riêng được gọi là Brave. Với Browers này trong đó người dùng có thể trả tiền giao dịch nhỏ cho những người sáng tạo với nội dung mà họ thích và các nhà quảng cáo sau đó sẽ trả tiền cho người tiêu dùng cho sự chú ý. Điều này là tất cả được thực hiện mà không ai biết về nó.

Bạn cũng sẽ nhận thấy rằng Oyster Pearls cũng là một mô hình quảng cáo trực tuyến khác. Đây là một công ty có động cơ trong các công trình cho phép người dùng đóng góp  nội dung cho các trang web họ yêu thích cho GPU và CPU nó giúpcho các trang web ít phụ thuộc vào quảng cáo hơn. Điều này cũng sẽ cho phép các trang web và người tạo nội dung được lưu trữ trên nền tảng phi tập trung, rẻ hơn và thậm chí còn an toàn hơn.

Bạn sẽ tìm thấy một dự án lớn được gọi là Substratum đang được thực hiện để chạy trên Internet. Nền tảng này sẽ cho phép mọi người đóng góp tài nguyên máy tính vào một trang web phi tập trung, mà sẽ không có bất kỳ loại kiểm duyệt hoặc kiểm soát nào được thực hiện bởi một tổ chức.

Bạn sẽ thấy rằng người dùng sẽ được thanh toán bằng tiền điện tử để giúp giữ cho Substratum hoạt động. Bạn sẽ nhận thấy rằng bạn có thể tìm thấy nội dung được lưu trữ trong trình duyệt thông thường mà không có bất kỳ điều gì can thiệp vào nội dung mọi người sẽ thấy. Hãy nghĩ điều này có thể giúp cho những người đang bị chính phủ chèn ép.

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

Xây dựng một ứng dụng trò chuyện bằng ReactJS trong 10 PHÚT (Phần 1)

Biên dịch: Nguyễn Quốc Đại

Trong bài viết này, tôi sẽ chỉ cho bạn cách dễ nhất có thể để xây dựng một ứng dụng trò chuyện bằng React.js. Nó sẽ được xây dựng hoàn toàn mà không có code phía máy chủ, vì chúng tôi sẽ cho phép API Chatkit xử lý phía back-end.

Tôi giả sử rằng bạn biết JavaScript cơ bản và bạn có tìm hiểu một chút React.js trước đây. Ngoài ra, không có điều kiện tiên quyết.

Lưu ý: Tôi cũng đã tạo một khóa học miễn phí có thời lượng đầy đủ về cách tạo ứng dụng trò chuyện React.js tại đây.

https://scrimba.com/g/greactchatkit

Nếu bạn làm theo hướng dẫn này, bạn sẽ hoàn thành được ứng dụng trò chuyện của riêng bạn, và sau đó bạn có thể xây dựng thêm nếu bạn muốn.

Let’s get started!

Bước 1: Cắt giao diện người dùng thành các components( thành phần nhỏ)

React được xây dựng xung quanh các components, vì vậy điều đầu tiên bạn muốn làm khi tạo ứng dụng là cắt giao diện người dùng thành các components.

Hãy bắt đầu bằng cách vẽ một hình chữ nhật xung quanh toàn bộ ứng dụng.Đây là thành phần gốc của bạn và tổ tiên chung cho tất cả các thành phần khác. Hãy gọi nó App:

Khi bạn đã xác định thành phần gốc của mình, bạn cần tự hỏi mình câu hỏi sau:

  • Đường dẫn con có thể có thành phần nào?

Trong trường hợp của chúng tôi, nó có ý nghĩa để cung cấp cho nó ba thành phần con, mà chúng tôi sẽ gọi như sau:

  • Title
  • MessagesList
  • SendMessageForm

Hãy vẽ một hình chữ nhật cho mỗi cái:

Điều này cho chúng ta một cái nhìn tổng quan tốt đẹp về các component khác nhau và kiến trúc đằng sau ứng dụng của chúng tôi.

Chúng ta có thể tiếp tục tự hỏi bản thân còn những component con nào nữa?Vì vậy, chúng tôi có thể đã chia giao diện người dùng thành nhiều component hơn, ví dụ như chuyển từng thông điệp thành các thành phần của riêng chúng.Tuy nhiên, chúng tôi sẽ dừng lại ở đây vì mục đích đơn giản.

Bước 2: Thiết lập codebase

Bây giờ chúng tôi sẽ cần phải thiết lập kho lưu trữ của chúng tôi. Chúng tôi sẽ sử dụng cấu trúc đơn giản nhất có thể: tệp * index.html * có liên kết đến tệp JavaScript và file. Chúng tôi cũng import Chatkit SDK và Babel, được sử dụng để chuyển đổi JSX của chúng tôi:

Đây là một ví dụ  trên Scrimba khi hoàn thành bài hướng dẫn. Tôi khuyên bạn nên mở nó trong một tab mới và thử nó bất cứ khi nào bạn cảm thấy rối.

Ngoài ra, bạn có thể tải xuống dự án Scrimba dưới dạng tệp .zip và chạy một máy chủ đơn giản để thiết lập và chạy cục bộ.

Bước 3: Tạo component gốc

Với kho lưu trữ tại chỗ, chúng ta có thể bắt đầu viết một số code React, mà chúng ta sẽ làm bên trong tệp * index.js *.

Hãy bắt đầu với thành phần chính App,. Đây sẽ là thành phần “thông minh” duy nhất của chúng tôi, vì nó sẽ xử lý dữ liệu và kết nối với API. Đây là thiết lập cơ bản cho nó (trước khi chúng tôi thêm bất kỳ logic):

 class App extends React.Component {

      render() {
        return (
          <div className="app">
            <Title />
            <MessageList />
            <SendMessageForm />
         </div>
        )
      }
    }

Như bạn có thể thấy, nó chỉ đơn giản là làm cho ra ba người con: các <Title>, <MessageList> và các <SendMessageForm> component.

Tuy nhiên, chúng ta sẽ làm cho nó phức tạp hơn một chút, vì các tin nhắn trò chuyện sẽ cần được lưu trữ bên trong trạng thái của component App. Điều này sẽ cho phép chúng tôi truy cập các tin nhắn thông qua this.state.messages, và do đó thông qua chúng đến xung quanh các thành phần khác.

Chúng ta sẽ bắt đầu với việc sử dụng dữ liệu giả để chúng ta có thể hiểu được luồng dữ liệu của ứng dụng. Sau đó, chúng tôi sẽ đổi dữ liệu này với dữ liệu thực từ Chatkit API sau này.

Hãy tạo một DUMMY_DATA biến:

const DUMMY_DATA = [
      {
        senderId: "perborgen",
        text: "who'll win?"
      },
      {
        senderId: "janedoe",
        text: "who'll win?"
      }
    ]

Sau đó, chúng tôi sẽ thêm dữ liệu này vào trạng thái App và chuyển nó xuống MessageList thành phần như một prop.

    class App extends React.Component {

      constructor() {
        super()
        this.state = {
           messages: DUMMY_DATA
        }
      }

      render() {
        return (
          <div className="app">
            <MessageList messages={this.state.messages}/>
            <SendMessageForm />
         </div>
        )
      }
    }

Ở đây, chúng tôi đang khởi tạo trạng thái trong constructor và chúng tôi cũng đang chuyển this.state.messages xuống MessageList.

Lưu ý: rằng chúng tôi đang gọi super() trong hàm tạo. Bạn phải làm điều đó nếu bạn muốn tạo một thành phần trạng thái.

Bước 4: Hiển thị thông báo giả

Hãy xem cách chúng tôi có thể hiển thị các thông báo này trong component MessageList. Đây là cách nó trông:

class MessageList extends React.Component {
      render() {
        return (
          <ul className="message-list">                 
            {this.props.messages.map(message => {
              return (
               <li key={message.id}>
                 <div>
                   {message.senderId}
                 </div>
                 <div>
                   {message.text}
                 </div>
               </li>
             )
           })}
         </ul>
        )
      }
    }

Đây là cái gọi là stupid component. Phải mất một prop, messages trong đó có một mảng các đối tượng. Và sau đó chúng tôi chỉ đơn giản là hiển thị ra text và senderId các thuộc tính từ các đối tượng.

Với dữ liệu giả của chúng tôi chảy vào thành phần này, nó sẽ hiển thị như sau:

Vì vậy, bây giờ chúng tôi có cấu trúc cơ bản cho ứng dụng của mình và chúng tôi cũng có thể hiển thị thông báo.

Bây giờ hãy thay thế dữ liệu giả của chúng tôi bằng các tin nhắn thực tế từ một phòng chat!

Bước 5: Tìm nạp các khóa API từ Chatkit

Để nhận tin nhắn tìm nạp, chúng tôi cần kết nối với API Chatkit. Và để làm như vậy, chúng ta cần lấy các khóa API.

Tại thời điểm này, tôi muốn khuyến khích bạn làm theo các bước của tôi để bạn có thể cài đặt và chạy ứng dụng trò chuyện của riêng mình. Bạn có thể sử dụng Scrimba Playground của tôi để kiểm tra các khóa API của riêng bạn.

Bắt đầu bằng cách tạo một tài khoản miễn phí tại đây . Khi bạn đã hoàn tất, bạn sẽ thấy trang tổng quan của mình. Đây là nơi bạn tạo các mẫu Chatkit mới. Tạo một tên và đặt cho nó bất kỳ tên nào bạn muốn:

Sau đó, bạn sẽ được điều hướng đến mẫu mới được tạo của bạn. Ở đây bạn sẽ cần sao chép bốn giá trị:

  • Instance Locator
  • Test Token Provider
  • Room id
  • Username

Chúng ta sẽ bắt đầu với Instance Locator :

Và nếu bạn cuộn xuống một chút, bạn sẽ tìm thấy Test Token Provider:

Bước tiếp theo là tạo User * và ** Room , nó được thực hiện trên cùng một trang. Lưu ý rằng trước tiên bạn sẽ phải tạo User * và sau đó bạn có thể tạo một phòng, điều này lại cho phép bạn truy cập vào giá trị phòng.

Vì vậy, bây giờ bạn đã tìm thấy bốn giá trị của bạn. Làm tốt!

Tuy nhiên, trước khi chúng tôi quay trở lại với codebase, tôi cũng muốn bạn gửi một thư từ bảng điều khiển Chatkit theo cách thủ công, vì điều này sẽ giúp chúng tôi trong chương tiếp theo.

Dưới đây là cách thực hiện:

Điều này là để chúng tôi thực sự có một thông báo để hiển thị trong bước tiếp theo.

Bước 6: Hiển thị tin nhắn trò chuyện thực

Bây giờ chúng ta hãy quay trở lại tệp index.js của chúng tôi và lưu trữ bốn giá trị này dưới dạng các biến ở đầu tệp của chúng tôi.

Đây là của tôi, nhưng tôi khuyến khích bạn tạo của riêng bạn:

    const instanceLocator = "v1:us1:dfaf1e22-2d33-45c9-b4f8-31f634621d24"

    const testToken = "https://us1.pusherplatform.io/services/chatkit_token_provider/v1/dfaf1e22-2d33-45c9-b4f8-31f634621d24/token"

    const username = "perborgen"

    const roomId = 9796712

Và với điều đó tại chỗ, cuối cùng chúng tôi đã sẵn sàng kết nối với Chatkit. Điều này sẽ xảy ra trong component App, và cụ thể hơn trong phương thức componentDidMount. Đó là phương thức bạn nên sử dụng khi kết nối các thành phần React.js với API.

Trước tiên, chúng ta sẽ tạo chatManager:

  componentDidMount() {
      const chatManager = new Chatkit.ChatManager({
        instanceLocator: instanceLocator,
        userId: userId,
        tokenProvider: new Chatkit.TokenProvider({
          url: testToken
        })
     })

Và sau đó chúng tôi sẽ thực hiện chatManager.connect() để kết nối với API:

      chatManager.connect().then(currentUser => {
          currentUser.subscribeToRoom({
          roomId: roomId,
          hooks: {
            onNewMessage: message => {
              this.setState({
                messages: [...this.state.messages, message]
              })
            }
          }
        })
      })
    }

Điều này cho phép chúng ta truy cập vào đối tượng currentUser, đó là giao diện để tương tác với API.

Lưu ý: Vì chúng ta sẽ cần sử dụng currentUser sau này, lưu trữ nó trên cá thể bằng cách thực hiện this.currentUser =currentUser.

Sau đó, chúng tôi đang gọi currentUser.subscribeToRoom() và truyền vào roomId và một hook onNewMessage.

Hook onNewMessage được kích hoạt mỗi khi một thông điệp mới được truyền vào phòng chat. Vì vậy, mỗi khi điều đó xảy ra, chúng tôi sẽ chỉ thêm thông báo mới vào cuối this.state.messages.

Điều này dẫn đến ứng dụng tìm nạp dữ liệu từ API và sau đó hiển thị dữ liệu đó trên trang.

Điều này thật tuyệt vời, vì bây giờ chúng ta có bộ khung cho kết nối máy khách-máy chủ của chúng ta.

Bước 7: Xử lý dữ liệu nhập của người dùng

Điều tiếp theo chúng ta cần tạo là component SendMessageForm. Đây sẽ là một controlled component, có nghĩa là thành phần điều khiển những gì đang được hiển thị trong trường nhập thông qua trạng thái của nó.

Hãy xem phương thức render() và chú ý đặc biệt đến các dòng tôi đã đánh dấu:

    class SendMessageForm extends React.Component {
      render() {
        return (
          <form
            className="send-message-form">
            <input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" />
          </form>
        )
      }
    }

Chúng tôi đang làm hai việc:

  1. Lắng nghe đầu vào của người dùng với trình xử lý sự kiện onChange để chúng tôi có thể kích hoạt phương thức handleChange
  2. Đặt value trường nhập liệu một cách rõ ràng bằng cách sử dụng this.state.message

Kết nối giữa hai bước này được tìm thấy bên trong phương thức handleChange. Nó chỉ cập nhật trạng thái cho bất kỳ điều gì người dùng nhập vào trường nhập:

  handleChange(e) {
      this.setState({
        message: e.target.value
      })
    }

Điều này dẫn đến tái xuất hiện và khi trường nhập được đặt rõ ràng từ trạng thái sử dụng value={this.state.message}, trường nhập sẽ được cập nhật.

Vì vậy, ngay cả khi ứng dụng cảm thấy tức thì đối với người dùng khi họ nhập nội dung nào đó vào trường nhập, dữ liệu thực sự đi qua trạng thái trước khi React cập nhật giao diện người dùng.

Để kết thúc tính năng này, chúng tôi cần cung cấp cho component một constructor. Trong đó, chúng ta sẽ khởi tạo cả trạng thái và liên kết this trong phương thức handleChange:

    constructor() {
        super()
        this.state = {
           message: ''
        }
        this.handleChange = this.handleChange.bind(this)
    }

 

Chúng ta cần phải ràng buộc phương thức handleChange để chúng ta có quyền truy cập vào từ khóa this bên trong nó. Đó là cách JavaScript hoạt động: từ khóa this theo mặc định không được xác định bên trong phần thân của hàm.

Bước 8: Gửi tin nhắn

Component SendMessageForm của chúng tôi gần như đã hoàn tất, nhưng chúng tôi cũng cần phải chăm sóc việc gửi biểu mẫu. Chúng ta cần lấy các tin nhắn và gửi chúng đi!

Để làm điều này, chúng tôi sẽ gắn một trình xử lý handleSubmit với cả sự kiện onSubmit trong <form>.

    render() {
        return (
          <form
            onSubmit={this.handleSubmit}
            className="send-message-form">
            <input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" />
        </form>
        )
      }

Vì chúng ta có giá trị của trường nhập được lưu trữ trong this.state.message, nó thực sự khá dễ dàng để truyền dữ liệu chính xác cùng với việc gửi. Chúng tôi sẽ làm một cách đơn giản :

  handleSubmit(e) {
      e.preventDefault()
      this.props.sendMessage(this.state.message)
      this.setState({
        message: ''
      })
    }

Ở đây, chúng ta đang gọi sendMessage prop và truyền vào this.state.message như một tham số. Bạn có thể hơi bối rối vì điều này, vì chúng tôi chưa tạo phương thức sendMessage. Tuy nhiên, chúng ta sẽ làm điều đó trong phần tiếp theo, vì phương thức đó tồn tại bên trong component App. Vì vậy, đừng lo lắng!

Thứ hai, chúng tôi đang xóa trường nhập bằng cách đặt this.state.message thành một chuỗi trống.

Đây là toàn bộ component SendMessageForm. Lưu ý rằng chúng tôi cũng đã ràng buộc this với component handleSubmit:

    class SendMessageForm extends React.Component {
      constructor() {
        super()
        this.state = {
          message: ''
        }
        this.handleChange = this.handleChange.bind(this)
        this.handleSubmit = this.handleSubmit.bind(this)
      }

      handleChange(e) {
        this.setState({
          message: e.target.value
        })
      }

      handleSubmit(e) {
        e.preventDefault()
        this.props.sendMessage(this.state.message)
        this.setState({
          message: ''
        })
      }

      render() {
        return (
          <form
            onSubmit={this.handleSubmit}
            className="send-message-form">
            <input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" />
          </form>
        )
      }
    }

Bước 9: Gửi tin nhắn đến Chatkit

Chúng tôi đã sẵn sàng để gửi tin nhắn tới Chatkit. Điều đó được thực hiện trong component App, nơi chúng ta sẽ tạo ra một phương thức được gọi là this.sendMessage:

    sendMessage(text) {
      this.currentUser.sendMessage({
        text: text,
        roomId: roomId
      })
    }

Nó nhận vào một tham số (văn bản) và nó gọi một cách đơn giản đến this.currentUser.sendMessage().

Bước cuối cùng là chuyển thông tin này xuống component <SendMessageForm> như một biện pháp chống đỡ:

    /* App component */

    render() {
      return (
        <div className="app">
          <Title />
          <MessageList messages={this.state.messages} />
          <SendMessageForm sendMessage={this.sendMessage} />
      )
    }

Và với điều đó, chúng tôi đã thông qua trình xử lý SendMessageForm để có thể gọi nó khi biểu mẫu được gửi.

Bước 10: Tạo thành phần Tiêu đề

Để kết thúc, chúng ta hãy tạo component Title. Nó chỉ là một component chức năng đơn giản, có nghĩa là hàm trả về một biểu thức JSX.

    function Title() {
      return <p class="title">My awesome chat app</p>
    }

Đó là một bài thực hành tốt để sử dụng các component chức năng, vì chúng có nhiều ràng buộc hơn so với các lớp component, làm cho chúng ít bị lỗi hơn.

Kết quả

Cuối cùng, bạn đã có ứng dụng trò chuyện của riêng bạn mà bạn có thể sử dụng để trò chuyện với bạn bè của bạn!

Nếu bạn muốn tìm hiểu cách xây dựng thêm về ví dụ này, hãy xem khóa học miễn phí của tôi về cách tạo ứng dụng trò chuyện với React tại đây.

Tham khảo thêm các vị trí tuyển dụng ReactJS hấp dẫn cho bạn