luq techblog

o tworzeniu słów kilka…

Kup to. Proszę! 24 października 2010

Filed under: Marketing — Łukasz @ 16:51
Tags: , , , ,

przeslanie

Dziś zgoła odmienny wpis. Nie będzie o nudnym klepaniu kodu, rozwiązywaniu błędów i wąskich gardeł, optymalizacji czy bezpieczeństwie. Dziś zajmiemy się projektowaniem i marketingiem, który szczególnie ważny jest właśnie w web aplikacjach. W erze start-up`ów, licznych zakupów internetowych, youtube`a i facebook`a, marketing internetowy jest nieodłącznym elementem pracy web developera. Nie ważne, że kod jest idealny i działa świetnie jak nie umiesz go sprzedać. Po co komu świetna gra przy której Ty męczyłeś się z całym zespołem przez 2 lata wyrywając sobie resztki włosów z głowy, kląc przy niej raz po raz a kiedy już udało się ją skończyć i poprawić wszystkie błędy okazało się, że owszem, grafika super, wykorzystaliście masę nowości technicznych i technologicznych ale grywalność leży…?

 

Tak naprawdę zawszę najważniejszy jest pomysł. Najlepiej taki który jest niebanalny, ciekawy, taki który budzi podziw ale może być także zdziwienie, ogólnie chodzi o silną emocję (może to też być np. obrzydzenie czy strach). Bardzo ciekawym sposobem dotarcia do potencjalnych klientów jest Marketing partyzancki. Cytując wiki, jest to:

 

forma marketingu zbliżona do marketingu wirusowego, polegająca na promowaniu dóbr i usług za pomocą niekonwencjonalnych technik, w zależności od grupy docelowej, jak np. napisy sprayem na murach prezentujące daną markę czy vlepki.

W tej technice stosuje się zarówno niekonwencjonalne, mające przykuć uwagę środki, jak również niekonwencjonalne treści, np. widok krwi, drastycznych scen itp. Przede wszystkim jednak technika ta bazuje na tanich środkach. Dodatkowo daje ona taki efekt, że odbiorca infekowany jest memami nawet unikając kontaktu z tradycyjnymi nośnikami reklam. Informacja o produkcie czy usłudze, podobnie jak w marketingu wirusowym, może dalej rozchodzić się w postaci plotki oraz dalszych przekazów informacji drogami niekonwencjonalnymi.

 

Jednym z najciekawszych przykładów tej formy reklamy, na który natrafiłem jakiś czas temu, jest akcja marketingowa dla firmy Absolut. Koszt całkowity to praktycznie 0 zł. Wystarczył jeden karton z magazynu, butelka promowanego alkoholu (którą oczywiście wróciła z powrotem) oraz jedno lotnisko. Tak, tak, lotnisko ;)

 

Butelkę zapakowano do otwartego kartonu, tak aby trunek był widoczny, i puszczono razem z bagażami na tej lotniskowej karuzeli (nie mam pojęcia jak to się fachowo nazywa :>). Zresztą oto filmik:

 

 

Tak naprawdę ludzie mają dość monotonii, lubią rzeczy ciekawe, lubią się bawić. I tutaj wkracza inicjatywa The Fun Theory. Owa teoria zabawy opiera się na przekonaniu, że zabawa jest najłatwiejszym sposobem na zmianę zachowań ludzi na lepsze. Najbardziej popularnym produktem wywodzącym się z owej inicjatywy są fortepianowe schody. Dzięki nim procent ludzi, korzystający z tradycyjnych schodów w stosunku do schodów ruchomych wzrósł o 66%! (tak przynajmniej twierdzą autorzy). Chociaż mnie osobiście o wiele bardziej podoba się Bottle Bank Arcade:

 

 

Jak to ma się do internetu i programistów? Działa dokładnie tak samo! Najważniejszy jest pomysł. Spójrzmy na taki np. serwis podbij.pl. Jeśli prześledzić zasadzę działania wychodzi na to, że serwis zarabia bardzo dużo. Kupuje telewizor za 1000zł, sprzedaje go za 300zł ale za same podbicia dostaje 30 000zł, bo podbicie o 0,01 zł jest tożsamy z jedną realną zlotówką. Fajnie nie? ;)

 

Kolejnym przykładem który mogę podać jest sytuacja z mojego życia. Podczas promocji mojej szkoły na targach edukacyjnych powstały 2 gry, jedną było moje Catch the block a drugą była banalnie prosta lecz o wiele lepsza marketingowa gra, której autorem jest wolf. Grafika rysowana gdzieś w paincie z wykorzystaniem narzędzia pędzel :) Stojące na przeciwko siebie postacie z bronią w ręku, odliczenie w dół od 3, po zejściu licznika do 0, user musiał nacisnąć grzybek (drewniane pudełko, kolorowe grzybki i mechanizm z normalnej myszki – jeden user miał lewy przycisk, drugi – prawy, wszytko złożone i podpięte pod USB), kto nacisnął pierwszy ten wygrywał, natomiast falstart był nagradzany śmiercią. Gra cieszyła się mega popularnością :]

 

Jeśli masz własną firmę, kub, pub, restauracje to koniecznie stwórz fanpage na facebook`u. Jak przyciągnąć userów? Najskuteczniej jest stworzyć aplikację (lub jeśli nie umiesz, zleć to komuś) dzięki której można wygrać nagrody (darmowe piwo, karta rabatowa na tydzień, koszulka, tu pomysłów jest naprawdę mnóstwo) dzięki temu jest masa ludzi którzy klikną na „Lubię to”, ich znajomi to widzą, poza tym każda wygrana jest rzucana na ich wall`a, a tym znajomym którzy nie mają jeszcze konta na FB opowiadają jak to wczoraj wygrali darmowe piwo, dzięki czemu nasza firma jest rozpoznawana :)

 

Ostatecznie należy dążyć do tego aby swoje tytułowe „Kup to. Proszę!” zamienić na czyjeś „Sprzedaj mi to. Proszę!”

Reklamy
 

Paczka game_map 5 października 2010

Filed under: GameDev,GameMap — Łukasz @ 20:21

Witam po znów długiej przerwie. Dziś bardzo krótko z racji braku czasu na cokolwiek…

 

Kilka osób prosiło mnie aby udostępnić paczkę z game_map (trzeba by wymyślić jakąś nazwę…) który gościł przez kilka poprzednich wpisów a teraz z racji właśnie owego braku czasu na razie jest zawieszony w działaniach. Naprawdę bardzo cieszy mnie duże zainteresowanie tym projektem (jeśli można to tak nazwać). Zamieszczona poniżej paczka jest wersją nowszą niż serwerowa i jest to totalnie wersja developerska (zacząłem pisać pobieranie kolejnych części mapy po przejściu do krawędzi aktualnie pobranej ale to nie jest skończone). Mam nadzieję, że niczego nie zapomniałem spakować.

 

Pobierz game_map

 

Apcelerator Titanium dla Android`a 24 sierpnia 2010

Filed under: JS — Łukasz @ 14:05
Tags: , , , ,

Jakieś dwa tygodnie temu pokazano mi takie narzędzie jak Appcelerator Titanium. Titanium to platforma która umożliwia tworzyć aplikację deskoptowe jak i mobilne (iPhone, Android, iPad, BlackBerry) w językach czysto webowych (HTML, CSS, JavaScript, PHP, Python i Ruby). Jest to konkurencja dla Adobowego środowiska AIR z tą różnicą, że Titanium jest w pełni otwarte.

 

Przez te dwa tygodnie pracowałem (i dalej pracuję) nad pewną małą aplikacją dla Google Android, dlatego jedynie nad wersją mobilną API będę się rozwodzić.

 
(more…)

 

SQL, JSON i Ajax… czyli część 3. tworzenia mapy pod grę 7 lipca 2010

Filed under: Ajax,GameDev,GameMap,JS,Programowanie,SQL — Łukasz @ 17:55
Tags: , ,

Dość długo zwlekałem z tym wpisem… szczerze mówiąc, bardzo dużo czasu i sił kosztuje mnie opisywanie mojego, hm… projektu, bo tak to można nazwać. Tak naprawdę więcej czasu spędziłem nad pisaniem poprzednich dwóch wpisów niż nad pisaniem kodu do nich. Sam nie jestem fanem tutoriali programistycznych i od dziś nie będę pisał na ten temat rozwodząc się nad moją każdą decyzją podjętą w czas projektowania tego wszystkiego. Będę zwracał uwagę na elementy ciekawe pomijając te błahe.

 

Okej, ostatnio zakończyliśmy na GUI pod edytor map, dziś dopiszemy trochę kodu aby nasz edytor zapisywać dane dt. mapy do bazy a także odczytywał stworzoną mapę po przeładowaniu strony tak, aby można było kontynuować prace nad całym naszym światem. Dodatkowo stworzymy kod który umożliwi nam w grze przesuwanie mapy. Szkoda czasu czas zaczynać.

 
(more…)

 

Aplikacja webowa – edytor map 3 lipca 2010

Filed under: GameDev,GameMap,JS — Łukasz @ 17:53
Tags: ,

Map editor

Kontynuując mój poprzedni wątek nt. mapy gry webowej, dziś stworzyłem GUI (Graphical User Interface) pod edytor map, który jest niezbędny do dalszej pracy. Nie wyobrażam sobie jakbym miał „z ręki”, w bazie, dodawać kolejne pola do mapy lub nawet skryptowo przez PHP, po prostu do generowania mapy trzeba mieć podgląd na całość, innego wyjścia nie ma.

 

Wyszło mi to, myślę, nieźle. Zresztą screen widać obok.

 

W sumie jest to wersja dość uboga i powinno to wyglądać coś jak Photoshop. Powinno być okienko Navigator przez które możemy się przesuwać po całości, wybierać x,y od którego chcemy mieć podgląd etc. oraz okienko Sprites, oba oczywiście drag&drop. Ale, w końcu „nie od razu Rzym zbudowano”, na razie to co jest wystarczy mi spokojnie :)

 

Już na początek podam linka do edytora, oto on:
Map Editor

Wystarczy kliknąć na jakimś spricie a następnie na polu na mapie gdzie go chcemy wstawić.

 
(more…)

 

Canvas & Sprites 2 lipca 2010

Filed under: GameDev,GameMap,JS,Web — Łukasz @ 19:19
Tags: , ,

Mapa

Tak jakoś wyszło, że postanowiłem napisać własny system poruszania się po mapie w widoku od góry. Mam teraz trochę czasu więc co mi tam… a skrobnę se… a co?! Całość ma działać tak jak dużo gier na GameBoy`a tzn. mamy bohatera który pozostaje zawsze na środku ekranu, oraz ma ograniczony widok ma mapę (widzi tylko to co jest najbliżej niego). Idąc przesuwa się mapa tj. widzi to czego wcześniej nie widział…

 

Zresztą chyba każdy wie o co chodzi :)

 

Całość będzie oparte o canvas (HTML5), JS + jQuery + Ajax + JSON, MySQL i PHP.

 

Grafika została pobrane z jakiegoś ogromnego obrazka-mapy i nie należy do mnie, jest użyta jedynie w celu pokazowym. Jeśli jesteś autorem i nie podoba Ci się to, że prezentuję kod wraz z Twoją grafiką, proszę o kontakt via email

 

W tym wpisie chcę opisać jak generować mapę.

 

(more…)

 

similar_text in MySQL 1 lipca 2010

Filed under: SQL — Łukasz @ 12:02
Tags: ,

Już dawno miałem napisać ten wpis ale jakoś nie wyszło. Ostatnio spotkałem się z problemem jak na poziomie bazy danych wyciągnąć podobne stringi (podobieństwo procentowe). Chodziło o sprawdzanie literówek. W PHP istnieje funkcja similar_text() i robi dokładnie to o co mi chodziło.

    similar_text( 'abrakadabra', 'kadabra', $p );
    echo $p; // 77.7777777778

Wonderfully! Tylko, że mnie potrzeba było pobrać wszystkie podobne dane (powiedzmy 80%) z bazy wobec wpisanego ciągu, więc skrajnym idiotyzmem byłoby pobieranie wszystkich rekordów i mielenie tego przez PHP. Chodzi o zapytanie w stylu:

      SELECT foo.id FROM foo WHERE SIMILAR( foo.name, 'jakis string' ) > 0.8

Oczywiście funkcja SIMILAR nie występuje w MySQL`u a więc trzeba napisać własną. Nigdy nie pisałem własnej funkcji/procedury składowej w MySQL`u więc była to dla mnie ciekawa lekcja. No dobra… nawet nie napisałem tej funkcji, zainstalowałem tylko to co podał mi wookieb na forum php.pl. Ogólnie similar_text korzysta z algorytmu Olivera, natomiast istnieje też coś takiego jak Odległość Levenshteina, którą zresztą ma odzwierciedlenie w PHP levenshtein(). Odległość Levenshteina oczywiście jak można przeczytać na wiki do której podałem linka, zwraca liczbę całkowitą – najmniejsza ilość zmian jakie należy wykonać na ciągu A, aby go zamienić w ciąg B. Ofc. można liczyć z tego procent:

    $word  	= 'kadabra';
    $word2 	= 'abrakadabra';
	$len1 = strlen( $word );
	$len2 = strlen( $word2 );
    $len = $len1 > $len2 ? $len1 : $len2; 
	
    $p = round(( 1 -levenshtein( $word, $word2 ) / $len ) * 100);
    echo $p; // 64

No i właśnie takie rozwiązanie zastosowałem tyle, że na bazie danych. Wykonanie jest w sumie banalne, wystarczy zainstalować (? nie wiem czy to dobre słowo) dwie funkcje i gotowe. Tworzymy plik 1.sql:

DELIMITER //

CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
        DECLARE s1_char CHAR;
        DECLARE cv0, cv1 VARBINARY(256);
        SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
        IF s1 = s2 THEN
          RETURN 0;
        ELSEIF s1_len = 0 THEN
          RETURN s2_len;
        ELSEIF s2_len = 0 THEN
          RETURN s1_len;
        ELSE
          WHILE j <= s2_len DO
            SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
          END WHILE;
          WHILE i <= s1_len DO
            SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
            WHILE j <= s2_len DO
                SET c = c + 1;
                IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
            END WHILE;
            SET cv1 = cv0, i = i + 1;
          END WHILE;
        END IF;
        RETURN c;
      END
//

DELIMITER ;

oraz 2.sql

DELIMITER //

CREATE FUNCTION LEVENSHTEIN_RATIO (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, max_len INT;
        SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
        IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF;
        RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
      END
//

DELIMITER ;

Odpalamy konsole, logujemy się, nastepnie:

mysql> use foo;
mysql> source c:/1.sql;
mysql> source c:/2.sql;
mysql> SELECT LEVENSHTEIN_RATIO( 'abrakadabra', kadabra ); // 64 :)

to wszystko co musimy zrobić. Jeśli chodzi o optymalizację (przy tabelce z ~1000 rekordów działa to ~7 sek.) to można by okrajać mielony obszar z tych ~1000 rekordów. Jednym pomysłem jest ucinanie go do rekordów o tej samej literze (ludzie raczej nie popełniają literówki w pierwszym znaku).

SELECT 
    id, name, LEVENSHTEIN_RATIO( name, 'luq' ) AS similar
FROM (
    SELECT id, name
    FROM table
    WHERE SUBSTRING( name, 1, 1 ) = 'l'
) AS foo
HAVING similar > 80

Drugim pomysłem (który wysnuł wookieb) jest stworzenie w tabelce pole zawierającego długość stringa (żeby tego nie liczyć, bo wtedy to byłoby wolniejsze) i okrajać sobie zakres szukania do rekordów mających długość +/- np. 2 znaki.

To by było na tyle. Z tego miejsca, serdeczne dzięki wookieb!