01:42 pm on Oct 7, 2018 | read the article | tags: howto
in this post i’ll use C to construct a maze, that will be later used for my swarm experiments.
i’ll be using a graph-model for the maze: each vertex is a room from the maze, which is connected by edges to other rooms. in a 2-D classic maze of size m×n, with m spanning from top to bottom and n spanning from left to right, each room has at most 4 neighbors. this means each vertex in my graph will have at most 4 edges: top, bottom, left and right. the total number of edges is m×(n-1) for vertical edges (top, bottom) and (m-1)×n for horizontal edges (left, right). in order to create a maze, in the previously described graph, i’ll choose using a version of Dijkstra algorithm a maximum spanning tree. to make the maze random, i’ll mark each edge with a random weight and then run the maximum spanning tree algorithm.
i’ll be using matrices as data structures. this means that each vertex will be labeled with a pair (i,j) with i from 0 to m-1 and j from 0 to n-1. as the graph is not oriented, i’ll have:
the number of required edges’ weights can be held in a m×(2×n-1)-n vector, corresponding to an incomplete m×(2×n-1) matrix.
this step is quite easy. just loop over all m×(2×n-1)-n and assign them a random value between 1 and 255. i’ll be using 0 to represent edges that are missing.
/** * the function initializes the weights matrix as described above; * @param m (int) the dimension of the maze on top-bottom axis; * @param n (int) the dimension of the maze on left-right axis; * @returns: an uint8_t matrix, of size (m-1)*2*(n-1) filled with random data; */ uint8_t * maze_weight_init (int m, int n) { /** @var maze the weight matrix */ uint8_t * maze; /** @var c is a variable index */ int c; /** i reserve the space in the computer memory for the matrix */ maze = (uint8_t *) malloc ((m * (2 * n - 1) - n) * sizeof (uint8_t)); /** if memory reservation is successful, i'm filling the matrix */ if (maze != NULL) for (c = 0; c < m * (2 * n - 1) - n; c++) *(maze + c) = (uint8_t) ((1 + rand ()) % 256); return maze; }
tip:
the matrix is stored as a single vector, meaning a cell on the position (i,j) can be accessed by finding as the (i×cols+j)-th component of the vector. this map is bijective, meaning that the i-th component of the vector corresponds to position (i/cols, i%cols) in the matrix, where / is the integer division and % is the reminder operator.
the matrix is not useful like this. it needs to be sorted. i'm using a simple (inefficient) bubble sort algorithm. i'll take advantage of how i stored the matrix so i can simply arrange the associated vector. i'll create a vector into which i'll keep the association of indices.
bubble sort works like this: take the first weight from the vector, and if it's heavier that the one above, swap their places. this has to be repeated until the entire vector is sorted: this happens when there are no swaps on a swipe.
/** the function is sorting the associated vector V, returning a mapping of the * sorted indices, M, with V(i) being the original vector, while V(M(i)) is the sorted one * @param weights (uint8_t *) is the original vector * @param m (int) is the top-bottom size of the maze * @param n (int) is the left-right size of the maze * @returns: an int mapping vector between the sorted version and the original one */ int * maze_edges_sort (uint8_t * weights, int m, int n) { /** @var indices the vector containing the sorted mapping */ int * indices; /** * @var c a variable index * @var t a temporary variable used in swapping two indices * @var o a temporary variable storing last index swapped * @var l, initially the length of the weights vector, * after, the length of the unsorted vector */ int c, t, o, l = m * (2 * n - 1) - n; /** initialize indices with an identity mapping i->i */ indices = (int *) malloc (l * sizeof (int *)); for (c = 0; c < l; c++) *(indices + c) = c; if (indices != NULL) /** while there's still some unsorted part of the vector */ while (l > 0) { /** o holds the last swapped value */ o = 0; /** i'm looping until the end of the unsorted vector */ for (c = 1; c < l; c++) { /** if the weights don't respect the sort order, swap them */ if (*(weights + *(indices + c - 1)) > *(weights + *(indices + c))) { /** * of course, i'm swapping indices in the mapping, * not real values, as the initial vector remains * unchanged, only the mapping function deviates from * identity map */ t = *(indices + c - 1); *(indices + c - 1) = *(indices + c); *(indices + c) = t; /** store the last swapped index */ o = c; } } /** the length of the unsorted vector equals the last swapped index */ l = o; } return indices; }
this algorithm is more complex that the previous ones. for easier understanding, i need to explain some notions:
i'll start with an empty set of sub-trees from the original graph. this will be called a forest set. forests have at least one tree. at the end of the algorithm i'll have in this set a tree that will link all vertices from the original graph. this is called a maximum spanning tree.
with each sorted edge, lighter to heavier, i'll do the following:
/** * the procedure takes as parameters a weight matrix together with its size * and modifies in place the weights matrix, removing the unnecessary edges * an edge is kept, if the weight is strict positive, while an edge is * deleted, if its weight is zero. * @param weights (uint8_t *) is the weight vector * @param m (int) is the maze top-bottom size * @param n (int) is the maze left-right size */ void maze_init (uint8_t * weights, int m, int n) { /** * @var indices is the sorted mapping for the weights vector; * @var matrix is a vector-stored matrix that has 0 on (i,j) * 0 on (i,j) position, if the (i,j) vertex was not visited * color>0 on (i,j) position, if the (i,j) vertex was visited * and (i,j) is part of the "color" sub-tree */ int * indices, * matrix; /** * @var c,d are variable indices; * @var row,col are the row and column indices in the @see matrix * @var n_row,n_col are the indices for the vertex connected to * (row,col); * @var min_color is the minimum "color" when merging an existing * sub-tree with a new edge. the edge can link two existing * sub-trees, meaning i'll have to choose a single color for both * @var max_color is analog with @see min_color; * @var color is the current available color for new sub-trees; */ int c, d, row, col, n_row, n_col, min_color, max_color, color = 1; /** reserve memory for the is-visited? matrix */ matrix = (int *) malloc (m * n * sizeof (int)); for (c = 0; c < m * n; c++) *(matrix + c) = 0; /** sort the graph weights */ indices = maze_edges_sort (weights, m, n); /** loop through sorted edges */ for (c = 0; c < m * (2 * n - 1) - n; c++) { /** get the edge first vertex label as (row, col) */ row = *(indices + c) / (2 * n - 1); col = *(indices + c) % (2 * n - 1); /** * based on how is stored, get the label for the * second vertex associated with the edge */ if (col < n - 1) { n_row = row; n_col = col + 1; } else { col = col - n + 1; n_row = row + 1; n_col = col; } /** * check if the current edge can be added to the forest: * the edge needs to fulfill all requirements: * - the edge is not already part of a tree, meaning that both * vertices are the same non-zero color */ if ( (*(matrix + row * n + col) == *(matrix + n_row * n + n_col)) && *(matrix + row * n + col) > 0 ) { *(weights + *(indices + c)) = 0; continue; } /** * find the color of the new vertices, by getting minimum and * maximum color. both can be zero, if we start a new sub-tree */ if (*(matrix + row * n + col) < *(matrix + n_row * n + n_col)) { min_color = *(matrix + row * n + col); max_color = *(matrix + n_row * n + n_col); } else { min_color = *(matrix + n_row * n + n_col); max_color = *(matrix + row * n + col); } if (min_color == 0) { /** * here, min = max = 0, this means we have a new sub-tree * so i color it with the next available color */ if (max_color == 0) { *(matrix + row * n + col) = *(matrix + n_row * n + n_col) = color ++; } /** here, the edge has an open end, the other is connected */ else { *(matrix + row * n + col) = *(matrix + n_row * n + n_col) = max_color; } } else { /** * here min, max > 0, both different, this means that the * edge is connecting two different color sub-trees, so i * make both the same color (min color) */ *(matrix + row * n + col) = *(matrix + n_row * n + n_col) = min_color; for (d = 0; d < m * n; d++) if (*(matrix + d) == max_color) *(matrix + d) = min_color; } } /** remember to free the reserved memory */ free (indices); free (matrix); }
piece of cake. first, i'll have to initialize my weights. than, to build the maximum spanning tree. a good exercise is to display the maze on the screen using ASCII art.
#include/** required for malloc, srand and rand functions */ #include /** useful for printing stuff, with printf */ #include /** i need the uint8_t definition */ #include /** i need the time function */ /** * this is the normal, unix-style format for the program entrypoint * @param argc (int) is the number of arguments from the command line; * @param argv (char **) is an array of strings, containing the command line arguments; * @returns: an integer, zero if no error has occurred. */ int main (int argc, char ** argv) { /** @var weights (uint8_t *) my weights matrix */ uint8_t * weights; /** @var m, n (int) the maze size */ int m = 4, n = 4; /** make the random numbers random :-) */ srand (time (NULL)); /** initialize the weights matrix */ weights = maze_weight_init (m, n); /** build a maximum spanning tree from the matrix */ maze_init (weights, m, n); /** tell the operating system that there's no error */ return 0; }
10:29 pm on Apr 9, 2018 | read the article | tags: hobby
în urma rugăminții profesorului Stamatin, de câțiva ani țin un curs la Facultatea de Fizică din Măgurele. dacă inițial numele «modelare și simulare» ascundea ecuații matematice și metode numerice, recent am înlocuit diferențialele cu Arduino, în ovațiile celor câtorva studenți care frecventează cursul. dotările limitate m-au făcut să devin creativ cu materialele de curs, iar rezultatul mi s-a părut suficient de interesant pentru a-l reproduce aici. așa că:
GNU Octave:
GNU Octave este o alternativa gratuită a MathWorks MatLab. ambele fac în mare același lucru pentru utilizatorul de rând: efectuează extrem de eficient operații matematice cu matrice. mai mult, în cele mai multe cazuri, codul scris pentru unul funcționează fără probleme în celălalt. GNU Octave poate fi descărcat de aici.
recomand varianta zip, pentru arhitectura potrivită calculatorului tău cu mențiunea că în cazul în care nu știi ce înseamnă arhitectură, poți alege cu încredere varianta care are în numele fișierului w32. fișierul descărcat este o arhivă de tip zip și necesită dezarhivare. dacă utilizezi Microsoft Windows 10, poți folosi cu încredere utilitarul integrat în Windows Explorer. vei obține un director care conține octave.bat, fișierul pe care trebuie să dai dublu-clic pentru a porni aplicația.
instrument control:
GNU Octave poate comunica cu Arduino prin intermediul interfeței seriale, dar nu o poate face în starea inițială. la fel ca în cazul MatLab, e necesară o bibliotecă externă cu instrucțiuni care să-i permită citirea datelor seriale. cea pe care am utilizat-o în curs se numește instrument control și e disponibilă aici.
biblioteca se instalează ușor, descărcând fișierul și mutându-l în directorul src (de la source) al GNU Octave. în cazul în care directorul nu există, îl poți crea pur și simplu. urmează să pornești GNU Octave și cu ajutorul browserului de fișiere din stânga ferestrei principale, găsești și intrii în directorul src. ultimul pas constă în introducerea următoarei comenzi în consola GNU Octave:
>> pkg install instrument-control-0.3.0.tar.gz
instalarea instrument control durează destul de mult așa că poți să iei o pauză de câteva minute.
read_arduino.m:
pentru citirea interfeței seriale a Arduino am scris o mică bucățică de cod în formatul GNU Octave, read_arduino.m care îți pune la dispoziție o funcție cu ajutorul căreia poți citi datele într-o matrice. presupunem că îmi doresc să citesc tensiunea pe fiecare dintre cele 6 intrări analogice și să îi urmăresc evoluția în timp, la intervale de o secundă.
codul pentru Arduino este următorul:
void setup () { Serial.begin (9600); // <-- read_arduino.m suportă doar viteza de 9600 bauds } void loop () { byte port = 0; // <-- am nevoie de o variabila care specifica numarul portului analog while (port < 6) { // <-- cel mult voi citi date de la portul 5 Serial.print (analogRead (port)); // <-- citesc si trimit valoarea citita catre portul serial Serial.print ("\t"); // <-- pentru a separa valorile, folosesc caracterul TAB (\t) port = port + 1; // <-- trec la portul urmator } Serial.print ("\n"); // <-- pentru a separa sirurile de date, folosesc caracterul NEW LINE (\n) delay (1000); // <-- aștept o secundă pentru a relua ciclul }
care ar trebui să producă la fiecare secundă câte o linie cu valori cuprinse între 0 și 1023, corespunzătoare diferenței de potențial între pinul GND și pinii de la A0 la A5.
pentru a citi 10 rânduri conținând cele 6 valori, vei folosi:
>> A = read_arduino ('COM5', 10, 6) A = 339 339 326 319 312 324 328 330 319 313 309 319 327 329 319 314 310 319 324 327 317 312 308 318 323 326 316 311 307 317 324 327 317 312 309 318 322 324 314 310 306 315 323 326 317 312 307 317 324 327 317 312 308 318 323 326 316 311 307 317
note de final:
COM5 este portul serial pe care se conectează plăcuța mea Arduino. în cazul tău, acesta va fi cel mai probabil diferit. verifică în Device Manager care este portul corect. read_arduino.m funcționează și pe Linux și pe MAC, însă în locul COM5 vei folosi denumirea portului corespunzătoare platformei. portul serial trebuie să fie liber, drept pentru care amintește-ți ca înainte să rulezi read_arduino să închizi monitorul serial al Arduino. ca în cazul MathWorks Matlab, fișierul read_arduino.m în directorul curent pentru ca funcția să devină accesibilă.
11:20 am on Mar 25, 2018 | read the article | tags: hobby
în urma rugăminții profesorului Stamatin, de câțiva ani țin un curs la Facultatea de Fizică din Măgurele. dacă inițial numele «modelare și simulare» ascundea ecuații matematice și metode numerice, recent am înlocuit diferențialele cu Arduino, în ovațiile celor câtorva studenți care frecventează cursul. dotările limitate m-au făcut să devin creativ cu materialele de curs, iar rezultatul mi s-a părut suficient de interesant pentru a-l reproduce aici. așa că:
senzorii de lumină domină lumea simțurilor electronice. cu mici modificări, aceștia pot răspunde unei multitudini de întrebări, de la banalul ”e lumină afară?”, la ”ce culoare are un obiect?” sau ”la ce distanță am un obstacol în față?”. la prima vedere funcționează complex: un fragment de siliciu reacționează la lumina incidentă, modificând o mărime electrică. Einstein a luat premiul Nobel pentru explicarea principiului în 1921, deci trebuie să fie complicat. cu toate acestea, tehnologia s-a dezvoltat pe parcursul secolului care a trecut suficient de mult ca să putem reface experimentul în bucătărie.
materiale necesare:
puțină teorie:
un led este un dispozitiv semiconductor, de obicei din siliciu, al cărui element activ este vizibil. elementul activ poartă numele de joncțiune, adică locul de întâlnire pentru două materiale cu proprietăți diferite. ce e important de reținut pentru construcția de față este că cele două materiale formează un sandviș cu un mic spațiu între ele, asemeni unui condensator de la fizică. în funcționarea normală, trecerea curentului electric prin acel mic spațiu produce lumină. cu siguranță ai observat că polaritatea e importantă, deoarece lumina și circulația curentului se produc doar într-un singur sens.
ce se întâmplă în schimb când polaritatea e inversată? lipsa curentului electric duce la acumularea de sarcini electrice pe fețele sandvișului, încărcând condensatorul. cum naturii îi plac simetriile, orice rază de lumină incidentă generează perechi de sarcini, care se vor deplasa în direcții opuse, datorită atracției electrostatice. ajunse pe suprafețele sandvișului, acestea vor scădea sarcina acumulată pe condensator, scăzând proporțional și tensiunea electrică.
în mod normal, procesele se întâmplă extrem de repede și sunt extrem de mici ca intensitate. dar aici intervine genialitatea oamenilor care au proiectat Arduino: acesta e suficient de rapid și suficient de sensibil pentru a face față experimentului.
ce se va întâmpla:
Arduino va încărca ledul, alimentându-l invers, după care va număra cât îi ia condesatorului format în jurul joncțiunii ledului pentru a se descărca. pentru a repeta experimentul de la curs, vei conecta ledul cu plusul (piciorușul mai lung, anodul) la GND (ground, 0V) și minusul (piciorușul mai scurt, catodul) la unul dintre terminalele Arduino, cu excepția pinilor 0,1 – care sunt responsabili pentru comunicarea serială și pinul 13, care are deja un led conectat intern și care te va încurca. eu am ales pinul 2.
în pregătirea Arduino, am definit un loc în memorie pentru stocarea informațiilor primite de la led. tipul de date folosit va fi întreg (int), numărând câte perioade de timp condensatorul a fost încărcat. pentru a fi accesibilă de oriunde, definiția se va afla în afara și înaintea celor două funcții speciale Arduino, setup și loop.
int value; // <- asa definesc un loc in memorie, int este tipul, iar value este numele // pentru ca am definit-o în afara setup și loop, voi putea să o accesez de oriunde, prin nume void setup() {} void loop() {}
pentru citirea informațiilor, am folosit interfața serială a Arduino, care va fi inițializată prin:
int value; void setup() { Serial.begin(9600); // <- aici initializez conexiunea seriala cu viteza de 9600 caractere / s } void loop() {}
periodic, am încărcat ledul pentru un interval de timp. experimental am ales 1ms.
int value; void setup() { Serial.begin(9600); } void loop() { pinMode(2, OUTPUT); // <- aici definesc pinul 2 ca fiind pin de iesire digitalWrite(2, HIGH); // <- setez tensiunea pe pinul 2 la tensiunea de alimentare a Arduino delay(1); // <- astept 1ms, sa incarc condensatorul ledului }
am măsurat în cât timp tensiunea la bornele ledului scade sub un anumit prag. aici aș fi putut să folosesc convertorul analog-digital din Arduino, dar în unele situații este prea lent. așa că am folosit proprietatea unui pin digital configurat ca intrare de a-și schimba starea în jurul jumătății tensiunii de alimentare a Arduino. astfel, dacă tensiunea la intrare scade sub 2.5V față de GND (pentru un Arduino alimentat la 5V), valoarea citită intern va fi LOW, în timp ce dacă tensiunea crește peste 2.5V, valoarea citită va fi HIGH.
pentru a determina în cât timp tensiunea la bornele ledului scade, am verificat la intervale scurte de timp dacă a scăzut. dacă a scăzut, trimit prin conexiunea serială valoarea înregistrată, altfel, mai aștept puțin timp și verific din nou. experimentând, am folosit ca timp de așteptare 40uS.
int value; void setup() { Serial.begin(9600); } void loop() { pinMode(2, OUTPUT); digitalWrite(2, HIGH); delay(1); pinMode(2, INPUT); value = 0; // <- aici resetez ce stochez în memorie while(digitalRead(2) == HIGH) { // <- citesc pinul 2 si verific daca tensiunea depasește pragul delayMicroseconds(40); // <- daca e peste prag, lumina e prea slabă și aștept 40uS value = value + 1; // <- cresc cu o unitate valoarea stocată } // <- aici tensiunea la bornele ledului a scazut sub prag Serial.println(value); // <- așa că trimit valoarea prin conexiunea serială }
în funcție de led și de condițiile de iluminare, valorile primite de calculator sunt uneori negative. acest lucru se întâmplă deoarece numărul de repetări depășește valoarea maximă care poate fi stocată într-un segment de memorie de tip întreg. pentru a preveni această situație, am introdus o limitare la 255 a numărului de cicluri pentru care verificarea are loc:
int value; void setup() { Serial.begin(9600); } void loop() { pinMode(2, OUTPUT); digitalWrite(2, HIGH); delay(1); pinMode(2, INPUT); value = 0; while((digitalRead(2) == HIGH) && (value < 255)) { // <- verific în plus dacă valoarea stocată e sub 255 delayMicroseconds(40); value = value + 1; } Serial.println(value); }
note de final:
ledul este sensibil la același tip de lumină pe care o emite. folosind acest principiu, poți foarte ușor să-l transformi într-un senzor de culoare. de asemenea, un led are de obicei o lentilă care dirijează razele de lumină, limitându-i astfel câmpul vizual, la fel ca în cazul emisiei. folosind această informație, poți adapta foarte ușor un led pentru a măsura distanța.
11:54 pm on Feb 14, 2017 | read the article | tags: buggy
during the development of a new resource-sensitive project, i wondered what is the best PHP string output method and thus compared the following:
<?php /* A: */ printf ('some value %d != %d' . "\n", $c, $c+1); /* B: */ vprintf ('some value %d != %d' . "\n", [ $c, $c+1 ]); /* C: */ vprintf ('some value %d != %d%s', [ $c, $c+1, "\n" ]); /* D: */ echo sprintf ('some value %d != %d' . "\n", $c, $c+1); /* E: */ echo vsprintf ('some value %d != %d' . "\n", [ $c, $c+1 ]); /* F: */ echo vsprintf ('some value %d != %d%s', [ $c, $c+1, "\n" ]); /* G: */ echo 'some value ' . $c . ' != ' . ($c+1) . "\n"; /* H: */ echo "some value $c != " . ($c+1) . "\n"; /* I: */ ?>some value <?php echo $c; ?> != <?php echo $c+1; ?> <?php ?>
each statement was run inside a for loop, for one million cycles, for a total number of five times. the results were as follows:
A | B | C | D | E | F | G | H | I |
---|---|---|---|---|---|---|---|---|
0.4260 | 0.5836 | 0.6412 | 0.4333 | 0.5896 | 0.6781 | 0.4449 | 0.4182 | 0.0361 |
0.4220 | 0.6012 | 0.6631 | 0.4302 | 0.6210 | 0.6805 | 0.4385 | 0.4100 | 0.0361 |
0.4205 | 0.6083 | 0.6674 | 0.4306 | 0.6245 | 0.6935 | 0.4379 | 0.4168 | 0.0378 |
0.4364 | 0.6098 | 0.6697 | 0.4456 | 0.6752 | 0.7455 | 0.4530 | 0.4134 | 0.0361 |
0.4299 | 0.5964 | 0.6594 | 0.4384 | 0.5793 | 0.6538 | 0.4485 | 0.4185 | 0.0365 |
on average, the best I is 11.37 times faster than the next, followed by H, A, D, G, B, E, C and F, which is worst, 18.90 times slower than I.
11:46 am on Nov 29, 2016 | read the article | tags: ideas
Cu toate astea, decât să-ţi dai ochii scârbit peste cap o viaţă-ntreagă, în aşteptarea unui salvator, mai bine îţi arunci privirea-n oglindă şi poate descoperi ce stă în puterile tale.
Mă enervează articolele astea: iau o idee bună, o minimizează și o transformă în demagogie electorală. Puterea de a face schimbări stă într-adevăr în fiecare dintre noi, doar că e insignifiantă în urma aia lăsată de ștampilă pe buletinul de vot. E pur și simplu o delegare a răspunderii către un grup de oameni care inevitabil vor fi corupți de sistem. Pentru că sistemul așa a fost gândit și nu a dat greș niciodată în 27 de ani de când a fost reformat.
Schimbarea nu e inclusă în tușul unei ștampile. Salvarea nu vine de la un acronim. Bunăstarea nu vine dintr-un set de legi emise, redactate și implementate de incompetenți populari. Soluția va fi întotdeauna la îndemâna fiecăruia dintre noi, în acțiunile noastre zilnice.
10:13 am on Nov 27, 2016 | read the article | tags: friends
Vreau să fiu un om bun.
Care e părerea ta?
Sunt?
Da. Ești. Mie așa mi se pare. Eu nu stau de vorbă cu oameni răi.
09:12 am on Nov 25, 2016 | read the article | tags: away
What is more beautiful, my love? Love lost or love found? Don’t laugh at me, my love. I know it, I’m awkward and naive, when it comes to love, and I ask questions straight out of a pop song. This doubt overwhelms me and undermines me, my love. To find or to lose? All around me people don’t stop yearning. Did they lose or did they find? I can’t say. An orphan has no way of knowing. An orphan lacks a first love. The love for his mama and papa. That’s the source of his awkwardness, his naivete. You said to me, on that deserted beach in California: “you can touch my legs.” But I didn’t do it. There, my love, is love lost. That’s why I’ve never stopped wondering, since that day: where have you been? And where you are now? And you, shining gleam of my misspent youth, did you lose or did you find? I don’t know. And I will never know. I can’t even remember your name, my love. And I don’t have the answer. But this is how I like to imagine it, the answer. In the end, my love, we have no choice. We have to find.
12:50 am on Jan 11, 2016 | read the article | tags: business
nu îndrăznesc să spun despre mine că sunt antreprenor. nu mă ridic la înălțimea standardelor stabilite în literatura de specialitate. nici pe departe. nu m-am dezvoltat personal și nici nu am învățat să fac business.
sunt aproape doi ani de când îmi asum riscuri pentru a-mi construi propriul drum și nu pot să spun exact că mi-a reușit și nici că am eșuat. pentru că în viață, am învățat, lucrurile nu sunt absolute.
am pornit un start-up pentru că-mi place să visez și aș vrea, la un moment dat, să-mi urmez visul. felul ăsta de activitate îmi va pune la dispoziție resursele de care am nevoie să visez cu ochii deschiși. am încercat și alte metode.
am fost angajat. și deși am avut parte e oameni extraordinari care au fost alături de mine să mă îndrume și de la care am învățat o mulțime de lucruri, nu era locul meu acolo. pentru că un loc de muncă îți ia ceea ce ai tu mai de preț. la mine era creativitatea de care aveam nevoie să visez. mi-au oferit în schimb bani și liniște. n-a fost suficient.
am fost finanțat. și din nou, oamenii cu care am pornit la drum au fost minunați și din nou am învățat de la ei o mulțime de lucruri, dar din nou locul meu nu era acolo. un finanțator te lasă să faci ceea ce-și dorești. dar îți impune limite. pe care la început nu le observi sau crezi că poți să le ignori, până când libertatea ta dispare. imaginează-ți că te obligă cineva să visezi în fiecare seară vacanțe exotice și ziua, un om care nu poate să viseze te auditează pentru a-ți verifica calitatea viselor. mi-a oferit în schimb bani și o parte din vis. n-a fost suficient.
sunt propriul meu angajat. sunt creativ pentru clienți în limita pe care mi-o permit fără să-mi afecteze visul. îmi impun limite la vis pentru a le putea depăși. e greu și muncesc de cel puțin două ori mai mult decât am muncit în oricare dintre situașiile anterioare. n-am avut vacanță de când am început. am oameni care depind de mine și de care trebuie să am grijă pentru că ei au grijă de visul meu. mi-am oferit libertatea de a visa și parțial bani. să-mi împlinesc visul a devenit o problemă de timp.
ce-am învățat în aproape doi ani de indendență? că trebuie să muncești foarte mult și trebuie să fii dedicat visului tău. că la un moment dat trebuie să găsești oameni la fel de dedicați ca și tine și să faci tot posibilul să-i păstrezi. că întotdeauna primul răspuns corect la o întrebare este «nu». că e important să fii sincer față de clienții, furnizorii și angajații cu care îți dorești să lucrezi: nu trebuie să epatezi și nici să aplici tehnici speciale de negociere. că ai nevoie de avocat și contabil. și din nefericire, că Mr. Burns are dreptate:
Family, religion, friendship. These are the three demons you must slay if you wish to succeed in business.
— Charles Montgomery ”Monty” Burns
12:08 am on Sep 14, 2014 | read the article | tags: ideas
sunt mândru că sunt absolvent de matematică și îi voi fi pentru eternitate recunoscător domnului profesor stănescu pentru că m-a îndrumat pe acest drum. recomand cu căldură și sinceritate acest parcurs oricărui elev de liceu, viitor absolvent, care vrea să înțeleagă cu adevărat ceva din viață.
să nu mă înțelegi greșit. corpul profesoral este în majoritate viciat: slab pregătit, corup și amoral. însă școala românească de științe exacte – slab influețată de retorica partidului, în antiteză cu cea de științe umaniste – și-a pus amprenta exact acolo unde trebuie, în orgoliul nemărginit al urmașilor lor, actualii conferențiari și profesori universitari. ignoranța și indiferența lor față de subiectul predat fiind suplinită de canonul metodei de predare, lăsat moștenire de generațiile anterioare.
această metodă este singurul aspect care delimitează facultatea de matematică de noroiul întregului învățământ superior românesc și care, asemeni unui vaccin dureros și generos în complicații, te protejează și te întărește pe parcursul existenței.
cheia întregului proces este trecerea obligatorie prin greșelile pe care generații întregi de filosofi și matematicieni le-au făcut prin studiul demonstrațiilor afirmațiilor lor omonime. în acest fel, analizarea argumentelor fiecăruia ajutându-te să integrezi în personalitatea ta bucățele din acel om, experimentând direct, mai ales în timpul examenelor aparent ilogice, dezamăgirilile și durerea acelui om, dar și euforia descoperirii.
pentru că în viață, drumul e mult mai important decât destinația. și orice scurtătură pe care o alegem ne privează de experiența călătoriei, a obstacolelor și piedicilor pe care le întâlnim pe parcurs, a lucrurilor care ne ajută să ne clădim caracterul și să apreciem destinația.
08:41 pm on Apr 28, 2014 | read the article | tags: sciencenews
Un articol științific publicat în revista Nature[1] studiază procesul prin care cromozomul Y, determinant pentru stabilirea genului masculin în cadrul majorității mamiferelor, a fost micșorat pe parcursul a 300 de milioane de ani de evoluție, estimând o stopare a acestui proces încă de acum 25 de milioane de ani. Cauza opririi acestui proces are originea într-un nucleu de 12 gene, care nu influențează aparatul reproducător masculin, ci țesuturi prezente în inimă sau celulele sangvine, transformând micuțul cromozom într-unul dintre gadget-urile genetice esențiale pentru supraviețuire fiind favorizat de procesului evolutiv. Consecința directă a acestor descoperiri este diferența impusă de gen în liniile celulare ale indivizilor aceleiași specii și invalidând orice model celular unisex pentru țesuturile afectate. Efectul procedurilor medicale specifice și al medicamentelor devine imprevizibil pentru produsele și protocoalele derivate din cercetările bazate pe modelul ”egalității de gen celulare”. Cu alte cuvinte, viitorul apropiat ne va aduce medicamente specifice pentru bărbați și femei [sursă].
În aceeași notă, șoarecii de laborator sunt mai stresați atunci când sunt utilizați de către cercetătorii de gen masculin, ducând la devierea rezultatelor experimentelor în care sunt folosiți [sursă]. Mai mult, mirosul cercetătorilor bărbați crește toleranța la durere a rozătoarelor [sursă], compromițând rezultatele obținute în urma diferitelor teste.
Micul arahnid, Paratarsotomus macropalpis, se poate deplasa cu o viteză de 322 lungimi de corp într-o secundă în comparație cu un ghepard care aleargă cu numai 16 lungimi de corp pe secundă. Studiul căpușei este interesant pentru determinarea principiilor mecanice care stau la baza vitezei incredibile de mișcare a picioarelor micului organism, fiecare picior atingând solul de 135 de ori într-o secundă, lucru extrem de util de implementat în viitorii mini-, micro- și nano- roboți [sursă].
—
aceast sait folosește cookie-uri pentru a îmbunătăți experiența ta, ca vizitator. în același scop, acest sait utilizează modulul Facebook pentru integrarea cu rețeaua lor socială. poți accesa aici politica mea de confidențialitate.