Světýlkův blog

Hlášky, myšlenky, Kotlin a kiting ...
  • 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 ...")
        }
    
  • Život je spotřební zboží.

  • Slušná navigace je ta, která ti vyká.

  • Není důležité to naprogramovat tak, aby to něco dělalo, ale hlavně ať to nedělá, co nemá. –Pavel Š.

  • Tak nebo tak, je tam bug. –Daniel B.

  • Na velikosti nezáleží … ale na hashi ano.

  • Landkiting na travních lyžích z pohledu dronu

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

  • Chtěli mi nabídnout nějaký parfém. Ještě jsem žádný nepoužil, tak nevím … –Jakub K.

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