Digitalisaatio - hyvät ja huonot puolet

Liittynyt
02.08.2022
Viestejä
188
Legacy-koodit eivät tiedä tällaisesta mitään vaan ne on kirjoitettu oletuksella 1 tavu = 1 merkki. On vähän vaikeaa arvioida miten paljon tämän oletuksen särkyminen rikkoo koodia. Eihän esim. alimerkkijonoihin pääse enää käsiksi suoraan indeksoimalla (esim. tekstirivillä 5 saraketta vakiopaikoissa ja halutaan poimia 4. sarakkeessa oleva numero ja konvertoida se liukuluvuksi). Hyvin tavallinen tehtävä, kun luetaan tekstitiedostosta dataa sisään. Toki voi pitäytyä ASCII-merkistössä mutta entäs kun 2. sarakkeessa lukeekin "Hyvinkää"?

Ihanko varmasti, jos käytetään jotain binääriä (esim. vanha kirjasto), jossa nämä kutsut on inline-optimoitu suoraan assembleriksi? Enää näin ei voi tehdä, jolloin suorituskyky kärsii.

Ehkä toimii, jos todella kutsutaan jotain funktiota mutta monet merkkijonofunktiot on tehty inline-assemblerina. Ei taida toimia, jos on koodattu jokin toiminnallisuus itse käsin.
Legacy-ohjelma, joka ei tiedä UTF-8'sta mitään, näkee nuo enkoodatut pätkät tilanvarauksensa mukaisina hivenen pitempinä pätkinä. Pääsääntöisesti tuo ei haittaa mitään. Esimerkiksi tuota tekstitiedostoa (vaikka CSV) parsiessa etsit jonkinlaisia column-markereita, joilla jaat tekstin sarakkeiksi. Nuo löytyvät ihan samalla tavalla kuin ennenkin. Se "hyvinkää" parsiutuu sieltä ihan oikein. strlen() palauttaa sille oikean tilanvarauksen mukaisen arvon, jolla voi tarvittaessa varata oikean määrän muistia. Ja vaikka strncpy kopioi sen varattuun bufferiin oikein, vaikka sovellus ei ole ikinä unicodesta kuullutkaan. Ja ei haittaa, vaikka kaikki nuo olisi inlinetetty binääriin, se strlen on edelleen ihan sama toteutus.

Sitten jos sulla on vaikka legacy tekstieditori, niin toki sillä saa generoitua rikkinäisiä utf-8 payloadeja: menet vaikka lisäämään välilyönnin keskelle tuollaista enkoodattua blobia. Mutta niiden esimerkiksi deletoiminen tai copy-paste toimii ihan oikein. Tällainen käyttötapaus sopii hyvin tilanteeseen, jossa tiedoston payload on pääasiassa ASCII, mutta voi sisältää pieniä määriä muita merkkejä.
 
Liittynyt
02.08.2022
Viestejä
188
Unicode on tarpeellinen tapauksissa, joissa saman dokumentin on pystyttävä näyttämään eri kirjoitusjärjestelmien merkkejä, siis esimerkiksi sekä koodisivulta IBM850 että japanilaisten kirjoitusjärjestelmästä löytyviä merkkejä.
Hyöty unicodesta tulee jo ihan siitä, että jokaisen tiedoston mukana ei tarvitse erikseen olla jossain toisaalla metatietona, millä koodisivulla se on kirjoitettu. Ääkköset ja muutkin yli 128'n olevat merkit menevät heti pieleen, jos tietoa siirtäessä lähettäjä ja vastaanottaja käyttävät eri koodisivua. UTF-8 pystyy esittämään kerralla kaikki unicode-speksin määrittelemät merkit, ei pelkkää 256-merkin subsettia. No, meille Suomessa on tuttua jo kymmenien vuosien takaa, että ääkköset voivat mennä pieleen, mutta käytännössä nämä paikat ovat koko ajan vähentyneet. Ja tässä unicode on ratkaisu, ei ongelma. Ongelma ovat nuo toisistaan irralliset 8-bittiset merkistöt.

Ja näinä päivinä tietty ihan mikä teksti vaan voi sisältää vaikka hymiöitä.
 
Liittynyt
16.10.2016
Viestejä
17 077
Hyöty unicodesta tulee jo ihan siitä, että jokaisen tiedoston mukana ei tarvitse erikseen olla jossain toisaalla metatietona, millä koodisivulla se on kirjoitettu. Ääkköset ja muutkin yli 128'n olevat merkit menevät heti pieleen, jos tietoa siirtäessä lähettäjä ja vastaanottaja käyttävät eri koodisivua. UTF-8 pystyy esittämään kerralla kaikki unicode-speksin määrittelemät merkit, ei pelkkää 256-merkin subsettia. No, meille Suomessa on tuttua jo kymmenien vuosien takaa, että ääkköset voivat mennä pieleen, mutta käytännössä nämä paikat ovat koko ajan vähentyneet. Ja tässä unicode on ratkaisu, ei ongelma. Ongelma ovat nuo toisistaan irralliset 8-bittiset merkistöt.

Ja näinä päivinä tietty ihan mikä teksti vaan voi sisältää vaikka hymiöitä.
Puhumattakaan siitä, että noin 2/3 maailmasta käyttää jotain muita aakkosia kuin latinalaisia.
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
15 366
Hämmentävää lukea, että joku haikailee suppeita merkistöjä, jotka eivät siis kykene kattamaan edes kaikkia länsieurooppalaisten kielien tarvitsemia merkkejä, puhumattakaan muusta maailmasta. Se, että ohjelmoija on paska eikä kykene toimimaan UTF-8:n kanssa ja on saanut oppinsa 80-luvulla ei ole mikään peruste luopua siitä ja palata johonkin puutteellisen Latin-1:een. Devaaja on hyvä ja siirtyy 2000-luvulle. UTF-8-enkoodaus on todella toimiva ratkaisu, eikä ihme että se on saavuttanut laajan tuen.

Mutta miten ihmeessä tämä nyt sitten liittyy digitalisaatioon? En tiedä. Taas jotain ihme vänkäämistä uusista ja vanhoista protokollista, mikä varmaan kuuluisi jonnekin muualle. EDIT: No ehkä niin, että merkistöongelmat olivat ihan oikea ja paha ongelma digitalisaation alkuvaiheessa: nimet olivat väärin, vieraskieliset sanat oli väärin, piti muuttaa kirjaimia vääriksi ja sen jälkeen samalla sanalla olikin useita kirjoitusasuja ja haku ei toiminut oikein, sama sana näkyi eri tavalla eri käyttäjille jne. UTF-8 ja tietenkin Unicode ovat tuoneet tähän todella hyvän ja toimivan ratkaisun. EI nyt jumalauta kukaan tervejärkinen voi kaivata jotain vanhoja merkistöjä :facepalm:
 
Viimeksi muokattu:
Liittynyt
16.10.2016
Viestejä
17 077
Legacy-koodit eivät tiedä tällaisesta mitään vaan ne on kirjoitettu oletuksella 1 tavu = 1 merkki. On vähän vaikeaa arvioida miten paljon tämän oletuksen särkyminen rikkoo koodia. Eihän esim. alimerkkijonoihin pääse enää käsiksi suoraan indeksoimalla (esim. tekstirivillä 5 saraketta vakiopaikoissa ja halutaan poimia 4. sarakkeessa oleva numero ja konvertoida se liukuluvuksi). Hyvin tavallinen tehtävä, kun luetaan tekstitiedostosta dataa sisään. Toki voi pitäytyä ASCII-merkistössä mutta entäs kun 2. sarakkeessa lukeekin "Hyvinkää"?
Tai jos siinä lukeekin 北京 tai 東京都. Puhumattakaan جِدَّة‎ tai תל אביב. Sitten on toki myös Αθήνα ja Hà Nội.
Suht nopeasti huomataan, että tuollaisia yksinkertaistuksia sisältävät legacy-koodit kuuluvat sinne roskakoriin kaksinumeroisten vuosilukujen ja 32 bittisten aikaleimojen kanssa.
 
Viimeksi muokattu:
Liittynyt
08.12.2017
Viestejä
1 546
Eleganttius ottaa merkittävää osumaa, jos/kun olemassaolevaa koodia menee rikki.

Legacy-koodit eivät tiedä tällaisesta mitään vaan ne on kirjoitettu oletuksella 1 tavu = 1 merkki. On vähän vaikeaa arvioida miten paljon tämän oletuksen särkyminen rikkoo koodia. Eihän esim. alimerkkijonoihin pääse enää käsiksi suoraan indeksoimalla (esim. tekstirivillä 5 saraketta vakiopaikoissa ja halutaan poimia 4. sarakkeessa oleva numero ja konvertoida se liukuluvuksi). Hyvin tavallinen tehtävä, kun luetaan tekstitiedostosta dataa sisään. Toki voi pitäytyä ASCII-merkistössä mutta entäs kun 2. sarakkeessa lukeekin "Hyvinkää"?

Ihanko varmasti, jos käytetään jotain binääriä (esim. vanha kirjasto), jossa nämä kutsut on inline-optimoitu suoraan assembleriksi? Enää näin ei voi tehdä, jolloin suorituskyky kärsii.

Ehkä toimii, jos todella kutsutaan jotain funktiota mutta monet merkkijonofunktiot on tehty inline-assemblerina. Ei taida toimia, jos on koodattu jokin toiminnallisuus itse käsin.
Vanhaa koodia menee jatkuvasti rikki, kun vaatimukset muuttuvat. Esim. merkistöistä jos luet lisää, huomaat että se "vanha" ei ollut 8 bittiä vaan ASCII oli 7 bittiä ja kahdeksas saattoi olla esimerkiksi virheenkorjaukseen pariteetti. 8-bittiset merkistöt kyllä rikkoivat yhteensopivuutta myös jos oletus oli että merkit ovat 7-bittisiä ja esim. kirjaimet ovat väleillä a-z ja A-Z. Ääkköset kun eivät kuulu noihin väleihin. 128 merkkiin on aika paha sovittaa montaakaan kieltä, kun mukana on ohjausmerkkejäkin.

Oikeastaan toit aika hyvin esille parikin virhekäsitystä - C-tyylinen tapa koodata merkkijonot 0-loppuisiksi ilman pituustietoa on tehoton ja tietoturvaongelmille altis paskakoodaus. Samoin tekstin käsittely inline assyllä. Tietoturvasyistä tällainen pitäisi lopettaa kuten myös näitä tekevät koodarit. Toinen pointti on että kovinkaan usein tekstiin ei sovelleta merkkikohtaisella indeksoinnilla hajasaantia vaan teksti käydään läpi kokonaisuutena tai jollain muulla tavalla (esim. rivinvaihdot), jotka kuitenkin vaativat läpikäyntiä. Vaihtelevanpituiset merkit tuovat miinuspuolia, mutta myös etuja. Merkkijonoja kannattaisi C-tyylin sijaan käsitellä aina pituustiedolla, koska vaikka siinä on hieman enemmän kirjanpitoa, strlen-tyylinen nopeutuu O(n)-ajallisesta O(1)-aikaiseksi ja monet oikeasti raskaat operaatiot voi optimoida menemään vektoreilla tai muuten kevyemmällä muistikuormalla, kun ei tarvitse lukea jonoa haarautumisen päättämiseksi.

Digitalisaation kannalta on hyvä jos merkistöt ovat monikäyttöisiä. Se että joku MUMPSin 1960-luvun 8-bittinen paskakoodi toimii vielä 2230 ilman tarvetta muokata jotain 8-bittistä assyä on enemmän joku (kaulaparta)koodarien eroottinen fantasia.
 
Toggle Sidebar

Statistiikka

Viestiketjut
252 461
Viestejä
4 392 567
Jäsenet
72 994
Uusin jäsen
luukass

Hinta.fi

Ylös Bottom