Se s trditvijo ne strinjate? Recimo če ste prepričani, da ste strokovnjak za strojno opremo, si poskusite odgovoriti na vprašanje, koliko »arhitektur« znate našteti in s katerimi ste imeli dejansko opravka. Če ste »mojster« na tem področju, vas verjetno »zmanjka« pri segmentu programske opreme. Koliko operacijskih sistemov dobro poznate, predvsem pa njihove umazane podrobnosti? Okolja Windows, Linux in Mac OS še zdaleč niso edina. Verjetno brez težav namestite in zaženete http strežnik Apache, kako dobro pa v resnici poznate vse možnosti, ki jih ta omogoča? Namesto strežnika Apache bi lahko omenili tudi Sambo ali kakšno od distribucij Asteriska ali recimo katero od okolij, v katerih vzpostavimo nadzorni sistem. No, če ste temu izzivu še kos, lahko nadaljujemo z omrežji in področjem varnosti, specifikami in vrstami določenih tipov VPN-povezav (IPsec, OpenVPN …), tematiko IPv6 ali različnimi rešitvami za virtualizacijo. Še vedno držite korak? Kako pa je kaj s programiranjem v različnih okoljih oziroma razvojem programske opreme v okolju ukazne vrstice in grafičnih vmesnikov? Če niste niti pri eni temi v zadregi, bom vesel, če mi pošljete vaš e-poštni naslov, da vas uporabim kot »klic v sili«, ko bom sam zašel v težave in s pomočjo spleta ne bom v doglednem času našel pravega odgovora.

IZVEDBA ZAHTEVE

Verjetno se sprašujete, kakšen je namen vseh zastavljenih vprašanj? No, v resnici to ni bil poziv, s katerim bi pisec besedila želel najti svojega guruja. Odgovor je preprost. Na vsa navedena ali vsaj nekatera vprašanja in morda celo kakšno več moramo odgovoriti, če želimo uspešno izvesti projekt, ki je povezan z izborom ustrezne strojne opreme, razvojem lastne programske opreme, in omogočiti dostop do »storitve« prek interneta. Vsekakor pa si ne smemo odpreti preveč neznanih »front«, saj je to najboljši način, da želenega cilja nikoli ne bomo dosegli.

Želene informacije, povezane s strojno opremo, najdemo največkrat brez večjih težav (izjema so primeri, ko proizvajalec informacije namerno ne razkriva uporabnikom oziroma skupnosti). Zaradi prisotnosti interneta v domačem okolju je problematika povezljivosti v okolju LAN večini razmeroma blizu, nekoliko manj pa vprašanja, povezana z varnostjo. Marsikdo je zadovoljen že s tem, da naprava deluje …

Največkrat pa se pojavijo težave pri programski opremi, ki jo moramo razviti sami (tudi če je potrebnih le nekaj vrstic kode) ali pa želimo že razvito programsko opremo prilagoditi svojim potrebam. To pa pomeni, da moramo biti za okolje, v katerem je tovrstna programska oprema napisana, vsaj kolikor toliko »pismeni«. Žal so še tako dobra zamisel in odlična strojna oprema največkrat popolnoma neuporabni brez ustrezne programske opreme.

Če sami že razvijate aplikacije, s tem ne boste imeli težav. Večjo težavo pa imajo uporabniki, ki tovrstne aktivnosti šele začenjajo. Kako naj se uporabnik pravilno odloči med različnimi možnostmi, če ne pozna prednosti in slabosti? Nasvet poznavalca je sicer lahko dobrodošel, a zavedati se moramo dejstva, da njegov pogled morda ni objektiven. Tak sogovornik se morda zaradi dobrega poznavanja in »rutine« niti ne zaveda količine vsega potrebnega znanja oziroma kompleksnosti in do zdaj vloženega časa. Kako recimo pravilno ovrednotiti besede – A je »slabše kot« B ali recimo »počasnejše kot« … Kaj če je »počasnejše kot« še vedno dovolj hitro in »slabše kot« še vedno predobro za naše potrebe – s tem pa bi morda lahko rešili določeno težavo ali se ji celo izognili in tako prihranili veliko časa.

OPTIMIZACIJA VLOŽKA

Brez dvoma želi vsak s čim manjšim vložkom (denarja, časa, učenja …) pridobiti čim bolj univerzalno znanje, ki bi ga lahko po možnosti uporabil za pisanje aplikacij v grafičnem Windows okolju, razvita aplikacija pa bi delovala tudi v okolju Linuxovega grafičnega vmesnika ali ukazne vrstice. Idealno bi bilo, če bi pridobljeno znanje zaradi priljubljenosti in tržnega potenciala zadoščalo in bi (morda rahlo spremenjena) aplikacija delovala celo na pametnem telefonu/tablici z operacijskim sistemom Android ali morda celo na malem kartičnem računalniku Raspberry. Pa so to le želje na meji možnega ali stvaren cilj, ki ga lahko z nekaj učenja in malo volje razmeroma hitro dosežemo?

Idealne rešitve ni, saj moramo, kot to storimo v življenju, sklepati določene kompromise. Ena od zanimivejših možnih je Python (www.python.org). Če si pomagamo kar z opisom na omenjeni strani, lahko Python opišemo kot objektno orientiran visokonivojski programski jezik, s pomočjo katerega lahko hitro razvijamo aplikacije in učinkoviteje povezujemo sisteme. Zato ni nič čudnega, da Python pogosto opisujejo tudi kot »glue language« (lepilo) za različne aplikacije in okolja. Python lahko uporabljamo v okolju Windows, Unix/Linux (običajno je že del večine najbolj priljubljenih distribucij), Mac OSX … Python je za uporabnike brezplačen ne glede na namen – se pravi, da ga lahko uporabljamo tako za nekomercialne kot tudi komercialne namene.

Pythonove korenine segajo v začetek devetdesetih let, oče pa je Nizozemec Guido van Rossum. Čeprav je Pythonov zaščitni znak kača, pa naj bi dobil ime po znani angleški nanizanki Leteči cirkus Montyja Pythona. Python je visokonivojski programski jezik, namenjen manj zahtevnim in srednje zahtevnim programom (kar pa ne pomeni, da ni učinkovit). Odlikuje ga preprosta skladnja in dobra preglednost (berljivost) kode – kar bodo dokazali tudi zgledi v nadaljevanju, saj bomo lahko včasih že z nekaj vrsticami dosegli želeni cilj. Še morda razmislek – če je Python dovolj zanimiv, da ga uporabljajo na določenih področjih tudi pri Googlu, v CERN-u in pri agenciji NASA, bo zadoščal verjetno tudi za večino bralcev.

Python prepoznamo po znaku > > > . Za »izvajanje« Pythonove programske kode potrebujemo ustreznega tolmača (interpreter), ki programsko kodo prevaja ob vsakem zagonu. Prednost tovrstnega koncepta je, da lahko »kodo« po potrebi spremenimo/popravimo s poljubnim urejevalnikom besedil in jo ponovno zaženemo. Ko dosežemo želeno stabilnost, pa se lahko ponavljajočim »prevajanjem« izognemo tako, da program dejansko prevedemo v izvršljivo datoteko (in potrebne dodatke) s pomočjo paketa py2exe (http://sourceforge.net/projects/py2exe/). Žal ta privzeto ne podpira vseh različic Pythona.

Ker je Python na voljo brezplačno, je jasno, da je brez večjih težav dostopna tudi večina literature. Marsikaterega začetnika bo razveselilo tudi dejstvo, da je veliko informacij dostopnih tudi v slovenskem jeziku. Iz množice različnih dokumentov in predstavitev omenimo le Python za programerje (avtor Janez Demšar), ki tudi začetniku omogoča hitro spoznavanje osnov Pythona. Zelo poučne in razumljive pa so tudi različne multimedijske predstavitve, namenjene tej temi (na primer www.nauk.si).

NAMESTITEV

Za pisanje programov v Pythonu lahko uporabimo poljuben urejevalnik besedil (beležnica/notepad, vi …), saj zdaj že vemo, da je Python tolmačen jezik. Za udobnejše delo pa je bolje, če uporabimo namenski urejevalnik, saj nas bo ta opozarjal na morebitne napake. Ena od najpogostejših je napačna uporaba ali morebitna neuporaba zamikov.

S spletne strani http://www.python.org/download/ smo prenesli Python za okolje Windows. Kot lahko vidimo, sta trenutno aktualni različici Python 2.7.3 in Python 3.3.0. Čeprav bi zadoščala le ena, smo prenesli obe različici in ju namestili v imenik C:\Python\Python27\ in C:\Python\Python33\. Razlog za to je v dejstvu, da se različice Pythona v določenem pogledu razlikujejo in lahko z namestitvijo obeh prihranimo čas. Če na spletnih straneh najdemo Pythonovo »kodo«, ugotovimo, za katero različico je ta napisana, in jo brez potrebnih popravkov zaženemo v tem okolju.

Po namestitvi Pythona zaženemo IDLE – Pythonovo lupino, ki jo bomo v naših primerih uporabljali za razvoj naših »aplikacij«. Glede na različico, ki smo jo namestili oziroma zagnali, se nam izpiše informacija o različici Pythona (na primer Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 ali Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32). V zadnji vrstici se ponovno izpiše Pythonov > > > , ki čaka na nove vnose oziroma ukaze.

Poskusimo z vnosom 12+23 in pritisnimo tipko Enter. Po pritisku se nam najprej izpiše vsota-rezultat 35, ponovno pa se izpiše > > > . Python očitno lahko uporabljamo tudi kot preprosto računalo. Poskusimo z novim primerom. Zanima nas rezultat deljenja števila 9 s številom 2. Če boste ta račun (9/2) vnesli v okolju 2.7.3, boste dobili kot rezultat celo število (4), različica 3.3.0 pa bo izpisala pravilen rezultat 4.5. Tak rezultat pa bomo dobili tudi v primeru različice 2.7.3, če bomo namesto števila 9 napisali 9.0 (se pravi 9.0/2). Na lastni koži smo naleteli že na prvo razliko med različicama Pythona, ki različno obravnavata tipe števil.

Nadaljujmo z raziskovanjem in vpišimo vrstici a=3 in b=5. V tretjo vrstico vpišemo a+b in tako kot pri ostalih dveh vrsticah pritisnemo tipko enter. Python nam v skladu s pričakovanji izpiše rezultat – število 8. Poskusimo z vnosom tretje vrstice še enkrat, le da tokrat namesto malih črk uporabimo veliki – A+B. Tokrat nas bo Python opozoril na napako, saj ima »a« vrednost »32«, »b« pa vrednost »5« – vrednosti »A« in »B« pa še nismo definirali. Vrednosti lahko preverimo tudi tako, da vnesemo vrednost a, b … in pritisnemo tipko enter.

Če pritisnemo na tipki ctrl+F6 (Shell – restart Shell) in želimo ponovno izpisati vrednosti, ugotovimo, da so te izgubljene. Imena spremenljivk so lahko tudi daljša in drugačnih tipov – na primer polmer, ime, naslov … Če bi želeli izračunati recimo obseg kroga (2*Pi*polmer), moramo vnesti vrednosti pi (3.1415) in polmer (na primer 1.5). V prvo vrstico vpišemo Pi=3.1415, v drugo pa polmer=1.5. V tretjo vnesemo definicijo enačbe 2*Pi*polmer. Po potrditvi vnosa dobimo rezultat 9.4245.

Ponovimo restart lupine in naredimo nekoliko drugače. Vnesimo »pi«, lupina pa nam izpiše sporočilo NameError: name 'pi' is not defined, saj vrednost pi ni definirana. V novo vrstico vnesimo ukaz from math import * in pritisnimo tipko enter. Na prvi pogled se ne zgodi nič posebnega, saj se je ponovno izpisal le > > > . V ozadju pa se je zgodila pomembna sprememba, saj smo s to vrstico naložili modul »math«. Če pogledamo, kaj ta modul doda (http://docs.python.org/3.3/library/math.html), ugotovimo, da nam je dodal nove, naprednejše matematične funkcije ter definicijo konstant – števil »pi« in »e«. To lahko potrdimo tako, da vnesemo še enkrat »pi«, lupina pa nam tokrat izpiše vrednost 3.141592653589793. Če izvedemo restart lupine in želimo ponovno izpisati vrednost pi, ugotovimo, da modul math, ki smo ga naložili, ni več aktiven. S pomočjo ukaza from ime_modula import * lahko naložimo tudi druge module.

MOJ PRVI PROGRAM

Predstavitev večine razvojnih okolij se največkrat začne s primeri izpisa pozdravnega sporočila (tako imenovani hello world). Največkrat pa se za izpisom pozdravnega sporočila v eni vrstici skriva še kopica programske kode, ki začetniku že s tem najpreprostejšim zgledom vzame veliko volje do nadaljevanja. Pa si poglejmo, ali je Python res tako preprost, kot smo ga opisali. Če želimo izpisati sporočilo »mojMikro«, storimo to v Pythonu s pomočjo vrstice print ("mojMikro"). Priznati morate, da bi bilo težko bolj preprosto. Beseda, ki jo želimo izpisati, mora biti med narekovajema, saj bi v nasprotnem primeru to pomenilo izpis vrednosti, ki smo jo priredili spremenljivki mojMikro. Pri izpisu si lahko pomagamo tudi z dodatnimi znaki. Eden od njih je \n, ki pomeni nadaljevanje izpisa v naslednji vrstici – ali z drugimi besedami prelom vrstice.

Do zdaj smo Pythonovo lupino uporabljali za neposredno izvajanje ukazov. Tokrat pa bomo print vrstico vpisali v datoteko (File – New Window) in jo shranili v datoteko z imenom test.py. Izvajanje test.py datoteke lahko izvedemo na več načinov. Prvi je, da pritisnemo tipko F5 (Run-Run Module). Izvajanje naše datoteke pa lahko zaženemo tudi iz ukazne vrstice (cmd) in ukaznim nizom (python test.py) v imeniku z datoteko test.py.

Opozorili smo že, da je Python tolmačen programski jezik, kodo pa lahko s pomočjo ustreznega orodja kljub vsemu spremenimo v izvršljivo (*.exe) datoteko. Za pretvorbo poskusimo uporabiti py2exe (http://www.py2exe.org/). Sodeč po informacijah na spletni strani, podpira namestitveni program py2exe »privzeto« le različice Pythona do 2.7, zato smo uporabili to različico. Našo datoteko test.py bomo pretvorili s pomočjo py2exe tako, da bomo pripravili v imeniku c:\Python\Python27 datoteko setup.py, ki je videti takole:

# setup.py
from distutils.core import setup
import py2exe
setup(console=[“test.py“])

V okolju ukazne vrstice nato v imeniku c:\Python\Python27 vnesemo ukazni niz python setup.py py2exe, ki nam čez nekaj trenutkov v podimeniku c:\Python\Python27\dist ustvari vse potrebne datoteke za zagon naše izvršljive datoteke (test.exe) na poljubnem računalniku z okoljem Windows, tudi če na njem ni nameščen Python. Natančnejše informacije glede uporabe najdemo na spletni strani http://www.py2exe.org/index.cgi/Tutorial, kjer lahko najdemo potrebna navodila tudi za zagon na drugih različicah Pythona. Ob pripravi datoteke setup.py smo mimogrede spoznali še #, ki označuje vrstico oziroma del besedila s komentarjem.

OSNOVNA PRAVILA IN UKAZI

Tako kot pri drugih jezikih lahko tudi pri Pythonu celotno »kodo« razbijemo na manjše dele, ki opravljajo določene naloge. To so lahko definicije posameznih funkcij, zanke …, ki jih na koncu vrstice zaključujemo z dvopičjem. Dvopičju vedno sledi zamik, ki je lahko poljuben, a ko se določi, morajo biti vsi zamiki na tej ravni enaki. Pri morebitnem prepisovanju ali kopiranju Pythonove kode s spletnih strani moramo biti torej pazljivi, za katero različico Pythona je določen program napisan, pazljivi pa moramo biti tudi na ustrezno prenašanje zamikov, ki sledijo znaku »:«.

V skladu s predstavljenim naredimo novo funkcijo z imenom kvadrat, ki nam bo izračunala kvadrat poljubnega števila. Datoteka kvadrat.py bo videti takole:

# Funkcija kvadriranja poljubnega stevila
def kvadrat(n):
a=n*n
return a

Če datoteko zaženemo (F5), se samodejno izvede skok v lupino (> > > ). Zdaj vnesemo kvad in pritisnemo tipko tab. Lupina nam samodejno dokonča besedo v kvadrat, mi pa dokončamo zapis v kvadrat(5) in pritisnemo tipko enter. V lupini se izpiše pričakovan rezultat – število petindvajset. V primeru vnosa drugega števila bo v lupini izpisan kvadrat tega števila. Namesto zagona datoteke kvadrat.py bi lahko seveda izvedli nalaganje modula tudi s pomočjo niza form kvadrat import *.

Poleg izpisa (ukaz print) pogosto želimo vnesti tudi določene podatke (števila, znaki). Oglejmo si preprost primer, ko bomo vnesli dve števili (12 in 34).

# A+B=?
a=input ("Vnesi A ...")
b=input ("Vnesi B ...")
c=a+b
print ("Vsota A in B je",c)

Če bomo naš program zagnali v različici 2.7.3, nam bo Python izpisal vsoto število 46. Zagon v okolju 3.3.0 pa nam izpiše kot rezultat niz 1234. Razlog je preprost. Ukaz input v različici 2.x vnos obeh števil razume kot številko, različica 3.x pa kot znake-niz, ki jih je kot posledico vsote »+« združila v nov niz »1234«. S pomočjo matematičnih znakov lahko torej tudi združujemo. V primeru različice 3.3.0 bi morali naš zapis spremeniti v:

# A+B=?
a=int(input ("Vnesi A ..."))
b=int(input ("Vnesi B ..."))
c=a+b
print ("Vsota A in B je",c)

Niz, ki ga sprejmemo prek ukaza input (), spremeni int () iz znaka v število. Tudi vnosa a=12 in a=»12« se bistveno razlikujeta. V prvem številu a-ju priredimo vrednost 12, v drugem a nima številske vrednosti, ampak je a definiran kot znak. Seveda pa lahko »računamo« tudi z znaki. Če je a=»mojMikro«, bo rezultat enačbe 3*a enak 'mojMikro mojMikro mojMikro'.

Do zdaj smo že spoznali prirejanje določenih vrednosti posamezni spremenljivki (na primer a=3). V določeni vrstici lahko priredimo vrednosti tudi več spremenljivkam (na primer a=b=c=0). Lahko pa določeni spremenljivki dodamo več lastnosti, ki jih združimo v seznam. Seznam definiramo z oglatimi oklepaji […]. Naš seznam x določimo kot:

x=[123,”mojmikro“,“2013“]

Tak seznam lahko uporabljamo kot neke vrste bazo. Če želimo prebrati ali uporabiti določeno vrednost s seznama, dodamo vrednosti njeno mesto – x[0] nam da številsko vrednost 123, x[1] izpiše mojmikro, x[2] pa 2013. Opazili ste verjetno, da štejemo od 0, in ne od 1, zato ima prvi element razpredelnice indeks nič. V naš seznam x lahko dodamo novo vrednost. Če želimo na prvem mestu dodati vpis Medved Jogi, storimo to z vrstico:

x[:0]=["Medved Jogi"]

Nov izpis seznama x nam prikaže:

['Medved Jogi', 123, 'mojmikro', '2013']

Podobno lahko izvedemo tudi brisanje oziroma spremembo. Na seznamu lahko uporabljamo tudi različne funkcije. Ena od njih je len, ki nam v primeru seznama x izpiše vrednost 4.

Oglejmo si še nekatere najpogostejše zanke. Primer zanke for nam izpisuje parna števila (vključno s številom 0) do dvajset. Naša datoteka soda.py je videti takole:

#primer zanke for - izpis od parnih stevil do 20
f = 1
for i in range(11):
i = i*2
print(i)

Če pa bi bila videti takole (drugačen zamik zadnje vrstice)

f = 1
for i in range(11):
i = i*2
print(i)

pa bi bila izpisana le zadnja izračunana vrednost (20). Verjetno se sprašujete, zakaj smo v polje range vpisali 11, in ne 10. Razlog je v tem, da se pri meji upošteva spodnja meja, zgornja pa je izključena. Če bi želeli izpisati le parna števila med 5 do vključno 16, bi datoteko spremenili v:

#primer zanke for - izpis od parnih stevil do 20
f = 1
for i in range(3,9):
i = i*2
print(i)

Drug zanimiv in uporabni stavek je stavek if. Uporabljamo ga lahko samostojno ali v kombinaciji z deli elif (elseif) in else. Primer uporabe stavka bi bil:

#Ugotovitev predznaka stevila
x=input ("Vnesi poljubno stevilo...")
if x==0:
print("Vnesli ste stevilko 0")
elif x < 0:
print("Negativno stevilo")
else:
print("Pozitivno stevilo")

V prvi vrstici smo priredili spremenljivki x določeno vrednost, ki smo jo vnesli prek tipkovnice. V stavku if smo preverili, ali logični izraz x==0 (dvojni enačaj!) ustreza pogoju, da je x enak 0. Če je pogoj izpolnjen, se izpiše sporočilo o vnosu števila nič. Če pa ta pogoj ni izpolnjen, vrstici elif oziroma else preverita, ali ustreza kateremu drugemu pogoju, in temu primerno izpišeta ustrezno sporočilo. Brez težav lahko uporabimo zaporedno tudi več elif stavkov.

Naslednji pomembni gradnik je stavek while:

a=i=1
while a< > 0:
a=input("Vnesi stevilo ")
print i
i += 1
print ("Vnesel si stevilo 0")

Stavek while v opisanem primeru preverja, katero število smo vnesli, in šteje število vnosov. Ko vnesemo število nič, se postopek ustavi in izpiše sporočilo, da smo vnesli število 0.

PISANJE V DATOTEKO IN ŠE KAJ

Filozofijo, ki ji poskuša slediti Python, lahko preberemo tudi tako, da vnesemo v lupino (> > > ) niz import this. Predlagam vam, da si ta načela Pythona preberete, čeprav se na prvi pogled zdijo pretirano idealizirana in sama po sebi umevna (na primer lepše je boljše grdo, preprosto je boljše kot kompleksno, berljivost šteje, bolje zdaj kot nikoli …). Kakor koli že, tudi zaradi teh načel je Python takšen, kot je.

V naslednjem besedilu bomo nadaljevali s poznavanjem Pythona v obliki različnih zgledov, ki bodo postajali vse zahtevnejši. Ogledali si bomo določene zanimive in pogosto uporabljene module, spoznali možnosti zapisovanja v in branja iz datoteke ter nadaljevali s pridobivanji potrebnih znanj, ki bodo omogočila, da bomo lahko samostojno ali z uporabo določenih že pripravljenih modulov napisali tudi preprosto aplikacijo za kartični računalnik Raspberry. Seveda pa se je vsega, tudi Pythona, nemogoče naučiti le iz prebiranja, ampak se moramo z njim spoprijeti »v živo«.

Se nadaljuje …

Lupina Python
Pri pisanju kode je dobro uporabiti urejevalnik s podporo Pythona.
Okolje ukazne vrstice in nalaganje modula math
Velika količina že pripravljenih modulov omogoča preprosto pisanje aplikacij.

Načela Pythona

Programiranja v Pythonu se je razmeroma lahko naučiti. Je uporabniku prijazen, saj je enostaven in pregleden tudi pri daljši kodi.
…..
Python je objektno orientiran visokonivojski programski jezik. Z njegovo pomočjo lahko učinkovito povezujemo različne sisteme in razmeroma hitro razvijamo različne aplikacije. Priporočljivo ga je uporabljati v primerih enostavnejših in srednje zahtevnih programov, kjer ni zahtevana visoka hitrost izvajanja. Ena od prednosti Pythona je zelo preprosta skladnja, kar pa ne pomeni, da jezik ni učinkovit.
…..
Čeprav lahko pišemo programe za Python v poljubnem urejevalniku, je smiselno, da uporabimo namenski urejevalnik, ki nas opozarja na morebitne napake v skladnji in ustrezno označuje besedilo.
…..
Prednost Pythona je v njegovi relativni univerzalnosti – brez večjih težav ga lahko prenašamo med različnimi okolji (na primer okolje Windows, Linux …). Pazljivi pa moramo biti, za katero različico je določena aplikacija napisana, saj so v nekaterih primerih potrebne določene prilagoditve.

Moj mikro, Maj Junij 2013 | Marko Koblar