Hlavní navigace

Knihovna Diffator

15. 10. 2013 22:23 | Jaroslav Kuboš

Při vytváření služby nalezen.cz (která agreguje nabídky práce ze stránek zaměstnavatelů) jsme, s výjimkou Oracle Javy, nepoužili žádný proprietární software. Linux, Eclipse, ekosystém Java knihoven, Ruby, … Moc daleko bychom asi projekt nedotáhli kdybychom museli koupit:

  • OS na vývojářské počítače, testovací server, produkční server
  • vývojové prostředí
  • spoustu knihoven

Díky OSS je však možné realizovat poměrně komplexní projekt ve 2 lidech a s minimálními náklady. Úžasné – jsem rád, že můžu žít v takové době.

Abychom jen nebrali, ale také něco vrátili, rádi bychom některé z vyvinutých nástrojů uvolnit pod svobodnou licencí. Prvním nesmělým krůčkem budiž zveřejnění knihovny Diffator - jednoduché Java knihovny pro porovnávání a diff textového obsahu.

 

[caption id="" align=„aligncenter“ width=„288“ caption=„ukázkový výstup jednoduchého HTML zapisovače (přibalen)“][/caption]

 

Píšu „nesmělým krůčkem“ protože:

  1. knihovna dělá podobnou věc jako spousta jiných
  2. nedělá ji v některých ohledech ani nějak zvlášť skvěle
  3. není dodělaná infrastruktura (JavaDoc online, registrace do Maven repozitářů, …)

Hm, já vím … proč znovu vynalézat kolo, že? A ještě hranaté. Když ono to ale bylo složitější…

Původně jsme chtěli vyrobit jednoduchou a rychlou metodu pro porovnání dvou textových dokumentů která vrací podobnost vstupů (v rozsahu 0.0 až 1.0). Rychlost je v případě použití ve webovém crawleru upřednostněná před dokonalostí. Když jsme měli metodu hotovou, zjistili jsme, že po rozšíření o callbacky (jako při parsování XML v SAX-stylu) může být použita pro jednoduchý diff obsahů. Toho jsme vydatně využili při ladění. Pak se nám nezdál výkon a tak jsme vyzkoušeli několik metod implementace porovnávacího algoritmu. Vybrali jsme nejlepší, ale ostatní zůstaly zachovány (výkon je závislý na povaze vstupních dat, takže na jiná data se může hodit jiná metoda). Pak bylo třeba vyrobit jednoduchý výstup diffu do HTML. A tak dále.

Nějaké pozitivní aspekty se tedy najdou:

  • rychlost
  • paměťová nenáročnost & „GC friendly“ (během porovnávání se už nic nealokuje)
  • snadná rozšiřitelnost pomocí callbacků
  • výběr ze 3 implementací algoritmu

Nakonec jsme došli k přesvědčení, že výsledek vydá na knihovnu. Možná není úplně beznadějná a někomu se bude hodit. Mrkněte na github projektu.