Čo je IRCSearch
IRCSearch je mojim školským projektom z predmetu programovanie. Nápad zrealizovať práve tento projekt som dostal po prečítaní announce na SILC klienta Bombyx, ktorý mal mať vstavanú funkciu vyhľadávania zaujímavých konverzácií na konverzačnej sieti Secure Internet Live Conference. Aj keď osobne preferujem práve tento protokol, pre jeho lepší dizajn a hlavne bezpečnosť, v čase, keď som program začal písať neexistovala 100% finálna verzia protokolu (momentálne je už submitnutá do IETF). Vzhľadom na podmienky školských projektov (zákaz používať cudzie komponenty) som nemohol využiť referenčnú implementáciu vtedajšieho protokolu a písať druhá nezávislú implementáciu, keď protokol nebol štandardizovaný mi nepripadalo veľmi vhodné.
Napadlo ma však, že môže byť zaujímavé skúsiť naprogramovať vyhľadávanie konverziácií aj v sieti IRC, ktorá je momentálne viac rozšírená. Výsledkom je IRCSearch.
Pár problémov
IRC je veľmi zastaralý protokol. Vznikol pravdepodobne z potreby štandardizovať klasické ,,talkre'', aby mohli spolu komunikovať a aby existovala možnosť naprogramovať prehľadné klienty. Množstvo charakteristík talkrov však tomuto programu stále zostalo.
Protokol v prvom rade nie je navrhnutý pre spracovanie počítačom, obsahuje pár príkazov, ktoré by sme mohli nazvať skôr formátovacími ako majúcimi nejaký reálny význam. Je to textový protokol a vzhľadom na množstvo neštandardných implementácií sa pomerne ťažko spracúva.
Pri programovaní ,,robotického'' klienta si treba uvedomiť pár zásadných vecí: IRC je asynchrónny protokol. Na požiadavku môže prísť odpoveď hocikedy, aj neskôr ako na požiadavky, ktoré boli serveru zaslané po pôvodnej požiadavke. Okrem toho ako som sa dozvedel z praxe, server niekedy nemusí odpovedať vôbec. Dôvody odpojenia alebo nepripojenia nemajú štandardizované chybové čísla, pretože sa počíta s tým, že klasický ,,irc'' klient tieto správy aj tak zobrazí klientovi.
Najväčším problémom je nechuť akéhokoľvek IRC servera komunikovať s robotmi. Je to čiastočne pochopiteľné, keďže roboty sa zväčša používajú na tri veci: ochrana práv na kanáli, kradnutie alebo ,,takeoverovanie'' kanálov (prípadne iné digitálne druhy boja) a na propagáciu stránok a produktov. (poznamenám iba, že prvé dva problémy -- s právami na kanáli -- už v sieti SILC nehrozia). Vzhľadom na to, že IRCSearch sa (vďaka svojej povahe) cyklicky pripája na rôzne kanály, aby mohol vysledovať, o čom je na kanáli debata, pripomína takéto správanie skôr praktiky ,,spambota'', ktorý sa snaží propagovať stránky alebo nejaké produkty. Vďaka tomuto som si pri testovaní vyslúžil KLINE (zákaz pripojenia sa) na viacerých IRC serveroch.
Ďalším problémom je, že IRC server nás nepustí na veľa kanálov naraz. Záleží od siete, na ktorú sa pripájame, každopádne väčšina má limit na počet kanálov najviac 20. Pri viac ako 10 aktívnych kanáloch už máme aj problém s prenosovou kapacitou -- IRC server nechce u seba bufferovať dáta a ak spoj medzi nami a serverom nestíha, server nás jednoducho odpojí s hláškou ,,Excess flood'' (počítačom nespracovateľnou). Maximálny počet kanálov, na ktorých môžeme byť však dosť značne obmedzuje aj vyhľadávacie schopnosti. Aby sme zachytili nejakú rozumnú konverzáciu, mali by sme na kanáli zotrvať aspoň pár minút. Ak však môžeme byť naraz len na 10 kanáloch, náš čas to pomerne úspešne redukuje.
Implementácia
Implementácia sa snaží vyriešiť niektoré z uvedených problémov ,,workaroundovacími'' technikami. V prvom rade je možnosť vybrať si kanály podľa počtu používateľov. Mnoho kanálov slúži len na súkromné konverzácie pár osôb, prípadne testovanie robotov. V praxi sú zaujímavé kanály s viac ako 10 osobami. Pri väčších sieťach odporúčam túto hodnotu ešte zvýšiť, zníži sa čas na vyhľadávanie.
Okrem toho je možné špecifikovať čas, ktorý na kanáli strávime, pomocou dvoch parametrov: Max Time a Max Idle Time. Prvá možnosť hovorí, aký maximálny čas na kanáli zotrváme. Túto hodnotu odporúčam dať aspoň na jednu až dve minúty. Druhá možnosť slúži na odfiltrovanie neaktívnych kanálov. Ak na kanáli nikto nekomunikuje po určitú dobu, môžeme kanál považovať za neaktívny (napríklad sú tam iba roboti a ľudia so zapnutými počítačmi, ktorí spia alebo nesedia pri počítači). Túto hodnotu odporúčam nastaviť približne na 30 sekúnd, prípadne menej.
Možnosť voľby maximálneho počtu kanálov, na ktoré sa naraz pripojíme pomerne výrazne závisí od servera, na ktorý sa pripájame. V prvom rade je dôležité poznamenať, že vyhľadávač sa krátkodobo môže pripojiť aj na viac kanálov, akurát sa snaží počet kanálov udržať pod touto hranicou. (dôvodom je zase asynchrónnosť: nevieme, či po pripojení na kanál sa naň dostaneme, je mnoho kanálov, na ktoré náš server nepustí, zistíme to až vtedy, keď nám príde hlásenie o pripojení sa na kanál, čo môže byť pomerne dlho). Okrem toho táto voľba dosť ovplyvňuje, či nás server neodpojí kvôli excess floodu -- musíte s ňou experimentovať, všetko závisí od servera a rýchlosti vášho pripojenia.
Vnútorná implementácia a dátové štruktúry
Informácie o každom kanáli sú udržiavané v objektoch triedy TChannel, ktoré sú prvkami spájaného zoznamu (TChannelList). Trieda TChannelList zabezpečuje aj výstup (buď ako reťazec alebo ako TStrings). Okrem toho si program udržiava Lexikografický strom v triede TDictionary -- tam sa nachádzajú kľúčové slová aj s hodnotením. Program vypíše všetky kanály, ktoré majú kladné hodnotenie.
Formáty súborov
Program pracuje s dvoma druhmi súborov: zoznamami kľúčových slov a zoznamami kanálov. Zoznamy kľúčových slov vie aj ukladať aj načítavať. Majú tvar:
slovo=váha
Rovnaký formát (kanál=počet bodov) má aj výstupný súbor, ktorý sa vygeneruje pri ukončení vyhľadávania.
Varovanie!
Ako som spomínal, používaním tohto softvéru si môžete vyslúžiť ban (zákaz prístupu na kanál) alebo dokonca KLINE (zákaz prístupu na server). Preto tento softvér nepoužívajte na sieťach, na ktoré sa chcete reálne pripájať.
Záver
Tento program je vcelku zaujímavý ako experiment. Existuje množstvo vyhľadávačov permanentných dát, ale málo takto dynamicky sa meniacich -- ako napr. rozhovory. Na moje prekvapenie funguje celkom efektívne v prípade, že sa ľudia práve rozprávajú o tom, čo hľadáme, čo nemusí byť vždy pravda. Minimálne je však možné spraviť celkom pekný prehľad kanálov, na ktorých sa hovorí v danom jazyku. Mnoho kanálov je však v týchto ťažkých dobách označených ako hidden (skryté) alebo si žiadajú heslo alebo pozvanie. Niet sa čo čudovať, ľudia si našli rôzne spôsoby ako IRC sieť zneužívať.
Licencia
Copyright (c) 2001 Juraj Bednar <juraj@bednar.sk>, all rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1.Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2.Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3.The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Stiahnutie