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.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.
Java on eliöpohjainen kieli, jossa luokkien, muuttujien ja metodien saatavuutta ilmaistaan pääasiassa kahdella eri tavalla:
private
, protected
, public
, yms.)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.
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.
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.
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.
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)
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ä | taulukossa | ei ole | mitään tolkkua |
---|---|---|---|
Voisi | luulla | etten ole | ikinä |
nähnyt | saati | tehnyt | taulukoita |
mutta | se ei ehkä | pidä | paikkaansa |
Kuten taulukostakin selvästi näkee, tulokset ovat selkeät ja yhdenmukaiset viimeisimpien tutkimusten kanssa.
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..
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.