Archiwum dla the ‘O programowaniu’ Category

Jan. 16, 2009

Tao programowania. Tao się nie starzeje :) Czytałem to dawno temu, i czytałem to wiele razy, i podoba mi się na tyle że to umieściłem tutaj :)

——————————————-
T a o   P r o g r a m o w a n i a
——————————————-

autor nieznany

T r a n s l a t e d   B y
G e o f f r e y   J a m e s

Przeklad na jezyk polski

EDWART

———————————
S p i s   T r e s c i
———————————

Ksiega  1   –  Milczaca Pustka

Ksiega  2   –  Starozytni Mistrzowie

Ksiega  3   –  Projekt

Ksiega  4   –  Kodowanie

Ksiega  5   –  Obsluga

Ksiega  6   –  Zarzadzanie

Ksiega  7   –  Korporacyjna Madrosc

Ksiega  8   –  Sprzet i Oprogramowanie

Ksiega  9   –  Epilog

M i l c z a c a   P u s t k a
K s i e g a   P i e r w s z a
———————————————————————–
Oto rzekl Mistrz Programista:

“Gdy nauczysz sie odczytywac z trapu kod bledu, bedzie to znak,
ze mozesz odejsc.”
———————————————————————–

1.1

Cos tajemniczego sie uformowalo, narodzone w milczacej pustce. Czekajac
samotnie w bezruchu, jest naraz nieruchome i zmienne. Ono jest zrodlem
wszystkich programow. Nie znam jego imienia, wiec bede je nazywal
Tao Programowania.

Jezeli Tao jest dobre, to i system operacyjny jest dobry. Jezeli system
operacyjny jest dobry, to i kompilator jest dobry. Jezeli kompilator
jest dobry to i aplikacja jest dobra. Uzytkownik jest zadowolony i na
swiecie panuje harmonia.

Zas Tao Programowania odlatuje daleko i wraca wraz z wiatrem poranka.

1.2

Tao zrodzilo kod maszynowy. Kod maszynowy zrodzil assembler.

Assembler zrodzil kompilator. Obecnie jest dziesiec tysiecy jezykow.

Kazdy jezyk ma swoja sile, jak i slabosc. Kazdy jezyk wyraza Jin i Jang
oprogramowania. Kazdy jezyk ma swoje miejsce w Tao.

Lecz nie pisz w COBOLu, jezeli tylko mozesz tego uniknac.

1.3

Na poczatku bylo Tao. Tao zrodzilo Czas i Przestrzen.
Zatem Czas i Przestrzen sa Jin i Jang programowania.

Czytaj dalej »

Napisał Dominik w kategoriach O programowaniu | Brak komentarzy

Dec. 5, 2008

Czyli SQL jakiego być może nie  znacie.

Ale zacznę dowcipem od kolegi z pracy, który naprawdę bardzo mnie rozbawił (pewnie dlatego byłem wtedy w trakcie czytania książki o teorii relacyjnego modelu danych :) )

Przychodzi SQL do baru, tam dwie tabele:
- Can I JOIN You?

:-D

A teraz do rzeczy. Czytałem swego czasu Manual MySQL. Ostatnio postanowiłem odświeżyć sobie w ramach wieczornej literatury moje podręczne notatki z owej tematyki.

I po przeczytaniu doszedłem do wniosku że jest tam kilka ciekawych, fajnych rzeczy, o których często nawet nie wiemy. Może dlatego ze są to rzeczy bardziej zaawansowane, czyli nie potrzebne Kowalskiemu.

I tak choćby bity i notacja b’:

#tworzymy tabelkę
CREATE TABLE t (b BIT(8));

#wstawiamy bity - znaczy dane :)
INSERT INTO t SET b = b’11111111′;
INSERT INTO t SET b = b’1010′;
INSERT INTO t SET b = b’0101′;

#a tu pobieramy sobie wyniki z konwersją między systemami
SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;

Dalej - może nie takie zaawansowane, bo każdy SQL’ista :) powinien to znać - mianowicie User Defined Variables czyli nasze zmienne w SQL ;)

#przykład z manual’a
SET @t1=0, @t2=0, @t3=0;
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

#no to może jeszcze raz nasze bity
SET @v1 = b’1000001′;
SET @v2 = CAST(b’1000001′ AS UNSIGNED), @v3 = b’1000001′+0;
SELECT @v1, @v2, @v3;

Operator <=> czyli null safe equal. A po co to? Jak ktoś czytał książkę C.J. Date’a, o której pisałem wcześniej - będzie wiedział :)

#ale może przykład wystarczy by ‘przypomnieć’ sobie o co chodzi :)
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0

Programiści, którzy zapomnieli o konstrukcji w linijce poniżej pewnie się teraz uśmiechną:
SELECT IF(1<2,’yes’,'no’) as wynik;

I niechaj SQL przemówi:
SELECT IF(STRCMP(’test’,'test1′),’no’,'yes’);
:)

Przy okazji: potęga agregacji jest niekwestionowana, ale pamiętam pytanie o problem z DISTINCT + konkretne pole:

#więc:
SELECT COUNT(DISTINCT price) FROM shop;

Co jeszcze? Np. oprogramowanie GIS - mamy tu wsparcie od strony MySQL:

http://dev.mysql.com/doc/refman/5.0/en/opengis-geometry-model.html

Choć jeszcze nie używałem tego w konkretnych projektach np. www + mapy, po godzince zabawy mogę powiedzieć - fajna sprawa.

A na deser eksport tabeli do pliku CSV:
SELECT * INTO OUTFILE ‘/home/dominik/tabela.csv’
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘
LINES TERMINATED BY ‘\n’
FROM shop;

Oraz coś, co naprawdę może się przydać (ahh, przypominają mi się stare czasy i praca nad pewnym katastrofalnym systemem) - tabela tymczasowa:

CREATE TEMPORARY TABLE tabela (
  id int(10) unsigned NOT NULL auto_increment,
  nazwisko VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO tabela SET nazwisko=”Thompson”;
INSERT INTO tabela SET nazwisko=”Torvalds”;
SELECT * FROM tabela;

Coś bardziej zaawansowanego? Optymalizacje - performance. Ale przecież to znamy, bo robimy na co dzień ;)

Enjoy! ( and JOIN ;-) )

Napisał Dominik w kategoriach O programowaniu | 1 komentarz

Nov. 11, 2008

Symfony 1.1 Forms, czyli nowość w Symfony, na którą warto zwrócić uwagę.

Cudo o którym mowa bazuje na nowych klasach: sfForm oraz sfWidget

Przykład:
// lib/form/ContactForm.class.php
class ContactForm extends sfForm
{
&nbsp; public function configure()
&nbsp; {
&nbsp;&nbsp; $this-&gt;setWidgets(array(
&nbsp;&nbsp;&nbsp; 'name'    =&gt; new sfWidgetFormInput(),
&nbsp;&nbsp;&nbsp; 'email'   =&gt; new sfWidgetFormInput(),
&nbsp;&nbsp;&nbsp; 'message' =&gt; new sfWidgetFormTextarea(),
&nbsp;&nbsp; ));
&nbsp; }
}

I… na tej podstawie budujemy nasz formularz!
$ php symfony generate:module frontend contact

Otrzymaliśmy nowy moduł: contact.

Teraz tylko akcja:
// apps/frontend/modules/contact/actions/actions.class.php
class contactActions extends sfActions
{
&nbsp;public function executeIndex()
&nbsp;{
&nbsp;&nbsp;$this-&gt;form = new ContactForm();
&nbsp;}
}

oraz widok:
&lt;form action="&lt;?php echo url_for('contact/submit') ?&gt;" method="POST"&gt;
&lt;table&gt;
&nbsp;&lt;?php echo $form ?&gt;
&nbsp;&lt;tr&gt;
&nbsp;&nbsp;&lt;td colspan="2"&gt;
&nbsp;&nbsp;&nbsp;&lt;input type="submit" /&gt;
&nbsp;&nbsp;&lt;/td&gt;
&nbsp;&lt;/tr&gt;
&nbsp;&lt;/table&gt;
&lt;/form&gt;

Czyścimy cache, otwieramy contact/index. Pokaż żródło i widzimy elegancko wygenerowany kod.
DRY! Ku chwale obiektowości! :)

Co jeszcze ciekawego?
Dla uprzednio stworzonych pól możemy sobie zadefiniować na stałe etykiety, do tego wszystkiego - automatyczna ochrona przed atakami XSS.

Nie musimy także tracić za dużo czasu na walidację.

$this-&gt;setValidators(array(
&nbsp;'name'    =&gt; new sfValidatorString(array('required' =&gt; false)),
&nbsp;'email'   =&gt; new sfValidatorEmail(),
&nbsp;'subject' =&gt; new sfValidatorChoice(array('choices' =&gt; array_keys(self::$subjects))),
&nbsp;'message' =&gt; new sfValidatorString(array('min_length' =&gt; 4)),
));

Automatyczne walidatory! Bo przecież chodzi o to żeby programować jak najdokładniej ale i  oczywiście jak najszybciej!

Temat jest spory, chciałem tylko zwrócić na niego uwagę.
Zapraszam do źródła:

http://www.symfony-project.org/book/forms/1_1/en/

Enjoy :)

Napisał Dominik w kategoriach O programowaniu | Brak komentarzy

Nov. 3, 2008

Jeśli jeszcze nie wspominałem to teraz wspomnę, że bawiłem się swojego czasu w programowanie GUI z użyciem PHP-GTK.

Mowa o rozszerzeniu PHP pozwalającym na programowanie interfejsów użytkownika w oparciu o GTK. Miałem do czynienia z tego typu rozwiązaniami, np. Perl Tk, i przyznam że PHP-GTK jest dość ciekawe.

Również programowanie idzie szybko i wymaga stosunkowo niewiele kodu.

Aby użyć tego cuda należy mieć skompilowane PHP o z obsługą rozszerzenia GTK. I żeby nie było że Linux i Linux, to zaprezentuje przykłady prosto z Windows :)

Skoro Windows to wersję PHP o której mowa można pobrać z internetu ;)

Może prosty przykład:
function echoValue($spinButton) {
//dane beda widoczne w konsoli
echo $spinButton-&gt;get_value() . "\n";
}

$window = new GtkWindow();
$window-&gt;set_size_request(150, 150);
$hScale = new GtkHScale(new GtkAdjustment(4, 0, 10, 1, 2));
$hScale-&gt;connect('value-changed', 'echoValue'); //przypisanie funkcji
$vScale = new GtkVScale(new GtkAdjustment(4, 0, 10, 1, 2));
$vScale-&gt;connect('value-changed', 'echoValue');
$vScale-&gt;set_value_pos(GTK::POS_LEFT);
$hBox  = new GtkHBox();
$vBox1 = new GtkVBox();
$vBox2 = new GtkVBox();
$window-&gt;add($hBox);
$hBox-&gt;pack_start($vBox1);
$hBox-&gt;pack_start($vBox2);
$vBox1-&gt;pack_start(new GtkLabel('Skala pozioma'), false, false);
$vBox1-&gt;pack_start($hScale, false, false);
$vBox2-&gt;pack_start(new GtkLabel('Skala pionowa'), false, false);
$vBox2-&gt;pack_start($vScale);
$window-&gt;connect_object('destroy', array('Gtk', 'main_quit'));
$window-&gt;show_all();
Gtk::main();

Uruchamiamy kod w wierszu poleceń:

$> php ./kody/scroller.php  i….

Toolbar zrobić jeszcze łatwiej:

$window = new GtkWindow();

Czytaj dalej »

Napisał Dominik w kategoriach O programowaniu | Brak komentarzy

Tak to już jest - ewolucja programisty. Od Notatnika z Windows, po Vima :)

Ale edytory to za mało - mam już za sobą Editplus, Creamson Editor, Vim, PSPad, o ostatnio od dłuższego czasu używam jEdit, który nie powiem - bardzo mi pasuje. To znakomity edytor dla programistów.

Przychodzi jednak pora, kiedy wybiera się IDE. Programista PHP myśli pewnie zwykle o Zend Studio. Jako że u mnie PHP nie jest jedynym językiem, potrzebowałem czegoś wspierającego inne języki, głównie Java, C/C++, Ruby.

U mnie wybór padł bezwzględnie na Netbeans. Eclipse mam zainstalowane ze względu na fajną wtyczkę - pyDev, czyli wsparcie dla programowania w Python’ie. Ale już nie długo, bo czekam na pełne wsparcie języka Python w Netbeans - jest już taki projekt, więc niedługo pewnie w moim Netbeans ostro zasyczy :)

Netbeans jest super, mamy tu wsparcie oczywiście dla Java, oraz Mobility:

Przekładowy projekt MobileApp:

Ponadto wsparcie Ruby, C i C++ (podpięte pod narzędzia Cygwina - jeśli piszę coś w C, lub C++ to w Netbeans). Mamy też wsparcie dla UML i Versioning - genialne - wsparcie m.in dla svn, importowanie projektu z repozytorium. Super! I to standardowo, bez instalowania i przeklętych zależności znanych z Eclipse.

No i do tego wsparcie dla PHP. Na razie do ściągnięcia osobno, jako Early Access for PHP, ale już tego używam i jestem zadowolony.

O takich rzeczach jak sprawdzanie syntaktyki w czasie rzeczywistym i podpowiedzi nawet nie wspominam :) To naprawdę przyśpiesza i umila pracę.

Gorąco polecam Netbeans!

Napisał Dominik w kategoriach O programowaniu, Praca | Brak komentarzy

Oct. 26, 2008

Cygwin to implementacja standardu POSIX przeznaczona dla Windows, oraz oprogramowanie dostępne zwykle w systemach Linux / Unix. Pozwala nam się cieszyć możliwościami i narzędziami tych systemów. Wszystkie są dostępne wraz z kodem źródłowym.

Jeśli programista pracuje pod Windows, powinien mieć zainstalowany Cygwin, chociaż podstawowy - przyjazny instalator Cygwina pozwala zainstalować potrzebne pakiety.

I tak w moim przypadku - np. środowisko do programowania w C oraz C++, z użyciem narzędzi GCC, G++, GDB - debugger, itd. To wszystko podpięte do Netbeans i mam znakomite środowisko programowania.

Cygwin Now!

Napisał Dominik w kategoriach O programowaniu, Praca, Systemy operacyjne | Brak komentarzy

Tak jak napisałem na podstronie O mnie - programowanie to moja pasja i hobby. Jako że nie należę do tych programistów, którzy w zaciszu firmy klepią swój kod monotonnie i jest im tam ‘dobrze’.

Ja czuję potrzebę rozwoju. Dla przykładu spójrzmy na język PHP, masa programistów, masa ofert pracy, i to naprawdę za duże stawki - po kilka tysięcy PLN. Warto spojrzeć na to się dzieje na rynku teraz. Ale warto także spojrzeć nieco w przyszłość.

To co da się zauważyć o programistów zajmujących się tym to znudzenie językiem PHP. W pewnym momencie zaczyna się wymiotować tym językiem. Ja też zajmuję się m.in. PHP i też tego doświadczam. Wszystko jest fajnie, ale po prostu czegoś tu brakuje, robi się ciągle podobne rzeczy, i bądźmy szczerzy - pole do popisu dla programisty w tym języku jest ograniczone. Oczywiście póki co nie rozstanę się z tym językiem, ale myślę o przyszłości i inwestuję już w naukę innych języków.  Praktyka pokazuje jak dobrze radzą sobie programiści PHP z takimi językami jak Python, Java, Ruby. Obok pracy - z PHP, programuję także w C i Perl, ale już bardziej hobbystycznie i na mniejszą skalę. Mam nadzieję że nowe języki pomogą mi jeszcze bardziej zintegrować hobby z pracą.

U mnie na pierwszym miejscu Python. Każdy ma swoje zdanie, moje jest takie że język jest genialny, a kod jak na ten typ języka jest bardzo szybki. Język ma już swoją renomę, używa go nawet Google i NASA, instytucje naukowe i coraz większa liczba fanów - programistów. O takich możliwościach jak wxPython, Mobile Python czy też  framework aplikacji webowych - Django, nawet nie wspominam.

Punkt drugi - Ruby. Kolejny genialny język, również o bardzo ciekawych możliwościach. Tu głównie kierunek frameworka Rails mnie interesuje.

Idąc jeszcze dalej - Java. Miejsca tego języka w czołówce popularnych języków nikt chbya nie zakwestionuje. Jest już na swój sposób legendarny, i ma bardzo szeroki wachlarz zastosowań. Dla mnie najbardziej interesujące są tu zagadnienia programowania urządzeń mobilnych - J2ME, a także J2EE oraz kierunek Google - GWTi nowy system Android.

Jak widać jest nad czym posiedzieć :) I to na dłuższy okres czasu, bo błyskawicznie się tego i tak nie opanuje. Ale za jakiś czas będę mógł się pochawalić biegłą znajomością  ww języków, oraz projektami.

Napisał Dominik w kategoriach O programowaniu, Praca, Życie | Brak komentarzy

Tak, tak niestety to czasem wygląda. Od jakiegoś czasu nie narzekam na coś takiego, jestem zadowolony z pracy.

Niestety filmik pokazuje trochę prawdy o tym jak czasem pracują programiści. A jest to w gruncie rzeczy wina tych (epitety zachowam dla siebie), którzy są ‘nad nimi’, czyli kiepskiego zarządzania. Cóż, u mnie kiepskiego zarządzania nie ma i nie będzie na pewno :)

Napisał Dominik w kategoriach O programowaniu, Praca | Brak komentarzy