Ce este o operație idempotentă?

Ce este o operație idempotentă?


person Will    schedule 03.07.2009    source sursă
comment
Pentru iubitorii de matematică - f(f(x)) = f(x). Continuați să citiți răspunsurile pentru un conținut mai descriptiv!!   -  person paradocslover    schedule 02.07.2021


Răspunsuri (15)


În calcul, o operație idempotentă este una care nu are niciun efect suplimentar dacă este apelată de mai multe ori cu aceiași parametri de intrare. De exemplu, eliminarea unui articol dintr-un set poate fi considerată o operație idempotentă pe set.

În matematică, o operație idempotent este una în care f(f(x)) = f(x). De exemplu, funcția abs() este idempotentă deoarece abs(abs(x)) = abs(x) pentru toate x.

Aceste definiții ușor diferite pot fi reconciliate considerând că x în definiția matematică reprezintă starea unui obiect, iar f este o operație care poate modifica acel obiect. De exemplu, luați în considerare Python set și metoda sa discard. Metoda discard elimină un element dintr-un set și nu face nimic dacă elementul nu există. Asa de:

my_set.discard(x)

are exact același efect ca și efectuarea aceleiași operații de două ori:

my_set.discard(x)
my_set.discard(x)

Operațiunile idempotente sunt adesea folosite în proiectarea protocoalelor de rețea, în cazul în care o solicitare de a efectua o operațiune este garantată să se întâmple cel puțin o dată, dar se poate întâmpla și de mai multe ori. Dacă operația este idempotentă, atunci nu există niciun rău în efectuarea operației de două sau mai multe ori.

Consultați articolul Wikipedia despre idempotence pentru mai multe informații.


Răspunsul de mai sus a avut anterior câteva exemple incorecte și înșelătoare. Comentariile de mai jos scrise înainte de aprilie 2014 se referă la o revizuire mai veche.

person Greg Hewgill    schedule 03.07.2009
comment
Exemplu: deoarece răspunsul de mai sus afirmă că Idempotent operations are often used in the design of network protocols iată un exemplu înrudit ** GET nu ar trebui să schimbe nimic pe server, deci GET este, idempotent. În contextul HTTP/servlet, înseamnă că aceeași solicitare poate fi făcută de două ori fără consecințe negative. **POST NU este idempotent. - person KNU; 01.04.2014
comment
Este apatrid sinonim cu idempotent? - person Michael Osofsky; 05.12.2014
comment
@MichaelOsofsky: Nu, în exemplul Python set din răspuns, obiectul setat are în mod clar stare și oferă, de asemenea, unele operații idempotente, cum ar fi discard. - person Greg Hewgill; 07.12.2014
comment
Minunat, @GregHewgill, înțeleg acum că idempotent și apatrid sunt diferite, deoarece operația discard operează pe stare, dar returnează același rezultat dacă este apelată de mai multe ori cu aceiași parametri de intrare; discard doar lucrează diferit pentru a ajunge la acel rezultat. Vă mulțumim pentru ajutor. - person Michael Osofsky; 08.12.2014
comment
@MichaelOsofsky, discard poate fi implementat și într-un mod apatrid, cuprinzând starea în valoarea returnată: discard([my_set, x]) = [my_new_set, x]. Deci poți face discard(discard([my_set, x])). Rețineți că [my_new_set, x] este doar un argument și tipul său este 2-tuplu. - person Pacerier; 11.03.2015
comment
@mikera, Starea lumii nu este un argument implicit suplimentar, ci cel unicul și singurul argument. Dacă ați avea argumente suplimentare, operațiunea ar fi o operație binară și poate fi considerată idempotente numai dacă ambele argumente sunt < b>identic. Pentru a rămâne ca o operație idempotentă unară, starea lumii trebuie să fie argumentul și valoarea returnată. - person Pacerier; 11.03.2015
comment
Nu eliminarea unui articol dintr-un set ci eliminarea numărului dat dintr-un set. Pentru că, de exemplu, array.pop() operația dăunează setului de fiecare dată când este apelat. - person Green; 10.10.2015
comment
Cum poți spune că are exact același efect ca a face aceeași operațiune de două ori? Cu siguranță nu are același efect. Dacă șterg un articol dintr-un set la primul apel și acesta este șters cu succes, în primul rând, primesc elementul șters (în JS, nu python), în al doilea rând, starea setului este modificată. Dacă repet operația, primesc undefined și setul nu este modificat. Deci, unde este același efect despre care vorbești? Absolut diferit. Dar orice apeluri ulterioare au într-adevăr același efect: obțineți undefined și un set nu este modificat. Chiar nu inteleg idempotenta de calcul. - person Green; 10.10.2015
comment
@Green Când folosiți termenul același efect în contextul impotenței, înseamnă că rezultatul este același, nu acțiunea. Apelarea a discard(x) a doua oară va avea același efect ca și prima dată: setul nu va mai conține x. Idempotenta de calcul se referă la robustețea unui sistem. Deoarece lucrurile pot eșua (de exemplu, întreruperea rețelei), atunci când este detectată o defecțiune, cum vă recuperați? Cea mai ușoară recuperare este să o faci din nou, dar asta funcționează doar dacă a o face din nou este idempotent. De exemplu. discard(x) este idempotent, dar pop() nu este. Totul este despre recuperarea erorilor. - person Andreas; 27.04.2016
comment
Pentru cei care vorbesc rusă, mergeți la ru.wikipedia.org/wiki/. Definiția cea mai clară, de departe! - person Andrew Shatnyy; 04.08.2016
comment
Scopul întrebării în altă parte este că explicațiile wikipedia despre chestii matematice sunt de obicei mai greu de digerat/înțeles, având în vedere modul în care sunt explicate în wikipedia. - person ahnbizcad; 10.08.2016
comment
@Andreas Ce zici de cel de-al doilea exemplu de pe Wikipedia: să presupunem că valoarea inițială a o variabilă este 3 și există o secvență care citește variabila, apoi o schimbă la 5 și apoi o citește din nou? Crezi că asta este idempotent? - person Franklin Yu; 20.12.2017
comment
@FranklinYu Mai cred că ce este idempotent? Acest exemplu este despre compunerea a metodelor idempotente și nu există o compoziție în această întrebare sau în acest răspuns. Exemplul Wikipedia mi se pare destul de clar și spune în mod specific că exemplul compus nu este idempotent, chiar dacă fiecare dintre cele 3 metode/operații sunt. Nu inteleg intrebarea ta. - person Andreas; 20.12.2017
comment
@Andreas Dar, în acest caz, un al doilea apel nu schimbă stările și returnează o valoare diferită, exact același caz în HTTP DELETE. Dacă acesta nu este idempotent, cum este DELETE idempotent? - person Franklin Yu; 20.12.2017
comment
@FranklinYu Dacă vă aflați într-un scenariu în care idempotenta este importantă, atunci știți, de asemenea, că un al doilea DELETE poate returna 404 (negăsit), ceea ce înseamnă că dacă obțineți 404 sau 200 (sau 202, sau 204), știți că ai ceea ce ai vrut. Deci, în ceea ce vă privește, 404 este un răspuns valid care spune că ceea ce ați cerut a fost făcut. Ca atare, metoda este idempotentă. În acest caz, 404 și 200 înseamnă ambele OK. - person Andreas; 20.12.2017
comment
O funcție care a extras un răspuns dintr-o bază de date ar conta ca idempotent? Dacă datele s-ar schimba între apeluri, rezultatul ar fi diferit. Mă gândesc la cazul în care o interogare de bază de date are o funcție „now()” față de una în care treceți timpul ca parametru. Edit: Da, așa scrie în articolul Wikipedia! - person Chris Huang-Leaver; 13.10.2020

O operație idempotentă poate fi repetată de un număr arbitrar de ori și rezultatul va fi același ca și cum ar fi fost făcută o singură dată. În aritmetică, adăugarea zero la un număr este idempotent.

Despre Idempotenta se vorbeste mult in contextul serviciilor web „RESTful”. REST caută să folosească la maximum HTTP pentru a oferi programelor acces la conținutul web și este de obicei setat în contrast cu serviciile web bazate pe SOAP, care doar tunelează serviciile de tip apel de procedură la distanță în interiorul cererilor și răspunsurilor HTTP.

REST organizează o aplicație web în „resurse” (cum ar fi un utilizator Twitter sau o imagine Flickr) și apoi utilizează verbele HTTP ale POST, PUT, GET și DELETE pentru a crea, actualiza, citi și șterge acele resurse.

Idempotenta joaca un rol important in REST. Dacă GET o reprezentare a unei resurse REST (de exemplu, GET o imagine jpeg de pe Flickr) și operațiunea eșuează, puteți doar să repetați GET din nou și din nou până când operația reușește. Pentru serviciul web, nu contează de câte ori este primită imaginea. De asemenea, dacă utilizați un serviciu web RESTful pentru a vă actualiza informațiile contului Twitter, puteți PUNE noile informații de câte ori este nevoie pentru a obține confirmarea de la serviciul web. PUNEȚI-o de o mie de ori este același lucru cu PUNEȚI-O odată. În mod similar, ștergerea unei resurse REST de o mie de ori este același lucru cu ștergerea acesteia o dată. Idempotenta ușurează astfel construirea unui serviciu web care să fie rezistent la erorile de comunicare.

Citiri suplimentare: RESTful Web Services, de Richardson și Ruby (idempotenta este discutată la paginile 103-104), și teza de doctorat a lui Roy Fielding pe REST. Fielding a fost unul dintre autorii HTTP 1.1, RFC-2616, care vorbește despre idempotence în secțiunea 9.1.2.

person Jim Ferrans    schedule 03.07.2009
comment
Clar și direct. Totuși, aceasta este dar doar o singură interpretare a idempotent. - person Pacerier; 11.03.2015
comment
@Pacerier: Foarte adevărat, idempotence are aplicații în multe alte domenii, cum ar fi programarea funcțională și procesarea cozii de mesaje. - person Jim Ferrans; 11.03.2015
comment
idempotenta este un cuvânt foarte supraîncărcat deoarece sună grandilocvent și are suficiente caractere pentru a trece verificarea sesquipedală. Dacă Benjamin Peirce ar fi ales un cuvânt care sună mai simplu, nici măcar nu am avea această întrebare astăzi. - person Pacerier; 11.03.2015
comment
Cum să-l înțelegi: Ștergerea unei resurse REST de o mie de ori este același lucru cu ștergerea ei o dată? Nu puteți șterge din nou resursa dacă este deja ștearsă. - person Green; 10.10.2015
comment
@Green, dar nu îl ștergeți prima dată. trimiteți o solicitare de ștergere. Punctul important este că puteți trimite câte solicitări doriți. - person Caleth; 06.04.2017
comment
Tutorialele REST afirmă că resursa trebuie actualizată folosind PUT în loc de POST deoarece PUT este idempotent. dacă cererea PUT eșuează, o putem retrimite până când primim un răspuns de succes de la server. Ce mă împiedică să retrimit o solicitare POST nereușită (actualizarea)? Se va întâmpla ceva în neregulă? - person mangusta; 15.02.2020
comment
Este posibil să scrieți puncte finale POST care sunt idempotente și puncte finale PUT care nu sunt, @mangusta. Problema este conformitatea cu definițiile PUT și POST din specificația HTTP. Pentru a urma corect HTTP, toate PUT-urile dvs. trebuie să fie idempotente. Dar specificația nu spune nimic despre POST că este idempotent. - person Jim Ferrans; 22.02.2020
comment
@JimFerrans văd. M-am gândit că ar putea exista un motiv legat de funcționalitate (încorporat în HTTP însuși) de ce PUT poate fi retrimis fără griji în timp ce POST nu. Acum se pare că ni se cere pur și simplu să ne conformăm standardelor HTTP și comportamentul se bazează în totalitate pe modul în care este implementat serverul - person mangusta; 22.02.2020

Indiferent de câte ori suni la operație, rezultatul va fi același.

person Robert    schedule 03.07.2009
comment
Am auzit că idempotent este definit ca unul sau ambele dintre cele de mai jos: 1) Pentru un anumit set de intrări, va returna întotdeauna aceeași ieșire. 2) Nu produce efecte secundare. Întrebarea mea este, dacă o funcție este conformă cu #1, dar nu cu #2, deoarece are ca rezultat un efect secundar care nu are legătură cu calculul (înregistrează cererea într-un depozit de date, de exemplu), este încă considerată idempotent? - person Keith Bennett; 29.06.2012
comment
Rezultatul apelării unei operații trebuie să includă starea sistemului, deci dacă operațiunea are un efect secundar cumulativ nu este idempotent; totuși, dacă efectul secundar lasă sistemul în aceeași stare indiferent de câte ori este apelată operația, atunci poate fi idempotent. - person Robert; 18.07.2012
comment
Scurt și dulce, îmi place acest tip de răspuns. Nu sunt sigur de ce trebuie să caut acest termen în mod constant, este unul care pur și simplu nu rămâne cu mine. - person Prancer; 02.02.2015
comment
@KeithBennett, A doua definiție este greșită. Fără efect secundar nu înseamnă idempotent. Funcțiile idempotente pot avea efecte secundare. De exemplu. MySQL truncate și delete. - person Pacerier; 11.03.2015
comment
Rezultatul va fi același (adică starea sistemului), dar răspunsul poate varia (adică, codurile de stare HTTP pe un serviciu REST). - person G. Steigert; 07.02.2018
comment
deci, dacă există un contor de rânduri în baza de date, care este utilizat pentru a verifica integritatea datelor de intrare a cererii față de starea bazei de date, contorul de rânduri trebuie luat în considerare în definiția idempotent? acel contor de rând va crește pentru fiecare solicitare, dar nu va fi returnat ca parte a rezultatului. - person swcraft; 27.04.2020

Idempotenta inseamna ca aplicarea unei operatii o data sau aplicarea ei de mai multe ori are acelasi efect.

Exemple:

  • Înmulțirea cu zero. Indiferent de câte ori o faci, rezultatul este tot zero.
  • Setarea unui steag boolean. Indiferent de câte ori o faci, steagul rămâne fixat.
  • Ștergerea unui rând dintr-o bază de date cu un ID dat. Dacă încercați din nou, rândul este încă dispărut.

Pentru funcții pure (funcții fără efecte secundare), atunci idempotenta implică faptul că f(x) = f(f(x)) = f(f(f(x))) = f(f(f) (f(x)))) = ...... pentru toate valorile lui x

Pentru funcțiile cu efecte secundare, idempotenta implică, de asemenea, că nu vor fi cauzate efecte secundare suplimentare după prima aplicare. Puteți considera starea lumii ca fiind un parametru „ascuns” suplimentar pentru funcție, dacă doriți.

Rețineți că într-o lume în care aveți acțiuni concurente, este posibil să descoperiți că operațiunile pe care le credeați că sunt idempotente încetează să mai fie așa (de exemplu, un alt fir ar putea anula valoarea steagului boolean din exemplul de mai sus). Practic, ori de câte ori ai concurență și stare mutabilă, trebuie să te gândești mult mai atent la idempotență.

Idempotenta este adesea o proprietate utilă în construirea de sisteme robuste. De exemplu, dacă există riscul să primiți un mesaj duplicat de la o terță parte, este util ca handlerul de mesaje să acționeze ca o operație idempotent, astfel încât efectul mesajului să se întâmple o singură dată.

person mikera    schedule 05.03.2012
comment
Dacă pentru funcțiile pure f(x) = f(f(x)), vrei să spui că f(x){return x+1;} nu este o funcție pură? pentru că f(x) != f(f(x)): f(1) dă 2 în timp ce f(2) dă 3. - person Pacerier; 11.03.2015
comment
@Pacerier Nu, @mikera spune pur și idempotent implică f(x) = f(f(x)). Dar, așa cum a menționat @GregHewgill, pentru ca această definiție să aibă sens, trebuie să considerați x ca un obiect și f ca o operație care modifică starea obiectului (adică: ieșirea lui f este un x mutant). - person Justin J Stark; 17.10.2016

O operație idempotentă produce rezultatul în aceeași stare chiar dacă îl apelezi de mai multe ori, cu condiția să treci în aceiași parametri.

person Caleb Huitt - cjhuitt    schedule 03.07.2009

Am vrut doar să arunc un caz real de utilizare care demonstrează idempotenta. În JavaScript, să presupunem că definiți o mulțime de clase de model (ca în modelul MVC). Modul în care este adesea implementat este echivalent funcțional cu ceva de genul acesta (exemplu de bază):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Apoi puteți defini noi clase, astfel:

var User = model('user');
var Article = model('article');

Dar dacă ar fi să încercați să obțineți clasa User prin model('user'), din altă parte din cod, ar eșua:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Acei doi constructori User ar fi diferiți. Acesta este,

model('user') !== model('user');

Pentru a-l face idempotent, trebuie doar să adăugați un fel de mecanism de stocare în cache, ca acesta:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

Adăugând cache, de fiecare dată când ați făcut model('user'), va fi același obiect și deci este idempotent. Asa de:

model('user') === model('user');
person Lance Pollard    schedule 09.10.2013
comment
Acest răspuns nu pare corect. Idempotenta se referă la apelarea unei operații în care te aștepți să schimbe o anumită stare, având în vedere parametrii de intrare, care dacă apoi apelezi din nou cu aceiași parametri nu mai are niciun efect asupra stării. Dar în exemplul dvs., chiar înainte de a folosi caching-ul, dacă apelăm model('utilizator') de două ori, acesta este deja idempotent, nu există nicio schimbare de stare, doar crearea și returnarea unui nou obiect distinct apelantului (nestocat). Descrieți un model de fabrică de identitate a obiectelor care asigură că „același” obiect este returnat prin apeluri, util, dar care nu explică idempotenta. - person Ash; 02.07.2020

Un bun exemplu de înțelegere a unei operațiuni idempotente ar putea fi încuierea unei mașini cu cheia de la distanță.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lock este o operație idempotent. Chiar dacă există un efect secundar de fiecare dată când rulați lock, cum ar fi clipirea, mașina este încă în aceeași stare de blocare, indiferent de câte ori rulați operația de blocare.

person IVN    schedule 18.09.2019

O operație idempotentă este o operație, acțiune sau cerere care poate fi aplicată de mai multe ori fără a modifica rezultatul, adică starea sistemului, dincolo de aplicarea inițială.

EXEMPLE (CONTEXTUL APLICAȚIEI WEB):

IDEMPOTENT: Efectuarea mai multor cereri identice are același efect ca și efectuarea unei singure cereri. Un mesaj dintr-un sistem de mesagerie prin e-mail este deschis și marcat ca „deschis” în baza de date. Se poate deschide mesajul de mai multe ori, dar această acțiune repetată va avea ca rezultat doar ca mesajul să fie în starea „deschis”. Aceasta este o operație idempotentă. Prima dată când se pune o actualizare a unei resurse folosind informații care nu se potrivesc cu resursa (starea sistemului), starea sistemului se va schimba pe măsură ce resursa este actualizată. Dacă cineva pune aceeași actualizare la o resursă în mod repetat, atunci informațiile din actualizare se vor potrivi cu informațiile deja din sistem la fiecare PUT și nu va avea loc nicio modificare a stării sistemului. PUT-urile repetate cu aceleași informații sunt idempotente: primul PUT poate schimba starea sistemului, iar PUT-urile ulterioare nu ar trebui.

NEIMPOTENT: Dacă o operație provoacă întotdeauna o schimbare a stării, cum ar fi POSTAREA aceluiași mesaj către un utilizator de nenumărate ori, rezultând un mesaj nou trimis și stocat în baza de date de fiecare dată, spunem că operația este NEIMPOTENT.

NULIPOTENT: Dacă o operațiune nu are efecte secundare, cum ar fi afișarea exclusivă a informațiilor pe o pagină web fără nicio modificare a unei baze de date (cu alte cuvinte, citiți doar baza de date), spunem că operația este NULIPOTENT. Toate GET-urile ar trebui să fie nulipotente.

Când vorbim despre starea sistemului, ignorăm în mod evident efectele inofensive și inevitabile, cum ar fi înregistrarea și diagnosticarea.

person nmit026    schedule 03.08.2015

Raspunsuri destul de detaliate si tehnice. Adăugând doar o definiție simplă.

Idempotent = Re-runnable

De exemplu, operația Create în sine nu este garantată să ruleze fără eroare dacă este executată de mai multe ori. Dar dacă există o operație CreateOrUpdate, atunci ea afirmă re-runnability (Idempotity).

person Manish Basantani    schedule 13.08.2015
comment
Aceasta este o definiție înșelătoare. re-rulabilitatea nu garantează a fi idempotent. O operație poate fi reluată și în fiecare rulare poate adăuga efecte suplimentare la rezultat, astfel încât să nu fie idempotent. - person Saeed Mohtasham; 16.04.2018

Operații idempotente: operațiuni care nu au efecte secundare dacă sunt executate de mai multe ori.
Exemplu: o operațiune care preia valori dintr-o resursă de date și, de exemplu, o tipărește

Operații non-idempotente: operațiuni care ar provoacă un anumit rău dacă este executat de mai multe ori. (Pe măsură ce modifică unele valori sau stări)
Exemplu: o operațiune care retrage dintr-un cont bancar

person Mahmoud Abou-Eita    schedule 06.12.2012
comment
De fapt, un răspuns greșit! pentru operațiunea Idempotent a spune că nu au efecte secundare nu este corectă. pentru operațiunile non-idempotente care spune că provoacă ceva rău este un răspuns confuz. - person Saeed Mohtasham; 16.04.2018

O operație idempotentă asupra unui set își lasă membrii neschimbați atunci când este aplicat o dată sau de mai multe ori.

Poate fi o operație unară, cum ar fi absolute(x), unde x aparține unui set de numere întregi pozitive. Aici absolut(absolut(x)) = x.

Poate fi o operație binară, cum ar fi uniunea unui set cu el însuși ar returna întotdeauna același set.

noroc

person Arnkrishn    schedule 03.07.2009
comment
O operație idempotent este una în care f(f(x)) = f(x). își lasă membrii neschimbați nu este un răspuns corect. - person Saeed Mohtasham; 16.04.2018

Pe scurt, operațiunile idempotente înseamnă că operația nu va avea ca rezultat rezultate diferite, indiferent de câte ori operați operațiunile idempotente.

De exemplu, conform definiției specificației HTTP, GET, HEAD, PUT, and DELETE sunt operații idempotente; totuși POST and PATCH nu sunt. De aceea, uneori, POST este înlocuit cu PUT.

person Marcus Thornton    schedule 25.03.2016

my 5c: În integrare și rețea, idempotenta este foarte importantă. Câteva exemple din viața reală: Imaginați-vă că livrăm date către sistemul țintă. Date furnizate printr-o succesiune de mesaje. 1. Ce s-ar întâmpla dacă secvența este mixată în canal? (Așa cum fac întotdeauna pachetele de rețea :) ). Dacă sistemul țintă este idempotent, rezultatul nu va fi diferit. Dacă sistemul țintă depinde de ordinea corectă în secvență, trebuie să implementăm resequencer pe site-ul țintă, care ar restabili ordinea corectă. 2. Ce s-ar întâmpla dacă există mesaje duplicate? Dacă canalul sistemului țintă nu confirmă în timp util, sistemul sursă (sau canalul însuși) trimite de obicei o altă copie a mesajului. Ca rezultat, putem avea un mesaj duplicat pe partea sistemului țintă. Dacă sistemul țintă este idempotent, are grijă de el și rezultatul nu va fi diferit. Dacă sistemul țintă nu este idempotent, trebuie să implementăm deduplicator pe partea sistemului țintă a canalului.

person Leonid Ganeline    schedule 07.11.2013
comment
Idempotenta cererilor individuale trimise izolat de orice alte cereri (sau orice altceva care se întâmplă care schimbă starea sistemului) nu este același lucru cu reordonarea cererilor. O solicitare HTTP PUT și o solicitare HTTP DELETE ar trebui să fie ambele idempotente individual - dar asta nu înseamnă că ordinea apelării PUT și DELETE pe aceeași adresă URL nu contează, deoarece cererea PUT ar putea avea efecte secundare! - person Robin Green; 08.03.2016

reîncercați în siguranță.

Este de obicei cel mai simplu mod de a-i înțelege semnificația în informatică.

person teknopaul    schedule 06.04.2017
comment
Reîncercați implică ceva care a eșuat prima dată sau anterioară. Nu chiar la fel. - person Lasse V. Karlsen; 06.04.2017
comment
Cine mi-a editat întrebarea și mi-a dat un vot negativ? Nu acesta este textul pe care l-am postat?? - person teknopaul; 09.04.2017
comment
Puteți verifica jurnalul de editare făcând clic pe linkul de sub răspunsul dvs. care spune că a fost editat acum X ore sau similar. - person Lasse V. Karlsen; 09.04.2017

person    schedule
comment
este un răspuns concis chiar și după 10 ani. +1 - person snr; 23.06.2019