Opóźnienie Cufon w IE

Przez wiele lat nie było prostej możliwości dołączania dowolnych czcionek do stron www tak aby wyglądały one identycznie w wiodących przeglądarkach. Zamiast tego trzeba było używać obrazków.

Później nastał czas biblioteki Cufon gdzie wszystko było pięknie renderowane. Wszystko, ale nie wszędzie. W IE widoczna była brzydka przerwa (ok. pół sekundy) w momencie ładowania strony, udało się jednak znaleźć na to rozwiązanie.

Aby uniknąć tego brzydkiego efektu, należy:
1. zaraz po ukryć podmieniane elementy

 
<style type="text/css">
.menu {  visibility: hidden; }
</style>
 

2. bezpośrednio przed uruchomić cufon

<script type="text/javascript">
Cufon.replace(".menu");
Cufon.now();
</script>

3. pokazać podmienione elementy

 
<style type="text/css">
.menu { visibility: visible; }
</style>
 

 

MongoDB vs MySQL (MyISAM i InnoDB) – porównanie wydajnoÅ›ci

W ramach nauki nowych narzędzi zabrałem się za testowanie wydajności bazy mongoDB i porównanie wyników z bazą MySQL, zarówno w tabelach MyISAM jak i innoDB.

Jako platforma testowa posłużył mi jedynie lokalny komputer 4 GB RAM z i3 (2.4 Ghz). Źródło danych stanowiła tabela z 217 tys. rekordów.

MySQL (MyISAM) - 5.1.49
MySQL (InnoDB) - 5.1.49
MongoDB - 2.0.2
PHP - 5.3.6

Wszystkie czasy podane są w sekundach, zaś każde z zapytań wykonywane jest w pętli 10 razy i jako wynik prezentowana jest średnia z tych 10 wykonań.

[table id=2 /]

Wyniki mówią same za siebie - mongoDB idealnie nadaje się szczególnie do dużych baz danych, gdzie przewaga nad MySQL jest najbardziej widoczna.

Jak parsować duże pliki XML w PHP?

Jakiś czas temu stanąłem przed problemem parsowania dużych plików XML w PHP. O ile z małymi plikami nie ma problemu i całość parsowana jest szybko, to próba obsługi większych plików często powoduje zatrzymywanie wykonywania skryptów. Tak duże pliki są jednak często wykorzystywane przy zdalnych aktualizacjach ofert (np. publikowanych przez hurtownie).

Dzieje się tak, gdyż PHP ma z góry założone ograniczenie na możliwą do wykorzystania pamięć, a parsowanie plików standardową metodą (np. DOMDocument) potrafi ją skutecznie wykorzystać.

Rozwiązaniem jest skorzystanie z klasy XMLReader, domyślnie dostępnej w standardowej konfiguracji PHP od wersji 5.1.0 .

Zrobiłem krótkie porównanie szybkości działań dla DOMDocument i XMLReader korzystając z 4 różnych komputerów

Rozmiar pliku XML: 208 MB
Liczba wpisów: 148723

[table id=1 /]

Jak widać różnica jest kolosalna (ok. 10-20 razy szybciej) i w przypadku dużych plików warto postawić na XMLReader.

Fragment kodu odpowiedzialny za parsowanie przez DOMDocument:

$doc = new DOMDocument();
$doc->load($localurl);
$items= $doc->getElementsByTagName("item");
$countItems = $items->length;
 
foreach($items as $item)
{
	$id = $item->getElementsByTagName("id")->item(0)->nodeValue;
	$url = $item->getElementsByTagName("url")->item(0)->nodeValue;
	$title = $item->getElementsByTagName("title")->item(0)->nodeValue;
	$author = $item->getElementsByTagName("author")->item(0)->nodeValue;
	$isbn = $item->getElementsByTagName("isbn")->item(0)->nodeValue;
	$image = $item->getElementsByTagName("image")->item(0)->nodeValue;
	$ean = $item->getElementsByTagName("ean")->item(0)->nodeValue;
	$published = $item->getElementsByTagName("published")->item(0)->nodeValue;
	$publisher = $item->getElementsByTagName("publisher")->item(0)->nodeValue;
	$pages = $item->getElementsByTagName("pages")->item(0)->nodeValue;
	$price = $item->getElementsByTagName("price")->item(0)->nodeValue;
	$description = $item->getElementsByTagName("description")->item(0)->nodeValue;
	$status = $item->getElementsByTagName("status")->item(0)->nodeValue;
	$count++;
  }

 

Fragment kodu odpowiedzialny za parsowanie przez XMLReader:

$reader = new XMLReader();
$reader->open($localurl);
 
while($reader->read())
{
	if($reader->nodeType == XMLReader::ELEMENT) $nodeName = $reader->name;
	if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)
	{
		if ($nodeName == 'id') $id = $reader->value;
		if ($nodeName == 'url') $url = $reader->value;
		if ($nodeName == 'title') $title = $reader->value;
		if ($nodeName == 'author') $author = $reader->value;
		if ($nodeName == 'isbn') $isbn = $reader->value;
		if ($nodeName == 'image') $image = $reader->value;
		if ($nodeName == 'ean') $ean = $reader->value;
		if ($nodeName == 'published') $published = $reader->value;
		if ($nodeName == 'publisher') $publisher = $reader->value;
		if ($nodeName == 'pages') $pages = $reader->value;
		if ($nodeName == 'price') $price = $reader->value;
		if ($nodeName == 'description') $description = $reader->value;
		if ($nodeName == 'status') $status = $reader->value;
		$ean = '';
	}
 
	if($reader->nodeType == XMLReader::END_ELEMENT &amp;&amp; $reader->name == 'item')
	{
		$count++;
	}
}
$reader->close();

 

Zmiana galerii z NextGEN Gallery na Picasa

Po kilku latach używania pluginu NextGEN Gallery do Wordpresa jako metody na publikację zdjęć zdecydowałem się na przesiadkę na Picasę Web Albums. Teraz o wiele łatwiej, sprawniej i szybciej mogę dodawać nowo zrobione  zdjęcia.

Jako plugin do ich publikacji w galerii wykorzystałem dodatek PWA+PHP, który w bardzo wygodny sposób poprzez API wyświetla zawsze aktualne albumy. Jedyny problem był w przypadku chęci ukrycia kilku albumów z samej strony jednocześnie zachowując je w Picasie (np. albumy automatycznie zakładane w celu integracji z Google Plus). W tym celu należy wyedytować plik wp-content/plugins/pwaplusphp/dumpAlbumList.php<pre lang="php">

wyszukać linijkę

$pos = strlen(strpos($title,'_hide'));

i zamienić ją na

$ALBUMS_TO_HIDE=array('Scrapbook Photos', 'Profile Photos');
if (in_array($title, $ALBUMS_TO_HIDE))
$pos = 1;
else
$pos = strlen(strpos($title,'_hide'));

Oczywiście w $ALBUMS_TO_HIDE wstawiamy nazwy albumów do ukrycia.

Plugin jest darmowy, natomiast jego płatna wersja zawiera możliwość włączenia cache'u co znacznie przyspiesza ładowanie strony z wieloma albumami.

Powrót po latach

A dokładniej po dwóch. Tyle właśnie czasu minęło od ostatniej notki.

Przez ten czas sporo zmian zaszło w moim życiu, zarówno prywatnym jak i zawodowym. Prawdziwa miłość, nowa praca (a tym samym nowe wyzwania), rezygnacja z prowadzenia sklepów internetowych i ich sprzedaż. Ale po kolei.

Zaręczyłem się - po roku znajomości z prawdziwą wybranką serca, przyszłą żoną i matką moich dzieci. Z pełnym przekonaniem, świadomością, stałą i nieodpartą chęcią bycia razem. Ci, który mają mnie w kontaktach na NK mogli zobaczyć nieco zdjęć z tej okacji.

Po 7 latach prowadzenia własnej działalności zdecydowałem się na zmianę trybu pracy z one-man-army na typową pracę etatową jako webmaster / webdeveloper / programista. Do tej pory właściciel małej firmy, a jednocześnie osoba zajmująca się zagadnieniami związanymi z tworzeniem stron, marketingiem firmy, pozycjonowaniem, księgowością, logistyką itd. Obecnie mój zakres obowiązków obejmuje już tylko sprawy czysto techniczne, co pozwala skupić się na dalszym rozwoju i poznawaniu zagadnień, które mnie najbardziej interesują.

Również po 7 latach od uruchomienia sklepu Mydlandia oraz 4 latach prowadzenia sklepu Kadoro zdecydowałem się na ich sprzedaż. Powody decyzji były różne. Nie bez żalu, ale nadszedł czas kiedy należało iść do przodu i zamknąć za sobą pewien etap w życiu. Sklepy uruchamiałem od zupełnych podstaw (począwszy od koncepcji nazwy, wyglądu strony do negocjacji z kontrahentami), co nauczyło mnie to wielu aspektów prowadzenia biznesu w internecie. Była to bardzo cenna lekcja z dobrze zdanym egzaminem (w sprzedanych sklepach tych cały czas prowadzona jest sprzedaż).

Przy okazji większych życiowych zmian sprzedałem również moje małe biuro tłumaczeń Almand. Z racji innych obowiązków tłumaczeniami przestałem zajmować się już jakiś czas temu, dlatego nie było sensu blokować domeny i wstrzymywać potencjał serwisu. Trafił on to osoby która tłumaczeniami zajmuje się zawodowo.

To najważniejsze zmiany jaki były w ostatnich 2 latach. Postaram się, aby o kolejnych informować już na bieżąco, a jednocześnie wrócić do częstszych postów luźno związanych z tym, co się w moim życiu i otoczeniu dzieje.

Moja wypowiedź w książce dot. usability w e-biznesie

Kilka dni temu w wydawnictwie Helion ukazała się książka "Usability w e-biznesie. Co kieruje Twoim klientem?" gdzie w jednym z rozdziałów (akurat w darmowym fragmencie dostępnym do pobrania) poświęconym projektowaniu wyszukiwarki znalazła się moja wypowiedź nt. wyszukiwania kolorów w sklepie internetowym którą przedstawiałem wcześniej na blogu.

Książki jeszcze nie czytałem, ale ze spisu treści i wspomnianego fragmentu w PDF wynika, że zawartych będzie tam sporo porad dla właścicieli sklepów internetowych. I nawet jeśli większość zagadnień jest znana, to warto odświeżyć sobie pamięć. Wystarczy przecież jeden nowy pomysł aby cena książki wielokrotnie się zwróciła.

Procedura naprawy na przykładzie XBOX 360

O tym jak powinna wyglądać wzorowo procedura naprawy wie na pewno dział napraw Microsoftu zajmujący się XBOXem 360.

Ponieważ mój sprzęt zaczynał odmawiać posłuszeństwa (zawieszanie się w losowych momentach), postanowiłem skorzystać w gwarancji i odesłać konsolę do naprawy. Jak wyglądał przebieg naprawy?

1. Rejestracja na stronie Microsoftu, podanie danych osobowych, numeru seryjnego konsoli, wydruk gotowego druku adresowego (niedziela - dzień 0).
2. Zadzwonienie po kuriera UPS lub tak jak w moim przypadku samodzielne zawiezienie (poniedziałek - dzień 1).
3. Dostarczenie przez UPS sprzętu do Niemiec gdzie znajduje się najbliższy oddział supportu Microsoftu zajmujący się tego typu naprawami ( środa - dzień 3)
4. Odebranie naprawionej konsoli (wtorek, dzień 9).

Całość naprawy od momentu oddania sprzętu do wysłania do momentu odebrania zajęła tydzień i 1 dzień. Biorąc pod uwagę wysyłkę zagraniczną w obie strony (razem 4 dni), oraz to że po drodze było święto czyli dzień wolny od pracy (Boże Ciało) i weekend (czyli razem 3 dni niepracujące) to tempo było iście ekspresowe.

Co jeszcze podniosło moją ocenę? Trzy dokumenty które były dołączone do kartonu.

1. Przeprosiny za niedogodności związane z koniecznością naprawy oraz informacja jakie elementy zostały wymienione. Zapewnienie że support robi wszystko co może aby awaria nie powtórzyła się w przyszłości.

2. Instrukcja synchronizacji kontrolerów bezprzewodowych (ponowna synchronizacja konieczna z uwagi na wymienioną płytę główną). Co prawda taka instrukcja znajduje się również gdzieś w dokumentacji dodanej podczas zakupu konsoli ale przecież po 1-2 latach korzystania ze sprzętu nie zawsze mamy je pod ręką.

3. Ankieta do wyrażenia oceny o całym procesie naprawy, w tym: jakość obsługi telefonicznej, szybkość i jakość naprawy, ogólna ocena zadowolenia. Oczywiście odesłanie jest w dołączonej kopercie bez konieczności naklejania znaczka pocztowego.

To wszystko sprawia że klient czuje się że wyjątkowo w dość niekomfortowej sytuacji jaką jest naprawa zakupionego sprzętu. Wiele firm mogłoby się uczyć obsługi klienta od tego działu Microsoftu.

Monitor temperatury v. 0.2

Od kilku miesięcy nie działa napisany przeze mnie dodatek do Firefoxa o nazwie Monitor temperatury. Przepisałem kawałek kodu i oto niniejszym wypuszczam wersję 0.2.

Wersja 0.2 różni się od wersji poprzedniej tym, że działa.

Do pobrania stÄ…d.

WOÅšP w Siedlcach

W niedzialę odbył sie 17-ty Finał Wielkiej Orkiesty Świątecznej Pomocy. Z tej okazji nieco zdjęć.

Więcej oczywiście w galerii.

Wyszukiwanie kolorów w sklepie internetowym

Większość sklepów internetowych ma zwykłą, prostą wyszukiwarkę. Wpisuje się wtedy jakiś wyraz lub frazę, a sklep przeszukuje produkty biorąc pod uwagę pod uwagę nazwę i opis produktu. Zwykle wystarcza to aby znaleźć poszukiwany przedmiot.

Często przy prostej wyszukiwarce jest link do wyszukiwania zaawansowanego, gdzie dodatkowo możemy zdefiniować zakres cenowy czy ograniczyć wyszukiwanie do wybranej kategorii.

Nigdy nie sprawdzałem tego w badaniach, ale zawsze wydawało mi się, że z wyszukiwania zaawansowanego korzysta niewielka liczba osób. Dlatego gdy w Kadoro zrobiliśmy wyszukiwanie zaawansowane, postawiłem sobie za cel analizę jak często użytkownicy korzystają z dodatkowych opcji wyszukiwania.

Tutaj należy się jednak drobna uwaga - zamiast odnośnika do wyszukiwania zaawansowanego, w naszym sklepie opcje te są zawsze widoczne na ekranie, po prawej stronie. Z założenia miały być niejako "pod ręką" co na pewno ma jakiś wpływ na częstotliwość korzystania z tej funkcji.

Dodatkowe opcje wyszukiwania w Kadoro to rozmiar, kształt, kategoria i kolor.

Wyniki badania

Ponieważ prezentacja samych wartości procentowych nic zwykle nie mówi, a w ten sposób można zafałszować rzeczywistość, publikuję również dane liczbowe.

Analiza obejmowała okres od 2008-09-08 do 2008-10-29. W tym czasie:

  • wyszukiwarka zostaÅ‚a użyta 13622 razy (ok. 267 razy dziennie)
  • liczba wyszukiwaÅ„ kolorów wyniosÅ‚a 3153
  • liczba wyszukiwaÅ„ w wybranej kategorii wyniosÅ‚a 2354
  • liczba wyszukiwaÅ„ ksztaÅ‚tu wyniosÅ‚a 1787
  • liczba wyszukiwaÅ„ rozmiaru wyniosÅ‚a 897

Biorąc pod uwagę wartości procentowe, wychodzi na to, że:

  • kolor zostaÅ‚ wybrany w 23% przypadków
  • kategoria zostaÅ‚a wybrana w 17% przypadków
  • ksztaÅ‚t zostaÅ‚ wybrany w 13% przypadków
  • rozmiar zostaÅ‚ wybrany w 6% przypadków

Jak widać liczba osób korzystająca z dodatkowych opcji nie jest wcale znikoma. Warto więc rozbudować wyszukiwarkę sklepową o dodatkowe opcje, oczywiście o ile asortyment sklepu pozwala na definiowanie takich cech oraz sprzedajemy więcej niż 200-300.

Wyszukiwarka zaawansowana dla 50 pozycji raczej mija się z celem, chociaż mogą być bardzo specyficzne branże gdzie zawężenie produktów ułatwi nawigację i pomoże w podjęciu decyzji.

Początkowy nakład pracy związany z koniecznością przypisania odpowiednich cech do produktów powinien zwrócić się w postaci bardziej zadowolonych i powracających klientów.

NastÄ™pna strona »