Tehno-istericale

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

PawntaJs – un server NodeJs pentru generarea elementelor bibliografice

De când mă știu, exersersarea de genul temă pentru acasă nu s-a lipit de mine niciodată. Am destestat cumplit exercițiile izolate undeva-n vid, însă mi-a plăcut teribil de mult să fac lucruri ce oricum m-au învățat mult mai mult.

Referințe

Referințe

Este și motivul de căpătâi pentru care modalitatea de antrenament sugerată de Robert C. Martin în Clean Coder, acele kata, nu prea funcționează, ritualul fiind așa: deschid una, mă uit cu ochi umezi de vițel la poartă nouă, o închid și mă apuc de altceva. Am încercat, aia e.

Citește mai departe

Mașina de scris automată

Am scris la un moment dat, ca un soi de exercițiu de doi lei, un mic utilitar pentru automatizarea citirii de la tastatură ale proprietăților unui obiect oarecare, cu structură previzibilă, suficient de simplă și relativ strict standardizată. Prin automatizare mă refer la a nu mai scrie per manus codul pentru a prelua valoarea fiecărei proprietăți ci a spune unei clase oarecare, citește-mi, te rog frumos, un obiect de tipul T și dă-mi instanța nou creată.

Motanul Patraulea e oarecum sceptic, dar nu are de ce

Motanul Patraulea e oarecum sceptic, dar nu are de ce

De curând, ce-a fost o la un moment dat o mică distracție pasageră, mi-a fost utilă în punerea la punct a unui banc de testare manuală pentru un sistem care primea contracte bine definite și suficient de simple și parte a rutinei de testare a fost, desigur, că voiam să furnizez valori manuale și să văd reacția instantanee.

Citește mai departe

Surogat

SURROGATE-2, Sergiu Grapă

SURROGATE-2, Sergiu Grapă

Vine Florică lunea la școală, fericit nevoie mare c-a parcat o gagică mișto, la clubul de șah dintre toate locurile. E blondă, cică, e și inteligentă. Iar Predi, cu nasul în caiet, copiind o temă: a, deci e inteligență artificială. De altfel, avea, Dumnezeu să-l ierte, darul de-a da câte una din fundul curții de stătea lumea-n loc.

Acu, dacă e să ne raportam cumva la toată daravera asta cu Inteligența Artificială, poate c-ar fi bine să o facem un pic în șagă, ca mai sus. Nu de alta, dar sunt șanse mari ca multe vorbe ce vin din domeniu să fie doar vorbe de clacă. O dată că poate unele sunt supraevaluate, apoi că, mai ales, multe lucruri banale (dar care marchează experiența cu știința și tehnologia) sunt lăsate de izbeliște și funcționează cam anapoda.

Bunăoară, Samsung-ul meu s-a actualizat la cel mai nouă și mai pro-europeană versiune, de rigeur blindată cu AI, dar navigația s-a dus bine, drept și foarte rapid în gard: gesturile corespunzătoare barei explicite de navigare s-au risipit prin apa Stix-ului și-au fost înlocuite cu unele cu care, chiar și după câteva luni, tot nu mă pot obișnui; și asta doar ca să facă loc unei mizerii de funcții de asistență (?) bazate pe o Inteligență mai Artificială decât blonda lui Florică, pe care oricum nu o vreau și nu o folosesc (nici blonda, nici funcția).

Citește mai departe

Cu boxa bluetooth la dentist

Mi-am luat la un moment dat, de curând, un Marshall Acton III. Boxă bună, alimentată sănătos direct de la rețea, la care te poți conecta inclusiv prin bluetooth. Frumos, elegant, însă doar cât de cât, pentru că are o meteahnă extrem de supărătoare: după zece minute de nefolosire întră-n stand-by, se deconectează de la calculator și rămâne așa până fie rotesc un buton oarecare, fie o reconectez explicit din Vindoză.

Inovare-n tehnologie

Inovare-n tehnologie

Mare păcat, mai ales că intrarea-n stand-by nu poate fi nici dezactivată, nici configurată la un interval mai mare. Ajung, astfel, să mă reconectez manual de fiecare dată când opresc sunetul dintr-un oarecare motiv. Nu e singurul model gândit cu zonele mai întunecate ale părților dorsale, ba mai mult, se pare că au scos posibilitatea de-a dezactiva acest iritant stand-by.

Citește mai departe

Inutilitarul woke – Samokritika pentru aitiști

Acum că managerii de proiect au găsit modalitatea de-a gestiona proiectele și echipele astfel încât să fie totul livrat la timp și, bien sûr, la cheie, a mai rămas un singur lucru de făcut: poliția șirurilor de caractere pentru a asigura un limbaj incluziv (???) astfel încât nimeni, nicicând, nicăieri să nu se simtă lezat în naturelul său simțitor.

Reeducare socială

Reeducare socială

Iaca prieteni, fidel cu proverbul pisica, de n-are treabă, se linge-n cur și-și face rană, există o unealtă care ajută le nouveau prolétariat la-mplinirea acestui deziderat. Este vorba de (in)utilitarul woke, un util asistent în procesul de samokritika, cu care [mai ales] toți cei din Sovietul de la Bruxelles suntem datori.

Citește mai departe

Beneficiile alcoolului izopropilic pentru sănătate

Nu vă grăbiți să-l dați pe gât! Nu, lasăți mă sticla jos și-ascultați! Și pâinea! Așa. E vorba de sănătatea mentală, adeseori tulburată de acel dispozitiv pe care ne-am dori să-l dezinventăm (pentru că șanse nu mai are) și, eventual, să-l reinventăm în altă formă oleacă mai puțini medievală: imprimanta, tovarăși, imprimanta.

Cartuș HP 650 negru

Cartuș HP 650 negru

Eu înțeleg că acum preocuparea sunt inteligențele artificiale și-s mai puțin prioritare elemente mai simple, cum ar fi gesturi tactile care chiar să funcționeze după actualizări și imprimante funcționale… da, înțeleg asta perfect, atâta doar că-n umila mea părere oamenii au învățat deja și singuri să compună în stil asemănător și cu vocabular specific roboților, nu-i musai nevoie de eforturi suplimentare aici.

Citește mai departe

Agerimi cu Asp.Net MVC Clasic, XSS și Kendo DataSourceRequest

Asemeni cangrenei numite lege și ocârmuire, în afara cărora omul modern nu mai are valoare individuală, și cu libăriile software secretul e o balanță fină între ce oferi cu titlu opțional, ce oferi cu titlu obligatoriu, ce pretinzi cu titlu opțional și, în sfârșit, ce pretinzi cu titlu obligatoriu. Ca-n banc, ai mai mult succes dacă pui și carne, nu doar căcat:

Ițic și Ștrul și-au deschis restaurante.
La Ștrul e coada zi și noapte la mititei, iar la Ițic bate vântul și, odată cu dânsul, falimentul.
– Mai Ștrul, spune-mi și mie, cum faci tu mititei, că la tine lumea da buzna și la mine nu calca nimeni.
– Pai cum să-i fac, jumătate carne, jumătate rahat.
– Ah, tu pui și carne?

Că să intru direct în… pâine, cei care au învățat inginerie software în perioada-n care încă nu devenise ceva mișto-caracașto practicat la propriu pe jenunche-n poziție de semizen, cu zâmbet hlizit până la urechi, își amintesc de vremurile mai vechi ale ASP.Net MVC, care-a-ndulcit dictatura ideologică bazată pe valori europene propovăduită de WebForms, reținând, probabil din nostalgie, câteva apucături neplăcute.

Hai că merge

Hai că merge

Una din numitele metehne este răgălia numită request validation: cum detecta că-n parametrii cererii HTTP există o fărâmă de cod HTML, jmaf, eroare, excepție, sfârșitul lumii, sabotaj al rușilor, început de anti-democrație și anti-valori-europene, adică HttpRequestValidationException. Este marginal un lucru bun și ilustrarea perfectă (una din ele), a dictonului logudurez Drumul spre Iad e pavat cu intenții bune.

Citește mai departe

Conflicte și finețuri

Totul a-nceput de la o problemă reclamată de un utilizator pe pagina modulului WP Trip Summary (plus capturi de ecran aici). Mi-a luat mult să-mi dau seama care era cauza, anume un conflict între două versiuni de Leaflet JS: una inclusă de WP Trip Summary, alta inclusă de Waymark.

Cea efectiv folosită era, evident, ultima dintre ele două versiuni (în cazul nostru, ținând cont de ordinea de execuție, versiunea din WP Trip Summary). Deci Waymark utiliza o versiune și o instanță diferite de Leaflet JS. Pe lângă diferența de versiune-n sine (care putea sau nu să fie o problemă), se pierdeau, evident, și plug-in-urile înregistrate de Waymark.

Conflicte...

Conflicte…

Miza reală a soluției nu era musai rezolvarea interacțiunii cu Waymark, important aspect așa cum era, cât asigurarea faptului că nu va mai intra în atari conflicte pe viitor, menținând un grad de izolare care să:

asigure mediul de execuție pe care l-am configurat (versiunea de Leaflet JS dorită + plug-in-urile Leaflet JS înregistrate, cu exact versiunile cerute de modul);
nu interfereze cu mediile de execuție ale altor module, chiar dacă acele module nu și-au luat la rândul lor modalități de protejeare a propriilor dependințe.

Citește mai departe