Koodasin vähän C++:aa ja...
...muistin miksi pidän dynaamisesta tyypityksestä:
error: passing ‘const std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >’ as ‘this’ argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]’ discards qualifiers
PS. Hyvää joulua! :-)
7 Comments
Moro Kennu,
sulla on aina hyvät tweetit. Anna palautetta www.sereive.com. Kiitti!
t, smuli
Eipä se dynaaminenkaan aina niin juhlaa ole. Tuossa OTR GAE (Python) proggiksen yhteydessä taistelua näiden asioiden kanssa. Ensimmäistä jotain oikeasti hyödyllistä tekevää Python ohjelmaa kirjoittelin.
Päänvaivaa tuotti se, että osa kirjastoista haluaa datan ehdottomasti byte-array muodossa. Toiset haluaa saman datan integer-array muodossa, jossain vaiheessa data on sitten oltava stringinä (ascii) ja välillä unicode stringinä. Eikä muunnokset noiden välillä muuten mene automaattisesti. Tuli rakas Java mieleen kun kirjoitteli apufunktioita datan muutamiseksi muodosta toiseen. Mutta kyllä se siitä.
Joustavammilla kielillä jotka käsittelevät tietoa tietona, sen muodolla ei ole niin paljon väliä. 256 bittiä dataa on 256 bittiä dataa ja sillä selvä. Oli sitten merkkijono, tavuja tai niitä merkkejä esittäviä numeerisia arvoja.
Eikös juuri tuollainen ole Pythonissa tosi helppoa, tyyliin stringistä integer-arrayksi näin:
[ord(c) for c in 'hello'] => [104, 101, 108, 108, 111]
Mikähän on Pythonissa byte-array? En ole sellaiseen törmännytkään. Python 3:ssa on kyllä bytes-tyyppi, joka on byte-string. Omasta mielestäni Python 2:n merkkijonojen erottelu str- ja unicode-tyyppeihin on ollut Pythonin suurin heikkous. Python 3 ilmeisesti korjaa sen aika pitkälle niin, että str-tyyppi kattaa selkeästi kaikki merkkijonot, ja bytes-tyyppiä taas käytetään geneerisiin tavupuskureihin, joiden enkoodaus ei ole tiedossa.
Juu, byte array on Pythonissa korrektisti ilmaistuna lista. Mutta se että merkkijono 'merkkijono' ei kelpaa, vaan pitää toimittaa lista tavuista ['m','e'...] on aika turhaa. Varsinkin kun tuo yksi kirjasto vaati nimenomaisesti integereinä noi nuo arvot. Juuri kuten esimerkissäsi oli. Jos homma toimisi todella joustavasti pitäisi byte listan ja merkkijonon käydä suoraan päittäin. Kuten se kävisi C pointtereilla. Python3:ssa tietysti unicode stringit voisi olla kiva haaste, kun tavut eivät vastaa enää merkkejä.
Eihän nuo muunnokset ongelmia aiheuta, kun niihin on tottunut tai luonut täysin valmiit apufunktiot. Mutta ensimmäistä kertaa vierasta kieltä kokeillessa tuli tosissaan java-fiilikset pintaan. ;)
Tässä funktio jolla muunnan heksadesimaalin int listaksi.
@staticmethod
def HexToIntList( hexStr ): try: ints = []
C:n heikko tyypitys on tietysti joskus kätevää low-level-ohjelmoinnissa, mutta se kyllä kostautuu aika äkkiä sovellusohjelmoinnissa ikävien bugien muodossa. Suurin osa maailman tietoturva-aukoistahan on juuri niitä.
Mielenkiintoinen tuo HexToIntList-metodisi ;-) Pythonissa on muuten tapana käyttää pieniä kirjaimia ja alaviivoja metodien ja muuttujien nimissä, esim. hex_to_int_list.
Itse ehkä tekisin saman jotenkin näin:
import re def hex_to_int_list(hex_str): return [int(x, 16) for x in re.findall('(.{2})', hex_str.replace(' ', ''))]
Pakko myöntää, että olen harrastanut nyt ns "PHP-koodaajan" hyveitä. Eli tehnyt vaan koodia miten sattuu joka toimii ainakin sinne päin. Tutorialit ja perusdokumentointi on edelleen lukematta. Mutta saa sitä näköjään pythonilla jotain toimivaa aikaiseksi vaikka ei edes osaa.
Syy miksi Pythonin puoleen käännyin, oli GAE. Toisekseen Pythonilla näyttää erilaisten datasettien käsittely olevan suunnattoman kätevää verrattuna moneen muuhun vaihtoehtoon.
Mutta juuri pythonin parhaat ominaisuudet on täysin harmaalla sektorilla johtuen siitä että tutorialit on lukematta ja ymmärtämättä.
http://zephyrfalcon.org/labs/python_pitfalls.html
Tuo kannattaa kastoa. Varsinkin noiden self referenssien kanssa saa sössittyä hyvin. Oli tausta sitten Javassa tai jossain muussa kielessä.
Kun lähtee sillä asenteella, että eihän tässä mitään perusteita tarvitse lukea kun osaan homman. Niin metsään menee. ;)
You can use Markdown to format your comment:
Separate paragraphs in your text with two newlines