Tehno-istericale

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

Cum se calculează numărul de comenzi plasate-n WooCommerce pentru un anumit cupon

Presupun aici că se pleacă de la codul de cupon, presupunere pe care n-o fac de dragul presupunerii or constrângerii, ci pleacă dintr-o nevoie particulară. Lucrurile sunt destul de simple aici, există o funcție standard pentru obținerea ID-ului de cupon – wc_get_coupon_id_by_code.

$couponId = wc_get_coupon_id_by_code($couponCode);

Următorul pas (sau primul dacă plecați direct de la ID) este folosirea tabelei wc_order_coupon_lookup (nu am inclus în denumirea tabelei prefixul configurat în WordPress) pentru a determina numărul de comenzi pentru acel ID de cupon. Această tabelă menține, pentru fiecare comandă (reprezentată aici prin ID-ul său – coloana order_id) ce cupon a fost folosit (reprezentat și el prin ID – coloana coupon_id).

Tabela wc_order_coupon_lookup

Citește mai departe

Librărie .NET/C# pentru verificarea contribuabililor pe baza CIF-ului

Din diverse proiecte s-a condensat în timp o mică librărie pentru consumarea serviciului web ANAF prin care se poate verifica existența unui contribuabil, precum și dacă este-nregistrat în scopuri de TVA. De fapt, funcționalitatea oferită este cea din urmă, dar implicit poate fi folosit și pentru verificarea existenței unui cod fiscal.

Detalii

Detalii

Librăria este scrisă pentru .NET 6.0 și a fost gândită pentru serviciul sincron, versiunea 8, a cărui specificație poate fi găsită aici. Cred că poate fi consumată și versiunea 7, dar nu am încercat. În tot cazul, am acoperit toată structura de date oferită de răspuns; n-am avut personal nevoie de toate datele acolo, dar dacă tot am publicat codul, am zis să fie o treabă făcută nu musai cap-coadă, ci măcar cu un cap și cu o coadă.

Citește mai departe

Afișarea denumirii și adresa locker-ului EasyBox folosind modulul oficial SameDay pentru WooCommerce

Pe lângă problema cu netrimiterea datelor locker-ului EasyBox ales, mai este loc de o îmbunătățire a ergonomiei modulului SameDay pentru WooCommerce: afișarea informațiilor locker-ului ales (nume și adresa) atunci când se afișează detaliile comenzii (în e-mail-ul de confirmare, panoul de administrare, contul de client etc.).

Clarificări

Clarificări

Motivele sunt evidente, așa că o să trec direct la descrierea soluției, adăugând doar că premisele de la care plec sunt:

– că oriunde este afișata metoda de transport asociată unei comenzi trebuie să fie afișate și aceste informații;
– că există doar o metodă de transport pentru o comandă.

Citește mai departe

Please choose your EasyBox Locker!

Eroarea din titlu am primit-o lucrând la un magazin virtual peste WooCommerce, având instalat modulul de livrare prin SameDay (problemă pe care au mai întâlnit-o și alții). Ei, cu toate că este selectat locker-ul la care să fie livrată comanda, modulul emite acest mesaj. Pentru început, am aruncat un ochi în codul sursă al modulului:

Sursa erorii

Sursa erorii

Cu alte cuvinte, se purta ca și cum datele nu ar fi fost trimise deloc. Să consultam și globul de cristal, adică Developer Tools – Network. Șoc sau nu, o să-ți vină sau n-o să-ți vină să crezi așa ceva, dar datele nu erau acolo deloc. Voilà, precum zăpezile anului trecut, precum bunul simț la ecologiști, imposibil de găsit:

Citește mai departe

Știu ce este, dar ce reprezintă?

Mai întâi, desigur, trebuie să stabilim coordonatele discuției. Este vorba despre situația în care lucrăm (fie pentru că am ales ca atare, fie că nu avem de-ales) la un proiect unde accesul la date este abstractizat:

– printr-un model de date implementat printr-un set de clase (entități);
– folosind un ORM oarecare pentru gestionarea corespondenței dintre entități și diversele artefacte din baza de date (tabele, dar nu numai);
– folosind repository-uri pentru a accesa entitățile respective;
– în sfârșit, ca să adăugăm o dimensiune concretă, folosind C# ca limbaj de bază și Entity Framework drept ORM.

Care-cum?

Care-cum?

Folosind Entity Framework, se pune problema gestionării DbContext-ului, adică a modului în care trebuie distribuit între diversele repository-uri implicate într-o singură tranzacție. Dintre toate variantele, m-am oprit în cele din urmă pe cele descrise aici (și vă recomand să citiți înainte de a continua).

Citește mai departe

Personalizarea listei de clase de livrare în WooCommerce

Cel mai simplu lucru pe care ți l-ai dori să-l obții ar fi să adaugi o coloană nouă, dar până și simplitatea asta suportă câteva adnotări, adică prezintă o serie de chichițe și umflături. Mai dificil este să adaugi o acțiune conextuală nouă pentru fiecare rând din lista de clase de livrare.

TL;DR,

TL;DR,

Adăugarea unei noi coloane

În întreprinderea noastră, procesul tehnologic pentru adăugarea unei noi coloane presupune, după obținerea avizelor necesare de la autoritățile competente, două lucruri:

înregistrarea coloanei în capul de tabel (adică înștiințarea WooCommerce că, hei, am dori și noi o coloană nouă în acea tabelă, dacă se poate și nu deranjăm) și
furnizarea unei valori pentru fiecare celulă corespunzătoare acelei coloane, pentru înregistrarea (zi-i, bre, rând!) corespunzătoare fiecărei clase de livrare.

Citește mai departe

Manțocării cu Mono Cecil

Să presupunem că, total benign și mânat de duhul blândeții, ai nevoie să ajustezi capabilitățile oferite de o aplicație la al cărei cod sursă nu ai acces neam. Să mai presupunem că aplicația este scrisă-n .NET (ce convenabil!) și că ajustarea capabilităților e controlată direct dintr-o clasă anume dintr-un assembly oarecare, prin niște proprietăți ce returnează un simplu true/false (cel puțin legat de aspectele care importă).

Motanul Patraulea, făcându-mi code review

Motanul Patraulea, făcându-mi code review

Poți să livrezi la rândul tău scuze sau poți… să-ți creezi o variantă modificată a assembly-urilor în cauză astfel încât să-ți poți vedea mai departe de lucru, de viață și de facturile care te vor îmbogăți dincolo de cele mai umede visuri ale avarului.

Și, de 10 Euro, poți să iei un ecler și un cico nevesti-tii că te suportă așa programator cum ești (ah, drama fiecărui om ce face umbră pământului, unii cu folos, alții fără: vrea să fie primit de semenii lui așa cum e, dar nimeni nu-i obligat să o facă!). Iar dacă nu ai sau e prea cățea independentă ca să merite, poți lua de 10 Euro bobițe pentru motanul Patraulea.

Citește mai departe

Kobyashi Maru

Am încheiat recent un proiect având interacțiunea cu o bază de date SQL Server prin Entity Framework (EF) 6.3, elemente care nu puteau fi supuse modificării. Nu că ar fi ceva rău, nu că as avea ceva de obiectat, dar este important de menționat pentru restul povestirii.

Ilustrație - DALL-E2

Ilustrație – DALL-E2

Pe lângă legătura standard dintre entități și tabele (sau view-uri) din baza de date, am fost nevoit să folosesc și interogări construite, folosind, Database.SqlQuery<TSmuff>(), pe baza unor funcții SQL ce returnează date tabelare, dar cu parametri ceva mai… deosebiți – TVP, adică Table Valued Parameters.

Acest fapt necesită crearea explicită a unor instanțe de DbParameter; nu pot fi transmise pur și simplu valorile, fapt ce-ar lăsa-n sarcina EF crearea instanțelor de DbParameter atunci când este momentul. Și, ca o restricție suplimentară: Database.SqlQuery<>() acceptă drept argumente ori doar valori, ori doar instanțe de DbParameter; nu poți să le combini.

Citește mai departe

Stakhanovise.NET – Sau cum să-ndeplinești cincinalul în patru ani

Motto
Stahanovismul n-a murit, doar un pic s-o răspândit.

Stahanovismul a fost o mare găselniță. A rămas în lume precum râia – nici în ziua de azi nu și-a luat liber, nici măcar o zi. Atât de mare a fost impactul său civilizațional încât prin anii ’60 sau ’70 CIA a desfășurat o operațiune specială pentru extragerea sa pe șestache din Uniunea Sovietică, deîmpreună cu coaiele lui Lenin păstrate-n formol (mai mult despre Dânsele într-un studiu istoric de primă clasă pe care-l voi publica în timp util).

Cele două artefacte au clădit practic întreaga lume nouă de o parte și de alta a oceanului. Marile corporații de azi ar fi fost practic de neimaginat fără sarabanda derivatelor motivaționale sintetice din această mare filozofie de viață.

Politicile publice de sănătate, de gen, transgen și contragen, administrative, întreg Sovietul European, toate se bazează pe stahanovism și aerul doct degajat de acele două Biluțe care-au schimbat lumea așa cum o știm.

Dacă ar trăi astăzi, Vasile Roaită ar mai sta o dată cu mâna pe sonerie, dar acum de fericire. Din păcate, Dânsul nu mai este cu noi și, într-un act de insuficientă compensare, dar cu sincere Sentimente Proletare, anunț cu tremur în voce un nou proiect marca Atelierele Boia: Stakhanovise.NET.

Citește mai departe