Flutter là một mobile UI technology & SDK from Google, nó cho phép bạn build native apps đa nền tảng (Android & iOS) với hiệu suất và độ trung thực cao trong 1 thời gian ngắn, tiết kiệm chi phí.
Flutter hoạt động với những code có sẵn được sử dụng bởi các lập trình viên và tổ chức trên thế giới.
Tại sao lại là Flutter ?
Ưu điểm:
Dễ dàng cài đặt và sử dụng (cái này thì ăn đứt React-Native , sure win), bộ doc khá ngon và đầy đủ. Chỉ cần tải flutter từ git về, chạy command line “flutter doctor” nó sẽ báo cho bạn tất cả những vấn đề đang tồn tại trong hệ thống của bạn.
Phát triển cho cả iOS và Android trên cùng 1 codebase nên sẽ tiết kiệm được chi phí và thời gian.
Tuy là 1 cross-platform nhưng hiệu năng và giao diện đạt tới mức gần như native app.
Flutter hoàn toàn free và là open-source.
Ngôn ngữ Dart: Dart — OOP, những dev quen làm việc với Java và C# sẽ bắt nhịp rất nhanh với Dart.
Animation và trải nghiệm cài đặt của Flutter thực sự tốt và mượt mà như 1 native app.
Nhược điểm:
Animation: Rất khó để tạo ra 1 animation riêng biệt của mình.
Giới hạn về thư viện.
Framework còn khá “trẻ”, cần thêm thời gian để phát triển.
Đặc điểm nổi bật của Flutter
Fast Development
Hot reload: Mỗi khi update source, thay vì phải build lại app như native, thì chúng ta chỉ cần 1 phím “r” thần thánh (nếu dùng command line để build) là app sẽ được update ngay lập tức trong vòng 1–2s.
Flutter có cầu nối là Dart, kích thước ứng dụng lớn hơn, nhưng nó hoạt động nhanh hơn nhiều. Không giống như React Native với cầu nối là Javascript.
Hỗ trợ tốt cho các IDE (Android Studio ,IntelliJ ,VS Code).
Trình điều hướng được tích hợp sẵn.
Expressive & Flexible UI: Flutter có thể làm thoả mãn những người dùng khó tính nhất với các widget built-in đẹp mắt theo Material Design và Cupertino (iOS — flavor), scroll mượt mà, dễ dàng thao tác với các UI component.
Truy cập các tính năng và SDK native: Flutter cho phép bạn sử dụng lại code Java, Swift, Objective-C hiện tại của mình và truy cập các tính năng và SDK native trên iOS và Android.
Native performance.
Flutter có các công cụ và thư viện để giúp bạn dễ dàng đưa ý tưởng của mình vào cuộc sống trên iOS và Android. Nếu bạn chưa có kinh nghiệm phát triển trên thiết bị di động, thì Flutter là một cách dễ dàng và nhanh chóng để xây dựng các ứng dụng di động tuyệt đẹp. Nếu bạn là một nhà phát triển iOS hoặc Android có kinh nghiệm, bạn có thể sử dụng Flutter cho các View của bạn và tận dụng nhiều code Java / Kotlin / ObjC / Swift hiện có của bạn.
Khi mới làm quen với Swift, đôi khi ta gặp phải những đoạn code như dưới:
Client Side Swift — iOSServer Side Swift — Vapor
Tuy nhiên ta không hiểu chúng là gì, và dùng như nào. Trong Swift, những đoạn code kiểu như trên được gọi là Closure, bài Note này sẽ đi sâu vào bới móc xem Closure là gì ;))
Trong Swift thì Closure là khái niệm khá quan trọng, ứng dụng nhiều cũng như là khó đọc cho người mới nếu chưa nắm được syntax của nó. Bài viết này sẽ nói về khái niệm Closure cũng như một vài ứng dụng của nó.
Closure là?
Closure là một block code, có thể tách ra để tái sử dụng. Hiểu đơn giản hơn thì Closure là function, nhưng khuyết danh. Ta có thể gán Closure vào biến và sử dụng như các kiểu value khác.
Closures có thể là 1 trong 3 loại sau:
Global functions: là closures có tên và không “capture” các giá trị.
Nested functions: là closures có tên và có thể “capture” các giá trị từ function chứa nó.
Closure expressions: là closures không có tên được viết dưới dạng giản lược syntax và có thể “capture” các giá trị từ các bối cảnh xung quanh.
2 loại đầu được gọi với cái tên khác là function. Và khi nhắc đến Closures, thường ta chỉ quan tâm đến trường hợp thứ 3, Closure expressions (từ giờ chỉ gọi tắt là Closure).
Closure Syntax
Ví dụ cụ thể về khai báo Closure:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Note: parameters trong Closure có thể là kiểu “in-out”, variadic, tuples, nhưng không thể có default value.
So với Function thì Closure đã được viết ra với mục đích ngắn gọn nhất có thể, và nó như sau:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Closure như là parameter cho function, Trailing closure syntax
Với function thì ta hoàn toàn có thể truyền vào cho function khác dưới dạng arguments, tuy nhiên trước khi truyền thì phải define function sẽ dùng làm argument:
Ví dụ dùng function làm parameter cho function
Đối với Closure thì đơn giản hơn, ta có thể define closure inline:
Ví dụ dùng closure làm parameter cho function
Note: {$0 + $1}: Swift cho phép refer đến mỗi parameter bằng format như bên, bắt đầu từ index 0.
Đối với những function có parameter cuối cùng là Closure, thì ta có thể viết lại function call dưới dạng Trailing Closure như sau:
Trailing Closure example
Cách làm này phù hợp với những Closure dài, dùng như complete block/callback…Ví dụ về cách sử dụng callback/block khi request data từ server, ví dụ:
Objective C:
Khai báo method:
Gọi hàm:
Swift Closure:
Khai báo func:
Gọi hàm:
Các ứng dụng của Closure nên biết:
sorted(): dùng để thay đổi điều kiện sort cho array/collection…
filter(): dùng dể lọc các phần tử của collection/array với điều kiện nhất định, ví dụ như lọc tuổi người dùng để kiểm tra nhưng ai đủ tuổi xem 18+ chẳng hạn
map(): dùng để áp dụng điều kiện nào đó cho tất cả các item trong array/collection, ví dụ tính tiền của sản phẩm sau khi áp dụng thuế tiêu thụ chẳng hạn
reduce(): dùng để tính tổng của array…Xem ví dụ bên dưới, bài toán là cần tính tổng tất cả các sách có trong kho, mỗi record sách được lưu dưới dạng: tên sách, số lượng, và giá.
reduce() có 2 parameters là giá trị ban đầu, tức là giá trị kết quả giả định ban đầu, ở ví dụ này được set là 0, và 1 closure tính toán trả về giá trị cần tính, giá trị này tiếp theo sẽ được truyền vào closure dưới dạng first parameter ($0), và lặp lại cho đến hết array.
Với ví dụ ở trên thì reduce() sẽ xử lý như sau
Step1. $0 sẽ có giá trị là 0 (chính là giá trị của init result). $1 là object đầu tiên của array books. Closure này sẽ return kết quả là $0 (=0)+ (12 * 39.000) = 468.000. Kết quả này sẽ được gán cho $0 của step tiếp theo. Nếu truyền vào giá trị ban đầu là số khác, thì $0 cũng tương đương với giá trị của số đó. Ví dụ ở trên, nếu truyền vào là books.reduce(5)… thì closure sẽ return kết quả là $0 (=5)+ (12 * 39.000)
Step2. $0 sẽ có giá trị là kết quả của step 1, và $1 là object ở index = 1 của array books. Kết quả return của Closure là $0 (=468.000) + (9 * 22.000). Step này sẽ được lặp lại cho đến hết array books. Về cơ bản, step 1 và 2 chỉ khác nhau ở chỗ, ở step 1, $0 chưa có giá trị, nên nó sẽ được chỉ định là giá trị của parameter thứ nhất của Closure reduce(), a hi hi hi.
Closure được dùng rất nhiều trong source code Swift, nếu biết syntax thì sẽ dễ hơn trong việc đọc source code, nắm được các ưu điểm và ứng dụng đúng lúc sẽ đem lại source code ngắn gọn và hiệu quả hơn…
Homebrew là package manager rất có ích cho macOS, nó giúp bạn cài đặt các thư viện, ngôn ngữ, framework… rất nhanh và dễ dàng.
Ưu điểm của Homebrew đó là bạn chỉ cần gõ câu lệnh để cài đặt package mà được Homebrew support, sau đó nó sẽ tự động download, check các dependencies (các package cần phải có trước khi cài đặt package mình mong muốn), nếu chưa có nó sẽ download và install dependencies trước, rồi sẽ install package mà bạn muốn cài
Ngoài ra thì Homebrew cũng cài đặt các package lên máy trong folder riêng của nó, sau đó mới link sang thư mục /usr/local, việc này sẽ đảm bảo môi trường default trên máy bạn không bị ảnh hưởng.
Homebrew cũng đảm bảo các package luôn được up-to-date. Điều này chắc chắn là tiết kiệm cho bạn rất nhiều thời gian.
Ngoài ra, bạn có thể cài đặt các application trên macOS bằng cách sử dụng Homebrew Cask. (No more download, no more .dmg)
Oh my zsh
Các developer sử dụng macOS và các OS Linux khác chắc hẳn rằng không còn xa lạ gì với bash, có thể nói rằng bash chính là một phần không thể thiếu trong công việc hàng ngày. Khi bạn mở Terminal lên, gõ câu lệnh và OS thực thi nó, vậy là bạn đã sử dụng bash.
Vậy bash là gì?
bash (Bourne-Again SHell) thực chất là các shell, hay còn gọi là command-line interpreter hoặc command language interpreter (CLI). Nó cho phép người dùng sử dụng các câu lệnh dạng text để gọi đến các service của OS (kernel), qua đó thực thi các câu lệnh của người dùng.
bash là shell mặc định trên các OS như macOS, Linux. Ngoài việc nhận lệnh trực tiếp từ user thông qua các ứng dụng như Terminal thì bash còn có thể thực thi lệnh thông qua file được gọi là shell script.
zsh là gì?
zsh cũng giống như bash, nhưng nó được thiết kế nhằm mục đích phục vụ cho việc tương tác với người dùng (thực hiện lệnh mà người dùng input vào). zsh cũng “học hỏi” rất nhiều tính năng từ bash, ksh, tcsh ngoài những tính năng nó có sẵn, đem đến cho người dùng một bộ công cụ mạnh mẽ khi làm việc với shell.
Những điểm thú vị khi so sánh zsh với bash
muốn thay đổi directory thì chỉ cần gõ tên directory, không cần thêm cd ở đầu
ls *.(h|m) : list tất cả các file có đuôi .h hoặc .m trong folder
completing command options: example git — + tab => liệt kê các options tương ứng với command vừa gõ.
Không dừng lại ở zsh, cộng đồng developers đã tạo ra oh-my-zsh, một framework thú vị, giúp người dùng không còn cảm thấy nhàm chán mỗi khi làm việc với command line.
oh-my-zsh có gì thú vị?
Có bộ plugin khổng lồ cho các công cụ, ngôn ngữ và framework mà bạn hay dùng như: aws, docker, git, rails, laravel, npm, osx, python… Nó giúp bạn có thể autocomplete câu lệnh hoặc cung cấp các alias ngắn gọn, giúp rút ngắn thời gian gõ lệnh.
Cung cấp các bộ theme đẹp và tiện dụng cho terminal, một terminal màu mè với các symbol hiển thị phù hợp sẽ đỡ nhàm chán hơn rất nhiều so với một terminal đen trắng.
Bạn có thể trở thành contributor để cung cấp những plugin do chính mình viết.
showfiles / hidefiles để hiện và ẩn hidden file (hidden file là những file có tên bắt đầu bằng dấu .)
Install theme cho on-my-zsh
Mở file ~/.zshrc
Điền tên theme vào sau ZSH_THEME=, ví dụ ZSH_THEME=”robbyrussell”
iTerm2
App Terminal, default của macOS có thể thực hiện tốt các nhiệm vụ khi người dùng muốn làm việc với shell. Tuy nhiên, nếu bạn thực sự muốn một app có tính tuỳ biến cao, nhiều tính năng thú vị hỗ trợ thì nên thử qua app iTerm2.
Một vài tính năng thú vị của iTerm2:
Split panels: tính năng này cho phép bạn chia tab hiện tại của iTerms ra thành các “panel” khác nhau, mỗi panel là một section riêng biệt. Rất có ích khi làm việc mà cần phải tham chiếu kết quả giữa các section với nhau.
Search: tính năng search trên iTerm2 có sự khác biệt khi so sánh với Terminal, iTerm2 highlight tất cả các kết quả phù hợp với điều kiện search, ngoài ra nó còn hỗ trợ cả search theo regular expression.
Autocomplete: với những câu lệnh bạn đã từng gõ trong iTerm, thì lần sau chỉ cần gõ vài ký tự đầu và nhấn tổ hợp phím Cmd + ; thì iTerm sẽ liệt kê lịch sử các câu lệnh đã gõ tương ứng cho bạn lựa chọn.
Swift là gì? Swift là ngôn ngữ lập trình được phát triển bởi Apple, do Chris Lattner làm trưởng nhóm thiết kế. Lần đầu tiên được giới thiệu công khai là vào WWDC năm 2014 của Apple. Năm 2015, Swift chính thức trở thành open source và từ đó luôn phát triển mạnh mẽ với những đóng góp không ngừng từ cộng đồng lập trình viên quốc tế.
Điểm mạnh của Swift Swift là ngôn ngữ lập trình mạnh mẽ và trực quan, dùng để viết ứng dụng cho macOS, iOS, watchOS, tvOS, Linux (và một vài OS khác). Do được truyền cảm hứng từ các ngôn ngữ khác như Objective-C, Haskell, Ruby, Python, C#… nên Swif mang hơi hướng hiện đại và luôn có những tính năng mới mẻ. Swift cũng rất dễ dàng để làm quen vì syntax đơn giản, ngắn gọn. Swift được thiết kế với tiêu chí là sẽ trở thành ngôn ngữ mạnh mẽ và an toàn, cùng với đó là tốc độ xử lý cũng như hiệu suất cao, đảm bảo rằng Swift sẽ còn phát triển và còn mạnh mẽ hơn trong tương lai.
Swift có thể làm được gì? Swift là ngôn ngữ chính để phát triển ứng dụng chạy trên các OS của Apple như macOS, iOS, tvOS, watchOS. Ngoài ra Swift còn được dùng để phát triển các ứng dụng server/web chạy trên các nền tảng Linux OS, hiện tại có các Web Framework nổi tiếng có thể kể tên như Vapor, Perfect, Kitura (phát triển bởi IBM). Trong một vài bài test benchmarks thì Vapor và Perfect cũng có rất nhiều điểm nổi bật so với NodeJS. Điều này rất thuận lợi cho các lập trình viên iOS/macOS xây dựng các ứng dụng server-side cho bản thân họ.
Hệ sinh thái Swift
Làm thế nào để cài đặt và sử dụng Swift? Đối với những người dùng macOS thì cách nhanh nhất để install Swift là tải và cài đặt XCode, Swift sẽ được cài đặt cùng với XCode. Nếu không muốn download cả bộ cài XCode thì có thể cài đặt riêng thông qua toolchain tại đây https://swift.org/download/, sau khi cài đặt toolchain thì có thể sử dụng Swift bình thường. Đối với người dùng Ubuntu thì chỉ có phương pháp cài đặt thông qua toolchain, tham khảo chi tiết tại https://swift.org/download/ Sau khi cài đặt xong thì gõ command swift -version để kiểm tra xem cài đặt thành công hay chưa.
What’s next?
Swift vẫn đang được phát triển bởi cộng đồng lập trình viên trên toàn thế giới, ngoài ra Swift còn được các công ty lớn như Apple, IBM hỗ trợ nên chắc chắn rằng Swift còn rất nhiều điều hấp dẫn đang chờ đợi. Nếu như bạn đã cài đặt XCode/Swift thành công thì hãy bắt tay vào việc viết một ứng dụng đi thôi.
Guard cũng gần giống như “if let” (optionals binding), nó cũng được sử dụng để xử lý các object dạng Optionals, cũng check các điều kiện khác “nil” thì cho phép thực hiện các logic tiếp theo… Nhưng Guard còn được gọi với tên gọi khác là “Early Exit”, vậy Guard khác “if let” (Optional binding) ở điểm nào?
Ví dụ trên là sự so sánh giữa việc sử dụng Optional Binding và Guard để xử lý việc check object có thoả mãn điều kiện là khác “nil” hay không.
Với Optional Binding thì ta tập trung xử lý trường hợp có value trước. Còn với Guard thì ta ưu tiên xử lý trường hợp không có value trước. Hai khái niệm trên cùng xử lý việc tương tự nhau, nhưng tuỳ hoàn cảnh cụ thể mà ta dùng Optional binding hay Guard cho phù hợp.
Tất nhiên là Guard còn được sử dụng để check hàng loạt các điều kiện khác nhau (không nhất thiết chỉ là check nil) xem các điều kiện có cùng thoả mãn hay không.
Ví dụ:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Và dùng Guard để check các điều kiện tuần tự thì…tuyệt vời ông mặt giời luôn. (search thêm về Happy-Path Programming)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Như đoạn code sample trên thì việc sử dụng Guard để check các điều kiện tuần tự nhau rất đơn giản và dễ đọc. Còn nếu sử dụng Optional Binding lồng nhau để check thì source code trông rất tệ và khó đọc. Hãy cân nhắc khi sử dụng 😉
Có một điều cần chú ý là, với Guard statement thì trong trường hợp “else”, ta bắt buộc phải return ;). Và sử dụng Guard một cách hợp lý sẽ làm source code dễ đọc hơn, dễ maintain hơn.