Tuli mieleen, kun luin "koodaaja" -nimimerkin uusimman koodipätkän tuon päiväsakkolaskurin, kun yleensä näissä tämän ohjelmointiputkan keskusteluissa suositaan esimerkeissä pythonin osalta tkinteriä.
Käytin jonkin aikaa hakukoneella, ja päädyin Stack Overflow -keskustelun avaukseen, joka oli päälle 12 vuotta vanha aloitus, jossa oli listattuna pythonin graafisen käyttiksen ohjelmointiin liittyvien teknologioiden ja kirjastojen jonkinlaista lienee kirjoittajan subjektiivinen näkemys, niin vastauksissakin ja avaajan postauksessa oli tkinter mainittu ensimmäisenä.
Mitä itse jokin aika julkaisin Ubuntu Suomen keskustelualueella viime vuoden puolella pythonilla ohjelmoimani puolisummaimen GUI-lähdekoodin kera, olin toteuttanut siinä selainkäyttöliittymän ja sitten ohjelmoin back-end ratkaisun Flaskilla, ja katsoin Googlella hakutermillä "python Flask Alternative", niin sieltäkin tuli Django noista web application developement frameworkeista ykkösvaihtoehtona, niin onko niin, että voisi olla luontevampaa ottaa haltuun Django back-end -kehyksistä Flaskin sijaan ja ohjelmoida GUI tkinterillä, kun sehän ja toimii MacOS:lla, Linuxilla ja Windowsilla, kun se on Cross-platform, vaikka en näe mitään outoa selainGUI:ssakaan, kun jos käyttöliittymän toteuttaa responsiivisena, ja käyttää Jinja2:sta muuttujien tulostamiseen HTML-koodissa, ja kuitenkin noista macintosheista, Linuxista ja Windowsista kaikista löytyy moderni verkkoselain.
Mitä hyötyä GUI:n ohjelmoinnilla saavuttaa verraten selainkäyttöliittymään, ja miksi pitäisi ohjelmoida Djangolla Flaskin sijaan, onko tästä jotain huomion arvoista kommentoitavaa. Olenko taas tekniikoineni aikaani jäljessä.
Tuossa listauksessa, joka oli SO:ssa, niin HTML-GUI -toteutus oli vasta sijalla 6.
Suora linkki tuohon puolisummain-ohjelmaani on
Tässä.
Jere Sumell kirjoitti:
Mitä hyötyä GUI:n ohjelmoinnilla saavuttaa verraten selainkäyttöliittymään
Selain ei tarjoa kaikkia käyttöjärjestelmän rajapintoja JavaScriptille. Esimerkiksi Windowsin Task Managerin tai Linux-maailman topin kaltainen ohjelma on minusta järkevää toteuttaa yhtenä prosessina, jossa on mukana käyttöliittymä (joka voi olla tekstipohjainen), eikä serverinä + webbisivuna.
Jere Sumell kirjoitti:
Suora linkki tuohon puolisummain-ohjelmaani on
Tässä.
Paljonko on 0+0?
Oma aateekooni ei ole siitä uusimmasta päästä, joten haluan pitää pyyttonit-sun-muut skriptikakrujen softat minimissään. ja vielä vähemmän haluan yhtään softaa mitä käytetään selaimessa ja jonka prosessointi tehään juttelemalla jollekin lokaalille pyyttoniwebbiservulle yms.
jlaire kirjoitti:
Paljonko on 0+0?
Onhan se niinkin, että 0 XOR 0 = 0, ja 0 AND 0 = 0, vaikkakin esittämäsi 0 OR 0, sekin on 0, mutta tuossa kaaviokuvassahan on XOR portti kytketty sarjakytkennällä yhteen AND portin kanssa, joihin molempiin tulee syötevirtana x ja y syöteparametrit, eli jos x = 0 ja y = 0, niin summasarakkeeseen tulee 0 ja sitten muistisarakkeeseen tulee 0.
Tuo pitäisi muuttaa vähän tuota puolisummain -funktiota.
Oikeimmin näin:
def puolisummain(x,y): m=0 s=0 if x+y > 1: m=1 s=0 if x+y == 1: m=0 s=1 return (m,s)
Sitten testauskoodi, jossa käydään kaikki 2*2 eli 4 vaihtoehtoa läpi brute-forcella:
for x in range (2): for y in range (2): res = puolisummain(x,y) print(res)
Tuloste:
(0, 0) (0, 1) (0, 1) (1, 0)
Nyt se lienee vähän oikeammin, täysin oikein!
Jere Sumell kirjoitti:
(17.10.2021 06:25:41): Tuo pitäisi muuttaa vähän tuota puolisummain...
Mikset vaan käytä loogisia bittioperaatioita tekemään suoraan sen mitä tuo kuvakin toteuttaa?
Mikset vain julkaise taulukkona tulosta, kun siinä on tasan nuo neljä riviä? Tuntuu järjettömältä tehdä moniosainen ja satakunta koodiriviä sisältävä ohjelma, jonka perimmäinen tarkoitus on välittää seuraava tieto:
0 + 0 = 00 0 + 1 = 01 1 + 0 = 01 1 + 1 = 10
Muutenkin pieneen demonstratioon tuollainen käytännössä vain tekstiä tuottava palvelimen ja nettisivun yhdistelmä on ihan hullu. Tekisit vaikka nätin SVG:n, jossa JS:n voimin saisi klikkaamalla vaihdettua tilaa ja vaikka väreillä korostuisi, missä sähkö kulkee.
Pelkkä selainkäyttöliittymä (eli HTML ja JavaScript tai jonkin muun kielen kääntö JS:ksi) sopii hyvin pieniin esimerkkeihin ja apuohjelmiin ja ylipäänsä sellaisiin asioihin, joissa ohjelma toimii luontevasti yhdessä ikkunassa ja ohjelman ei tarvitse käsitellä käyttäjän koneella olevia asioita muuten kuin selvien avaus- ja tallennuspainikkeiden kautta.
Selain ja paikallinen palvelin ovat tämän päälle eräänlainen purkkaratkaisu, kun palvelinta tarvitaan esimerkiksi tiedostojen käsittelyyn. Jos ohjelmaa pitää pystyä käyttämään myös ”etänä” niin, että palvelin on eri koneella kuin selainkäyttöliittymä, tietenkin silloin säästää vaivaa, kun käyttää samaa ratkaisua myös yhden koneen tapauksessa.
Erillisen ohjelman etu on se, että ei tarvitse kikkailla kahdella erillisellä osalla (palvelin ja selain) ja ohjelman saa myös käyttäjän kannalta selvästi erilliseksi eikä vain välilehdeksi selaimessa. Jälkimmäinen voi olla tapauskohtaisesti hyvä tai huono asia, esimerkiksi pilvipalvelusta dokumentteja selatessa on kätevää, jos ne aukeavat suoraan selaimessa luettavaksi, mutta jossain toisessa tilanteessa voi olla mukavampi käyttää erillistä tekstinkäsittelyohjelmaa.
Selainkäyttöliittymän käyttö myös vaatii tietoturvan huomioimista eri tavalla kuin natiivin käyttöliittymän. Näitähän esimerkkejä löytyy...
(poistettu)
(poistettu)
Nyt on niin outoa tekstiä, että Jere on todella ihan omassa maailmassaan, onkohan viikonlopun vietto saavuttanut lakipisteensä... Palataanko vaikka huomenna asiaan vähän selvemmällä viestillä.
Jos arvon ylläpito voisi poistaa tuon viestini tuolta, meni vähän yli ja ohi tai oikeastaan kaksi viimeisintä viestiäni?
jalski kirjoitti:
Jere Sumell kirjoitti:
(17.10.2021 06:25:41): Tuo pitäisi muuttaa vähän tuota puolisummain...
Mikset vaan käytä loogisia bittioperaatioita tekemään suoraan sen mitä tuo kuvakin toteuttaa?
Uusi päivä ja selvä aamu! Eilen meni vähän oluen oton suhteen pidennetyllä viikonlopulla, ja tuli aiheen ohi puhuttua.
Tätäko tarkoitat bittioperaatioilla, kun käytän noita True ja False tässä seuraavassa:
def puolisummain(x,y): m=False s=False if x+y > True: m=True if x+y == True: s=True return (m,s)
Sitten jos haluaa oikein ohjelman suorittajaa koulutusmielessä kiitettävämmin palvella, niin voi lopputuloksiin vaikka sisällyttää alkuperäisetkin syotteet alkuun.
for x in range (2): for y in range (2): print("" +str(x) +" - " +str(y) +" - " +str(puolisummain(x,y)))
Tulokset siis näyttävät tältä lopulta:
0 - 0 - (False, False) 0 - 1 - (False, True) 1 - 0 - (False, True) 1 - 1 - (True, False)
Jere Sumell kirjoitti:
Tätäko tarkoitat bittioperaatioilla, kun käytän noita True ja False tässä seuraavassa:
Meinasin, että nuo inputit syöttäisi XOR ja AND operaatioille ihan kuvan mukaisesti.
jalski kirjoitti:
Meinasin, että nuo inputit syöttäisi XOR ja AND operaatioille ihan kuvan mukaisesti.
Mitenkäs tuo pythonissa toteutetaan.
>>> def f(x,y): return (x&y, x^y) >>> [f(x,y) for x in [0,1] for y in [0,1]] [(0, 0), (0, 1), (0, 1), (1, 0)]
Tällaiset jutut pitäisi osata itse löytää dokumentaatiosta...
Jere Sumell kirjoitti:
jalski kirjoitti:
Meinasin, että nuo inputit syöttäisi XOR ja AND operaatioille ihan kuvan mukaisesti.
Mitenkäs tuo pythonissa toteutetaan.
Googlella varmaan löytää Pythonin operaattorit, ehkä jotenkin:
s = a ^ b c = a & b
Pidät vaan huolen, että inputit eivät ole yhtä suurempia (onnistuu myös and-operaatiolla).
Edit: jlaire antoikin siistin ja lyhyen suoran ratkaisun...
Joo, hakukoneella täsmäsi luettelo noista operaattoreista.
Näemmä noiden bitin siirto vasemmalle ja oikealla << ja >> lisäksi on tosiaan tuo AND, OR, XOR, mutta lisäksi vielä NOT "~" -merkinnällä mahdollinen, kun noiden kaikkien loogisten piirienhän mitä niitä sarjakytkennällä toisiinsa yhdistellään,niin kaikkien piirien esitys on mahdollista esittää pelkästään negaation NOT -porttien kautta.
Se ei selvinnyt tuosta, mutta loogista olisi, että noista pythonin tarjoamista operaatioista voi sitten tehdä monimutkaisempiakin lausekkeita, jossa käytetään hyväksi yhtä tai useampaa, esim (x AND y) AND (NOT z) siten, että ne esittää samassa.
NAND ja NOR -operaatiot voisi jotenkin näin hoitaa ehkä, jos olisi looginen.
x = ~(0&0) print (x)
eli x = NOT (0 AND 0), eli eikäs tämän pitäisi tuottaa 1 tuloksesksi, nyt tästä tulee -1. Ei se näemmä toimi.
Jere Sumell kirjoitti:
Se ei selvinnyt tuosta, mutta loogista olisi, että noista pythonin tarjoamista operaatioista voi sitten tehdä monimutkaisempiakin lausekkeita, jossa käytetään hyväksi yhtä tai useampaa, esim (x AND y) AND (NOT z) siten, että ne esittää samassa.
Aika pitkälle pääset kun ymmärrät, että lähes millä tahansa ohjelmointikielellä pystyy käyttämään kaikkia loogisia operaattoreita ja niiden yhdistelmiä. Aivan kuten niillä pystyy käyttämään perus aritmeettisia operaattoreita ja niiden yhdistelmiä.
Python vähemmän yllättäen kuuluu tuohon joukkoon "lähes millä tahansa ohjelmointikielellä".
Ok. Jotenkin kummallista, että noilla operaattoreilla ei voi tehdä lausekkeita yhdistelemällä niitä pythonissa, vaikka python muutoin vaikuttaa ihan tehokkaalta kieleltä kaikenlaiseen.
Sittenhän on mahdollista saada oikea lopputulos esimerkiksi NOT(0 AND 0), että tulee 1 tulokseksi, jos määrittelee jokaiselle operaatiolle omat funktiot, ja kutsuu NOT funktiota syöteparametrilla AND-metodin kutsulla.
Esimerkki pythonissa
def AND(x,y): return (x&y) def OR(x,y): return (x|y) def XOR(x,y): return(x^y) def NOT(x): return not x #Tämä antaa outoja tuloksia #def NOT(x): # return ~(x) #Nyt toimii NOT(0 AND 0) x = NOT(AND(0,0)) #Tulostuu 1 print (x)
Jotenkin tuo tilde-merkin käyttö metka tuossa NOT -operaatiossa, ehkä yritän käyttää sitä väärin, mutta sitten saa NOT x, kun käyttää pienillä kirjaimilla tuota not -avainsanaa.
Sitten ei taida pythonista löytyä Equivalent EQV:täkään, mutta se lienee johdettavissa noilla neljällä perusoperaatiolla.
Onkin näemmä turhaa ohjelmoida itse pythonissa noita perusoperaattoreita, kun python näköjään tarjoaa moduulin, jossa on myös EQV -edustettuna mahdollisuutena käyttää sitä myös.
Jere Sumell kirjoitti:
Ok. Jotenkin kummallista, että noilla operaattoreilla ei voi tehdä lausekkeita yhdistelemällä niitä pythonissa
Miten niin ei voi, juurihan sanoin että voi.
Ja eqv operaattori on ==
Luin hitaammin edellisen viestisi nyt uudelleen, ja todellakin sanoit niin! Itselläni jotain häikkää lienee sitten syntaksissa, kun en hallitse tuota tilde-merkin käyttöä, se antaa jonkin muun NOT, kuin negaation
Jere Sumell kirjoitti:
Itselläni jotain häikkää lienee sitten syntaksissa, kun en hallitse tuota tilde-merkin käyttöä, se antaa jonkin muun NOT, kuin negaation
Minulla ainakin antaa ihan oikein
>>> ~0
-1
>>> ~1
-2
Tietysti kannattaa ymmärtää että oletuksena python käyttää etumerkillisisä kokonaislukuja, eli esim. 32-bittisenä -1 on bitteinä 11111111 11111111 11111111 11111111
Grez kirjoitti:
Ja "eqv" operaattori on ==
Joo, hain liian kaukaa. Jotenkin metkaa, kun kirjoitin Google-hakutermiksi "EQV operator python" ja "Equivalent operator python", niin tuli kaikkea muuta, kuin olennaisia aiheeseen liittyviä hakutuloksia, vaikka moni muukin etsinyt sitä kun tuli noissa hakuehdotuksissa. Tuo python operator moduulin dokumentaatiosivu oli ainoa, missä se tuossa hakutermin muodossa esiintyi.
Muihin hakutuloksiin liittyi mm. LibreOfficen jokin ohjeistus, ja jotain Microsoftin dokumentaatiota, ja sitten muita ohjelmointikieliä, mutta ei pythonia.
Metkaa, että Google kyllä aika hyvin yleensä lähes varmasti nyt edes jotain loytää, mutta enemmän sieltä voi tulla jostain syvälle menevästä aiheesta ainakin etupään tuloksissa epäolennaisiakin sisältoja omaavia osumia.
Grez kirjoitti:
Minulla ainakin antaa ihan oikein
>>> ~0
-1
>>> ~1
-2Tietysti kannattaa ymmärtää että oletuksena python käyttää etumerkillisisä kokonaislukuja, eli esim. 32-bittisenä -1 on bitteinä 11111111 11111111 11111111 11111111
Itsekin sain samat tulokset, mutta tuo selittänee tuo etumerkillisten 32 bittisten lukuesityksen käytto tuon, että tulee negatiivisia arvoja tulokseksi.
Jere Sumell kirjoitti:
Itsekin sain samat tulokset, mutta tuo selittänee tuo etumerkillisten 32 bittisten lukuesityksen käytto tuon, että tulee negatiivisia arvoja tulokseksi.
Tuo 32-bit oli oma avausyritykseni asialle. Python leikkii että sillä on rajattoman pituiset luvut, eli tavallaan tuossa on ääretön määrä 1-bittejä.
Mutta toki voit katkaista vaikka 8 bittiin
>>> ~0 &255
255
>>> ~32 &255
223
Jere Sumell kirjoitti:
def AND(x,y): return (x&y) def OR(x,y): return (x|y)
Mä en lähtis tällaisia määrittelyjä tekemään, tai saahan ne tehdä mutta näyttää juuri yhtä hullulta kuin:
def PLUS(x,y): return (x+y) def MINUS(x,y): return (x-y)
Kyllä ~^&| merkkien pitäisi olla ohjelmoijille ihan yhtä tuttuja kuin +-/*
Yhtäsuuruusvertailun vastaaville biteille voi tietysti ilmaista ~(x^y)
, mutta en muista koskaan tarvinneeni tätä.
Tässä muutama harjoitustehtävä Jerelle:
- Selitä, mitä -~x
tekee.
- Toteuta ~x
kahdella laskutoimituksella ilman tildeä.
- Mille arvoille (x&(x-1)) == 0
on tosi?
- Mitä x & (-x)
tekee?
jlaire kirjoitti:
(19.10.2021 14:29:44): Yhtäsuuruusvertailun vastaaville biteille...
Kiitos harjoitustehtävästä!
Tässä on taas ilta dekkarikirjallisuuden parissa edessä iltasella, kun taas kirkasta on tullut juotua pullo, mutta nyt vedän ihan topiciin asiaa, että kiitos todella paljon näistä: Pitää perehtyä Pyhton-kieleen vielä sähkötekniikkaa syvällisemmin sitten taas huomenna aamusta eteenpäin, mitä tänään olin tossa George Boolen 1600-luvulla kehittämässä sähkö-opissa vielä ja 1990 -luvun Pythonissa mukana loogisella tasolla.
Tästä pelkkä tsemppi eteenpäin, ja otan opista vaarin, mitä katson sitten selvin päin huomenna näistä sinunkin jlaire ja kumppanit kommenttipostauksista.
Aika tavalla mennyt alkuperäisestä aiheesta seilannut sivuviihteeseen...
...enää ei saa purjetta reivattua taaksepäin.
jlaire kirjoitti:
(19.10.2021 14:29:44): Yhtäsuuruusvertailun vastaaville biteille...
Katsoin tuosta tilde-merkin käytöstä pythonissa tuollaisesta Finxterin julkaisusta tarkoituksen, niin sehän kääntää bitit nollasta ykkösiksi ja ykköset nolliksi. ja on selvää, sama mikä binääriluku, jonka tilde-merkin jälkeen antaa ensimmäinen bitti on 0, niin vastaukseksi saadaan jokin negaatiivinen luku, koska se käännetään ykköseksi.
-toista nyt en äkkää,
Toi kolmas nyt antaa sekä ykköselle ja nollalle nollan tuloksen, tosi, kun jos nyt ajattelee tuota 0-1 niin -1 käänteisenä ne bitit ovat 0, ja sitten 1 ja 0 = 0, eli molemmilla 1 ja 0 tuo lauseke = 0 tosi.
Tuossa nyt äkkiseltään tulee viimeisessä tehtävänantokohdassa kysymys juolahtaa mieleen, mitä saadaan tulokseksi, kun JA -operaattoria käytetään luvun itsensä vastaluvun kanssa, eli jotenkin tulee toistensa kumoaminen mieleen. Jos sieventää tuon, niin tuleeko aina lopputulokseksi jotain tyhjää tai 0.
Tällainen oivallus heräsi, että ehkä kannattaa unohtaa tämä integer-tyyppisenä kokonaislukuna ajattelu tässä Pythonin loogisten operaattorien maailmassa, ja alkaa hahmottamaan binäärilukujen kautta näitä arvoja?
Näiden loogisten operaattorien käyttämisen yhteydessä voi näköjään käyttää muitakin syötteitä, kuin pelkästään 0 ja 1, joten ne ovat laajemminkin tajuttavissa, kuin vain Boolen Algebran käytön osalta, mutta päädytään lopulta binääriluvuilla ajatteluun, että kannattanee alkaa hahmottamaan binäärilukuina aivan siten, miten nykyiset tietokoneemme käsitteleekin tiedon.
En tiedä, odotkitko "jlaire" -minulta vastausta edes jonkinlaista, mutta tämä oli nyt jonkinlainen vastaus, vaikka argumentaatio aika heikko ja metsään meneväkin, hapuillen sain nyt ainakin sen käsityksen, että tilde-merkki kääntää binääriluvun bitit komplementeiksi, ja siitä heräsi ajatus, että kannattaa alkaa ehkä mieltämään binäärilukuina syötteitä antaessa näiden operattorien käytön yhteydessä.
Jere Sumell kirjoitti:
loogisten operaattorien
Loogiset operaattorit (not and or) ovat eri asia kuin bittioperaattorit (~^&|). Loogisia operaattoreita käytetään totuusarvojen (False, True) kanssa. Bittioperaattoreille voi antaa muitakin lukuja kuin 0 ja 1.
Esimerkiksi (100 & -100) == 4.
Jere Sumell kirjoitti:
En tiedä, odotkitko "jlaire" -minulta vastausta edes jonkinlaista
Enpä oikeastaan.
Grez kirjoitti:
(19.10.2021 13:21:54): ”– –” Mä en lähtis tällaisia määrittelyjä tekemään...
Onhan tuo tosiaan hölmöläisen hommaa.
jlaire kirjoitti:
Jere Sumell kirjoitti:
loogisten operaattorien
Loogiset operaattorit (not and or) ovat eri asia kuin bittioperaattorit (~^&|). Loogisia operaattoreita käytetään totuusarvojen (False, True) kanssa. Bittioperaattoreille voi antaa muitakin lukuja kuin 0 ja 1.
Esimerkiksi (100 & -100) == 4.
Joo, empiirisen havainnon tein itsekin tästä asiasta, ja nyt viimein selvisi, kun kerroit! Alunperin aloin näitä käyttämään ainoastaan nollien ja ykkösten tulosten vertailuun, mutta en käytä enää tästä edespäin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.