[c++] fopen tip

Atunci cand se aglomereaza mai multe buguri…. se produce o crapaciune ( crash :) ), in rest exista doar noroc.

Acum, am dat de un bug foarte subtil ( care, la mine, se reproduce in combinatie cu alt bug :) ).

Sa exemplific prin cod:

  char *filename = "test.txt";
  FILE* file = fopen( filename, "w" );
  fclose( file );
  /* some code */

Ideea e ca functia fopen poate esua si astfel variabila “file” se seteaza cu NULL si in continuare pasand variabila “file” cu valoare NULL functiei fclose duce la o crapaciune foarte urata… ceea ce ar fi bine de evitat

Corect ar fi :

  char *filename = "test.txt";
  FILE* file = fopen( filename, "w" );
  if ( file )
    fclose( file );
  /* some code */

enjoy.

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.

Cum utilizam un font extern in CSS

La realizarea unei pagini web, de cele mai multe ori ma bazez pe designul creat in photoshop. Apoi incep sa formatez template-ul. Si de multe ori am avut o astfel de problema ca selectind in photoshop un anumit font, pentru a scrie un text cu un font mai special, in browser textul nu arata ca in photoshop. Browser-ele utilizeaza alte font-uri. Este de mentionat ca pe pc meu unde acest font este instalat deja in sistemul de operare, pagina arata bine, insa pe alte pc-uri, aceasta pagina utilizeaza alt font, pentru a afisa textul, este vorba despre un font implicit “Arial“. Si din cauza acestei probleme in loc de text utilizam imagini.

Insa, de exemplu, daca este vorba de ceva dinamic, ca un blog este necesar ca titlurile posturilor sa fie scrise mai special, atunci imaginile nu sunt o solutie.

Pentru acesta este un mecanizm special care permite dezvoltatorului sa utilizeze orice font. Trebuie de mentionat ca formatul fontului trebuie sa fie .ttf – pentru browserele Mozilla, Safari, Chrome, Opera; si formatul .eot – pentru IE.

” Aveti nevoie doar de fontul cu formatul .ttf in internet sunt o multime de servicii care transforma din .ttf in .eot

Voi arata un exemplu :

1. includem in proiect fontul .ttf si .eot.

ex:

fonturile vor fi plasate in directoriul resources/fonts (din directoriul parinte).
paginile de stil, (css) in resources/css

paginile html direct in directoriul parinte.

2. Avem urmatoarea structura :

resources/fonts/Bleeding Cowboys.ttf
resources/fonts/Bleeding Cowboys.eot
resources/css/style.css
home.html

Si avem urmatoarele surse :
home.html

<html>
  <head>
  <title> Extern Fonts Enbed</title>
  <link rel="stylesheet"
   href="resources/css/style.css"
   type="text/css"
   media="all" />
  </head>
  <body>
    <br>
    <br>
    <br>
    <br>
      <div class="my-class-silver-big"><center>
        Silver big  extern fonts enbed
      </center></div>
      <div class="my-class-silver-small"><center>
        Silver small  extern fonts enbed
      </center></div>
      <div class="my-class-black-small"><center>
        Black small  extern fonts enbed
      </center></div>
      <div class="my-class-black-big"><center>
        Black big  extern fonts enbed
      </center></div>
  </body>
</html>

Pagina de stil
resources/css/style.css

@font-face {
  font-family:MyFontTitle;
  src:url("../fonts/Bleeding Cowboys.eot");
}

@font-face {
  font-family:MyFontTitle;
  src:url("../fonts/Bleeding Cowboys.ttf");
}

.my-class-silver-small {
  font-family:MyFontTitle;
  font-size:15px;
  color:silver;
}

.my-class-silver-big {
  font-family:MyFontTitle;
  font-size:36px;
  font-weight:bold;
  color:silver;
}

.my-class-black-small {
  font:normal 15px MyFontTitle;
  color:black;
}

.my-class-black-big {
  font:bold 36px MyFontTitle;
  color:black;
}

Si cam asa sa primit rezultatul :

aici download surse

c++ creare matrice

#include <stdio.h>

typedef int matrice[10][10];

#define LINII 4
#define COLOANE 3

int **invers( matrice source, int n, int m )
{
    // acest pointer va salva matricea
    int **tmp = NULL;
    // definesti un tip nou de date (int*) caci nu poti sa
    //apelezi direct "new (int*)[]"
    typedef int* pInt;
    // aici creezi un vector unde vei salva pointerii pentru
    //fiecare linie
    tmp = new pInt[ n ];
    // pentru fiecare linie... creezi zona pentru date...
    //si salvezi pointeru in tmp[i]
    for ( int i=0; i<n; i++ )
        tmp[ i ] = new int[ m ];

    // inversarea fiecarei linii
    for ( int i=0; i<n; i++ )
        for ( int j=0; j<m; j++ )
            tmp[i][j] = source[i][m-1-j];

    // returnezi pointeru
    return tmp;
}

int main()
{
    /* initiliazez prima matrice */
    matrice a = { { 1,2,3 },
            { 4,5,6 }, { 7,8,9 }, {10,11,12} };
    int **b;

    /* functia ce creaza o matrice */
    b = invers( a, LINII, COLOANE );

    /* afisez matricea */
    for ( int i=0; i<LINII; i++ ) {
        for ( int j=0; j<COLOANE; j++ )
            printf( "%4d ", b[i][j] );
        printf( "\n" );
    }

    /* sterg matricea b din memorie */
    for ( int i=0; i<LINII; i++ )
        //sterg fiecare linie
        delete [](b[i]);
   
    //sterg vectoru care memora pointerii
    //catre vectorii cu continutu liniilor
    delete []b;

    return 0;
}

atat

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.

comments with code

datorita postului anterior, acum se poate scri si commenturi frumos formatate si frumos highlighting-tate.

Astfel, folositi:

[tag lang="xxx"] your code [/tag]

in loc de “tag” puneti “cc” ( nu ma lasa altfel sa scriu acest cod )
xxx e limbajul in care scriti. ( lista cu toate limbajele posibile sunt aici )

Exemplu:

[tag lang="cpp"]void main( int argc, char *argv[] ); [/tag]

Rezultat:

void main( int argc, char *argv[] );

atat.