poky.ro : intro

Stateam intr-o zi pe un site de torrente… Ma uitam ce mai este nou de download-at, ce se mai poate downloada interesant, poate ceva filme, poate ceva muzica. Ideea e alta, intimplator am dat peste o arhiva destul de mare cu diferite articole in format TXT. Desigur, ca orice om strangator la casa lui, am pus repede la download.

Articolele gasite acolo erau interesante, am citit vreo cateva din curiozitate.

Dupa ce le-am “rasfoit” cat de cat, mi-a venit ideea sa le pun pe net, un loc unde sa aiba toti acces la ele si intr-un final am un proiect ce poate strange trafic datorita continutului.

Si asa, aici se incepe proiectu.

El a fost dezvoltat incremental ( pe pasi mici ), sub forma: problema -> solutie, problema -> solutie

Problema : cum public rapid un articol pe net?

Solutie : o platforma de blog, WordPress ca e free ( si putin experienta prin el ). Am instalat frumos wordpress-ul aici, setat thema, ceva informatii esentiale, pluginul akismet ( antispam pentru commenturi ) si All in One SEO Pack. Si atat, dupa asta am inceput copy+paste si postarea primelor posturi, dupa care puneam categoria, tag-urile ( ceea ce ma obliga sa citesc cam toate articolele care le postam ). Ce e drept, a durat ceva timp pana cand mi-am pus a 2-a problema :

Problema : cum fac sa nu mai fiu nevoit sa citesc toate articolele, si astfel sa maresc viteza cu care fac copy+paste la articole pe blog?

Solutie : Aceasta problema era mai grava pentru tag-uri. Asa ca am inceput sa caut sa vad ce pluginuri sunt pentru setarea automata a tag-urilor. Am gasit un proiect de la yahoo care cica iti tag-uia automat textul si respectiv 1000 de pluginuri pentru wordpress care iti facea legatura dintre blogul tau si serviciul yahoolui. Din pacate, nu stiu de ce, cam nu lucra serviciul ala la mine, poate trebuia sa fac ceva ce trebuia sa stiu sa fac… dar intr-un final nu lucra la mine. Am cautat in continuare. Intru-un final am gasit un plugin TagPiG, un serviciu care integra si utilizarea serviciului de la yahoo, dar si au ei un serviciu propriu de tag-uire a articolelor. Pana la urma am vazut ca asta merge. Are si niste setari interesante. Acum el se ocupa de tag-uirea articolelor, iar eu incepusem sa fac copy+paste la articole mult mai rapid. Si daca totusi tag-uirea se face automat, am renuntat la punerea articolelor in diferite categorii. Doar tag-uri.

PS: N-am zis de ce tag-uirea articolelor este atat de importanta. Ideea esta ca pluginul All in One Seo Pack pune si tag-urile articolului in meta keywords = ceea ce da bine in fata crawlerilor motoarelor de cautare.

Continue reading poky.ro : intro

php – functii cu numar variabil de parametri

Pe langa faptul ca parametrii unei functii php pot avea valori predefinite, precum in exemplul urmator :

<?php
    function say( $what = "nothing" )
    {
        echo $what . "\n";
    }
   
    say( "dude" );
    say( );
?>

mai exista posibilitatea de a defini si functii cu numar variabil de parametri in felul urmator:

<?php
    function say( )
    {
        for ( $i = 0; $i < func_num_args(); $i++ )
            echo func_get_arg( $i ) . " ";
        echo "\n";
    }

    say( "test", "another test" );
?>

In cazul cand se alege aceasta modalitate de a pasa parametrii, accesul la parametri se face cu ajutorul functiilor:

Asta inseamna ca putem defini o functie ce poate lua un numar de parametri intr-un caz si alt numar de parametri in alt caz.

Un exemplu practic unde se poate folosi acest feature al php-ului este la definirea functiilor de SET / GET in clase pentru accesul la anumite date private din clasa respectiva. O functie de SET este o functie ce seteaza o valoare privata in clasa, iar o functie de GET este una care ia valoarea unui membru privat din clasa. Se observa ca functia de set trebuie sa ia cel putin un parametru – fiind noua valoare a membrului

    ///set new value
    public function setValue( $newvalue );

iar functia de GET nu ia nici un parametru, dar trebuie sa returneze valoarea ceruta :

    ///get value
    public function getValue( );

la prima vedere aceste functii pot trai si separat si independente, dar exista posibilitatea sa le comansam in una singura cu ajutorul functiilor cu numar variabil de parametri.
Exemplu:

<?php
    /// definesc clasa A
    class A {
        /// membru privat $_id
        private $_id = 0;
       
        /// functie get/set cu numar variabil de parametri
        public function id( ) {
            if ( func_num_args( ) == 0 ) {
                //daca nu este pasat nici un parametru
                //se returneaza valoarea $_id
                return $this->_id;
            } else {
                //altfel, setez $_id cu primu parametru
                //(restul parametrilor se ignora)
                $this->_id = func_get_arg( 0 );
                return TRUE;
            }
        }
    }
   
    //creez o instanta a clasei A
    $a = new A();
   
    //apelez functia id() ca SET
    $a->id( 5 );
   
    //apelez functia id() ca GET
    echo $a->id();
?>

Prin aceasta modalitate, vom defini in clasa doar o singura functie ceea ce va scadea numarul functiilor declarate in clasa si va face clasa mai usor utilizabila.

atat.

Cum facem CSS mai dinamic cu PHP

Se presupune ca in timpul apropiat CSS-ul va suferi ceva modificari si va fi posibil de declarat un fel de variabile/constante si va fi mai usor de adapta css-ul de la un proiect la altul. Pina atunci exista o astfel de solutie: utilizam php-ul pentru a face css-ul mai dinamic, mai variabil si mai comod. Php-ul ne permite sa generam fisiere css, modificind contentul cu functia HEADER :

<?php header('content-type: text/css'); ?>

in asa mod, fisierul apelat, va fi considerat de browser ca fiind de tip css. Si asta ne permite sa scrim cod php in viitorul fisier css.
Si de exemplu vom face asa un fisier : style.css.php

<?php
    header('content-type: text/css');
    if ( isset( $_GET['style'] ) ) {
        switch($_GET['style']){
            case 'blue':
                define('T_WIDTH_CELL',90);
                define('T_PADDING_CELL',10);
                define('T_FONT_SIZE',12);
                define('T_FONT_FAMILY','Verdana,Tahoma,"Trebuchet MS",sans-serif');
                define('T_TH_BKG','e1e9ed');
                define('T_TD_BKG','eef3f5');
                define('T_BORDER_C','c9d7df');
                define('T_TH_C','476678');
                define('T_TD_C','80a2b4');
                break;
            case 'orange':             
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',8);
                define('T_FONT_SIZE',11);
                define('T_FONT_FAMILY','"Trebuchet MS",Verdana,Tahoma,sans-serif');
                define('T_TH_BKG','ffb979');
                define('T_TD_BKG','ffc189');
                define('T_BORDER_C','ffa859');
                define('T_TH_C','9a4900');
                define('T_TD_C','fa7700');
                break;
            case 'green':
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',40);
                define('T_FONT_SIZE',15);
                define('T_FONT_FAMILY','"Tahoma,sans-serif,Trebuchet MS",Verdana');
                define('T_TH_BKG','e2e7c9');
                define('T_TD_BKG','e9edd6');
                define('T_BORDER_C','d4dcb0');
                define('T_TH_C','707c37');
                define('T_TD_C','acbb65');
                break;
            default :
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',40);
                define('T_FONT_SIZE',15);
                define('T_FONT_FAMILY','"Tahoma,sans-serif,Trebuchet MS",Verdana');
                define('T_TH_BKG','cacaca');
                define('T_TD_BKG','d2d2d2');
                define('T_BORDER_C','b9b9b9');
                define('T_TH_C','535353');
                define('T_TD_C','868686');
                break;
        }
       
    }else{
        define('T_WIDTH_CELL',90);
        define('T_PADDING_CELL',10);
        define('T_FONT_SIZE',12);
        define('T_FONT_FAMILY','Verdana,Tahoma,"Trebuchet MS",sans-serif');
        define('T_TH_BKG','e1e9ed');
        define('T_TD_BKG','eef3f5');
        define('T_BORDER_C','c9d7df');
        define('T_TH_C','476678');
        define('T_TD_C','80a2b4');
    }
?>

table.my-table{
    padding:0px;
    margin:0px;
    border-collapse:collapse;
}

table.my-table th{
    width: <?php echo T_WIDTH_CELL;?>px;
    padding: <?php echo T_PADDING_CELL;?>px;
    margin: 0px;
    background:#<?php  echo T_TH_BKG; ?>;
    border:1px solid #<?php echo T_BORDER_C; ?>;
    text-align:center;
    font:normal <?php echo T_FONT_SIZE.' '.T_FONT_FAMILY;  ?>;
    color:#<?php echo T_TH_C; ?>;
}


table.my-table td{
    width: <?php echo T_WIDTH_CELL?> px;
    padding: 5px 5px 5px <?php echo T_PADDING_CELL?>px;
    margin: 0px;
    background:#<?php  echo T_TD_BKG; ?>;
    border:1px solid #<?php echo T_BORDER_C; ?>;
    text-align:left;
    font:normal <?php echo T_FONT_SIZE.' '.T_FONT_FAMILY;  ?>;
    color:#<?php echo T_TD_C; ?>;
}

si un fisier index.php :

<html>
<head>
    <title>Test dinamic CSS </title>
    <link rel="stylesheet" href="style.css.php?style=green" type="text/css" media="all" />
</head>
<body>
<center>
    <table cellspacing="0" cellpadding="0" class="my-table">
        <tr>
            <th>Th Division 1</th>
            <th>Th Division 2</th>
            <th>Th Division 3</th>
            <th>Th Division 4</th>
        </tr>
        <tr>
            <td>Td Division 1</td>
            <td>Td Division 2</td>
            <td>Td Division 3</td>
            <td>Td Division 4</td>
        </tr>
        <tr>
            <td>Td Division 1</td>
            <td>Td Division 2</td>
            <td>Td Division 3</td>
            <td>Td Division 4</td>
        </tr>
</table>
<center>
</body>
</html>

si astfel putem sa apelam fisierul style.css.php cu trei parametri : blue, green, orange; care se transmit prin $_GET, in dependenta de care se genereaza un anumit fisier css. Daca intimplator se va gresi parametrul si nu va fi unul din cei enumerati mai sus se va genera un fisier css care va stiliza tabelul my-table in culori gri. Implicit se va apela fisierul css cu parametrul blue. comod nu ?
aici puteti sa scoateti sursele, sursele sunt verificate.

lamp for centos

sunt multe tutoriale pe net despre ce ar trebui sa instalezi in calculator ca sa ai un lamp ( apache + php + mysql ) functional.
Mi-a venit ideea sa rezumez toate comenzile intr-un script, astfel ca toata instalarea sa arata doar ca un apel de script:

MYSQL_PASSWORD=mysecretpassword

### activare mod debug in bash
#set -x

### install mysql
echo -e "\n\nInstall MYSQL\n\n"
yum install mysql mysql-server
chkconfig --level 235 mysqld on
/etc/init.d/mysqld start

echo -e "\n\nMYSQL: set password for root@localhost : $MYSQL_PASSWORD\n"
mysqladmin -u root password $MYSQL_PASSWORD

echo -e "\n\nMYSQL: set password for root@`hostname` : $MYSQL_PASSWORD\n"
mysqladmin -h `hostname` -u root -p password $MYSQL_PASSWORD

### install apache2
echo -e "\n\nInstall Apache2\n\n"
yum install httpd
chkconfig --levels 235 httpd on
/etc/init.d/httpd start

### install php
echo -e "\n\nInstall PHP\n\n"
yum install php php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc
/etc/init.d/httpd restart

### test php
echo -e "\n\nWrite /var/www/html/index.php test file\n\n"
echo "<?php phpinfo(); ?>" > /var/www/html/index.php

### install phpmyadmin
echo -e "\n\nInstall phpmyadmin\n\n"
## activam repositoryul RPMForge
echo -e "\n\nActivate rpmforge repository"
cd /tmp/
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.`uname -m`.rpm
rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.`uname -m`.rpm

yum install phpmyadmin

## in urmatorul fisier trebuie comentat <Directory>... pentru a permite toate conexiunile ( nu numai localhost )
echo -e "\n\nIn file /etc/httpd/conf.d/phpmyadmin.conf comment the <Directory>\n"
read -p "go to file..."
vi /etc/httpd/conf.d/phpmyadmin.conf

## in fisierul asta treb modificat $cfg['Servers'][$i]['auth_type'] = 'http';
echo -e "\n\nIn file /usr/share/phpmyadmin/config.inc.php set variable:\n\n $cfg['Servers'][$i]['auth_type'] = 'http';\n\n"
read -p "go to file..."
vi /usr/share/phpmyadmin/config.inc.php

/etc/init.d/httpd restart

echo -e "\n\n\nDone.\n\n"

Download from here

In script se mai cere din cand in cand si interventia utilizatorului… yes… no… password :)

NB: scriptul instaleaza si phpmyadmin

philosophy about open-source sites

Acest post nu are ca scop prezentarea creierii unui site/program/tool open source, ci prezentare functionalitatilor si posibilitatilor codului scris pentru a fi utilizat de catre altcineva.

Iau ca un caz aparte creare unui site pentru a fi utilizat de catre altcineva, iar aceste idei se pot adapta usor si la celalte tool-uri open-source.

In continuare prin cuvantul “developer” se va subintelege persoana care a creat site-ul initial iar “utilizator” – o persoana care va folosi acel site ( de asemenea, el poate scri/adauga/modifica cod in site dupa necesitatile pe care le vrea de la noul site )

E o diferenta foarte mare atunci cand creez un site, eu ca dezvoltator, pentru mine, si in a crea o pagina pentru un utilizator necunoscut, utilizator care poate nu o sa-l vezi niciodata.

In primul caz cand eu sunt utilizatoru si tot eu sunt si dezvoltatorul, folosind tehnologiile precum PHP, MYSQL, DESIGN se formeaza un conglomerat de code.

in toate cele 3 cercuri se afla cod scris de catre dezvoltator, si toate luate impreuna reprezinta site-ul.

Acum, hai sa facem un test si sa dam acest site unui utilizator care nu va avea nici un contact cu dezvoltatorul site-ului.

  • Partea buna e ca utilizatorul va avea un site gata facut.
  • Partea rea… mai bine zis partile rele apar atunci cand utilizatorul are nevoie de personalizarea site-ului. Si anume, el trebuie sa invete cam tot ce inseamna cod php si motorul din spatele site-ului ( care necesita un efort enorm din partea utilizatorului si respectiv din partea dezvoltatorului care trebuie sa scrie documentatie pentru tot codul php ) si trebuie sa se uite peste ce inseamna design al site-ului. Rezumat in cateva cuvinte: utilizatorul va trebui sa invete tot codul din site si pe langa faptul ca invata cod strain, este posibil ca sa nu ii placa codul vazut si poate are si idei mai bune de a crea acel site… si intr-un final exista o mare probabilitate de a renunta la el in favoarea altui.

Pentru a face un astfel de site accesibil mai usor unui utilizator, trebuie de identificat toate tehnologiile/tooluri cu care se va lucra:

  • MYSQL – utilizat pentru managementu cu datele.
  • PHP – limbaju de scripting din spatele site-ul.
  • TEMPLATE – fiecare utilizator doreste sa aiba un design personalizat.

Acum, luati pe pasi mici, se pot face urmatoarele lucruri:

  • ascunderea lucrului cu baza de date mysql, astfel ca tot codul sa fie doar PHP curat. Asta se face prin dezvoltarea unor clase ( engine ) care intorc datele necesare framework-ului prin structuri de tip php. Astfel vom avea ceva de genu :

In acest moment in ecuatie raman doar 2 componente : PHP si TEMPLATE.

  • Pentru a “ascunde” codul php, trebuie definita o interfata, o multime de functii care vor fi expuse mediului exterior si care sa fie foarte bine documentate. Aceste functii/scripturi vor prezenta insusi motorul (engine-ul) site-ului si toate feature-ule/posibilitatile site-ului.

acum avem din tot codul PHP o interfata de functii ( componenta PHP am simplificato ) si designul.

Designul e singura componenta care e strins legata de utilizator, si de aceea trebuie sa creem site-ul in asa mod incat din codul template-ul sa avem acces la toate facilitatile enginului siteului, de aceea am creat o interfata a engine-ului din php. Designul, implementat ca template, trebuie doar sa aiba posibilitatea sa zica doar ca in acest loc vor fi anumite informatii ( preluate cu un singur apel de functie php din interfata declarata mai sus ) iar in alt loc sa fie alte informatii ( tot preluate din informatii ).

Astfel, avind definita o interfata de functii php cu toate functionalitatile site-ului, o pagina din template ar putea arata astfel :

<?php include site_interface(); ?>
<html>
 <head>
  <title><?php echo get_title(); ?></title>
  <?php print_css_files(); ?>
 </head>
 <body>
   <h1> <?php echo post_title(); ?> </h1>
   <p> <?php echo post_content(); ?> </p>
 </body>
</html>

Acum, utilizatorul in caz ca vrea sa modifice ceva, va modifica doar in template-ul sau, si va avea posibilitatea de a modifica diferite kestii foarte rapid. Si tot ce treb sa invete este doar lista functiilor din interfata.

Comentariile sunt binevenite.

Sisteme de securitate anti-robot, captcha, in php

Un sistem anti-robot reprezintă un mecanizm care opreste activitatea roboţilor pe site. Deci, un mecanizm care nu permite de a crea diferite aplicaţii pentru a automatiza procesele de manipulare dintr-un anumit mediu.
Din titlu, probabil, aveti impresia că vom vorbi despre cine ştie ce algoritmi complicaţi, insă spre bucuria noastră nu este totul chiar aşa de complicat. Sistemul captcha este un lucru genial, foarte uşor de realizat şi foarte uşor de implementat. Însă este foarte greu, pentru un robot, de a trece peste acest mecanism. Pentru ca un robot să poată trece peste acest mecanizm robotul trebuie să fie superdotat (algoritmi complexi si cod mult de scris).
Mecanizmul captcha constă în:
1. Realizarea unui script care genereză imagini, utilizînd resursele unei biblioteci grafice, în cazul php cel mai des se utilizează GD sau Imagick.
Imaginea care este generată conţine un cod aleator format din cifre şi litere, sigur poate să conţină şi alte caractere asta ramine la discreţia dezvoltatorului.
Acest cod este scris in imagine cu un anumit srift de o anumită marime pe un oarecare fundal. Mai mult ca atît fundalu şi caracterele din cod pot fi de diferite culori.
2. Odata cu generarea imaginii se crează o sessiune pe server, care pastrează valoarea acelui cod din imagine în formă textuală.
3. Imaginea generată se afişează împreună cu un input în browser. În input se va înscrie codul din imagine, codul va fi scris de către utilizator. Acest cod urmează sa fie comparat cu codul ce sa pastrat în sesiune. Dacă vor coincide atunci se consideră că confirmarea a avut loc cu succes, alfel se regenerează codul şi imaginea, se modifică sesiunea şi se cere din nou confirmarea.
Astfel putem sa implementăm imaginea, inputul si mecanizmul de verificare acolo unde este necesară confirmarea anti-robot. Deseori este utilizat acest mecanizm împreună cu formularul de înregistrare a utilizatorilor sau la postarea comentariilor din zona publică a vizitatorilor ne înregistraţi şi în multe alte cazuri. Chiar mai mult, dacă consideraţi că la completarea unui formular este cazul să verificaţi existenţa roboţilor atunci implementaţi sistemul anti-robot.
Urmatorul script php genereaza o imagine in format PNG cu text generat random si seteaza textul in variabila de sesiune :

session_start();
session_regenerate_id();
$nr = rand(65,122);
$captcha = chr($nr).rand(1000,9999);
$nr = rand(65,122);
$captcha .= chr($nr);
$nr = rand(65,122);
$captcha .= chr($nr);
// Setam variabila in sesiune
$_SESSION['captcha'] = $captcha;
$string = $captcha;
$size = 18;
$radius = 0;
$font = 'font/brushscriptstd.otf'; //fontul
$coord = imagettfbbox($size, $radius, $font, $string);
/*
* A(x0,y0) B(X1,Y1) A(x0,y0) = [0][1] B(x1,y1) = [2][3]
* C(x2,y2) D(X3,Y3) C(x2,y2) = [6][7] D(x3,y3) = [4][5]
*/
$width  = round(sqrt(($coord[0] - $coord[2])*($coord[0] - $coord[2]) +
($coord[1] - $coord[3])*($coord[1] - $coord[3])),0);
$height = round(sqrt(($coord[0] - $coord[6])*($coord[0] - $coord[6]) +
($coord[1] - $coord[7])*($coord[1] - $coord[7])),0);
$image =        imagecreatetruecolor($width+20, $height+20);
imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
ImageTTFText ($image, $size, $radius,10 ,30 , $white, $font, $string);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?&gt;