Close Panel

3

ian

2010

Bitcell.info

By DarkByte. Posted in Delphi, IT thingies, News | 1 Comment »

Un nou forum cu temă informatică, o nouă abordare. Sperăm să fie o abordare mai bună happy

Bitcell Forum

Vizitaţi-ne pe BitCell.info.

 

Prin 2003, când am auzit şi eu prima oară de stick-uri USB, mi s-a părut o chestie foarte interesantă. Deh, ochii oricărui bărbat se lipesc de gadgeturi. Sau de rotunjimi şi curbe …

USB Flash DriveBineînţeles că mi-am cumpărat şi eu unul. Avea o capacitate extraordinară de 256 de MB, era micuţ, albastru şi parţial transparent. Era jucăria perfectă. Gata cu stresul cauzat de dischete, gata cu CD-urile RW. Ca şi pe dischetă, puteam scrie şi sterge date cum aveam chef … ca şi pe CD, îmi permiteam să transfer multe.

Ce-i drept, mi-a făcut o gaură destul de mare în buzunar. Ditamai stickul de 256 MB m-a costat, pe atunci, aproape un sfert de salar. La acelaşi preţ aş putea cumpăra acum un stick de 16 GB sau chiar 32 de GB. Nu văd motivul pentru care aş face asta, ţinând cont de vitezele destul de reduse de transfer.

Recent, mi-am regăsit stickul. Era întreg, era funcţional, era albastru spălăcit şi încă transparent. Bonus, aveam şi date pe el. Fişiere din alte vremuri. Amintiri. O adevărată comoară.

L-am introdus într-un port USB din faţa carcasei calculatorului şi m-am apucat să verific tot ce aveam pe el. După vreo jumătate de oră, amuzat, nostalgic, chiar bucuros, am plecat la o ţigară pe balcon. Când am revenit, prins într-o discuţie cu un coleg de servici, am călcat direct pe stick. N-am fost deloc încântat.

M-am uitat la resturile de sub talpă şi am fost destul de surprins să văd că e aproape intact. Se îndoise puţin, îşi dăduse jos hainele de plastic albastru transparent şi puteam vedea plăcuţa de control, care era, şi ea, un pic îndoită şi părea ruptă. Am încercat să introduc resturile stick-ului în USB, dar Windows a zis că nu-i găseşte driver. Fir-ar! Mi-a trecut prin cap că nu driver îi trebuie, ci un alt stick.

Am încercat să îndrept plăcuţa de control, dar cât mai fin posibil, şi am încercat din nou. Spre surpriza mea, de data asta a mers. Am copiat toate datele de pe el, iar acum … e piesă de blog, aşa cum puteţi admira mai jos happy

 

2

oct

2009

Multilanguage Wordpress

By DarkByte. Posted in IT thingies, News | 12 Comments »

De câteva zile mă stresează ideea de a-mi modifica blogul în aşa fel încât să fie multi-language (adică să rămân cu acelaşi blog, dar să îmi permită să postez în mai multe limbi şi să afişeze posturile în funcţie de setarea globală de limbă).

Primul gând care mi-a trecut prin cap a fost să instalez un nou Wordpress pentru fiecare limbă care vreau s-o folosesc, dar când m-am gândit la toate pluginurile, setările şi toate celelalte porcării care o să mă încurce, am renunţat.

Din păcate, prea multe informaţii despre posibilitatea unui Wordpress care să suporte mai multe limbi, în paralel, nu există. La o căutare destul de adâncă am găsit un singur site care promitea ceva, aşa că l-am păstrat pentru teste.

Din fericire, pe lume există şi Smash, care mi-a găsit încă două site-uri care promiteau să fie perfecte.

N-am mai putut aştepta. Am luat xampp, l-am instalat, am luat Wordpress, l-am instalat şi pe el, am luat baza de date de pe blog, am importat-o în noul blog din localhost, am făcut setările cât mai apropiate de cele originale şi am trecut la creaţii.

Am început cu qTranslate şi am crezut că mor când, după ce am dat pe Activate Plugin, mi-a afişat o pagină kilometrică cu erori. Noroc cu Google.

Fişierul “qtranslate_core.php” trebuie modificat. Mai exact, bucata următoare de cod trebuie comentată:

	if(is_object($text)||get_class($text) == '__PHP_Incomplete_Class') {
		foreach(get_object_vars($text) as $key => $t) {
			$text->$key = qtrans_use($lang,$text->$key,$show_available);
		}
		return $text;
	}

După modificarea acestui fişier, instalarea, activarea şi setarea pluginului sunt simple ca bună ziua.

Tot ce trebuie să mai fac este să modific celelalte posturi ale blogului. Am încurcat-o rău de tot straight face

Succes la îmbunătăţirea Wordpress-ului !

 

Sunt (un pic) mai mult de 11 ani de când, pentru prima oară, am dat nas în nas cu Windows. Mă decisesem, după nişte asigurări ferme că voi fi ajutat dacă va fi nevoie, să încerc să intru la liceu într-o secţie de informatică, deşi nu văzusem un calculator în viaţa mea (n-am pus filmele la socoteală … dar acolo arată bine big grin)

Înainte de examenele de admitere din vara anului 1998 am fost cu mama mea la serviciul ei unde, la birouri, erau nişte calculatoare, iar fiica şefei butona deseori pe acolo. Evident, pentru a vedea cum arată un calculator. Bineînţeles că, inteligent cum mă ştiam, îmi imaginam ca în două săptămâni o să învăţ tot ce se poate despre calculatoare (nu mă mai prea uit la filme după deziluzia de atunci straight face).

 

17

aug

2009

Oameni …

By DarkByte. Posted in Aberatii, De-ale vietii, Delphi | 13 Comments »

Aseară am revenit în Oradea, decis ca pe tren să-mi continui proiectele de programare care le am în curs.

În vederea acestui scop, mi-am lăsat laptopul la încărcat până în ultima clipă, apoi l-am pus în hibernare şi am plecat. Ajuns în gară, am hotărât să mă aşez în singurul locşor din tren unde există priză (de fapt, două alăturate … doar suntem europeni acum, nu?).

Am avut, totuşi, o mică surpriză, nu neapărat plăcută, când, după ce am urcat în tren, am remarcat că pe cele mai apropiate două locuri (de priză) erau două femei, una la vreo 35 de ani şi cealaltă undeva peste 50. Doar locul de dincolo de ele era gol, dar îmi displăcea profund ideea de a butona înghiontit de colegii de drum, cum mi s-a mai întâmplat

Mi-am luat inima în dinţi şi am rugat-o pe doamna mai tânără (cea care stătea chiar lângă priză), dacă se poate, să-mi doneze locul ei. Am contat pe faptul că nu avea telefon la încărcat şi nici nu părea să fie în stare să distingă un laptop închis de o cărămidă mai interesantă.

După ce a trebuit să repet de câteva ori întrebarea (s-a băgat şi doamna mai în vârstă în discuţie), a fost de acord să mă lase să-mi pun telefonul la încărcat acolo … când, într-un final, a înţeles că o rugam să se mute, a făcut o mutră mai acră, dar s-a mutat, lăsându-şi totuşi bagajul să-i ţină companie trollerului meu.

Nu a uitat, atunci când s-a aşezat pe noul loc, să arunce o ultimă replică mai veninoasă: “Ştii, nu e frumos să ridici femeile !”. Da, ştiu, doar pe piedestal …

Chiar m-a blocat niţel … probabil că s-a şi văzut pe faţa mea, pentru că nu a mai adăugat nimic.

Tanti nu avea nici un folos pentru amărâta aia de priză, iar în acel tren doar acolo există vreo priză. Cu ce-am deranjat-o atât de tare că am rugat-o să se mute în cealaltă parte a femeii în vârstă, ţinând cont de faptul că am rugat-o frumos?

Cireaşa de pe tort a venit un pic mai încolo, totuşi … la prima staţie ambele femei au coborât … asta chiar m-a lăsat mască. Pentru 10 minute de călătorie s-a gândit să-mi arunce remarca aia? Sau doar pentru că era de la ţară?

Cred că oamenii nu se simt bine dacă nu încearcă să facă pe alţi oameni să se simtă prost … just for the fun of it.

 

15

aug

2009

Calculator de bioritm

By DarkByte. Posted in Delphi, IT thingies | 2 Comments »

Destul de recent, am primit linkuri pe site-uri care-ți calculau bioritmul și afișau graficele și mi s-a părut destul de interesant, așa că … m-am apucat să-mi fac un program care să-mi afișeze bioritmul, fără să fie nevoie să intru pe vreun site sau să am măcar conexiune la Internet.

Cu toate acestea, ce trebuie să ştiţi este că aceste cicluri bioritmice nu sunt dovedite ştiinţific, ba chiar, mai curând, infirmate. Pentru detalii, vedeţi ce zice Wikipedia.

Acestea fiind spuse, să trecem la partea tehnică și informatică din spatele acestui program.

Probabil că știți că pentru a desena o sinusoidală pe calculator, calculezi o serie de puncte, care le unești prin linii. O treabă foarte ușoară în Delphi. Ceea ce probabil că nu știți e faptul că există o funcție în Delphi, care unește o serie de puncte prin linii mult mai rapid decât dacă ai face o buclă, desenând liniile una câte una. Funcția se numește PolyLine (o puteți căuta în Help).

Mai exact, un cod de forma

begin
   MoveTo(0, F(0));
   for i := 1 to 100 do
      LineTo(i, F(i));
end;

ar putea fi optimizat cu codul următor:

var lPoints: array of TPoint;
begin
   SetLength(lPoints, 101 );
 
   for i := 0 to 100 do
      with lPoints[i] do
      begin
         X := i;
         Y := F(i);
      end;
 
   Polyline(lPoints);
end;

În afară de acest lucru, restul codului este ușor de înțeles, fiind și parțial comentat. Sursa este scrisă în Delphi 7, dar probabil că va compila și cu alte versiuni de Delphi (mai vechi sau mai noi).

Download : Sursa :: Executabil :: Screenshot

Comentarii, bug-uri, sugestii : binevenite. Also, partea grafică a programului m-a interesat doar din punctul de vedere al graficelor, deci … știu că poate fi îmbunătățit designul.

 

14

aug

2009

Iron SRWare

By DarkByte. Posted in IT thingies | No Comments »

SRWare Iron is a real alternative [to Chrome]. The browser is based on the Chromium-source and offers the same features as Chrome – but without the critical points that the privacy concern.

Am găsit, recent, o alternativă pentru Chrome care se laudă a fi egalul acestuia, exceptând colectarea datelor private ale utilizatorilor.

Iron SRWareÎl folosesc de mai bine de două săptămâni şi pot spune că-mi place. Chiar are aceleaşi posibilităţi ca şi Chrome (fiind bazat pe sursa acestuia, nu e mare mirare), dar (şi poate e doar o impresie) parcă se mişcă mai rapid.

Aruncaţi şi voi o privire, poate vă interesează.

SRWare Iron – The Browser of the Future

 

9

iun

2009

Skullboxing …

By DarkByte. Posted in IT thingies, Opinii | 6 Comments »

Contrar aparenţelor, nu vreau să descriu vreun sport nou de contact. Nici măcar unul vechi. De fapt, singurul sport la care mă refer e cel al neuronilor supraîncărcaţi şi al degetelor care ating Mach 2. Ringul este un locşor agăţat pe Internet care găzduieşte de ceva timp o comunitate de oameni bine intenţionaţi care vor să înveţe informatică, să predea altora din ceea ce ştiu şi, nu în ultimul rând, să se asigure că, indiferent de cantitatea de cunoştinţe acumulate, fiecare se va simţi @home.

La început, a fost Internetul.

 

14

dec

2008

Tag-cloud

By DarkByte. Posted in IT thingies | 5 Comments »

Am găsit zilele trecute o chestie drăguţă, numai bună de adăugat pe blog. Cu ajutorul şi asistenţa lui misssun, l-am înţeles şi l-am asignat propriilor interese.

Sper să vă placă şi vouă.

[WP-CUMULUS]

Îl găsiţi, momentan, în varianta mică (şi modificată) în sidebar, afişând categoriile şi câteva linkuri care am considerat eu că merită această favoare happy

See ya later winking

 

20

iul

2008

Window Spy

By DarkByte. Posted in Delphi | 8 Comments »

Win 32 APIProbabil că ştiţi că în Windows totul se bazează pe ferestre … era destul de evident, nu ?

Să vedem cum am putea afla câte ceva legat de ferestrele vizibile şi cum am putea să le ascundem, să le dezactivăm, etc, totul din Borland Delphi, folosind funcţii API.Borland Delphi 7

Pentru început, să vedem cum aflăm ce fereastră avem sub cursorul de mouse.

Pentru asta ne trebuie să ştim poziţia cursorului, care se poate afla folosind funcţia GetCursorPos, din care putem afla handle-ul ferestrei de sub cursor, folosind funcţia WindowFromPointSă vedem nişte cod.

var hWindow  : Longint;
    P : TPoint;
  ...
  GetCursorPos(P);
 
  hWindow := WindowFromPoint(P);

Destul de simplu, nu ? În variabila hWindow avem acum handle-ul care ne interesează.
Pentru a “vedea” în timp real ce fereastra e sub cursor, punem codul acesta într-un TTimer.

Să vedem cum afişăm informaţiile găsite, cum ar fi titlul ferestrei, clasa ferestrei (adică tipul componentei) şi handle-ul asociat părintelui ei, din TTimer. Pentru asta avem nevoie (în cazul acesta) de patru TEdit-uri.

procedure TForm1.Timer1Timer(Sender: TObject);
var hWindow  : Longint;
    P : TPoint;
    buff : Array[0..255] of char;
begin
  GetCursorPos(P);
 
  hWindow := WindowFromPoint(P);
  Edit2.Text := '$' + IntToHex(hWindow, 8);
 
  GetWindowText(StrToInt(Edit2.Text), Buff, 255);
  Edit1.Text := Buff;
 
  GetClassName(StrToInt(Edit2.Text), Buff, 255);
  Edit3.Text := Buff;
 
  If GetParent(StrToInt(Edit2.Text)) > 0
    then Edit4.Text := '$' + IntToHex(GetParent(StrToInt(Edit2.Text)), 8)
    else Edit4.Text := 'None';
end;

GetWindowText returnează titlul ferestrei (sau textul din fereastră, dacă e vorba de un TEdit), GetClassName returnează tipul componentei, iar GetParent handle-ul părintelui. Simplu, nu ? happy

Păcat că momentan tot ce aflăm sunt lucruri destul de puţin importante şi deloc atrăgătoare. Nişte numere şi ceva text care oricum se vedea şi fără un asemenea program. Să încercăm ceva mai atrăgător.

Pentru început vom ascunde / reafişa fereastra, apelând funcţia ShowWindow, care are nevoie de doi parametri: handle-ul ferestrei şi un parametru care specifică dacă vrem să afişăm sau să ascundem fereastra.

Afişare fereastră:

ShowWindow(wHandle, SW_SHOW);

Ascundere fereastră:

ShowWindow(wHandle, SW_HIDE);

Alt lucru care-l putem face : vom seta ca fereastra selectată să devină fereastră de top-level şi înapoi. Pentru acest lucru vom folosi funcţia SetWindowPos pentru a ne defini o procedură apelabilă cu un parametru de tip Boolean care să ştie modifica stilul ferestrei în ambele moduri, al doilea parametru fiind handle-ul ferestrei care vrem s-o modificăm.

procedure SetTop(Top : Boolean; Handle : HWnd);
Begin
  If Top
    Then
      Begin
        SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
                     SWP_SHOWWINDOW + SWP_NOMOVE + SWP_NOSIZE);
        SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0,
                     SWP_SHOWWINDOW + SWP_NOMOVE + SWP_NOSIZE);
      End
    Else SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0,
                      SWP_SHOWWINDOW + SWP_NOMOVE + SWP_NOSIZE);
End;

Acum nu mai avem decât să apelăm procedura asta din butonul corespunzător.

Ştiind handle-ul ferestrei, o putem şi activa / dezactiva folosind EnableWindow, care necesită specificarea handle-ului ferestrei şi un parametru logic care determină activarea / dezactivarea ei.

Codul pentru cele şase butoane de până acum:

procedure TForm1.bShowClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  ShowWindow(hWindow, SW_SHOW);
end;
 
procedure TForm1.bHideClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  ShowWindow(hWindow, SW_HIDE);
end;
 
procedure TForm1.bTopClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  SetTop(True, hWindow);
end;
 
procedure TForm1.bPotClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  SetTop(False, hWindow);
end;
 
procedure TForm1.bEnableClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  EnableWindow(hWindow, True);
end;
 
procedure TForm1.bDisableClick(Sender: TObject);
begin
  hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));
  EnableWindow(hWindow, False);
end;

Probabil că aţi remarcat linia

hWindow := HexToInt(Copy(Edit2.Text, 2, Length(Edit2.Text) - 1));

, despre care nu am scos nici un cuvânt până acum. Este inversa funcţiei IntToHex din Delphi, şi este definită mai jos.

function HexToInt(S : String): Longint;
var B : Byte;
    C : Char;
Begin
  Result := 0;
  s := UpperCase(s);
  For B := 1 To Length(s) Do
    Begin
      Result := Result * 16;
      c := S[B];
      Case c Of
        '0'..'9': Inc(Result, Ord(c) - Ord('0'));
        'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
        Else
          Begin
            Result := 0;
            Exit;
          End;
      End;
    End;
End;

Puteam folosi variabila hWindow ca variabilă globală şi atunci scăpam de nevoia folosirii acestei funcţii, nu ? Dar ce se întâmpla dacă la utilizarea programului se voia reafişarea unei ferestre căreia îi ştim handle-ul ? În acest fel tot ce avem de făcut este editarea celei de-a doua căsuţe text cu handle-ul respectiv şi putem face orice, altfel putând lucra doar cu ferestrele vizibile pe ecran.

Cam acesta ar fi codul necesar pentru o mini-aplicaţie de lucru cu ferestrele … dar stai … e o problemă … dacă verificarea ferestrei de sub mouse se face în timp real, înseamnă că … da, dacă selectez butonul de “ascundere fereastră”, îmi va ascunde tocmai respectivul buton. Damn, nu e bine.

Trebuie să programăm o metodă de a opri scanarea ferestrelor în timp real, o dată ce am selectat fereastra cu care vrem să lucrăm, fără să mişcăm mouse-ul. Pentru asta ne vom defini o combinaţie de taste globală, folosind funcţia RegisterHotKey, care primeşte patru parametri: handle-ul ferestrei căreia să-i trimită mesaj în caz că s-a apăsat combinaţia noastră de taste, un identificator pentru combinaţie, definit de noi, şi combinaţia de taste, definită prin doi parametri – primul, care defineşte dacă tastele CTRL, ALT, SHIFT sau WIN sunt apăsate, şi al doilea, care defineşte o tastă normală (cum ar fi “R” ). Apelul funcţiei, pentru a ne defini combinaţia CTRL + F8, este :

const StopKey = 100000;
  ...
  RegisterHotKey(Handle, StopKey, MOD_CONTROL, VK_F8);

Această linie trebuie apelată chiar la începutul rulării programului, în FormCreate.
Atenţie : StopKey este o constantă ce trebuie definită global, înaintea secţiunii implementation.

Pentru a fi anunţaţi când este apăsată combinaţia noastră de taste ne vom defini o procedură care să primească mesajul trimis de sistem, interceptând mesajul WM_HOTKEY.

type
  TForm1 = class(TForm)
  ...
  private
    { Private declarations }
    procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
 ...

Codul procedurii :

procedure TForm1.WMHotKey(var Message: TMessage);
begin
  If Message.WParam = StopKey
    Then Timer1.Enabled := not Timer1.Enabled;
end;

Practic, la fiecare apăsare a combinaţiei, TTimer-ul nostru se va opri / reporni. Pentru a nu lăsa mizerie după rularea programului, va trebui să distrugem această combinaţie de taste la oprire. Pentru acest lucru, în FormCloseQuery vom apela :

  UnregisterHotKey(Handle, StopKey);

Cam asta ar fi tot codul.

Pentru a nu vă pune să lucraţi cu copy / paste şi să vă faceţi griji de componente şi asignări de evenimente, aveţi mai jos sursele şi executabilul arhivate.

Download : Sursa :: Executabil