Advertisement
Advertisement

More Related Content

Advertisement
Advertisement

Google Cloud Functions: try { Kotlin } instead of JavaScript

  1. Google Cloud Functions: try { Kotlin } insteadOf JavaScript How to write (almost) free backend services on Google Cloud Functions in Kotlin
  2. Omar Miatello Android Developer @ Organizer @ Personal profile google.com/+OmarMiatello Slides available on: Google Presentation https://goo.gl/CMVNqS Google Photo https://goo.gl/HpRLw4 Speaker Deck (by GitHub) https://speakerdeck.com/jacklt SlideShare (by LinkedIn) https://www.slideshare.net/OmarMiatello
  3. I’m an Android developer (since 2010) About me
  4. I’m an Android developer (since 2010) I use Kotlin (since 2015) instead of Java About me
  5. I’m an Android developer (since 2010) I use Kotlin (since 2015) instead of Java I use a lot of Firebase services About me
  6. Target: cost-free backend! Free hosting options: ● PHP (a lot of free hosting, since 2000) ○ Altervista, Netsons, … ● Solution PaaS (Platform as a Service) ○ Google App Engine ■ Support for: Node.js, Java, Ruby, C#, Go, Python e PHP, … ■ 28 hours instance a day ○ Amazon Web Services (Free tear only for the first 12 months) ● Solution “serverless”
  7. Target: cost-free backend! Comparison free "serverless" plans: ● Google Cloud Functions ○ Node.js ○ 2.000.000 free calls/month ● Cloud Functions for Firebase ○ Node.js ○ 125.000 / 2.000.000 free calls/month ● AWS Lambda ○ Node.js, Java, C#, Go, Python ○ 1.000.000 free calls/month
  8. 2.000.000 calls/month? What if: I call a function every second 1 day = 86.400 seconds ~ 12 days = 1.000.000 seconds ~ 23 days = 2.000.000 seconds 30 days = 2.592.000 seconds
  9. 2.000.000 calls/month? How many users? 1 day = ~ 65.000 calls depends on Average User Activity 100 calls/day = ~ 650 users/day 10 calls/day = ~ 6.500 users/day
  10. Setup: Cloud Functions + Kotlin (Node.js) + Kotlin for JavaScript picture: https://blog.jetbrains.com/kotlin/2017/11/kotlin-1-2-released
  11. Setup: Cloud Functions + Kotlin (Node.js) + Kotlin for JavaScript picture: https://blog.jetbrains.com/kotlin/2017/11/kotlin-1-2-released
  12. New Project in Kotlin/JS ● Download: IntelliJ IDEA Community Edition (Free) ○ https://www.jetbrains.com/idea/download ● New Project: Gradle > Kotlin (JavaScript)
  13. New Project in Kotlin/JS ● Download: IntelliJ IDEA Community Edition (Free) ○ https://www.jetbrains.com/idea/download ● New Project: Gradle > Kotlin (JavaScript) ● GroupId: “com.example” & ArtifactId: “myservice” ● Confirm default settings until “Finish”
  14. Configure: Cloud Functions for Firebase ● Create new project on Firebase (optional) ○ Use console: https://console.firebase.google.com
  15. Configure: Cloud Functions for Firebase ● Create new project on Firebase (optional) ○ Use console: https://console.firebase.google.com ● Open Functions section > click “Start”
  16. Configure: Cloud Functions for Firebase ● Create new project on Firebase (optional) ○ Use console: https://console.firebase.google.com ● Open Functions section > click “Start” ● Install Node.js: https://nodejs.org ○ Command line: “npm install -g firebase-tools” and “npm install kotlin” ○ Open Terminal in project folder and run “firebase init” (and follow instructions)
  17. Configure: Gradle ● Add these lines in build.gradle ● Ready! ○ Deploy command: firebase deploy compileKotlin2Js.kotlinOptions { moduleKind = "commonjs" outputFile = "functions/index.js" }
  18. Kotlin for JavaScript JavaScript is a dynamically-typed language, which means it does not check types at compile-time. You can freely talk to JavaScript from Kotlin via dynamic types, but if you want the full power of Kotlin type system, you can create Kotlin headers for JavaScript libraries.
  19. Kotlin: useful keywords for JavaScript Keywords: ● external - Modifier to tell Kotlin that a certain declaration is written in pure JavaScript. Compiler assumes that the implementation for the corresponding class, function or property is provided by the developer. ● dynamic - The dynamic type basically turns off Kotlin's type checker. The most peculiar feature of dynamic is that we are allowed to call any property or function with any parameters on a dynamic variable.
  20. Kotlin: useful functions for JavaScript Extensions: ● .asDynamic() - Reinterprets this value as a value of the dynamic type. ● .unsafeCast<T>() - Reinterprets this “dynamic” value as a value of the specified type [T] (ex: String / Array) without any actual type checking. Methods: ● js(code) - Puts the given piece of a JavaScript code right into the calling function. The compiler replaces call to `js(...)` code with the string constant provided as a parameter.
  21. Example: Utils.kt fun toJson(obj: dynamic) = JSON.stringify(obj) { key, value -> value ?: undefined } // Arrays / Map utils fun jsMap(init: (dynamic) -> Unit) = Any().apply { init(asDynamic()) }.asDynamic() fun keys(obj: dynamic) = js("Object").keys(obj).unsafeCast<Array<String>>() // JavaScript functions fun getDateOfWeek(week: Int, year: Int) = js(""" var simple = new Date(year, 0, 1 + (week - 1) * 7); var dow = simple.getDay(); var iso = simple; if (dow <= 4) iso.setDate(simple.getDate() - simple.getDay() + 1); else iso.setDate(simple.getDate() + 8 - simple.getDay()); return iso;""").unsafeCast<Date>()
  22. GET on /helloWorld external fun require(module: String): dynamic external val exports: dynamic fun main(args: Array<String>) { val fireFunctions = require("firebase-functions") val config = fireFunctions.config() exports.helloWorld = fireFunctions.https.onRequest { request, response -> console.log("Request headers: " + toJson(request.headers)) console.log("Request body: " + toJson(request.body)) response.send("Hello from Firebase!") } }
  23. Deploy Before deploy update Node.js dependencies, from command line use: ● npm update ● npm install Build index.js file from gradle and deploy on Firebase! ● ./gradlew build ● firebase deploy Demo: https://goo.gl/tkdvfk Full source: https://github.com/jacklt/firebase-cloud-functions-with-kotlin-js
  24. Real-World example: Dialogflow Fulfillment (webhook) Telegram bot: https://t.me/gdgmilano_bot Full source: https://github.com/jacklt/Assistant-for-events/
Advertisement