Zamieszczam swój program z OJP. Może komuś się przyda - jest tutaj bardzo dużo dobrego kodu (chociaż i słabego nie brakuje)... Mam nadzieję, że ktorą na tym skorzysta.
Powodzenia :)
http://jan.koprowski.zhr.pl/studia/OJP.tar.bz2
Tuesday, November 20, 2007
Monday, November 19, 2007
Ignorowanie w SVN
Swojego czasu znalazłem ciekawe linki na temat ignorowania w svn.
http://svn.haxx.se/users/archive-2006-01/0494.shtml
http://dotnot.org/blog/archives/2005/12/30/ignore-a-file-in-subversion-svn-ignore/
http://wolfram.kriesing.de/blog/index.php/2005/svnignore-and-svnkeywords
dla wszystkich, którym potrzebna jest ta umiejętność polecam zapoznanie się z nimi.
http://svn.haxx.se/users/archive-2006-01/0494.shtml
http://dotnot.org/blog/archives/2005/12/30/ignore-a-file-in-subversion-svn-ignore/
http://wolfram.kriesing.de/blog/index.php/2005/svnignore-and-svnkeywords
dla wszystkich, którym potrzebna jest ta umiejętność polecam zapoznanie się z nimi.
Troszkę plików z przeszłości
Postanowiłem pokazać co nieco plików z mojej przeszłości... Zamieszczona paczuszka zawiera:
1) Kilka programików ze współbiegów
2) Programy z OJP (C++)
3) Ciut programów z metod numerycznych
4) Program ZOO (katalog OJP), w którym można zobaczyć jak używać MySQL-a pod C++
Mam nadzieję, że komuś się przyda.
http://www.jan.koprowski.zhr.pl/studia/olimp.tar.bz2
1) Kilka programików ze współbiegów
2) Programy z OJP (C++)
3) Ciut programów z metod numerycznych
4) Program ZOO (katalog OJP), w którym można zobaczyć jak używać MySQL-a pod C++
Mam nadzieję, że komuś się przyda.
http://www.jan.koprowski.zhr.pl/studia/olimp.tar.bz2
Monday, November 12, 2007
OJP część E
W całym programie stosujemy ten sam styl wcięć. Jeżeli szef nakazuje używać K2R to używamy K2R choćbyśmy całe życie używali czegoś innego.
K2R:
for (int i=0; i <= 100; i++) {
K2R:
for (int i=0; i <= 100; i++) {
-> ...
-> ...
-> ...
}
// wada nie można jednym komentarzem sprawić by pętla wykonała się tylko raz.
// Styl Almana eliminuje ten problem:
// pętla leci tylko raz nie da się tego zrobić w K2R for (int i=0; i <= 100; i++)
Taki komentrz jest problematyczny
{
-> ...
-> ...
-> ...
}
-> ...
-> ...
-> ...
}
//Tabulacje zamieniamy na spacje. Bo nie ma wtedy problemu przy przeniesieniu z Linux-a na MAC-a programu, w którym zgadzają się wcięcia. Najlepiej jest mieć edytor, który automatycznie umie robić to za nas.
Taki komentrz jest problematyczny
/*
/* */
*/
Nie zadziała wyłączenie sekcji kodu.
Inna metoda wyłączania kodu
#ifndef 0
//
/*
*/
#endif
i tutaj zadziała :)
Dodatkowo, możemy opisywać każdy plik podając na przykład:
autora
data utworzenia
data ostatniej modyfikacji.
Opisujemy też każdą klasę mówiąc (nie programistycznie, ale tak z punktu widzenia modelowanej rzeczywistości) co przedstawia i co robi.
Komentujemy każdą metodę, mówiąc co robi (z punktu widzenia modelowanej rzeczywistości)
Komentujemy trudniejsze kawałki kodu, mówiąc co robią (ogólnie co robi dany kawałek kodu) jeżeli nie widać explicite co robi.
Parametry w stylu "zmienna = "wartosc"" podajemy w plikach nagłówkowych *.h, nie w plikach *.cpp - dodatkowo, jeżeli sparametryzujemy wszystkie parametry np. konstruktora to jest to automatycznie konstruktor domyślny: konstruktor();
i tutaj zadziała :)
Dodatkowo, możemy opisywać każdy plik podając na przykład:
autora
data utworzenia
data ostatniej modyfikacji.
Opisujemy też każdą klasę mówiąc (nie programistycznie, ale tak z punktu widzenia modelowanej rzeczywistości) co przedstawia i co robi.
Komentujemy każdą metodę, mówiąc co robi (z punktu widzenia modelowanej rzeczywistości)
Komentujemy trudniejsze kawałki kodu, mówiąc co robią (ogólnie co robi dany kawałek kodu) jeżeli nie widać explicite co robi.
Parametry w stylu "zmienna = "wartosc"" podajemy w plikach nagłówkowych *.h, nie w plikach *.cpp - dodatkowo, jeżeli sparametryzujemy wszystkie parametry np. konstruktora to jest to automatycznie konstruktor domyślny: konstruktor();
Wirtualizacja:
Robimy wirtualizację. Czyli robimy metody czysto wirtualne + destruktor musi być wirtualny.
Zasada substytucji Liskova mówi o tym, że jeżeli wszystkie klasy bazowe zastąpimy pochodnymi to działa nadal poprawnie.
Tuesday, November 6, 2007
Django, Rails, Pylons - zdobywanie informacji
Nie licząć blogów programistów to najlepiej informacje zdobywać:
O Pylon i Django na stronach poświęconym Rails.
O Rails na stronach poświęconych Pylon i Django.
To właśnie tam zawarte informacje nie dopełniają informacji pisanych przez fanów konkretnych rozwiązań. Wciąż brakuje mi obiektywnej tabelki rodem z chip-a, gdzie byłoby po prostu porównanie wszystkich frameworków i możliwość "spojrzenia" co mi odpowiada a co nie. A szkoda - bo czy to, że ma się wybór pomiędzy prostotą a meandrami kreatywności jest złe ?
O Pylon i Django na stronach poświęconym Rails.
O Rails na stronach poświęconych Pylon i Django.
To właśnie tam zawarte informacje nie dopełniają informacji pisanych przez fanów konkretnych rozwiązań. Wciąż brakuje mi obiektywnej tabelki rodem z chip-a, gdzie byłoby po prostu porównanie wszystkich frameworków i możliwość "spojrzenia" co mi odpowiada a co nie. A szkoda - bo czy to, że ma się wybór pomiędzy prostotą a meandrami kreatywności jest złe ?
Monday, November 5, 2007
Obiektowe języki programowania - część D
Mowa o wyjątkach...
Zwykła obsługa błędów w C
int sprawdz_saldo() {
...
return saldo;
}
1) Musimy poświęcić jakieś wartości na kod błędu (jaką ? -1, 0.1, -0.9999)
2) Trzeba sprawdzać w kodzie czy funkcja zakończyła się powodzeniem czy nie i reagować na niepowodzenia
3) Nie możemy wymusić na programiście reagowania na kody błędów
4) Program zaczyna wyglądać:
// spaghetti - code
if (funkcja(x) == -1) {
// Reakcja na blad
} else {
// Poprawny kod
}
if (function(y) == -1) {
// Reakcja na blad
} else {
// Poprawny
}
Czyta się potwornie nie wygodnie. Wady te niwelują wyjątki.
Zgłaszanie wyjątku:
// Definicja klasy, ktora zwracamy jako wyjatek
class blad_zakresu() {};
class blad_db() {};
void ustaw_rok_prod (int x) {
// blad_zakresu x;
// throw x; // Nazwany obiekt - x.
if (x <>> dane;
s >> dane;
if (!s) // oops
// Zanim zareagujemy na daną sprawdźmy czy strumień jest ok bo dane nie zostaną wczytane
// Może być tak, że EOF będzie powodował błąd więc ostatni odczyt powinien robić coś takiego:
if (!s && s.eof) // koniec pliku
if (!s && !s.eof) // błąd nie koniec pliku
// Strumieni same zgłaszają wyjątki
Polecane książki:
http://www.josuttis.com/
http://wysylkowa.pl/ks239250.html
Język C++
jezyk c++
Stroustrup Bjarne
Zwykła obsługa błędów w C
int sprawdz_saldo() {
...
return saldo;
}
1) Musimy poświęcić jakieś wartości na kod błędu (jaką ? -1, 0.1, -0.9999)
2) Trzeba sprawdzać w kodzie czy funkcja zakończyła się powodzeniem czy nie i reagować na niepowodzenia
3) Nie możemy wymusić na programiście reagowania na kody błędów
4) Program zaczyna wyglądać:
// spaghetti - code
if (funkcja(x) == -1) {
// Reakcja na blad
} else {
// Poprawny kod
}
if (function(y) == -1) {
// Reakcja na blad
} else {
// Poprawny
}
Czyta się potwornie nie wygodnie. Wady te niwelują wyjątki.
Zgłaszanie wyjątku:
// Definicja klasy, ktora zwracamy jako wyjatek
class blad_zakresu() {};
class blad_db() {};
void ustaw_rok_prod (int x) {
// blad_zakresu x;
// throw x; // Nazwany obiekt - x.
if (x <>> dane;
s >> dane;
if (!s) // oops
// Zanim zareagujemy na daną sprawdźmy czy strumień jest ok bo dane nie zostaną wczytane
// Może być tak, że EOF będzie powodował błąd więc ostatni odczyt powinien robić coś takiego:
if (!s && s.eof) // koniec pliku
if (!s && !s.eof) // błąd nie koniec pliku
// Strumieni same zgłaszają wyjątki
Polecane książki:
http://www.josuttis.com/
http://wysylkowa.pl/ks239250.html
Język C++
jezyk c++
Stroustrup Bjarne
Thursday, November 1, 2007
latex pod PHP
Kiedy zacząłem używać polecenia latex poprzez php - system() ... zaczął wyskakiwać komunikat:
Ponieważ linijka PHP wyglądała mniejwięcej tak:
This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) I can't find the format file `latex.fmt' PHPPlik latex.fmt znalazłem o dziwo w /home/dziubdziub/.texmf-var/web2c/latex.fmt.
Ponieważ linijka PHP wyglądała mniejwięcej tak:
system('/usr/share/texmf/bin/latex -output-directory='.TMP.'songbooks '.TMP.'songbooks/'.$name.'.tex');Przekopiowałem ten plik do katalogu wskazanego przez -output-directory i zaczęło działać :)
Subscribe to:
Posts (Atom)