Tag Archives: computers

pyodbc & centos 6

Pe CentOS 6, versiunea de pyodbc este 2.1.7 si are un mic bug atunci cand are de interoperat cu baze de date care tin mortis sa dea datele encoded UTF-16 si face double-encoding la orice rezultat primit de la baza de date in urma unei interogari, daca ruleaza pe un sistem pe 64 de biti (cam asta am inteles io din descrierea problemei).

Descrierea BUG-ului se afla la https://code.google.com/p/pyodbc/issues/detail?id=78 iar rezolvarea se face prin modificarea unei singure linii de cod si stergerea unei litere :)

La http://www.imacandi.net/sin/blog/wp-content/uploads/2015/09/pyodbc-2.1.7-1.el6.x86_64.rpm se gaseste un RPM cu pyodbc patchuit si recompilat.

Cu ocazia asta mi-am adus aminte si de cum se foloseste rpmbuild.

double failures

In anii astia de acum (adica 2014/2015) eu nu pricep de ce vreun producator de echipamente ar face doar echipamente cu o interfata “IN” si una “OUT” si desi face clustering, nu poti face agregare in nici un fel astfel incat sa ai protectie in caz de pica switch-ul A si echipamentul B (incrucisat adica). Complicat nu este, mai ai un nivel de abstractizare cu impact minim ca toti linucsii astora de fac “appliance”-uri stiu de bonding si alte crapuri.

Srsly, nu pricep de ce toti zic, eh, lasa ca te descurci tu cum faci asta, noi nu vrem sa te ajutam in nici un fel, noi punem cat mai putine interfete pe chipamente si aia e.

Scapi de nenumarate griji cu un setup din asta, se pot strica chestii si poti sa-ti vezi de ale tale pana ai timp sa le repari tot asa… dar nu, s-au gandit unii ca de ce sa fie simplu cand poate sa fie complicat.

Asta e un rant de voiam sa-l zic de mai demult, de prin mai, da a trebuit sa fixez ce era muit si am uitat de el. Priorities, priorities.

ip number

Well, se pare ca m-am prostit si am descoperit niste roti patrate. Noroc ca #mumu e vigilent si imi zice cand sunt prost. Cred ca trebui sa raman la consultanta, nu la chestii din astea de implementare.

SELECT city,country FROM geoip_v4 WHERE
ip_from <= inet_aton('10.20.30.40')
AND
ip_to >= inet_aton('10.20.30.40');

Dar pentru istorie, ca sa mai rada si altii de ce chestii debitez cateodata, ramane si textul initial, cu mentiunea:

<rpetre> ce credeai ca e formula aia magica de ip to number? :)

Exista niste unii, care se cheama IP2Location de vand informatii de IP GeoLocation, adica pe scurt iti zic in ce oras/tara este inregistrat un subnet. Ei datele astea le dau CSV sa le incarci in ce vrei tu si dupa aia sa faci cautari in ele.

Pentru ca nu toate bazele de date au IP/subnet ca tip de data, daca te uiti dupa o singura adresa IP si tu tii subnet-uri in DB trebuie sa faci niste programare la mijloc sa afli de al cui sunbnet apartine o adresa IP. Asa ca oamenii astia au inventat ei o chestie de se cheama IP number: adica transformi 1.2.3.4 intr-un numar dupa o formula si dupa aia vezi tu cam intre ce valori se situeaza numarul ala in baza de date si afli cum ii cheama pe aia de-l utilizeaza si unde sunt inregistrati.

In baza de date informatiile sunt tinute sub forma de IP_FROM, IP_TO, CITY, COUNTRY plus alte chestii irelevante pentru post-ul asta. IP_FROM e numarul de la care “pleaca” un subnet si IP_TO numarul unde se “termina” subnetul. Formula dupa care se calculeaza IP number este:

X = A x (256*256*256) + B x (256*256) + C x 256 + D

In SQL (PostgreSQL* compatibil), un lookup dupa 10.20.30.40 se transforma in:

SELECT city, country FROM geoip_v4

WHERE ip_from <= 

((split_part('10.20.30.40','.',1)::INT * (256*256*256))
+
(split_part('10.20.30.40','.',2)::INT * (256*256))
+
(split_part('10.20.30.40','.',3)::INT * 256)
+
split_part('10.20.30.40','.',4)::INT)

AND ip_to >=

((split_part('10.20.30.40','.',1)::INT * (256*256*256))
+
(split_part('10.20.30.40','.',2)::INT * (256*256))
+
(split_part('10.20.30.40','.',3)::INT * 256)
+
split_part('10.20.30.40','.',4)::INT)

<= si >= ajuta sa faci match pe adresa de retea si pe broadcast daca stii exact unde ma-sa se termina subnet-ul pe care-l cauti si daca chiar vrei asta, altfel e bine doar cu < si >.

Cast-ul la INT l-am pus ca baza de date imi facea cast in FLOAT dupa care il compara cu INT si ca sa-l compare mai facea un cast din FLOAT in INT. Am sarit un pas, ca profilerul pentru acelasi query zicea ca dureaza ~500msec sa se uite in 11M de inregistrari (beware of my small data) pentru VARCHAR::INT si vreo 45sec sa se uite tot acolo dupa VARCHAR::FLOAT::INT. E un pic dubios rezultatul de la profiler pentru ca nu cred ca dureaza asa mult sa te faci ca n-ai nimic dupa virgula, dar si faptul ca daca rulezi un query cu cele doua variante diferenta ochiometrica intre ele e de maxim 2 secunde.

Pe de alta parte, nu-s mare fan ideii de “la mine pe laptop merge”, mai adaugati voi hardware sa mearga repede si la voi.

ssh trick

Am un setup care ruleaza niste scripturi in cron care iau niste fisiere dintr-o parte si le muta in alta (asta fiind varianta scurta). Fisierele sunt aduse de la distanta pe sistem.

Catch-ul cu asta e ca daca fac un scp si ma prinde cron-ul la jumate de transfer, se mucifica operatiile de dupa, ca o sa ajung sa am un fisier intr-o stare nu tocmai cunoscuta. Asta s-ar putea rezolva verificand cumva integritatea fisierului inainte de a incerca sa-l mut, insa mi s-a parut un pic peste mana (ca trebuie sa adaug si partea de integritate la fisier, sa verific ce si cum si parca e prea multa bataie de cap).

Partea buna in schimb e ca daca pe Linux (cred ca pe *NIX in general) vrei sa muti un fisier dintr-o parte in alta pe aceeasi partitie, operatia este atomica, asa ca solutia de a ma asigura ca fisierul ala fie a ajuns tot intr-un director sau nu, este:

ssh [email protected] "cat - > ~/file1 ; mv ~/file1 ~/work/file1"  < file1

Ce face treaba asta? Un cat peste o conexiune ssh si apoi muta fisierul scris initial in ~/ intr-un alt director numit ~/work.

Nu este chiar perfect pentru ca presupune ca ssh nu se strica in timp ce se transfera fisierul. Treaba asta insa se poate fixa send-side verificand codul de eroare intors de ssh care va fi non-zero daca orice din tot lantul ala de comenzi nu functioneaza si atunci poti sa mai bagi o fisa cu transferul.

Nu e cine stie ce descoperire, dar pot sa-mi fac treaba elegant :)

ms filetime & unix time

TIL despre FILETIME, adica cum tine Microsoft timpul.

FILETIME inseamna cate perioade de 100ns au trecut de la 1 Ianuarie 1601 pana la momentul asta si este pe 64 de biti, sa aiba loc sa bage timp :)

Formula de transformare in UNIX time, adica secunde trecute de la 1 Ianuarie 1970 pana acum este in felul urmator pentru o valoare a FILETIME de 130796482290000000:

EPOCH_DIFF = 116444736000000000
RATE_DIFF = 10000000
INTERMEDIATE_RESULT = (130796482290000000 - EPOCH_DIFF) / RATE_DIFF
RESULT = (INTERMEDIATE_RESULT * 1000)

Din RESULT se se iau primele zece cifre si rezulta UNIX TIME (epoch), adica 1435174629 care traduce in “Wed, 24 Jun 2015 19:37:09 GMT” (toate calculele se fac UTC).

expect

Azi mi-am stors creierii sa aflu de ce un script merge OK rulat din CLI dar din cron nu.

Scriptul meu facea niste operatii, dupa aia apela un script de expect care rula un scp si tot asa. Anyway, important era sa mearga scp-ul ala si sa mute un fisier dintr-o parte in alta.

Din CLI mergea de n-avea aer:

spawn scp $fisier [email protected]:/locatie
expect "Password:"
send "parola\r"

Din cron crapa cand cerea scp parola in mod subit.

Dupa dat cu capu de masa si de servere si un pic de cautat pe interneti am gasit varianta salvatoare:

spawn scp $fisier [email protected]:/locatie
expect "Password:"
send "parola\r"
expect 100%
sleep 5
exit

Banuiala mea e ca din cauza ca atunci cand ruleaza din cron n-are terminal, scp nu poa sa scrie pe undeva progresul de copiere si atunci moare dar fara sa chitaie de eroare, in schimb daca ii dau cu expect 100%, atunci cumva scrie intr-un fel de buffer al lui expect si nu se mai strica jucaria.

Asta din categoria cu ce-mi mai ocup eu timpul in ultima vreme: fac Frankensteini din bash, expect, sed, awk, python, perl si ce mai am pe la indemana :)

ssh on windows

http://blogs.msdn.com/b/looking_forward_microsoft__support_for_secure_shell_ssh1/archive/2015/06/02/managing-looking-forward-microsoft-support-for-secure-shell-ssh.aspx

A inghetat iadul. Apocalipsa e aproape.

ms_ssh_windows_server

ms_ssh_windows_p2

“As Microsoft has shifted towards a more customer-oriented culture”. Si acu sa ii intreb si eu pe ei daca tot au devenit “customer oriented”: Aduceti si voi in mortii vostri butonul de start din Windows inapoi asa cum trebuie sa fie, adica cum era pe Windows 7?

f.lux

Am descoperit, via #mumu, un program numit f.lux care schimba “caldura” luminii de la ecran in functie de ora din zi si pleaca de la vreo 6500K pana la 1900K. In felul asta cand se lasa intunericul afara, se lasa seara si la ecran si lumina nu mai este alba puternic ci devine ca cea de lumanare, treptat treptat.

Asa acum pot sa ma uit la ecran cu lumina stinsa in camera fara sa ma doara ochii ca este ecranul prea alb.

La inceput a fost un pic dubios sa ma uit la un ecran cu lumina galbejita, dar m-am obisnuit si acum este OK si probabil ochii mei au varsat o lacrima de bucurie in cinstea lor :)

disk cleanup on windows server

Pe Windows Server 2008 R2, daca instalezi patch-uri sau service pack-uri, toate fisierele inlocuite sunt copiate intr-un backup pentru fiecare patch in parte. Lucru OK de altfel, sa poti sa faci rollback in caz de buba cu patch-ul sau service pack-ul. Doar ca in timp crapurile astea se aduna si incep sa consume spatiu pe discul de boot, care de obicei nu e cel mai mare disc din lume :)

Daca vrei sa faci curat, exista doua variante:

  • Stergi de mana chestii de prin directoarele lui Windows si speri ca nu strici nimic
  • rulezi Disk Cleanup de la MS si face ala curat cum trebuie si unde trebuie

Eh, Disk Cleanup asta vine in kit-ul de Windows Server, numai ca in inteligenta lor prea-marita s-au gandit ca de ce sa fie simplu cand poate sa fie complicat si au bagat Disk Cleanup intr-un feature numit Desktop Experience (probabil doar aia cu laptop-uri si desktop-uri cu Windows Server pe ele mai au nevoie sa curete mizerii din sistem) si trebuie sa-l instalezi. Care cacat de feature vine si cu plugin-uri de “Ink and Handwriting Service”, ca sigur o sa infig un asemenea dispozitiv intr-un server… Si ca sa fie cacatul si cu cireasa pe deasupra, dupa ce pui toate astea, trebuie sa dai restart la masina sa se instaleze ce mortii lui are nevoie sa instaleze.

Si uite asa pentru o chestie simpla, consumi timp si resurse aiurea because, fuck logic…

idee

Ma tot uit la stiri din astea despre securitatea informatica si parca au luat-o toti razna. Nimanui nu-i pasa, daca sunt loviti se duc repede sa planga la militia lor, se dau tot felul de legi de cacat cu “daca accesezi in mod neautorizat un sistem informatic faci mai multa parnaia decat un popa pedofil” si alte aberatii din astea.

Ce-ar fi daca politia s-ar implica doar in cazurile in care aia de te sparg iti cer bani pe informatii sa nu le faca publice si doar daca se sparg chestii din astea importante din care are rezulta oameni morti, gen centrale electrice, baraje, poduri etc.?

Si in rest, firmele de au datele oamenilor si/sau ale altor sa firme sa fie raspunzatoare pentru ele ca si cand acestea ar fi in format fizic inchise undeva in “siguranta” intr-un seif?

Adica daca ti-o iei si te fac unii de rusine pe internet ca-ti posteaza chestiile interne, ti-au “furat” filmul nou abia lansat, asta e, o sugi si mergi mai departe.

Din punctul meu de vedere in felul asta lumea chiar ar lua lucrurile in serios si ar rezolva toate chestiile pe care nu vor sa le rezolva, alegand in schimb sa se ascunda dupa legi, proceduri, procese si alte crapuri din astea complet inutile.