Month: April 2019

  • Flutter !!!

    Flutter !!!

    Flutter là gì ?

    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.

    Link tham khảo: https://flutter.io/

    LET’S TRY ITTTTT !!!!

  • Swift—Closure

    Swift—Closure

    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 — iOS
    Server 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.

    Capturing value:
    https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID103

    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:

    import Foundation
    // Declare a variable to hold a closure
    var add: (Int, Int) -> Int
    // Assign a closure to a variable
    add = { (a: Int, b: Int) -> Int in
    return a + b
    }
    // Or combine like this
    var sub = { (a: Int, b: Int) -> Int in
    return a – b
    }
    add(1, 2)
    sub(1, 2)

    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:

    // Declare a variable to hold a closure
    var add: (Int, Int) -> Int
    /** SHORTHAND SYNTAX **/
    // Not need return keyword when only have single return statement
    add = {(a: Int, b: Int) -> Int in
    a + b
    }
    add(1, 1)
    // Remove return type and parameters type
    // Because we already declare: var add: (Int, Int) -> Int
    add = {(a, b) in
    a + b
    }
    add(9, 2)
    // Remove parameters, Swift will refer parameters by number, start from 0:
    add = {
    $0 + $1
    }
    add(99, 1)

    Ứng dụng của Closure:

    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…

    Note: Một vài gist về function và closure.

  • Missing pieces for developers using macOS

    Missing pieces for developers using macOS

    Homebrew (The missing package manager for macOS)

    • 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õ.
        • hiển thị thời điểm gõ câu lệnh RPROMPT=”%t”

    oh-my-zsh

    • 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.
    • Install oh-my-zsh
      • Mở terminal, paste câu lệnh sau và nhấn enter:
        1. sh -c “$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)”
      • Config plugin cho on-my-zsh
        1. Mở file ~/.zshrc
        2. Tìm đến dòng plugins=(…) và add plugin cho phù hợp với nhu cầu. Ví dụ muốn dùng plugin git, macos, aws, docker thì chỉnh sửa thành:
          1. plugins=(git osx aws docker)
        3. Restart terminal
      • Kết quả:
        1. Ví dụ, trước đây khi muốn show hidden file trong macOS thì cần phải gõ
          1. defaults write com.apple.finder AppleShowAllFiles -bool TRUE
          2. killall Finder 
        2. Sau khi dùng plugin osx thì chỉ cần gõ
          1. 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.

    ref:

  • Swift —Giới thiệu sơ lược

    Swift —Giới thiệu sơ lược

    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 là ngôn ngữ cân bằng giữa performance và productivity https://developer.apple.com/videos/play/wwdc2014/102/

    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.

  • Swift — Optionals, Guard and Nil Coalescing

    Guard

    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?

    Hãy xem xét ví dụ sau:

    Raw: https://gist.github.com/RioV/f551c21f3c2c16946f2bdd338c3fd24f

    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ụ:

    let name : String? = "Swift"
    let version : Int = 3
    let owner : String = "Apple"
    func checkMultiCondition(name : String?, version : Int, owner : String) {
    guard let name = name, version > 2, owner == "Apple" else {
    print("Input parameters not match!!!")
    return
    }
    print(name)
    print(version)
    print(owner)
    }

    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)

    struct Student {
    let name: String?
    let age: Int?
    let gender: String?
    }
    let student = Student(name: "Rio", age: 27, gender: "Male")
    func validateStudentInfo (_ student: Student) -> String {
    // We do NOT need to using student name, just want to check if
    // student name have value, so using underscore here
    if let _ = student.name {
    if let _ = student.age {
    if let _ = student.gender {
    return "OK"
    } else {
    return "Gender not valid"
    }
    } else {
    return "Age not valid"
    }
    } else {
    return "Name not valid"
    }
    }
    func validateStudentInfoWithGuard (_ student: Student) -> String {
    guard let _ = student.name else {
    return "Name not valid"
    }
    guard let _ = student.age else {
    return "Age not valid"
    }
    guard let _ = student.gender else {
    return "Gender not valid"
    }
    return "OK"
    }
    validateStudentInfo(student)
    validateStudentInfoWithGuard(student)

    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.

    Nil Coalescing

    Còn một cách khác để unwrap một object Optionals là sử dụng “nil coalescing”, trong các ngôn ngữ khác thì quen thuộc với cái tên “Null Coalescing” https://en.wikipedia.org/wiki/Null_coalescing_operator

    Dùng “Nil Coalescing” khi mà bạn muốn có giá trị default nào đó cho Optional object, trong trường hợp nó bị nil, như dưới đây:

    Trong ví dụ này ta thấy rằng trường hợp biến “name” bị nil thì lập tức nó được gán value là “No Name”

    Chú ý rằng chỉ sử dụng “Nil Coalescing” với các Object optionals thôi nhé, nếu dùng cho object non-optionals thì compiler sẽ báo lỗi như dưới:

    Nó dụ dỗ xoá nil coalescing đi luôn

    Have Fun