Kategorie: Zájmy

  • Bilance snowkitingové sezóny 2017/2018

    Svou druhou snowkite sezónu mám za sebou a tentokrát jsem si stanovil za cíl precizně trackovat, kolikrát se nám za celou zimu podařilo vyrazit za větrem, a kolik km jsem na lyžích celkově najel. Výsledky se mi zdají celkem fajn:

    Počet výjezdů: 11

    Celkově najeto: 137 km

    Cílem pro příští zimu budiž vyrazit alespoň 12x a najet alespoň 150km 🙂 .

  • Lateinit v Kotlinu a jeho výhoda oproti NullPointerException

    Kotlin občas na úrovni byte kódu generuje různý boilerplate, např. v podobě checků inicializace lateinit proměnných, a až donedávna mi unikala jednoduchá, avšak svým významem docela důležitá věc. Říkal jsem si, že pokud aplikace padne na NullPointerException v Javě, anebo na UninitializedPropertyAccessException v Kotlinu, tak že je to v důsledku totéž. Nicméně je zde jeden případ, kdy lateinit jednoznačně vede. Mějme tento kód v Javě:

    package com.svetylkovo.kotlin.lateinit;
    
    public class WithoutLateinit {
        private static String first;
        private static String second;
    
        public static void main(String[] args) {
            first = "First!";
            System.out.println("Total length is "+ String.valueOf(first.length() + second.length()));
        }
    }
    

    Pokud tento kód spustíme, dostaneme:

    Exception in thread "main" java.lang.NullPointerException
    at com.svetylkovo.kotlin.lateinit.WithoutLateinit.main(WithoutLateinit.java:9)

    Po nalezení řádku kódu, kde NullPointerException nastal, si můžeme jen lámat hlavu, která z těch dvou proměnných vlastně null byla a často (v reálných aplikacích) na to musíme ne-zcela triviálním způsobem přijít. Zkusme si stejnou situaci nasimulovat v Kotlinu s pomocí lateinit:

    package com.svetylkovo.kotlin.lateinit
    
    object LateinitTest {
        lateinit var first: String
        lateinit var second: String
    
        @JvmStatic
        fun main(args: Array<String>) {
            first = "First!"
            println("Total length is ${first.length + second.length}")
        }
    }
    

    Když spustíme tento kód, aplikace padne na:

    Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property second has not been initialized
    at com.svetylkovo.kotlin.lateinit.LateinitTest.main(LateinitTest.kt:10)

    kde stacktrace mluví za vše a místo toho, abych teprve začal hledat, co se vlastně stalo špatně, okamžitě vím, že to byla proměnná second, kterou jsem z nějakého (v tomto případě záměrného) důvodu zapomněl inicializovat.

    Posuďte sami, krom toho, že nás Kotlin dokáže NullPointerException zbavit již za překladu téměř úplně, nebylo by lepší v případech, kdy už by tato výjimka musela nastat, dostávat raději UninitializedPropertyAccessException s přesným popisem viníka, který za to může? 🙂

  • TaskMan: Úkoly s důrazem na priority

    Nedávno jsem na svém githubu založil nový projekt s názvem TaskMan, na kterém budu moct důkladněji prověřit kombinaci Kotlin JS + React a který mi zároveň pomůže v mé práci vnést více světla především do priorit mých úkolů pro daný den. Neboť (někteří) možná víte, jak to chodí … Když člověka úkolují hned 3 manažeři, ne vždy musí mít stejný názor na to, co je aktuálně to nejdůležitější a ne vždy vzájemně ví, co mi zrovna zadal ten druhý (resp. třetí). Proto přichází na scénu tato šikovná webová aplikace, která jim jednak umožní se přímo po připojení na můj PC podívat, co mám zrovna v plánu, ale taky mi mé priority změnit v případě, že jsem se do jejich gusta zrovna netrefil 🙂 .

    Během vývoje jsem si osvojil fajn nové triky, jak si napsat wrapper na NPM balíčky, které nemaji default export, ale taky jak na zcela custom JS knihovny, které vůbec svůj balíček v NPM systému nemají. A jak že to vypadá? No prostě Boooootstrapově:

    A nezapomeňte … ten, kdo úkoly uspává, uvidí kočičku! 😉

  • Sekvenční grupování v Kotlinu

    Nevím, jestli oficiálně něco takového již existuje, ale alespoň já jsem tento druh problému takhle nazval 🙂 . Opět jsem nedávno narazil na problém lehce bizarního parsování dat. Řekněme, že máte list řetězců, který je ve formátu “název skupiny”, pak následuje libovolný počet prvků, pak další název skupiny atd … a chcete tento list grupovat právě podle těchto skupin, kde zároveň jediné, co znáte předem, jsou jména těchto skupin, která jsou pevně daná s tím, že některé se v listu vyskytovat můžou, anebo nemusí. Pojďme si trochu potrápit hlavy a za předpokladu, že tento list není příliš velký, zkusme daný problém vyřešit s pomocí ne-až-tolik-známých operátorů, jako jsou dropWile(), drop() a takeWhile():

            val input = listOf(
                    "Group1",
                    "1",
                    "2",
                    "3",
                    "Group2",
                    "4",
                    "5",
                    "6",
                    "7",
                    "Group3",
                    "8",
                    "9"
            )
    
            val knownGroupNames = listOf("Group1", "Group2", "Group3")
    
            val groupsMap = knownGroupNames.map { groupName ->
                val groupItems = input.dropWhile { it != groupName }
                        .drop(1)
                        .takeWhile { it !in knownGroupNames }
    
                Pair(groupName, groupItems)
            }
            .toMap()
    
            groupsMap.forEach { group, items -> println("$group contains: ${items.joinToString(", ")}") }
    

    Výstupem je:
    Group1 contains: 1, 2, 3
    Group2 contains: 4, 5, 6, 7
    Group3 contains: 8, 9

    Tak co, rozlouskli jste to? 🙂

  • Ochutnávka Kotlin JS s create-react-kotlin-app

    Ještě před pár měsíci jsem byl názoru, že Node JS a celý jeho javascriptí ekosystém je svět sám pro sebe a že jakýkoliv pokus ho převzít ze strany jazyků, které vznikaly původně na JVMku, je jen marným počínáním. To by zřejmě byla pravda, pokud bych uvážil např. samostatný Kotlin JS vs. React, kde by React sám o sobě zvítězil na plné čáře. Avšak věci se pomalu začínají měnit od chvíle, kdy byly napsány Kotlin wrappery pro React, včetně “sesterského” generátoru projektů založených na webpacku s názvem create-react-kotlin-app, které nám nyní umožní… hádejte co? 🙂

  • Parsování XML pomocí XPath v Kotlinu

    Tento článek má především sloužit jako pomůcka mému budoucímu já, až opět někdy za rok budu potřebovat parsovat XML, na které se bude XPath hodit, ať se příliš dlouho netrápím, jak že se to vlastně používá a jak na vnořené parsování již nalezených nodů.

  • Praktický test Coroutines v Kotlinu

    Kdo dění kolem Kotlinu alespoň trochu sleduje, určitě již narazil na pojem “coroutines”. Už jsem se na ně chystal nějakou dobu a nyní konečně nastal okamžik, kdy jsem si našel čas si je na vlastní kůži vyzkoušet a opět prozkoumat, jak moc jsou vlastně coroutines použitelné v praxi.

  • Navštívil jsem mistrovství ČR v landkitingu v Panenském Týnci

    Uplynul nám další rok a opět nastal čas pro setkání české kitingové komunity na mistrovství ČR. Já, jakožto absolutní necestovatel, jsem se rozhodl, že podniknu doposud nejdelší vlastnoručně odřízenou cestu svého života, která se nakonec natáhla tak, že kdybych si byť jen malinko dokázal představit, jak neuvěřitelně daleko to je, tak bych tam nejel 😀 . Počasí nám vyloženě nepřálo a tak jediný závod, který se odjel, byl závod longboardů, ale bylo fajn, že jsem některé lidi poznal osobně, vyzkoušel si vůbec poprvé uzavřené komory od Aeros a ještě mě navíc naučili fintu, jak rozmotat kita pouhým přehozením baru, když se protočí směrem ke mně/ode mně. Na mobil jsem natočil pár záběrů z čehož vzniklo toto vzpomínkové video:

  • Krásy Kotlinu: Vícero null-checků jedním šmahem

    Tato podpora (pokud vím) přímo v Kotlinu zatím není, ale nedávno mě napadlo, že bychom si mohli definovat takovouto funkci:

        fun notNull(vararg args: Any?, action: () -> Unit) {
            when {
                args.filterNotNull().size == args.size -> action()
            }
        }
    

    což nám tuto funkcionalitu umožní. Je to bezpečné však jen pro lokální proměnne/konstanty a pak ještě pro konstantní property třídy. Pokud je však řeč o proměnných propertách ve třídě, zde již žádný warning, že mohou být za běhu např. jiným vláknem změněny, nedostaneme. Nicméně výše definovaná funkce se dá použít např. takto:

        val a = 1
        val b = "something"
        var c: Float? = 2f
    
        notNull(a, b, c) {
            println("Almost safe!")
        }
    
        c = null
    
        notNull(a, b, c) {
            println("Doesn't print ...")
        }
    
  • Landkiting na travních lyžích z pohledu dronu

    Celkově pojezdy nic moc, ale video naprostá špica 🙂 . Příjemné zakončení dovolené …