2017 m. gegužės 15 d.

Pycon 2017 LT: Prototipinio OOP įgyvendinimas su Python

Šeštadienį Kaune vyko Pycon LT 2017 konferencija (http://pycon.lt/). Čia mano pranešimo ("Prototipinio OOP įgyvendinimas su Python"), kurį aš skaičiau, tekstas.

Skaidrės:
http://petraszd.com/pycon-2017/

Kodo pavyzdžiai:
https://bitbucket.org/petraszd/pyconlt-2017-demo
Pačios kalbos įrašas:
https://www.youtube.com/watch?v=Jcgp5-8_XkU



--------------------

Sveiki,

Aš esu Petras Zdanavičius. Šiandieną aš jums pristatysiu pranešimą apie prototipinį OOP ir parodysiu demonstracinį jo įgyvendinimą Python pagalba.

Pranešimas nebus naudingas praktiškai. Tai daugiau kompiuterių mokslo ar net kompiuterių filosofijos tema. Filosofijos, nes aš kaip ir kiekvienas programuotojas, mėgstu savintis visuomenėje gerbiamus irba mėgstamus titulus. Kaip menininkas, kūrėjas, filosofas [pauzė], ninzė. Ar roko žvaigždė (rockstar).

Nes jo -- kiekvienas programuotojas tamsioje kamūrkėje po 80-uom valandų per savaitę kalantis kodą, turi ekvivalentų gyvenimo būdą kaip roko žvaigždė.

Apie ką aš čia? A. Tai va, aš jums papasakosiu apie prototipais paremtą OOP.

OOP Apibrėžimas I

Jeigu, jūs programuojate (ypač jeigu jūs programuojate Python), jūs esate susidūręs su OOP.

OOP - programavimo paradigma, kompiuterinių programų architektūroje naudojanti objektus ir jų sąveikas [Wikipedia]

Čia Lietuvos Wikipedia taip sako. Aš nieko nesuprantu, kas čia bandoma pasakyti.

OOP Apibrėžimas II

Mano apibrėžimas. OOP:

- Yra objektai
- Objekto viduje saugoma jo būsena. Atributų pavidalu
- Objektas turi sąsają, bendravimui su išoria. Metodų pavidalu
- Objektai sąveikauja vieni su kitais ne tiesiogiai keisdami vienas kito būseną, bet siuntinėdami vienas kitam žinutes. Metodų kvietimo pavidalu

[Petras (c)]

"Klasikinis" OOP

Kai mes sakome OOP, tai galvoje paprastai turime klasėmis paremtą variantą. Nu tą klasikinį. Nu tą, kaip Java. Kur yra klasės. Jose apsirašai, kaip veiks objektai. Ta klasė, tai tarsi kažkoks Platono formų teorijos atitikmuo. Kur tobulos formos egzistuoja tik abstrakčiame idėjų pasaulyje. O empiriniame pasaulyje (Dar žinomame kaip realybė) egzistuoja tik netobulos jų kopijos. Panašiai kaip tobulos klasės ir netobuli objektai.

OOP Istorija

1970-iais Alan Kay vadovaujama Xerox PARC komanda sukuria Smalltalk programavimo kalbą. Kalba netinkamas žodis. Programavimo sistemą. Programavimo mašiną? Tai turėjo būti nauja paradigma. Kaip jie patys teigė "naujojo pasaulio" "Žmogaus ir mašinos simbiozė" paradigma. Ar nesakiau, kad programuotojai mėgsta savintis skambius žodžius.

Ir jų sistema labai skyrėsi nuo to, ką turime dabar. Ta programavimo kalba nebuvo atskiriama nuo IDE (Integruota kūrimo aplinkos). Ta prasme, viskas buvo vienoje aplikacijoje. Ir teksto redaktorius ir versijavimas, ir dokumentacija, ir atsarginės kopijos, ir programos būsena irgi buvo Smalltalk mašinoje.

Iš dabartinių aplinkų turbūt būtų galima palyginti su Racket. Arba žaidimų varikliukų aplinkomis. Tokių kaip Unreal ar Unity. Kurie lenkia visas šlubas sistemas irba konfigūracijas, kurias mes naudojame programuodami Web su Python. Ir lenkia keliais dešimtmečiais.

Bet grįžtant prie istorijos. Tada atėjo Bjarne Stroustrup. Jam patiko OOP idėjos. Ir jis jas paėmė ir dalį jų daugmaž pritempė prie C ir parašė transliatorių į C, kurį pavadino C++.

Tada atėjo Syn Microsystems, pasakė, kad C++ yra perdaug kosmosas. Paėmė C++ pseudo OOP ir apgludino aštrius kampus. Dabar mes todėl turime Java. Java bei C++ šiaip laikais yra laikomos kaip etaloninės, pavyzdinės OOP kalbos. O Alan Kay verkia kamputyje.

Prototipinio OOP Istorija

Toje pačioje Xerox PARC toks David Ungar ir toks Randall Smith dirbdami su Smalltalk'u nusprendžia, kad tas dualizmas tarp klasių ir objektų yra ne fengšui. Kad kodo bazės egzistavimo cikle vis tiek prisireikia keisti klasių struktūrą. Kartais vien dėl to, kad nu va reikia tokio vieno objekto. Nu vieno vienintelio mažučiuko. Nu bet labai reikia. Nu bet būtent tau reikia vieno objekto. Nu reeeiiikiaaa. Ir dėl to vieno objekto reikia griauti velniop visą klasių hierarchiją ir kažkaip įterpti tą naują klasę tam naujam objektui.

Nors realiai, tai paimi bet kurią esamą klasę, prirašai ten if'ų ir normaliai. Sukasi kaip bitė.

Tai jiems kilo klausimas: "o kas jeigu galėtum praplėsti ne klases, o objektus". Iš to automatiškai seka kitas klausimas: "o kas jeigu nėra klasių, o yra tik objektai?".

Self

Ir būtent taip gimė programavimo kalba "Self".

Kadangi tais laikais žmonės vis dar nebuvo praradę ūpo eksperimentuot su kodo redaktoriais (kitaip nei šiais, kai naujausi ir populiariausi kodo redaktoriai yra naršyklės... Kaip "Visual Studio Code" ar "Atom"), tai jie paėmė ir tuo pačiu sukūrė integruotą kūrimo aplinką, kuri atrodė taip.

[Self nuotrauka]

(Petro pastaba po visko: patingėjiau pasidaryti Self VM nuotrauką. Tai ir nebuvo nei nuotraukos, nei šito teksto)

JavaScript

Kalba buvo eksperimentitnė. Ji vis dar gyva. Bet šiaip visas prototipinis konceptas būtų miręs, jeigu ne 10 dienų Brendan Eich gyvenime. Brendan'as 1995 turėjo tokią užduotį sukurti programavimo kalbą. Jis tuo metu buvo susižavėjęs dviem kitoms kalbomis. "Schema" (kas yra Lisp-1) ir jau minėtoji "Self". Tai jis ir kūrė kalbą, kuri buvo keista tų dviejų sąjunga. Neekstremaliai humaniškai funkcinė (bet ne visai) prototipais paremta OOP kalba.

Aij, ir tuo metu buvo ant bangos Java, tai Brendan'ui buvo pasakyta, kad jo kalba turi atrodyti kaip Java.

Štai kaip mes dabar turime turbūt pačią populiariausią kaip nepagrindinę programavimo kalbą JavaScript. Nepagrindinę, nes paprastai žmonės programuoja kažkuo ir tada ant viršaus dar JavaScript.

Ir didokas procentas JavaScript programuotojų nė velnio nežino, kad ten yra kažkokie prototipai ir iš vis, kas jie ir kaip jie veikia.

Dėl to aš jums pabandysiu parodyti Python'o kodo pagalba, kas yra prototipais paremta objektinė sistema.

Kodas (Kas yra kanoninis objektas)

Pagal Java'inį OOP apibrėžimą yra trys OOP banginiai: enkapsulecija, paveldėjimas ir polimorfizmas. Pats Python'as realiai iš jų įgyvendina tik paveldėjimą. Tai čia mes irgi daugiausia dėmesio kreipsime į paveldėjimą.

Klasikiniame modelyje paveldėjimas vyksta klasių lygmenyje. O prototipiniame paveldėjimas vyksta objektų lygmenyje.

Pradėkime nuo to, kad tai yra prototipinis modelis. Turi būti bent vienas kanoninis objektas, kūrį galime praplėsti savo reikmėmis.

Mes kurdami naudojame Python programavimo kalbą. Viena pagrindinių ir galingiausių Python'o kalbos įrankių yra žodynas (dict). Tai ir mes savo implementacijoje kaip vidinę objekto struktūrą naudosime Objektą

Object = {
    '__proto__': {}
}


Kaip matote, tai yra tiesiog žodynas, savyje turintis vieną mums magišką raktą `__proto__`. Kas esate susidūrę su JavaScript, jau galite įtarti kaip viskas veiks.

Ir tuo pačiu susitarsime, kad niekad pačio žodyno tiesiogiai neliesime. Tam naudosime `proto` modulio funkcijas.

Taigi, pradžioja mums reikia būdų tą objektą praplėsti ir tuo pačiu būdo kaip sukurti naują objektą, jeigu mums nusispjauti, kas jo prototipas.

obj1 = p.create({'a': 'a-1', 'b': 'b-1'})
obj2 = p.extend(obj1)

assert obj1['a'] == 'a-1'
assert obj2['__proto__'] == obj1

print("It is fine!!!")


Tam bus dvi funkcijos. `create`, kuri pagal nutylėjimą praplės standartinį `Object` ir tuo pačiu priskirs jam kažkokius atributus.

Kita bus `extend`. Jos esmė bus praplėsti jau egzistuojantį objektą.

Pažiūrim, ar jos veikia. Veikia. Dabar pažiūrim, kaip jos parašytos.

def extend(other, keys=None):
    obj = {'__proto__': other}
    if keys is not None:
        obj.update(keys)
    return obj


def create(keys=None):
    if keys and '__proto__' in keys:
        prototype = keys.pop('__proto__')
    else:
        prototype = Object
    obj = extend(prototype, keys)
    return obj


Ganėtinai paprastai. Pirma sukuria naują žodyną. `__proto__` raktą nurodo į praplečiamą objektą ir jeigu reikia sukuria naujus reikšmių raktus.

`create` tuo tarpu tiesiog shortcut'as į `extend`.

Einam prie įdomesnio funkcionalumo. Galimybės keisti objektų būseną. Funkcinio programavimo fanai ir karvės to nesupras.

obj1 = p.create({'a': 'a-1'})

obj2 = p.extend(obj1)
p.set(obj2, 'b', 'b-2')

assert p.get(obj2, 'a') == 'a-1'
assert p.get(obj2, 'b') == 'b-2'

p.set(obj2, 'a', 'a-2')
assert p.get(obj2, 'a') == 'a-2'
assert p.get(obj2, 'b') == 'b-2'

assert p.get(obj1, 'a') == 'a-1'

assert p.get(obj2, 'c') is None
print("It is fine!!!")


Mes norime gauti ir keisti objektų atributus. Kadangi susitarėme, kad tiesiogiai pačių Python'o žodynų neliesime, tai tam turime dvi pagalbines funkcijas, išradingais pavadinimais `get` ir `set`.

Pažiūrim, ar veikia. Veikia. Pažiūrim, kaip ir kodėl veikia.

def set(obj, attribute_name, value):
    obj[attribute_name] = value
    return value


def get(obj, attribute_name):
    current_obj = obj
    while True:
        if attribute_name in current_obj:
            return current_obj[attribute_name]
        current_obj = current_obj.get('__proto__', None)
        if current_obj is None:
            break

    return None


`set` yra žymiai paprastesnė. Ji tiesiog pakeičia arba sukuria vidinio Python žodyno raktą. Viskas.

`get` yra įdomesnis. Jame ir yra visa esmė. Pradedame nuo esamo objekto ir ieškome norimo atributo jame. Jeigu neradome keliaujame giliau į jo prototipą.  Vėl ieškome atributo. Ir taip kol ką nors surandame arba baigiasi prototipai.

Pastaba: Norint sudirbti algoritmą tereikia paimti sukurti 2 objektus ir jų prototipus nurodyti vienas į kitą.

Ir čia yra visa esmė.

Bet OOP nebūtų OOP, jeigu nebūtų metodų ir jų kvietimo.

def get_two():
    return 2


obj3 = p.create({'get_two': get_two})
assert p.call(obj3, 'get_two') == 2

obj4 = p.extend(obj3)
assert p.call(obj4, 'get_two') == 2

print("It is fine!!!")


Čia turime `call` funkciją. Aš jums jos implementaticos dar nerodysiu, nes pereisime prie magijos.

def get_foo_plus_1():
    return p.get(this, 'foo') + 1


proto_obj = p.create({
    'get_foo_plus_1': get_foo_plus_1
})


obj5 = p.extend(proto_obj, {'foo': 1})
obj6 = p.extend(proto_obj, {'foo': 2})

assert p.call(obj5, 'get_foo_plus_1') == 2
assert p.call(obj6, 'get_foo_plus_1') == 3
print("It is fine!!!"
)

Kažkaip norisi įdomesnių metodų. Kurie pasiektų patį objektą. Tam mums reikia `this`.

Visas šitas marazmas, beje, veikia.

Implementacija. Gink die, nedarykite niekad taip.

def call(obj, attribute_name, *args):
    function = get(obj, attribute_name)

    this_backup = this
    _builtins.this = obj
    result = function(*args)
    _builtins.this = this_backup
    return result


try:
    import builtins as _builtins
except ImportError:
    import __builtin__ as _builtins
_this = create()
_builtins.this = _this


Jeigu paimsite JavaScript. Tai toje kalboje visada yra `this` kintamasis. Visada. Net ir globalioje vardų erdvėje (namespace). Tai ir mes tokį va sukuriame. Geras? Ne? Python 2 ir 3 skiriasi, bet abu leidžia nesudėtingai šaudyti sau į kojas.

Tada `call`. Paprasta. Pernaudojame `get`, kad gauti funkciją. Nes ji gali būti ir giliau. Išsisaugojame dabartinę `this` reikšmę. Nustatome ją į einamą objektą. Iškviečiam funkciją. Gražiname prieš tai buvusį this.

Pabaiga

Kaip ir viskas. Ačiū, kad klausėte. Jeigu turite klausimų (nelabai įsivaizduoju kokių), tai mielai į juos atsakysiu.

2015 m. rugsėjo 9 d.

EuroPython 2015 Bilbao apžvalga

Kaip ir 2014 metų [1], tai ir šių metų liepos gale buvau EuroPython konferencijoje, skirtoje (neįtikėtina) Python programavimo kalbai. Tikriausiai reikia būti Python programuotoju, norint suprasti šitą įrašą. Visi kiti gali į jį žiūrėti kaip į dar vieną mano "Aš prastai piešiu" įrašą (Froidui iškiltų klausimas, kokio velnio aš tiek gyvačių pripiešiau).

Konferencija turi savo ritmą:
- Ryte ateini apsiblausęs į vietą
- Klausai pranešimus
- Pertraukose valgai bet ką, ką duoda konferencijos organizatoriai (Šiuo atveju buvo pinčos [2]. Privalgiau tiek pusėtinos kokybės pinčų, kad dar iki dabar nekenčiu jų)
- Geri kavą (nors gyvenime negeriu), nes kitaip merkiasi akys
- Geri gazuotus gėrimus
- Užpuola sąžinė, kad dieta tragiška, tai suvalgai vieną skiltelę obuolio ir išgeri vieną stiklinę vandens
- Dar pertraukose kalbi su visais kaip užkniso pinčos ir apie Python kalbą
- Vakare priliuobi vyno ir kalbi su kitais konferencijos dalyviais apie tą patį, ką kalbėjai prieš metus

Geriausiai visus pokalbius iliustruoja šis puikus Miglės Anušauskaitės komiksas:
http://ihavenoteeth.com/2015/07/12/couchsurfing/

Kalbi iki išnaktų, nes kitą dieną privalu konferencijos pranešimus klausytis apsimiegojus.

Apibendrinimas


Jeigu reiktų apibendrinti konferenciją, tai aš išskirčiau keturis punktus apie tai, ko galima tikėtis iš pačios programavimo kalbos ir jos ekosistemos netolimoje ateityje.

Lygios galimybės


Turbūt pats netechniškiausias konferencijos akcentas. Bet labai stipriai dominuojantis visos konferencijos metu. Angliškai buvo naudojamas terminas "Diversity".

Aš pats nelabai žinau, kaip iki galo į jį žiūrėti. Python bendruomenė labai aktyviai stengiasi į jos veiklą įtraukti (ale?) diskriminuojamas grupes. Didžiausias dėmesys skiriamas moterų integracijai. Tuo hipokritiškai diskriminuojant įvairias kitas mažumas (LGBT, "neprogramuotojiškos" rasės ir t.t.).

Ir iš vis, to hipokritiškumo labai daug visoje toje kovoje dėl lygybės. Pavyzdžiui, vienoje kalboje programuotoja pasakojo, kaip ją labai įžeidė kai pavadino "moterimi programauotoja" (girl programmmer), o ne tiesiog programuotoja (programmer). Tada už kelių sakinių ji pradėjo pasakoti, kad ji organizuoja PyLadies ir kad tai renginys programuotojos moterims (for woman programmers)...

Taipogi konferencijos pranešimų kokybė, mano manymu, yra truputį kritusi. Bent jau iš techninės pusės. Labai daug paprastučių ir/ar netechniškų pranešimų. Ir aš manau dėl to, kad pradedančiosios programuotojos moterys yra labai skatinamos skaityti pranešimus. Kaip pradedančiosios jos tiesiog neturi jokių galimybių prilygti labiau patyrusioms programuotojoms ar programuotojams.

Priemonės, mano nuomone, yra prastokos. Bet rezultatai yra teigiami. Visos tos kvailybės veikia -- tų galimybių visiems (ne tik moterims) atsiranda daugiau. Bendruomenė tampa atviresnė ir įvairesnė. Bet priemonės tai šleivos. Bet veikia. Dėl to aš esu už šleivas priemones, nes man patinka rezultatai. Bet jos vis tiek šleivos
(Nuo čia prasideda labiau techninė dalis
  (Bet labai padrika
    (Beje, man vienas graikas teigė, kad Guido jam sakė, kad nemėgsta LISP
      (Man tai patinka LISP)))) 

Mikro servisai

In computing, microservices is a software architecture style in which complex applications are composed of small, independent processes communicating with each other using language-agnostic APIs. [3][4]
Labai daug pranešimų apie mikro servisus. Jie nelabai daug tiesiogiai siejasi su Python. Tačiau visas servisų pasaulis panašu, kad juda link mikro servisų. Reiškia Python web servisai taip pat turės judėti link mikro servisų. Ir jau projekto/produktų (ar komponentų; ar servisų) lygmenyje konkuruoti dėl egzistencijos su likusiomis technologijomis ir programavimo kalbomis.

Ką tai reiškia Python pasaulyje? Aš apsiimsiu gana rizikingu ir nedėkingu amatu -- prognozėmis. Prie visa ko, tai tuo pačiu reiškia ir Django mirtį.

Neprivalomas tipų sistema arba tipų užuominos (type hints)


EuroPython 2014 Bob Ippolito skaitė pranešimą apie Python VS Haskell ar panašiai [5]. Vienas iš jo pasiūlymų Python buvo naudoti mypy [6], statiniam tipų analizavimui. Ir kiek galima daugiau Python kode naudoti neprivalomas (optional) tipų anotacijas. Aš tada nusprendžiau, kad jis nusišneka.

Bac už metų tas, ką jis siūlė, ima ir įvyksta. Python 3 turi tipų neprivalomą anotacijų sistemą. Ir pats Guido rekomenduoja naudoti mypy.

asyncio

This module provides infrastructure for writing single-threaded concurrent code using coroutines, multiplexing I/O access over sockets and other resources, running network clients and servers, and other related primitives [7]
Nors modulio dokumentacija teigia, kad pats modulis yra šiek tiek eksperimentinis ir Python kalbos prižiūrėtojai pasilieka teisią jį išimti, bet paklausius, kiek daug apie asyncio yra šnekama, man panašu, kad asyncio pasilieka ir kad visos aukšto lygio bibliotekos (pvz.: twisted, tornado) migruos link asyncio.


Mano klausyti pranešimai


2015-07-20: WELCOME


Labai keistas pranešimas. Organizatoriai bėdavojosi, kaip sunku buvo organizuoti. Ir taip liūdnai ir niūriai kalbėjo, kad aš pasijutau kaltas dėl to, kad iš vis atvykau į konferenciją. Tarsi, norėjosi organizatorių atsiprašyti už tai, kad sumokėjau jiems kelis šimtus eurų.

2015-07-20: Keynote: It's Dangerous To Go Alone

https://ep2015.europython.eu/conference/talks/keynote-its-dangerous-to-go-alone

DjangoGirls įkūrėjos pasakojo, kaip susitiko ir kaip įkūrė savo organizaciją. Taip pat pasakojo apie voveres ir šeškus. Šiaip tai gera ir nuotaikinga kalba apie diskriminaciją programuotojų bendruomenėse. Su pozityviu žvilgsniu į ateitį. Ir dar pareklamavo būsimą knygą Python pradedančiosioms (ir pradedantiesiems): "Yay Python!".
https://djangogirls.org/
http://yaypython.com/

2015-07-20: Asyncio Stack & React.js or Development on the Edge

https://ep2015.europython.eu/conference/talks/asyncio-stack-reactjs-or-development-on-the-edge

Pranešėjas pasakojo apie save. Pasakojo apie savo karjerą. Pasakojo apie ECMAScript 2015. Pasakojo apie React.js. Pačiam gale užsiminė, kad kuriant React.js aplikaciją kaip backend serverį galima naudoti Python su asyncio. Hmmm... Bent jau sužinojau, kad yra Python2 tulip portas (trollius):
http://www.ecma-international.org/ecma-262/6.0/
http://facebook.github.io/react/
https://pypi.python.org/pypi/trollius

2015-07-20: Python for IT specialists' tasks automation

https://ep2015.europython.eu/conference/talks/python-for-it-specialists-tasks-automation

Pranešėjas pasakojo apie įvairius įrankius, kurie skirti įvairių užduočių automatizavimui. Su Python visa tai susiję tik tuo, kad kai kurie iš jų gali paleisti Python skriptą (šalia visų kitų programavimo kalbų). Hmmm...

2015-07-20: PIP Internals

https://ep2015.europython.eu/conference/talks/pip-internals

Daugiausia pasakojo apie PIP panaudojimą. Paskui kažką lyg ir bandė pasakoti, bet nelabai įdomiai, tai ne kažką ir teatsimenu. Kas įdomesnio? Sužinojau apie wheel, kuris tarsi skirtas pakeisti .egg:
A wheel is a ZIP-format archive with a specially formatted filename and the .whl extension
Pypa (python packaging) jį irgi rekomenduoja.
https://python-packaging-user-guide.readthedocs.org
https://pip.pypa.io
https://wheel.readthedocs.org

2015-07-20: Knowing your garbage collector

https://ep2015.europython.eu/conference/talks/knowing-your-garbage-collector

Pagaliau techniškai sudėtingesnė ir įdomesnė kalba. Ir netgi tiesiogiai susijusi su Python. Keli atsitiktiniai pastebėjimai:

Sąmoningai supratau, kad Python GC turi ciklų detektorių. Kas visiškai logiška ir turbūt šiaip pats tą išmastyčiau. Bet tik pranešimo metu pirmą kartą tą suvokiau. Nes aš žioplokas.

Yra toks Python modulis, kaip gc. Tai galima daryti import gc ir daryti burtus.
https://docs.python.org/3/library/gc.html
http://gchandbook.org/
http://www-formal.stanford.edu/jmc/recursive.pdf

2015-07-20: Metrics-driven development

https://ep2015.europython.eu/conference/talks/metrics-driven-development

Pasakojo kaip jie Spotify matuoja įvairias keistesnių vartotojų elgsenos statistikas. Nelabai įstrigo šita kalba. Įstrigo tik tas faktas, kad pranešėja yra viena iš pyladies.com aktyvisčių. Ir man labiausiai įstrigo tas faktas, kad kalboje ji reklamavo pyladies ir bereklamuodama panaudojo tą patį juokelį, kurį naudojo DjangoGirls vadovės savo kalboje. Tą, kad DjangoGirls (ar pyladies) veikia visuose žemynuose, išskyrus Antarktidą. Taip. Cha, cha, cha.

2015-07-20: Sustainable way of testing your code

https://ep2015.europython.eu/conference/talks/sustainable-way-of-testing-your-code

Bazinė idėja ta, kad testus reikia rašyti tvarkingai, kaip ir visą kitą likusį kodą. Taip pat patarė naudoti visą magiją: meta klases, dekoratorius, multi-paveldėjima ir panašiai. Mano manymu: ir taip, ir ne. Taip -- nes tvarkingas kodas yra tvarkingas. Ne -- nes jeigu per daug įmantriai parašysi, tai paskui nebesigaudysi, dėl ko nepraeina: ar dėl sugedusio kodo, ar dėl prakeiktų įmantrumų. Be to, kartais kodo dubliavimas testuose labai pagerina testų skaitomumą. Kas palengvina supratimą, kodėl testas griūna.

2015-07-20: Python Multithreading and Multiprocessing

https://ep2015.europython.eu/conference/talks/python-multithreading-and-multiprocessing-concurrency-and-parallelism

Labai primityvi kalba apie gijas ir procesorius.


2015-07-20: Lightning Talks


Man pačiom įdomiausias dalykas, kurį išmokau šitose žaibiškose kalbose yra mutaciniai testai.
https://en.wikipedia.org/wiki/Mutation_testing

Idėja paprasta. Turi kodą. Turi testus. Testai padengia 100% kodo. Tada įrankis daro taip:
- Ima kodą ir jį vos vos pakeičia. Sukuria mutantą
- Praleidžia testus ir žiūri, ar testai praeina, ar ne
- Jeigu testai nepraeina, tai testai nužudė mutantą
- Jeigu leidžiant testus tiesiog nulūžtama, tai mutantas buvo nekompetentingas
- Jeigu leidžiant testus praėjo visas 100%, tai mutantas išgyveno ir turbūt reiktų pagerinti testus

Eksperimentinė Python implementacija:
http://cosmic-ray.readthedocs.org

Dar kitos šiaip įdomesnės nuorodos:
https://www.pykka.org/
https://pygame-zero.readthedocs.org/

2015-07-21: Keynote: Python now and in the future

https://ep2015.europython.eu/conference/talks/keynote-python-now-and-in-the-future

Guido kalba. Nors ir padrika, bet labai gera kalba. Kelios atsitiktinės nuotrupos, kurias įsidėmėjau:
- Ateityje tikėtini dalykai: tipų užuominos (type hints)
- Ateityje galimi teoriniai dalykai: GIL panaikinimas; Python palaikymas mobiliuose; Python palaikymas naršyklėse
- PyPy: kaip ir miręs (ar bent jau leisgyvis)
- Reikia visiems judėti prie Python 3
- Dėvėjo basutes su kojinėmis. Ačiū jam -- dabar ir aš turiu teisę taip daryti

2015-07-21: Code is not text!

https://ep2015.europython.eu/conference/talks/code-as-data-surprising-insights-we-get-when-stopping

Nu iš esmės labai sudėtingai papasakojo, kad į kodą galima žiūrėti kaip į medžio struktūros grafą. Hmmm... Nu taip, bet ne 45 minutes gi tą reikia pasakoti. Būtų užtekę pasakyti LISP ir viskas.

2015-07-21: Beyond grep: Practical Logging and Metrics

https://ep2015.europython.eu/conference/talks/beyond-grep-practical-logging-and-metrics

Visokių įrankių ir bibliotekų rinkinys. Daugiau nelabai atsimenu. Sentry, raven-python, Kibana, Grafana.

2015-07-21: Nameko for Microservices

https://ep2015.europython.eu/conference/talks/nameko-for-microservices

Pristatę Nameko. Nameko yra mikro karkasas mikro servisams. Ir tuo pačiu dar papasakojo, kas tie mikro servisai ir kaip iki jų prieiti. Pavyzdžiui, rekomendavo nuo monolitinės aplikacijos pereiti prie multilitinės (išrado naują terminą). Ir tik tada galutinai peršokti prie mikro servisų.
https://nameko.readthedocs.org/


2015-07-21: Get native with Cython

https://ep2015.europython.eu/conference/talks/get-native-with-cython-1

Cython branduolinis kūrėjas (Langlų: core developer) pristatė Cython. Tiksliau pirma ilgai ilgai reklamavo savo įmonę ir gana ilgai pristatinėjo tos įmonės darbuotojų paieškos skelbimą. Per likusį laiką bandė pristatyti Cython. Vienintelis dalykas, kuris įstrigo, tai kad Cython tipų anotacijos skiriasi nuo Python 3 būsimų tipų anotacijų.
http://cython.org/

2015-07-21: Python idioms to help you write good code

https://ep2015.europython.eu/conference/talks/python-idioms-to-help-you-write-good-code

Labai jau bazinius dalykus pasakojo. Gal naujokams ir nieko. Aš nieko iš jos nepasiėmiau.


2015-07-21: Take TDD to a new level

https://ep2015.europython.eu/conference/talks/mashing-up-pytest-coveragepy-and-astpy-to-take-tdd-to-a-new-level

Pranešėjas pristatė py.test įskiepį testmon, kuris stebi kodo pakeitimus ir praleidžia tik tuos testus, kuriuos galėjo paveikti paskutinis kodo pakeitimas. Taip sumažindamas testų paleidimo laiką nuo laiko tarpo, skaičiuojamo minutėmis, iki tarpo, skaičiuojamo sekundėmis. Skamba per gerai? Taip ir yra -- įskiepis dar nėra pasiekęs 1.0 versijos ir turi gana daug aštrių kampų. Pavyzdžiui: nemoka pastebėti C kodo pokyčių.
http://pytest.org/
https://pypi.python.org/pypi/pytest-testmon

2015-07-21: Functional Python with Mochi

https://ep2015.europython.eu/conference/talks/functional-python-with-mochi

Pristatė į Python panašią funkcinę programavimo kalbą, parašytą su Python. Kaip ir viskas gerai, išskyrus tik tai, kad pati kalba kaip ir visiškai žaislinis projektas, neturintis jokių vilčių išgyventi. Pasaulyje yra tikrai daug geresnių ir gyvesnių funkcinių programavimo kalbų. Ir Pythoniškumas funkciniai programavimo kalbai, mano nuomone, pliusų neprideda.
https://github.com/i2y/mochi

2015-07-22: Keynote: Towards a more effective, decentralized web

https://ep2015.europython.eu/conference/talks/keynote-towards-a-more-effective-decentralized-web

Kalba buvo utopiniai kairuoliški svaisčiojimai apie išsivadavimą nuo piktųjų korporacijų su decentralizuoto interneto pagalba. http://ipfs.io/


2015-07-22: Python Security & Cryptography

https://ep2015.europython.eu/conference/talks/python-security-cryptography

Labai bazinė kalba. Gali būti, kad informacija yra pasenusi, klaidinga ir gal net pavojinga. Panašiai kaip, kad gal kažkada koduoti informaciją su MD5 buvo visai nieko idėja. Bet tas kažkada jau seniai praėjęs.

2015-07-22: Type Hints for Python 3.5

https://ep2015.europython.eu/conference/talks/type-hints-for-python-35

Guido kalba apie tipų užuominas (type hints) ir tipų anotacijas. Labai rekomenduoju šitą pranešimą. Nes Python ateityje neprivalomi tipai, panašu, kad taps įprastas dalykas. Jie bus jau nuo Python 3.5 kaip eksperimentinė naujovė. Bet panašu, kad liks su visam.
https://www.python.org/dev/peps/pep-0411/
https://www.python.org/dev/peps/pep-0484/
https://docs.python.org/3.5/library/typing.html


2015-07-22: Odoo the underdog python killer app

https://ep2015.europython.eu/conference/talks/odoo-the-underdog-python-killer-app-a-python-framework-for-web-based-business-apps
Oodoo is used by 2 millions of users, although relatively unknown in the python community
Galvojau nueisiu pasižiūrėsiu, kas čia per toks populiarus, man nežinomas karkasas, turintis tiek daug vartotojų. Pasakojo, pasakojo ten apie tą karkasą ir tada lyg tarp kitko užsiminė, kad "Aij jo -- anksčiau jis vadinosi OpenERP". Ir viskas -- daugiau neužsiminė, kad tas Oodoo yra OpenERP.

OpenERP! OpenERP! OpenERP! Tiek pranešimo pavadinime, tiek aprašyme turėjo būti paminėta, kad čia prakeiktas OpenERP. Aš galvojau, kad čia bus kažkas įdomaus ir naujo. O čia bam -- nuobodybė OpenERP. Išdūrė mane su šita kalba.
https://www.odoo.com/
https://en.wikipedia.org/wiki/Odoo

2015-07-22: 12 years of Pylint

https://ep2015.europython.eu/conference/talks/12-years-of-pylint-or-how-i-stopped-worrying-and-love-the-bugs

Pylint branduolinis lydintysis (Langlų: core maintainer) Claudio pristatė pylint ir pakalbėjo apie galima pylint ateitį. Pylint yra vienas iš kiečiausių statinės kodo analizės įrankių. Labai įdomu, į ką jis atvirs, kai Python pasaulyje bus realiai pradėti naudoti kintamųjų tipai (type hints).
http://www.pylint.org/
http://www.astroid.org/

Čia nesusiję su Pylint. Bet tas pats Claudio vakarinėse konferencijos aptarimo sesijose vis visiems bandė įsiūlyti sudalyvauti Python Romania. Tai pareklamuosiu ir aš, nes nu gi kietas tas Claudio:
http://pycon.ro/


2015-07-22: Designing a scalable and distributed application 

https://ep2015.europython.eu/conference/talks/using-service-discovery-a-distributed-application

Nelabai atsimenu, ką čia pasakojo. Nelabai įdomiai matyt pasakojo. Tesu užsirašęs vieną nuorodą. Gal padės:
http://kr.github.io/beanstalkd/

2015-07-22: How to build a spreadsheet with Python

https://ep2015.europython.eu/conference/talks/how-to-build-a-spreadsheet-with-python

Nuotaikinga kalba apie tai, kaip susikurti mini ekseliuką pas save. Rekomenduoju jeigu norite suprasti, kaip veikia viena svarbiausių programų: MS Excel.

Senovėje žmonės tikėjo, kad pasaulis laikosi ant trijų dramblių. Netiesa -- pasaulis laikosi ant MS Excel ir snarglių.
https://github.com/pythonanywhere/dirigible-spreadsheet

2015-07-22: Lightning Talks


Nieko tokio įspūdingo, kaip mutaciniai testai, niekas nepapasakojo. Tai tik kelios nuorodos:

Python juokeliai:
https://github.com/judy2k/stupid-python-tricks

Kažkoks dalykas, skirtas aprašyti API
http://raml.org/

Labai dažnai konferencijoje girdėjau apie šitą įrankį. Čia kažkas apie duomenų išsilupimą analizei:
http://scrapy.org/

(2015-07-23 sėkmingai pramiegojau konferencijos pradžią. Kodėl? O vat todėl, kad saikas yra dorybė ir dorybėmis ne visi vienodai apdovanoti)

2015-07-23: Better asynchronous code with Tornado and Python 3 

https://ep2015.europython.eu/conference/talks/better-asynchronous-code-with-tornado-and-python-3

Kaip priversti Torando naudotis ne savo vidiniu įvykių ciklu, bet perpanaudoti asyncio įvykių ciklą. Tada galima naudoti yield konstruktą.
Nelabai ką atsimenu, tai įtariu nykoka kalba.

2015-07-23: Fuzzing and property based testing

https://ep2015.europython.eu/conference/talks/testing-with-two-failure-seeking-missiles-fuzzing-and-property-based-testing

Pristatė kelis įrankius skirtus Python neapibrėžtam testavimui (Fuzz testing). Kitaip nei unit testai, neapibrėžto testavimo metu ne programuotojas pateikia įvesties duomenis, o pats testavimo karkasas prigeneruoja daug, daug įvairių atsitiktinių (ar iš dalies atsitiktinių) įvesties variantų ir bando nužudyti testuojamą kodo vietą. Įdomi kalba. Gale dar pristato C įrankį, kurį galima perpanaudoti Python kodo testavimui.
https://en.wikipedia.org/wiki/Fuzz_testing
https://hypothesis.readthedocs.org/
http://lcamtuf.coredump.cx/afl/
https://wiki.haskell.org/Introduction_to_QuickCheck2

2015-07-23: Randomized data generation for robust unit testing

https://ep2015.europython.eu/conference/talks/whats-the-fuzz-all-about-randomized-data-generation-for-robust-unit-testing

Iš esmės beveik tokia pati kalba, kaip ir prieš tai klausyta. Apie neapibrėžtą testavimą. Kadangi man pati idėja labai patinka, tai aš nesigailiu, kad išklausiau abi. Šiaip turbūt užtektų klausyti tik vienos.

2015-07-23: Diversity: We are not done yet

https://ep2015.europython.eu/conference/talks/diversity-we-are-not-done-yet

Spotify programuotoja (ta pati, kur anksčiau laidė juokelius apie Antarktidą) pasakojo įkvepiančią (bent jau taip supratau iš kitų klausytojų reakcijos) kalbą apie tai kaip diskriminuojamos moterys ir kaip galima su tuo kovoti.

Man labiausiai įsiminė, kad ji į galą pradėjo daug keiktis. Tai paskui likusią konferencijos dalį mes irgo tarpusavyje pradėjome daug keiktis imituodami pranešėją.

Nors pranešimo idėjos geros, bet nu jeigu juokinga, tai juokinga.

2015-07-23: What it's really like building RESTful APIs with Django

https://ep2015.europython.eu/conference/talks/what-its-really-like-building-restful-apis-with-django

Kiek pamenu, tai darė nevykusį "Django Rest Framework" apmokymą.

2015-07-23: Through the lens of Haskell: exploring new ideas for library design

https://ep2015.europython.eu/conference/talks/exploring-the-haskell-ecosystem-to-bring-back-some-ideas

Labai entuziastingai pasakojo. Bet nežinau ar dėl stipraus prancūziško akcento, ar dėl to, kad aš priedurnis, ar dėl to, kad pranešimas padrikas; tačiau aš nelabai ką supratau.

2015-07-23: Antipatterns for Diversity

https://ep2015.europython.eu/conference/talks/antipatterns-for-diversity-stop-doing-the-same-thing-but-expecting-different-results

Moteris, kuri anksčiau buvo vyras, pasakojo apie lygias galimybes. Tikrai netechniškai kalba. Lygių galimybių sąvoka šitoje kalboje pagaliau buvo naudojama ne tik vienos lyties, bet ir kitų diskriminuojamų grupių galimybėms palyginti. Kalboje berods nebuvo nei vieno keiksmažodžio.

2015-07-23: Lightning Talks


Labiausiai įstrigo tai, kad lenkai apsimelavo. Reklamuodami savo PyconPL, jie teigė, kad Lietuvoje PyconLT šiemet buvo rengiama pirmą kartą (Iš tikro pirmą kartą buvo rengiama 2009). Nepaisant melo, aš vis tiek myliu lenkus ir jiems reikia leisti rašyti vardus lenkiškomis raidėmis.
http://pybenchmarks.org/
http://pl.pycon.org/2015/index.html
http://pycon.lt/2009.html
https://pypi.python.org/pypi/manhole

2015-07-24: Keynote: So, I have all these Docker containers, now what?

https://ep2015.europython.eu/conference/talks/keynote-so-i-have-all-these-docker-containers-now-what

Pristatė Google Kubernetes. Tai tarsi alternatyva Apache Mesos. Aš nelaibai šituose dalykuose gaudausi. Kažkiek intuityviai suvokiu, bet ne tiek, kad anglišką wikipedia apibrėžimą parašyčiau suprantama lietuvių kalbą. Dėl to jums teks internete pasiieškoti informacijos patiems.

Kalba nepatiko, nes pranešėja nebuvo pasiruošus. Tik pirmose keliose skaidrėse buvo parašyta Python. Visur kitur buvo parašyta PHP. Kas reiškia, kad ji keliauja per visas konferencijas iš eilės ir reklamuoja Google Kubernetes.
http://kubernetes.io/
http://mesos.apache.org/
http://research.google.com/pubs/pub43438.html

2015-07-24: Surviving the awkward adolescence of a microservices-based application 

https://ep2015.europython.eu/conference/talks/arrested-development-surviving-the-awkward-adolescence-of-a-microservices-based-application

Pasakojimas kaip Yelp pakeitė savo monolitinę aplikaciją į mikro servisus. Paskutinė konferencijos diena, tai aš buvau jau šiek tiek išsekęs ir nelabai dėmesingas ir nieko neatsimenu.

Kažkokia įdomesnė nuoroda. Protokolas/įrankis kaip aprašyti savo REST API formalia kalba:
http://swagger.io/

2015-07-24: Big Data with Python & Hadoop

https://ep2015.europython.eu/conference/talks/big-data-with-python-hadoop

Pranešimas gal ir turėjo būti įdomus, bet moderatorius viską sugriovė. Likus 20 minučių iki pranešimo pabaigos pranešėjui pasakė, kad liko 5 minutės. Tas tada pradėjo šokinėti tarp skaidrių ir pasakė išvadas. Tada moderatorius išsiaiškino, kad liko dar 15 minučių, pranešėjas bandė tęsti pranešimą. Bet visiška marmalynė gavosi.

2015-07-24: Demystifying Mixins with Django

https://ep2015.europython.eu/conference/talks/demystifying-mixins-with-django

Labai paprastutė kalba apie multi paveldėjimą ir kaip tą panaudoti Django karkaso aplikacijose.
https://github.com/brack3t/django-braces

2015-07-24: FOSS DOCS 101 (keep it simple, present!)

https://ep2015.europython.eu/conference/talks/foss-docs-101-keep-it-simple-present

Profesonali dokumentacijos rašytoja pasakojo, kaip rašyti dokumentaciją. Geri patarimai, bet man buvo baisiai nuobodu. Bet jeigu būčiau kreipęs dėmesį į jos patarimus, tai netgi šis mano įrašas būtų aukštesnės kokybės.

2015-07-24: Writing Domain Specific Languages with Python 

https://ep2015.europython.eu/conference/talks/the-unabridged-guide-to-domain-specific-languages-in-python

Ir netikėtai pačiam gale pasisekė išgirsti, mano manymu, patį geriausią konferencijos pranešimą. Apie tai, kaip su Python kurti specialiąsias kalbas, tinkamas tik tam tikrai specifiniam sričiai.

Labai rekomenduoju.

Kalbą galima skirstyti į dvi dalis. Pirma, apie tai, kaip panaudoti pačią Python sintaksę ir meta programavimo įrankius, norint sukurti specialiąsias kalbas, kurios galiausiai yra validus Python kodas. Antra, dalis apie Python bibliotekas ir įrankius, bet kokios kalbos interpretatoriaus kūrimui.
https://www.python.org/dev/peps/pep-3115/
https://www.python.org/dev/peps/pep-0343/
https://docs.python.org/3.5/library/ast.html
http://www.dabeaz.com/ply/
http://dinosaur.compilertools.net/

2015-07-24: Closing


Vėl depresinis pasakojimas, kaip buvo sunku organizuoti ir paimti iš mūsų, dalyvių, tuos eurus. Vėl vertė visus jaustis kaltais, kad tie dalyvauja EuroPython konferencijoje. Ir tada paskelbė, kad kitais metais konferencija vėl vyks Bilbao ir jie ją vėl organizuos.

[1] http://petraszd.blogspot.com/2014/08/europython-2014-apzvalga-sau.html
[2] https://en.wikipedia.org/wiki/Pincho
[3] http://martinfowler.com/articles/microservices.html
[4] https://en.wikipedia.org/wiki/Microservices
[5] https://ep2014.europython.eu/en/schedule/sessions/121/
[6] http://mypy-lang.org/
[7] https://docs.python.org/3/library/asyncio.html

2015 m. liepos 17 d.

#Vilniusleak ir maudymosi kostiumėliai

(Čia bus apie #Vilniusleaks ir apie "Air Lituanica". Bet pradžioje bus apie pusnuoges moteris)

Artėja vasaros savaitgalis. Naujienų portaluose vėl pasipils lyg ir straipsniai, lyg ir apie orą, lyg ir apie pajūrį, bet iš esmės tai priedanga, leidžianti privarširuoti naujienų portalus nuotraukų albumų su jaunomis moterimis, dėvinčiomis maudymosi kostiumėlius. Kad nebūtų visiškai akivaizdu, bus pridėta apie 20% vyrų ir/ar nelabai jaunų moterų nuotraukų.

Aš turiu klausimą, į kurį pats nelabai galėčiau atsakyti: ar yra moralu vartyti tuos nuotraukų albumus? Nesupraskite manęs klaidingai, aš mėgstu pusnuogių merginų nuotraukas (Kažkaip labai negalantiškai skamba toks pareiškimas). Bet. Mergina eidama į paplūdimį susitaiko su tuo, kad ji ten išsirengs ir paplūdimyje esantys kiti žmonės galės ją tokią pamatyti. Tuo tarpu ji tikriausiai nesitiki, kad kai ji gulės ant pilvo kur nors kopose trūkus nuo apyšilčio sidro ir karščio smūgio, tai kažkas nufotografuos jos mažai pridengtą užpakalį ir ta nuotrauka iliustruos straipsnį: "Savaitės pradžioje artėja atšalimas". Dar tas straipsnis kabos kurioje nors didžiųjų naujienų portalų svetainėje kelias dienas.

Aš suprantu, kad kaip ir legalu fotografuoti, nes vieša vieta. Bet aš nežinau, ar ta mergina tikėjosi, kad visokie kompiuterių žiurkės (kaip kad aš) galės spausti "dedenasi" ant jos nuotraukos ir skaičiuoti apgamus ant kairio jos sėdmens. Kaip taip parašau, tai kažkaip creepy gaunasi. O gali būti, kad aš čia ieškau šiknoj razinų ir viskas čia gerai.

Aš žinau, kad yra privatumo/moralumo riba. Tik nežinau, ar tokios nuotraukos tą ribą peržengia. Tikriausia ne -- nereikia būti čia labai didelėmis davatkomis. Kita vertus, aš nesu moteris. Ir manęs visuomenė nespaudžia turėti gražų užpakalį ir gerai mokėti elgtis virtuvėje ten su tais visais įkaitinamais baldais, kad ir kaip jie ten vadintųsi.

O už privatumo ir moralumo ribos aiškiai papuola, tarkim, išviešintos privačios nuogų įžymybių nuotraukos [*][1].

Va čia aš prieinu neseniai Edmundo Jakilaičio paviešintą informaciją apie "Air Lituanica" [2] [3] [4] (Autorius, berods, A.Tapinas). Ir mano klausimas yra toks: ar moralu skaityti viešų žmonių privačius pokalbius?

Išviešinta (spėkit, ar neperskaičiau) informacija manęs neįtikino, kad nereikėjo uždaryti "Air Lituanica". Aš nesu oro linijų uždarymo/neuždarymo specialistas. Nesu ir verslo pasiūlymų specialistas. Aš tikrai nežinau, kiek tas verslo pasiūlymas yra nutolęs nuo verslo pasiūlymų, kuriuos aš gaunu iš įvairių kilmingų Nigerijos piliečių.

Kadangi jau perskaičiau, tai belieka kitas klausimas: ar aš turiu teisę vertinti politikus pagal jų privačių susirašinėjimų fragmentus?  Kurie, beje, gražiai ir tikslingai dozuojami. Su pauzėmis -- tikintis, kad meras Šimašius tų pauzių metu, ką nors prisimeluos ir kad tą melą paskui demaskuos kitas susirašinėjimų fragmentų išviešinimas [**].

Ar aš turiu leisti politikams privačiuose pokalbiuose kalbėtis, kaip jei nori ir nevertinti jų pagal tuos jų privačius pokalbius. Nes: (A) tie pokalbiai buvo skirti ne man; (B) aš nežinau tų pokalbių konteksto.

Jeigu žmogus privačiuose pokalbiuose retkarčiais nenusikeikia; nepasako nieko ciniško; nevykusiai nepajuokauja  ar nė kart nenusišneka, tai tikriausiai toks žmogus yra sociapotas ir aš tikrai nenoriu, kad jis būtų politikas ir/ar kad jis dirbtų įtakingame poste.

Viešumoje yra privatūs el. susirašinėjimų fragmentai, kurie sudaro įspūdį, kad meras rūpinosi tik viešaisiais ryšiais ir visai nesirūpino nei mokesčių mokėtojų pinigais, nei (o dievulėliau!) PAPRASTU žmogumi. Aš tarsi turėčiau pasirinkti nekreipti dėmesio į tai, nes tas pokalbis yra skirtas ne man ir nežinodamas konteksto aš galiu jį visiškai netinkamai suvokti. Plius, aš dar galiu būti manipuliuojamas šaltinio, kuris viešina ne visą informaciją, o tik fragmentus.

Aišku, yra didelis "Jeigu". Aš paprastai balsuoju už Liberalų sąjūdį. Aš niekad nebalsuoju už Socialdemokratų partiją. Jeigu aš pasirenku ignoruoti, ką privačiuose pokalbiuose kalba/rašo Šimašius, tai aš tuo pačiu turiu pasirinkti nekreipti dėmesio į tai, ką pusgirtis Krasnickas prikalbėjo savo žymiajame privačiame pokalbyje [5]. Bet aš noriu kreipti dėmesį į Kransnicko sapaliones. Ir aš kreipiu. Ir aš pagal jas (bet ne vien tik pagal jas) vertinu tiek Krasnicką, tiek visą Socialdemokratų partiją.

Sunku neturėti dvigubų standartų. Situaciją gelbsti tas dalykas, kad Krasnickas savo pokalbiuose panašu, kad grasino pokalbio įrašinėtojai ir jos vaikui. Kas yra realus nusikaltimas.

Tai aš pasirenku ignoruoti šituos Vilniusleak susirašinėjimus. Su sąlyga, kad nepaaiškės niekas nusikalstamo. Bet čia pagal nutylėjimą taip turėtų būti. Čia panašiai, kaip sakyti, kad aš prekybos centre pirksiu pieno, bet tik su sąlyga, kad į pakelį joks pardavėjas nebus privėmęs. Ir pasirenku laikyti Krasnicką chamu. Netgi kenksmingu chamu.

Beje, į naujienų portalų pateikiamus nuotraukų albumus, pavadintus kažkas tokio kaip: "-aitė ar tai -ienė išdrįso pasirodyti naujame amplua pikantiškoje fotosesijoje" tai manau, kad moralu žiūrėti, nes fotosesijų dalyvės puikiai supranta, ką daro. Plius, užphotoshopina taip, kad nei vieno apgamo nesimato.

----

[*] Jeigu jums atrodo, kad galima žiūrėti ir kad "jeigu nenori, kad matytų, tai tegu nesifotografuoja", tai jūs klystate. Kad fiziškai gali kažką atlikti, tai dar nereiškia, jog čia viskas gerai. Aš jums pateiksiu žiauroką pavyzdį: vien tas faktas, kad jūs turite pakankamai fizinės jėgos ir kovos menų įgūdžių pagauti gražią merginą, ją nurengti ir stebeilintis į ją nuogą kelias minutes, tai tas dar nereiškia, kad bus viskas gerai, jeigu taip ir padarysite. Ir kad tada nereiktų jūsų uždaryti į kalėjimą. Kad jums tą patį galėtų atlikti jūsų kameros draugai.

[**] Kiek žinau, apsimelavimas dar neįvyko ir aš manau, kad neįvyks. Ir, beje, aš neteigiu, kad Jakilaitis kažkuo blogas. Žurnalistų darbas yra tarkuoti politikus. Ir visi, dabar pykstantys ant Jakilaičio, jį šlovintų ir vadintų žurnalistikos dievu, jeigu anas tą patį būtų padaręs ne su Šimašiumi, o su, pavyzdžiui, Bradausku.

----

[1] http://www.theguardian.com/world/2014/sep/01/nude-photos-of-jennifer-lawrence-and-others-posted-online-by-alleged-hacker
[2] http://simasius.popo.lt/2015/07/16/truputis-konteksto-vilniusleaks-istorijai/
[3] https://www.youtube.com/watch?t=57&v=SF4OmiBCMmE
[4] http://thewallmachine.com/j8aqDo.html#.Vad4EmTRsnJ.facebook
[5] http://www.delfi.lt/archive/nuzdinsiu-milijona-minimum-kiek-galiu-krtis-uz-ta-susta-lietuva-ar-tai-gali-buti-mero-zodziai.d?id=67111286

2015 m. liepos 9 d.

Mano įnašas į blogerių savireklamos savaitę

Rokiškis inicijavo blogerių savireklamos savaitę [1]. Tai man dabar puiki proga, ką nors parašyti į savo apleistą blogą. Pagrindinė priežastis, kodėl aš jau pakankamai ilgai nesugebėjau parašyti jokio įrašo yra ta, kad aš esu tinginys. O pagrindinis pasiteisinimas, kurį aš naudojau prieš save yra tas, kad "aij -- neturiu apie ką rašyti".

Tai va 12 blogų, kuriuos aš rekomenduoju. Eilės tvarka atsitiktinė.

Rokiškis Rabinovičius
http://rokiskis.popo.lt/

Turbūt vienintelis personažas (turbūt pseudonimas sakyti būtų teisingiau), kurio paminėjimas moksliniame eksperimente surinktų 100% balų.

O tas mokslinis eksperimentas būtų toks:
- Surenki žmones
- Vardini visokius žinomus žmones (ar žiurkėnus) ir/ar jų pseudonimus
- Paprašai prie kiekvieno parašyti po tris asociacijas
- Jeigu tarp asociacijų yra žodis "blogas", "blogosfera" ar pan., tai pridedi vieną balą
- Jeigu ne, tai nulį

Jurodivai

http://www.jurodivai.lt/

Daug autorių rašo šitą blogą. Aš stengiuosi skaityti. Neretai nesuprantu, ką skaitau, nes trūksta tiek proto, tiek išsilavinimo. Vis tiek skaitau.

Aš daktaras, aš žinau
http://emilija.popo.lt/

Anksčiau frazė "geras daktaras" mano galvoje sukurdavo vyriškio su chalatu vaizdinį. Nes aš garantuotai esu seksistas. Pradėjus skaityti Emilijos (ir Enorcos) blogą dabar galvoja susikuria daktarės moters vaizdas.

Enorca

http://enorca.blogspot.com/

Kaip čia geriau paaiškinti, kodėl reikia skaityti. Nu... Kiekvienas įrašas gali būti sudarytas iš kokių 7-ių totaliai skirtingų temų. Ir jame nebus jokių minties šuolių. Ir viskas skaitysis kaip vientisas nuoseklus tekstas.

I Have No Teeth
http://ihavenoteeth.com/

Geriausia komiksų piešėja Lietuvoje. Ir visi greitai einate pirkti jos ir knygos dabar pat: http://www.patogupirkti.lt/knyga/10-litu-Grafine-novele.html. Nes Miglė privalo tapti turtinga. Kitaip pasaulis bus neteisingas.

Comics by Gerda Jord
http://gerdajord.blogspot.com/

Jeigu "I Have No Teeth" komiksai yra geriausi šiaip. Tai Gerdos komiksai yra geriausi tam tikroje kategorijoje.

Toje kategorijoje gerumas vertinamas tokiu algoritmu:
- Peržiūri komiksą
- Palauki bent jau penkias minutes
- Peržiūri komiksą dar kartą

Taip skaitant komiksus, Gerdos komiksai yra geriausi. Net geresni už Miglės (Kai lygindamas ir tą, ir aną privalai skaityti dukart).

Jums irgi reikia pirkti Gerdos knygą: http://www.patogupirkti.lt/knyga/10-litu-Grafine-novele.html. Nes Gerda turi turtėti, kaip ir Miglė.

Pamiršta.lt
http://pamirsta.lt/

Kažkaip jaučiu silpnybę apleistų pastatų tiek nuotraukoms, tiek piešiniams, tiek kitiems meno kūriniams (pvz.: kompiuteriniai žaidimai).

Ir beveik garantuoju, kad vieną dieną atsidursiu policijos įskaitoje, nes netyčia įsilaušių į kokį pusiau apleistą kokios nors bobutė skladuką. Ir vedamas policijos aiškinsiu: "Jūs neturite teisės, aš urbaninis aksploireris". Tiesiog aš norėsiu būti toks kietas, kaip Pamiršta.lt komanda, bet trūks tiek įgūdžių, tiek elementaraus supratimo apie tai, ką darau.

Vitalijaus Michalovskio blogas
http://mvitalijus.blogspot.com/

"Istorijos įdomybių" autoriaus asmeninis blogas. Ilgesni tekstai. Kartais yra subjektyvumo nesutinkamo įdomybėse.

Leo Lenox
http://www.leolenox.com

Nevisada suprantu, ką perskaitau. Bet kai perskaitau jaučiuosi protingesnis. Tai ir skaitau.

Ingrida Šimonytė
http://simonyte.popo.lt/

Čia turbūt vienintelis blogas, kurį skaitydamas aš išjungiu muziką, jeigu klausomoj muzikoje yra per daug vokalo. Kad netrukdytų skaityti.

Visų kitų blogerių reiktų atsiprašyti, nes jeigu aš skaitau jų tekstą ir tuo metu klausomoje muzikoje kas nors gerai plėšia priedainį, tai aš irgi pradedu kriokti dainos žodžius ir pusė teksto būna perskaityta atmestinai.

Auksiniai berniukai

http://www.pinigukarta.lt/podcasts/auksiniai-berniukai

Aš esu senovinis žmogus. Dėl to aš nepripažįstu jokių "Podcast'ų". Aš vietoje šito termino naudoju "audio blogas". O Auksiniai berniukai yra geriausias audio blogas Lietuvoje.

Skirmantas Tumelis
http://www.skirmantas-tumelis.lt/

Jeigu reiktų paaiškinti, kodėl skaitau šitą blogą, turbūt sugalvočiau kokią protingą priežastį. Bet ji būtų melas.

Aš šitą blogą skaitau, nes paskaitęs kažkaip pradedu labiau tikėti žmonija. Negaliu paaiškinti kodėl.


O pabaigai aš prižadėsiu, kad dažniau rašysiu į savo blogą. Kadangi esu jau tą prisižadėjęs bent jau kelis kartus, tai nepamaišys dar kartą pažadėti.


[1] http://rokiskis.popo.lt/2015/07/07/blogeriu-savireklamos-savaite/

2015 m. gegužės 5 d.

PyConLT 2015: Mano atviro kodo veikla

Mano pranešimo, sakyto PyConLt [0] 2015 metu tekstas. Kadangi teksto mintinai nesimokinau, tai jis šiek tiek skiriasi nuo to, kurį realiai pasakojau.

[0] http://pycon.lt/

Skaidrės:


Įžanga

Šiandieną aš jums šiek tiek papasakosiu apie savo atviro kodo veiklą. Tiksliau kažkurią jos dalį. Pradžioje norėjau temą pavadinti "Mano atviro kodo veikla arba vieno atnaujinimo istorija". Bet tokia tema atsiduoda klišiniu sovietinių laikraščių pavadinimu.

Dar norėjau pavadinti pagal Lietuvos žiniasklaidoje įprastas pavadinimų konstravimo gaires. Ką nors tokio, kaip "Programuotojas pabandė dalyvauti Django ekosistemoje ir neslėpdamas agonijos nustebo". Bet paskui nusprendžiau, kad gal kiti neskaito tiek daug Lietuvos naujienų portalų kaip aš. Tai palikau pretenzingą pavadinimą "Mano atviro kodo veikla".

Apie ką

Šitas pranešimas bus nelabai techniškas. Jis bus apie tą "vieno atnaujinimo istoriją", kurios paminėjimo neliko pavadinime.

Tai bus istorija apie mano vieną kodo pakeitimą, kuris galiausiai pateko į Django kodo bazę. Ta istorija turės įrodyti, kad prie atviro kodo projektų (net ir tokių svarbių ir garsių kaip web karkasas Django) gali dirbti ir gana nestabilios... Ir nevisai stabilių ir ne visada adekvačių poelgių žmogus. Toks kaip aš. O jei jau galiu aš, tai reiškia, kad jūs tai jau tikrai galite. Žinoma, neprivalot.

Atnaujinimas

Štai čia ir yra visas tas mano Django kodo atnaujinimas. Apie kurį aš jums papasakosiu.

Jo. Šita viena raidė. Aš pasakosiu apie vieną raidę.

EuroPython 2014

Istorija prasideda 2014-aisiais metais. Aš buvau EuroPython 2014 konferencijoje. Man patiko. Konferencija trunka 7 dienas. 5 pirmos konferencijos dienos yra pranešimų dienos. Paskutinės 2 konferencijos dienos yra skirtos atviro kodo projektų sprintams.

Kodo sprinto apibrėžimas. Tai nėra, kad gale konferencijos visiems moksliukams-programuotojams liepia greitai bėgti trumpas distancijas. Ir visi geek'ai ir kompiuterastai bėga suplūkę ir šnopuoja. O žiūrovai rodo pirštais, juokiasi ir už gerą reginį aukoja pinigus atviram kodui. Ne. Kodo sprintai nėra tai.

Atviro kodo sprintas šiek tiek primena SCRUM sprintą. Tai grupės žmonių susibėgimas (virtualiai ar gyvai) ir bendras darbas ties kažkokiu projektu ar projekto dalimi. Apibrėžtas laike. Tarkim, EuroPython 2014 būna 2 dienos.

Labai gerai dalykas. Tokia svarbi konferencija kaip EuroPython beveik garantuoja, kad bus projektų core programuotojai. Ir jie galės padėti įsivažiuoti ir greitai priimti pakeitimus.

Kas labai svarbu pradedantiesiems, nes labai lengva numušti entuziazmą, ilgomis laukimo pauzėmis.

Django kodo sprintas: nuorodos

Dabar pauzė istorijoje. Dabar aš šiek tiek supažindinsiu jus, kaip pradėti krapštytis prie Django projekto.

Dokumentacija. Django laimi dėl dokumentacijos. Tarkim, kartais sunku Python naujokui, norinčiam pradėti dirbti prie internetinių projektų, rekomenduoti ką nors kito nei Django. Ne dėl to, kad aš manyčiau, jog Django yra geriausias web karkasas. Beje, aš nemanau, kad jis geriausias.

Tačiau aš vis tiek rekomenduočiau Django. Dėl vienos paprastos priežasties. Dokumentacija. Jie turi turbūt vieną iš geriausią dokumentacijų. Bet kokio programavimo projekto. Ar tai būtų komercinis, ar atviro kodo.

Tas pats ir su pradėjimu užsiminėt atviro kodo veikla. Django dokumentacija valdo. Joje yra apmokymas (turorial'as), kaip dirbti prie Django kodo bazės.

Taip. Pažingsninis apmokymas.

Tai antra nuoroda sąraše. Pirma yra bendrinis dokumentacijos puslapis.

Aš tą apmokymą rekomenduoju perskaityti ir įvykdyti visiems, norintiems pradėti dirbti prie atviro kodo projektų, bet vis nepradedantiems, nes kažkaip neaišku, nei kaip čia pradėti, nei ko griebtis.

Net jeigu ir neketina dirbti prie Django. O gal net jeigu ir neketinate dirbti su Python iš vis.

Sekančios nuorodos.

Trečia yra Django Trac užduočių valdymo sistema. Ale Redmine. Ale Bugzilla. Ale Asana. Ar kas dabar ant bangos.

Dashboard. Čia yra tiek greitos nuorodos į tam tikrus django trac filtrus (tarkim, easy tickets), tiek šiokios tokios ataskaitos apie Django kodo progresą netolimoje praeityje.

Paskutinė nuoroda yra pakankamai sunkiai surandama. Tai yra Django Jenkins sistema. Ten galima pažiūrėti visokias nuolatinės integracijos ataskaitas. Tokias kaip kodo bazės padengimas testais. Prie šitos ataskaitos, beje, grįšiu savo istorijoje.

Django kodo sprintas: aš


Kalbant apie istoriją.

EuroPython 2014 metu aš prisijungiau prie Django sprinto. Pirma užduotis, kurią apsiėmiau, tai patobulinti dokumentaciją. Ji man buvo parekomenduota vieno Django core programuotojų.

Susikūriau Django užduočių sistemoje Trac užduotį. Parašiau ten kelis kažkokius sakinius. Žinot, pagal visą Langlų [1] kalbos tradiciją. Kiekvienas doras Langlų ekspertas posakį "Nepūsk arabų" verstų į "Don't blow arabians" ir drąsiai naudotų jį kalbėdamas su anglakalbiu.

Sukūriau prašymą įtraukti mano pakeitimus į einamą Django kodo versiją. Nu gerai -- sukūriau pull request'ą į masterį.

[1] https://eglemarkeviciute.wordpress.com/2015/04/09/langlu-kalba-weird-sounding-lithuanian-proverbsnsayings/

Tada. Tada. Kažkas paėmė tą mano pull request'ą. Pataisė mano pagal Langlų notaciją parašytus angliškus sakinius į suprantamus angliškus sakinius. Parašė man: "Ačiū -- gerai padirbėjai". Taip ir neišsiaiškinau ar ironiškai, ar ne. Ir įliejo realiai savo -- o ne mano -- tekstą į master kodo atšaką.

Tai dabar git blame ten rodo to kito programuotojo inicialus.

Supratau, kad dokumentaciją rašyti dar ne su mano įgūdžiais. Dėl to pradėjau taisyti tikro kodą.

Susiradau Django Trac paprastą klaidą. Kažkas apie django.forms.ImageField. Atsižymėjau, kad aš prie jos dirbu. Pasirašiau unit testą, kuris nepraeina.  Pataisiau kodą. Testas praeina. Valio! Sukūriau prašymą įlieti mano kodą.  Kažkas iš turinčių teises, pirma pasakė: "nu, nu, nu -- pirma suspausk commit'us į vieną, o tik po to kurk pull request'ą". Tada pats suspaudė mano atnaujinimus į vieną ir įkėlė mano kodą į Django master.

Suspausti atnaujinimus į vieną

Kartais atviro kodo projektuose (ir netik) yra reikalavimai, kad į master giją kiekvienas funkcinis atnaujinimas būtų įliejamas kaip vienas commit'as, o ne N commit'ų.

A) Taip lengviau sekti pakeitimus
B) Taip lengviau atstatyti seną versiją

Norintys žinoti kaip tai padaryti, pasiieškokite git rebase --interactive.

Bitcoin

Kaip ir minėjau, mano atnaujinimas buvo įkeltas į Django kodo bazė.

Ir gavau bitkoinų. Nes yra toks projektas kaip tip4commit. Kur kažkas gali aukoti bitkoinus atviro kodo projektams. O jau tada tas tip4commit paskirsto visiems dirbantiems prie to projekto.

[2] https://tip4commit.com/

Taigi, aš gavau nulis kablelis nulis nulisnulisnulislislisnulis N bitkoinų. Bet jų man tas tip4commit portalas neleidžia išsiimti. Nes reikia pasiekti kažkokią minimalią ribą. Minimalų kiekį. Kada jau leidžia išsiimti.

Čia reikia priminti, kad buvo gūdūs 2014 metai kai visos kriptovaliutos buvo dar ant bangos. Pvz.: Login 2014 konferencijoje buvo daug pranešimų apie kriptovaliutas. Šiemet įtariu bus viso 0 pranešimų.

Taip pat, reikia paminėti, kad pats tip4commit nėra vertinamas vienareikšmiškai. Kažkuri dalis projektų nenori būti su juo asocijuojami. Plius, yra įtarimų, kad pats projektas yra arba nelegalus, arba ant legalumo ribos. Ir dar kai kurie jį kaltina piniginėmis machinacijomis. Nes projekto savininkai gali būti, kad pasisavina dalį paaukotų pseudo-pinigų. Kas būtų visiškai neįtikėtina, nes kur gi girdėta, kad bet koks projektas susietas su bitkoinais būtų neskaidrus.

Šitie faktai, aišku, man visiškai nesutrukdė, nes aš apie juos tada dar visiškai nežinojau.

Taigi, aš ale gavau tų bitkoinų ir nusprendžiau, kad man, kaip kompiuterastui būtų į naudą su jais pasižaisti ir susipažinti iš techninės pusės.

Tai aš buvo sugalvojęs, kad man reikia kažkaip gauti ten tų bitkoinų ir tip4commit būtų puikus būdas.

Turtėjimo planas

Taigi, prieš pradėdamas turtėti, aš ne tik kvailai neišsiaiškinau projekto skaidrumo. Tuo pačiu aš dariau klaidingą prielaidą apie patį bitkoinų dalinimo algoritmą.

Aš dariau prielaidą, kad bitkoinus duoda pagal kodo atnaujinimo eilučių skaičių. O pasirodo, kad duoda tiesiog pagal commit'ų skaičių.

Remdamasis savo kvaila prielaida aš sugalvojau, kaip greitai praturtėti. Man tiesiog reikia prirašyti daug kodo.

O kur šiek tiek pro pirštus yra žvelgiama į logikos dublikavimą?

Turtėjimo planas: Unit testai

Unit testai. Čia žinoma filosofinis klausimas, bet rašant unit testus lyg ir galima dublikuoti eilutes. Man asmeniškai patinka, kai atsidarai unit testo kodo ir pačioje testo funkcijoje ar metode matai viską:

- Pradines sąlygų sukūrimas
- Testuojamos dalies paleidimas
- Visos assertFoo komandos

Dėl to, jeigu pavyzdžiui, turi 4 testus, kurie testuoja tą patį funkcionalumą, tie 4 testai turės labai panašų kodą, kurį būtų galima vadinti kodo dublikavimu. Ir tarsi reiktų iškelti į atskirą metodą. Bet tada testai taps mažiau suprantami. Trumpai, filosofinis klausimas.

Kaip jau minėjau, Django turi savo Jenkins serverį. Kuris prie visa ko leidžia testus ir generuoja kodo padengimo testais ataskaitas.

Taigi, aš susiradau django.contrib.admin Meta klasės opcijų validacinį modulį, kurio padengimas testais buvo labai mažas ir pradėjau jam rašyti unit testus.

Rašiau, rašiau

Rašiau, rašiau. Prirašiau kelis šimtus eilučių. Pamiršau aš tuos ir bitkoinus. Neberūpėjo jau man jie. Nes radau kitą skaičiuką. Ant kurio galima, kaip ant heroino kabliuotis. Tą procentą, kuris rodo kiek failas yra padengtas testais. Buvo 63% dabar yra 65%. Dar, dar reikia dar procentų.

Berašydamas turėjau nemažai pasiknaisioti po Django: tiek .contrib.admin tiek pačią šerdį (taip verčiu core. Šerdis), kad suprast, kas per velnias dedasi.

Rašiau be reikalo

Ir besiknaisiodamas radau įdomią kodo vietą. Ji teigė, kad tas modulis, kuriam unit testus aš rašau, bus apleistas (depreciated) ir ištrintas. Taigi nebeliko prasmės rašyti testus.

Beje, jau master gijoje jis yra ištrintas.

Bet

Bet. Už tai berašydamas testus, aš radau vieną tikrą klaidą.

Kodas turėtų mesti ValueError. Jis ir meta ValueError. Bet meta ne dėl to, kad Django kodas prašo mesti ValueError.

ValueError yra metamas giliau. % metodas gauna per didelį kiekį parametrų ir lūžta su ValueError. Taigi turime ValueError su blogu message atributu. Ir stack trace gauna papildomą frame'ą.

Kodo atnaujinimas

Atsimenate atnaujinimą.

Taigi, aš susikūriau sau užduotį pataisyti tą vietą. Ir prirašiau realiame kode tą vieną raidę. Dabar Django kodo bazė yra truputį geresnė, nes aš susigalvojau kvailystę.

Kodo atnaujinimas: biurokratija

Kad būti visiškai sąžiningu, tai čia yra visas kodo pokytis. Viena eilutė, keičianti Django kodą.

Visa kita -- biurokratija. Bet, mano manymu, svarbi ir reikalinga biurokratija. Pranešimas Release Notes. Ir, žinoma, unit testas.

Ačiū

Tai va. Istorijos pabaiga. Čia buvo mažas žvilgsnis į mano dalį atviro kodo veiklos.

Tikiuosi, ši istorija gali būti kaip iliustracija, kad prisidėjimas prie atviro kodo projektų neprivalo būti kažkoks įspūdingas dydžiu ir/ar vedinas kilnių tikslų ir/ar reikalaujantis nežmoniškų pastangų.

Tai tiek. Ačiū, kad išklausėte. Jeigu turite klausimų, mielai į juos atsakysiu.

2015 m. sausio 9 d.

Apie vieną taikos kultūros statistiką

Kad mes pilnai europiečiai rodo ne tik Euro įsivedimas, bet ir tas, kad kaip ir visoje likusioje vakarų civilizacijoje, taip ir Lietuvoje yra gyvas galas europietiškų kairiųjų, užaugintų ant Noam Chomsky (aš nesakau, kad Chomsky ir blogai, beje) ir pan. Žinoma, pilna ir tų senovinių komunistinių kairiųjų, bet va internetuose, manau, daugiau naujųjų -- europietiškųjų (neskaitant botų, kas be ko).

Tai va šiomis dienom tie europietiški (kaip ir likusioje vakarų civilizacijoje) pradėjo gana vokaliai rodyti savo priklausymą pro-religinių-žudymų judėjimui. Tas jų judėjimas pasireiškia krikščionybės ir judaizmo viešu išjuokimu ir žeminimu, bei gilia pagarba ir supratingumu islamo religijai. Dar jie žinomi kaip ne islamofobai. Neretai koreliuoja su Putino rėžimo apologetais. Ypač su pastaraisiais gerai sutaria klausimu, kad dėl visko kalta JAV, ar bent jau vakarų civilizacija.

Vienas iš įdomesnių anų argumentų man asmeniškai yra tas, kai jie kur komentuodami numeta teiginį, kad: skirstant pagal religijas, daugiausia žūstančių nuo terorizmo atakų išpažįsta islamo religiją [1]. Atseit, ko jūs čia myžat, va anie vargšai iš tos anos kultūros tai nukenčia žymiai labiau negu mes.

Yra melas, didelis melas ir statistika. Čia vienas iš tų atveju. Tuo pačiu parodantis žmogžudžių apologetų tam tikrą mastymą.  Nagrinėjant teroristų atakas susikoncentruojama į aukas, o ne į vykdytojus.  Taip -- daugiausia žuvusių teroristinėse atakose yra musulmonai. Bet spėkite, kokios religijos savižudžiai sprogdintojai sprogdina musulmonus. Taip -- islamo. Čia kai dėl nusikaltimo kaltinama auka, o ne budelis.

Panašiai, kaip kad seksualinių nusikaltimų statistikoje absoliutiniu skaičiumi yra išprievartaujama daugiau vyrų nei moterų (Jeigu atrodo netiesa, tai atsakymas vienas žodis: kalėjimas). Tai tokią statistiką išgirdus atrodo: o vargšai vyrai. Moterys galėtų ir patylėti, nes palyginus su vyrais, tai jų kančios tik gėlytės. Bet jeigu kaltinsi vis dėl to nusikaltimo vykdytoją, o ne auką, tai pamatysi, kad absoliuti dauguma prievartautojų yra vyrai. O visų atvejų, kai prievartauja moterys, aprašymai atsiduria naujienų portalų gyvenimo būdo skyriuose. Šalia straipsnių apie kokią nors įžymybę su miniatiūriniu bikiniu.


[1] http://fas.org/irp/threat/nctc2011.pdf

Aš prastai piešiu #3

Buvau darbinėje kelionėje. Gera kelionė buvo. Šauni šalis ir daug naudingos patirties įgavau. Dargi buvo po ranka sąsiuvinis ir tušinukas.