Trafić z tematem…

Pisząc swojego bloga nigdy nie starałem się trafić w jakiś temat po to aby nabić sobie odwiedzin. Pisałem po prostu tylko o tym, czym chciałem podzielić się z innymi.

Tymczasem okazało się, że niechcący trafiłem w naprawdę mocną tematykę. W ostatni czwartek napisałem wpis o łańcuszkach w Orange. Miał być to krótki wpis na temat denerwującego mnie spamu.

Dziś, około pół godziny temu, jak od czasu do czasu, postanowiłem sprawdzić moje statystyki w Google Analytics.

Peak statystyk

Pierwszą rzeczą o której pomyślałem było to, że G Analytics skasowało mi poprzednie odwiedziny, ale po najechaniu na ową wybitą do góry kropę ujrzałem liczbę… 297. Być może na niektórych z Was ta liczba nie robi wrażenia, ale w przypadku gdzie mój blog ma ok. 20 odwiedzin dziennie, a dotychczasowy rekord wynosił 49, to powyższa sytuacja była dla mnie szokiem.

Postanowiłem zbadać tą sytuację. Moją pierwszą myślą było to, że boty spammerskie w jakiś sposób zaczęły wykonywać JS od G Analytics, jednak sprawdzenie z jakiej lokalizacji pochodzą odwiedziny tego dnia. Okazało się, że ok 98% było z Polski. To dość mocno zbiło mnie z tropu.

Postanowiłem sprawdzić po jakich słowach znaleziono moją stronę.

Słowa kluczowe

Wtedy wszystko stało się jasne. Po prostu… trafiłem z tematem :)

Łańcuszki od Orange? Nie, spokojnie. To tylko spam :)

Taki sobie dziwny tytuł wymyśliłem na dzisiejszy wpis. Otóż rano, przed wyjściem do szkoły dostałem od kolegi SMS-a następującej treści:

Wielka promocja w Orange. Wyslij teraz tego sms'a do 5 osób. A na twoje konto wplynie 150zl. Oferta trwa do 10.09.2011r.

Szczegoly na www.orange.pl/promocje

Wali oszustwem na odległość więc gdy tylko wróciłem ze szkoły, postanowiłem to sprawdzić. Poszukiwania zacząłem od wspomnianego adresu (orange.pl/promocje). Strona istniała, prowadziła do niej zakładka w menu, ale była całkowicie pusta. Wtedy już miałem stuprocentową pewność, że ktoś się wygłupia.

Wpisanie samego początku SMS-a w Google potwierdziło moje przypuszczenia. Zdziwienia nie było, zastanawia mnie tylko jedna rzecz… Po co? Phishing to to nie jest, sprawca nie czerpie z tego żadnych korzyści, nic nie wyłudza. Czyżby chodziło o zwykły szpan przed kolegami z piaskownicy?

A może po prostu sądził, że nikt się nie nabierze? Jeśli tak, to niestety się pomylił… Ludzi żywiących takie pasożyty nie brakuje. Aż przypomina mi się łańcuszek, który magicznie miał spowodować zniknięcie śledzika. Czy niektórzy ludzie kiedyś dojrzeją? :)

WordPress zaskoczyć umie

Przyznam się, że odkąd na innym blogu na którym pisuję (polecam swoją drogą ;)) dokonałem aktualizacji WP do wersji 3.2 (co zawsze robiłem, gdy tylko wychodziła polska wersja), byłem dość mocno rozczarowany. Przeszkadzał mi nowy wygląd panelu administracyjnego. Jeszcze bardziej zminimalizowany, jeszcze jaśniejszy i ogólnie jakiś taki dziwny (jak dla mnie, rzecz jasna).

Dlatego też wyjątkowo odkładałem aktualizację WP na sobak.pl. Odkładałem aż do dzisiaj

Czytaj dalej →

Backupowanie baz danych MySQL z poziomu PHP

Na samym początku zaznaczam, że pierwowzór skryptu przedstawionego poniżej nie jest mojego autorstwa! Skrypt znalazłem tutaj (skrypt na samym dole artykułu). Dokonałem w nim kilku przeróbek i w tym miejscu zostawiam dla potomnych - może się komuś przyda!

{{{ more }}}

Wprowadzone zmiany:

  • Umieszczenie daty wykonania backupu na górze zrzutu bazy
  • Lekkie ogarnięcie kodu PHP. Wiem, że wiele mu brakuje - jak komuś chce się bawić, to proszę bardzo - dla mnie aktualnie liczy się fakt, że skrypt działa
  • Zmiana formatu nazwy pliku (na taki który mi bardziej odpowiada :P). Jakby się komuś nie podobał, to zmiana jest przecież banalna.
  • Możliwość ustawienia katalogu w którym będą lądowały backupy
  • Kilka zmian czysto estetycznych
<?php
header('Content-type: text/html; charset=utf8');

try{
    // KONFIGURACJA - START
    $dbName = 'revival'; // Nazwa bazy danych do zbackupowania
    $dbHost = 'localhost'; // Nazwa serwera baz danych
    $dbUser = 'root'; // Nazwa użytkownika
    $dbPass = ''; // Hasło

    $backupsDir = 'backups'; // Katalog do którego będą zapisywane backupy. Bez końcowego ukośnika!
    // KONFIGURACJA - STOP
    // Dalej lepiej nie ruszać!

    // Stworzenie nowego obiektu klasy PDO
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUser, $dbPass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sqlResult = $pdo -> query("SHOW tables FROM $dbName");

    // Stworzenie nagłówka informacyjnego
    $sqlData = "-- Data wykonania kopii: ".date('d.m.Y')." r. o godzinie ".date('H:i')."
    -- Baza: $dbName
    SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";";

    while ($queryTable = $sqlResult -> fetch(PDO::FETCH_ASSOC)){
        $sqlTable = $queryTable['Tables_in_'.$dbName];
        $sqlResultB = $pdo -> query("SHOW CREATE TABLE $sqlTable");
        $queryTableInfo = $sqlResultB -> fetch(PDO::FETCH_ASSOC);

        // Dodanie nagłówków dla konkretnych tabel
        $sqlData .= "\n\n--
        -- Struktura dla tabeli `$sqlTable`
        --\n\n";
        $sqlData .= $queryTableInfo['Create Table'] . ";\n";
        $sqlData .= "\n\n--
        -- Wartości tabeli `$sqlTable`
        --\n\n";

        $sqlResultC = $pdo -> query("SELECT * FROM $sqlTable");

        // Stworzenie INSERT-a dla każdego rekordu
        while ($queryRecord = $sqlResultC -> fetch(PDO::FETCH_ASSOC)) {
            $sqlData .= "INSERT INTO `$sqlTable` VALUES (";
            $sqlRecord = '';
            foreach( $queryRecord as $sqlField => $sqlValue ) {
                $sqlRecord .= "'$sqlValue',";
            }
            $sqlData .= substr($sqlRecord, 0, -1);
            $sqlData .= ");\n";
        }
    }

    // Zapisujemy wynik do pliku
    file_put_contents($backupsDir.'/backup_'.$dbName.'_'.date('d_m_Y').'.sql', $sqlData);
    echo 'Backup został zapisany.';
}

catch(PDOException $e){
    echo 'Połączenie nie mogło zostać utworzone: '.$e->getMessage();
}

Skrypt umieścić u siebie na FTP i uzupełnić sekcję konfiguracyjną. Wywoływać ręcznie (poprzez wpisanie URL-a) albo przez CRON-a.

Musisz koniecznie pamiętać o zabezpieczeniu katalogu z backupami (chociażby przez plik .htaccess). Dobrze by było też zabezpieczyć sam skrypt backupujący, aby nikt nie zajechał nam bazy danych przez wywoływanie w pętli.

Mimo tego, że skrypt testowałem, to nie biorę żadnej odpowiedzialności za jakiekolwiek szkody wynikłe z jego korzystania! Boisz się to nie używaj.

Mam nadzieję, że ten skrypt pomoże Wam w tworzeniu kopii swoich baz danych i sprawi, że będzie się to działo częściej niż raz na rok :P. Bo jak wiadomo:

"Ludzie dzielą się na tych, którzy robią backupy i tych, którzy zaczną je robić".

Pozdrawiam.

PS: Jakby ktoś zdecydował się rozbudować ten skrypt np. o wysyłanie backupów na e-mail czy ich uploadowanie na zewnętrzny serwer FTP, to niech go udostępni, może innym też się przyda.

Dwa nowe skrypty w Dev Center

Żeby moje nowe Dev Center (opublikowane wczoraj) nie świeciło pustkami toteż napisałem dwa nowe skrypty, które w dniu dzisiejszym dochodzą do jego skromnych zasobów.

Postanowiłem odpicować dwie z klas, których używanych przeze mnie w IronCMS-ie. Upiekłem przy tym dwie pieczenie na jednym ogniu. Po pierwsze: zyskałem nowe skrypty do kolekcji, a po drugie uzyskałem mocno poprawione klasy do użytku w kolejnych wersjach CMS-a (a te się powoli budują…).

Nie ma sensu się rozpisywać. Po prostu prezentuję:

Klasa do obsługi MySQL oraz powiązana z nią klasa loggera zdarzeń.

Wszelkie komentarze mile widziane ;)

Sobak's Dev Center po remoncie…

Już prawie rok minął odkąd utworzyłem swoje Dev Center. Jednak od tamtego czasu poziom mojej wiedzy wzrósł dość mocno i około dwóch tygodni temu stwierdziłem, że czas, aby Dev Center odzyskało jako taki poziom. Zabrałem się do pracy. Jej efekty nie są oszałamiające, lecz zawsze to jakiś postęp.

Jednocześnie informuję, że wszystkie moje projekty, które znajdowały się na blogu zostają przeniesione do Dev Center.

Zmiany

  • możliwość komentowania projektów
  • wygodny panel admina
  • SEO URL-e
  • nowe logo (jeśli to stare można było nazwać logiem)

Cóż, nie ma co się rozpisywać i robić double content. Wszystkie informacje o nowym Dev Center znajdziecie… w nim samym Aktualizacja: DevCenter obecnie nie istnieje.

Przed zakończeniem chciałbym jeszcze zamieścić (lekko spóźnione) podziękowania dla CapaciousCore'a, który pomógł mi z rozwiązaniem jednej dość problematycznej kwestii przy tworzeniu strony :).

Wszystkie opinie, jeśli takowe macie, możecie śmiało zamieszczać w komentarzach. Konstruktywna krytyka również mile widziana.

Jednocześnie jeśli ktoś znajdzie jakiś błąd na wspomnianej stronie, to bardzo bym prosił o kontakt ;)

PHP 5.4 alpha wydane - krok do przodu? [aktualizacja]

Wczoraj developerzy PHP wydali pierwszą wersję alpha z gałęzi 5.4. Wersja ta przynosi sporo zmian, w tym kilka które naprawdę warto wymienić:

  • usunięto register_globals - wprawdzie nikt normalny tego nie włącza, ale to będzie jedna luka bezpieczeństwa mniej o którą będziemy się martwić
  • usunięto safe_mode - hostingi przestaną nas tym męczyć
  • <?= jest teraz zawsze dostępne bez względu na ustawienie short_tags
  • Dodano domyślnie multibyte support. Wcześniej, aby go mieć należało skompilować PHP z opcją --enable-zend-multibyte. Teraz można to włączać lub wyłączać w php.ini
  • zdeprecjonowano funkcję mysql_list_dbs()
  • sporo innych zmian - głównie w rozszerzeniach

Na ostudzenie emocji można zadać dwa pytania. Po pierwsze: kiedy doczekamy się wersji finalnej? Drugie pytanie może jeszcze bardziej zdemotywować: Kiedy doczekamy się wprowadzenia PHP 5.4 na hostingach (nie mówiąc już o tych darmowych, które aktualizacje PHP często odciągają jak tylko się da).

Pełna lista zmian tutaj.

Aktualizacja (09.07.11)

Wszystko wskazuje na to, że w prowadzonym właśnie głosowaniu kolejnych zmian do wersji finalnej zostaną wywalone także magic quotes. Niedługo osiągnę PHP-ową Nirvanę :)

Aktualizacja (16.08.11)

W najnowszej wersji PHP5.4 - alpha 3 zostały usunięte wszystkie rzeczy związane z magic quotes.

Nie wszystko sweet, co się świeci…

W ostatnich latach możemy zaobserwować rosnącą popularność cukierkowych, coraz bardziej minimalistycznych interfejsów programów. Do napisania tego wpisu skłoniły mnie dwie aktualizacje programów jakie wczoraj wykonałem. Mowa o Thunderbirdzie i Operze.

Jeśli chodzi o Thunderbirda, to widać, że mania podbijania numeracji, zapożyczona od Google, na dobre zadomowiła się w Mozilli. Dotyczy już nie tylko Firefoxa. Z Thunderbirda 3.2 na 5.0… niezłe tempo.

Interfejs w tej wersji miał zostać lekko podrasowany. Spójrzmy na różnicę. (kliknij na obrazki, aby powiększyć)

Thunderbird Thunderbird

Poza lekkim odświeżeniem kolorystyki głównego okna ekranu i jeszcze większym zaokrągleniem wszystkiego co się dało (niedługo będziemy kupować monitory w kształcie koła) najbardziej dla mnie rażącą sprawą jest uczynienie tła, pod buttonami i menu, półprzezroczystym. Bo oczywiście teraz wszystko musi być półprzezroczyste…

Problem jest tylko taki, że teraz przyciski "Pobierz", "Napisz", "Adresy", "Etykieta" oraz wszystkie zakładki menu wyglądają jak zawieszone w powietrzu. Albo to jest po prostu nieładne, albo ja jestem strasznie wybredny.

Teraz skupię się na Operze.

Opera 11.11 (kliknij, aby powiększyć) Stary interfejs Opery

Opera 11.50 (kliknij, aby powiększyć) Nowy interfejs Opery

Nastąpiło rozjaśnienie większości barw (tak jak chyba we wszystkich programach - autorzy nie mają już własnych pomysłów tylko ślepo gonią za tłumem), oczywiście jeszcze większe wygładzenie wszystkich przycisków i uczynienie grafik (przycisk nowej karty, ikonki w "szybkim wybieraniu itd") jeszcze bardziej szczegółowymi. No i oczywiście półprzezroczyste tło pod to wszystko. Czy tylko mnie nie kręci możliwość zobaczenia pulpitu przez menu przeglądarki internetowej?

A co Wy sądzicie o takim trendzie minimalizacji i "usładzania" interfejsów? Podoba się Wam to, czy może wolicie starą prostotę?

PS: Żeby nie było, że tylko narzekać umiem - muszę pochwalić Google za ich nowy design. Jest genialny :).