Witam!
Jako że ostatni przepisuję dosyć długaśśnyy kod z C# na C++ natknąłem się, a raczej spostrzegłem pewną hm... jak by to nazwać...odstępstwo(?). Chodzi mi tutaj o język C++ i programowanie obiektowe. W każdym chyba dziś bardziej poważanym języku mamy możliwość projektowania obiektowego. Wd. mnie w C++ jest ono NAJBARDZIEJ SKOPANE. Dlaczego? Ponieważ brak mi tutaj jakiegoś uporządkowania, wygody... Gdy piszę jakiś projekt zazwyczaj rzadko zaglądam do manuali języka ponieważ no nie muszę. Jako że dosyć często piszę w C i Python nie jest mi obcy, raczej w tych językach się skupiam. W C do manuli nie zaglądam w sumie w ogóle(ew. jeżeli potrzebuję korzystać z bibliotek typu string etc.), w Pythonie coraz rzadziej...Natomiast w C++ przy manualu spędzam więcej czasu niż zajmuje mi pisanie! Problemy sprawiane przez dziwną dosyć składnię i niepełną obiektowość są poprostu przybijające! Dziwne wypełnianie metod, wirtualny(!) destruktor, pliki nagłówkowe ze strażnikami, bezsensowne RTTI zwiększające wagę binarek...Można wymieniać latami. Szkoda że mam trochę zbyt dużo roboty bo całkiem rozbudowany jest mój system obiektowości oraz klasa string którą przy jej pomocy w C napisałem. Efekt przedstawię w miarę wolnej chwili :)
poniedziałek, 26 września 2011
wtorek, 13 września 2011
Supremacy 1914 - strategia czasu rzeczywistego osadzona w realiach I Wojny Światowej
Supremacy 1914 - strategia czasu rzeczywistego osadzona w realiach I Wojny Światowej: Zagraj w Supremacy 1914, darmową strategię czasu rzeczywistego oraz laureata nagrody Gry Przeglądarkowej Roku 2009
czwartek, 8 września 2011
Clojure-Lisp na JVM?
Hai All!
Otóż niedawno zainteresowałem się przepięknym językiem jakim jest Lisp :). Szukając implementacji odpowiedniej dla mojego systemu oraz upodobań trafiłem najpierw na Scheme(bardzo fajnie sie piszę zwłaszcza pod schemik'iem :D). Wczoraj znalazłem Clojure. Znalazłem w sumie przez przypadek ponieważ szukałem jakiejś biblioteki graficznej pod Scheme. Nie znalazłem, za to pooglądałem sobie src kilku gierek napisanych w Clojure z wykorzystaniem JOGL oraz AWT i Swing'a. Ogólnie muszę jeszcze obczaić AWT i Swinga w szczególności operacje na obrazach, a więc czeka mnie długie debuggowanie .clj :) Myślę że nie potrwa to jakoś potwornie długo i niedługo pojawi się jakaś gierka sygnowana moim imieniem :)
Otóż niedawno zainteresowałem się przepięknym językiem jakim jest Lisp :). Szukając implementacji odpowiedniej dla mojego systemu oraz upodobań trafiłem najpierw na Scheme(bardzo fajnie sie piszę zwłaszcza pod schemik'iem :D). Wczoraj znalazłem Clojure. Znalazłem w sumie przez przypadek ponieważ szukałem jakiejś biblioteki graficznej pod Scheme. Nie znalazłem, za to pooglądałem sobie src kilku gierek napisanych w Clojure z wykorzystaniem JOGL oraz AWT i Swing'a. Ogólnie muszę jeszcze obczaić AWT i Swinga w szczególności operacje na obrazach, a więc czeka mnie długie debuggowanie .clj :) Myślę że nie potrwa to jakoś potwornie długo i niedługo pojawi się jakaś gierka sygnowana moim imieniem :)
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
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
- 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 :))
- Wartościowanie leniwe
- non-case sensitive(nieczułość na wielkość znaków)
- Cały program to jedna wielka procedura zawierająca podprocedury. W przeciwieństwie do C może się nazywać dowolnie :)
- Brak funkcji w stylu print-format etc. Uniemożliwia to dodatkowe błędy związane z nadmiarem lub niedoborem argumentów
- "Zabezpieczenie" kolejności rzutowania.
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 skoki7.1 gotogoto Label; Dont_Do_Something; <<Label>> ...
7.2 returnDla 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;
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ć:
Pojęcie script kidda zatem mamy wytłumaczone. Teraz powiedzmy sobię jak takim script kiddem nie być:
- 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.
- lrn google. Tam jest wszystko czego tylko sobie życzysz :)
- Programuj jak najwięcej. Script kidd nie potrafi napisać aplikacji podobnej do tej z której korzysta-dlatego jest lamerem.
- Jeżeli korzystasz z jakiejś aplikacji spytaj się jego twórcy lub sam pomyśl jak ona może działać :)
- Use source, Luke :)
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.
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*4Jak 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).
#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
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
Subskrybuj:
Posty (Atom)
Popularne posty
-
Witam! Dziś i nie tylko dziś opowiemy sobie o kombinatoryce. Czym jest więc ta kombinatoryka? Kombinatoryka to teoria obliczania liczby...
-
Witam wszystkich! Oto nadeszła pamiętna chwila! Lynx obudzony ze snu, po 8 godzinach pracy ożywa! Czym był Lynx? Lynx był kiedyś moim nie...
-
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...
-
Witam! Dostałem dzisiaj bardzo śmiesznego maila. Hmm...może zamiast opisywać co takiego w nim było wrzuce tutaj ocenzurowaną wersję ;) Pan...
-
Witam! Jest to mój pierwszy post "polityczny". Możliwe że takowych pojawi się więcej :) DISCLAIMER: Ten post i każdy następny ...
-
Hai All! Otóż niedawno zainteresowałem się przepięknym językiem jakim jest Lisp :). Szukając implementacji odpowiedniej dla mojego systemu...
-
Hai all! Piszę sobie od niedawna w Javie, praktycznie całkowicie się na nią przerzucając. I muszę przyznać jestem zadowolony. Nawet bardzo...
-
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 styc...
-
Megatutorial by Aссаръеллюсс Witam w drugim moim wielkim tutorialu!Tym razem jednak nie o AutoIT ,ale o innym już dużo 'doroślejszym...
-
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 nasz...