2011-11-26

[linux] Boot z Grub'a

Miałem dziś małą zabawę z instalacją Ubuntu na laptopie Toshiby. To archaiczny sprzęt, na którym instalacja systemu to prawdziwa męka. Po wielu próbach udało mi się zainstalować na nim Ubuntu - jednak zainstalowałem system na dysku zewnętrznym przez USB a później włożyłem dysk do czeluści tego laptopa. :-) Oczywiście system nie wstał ale odpalił się Grub, w którym wystarczyło wpisać:
root (hd0,1)
linux /vmlinuz root=/dev/sda1
initrd /initrd.img
boot
Po tym zabiegu wszystko pięknie śmiga... :-)

2011-07-28

[jQuery] Tablica z wynikami wyciągnięta za pomocą $.post

$.post umożliwia (oprócz zwykłych ciągów znaków) odebranie całej tablicy z danymi - bardzo fajna sprawa dzięki której dziś zrobiło mi się lżej na sercu. :) Żeby odebrać taki "array" a nie tylko "string" wystarczy po argumentach funkcji $.post dodać znacznik "json":

$.post("test.php", { "func": "getNameAndTime" },
function(data){
console.log(data.name); // John
console.log(data.time); // 2pm
}, "json");

W pliku test.php z którego pobieramy dane wystarczy zamiast zwykłego

echo "zwykly ciag znakow";
dać

echo json_encode(array("name"=>"John","time"=>"2pm"));

Żródło: http://api.jquery.com/jQuery.post/

2011-06-21

[svn] Can't find a temporary directory: Internal error

Jeśli pojawia Ci się przy svn update komunikat w stylu:

Can't find a temporary directory: Internal error

to znaczy, że możesz mieć problem z miejscem na dysku na serwerze - radzę sprawdzić to w pierwszej kolejności (np. komendą df -h). :-)

2011-06-19

[unix][curl] Download wielu plików z zabezpieczonego katalogu

Jeśli nie masz uprawnień do przeglądania zawartości katalogu www - tzn. otrzymujesz komunikat typu:

Forbidden

You don't have permission to access /images/xyz/ on this server.
Apache Server at www.tajemny-host.com Port 80

a do tego znasz mniej więcej nazewnictwo plików znajdujących się w katalogu to jest szansa, że uda Ci się pobrać zawartość. Wszystko dzięki curl - wystarczy, że wpiszesz z linii poleceń:


curl http://www.tajemny-host.com/images/img[00-99]_[A-Z].jpg -o img#1_#2.jpg

Przyjąłem tutaj, że pliki w katalogu xyz mogą mieć nazwy typu img28_C.jpg albo img47_A.jpg. Curl za pomocą powyższej linijki kodu ściągnie tego typu pliki bez większego problemu - fantastyczna sprawa. :-)

2011-06-16

[jQuery] wiele elementów do jednego eventa

Istnieje możliwość podpięcia kilku elementów do jednego zdarzenia - można zrobić to mniej więcej w taki sposób:

var idleka_search = $("#idleka_search");
var idkorg_search = $("#idkorg_search");
var idfdm_search = $("#idfdm_search");

var combined = idleka_search.add(idkorg_search);
combined = combined.add(idfdm_search);

$(combined).change(function(){ ... });

2011-06-01

[php] rawurlencode() i [js] decodeURIComponent()

Chcąc zakodować jakiś string w PHP i poprawnie go odkodować przy użyciu JavaScriptu proponuję zastosować wbudowane funkcje: rawurlencode() i decodeURIComponent().
urlencode() nie do końca mi wystarczyło - funkcja zmienia na przykład spację na "+" zamiast na %20 (przez co trudniej taki string odkodować wbudowanymi funkcjami w js). decodeURI natomiast nie odkodowało np. znaków %21 (!) czy %40 (@).
Tak więc rawurlencode() i decodeURIComponent() to dobre połączenie - przynajmniej dla mnie. :-)

2011-04-20

[Kohana] Upgrade z 3.0.x na 3.1.x

Upgrade mojej strony (marceen.pl) opartej na Kohanej nie obył się bezboleśnie niestety. Framework cały czas mocno się rozwija a ja - przyznaję się bez bicia - ostatnio nie śledziłem zmian jakie w nim zaszły. :-)
Dziś postanowiłem na własnej skórze zbadać jak mocno się zmieniło to środowisko. I jak się okazuje jest kilka zmian:

Wywołanie widoku

//3.0
$this->request->response = $view;
//3.1
$this->response->body($view);

Wyłapywanie błędu 404


W wersji 3.0 obsługa wyjątku odbywała się w bootstrap.php i wyglądała mniej więcej tak:
try {
    $request->execute();
} catch (Exception $e) { // if its not valid, it gets caught here
    $request->status = 404;
    $request->response = View::factory('errors/404');
}

W wersji 3.1 wygląda to zupełnie inaczej. W bootstrap.php dodajemy jedynie jedną linijkę kodu (koniecznie za Kohana::init()):
set_exception_handler(array('Kruzar_Exception_Handler', 'handle'));
oraz tworzymy klasę Kruzar_Exception_Handler:
class Kruzar_Exception_Handler
{
    public static function handle(Exception $e)
    {
        switch (get_class($e))
        {
            case 'HTTP_Exception_404':
                $response = new Response;
                $response->status(404);
                $view = View::factory('errors/404');
                $view->title = 'ERROR 404 - nie ma takiej strony';
                $view->message  = $view->title;
                $view->message .= $e->getMessage();
                echo $response->body($view)->send_headers()->body();
                return TRUE;
                break;
            default:
                return Kohana_Exception::handler($e);
                break;
        }
    }
}
i umieszczamy w /application/classes/kruzar/exception/handler.php

Odchudzony bootstrap.php


Już na przykładzie powyżej widać optymalizację kodu w bootstrap. Zmiany w tym pliku są większe - część kodu związana z uruchomieniem została przeniesiona do pliku index.php. W bootstrap tylko konfigurujemy śrosowisko - podejście bardzo fajne. :-)

Execution Time


W wersji 3.0 miałem informację (pod zdjęciami) o tym jaki jest czas generowania strony. W związku ze zmianami kawałek kodu który za to odpowiadał nieco trzeba było zmienić i przenieść do pliku index.php:
//zamiast
echo Request::factory()
   ->execute()
   ->send_headers()
   ->body();

//piszemy coś takiego:
$request = Request::factory();
$request->execute();

if ($request->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.');
   $request->response()->body(strtr((string) $request->response(), $total));
}

echo $request->response()->send_headers()->body();

To zmiany, przez które dziś przebrnąłem - szerszą informację o zmianach można znaleźć tutaj.

2011-03-28

[eclipse] Subversion Native Library Not Available

Instalując plugin Subclipse do Eclipse'a natknąłem się na błąd:
Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.24/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

Do rozwiązania tego problemu pod Mint'em wystarczy:

1. Zainstalowanie libsvn-java


sudo apt-get install libsvn-java

2. Edycja eclipse.ini


W pliku eclipse.ini (znajduje się w katalogu eclipse) należy po linii -vmargs dopisać:
-Djava.library.path=/usr/lib/jni
Na koniec wystarczy zrestartować Eclipse i wszystko powinno śmigać.

2011-03-25

Własne aliasy w bash'u

Linux Mint jak każda dystrybucja GNU/Linux'owa umożliwia tworzenie aliasów. To fantastyczny wynalazek dzięki któremu można w prosty sposób stworzyć sobie skróty długich, często używanych komend terminalowych. Na przykład zamiast wpisywania czegoś takiego:

ssh -p 666 m4rc1no5@host
można dzięki aliasom zdefiniować sobie skrót w stylu:

goto_host

Co należy zrobić żeby stworzyć sobie taki skrót?

Po pierwsze .bashrc


Dodajemy w .bashrc kod:

#wczytanie aliasow
if [ -f ~/.bash_aliases ]; then
source ~/.bash_aliases
fi
Plik .bashrc powinien znajdować się w katalogu domowym. Jesli tam go nie ma to trzeba go utworzyć i wpisać tam kod znajdujący się wyżej.

Po drugie .bash_aliases


W katalogu domowym tworzymy plik .bash_aliases i umieszczamy w nim własne aliasy - na przykład:

alias goto_host='ssh -p 666 m4rc1no5@host'

Po tych fantastycznych i banalnych dwóch krokach otwieramy nowy terminal, wpisujemy

goto_host
i cieszymy się z dobrodziejstw jakie dają nam aliasy. :-)

2011-03-11

Eclipse dla PHP

Postanowiłem ponownie spróbować "podejść" do Eclipse'a dla PHP (Eclipse PDT 2.2.0). Tym razem bardziej przypadł mi do gustu i po kilku chwilach zabawy nie jestem tak zupełnie zrażony - wręcz podoba mi się. :-)
Zawsze brakowało mi możliwości zaznaczania bloku tekstu (Block Selection Mode) - jak się okazuje w nowej wersji tego softu jest już taki bajer (dostępny po wciśnięciu Ctrl+Shift+A) co bardzo mnie ujęło. Nie jest to tak fajnie zrobione jak bym chciał ale nie ma co narzekać.
Na pierwszy rzut oka współpraca Eclipse'a z SVN'em też działa dobrze - wystarczyło pobrać plugin Subclipse.
Być może wcześniej też wszystko śmigało tylko byłem źle nastawiony do zmian? ;-)