2010-08-16

[jQuery] Nowy View Large On Black i .one()

Niedawno zmienił się layout galerii Flickr i przestał mi działać skrypcik View Large On Black, o którym pisałem tutaj.
Modyfikując skrypt natknąłem się na fantastyczną funkcję jQuery .one(). Dzięki .one() można w prosty sposób zdefiniować, aby jakieś zdarzenie mogło być wykonane tylko jeden raz. Można oczywiście tego typu zabieg wykonać również za pomocą .bind() i .unbind() ale .one() jest znacznie bardziej "eleganckie".
Nowy skrypt View Large On Black - i przy okazji zastosowanie funkcji .one() - można obejrzeć pobierając plik stąd.

2010-07-28

[unix] Cloc - obliczanie ilości linii kodu

Jeśli chcesz sprawdzić ile linii kodu ma Twoja aplikacja polecam Cloc'a (Count Lines of Code). Jest to skrypt napisany w Perlu - wystarczy ściągnąć na dysk, uruchomić wskazując program, który chcemy zbadać i wcisnąć enter:

./cloc-1.51.pl /var/www/test/

Cloc przeskanuje pliki znajdujące się w katalogu test i wyrzuci wynik wyglądający mniej więcej tak:

456 text files.
450 unique files.
164 files ignored.

http://cloc.sourceforge.net v 1.51 T=2.0 s (146.0 files/s, 16437.5 lines/s)
---------------------------------------------------------------------
Language files blank comment code
---------------------------------------------------------------------
PHP 265 3947 10352 15815
CSS 9 165 172 1036
Javascript 6 20 278 575
Bourne Shell 10 54 142 218
SQL 2 13 0 88
---------------------------------------------------------------------
SUM: 292 4199 10944 17732
---------------------------------------------------------------------

Cloc wspiera wiele języków programowania i ma mnóstwo fajnych opcji o których warto sobie poczytać w deszczowe dni... :)

2010-07-22

[psql] Obliczanie wieku funkcją age() i date_part()

Funkcja age() w Postgresie to bardzo fajna sprawa. Za pomocą niej można w prosty sposób obliczyć wiek użytkownika.
Zapytanie:

SELECT age(data_ur) as wiek FROM user WHERE id=1;

(gdzie data_ur jest typu date) może dać wynik:

wiek
-------------------------
6 years 11 mons 21 days

Jeśli chcielibyśmy się dowiedzieć ile użytkownik miał lat na przykład 21 kwietnia 2009 roku wystarczy napisać:

SELECT age(timestamp '2009-04-21', data_ur) as wiek FROM user WHERE id=1;

co da wynik w postaci:

wiek
------------------------
5 years 8 mons 20 days

Za pomocą funkcji date_part() można w prosty sposób "wyciągnąć" z wyniku np. jedynie ilość lat (bez informacji o miesiącach i dniach):

SELECT date_part('year', age(timestamp '2009-04-21', data_ur)) as wiek FROM user WHERE id=1

wynik:

wiek
------
5

2010-06-17

[jquery] Automatyczne wylogowanie użytkownika

W jaki sposób wylogować użytkownika z programu gdy on sam tego nie zrobi? Jak go wylogować gdy zamknie okno przeglądarki lub wyjdzie z programu przechodząc na inną stronę? Jak to zrobić pod Firefox'em?
Szukam odpowiedzi na te pytania od jakiegoś czasu i znaleźć tak do końca dobrego sposobu nie mogę. W sieci też nie namierzyłem żadnego dobrze działającego rozwiązania a jak to mawiają jak czegoś nie ma w googlach to na pewno to coś nie istnieje. ;)
Mimo wszystko nie poddaję się i coś kombinuję - udało mi się znaleźć pewnie rozwiązanie, dzięki któremu ilość wylogowań użytkowników z systemu znacznie wzrosła.

W momencie gdy na utworzymy plik autologout.js w którym umieścimy:

$(document).ready(function(){
function bye(e) {
location.href = "logout.php";
}
window.onbeforeunload=bye;

$("#nazwaBody").mousedown(function(){
window.onbeforeunload=null;
});
});

a w samym kodzie strony umieścimy:

<script type='text/javascript' src='autologout.js'></script>

oraz dodamy id do body:

<body id="nazwaBody">

to każda próba wyjścia z systemu spowoduje przejście do strony logout.php. Aby skrypt nie zadziałał w momencie przejścia z jednej podstrony systemu do drugiej wyłączamy onbeforeunload gdy użytkownik kliknie gdziekolwiek w obszarze aplikacji.

Nie jest to idealne rozwiązanie (można je obejść w prosty sposób) ale mimo wszystko ilość wylogowujących się z systemu użytkowników wzrosła z 10 do 90 procent co bardzo mnie cieszy. :)

Szukam w dalszym ciągu lepszego rozwiązania tego problemu...

2010-05-11

[jquery][php] $_GET w jQuery

Aby skorzystać z tablicy $_GET w jQuery wystarczy:

function getQueryParams(qs) {
qs = qs.split("+").join(" ");
var params = {};
var tokens;

while (tokens = /[?&]?([^=]+)=([^&]*)/g.exec(qs)) {
params[decodeURIComponent(tokens[1])]
= decodeURIComponent(tokens[2]);
}

return params;
}

var $_GET = getQueryParams(document.location.search);

źródło: http://stackoverflow.com/questions/439463/how-to-get-get-and-post-variables-with-jquery

2010-04-25

[unix] edytor vi

Czasem zdarza mi się edytować ogromne pliki tekstowe - takie, które 'ważą' ponad 1GB. Zwykły edytor nie daje sobie rady z otworzeniem takiej ilości danych. Z pomocą w takim wypadku przychodzi edytor vi. Nie jest dla mnie zbyt intuicyjny dlatego właśnie o nim wspominam - może się przydać taki wpis w przyszłości.

Najważniejsze polecenia (dla mnie):

# wyjście bez zapisania zmian
:q!

# zapisanie zmian
:w

# wyjście z zapisaniem zmian
:x

# zamiana wszystkich nazwa1 na nazwa2 w danej linii (gdzie jest kursor)
:s/nazwa1/nazwa2/g

# zamiana wszystkich nazwa1 na nazwa2 w całym pliku
:%s/nazwa1/nazwa2/g
Więcej o edytorze można przeczytać na Wikipedii.

2010-04-18

[kohana] cache'owanie

Pisząc poprzedni wpis do bloga zauważyłem, że mój View Large On Black potrzebuje około 2 sekund na wyrenderowanie strony:

W tym czasie aplikacja trzy razy łączy się z api flickr'a aby pobrać dane wyświetlanych zdjęć.
Dane te są stałe więc można tu z powodzeniem wykorzystać cache'owanie.
W kohanej aby dodać dane do cache'a wystarczy:

Kohana::cache($nazwa_zmiennej,$dane);

Odczyt danych wygląda natomiast w ten sposób:

$wynik = Kohana::cache($nazwa_zmiennej,null,$lifetime);
gdzie $lifetime oznacza czas życia zmiennej cache.
Jeśli nie podamy $lifetime:

$wynik = Kohana::cache($nazwa_zmiennej);
to aplikacja będzie uwzględniać dane, które trafiły do cache'a w ciągu ostatnich 60 sekund.
Po umieszczeniu w cache'u danych pobieranych z flickr'a udało się zaoszczędzić ok. 2 sekundy podczas każdego przeładowania i renderowanie strony wynosi ok. 0,02 sekundy.