Netbeans 6.9.1 i brzydkie czcionki na Ubuntu 11.10

Witam,

Po instalacji Netbeansa 6.9.1 na Ubuntu 11.10 edytor wyglądał tak

Brzydkie czcionki w netbeansie

Niestety ale dla mnie na takim czymś nie da się pracować :/
Na szczęście jesteśmy w stanie zmienić ten brzydki wygląd. Standardowo netbeans instaluje się w takiej lokalizacji – „/home/user_name/netbeans-6.9.1″.

Tak więc należy edytować plik „/home/user_name/netbeans-6.9.1/etc/netbeans.conf” i wstawić na końcu  wpisu „netbeans_default_options”:

-J-Dswing.aatext=true -J-Dawt.useSystemAAFontSettings=on --laf javax.swing.plaf.metal.MetalLookAndFeel

Restartujemy netbeansa i możemy się cieszyć z ładnego wyglądu :D

Netbeans z ładnym GUIPozdrawiam :)

PHP, MySQL, phpMyAdmin, symfony1.4 – instalacja

Witam,

W tej notce opiszę w kilku krokach instalację i konfigurację php, MySql’a, phpMyAdmin’a oraz symfony 1.4. Wrzucam to tutaj dla siebie, żeby podczas zmiany systemu wszystko mieć pod ręką a przy okazji może się to komuś też przydać :)

1. Instalacja apache2, php oraz mysql

sudo apt-get install apache2 php5 mysql-server

Podczas instalacji mysql’a podajemy hasło roota

Testujemy czy działa

a) apache

Wchodzimy na

http://localhost/

Powinien pojawić nam się taki tekst:

It works!

This is the default web page for this server.

The web server software is running but no content has been added, yet.
b) php
cd /var/www
sudo gedit test.php

W otwartym edytorze wpisujemy poniższy tekst i zamykamy gedita

<?php phpinfo() ?>

W przeglądarce odpalamy

http://localhost/test.php

gdy przeglądarka będzie chciała ściągnąć plik zamiast go wykonać należy wpisać w terminal

sudo /etc/init.d/apache2 force-reload

ew.

sudo a2enmod php5
sudo /etc/init.d/apache2 force-reload
c) mysql
mysql -u root -p

Po wpisaniu hasła podanego podczas instalacji powinniśmy zostać zalogowani. Aby wyjść z konsoli mysql wpisujemy exit.

Instalujemy jeszcze kilka bibliotek:

sudo apt-get install php5-mysql libapache2-mod-auth-mysql php-pear

2. phpMyAdmin

sudo apt-get install phpmyadmin

Wskazujemy apache2 jako serwer www, a następnie zgadzamy się na konfigurację pakietu. Podajemy hasła i czekamy do końca instalacji.

Tworzymy dowiązanie symboliczne:

sudo ln -s /usr/share/phpmyadmin/ /var/www/phpmyadmin

I pod tym adresem powinniśmy mieć popularne narzędzie:

http://localhost/phpmyadmin/

3. Konfiguracja userdir

Domyślnie wszystkie skrypty należy wrzucać do folderu /var/www. Skonfigurujemy trochę php tak aby można było wrzucać skrypty do folderu ~/public_html

sudo a2enmod userdir
sudo /etc/init.d/apache2 force-reload
mkdir ~/public_html
chmod 755 public_html
cd ~/public_html/
gedit test2.php

Znowu w edytorze wpisujemy

<?php phpinfo() ?>

Po zamknięciu i zapisaniu w terminalu wpisujemy

sudo gedit /etc/apache2/mods-available/php5.conf

Zamieniamy zawartość

<IfModule mod_userdir.c>
  <Directory /home/*/public_html>
    php_admin_value engine Off
  </Directory>
</IfModule>

na

<IfModule mod_userdir.c>
  <Directory /home/nazwa_uzytkownika/public_html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
  </Directory>
</IfModule>

I na koniec

sudo /etc/init.d/apache2 restart

Pod poniższym adresem mamy dostępne wszystkie skrypty z folderu ~/public_html

http://localhost/~nazwa_uzytkownika

Nasz przykładowy plik testowy znajduje się pod adresem

http://localhost/~nazwa_uzytkownika/test2.php

4. Symfony

mkdir -p ~/sfprojects
cd ~/sfprojects
mkdir -p lib/vendor
cd lib/vendor

Ściągamy najnowszą wersję frameworka Symfony.

tar zxpf symfony-1.4.15.tgz
mv symfony-1.4.15 symfony
rm symfony-1.4.15.tgz

Sprawdzamy czy wszystko jest w porządku

cd ../..
php lib/vendor/symfony/data/bin/symfony -V

Tworzymy nowy projekt

php lib/vendor/symfony/data/bin/symfony generate:project PROJECT_NAME
php symfony generate:app frontend
php symfony project:permissions

Następnie edytujemy(jak nie ma to tworzymy) plik httpd.conf

sudo gedit /etc/apache2/httpd.conf

I wklejamy do niego coś takiego (oczywiście ścieżki i porty trzeba pozmieniać)

ServerName localhost
# Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:8080

# This is the configuration for your project
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/nazwa_uzytkownika/sfprojects/aplikacja_symfony/web"
  DirectoryIndex index.php
  <Directory "/home/nazwa_uzytkownika/sfprojects/aplikacja_symfony/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/nazwa_uzytkownika/sfprojects/aplikacja_symfony/lib/vendor/symfony/data/web/sf
  <Directory "/home/nazwa_uzytkownika/sfprojects/aplikacja_symfony/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

Pozostało jeszcze tylko zresetować serwer

sudo /etc/init.d/apache2 restart

I w tym przypadku pod poniższym adresem powinna pojawić się strona powitalna symfony :)

http://localhost:8080

 

Pozdrawiam

RVM, Ruby, Rails – instalacja

Witam,

Postanowiłem ze napiszę notkę dotyczącą instalacji RVM’a, Rubiego i Railsów, żeby wszystko mieć w jednym miejscu a przy okazji może ktoś kiedyś z tego skorzysta :)

Opis dot. instalacji w systemie Ubuntu 11.10 ale na innej dystrybucji (Linux Mint, Debian itp.) również powinno zadziałać.

Aby zainstalować Ruby on Rails w systemach typu unix wystarczy wykonać kilka poniższych kroków:

1. Instalacja GIT’a i CURL’a

sudo apt-get install git curl

2. Instalacja RVM’a (Ruby Version Manager)

curl https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable

Po zakończeniu instalacji edytujemy plik .bashrc

gedit ~/.bashrc

Sprawdzamy czy na końcu pliku  została dodana taka linika:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
# Load RVM into a shell session *as a function*

Jeżeli nie ma to dodajemy i zamykamy edytor.
Zamykamy oraz otwieramy terminal (otwieramy nową sesję konsoli aby wczytał się plik .bashrc wraz z nowym wpisem).

Następnie sprawdzamy czy RVM został zainstalowany poprawnie

type rvm | head -1

Powinno nam wyskoczyć

rvm jest funkcją

Jeżeli mamy system w innym języku, napis pojawi się własnie w tym języku.

Pozostała nam jeszcze kwestia instalacji kilka dodatkowych zależności.
Aby zobaczyć jakie biblioteki musimy jeszcze zainstalować wpisujemy:

rvm requirements

W moim przypadku będę używał Rubiego więc zgodnie z instrukcja w terminalu należy wpisać

sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

Ruby on Rails domyślnie dostarczany jest z bazą danych sqlite3. Ja natomiast korzystam z bazy MySQL, więc instaluję zawszę jeszcze dwie dodatkowe biblioteki (nie jest to jednak konieczne do poprawnego działania Railsów).

sudo apt-get install libmysqlclient-dev libmysql-ruby

3. Instalacja języka Ruby

rvm install 1.9.2

Następnie wybieramy wersję, którą chcemy używać

rvm use 1.9.2

I tak dla pewności sprawdzamy czy aby na pewno wszystko zadziałało :)

user@user:~$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

4. Instalacja Railsów

W końcu możemy zainstalować gem rails używając polecenia

gem install rails

I….. to by było na tyle.

Stwórzmy teraz prostą aplikację (tylko do testów) używając Ruby on Rails

rails new test_app
cd test_app
rails server

Jeżeli podczas wywoływania polecenia rails server wystąpił błąd podobny do tego

/home/user/.rvm/gems/ruby-1.9.2-p290@rails311/gems/execjs-1.2.9/lib/execjs/runtimes.rb:47:in `autodetect': Could not find a JavaScript runtime. See
https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
...
...
...

pod tym linkiem znajduje się rozwiązanie. Co prawda tyczy się błędu wywołanego przez inne polecenie jednakże rozwiązanie dla obydwu jest takie same.

Następnie należy otworzyć przeglądarkę i wpisać

http://localhost:3000/

Naszym oczom powinna pokazać się strona powitalna Ruby on Rails :)

Could not find a JavaScript runtime

Witam,

Tworząc nowy projekt w railsach 3.1 podczas wywołania

rake db:create

Pojawił mi się taki oto błąd:

Rake aborted!
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

(See full trace by running task with --trace)

Aby pozbyć się tego błędu należy dodać do pliku Gemfile dwa gemy:

gem 'execjs'
gem 'therubyracer'

Oczywiście jeszcze:

bundle install

I wszystko działa jak należy :)

Pozdrawiam

Wyłączenie automatycznego zapisu znaczników czasu w Railsach

Witam,

Pisząc aplikacje prawie zawsze potrzebuję w swoich tabelach tych dwóch kolumn, tj. created_at oraz updated_at.  Jak wiemy railsy automagiczne „opiekują się” tymi polami, więc zasadniczo nie musimy się w tej kwestii niczym przejmować i zawracać sobie tym głowy.

Jednak czasem zdarzy się taki przypadek, że chcemy aby railsy nie zmieniały pola updated_at podczas aktualizacji wiersza. W bardzo prosty sposób można tę funkcjonalność wyłączyć. Wystarczy wpisać:

W pliku danego modelu (w którym chcemy wyłączyć):

self.record_timestamps = false

Lub w config/environment.rb na końcu pliku ( jeżeli chcemy wyłączyć dla całej aplikacji)

ActiveRecord::Base.record_timestamps = false

Używane raczej rzadko ale jednak czasem się przyda :)

Pozdrawiam

Instalacja gdesklets na ubuntu 10.10

Witam,

Dzisiaj chciałem zainstalować jakiś graficzny dodatek na pulpit, pokazujący aktualną pogodę oraz jej prognozę. Wybór padł na gdesklets.

Tak więc wziąłem się za instalację:

sudo apt-get install gdesklets

Jednakże, gdy chciałem uruchomić menedżera widżetów (gdesklets) pojawił się taki oto problem:

Connecting to daemon [ ###         ]
==========================================================[04/10/11-22:08:39]===
Could not import tiling module!

Connecting to daemon [       ###   ]
==========================================================[04/10/11-22:08:56]===
=== Unhandled error! Something bad and unexpected happened. ===

Aby rozwiązać problem należy:

1. Otworzyć /usr/lib/gdesklets/utils/ErrorFormatter.py jako root

sudo gedit /usr/lib/gdesklets/utils/ErrorFormatter.py

2. Przejść do linii 116, która wygląda tak:

def _new_imp(name, globs = {}, locls = {}, fromlist = []):

3. Zamienić ją na:

def _new_imp(name, globs = {}, locls = {}, fromlist = [], test = []):

I teraz można spokojnie uruchomić gdesklets shell.

Pozdrawiam

Javascript i checkbox

Witam,

Dzisiaj napiszę o tym jak sprawdzić za pomocą czystego JavaScriptu czy pole input typu checkbox jest zaznaczone.

Tak więc mając:

<input type="checkbox" name="name_checkbox" value="yes">

aby sprawdzić czy checkbox jest zaznaczony należy napisać:

if(document.nazwa_formularza.name_checkbox.checked == true)
    alert('yes');
else
    alert('no');

Jak widać na obiekcie document odwołujemy się do własności checked naszego elementu checkbox podając nazwę formularza w którym się znajduje oraz nazwę checkboxa. Następnie sprawdzamy czy zwrocona zostanie wartość true;

Pola input można również grupować ze sobą w ten sposób:

<p>Checkbox1<input type="checkbox" name="nazwa_checkbox"></p>
<p>Checkbox2<input type="checkbox" name="nazwa_checkbox"></p>
<p>Checkbox3<input type="checkbox" name="nazwa_checkbox"></p>

Własność name każdego checkboxa jest taka sama. Dzięki takiemu grupowaniu można w JavaScripcie np. kontrolować czy chociaż jedno z tych pól zostało zaznaczone itp. Ale to za chwile.

Tymczasem dokonamy sprawdzenia, które pola zostały zaznaczone i po kliknięciu przycisku wyświetlimy ich indeksy:

for (i=0; i<document.nazwa_formularza.name_checkbox.length; i++){
    if (document.nazwa_formularza.nazwa_checkbox[i].checked == true)
        alert("Checkbox o indeksie "+i+" jest zaznaczony!");
}

1. Aby sprawdzić ile mamy checkboxów odnosimy się do własności length

2. Sprawdzamy w pętli własność checked każdego elementu naszej tablicy z checkboxami

Uwaga! Należy pamiętać oczywiście, iż indeksowanie tablicy zaczyna się od 0!

Napiszemy teraz praktyczniejszy skrypt sprawdzający czy chociaż jeden checkbox został zaznaczony:

Plik html:

<form method="post" name="nazwa_formularza" action="index.php">
    <p>Checkbox1<input type="checkbox" name="name_checkbox" value="1"></p>
    <p>Checkbox2<input type="checkbox"name="name_checkbox" value="2"></p>
    <p>Checkbox3<input type="checkbox" name="name_checkbox" value="3"></p>
    <p><input type="submit" value="Wyślij"></p>
</form>

JavaScript:

window.onload = load;

function load(){
    document.forms['nazwa_formularza'].onsubmit = check;
}

function check(){
    var zaznaczony = false;
    for (i=0; i<document.nazwa_formularza.name_checkbox.length; i++){
        if (document.nazwa_formularza.name_checkbox[i].checked == true)
            zaznaczony = true;
    }
    if(zaznaczony == false){
        alert("Zaznacz chociaż jeden!");
        return false;
    }
    else
        return true;
}

Zdarzeniem onload uruchamiamy funkcję load(). Ta zaś przy zdarzeniu onsubmit naszego formularza uruchomi funkcję check(), która sprawdza czy chociaż jedno pole zostało zaznaczone.

Do własności checked można również przypisać wartość true lub false. Wykorzystamy to do zaznaczenia wszystkich pól typu checkbox za pomocą jednego buttona.

Do naszego formularza dodajemy przycisk i nadajemy mu id:

<p><input type="button" id="zaznacz_id" value="Zaznacz wszystkie"></p>

Do funkcji load() dopisujemy

document.getElementById('zaznacz_id').onclick = checkAll;

I teraz w momencie wystąpienia zdarzenia onclick uruchomi się funkcja checkAll();

Następnie utwórzymy taką oto metodę:

function checkAll(){
    for (i=0; i<document.nazwa_formularza.name_checkbox.length; i++){
        document.nazwa_formularza.name_checkbox[i].checked = true;
    }
}

Ale co ona robi to chyba każdy już wie? :)

Tutaj możecie  zobaczyć sobie DEMO tego co teraz robiliśmy. Dopisałem jeszcze funkcję uncheckAll(), która odznacza wszystkie pola.

W najbliższej przyszłości zrobię wpis jak to samo zrobić używając bilbioteki jQuery.

Pozdrawiam

Autoloader w PHP

1. Wstęp

Pisząc aplikacje zorientowane obiektowo, zazwyczaj każdą klasę zapisujemy w osobnym pliku. Następnie w momencie gdy chcemy z którejś skorzystać, musimy ją ręcznie dołączyć, używając funkcji np.

 require_once(‘nazwa_pliku.php’)

Przy większych projektach takie dodawanie jest bardzo niepraktyczne, można nawet powiedzieć, że staje się udręką.

Rozwiązaniem tego problemu jest napisanie autoloader’a, który zajął by się automatycznym dołączeniem plików klas przy próbie  utworzenia instancji danej klasy. Aby tego dokonać, można użyć jednej z dwóch funkcji:

  • __autoload(), wymagane PHP >= 5
  • spl_autoload_register(), wymagane PHP >= 5.1.2

Jaka jest różnica pomiędzy tym dwoma funkcjami?

__autoload() W wersji PHP < 5.3.0 nie obsługuje w pełni wyjątków i nie jest dostępna jeżeli używamy PHP CLI.
Jeżeli potrzebujesz kilka funkcji autoload będziesz musiał użyć  spl_autoload_register().

No to teraz trochę praktyki:

2. __autoload()

Zaczniemy od utworzeniu pliku o nazwie np. autoload.php a w nim:

Dodajemy ścieżki do katalogów w których znajdują się nasze klasy, żeby parser wiedział gdzie ich szukać a nastepnie tworzymy funkcje __autoload(), która ładuje odpowiedni plik.

autoload.php

<?php
set_include_path(
        get_include_path()
        .PATH_SEPARATOR."./libs/"
        .PATH_SEPARATOR."./libs2/"
);
function __autoload($class_name) {
        echo 'Ładuję klase'.$class_name;
        require_once $class_name . '.php';
}
?>

Omówię jeszcze szybko  wybrane linie kodu

Linia 2: Funkcja  dodająca ścieżki do katalogu

Linia 3: Pobiera bieżące ścieżki do katalogu

Linia 4,5: Ścieżki do katalogu

Następnie mamy naszą funkcję __autoload która jako argument pobiera nazwę klasy do załadowania. Dla sprawdzenia kiedy się uruchomi nasz autoloader wypiszemy na ekranie która klasa jest ładowana a następnie ładujemy ją.

Teraz utwórzmy dwa katalogi libs i libs2 dla testów.

W katalogu libs tworzymy Class1.php

class Class1 {
    public function  __construct() {
        echo 'Klasa 1';
    }
}

A w katalogu libs2 tworzymy Class2.php

class Class2 {
    public function  __construct() {
        echo 'Klasa 2';
    }
}

Następnie w pliku index.php dołączamy ręcznie jeden jedyny plik z naszym autoloaderem i tworzymy obiekty danych klas:

<?php

require_once 'config/autoload.php';
$obj  = new Class1();
$obj2  = new Class2();
$obj3  = new Class1();

?>

Oto wyniki:

Ładuję klasę Class1
Klasa 1
Ładuję klasę Class2
Klasa 2
Klasa 1

Jak widać klasy się nam ładnie ładują . Gdy tworzymy ponownie obiekt klasy 1 nie jest uruchamiana funkcja __autoload, ponieważ plik został wcześniej dołączony przy okazji utworzenia wcześniejszego obiektu.

3. spl_autoload_register()

Ograniczeniem funkcji __autoload() jest to, że można mieć tylko jeden autoloader. A co jeśli chcemy wiecej? Wtedy naszym ratunkiem jest spl_autoload_register(), za pomocą którego rejestrujemy nasze własne „automatycznie ładowarki”.

Napiszemy jeszcze raz nasz plik autoload.php

 <?php
function autoload1($class_name) {
        echo 'Ładuję klasę '.$class_name."<br>";
        $file = "./inc/".$class_name . '.php';
        if(file_exists($file)){
            require_once $file;
        }
}

function autoload2($class_name) {
        echo 'Ładuję klasę '.$class_name."<br>";
        $file = "./inc2/".$class_name . '.php';
        if(file_exists($file)){
            require_once $file;
        }
}
?>

Jak widać usunęliśmy funkcję __autoload a w zamian za nie utworzyliśmy dwa własne autoloadery. I teraz zamiast ustawiać set_include_path() na odpowiednie katalogi, autoload1 wskazuje na jeden katalog a autoload2 wskazuje na drugi. Sprawdzamy czy istnieje plik który chcemy załadować i teraz albo ładuje albo nie robi nic.

Plik index.php wygląda teraz tak:

<?php

require_once 'config/autoload.php';

spl_autoload_register(autoload1);
spl_autoload_register(autoload2);

$obj  = new Class1();
$obj2  = new Class2();
$obj3  = new Class1();

?>

Jak widać rejestrujemy nasze loadery.

I teraz jeżeli nastąpi utworzenie obiektu którego plik nie został wcześniej dołączony uruchamia się autoload1. Jeżeli ten nie dołączy pliku uruchomi się autoload2, w przeciwnym wypadku autoload2 się nie uruchomi.

W niedalekiej przyszłości pokażę jak taki autoloader napisać obiektowo, z obsługą błędów oraz możliwością przeszukiwania folderów.

Pozdrawiam

Hello world!

Witam,

W pewnym momencie nauki programowania (tj. dzisiaj) naszła mnie potrzeba i chęć założenia własnego bloga. Będzie to dla mnie pewnego rodzaju archiwum tego co zrobiłem i z jakimi problemami się zmagałem.

Jakie tematy będę omawiał? PHP, bazy danych, jQuery (biblioteka dla języka JavaScript), CSS, może trochę o wzorcach projektowych… No, może tyle na początek, reszta wyjdzie w praniu.

Tak więc na początek powiem gromkie ‘HELLO WORLD’ i do przodu.

PHP

<?php

echo 'Hello world';

?>

JavaScript

<script type="text/javascript">

      $(document).ready(function(){

           alert('Hello world!');

      });

</script>

HTML

<html>
      <head>
            <title></title>
            <meta http-equiv="Content-Type" content="text/html;
                  charset=UTF-8">
      </head>
      <body>
            <p>Hello world!</p>
      </body>
</html>

Pozdrawiam