# Menu główne

# Najpopularniejsze wpisy

# Tagi

"Wzorce projektowe. Rusz głową!" recenzja książki

Dodany: Poniedziałek, 20 Luty 2012, bez komentarzy, tagi: programowanie, recenzja książki

Ostatnio wpadła mi w ręce wymieniona w tytule książka wydawnictwa helion. Po jej przeczytaniu postanowiłem co nieco o niej napisać.

Seria "Rusz głową!"

Na wstępie muszę poruszyć kwestię samej serii "Head first" (wydawnictwo helion sprzedaje ją pod nazwą: "Rusz głową!"). Książki z tej serii różnią się znacznie od większości pozycji informatycznych, jakie można spotkać w księgarniach. Autorzy nie tylko kładą nacisk na ilość informacji w nich zawartych, ale również na łatwość ich przyswajania. Tak więc w książkach, z tej serii, znajdziemy liczne łamigłówki, testy sprawdzające, ilustracje, dialogi oraz komentarze, zmuszające do myślenia i niepozwalające się zbyt szybko nudzić.

Ocena książki

Co do samej książki "Wzorce projektowe. Rusz głową" to uważam, że jest bardzo dobra. W kolejnych rozdziałach omawiane są najpopularniejsze wzorce projektowe. Szczególnie zasługuje na pochwałę to, że gotowe rozwiązania nie są podawane od razu na tacy, tylko wraz z przeczytaniem kolejnych stron rozdziału, czytelnik może sam dojść do określonych wniosków i rozwiązań. Jest to możliwe, ponieważ najpierw jest pokazany określony problem, a dopiero potem proponowane są kolejne rozwiązania (z przedstawieniem ich wad i zalet) dochodząc na końcu do rozwiązania przedstawiającego klasyczny przykład wzorca projektowego.

Kolejną zaletą tej pozycji książkowej jest fakt, że oprócz diagramów i opisów wzorców zamieszczono też gotowy kod napisany w Javie, a więc w języku, który jest cały czas popularny i bardzo często używany.

Co do szybkości, z jaką można przyswoić wiedzę z tej książki to również jest dobrze. Dzięki testom na końcu rozdziałów można dowiedzieć się ile się zapamiętało i ewentualnie powrócić do części rozdziału. Co prawda autorzy zalecają, czytając książkę, od razu robić zamieszczone w nich przykłady, ale myślę, że nadaje się ona również do poczytania podczas podróży.

Ostatnie rozdziały pokazują jak łączyć poznane wzorce oraz gdzie szukać dodatkowych informacji na ich temat.

To, co zasługuje na szczególne uznanie to fakt, że autorzy nie próbują na siłę wmówić, że zawsze i wszędzie da się i trzeba stosować wzorce projektowe, proponują natomiast zachować umiar i zdrowy rozsądek, poprzez stosowanie wzorców projektowych tylko tam gdzie może to przynieść wymierne korzyści.

Ogólnie książkę polecam wszystkim tym, którzy chcą dowiedzieć się czegoś o wzorcach projektowych lub trochę sobie o nich przypomnieć.

Zalety książki:

  • przedstawiono wszystkie najpopularniejsze wzorce projektowe,
  • testy i zadania w każdym rozdziale (z rozwiązaniami na końcu),
  • przykłady w Javie,
  • nowatorski i ciekawy sposób przekazywania wiedzy (autorzy starają się podtrzymać uwagę czytelnika).

Wady:

  • nie każdemu może odpowiadać forma zaprezentowana w tej książce.

System ocen w postaci gwiazdek

Dodany: Niedziela, 12 Luty 2012, liczba komentarzy: 1, tagi: javascript, jQuery, programowanie, przydatne skrypty

Witam po dłuższej przerwie. Dzisiaj pokaże jak napisać prosty system oceniania w postaci gwiazdek. Przy okazji pokarzę jak można w prosty sposób rozszerzyć funkcjonalność biblioteki jQuery, ale po kolei.

Co będziemy robić

Napiszemy mechanizm, który zamieni standardowego input-a w system do oceniania w postaci gwazdek, które będą reprezentowały aktualną ocenę użytkownika. Takie gwiazdki są z powodzeniem wykorzystywane do oceniania przez użytkowników strony lub prezentowanej na niej treści.

Jak to będzie działać

A więc jak pisałem rozszerzę funkcjonalność jQuery, tak żeby system można było uruchomić prostym poleceniem:

$(selektor).stars();
Po wywołaniu tej metody, standardowy input zostanie ukryty a w jego miejsce pojawią się wspomniane wcześniej gwiazdki do oceniania.

Oprócz tego, gwiazdki te muszą reagować na pewne zdarzenia:

  • mouseover – po najechaniu kursorem myszki na gwiazdkę, ilość aktywnych gwiazdek powinna się zmienić,
  • mouseout – po opuszczeniu obszaru z gwiazdką liczba gwiazdkę powinna zostać przywrócona do poprzedniego stanu (można ją wczytać z ukrytego input-a),
  • click – po kliknięciu w daną gwiazdę wartość w ukrytym inpucie powinna się zmienić.

Implementacja

Rozszerzanie funkcjonalności jQuery

W ten prosty sposób możemy rozszerzyć funkjonalność jQuery:

$.fn.stars = function(){return $(this);};
Od tego momentu możemy wywoływać funkcję stars poleceniem:
$(selektor).stars();

Wyświetlanie gwiazdek

Do wyświetlania gwiazdek użyję obrazka pochodzącego z galerii OpenClipart, jak widać obrazek ten zawiera [5x5] gwiazdek. Na stronie będzie widoczny zawsze tylko jeden rząd w zależności od aktualnej oceny (będzie można ją zmienić za pomocą dodania odpowiednich klas).

A więc podsumowując, kod html:

<div class="mx_stars mx_stars_val_VAL">
    <a class="mx_star mx_star1" title="1" href="#"></a>
    <a class="mx_star mx_star2" title="2" href="#"></a>
    <a class="mx_star mx_star3" title="3" href="#"></a>
    <a class="mx_star mx_star4" title="4" href="#"></a>
    <a class="mx_star mx_star5" title="5" href="#"></a>
</div>
Gdzie VAL to aktualna ocena.

A oto style:

.mx_stars {
    display: inline-block;
    width: 188px;
    height: 40px;
    background-image: url('5-stars.png');
}

.mx_stars_val_1{
    background-position: 0 -160px;
}

.mx_stars_val_2{
    background-position: 0 -120px;
}

.mx_stars_val_3{
    background-position: 0 -81px;
}

.mx_stars_val_4{
    background-position: 0 -40px;
}

.mx_stars_val_5{
    background-position: 0 1px;
}

.mx_star {
      float: left;
      width: 37px;
      height: 50px;
      border: 0;
} 
Jak widać za pomocą zmian wartości przesunięcia tła, można wyświetlić odpowiednią ocenę.

Podmiana inputa

Cała funkcja stars wygląda następująco:

$.fn.stars = function(){
    var val = $(this).val();
    $(this).hide();
    $(this).after('<div class="mx_stars mx_stars_val_'+val+'">\n\
                                <a class="mx_star mx_star1" title="1" href="#"></a>\n\
                                <a class="mx_star mx_star2" title="2" href="#"></a>\n\
                                <a class="mx_star mx_star3" title="3" href="#"></a>\n\
                                <a class="mx_star mx_star4" title="4" href="#"></a>\n\
                                <a class="mx_star mx_star5" title="5" href="#"></a>\n\
                            </div>');
    return $(this);
};
Jak łatwo zaobserwować input jest ukrywany a wyświetlany jest pod nim system ocen z gwiazdkami.

Obsługa zdarzeń

Dzięki temu że znamy zależność położenia między inputem a systemem gwiazdek, możemy uzyskać dostęp do obu tych elementów za pomocą nawigacji po drzewie DOM:

$(document).ready(function(){
    //kursor nad gwiazdką
    $('.mx_star').live('mouseover', function(){
        var val = $(this).attr('title');
        $(this).parent('div')
            .removeClass('mx_stars_val_1 mx_stars_val_2 mx_stars_val_3 mx_stars_val_4 mx_stars_val_5')
            .addClass('mx_stars_val_'+val);
    });
    
    //kursor poza gwiazdką
    $('.mx_star').live('mouseout', function(){
        var val = $(this).parent('div').prev('input').val();
        $(this).parent('div')
            .removeClass('mx_stars_val_1 mx_stars_val_2 mx_stars_val_3 mx_stars_val_4 mx_stars_val_5')
            .addClass('mx_stars_val_'+val);
    });
    
    //kliknięcie gwiazdki
    $('.mx_star').live('click', function(){
        var val = $(this).attr('title');
        $(this).parent('div').prev('input').val(val);
        return false;
    });
});
Jak widać do podpięcia zdarzeń użyliśmy funkcji live, można oczywiście podpinać zdarzenia w funkcji stars, ale tak jest prościej.

Podsumowanie

To by było na tyle, w przyszłości postaram się dodać kolejne użyteczne funkcje i być może zrobić z tego bibliotekę. Na razie końcowy efekt można zobaczyć klikając tutaj a cały kod źródłowy można ściągnąć stąd.


Wprowadzenie do CodeIgniter

Dodany: Poniedziałek, 28 Marzec 2011, liczba komentarzy: 10, tagi: frameworki webowe, php, programowanie

Lubię narzędzia które są genialne w swojej prostocie. Do takich narzędzi zaliczam m. in. środowisko programistyczne Geany, które udostępnia wszystkie najważniejsze opcje i jednocześnie nie jest przeładowane zbędnymi bajerami. Podobnie jest z webowym frameworkiem o nazwie CodeIgniter. Framework ten wyróżnia się lekkością, prostotą i niezwykle wyczerpującą dokumentacją. Postaram się opisać pokrótce, najciekawsze według mnie, aspekty tego frameworka. Oczywiście tego wpisu nie można traktować jako kompletnego kursu, opisuję tutaj tylko niektóre jego funkcje i możliwości.

Instalacja i konfiguracja

Instalacja frameworka jest banalnie prosta i sprowadza się do pobrania ze strony codeigniter.com/downloads/ paczki z najnowszą jego wersją i wypakowania jej zawartości do głównego katalogu strony. Dodatkowo w podkatalogu user_guide znajduje się szczegółowa dokumentacja tego frameworka wraz z przykładowym kodem. W katalogu application/config/ znajdują się pliki konfiguracyjne. W pliku config.php są zamieszczone podstawowe ustawienia frameworka. Możemy w nim zmienić np. domyślny język, adres bazowy strony, kodowanie i wiele innych ustawień. Żeby można było połączyć się z bazą danych, należy wypełnić odpowiednimi danymi plik konfiguracyjny database.php.

Wzorzec projektowy

CodeIgniter, jak zresztą większość webowych frameworków, wykorzystuje wzorzec MVC (model, view, controller). Dzięki temu możliwe jest odseparowanie podstawowych elementów aplikacji webowej oraz do pewnego stopnia uniezależnienie ich od siebie. W przeciwieństwie do innych frameworków webowych, CodeIgniter nie wymusza stosowania określonego nazewnictwa dla modeli, oraz widoków. Jest to dość wygodne, ponieważ nie musimy zmieniać swoich nawyków programistycznych. Jedynie nazwa klasy kontrolera oraz jej funkcje muszą być zgodne ze wzorcem i odpowiadać adresowi strony:

adres_strony/index.php/nazwa_kontrolera/nazwa_funkcji_kontrolera
przy czym człon index.php możemy usunąć przy pomocy mod_rewrite.

Dla przykładu kod kontrolera odpowiedzialny za wyświetlenie strony strona.net/index.php/blog/all/ może wyglądać następująco:

<?php
//--- controllers/blog.php ---

class Blog extends CI_Controller 
{
	function __construct()
	{
		parent::__construct();
	}

	function all()
	{
		$this->load->model('post'); //wczytywanie modelu
		$data = array();
		//pobieranie danych z bazy
 		$data['posts'] = $this->post->getAll()->result();
 		
        	$this->load->view('post', $data); //wyświetlanie widoku
	}
}
?>
Powyższy kod wczytuje model, z jego pomocą wykonuje zapytanie do bazy danych, a rezultat tego zapytania jest przekazywany do widoku, który zostanie wyświetlony jako strona internetowa.

Obsługa baz danych

Komunikacja z bazą danych odbywa się według wzorca Active Record. Jest to rozwiązanie pośrednie między ORM a pisaniem zapytań w czystym SQL. Zastosowany w CodeIgniter zmodyfikowany wzorzec Active Record jest niezależny od konkretnej bazy danych, a przy tym jest szybki i dość prosty w stosowaniu, dla osób znających składnie języka zapytań SQL. Zapytania tworzy się poprzez wykonanie kolejnych funkcji, które służą do określenia, których tabel, wierszy i pól zapytanie dotyczy, a następnie określeniu co chcemy z nimi zrobić. Możemy w ten sposób pobrać, usunąć, zaktualizować lub dodać dane, do bazy danych. Poniżej zamieszczam przykład wykorzystania Active Record w klasie modelu:

<?php
// (...)
	function getPostsByCategory($category_ID)
	{
		$this->db->where('category_ID', $category_ID);
		$this->db->order_by('date', 'desc');
		return $this->db->get('post');
	}
// (...)
?>
W powyższej funkcji najpierw ustawiane jest ograniczenie wyników do jednej kategorii (przekazanej w parametrze funkcji), potem ustawiane jest sortowanie według daty, a następnie wskazywana jest tabela, na której ma zostać wykonane owe zapytanie. Sporym ułatwieniem jest to, że nazwy metod są podobne do nazw używanych w SQL.

Podsumowanie

Oczywiście to krótkie wprowadzenie, nie pokazuje wszystkich możliwość tego frameworka. Chciałem jedynie ukazać jego możliwości, oraz podstawowe idee jakie przyświecały jego twórcą, takie jak np. szybkość działania, oraz prostota. Do jego głównych zalet można zaliczyć między innymi:

  • wsparcie dla wzorca MVC,
  • niezależność od konkretnej bazy danych, dzięki zastosowaniu wzorca Active Record,
  • bardzo szczegółowa dokumentacja, zawierająca opisy wszystkich klas i metod, oraz przykłady ich zastosowania w praktyce,
  • prosta instalacja oraz konfiguracja,
  • prostota oraz szybkość działania.

Po więcej informacji na temat tego frameworka odsyłam na oficjalną stronę – http://codeigniter.com, gdzie znaleść można video tutoriale, oraz dokumentację.


Przewijanie strony w JavaScript

Dodany: Wtorek, 22 Marzec 2011, liczba komentarzy: 9, tagi: javascript, programowanie, przydatne skrypty

Często zdarza się że na naszą stronę potrzebujemy jedynie kilku prostych skryptów JS. Wtedy nie ma sensu, żeby zaprzęgać do pracy jakiegoś frameworka JavaScriptu, jak np. JQuery lub Prototype. O wiele prościej i wydajniej jest napisać te kilka funkcji samemu.

Co będziemy robić

Takim efektem, który możemy w prosty sposób uzyskać jest animowane przewijanie strony na sam początek (lub do dowolnego innego miejsca). Taka animacja dobrze wygląda i pozwala użytkownikowi jeszcze raz rzucić okiem na całość strony.

Przygotowania

Przed przystąpieniem do pracy, należy się zastanowić jakie funkcje i zmienne będą nam przy tym potrzebne, i jak możemy się do nich dostać. Bez wątpienia potrzebna nam będzie wartość wyrażająca liczbę pikseli, o jaką strona została przewinięta w pionie. Wartość ta reprezentuje zmienna:

window.scrollY
Kolejną potrzebną nam funkcją będzie ta służąca do przewijania naszej strony, czyli:
window.scrollBy(X,Y)
gdzie: X oznacza liczbę pikseli o jaką ma zostać przesunięta strona w poziomie, a Y oznacza liczbę pikseli o jaką ma zostać przesunięta strona w pionie. Parametry te mogą przyjmować wartości ujemne. Przewijanie będzie wykonywane w pętli, dlatego żeby animacja była widoczna, skorzystamy także z funkcji, która służy do wywołania innej funkcji, ale z zadanym opóźnieniem:
setTimeout(func,millisec[,lang])
Argumenty funkcji:

  • func – referencja do funkcji, która ma zostać wywołana,
  • milisec – czas liczony w milisekundach, po którym ma zostać wywołana przekazana w pierwszy argumencie funkcja,
  • lang – opcjonalny argument, oznaczający język skryptowy.

Implementacja

Implementacja jest banalnie prosta, sprowadza się do sprawdzenia czy strona przewinięta jest do samej góry, a jeżeli nie, to wywoływana jest funkcja która ją przewija, o zadaną liczbę pikseli. Kod funkcji wygląda następująco:

function on_top()
{
	if(window.scrollY!=0)
	{
		window.scrollBy(0,-50);
		setTimeout('on_top()',30);
	}
}

Link po kliknięciu którego strona zostanie przewinięta do góry, może wyglądać tak:

<a href="javascript:on_top()"> Przewiń do góry</a>

jak widać kod jest jest banalnie prosty, jego działanie można zobaczyć przechodząc pod ten link. Wadą tego rozwiązania jest to, że czas na wykonanie animacji jest zależny od długości strony. Można ten problem jednak rozwiązać, zmieniając nasz kod tak, żeby strona przewijała się o różną długość, zależną od tego jak bardzo jest przesunięta w pionie. Kod zmienionej funkcji wygląda następująco:

var on_top = {
	interval: 30,	//interwał czasowy z jakim będzie wywoływane przewijanie
	scroll: 0,	//długość o jaką ma zostać przewinięta strona w pionie (obliczana automatycznie)
	nscrolls: 10,	//liczba przesunięć jaka ma zostać wykonana
	go: function()
		{
			on_top.scroll = -(window.scrollY/on_top.nscrolls);
			on_top.loop();
		},
	loop: function()
		{
			if(window.scrollY!=0)
			{
				window.scrollBy(0,on_top.scroll);
				setTimeout('on_top.loop()',on_top.interval);
			}
		}
	};

Link na stronę również ulega zmianie:

<a href="javascript:on_top.go()"> Przewiń do góry</a>

Jak działa powyższy skrypt można zobaczyć na tej stronie. Cały kod zajmuje tylko 0,5 KiB, i jest ponad 160 razy lżejszy od frameworku JQuery (który zajmuje 83 KiB), tak więc oszczędność jest duża.


Pierwszy wpis

Dodany: Wtorek, 22 Marzec 2011, bez komentarzy, brak tagów

Witam na moim blogu. Postaram się zamieszczać na jego łamach ciekawe i przydatne wpisy. W głównej mierze będę pisał o programowaniu i o wszystkim co z nim związane. Część wpisów będzie traktowała także o Linuksie, jego konfiguracji, oraz o ogromnych możliwościach tego systemu. Postaram się także opisać przydatne, dla programistów aplikacje.

Co na początek?

Na początku, oprócz osobnych wpisów zawierających krótkie porady i przydatne skrypty, planuję opisać moje ulubione edytory programistyczne, czyli: Vim, Geany, NetBeans i Eclipse. Każdy z tych edytorów ma swoje mocne i słabe strony, które postaram się opisać. Ja sam zazwyczaj używam różnych edytorów do pisania w różnych językach i uważam że w kwestii edytora programistycznego nie ma jednego najlepszego i że należałoby zapoznać się z możliwościami i funkcjonalnością kilku z nich

Kolejny cykl artykułów, jaki planuje zamieścić na łamach bloga, to opisy kilku frameworków internetowych, używanych przeze mnie, są to: Zend Framework, Code Igniter oraz Django. Również w tym przypadku, uważam że nie ma jednego idealnego frameworka i warto by się było zapoznać, chociażby pobieżnie, z kilkoma najpopularniejszymi.

O blogu

Sam blog został napisany w pythonowskim frameworku – Django. Do kolorowania składni użyłem bardzo dobrej, pythonowskiej biblioteki, o nazwie Pygments, a teksty piszę z wykorzystaniem składni markdown, dzięki użyciu jej pythonowskiej implementacji: Python-Markdown.

Wszystkim życzę miłej lektury moich wpisów.
Pozdrawiam,
MarioX


Created by MarioX
© 2011-2012 blog.mariox.info All Right Reserved.

powered by django