vineri, 20 decembrie 2013

Colinzi horor :)

luni, 16 decembrie 2013

Numarul pi pe 8192 de biti

O mica istorie a determinării cat mai multor zecimale a numărului pi:
  • 2000 I.Hr. – Egiptenii socoteau numărul pi ca fiind 16² / 9² sau 256/81, sau 3.16 cu o exactitate de o singura zecimala.
  • 250 I. Hr. – Filozoful grec Arhimede a fost primul care a estimat cat mai riguros numarul pi. El a realizat ca amploarea acestuia poate fi limitata inscriind cercuri in poligoane regulate si calculand perimetrele externe si interne a acestor poligoane. Folosind 96 astfel de poligoane, el a demonstrat ca 3 10/71 < ∏ < 3 10/70, adica 3.14185 – o exactitate de 3 zecimale.
  • Secolul al 16-lea – Ludolph van Ceulen din Germania a calculat numarul pi cu o exactitate de 35 de zecimale dar a murit inainte de a fi publicata descoperirea. Asa ca, aceasta a fost inscriptionata pe piatra lui funerara.
  • 1706 – Astronomul englez John Machin a descoperit o formula complicata pentru aflarea cat mai exacta a numarului pi, si a calculat cu exactitate primele 100 de zecimale.
  • 1873 – Matematicianul englez William Shanks s-a chinuit timp de 15 ani pentru calcularea a 707 zecimale dar din pacate a facut o greseala la a 528-a zecimala, rezultand ca celelalte zecimale sa fie gresite la randul lor.
  • 2004 – Yasumasa Kanada din Tokyo a calculat cu ajutorul unui computer un număr de 1.24 trilioane de zecimale a numărului pi.
Metoda ce mai rapida de calcul este folosind metoda Gauss–Legendre algorithm.
#include "stdio .h"
#include "math .h"

// Fascinating number - PI
int main ( int argv, char *argc[] )
{
    double a = 1.0;
    double b = 1.0/sqrt ( 2.0 );
    double t = 1.0/4.0;
    double x = 1.0;
    double y;

    int i;
    for ( i = 0; i < 4; i++ )
    {
        y = a;
        a = (a + b)/2.0;
        b = sqrt ( b*y );
        t -= x*(y - a)*(y - a);
        x *= 2;
    }

    double pi = (a + b)*(a + b)/(4*t);
    printf ( "%.15f\n", pi );

    return 0;
}
Dupa compilare și link editare rezulta:
$ calculPi.exe
3.141592653589794

Calcul efectiv al numărului pi l-am făcut folosind scriptul de aici.
Numărul Pi pe 8192 de biți este acesta:
pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548880
O zi plăcută tuturor !

vineri, 13 decembrie 2013

Cubieboard A20 processor Dual-core Development Board

O noua serie de placi de dezvoltare au ieșit pe piață, care se pot folosi și pe post de mini computer. Cubieboard este una dintre cele mai performante placi cu specificații greu de imaginat acum câțiva ani. Aria de utilizare este destul de largă:
- mini computer personal
- sistem multimedia
- consola de jocuri
- placa de bază pentru diverse automatizări care ar avea nevoie de putere de calcul mai mare
- sistem NAS (network attached storage)
Având în vedere că am un HDD de 500GB mai vechi, cred ca o sa cumpăr o placa Cubieboard și să pun la punct un NAS. Singura problemă ar fi lipsa unei carcase în care sa încapă și HDD-ul .
Imagini cu Cubieboard:




Specificații:
  • CPU: ARM Cortex-A7 Dual-Core + 1GB DDR3 @ 960M
  • GPU: ARM Mali400MP2,Complies with OpenGL ES 2.0/1.1
  • Ethernet + 2 USB Host +1 microSD slot + 1 SATA + 1 IR + more
  • Storage: 4GB internal NAND flash, up to 64GB on uSD slot, up to 2T on 2.5 SATA disk
  • Video output: HDMI 1080p Output

Daca doriți sa cumpărați va recomand amazon uk, care livrează și în România:
Cubieboard A20 processor Dual-core Development Board
Cubieboard Acrylic Case

duminică, 8 decembrie 2013

Inlocuirea acumulatorilor surubelnitei electrice

Acumulatorii șurubelniței electrice s-au cam stricat și a trebuit sa ii înlocuiesc. A fost destul de simplu, am desfăcut șurubelnița și am dezlipit acumulatorii vechi (galbeni în fotografie) și am lipit alți acumulatori noi. Mai greu a fost pana am desfăcut carcasa, dar totul se rezolva cu un pic de forța bruta :).
Principiul de funcționare al acestor șurubelnițe nu este foarte complicat, un motor de curent continuu este acționat de niște acumulatori care pot debita un curent destul mare (pana la un amper), un întrerupător și un sistem simplu de verificare a încărcării acumulatorilor.
Dat fiind ca sunt 4 acumulatorii de tip AA 1.2 V si 800 mAh, se aplica următoarea formula:

`U_t = U_1 + U_2 + U_3 + U_4`.
unde :
`U_1 = 1.2 V`.
`U_2 = 1.2 V`.
`U_3 = 1.2 V`.
`U_4 = 1.2 V`.
rezulta: `U_t = 4 * 1.2 V = 4.8 V`.

Acum am o șurubelniță ca noua și probabil o sa încep niște proiecte de bricolaj în curând. Daca doriți sa achiziționați o șurubelniță noua, va recomand:
- Surubelnita cu acumulator Black&Decker AS36LN AutoSelect, 3,6V Li-Ion, 180 RPM, 4,8 Nm, trusa metalica + 10 Accesorii
- Șurubelniță cu acumulator Black&Decker 3,6V, 180 RPM, 3,4 Nm KC36R+ cap dublu pentru înșurubat și încărcător
- Surubelnita cu acumulator Einhell BT-SD 4,8 F, 4,8V
Weekend plăcut tuturor !

marți, 26 noiembrie 2013

Fituica cu formule electronice (2)

Calculul rezistente totale echivalente :
- Rezistenta echivalenta in serie:

\[R_e = R_1 + R_2 + R_3 + .. + R_n\]
- Rezistenta echivalenta în paralel:

\[1/R_e = 1/R_1 + 1/R_2 + 1/R_3 + .. + 1/R_n\]
\[R_e =( R_1 * R_2 * R_3 * .. R_n ) / ( R_1 + R_2 + R_3 + .. + R_n )\]

Capacitatea electrica:

\[C = Q / V\]
\(Q\) - sarcina electrica.
\(V\) - tensiunea electrica.

Calculul capacității totale echivalente :
- Capacitatea echivalenta în serie:

\[C_e = ( C_1 * C_2 * C_3 * .. * C_n ) /( C_1 + C_2 + C_3 + .. + C_n)\]

- Capacitatea echivalenta în paralel:

\[C_e = C_1 + C_2 + C_3 + .. + C_n\]

Fituica cu formule electronice (1)

Legea lui Ohm:

\[I = U / R\]
\[U = I * R\]
\[R = I / U\]
\(I\) - Intensitatea curentului electric (A - Amperi)
\(U\) - Tensiunea electrica (V - Volti).
\(R\) - Rezistenta electrica (Ω -Ohm ).

Legile lui Kirchhoff:

K1.Suma intensităților curenților care intră într-un nod de rețea este egală cu suma intensităților curenților (de curent continuu) care ies din același nod.
\[ \sum{I_i} = \sum{I_o}\]
K2.Suma algebrica a tensiunilor electromotoare ale surselor, este egala cu suma algebrica a produselor dintre,intensitatea curenților și rezistenta totala, de pe fiecare latura.
\[ \sum{E_n} = \sum{I_n * R_n}\]
Suma algebrică a tensiunilor de-a lungul oricărui ochi de circuit este nulă.
\[ \sum{V_n} = 0\]

Deocamdată atât. O sa mai adaug pe parcurs și alte formule.
Pentru cei care doresc sa aprofundeze va rog sa vizionați următoarele lecții:

Sau pe Khan Academy .
O zi buna tuturor !

luni, 25 noiembrie 2013

Viitorul transportului de marfuri si oameni pe distante scurte

Viitorul transportului de mărfuri și oameni pe distante scurte sunt dronele zburătoare. Părerea mea este ca acesta ar fi viitorul pentru ca automobilele au devenit mult prea numeroase și locurile de parcare sunt foarte greu de găsit într-un oraș mare. O drona capabila sa transporte un om pe o distanta de 20 km ar fi extraordinara. Ar putea sa te ducă la munca iar apoi sa se întoarcă la locul de parcare unde sa își reîncarce bateriile. După 8-9 ore sa vina sa te ia și sa te ducă înapoi acasă. Cam în 10-20 de ani am putea avea aceasta tehnologie depinde doar de noi si de perspectiva pe care o avem asupra acestei probleme. Chiar în acest moment exista temerari care construiesc mașinării zburătoare autonome și care au ajuns destul de departe cu aceasta tehnologie. Intrebarea fundamentala este : avem curajul sa ne lăsăm pe mana mașinilor ?

marți, 19 noiembrie 2013

Pentru oameni ocupati

Recomand pentru leneși  gospodine oamenii ocupați roboțelul de mai jos care va face casa luna cat sunteți plecați la munca. Implicit ziua de sîmbătă o sa fie libera.  Sincer sa fiu deja l-am adăugat în wish list.
Robot aspirare Philips FC8802/01, 0.2 l, senzor infrarosu, Antracit

luni, 18 noiembrie 2013

Cele mai tari media playere de la emag

Ma uitam mai deunăzi la ofertele de media-playere de la eMag și oferta e foarte variata. Mai jos e o lista cu diverse media playere pentru toate buzunarele care au și reducere de pana la 30%. Mediaplayere cu reducere
.. si cel mai interesant e acesta : Media player Egreat R6A-II, FullHD, Web Browser
Spor la cumpărături!

vineri, 15 noiembrie 2013

Metoda cea mai simpla de testare a codului

Sa presupunem ca avem următoarele funcții:
#include 
#include 

#define  TRUE  1U
#define  FALSE  0U

#define  SUCCES TRUE
#define  GRESEALA FALSE


char add(char a, char b)
{
  return (a+b);
}
char sub(char a, char b)
{
  return (a-b);
}
Metoda cea mai simpla de testare este pur și simplu sa apelezi funcțiile. Suna un pic trivial dar după părerea mea aceasta este cea mai eficienta metoda sa testezi o funcție. Aceasta metoda de testare nu implica doar apelul, ci și considerarea tuturor situațiilor și scenariilor relevante pentru programator. De exemplu apelul funcției cu niște valori de parametrii din interiorul intervalului și de la limitele intervalului. Aceasta metoda de testare se numește testarea limitelor. Cu cat se aleg mai multe valori cu atat funcția e mai bine testata și foarte sigura de folosit. O alta metoda de testare mai elaborata ar fi apelul de funcții într-o anumita ordine și după seria de apeluri utilizatorul se așteaptă la un anumit efect. Practic un scenariu din "real life" se testează în acest fel și cu cat mai realiste sunt scenariile cu atat mai bine e testata o funcționalitate.
char test_adunare_1()
{
  char x,y;
  char rezultat;
  x = 1;
  y = 5;

  /* Apeleaza functia pe care vrei sa o testezi*/
  rezultat = add(x,y);

  /* Testezi ce ar trebui sa rezulte */
  if(rezultat == 6)
  {
    printf("\nTestul a trecut! rezultatul corect este : %d", rezultat);
    return SUCCES;
  }
  else
  {
    printf("\nTestul nu a trecut! rezultatul este : %d", rezultat);
    return GRESEALA;
  }
}

/* In acest test consideram limita de sus a intervalului [-128 to 127],
adica 127, datorita faptului ca tipul char este cu semn pe 1 byte.
Practic in acest test se verifica overflow-ul pentru ca se aduna 1 la 127 
ceea ce duce la un rezultat neasteptat daca nu se cunoaste exact ce face de 
fapt functia testata */
char test_adunare_2()
{
  char x,y;
  char rezultat;
  x = 127;
  y = 1;

  /* Apeleaza functia pe care vrei sa o testezi*/
  rezultat = add(x,y);

  /* Ce ar trebui sa rezulte aici ? */
  if(rezultat == (-128))
  {
    printf("\nTestul a trecut! Rezultatul corect este : %d", rezultat);
    return SUCCES;
  }
  else
  {
    printf("\nTestul nu a trecut! Rezultatul este : %d", rezultat);
    return GRESEALA;
  }
}

/* In acest test consideram limita de jos a intervalului [-128 to 127],
adica 127. La fel ca si la testul de mai sus se ajunge la un overflow  */
char test_adunare_3()
{
  char x,y;
  char rezultat;
  x = (-128);
  y = (-1);

  /* Apeleaza functia pe care vrei sa o testezi*/
  rezultat = add(x,y);

  /* Ce ar trebui sa rezulte aici ? */
  if(rezultat == 127)
  {
    printf("\nTestul a trecut! rezultatul corect este : %d", rezultat);
    return SUCCES;
  }
  else
  {
    printf("\nTestul nu a trecut! rezultatul este : %d", rezultat);
    return GRESEALA;
  }
}
int main()
{
  char rez1;
  char rez2;
  char rez3;

  rez1 = test_adunare_1();
  rez2 = test_adunare_2();
  rez3 = test_adunare_3();

  return 0;
}
Rezultatul rulării programului de mai sus este acesta:
$ test_adunare.exe
Testul a trecut! rezultatul corect este : 6
Testul a trecut! rezultatul corect este : -128
Testul a trecut! rezultatul corect este : 127
Mai departe rezultatele se pot afișa într-un raport care e de fapt o dovada către departamentul de calitate. Daca de exemplu funcția care este testata se modifica atunci eventualele greșeli de funcționalitate se regăsesc în testele picate. E simplu și foarte eficient. Ideea de baza este sa se cunoască încă din faza de testare "limitele" software-ului pe care tocmai l-am creeat. Testarea în nici un caz nu trebuie sa cada pe umerii utilizatorului final.
O zi buna tuturor!

vineri, 8 noiembrie 2013

Angerfist - Temple of Disease

Imi inspira calm, liniște, revolta, dinamica și pe alocuri neputință, toate astea în melodia asta : Weekend placut !

marți, 5 noiembrie 2013

Oferte de black friday pe amazon.co.uk

Ofertele pe amazon.co.uk încep pe 25 noiembrie și sunt foarte variate. Unele produse au și 50% reducere iar taxele de transport din Marea Britanie sunt acceptabile.
Vizitează black friday amazon.co.uk pentru mai multe amănunte !
Spor la cumpărături!

joi, 31 octombrie 2013

Planul

“If you don’t have a plan, you become part of somebody else’s plan.”
– Terence McKenna

vineri, 25 octombrie 2013

Toamna e fum

Un copăcel se chinuie o jumătate de an sa acumuleze dioxidul de carbon și sa ne dea binefăcătorul oxigen. Totul e frumos pana aici ... iar apoi vine toamna. Frunzele cad și copăcelul se pregătește pentru iarna. Nea Georgică gospodarul face curat și aduna frunzele, ceea ce e foarte frumos din partea lui. Ce ma deranjează pe mine e ca în loc sa își construiască un dispozitiv pentru compost și sa depoziteze acolo frunzele uscate, nea Georgică da foc frunzelor. Cu ocazia asta arunca în aer tot dioxidul de carbon pe care copăcelul l-a acumulat pe parcursul anului. Toamna e fum pentru ca nea Georgică nu știe ca din frunzele uscate se poate face îngrășămînt pentru gradina.
Cum se face compostul ?

Va rog frumos nu mai ardeți frunzele ...
 
Spor la compost !

duminică, 20 octombrie 2013

Instalarea Php5, Mysql, Apache, Eclipse si Gimp pentru Ubuntu

Am vrut zilele trecute sa îmi continui programarea unei pagini web făcută mai demult în Php, MySql și Apache și pentru asta am avut nevoie de aceste aplicații instalate pe Ubuntu. Am gasit cum se instalează și am procedat în felul următor:
Pasul 1. Instalează aplicațiile Php5, Mysql și apache: In command shell, trebuie sa lansați următoarele comenzi:

    sudo apt-get install apache2

    sudo apt-get install php5

    sudo apt-get install libapache2-mod-php5

    sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql phpmyadmin

    sudo /etc/init.d/apache2 restart

Pasul 2. Instalează Eclipse pentru Php pentru editarea codului sursa(am urmat pașii de aici)
Pasul 3. Instalează procesorul de imagini Gimp (l-am instalat direct din centru de software ubuntu)
Pasul 4. Testează pagina în Firefox, Chrome și Opera.
Conținutul paginilor se poate gasit în următoarea locație: /var/www/
Cred ca asta e procedura pas cu pas pentru dezvoltarea unei pagini web pe Ubuntu. Toate aplicațiile sunt gratuite și au documentație foarte bine pusa la punct.
Spor la programare și o seara frumoasa tuturor !

vineri, 11 octombrie 2013

Cum se seteaza highlighting-ul codului in Blogger

1. Desupra tagului <head> copiaza:
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCSharp.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushXml.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushSql.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJava.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCss.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushCpp.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPhp.js'></script>
<script language='javascript' src='http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushJScript.js'></script>
2. Copiază deasupra tagului </b:skin>

.dp-highlighter
{
 font-family: "Consolas", "Monaco", "Courier New", Courier, monospace;
 font-size: 12px;
 background-color: #E7E5DC;
 width: 99%;
 overflow: auto;
 margin: 18px 0 18px 0 !important;
 padding-top: 1px; /* adds a little border on top when controls are hidden */
}

/* clear styles */
.dp-highlighter ol,
.dp-highlighter ol li,
.dp-highlighter ol li span
{
 margin: 0;
 padding: 0;
 border: none;
}

.dp-highlighter a,
.dp-highlighter a:hover
{
 background: none;
 border: none;
 padding: 0;
 margin: 0;
}

.dp-highlighter .bar
{
 padding-left: 45px;
}

.dp-highlighter.collapsed .bar,
.dp-highlighter.nogutter .bar
{
 padding-left: 0px;
}

.dp-highlighter ol
{
 list-style: decimal; /* for ie */
 background-color: #fff;
 margin: 0px 0px 1px 45px !important; 
        /* 1px bottom margin seems to fix occasional Firefox scrolling */
 padding: 0px;
 color: #5C5C5C;
}

.dp-highlighter.nogutter ol,
.dp-highlighter.nogutter ol li
{
 list-style: none !important;
 margin-left: 0px !important;
}

.dp-highlighter ol li,
.dp-highlighter .columns div
{
 list-style: decimal-leading-zero; /* better look for others, override cascade from OL */
 list-style-position: outside !important;
 border-left: 3px solid #6CE26C;
 background-color: #F8F8F8;
 color: #5C5C5C;
 padding: 0 3px 0 10px !important;
 margin: 0 !important;
 line-height: 14px;
}

.dp-highlighter.nogutter ol li,
.dp-highlighter.nogutter .columns div
{
 border: 0;
}

.dp-highlighter .columns
{
 background-color: #F8F8F8;
 color: gray;
 overflow: hidden;
 width: 100%;
}

.dp-highlighter .columns div
{
 padding-bottom: 5px;
}

.dp-highlighter ol li.alt
{
 background-color: #FFF;
 color: inherit;
}

.dp-highlighter ol li span
{
 color: black;
 background-color: inherit;
}

/* Adjust some properties when collapsed */

.dp-highlighter.collapsed ol
{
 margin: 0px;
}

.dp-highlighter.collapsed ol li
{
 display: none;
}

/* Additional modifications when in print-view */

.dp-highlighter.printing
{
 border: none;
}

.dp-highlighter.printing .tools
{
 display: none !important;
}

.dp-highlighter.printing li
{
 display: list-item !important;
}

/* Styles for the tools */

.dp-highlighter .tools
{
 padding: 3px 8px 3px 10px;
 font: 9px Verdana, Geneva, Arial, Helvetica, sans-serif;
 color: silver;
 background-color: #f8f8f8;
 padding-bottom: 10px;
 border-left: 3px solid #6CE26C;
}

.dp-highlighter.nogutter .tools
{
 border-left: 0;
}

.dp-highlighter.collapsed .tools
{
 border-bottom: 0;
}

.dp-highlighter .tools a
{
 font-size: 9px;
 color: #a0a0a0;
 background-color: inherit;
 text-decoration: none;
 margin-right: 10px;
}

.dp-highlighter .tools a:hover
{
 color: red;
 background-color: inherit;
 text-decoration: underline;
}

/* About dialog styles */

.dp-about { background-color: #fff; color: #333; margin: 0px; padding: 0px; }
.dp-about table { width: 100%; height: 100%; font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; }
.dp-about td { padding: 10px; vertical-align: top; }
.dp-about .copy { border-bottom: 1px solid #ACA899; height: 95%; }
.dp-about .title { color: red; background-color: inherit; font-weight: bold; }
.dp-about .para { margin: 0 0 4px 0; }
.dp-about .footer { background-color: #ECEADB; color: #333; border-top: 1px solid #fff; text-align: right; }
.dp-about .close { font-size: 11px; font-family: Tahoma, Verdana, Arial, sans-serif !important; background-color: #ECEADB; color: #333; width: 60px; height: 22px; }

/* Language specific styles */

.dp-highlighter .comment, .dp-highlighter .comments { color: #008200; background-color: inherit; }
.dp-highlighter .string { color: blue; background-color: inherit; }
.dp-highlighter .keyword { color: #069; font-weight: bold; background-color: inherit; }
.dp-highlighter .preprocessor { color: gray; background-color: inherit; }]]>

3. Copiază deasupra tagului </body> :
<script language="javascript">
dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll('code');
</script>
4. In momentul în care copiezi codul în postare trebuie sa te asiguri ca nu conține caractere speciale html (se pot înlocui cu ajutorul tool-uluihttp://accessify.com/tools-and-wizards/developer-tools/quick-escape/default.php )
<pre class="Xml" name="code">
<script language='javascript'>
</pre>
O zi buna tuturor !

joi, 10 octombrie 2013

How to be productive 2.0


Sisteme de operare pentru embedded

Cautam pe net sisteme de operare embedded versatile și foarte mici și am ajuns la următoarea lista:

Probabil ca o sa folosesc unul din ele pentru următoarele proiecte în care voi folosi Arduino. Din cate se vede exista soluții open source de sisteme de operare. In concluzie, cuplul tinyOs/Arduino mi se pare cel mai bun pentru o viitoare colaborare.

O zi buna tuturor ! 
 

miercuri, 9 octombrie 2013

Arduino TRE e pe cale sa iasa pe piata




"Thanks to the 1-GHz Sitara AM335x processor, Arduino developers get up to 100 times more performance with the Sitara-processor-based TRE than they do on the Arduino Leonardo or Uno. This performance opens the doors to more advanced Linux-powered applications. The Sitara-processor-based Linux Arduino can run high-performance desktop applications, processing-intensive algorithms or high-speed communications.  "

E un lucru buna ca Arduino (plus Yún) se orientează și către acest gen de placi care intra în competiție directa cu Raspberry pi si cu alte placi similare ce au procesoare destul de puternice încat sa ruleze Linux. (http://makezine.com/2013/06/10/10-hot-new-boards-to-watch/)
Pentru cei interesati de toata gama de produse Arduino.

O zi buna tuturor!

vineri, 4 octombrie 2013

Produse Dremel de la eMag

Am gasit la eMag diverse unelte Dremel ce se pot folosi pentru electronica și pentru mecanica fina. Pot sa va spun ca sunt unele dintre cele mai bune unelte de pe piață.
Doua dintre aceste produse îmi cam vine sa le cumpăr, mai ales minifreza cu care pot tăia și plastic - Minifreza Dremel Trio 6800JC, 200 W, 20000 RPM .
Minifreza Dremel Trio 6800JC, 200 W, 20000 RPM
Descrierea de pe site
"Noul Dremel TRIO este cea mai avansata unealta pentru toți cei implicați in proiecte universale și cele din jurul casei. Dremel TRIO are un sistem spiral 3 în 1 care va da posibilitatea de a tăia, șlefui și freza cu 1 și aceeași unealta. Aceasta unealta multifuncționala, compacta și ușoara este foarte puternica! Dremel TRIO are o ergonomie superioara, un mîner cu 2 poziții și o turație variabila care asigura cea mai optima rata de lucru în diferite materiale. Prin tehnologia de taiere spirala de 360 de grade și taiere prin penetrare, unealta taie rapid în lemn, plastic, gips-carton, metal si placi ceramice. Alături de aceasta sunt accesoriile și atașamentele dedicate TRIO de șlefuire și frezare, astfel încît aceasta unealta va duce la bun sfîrșit proiectele dumneavoastră! Sistemul spiral Dremel TRIO 3 in 1: Taiere, Șlefuire și Frezare."
O alta unealta minune este : Pistol de pirogravat Dremel Versatip 2000 KA 
Pistol de pirogravat Dremel Versatip 2000 KASigur cumpăr una din ele .... 

vineri, 27 septembrie 2013

Am ales si am instalat Ubuntu :)




Fara sa știu de recomandarea de mai jos :) am instalat Ubuntu pe laptop. Merge brici.


Tot ce vreți sa știți despre Ubuntu găsiți pe http://ubuntu.ro/descopera/.
Recomand!

joi, 26 septembrie 2013

Trec la Linux ...

Gata, m-am saturat de Windows, o sa trec la Linux ...
Daca fraza de mai sus va suna cunoscut atunci puteți trece la acțiune și în cam 2-3 ore o sa aveți cel mai stabil și versatil sistem de operare existent.
Pasul 1: Alegeți o distribuție Linux care va place:
Ce mai bune distribuții de Linux
Pasul 2: Alegeți aplicațiile de care aveți nevoie: Cele mai bune aplicații pentru Linux
Pasul 3 (optional): Alegeti jocurile care va plac: Cele mai bune jocuri pentru Linux
Spor la treaba !

Sfaturi despre lipit componente electronice

Am găsit o carte despre lipituri (soldering) foarte interesanta și pe înțelesul tuturor:FullSolderComic_EN.pdf
Toate sfaturile de aici ar trebui urmate. Va spun din proprie experienta.

miercuri, 18 septembrie 2013

Sursa de tensiune liniară (bazat pe LM317) - cu transformator TS 70/16 (16.6 V / 2 A) - (9)

In sfârșit am reușit sa termin sursa de tensiune folosind transformatorul TS 70/16 (16.6 V / 2 A). PCB-ul sursei arata ca in imaginea de mai jos:
Am folosit pentru redresare o piesa integrata, nu mai folosesc diode separate pentru ca mi se pare mai simplu sa realizez PCB-ul folosind un integrat. În rest toate celelalte piese sunt la fel cu o mica deosebire sunt alese sa reziste la un curent de pana la 2 A. Folosesc ambele ieșiri ale transformatorului, una scoate 8 V ca in imaginea de mai jos.






În imaginea de mai jos se poate vedea poziționare surselor în cutie. Cea din dreapta este cu transformator TEZ10/D230/12-12V iar cea din dreapta este cea noua.

A doua ieșire, care este și reglabila, poate scoate maxim 20.9 V și minim 1.1 V, asa cum se vede în imaginea de mai jos. As fi tare curios să verific tensiunea de ieșire cu un osciloscop dar din păcate nu se poate în momentul acesta. Sper ca în curând sa fac rost și de un osciloscop. Tensiunea pare foarte stabilă și cred că se poate folosi fără probleme la orice ECU cu consum de pana în 2 A.

Schema electronică de bază pentru ieșirea a doua este reprezentată în imaginea de mai jos:

În următoare fază a proiectului o să conectez afișorul de tensiune, dar la acesta mai am de calibrat software-ul. Apoi o să montez toate plăcile în cutie și aș fi pregătit să trec la următorul proiect.
Seria de articole pe aceasta tema o puteți găsi aici : Sursa de tensiune liniară (bazat pe LM317) .
Sper ca articolele acestea sunt de folos cuiva ...
O seara plăcută tuturor!

luni, 2 septembrie 2013

Life moves pretty fast ...

"Life moves pretty fast. If you don't stop and look around once and a while, you could miss it."

“To live is the rarest thing in the world. Most people exist, that is all.”
― Oscar Wilde


“Life is like riding a bicycle. To keep your balance, you must keep moving.”
― Albert Einstein 

joi, 29 august 2013

SMTP codes

SMTP de la engl. Simple Mail Transfer Protocol
 

Reply codes in numerical order
Code Meaning
200 (nonstandard success response, see rfc876)
211 System status, or system help reply
214 Help message
220 Service ready
221 Service closing transmission channel
250 Requested mail action okay, completed
251 User not local; will forward to
354 Start mail input; end with .
421 Service not available, closing transmission channel
450 Requested mail action not taken: mailbox unavailable
451 Requested action aborted: local error in processing
452 Requested action not taken: insufficient system storage
500 Syntax error, command unrecognised
501 Syntax error in parameters or arguments
502 Command not implemented
503 Bad sequence of commands
504 Command parameter not implemented
521 does not accept mail (see rfc1846)
530 Access denied (???a Sendmailism)
550 Requested action not taken: mailbox unavailable
551 User not local; please try
552 Requested mail action aborted: exceeded storage allocation
553 Requested action not taken: mailbox name not allowed
554 Transaction failed

Reply codes grouped by command
Command Code Description
connect

220 Service ready

421 Service not available, closing transmission channel
HELO

250Requested mail action okay, completed

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

504Command parameter not implemented

521 does not accept mail [rfc1846]

421 Service not available, closing transmission channel
EHLO

250Requested mail action okay, completed

550Not implemented

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

504Command parameter not implemented

421 Service not available, closing transmission channel
MAIL

250Requested mail action okay, completed

552Requested mail action aborted: exceeded storage allocation

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

421 Service not available, closing transmission channel
RCPT

250Requested mail action okay, completed

251User not local; will forward to

550Requested action not taken: mailbox unavailable

551User not local; please try

552Requested mail action aborted: exceeded storage allocation

553Requested action not taken: mailbox name not allowed

450Requested mail action not taken: mailbox unavailable

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

503Bad sequence of commands

521 does not accept mail [rfc1846]

421 Service not available, closing transmission channel
DATA

354Start mail input; end with .

451Requested action aborted: local error in processing

554Transaction failed

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

503Bad sequence of commands

421 Service not available, closing transmission channel
received data

250Requested mail action okay, completed

552Requested mail action aborted: exceeded storage allocation

554Transaction failed

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage
RSET

200(nonstandard success response, see rfc876)

250Requested mail action okay, completed

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

504Command parameter not implemented

421 Service not available, closing transmission channel
SEND

250Requested mail action okay, completed

552Requested mail action aborted: exceeded storage allocation

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

421 Service not available, closing transmission channel
SOML

250Requested mail action okay, completed

552Requested mail action aborted: exceeded storage allocation

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

421 Service not available, closing transmission channel
SAML

250Requested mail action okay, completed

552Requested mail action aborted: exceeded storage allocation

451Requested action aborted: local error in processing

452Requested action not taken: insufficient system storage

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

421 Service not available, closing transmission channel
VRFY

250Requested mail action okay, completed

251User not local; will forward to

550Requested action not taken: mailbox unavailable

551User not local; please try

553Requested action not taken: mailbox name not allowed

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

504Command parameter not implemented

421 Service not available, closing transmission channel
EXPN

250Requested mail action okay, completed

550Requested action not taken: mailbox unavailable

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

504Command parameter not implemented

421 Service not available, closing transmission channel
HELP

211System status, or system help reply

214Help message

500Syntax error, command unrecognised

501Syntax error in parameters or arguments

502Command not implemented

504Command parameter not implemented

421 Service not available, closing transmission channel
NOOP

200(nonstandard success response, see rfc876)

250Requested mail action okay, completed

500Syntax error, command unrecognised

421 Service not available, closing transmission channel
QUIT

221 Service closing transmission channel

500Syntax error, command unrecognised
TURN

250Requested mail action okay, completed

502Command not implemented

500Syntax error, command unrecognised

503Bad sequence of commands

marți, 13 august 2013

Enum-urile in C

Definiție: Enum-urile sunt un set de constante încapsulate sub forma unui tip de date care se pot definii de către utilizator cu valori predefinite sau cu valori implicite. Enum-uri cu valori predefinit au valorile setate explicit de către programator. Se poate vedea în exemplele de mai jos cum se declara și cum se poate folosi.
typedef enum
{
  ZERO = 42,
  UNU = 13
} MyEnumType;

typedef enum
{
  FALSE = 0xFFU,
  TRUE = 0x00
} BooleanType;

int main()
{
BooleanType retValue;

retValue = TRUE;
printf("%d",retValue);

retValue = FALSE;
printf("%d",retValue);


return 0;
}

Enum-uri cu valori implicite au valorile stabilite de către compilator în ordine crescătoare începînd de la zero.

typedef enum
{
  FALSE,
  TRUE
} BooleanType;


typedef enum
{
  ZERO,
  UNU,
  DOI,
  TREI,
  PATRU,
  CINCI,
  SASE,
  SAPTE,
  OPT,
  NOUA,
  A,
  B,
  C,
  D,
  E,
  F
} Baza16Type;
Aceste structuri de date sunt foarte utile pentru că datele sunt organizate, practic fiecare număr poate însemna ceva. Există totuși o problemă majoră când vine vorba de compilatoare diferite și alocarea memoriei pentru aceste variabile. Aceeaşi variabilă poate avea dimensiuni diferite pentru compilatoare diferite. În schimb pentru programarea sub windows enum-urile sunt foarte des folosite. Personal mi se par foarte ușor de folosit și ușor de înțeles.
Nu e mare filozofie, sunt niște constante organizate într-un anumit fel care practic nu te lasă să greşeşti asignarea variabilei de acest tip. Dacă se foloseşte la asignare orice alta valoare din afara intervalului compilatorul va returna o eroare. Dacă se foloseşte la asignare o valoare numerica care este totuși egala cu un termen din enumerare atunci şi în acest caz va returna o eroare. Referinte:
C Enumeration Declarations
C_and_syntactically_similar_languages

miercuri, 7 august 2013

Template-uri in Php

Acum vreo doi ani am găsit clasa de mai jos pentru lucrul cu template-uri. Cred ca e cea mai simpla clasa de acest gen. Practic se parsează un fișier html unde se înlocuiesc tagurile {nume} cu un conținut setat de către utilizator. Daca nume = "
Continut
" atunci peste tot unde se gaseste {nume} se va inlocui cu codul html. Continut "tpl.class.php":
 

/***************************************************************************
*
* Author   : Eric Sizemore ( www.secondversion.com & www.phpsociety.com)
* Package  : Simple Template Engine
* Version  : 1.0.2
* Copyright: (C) 2006 - 2007 Eric Sizemore
* Site     : www.secondversion.com
* Email    : hide@address.com
* File     : tpl.class.php
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
***************************************************************************/

// Template engine
class template
{
 /**
 * Template variables and their replacements
 *
 * @var array
 */
 var $tpl_vars;

 /**
 * Constructor
 */
 function template()
 {
  $this->tpl_vars = array();
 }

 /**
 * Assign our variables and replacements
 *
 * @param  array  Template variables and replacements
 * @return none
 */
 function assign($var_array)
 {
  // Must be an array...
  if (!is_array($var_array))
  {
   die('template::assign() - $var_array must be an array.');
  }
  $this->tpl_vars = array_merge($this->tpl_vars, $var_array);
 }

 /**
 * Parse the template file
 *
 * @param  string  Template file
 * @return string  Parsed template data
 */
 function parse($tpl_file)
 {
  // Make sure it's a valid file, and it exists
  if (!is_file($tpl_file))
  {
   die('template::parse() - "' . $tpl_file . '" does not exist or is not a file.');
  }
  $tpl_content = file_get_contents($tpl_file);

  foreach ($this->tpl_vars AS $var => $content)
  {
   $tpl_content = str_replace('{' . $var . '}', $content, $tpl_content);
  }
  return $tpl_content;
 }

 /**
 * Output the template
 *
 * @param string Template file
 */
 function display($tpl_file)
 {
  echo $this->parse($tpl_file);
 }
}


Un exemplu foarte simplu folosind clasa "template" arata cam asa:
 
include("tpl.class.php");

$header = "Header";
$meniu = "linkuri meniu";
$continut = "continut pagina";
$footer = "linkuri footer";

$tpl_pagina = &new template();
$tpl_pagina->assign(array('modul_header' => $header, 
                          'modul_meniu' => $meniu, 
                          'modul_continut' => $continut, 
                          'modul_footer' => $footer
                         )
                   );

$pagina_de_afisat = $tpl_pagina->display_template('templates/new-newsletter/interfata.tpl');
echo $pagina_de_afisat;
Conținutul interfata.tpl este o pagina normala html dar care conține următoarele variabile {modul_header} {modul_meniu} {modul_continut} {modul_footer}, care vor poziționate în website unde dorește utilizatorul. Practic posibilitățile sunt nelimitate, iar partea de html este complet deconectata de Php. Mai simplu de atat nu se poate.
O zi plăcută tuturor !

Trimiterea de emailuri folosind PHP si PhpMailer

Pentru a trimite emailuri programatic prin Php se poate folosi clasa PhpMailer. E foarte ușor de folosit și de încredere. Mai exista si alte clase specializare pentru trimiterea de emailuri dar personal o prefer pe aceasta pentru ca se configurează foarte simplu.
Un exemplu simplu folosind SMTP:
 
require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "mail.yourdomain.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
  $mail->Port       = 26;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "yourname@yourdomain"; // SMTP account username
  $mail->Password   = "yourpassword";        // SMTP account password
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->AddAttachment('images/phpmailer.gif');      // attachment
  $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK

\n"; } catch (phpmailerException $e) { echo $e->errorMessage(); //Pretty error messages from PHPMailer } catch (Exception $e) { echo $e->getMessage(); //Boring error messages from anything else! }

O zi buna tuturor !

luni, 22 iulie 2013

Cum se poate afisa in loc de un ID, un text in Php&MySql ?

Se dă următoarea problemă: Într-o tabela mysql se stochează doar id-uri iar aceste id-uri corespund unor informații stocate în alta tabela. Cum s-ar putea sa se afișeze în loc de aceste id-uri informațiile corespunzătoare acestor id-uri ? De exmplu avem tabela ccu câmpurile:
ID Nume Prenume Varsta
1 Nume 1 Prenume 1 34a
2 Nume 2 Prenume 2 21
3 Nume 3 Prenume 3 45

Iar în tabela contacte avem următoarele câmpuri:
ID ID_user Nume_contact Adresa
1 1 Prenume 1 adresa 1
2 2 Prenume 2 adresa 2
3 3 Prenume 3 adresa 3

Ideea ar fi ca în loc de ID_user sa se afișeze numele userului care deține contactul aferent. Codul Php folosind si clasa MySqlLib ar arata cam asa:
 

require_once("MySqlLib.class.php");

$hostname_db="localhost";  
$name_db="test";  
$username_db="root";  
$password_db ="";  
$prefix_db = "";  
$sql = new MySqlLibClass($hostname_db,$name_db,$username_db,$password_db,$prefix_db);
$conn = $sql->connect();

$query  = "SELECT contacte.ID,
                  contacte.Nume_contact,                    
                  contacte.ID_user,
                  useri.Nume AS 'Nume_utilizator'
           FROM contacte 
           INNER JOIN useri ON contacte.ID_user = useri.ID
           ORDER BY contacte.Nume_contact";
$result = $sql->query_html( $query );
  

Rezultatul este următorul:
ID Nume_utilizator Nume_contact Adresa
1 Nume 1 Prenume 1 adresa 1
2 Nume 2 Prenume 2 adresa 2
3 Nume 3 Prenume 3 adresa 3

In felul acesta se pot înlocui anumite informații irelevante pentru utilizatori cu cu niște informații ușor de citit , în cazul acesta se înlocuiește un ID cu numele utilizatorului care corespunde acelui ID.
O zi buna tuturor!

Php si Mysql - clasa de lucru cu comenzile de baza mysql

Am avut nevoie acum ceva timp de o clasa pentru lucrul cu mysql si am creeat o clasa minimala pentru comenzile de baza. Comenzile de baza Mysql sunt: select, insert, update și delete. E o clasa foarte simpla dar își face treaba foarte bine. Folosesc doar conexiune mysql temporara. După fiecare operațiune eliberez resursele și închid conexiunea. Singura chestiune pe care nu am luat-o în calcul este sql injection, dar o sa am un post viitor doar despre acest subiect.
 

<?php

/*
 +----------------------------------------------------------------------+
 |  MySqlLibClass  version 1.0
 +----------------------------------------------------------------------+
 | Copyright (C) Simedru Florin 2013,http://automatic-house.blogspot.ro/
 +----------------------------------------------------------------------+
 | This program is free software; you can redistribute it and/or modify |
 | it under the terms of the GNU General Public License as published by |
 | the Free Software Foundation; either version 2 of the License, or    |
 | (at your option) any later version.                                  |
 | This program is distributed in the hope that it will be useful       |
 | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the         |
 | GNU General Public License for more details.                         |
 +----------------------------------------------------------------------+
 | Author: Simedru Florin                                               |
 +----------------------------------------------------------------------+
*/

class MySqlLibClass{

  var $host_db;    // MySql host name
  var $nume_db;    // Database name
  var $user_db;    // User name
  var $parola_db;  // Password
  var $prefix_db;  // prefixul pentru toate tablele din baza de date 

//******************************************************************************
// Nume functie:MySqlLibClass($hostname_db,$name_db,$username_db,$password_db,$prefix_db)
// Descriere:Constructorul clasei  MySqlLibClass - seteaza datele de conectare la MySQL 
// Returneaza: none
//******************************************************************************

function MySqlLibClass($hostname_db,$name_db,$username_db,$password_db,$prefix_db)
{  
  $this->host_db = $hostname_db;
  $this->nume_db = $name_db;
  $this->user_db = $username_db;
  $this->parola_db = $password_db;
  $this->prefix_db="".$prefix_db."";  
}

//******************************************************************************
// Nume functie : setDBHost($host) ... 
// Descriere :functii utile pentru manipularea mai usoara a datelor de conexiune
// Returneaza : dupa caz 
//******************************************************************************
function setDBHost($host)
{
  $this->host_db = $host;
}
function setDBName($name)
{
  $this->nume_db = $name;
}  
function setDBUser($user)
{
$this->user_db = $user; 
}  
function setDBPass($pass)
{
 $this->parola_db = $pass; 
}  
function getDBHost()
{
  return $this->host_db;
}  
function getDBName()
{
 return $this->nume_db;
}  
function getDBUser()
{
return $this->user_db; 
}  
function getDBPass()
{
 return  $this->parola_db; 
} 

//******************************************************************************
// Nume functie : connect()
// Descriere : Realizeaza conexiunea MySQL
// Returneaza : $conn -> conexiunea la serverul MySql
//******************************************************************************
function connect()
{
  $conn=0;
  $conn = mysql_connect($this->host_db,$this->user_db,$this->parola_db)  or die( "Nu ma pot conecta >> ".mysql_error()." >> $query "." 
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); mysql_select_db($this->nume_db,$conn) or die("Eroare in query
>>$query
Nu pot sa selectez baza de date >> ".mysql_error()." >> >$this->nume_db<"); return $conn; } //****************************************************************************** // Nume functie : close($conn) // Descriere : Inchide conexiunea MySQL // Returneaza : rezultat //****************************************************************************** function close($conn) { return mysql_close($conn); } //****************************************************************************** // Nume functie : query($query) // Descriere : executa si afiseaza rezultatele unei interogari SQL tabelar // Returneaza : numele coloanelor si datele interogarii //****************************************************************************** function query_html($query) { $nr_col=0; $form_query =""; $result=0; $i=0; $j=0; $conexiune = $this->connect(); $result = mysql_query($query,$conexiune) or die("Error in query
>>$query
Query failed >>$query".mysql_error()); $nr_col = mysql_num_fields($result); $html_retVal.=""; $html_retVal.= ""; for($j=0;$j<$nr_col;$j++) { $fieldname[$j] = mysql_field_name($result,$j); $html_retVal.= ""; } $html_retVal.=""; while($line = mysql_fetch_array($result, MYSQL_ASSOC)) { $html_retVal.=""; for($i=0;$i<$nr_col;$i++) { $fieldname[$i] = mysql_field_name($result,$i); $values[$i] = @$line["$fieldname[$i]"]; $html_retVal.= ""; } $html_retVal.= ""; } $html_retVal.="
".$fieldname[$j]."
".$values[$i]."

"; @mysql_free_result($result); $this->close($conexiune); return $html_retVal; } //****************************************************************************** // Nume functie : query($query) // Descriere : executa o interogare MySql // Returneaza : numele coloanelor si datele interogarii //****************************************************************************** function query($query) { $result=0; $conexiune = $this->connect(); $result = mysql_query($query,$conexiune) or die("Error in query
>>$query
Query failed >>$query".mysql_error()); return $result; } //****************************************************************************** // Nume functie :insert_record_simple ($table) // Descriere : insereaza o inregistrare noua in tabela aferenta // Returneaza : string query = interogare //****************************************************************************** function insert_record($table) { $conn=0; $lista_values= ""; $lista_fields = ""; $conn=$this->connect(); $query = "select * from $table"; $result = mysql_query($query,$conn) or die("Error in query
>>$query
Query failed
".mysql_error()); $nr_col = mysql_num_fields($result); $j=0; for($i=0;$i<$nr_col;$i++) { $fieldname[$i] = mysql_field_name($result,$i); $values[$i] = @$_POST[$fieldname[$i]]; if(is_array($_POST[$fieldname[$i]]) == "Array") { $values[$i] = ""; $values[$i] = @$_POST[$fieldname[$i]][0]; } else $values[$i] = @$_POST[$fieldname[$i]]; $lista_values= $lista_values."'".$values[$i]."',"; $lista_fields = $lista_fields.$fieldname[$i]." , "; } $length_values = strlen($lista_values); $length_fields = strlen($lista_fields); $lista_values=substr($lista_values, 0, $length_values-1); $lista_fields=substr($lista_fields, 0, $length_fields-2); $query = "INSERT INTO $table ($lista_fields) VALUES ($lista_values);"; $result = mysql_query($query) or die("Error in query
>>$query
Query failed
".mysql_error()); @mysql_free_result($result); mysql_close($conn); return $query; } //****************************************************************************** // Nume functie :get_data($table,$fieldname_input,$fieldname_return,$value) // Descriere : returneaza valoarea campului $fieldname_input in cazul in care // $fieldname_input='$value' // select * from $table where $fieldname_input='$value' // Returneaza : string //****************************************************************************** function get_data($table,$fieldname_input,$fieldname_return,$value) { $conn=0; $conn=$this->connect(); $query1 = "select * from $table where $fieldname_input='$value'"; $result1 = mysql_query($query1,$conn) or die("Error in query
>>$query
Error : Query failed : >>".mysql_error()."$query1"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); while($line1 = mysql_fetch_array($result1, MYSQL_ASSOC)) { $ret_value = $line1["$fieldname_return"]; $ret_value = str_replace("<","<",$values2 ); $ret_value = str_replace(">",">",$values2 ); return $ret_value; } } //****************************************************************************** // Nume functie : set_data_ID // Descriere : Executa un update mysql // Returneaza : none //****************************************************************************** function set_data_ID($table,$fieldname,$data,$id) { $data = str_replace("<","<",$data ); $data = str_replace(">",">",$data ); $conn=0; $conn=$this->connect(); $query = "UPDATE $table SET $fieldname='$data' where ID='$id'"; $result = mysql_query($query,$conn) or die("Error in query
>>$query
set_data_user: Query failed: >>".mysql_error()." Query>> $query1"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); @mysql_free_result($result); mysql_close($conn); } //****************************************************************************** // Nume functie : delete_record_ID // Descriere : Executa un delete mysql pentru intregistarea cu ID-ul selectat // Returneaza : none //****************************************************************************** function delete_record_ID($table,$ID) { $conn=0; $conn=$this->connect(); mysql_select_db($this->nume_db,$conn) or die("Error in query
>>$query
update_record_ext: Query failed: >>".mysql_error()."$query"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); $query = "DELETE FROM $table WHERE ID='$ID'"; $result = mysql_query($query) or die("Error in query
>>$query
delete_record: Query failed : >>".mysql_error()."$query"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); if($result != FALSE ) { $html_ret_value .= "
Înregistrarea $ID a fost stearsa ."; } else { $html_ret_value .= "
Înregistrarea $ID nu a fost stearsa!"; } @mysql_free_result($result); mysql_close($conn); return $html_ret_value; } //****************************************************************************** // Nume functie : delete_record // Descriere : Executa un delete mysql pentru intregistarea cu $fieldname-ul // selectat egal cu $value // DELETE FROM $table WHERE $fieldname='$value' // Returneaza : none //****************************************************************************** function delete_record($table,$fieldname,$value) { $conn=0; $conn=$this->connect(); mysql_select_db($this->nume_db,$conn) or die("Error in query
>>$query
update_record_ext: Query failed: >>".mysql_error()."$query"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); $query = "DELETE FROM $table WHERE $fieldname='$value'"; $result = mysql_query($query) or die("Error in query
>>$query
delete_record: Query failed : >>".mysql_error()."$query"."
>> Line:".__LINE__."
>>File:". __FILE__."
>>Function :".__FUNCTION__."
>>Class :".__CLASS__."
"); if($result != FALSE ) { $html_ret_value .= "
Înregistrarea $value a fost stearsa ."; } else { $html_ret_value .= "
Înregistrarea $value nu a fost stearsa!"; } @mysql_free_result($result); mysql_close($conn); return $html_ret_value; } } ?>
Sper sa fie de folos cuiva.
O zi buna tuturor!

joi, 18 iulie 2013

Conexiunea cu o baza de date MySql în Php

E simplu ca buna ziua :).
Sunt doua tipuri de conexiune:
1. Conexiunea temporara
2. Conexiunea permanenta
 

<?php

$host_db="localhost";
$nume_db="test";
$user_db="root";
$parola_db="";

$query1 = "select * from utilizatori";
$result1 = mysql_query($query1,$conn) or die("get_config_data: Query failed : [".mysql_error()."$query1"."]");

function Conecteaza()
{
    $db_link = mysql_connect($host_db,$user_db,$parola_db);
    if (!is_resource($db_link))
    {
      if(!$db_link)
      {
        print(' Conecteaza() :Can\'t connect : ['.mysql_errno($db_link).' : '. mysql_error().']');
      }
    }
    else
    {
      $db_selected = mysql_select_db($nume_db,$db_link);
      if (!$db_selected)
      {
        print('Conecteaza() :Can\'t select database : ['.mysql_errno($db_link).' : '. mysql_error().']');
        if (!mysql_ping ($db_link))
        {
          //here is the major trick, you have to close the connection (even though its not currently working) for it to recreate properly.
          mysql_close($db_link);
          $db_link = mysql_connect($host_db,$user_db,$parola_db);
          mysql_select_db($nume_db,$db_link);
        }
      }
    }
    return $db_link;
  }
  

function Conecteaza_permanent()
{
    $conn = mysql_pconnect($host_db,$user_db,$parola_db)  or die( "Nu ma pot conecta : ".mysql_error().":".$host_db." - ".$user_db.":".$nume_db."");
    if (!($conn === false))
    {
      mysql_select_db($nume_db,$conn) or die("Error in query : Nu pot sa selectez baza de date".mysql_error().":".$host_db.":".$user_db.":".$nume_db."");
    }
    return $conn;
}
?>

Am găsit și următoarea recomandare http://www.php.net/manual/en/mysqlinfo.api.choosing.php referitoare la alegerea funcţiilor API pe care le folosiţi. E recomandat sa verificați temeinic funcţiile pe site-ul php.net pentru că se schimba când ţie lumea mai dragă. Personal eu nu prea folosesc conexiunile permanente şi nici nu le recomand din mai multe cauze. O tabela blocata într-o conexiune permanenta va rămîne blocata pana expira timeout-ul pentru respectiva conexiune. Asta ar putea dura foarte mult și riscați sa blocați serverul. Însuși măria sa serverul Apache se cam înţacă (blochează) dacă are de-a face cu o conexiune permanentă. Mai bine folosiţi conexiunea temporară pentru că oricum ar fi, timpul de comunicaţie dintre PHP şi MySql este destul de mic.
Mai multe descrieri şi comentarii găsiţi aici.
Spor la treabă tuturor!

duminică, 30 iunie 2013

Evidence

I believe in evidence. I believe in observation, measurement and reasoning confirmed by independent observers. I'll believe anything no matter how wild and ridiculous, if there is evidence for it.
Isaac Asimov

Biblioteca virtuala

Am gasit acum vreo doua zile pe net o întreagă bibliotecă virtuală Biblioteca virtuala (format ePub). Îmi place la nebunie Isaac Asimov.
Am citit romanele SF ale acestui scriitor de când eram la liceu și încă mă mai atrag. Mai ales seria fundației ...
Cele trei legi ale roboticii au fost enunțate pentru prima oară de către Asimov.

Alte carti gasiti si aici ! Lectură și zi plăcută tuturor!

sâmbătă, 29 iunie 2013

Proiect Arduino - Controlarea a 8 LED-uri folosind 3 pini de la microcontroler

Am cumpărat un circuit de control a 8 LED-uri si am decis sa ma joc un pic cu el sa vad ce poate sa facă.
Descrierea de mai jos am preluat-o de pe site-ul www.robofun.ro si mi-am creat un circuit bazat pe conceptul Arduino:
"Driver bazat pe chip-ul TPIC6B595, capabil sa ofere 8 canale de iesire cu maximum 150 mA per ieșire. Controlul chip-ului se face folosind 3 pini (DATAIN, LATCH, CLOCK). In plus, plăcile pot fi inlantuite foarte usor, permițând astfel sa controlezi un număr practic nelimitat de dispozitive (limitarea apare doar datorita rezistentei parazite a cablajului si a conectorilor, dar poți înlănțui cel puțin câteva zeci de dispozitive fără niciun fel de probleme).
Ca sa controlezi led-urile atașate pe cele 8 ieșiri, trebuie sa conectezi la un microcontroller (de exemplu Arduino) cei 3 pini de control, la pini digitali. Apoi, ca sa aprinzi al 3-lea led (spre exemplu) va trebui sa scrii pinul DATAIN acel număr care în binar este reprezentat cu un bit 1 pe poziția 3 și 0 în rest (adică "00100000" în binar, adică 32 în baza zece). Dacă vrei sa aprinzi toate led-urile, trebuie sa scrii acel număr care are toți biții 1 în binar ("11111111" în binar, adică 255 în baza zece). Trebuie sa fii atent la numerotarea pinilor de ieșire prezentata în schema de mai jos. Pentru un exemplu de cod, vezi mai jos."

Codul sursa este următorul:
 
int latchPin = 5;

int clockPin = 6; 

int dataPin = 7;

void setup() {

     pinMode(latchPin, OUTPUT);

     pinMode(clockPin, OUTPUT);

     pinMode(dataPin, OUTPUT);

}

void loop() {

      for (int numberToDisplay = 0; numberToDisplay < 255; numberToDisplay++) {

         digitalWrite(latchPin, LOW);

        shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);

        digitalWrite(latchPin, HIGH); delay(300);

    } 

}

Teoria e frumoasă :) .... dar practica e si mai frumoasă dacă totul funcționează cum trebuie. În funcție de cele trei intrări dataPin,clockPin și latchPin va activa cele 8 ieșiri. Eu am folosit ieșirile pentru a aprinde 8 LED-uri dar se pot controla chiar și relee sau motoare.
Simbolul logic al chip-ului TPIC6B595 este următorul:

Și am purces la treabă ... am creat o placă de test să mă conving că funcționează conform cu datasheet-ului. Merge chiar bine și asta îmi dă speranțe pentru un proiect cu mai multe LED-uri( poate vreo 10x10).
Placa arată cam așa:

Linkuri ajutătoare:
Foaia de catalog a chip-ului TPIC6B595
TPIC6B595 Troubles

O seară plăcută tuturor !

vineri, 28 iunie 2013

Sursa de tensiune liniară (bazat pe LM317) - cu transformator TS 70/16 (16.6 V / 2 A) - (8)

Am o nouă versiune de sursă de tensiune liniară, dar de data asta am schimbat transformatorul, puntea redresoare și implicit layout-ul PCB-ului. Transformatorul folosit se numește TS70/16 și are două ieșiri 16.6 V cu 2 Amperi. Am avut nevoie de un transformator mai mare pentru a putea utiliza echipamente care consuma mai mult curent. Transformatorul de la versiunea 1 se cam încălzea și probabil ar fi cedat dacă legam mai multe ECU-uri la sursă. Prima sursă o să o folosesc exclusiv pentru alimentarea afișorului de tensiune.
PCB-ul arata acum cam așa:

PCB-ul în format Express PCB
Piesele celelalte rămân la fel ca și la schema cu transformatorul mai mic. Puntea redresoare am înlocuit-o cu un integrat foarte modular și ușor de folosit denumit BR38. Acum schema e mai ușor de înțeles și de modificat. Sper că schema e și robustă.
Din păcate o să mai dureze până o să construiesc fizic noua sursă. Cred că spre sfârșitul lunii iulie..
O seară plăcută tuturor!

joi, 27 iunie 2013

Evolio Aria Mini review

Tableta Evolio Aria mini Wifi si GPS este un gadget ce are un procesor dual core la 1.5 GHz și un ecran IPS de 8 inchi. Am achiziționat de curând un dispozitiv de acest gen cu gândul să plec într-o excursie și doream un GPS inclus, plus posibilitatea să mai intru pe net. Tableta rulează Android Jelly Bean v4.1.1 și este livrată cu un pachet de soft-uri foarte folosite cum ar fi KingSoftOffice, Presa online, Magazin Play, Navigare GPS, Google Chrome, EvoBook reader, Explorer Android etc... Practic este un computer în toată regula. Se poate conecta la orice televizor sau monitor ce dispune de un conector HDMI pentru că tableta are o ieșire mini HDMI. Poți să citești, să te joci, să vizionezi filme, să editezi text, să faci poze, să faci surf pe net, să ți un jurnal, să asculți muzică etc..

Specificațiile producătorului:
- Sistem Operare Android 4.1 Jelly Bean
- Procesor Rockchip RK3066
- Model procesor Dual Core
- Frecventa Procesor 1,5 GHz
- Tip Ecran IPS Capacitiv Multitouch
- Diagonala Ecran 8 inch
- Rezoluție Ecran 1024 x 768 px
- Dimensiuni 199 x 154 x 9,5 mm; 460 g
- Camera front 0,3 Mpx; back 2 Mpx
- Memorie interna 8 GB
- Memorie RAM 1 GB
- Memorie externa MicroSD pana la 32 GB
- Baterie 4500 mAh
- Conexiuni Bluetooth, Wi Fi
- GPS Receptor GPS
- Porturi Jack, Micro USB, Mini HDMI
- Multimedia Redare Audio, Redare Foto, Redare Video

Ce găsești în cutie:
- Încărcător
- Cablu adaptor de la micro USB la USB
- Cablu de date USB
- Tableta :)
- Certificat de garanție. Are garanție 5 ani.



Încărcător:
- Input: 100 - 240 V curent alternativ
- Output: 5 Volți - 2 Amperi
- Conector încărcător 2.3 mm

Conectori si slot-uri:
- Iesire mini HDMI
- Iesire audio mufa jack 3.5 mm pentru căști sau boxe
- Slot micro SD, recomand un card de 16 GB
- Iesire micro USB
- Conector pentru încărcător


Imagini cu cablurile si conectorii:


Dimensiunile constructive pe care le-am măsurat cu mânuța mea cu șublerul din dotare:
- Lățime : 154.1 mm
- Lungime: 204.1 mm
- Grosime: 10.1 mm

Dimensiuni ecran:
- Lățime: 123 mm
- Lungime: 162 mm
- Diagonala: 203,5 mm(8,01181102 inches)

Greutate: 468 grame

Notă de ținut cont: Măsurătorile sunt destul de exacte însă au totuși o marjă de eroare de 0.02 mm datorită șublerului. Măsurătorile date de producător nu prea corespund cu ce am măsurat eu.

Experiența și primele impresii
După aproape o săptămână de utilizare pot să spun că sunt destul de mulțumit de tabletă. Navigarea este fluenta, fără lag, funcționează orice joc actual disponibil pentru tablete cu android.
Acum vreo câteva luni am utilizat un iPad și cred că Evolio Aria Mini se apropie destul de mult de experiența dată de iPad. Se mișcă foarte bine, nu se blochează și până acum nu s-a resetat niciodată. Ecranul este luminos și contrar altor review-uri eu consider că unghiurile de vizualizare sunt printre cele mai bune de pe piață. Aria Mini dispune de un display multi touch capacitiv format 4:3 și o rezoluție de 1024 x 768 pixeli. Display-ul este bazat pe tehnologia IPS (In-plane switching)


Design
La design eu consider că nu stă prea bine. Carcasa e total necorespunzătoare pentru că are prea multe muchii drepte. Camera foto de pe spate este un pic ieșită. În momentul în care o așezi pe o suprafață plană se v-a propti în camera foto și dacă apeși ușor pe colțul stânga jos sau dreapta sus tableta va pendula ușor ceea ce nu e prea plăcut. Spun că designul e făcut după ureche și datorită faptului că se încălzește destul de tare în parte de jos. Practic tableta nu are un sistem de disipare a căldurii ce vine de la CPU și GPU (sper că nu se încălzește bateria !!!). Ar fi prins bine niște mici fante pe muchia de jos din dreapta pe unde să se evacueze căldura. Dar o să fie foarte bună la iarnă să îmi încălzesc mâinile :) .

Performanțe
Nu am rulat nici un benchmark ci doar am preluat datele de aici.
Zice cam așa:
"... scorul lui Aria Mini a fost de 2901 puncte. Tableta a mai înregistrat 4410 puncte în Quadrant şi 1420 în Vellamo, în cadrul testului HTML5. În testul Metal din Vellamo scorul atins este de 444 puncte."
Are performanțe foarte bune datorită procesorului dual core de 1.5 Ghz și acest lucru se simte în funcționare.

Bateria
Tableta se descarcă destul de repede dacă ecranul este setat la maxim (1 - 2 ore). În schimb se va descarcă foarte încet dacă luminozitatea este setată la minim (4 - 5 ore). Jocurile de asemenea consumă foarte repede bateria. Browsing-ul, cititul de cărți în format electronic sau editare de texte consumă destul de puțin. Per total dacă se setează o luminozitate minimă bateria tine minim 3 - 4 ore, ceea ce este rezonabil. Ca și GPS în mașină recomand conectarea permanentă la încărcător pentru că bateria se consumă destul de repede și o să te trezești în mijlocul unui mare oraș ... fără localizare prin GPS.

GPS-ul

Tableta vine cu un soft preinstalat dar acest soft funcționează doar dacă conexiunea la internet este activă. A trebuit să îmi instalez un program ce poate fi folosit offline. Actualizarea poziției se face destul de bine. Am o singură obiecție, datorită faptului că în trafic e destul de mult zgomot câteodată nu o aud pe fătuca care îmi spune în ce direcție să virez. Cred că asta ține și de software-ul pe care l-am instalat.


Concluzie
Pro:
- Performanțe foarte bune
- Display bun
- Experiență de navigare foarte bună
- GPS
- Rulează orice program sau joc disponibil pentru Android
- Bateria ține destul de mult
- Prețul este foarte bun - recomand să cumperi de pe emag.ro
Contra:
- Designul este cam nereușit
- Se încălzește în partea din spate jos
- Carcasa este din plastic
- Camera de pe spate este de doar 2 MP
- Greutatea e destul de mare 468 g (fiica mea de 4 ani se cam chinuie să o manipuleze)

Concluzia finală: Eu personal recomand această tabletă.

O zi bună tuturor!