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-08-16
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 przeskanuje pliki znajdujące się w katalogu test i wyrzuci wynik wyglądający mniej więcej tak:
Cloc wspiera wiele języków programowania i ma mnóstwo fajnych opcji o których warto sobie poczytać w deszczowe dni... :)
./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:
(gdzie data_ur jest typu date) może dać wynik:
Jeśli chcielibyśmy się dowiedzieć ile użytkownik miał lat na przykład 21 kwietnia 2009 roku wystarczy napisać:
co da wynik w postaci:
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):
wynik:
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:
a w samym kodzie strony umieścimy:
oraz dodamy id do body:
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...
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:
źródło: http://stackoverflow.com/questions/439463/how-to-get-get-and-post-variables-with-jquery
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):
Najważniejsze polecenia (dla mnie):
Więcej o edytorze można przeczytać na Wikipedii.
# 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
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:
Odczyt danych wygląda natomiast w ten sposób:
Jeśli nie podamy $lifetime:
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.

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:
gdzie $lifetime oznacza czas życia zmiennej cache.
$wynik = Kohana::cache($nazwa_zmiennej,null,$lifetime);
Jeśli nie podamy $lifetime:
to aplikacja będzie uwzględniać dane, które trafiły do cache'a w ciągu ostatnich 60 sekund.
$wynik = Kohana::cache($nazwa_zmiennej);
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.
Subskrybuj:
Posty (Atom)