Troszkę mi się nudzi w pracy (nie robię nic specjalnie wciągającego), praca inżynierska trochę już mnie zmęczyła więc trzeba w wolnych chwilach zrobić coś interesującego. Dobrze będzie się czegoś przy okazji nauczyć. Potrzebuję programu, który będzie pamiętał o naprawach okresowych mojego samochodu oraz będzie wiedział kiedy należy wymienić rozrząd dla mojego modelu. Fajnie jeżeli na podstawie innych napraw tego samego modelu określi, że np. 90% Opli Vectra C (1.9 Diesel) po przejechaniu 130 tyś wymaga wymiany tylnich amortyzatorów.

Więcej na temat kiedy wmienić klocki hamulcowe, olej i mojego pomysłu przeczytasz klikając na link TUTAJ

Continue reading

Zupełnie przez przypadek trafiłem na stronę projektu vaadin. Co to jest? To tylko kolejny framework dla javy ;) Można powiedzieć, że jest to nakładka na GWT. Czyli podobnie jak w przypadku Apache Wicket i GWT programujemy interfejs użytkownika w Javie. Jaka jest natomiast (dla mnie) najważniejsza różnica względem GWT? Nie musimy kompilować kodu Javy do JavaScriptu! Czyli setki zaoszczędzonych minut i godzin na czasochłonną kompilację GWT.
Continue reading

Piszę właśnie aplikację do automatycznej obsługi rejestracji, zarządzania i płatności dla strony http://document-management.pl/ i napotkałem pewien problem z walidacją danych. Potrzebowałem sprawdzić w unikalność Stringa w dwóch różnych tabelach. Niestety Doctrine domyślnie tego nie obsługuje więc pośpieszyłem z napisaniem własnego walidatora. Dziarsko przeczytałem “How to create a Custom Validation Constraint“, napisałem walidator i … zonk

Fatal error: Class 'Symfony\Component\Validator\Constraints\UniqueDomain' not found in /home/kirkor/Projects/Beriko Software/document-management.pl/public_html_register/Symfony/vendor/symfony/src/Symfony/Component/Validator/Mapping/Loader/FileLoader.php on line 73

Continue reading

Kiedy myślimy o robocie internetowych, sprawa wydaje się skomplikowana. Ale czy na pewno? Spróbujmy napisać robota internetowego, który będzie indeksował np. Panoramę Firm – oczywiście tylko do celów edukacyjnych. Dlaczego akurat tą stronę? Jest tam dużo powtarzających się – według szablonu – treści. Tak więc wyciągnięcie informacji będzie dla nas prostsze. A tak na marginesie, jak myślicie, jak długo zajmie zindeksowanie Google?? :-)

Jest kilka bibliotek do przetwarzania wyrenderowanych stron HTML, lub też po prostu do pobierania źródła strony. Mi do gustu najbardziej przypadł HtmlUnitSelenium. Selenium jest używane przez testerów do automatycznych testów stron internetowych, posiada przyjemny edytor – pracuje jako dodatek do Firefoxa. Wszystko generalnie można znaleźć na stronie producenta. Jego wadą jest jednak dość skromna dokumentacja, ale jakoś sobie z tym poradzimy.

Continue reading

W nocy z 3 na 4 marca wystartowała nowa strona firmy MOVIDA Conferences. Po dwóch miesiącach pracy system Joomla! został dostosowany na potrzeby firmy MOVIDA. Dzięki wzorowej współpracy i wysiłkom z obu stron projekt odniósł sukces. Cieszę się iż mogę wszystkim zaprezentować nowe oblicze serwisu firmowego Movida Conferences.

W trakcie pracy został przygotowany specjalny szablon, jak również moduły:

Stronę przygotowała firma Beriko Software, zajmująca się tworzeniem stron internetowych, systemów dedykowanych oraz outsourcingiem it na obszarze Warszawy i okolic.

Dla potrzeby strony internetowej zostały przygotowane specjalne dwa pluginy do systemu Joomla!

  1. Beriko! iTi (item to item) – pozwalający na umieszczanie listy oraz pojedynczych artykułów wewnątrz treści innego artykuły. Szczególnie przydatne w opiniach na temat konferencji oraz wyświetlaniu podobnych elementów. Dodatek został tak zaprojektowany aby można było przygotować dedykowane szablony dla każdego rodzaju treści.
  2. Beriko! Tabs – pozwala na umieszczanie zakładek wewnątrz tekstu.

To był dobry dzień… Choć premiera miała miejsce już wczoraj ja dopiero dziś to zauważyłem. Joomla! 1.6 przynosi wiele bardzo ważnych zmian i poprawek, których brakowało mi wcześniej. Pracując teraz na nową stroną firmy Movida Conferences bardzo doskwierał mi ubogi system uprawnień jak również brak automatycznej aktualizacji wtyczek – znany choćby z WordPress’a.

Najważniejsze funkcje w Joomla 1.6

  • Nowy system kontroli dostępu – daje administratorom witryny i redaktorom możliwość określania, kto może oglądać i zarządzać treścią.
  • Nieograniczony model zagnieżdżania – umożliwia administratorom oraz twórcom treści definiowanie wielopoziomowych kategorii o dowolnie zagnieżdżonej strukturze.
  • Prosta aktualizacja rozszerzeń – dostarcza użytkownikowi lepszego sposobu utrzymania bezpieczeństwa witryny przez uproszczony proces aktualizacji rozszerzeń
  • Szablony zgodne z semantyką XHTML – zapewnia lepszą podstawę do prezentacji treści
  • Wielojęzyczność – pozwala w podstawowy sposób na stworzenie witryny wielojęzycznej.

Continue reading


Na zlecenie firmy COMAC – firmy doradczej w zakresie prawa i rynku farmaceutycznego – została przygotowana strona internetowa z formularzem kontaktowym oraz zakładką komentarzy. Komentarze posiadają specjalny panel do zarządzania treścią dzięki czemu pracownicy firmy mogę samodzielnie przygotowywać treści oraz je publikować.

Stronę przygotowała firma Beriko Software, zajmująca się tworzeniem stron internetowychsystemów dedykowanych oraz outsourcingiem it na obszarze Warszawy i okolic.

Dziś zmierzyłem się z całkiem ciekawym problemem. Prosta Javova aplikacja miała odczytać zawartość plików csv, policzyć wskaźniki, uzupełnić obiekty Hibernate i zapisać wszystko do bazy danych. Wszystko zrobiłem szybciutko ale powstał pewien problem… Aplikacja działała wolno ale procesor był obciążony tylko w 50%. To nie byłby problem przy małej ilości danych, natomiast ja musiałem zaimportować 864 pliki o łącznej wadze 36,3 MB! Niby niewiele, ale przypomina… to są pliki tekstowe.

Gdzie szukać problemu? Sama aplikacja była wydajna, bo operacja matematyczne to błahostka. Nie implementowałem też żadnych skomplikowanych reguł. Może baza danych? Faktycznie interfejs sieciowy miał słabą responsywność. Zwiększyłem cache dla bazy danych do 1GB, zaalokowałem więcej pamięci dla aplikacji Javy (-XX:MaxPermSize=512m -Xms1024m -Xmx2048m) i aplikacja chodzi szybciej, ale nadal za wolno.

Continue reading

Ostatnio programując na co dzień w Javie i używając Springa, Hibernate, Struts i Velocity nie natrafiłem na żaden interesujący problem dlatego nie pojawił się na blogu żaden wpis, który tego dotyczy.

Ale za to jest coś ciekawego w Doctrine :) W wersji 1.2 nie ma rozsądnej formy dziedziczenia, to co proponują autorzy nie podoba mi się. postanowiłem użyć takiego przypadku:

sf_guard_user to klasa standardowego pluginu, która odpowiada użytkownikowi. Dodatkowo stworzyłem tabelę ae_experts z jednym kluczem obcym odwołującym się do użytkownika. Czyli każdy ekspert jest również użytkownikiem. Tak sobie pokrętnie wytłumaczyłem obiektowo relacyjną bazę danych.

Efekt, który chciałem osiągnąć to przy każdym pobraniu eksperta jest również pobierany użytkownik. Skoro ekspert to user, to warto wyświetlać domyślnie imię i nazwisko. Aby to osiągnąć w klasie Expert (Expert.class.php) dodałem taki kod:

/**
 * Expert
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @package    ask-expert
 * @subpackage model
 * @author     Beriko Software, Grzegorz Bernaś
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class Expert extends BaseExpert
{
	public function preDqlSelect($event)
	{
		$params = $event->getParams();
		$query  = $event->getQuery();
		$alias  = $params['alias'] . '.sfGuardUser';
		if ((!$query->isSubquery() || ($query->isSubquery() && $query->contains(' '.$params['alias'].' '))) && !$query->contains($alias))
		{
			$query->innerJoin($alias);
		}
	}

	public function __toString() {
		return $this->getSfGuardUser()->getFirstName().' '.$this->getSfGuardUser()->getLastName();
	}
}

Ale to nie wszystko, kod nie będzie działać jeżeli nie włączymy DQL’a (Doctrine Query Language). Aby to zrobić w pliku ProjectConfiguration.class.php do klasy ProjectConfiguration dodaj taki kod:

class ProjectConfiguration extends sfProjectConfiguration
{
	public function configureDoctrine(Doctrine_Manager $manager)
	{
		$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
	}
}

Dzięki temu nie mam dwóch zapytań tylko jedno :) Nie wiem jaki to będzie miało wpływ na wydajność i pracę w przyszłości kiedy mój projekt edukacyjny urośnie, ale czas pokaże.

W ramach odświeżenia swojej wiedzy, wróciłem do zabawy z frameworkiem Symfony. Realizując mały i prosty “projekt edukacyjny” natrafiłem na pewien problem. Mianowicie kodowanie tabel w MySQL oraz kodowanie połączenie z bazą danych. Osobiście preferuję używania wszędzie UTF-8 dlatego domyślne kodowanie latin1 nie do końca mnie zadowalało. Dzięki dziadkowi google znalazłem na sieci bardzo przydatne rozwiązanie.

Jeżeli chcesz używać kodowania UTF-8,  powinieneś dodać do swojej definicji schematu (schema.yml) następujacy kod:

User:
  options:
    type: MyISAM
    collate: utf8_unicode_ci
    charset: utf8
  columns:
    username: string(255)
    password: string(255)

Jak widać elegancko ustawiamy collate: utf8_unicode_ci oraz charset: utf8. Powyższe opcje sprawiają, że tylko jedna konkretna tabela będzie kodowana w UTF-8, jeżeli chcemy aby wszystkie table miały takie kodowanie oraz aby kodowanie połączenia było ustawione na UTF-8 musimy do pliku ProjectConfiguration.class.php dodać następującą metodę:

public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setCollate('utf8_unicode_ci');
  $manager->setCharset('utf8');
}

Następnie trzeba przebudować cały mode (aby w bazie danych zmieniło się kodowanie tabel) oraz na nowo wgrać dane inicjalne już z odpowiednimi znaczkami.

symfony doctrine:build --all --and-load --env=dev --no-confirmation

Miejmy na uwadze, że tak komenda usunie wszystkie dotychczasowe tabele i stworzy je na nowo z kodowaniem UTF-8.