Aug 2

Cel mai nebunatic om pe care mi-a fost dat sa-l intalnesc si-a facut blog. Deah Lucica, da sa stii ca tot nu te iert ca mi-ai ascuns calculatorul si te-ai jurat o juma de zi ca l-ai vandut ca aveai o datorie. Amintiri, amintiri.

Aug 1

Pluginul original si pluginul minune de la zoso puse unul langa celalat :

/*
Plugin Name: Cyrillic Slugs
Plugin URI: http://petko.bossakov.eu/wordpress-cyrillic-slugs-plugin
Description: Converts Cyrillic letters in post slugs to their Latin phonetic equivalent.
Version: 1.0
Author: Petko Bossakov
Author URI: http://petko.bossakov.eu/
*/

/*
Copyright 2007 Petko Bossakov

Licensed under the terms of the GPL version 2, see:
http://www.gnu.org/licenses/gpl.txt

Provided without warranty, inluding any implied warrant of merchantability or fitness for purpose.
Based on SEO Slugs by Andrei Mikrukov (http://www.vretoolbar.com).
*/

add_filter('name_save_pre', 'cyr_slugs', 0);

function cyr_slugs($slug) {
    $cyrillic = array('à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','ü','û','ý','þ','ÿ');
    $translit = array('a','b','v','g','d','e','zh','z','i','i','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','sht','u','y','y','e','yu','ya');

    // We don't want to change an existing slug
	if ($slug) return $slug;

	global $wpdb;
	$cyr_slug = cyr_strtolower(strtolower(stripslashes($_POST['post_title'])));
	$cyr_slug = str_replace($cyrillic, $translit, $cyr_slug);
	$cyr_slug = str_replace(" ", "-", $cyr_slug);

	return $cyr_slug;
}

function cyr_strtolower($a) {
	// Just in case standard strtolower doesn't work
        $offset=32;
        $m=array();
        for($i=192;$i<224;$i++)$m[chr($i)]=chr($i+$offset);
        return strtr($a,$m);
}
?>

/*

Plugin Name: Ro Slugs

Version: 1.1

*/

add_filter('name_save_pre', 'cyr_slugs', 0);
    function cyr_slugs($slug) {
    $cyrillic = array('à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','ü','û','ý','þ','ÿ','ă','â');
    $translit = array('a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','o','n','o','o','o','o','o','-','o','u','u','u','u','u','b','y','a','a');
    // We don't want to change an existing slug
	if ($slug) return $slug;
	global $wpdb;
	$cyr_slug = cyr_strtolower(strtolower(stripslashes($_POST['post_title'])));
	$cyr_slug = str_replace($cyrillic, $translit, $cyr_slug);
	$cyr_slug = str_replace(" ", "-", $cyr_slug);
        return $cyr_slug;

}

function cyr_strtolower($a) {

	// Just in case standard strtolower doesn't work
        $offset=32;
        $m=array();
        for($i=192;$i<224;$i++)$m[chr($i)]=chr($i+$offset);
        return strtr($a,$m);

}

?>

Neah, pana si comentariile sunt la fel, p-alea nu s-au obosit sa le editeze/steraga, lol. Si culmea ca pluginu merge (dupa ce adaugi caracterele romanesti), ca-l folosesc pentru altii care aveau aceeasi problema. De prin 2008. Dar deah, daca nu e vb de poze sau continut incalcarea GPL sau CC e grava, dar incalcarea GPL se pare ca nu mai e la fel de relevanta pentru cod. Si tot n-am inteles “Am făcut un mic plugin care să rezolve problema” vs “E fixut (fixuit ? / facut ?) de niste amici” … Defapt cine a facut chestia :). Scoaterea copyright din sursa fara mentionarea autorului original nu e foarte frumos mai ales cand dai public ceva. Daca-l fixuiesti pt tine, treaba ta ce faci, numa’ sa stii ca daca unu cere codu’ sursa modificat, cam tre sa-l dai.Tind sa cred totusi ca nu zoso a fost cu ideea.

Sincer … e acelasi plugin, singurele doua linii care difera sunt declaratiile $cyrilic si $translit.

Si ca bonus, pluginu nu fixuieste caracterele rromani si nici nu merge daca editezi de pe un xp cu tastatura romaneasca legacy (alea de pun caracterele turcesti in loc te tz si sh).

Nu am fost niciodata un mare fan al copyright-ului, am fost mereu de parerea ca nu conteaza cat si de unde copiezi, ci ce adaugi si ce creezi pe baza a ceea ce copiezi. Dar situatia asta e ironica pentru ca cel care a postat respectiva chestie e mare aparator (si ii iese destul de bine) al drepturilor de autor, adica ceea ce urasc eu.

Dap sunt genu care editeaza o tema sau un soft, si apoi modifica copyrightu’ de genu “Originally developed by whoever for x, modified for this piece of software by”. Astfel incat daca unuia ii place, sa ajunga la randu-i la codul original. Si-mi pun si emailu, astfel ca daca vrea ceva GPL modificat de mine, sa ma contacteze sa-i trimit. Putinele chestii publice pe care le-am dat sunt cu licenta MIT, asa ca daca unul crea sa modifice pentru chestii proprietare sa nu fie obligat sa dea gratis bucati din bucataria interna. I hate GPL also, pt ca limiteaza dreptul de dezvoltare a chestiilor proprietare, obligand multi oameni sa scrie tone intregi de cod “from scratch” desi exista echivalente GPL cel putin la fel de bune.

Oricum, incep sa inteleg de ce unele chestii nu merg prin wordpressu’ de pe zoso.ro si filtrele de spam sunt asa de varza. Anyway, sweet, sweet, irony :).

Mar 29

31-29. Frumos meci, mai ales ca am castigat. Atmosfera faina pe stadion. Primul meci de handbal feminin vazut live. A meritat. Promit sa ma mai duc.

Dec 21

Citesc asta si nu ma pot abtine sa nu-mi ling buzele. Yummy. Protocol documentation de la Microsoft. Pentru Samba.

Pentru cei care nu folosesc Linux, Samba este un proiect care si-a propus sa ofere domenii Windows si AD si pe unix. Domeniile de tip vechi (NT4), dar si unele features mai noi (Kerberos, Secondary domain controller pentru AD) sunt bine suportate. Pentru firmele mici si mijlocii (pana in 4-50 de calculatoare) Samba este o adevarata minune. Am folosit si folosesc cu mare placere Samba.

Pana acum insa unele din cele mai avansate feature-uri ale AD, unele chiar intens folosite, nu erau inca implementate. Samba 4 a incaput acum ceva ani cu scopul de a inlocui AD controllerul, insa nu s-au facut prea mari pasi. Sper ca infuzia de decumentatie sa fie benefica si sa aduca Samba4 acolo unde trebuie. La mine pe servere adica :).

As seen on digg.

Dec 20

Una din primele scule pe care le instalez dupa instalearea unui linux este strace. Cu alternativa truss pe solaris. Strace este o scula foarte folositoare pentru “debugging”-ul instalarii diverselor servere , mai ales daca ai incredere ca softul pe care il instalezi chiar functioneaza corect si ca mingea e la tine (adica permisiuni sau configurari defectuoase). Daca nu , bagam gdb-ul, dar asta in alt post.

Strace / Truss sunt programe ce urmaresc system call-urile unui alt program. Un system call (syscall) este mecanismul prin care programele cer resurse sau servicii de la systemul de operare. In ceneral syscall-urile sunt impachetate in niste functii , si grupate in librarii. In cazul c-ului pe linux de exemplu acesta librarie este foarte cunoscuta glibc/libc, in care vom gasi functiile de citire si scriere pe disc, de spawnare de noi procese, etc. Exemple de syscalls sunt open, close, write, fork, clone, vfork.

La ce e folositor? Stim ca de exempluin cazul in care avem nevoie de access la un fisier, sau un socket undeva se va executa un open pentru a accesa resursa. In strace/truss vom putea vedea codul pe care il intoarce respectivul syscall, si vom putea actiona in consecinta. Unul din trucurile pe care le folosesc este se configurez minim un apache (un singhur child, un singur client, etc) si sa execut pe procesul apache principal un strace -ff (follow forks). Apoi apeland aplicatia web primita mostenire si nedocumentata vom putea vedea ce resursa incearca sa apeleze si unde da eroarea. In mediile chrootate (de obicei folosesc apache si mod security sa chrootez threadurile apache intr-un director “safe”) un astfel de ajutor poate fi foarte folositor. Nu odata am putus sa-mi dau astfel seama ca am configurat mini_sendmail gresit in chroot sau am uitat sa mut in chroot /etc/passwd sau biblioteci de care soft-ul rulat “sub apache” si scris in php/perl/python avea nevoie sa execute corect diverse chestii (xml in special).

O scula asemanatoare este ltrace (pe solaris tot truss este “the one”) e o scula asemanatoare cu strace, in sensul ca tot apeluri urmareste, dar apelurile catre librarii. Este folositor mai ales combinat cu ldd pentru ca ne da o idee destul de clara asupra modului cum a fost gandita aplicatia si ce librarii foloseste cat sa ne descurcam sa o instalam sau sa dam de cap anumitor probleme fara sa trebuiasca sa intram in codul sursa.

Dec 18

multe spamuri am vazut, dar cel de mai jos a trecut de filtre si m-a amuzat. Rau.

Black market is online again !

1. Heroin, in liquid and crystal form.
2. Rocket fuel and Tomohawk rockets (serious enquiries only).
3. Other rockets (Air-to-Air), orders in batches of 10.
4. New shipment of cocaine has arrived, buy 9 grams and get 10th for free.
5. We also offer gay-slaves for sale, we offer only such service on the NET,
  you can choose the one you like, then get straight to business.
6. Fake currencies, such as Euros and US dollars, prices would match competition.
7. Also, as always, we offer widest range of child pornography and exclusive lolita
  galleries, to keep out clients busy.

Everyone is welcome, be it in States or any other place worldwide.

ATTENTION. Clearance offer. Buy 30 grams of heroin, get 5 free. Prepay your batch of rockets (air-to-air) and recieve a portable rocket-lacuncher.

For security reasons, please email me if you want to get address of our online shop.
billcolq@localnet.com
Dec 9

Pentru utilizatorii de mySQL e greu cand se vad pe o lpatforma MSSQL. Iata 2 chestii folositoare, care ne enerveaza la MSSQL (si nu numai), pentru ca in alte motoare de baze de date nu le avem :

In MSSQL nu avem LIMIT, nu avem LIMIT, cum procedam ? Iata o sugestie :

select * from (
   select top 10 user_id,user_name from (
  select top 30 user_id,user_name from employee order by user_name asc
  ) as table1 order by user_name desc
) as table2 order by user_name asc

O alta chestie care se comporta diferit este clauza GROUP BY.

In mySQL putem face chestii de genul (nu foarte intelepte, dar totusi utile uneori, si vazute destul de des in aplicatii) :

Select * FROM products
INNER JOIN properties on properties.product_id = products.product_id
WHERE status_id = 1
GROUP BY product_id

In MSSQL soate campurile din select trebuie sa fie agregate sau in clauza pentru a putea face un group by (suna ca dracu in romana).

asa ca query-ul se sparge in 2 si vom folosi operatorul IN (query) :

SELECT * FROM products
INNER JOIN properties on properties.product_id = products.product_id
where status_id IN (
 SELECT product_id FROM products
 WHERE status_id = 1
 GROUP BY product_id
)
Dec 9

Ok, presupunem o tabela cu urmatoarele campuri : id, event_date, user_id, client_id , tip, observatii. Acesta tabela este folosita si de un webservice. Care din cand in cand o ia razna (pe legaturi proste) si baga in ea duplicate. Presupunem ca tabela se numeste events. Hai sa vedem cum scapam de duplicate. E clar ca id-ul nu poate fi folosit (e unic, e cheie primara, are autoincrement, deci select distinct * from events nu ne va ajuta deloc). Pai si ce facem, vom zice ?

Pai creem o tabela temporara cu inregistrarile duplicate (fara a lua in considerare ID-ul) . Stergem tabela initiala si apoi recopiem din tabela temporara in tabela initiala:

CREATE TEMPORARY TABLE temp AS SELECT DISTINCT event_date, user_id, client_id , tip, observatii FROM events;
DELETE FROM events;
INSERT INTO events (event_date, user_id, client_id , tip, observatii) SELECT * from temp;

Nu e chiar asa de greu, nu-i asa ?

CREATE TABLE events_copy
SELECT * FROM events;

Si faceti un backup inainte de operatie. Aveti oricum un backup de acum 1 ora, nu-i asa ? NU ? Rau faceti.