wtorek, 30 sierpnia 2011

{Work-in-progress}[Megatutorial]Ada


Witam wszystkich w moim mega tutorialu dotyczącym programowania w języku Ada!
Po pierwsze chciałbym zaznaczyć że tutorial jest wieloplatformowy i nie dotyka rzeczy specyficznych dla danej platformy systemowej. Aczkolwiek nie gwarantuje że każdy przedstawiony tu kod/porada będzie działać.
Tutorial piszę dla średnio zaawansowanych programistów. Jeżeli będzie to potrzebne mogę go rozszerzyć o pewne komentarze.
1. Dlaczego Ada?
W pierwszym rozdziale wypadałoby powiedzieć dlaczego warto poznać Adę?
Powodów może być kilka:

  • pracujesz w wojsku jako programista :P
  • musisz pisać niezawodny kod 
  • potrzebujesz języka który umożliwia łatwe utrzymanie kodu
  • piszesz aplikacje rozproszone
  • szukasz wygodnego, obiektowego i w pełni kompilowalnego języka
Coś tam na pewno się jeszcze znajdzie ;)
Ogólnie mówiąc Ada jest świetnym wyborem dla programisty solidnego, dbającego o użytkowników etc.
Może te wszystkie zalety nadal cię nie przekonały, ja jednak uważam że jest to świetny język posiadający własną filozofię pisania kodu :)
2. Historia Ady
Jak wszyscy wiemy pierwszym programistą była Augusta Ada King, hrabina Lovelace. Jako hołd pierwszej programistce nazwano na jej cześć język opracowany przez amerykański departament obrony.
3. Cechy języka

  1. Pierwsze co da się zauważyć to składnia przypominająca wyglądem składnie Fotrana(swoją drogą bardzo przyjemna i miła dla oka :))
  2. Wartościowanie leniwe
  3. non-case sensitive(nieczułość na wielkość znaków)
  4. Cały program to jedna wielka procedura zawierająca podprocedury. W przeciwieństwie do C może się nazywać dowolnie :)
  5. Brak funkcji w stylu print-format etc. Uniemożliwia to dodatkowe błędy związane z nadmiarem lub niedoborem argumentów
  6. "Zabezpieczenie" kolejności rzutowania.
4. Instalacja kompilatora GNAT. Pierwszy program.
4.1 Windows
Ściągamy pakiet portów MinGW.
4.2 Linux
Uruchamiamy instalator pakietów i szukamy gcc-ada(ew. może być zapisane jako GNAT). Aby sprawdzić czy GNAT jest w repozytoriach piszemy:
cnf gnat
4.3 Hello World
Aby sprawdzić czy nasz kompilator działa skompilujmy przykładowy program
with ada.text_io;
use ada.text_io;

procedure Hello is
  -- Hello example
  -- Tutaj deklarować będziemy zmienne

begin
    Put_Line("Hello World!");
end Hello;

Aby skompilować powyższy przykład uruchamiamy gnatmake:
gnatmake <nazwa_pliku>
Uruchamiamy:
Linux:
./Hello
Win:
Hello
(Możliwe że pod Windows będzie trzeba coś linkować...)
5. Podstawy składni
Teraz przyszła pora omówić sobie ten nasz hello world.
Pierwsza linijka informuje o korzystaniu z pakietu(tak biblioteki w Adzie są podzielone w pakiety podobne do tych znanych z Javy). Kolejna jest niejako synonimem C++'owego using namespace czy C# using. Chodzi o to by za każdym razem nie musieć pisać Text_IO(istnieje także wygodniejsze i czytelniejsze rename'owanie pakietów ;)). Jak już mówiłem program(czy też pakiet) w Adzie składa się z jednej wielkiej procedury. W tej procedurze deklarujemy zmienne i podprocedury. "Sekcję" kodu właściwego rozpoczyna słowo begin a kończy end z nazwą procedury. Put_Line wypisuje tekst na standardowe wyjście(nie ma przeszkód by tą procedurą "mówić" do drukarki czy innego urządzenia wyjściowego). Warto zauważyć że każde wyrażenie musi być zakończone średnikem. Komentarze występują jedynie w wersji jednolinijkowej(--).
6.Struktury kontrolne
6.1 If-else
if condition then
statement;
else
other statement;
end if;
6.2 If-elsif-else
if condition then
    statement;
elsif condition then
    other statement;
elsif condition then
    other statement;
...
else
    another statement;
end if;
6.3 case(odpowiednik switch w innych językach)
case X is
   when 1 =>
      Walk_The_Dog;
   when 5 =>
      Launch_Nuke;
   when 8 | 10 =>
      Sell_All_Stock;
   when others =>
      Self_Destruct;
end case;
when others to odpowiednik default w C.
7. Pętle i skoki
7.1 goto
goto Label;

   Dont_Do_Something;

<<Label>>
   ...
7.2 return
Dla procedur:
return;
Dla funkcji:
return value;
7.3 Pętla nieskończona:
Endless_Loop:
   loop
      Do_Something;
   end loop Endless_Loop;
7.4 While
While_Loop :
   while X <= 5 loop
      X := Calculate_Something;
   end loop While_Loop;
7.5 Until
Until_Loop :
   loop
      X := Calculate_Something;
      exit Until_Loop when X > 5;
   end loop Until_Loop;
8. Zmienne
W Ada mamy trzy typy zmiennych:
Integer, Float oraz Access.
Pierwsze dwa jak łatwo zauważyć to typy proste(odpowiednio całkowity i zmiennoprzecinkowy). Trzeci typ to wskaźnik. Jednak prawie w ogóle nie przypomina on wskaźnika znanego z C. Bardziej jest to "iterator" dla struktur i tablic.
Podstawy:
C:
int i;
int a, b, c; 
int j = 0; 
int k, l = 1;
Ada:
i : Integer;
a, b, c : Integer; 
j : Integer := 0; 
k, l : Integer := 1;
Stałe deklarujemy w ten sposób:
lol : constant :=7;
lub z określeniem typu:
lol : constant Integer :=7;
9. Nowe typy:
Ada posiada rozległy mechanizm typów zmiennych. Umożliwia on bardzo dokładne manipulowanie stworzonymi przez nas typami. Aby utworzyć nowy typ o nazwie INT piszemy:
type INT is new Integer;
Teraz utworzymy sobie zmienną typu INT:
a : INT;
Warto nadmienić iż nowy typ INT to coś zupełnie różnego od typu Integer!
Nie jest możliwe przypisanie zmiennej typu INT do zmiennej typu Integer i na odwrót!
Należy pamiętać również o tym, że nowy typ wymaga również nowych operatorów a więc nie mamy możliwości operowania na nim zbyt wielkiej!
Aby nie utrudniać sobie życia tworzeniem cały czas operatorów powstały podtypy(subtype po angielsku):
10. Podtypy:
Stwórzmy sobie podtyp INT "dziedziczący" z typu Integer:
subtype INT is Integer;
a : INT;
Teraz spokojnie możemy przypisać do zmiennej typu INT zmienną typu Integer lub na odwrót.
W typach oraz podtypach możemy definiować ich "rozpiętość" czyli zakres z jakiego mogą przyjmować liczby. Np.:
subtype INT is Integer(0,100);
teraz stworzyliśmy typ INT o zakresie od 0 do 100.
11. Podprocedury:
Podprogramy, czy też podprocedury, funkcje, procedury etc. są bardzo użytecznym narzędziem.
Stwórzmy funkcję suma która będzie dodawała A i B a wynik zwracała w zmiennej C:
 
procedure Suma(A,B: in Integer; C: out Integer) is
begin
    C := A + B;
end Suma;
Jak widać każdą procedurę tworzymy za pomocą keyword'a procedure. Następnie podajemy jej nazwę. Jako parametry przyjmuję zmienne A i B typu Integer. Warto zwrócić uwagę na poprzedzający typ keyword in. Oznacza on, że te dwa parametry będą używane jedynie wewnątrz procedury i ich wartość nie zostanie zmieniona tak jak dzieje się ze zmienną podaną jako C.
12. Procedure  Funkcje() is
W Adzie funkcje jako takie praktycznie nie istnieją. Używa się ich jedynie do przeładowania operatorów przy tworzeniu nowego typu.
function "+" (Op1, Op2: in Nowy_typ) return Nowy_typ is
  begin
    -- Definicja operatora dodawania
  end "+";
13. Procedure Wywoływanie_procedur() is
Procedury w Adzie możemy wywoływać na 2 sposoby:
-- Sygnatura procedury
procedure Write ( Text: String, X, Y: Integer )

-- Wywołanie
Write ("Hello", 5, 10);
-- lub
Write ( Text => "Hello", X => 5, Y => 10 );

poniedziałek, 29 sierpnia 2011

Jak nie być script kiddem?

W społeczności "hackerskiej" określenie script kidd oznacza osobę korzystającą z programów używanych do różnego rodzaju ataków nie znając ich działania. Nie jest to zatem określenie hakera korzystającego z cudzego oprogramowania, zamiast je napisać. Nawet najsławniejsi w swym czasie Anonymous korzystali z Low Orbit Ion Cannon które przecież nie jest ich dziełem, a nikt nie nazywa ich script kiddami.
Pojęcie script kidda zatem mamy wytłumaczone. Teraz powiedzmy sobię jak takim script kiddem nie być:

  1. Po pierwsze-ucz się jak najwięcej. Żeby nie lamić musisz wiedzieć jak najwięcej. Nie ważne czy będzie to mniej lub bardziej związane z hackingiem.
  2. lrn google. Tam jest wszystko czego tylko sobie życzysz :)
  3. Programuj jak najwięcej. Script kidd nie potrafi napisać aplikacji podobnej do tej z której korzysta-dlatego jest lamerem.
  4. Jeżeli korzystasz z jakiejś aplikacji spytaj się jego twórcy lub sam pomyśl jak ona może działać :)
  5. Use source, Luke :)
No to byłoby na tyle :)

niedziela, 21 sierpnia 2011

Wykłady na #coding-gods.org

Witam!
Na forum coding-gods.org stworzyliśmy nowy projekt społeczny pt.wykłady na IRC.
Każdy kto jest zainteresowany od dziś może na naszym irc prowadzić wykłady :). Wystarczy napisać do mnie lub adwiego :)
Terminy spotkań dostępne są na naszym kalendarzu.

sobota, 20 sierpnia 2011

Konwencje wywołań


Witam!
Chyba każdy programista spotkał się z funkcjami. Mają one nazwę, argumenty, ramkę stosu etc. W ich skład wchodzą również tajemnicze konwencje wywołań. Jest ich 4 z czego tylko 3 są wykorzystywane. Ich działanie omówię poniżej:
cdecl
Dosyć enigmatyczna nazwa ;) Oznacza ona C (style) Declare(Function).
Aby wywołać taką funkcję w asemblerze caller(wywołujący funkcje) musi umieścić argumenty na stosie, wywołać funkcje a potem obliczyć wielkość argumentów i zdjąć je ze stosu. Wszystkie funkcje ze standardowej biblioteki C są właśnie wywoływane w tej konwencji. Warto nadmienić, że argumenty wrzucamy na stos od tyłu. Wynika to z budowy stosu.
Przykład:
push arg2
push arg1
call [Foo]
sub esp,2*4
Jak widać wrzucamy argumenty "od tyłu". Następnie wywołujemy funkcje, po czym czyścimy stos(każdy argument na stosie ma 4 bajty dlatego 2*4). W kompilatorach C możemy narzucić tą konwencję na naszą funkcję pisząc _cdecl(lub __cdecl w bcc32 i kompilatorze M$)
Pascal
To bardzo stara konwencja używana w bardzo starych kompilatorach języka Pascal. Cechą szczególną jest wrzucanie argumentów na stos od przodu(!). Uniemożliwia to znaną z cdecl zmienną liczbę argumentów. Był to główny powód zaprzestania implementacji tej konwencji.
#edit Konwencji tej używały: QuickBasic i Windows 3.1 API. Jest możliwość wymuszenia jej w niektórych kompilatorach(np. we FreeBasic'u).
stdcall
To chyba najwygodniejsza z konwencji wywołań. Argumenty podajemy od tyłu na stos i wywołujemy funkcję. Nie martwimy się czyszczeniem stosu ponieważ zajmuję się tym calle. Również uniemożliwia podawanie zmiennej ilości argumentów(tzn. umożliwia jednak jest to dosyć problematyczne). Przykład:
push arg2
push arg1
call [StdBoo]
Fastcall
Najbardziej zależna od kompilatora konwencja wywołań. Argumenty umieszczamy w rejestrach. To w jakich rejestrach oraz w jakiej kolejności zależy od używanego kompilatora.
Istnieje jeszcze kilka pomniejszych konwencji wywołań które są raczej mniej popularne jak np. safecall czy thiscall
Więcej info na:
http://en.wikipedia.org/wiki/X86_calling_conventions

piątek, 19 sierpnia 2011

Lynx32

Witam!
Tytuł dzisiejszego wpisu to jednocześnie nazwa mojego największego do tej pory projektu.
O projekcie
Lynx32 to maszyna wirtualna oraz asembler do jej obsługi ;)
Maszyna posiada 4 rejestry:

 Trochę problematycznie rozwiązałem operowanie na maszynie z poziomu asemblera-skonstruowałem coś na wzór przerwań:
LDA #'Hello World' !Assign value to A register
LCALL #1 !Lynx Call
Powyższy kod na(jeszcze nie dokończonej ;P)maszynie powinien wyświetlić zawartość rejestru A.
Ogólnie pisanie(a raczej uzupełnianie przepisywanej przeze mnie maszyny z C# na C++ :P)sprawia mi niebywałą przyjemność :).
TODO:
Do napisania została mi jeszcze spora porcja kodu,
Muszę napisać kompilator języka wysokiego poziomu(btw. ma ktoś pomysł na nazwę?),
Wypadałoby przepisać na nowo asembler, tym razem do C\C++\D whatever :P(wypadało by zrobić również implementację pod Java i .NET)


piątek, 12 sierpnia 2011

VPython


Hai all!
Od niedawna bawię się bardzo ciekawym silniczkiem 3D. Stworzony został na potrzeby tworzenia symulacji fizycznych. Nie jest to więc silnik gier, aczkolwiek jest kilka ciekawych* ;) Boli mnie jednak jak słabo stworzona jest dokumentacja: kilka "lekcji" o podstawach, dość dobre jednak nieliczne video-tutoriale...
Jedno z "zadań domowych" które dla treningu zrobiłem:
Kod:
from visual import *

ball1=sphere(pos=vector(2,0,0),radius=0.25,color=color.red)
ball2=sphere(pos=vector(1,2,0),radius=0.25,color=color.orange)
ball3=sphere(pos=vector(0,0,0),radius=0.25,color=color.blue)
arrow(pos=vector(0,0,0), axis=ball1.pos-ball3.pos,color=color.yellow)
arrow(pos=vector(2,0,0), axis=ball2.pos-ball1.pos,color=color.white)
arrow(pos=vector(1,2,0), axis=ball3.pos-ball2.pos,color=color.red)
Linczek do strony projektu

*np. pewna demonstracja vspace

sobota, 6 sierpnia 2011

Jak dziala pop i push?


Jeżeli zawsze byłeś ciekawy jak działa pop i push oraz jak można je zastąpić, to zapraszam do czytania ;)

Jeżeli miałeś kiedykolwiek styczność z asm'em to wiesz czym są segmenty oraz stos. Myślę jednak że warto by choć trochę zainteresować. Czym jest stos można spokojnie poczytać na wikipedii. O segmentach nic chyba nie było. Powiem tyle że dla nas najważniejszy jest segment stosu(SS-Stack Segment). Wskazuje on na początek stosu. W naszym przypadku będzie to 100h.Przyjmijmy że każdy argument wrzucany na stos ma 2 bajty(wiem nie jest tak ale zbyt długo rysowałem schemat żeby tera zmieniać :P). Wszystko wrzucamy "od tyłu"(lub od góry, różnie można interpretować). Operowanie na stosie czyli push wrzucające coś na stos oraz pop ściągające z rejestru do stosu to po prostu odejmowanie i dodawanie adresów. Push można zamienić na:
;PUSH
sub esp, wielkosc
mov [ss:esp], co
Gdzie wielkość w naszym przypadku bedzie miała wartość 2. ss:esp to adres ostatniego elementu stosu.
Zobaczmy prosty przykład. Na stos wrzucamy zawartość AX i DX:
;push AX
sub esp,2
mov [ss:esp],ax 
;push DX
sub esp,2
mov [ss:esp],dx
Jak będzie wyglądał stos:

Uff...namęczyłem się trochę z tym rysunkiem ponieważ robiłem go w mtPaint :P
Dobrze. Jak widzimy adres maleje o wielkość(czyli 2)-0xFE(dec.254) do 0xFC(dec.252). Jako że wrzuciliśmy rejestry 16 bitowe wszystko powinno się zmieścić.
Jak działa pop?
Jak wiemy pop zdejmuje ze stosu ostatni element i wrzuca go do jakiegoś rejestru. Czyli działa odwrotnie do push. Dla przejrzystości pokażę przykład:
;POP 
mov gdzie, [ss:esp]
add esp, 2
Do gdzie przesuwamy ostatni element stosu. Potem dodajemy do ESP 2 czyli ustaloną przez nas wielkość. Sprawi to że stos przeskoczy na nasz "umówiony" adres 254 czyli na przedostatni element.

Czy język może się przedawnić?

To pytanie zadałem sobie przed chwilą. Odpowiedź jest bardzo prosta-nie. Język czyli semantyka, sam dialog z komputerem raczej trudno ulega przedawnieniu, a to dlatego, że jest pewna rzecz w komputerze niezmienna-bity. Są, były i będą w każdym komputerze. A więc jeżeli język nie obsługuje pewnych ficzerów jak np. obsługa wyjątktów, to leży to już w kwestii kompilatora. Ile to już dziwactw wymyślono dla C czy takiego bardzo przyjemnego Fortrana. Jeżeli wychodzi nowa wersja jakiegoś języka, to jest to po prostu ustandaryzowanie pewnych rozwiązań wobec stawianych problemów. Weźmy np. C. Mamy w nim dwa standardy: ANSI C(pierwotny) oraz C99. Standard drugi jest jedynie pewnego rodzaju próbą unowocześniania języka. Nie zawsze wychodzi to na dobre. C99 dorzucił kilka całkiem fajnych ficzerów w stylu komentarzy jednolinijkowych, czy chociażby typ logiczny, jednak nie oszukujmy się-to wszystko to tylko mydlenie oczu. Nie mówię tu że starsze języki są gorsze. Warto jednak pomyśleć w czym uchybiają tym nowszym...
PS: Całkiem chlubnym przykładem jest najnowszy(jeszcze opracowywany) standard języka C++. Wprowadza tyle udogodnień, że sama nauka tego standardu będzie trwała dłużej niż nauka C++ ;)

poniedziałek, 1 sierpnia 2011

Mega tutorial by Assa.py

Dołączona grafika
Megatutorial by Aссаръеллюсс


Witam w drugim moim wielkim tutorialu!Tym razem jednak nie o AutoIT ,ale o innym już dużo 'doroślejszym' języku skryptowym.

Tuta,pozwólcie,będe pisał partami edytując ten post.
1.Czym jest Python?
Dobra pozwólcie że wylewał się nie będe i przytocze cytat z Wikipedii:

Cytat
Python – interpretowany, interaktywny język programowania stworzony przez Guido van Rossuma w 1990. Python posiada w pełni dynamiczny system typów i automatyczne zarządzanie pamięcią, jest zatem podobny do takich języków, jak Tcl, Perl, Scheme czy Ruby.

Python rozwijany jest jako projekt Open Source, zarządzany przez Python Software Foundation, będącą organizacją non-profit. Standardowa implementacja to tzw. CPython (pisany w C), ale istnieją też inne, takie jak Jython (w Javie), IronPython (na platformę .NET) i PyPy (w Pythonie).


Pewnie (jeżeli dopiero zaczynacie przygodę z programowaniem)większość rzeczy w powyższym cytacie jest nie zrozumiała dla was. Radzę przejść do wiki i poczytać trochę,poklikać itd.Powiem jedynie że Python jest bardzo funkcjonalny,wykonywany dynamicznie i szybki(jak na język skryptowy).

1.1Co możemy w nim napisać?
Wszystko absolutnie wszystko :P
Python posiada mnóstwo frameworków,bibliotek.Ponadto posiada możliwość dołączenia bibliotek napisanych w C(ofc specjalnie przystosowane do Pythona).Dzięki Django możemy w prosty sposób napisać CMSa(System Zarządzania Treścią).

Dobra koniec rozprawiania o tym jaki Python dobry jest.Przejdźmy od słów do czynów!
2.Instalacja Pythona

W tym tucie korzystał będe z ActivePython który nie jest oficjalnie wydany przez python.org.Można go pobrać ze strony:
http://www.activestate.com/activepython/downloads
(ActivePython Community Edition).Ponieważ instalator nie ustawia domyślnie zmiennych środowiskowych musimy ustawić je ręcznie.Wchodzimy więc kolejno:

Panel Sterowania->System->Zakładka Zaawansowane->Zmienne Środowiskowe

Tera powinno wyświetlić nam się okienko edycji zmiennych.Na dole w zmiennych systemowych klikasz Nowa i w okienku które się wyświetliło w polu pierwszym wpisujesz PYTHONPATH a w drugim ścieżke do folderu pythona np. tak: D:\python2.7.Jednak to jeszcze nie koniec.Musimy dodać jeszcze jedną zmienną.Robimy to identycznie jak z PYTHONPATH jednak zamiast PYTHONPATH wpisujemy PYTHONHOME.

Dobra mamy już przygotowane środowisko.
3.Hello World

Każdy skrypt pythona zaczynamy od:
#!/usr/bin/env python

Jest to odwołanie do interpretera Pythona na systemach *nixowych.Skrypty zapisujemy z rozszerzeniem .py
Do wyświetlania tekstu w konsoli służy funkcja print.Tekst który ma wypisać umiewszczamy między " lub '.Gdy tekst zawiera więcej niż jedną linię używamy """(3x").Skrypty Pythona uruchamiamy za pomocą polecenia(w CMD) :
python nazwa_pliku.py


Jeżeli napisałeś już Hello World'a sam to muszę ci pogratulować:Przeczytałeś mój tekst!Jeżeli nie udało ci się mimo uważnego czytania nie będe się gniewał :P ale jedna uwaga: przyłóż się :P

Dobra kod dla niepewnych:
#!/usr/bin/env python
print "Hello World"


Naszym oczom powinien ukazać się zgrabny napis Hello World!Teraz pora przejść do bardziej zaawansowanych rzeczy.


4.Zmienne
Sposobów przechowywania danych w programach jest całkiem sporo.Mamy bazy danych,stos,tablice...Trzeba jednak przyznać że najczęściej używaną strukturą programistyczną jest zmienna.Czym więc ta zmienna jest?Tutaj znów posłużę się cytatem:



Cytat
Zmienna - konstrukcja programistyczna posiadająca trzy podstawowe atrybuty: symboliczną nazwę, miejsce przechowywania i wartość; pozwalająca w programie odwoływać się przy pomocy nazwy do wartości lub miejsca przechowywania. Nazwa służy do identyfikowania zmiennej w związku z tym często nazywana jest identyfikatorem. Miejsce przechowywania przeważnie znajduje się w pamięci komputera i określane jest przez adres i długość danych. Wartość to zawartość miejsca przechowywania. Zmienna zazwyczaj posiada również czwarty atrybut: typ, określający rodzaj danych przechowywanych w zmiennej i co za tym idzie sposób reprezentacji wartości w miejscu przechowywania. W programie wartość zmiennej może być odczytywana lub zastępowana nową wartością, tak więc wartość zmiennej może zmieniać się w trakcie wykonywania programu, natomiast dwa pierwsze atrybuty (nazwa i miejsce przechowywania) nie zmieniają się w trakcie istnienia zmiennej[1]. W zależności od rodzaju języka typ zmiennej może być stały lub zmienny.

Dobra z powyższego opisu wiemy mniej więcej jak ta zmienna wygląda.W takim C posiada:

typ(np. int)nazwę(tzw.identyfikator)=wartość(np.10)


Ale my nie zajmujemy się C a Pythonem.Pora więc na Pythona:

#!/usr/bin/env python
a = 10
b =1
print a,b

Ten przykład wyjątkowo rozkazuje wam przepisać i uruchomić.Co widzicie?Zapewne jest to 10 1.Zadeklarowaliśmy właśnie 2 zmienne a i b a później je wyświetliliśmy.No cóż jeżeli to nadal was nie przekonało co do przydatności zmiennych to pokaże wam coś jeszcze:

#!/usr/bin/env python
a = '1'
b = '2'
c = 1
d = 2
print a+bprint c+d

Skopiujcie sobie i uruchomcie.Co widzicie?Jeżeli wszystko dobrze poszło jest to na pewno 12 i 3.Drugi wynik zgadza się,ale nie pierwszy.A to dlaczego skoro podaliśmy dobre dane?Po pierwsze zadeklarowaliśmy dwie zmienne tekstowe nie zaś liczby.Po drugie pozornie wykonując dodawanie zastosowaliśmy kontakenacje(więcej info na temat łączenia łańcuchów znaków w tucie psycho:Przeciążanie operatorów).Jak pewnie zauważyliście na łańcuchach znaków(tak nazywa się zmienne tekstowe) jak i na wartościach liczbowych możemy wykonywać działania.Oczywiście na łańcuchach nie wykonamy mnożenia i dzielenia.Zresztą łańcuchom znaków poświęce kolejny rozdział.Jakie obliczenia możemy wykonywać na zmiennych:
#!/usr/bin/env python
a = 2
b = 5
print a+bprint a*bprint a/bprint a%b

Deklarujemy 2 zmienne. Wyświetlamy wynik ich dodawania,mnożenia,dzielenia oraz reszty z dzielenia.Wykonajcie ten skrypt.Zobaczycie wyniki:
7
10
0
2
Zdziwi pewnioe się większość z was wynik dzielenia a/b.Dlaczego jest to zero a nie 0,4?Wynik jest zaokrąglony w dół ponieważ użyliśmy zmiennych całkowitych(integer),a my potrzebujemy typu zm,iennoprzecinkowego(float,double).Takowy deklarujemy tak samo jak w AutoIt czyli:
a = 2.0
b = 5.0

Pamiętajmy żeby liczby zmiennoprzecinkowe zapisywać w notacji amrykńaskiej nie zaś polskiej(chodzi mi o przecinek w notacji polskiej i o kropke w notacji USA).

Warto pamietać o możliwości przypisywania zmiennych do siebie czyli:
b = 10
a = b

4.1Łańcuchy znaków
Oprócz poznanej już wcześniej konkatenacji istnieje jeszcze hmm...obcinanie.Robimy to podając początek napisu który chcemy zostawić(liczymy zawsze od 0!!!) do indeksu litery.Moje mętne tłumaczenia być może mało wam mówią ,ale przykład już na pewno:
#!/usr/bin/env python
a = 'Witaj w swiecie'
print a[0]
print a[0:5]

Pierwszy napis jaki zobaczymy jest to litera W drugi zaś to Witaj.Zastosowaliśmy tuataj operator indeksowania o następującej składni:
nazwa_zmiennej[od:do]

Wyświetlanie łańcuchów wraz z wyświetlaniem zmiennych liczbowych wymaga użycia metody repr().

Oto prosty przykład zastosowania:
a='Twoj szczesliwy numerek to: '

c=7
print a + repr(c)

Składnia repr
repr(nazwa_zmiennej)

Bardzo przydatne jak widzimy ;)
Zamiast repr możemy użyć str o identycznej składni.
4.2Operacje na stringach:

s.capitalize() - zmienia pierwszą literę na dużą
s.center(długość) - Centruje napis w polu o podanej długości
s.count(sub) - zlicza wystąpienie podciągu sub w napisie s
s.encode(kodowanie) - zwraca zakodowaną wersję napisu ('utf-8', 'ascii', 'utf-16')
s.isalnum() - sprawdza czy wszystkie znaki są znakami alfanumerycznymi
s.isdigit() - sprawdza czy wszystkie znaki są cyframi
s.islower() - sprawdza czy wszystkie litery są małe
s.isspace() - sprawdza czy wszystkie znaki są białymi znakami
s.isupper() - sprawdza czy wszystkie litery są duże
s.join(t) - łączy wszystkie napisy na liście t używając s jako separatora
5.Instrukcje sterujące
5.1If...elif...else

5.1.1.If...
Instrukcję if możemy po polsku nazwać ,,jezeli".Istnieją dodatki do if w postaci elif(w C elseif) oraz else.Jeżeli pisałeś np. w AutoIt to zapewne zdziwi cię fakt że nie ma tu prawa bytu instrukcja switch. Jest po prostu zastąpiona szybszym if...elif.Dobra skończmy te formalności i przejdźmy do kodu,ale najpierw mała dygresja:python jest czuły na tzw.białe znaki(spacja,tabulator itd.).Oznaczają one zasięg instrukcji sterujących.

Oto nasz kodzik który wspólnie przeanalizujemy:
a=1
b=2
print "To zobaczymy"
if a==b:
        print "tego już nie zobaczymy"
print "koniec"

Na początku deklarujemy dwie zmienne o różnych wartościach.Później porównujemy te zmienne i jeżeli są równe (==) wtedy wyświetlamy napis "tego już nie zobaczymy".Jak łatwo się domyślić funkcja print zawarta w bloku if.
5.1.2 If...else
Fraza else to rozszerzenie instrukcji if.Możemy ją tłumaczyć tak:jeżeli warunek nie jest prawdziwy wtedy wykonuj instrukcje z bloku else.Tłumaczenie najprostsze na jakie mnie stać:)
Przykład
a=1
b=2
if a==b:
    print "a i be są równe"
else:
    print "a i b nie są równe"

Jak widać wykona się tylko instrukcja print z bloku else czyli a i b nie są równe
5.1.3 If...elif...else
Jak w nagłówku widać do znanej nam już pary wepchnął się elif.Elif znany być może skądinąd jako else if,pozwala nam na sprawdzenie kilku warunków.Przejdźmy do sedna sprawy czyli trafnego przykładu:
a=18
b=14
if a == b:
    print "A jest równe B"
elif a >= b:
    printa "A jest większe lub równe B"
else:
    print "A jest inne"

Pokumbinuj trochę ze zmiennymi a na pewno zrozumiesz sens.
Dodać oczywiście możemy więcej warunków elif. W Pythonie często służy do zasymulowania nieistniejącego w Pythonie Switch'a.
a=18
b=14
if a == b:
    print "A jest równe B"
elif a >= b:
    printa "A jest większe lub równe B"
elif a <= b:
   print "A jest mniejsze lub równe B"
elif a != b:
    print "A nie jest równe B"  #ten warunek został spełniony
else:
    print "A jest inne"

5.2 For

Jeżeli programowaliście kiedyś w jakimś języku to na pewno spotkaliście się z pętlą for. W Pythonie działa ona trochę inaczej: iteruje po zbiorze. Czyli działa jak foreach w innych językach. Do określenia zbioru liczbowego służy funkcja Range:
Range(1,10)

For ma składnię taką samą jak inne konstrukcje a więc:
for x in Range(1,10):
        print x


wyświetli nam kolejno 10 liczb.
5.2.1 Foreach
For jak już wspomniałem nie jest zwykłym for. Działa jak foreach więc jeżeli mamy np.listę i chcemy wyświetlić jej zawartość piszemy:
lista=['1','2','3'] #itd....
for x in lista:
        print x

Powinno wyświetlić nam zawartość listy.
5.3 While

While to pętla która wykonuje się dopóki jest spełniony warunek. Czym jest warunek wiemy z rozdziału nt. Porównań. Np.
x=10
v=10
while x==10: #wykona się
        print "LOL"

Powyższego kodu nie radzę uruchamiać-zbuguje wam konsole.
5.3.1
Jeżeli potrzebujemy pętli nieskończonej po prostu piszemy:
while True:

lub 
while 1


6.Typy danych
6.1Listy
Listy to najzwyklejsze,znane z innych języków tablice.Dla bardziej zielonych:tablica(Pythonowa lista)to po prostu inny dużo wygodniejszy.Załóżmy że piszemy lottomat porównujący wyniki losowania z dnia 1.1.2001 roku.Po prostu wsadzamy te wyniki do jednej wielkiej listy,a potem szukamy wartości powtarzających się.Cóż może to zły przykład ale napewno lepszy niż tłumaczenie tego typu:
-Po co robić 100 zmiennych o takiej samej zawartości jak możemy użyć tablicy.
Cóż po takim tłumaczeniu sam nie zabardzo wiem o co biega z tymi tablicami.
Pora na przykład:
lista=['Tutorial','example','Coding','Gods']
print lista[0],lista[2],lista[3]


Po uruchomieniu tego kodu zobaczymy napis:
Tutorial Coding Gods

Do elementów tablicy dostajemy się jak już mówiłem poprzez jej indeks.Indeks elementów jest ustalany dla pierwszego elemntu od zera!!!
By dostać się do listy możemy także podawać ujemne indeksy:
lista=['Tutorial','example','Coding','Gods']
print lista[-1]

W efekcie dostaniemy słówko Gods.Podawanie ujemnego indeksu skutkuje wyświetlaniem elemntów listy od tyłu.

6.2Krotki(Tuple)

Krotki to listy o niezmiennej zawartości.Są niemodowalne,możemy jednak wykonywać na nich podobne operacje poza zmienianiem zawartości krotki.
Krotkę tworzymy podobnie jak listę ale zamiast nawiasów kwadratowych wstawiamy okrągłe:<br>
krotka=(1,2,3,4,5,6,7,8,9)
for x in krotka:
        print x

6.3Słowniki
Słowniki to znane z PHP(i perla, tam jednak nazywane "haszami") tablice asocjacyjne.Do jej elementów dostajemy się podając klucz.
Przykład słownika:
numery={ "karol" : 888999 , "kasia" : 999999 }
print numery["karol"]

Gdzie karol i kasia to klucze a numery to wartości kluczy.Wartość podajemy po : (dwukropek)
7.Programowanie obiektowe
7.1 Wstęp.Funkcje
Programowanie obiektowe opiera się na tworzeniu nowych typów danych za pomocą klas. Klasa jak to pięknie napisane było w pewnej książce to: "zbiór danych oraz funkcji które z nich korzystają". O tym czym jest funkcja jeszcze nie powiedziałem. Jest to konstrukcja pozalająca na wywołanie pewnych instrukcji w niej zawartej. Funkcja przyjmuje parametry które pozwalają operować na realnych zmiennych. Moje tłumaczenie pewnie jak zwykle zbyt zawiłe więc zapodam przykład:
def Funkcja(imie ="nikt")
    print imieif __name__ == "__main__":
    Funkcja("Assarelliuss")
    Funkcja()

Przeanalizujmy:
def-definiuje funkcje o nazwie Funkcja,przyjmującą jako parametr imie. Imie jest parametrem domyślnym, ponieważ gdy go nie podamy zostanie przyjęte imie nikt.
print imie- wyświetla podany parametr. Na tym kończy się definicja funkcji a zaczyna właściwy program.
if __name__ == "__main__": - uruchamia aplikacje. O parametrze __name__ jeszcze sobie powiemy.
Przedostatnia linijka powoduje wywołanie funkcji Funkcja z parametrem Assarelliuss, Czyli wyświetla moje imie :)Ostatnia linijka powinna wyświetlić imie nikt, ponieważ ustawiliśmy takowy jako domyślny:)
7.2 Klasy, czyli nowe typy danych
Programowanie obiektowe polega na tworzeniu nowych typów danych, będących strukturami złożonymi z typów prostych(które nie są obecne w Pythonie, ponieważ interpreter "domyśla się" typów. Nie programującym w językach mocno typowanych trudno będzie zrozumieć tą metaforę). Klasa składa się z pól-zmiennych oraz metod-funkcji. Wyobraźmy sobie robota. Może on wykonywać kilka ruchów za pomocą metod, pola zaś określają jego stan. Metody mogą modyfikować pola, mogą również korzystać z nich. Ważną rzeczą w programowaniu obiektowym jest enkapsulacja danych. Chodzi o to by udostępnić użytkownikowi jedynie interfejs do obsługi klasy nie zaś całej klasy. Sprowadza się to do odpowiednich modyfikatorów dostępu. Pozwalają one na utrzymanie pewnego porządku oraz "czystość" danych. Klasy mogą dziedziczyć po innych klasach, otrzymując część ich metod i pól. 
Dobrze, część teoretyczną mamy już za sobą. Jak więc wygląda przykładowa klasa?


class Forum(object):
        def __init__(self):
                self.uzytkownicy = []
        def dodaj(self, obiekt):
                self.uzytkownicy.append(obiekt)
        def ilosc(self):
                return len(self.uzytkownicy)

7.2.1 __init__
Deklarację klasy rozpoczynamy od słówka class. Myślę że jest to całkiem logiczne :)
Później deklarujemy metodę(jak już mówiłem funkcję w klasie) o bardzo dziwnej nazwie __init__ i podajemy jej jeszcze dziwniejszy parametr- self. Cóż to znaczy?Metoda __init__ musi być w każdej klasie i jest w każdej klasie. Służy ona do inicjalizacji obiektu, czyli tego naszego ciastka(jak pamiętamy klasa jest tylko formą na ciastka). W Pythonie pełni role pseudokonstruktora. Dlaczego pseudo? Nie nazywa się tak jak klasa, jest prywatny(choć może być dziedziczony) i występuje razem z konstruktorem domyślnym, który alokuje pamięć, przygotowuje "teren" pod obiekt. Co także może dziwić, to w nim deklarujemy pola. Python jest na tyle elastyczny że pozwala na deklaracje pól poza konstruktorem. Jednak one i tak będą "wsadzone" do konstruktora. Dlaczego? Ponieważ musimy je zainicjować.
7.2.2 self
Self to synonim obiektu bieżącego. Pozwala nam na odwoływanie się do wnętrza klasy z jej wnętrza, bez ciągłego podawania nazwy klasy. Jeżeli ktoś programował w jakimś innym obiektowym języku niech wie że self jest tym samym co this.
7.2.3 object
Object to klasa po której dziedziczy każda klasa zdefiniowana w Pythonie. Zawiera wiele przydatnych metod jak np. __dict__, __dir__ itd. Po tej klasie możemy dziedziczyć jawnie(explicite) lub nie jawnie(implicite). Standard 2.x.x nakazuje dziedziczenie explicite.
7.3 Obiekt.
Dobrze mamy zdefiniowaną klasę, teraz musimy stworzyć obiekt. Tworzenie obiektu to nic innego jak stworzenie zmiennej. Przyjrzyjmy się przykładowi.
class Forum:
    def __init__(self):
        self.uzytkownicy = []  
        print "Metoda __init__"
    def dodaj(self, obiekt):
        self.uzytkownicy.append(obiekt)
        def ilosc(self):
        return len(self.uzytkownicy)
if __name__ == "__main__":
    forum = Forum()   

    forum.dodaj("Assa")
    forum.dodaj("Majki")
    forum.dodaj("PsychoBoy")
    """itd"""
    print forum.__dict__

    print forum.ilosc()

7.4 Dziedziczenie
7.4.1 Podstawy

Dziedziczenie to bardzo prosty sposób uzupełniania klas o metody. Klasa dziedzicząca po innej będzie zawierać jej metody, o ile nie są one prywatne. Sprawia to że nie musimy ciągle przepisywać tego samego kodu, jednocześnie pozwalając na tworzenie pewnej hierarchii. Założmy że mamy klasę Zwierzę. Z tej klasy chcemy wyprowadzić klasy Ssak oraz Ptak. Ssaki oraz ptaki mają pewne cechy wspólne jak np. oddychanie czy jedzenie. Bardzo prosto będzie więc zdefiniować je w klasie bazowej Zwierzę.
Przykład:
class Animal(object):
    def Oddychaj(self):
        print "Oddycham"
class Bird(Animal):
    def Lec(self):
        print "Lece"
class Mammal(Animal):
    def Biegnij(self):
        print "Biegne"
if __name__ == "__main__":
    anim=Animal()
    anim.Oddychaj()
    bird=Bird()
    bird.Oddychaj()
    bird.Lec()
    mammal=Mammal()
    mammal.Oddychaj()
    mammal.Biegnij()

Jak widać jest bardzo prosta prezentacja możliwości dziedziczenia. Oczywiście nie należy przesadzać :uśmiech:
7.4.2 Wirtualizacja

Czym było by programowanie obiektowe bez metod wirtualnych? Na pewno nie miałoby tylu zalet :usmiech z jezykiem:. Czym są metody wirtualne? To takie które mogą zastać nadpisane przez metodę innej klasy. W Pythonie nie potrzeba specjalnego określania jakie metody czy klasy są wirtualne. Prosty przykład:


class Animal(object):
    def Oddychaj(self):
        print "Oddycham"
class Fish(Animal):
    def Oddychaj(self):
        print "Oddycham skrzelami"
class Mammal(Animal):
    def Oddychaj(self):
        print "Oddycham plucami"
if __name__=="__main__":
    animal=Animal()
    animal.Oddychaj()
    fish=Fish()
    fish.Oddychaj()
    mammal=Mammal()
    mammal.Oddychaj()


7.4.3 Wielodziedziczenie
Wielodizedziczenie to dziedziczenie z kilku klas. Może być wam znane z języka C++. W Java oraz C# korzysta się z interfejsów, choć ta praktyka robi się coraz popularniejsza wśród programistów C++. Jak wygląda wielodziedziczenie? Prawie tak samo jak zwykłe dziedziczenie z jednej klasy z tymże jednak wyjątkiem, że dziedziczymy z wielu klas :P
Przykład:

7.5 Hermetyzacja
Choć nie istnieje w pełni w Pythonie możemy mieć jej drobną namiastkę. Aby uczynić metodę widoczną jedynie w klasie bazowej wystarczy dodać dwa znaki podkreślenia(__) przed nazwą metody. Sprawi to że metody prywatne nie będą dziedziczone i nie będzie możliwości skorzystania z nich w klasie pochodnej. Pisząc aplikacje dla siebie(tzn. bez przygotowywania interfejsu API dla innych programistów)zazwyczaj hermetyzację się pomija.
Przykład metody prywatnej:

class Foo(object):
        def __private(self): #to metoda prywatna
                pass


Łatwo zauważyć że mamy kilka metod prywatnych które są automatycznie dostarczane do każdej klasy np. pseudo-konstruktor __init__, słownik __dict__ itd. Dwa podkreślenia za nazwą metody są oznaczeniem konwencji przyjętej jeszcze przed wydaniem Python'a.
7.6 Dekoratory
Dekoratory to nic innego jak pewien trik składniowy 
7.7 Pare dobrych zwyczajów


8.Obsługa Wyjątków
Wyjątki-mechanizm obsługi błędów oraz sytuacji wyjątkowych. Wyobraźmy sobie, że pozwalamy na wybranie jakiegoś pliku użytkownikowi(potem będziemy czytać ten plik czy coś na nim robić). Istnieje pewne niebezpieczeństwo, że np. użytkownik poda ścieżkę do nie stniejącego pliku, poda błędną nazwę itd. Większość programów, które tego typu mechanizmy posiadają po podaniu błędnej nazwy czy adresu albo się 'wywalą", albo wyplują błąd, jednak dalej będą działać. Dzieje się tak ponieważ w 1. app programista nie przewidział podania błędnego adresu i system nie mogąc znaleźć pliku wygeneruje błąd(wyjątek), który nieobsłużony "wywali" aplikację. W 2 zaś programista przewidział takową możliwość i dodał obsługę wyjątku.
Prosty przykład(dzielenie przez 0):
if __name__ == "__main__":
    try:
        a=input("Podaj liczbe jaka chcesz podzielic")
        print a/0
    except Exception, e:
        print "Uwaga:", e

try oznacza w którym miejscu może zaistnieć wyjątek.
except przechwytuje wyjątek
Exception to typ wyjątku.
Typy wyjątków:
Exception - Wszystkie wyjątki
SystemExit - Generowany przez sys.exit()
IOError - Błędy związane z operacjami na plikach lub operacjami I/O
EOFError - Zgłaszany po osiągnięciu końca pliku
KeyboardInterrupt - Generowany przez klawisze przerwania (zazwyczaj CTRL+C)
SyntaxError - Błąd składni
Są jeszcze wyjątki generowane przez platformy(.NET, JVM itd.) na jakich są uruchamiane nasze aplikacje.
9.I/O
Operowanie na plikach to bardzo ważna w Pythonie ,jak i w każdym języku, rzecz. Pozwala na pisanie logów, automatyzację pewnych rzeczy, wpisywanie do pliku wyników operacji.
8.1 Otwieranie(txt)
text = open('nazwa_pliku').read()
print text

8.2 Otwieranie(bin)

text = open('plik_binarny', 'rb').read()
print text

8.3 Pisanie do pliku

open('plik_do_zapisu', 'w').write("tekst")
open('plik_binarny_do_zapisu', 'wb').write("dane binarne")



10.Bonus-Słówko o GUI
Aplikacje w konsoli nie są zbyt funkcjonalne ani interesujące.Warto więc pomyśleć o naucę jakiegoś modułu graficznego.Standardowo posiadamy Tkiner'a(Tk interface).Nie jest to jednak biblioteka łatwa w obsłudze.Zdecydowanie łatwiej uczyć się będzie QT4.Jest to obecnie najpopularniejszy moduł.Jeśli komuś nie idzie nauka QT4 warto zwrócić uwagę na kolejną duża biblioteke tym razem operującą w bardziej standardowy sposób na gui.Jest to wxPython kolejna,przepisana do Python'a biblioteka C++(wxWidgets).Jeżeli interesujemy się pisaniem na Linuxa warto zwrócić uwagę na GTK+.Dla wymagjących-masochistów istnieje Py32WIN.Jest to przepisana do pythona biblioteka WinApi.Z tego co czytałem nie ma częsći funkcji:(

Warto przetestować choć 2 biblioteki by zdobyć trochę doświadczenia.Pamiętaj że wybór należy tylko i wylącznie do ciebie!
#EDIT:Zapomniałem wspomnieć o IronPython i Jython które sprawiają że możemy użyć bibliotek natywnych dla danej platformy: .NET pozwala na skorzystanie z Windows Forms oraz Windows Presentation Foundation a Java na Swing'a oraz AWT(czy jakoś tak)
11.BONUS-Python a Perl
Oba to języki skryptowe. Oba stworzone były głównie pod Linux. Obydwu można użyć do tworzenia stron internetowych. Obydwa posiadają ogromne ilości modułów. Jest za to jedna dość znacząca różnica-składnia. Czytelność obydwu zobrazuje przykład-piosenka 99 Bottles of Beer.
Python:


#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
99 Bottles of Beer (by Gerold Penz)
Python can be simple, too :-)
"""
for quant in range(99, 0, -1):
   if quant > 1:
      print quant, "bottles of beer on the wall,", quant, "bottles of beer."
      if quant > 2:
                suffix = str(quant - 1) + " bottles of beer on the wall."
      else:
                suffix = "1 bottle of beer on the wall."
   elif quant == 1:
      print "1 bottle of beer on the wall, 1 bottle of beer."
      suffix = "no more beer on the wall!"
   print "Take one down, pass it around,", suffix
   print "--"
Perl:

    ''=~(        '(?{'        .('`'        |'%')        .('['        ^'-')
    .('`'        |'!')        .('`'        |',')        .'"'.        '\\
    .'=='        .('['        ^'+')        .('`'        |'/')        .('['
    ^'+')        .'||'        .(';'        &'=')        .(';'        &'=')
    .';-'        .'-'.        '\\        .'=;'        .('['        ^'(')
    .('['        ^'.')        .('`'        |'"')        .('!'        ^'+')
   .'_\\{'      .'(\\      .';=('.      '\\$=|'      ."\|".(      '`'^'.'
  ).(('`')|    '/').').'    .'\\"'.+(    '{'^'[').    ('`'|'"')    .('`'|'/'
 ).('['^'/')  .('['^'/').  ('`'|',').(  '`'|('%')).  '\\".\\"'.(  '['^('(')).
 '\\"'.('['^  '#').'!!--'  .'\\$=.\\"'  .('{'^'[').  ('`'|'/').(  '`'|"\&").(
 '{'^"\[").(  '`'|"\"").(  '`'|"\%").(  '`'|"\%").(  '['^(')')).  '\\").\\"'.
 ('{'^'[').(  '`'|"\/").(  '`'|"\.").(  '{'^"\[").(  '['^"\/").(  '`'|"\(").(
 '`'|"\%").(  '{'^"\[").(  '['^"\,").(  '`'|"\!").(  '`'|"\,").(  '`'|(',')).
 '\\"\\}'.+(  '['^"\+").(  '['^"\)").(  '`'|"\)").(  '`'|"\.").(  '['^('/')).
 '+_,\\",'.(  '{'^('[')).  ('\\$;!').(  '!'^"\+").(  '{'^"\/").(  '`'|"\!").(
 '`'|"\+").(  '`'|"\%").(  '{'^"\[").(  '`'|"\/").(  '`'|"\.").(  '`'|"\%").(
 '{'^"\[").(  '`'|"\;).(  '`'|"\/").(  '['^"\,").(  '`'|('.')).  ','.(('{')^
 '[').("\["^  '+').("\`"|  '!').("\["^  '(').("\["^  '(').("\{"^  '[').("\`"|
 ')').("\["^  '/').("\{"^  '[').("\`"|  '!').("\["^  ')').("\`"|  '/').("\["^
 '.').("\`"|  '.').("\`"|  ')."\,".(  '!'^('+')).  '\\",_,\\"'  .'!'.("\!"^
 '+').("\!"^  '+').'\\"'.  ('['^',').(  '`'|"\(").(  '`'|"\)").(  '`'|"\,").(
 '`'|('%')).  '++\\$="})'  );$:=('.')^  '~';$~='@'|  '(';$^=')'^  '[';$/='`';
12.BONUS-IDE do Pythona 
Każdy początkujący programista dochodzi w końcu do wniosku że zbyt dużo czasu poświęca na rzeczy mało związane z kodowaniem jak np. uruchamianie programów z lini poleceń czy pisanie make'a. Wtedy warto ściągnąć edytor który zawiera wszystko to czego potrzebuje programista oraz pomaga w pisaniu kodu.
IDE jakie polecam do Python'a:
Eclipse wraz z wtyczką PyDev(link, PyDev),
Editra z wtyczkami PyStudio, Launcher itd(link).,
VS 2010 (Od edycji Professional) PyTool's(link),
wbudowane w Pythona, nieskomplikowane IDLE.
Są to sprawdzone i przetestowane przeze mnie środowiska. Obecnie sam aktywnie korzystam z Eclipse ;).
Źródła
www.pl.wikipedia.org
http://www.python.rk.edu.pl/
Poradnik w trakcie pisania:)
#EDIT-Poprawiłem resztę. Teraz pozwolę sobie wyczyścić temat z niepotrzebnych postów 
Dołączona grafikaTen utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Unported.

Popularne posty