Tehno-istericale

Recensământ

Ca organizare pe disc, avem o structură de proiecte destul de, să zicem, variată. Unele au început ca mici experimente locale, promovate la repo-uri și dezvoltate oficial. Altele invers. Unele au rămas repo-uri locale în Mercurial, altele promovate la Git, proces de altfel în curs. Bun, trecând peste motivații și mecanisme, periodic facem câte un recensământ să vedem care ce are.

Aici odihnesc următoarele

Aici odihnesc următoarele

Și, fiindcă în timp a crescut blănița, mi s-a făcut lene să mai caut ad labam și am compus un mic catren în PowerShell ce face fix asta: scanează un director rădăcină și-mi spune ce directoare sunt sub controlul Git, Mercurial sau în afara oricărei jurisdicții, scriind rezultatul într-un CSV. Dacă subarborele pornind de la un folder aflat imediat sub rădăcină nu are niciun repo, atunci este raportat doar dânsul, nu toată sub-structura.

Citește mai departe →

Șpârle cu rapoarte Telerik Report Engine (I) – Dujmani din umbră

Am primit câteva jelanii vis-a-vis de niște rapoarte ce nu se generau, producând o eroare al draima de pâcloasă la prima vedere: System.ArgumentNullException: Value cannot be null. Vă rog, nu vă înghesuiți cu prea multe detalii că sunt un simplu om!

Foto: Bogdan Stoica

Foto: Bogdan Stoica

Nici stiva de funcții apelate (stack trace, pentru iubitorii de franceză) nu fu cu mult mai clarificatoare, cu atât mai puțin fiindcă problema-și avea originea într-unul din cotloanele umede și-ntunecate ale Telerik Report Engine. Orientativ:

Citește mai departe →

Și cu sula-n dos, și cu sufletul în rai

Contrar titlului, nu vreau să vorbesc despre valori europene. Nu, e vorba că, tot lucrând cu țârâita la Wp Trip Summary, am început să schimb treptat inclusiv convenția folosită pentru denumirea și organizarea claselor: din stilul PEAR A_B_C în structura bazată pe namespace-uri A\B\C.

Foto: Bogdan Stoica

Foto: Bogdan Stoica

Cum a le schimba pe toate deodată este un efort prea mare și-n general fastidios, cum pentru o singură clasă vor coexista o vreme ambele modalități de invocare, trebuie ca procesul să nu impieteze asupra funcționării; deci să pot folosi și A_B_C, și A\B\C. Ca un exemplu concret: și Abp01_Env, și WpTripSummary\Env.

Citește mai departe →

EnlighterJS are mici probleme cu faza scurtă

De fiecare dată când adăugam într-un articol o secvență de cod în rând cu textul – cum Tuz–Guttenberg mi se pare o pecingine supraturată, folosesc Classic Editor – EnlighterJS îmi adaugă de fiecare dată două linii de prisos. Problema s-a dovedit a fi de la faptul că, deși își construiește elementul HTML părinte în funcție de mod (code pentru inline, pre altminteri), adaugă otova un paragraf gol la final:

editor.insertContent(
   sp + 
   '<' + tag + 
      ' class="EnlighterJSRAW" data-enlighter-language="' + 
      e.data.lang + '">' + 
         code + 
   '</' + tag + '>' + 
   sp + 
   '<p></p>'
);

Cea mai la îndemână soluție a fost un mic modul pentru TinyMCE unde interceptez evenimentul BeforeSetContent și, dacă detectez un conținut asemănător cu o secvență de cod integrat în text (<code>*</code>), înlătur acel paragraf gratuit.

Citește mai departe →

Atitudini diacritice

Tavarișci soldațî, ia pricazîvaiu vam: ftargaitiși și razgromiți rumînskîi dușmanschi! Asa răsună ordinul comandantului. Ivan deschise aplicația KudaBlyat din dotarea tancului, tastă Bucureşti la destinație, noul Ţarisk ca punct de plecare, la care aplicața răspunse cu Marșrut niet, tavarișci. Ivan scuipă alăturea prin turelă și-nchise ecranul. Privi lung și trist câmpia administrativă din fața lui.

Șirurile de caractere sunt mereu motiv de sărbătoare

Șirurile de caractere sunt mereu motiv de sărbătoare

La fel se-ntâmplă pentru fiecare din cei trei milioane de luptători îndreptați, într-adevăr, spre plăpânda noastră țărișoară. Blocată într-o buclă pentru depanarea situației, cu ramificații și complicații birocratice, tancurile epuizară motorina stând pe loc, iar invazia se anulă până la noi ordine.

Conaționalii noștri nici măcar nu știau ce fel de glonț le trecuse pe la ureche. Întrebarea rămânea totuși: ce se întâmplase de pieriseră la gunoi trei ani de pregătiri, tone de carburant, munți de hărți și întreaga demnitate cartografică a Imperiului Tovărășesc?

Citește mai departe →

Mâinile slobode fac lucrătura Diavolului

Versiunile dedicate mentenanței – scurte, limitate și în general banale – sunt, în ciuda caracterului cenușiu și fastidios, acte de igienă elementară în viața unei aplicații. În primul rând direct, întrucât micile probleme (ce pot ascunde investigații realmente interesante, e drept) produc uneori fricțiuni disproporționat de mari; în al doilea rând, indirect, deoarece oferă ocazia revizitării unor zone de cod ce mai mult ca sigur pot fi îmbunătățite fără contuzii bugetare.

Pe bună dreptate

Pe bună dreptate

Iar dacă un lucru e adevărat, este că există mereu un pic de gunoi sub preș, uneori generat inclusiv (sau mai cu seamă) de ingineri experimentați, știți voi – cei cu naturelul simțitor, ce dau ochii peste cap și îngână citate din cei mai de seamă instalatori neomoderniști: cine v-a lucrat aici, că și-a bătut joc de voi.

Și, deși sunt vădit răutăcios în observația mea, acumularea unor astfel de restanțe este, din varii motive, inevitabilă. Ba că e prea plictisitor un anumit detaliu și este expediat cu silă, ba că un anumit mod de-a face lucrurile a început temporar și-a ajuns drept cutumiar. Bref e că se strâng tot felul de bisericuțe cu turle răsucite ce trebuie chestionate, chit că se cer venerate.

Citește mai departe →

Sintaxa îți ușurează scrisul, nu gândirea

Limbajul C# a evoluat foarte frumos în direcția bogăției și eficienței în exprimare, uneori în detrimentul purității academice. Fiecare versiune pune varii trufandale pentru, bunăoară, reducerea ceremoniei, favorizarea logicii și trimiterea fricii în fundal, ori pentru producția expresivă de valori.

Iar prin frică, desigur, mă refer la manifestările noastre defensive precum verificarea diverselor variabile, indiferent de scop: că este sau nu este null, că un număr stă bine chitit într-un interval bine definit, că un obiect oarecare este „activ” ori ba ș.a.m.d.

Superior pe orice teren

Superior pe orice teren

Ele sunt binevenite, iar eu nu-s omul să nu le folosească, ba se poate spune că prezint o vagă propensitate pentru abuz. Pe de altă parte, nu-s nici omul care să nu cârcotească, deci mai întâi am să trec prin ele mai mult pentru propria-mi plăcere, ca o cafea caldă-ntr-o dimineață rece, apoi o să sorbim și un pic de zaț.

În majoritatea lor covârșitoare, notițele mele acoperă diverse aspecte ale operațiunilor pe baza pattern matching, întinzând câteva tentacule și-n direcția construcției obiectelor, unde, iată, avem acum o nouă opțiune în afara constructorilor standard. Și înainte de-a purcede aș vrea să-mi scarpin o traducere mai elegantă (cât de cât) pentru mâncărimea termenului pattern matching.

Citește mai departe →

Kendo Grid – Cum se poate folosi-n loc de Kendo Property Grid (și de ce)

În mod ideal, Kendo Property Grid ar trebui să rezolve elegant problema editării dinamice a proprietăților unui graf de obiecte. În practică însă, fie nu este inclus în pachetul Kendo (valabil pentru versiunile mai vechi), fie funcționalitatea lui produce — ca să folosesc un termen semitehnic — costuri psihiatrice neprevăzute.

În cazul meu, o situatie ce reunea două condiții simultan – un model de date ce nu mai era supus negocierii (de altfel, foarte potrivit scopului său) cu câteva elemente problematice, respectiv variabil în funcție de elementul editat (adică pentru fiecare tip de element exista câte o clasă configuratoare, proprietățile fiecăreia fiind ceea ce se dorea expus în formularul de adăugare ori modificare) – mi-a scos-o de pe radar după o lungă sesiune de navigat cu toate pânzele sus prin vechi subterane ale limbii.

Variabilitatea modelului a fost de departe cel mai mare impediment: deși fațada MVC a  componentei Property Grid este relativ pricepută în a traduce o clasă dată într-o definiție rezonabilă a ceea ce trebuie mânuit tot rămâneau câteva retușuri de făcut în structura câmpurilor pentru fiecare clasă-n parte, deci un potențial de opt definiții complet separate.

Citește mai departe →

Porolopopilcăriță

Am avut de curând un duel aproape medieval pe o temă situată undeva la granița filozofiei aplicate. Pe scurt, mi-am luat o clanță consistentă pentru o linie de cod fiindcă, citez într-o traducere aproximativă din logudureză: cineva cu experiența ta n-ar trebui să greșească atât de jenant încât să nu-și verifice existența datelor de intrare, putând produce drept urmare mesaje de avertizare.

Este vorba de un proiect scris în PHP, iar linia vătămătoare (de fapt liniile, mă rog) prelua un parametru din variabila super-globală $_POST și apoi spune altor entități ce poate face cu dânsul:

$pillarName = $_POST['pillar_name'] ?? '';

În apărarea interlocutorului meu, este foarte ușor să cazi pradă unei confuzii, căci PHP este nimic dacă nu un limbaj de lumini și umbre. Având încă niște pâine de mâncat, m-am abținut să-i răspund fățiș cu aceleași accente stilistice, transmițându-i în schimb voalat prin intermediul unei expuneri comparative precum cea de mai jos.

Citește mai departe →

A fi sau a nu fi nimeni și nimic

Odată cu tehnica numită pattern matching (căreia am să-ncerc să-i atribui traducerea verificare tipizată să văz cum se simte la limbaj) – o modalitate de-a verifica dacă o expresie întrunește anumite caracteristici (și de acționare pe baza rezultatului) – există o posibilitate mai apropiată de limbajul natural de-a testa dacă o variabilă are sau nu are valoarea NULL:

Company isNull = null;
Company isNotNull = new Company();

Console.WriteLine(isNull is null);
Console.WriteLine(isNotNull is not null);

Totuși, abordarea nu este complet identică din punct de vedere semantic cu folosirea operatorilor de egalitate (==), respectiv inegalitate (!=). La prima cercetare s-ar putea să pară contraintuitiv, însă, strict semantic, operatorul de egalitate verifică dacă-i egal, iar expresiile is/is not verifică dacă sunt ori nu sunt. Anumiți filozofi ar juisa până-n străfundul nădragilor.

Citește mai departe →

Nevoia-i cel mai bun profesor – Câteva noutăți de la PHP 8.3 încoace

În dulcele stil clasic Te-am plătit o dată și trebuie să mă servești pentru totdeauna am primit un apel telefonic la capătul căruia era un om teribil de supărat cu acuzația directă că nu merge și trebuie să fac pe dracu-n patru să fie din nou brici. Și, deși uit multe lucruri, fiind mai degrabă căscat, două detalii reținute cu sfințenie sunt termenul de garanție și condițiile de acordare.

You've got the wrong woom

You’ve got the wrong woom

Drept consecință, vocea de la capătul telefonului a primit prima veste proastă: garanția expirase și, din câte îmi amintesc, nu avem un contract de mentenanță. Și, colac peste pupăză, eu doar i-am operat niște modificări punctuale pe ceva deja existent, deci nu pe mine m-a plătit grosul. Așadar, investigația costă atât, durează atât și în urma dânsei vom stabili și ce soluții sunt, cu costurile aferente de timp și marafeți.

Citește mai departe →

Mic utilitar C# pentru extragerea conținutului relevant dintr-un fișier PEM

Formatul PEM (Privacy-Enhanced Mail) este o modalitate bazată pe vechea filozofie antică textus chiorensis de-a împacheta date binare – de regulă chei criptografice, certificate X.509 sau alte asemenea artefacte criptografice – într-un fișier ușor de transmis prin canale de comunicație ce suportă exclusiv codificări ASCII.

Într-adevăr

Într-adevăr

Procedura presupune codificarea Băse64 a conținutului binar reprezentând artefactul în format ASN.1 serializat DER (Distinguished Encoding Rules) și-ncadrarea rezultatului obținut între două linii delimitatoare cu o sintaxă bine definită, cum ar fi, în cazul certificatelor (mai jos, un exemplu complet):

Citește mai departe →

Kendo Scheduler – Ordonarea evenimentelor

În fiecare versiune a unui proiect de lungă durată la care lucrez sunt incluse ca la o dublă de probleme de reparat ori sâcâieli de îmbunătățit. Una din ele suna destul de ciudat și privea o pagină construită în totalitate în jurul a două instanțe de Kendo Scheduler, ambele inițializate și configurate folosind libăria lor ajutătoare pentru ASP.NET MVC.

Chiar că

Chiar că

Pe scurt, utilizatorii reclamau că uneori, fără vreun tipar anume, după ce operau actualizări sau ștergeri informațiile vechi rămâneau agățate-n interfață. La prima vedere totul părea bine cuplat, adică folosind evenimentele Save, Edit respectiv Remove:

Citește mai departe →

O problemă de simultaneitate, Entity Framework și SQL Server

Am avut de curând acel soi de situație neplăcută, știți voi cei din branșă, din acelea ce n-au cum să se-ntâmple; cu alte cuvinte, din acelea ce-au foarte mari șanse de-a se manifesta supărător de intens și frecvent și cu umflături. La origine o problemă de acces simultan la date, unul din motivele pentru care n-ar fi trebuit să apară este simplul fapt că nu există niciun scenariu util, oficial document ori măcar suportat.

Uite mă, Costele, de-aia te-ncurci

Uite mă, Costele, de-aia te-ncurci

Cu totate acestea, operatorii au făcut-o, fiind, drept consecință, necesară o intervenție spre corectare, aplanare și reinstaurea voioșiei și, desigur, o modalitate de-a preveni disfuncționalități ulterioare.

În sine, au existat două cazuri distincte ale problemei date, ambele corespunzătoare aceluiași aspect funcțional (practic insesizabile de către un utilizator):

A) când se actualiza un set de date, respectiv
B) când se crea unul nou.

Citește mai departe →

Crash another day – o utilizare șucară pentru uneltele de testare automată (I)

Consola NextUp ERP Server are o zona pentru afișarea jurnalului cererilor venite de la diverșii consumatori conectați; acea zonă este un fel de casetă text ce nu poate fi modificată, în care se tot adaugă, fără a fi niciodată ajustat sau complet golit conținutul său, afară de situația opririi și repornirii manuale a server-ului.

Atmosferă de lucru

Atmosferă de lucru

Din cauza construcției interne a componentei (DevExpress.XtraEditors.TextBoxMaskBox, am și găsit comportamentul documentat la un moment dat în zona de suport a DevExpress, reclamat de un alt utilizator) tot procesul descris determină creșterea non-liniară a memoriei ocupate de-ntreg programul, sistemul devenind instabil pentru o sesiune de lucru de aproximativ 25000 de cereri (cu sesiuni depășind lejer 100 000) executate-n secvență rapidă (genul programului: aplicație de transfer).

Citește mai departe →