if(typeof wczytano_skrypt === "undefined"){ $(".szczegoly_uprawnienia").on({ click: function(){ console.log("kaboooom!"); } }); wczytano_skrypt = true; }
2013-12-13
[js] Zabezpieczenie przed ponownym wczytaniem skryptu
Jeśli chcemy tylko raz wczytać dany skrypt JavaScript wystarczy mały zabieg:
2013-12-05
[git] Cofanie niezatwierdzonych zmian
W przypadku zmian jeszcze nie zatwierdzonych sprawa jest prosta. Poniżej przedstawiam przykład, w którym przez przypadek usunąłem katalog config wraz z zawartymi w nim plikami *.yml. Po wpisaniu git status otrzymałem coś taki wynik:
Aby cofnąć niezatwierdzone zmiany wystarczy wpisać w konsoli:
# Changes not staged for commit: # (use "git add/rm [file]..." to update what will be committed) # (use "git checkout -- [file]..." to discard changes in working directory) # # deleted: app/config/config.yml # deleted: app/config/config_dev.yml # deleted: app/config/config_prod.yml # deleted: app/config/config_test.yml # deleted: app/config/parameters.yml # deleted: app/config/parameters.yml.dist # deleted: app/config/routing.yml # deleted: app/config/routing_dev.yml # deleted: app/config/security.yml #
Aby cofnąć niezatwierdzone zmiany wystarczy wpisać w konsoli:
git checkout -- app/config/*
2013-10-31
[jQuery] Funkcja .live() w jQuery 1.9+
Od wersji 1.9 jQuery nie znajdziesz już funkcji .live() - jeśli z jakiegoś powodu potrzebujesz jej w dalszym ciągu pomoże Ci w tym ten oto fragment kodu:
źródło: http://stackoverflow.com/questions/8021436/turning-live-into-on-in-jquery
jQuery.fn.extend({ live: function( types, data, fn ) { if( window.console && console.warn ) { console.warn( "jQuery.live is deprecated. Use jQuery.on instead." ); } jQuery( this.context ).on( types, this.selector, data, fn ); return this; } });
źródło: http://stackoverflow.com/questions/8021436/turning-live-into-on-in-jquery
2013-10-25
NetBeans 7.4 i Rectangular Edit Tools
Nowa wersja NetBeans'a (7.4) ma konflikt z pluginem Rectangular Edit Tools. Środowisko wiesza się po kliknięciu w oknie Search Result. Aby rozwiązać ten problem wystarczy dezaktywować wspomniany plugin.
źródło: https://netbeans.org/bugzilla/show_bug.cgi?id=237529
źródło: https://netbeans.org/bugzilla/show_bug.cgi?id=237529
2013-07-26
Instalacja statystyk Awstats pod Ubuntu
Instalacja i konfiguracja statystyk z Apache'a na przykładzie strony twoja_domena.pl
Instalacja:
Utworzenie pliku konfiguracyjnego:
Edycja pliku konfiguracyjnego:
Odpalamy pierwszy raz statystyki:
Po jakimś czasie (może nawet kilku minutach) powinno się pojawić coś w tym stylu:
W katalogu /etc/apache2/sites-available/ w którym znajduje się konfiguracja apache'a danej strony (u mnie jest to /etc/apache2/sites-available/twoja_domena_pl) należy dodać:
Na koniec robimy restart Apache'a:
oraz dodajemy generowanie statystyk do Crontaba:
Jeśli chcemy zrestartować awstatsa:
źródło:
- http://jeromejaglale.com/doc/ubuntu/awstats
- https://help.ubuntu.com/community/AWStats
Instalacja:
sudo apt-get install awstatsopcjonalnie również:
apt-get install libnet-ip-perl apt-get install libgeo-ipfree-perl
Utworzenie pliku konfiguracyjnego:
sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.twoja_domena.pl.conf
Edycja pliku konfiguracyjnego:
# apache2 LogFile="/var/log/apache2/access.twoja_domena.log" # domain name SiteDomain="twoja_domena.pl" HostAliases="localhost 127.0.0.1 twoja_domena.pl" LogFormat=1opcjonalnie można aktywować pluginy:
LoadPlugin="tooltips" LoadPlugin="geoipfree"
Odpalamy pierwszy raz statystyki:
sudo /usr/lib/cgi-bin/awstats.pl -config=twoja_domena.pl -update
Po jakimś czasie (może nawet kilku minutach) powinno się pojawić coś w tym stylu:
Create/Update database for config "/etc/awstats/awstats.twoja_domena.pl.conf" by AWStats version 7.0 (build 1.971) From data in log file "/var/log/apache2/access.twoja_domena.log"... Phase 1 : First bypass old records, searching new record... Searching new records from beginning of log file... Phase 2 : Now process new records (Flush history on disk after 20000 hosts)... Jumped lines in file: 0 Parsed lines in file: 2075 Found 0 dropped records, Found 0 comments, Found 0 blank records, Found 54 corrupted records, Found 0 old records, Found 2021 new qualified records.
W katalogu /etc/apache2/sites-available/ w którym znajduje się konfiguracja apache'a danej strony (u mnie jest to /etc/apache2/sites-available/twoja_domena_pl) należy dodać:
Alias /awstatsclasses "/usr/share/awstats/lib/" Alias /awstatsicons/ "/usr/share/awstats/icon/" Alias /awstatscss "/usr/share/doc/awstats/examples/css" ScriptAlias /awstats/ /usr/lib/cgi-bin/ Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Na koniec robimy restart Apache'a:
/etc/init.d/apache2 restart
oraz dodajemy generowanie statystyk do Crontaba:
0 */3 * * * /usr/lib/cgi-bin/awstats.pl -config=twoja_domena.pl -update > /dev/null
Jeśli chcemy zrestartować awstatsa:
sudo su - root cd /var/lib/awstats rm * logout
źródło:
- http://jeromejaglale.com/doc/ubuntu/awstats
- https://help.ubuntu.com/community/AWStats
2013-05-14
[psql] Usunięcie postgresql i apache z autostartu
W przypadku Debiana / Ubuntu / Minta wystarczy użyć polecenia update-rc.d:
PostgreSQL:
Apache:
W przypadku potrzeby skorzystania z PostgreSql'a czy Apache'a wystarczy odpalić go ręcznie z konsoli:
PostgreSQL:
sudo update-rc.d -f postgresql remove Removing any system startup links for /etc/init.d/postgresql ... /etc/rc0.d/K21postgresql /etc/rc1.d/K21postgresql /etc/rc2.d/S19postgresql /etc/rc3.d/S19postgresql /etc/rc4.d/S19postgresql /etc/rc5.d/S19postgresql /etc/rc6.d/K21postgresql
Apache:
sudo update-rc.d -f apache2 remove Removing any system startup links for /etc/init.d/apache2 ... /etc/rc0.d/K09apache2 /etc/rc1.d/K09apache2 /etc/rc2.d/S91apache2 /etc/rc3.d/S91apache2 /etc/rc4.d/S91apache2 /etc/rc5.d/S91apache2 /etc/rc6.d/K09apache2
W przypadku potrzeby skorzystania z PostgreSql'a czy Apache'a wystarczy odpalić go ręcznie z konsoli:
sudo /etc/init.d/postgresql start sudo /etc/init.d/apache2 start
2013-03-15
[psql] Import danych w formacie csv do tabeli w bazie danych
Istnieje możliwość szybkiego importu danych z pliku CSV bezpośrednio do tabeli w bazie danych. Poniżej przedstawiam prosty przykład jak tego dokonać:
drop table tabela_testowa; create table tabela_testowa( kod VARCHAR(10), akronim VARCHAR(32), nazw VARCHAR(128) ); copy tabela_testowa (kod,akronim,nazw) from stdin with csv delimiter as ';' quote '"'; "0101";"KŘBENHAVNS";"KŘBENHAVNS KOMMUNE" "AD76";"DSA";"DANSKE SUNDHEDSORGANISATIONERS ARBEJDSLŘSHEDSKASSE" \.Warto zwrócić uwagę na delimiter i quote. Więcej informacji na temat kopiowania można znaleźć w dokumentacji PostgreSQL'a. :)
2013-02-24
[kohana][php] Upgrade z wersji 3.1 do 3.3
Oczywiście jak to przy zmianie wersji frameworka kohana (po dłuższym czasie) jest niezła zabawa z dostosowaniem aplikacji. Zmian jest sporo - poniżej przedstawiam te, które udało mi się zarejestrować szybko przerabiając swoją własną stronkę, która wcześniej stała na wersji 3.1:
Zmienia się wielkość liter katalogów i plików w aplikacji. Na przykład zamiast
application/classes/model/flickr.php
musi być
application/classes/Model/Flickr.php
Jeśli ktoś używał odpalał ten moduł w bootstrap.php to musi z tego zrezygnować.
Należy w bootstrap.php (np po i18n) wpisać coś takiego:
Trzeba zmienić w pliku konfiguracyjnym 'type' z 'mysql' na 'MySQL'.
źródło: http://stackoverflow.com/questions/13043412/error-when-using-auth-with-orm-driver-kohana-3-3-0
Przestaje istnieć - teraz zamiast dawnego:
Wygląda teraz mniej więcej tak u mnie:
Zamiast:
Zamiast:
Zamiast:
To tyle w mocno telegraficznym skrócie... wg mnie są to dobre zmiany! :)
Więcej informacji: http://kohanaframework.org/3.3/guide/kohana/upgradingguide/kohana/upgrading
Zmiana wielkości liter
Zmienia się wielkość liter katalogów i plików w aplikacji. Na przykład zamiast
application/classes/model/flickr.php
musi być
application/classes/Model/Flickr.php
Brak modułu kohana_cache
Jeśli ktoś używał odpalał ten moduł w bootstrap.php to musi z tego zrezygnować.
Cookie salt
Należy w bootstrap.php (np po i18n) wpisać coś takiego:
Cookie::$salt = 'Your-Salt-Goes-Here';źródło: http://forum.kohanaframework.org/discussion/8873/cookie-salt-problem/p1
Konfiguracja MySQL
Trzeba zmienić w pliku konfiguracyjnym 'type' z 'mysql' na 'MySQL'.
źródło: http://stackoverflow.com/questions/13043412/error-when-using-auth-with-orm-driver-kohana-3-3-0
Odczyt danych z pliku konfiguracyjnego
Przestaje istnieć - teraz zamiast dawnego:
$config = Kohana::config('nazwa_pliku_konfiguracyjnego');plik konfiguracyjny odpalamy następująco:
$config = Kohana::$config->load('nazwa_pliku_konfiguracyjnego');
Main request
Wygląda teraz mniej więcej tak u mnie:
$request = Request::factory(); $response = $request->execute()->send_headers(TRUE); if($response->body()){ $total = array( '{memory_usage}' => number_format((memory_get_peak_usage() - KOHANA_START_MEMORY) / 1024, 2).'KB', '{execution_time}' => number_format(microtime(TRUE) - KOHANA_START_TIME, 2).' s.' ); echo $response->body(strtr((string) $response, $total)); }
Redirect
Zamiast:
$this->request->redirect(Url::base(FALSE, FALSE).'start');mamy teraz:
$this->redirect(URL::base(FALSE, FALSE) . 'start');źródło: http://stackoverflow.com/questions/13088601/kohana-errorexception-fatal-error-call-to-undefined-method-requestredirec
Query builder
Zamiast:
$count = $q_count->select('count("*") AS ilosc')->group_by('tytul','tresc')->execute()->get('ilosc');mamy teraz:
$count = $q_count->select(array(DB::expr('COUNT(*)'),'ilosc'))->group_by('tytul','tresc')->execute()->get('ilosc');źródło: http://kohanaframework.org/3.3/guide/database/query/builder
Parametry funkcji action
Zamiast:
public function action_index($kod=''){}mamy teraz:
public function action_index(){ $kod = $this->request->param('kod'); }
To tyle w mocno telegraficznym skrócie... wg mnie są to dobre zmiany! :)
Więcej informacji: http://kohanaframework.org/3.3/guide/kohana/upgradingguide/kohana/upgrading
2013-02-20
[js][jquery] Mały przykład regular expression
Wykonanie "if'ka" jedynie w przypadku wpisania do html'owego inputa (o id badane_pole) numeru zgodnie z formatem:
OW/EEE/RR/NNNNN
gdzie:
OW - dwie cyfry
EEE - trzy cyfry lub duże litery
RR - dwie cyfry
NNNNN - pięć cyfr
OW/EEE/RR/NNNNN
gdzie:
OW - dwie cyfry
EEE - trzy cyfry lub duże litery
RR - dwie cyfry
NNNNN - pięć cyfr
var rege = /^([0-9]{2})+\/([A-Z0-9]{3})+\/([0-9]{2})+\/([0-9]{5})$/; if(rege.test($("#badane_pole"))){ //gogogo! }
2013-02-17
[psql][mysql] Kilka różnic między MySql'em a PostgreSql'em
Po dłuuugiej przerwie usiadłem przed bazą MySQL'a i próbuję jakoś ją ogarnąć. Ostatnio stykam się głównie z PostgreSQL'em i nabrałem już kilka nawyków, które nie do końca się sprawdzają przy MySQL'u. Jest między tymi bazami kilka różnic w obsłudze i postaram się je w tym wpisie zbierać i przedstawić.
Odwykłem od nakładek typu phpMyAdmin - wszystkie zapytania i modyfikacje wykonuję w postgresie z konsoli i jest mi z tym dobrze. :) Spróbuję tak samo działać w MySQl'u.
Już na starcie niestety uderzył mnie w MySQL'u brak "podpowiadania" poleceń po wciśnięciu Tab - to jakaś masakra (EDIT: okazuje się że podpowiada jak się pisze dużymi literami). Nie podpowiada też ścieżki do pliku, który chciałbym na przykład wczytać...
Oto kilka różnic, które dostrzegłem po kilku chwilach:
W PostgreSQL i w MySQL wygląda to tak samo:
W postgresie można utowrzyć nową bazę jeszcze nie będąc w psql:
W mysql pewnie też można ale ja tego póki co nie odkryłem... :)
psql:
mysql:
psql:
lub
mysql:
Jest na pewno jeszcze pół miliona więcej różnic - jak coś zauważę to dodam do listy.
Odwykłem od nakładek typu phpMyAdmin - wszystkie zapytania i modyfikacje wykonuję w postgresie z konsoli i jest mi z tym dobrze. :) Spróbuję tak samo działać w MySQl'u.
Już na starcie niestety uderzył mnie w MySQL'u brak "podpowiadania" poleceń po wciśnięciu Tab - to jakaś masakra (EDIT: okazuje się że podpowiada jak się pisze dużymi literami). Nie podpowiada też ścieżki do pliku, który chciałbym na przykład wczytać...
Oto kilka różnic, które dostrzegłem po kilku chwilach:
Tworzenie nowej bazy danych
W PostgreSQL i w MySQL wygląda to tak samo:
CREATE DATABASE nazwa_bazy;
W postgresie można utowrzyć nową bazę jeszcze nie będąc w psql:
createdb -U nazwa_usera nazwa_bazy
W mysql pewnie też można ale ja tego póki co nie odkryłem... :)
Wejście do bazy danych
psql:
psql -W -U nazwa_usera nazwa_bazy
mysql:
mysql -u nazwa_usera -p -D nazwa_bazy
Wczytanie kodu SQL z pliku
psql:
$ psql -U nazwa_usera nazwa_bazy -f /var/www/projekt/sql/0001.sql
lub
\i /var/www/projekt/sql/0001.sql
mysql:
$ mysql -u nazwa_usera -p nazwa_bazy < /var/www/projekt/sql/0001.sqllub
\. /var/www/projekt/sql/0001.sqlWielkich różnic tutaj nie ma - oprócz wyżej wspomnianego braku podpowiadania...
Wyświetlenie baz danych
psql:select datname from pg_database;mysql:
show databases;
Wyświetlenie tabel bazy danych
psql:\dtmysql:
show tables;
Wyświetlenie szczegółów tabeli
psql:\d nazwa_tabelimysql:
describe nazwa_tabeli;
Modyfikacja kolumny tabeli
psql:ALTER TABLE t1 ALTER COLUMN test TYPE VARCHAR(255);mysql:
ALTER TABLE t1 MODIFY test VARCHAR(255);
Jest na pewno jeszcze pół miliona więcej różnic - jak coś zauważę to dodam do listy.
2013-01-10
[psql] Wyciągnięcie id z inserta i wykorzystanie go w innym insercie
Tym razem problem SQL'owy. Miałem dziś potrzebę stworzenia zapytania, które rozpisze dane z pewnej tabeli do dwóch powiązanych ze sobą tabel. Potrzebowałem w tym celu id zapisywanej pozycji aby móc ją wykorzystać w innym insercie. Tutaj z pomocą przyszła mi możliwość utworzenia w PostgreSQL funkcji oraz triggerów.
Jako pierwsze stworzyłem funkcję insert_po_insercie() za pomocą której dokonuję operacji na tej drugiej tabeli (posiadając już id):
create function insert_po_insercie() returns trigger as $$ begin insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id); return new; end; $$ language plpgsql;Później stworzyłem triggera insert_po_insercie, który wygląda tak:
create trigger insert_po_insercie after insert on table_01 for each row execute procedure insert_po_insercie();Widać tutaj, że po insercie do tabeli table_01 wywoływana jest funkcja insert_po_insercie(). Mając już tak funkcję i triggera można wykonać inserty do tabeli table_01:
INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;W funkcji przy tworzeniu inserta skorzystałem z świeżo utworzonego id (new.id) oraz przy okazji idp (new.idp), które również było mi potrzebne. Można w ten sposób pobierać dowolną kolumnę z tabeli źródłowej. Funkcja poza pokazanym na przykładzie insertem może robić wiele innych czynności. Na przykład po insercie można umieścić update do jeszcze innej tabeli, w której z kolei skorzystamy z id nowoutowrzonego inserta:
create function insert_po_insercie() returns trigger as $$ begin insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id); update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id; return new; end; $$ language plpgsql;Całość wygląda zatem tak:
create function insert_po_insercie() returns trigger as $$ begin insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id); update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id; return new; end; $$ language plpgsql; create trigger insert_po_insercie after insert on table_01 for each row execute procedure insert_po_insercie(); INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;Pozdrawiam!
Subskrybuj:
Posty (Atom)