Kirjautuminen

Haku

Tehtävät

Kilpailu

Algoritmikisa
Putka Open 2020 -kisan
2. kierros: 25.–27.9.

Keskustelu: Yleinen keskustelu: Version history Muistiinpano sovellukseen

Sivu 1 / 1

Sivun loppuun

E1ss [25.12.2019 21:41:04]

#

Olen tekemässä itselle hyvin yksinkertaista muistiinpano sovellusta ja haluaisin implementoida siihen tiedon koska mitäkin muistiinpanoa viimeksi muutettiin. Vaikka otsikossa sanon version history en kuitenkaan todennäköisesti halua pitää tallessa tietoa vanhan version tilasta että voisi git tyyppisesti palauttaa vaan haluan pelkästään tiedon muutoshetkestä. (Mutta en kuitenkaan sulje pois palautus mahdollisuutta jos se on kohtalaisen helppo tehdä)

Tällä hetkellä ajattelin että pistäisin vain kansioihin tiedoston nimeltä <tiedoston-nimi>.<joku oma tyyppi> josta ohjelm helposti tietäisi että täällä tiedostossa on <tiedoston-nimi> tiedoston muutos tieto. Yksinkertaisimmillaan aina kun jotain dokumenttia muutetaan sen muutos tietoihin päivitettään kyseinen päivämäärä. Tämä ei kuitenkaan mielestäni ole kaikkein paras ratkaisu koska ensinnäkin siitä näkee että tiedosto on muutettu x päivänä mutta ei pystytä sanomaan mitä on muutettu tarkemmalla tasolla ja lisäksi tarvitsisin koko historian en vain viimeisintä. Näin olisi mahdollista käyttää filtteriä nähdäkseen viimeisen viikon aikana tehdyt muutokset. Ajattelin että voisin periaattessa kehittää jonkun systeemin jolla pystyn sanomaan että mitä lausetta on muutettu ja mitä on tullut lisää git tyyppisesti mutta en ole kuitenkaan varma miten tälläisen systeemin saisi kätevästi kehitettyä.

Eli ideaalli tilanteessa käyttäisin gittiä mutta en ole varma kuinka helppo frontendistä on päästä sen tietoihin esim mitä muutettu ja koska. Uskon myös että gitissä on ihan liikaa ominaisuuksia jotka vain monimutkistavat tätä ongelman ratkaisua. Periaattessa tarkoituksenani olisi kehittää tavallaan kevyt git joka pitää siis kirjaa mitä on muutettu ja koska. Pystyisin sitten frontisa näyttämään tämän tiedon esim maalaamalla tekstin jota on muutettu vaikka viimeisen viikon aikana ja sitten jotain nappia painamalla pystyisin näkemään tarkemmin ajankohdan jolloin sitä muutettiin.

Mitään ajatuksia tästä? Onko jotain parempia keinoja kuin kehittää itse joku yksinkertainen systeemi? Millainen tämän itse kehitetyn systeemin pitäisi olla? Pystyisinkö jopa käyttämään gittiä?

The Alchemist [25.12.2019 23:29:16]

#

Kysymyksesi että voitko käyttää Gittiä on vähän tyhmä, koska tiedät kyllä mikä Git on ja miten sitä käytetään. Juurikin tekstitiedostojen muutosten säilömiseen... Siinä olet sen sijaan ihan oikeassa, että jonkin muistiinpanosovelluksen riippuvuutena Git on aikamoinen overkill. (Arch Linuxilla git-paketti on 40 Mt plus Gitin omat riippuvuudet.)

Komennolla diff voi verrata kahta tekstitiedostoa ja ottaa muutetut kohdat talteen. Vastaavasti komennolla patch voit "asentaa" diffin muutokset toiseen tekstitiedostoon.

walkout_ [25.12.2019 23:54:23]

#

Subversioniin voi tehdä xml-tiedostotietokannan joka on versionhallittu. En itse tiedä miten tällainen tehdään mutta olen käyttänyt sovellusta missä tällainen xml-tiedostotietokanta on olemassa.

Metabolix [26.12.2019 03:57:32]

#

Jos on tarkoitus tehdä muiden käyttöön julkaistava sovellus, voi olla hyödyllistä tehdä itse versionhallintasysteemi (koska Git on suuri). Yleensä järkevää olisi käyttää lokitietoihin jonkinlaista tietokantaa. Jos haluaa myös varsinaiset versiot muistiin, voi tallentaa tiedostoista joko kopiot tai jonkinlaiset diffit. Irtotiedostoilla ja omilla tiedostopäätteillä kikkailu voi tuntua hyvältä idealta, mutta se johtaa helposti sotkuun ja sekaannukseen.

Jos nämä muistiinpanot ovat lyhyitä ja muutoksia tulee verrattain vähän (esimerkiksi yhteensä vain pari muutosta päivässä), aivan realistinen vaihtoehto on myös se, että muistiinpanot olisivat kaikki yhdessä tekstitiedostossa lokimuodossa: Tiedostoon pääsääntöisesti vain lisättäisiin tietoa, ei koskaan poistettaisi. Samalla id:llä olevista tiedoista näkyisi ohjelmassa vain viimeisin, mutta tarvittaessa voisi ottaa näkyviin myös aikaisemmat versiot. Tiedon voisi tallentaa esimerkiksi JSON-muodossa, yksi tieto (versio) per rivi. Jos tiedosto kasvaa liikaa, vanhat versiot voisi helposti poistaa välistä.

{"id": 1, "data": "Soita Petterille!", "comment": "Lisätty tieto"}
{"id": 2, "data": "Soita Liisalle!", "comment": "Lisätty tieto"}
{"id": 1, "data": "Soita Petterille heti!", "comment": "Lisätty kiireellisyys"}
{"id": 2, "data": "Lähetä Liisalle sähköpostia!", "comment": "Vaihdettu kanavaa"}

Jos on tarkoitus hallita vain omia tekstitiedostoja, kyllä silloin esimerkiksi Git on aivan hyvä ratkaisu. Ei tarvitse keksiä pyörää uudestaan. Gitissä säilyvät kätevästi sekä versiot että muutosviestit. Kaikkia ominaisuuksia ei tarvitse käyttää, vaan yllä esitettyihin toiveisiin riittävät yksinkertaiset peruskomennot commit ja log.

E1ss [26.12.2019 07:19:21]

#

Kiitos vastauksista. Eli selitin vähän huonosti mutta tarkoituksena on vain itse käyttää sitä ja ehkä joku kaveri. Se on siis nettisivu joten pystyn käyttämään mainiosti gittiä serverillä (AWS EC2 Ubuntu). Pitää hieman sitten tutustua että miten gittiä pääsee Pythonista (backend kirjoitettu sillä) käyttämään järkevästi ja kuinka sitten käsittelen sitä saatua dataa. En ihan ymmärrä tuota Metabolixin ideaa eli siis olisiko yksi logi aina yksi muistiinpano? Mikäli ymmärrän oikein silloin näkisi ainoastaan muistiinpano tasolla että koska on viimeksi muutettu vaikka toivoisin myös näkeväni sen ehkä lause tasolla asti.

Mutta kokeilen tänään näitä ehdotuksia hieman lisää ja palaan asiaan lähi tulevaisuudessa kokeiltuani.

The Alchemist [26.12.2019 07:44:52]

#

Omasta mielestäni tässä ei kannata lähteä kikkailemaan vaan vain tallentaa jokainen muistiinpano kokonaisena tiedostona. Jos niitä haluaa joskus vertailla, niin sitten muutokset voidaan laskea lennosta.

E1ss [26.12.2019 10:18:29]

#

Hyvä että muuten sanoit tuon koska en aluksi tajunnut kuinka yksinkertaista ratkaisua ehdoitit. diff tuntuu toimivan todella hyvin ja en varmaan koskaan tule tallentamaan niin paljon tekstiä että kopion määrä tulisi aiheuttamaan ongelmia. Tai sitten voin myöhemmin hieman monimutkistaa asioita tallentamalla vain muutokset mutta en viitsi edes aluksi ruveta tekemään sitä.

The Alchemist [26.12.2019 15:16:38]

#

Paras tapa riippuu kuitenkin lopulta siitä, miten sitä sovellusta oikeasti käytetään. Jos jokainen typon korjaus ja pikatallennus johtaa uuteen kopioon tiedostosta, niin kyllä sekin ajan kanssa kumuloituu isoksi vuoreksi roskaa. Harvakseen käytettynä sillä tuskin on mitään väliä, mutta jos sovellusta käytetään lukuisia kertoja päivässä ja jokaisena päivänä, niin sitten dataa kertyy nopeasti.

Metabolix [28.12.2019 00:38:06]

#

E1ss kirjoitti:

En ihan ymmärrä tuota Metabolixin ideaa eli siis olisiko yksi logi aina yksi muistiinpano?

Kyseisessä mallissa kaikki tiedot voisivat olla samassa tiedostossa. Tallentamiseen voisi tekstitiedoston ja JSON-muodon sijasta käyttää myös esimerkiksi tietokantaa.

E1ss kirjoitti:

Mikäli ymmärrän oikein silloin näkisi ainoastaan muistiinpano tasolla että koska on viimeksi muutettu vaikka toivoisin myös näkeväni sen ehkä lause tasolla asti.

Se on tietenkin tarkemmasta toteutuksesta kiinni. Ideassa olennaista ei ollut muutosten tarkkuus vaan tallennustapa (versiot peräkkäin listana).

Mutta jos nyt haluatkin nähdä muutokset lausetasolla asti, tämä on oikeastaan sama asia kuin joka version tallentaminen kokonaan ja vertailu diffillä. Näin myös Git toimii logiikaltaan. (Käytännössä Git tallentaa tiedostot tehokkaammin pakattuna ja hyödyntää pakkauksessa tiedostojen samankaltaisuutta.)

Toteutusta suunnitellessa kannattaa miettiä myös, onko tarkoitus sallia tiedostojen muokkaus oman ohjelman ulkopuolelta. Jos on tarkoitus, täytyy huolehtia siitä, että tiedoston nykyinen versio on sellaisenaan muokattavana ja että muokkaaminen ei sekoita versiohistoriaa. Jos ei ole tarkoitus, voi olla viisainta tallentaa tiedostot sellaisessa muodossa tai sellaiseen paikkaan, ettei niitä tule vahingossa muokattua.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta