Testaaja

- Lehti joka devaajalle
Nro 0, Torstaina 1. tammikuuta 1970
Yhteystietoja tähän
Tervehdys, tämä on Testaaja, testausserverin oma lehti.
//esimerkkifunktio

funktio = (a,b) => {
    console.log("Tämä esimerkkitiedosto on vain ... ");
    return "dumpattu artikkelikansioon ..."
}

console.log(`
    ${funktio(1, 1)}
    ja se liitetään automaattisesti sivulle!
`);

Kuinka tehdään artikkeleita

  1. Forkkaa github repo https://github.com/Testausserveri/lehti
  2. Tee oma kansio artikkelillesi lehden kansioon paper/
  3. Kirjoita teksti markdown-dokumentteihin, yksi .md-tiedosto per sivu. Nimeä .md tiedostot numerojärjestyksessä, eli 1.md, 2.md, 3.md jne. Voit halutessasi käyttää jotakin markdown-editoria tekstinkäsittelyyn.
  4. Laita mukaan artikkelin kansioon liitteet ja kirjoita meta.json tiedostoon metadata.
  5. Katso lehden ulkoasu suorittamalla build.js (npm run build). Jos dependencyjä puuttuu niin asenna ne (npm install), ja jos nodejs puuttuu, asenna se. Skripti rakentaa lehden built.html tiedostoon, jonka voit avata selaimellasi.
  6. Kun artikkeli on valmis, tee pull request.
- Tekijä1, Tekijä2

Tyyliohjeita

Kirjoita asiallista suomen kieltä. Kielioppi tarkistetaan ja korjataan ennen julkaisua.

Artikkeliin voit liittää kuvia ja tekstitiedostoja laittamalla ne artikkelin kansioon. Pidä liitetyt kuvat mahdollisimman pieninä. Ne pakataan suoraan mukaan HTML-tiedostoon, ja jokainen kuva lisää tämän tiedoston kokoa huomattavasti.

Lehden maksimikoko on teknisistä syistä 8 Mt, ja julkaisuvalmiista lehdestä voidaan karsia osia jos raja ylittyy. Thumbnail-tiedosto on tarpeellinen jos haluat artikkelisi etusivulle.

Jos kirjoittaessa tulee ongelmia, kysäise toki. Lehden kehitysalusta ei ole missään nimessä vielä valmis, ja lisäysehdotukset ovat tervetulleita.

Tällä sivulla on esimerkiksi laitettu muutamia liitteitä. Lehden taittamisesta vastaava algoritimi asettelee ne tasaisesti sivuille.

"meta.json"-tiedosto sisältää artikkelin tiedot, ja se on pakollinen joka artikkelissa.

Artikkelin sivut jaetaan markdown-tiedostoihin 1.md, 2.md, 3.md... jne. Yksi tiedosto vastaa tarkalleen yhtä sivua.

Jos kehitysalustassa jokin ei miellytä, tai jotakin ominaisuutta on jäänyt kaipaamaan, ilmoita toki discordissa.

- Tekijä1, Tekijä2

Java-hakkerointi

Java on eliöpohjainen kieli, jossa luokkien, muuttujien ja metodien saatavuutta ilmaistaan pääasiassa kahdella eri tavalla:

  • Saatavuusdeklaraatiot (private, protected, public, yms.)
  • Moduulit (module-info.java)

Mutta entäs jos joku datanomi on tehnyt muuttujasta tai metodista yksityisen, ja meidän nerokas ohjelmistomme tarvitsee käyttöoikeuksia siihen?

Tarvitsemme jonkun tavan käyttää Javassa yksityiseksi merkittyjä muuttujia ilman lupaa. Onneksi Javan kehittäjät ovat antaneet meille työkalun, jolla voimme päästä käsiksi yksityiseksi merkittyihin luokkiin ja luokkien jäseniin: Reflektion.

Java-reflektion ihmeellinen maailma

Kuvittele, että joku huono ikävä ihminen on kirjoittanut luokan A:

public class A {
    private static int treasure = 69420;
}

Haluaisimme saada A-luokan treasure-muuttujan arvon, mutta se on merkitty yksityiseksi! Mitäs nyt? Käytämme reflektiota:

import java.lang.reflect.Field;

public class B {
    public static void main(String[] args) {
        // stupid A
        try {
            Field treasureField = A.class.getDeclaredField("treasure");
            treasureField.trySetAccessible();

            // hehe we get treasure ! :)
            System.out.println(
                treasureField.get(null)
            );
        } catch (Exception ex) {
            System.err.println("Voi ei!");
            ex.printStackTrace();
        }
    }
}

B-luokka saa reflektion avulla A-luokan treasure-muuttujan arvon, vaikka se on merkitty yksityiseksi.

Project Jigsaw

Javan versiossa 9 lisättiin Jigsaw-projektin myötä moduulit, jotka antoivat ohjelmiston kehittäjille mahdollisuuden määrittää, kuka pystyy käyttämään tiettyä osaa ohjelmistosta. Ikävä kyllä Javan sisäinen koodi käyttää näitä moduuleja estääkseen tuntematonta koodia käyttämästä reflektion avulla Javan omien luokkien yksityisiä jäseniä.

Kokeillaan samaa reflektio-metodia, mutta yritetään B-luokan sijasta suorittaa Unsafe.getUnsafe() -metodi:

import java.lang.reflect.Method;

public class B {
    public static void main(String[] args) {
        try {
            Class<?> unsafeClass = Class.forName("jdk.internal.misc.Unsafe");
            Method getUnsafeMethod = unsafeClass.getDeclaredMethod("getUnsafe");
            getUnsafeMethod.trySetAccessible();

            Object unsafe = getUnsafeMethod.invoke(null);
            System.out.println("Jippii, se toimi! " + unsafe);
        } catch (Exception ex) {
            System.err.println("Voi ei!");
            ex.printStackTrace();
        }
    }
}

Kun yritämme suorittaa B-ohjelman, saamme Javalta seuraavan virheen:

Voi ei!
java.lang.IllegalAccessException: class B cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @3fee733d
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
        at java.base/java.lang.reflect.Method.invoke(Method.java:560)
        at B.main(B.java:10)

Ikävä kyllä java.base -moduuli estää meitä käyttämästä jdk.internal.misc -pakettia. Kuitenkin kaikkeen on keinonsa, ja lievällä hakkeroinnilla saamme kyllä Javan sisäisenkin koodin taipumaan tahtoomme.

Monet Javan käyttäjät kokivat moduulien lisäämät rajoitukset ikäviksi. Rajoitusten ohi pääsemiseen on luotu kirjastoja, kuten esimerkiksi Overlord.

- Ilari

Overlord, destroyer of Encapsulation

Overlord-kirjastolla voimme rikkoa Jigsawin luoman enkapsulaation kokonaan, ja saada oikeudet käyttää reflektiota metodin suorittamiseen.

Käytetään tismalleen samaa koodia kuin äsken, mutta lisätään Overlordin breakEncapsulation ja allowAccess -metodit:

import java.lang.reflect.Method;
import mx.kenzie.overlord.Overlord;

public class B {
    public static void main(String[] args) {
        try {
            Class<?> unsafeClass = Class.forName("jdk.internal.misc.Unsafe");

            Overlord.breakEncapsulation(B.class, unsafeClass, true);
            Overlord.allowAccess(B.class, unsafeClass, true);

            Method getUnsafeMethod = unsafeClass.getDeclaredMethod("getUnsafe");
            getUnsafeMethod.trySetAccessible();

            Object unsafe = getUnsafeMethod.invoke(null);
            System.out.println("Jippii, se toimi! " + unsafe);
        } catch (Exception ex) {
            System.err.println("Voi ei!");
            ex.printStackTrace();
        }
    }
}

Saamme seuraavan tuloksen:

Jippii, se toimi! jdk.internal.misc.Unsafe@37a71e93

Overlordin avulla voimme siis rikkoa moduulien luoman enkapsulaatiojärjestelmän, joka mahdollistaa reflektion kautta Javan yksityisten luokkajäsenien käytön.

- Ilari

Ensimmäinen testiartikkeli

Tämä ensimmäinen testausartikkeli testaa ohjeiden luettavuutta. Ohjeet ovat - varsin ymmärrettävästi - vielä jokseenkin sekavat. Ensimmäinen askel, forkkaa repo, on täysin selkeä ja onnistui ongelmitta. Jo heti seuraava pykälä, luo kansio, osoittautui monimerkitykselliseksi. Lyhyen debatin jälkeen selvisi kansion toivottu sijainti, eli oma hengentuote laitetaan kansioon "paper"-kansion sisällä. Nyt päästään nykyhetkeen ja artikkelin kirjoittamiseen. Kirjoittaminen onkin aika tylsää ja tikusta on vaikea vääntää. Seuraava kappale on lorem ipsumia. (66 sanaa, n 500 merkkiä)

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Commodo sed egestas egestas fringilla phasellus faucibus scelerisque. Enim sit amet venenatis urna cursus eget nunc scelerisque viverra. Sit amet facilisis magna etiam tempor orci. Consectetur libero id faucibus nisl tincidunt eget nullam. Lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Consequat interdum varius sit amet mattis vulputate enim. Felis eget nunc lobortis mattis aliquam. Volutpat diam ut venenatis tellus in metus vulputate eu. Ultrices gravida dictum fusce ut. (88 sanaa, yht 150)

Samalla tämä on pikakurssi Githubin käyttöön. Ensimmäinen forkki, ensimmäinen PR.. Ja nännä nähdä mitä nodejs mahtaa käytännössä tarkottaa. Sentään markdown on mukavaa kirjoitella. Täytyy etsiä muutama kiva kuva, tylsää pelkkä teksti. Tämä oli mielenkiintoista, jatkuu myöhemmin. (200 sanaa)

- Alice

Tämä toinen sivu on lyhyt ja ehkä kuvat sijoittuu tänne, mutta teen myös hankalan suuren taulukon. Katsotaan kuinka sille mahtaa käydä palstoittajan hampaissa.

Tässätaulukossaei olemitään tolkkua
Voisiluullaetten oleikinä
nähnytsaatitehnyttaulukoita
muttase ei ehkäpidäpaikkaansa

Kuten taulukostakin selvästi näkee, tulokset ovat selkeät ja yhdenmukaiset viimeisimpien tutkimusten kanssa.

- Alice

Laitetaan kolmannelle sivulle väliotsikko hassusti muutaman rivin jälkeen, ja sitten iso pätkö koodia. Kun koodiahan te tänne kuitenkin laitatte... niin paljon koodia kaikkialla..

Väliotsikko

Tämä uusi kappale sisältää jonkun jännän koodin jonka käyn kaivamassa tuolta varastoista, pieni hetki.

luku=int(input("Anna kokonaisluku väliltä 1-10: "))
if luku > 5:
	print("Luku on suurempi kuin 5.")
elif luku < 5:
	print("Luku on pienempi kuin 5.")
else:
	print("Luku on 5.")
  

Ja näin tiedämme onko meillä luku 5.

- Alice
[1 / -]