SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
otlin - Let's ketchup it
Author: Michał Szczepanik
About me
Dream on
Frist Law of Software Quality
E=mc2
Error=(more code)2
otlin
• created by JetBrains
• open sourced :)
• statically typed programming language
• runs on JVM
• can be compiled to JavaScript source code
• works on Spring Boot
Modern & Pragmatic
concise
expressive
safe & fast
can be easily mixed with
Let’s have fun with Hello
fun main(args : Array<String>) {
val scope = "world"
println("Hello, $scope!")
}
How to start ?
Lang syntax
fun sum(a: Int, b: Int): Int {
return a + b
}
fun sum(a: Int, b: Int) = a + b
Diffs
classes, funs are final by default
primitive type
== works like java’s .equals()
Lambdas
val sum: (Int, Int) -> Int = {x: Int, y: Int -> x+y}
val sum = {x: Int, y: Int -> x + y}
fun apply(i: Int, f: (Int) -> Int) = f(i)
apply(9, {x -> x + 60})
apply(9) {x -> x + 60}
Lambdas
firstName.validateWith { !it.notEmpty }
lastName.validateWith { !it.notEmpty }
val notEmpty: (String) -> Boolean = { !it.notEmpty }
firstName.validateWith(notEmpty)
lastName.validateWith(notEmpty)
Null
Pointer
Null Safety
(Nullable types and Non-Null Types)
var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok
Null Safety
if(b != null){
return b.lenght()
}
b?.lenght()
b!! //NPE
val l = b?.length() ?: 0
Extension Functions
fun Activity.toast( msg: CharSequence,
dtn: Int = Toast.LENGTH_SHORT){

Toast.makeText(this, msg, dtn)

}
toast("Short Toast!!")
toast("Long Toast!!", Toast.LENGTH_LONG)
Default & Named Arguments
fun reformat( str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ') {
...
}
reformat(str)
reformat(str, upperCaseFirstLetter = false )
Singleton
public object TheSingleton {
public fun drink() {
...
}
}
TheSingleton.drink()
Extension Function Expresions
db.beginTransaction();
try {
db.delete("user", "name = ?", new String[] {"Michael"});
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
Extension Function Expresions
fun SQLiteDatabase.inTransaction(func: () -> Unit){
beginTransaction()
try {
func()
setTransactionSuccessful()
} finally {
endTransaction()
}
}
db.inTransaction {
db.delete("user", "name = ?", new String[] {"Michael"})
}
Extension Function Expresions
inline fun SQLiteDatabase.inTransaction(
func: SQLiteDatabase.() -> Unit){
beginTransaction()
try {
func()
setTransactionSuccessful()
} finally {
endTransaction()
}
}
db.inTransaction {
delete("user", "name = ?", new String[] {"Michael"})
}
Kotlin Android Extensions
(Goodbye findViewById)
<Button
android:id="@+id/click_me_button"
/>
class KotlinActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?)
{
...
click_me_button.setOnClickListener {....}
...
}
}
Kotlin Android Extensions
(startActivity)
val intent = Intent(this, javaClass<NewActivity>())
intent.putExtra("VALUE", 1)
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)
startActivity(intentFor<NewActivity>("VALUE" to 1).singleTop())
startActivity<NewActivity>("VALUE" to 1)
Anko
verticalLayout {
val name = editText()
button("Say Hello") {
onClick {
toast("Hello, ${name.text}!")
}
}
}
Write executable specifications
@Test
public void testCalculateTaxRate() {
TaxRateCalc calculator = new TaxRateCalc();
Integer value = calculator.calculateRate(200, 10);
assertEquals(300,value);
}
Write executable specifications
class TaxCalculatorSpecs: Spek() { init {
given("Tax rate calculator with default locale settings") {
val taxRateCalc = TaxRateCalc ()
on("calculating the rate for an income of 200 and an average
change of 10 per semester") {
val value = taxRateCalculator.calculateRate(200, 10)
it("should result in a value of 300") {
assertEquals(300, value)
}
}
}
}}
Library Jar Size Dex Size Method Count Field Count
kotlin-runtime-0.10.195 354 KB 282 KB 1071 391
kotlin-stdlib-0.10.195 541 KB 835 KB 5508 458
Library Jar Size Dex Size Method Count Field Count
scala-library-2.11.5 5.3 MB 4.9 MB 50801 5820
groovy-2.4.0-grooid 4.5 MB 4.5 MB 29636 8069
guava-18.0 2.2 MB 1.8 MB 14833 3343
Source: Using Project Kotlin for Android by Jake Wharton
Library Jar Size Dex Size Method Count Field Count
rxjava-1.0.4 678 KB 513 KB 3557 1668
support-v4-21.0.3 745 KB 688 KB 6721 1886
play-services-base-6.5.87 773 KB 994 KB 5212 2252
okio-1.2.0 54 KB 55 KB 508 76
okhttp-2.2.0 304 KB 279 KB 1957 882
retrofit-1.9.0 119 KB 93 KB 766 228
picasso-2.4.0 112 KB 97 KB 805 342
dagger-1.2.2 59 KB 54 KB 400 119
butterknife-6.0.0 48 KB 50 KB 307 73
wire-runtime-1.6.1 71 KB 71 KB 471 147
gson-2.3.1 206 KB 170 KB 1231 390
Total 2963 KB 2894 KB 21935 8063
and
I want much more
https://kotlinlang.org/ (kotl.in)
https://github.com/Kotlin/anko
Thank you for your attention
michal.szczepanik@blstream.com
meet.mobile.@blstream.com
michal.szczepanik@blstream.com
meet.mobile@blstream.com

Weitere ähnliche Inhalte

Was ist angesagt?

Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife Spring
Mario Fusco
 

Was ist angesagt? (20)

Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife Spring
 
Q
QQ
Q
 
DRYing to Monad in Java8
DRYing to Monad in Java8DRYing to Monad in Java8
DRYing to Monad in Java8
 
Semantic code transformations in MetaJS
Semantic code transformations in MetaJSSemantic code transformations in MetaJS
Semantic code transformations in MetaJS
 
Singleton
SingletonSingleton
Singleton
 
Singleton
SingletonSingleton
Singleton
 
java script
java scriptjava script
java script
 
Dartprogramming
DartprogrammingDartprogramming
Dartprogramming
 
The Ring programming language version 1.7 book - Part 7 of 196
The Ring programming language version 1.7 book - Part 7 of 196The Ring programming language version 1.7 book - Part 7 of 196
The Ring programming language version 1.7 book - Part 7 of 196
 
JavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and LodashJavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and Lodash
 
Kotlin Generation
Kotlin GenerationKotlin Generation
Kotlin Generation
 
Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)
 
Anton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 lightAnton Minashkin Dagger 2 light
Anton Minashkin Dagger 2 light
 
Mattbrenner
MattbrennerMattbrenner
Mattbrenner
 
Lenses and Prisms in Swift - Elviro Rocca - Codemotion Rome 2018
Lenses and Prisms in Swift - Elviro Rocca - Codemotion Rome 2018 Lenses and Prisms in Swift - Elviro Rocca - Codemotion Rome 2018
Lenses and Prisms in Swift - Elviro Rocca - Codemotion Rome 2018
 
jRuby: The best of both worlds
jRuby: The best of both worldsjRuby: The best of both worlds
jRuby: The best of both worlds
 
Solid Software Design Principles
Solid Software Design PrinciplesSolid Software Design Principles
Solid Software Design Principles
 
Steady with ruby
Steady with rubySteady with ruby
Steady with ruby
 
Symfony2 revealed
Symfony2 revealedSymfony2 revealed
Symfony2 revealed
 
EventMachine for RubyFuZa 2012
EventMachine for RubyFuZa   2012EventMachine for RubyFuZa   2012
EventMachine for RubyFuZa 2012
 

Ähnlich wie 4Developers: Michał Szczepanik- Kotlin - Let’s ketchup it

Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 
Python-GTK
Python-GTKPython-GTK
Python-GTK
Yuren Ju
 

Ähnlich wie 4Developers: Michał Szczepanik- Kotlin - Let’s ketchup it (20)

mobl
moblmobl
mobl
 
Introduction to kotlin
Introduction to kotlinIntroduction to kotlin
Introduction to kotlin
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Day 5
Day 5Day 5
Day 5
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
 
Kotlin : Happy Development
Kotlin : Happy DevelopmentKotlin : Happy Development
Kotlin : Happy Development
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruit
 
What's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritageWhat's in Kotlin for us - Alexandre Greschon, MyHeritage
What's in Kotlin for us - Alexandre Greschon, MyHeritage
 
Kotlin / Android Update
Kotlin / Android UpdateKotlin / Android Update
Kotlin / Android Update
 
Priming Java for Speed at Market Open
Priming Java for Speed at Market OpenPriming Java for Speed at Market Open
Priming Java for Speed at Market Open
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Declarative UIs with Jetpack Compose
Declarative UIs with Jetpack ComposeDeclarative UIs with Jetpack Compose
Declarative UIs with Jetpack Compose
 
Lies Told By The Kotlin Compiler
Lies Told By The Kotlin CompilerLies Told By The Kotlin Compiler
Lies Told By The Kotlin Compiler
 
JavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScriptJavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScript
 
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
Effective Java with Groovy & Kotlin How Languages Influence Adoption of Good ...
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projects
 
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
 
Introduction to Kotlin
Introduction to KotlinIntroduction to Kotlin
Introduction to Kotlin
 
Python-GTK
Python-GTKPython-GTK
Python-GTK
 

Kürzlich hochgeladen

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 

4Developers: Michał Szczepanik- Kotlin - Let’s ketchup it

  • 1.
  • 2. otlin - Let's ketchup it Author: Michał Szczepanik
  • 5. Frist Law of Software Quality E=mc2 Error=(more code)2
  • 6.
  • 7.
  • 8. otlin • created by JetBrains • open sourced :) • statically typed programming language • runs on JVM • can be compiled to JavaScript source code • works on Spring Boot
  • 9. Modern & Pragmatic concise expressive safe & fast can be easily mixed with
  • 10. Let’s have fun with Hello fun main(args : Array<String>) { val scope = "world" println("Hello, $scope!") }
  • 12. Lang syntax fun sum(a: Int, b: Int): Int { return a + b } fun sum(a: Int, b: Int) = a + b
  • 13. Diffs classes, funs are final by default primitive type == works like java’s .equals()
  • 14. Lambdas val sum: (Int, Int) -> Int = {x: Int, y: Int -> x+y} val sum = {x: Int, y: Int -> x + y} fun apply(i: Int, f: (Int) -> Int) = f(i) apply(9, {x -> x + 60}) apply(9) {x -> x + 60}
  • 15. Lambdas firstName.validateWith { !it.notEmpty } lastName.validateWith { !it.notEmpty } val notEmpty: (String) -> Boolean = { !it.notEmpty } firstName.validateWith(notEmpty) lastName.validateWith(notEmpty)
  • 17. Null Safety (Nullable types and Non-Null Types) var a: String = "abc" a = null // compilation error var b: String? = "abc" b = null // ok
  • 18. Null Safety if(b != null){ return b.lenght() } b?.lenght() b!! //NPE val l = b?.length() ?: 0
  • 19.
  • 20. Extension Functions fun Activity.toast( msg: CharSequence, dtn: Int = Toast.LENGTH_SHORT){
 Toast.makeText(this, msg, dtn)
 } toast("Short Toast!!") toast("Long Toast!!", Toast.LENGTH_LONG)
  • 21. Default & Named Arguments fun reformat( str: String, normalizeCase: Boolean = true, upperCaseFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false, wordSeparator: Char = ' ') { ... } reformat(str) reformat(str, upperCaseFirstLetter = false )
  • 22. Singleton public object TheSingleton { public fun drink() { ... } } TheSingleton.drink()
  • 23. Extension Function Expresions db.beginTransaction(); try { db.delete("user", "name = ?", new String[] {"Michael"}); db.setTransactionSuccessful(); } finally { db.endTransaction(); }
  • 24. Extension Function Expresions fun SQLiteDatabase.inTransaction(func: () -> Unit){ beginTransaction() try { func() setTransactionSuccessful() } finally { endTransaction() } } db.inTransaction { db.delete("user", "name = ?", new String[] {"Michael"}) }
  • 25. Extension Function Expresions inline fun SQLiteDatabase.inTransaction( func: SQLiteDatabase.() -> Unit){ beginTransaction() try { func() setTransactionSuccessful() } finally { endTransaction() } } db.inTransaction { delete("user", "name = ?", new String[] {"Michael"}) }
  • 26. Kotlin Android Extensions (Goodbye findViewById) <Button android:id="@+id/click_me_button" /> class KotlinActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { ... click_me_button.setOnClickListener {....} ... } }
  • 27. Kotlin Android Extensions (startActivity) val intent = Intent(this, javaClass<NewActivity>()) intent.putExtra("VALUE", 1) intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) startActivity(intent) startActivity(intentFor<NewActivity>("VALUE" to 1).singleTop()) startActivity<NewActivity>("VALUE" to 1)
  • 28. Anko verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } } }
  • 29. Write executable specifications @Test public void testCalculateTaxRate() { TaxRateCalc calculator = new TaxRateCalc(); Integer value = calculator.calculateRate(200, 10); assertEquals(300,value); }
  • 30. Write executable specifications class TaxCalculatorSpecs: Spek() { init { given("Tax rate calculator with default locale settings") { val taxRateCalc = TaxRateCalc () on("calculating the rate for an income of 200 and an average change of 10 per semester") { val value = taxRateCalculator.calculateRate(200, 10) it("should result in a value of 300") { assertEquals(300, value) } } } }}
  • 31. Library Jar Size Dex Size Method Count Field Count kotlin-runtime-0.10.195 354 KB 282 KB 1071 391 kotlin-stdlib-0.10.195 541 KB 835 KB 5508 458 Library Jar Size Dex Size Method Count Field Count scala-library-2.11.5 5.3 MB 4.9 MB 50801 5820 groovy-2.4.0-grooid 4.5 MB 4.5 MB 29636 8069 guava-18.0 2.2 MB 1.8 MB 14833 3343 Source: Using Project Kotlin for Android by Jake Wharton
  • 32. Library Jar Size Dex Size Method Count Field Count rxjava-1.0.4 678 KB 513 KB 3557 1668 support-v4-21.0.3 745 KB 688 KB 6721 1886 play-services-base-6.5.87 773 KB 994 KB 5212 2252 okio-1.2.0 54 KB 55 KB 508 76 okhttp-2.2.0 304 KB 279 KB 1957 882 retrofit-1.9.0 119 KB 93 KB 766 228 picasso-2.4.0 112 KB 97 KB 805 342 dagger-1.2.2 59 KB 54 KB 400 119 butterknife-6.0.0 48 KB 50 KB 307 73 wire-runtime-1.6.1 71 KB 71 KB 471 147 gson-2.3.1 206 KB 170 KB 1231 390 Total 2963 KB 2894 KB 21935 8063
  • 33.
  • 34. and
  • 35. I want much more https://kotlinlang.org/ (kotl.in) https://github.com/Kotlin/anko
  • 36. Thank you for your attention michal.szczepanik@blstream.com meet.mobile.@blstream.com