Scopul vieții – cu grafic :-)

Ziceam anterior că eu nu cred că universul și viața au un sens (sau scop) precis: aleg să cred așa pentru că din punctul meu de vedere aceasta este cea mai simplă ipoteză. (Și îmi place simplitatea.)

Totuși, pentru că noi, oamenii (și posibil și alte lighioane), simțim că avem (măcar puțin) liber arbitru (dar mai ales pentru că n-am învățat nimic la filosofie și trebuie să scriem ceva la exteu*), hai să definim un scop frumos – fie el și iluzoric – pentru viață.

* Am scris o compunere similară – deși mult mai lungă și mai înflorită – în clasa 12-a la o lucrare de control reală; și am mai și povestit despre subiect și unora sau altora dintre apropiați, așadar trebuie să îmi cer scuze de la cunoscători pentru postul duplicat.

Pe scurt, aș zice că scopul vieții individului este o problemă de optimizare: aceea a maximizării ariei subgraficului funcției fericirii acestuia.

Viata

Revenind însă la funcția individuală†, trebuie să acceptăm că de obicei ne descurcăm foarte bine să interpretăm nefericirea și ne e greu să cuantificăm direct fericirea, așa că mai bine s-o descriem pe aceasta din urmă ca fiind, de fapt, lipsa primeia. Iar atunci problema este de minimizare a ariei supragraficului funcției, respectiv minimizarea nefericirilor.

Putem poate extrapola ideea la nivel de specie, sau chiar pentru viața universală, însumând, ponderat sau nu, ariile individuale prezente și probabilistic viitoare, luând eventual în calcul și un aport suplimentar adus de… înmulțiria indivizilor. 🙂

Așa că let’s just do what (we believe that) we please, conștientizând că durata absolută a vieții e doar una dintre cele două componente de care depinde aria subgraficului, nivelul fericirii (sau al nefericirii) momentane parând a fi la fel de important!

(Dar da, totul depinde și de raportul aspect considerat: timpul și fericirea nu au aceeași unitate de măsură. Fiecare e liber să aleagă scalarea.)

Advertisements
Posted in Sănătate și întreținere | Leave a comment

Introducere în programare: limbajul Basic – mini-tutorial în limba română

brunette woman in red with girl in yellow on lap before laptop

Fotografie de Pixabay pe Pexels.com

Aveți nevoie de puțin ajutor pentru a le arăta copiilor Dvs. ce înseamnă programarea computerelor? Sau chiar Dvs. vreți să vedeți despre ce-i vorba? Vă recomand călduros, pentru început, limbajul BASIC. Unii susțin că Scratch e mai potrivit, dar eu simt că pasiunea, dacă este să apară, are șanse mult mai mari la tastatură!

(Disclaimer: e posibil totuși ca noile generații să aibă sinapsele formate altfel – nu zic mai bine, nici mai rău, doar diferit, dată fiind apartenența acestora la era smartphone-ului – iar atunci habar n-am dacă se mai susține presupunerea mea, dar anyway…)

Pentru Basic, veți avea nevoie de un tool – o aplicație – care să vă ajute să comunicați cu mașina Dvs. utilizând limbajul ales. Un tool cu care să vă jucați! Vă propun, de exemplu, să descărcați și să folosiți PC-BASIC (pentru Windows sau Mac) – un interpretor de Basic similar cu GW-BASIC-ul din MS-DOS din anii ’90. Nu vă fie însă teamă că e prea vechi: odată ce ați deprins conceptele de bază, veți evolua rapid – veți scrie în curând cod la nivelul mileniului 3, veți folosi în curând multe alte unelte și tehnologii noi!

(Un pic de engleză n-ar strica, dar – dacă nu e să fie – puteți să rețineți comenzile și mot-a-mot: nu va fi nevoie să rețineți foarte multe. Cel mai important este însă să vreți să învățați. Iar copiii să nu fie presați – spuneți-le că va fi distractiv, nu ca la școală!)

Actualizare: Google oferă wwwbasic (open source), un tool de scripting ce permite definirea de pagini Web utilizând un subset de Basic. How cool is that!

Am scris acest mini-tutorial pentru că nu am găsit (n-am știut să caut?) unul printabil în limba română. Pentru a lucra puțin cu copiii mei, dar și să li-l pot lăsa lângă laptop ca referință. (Și îl public cu speranța că va fi de folos și altora!)

Dar gata cu atâta introducere la introducere. Hai, mai bine, să începem! 🙂

PRINT

Deschideți interpretorul (aplicația PC-BASIC) . Vă va întâmpina cu indicatorul “Ok”. Aceasta înseamnă că mediul de lucru este pregătit să vă “asculte” comenzile. Tastați următoarea linie, urmată de Enter (tasta Enter sau Return specifică faptul că ați terminat de introdus comanda, iar computerul o poate executa):

PRINT "Salut"

Computerul va afișa mesajul “Salut” pe următoarea linie de pe ecran (fără ghilimele). De ce? Pentru că așa i-ați cerut: comanda PRINT îi cere să afișeze mesajul respectiv (dintre ghilimele) pe ecran. (Operația se mai numește uneori tipărire.)

Încercați acum puțină aritmetică:

PRINT (1 + (3 - 2.5)) * 4 / 5

Interpretorul va face calculele și va afișa imediat rezultatul (asteriscul înseamnă înmulțire, slash-ul înseamnă împărțire, pentru virgula zecimală se folosește… punctul, iar parantezele pot schimba, desigur, ordinea operațiilor):

1.2

Putem afișa și un mesaj de prezentare pe lângă rezultat, separând argumentele comenzii PRINT cu simbolul punct și virgulă (dacă nu dorim niciun spațiu între valorile afișate) sau cu virgulă (dacă vrem o separare spațială – o tabelare – între cele două):

PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5

Notă: dacă vă place mai mult, în loc de PRINT puteți folosi un semn de întrebare:

? "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5

LOCATE

Dacă doriți să scrieți pe ecran la o anumită poziție, folosiți înainte de PRINT comanda LOCATE, scrisă fiind în aceeași linie de executat și separând-o de PRINT cu simbolul două puncte:

LOCATE 13,25 : PRINT "Salut, pe la mijlocul ecranului!"

De reținut: implicit ecranul afișează 25 de rânduri a 80 de caractere fiecare, numerotate de la 1; comanda SCREEN (pe care nu o descriu în detaliu) poate fi utilizată pentru a obține alte rezoluții sau chiar suport pentru grafică!

COLOR

Atunci când nu doriți să folosiți culoarea standard pentru afișările Dvs., puteți schimba culoarea textului care urmează a fi tipărit utilizând instrucțiunea COLOR:

COLOR 14 : PRINT "Galben"

Culoarea implicită este un alb închis (7). Culorile se formează în felul următor:

  • 0 = negru
  • 1 = albastru închis
  • 2 = verde închis
  • 3 = verde & albastru închis = cyan închis
  • 4 = roșu închis
  • 5 = albastru & roșu închis = violet închis
  • 6 = verde & roșu închis = maro
  • 7 = albastru + verde + roșu închis = alb închis
  • 8 = negru deschis = gri
  • 9-13 = ca și 1-6 dar culori deschise (mai luminoase)
  • 14 = maro deschis = galben
  • 15 = albastru + verde + roșu deschis = alb
  • 16-31 = ca și 0-15 dar… clipitoare!

BEEP

Hmm… Poate ar fi frumos să fim anunțați și printr-un sunet că s-a efectuat un calcul, sau că s-a afișat ceva important, nu? Putem adăuga comanda BEEP, de apelat după afișarea rezultatului dar tot în aceeași linie de executat:

PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5 : BEEP

Linii de cod și RUN

Interesant ce am realizat până acum, dar nu-i așa că nu vom putea scrie un program lung într-o singură linie, separând comenzile cu simboluri două puncte? Soluția este numerotarea liniilor de cod, la începutul lor, în felul următor:

1 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5
2 BEEP
RUN

Dacă numerotați liniile introduse, computerul nu le va executa la apăsarea tastei Enter, ci le va memora până când (fără un număr de linie) introduceți comanda RUN.

LIST

După execuție, programul rămâne în memorie (și poate fi executat de oricâte ori dorim executând din nou comanda RUN). Pentru a ne asigura că este disponibil, putem, de asemenea, să rulăm comanda:

LIST

Rezultatul acesteia va fi reafișarea programului:

1 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5
2 BEEP

RENUM și inserarea de linii de cod

Să spunem acum că dorim să mai afișăm un mesaj, de “La revedere”, imediat după rezultatul calculului de mai sus, dar înainte de emiterea sunetului de alertă. Problema noastră este că n-am numerotat liniile cu un pas intermediar, de exemplu din 10 în 10, cum ar fi fost mai util (Basic execută liniile în ordinea numerelor lor, nefiind necesar să existe toate numerele de linie dintre primul și ultimul). Dar există o soluție – comanda:

RENUM

Această comandă renumerotează liniile programului din memorie cu pasul 10. Putem observa aceasta dacă exectuăm comanda LIST despre care am discutat anterior:

LIST
10 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5
20 BEEP

Acum este simplu să introducem o linie intermediară între 10 și 20, de exemplu așa (nu trebuie să fie pe ecran între cele două, ci poate fi introdusă la final, după Ok: sistemul o va memora la locul ei):

15 PRINT "La revedere!"

Un nou apel LIST prezintă situația finală:

LIST
10 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5
15 PRINT "La revedere!"
20 BEEP

Dacă dorim, putem executa și un RENUM suplimentar pentru a fi pregătiți pentru (mai multe) noi insert-uri:

RENUM
LIST
10 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5
20 PRINT "La revedere!"
30 BEEP

DELETE și REM

În fine, dacă vreți acum să renunțați la una dintre liniile de mai sus folosiți comanda DELETE, specificând numărul liniei sau intervalul de eliminat:

DELETE 20-30
LIST
10 PRINT "Rezultatul este:", (1 + (3 - 2.5)) * 4 / 5

Sau, dacă nu vreți să ștergeți definitiv liniile, adăugați REM (de la remove) între numărul de linie și codul propriu-zis, operație numită și comentare, pentru că, de fapt, utilizând REM puteți introduce orice conținut (de exemplu, pentru a ajuta la înțelegerea logicii programului):

20 REM PRINT "La revedere!"
25 REM Am comentat linia anterioara.

SAVE, LOAD și NEW

Văd că începem să scriem programe tot mai lungi. Dar ne dăm seama repede că, dacă am închide interpretorul, toate datele (respectiv întreg programul aflat în memorie) s-ar pierde! Trebuie cumva să-l putem “salva” până data viitoare, când vom dori să-l reîncărcăm. Comenzile SAVE (pentru salvare) și LOAD (pentru reîncărcare) ne vor fi de ajutor:

SAVE "Prog1"
LOAD "Prog1"

Comanda SAVE scrie programul curent într-un fișier cu extensia .bas (de la Basic) pe computer (în folderul curent, de obicei, pe PC, C:\Users\Utilizator). Numele fișierului trebuie să aibă maximum 8 caractere alfanumerice (specificate între ghilimele). Comanda LOAD încarcă ulterior programul din fișierul cu numele specificat înapoi în memorie.

Sigur, după SAVE trebuie să putem curăța rapid memoria (fără să închidem interpretorul). Pentru aceasta trebuie doar să utilizăm comanda:

NEW

Dacă veți încerca LIST după NEW veți vedea că nu mai există în memorie nicio linie din programul scris anterior și salvat cu SAVE, dar dacă rulați LIST iarăși după LOAD, toate liniile de cod vor fi revenit “la viață”, putând fi rulate din nou, oricând, cu un nou RUN.

Variabile numerice

Până acum am tipărit rezultatul unei expresii matematice scrisă direct cu numere. Totuși, pentru a fi mai citibil, codul poate folosi variabile (notate cu litere) care pot avea diferite valori la diferite momente de timp, valori ce pot fi inițializate cu comanda LET.

10 LET A = 3 - 2.5
20 LET B = 1 + A
30 LET Rezultat = B * 4 / 5
40 PRINT Rezultat

Notă: dacă vă place mai mult fără, să știți că LET poate lipsi – Basic îl subînțelege:

10 A = 3 - 2.5
20 B = 1 + A
30 Rezultat = B * 4 / 5
40 ? Rezultat

Sigur, dacă o variabilă avea deja o valoare, comanda LET o va actualiza, cea anterioară fiind pierdută (dacă nu a fost în prealabil stocată în altă parte, respectiv într-o altă variabilă).

O actualizare interesantă a valorii unei variabile se referă la incrementarea acesteia sau, în general, la modificarea variabilei utilizând vechea sa valoare într-o expresie din dreapta semnului egal.

50 B = B + 1

De reținut: semnul egal, atunci când este folosit în contextul instrucțiunii LET, nu indică egalitate matematică, ci atribuire de valoare! (În unele limbaje de programare se folosește un alt operator pentru atribuire, precum două puncte-egal := în Pascal, cu scopul obținerii unei diferențieri mai mari între verificarea egalității dintr-o expresie cu valoare de adevăr – vezi IF-THEN-ELSE mai jos – și atribuire, dar în Basic diferențierea este pur contextuală.)

Șiruri de caractere

Variabilele de mai sus au valori numerice, dar dacă le definim cu un semn dolar $ în coada numelor acestora, vor avea tipul șir de caractere, valorile lor fiind definite în program între ghilimele:

35 Mesaj$ = "Rezultatul este:"
40 ? Mesaj$, Rezultat

INPUT

Până acum am folosit doar variabile cu valori definite din cod, dar marele avantaj al calculatoarelor este că pot interacționa cu noi și invers, întrebându-ne, la rândul lor, câte ceva când programul are nevoie de input uman (de fapt, tot la cererea noastră prealabilă).

Putem cere computerului să ne întrebe o valoare pentru o variabilă utilizând comanda INPUT (mesajul de afișat fiind opțional, dar foarte util):

10 INPUT "Introduceti valoarea lui A: "; A

Dacă veți rula acum programul listat mai jos veți vedea că valoarea lui A poate fi introdusă de la tastatură la runtime. Și poate fi alta, ori de câte ori rulați din nou programul, obținându-se un alt rezultat!

10 INPUT "Introduceti valoarea lui A: "; A
20 B = 1 + A
30 Rezultat = B * 4 / 5
35 Mesaj$ = "Rezultatul este:"
40 ? Mesaj$, Rezultat

Și da, v-ați prins. Puteți cere de la tastatură și valori de tip șir de caractere:

4 INPUT "Cum va numiti? "; Nume$
6 PRINT "Salut, "; Nume$

IF-THEN-ELSE

Știm acum să ne definim variabile, știm să le cerem valoarea de la tastatură, știm să facem calcule și să depozităm rezultate în alte variabile, apoi să afișăm rezultate, așa că e timpul să permitem programelor noastre să ia și niște decizii! Nu chiar de capul lor, mai degrabă după cum specificăm noi.

Utilizând IF-THEN-ELSE (care înseamnă dacă-atunci-altfel) putem scrie cod condițional, respectiv părți de program care să fie executate doar dacă o anumită condiție e îndeplinită.

De exemplu, putem cere două numere de la tastatură (pentru a accepta mai multe valorile la execuția unei singure instrucțiuni INPUT utilizatorul va trebui să le introducă pe același rând, separate de virgulă), apoi să-i spunem utilizatorului care este cel mai mare, comparându-le:

NEW
10 INPUT A, B
20 IF A > B THEN PRINT A; " este mai mare"
   ELSE IF B > A THEN PRINT B; " este mai mare"
        ELSE PRINT "Numerele sunt egale"

Notă: linia 20 din program nu trebuie împărțită pe mai multe rânduri, este scrisă așa doar pentru mai buna înțelegere a felului în care se construiesc ramificațiile.

Fiecare IF de mai sus are, pe lângă condiția de verificat, clauze THEN și ELSE, indicând ce trebuie să se întâmple în diferitele cazuri, iar IF-urile pot fi imbricate. Luați-vă puțin timp și analizați atent cele de mai sus pentru a înțelege bine situația.

Sigur, ELSE-ul este opțional. De exemplu, poate dorim să verificăm doar egalitatea numerelor, în loc să le comparăm, și să nici nu facem ceva în caz contrar:

20 IF A = B THEN PRINT "Numerele sunt egale"

Atenție: semnul egal din cadrul expresiei Booleene (cu valoare adevărat sau fals) utilizate mai sus nu indică atribuire, respectiv valoarea lui A nu va deveni egală cu cea a lui B (precum se întâmplă în contextul instrucțiunii LET discutate anterior), aici doar verificându-se egalitatea matematică a valorilor lor.

În fine, trebuie să menționăm că putem folosi operatorii AND (însemnând și), respectiv OR (sau) în cadrul condițiilor IF, pentru a compune valori de adevăr. De exemplu, pentru a verifica dacă A este egal cu B dar și cu C, putem formula:

20 IF A = B AND A = C THEN PRINT "A, B si C au aceeasi valoare"

FOR-NEXT

Să zicem apoi că ne dorim să repetăm o porțiune de cod de mai multe ori, iterând automat o variabilă de la o valoare la alta. Putem face aceasta utilizând o buclă FOR:

30 FOR I = 1 TO 10
40   IF A + I = B THEN PRINT A; "+"; I; "="; B
50 NEXT

În cadrul buclei FOR de mai sus variabila I merge de la 1 la 10 din 1 în 1 (dacă vreți să meargă din 2 în 2, de exemplu, adăugați STEP 2: FOR I = 1 TO 10 STEP 2.) Și pentru fiecare valoare a lui I dintre 1 și 10 se verifică expresia A + I = B. Numai dacă este adevărată se afișează A+I=B, cu valorile lor.

Notă: dacă imbricați FOR-uri puteți folosi NEXT I în loc de simplu NEXT, așa încât codul să fie mai clar.

Spațiile care indică liniile imbricate sunt opționale, dar pot ajuta la înțelegerea codului. Chiar și Dvs., cel sau cea care scrie codul, îl va găsi mai ușor de citit și reînțeles peste un an, de exemplu (se întâmplă uneori – de fapt, deseori – să trebuiască!)

În fine, ca de obicei, în liniile imbricate puteți scrie mai multe comenzi în aceeași linie separându-le cu simboluri două puncte, inclusiv o întreagă altă buclă FOR:

30 FOR I = 1 TO 100 STEP 10
40   FOR J = 1 TO 5 : IF A + I + J = B THEN PRINT I, J : NEXT J
50 NEXT I

WHILE-WEND

Dacă nu știți de câte ori trebuie repetată o porțiune de cod, ci totul depinde de îndeplinirea unei condiții (ca la IF), puteți folosi altă buclă în loc de FOR, și anume, WHILE-WEND:

10 I = 2
20 WHILE I < 100
30   PRINT I
40   I = I * 2
50 WEND

Ce va afișa programul de mai sus? (Ați ghicit, puterile lui 2, mai mici decât 100.)

Apropo, pentru ridicarea la putere puteți folosi operatorul ^: PRINT 2 ^ 3. (Simțiți-vă privilegiați: nu multe limbaje definesc un asemenea operator!)

DIM

Când avem mai multe variabile într-un set e mai ușor să lucrăm cu un așa numit tablou de valori în loc să denumim fiecare variabilă. Adică în loc de:

10 A1 = 2
20 A2 = 4
30 A3 = 8
40 A4 = 16

Putem defini un tablou de dimensiune 4 (avem 4 valori) și apoi putem folosi valorile simplu, utilizând indicele după numele tabloului:

10 DIM A(4)
20 FOR I = 1 TO 4
30   A(I) = 2 ^ I
40 NEXT
50 INPUT "A câta putere a lui 2 doriți să fie afișată (1-4)"; P
60 PRINT A(P)

DATE$ și TIME$

Deja putem scrie programe complexe și vom ajunge repede la nevoia de a folosi data și ora computerului. Pentru a le obține, ca valori de tip șir de caractere, folosim DATE$ și TIME$:

10 CLS
20 LOCATE 1,1
30 PRINT DATE$, TIME$
40 GOTO 20

Rețineți că sunt prezentate în format pseudo-american (lună-zi-an, orar 24h):

PRINT DATE$
05-26-2018
PRINT TIME$
20:06:58

MID$

Puteți extrage valori dintr-un șir de caractere utilizând funcția MID$ – exemplul de mai jos afișează minutul curent (indicii în șirul de caractere pornesc de la 1, deci trebuie să începem de la al 4-lea caracter, iar dimensiunea noului șir trebuie să fie de 2 caractere – ne bazăm și pe faptul că orele mai mici ca 10 sunt afișate cu un 0 în față, de ex. 08:06:58):

PRINT MID$(TIME$, 4, 2)

VAL și STR$

Pentru a converti valori șir de caractere în valori numerice și invers, folosiți funcțiile VAL și respectiv STR$:

Min = VAL(MID$(TIME$, 4 ,2))
Mesaj$ = "Este minutul " + STR$(Min)

RND și RANDOMIZE (TIMER)

Uneori aveți nevoie de numere la întâmplare. Pentru aceasta folosiți funcția RND, care returnează un număr aleatoriu de la 0 (inclusiv) la 1 (exclusiv). Puteți deci să le înmulțiți, pur și simplu, cu numărul până la care doriți să fie rezultatul:

10 PRINT RND*15

Atenție însă, programul de mai sus va afișa aceeași valoare la fiecare rulare. Pentru a rezolva aceasta, folosiți inițializarea generatorului de numere aleatorii, RANDOMIZE, care poate fi inițializat pe baza orei sistemului (funcția TIMER returnând numărul de secunde trecute de la miezul nopții):

10 RANDOMIZE TIMER
20 PRINT RND*15

FIX

Dacă doriți un număr întreg în locul unuia real folosiți FIX (pentru simpla eliminare a părții zecimale). În exemplul următor vom obține întotdeauna un număr întreg între 1 și 15 (inclusiv):

20 PRINT 1+FIX(RND*15)

GOTO

Multe limbaje de programare suportă, dar nu recomandă folosirea instrucțiunii GOTO, care mută execuția la o linie de cod specificată. Totuși, pentru că în Basic (cel puțin în variantele mai vechi, precum GW-ul) IF-ul nu are final specificabil, cum are, de exemplu, WHILE sub forma lui WEND, GOTO poate fi însă foarte util:

40 INPUT "Introduceti un numar pozitiv", A
50 IF A <= 0 GOTO 40

De remarcat: în cazul lui IF cu GOTO, nu mai avem nevoie de THEN, deși la nevoie putem totuși folosi ELSE! (Nimic nu ne oprește însă să inserăm și-un THEN dacă așa vrem.)

END

În fine, dacă dorim să terminăm un program înainte de a fi ajuns la ultima sa linie, putem folosi instrucțiunea END (oriunde în cadrul codului):

50 IF A < 0 THEN END

Dar programarea însăși nu trebuie să se termine niciodată: deși mini-tutorialul nostru a ajuns la [pen-]ultimul paragraf, vă închipuiți deja că limbajul Basic e mult mai mult decât atât. Și că mai sunt multe alte limbaje de programare interesante, precum Pascal, Java, C#, Python sau Swift, ca să enumăr doar câteva dintre cele care mi-au plăcut sau îmi plac mie mai mult, pe care sigur veți dori să le studiați și pe care sigur le veți aprecia și voi. Iar cum noi tehnologii (hardware și) software apar mereu – așa e legea firii – vă garantez că nu veți reuși să vă plictisiți dacă veți merge mai departe în această direcție!

De fapt, cum ați avut răbdare și ați ajuns până în acest punct, cred că nu veți putea nicicum să vă opriți aici: Web-ul este plin de informații și în domeniul IT excelează (cel puțin dacă presupunem cunoscută limba engleză). Vă recomand deci să continuați pe cont propriu (dar dacă aveți totuși întrebări sau propuneri pentru articole viitoare din partea mea, scrieți-mi, în Comentarii, mai jos – voi încerca să răspund cât pot de repede.) Mult success tuturor!

Posted in Computere și Internet | Tagged , , , , | Leave a comment

I-NO-vații

Ce s-a mai întâmplat cu Surface Dial? Îl folosește cineva? Microsoft l-a lansat cu atâta fast când au prezentat Studio-ul.

Dar cu Touch bar-ul de la Apple? Am oare doar impresia că până la urmă ăsta din urmă e mai util/utilzat?

Deși aud că developerii (3rd party) nu s-au înghesuit în nicio direcție (dintre cele două)…

Posted in Computere și Internet | Tagged , , | Leave a comment

Design new software products to

  1. load and run fast;
  2. look great;
  3. offer intuitive experiences, and always remain highly responsive;
  4. include consistent sets of basic, yet flawless, features;
  5. differentiate themselves by offering some bold, unique, and special aspects.
Posted in Computers and Internet | Leave a comment

Sondaj

Presupunem că vă numiți A. Partenerul Dvs. este B. Primul vostru copil se numește C, iar cel de-al doilea D. Ați adunat fotografii de-a lungul timpului. Cum arată structura folderului în care le stocați? 🙂

1. Haos (AI to the rescue)

  • A.jpg
    A2.jpg
    B.jpg
    B2.jpg
    Împreună.jpg
    Împreună2.jpg
    C.jpg
    C2.jpg
    Împreună3.jpg
    Împreună4.jpg
    D.jpg
    D2.jpg
    Împreună5.jpg
    Împreună6.jpg

2. Un nivel de subfoldere (dar găsesc relativ ușor ce vreau)

  • Eu
    • 1.jpg
      2.jpg
  • B
    • 1.jpg
      2.jpg
  • C
    • 1.jpg
      2.jpg
  • D
    • 1.jpg
      2.jpg
  • Împreună
    • 1.jpg
      2.jpg
      3.jpg
      4.jpg
      5.jpg
      6.jpg

3. Organizat la sânge (chiar n-am găsit un loc mai bun pt 3-4.jpg?)

  • Eu
    • 1.jpg
      2.jpg
  • B
    • 1.jpg
      2.jpg
    • Împreună
      • 1.jpg
        2.jpg
  • Copii
    • C
      • 1.jpg
        2.jpg
    • D
      • 1.jpg
        2.jpg
    • Împreună
      • 1.jpg
        2.jpg
        3.jpg
        4.jpg
Posted in Computere și Internet | Leave a comment

Hey, don’t like me too much

… (indirectly) says Apple.

Longer story: a friend pointed me to the post linked above, indicating that Apple has recently discontinued AirPort product line, a series or wireless routers with extra user-oriented features that they had been offering for years.

So what, you might say. And what’s with this blog post title then? Let me explain:

Personally, I’ve only tested (and still actively using) an AirPort Express myself, and – frankly – only for wireless routing per se, but in my opinion the small device was (and is) a lot better than other “more powerful” known routers, including some Cisco equipment that I’ve considered some time ago (when I needed a small network upgrade.)

Of course, this all depends on the definition of “better”: I deeply appreciate AirPort‘s easiness of setup and use, and its high reliability (obtained by simply offering no “extreme networking” features like those pushed by competition.) And I am still going to use the device until it dies naturally or until technology changes and forces me to shift.

So should I feel disappointed that Apple decided to stop working on these great products and would sell no more AirPort devices in the future? Especially as (wireless) networking is so important for anyone nowadays?…

Well, I think I would feel that way only if I didn’t understand that Apple is eventually just a business, and not a religion.

After being too much (and possibly for too long) only into Microsoft technologies myself (where completeness was kind of implied), this way – i.e. not feeling sadness when Apple discontinued a nice product – I could really prove to myself that I’ve definitely not just switched into another closed boat jumping from the Redmond’s one.

I admit that I do like Apple devices and services, but – hooray – I am really technically agnostic now! And it seems to me that Apple wants to ensure everybody remains agnostic – and therefore “tech-healthy” – as well: by removing products that simply don’t bring enough benefits to them (like AirPort now, or like some important dev and infra features of MacOS Server a few months ago) and by not bothering to create missing services whenever they don’t feel like it, simply leaving more space for competition (or – sometimes – ugly workarounds) instead.

Posted in Computers and Internet | Tagged , , | Leave a comment

Unu: ăla nervos; sau una: aia nervoasă

photo of a woman thinking

Fotografie de bruce mars pe Pexels.com

Un articol din 2007 (pe care l-am găsit din întâmplare – de fapt, căutând aiurea pe net o poză de genul ăsta cu un programator de noapte pentru o glumă lame) m-a inspirat să propun următoarele (încerc să fiu scurt, veți înțelege însă totul dacă citiți originalul):

Dragă managere, forget agile, forget scrum, forget stand ups (yeah!) și în loc de toate astea, adună pentru proiectul tău o echipă mică (0-1 functional designers, 0-1 UX designers, 1 tester, poate niște marketing, sales, and yourself, whatever) în jurul unui singur programator bun.

Poate vei fi uimit. (Zic: “poate”; dar gândesc: “sigur”.)

Chiar de proiectul este pare așa mare! (Capul programatorului e mai ceva!)

Am văzut (și încă mă tot mir!) cum firme mari și deosebit de proaste plătesc extraordinar de mulți bani pentru echipe barosane formate în alte firme mari (un pic mai deștepte, căci preiau – și poate chiar distribuie frumos – profitul, generând însă și ele la rându-le atâta birocrație că-ți vine să-ți iei lumea în cap de le ești angajat), iar proiectele merg de parcă stau, clienții lamentându-se gen asta e, n-avem ce face, realizându-se până la urmă (în cel mai bun caz) într-un an cât ar fi putut produce un singur programator bun într-o lună!

Așa că lasă normele, uită porcăriile pe care le-ai citit, concediază (sau împrăștie oamenii și fă-ți mai multe echipe pentru proiecte paralele, eventual integrate ulterior de trupe viitoare – fiecare grup însă în jurul unui singur dev!), iar apoi lasă-l pe ăla unu nervos, anti-social sau cum o mai fi, ori pe aia una de același fel (sau pe fiecare dintre ăia unii) să-și (și să-ți) arate măreția!

PS: Ideea unui secund per proiect (backup pentru cazul în care ăla sau aia tare dispare din whatever reason) poate fi acceptabilă dacă responsabilitățile acestuia “pe timp de pace” ar fi limitate la discuții și review. Dar atât! 🙂

Posted in Organizații | Tagged , , , , , , , | 3 Comments