Kategorie: Programování

  • 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.

  • 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 ...")
        }
    
  • Zkrášlujeme legacy knihovny s Kotlinem

    V souvislosti s přepisem hry Sheeps Go Home do Kotlinu bych se chtěl podělit o to, jakým způsobem jsem si zkrášlil kód při práci s LibGDX tak, aby se to dalo používat trochu lidsky 🙂 . LibGDX je supr knihovna na vývoj (především) 2D her, ale co se jejích UI prvků týče, práce s nimi mi nepřišla úplně košér. Podívejme se např. na triviální klik na tlačítko. Původní kód v Javě vypadal např. takto:

            buttonLeaderboard.addListener(new ClickListener() {
                @Override
                public void clicked(InputEvent event, float x, float y) {
                    ((Game) Gdx.app.getApplicationListener()).setScreen(new LeaderboardScreen());
                }
            });
    

    Kde ClickListener není interface, ale třída. Sice nechápu proč, ale kvůli toho nemůžu použít ani klasickou lambdu. Jak bych si osobně představoval (a teď přejděme do Kotlinu), že by měl tento kód vypadat? Jako docela lidský způsob volání mi přijde např. tento:

            buttonLeaderboard.onClick {
                //code goes here ...
            }
    

    Můžu něčeho takového docílit? Samozřejmě, že můžu, stačí si TextButtonu trošku rozšířit:

            fun TextButton.onClick(action: () -> Unit) = addListener(object : ClickListener() {
                override fun clicked(event: InputEvent?, x: Float, y: Float) {
                    action()
                }
            })
    

    A nyní pro každé textové tlačítko, u kterého budu chtít definovat akci po kliku, bude tento úkol jako procházka růžovým sadem 🙂 .

  • Sheeps Go Home má (opět) nový žebříček

    Věřím, že už je to naposledy, co tohle předělávám 😀 . Tentokrát již Ovečky používají žebříček přímo od Google Games služeb, takže budete moct hrát za svou identitu na vícero zařízeních pod svým herním účtem u Googlu. Další mega změnou, kterou běžný uživatel nevidí a která mi po 2-3 letech dodala opět motivaci s tím nějak pohnout, je, že jsem kód přepsal 100% do Kotlinu a zrefaktoroval jsem ho takovou měrou, že se ho již nestydím publikovat jako openource na mém githubu 😀 , no ale hlavně, když je kód čistý, je nyní velice jednoduché dělat nové změny, takže krom žebříčku jsem již započal větev s multiplayerem (taky s pomocí Google služeb), neb je mým snem uspořádat v naší vsi alespoň 1 veřejný ovečkový turnaj 🙂 . Nezbývá mi než vás vyzvat, perte to tam! 🙂

  • Programovací vyhlídky pro rok 2017 pohledem Javisty

    Občas přemýšlím, co máme k dispozici nyní a co možná do budoucna teprve přijde. Zrovna mi pár myšlenek hlavou koluje, tak jsem se rozhodl je zapsat, než utečou zase pryč 🙂 .

    • Dynamicky typované jazyky: Zkušenost ukázala, že dynamické typy jsou dobré asi jen na jednu věc, a sice jedno-souborový max 50 (nebo možná ještě 100) řádkový skript. Jakmile byste chtěli psát něco většího, tak – co se typů týče – už zkrátka vůbec nevíte, která bije. Když jsem přepisoval IRC bránu z Pythonu do Kotlinu, byl jsem sám sobě vděčný, že jsem si skoro u každé metody psal do komentářů, jakého jsou její parametry typu, jinak bych to možná nepřepsal nikdy 😀 . Z toho mi plyne, že řešením nejsou statické typy samy o sobě, ale především jejich automatické odvozování překladačem!
    • Python vs. Kotlin:  Tuto otázku jsem si ostatně pokládal už před cca 6 lety, když jsem začal objevovat Scalu, ale tedy ještě jednou aktuálně: Má ještě nějaký význam psát něco v Pythonu, když máme něco jako Kotlin? Python je jen o něco malinko stručnější než Kotlin (anebo někdy tomu tak dokonce i neni) a Javovské VMko je přece rychlejší než to Pythoní. Posuďte sami … ale pro toho, kdo je Javovským ekosystémem takřka prosáklý, je, myslím si, volba jasná 🙂
    • Budoucnost jazyka Go: Co jsem slyšel, tak Go-čkaři si především pochvalují, že si můžou zkompilovat jeden docela malý bundle, který běží se vším všudy. Nicméně Oracle již pracuje na AOC překladači pro Javu, pomocí kterého bychom i v Javě měli docílit téhož. K čemu bude Go dobré pak? Pak by ještě mohla přijít řeč na Goroutines, jakožto velmi lightweight alternativu k threadům, ale tady bych odpověděl opět Kotlinem a to slovem „Coroutines“ 🙂

    Z toho, co mě napadá, to bude asi vše, ale co se obecně Javy týče, přijde mi, jakoby se vývoj tohoto jazyka vedl opožděně zcela záměrně, stylem: „Nejdříve omrkneme, jak s danou featurou uspějí jiné jazyky a když se to osvědčí, tak to naimplementujeme taky“. Takto Java sází více na jistotu, ale na druhou stranu vše přichází později. Nedivil bych se, kdyby Java za 5 – 10 let vypadala cca tak, jako Kotlin nyní, ale nevím … ten malý rebel uvnitř mě by byl i docela rád, kdyby indexem TIOBE zatřásla změna a objevil se nějaký nový trend, který by přepsal již po dekády zaběhlé stereotypy.

  • Kotlin vs. Python – srovnání na reálném projektu

    Jak jsem již psal dříve, rozhodl jsem se přepsat jeden náš společný projekt (ChatCzGate), který jsme psali s Imrijou v Pythonu, do Kotlinu. Rozhodl jsem se tak proto, abych jednak Kotlin prověřil trochu důsledněji než jen na jednoduché Spring Boot aplikaci, ale taky abych si ho i trochu lépe zažil. Konec konců, nejlépe se nový programovací jazyk naučíte právě tím, že si v něm rovnou něco netriviálního napíšete.

    Pro srovnáni jsem vybral tyto 2 soubory:

    Co se vám libí více? 🙂

    PS: Zdá se, že vše funguje, jak má a během celé implementace nenastal jediný NullPointerException 🙂 , takže za mě palec nahoru.

  • Krásy Kotlinu aneb střípky z přepisu IRC brány pro Chat.cz

    Abych Kotlin podrobil dostatečné zkoušce, nemohlo to samozřejmě zůstat jen u přepisu jednoduché Spring Boot aplikace. Rozhodl jsem se tedy, že dostatečným kandidátem by mohla být IRC brána ChatCzGate, kterou jsme s Imrijou napsali kdysi dávno v Pythonu. V tomto článku bych se chtěl podělit o pár postřehů, ale i nějaké to zamyšlení ohledně toho, co se v „Kotlinovském kruhu“ odehrává.