<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>apohllo.pl</title>
  <link rel="self" href="https://apohllo.pl/feeds/atom" type="application/atom+xml"/>
  <link rel="alternate" href="https://apohllo.pl/" type="text/html"/>
  <id>tag:https://apohllo.pl</id>
  <updated>2013-01-29T20:19:00Z</updated>
  <author>
    <name>Aleksander Pohl</name>
  </author>
  <entry>
    <title>HackKrK 11</title>
    <link rel="alternate" href="https://apohllo.pl/blog/hackkrk-11" type="text/html"/>
    <id>https://apohllo.pl/blog/hackkrk-11</id>
    <updated>2013-02-12T13:49:23Z</updated>
    <published>2013-01-29T20:19:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Firma Future Simple organizuje kolejny &lt;a href=&quot;http://hackkrk.com/&quot;&gt;Hack &lt;span class=&quot;caps&quot;&gt;KRK&lt;/span&gt;&lt;/a&gt;. Tym razem b&#281;dziemy implementowa&#263; konsolowe gry w Rubim.
Polecam!&lt;/p&gt;


Aktualizacja:
	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/apohllo/car-shooter&quot;&gt;kod &#378;r&#243;d&#322;owy mojej gry&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a...</summary>
    <category term="ruby" label="Ruby" scheme="https://apohllo.pl/tags/show/ruby"/>
    <content type="html">
&lt;p&gt;Firma Future Simple organizuje kolejny &lt;a href=&quot;http://hackkrk.com/&quot;&gt;Hack &lt;span class=&quot;caps&quot;&gt;KRK&lt;/span&gt;&lt;/a&gt;. Tym razem b&#281;dziemy implementowa&#263; konsolowe gry w Rubim.
Polecam!&lt;/p&gt;


Aktualizacja:
	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/apohllo/car-shooter&quot;&gt;kod &#378;r&#243;d&#322;owy mojej gry&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://ascii.io/a/1987&quot;&gt;przyk&#322;adowa gra&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;    </content>
  </entry>
  <entry>
    <title>Instalacja Rubiego 1.9.3 w Ubuntu</title>
    <link rel="alternate" href="https://apohllo.pl/blog/instalacja-rubiego-1-9-3-w-ubuntu" type="text/html"/>
    <id>https://apohllo.pl/blog/instalacja-rubiego-1-9-3-w-ubuntu</id>
    <updated>2015-04-16T16:39:30Z</updated>
    <published>2011-08-09T07:51:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Prosta instrukcja, jak zainstalowa&#263; najnowsz&#261; wersj&#281; Rubiego (1.9.3-p0) w systemie Ubuntu (testowane z 11.04).&lt;/p&gt;


	&lt;p&gt;1. Najpierw instalujemy niezb&#281;dne pakiety za pomoc&#261; apt-get-a (m.in. Ruby w wersji 1.8):&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ sudo apt-get install zlib1g-dev libssl-dev libreadl...</summary>
    <category term="ruby" label="Ruby" scheme="https://apohllo.pl/tags/show/ruby"/>
    <category term="ubuntu" label="Ubuntu" scheme="https://apohllo.pl/tags/show/ubuntu"/>
    <category term="rvm" label="Rvm" scheme="https://apohllo.pl/tags/show/rvm"/>
    <content type="html">
&lt;p&gt;Prosta instrukcja, jak zainstalowa&#263; najnowsz&#261; wersj&#281; Rubiego (1.9.3-p0) w systemie Ubuntu (testowane z 11.04).&lt;/p&gt;


	&lt;p&gt;1. Najpierw instalujemy niezb&#281;dne pakiety za pomoc&#261; apt-get-a (m.in. Ruby w wersji 1.8):&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ sudo apt-get install zlib1g-dev libssl-dev libreadline-dev libxml2-dev libsqlite3-dev &lt;/span&gt;
&lt;span class='bash'&gt;$ sudo apt-get install ruby curl git-core libyaml-dev&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;2. Nast&#281;pnie &#347;ci&#261;gamy i instalujemy &lt;a href=&quot;https://rvm.beginrescueend.com/&quot;&gt;Ruby Version Manager&lt;/a&gt; (w skr&#243;cie &lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt;):&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ curl -L get.rvm.io | bash -s stable&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;3. Wczytujemy now&#261; konfiguracj&#281; shella&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ source /home/user/.profile&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;4. Testujemy dzia&#322;anie &lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt;:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ rvm help&lt;/span&gt;&lt;/pre&gt;


&lt;pre&gt;
[![Build Status](https://secure.travis-ci.org/mpapis/rvm.png)](http://travis-ci.org/mpapis/rvm)
= rvm
* http://github.com/wayneeseguin/rvm
== DESCRIPTION:
...
&lt;/pre&gt;

	&lt;p&gt;Je&#347;li nie widzimy powy&#380;szych komunikat&#243;w, znaczy to, &#380;e instalacja si&#281; nie powiod&#322;a! Nale&#380;y przeczyta&#263; uwa&#380;nie komunikat i sprawdzi&#263; co jest nie tak.&lt;/p&gt;


	&lt;p&gt;6. Instalujemy najnowsz&#261; stabiln&#261; wersj&#281; Rubiego:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ rvm install 1.9.3&lt;/span&gt;
Installing Ruby from source...&lt;/pre&gt;


	&lt;p&gt;Instalacja trwa kilka minut, poniewa&#380; w jej trakcie kompilowany jest Ruby.&lt;/p&gt;


	&lt;p&gt;7. Na koniec ustawiamy Rubiego 1.9.3 jako domy&#347;lny interpreter u&#380;ywany w systemie:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ rvm use 1.9.3 --default&lt;/span&gt;
Using /home/user/.rvm/gems/ruby-1.9.3-p0&lt;/pre&gt;


	&lt;p&gt;8. Weryfikujemy powy&#380;sze wydaj&#261;c polecenie:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ ruby -v&lt;/span&gt;
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]&lt;/pre&gt;


	&lt;p&gt;9. Teraz mo&#380;emy otworzy&#263; konsol&#281; &lt;code&gt;irb&lt;/code&gt; i ostatecznie potwierdzi&#263;, &#380;e mamy najnowsz&#261; wersj&#281; Rubiego:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ irb&lt;/span&gt;
ruby-1.9.3-p0 :001 &gt; &quot;abc&quot;.encoding
 =&gt; #&amp;lt;Encoding:UTF-8&amp;gt;&lt;/pre&gt;    </content>
  </entry>
  <entry>
    <title>Rod - Ruby Object Database</title>
    <link rel="alternate" href="https://apohllo.pl/blog/rod-ruby-object-database" type="text/html"/>
    <id>https://apohllo.pl/blog/rod-ruby-object-database</id>
    <updated>2011-06-09T06:21:02Z</updated>
    <published>2011-06-09T06:15:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Rok temu na EuRuKo mia&#322;em superkr&#243;tk&#261; prezentacje na temat biblioteki &lt;a href=&quot;https://github.com/apohllo/rod&quot;&gt;Rod&lt;/a&gt; mojego autorstwa. Wtedy rozwin&#261;&#322;em ten skr&#243;t jako &amp;#8220;Read-only database&amp;#8221;, co wywo&#322;a&#322;o gromki &#347;miech, bo po co komu baza danych tylko do odczytu? Obecnie nazw&#281; rozwij...</summary>
    <category term="db" label="Db" scheme="https://apohllo.pl/tags/show/db"/>
    <category term="ruby" label="Ruby" scheme="https://apohllo.pl/tags/show/ruby"/>
    <category term="rod" label="Rod" scheme="https://apohllo.pl/tags/show/rod"/>
    <content type="html">
&lt;p&gt;Rok temu na EuRuKo mia&#322;em superkr&#243;tk&#261; prezentacje na temat biblioteki &lt;a href=&quot;https://github.com/apohllo/rod&quot;&gt;Rod&lt;/a&gt; mojego autorstwa. Wtedy rozwin&#261;&#322;em ten skr&#243;t jako &amp;#8220;Read-only database&amp;#8221;, co wywo&#322;a&#322;o gromki &#347;miech, bo po co komu baza danych tylko do odczytu? Obecnie nazw&#281; rozwijam (oczywi&#347;cie jest w tym przesada) jako Ruby Object Database. W praktyce jej podstawowy charakter si&#281; nie zmieni&#322;, ale z pewno&#347;ci&#261; nazwa jest bardziej chwytliwa :)&lt;/p&gt;


	&lt;p&gt;Ale do rzeczy &amp;#8211; co to za biblioteka? Ot&#243;&#380; zosta&#322;a ona zaprojektowana jak baza do przechowywania danych, kt&#243;re 
rzadko ulegaj&#261; zmianie. Chodzi mi przede wszystkim o dane lingwistyczne, tzn. takie jakie spotykamy w 
tradycyjnych s&#322;ownika i ksi&#261;&#380;kach (korpusach tekst&#243;w). J&#281;zyk oczywi&#347;cie jest tworem &#380;ywym, co odzwierciedlone
jest w ewoluuj&#261;cej zawarto&#347;ci s&#322;ownik&#243;w, ale zmiany te nast&#281;puj&#261; raczej w ci&#261;gu lat, czy dziesi&#281;cioleci, ni&#380; 
dni czy godzin. Podobnie z zawarto&#347;ci&#261; korpus&#243;w tekst&#243;w &amp;#8211; je&#347;li co&#347; tam trafi, to ju&#380; raczej nie podlega zmianie
(by&#263; mo&#380;e usuni&#281;ciu, je&#347;li j&#281;zyk zmieni&#322; si&#281; na tyle, &#380;e tekst staje si&#281; bardzo ma&#322;o reprezentatywny).&lt;/p&gt;


	&lt;p&gt;Dla tego typu danych nie potrzeba baz, kt&#243;re k&#322;ad&#261; specjalny nacisk na wielodost&#281;p, czy transakcje, bo w praktyce
modyfikacj&#281; bazy lepiej wykona&#263; poprzez jej ponowne wygenerowanie, ewentualnie poprzez dodanie nowych danych 
i powi&#261;za&#324; mi&#281;dzy danymi, do ju&#380; istniej&#261;cej bazy. Z drugiej strony baza tego rodzaju nie musi by&#263; trzymana w 
pami&#281;ci, poniewa&#380; analizuj&#261;c tekst potrzebujemy zawsze jedynie fragmentu s&#322;ownika. Natomiast w 
przypadku korpus&#243;w tekstu trzymanie w pami&#281;ci nie wchodzi w rachub&#281;, ze wzgl&#281;du na rozmiar danych. Dlatego tak 
popularne ostatnio bazy oparte o memcache&amp;#8217;a i pokrewne nie s&#261; zbyt przydatne dla danych lingwistycznych.&lt;/p&gt;


	&lt;p&gt;Z kolei relacyjne bazy danych nie mog&#261; by&#263; wykorzystane przy analizie tekst&#243;w, poniewa&#380; zbi&#243;r relacji w jakie
wchodz&#261; ze sob&#261; poszczeg&#243;lne elementy czy to s&#322;ownika, czy te&#380; korpusu, jest olbrzymi. Wymagane w tym
wypadku wielokrotne z&#322;&#261;czenia tabel wprowadzi&#322;yby nieakceptowalny czas przetwarzania.&lt;/p&gt;


	&lt;p&gt;Zatem Rod pomy&#347;lany jest jako baza danych, w kt&#243;rej dane nie ulegaj&#261; zmianie (cho&#263; nie wyklucza si&#281; ich dodania 
i uzupe&#322;nienie ich zwi&#261;zk&#243;w), a ich rozmiar wyklucza trzymanie w pami&#281;ci operacyjnej. Dodatkowe oczekiwania
obejmuj&#261; szybki czas dost&#281;pu dla zindeksowanych danych (np. kilku milion&#243;w form wyrazowych), kt&#243;ry jednak
nie wprowadza narzutu przy uruchomieniu bazy danych (wczytanie pe&#322;nego indeksu kilku milion&#243;w form zajmuje 
co najmniej kilka sekund). Co wi&#281;cej &amp;#8211; wczytanie pojedynczej informacji (kt&#243;ra zwykle jest elementem 
du&#380;ego grafu zale&#380;no&#347;ci) nie powinno z jednej strony powodowa&#263; wczytania wszystkich element&#243;w powi&#261;zanych
(szybko okaza&#322;oby si&#281;, &#380;e wczytujemy bardzo du&#380;o niepotrzebnych danych), a z drugiej &amp;#8211; dzi&#281;ki s&#322;abemu
wi&#261;zaniu, umo&#380;liwia&#263; GC &#322;atwe usuwanie danych z pami&#281;ci, nawet je&#347;li s&#261; one osi&#261;galne z aktualnie
dost&#281;pnych zmiennych. Ten drugi wym&#243;g dotyczy sytuacji, w kt&#243;rej wczytano pewne dane, dokonano analizy
i dodatkowe informacje nie s&#261; ju&#380; potrzebne, ale dalej rezyduj&#261; w pami&#281;ci. Lu&#378;ne wi&#261;zanie pozwala &#322;atwo si&#281;
ich pozby&#263;.&lt;/p&gt;


	&lt;p&gt;Biblioteka Rod implementuje wi&#281;kszo&#347;&#263; z tych funkcjonalno&#347;ci (obecnie jedynie uzupe&#322;nianie zwi&#261;zk&#243;w mi&#281;dzy
danymi nie jest wspierane). W niedalekiej przysz&#322;o&#347;ci zamierzam wyda&#263; s&#322;ownik j&#281;zyka polskiego oraz
narz&#281;dzie do tworzenia korpus&#243;w, kt&#243;re b&#281;dzie oparte o t&#281; bibliotek&#281;. Z ciekawych w&#322;asno&#347;ci s&#322;ownika:
powinien on umo&#380;liwia&#263; poprawne generowanie opis&#243;w dla b&#322;&#281;d&#243;w w formularzach, np. 
&amp;#8220;W formularzu jest 1 b&#322;&lt;strong&gt;&#261;d&lt;/strong&gt;/2 b&#322;&lt;strong&gt;&#281;dy&lt;/strong&gt; 5 b&#322;&lt;strong&gt;&#281;d&#243;w&lt;/strong&gt;&amp;#8221;, &amp;#8220;Nazwa nie mo&#380;e by&#263; pusta&amp;#8221;, &amp;#8220;Adres nie mo&#380;e by&#263; pusty&amp;#8221; 
oraz np. w&#322;a&#347;ciwe generowanie opis&#243;w typu: &amp;#8220;Ania skomentowa&lt;strong&gt;&#322;a&lt;/strong&gt; tw&#243;j status&amp;#8221;, &amp;#8220;Wojtek skomentowa&lt;strong&gt;&#322;&lt;/strong&gt; tw&#243;j status&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Oczywi&#347;cie wszystko b&#281;dzie dost&#281;pne jako biblioteka Rubiego.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>Virtuoso - podstawy</title>
    <link rel="alternate" href="https://apohllo.pl/blog/virtuoso-podstawy" type="text/html"/>
    <id>https://apohllo.pl/blog/virtuoso-podstawy</id>
    <updated>2014-04-25T14:29:35Z</updated>
    <published>2011-04-05T09:10:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;h3&gt;Dlaczego Virtuoso?&lt;/h3&gt;


	&lt;p&gt;Obecnie jest ju&#380; &lt;a href=&quot;http://www.w3.org/wiki/SparqlImplementations&quot;&gt;sporo narz&#281;dzi&lt;/a&gt; pozwalaj&#261;cych na przechowywanie danych w formacie &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt; oraz
zadawanie pyta&#324; w j&#281;zyku &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;. Poniewa&#380; obecnie nie mam cza...</summary>
    <category term="sparql" label="Sparql" scheme="https://apohllo.pl/tags/show/sparql"/>
    <category term="rdf" label="Rdf" scheme="https://apohllo.pl/tags/show/rdf"/>
    <category term="semantic web" label="Semantic web" scheme="https://apohllo.pl/tags/show/semantic%20web"/>
    <content type="html">
&lt;h3&gt;Dlaczego Virtuoso?&lt;/h3&gt;


	&lt;p&gt;Obecnie jest ju&#380; &lt;a href=&quot;http://www.w3.org/wiki/SparqlImplementations&quot;&gt;sporo narz&#281;dzi&lt;/a&gt; pozwalaj&#261;cych na przechowywanie danych w formacie &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt; oraz
zadawanie pyta&#324; w j&#281;zyku &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;. Poniewa&#380; obecnie nie mam czasu &#380;eby przyjrze&#263; si&#281; szczeg&#243;&#322;owo nawet tym najbardziej popularnym (AllegroGraph, Sesame 2, OWLime,
&lt;span class=&quot;caps&quot;&gt;D2R&lt;/span&gt;, OntoBroker, Virtuoso), aby przechowywa&#263; dane, kt&#243;re s&#261; co prawda dost&#281;pne jako &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt;, ale nie posiadaj&#261; dedykowanego &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt; endpointu,
opar&#322;em si&#281; na wyborze jakiego dokonali tw&#243;rcy DBpedii, tj. &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main&quot;&gt;Virtuoso&lt;/a&gt;. 
Narz&#281;dzie to wyst&#281;puje w wersji komercyjnej oraz wolnej, wi&#281;c z jednej strony mo&#380;na mu si&#281; swobodnie przyjrze&#263;, a z drugiej, czas na to po&#347;wi&#281;cony
raczej nie b&#281;dzie stracony, je&#347;li w przysz&#322;o&#347;ci zechcemy wykorzysta&#263; je w jakim&#347; komercyjnym projekcie, dla kt&#243;rego potrzebna b&#281;dzie wi&#281;ksza wydajno&#347;&#263; oraz
support.&lt;/p&gt;


	&lt;h3&gt;Instalacja&lt;/h3&gt;


	&lt;p&gt;Virtuoso OpenSource mo&#380;na &#347;ci&#261;gn&#261;&#263; ze &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VOSDownload&quot;&gt;strony producenta&lt;/a&gt; lub za po&#347;rednictwem 
dedykowanego dla naszego systemu operacyjnego narz&#281;dzia do zarz&#261;dzania pakietami (odpowiednie paczki istniej&#261; np. dla Gentoo oraz Debiana), dlatego 
z instalacj&#261; nie powinno by&#263; problemu.&lt;/p&gt;


	&lt;h3&gt;Konfiguracja&lt;/h3&gt;


	&lt;p&gt;Zainstalowane ze &#378;r&#243;de&#322; Virtuosu (przynajmniej pod Gentoo) nie posiada &#380;adnych plik&#243;w konfiguracyjnych, dlatego musimy przygotowa&#263; sami minimaln&#261; konfiguracj&#281;.
Mo&#380;e ona wygl&#261;da&#263; nast&#281;puj&#261;co:&lt;/p&gt;


&lt;pre&gt;
[Database]
DatabaseFile=/var/lib/virtuoso/db/virtuoso.db
TransactionFile=/var/lib/virtuoso/db/virtuoso.trx
ErrorLogFile=/var/lib/virtuoso/db/virtuoso.log
[Parameters]
DirsAllowed=/path/to/dir
[HTTPServer]
ServerPort=8080&lt;/pre&gt;


	&lt;p&gt;Konfiguracj&#281; t&#281; mo&#380;emy umie&#347;ci&#263; np. w pliku &lt;strong&gt;&lt;code&gt;/etc/virtuoso.ini&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Poszczeg&#243;lne zmienne konfiguracyjne zasadniczo s&#261; samoopisuj&#261;ce &amp;#8211; z wyj&#261;tkiem mo&#380;e &lt;code&gt;DirsAllowed&lt;/code&gt;. Ten parametr ustala &#347;cie&#380;ki, z kt&#243;rych b&#281;dziemy mogli
&#322;adowa&#263; &lt;strong&gt;pliki zewn&#281;trzne&lt;/strong&gt;. Ustalenie go jest kluczowe dla punktu, w kt&#243;rym b&#281;dziemy &#322;adowa&#263; dane zewn&#281;trzne.&lt;/p&gt;


	&lt;h3&gt;Uruchomienie serwera i klienta&lt;/h3&gt;


	&lt;p&gt;Serwer uruchamiany jest za pomoc&#261; polecenia &lt;strong&gt;&lt;code&gt;virtuoso-t&lt;/code&gt;&lt;/strong&gt;. Polecenie to przyjmuje kilka opcji, w szczeg&#243;lno&#347;ci kluczowe jest okre&#347;lenie pliku konfiguracyjnego.
S&#322;u&#380;y do tego opcja &lt;code&gt;+configfile&lt;/code&gt;.
Dodatkowo przy pierwszym uruchomieniu mo&#380;emy za&#380;&#261;da&#263;, aby serwer nie dzia&#322;a&#322; w tle (opcja &lt;code&gt;+foreground&lt;/code&gt;), 
dzi&#281;ki czemu w razie problem&#243;w b&#281;dziemy mogli zobaczy&#263; co jest nie tak.&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ virtuoso-t +configfile /etc/virtuoso.ini +foreground&lt;/span&gt;
        Tue Apr 05 2011
12:23:07 INFO: OpenLink Virtuoso Universal Server
12:23:07 INFO: Version 06.01.3127-pthreads for Linux as of Mar  8 2011
12:23:07 INFO: uses parts of OpenSSL, PCRE, Html Tidy
12:23:07 INFO: Database version 3126
12:23:07 INFO: SQL Optimizer enabled (max 1000 layouts)
12:23:08 INFO: Compiler unit is timed at 0.000694 msec
12:23:11 INFO: Roll forward started
12:23:11 INFO: Roll forward complete
12:23:12 INFO: Checkpoint started
12:23:13 INFO: Checkpoint finished, log reused
12:23:15 INFO: HTTP server online at 8080
12:23:15 INFO: Server online at 1111 (pid 15156)&lt;/pre&gt;


	&lt;p&gt;Kiedy uruchomimy serwer, mo&#380;emy sprawdzi&#263; go w dzia&#322;aniu wykorzystuj&#261;c polecenie &lt;strong&gt;&lt;code&gt;isql-v&lt;/code&gt;&lt;/strong&gt;. Otwiera ono interaktywn&#261; sesj&#281; pracy z serwerem:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ isql-v&lt;/span&gt;
SQL&gt; sparql select * where {?s ?p ?o} limit 10;&lt;/pre&gt;


	&lt;p&gt;Pow&#322;oka klienta pozwala na bezpo&#347;rednie przegl&#261;danie bazy danych, na kt&#243;rej dzia&#322;a Virtuoso, za pomoc&#261; zwyk&#322;ych polece&#324; &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;-owych. Dlatego
zapytania &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;-owe musz&#261; by&#263; poprzedzone s&#322;owem kluczowym &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;. Przyk&#322;adowe zapytanie przedstawione jest powy&#380;ej. Niemniej dla &#347;wie&#380;ej
instalacji Virtuoso nie zwr&#243;ci ono &#380;adnych rezultat&#243;w.&lt;/p&gt;


	&lt;h3&gt;&#321;adowanie istniej&#261;cych danych&lt;/h3&gt;


	&lt;p&gt;&#379;eby poeksperymentowa&#263; z zapytaniami &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt; musimy za&#322;adowa&#263; jakie&#347; dane &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt;.
S&#261; one dostarczane przez wiele organizacji (np. &lt;a href=&quot;http://wiki.dbpedia.org/Downloads36&quot;&gt;DBpedi&#281;&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/p/umbel/source/browse/#svn%2Ftrunk%2Fv100%2FOntology&quot;&gt;Umbel&lt;/a&gt;, itp)
w postaci &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt;+XML lub innego popularnego formatu, np. n3. Zazwyczaj dane takie dost&#281;pne s&#261; w postaci jednego du&#380;ego pliku lub, w przypadku bardzo du&#380;ych
zbior&#243;w, w postaci kilku mniejszych plik&#243;w.&lt;/p&gt;


Mo&#380;emy je za&#322;adowa&#263; do w&#322;asnej instancji Virtuoso wykonuj&#261;c nast&#281;puj&#261;ce kroki:
	&lt;ol&gt;
	&lt;li&gt;w pliku konfiguracyjnym zezwalamy na &#322;adowanie plik&#243;w z katalogu, w kt&#243;rym przechowujemy &#347;ci&#261;gni&#281;te pliki&lt;/li&gt;
		&lt;li&gt;&#347;ci&#261;gamy i uruchamiamy &lt;a href=&quot;http://virtuoso.openlinksw.com/dataspace/dav/wiki/Main/VirtBulkRDFLoaderScript&quot;&gt;skrypt&lt;/a&gt; pozwalaj&#261;cy na masowe &#322;adowanie danych&lt;/li&gt;
		&lt;li&gt;w konsoli Virtuoso wykonujemy polecenie/a &lt;strong&gt;&lt;code&gt;ld_dir&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;w konsoli Virtuoso wykonujemy polecenie &lt;strong&gt;&lt;code&gt;df_loader_run&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;Pierwszy krok zosta&#322; opisany w punkcie &amp;#8220;Konfiguracja&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Po &#347;ci&#261;gni&#281;ciu pliku, wskazanego w drugim punkcie, zapisujemy go w aktualnym katalogu, np. pod nazw&#261; &lt;code&gt;rdfloader.sql&lt;/code&gt;,
nast&#281;pnie w tym samym katalogu wywo&#322;ujemy polecenie &lt;code&gt;isql-v&lt;/code&gt;.
Nast&#281;pnie w konsoli &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; wywo&#322;ujemy polecenie &lt;code&gt;load rdfloader.sql&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ ls&lt;/span&gt;
rdfloader.sql
&lt;span class='bash'&gt;$ isql-v&lt;/span&gt;
SQL&gt; load rdfloader.sql;&lt;/pre&gt;


	&lt;p&gt;Je&#347;li za kilka dni b&#281;dziemy chcieli za&#322;adowa&#263; kolejn&#261; paczk&#281; danych, to procedury tej nie trzeba b&#281;dzie ju&#380; powtarza&#263;.&lt;/p&gt;


Kolejny krok polega na wskazaniu katalogu, z kt&#243;rego chcemy za&#322;adowa&#263; dane. Polecenie &lt;code&gt;ld_dir&lt;/code&gt; przyjmuje trzy argumenty:
	&lt;ul&gt;
	&lt;li&gt;&#347;cie&#380;k&#281; do katalogu&lt;/li&gt;
		&lt;li&gt;szablon nazwy plik&#243;w&lt;/li&gt;
		&lt;li&gt;nazw&#281; grafu, do kt&#243;rego za&#322;adowane zostan&#261; dane&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Pierwszy argument nie wymaga wyja&#347;nienia. Drugi argument pozwala okre&#347;li&#263; szablon (tak jak dla polecenia ls), np. &amp;#8217;&amp;#42;.n3&amp;#8217; lub wskaza&#263; konkretny plik,
np. dbpedia.n3. Trzeci argument jest o tyle istotny, &#380;e pozwala przechowywa&#263; w jednej instancji semantycznej bazy dane z r&#243;&#380;nych &#378;r&#243;de&#322; i odwo&#322;ywa&#263;
si&#281; do nich niezale&#380;nie za pomoc&#261; klauzuli &lt;code&gt;WHERE&lt;/code&gt;. Warto wybra&#263; nazw&#281; wskazuj&#261;c&#261; &#378;r&#243;d&#322;o danych w postaci adresu &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, np. &lt;code&gt;http://dbpedia.org&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Przyk&#322;adowe polecenie mo&#380;e wygl&#261;da&#263; nast&#281;puj&#261;co:&lt;/p&gt;


&lt;pre&gt;
SQL&gt; ld_dir('/home/user/rdf/dbpedia','*.n3','http://dbpedia.org');&lt;/pre&gt;


	&lt;p&gt;Wbrew oczekiwaniom polecenie to nie za&#322;aduje od razu danych do bazy. Dopiero kolejne polecenie &lt;code&gt;df_loader_run&lt;/code&gt;, spowoduje za&#322;adowanie danych. 
Przed jego wykonaniem nale&#380;y uzbroi&#263; si&#281; w cierpliwo&#347;&#263;, gdy&#380; mo&#380;e zaj&#261;&#263; to ca&#322;kiem sporo czasu.&lt;/p&gt;


&lt;pre&gt;
SQL&gt; rdf_loader_run ();&lt;/pre&gt;


	&lt;h3&gt;Przyk&#322;adowe u&#380;ycie&lt;/h3&gt;


	&lt;p&gt;Je&#347;li wszystko przebieg&#322;o poprawnie, to powinni&#347;my mie&#263; mo&#380;liwo&#347;&#263; korzystania z za&#322;adowanych danych poprzez &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt; end-point. 
Mo&#380;emy go najpierw przetestowa&#263; w konsoli &lt;code&gt;isql-v&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;
sparql select * from &amp;lt;http://dbpedia.org&amp;gt; where {?s ?p ?o} limit 5;
http://dbpedia.org/resource/Autism          http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://www.w3.org/2002/07/owl#Thing
http://dbpedia.org/resource/Alabama         http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://www.w3.org/2002/07/owl#Thing
http://dbpedia.org/resource/Aristotle       http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://www.w3.org/2002/07/owl#Thing
http://dbpedia.org/resource/Academy_Award   http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://www.w3.org/2002/07/owl#Thing
http://dbpedia.org/resource/Actrius         http://www.w3.org/1999/02/22-rdf-syntax-ns#type  http://www.w3.org/2002/07/owl#Thing&lt;/pre&gt;


	&lt;p&gt;Innym sposobem dost&#281;pu jest wykorzystanie wbudowanego serwera &lt;span class=&quot;caps&quot;&gt;WWW&lt;/span&gt;. Otwieramy stron&#281; pod adresem &lt;a href=&quot;http://localhost:8080/sparql&quot;&gt;http://localhost:8080/sparql&lt;/a&gt; i
od razu mo&#380;emy zadawa&#263; zapytania &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Mo&#380;emy r&#243;wnie&#380; przetestowa&#263; dzia&#322;anie end-pointu z poziomu jakiego&#347; j&#281;zyka programowania, np. Rubiego:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
require &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;sparql/client&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
client = &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;SPARQL&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Client&lt;/span&gt;.new(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;http://localhost:8080/sparql&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
results = client.query(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;select * where {?subject ?predicate ?object} limit 5&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
results.each{|r| puts &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;#{&lt;/span&gt;r.subject&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;#{&lt;/span&gt;r.predicate&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;#{&lt;/span&gt;r.object&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;    </content>
  </entry>
  <entry>
    <title>Rails 3 and UJS with jQuery</title>
    <link rel="alternate" href="https://apohllo.pl/blog/rails-3-and-ujs-with-jquery" type="text/html"/>
    <id>https://apohllo.pl/blog/rails-3-and-ujs-with-jquery</id>
    <updated>2010-11-28T09:01:02Z</updated>
    <published>2010-11-28T08:56:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Recently I tried to convert my Rails 2.3 application into Rails 3.0. There are various tutorials
covering this problem, so I just concentrate on one issue which is not well described &amp;#8211; 
namely the &lt;acronym title=&quot;Unobtrusive JavaScript&quot;&gt;UJS&lt;/acronym&gt; functionality introduced in Rails 3.&lt;...</summary>
    <category term="rails" label="Rails" scheme="https://apohllo.pl/tags/show/rails"/>
    <category term="ujs" label="Ujs" scheme="https://apohllo.pl/tags/show/ujs"/>
    <category term="jquery" label="Jquery" scheme="https://apohllo.pl/tags/show/jquery"/>
    <content type="html">
&lt;p&gt;Recently I tried to convert my Rails 2.3 application into Rails 3.0. There are various tutorials
covering this problem, so I just concentrate on one issue which is not well described &amp;#8211; 
namely the &lt;acronym title=&quot;Unobtrusive JavaScript&quot;&gt;UJS&lt;/acronym&gt; functionality introduced in Rails 3.&lt;/p&gt;


	&lt;p&gt;Generally I agree with the idea, that &lt;span class=&quot;caps&quot;&gt;UJS&lt;/span&gt; is a good solution &amp;#8211; the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; we had with calls &lt;code&gt;link_to_remote&lt;/code&gt; 
and the like was really ugly, and this ugliness is not just something unimportant &lt;span class=&quot;caps&quot;&gt;IMHO&lt;/span&gt; (especially when
you have to look at the page source).  So I welcome this feature appreciatively.&lt;/p&gt;


	&lt;p&gt;So it seemed that the switch should to be as easy, as replacing the old:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
link_to_remote &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;tilte&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#A60&quot;&gt;:url&lt;/span&gt; =&amp;gt; {...}, &lt;span style=&quot;color:#A60&quot;&gt;:update&lt;/span&gt; =&amp;gt; &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;some_id&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;with&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
link_to &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, {...}, &lt;span style=&quot;color:#A60&quot;&gt;:remote&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;but&amp;#8230; as you might see in this piece of code above, the &lt;code&gt;:update&lt;/code&gt; key, which I found very useful, is missing
in the new syntax. I thought &amp;#8211; &amp;#8220;Strange&amp;#8221;, but who cares &amp;#8211; there must be some rationale for that, just another
piece of Rails/jQuery magic. But when I started 
&lt;a href=&quot;http://www.google.pl/search?q=rails3+ujs&amp;#38;ie=utf-8&amp;#38;oe=utf-8&amp;#38;aq=t&amp;#38;rls=org.gentoo:en-US:unofficial&amp;#38;client=firefox-a&quot;&gt;googling&lt;/a&gt;, 
I &amp;#8220;discovered&amp;#8221; that there is no good substitution for &lt;code&gt;:update&lt;/code&gt;. Especially in 
&lt;a href=&quot;http://railscasts.com/episodes/240-search-sort-paginate-with-ajax&quot;&gt;Ryan&amp;#8217;s recent railscast&lt;/a&gt; the solution
was really disappointing, I mean this line of code in &lt;code&gt;index.js.erb&lt;/code&gt;:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;$&lt;/span&gt;(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;#products&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).html(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;&amp;lt;%= escape_javascript(render(&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;products&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;)) %&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;What?! Do I have to write this piece of sh&amp;#8230; for every remote action? Where is the beauty of Rails&amp;#8217; DRYness?&lt;/p&gt;


	&lt;p&gt;But just the next day after implementing this in my application, 
I thought &amp;#8220;There must be some solution for that&amp;#8221;. And there is!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;If you wish to preserve the old behavior of &lt;code&gt;link_to_remote&lt;/code&gt; without lousing the benefits of &lt;span class=&quot;caps&quot;&gt;UJS&lt;/span&gt;, do
the same as you did, namely:&lt;/strong&gt;&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
link_to &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, {...}, &lt;span style=&quot;color:#A60&quot;&gt;:remote&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;, &lt;span style=&quot;color:#A60&quot;&gt;&lt;span style=&quot;color:#A60&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#740&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#A60&quot;&gt;data-update&lt;/span&gt;&lt;span style=&quot;color:#740&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;some_id&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;(We use &lt;code&gt;:&quot;data-update&quot;&lt;/code&gt; instead of &lt;code&gt;:update&lt;/code&gt; to be more &lt;span class=&quot;caps&quot;&gt;HTML 5&lt;/span&gt; compliant. You could use &lt;code&gt;:update&lt;/code&gt;, but 
then you would have to adapt the code below appropriately.)&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;And then add this little piece of code to your &lt;code&gt;application.js&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
jQuery(&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;function&lt;/span&gt;(&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;$&lt;/span&gt;) {
&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;$&lt;/span&gt;(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;a[data-update]&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).live(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;ajax:success&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;function&lt;/span&gt;(data,status,xhr){
      &lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;$&lt;/span&gt;(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;+&lt;span style=&quot;color:#369;font-weight:bold&quot;&gt;$&lt;/span&gt;(&lt;span style=&quot;color:#950&quot;&gt;this&lt;/span&gt;).attr(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;data-update&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)).html(status);
    });
});&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;And that&amp;#8217;s it! The &lt;code&gt;:update&lt;/code&gt; behavior should work as previously (and don&amp;#8217;t ask me why I use &amp;#8220;status&amp;#8221; variable 
for something which has semantic of &amp;#8220;data&amp;#8221; &amp;#8211; the names are taken directly from the official &lt;code&gt;rails.js&lt;/code&gt; 
file).&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>ISWC 2010 dzie&#324; 1</title>
    <link rel="alternate" href="https://apohllo.pl/blog/iswc-2010-day-1" type="text/html"/>
    <id>https://apohllo.pl/blog/iswc-2010-day-1</id>
    <updated>2010-11-19T11:45:13Z</updated>
    <published>2010-11-19T11:37:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;h3&gt;mc shraefel &amp;#8211; invited talk&lt;/h3&gt;


	&lt;p&gt;Nie wiem dok&#322;adnie o co chodzi z imieniem i nazwiskiem Pani &amp;#8220;mc shraefel&amp;#8221;, ale wsz&#281;dzie pojawia si&#281; ono z ma&#322;ej liter, wi&#281;c pozostaj&#281; przy tej konwencji.&lt;/p&gt;


	&lt;p&gt;Prezentacja zacz&#281;&#322;a si&#281; w nieoczekiwany spos&#243;b, gdy&#380; uczestnicy musieli w...</summary>
    <category term="semantic web" label="Semantic web" scheme="https://apohllo.pl/tags/show/semantic%20web"/>
    <category term="iswc" label="Iswc" scheme="https://apohllo.pl/tags/show/iswc"/>
    <content type="html">
&lt;h3&gt;mc shraefel &amp;#8211; invited talk&lt;/h3&gt;


	&lt;p&gt;Nie wiem dok&#322;adnie o co chodzi z imieniem i nazwiskiem Pani &amp;#8220;mc shraefel&amp;#8221;, ale wsz&#281;dzie pojawia si&#281; ono z ma&#322;ej liter, wi&#281;c pozostaj&#281; przy tej konwencji.&lt;/p&gt;


	&lt;p&gt;Prezentacja zacz&#281;&#322;a si&#281; w nieoczekiwany spos&#243;b, gdy&#380; uczestnicy musieli wsta&#263;, macha&#263; r&#281;kami i buja&#263; si&#281; na biodrach.
W&#347;r&#243;d niekt&#243;rych wywo&#322;a&#322;o to ma&#322;&#261; konsternacj&#281;, ale niew&#261;tpliwie wszyscy si&#281; obudzili, a niekt&#243;rzy przynajmniej na 
chwil&#281; od&#322;o&#380;yli swoje komputery.&lt;/p&gt;


	&lt;p&gt;W zasadzie ca&#322;a prezentacja mc, koncentrowa&#322;a si&#281; na zagadnieniach &lt;em&gt;usability&lt;/em&gt; technologii semantycznych. 
Podstawowa jej obserwacja, kt&#243;ra chyba wywo&#322;a&#322;a najwi&#281;cej niezadowolenia audytorium, dotyczy&#322;a faktu,
&#380;e w&#322;a&#347;ciwie ka&#380;da z prezentowanych jej aplikacji opartych o Semantic web, dla przeci&#281;tnego u&#380;ytkownika Internetu
w zasadzie by&#322;a niezrozumia&#322;a. Trudno nie zgodzi&#263; si&#281; jednak z t&#261; obserwacj&#261;, je&#347;li widzi si&#281;, &#380;e kolejne 
aplikacje pokazuj&#261; dane &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt; w coraz to nowych konfiguracjach, z coraz to nowymi ikonkami, ale nic sensownego
z tego nie wynika. Oczywi&#347;cie jest to zgrubna ocena, ale te&#380; wa&#380;ny sygna&#322; dla firm, kt&#243;re chcia&#322;yby komercjalizowa&#263;
tego typu technologie. Oczekiwanie, &#380;e u&#380;ytkownik ogl&#261;daj&#261;c jak&#261;&#347; dziwn&#261; tabelk&#281; z dziwnymi napisami 
b&#281;dzie zachwycony jest ma&#322;o realne.&lt;/p&gt;


	&lt;p&gt;Oczywi&#347;cie jako przeciwwaga pokazany zosta&#322; interfejs projektu, nad kt&#243;rym pracuje mc. 
Zasadniczo w og&#243;le nie by&#322;o wiadomo,
&#380;e jest to aplikacja Semantic Web &amp;#8211; interfejs by&#322; tekstowy. U&#380;ytkownik m&#243;g&#322; wprowadza&#263; zapytania w j&#281;zyku
zbli&#380;ony do naturalnego, no i na tym ca&#322;a rzecz si&#281; opiera&#322;a (co&#347; podobnego do firefoxowego Ubiquity).&lt;/p&gt;


	&lt;p&gt;Konkluzj&#261; prezentacji by&#322;o stwierdzenie &amp;#8211; niech tematem kolejnej &lt;span class=&quot;caps&quot;&gt;ISWC&lt;/span&gt; b&#281;d&#261; zwykli u&#380;ytkownicy i ich potrzeby,
a nie kolejne dyskusje nad przewag&#261; &lt;span class=&quot;caps&quot;&gt;OWL&lt;/span&gt;-a nad &lt;span class=&quot;caps&quot;&gt;RDFS&lt;/span&gt; i vise-versa.&lt;/p&gt;


	&lt;h3&gt;Doctoral consortium i &lt;span class=&quot;caps&quot;&gt;NLP&lt;/span&gt;&lt;/h3&gt;


	&lt;p&gt;Po prezentacji mc shraefel przenios&#322;em si&#281; do sali, w kt&#243;rej prezentacje mieli studenci. Przyznam szczerze,
&#380;e prezentacje mnie nie powali&#322;y. Generalnie wi&#281;kszo&#347;&#263; z nich mia&#322;a podobny problem &amp;#8211; chcieli poruszy&#263;
zbyt wiele temat&#243;w w jednej pracy. Co wi&#281;cej, cho&#263; ambicje prezentuj&#261;cych by&#322;y du&#380;e, to prezentacje
wycinkowe i zazwyczaj koncentrowa&#322;y si&#281; na zagadnieniach ju&#380; do&#347;&#263; dobrze zbadanych (np. ekstrakcja relacji
taksonomicznych z Wikipedii). Dlatego szybko przenios&#322;em si&#281; na prezentacj&#281; &lt;a href=&quot;http://iswc2010.semanticweb.org/accepted-papers/234&quot;&gt;Supporting Natural Language Processing with Background Knowledge: Coreference Resolution Case&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;W prezentowanym artykule autorzy pokazuj&#261;, jak mo&#380;na wykorzysta&#263; statystyczne algorytmy w po&#322;&#261;czeniu z wiedz&#261; 
dost&#281;pn&#261; w Semantic Web, aby ulepszy&#263; wyniki uzyskiwane dla r&#243;&#380;nych zada&#324; z dziedziny ekstrakcji informacji, 
w tym wypadku w zadaniu rozpoznawaniu koreferencji mi&#281;dzy dokumentami. Autorzy proponuj&#261;, aby u&#380;y&#263;
Wikipedii jako punktu odniesienia dla innych &#378;r&#243;de&#322; wiedzy. Niew&#261;tpliwie nie jest to zaskakuj&#261;ce rozwi&#261;zanie.
Du&#380;a cz&#281;&#347;&#263; artyku&#322;u po&#347;wi&#281;cona jest zagadnieniu wyboru tych relacji, spo&#347;r&#243;d wielu wyst&#281;puj&#261;cych w 
&#378;r&#243;d&#322;ach Semantic Web, kt&#243;re istotne s&#261; z punktu widzenia skuteczno&#347;ci algorytmu. Wiadomo bowiem, &#380;e dane 
dost&#281;pne jako Linked Data nie s&#261; zbalansowane i nierzadko dla okre&#347;lonych zasob&#243;w (np. Obamy) istniej&#261; setki fakt&#243;w,
a dla innych zaledwie kilka. Prezentacja niew&#261;tpliwie ciekawa, ale w moim przekonaniu zastanawiaj&#261;ce jest 
u&#380;ycie statystycznych metod do okre&#347;lenia istotnych cech zasob&#243;w, zamiast wykorzystanie jawnej reprezentacji,
kt&#243;ra jest jedn&#261; z podstawowych zalet zasob&#243;w udost&#281;pnianych w jako Linked Data.&lt;/p&gt;


	&lt;p&gt;Z pozosta&#322;ych prezentacji, kt&#243;re obejrza&#322;em tego dnia, chyba &#380;adna nie zapad&#322;a mi specjalnie w pami&#281;&#263;. By&#322;y to m.in. 
dyskusja panelowa nad formatem &lt;span class=&quot;caps&quot;&gt;RIF&lt;/span&gt;, &amp;#8220;I18n of Semantic Web Applications&amp;#8221;, 
&amp;#8220;Mapping Master: a Flexible Approach for Mapping Spreadsheets to &lt;span class=&quot;caps&quot;&gt;OWL&lt;/span&gt;&amp;#8221; oraz
&amp;#8220;ISReal: An Open Platform for Semantic-Based 3D Simulations in the 3D Internet&amp;#8221;.\&lt;/p&gt;


	&lt;p&gt;Tego dnia pokazywa&#322;em r&#243;wnie&#380; swoje demo, w kt&#243;rym dla danych udost&#281;pnianych jako Linked Data, 
tworzone by&#322;y polskie opisy. Niestety ze wzgl&#281;du na tymczasow&#261; niedost&#281;pno&#347;&#263; serwisu MusicBrainz, demo
nie dzia&#322;a&#322;o :( No c&#243;&#380; &amp;#8211; taka natura Semantic Web. Ale przynajmniej mog&#322;em sobie porozmawia&#263; z kilkoma osobami,
kt&#243;re udawa&#322;y, &#380;e chc&#261; si&#281; nauczy&#263; j&#281;zyka polskiego (poniewa&#380; nie mia&#322;em plakatu, zamie&#347;ci&#322;em tylko kr&#243;tk&#261;
notk&#281;, &#380;e mo&#380;na nauczy&#263; si&#281; naszego j&#281;zyka ;) ). Kilka dyskusji by&#322;o niew&#261;tpliwie ciekawych, ale ich 
konkluzje pozostawiam dla siebie.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>ISWC 2010 COLD</title>
    <link rel="alternate" href="https://apohllo.pl/blog/iswc-2010-consuming-linked-data" type="text/html"/>
    <id>https://apohllo.pl/blog/iswc-2010-consuming-linked-data</id>
    <updated>2010-11-19T08:58:07Z</updated>
    <published>2010-11-08T01:21:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Ciekawsze prezentacje z warsztat&#243;w &lt;a href=&quot;http://people.csail.mit.edu/pcm/tempISWC/workshops/COLD2010/index.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;COLD&lt;/span&gt;&lt;/a&gt; w ramach konferencji &lt;a href=&quot;http://iswc2010.semanticweb.org&quot;&gt;International Semantic Web Conference 2010&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;&lt;a href=&quot;http://people...</summary>
    <category term="semantic web" label="Semantic web" scheme="https://apohllo.pl/tags/show/semantic%20web"/>
    <category term="iswc" label="Iswc" scheme="https://apohllo.pl/tags/show/iswc"/>
    <content type="html">
&lt;p&gt;Ciekawsze prezentacje z warsztat&#243;w &lt;a href=&quot;http://people.csail.mit.edu/pcm/tempISWC/workshops/COLD2010/index.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;COLD&lt;/span&gt;&lt;/a&gt; w ramach konferencji &lt;a href=&quot;http://iswc2010.semanticweb.org&quot;&gt;International Semantic Web Conference 2010&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;&lt;a href=&quot;http://people.csail.mit.edu/pcm/tempISWC/workshops/COLD2010/NikolovEtAl_COLD2010.pdf&quot;&gt;Capturing Emerging Relations between Schema Ontologies on the Web of Data&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;Autorzy pokazuj&#261; jak mo&#380;na ustala&#263; relacj&#281; ekwiwalencji pomi&#281;dzy klasami wykorzystywanymi w &lt;a href=&quot;http://linkeddata.org&quot;&gt;Linked Data&lt;/a&gt;. Zasadnicza idea opiera si&#281; na wykorzystaniu relacji &amp;#8220;sameas&amp;#8221; na poziomie instancji.
Okazuje si&#281;, &#380;e proste drzewo decyzyjne pozwala uzyska&#263; precyzj&#281; na poziomie przekraczaj&#261;cym 90%. 
Problem, kt&#243;ry utrudnia wykorzystanie rezultat&#243;w tego rodzaju, jest m.in. zmienno&#347;&#263; schemat&#243;w konceptualnych 
u&#380;ywanych w r&#243;&#380;nych bazach wiedzy. Ponadto operowanie na poziomie instancji du&#380;ych zbior&#243;w danych jest bardzo 
czasoch&#322;onne.&lt;/p&gt;


	&lt;h3&gt;&lt;a href=&quot;http://people.csail.mit.edu/pcm/tempISWC/workshops/COLD2010/BizerEtAl_COLD2010.pdf&quot;&gt;The &lt;span class=&quot;caps&quot;&gt;R2R&lt;/span&gt; Framework: Publishing and Discovering Mappings on the Web&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;Autorzy przedstawiaj&#261; metodyk&#281; oraz j&#281;zyk, kt&#243;ry maj&#261; pom&#243;c w rozwi&#261;zaniu jednego z podstawowych problem&#243;w Semantic
Web, tzn. wyst&#281;powania wielu niezale&#380;nych taksonomii. Podstawowa idea polega umo&#380;liwieniu publikowania 
oraz odnajdywania mapowa&#324; pomi&#281;dzy r&#243;&#380;nymi schematami konceptualnymi.&lt;/p&gt;


Autorzy wymieniaj&#261; nast&#281;puj&#261;ce problemy, kt&#243;ry pojawiaj&#261; si&#281;, kiedy u&#380;ywamy r&#243;&#380;nych schemat&#243;w konceptualnych,
a nawet tych samych schemat&#243;w konceptualnych w r&#243;&#380;nych &#378;r&#243;d&#322;ach danych:
	&lt;ul&gt;
	&lt;li&gt;odmienne klas u&#380;ywane do wyra&#380;enia tych samych poj&#281;&#263;&lt;/li&gt;
		&lt;li&gt;odmienne w&#322;asno&#347;ci (tutaj istotny problem polega r&#243;wnie&#380; na dopasowaniu pozycji argument&#243;w)&lt;/li&gt;
		&lt;li&gt;u&#380;ywanie odmiennych jednostek w r&#243;&#380;nych DS korzystaj&#261;cych z tej samej ontologii&lt;/li&gt;
		&lt;li&gt;modyfikacje typu danych -&amp;gt; int &amp;#8211; float&lt;/li&gt;
		&lt;li&gt;u&#380;ywanie odmiennych etykiet (A. Einstein vs. Albert Einstein)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Autorzy proponuj&#261; nowy j&#281;zyk &lt;span class=&quot;caps&quot;&gt;R2R&lt;/span&gt; zbudowany na podstawie &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;, kt&#243;ry pozwala&#322;by na opisywanie przekszta&#322;ce&#324;, 
kt&#243;re musz&#261; by&#263; dokonane aby dopasowa&#263; do siebie r&#243;&#380;ne &#378;r&#243;d&#322;a danych, poniewa&#380; dotychczasowe rozwi&#261;zania
zdefiniowane w &lt;span class=&quot;caps&quot;&gt;OWL&lt;/span&gt; i &lt;span class=&quot;caps&quot;&gt;SKOS&lt;/span&gt; s&#261; niewystarczaj&#261;ce do rozwi&#261;zania wszystkich wy&#380;ej przedstawionych problem&#243;w.&lt;/p&gt;


	&lt;p&gt;Propozycja polega na dodanie rozbudowanych szablon&#243;w mapowania, kt&#243;re uwzgl&#281;dniaj&#261; wszystkie wy&#380;ej wymienione problemy. Ponadto zaproponowane rozwi&#261;zanie umo&#380;liwia tworzenie &#322;a&#324;cuch&#243;w przetwarzania (tzn. mapowania
poprzez schematy po&#347;rednie) oraz uwzgl&#281;dnia meta dane na temat tw&#243;rcy mapowania, jego jako&#347;ci, etc.&lt;/p&gt;


	&lt;p&gt;Rozwi&#261;zanie wydaje si&#281; jednak dosy&#263; nietrafione &amp;#8211; istnieje wiele formalnych
rozwi&#261;za&#324;, kt&#243;re adresuj&#261; powy&#380;sze problemy. Zdecydowanie lepiej by&#322;oby 
obj&#261;&#263; w rozwi&#261;zaniu tylko te elementy, kt&#243;re nie daj&#261; si&#281; za&#322;atwi&#263; na
poziomie deklaratywnym. W szczeg&#243;lno&#347;ci odnosi si&#281; to do dopasowania klas,
w&#322;asno&#347;ci oraz jednostek (w ko&#324;cu mo&#380;na wprost opisa&#263; jednostki, kt&#243;re
u&#380;ywane s&#261; w okre&#347;lonym DS, albo wymusi&#263; u&#380;ywanie okre&#347;lonych jednostek w
samej ontologii). W szczeg&#243;lno&#347;ci rezygnacja z wykorzystania predykat&#243;w sameAs, equivalentClass,
equivalentProperty wydaje si&#281; najgorszym pomys&#322;em.&lt;/p&gt;


	&lt;p&gt;Wydaje si&#281; natomiast, &#380;e niekt&#243;re aspekty
s&#261; zupe&#322;nie pomijalne &amp;#8211; np. etykieta A. Einstein vs Albert Einstein. Je&#347;li tylko b&#281;dzie ustalona relacja
sameAs pomi&#281;dzy odpowiednimi zasobami, takie r&#243;&#380;nice b&#281;d&#261; zupe&#322;nie nieistotne (jest to jedna z podstawowych
idei le&#380;&#261;cych u podstaw Semantic Web &amp;#8211; tzn. reidentyfikacja przez &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; a nie te lub inne w&#322;asno&#347;ci).&lt;/p&gt;


	&lt;p&gt;PS. Autorzy s&#261; tw&#243;rcami DBpedii. Rozmawia&#322;em z autorem prezentacji i wyja&#347;ni&#322;, &#380;e predykaty sameAs, etc. b&#281;d&#261; wykorzystywane przez prezentowane narz&#281;dzie, ale po co zatem dodawa&#263; nowe rozwi&#261;zanie s&#322;u&#380;&#261;ce do tego samego?&lt;/p&gt;


	&lt;h3&gt;&lt;a href=&quot;http://people.csail.mit.edu/pcm/tempISWC/workshops/COLD2010/MillardEtAl_COLD2010.pdf&quot;&gt;Consuming multiple linked data sources: Challenges and Experiences&lt;/a&gt;&lt;/h3&gt;


Zasadniczy problem poruszany w artykule dotyczy efektywnego wykonywania zapyta&#324; w j&#281;zyku &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt; obejmuj&#261;cych
wiele zbior&#243;w danych. Autorzy zwracaj&#261; uwag&#281; na dwa aspekty zagadnienia:
	&lt;ul&gt;
	&lt;li&gt;uwzgl&#281;dnieniu wielu &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;-i wskazuj&#261;cych ten sam obiekt w r&#243;&#380;nych zbiorach danych&lt;/li&gt;
		&lt;li&gt;efektywne przetwarzanie zapyta&#324;, dla kt&#243;rych dane znajduj&#261; si&#281; w odr&#281;bnych zbiorach&lt;/li&gt;
	&lt;/ul&gt;


Dotychczasowe podej&#347;cie do problemu przedstawione jest na przyk&#322;adzie dw&#243;ch wcze&#347;niejszych rozwi&#261;za&#324;:
	&lt;ul&gt;
	&lt;li&gt;Semantic Web Client Library &amp;#8211; w celu wykonania zapytania obejmuj&#261;cego wiele zbior&#243;w danych, dane s&#261; wcze&#347;niej cache&amp;#8217;owane lokalnie i zapytanie realizowane jest na ich kopii. Problemem jest to, &#380;e cz&#281;sto pobierane s&#261; znaczne ilo&#347;ci informacji nie istotne do realizacji zapytania.&lt;/li&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;DARQ&lt;/span&gt; &amp;#8211; prezentuje podej&#347;cie dok&#322;adnie przeciwne dl &lt;span class=&quot;caps&quot;&gt;SWCL&lt;/span&gt;, wszystkie zapytania realizowane s&#261; w oparciu od zdalne &lt;span class=&quot;caps&quot;&gt;SPAQRL&lt;/span&gt; end-pointy (co wyklucza wykorzystanie danych nie posiadaj&#261;cych takiego end-pointu). Zasadniczymi wadami tego podej&#347;cia s&#261;: ma&#322;a wydajno&#347;&#263; oraz konieczno&#347;&#263; dostarczenia danych statystycznych na temat zawarto&#347;ci okre&#347;lonego &#378;r&#243;d&#322;a danych w celu optymalizacji zapytani.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Propozycja przedstawiona przez autor&#243;w opiera si&#281; na do&#347;wiadczeniu zdobytym z narz&#281;dziem &lt;a href=&quot;http://www.rkbexplorer.com&quot;&gt;RKBExplorer&lt;/a&gt;. S&#322;u&#380;y ono
do dostarczania informacji na temat &lt;em&gt;spo&#322;eczno&#347;ci praktyk&#243;w&lt;/em&gt; pracuj&#261;cych nad jakim&#347; zagadnieniem naukowym. 
W szczeg&#243;lno&#347;ci narz&#281;dzie to powinno dostarcza&#263; informacje na temat os&#243;b, ich publikacji, temat&#243;w bada&#324; itp.
Zaproponowane rozwi&#261;zanie sprowadza si&#281; do dostarczenie specyficznych po&#322;&#261;cze&#324; zapyta&#324;, kt&#243;re maj&#261; by&#263; wykonywane na wielu zbiorach danych. W szczeg&#243;lno&#347;ci chodzi o to, by fragmenty zapytania mog&#322;y by&#263; wykonywane wewn&#261;trz jednego
zbioru danych, natomiast ca&#322;o&#347;&#263; mo&#380;e obejmowa&#263; wiele zbior&#243;w. Cho&#263; rozwi&#261;zanie to posiada istotne ograniczenia,
dla zadania, w kt&#243;rym by&#322;o wykorzystywane uzyskana wydajno&#347;&#263; by&#322;a zadowalaj&#261;ca. Co wi&#281;cej zbiory danych r&#243;&#380;nego typu
(surowe dane &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt; oraz dane dost&#281;pne za pomoc&#261; j&#281;zyka &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt;) s&#261; obs&#322;ugiwane w tym rozwi&#261;zaniu.&lt;/p&gt;


	&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt; Jeopardy! Challenge&lt;/h3&gt;


	&lt;p&gt;Zdecydowanie najciekawsza prezentacja z tych warsztat&#243;w &amp;#8211; przedstawiciel &lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt;-a &amp;#8211; Chris Welty przedstawi&#322;
projekt o rozmachu podobny do Deep Blue. Du&#380;y zesp&#243;&#322; naukowc&#243;w z &lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt; Research pracuje nad systemem 
odpowiadaj&#261;cym na pytania, kt&#243;ry m&#243;g&#322;by konkurowa&#263; z lud&#378;mi w grze podobnej do naszego &amp;#8220;Va Banque&amp;#8221; 
(w istocie rzeczy Va Banque by&#322; realizowany na licencji Jeopardy).
Ca&#322;y problem polega na tym, &#380;e osoby wygrywaj&#261;ce ten teleturniej zazwyczaj odpowiadaj&#261; w ci&#261;gu kilku
sekund, i w przewa&#380;aj&#261;cej liczbie przypadk&#243;w nie myl&#261; si&#281;. Dodatkowym utrudnieniem jest fakt, &#380;e pytanie
zadawane jest nie wprost.&lt;/p&gt;


	&lt;p&gt;Zatem system, kt&#243;ry m&#243;g&#322;by konkurowa&#263; z lud&#378;mi musia&#322;by poprawnie analizowa&#263; zdanie, posiada&#263; olbrzymi&#261;
wiedz&#281; faktograficzn&#261; oraz okre&#347;la&#263; w&#322;a&#347;ciw&#261; odpowied&#378; w czasie kilku sekund. Niestety w gruncie rzeczy 
uczestnicy konferencji nie dowiedzieli si&#281; zbyt wiele, poza og&#243;lnikowymi stwierdzeniami, &#380;e kluczow&#261; w&#322;asno&#347;ci&#261;
systemu, jest zdolno&#347;&#263; do prawid&#322;owej oceny odpowiedzi. Pad&#322;o te&#380; dosy&#263; enigmatyczne stwierdzenie, &#380;e 
w systemie tego rodzaju niezbyt istotna jest wiedza &amp;#8220;zdroworozs&#261;dkowa&amp;#8221;, kt&#243;rej tak wiele uwagi po&#347;wi&#281;caj&#261;
tw&#243;rcy ontologii, ale wiedza faktograficzna. Z pytania, kt&#243;re zada&#322;em Weltyemu wynika&#322;o jednak, &#380;e chodzi tutaj
przede wszystkim o odpowiednie okre&#347;lenie kategorii semantycznej obiektu podlegaj&#261;cego ocenie. Niew&#261;tpliwie 
jest to wiedza faktograficzna, ale z drugiej strony w&#261;tpi&#281;, by mo&#380;na oby&#263; si&#281; bez pewnych inferencji realizowanych
na jej podstawie.&lt;/p&gt;


	&lt;p&gt;Dosy&#263; zabawne by&#322;o r&#243;wnie&#380; rozwi&#261;zanie problemu ogranicze&#324; czasowych &amp;#8211; system generuje bowiem tysi&#261;ce 
hipotetycznych odpowiedzi i ka&#380;da z nich analizowana jest na odr&#281;bnej maszynie. Zatem system dzia&#322;a w oparciu 
o wielotysi&#281;czny klaster komputer&#243;w. A nad samym systemem pracuje kilkudziesi&#281;cioosobowa grupa naukowc&#243;w 
z IBMa. Nie dowiedzieli&#347;my si&#281; r&#243;wnie&#380;, jaka jest jego obecna skuteczno&#347;&#263;, cho&#263; przez przypadek pojawi&#322; si&#281; taki
slajd (kt&#243;rego mia&#322;o nie by&#263;&amp;#8230; :] )&lt;/p&gt;


	&lt;p&gt;W ka&#380;dym razie system wzbudzi&#322; du&#380;e zainteresowanie i niew&#261;tpliwie mo&#380;na si&#281; spodziewa&#263;, &#380;e nied&#322;ugo zostanie
pokazany ca&#322;emu &#347;wiatu, jako kolejne wielkie dzie&#322;o IBMa.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>Zestawienie polece&#324;: Git i SVN</title>
    <link rel="alternate" href="https://apohllo.pl/blog/zestawienie-polece-git-a-z-svn-em" type="text/html"/>
    <id>https://apohllo.pl/blog/zestawienie-polece-git-a-z-svn-em</id>
    <updated>2010-06-05T14:59:44Z</updated>
    <published>2010-06-05T12:00:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Yehuda Katz &lt;a href=&quot;http://yehudakatz.com/2010/05/13/common-git-workflows/&quot;&gt;opublikowa&#322;&lt;/a&gt; artyku&#322;, w kt&#243;rym pokazuje, jak 
wygl&#261;d jego typowa sesja edycji kodu w kontek&#347;cie Git-a. Ca&#322;y artyku&#322; warty jest przeczytania, natomiast
tabelka, kt&#243;ra pojawia si&#281; na ko&#324;cu zdecydowanie mo&#380;e s&#322;u&#380;y&#263; za...</summary>
    <category term="svn" label="Svn" scheme="https://apohllo.pl/tags/show/svn"/>
    <category term="git" label="Git" scheme="https://apohllo.pl/tags/show/git"/>
    <content type="html">
&lt;p&gt;Yehuda Katz &lt;a href=&quot;http://yehudakatz.com/2010/05/13/common-git-workflows/&quot;&gt;opublikowa&#322;&lt;/a&gt; artyku&#322;, w kt&#243;rym pokazuje, jak 
wygl&#261;d jego typowa sesja edycji kodu w kontek&#347;cie Git-a. Ca&#322;y artyku&#322; warty jest przeczytania, natomiast
tabelka, kt&#243;ra pojawia si&#281; na ko&#324;cu zdecydowanie mo&#380;e s&#322;u&#380;y&#263; za &#347;ci&#261;g&#281; z Gita, dla wcze&#347;niejszych 
u&#380;ytkownik&#243;w &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt;-a. Pozwalam j&#261; sobie przerysowa&#263;:&lt;/p&gt;


	&lt;table&gt;
		&lt;tr&gt;
			&lt;th&gt;Operacja &lt;/th&gt;
			&lt;th&gt;git     &lt;/th&gt;
			&lt;th&gt;svn&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Klonowanie repozytorium     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git clone git://github.com/rails/rails.git&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;svn checkout http://dev.rubyonrails.org/svn/rails/trunk&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Przygotowywanie zmian     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git add, git commit&lt;/code&gt;      &lt;/td&gt;
			&lt;td&gt;brak lub r&#281;czne przygotowanie diff-a&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&#346;ci&#261;ganie zmian z repozytorium     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git pull --rebase&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;svn up&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Rozstrzyganie konflikt&#243;w     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git add, git rebase --continue&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;svn resolve&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Rozstrzyganie konflikt&#243;w (bez&amp;#8212;rebase)     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git add, git commit&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;brak&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Wycofywanie zmian (przygotowanych do wys&#322;ania)    &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git reset --hard&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;svn up -rOLD&lt;/code&gt; potem zaaplikowanie diff-a (je&#347;li pami&#281;ta&#322;e&#347; &#380;eby go zrobi&#263;)&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Publikowanie do repozytorium     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;     &lt;/td&gt;
			&lt;td&gt;&lt;code&gt;svn commit&lt;/code&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;    </content>
  </entry>
  <entry>
    <title>Musicbrainz w Rubim</title>
    <link rel="alternate" href="https://apohllo.pl/blog/musicbrainz-w-rubim" type="text/html"/>
    <id>https://apohllo.pl/blog/musicbrainz-w-rubim</id>
    <updated>2010-05-22T14:01:47Z</updated>
    <published>2010-05-22T11:44:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;h2&gt;SemanticWeb i Ruby&lt;/h2&gt;


	&lt;p&gt;Niestety nie mam zbyt wiele czasu, aby t&#322;umaczy&#263; ide&#281; SemanticWeb. W dw&#243;ch s&#322;owach mo&#380;na powiedzie&#263;, 
&#380;e chodzi mo&#380;liwo&#347;&#263; pobierania danych z Internetu w spos&#243;b zbli&#380;ony do podbierania danych 
z relacyjnej bazy danych. Oczywi&#347;cie bior&#261;c pod uwag&#281; immanentny inter...</summary>
    <category term="ruby" label="Ruby" scheme="https://apohllo.pl/tags/show/ruby"/>
    <category term="semantic web" label="Semantic web" scheme="https://apohllo.pl/tags/show/semantic%20web"/>
    <category term="active rdf" label="Active rdf" scheme="https://apohllo.pl/tags/show/active%20rdf"/>
    <category term="musicbrainz" label="Musicbrainz" scheme="https://apohllo.pl/tags/show/musicbrainz"/>
    <content type="html">
&lt;h2&gt;SemanticWeb i Ruby&lt;/h2&gt;


	&lt;p&gt;Niestety nie mam zbyt wiele czasu, aby t&#322;umaczy&#263; ide&#281; SemanticWeb. W dw&#243;ch s&#322;owach mo&#380;na powiedzie&#263;, 
&#380;e chodzi mo&#380;liwo&#347;&#263; pobierania danych z Internetu w spos&#243;b zbli&#380;ony do podbierania danych 
z relacyjnej bazy danych. Oczywi&#347;cie bior&#261;c pod uwag&#281; immanentny internetowy pluralizm, trudno wyobra&#380;a&#263;
sobie, &#380;e taka &amp;#8220;baza danych&amp;#8221; mog&#322;aby posiada&#263; wsp&#243;lny schemat, dlatego te&#380; jednym z kluczowych element&#243;w
SemanticWeb jest koncepcja ontologii &amp;#8211; w tym kontek&#347;cie: specyfikacji poj&#281;&#263;, kt&#243;re s&#322;u&#380;&#261; do opisu danych.&lt;/p&gt;


	&lt;p&gt;Na dzie&#324; dzisiejszy jedn&#261; z najbardziej donios&#322;ych manifestacji tej idei jest &lt;a href=&quot;http://linkeddata.org&quot;&gt;Linked Open Data&lt;/a&gt; i s&#322;ynna &lt;a href=&quot;http://richard.cyganiak.de/2007/10/lod/&quot;&gt;chmura ontologii&lt;/a&gt;, czyli
obrazek, kt&#243;ry ma nas przekona&#263;, &#380;e inwestuj&#261;c w ide&#281; SemanticWeb, mo&#380;na ju&#380; pobra&#263; bardzo du&#380;o danych
w ten spos&#243;b i, co wi&#281;cej, dane te nie b&#281;d&#261; odizolowane, ale przynajmniej w pewnym stopniu powi&#261;zane z innymi
danymi, publikowanymi przez rozmaite podmioty.&lt;/p&gt;


	&lt;p&gt;Jednym z kluczowych element&#243;w SemanticWeb staje si&#281; &lt;a href=&quot;http://dbpedia.org&quot;&gt;DBpedia&lt;/a&gt;, kt&#243;ra jest ontologi&#261; 
powsta&#322;&#261; na bazie informacji wyekstrahowanych z angielskiej (ale nie tylko) Wikipedii. Coraz wi&#281;cej 
innych zasob&#243;w jest &amp;#8220;linkowanych&amp;#8221; do DBpedii, dzi&#281;ki czemu staje si&#281; ona w du&#380;ej mierze ontologi&#261; 
(schematem) odniesienia.&lt;/p&gt;


	&lt;p&gt;Czy faktycznie mo&#380;na ju&#380; wykorzystywa&#263; powi&#261;zania pomi&#281;dzy poszczeg&#243;lnymi &#378;r&#243;d&#322;ami wiedzy pozostaje kwesti&#261; 
dyskusyjn&#261; (np. przedstawione na obrazku powi&#261;zanie DBpedii z Musicbrainzem wydaje si&#281; mocno w&#261;tpliwe, gdy&#380;
najistotniejsze elementy &amp;#8211; czyli klasy, nie s&#261; powi&#261;zane), niemniej jednak warto &#347;ledzi&#263; rozw&#243;j tej koncepcji,
gdy&#380; istotnie staj&#281; si&#281; ona coraz powa&#380;niej traktowana r&#243;wnie&#380; przez instytucje komercyjne (np. Reuters, &lt;span class=&quot;caps&quot;&gt;BBC&lt;/span&gt;).&lt;/p&gt;


	&lt;p&gt;Jako, &#380;e moim ulubionym j&#281;zykiem jest Rubi, &lt;a href=&quot;/blog/activerdf-i-dbpedia&quot;&gt;jaki&#347; czas temu&lt;/a&gt; testowa&#322;em mo&#380;liwo&#347;&#263;
wykorzystania biblioteki &lt;a href=&quot;http://activerdf.org&quot;&gt;ActiveRDF&lt;/a&gt; do pobierania danych z DBpedii. W tamtym po&#347;cie jest
w zasadzie tylko kod i je&#347;li nie mia&#322;o si&#281; styczno&#347;ci z ActiveRDF trudno cokolwiek z niego wywnioskowa&#263;.
W niniejszym po&#347;cie chcia&#322;bym przedstawi&#263; inny przyk&#322;ad wykorzystania ActiveRDF, tym razem do 
pobierania danych z &lt;a href=&quot;http://musicbrainz.org/&quot;&gt;Musicbrainza&lt;/a&gt;, czyli wielkiej bazy zawieraj&#261;cej dane dotycz&#261;ce
tysi&#281;cy muzyk&#243;w, p&#322;yt, utwor&#243;w muzycznych i tym podobnych.&lt;/p&gt;


	&lt;h2&gt;ActiveRDF&lt;/h2&gt;


	&lt;p&gt;ActiveRDF, jak mo&#380;na wnioskowa&#263; na podstawie nazwy, ma uczyni&#263; nasze &#380;ycie z SemanticWeb znacznie prostszym
(podobnie jak ActiveRecord czyni prostszym (?) obs&#322;ug&#281; relacyjnych baz danych). Niestety 
po tym jak tw&#243;rca tej biblioteki, czyli Eyal Oren przesta&#322; si&#281; ni&#261; opiekowa&#263;, straci&#322;a ona swoja pocz&#261;tkow&#261; 
stabilno&#347;&#263;, a, co gorsza, wiele przyk&#322;ad&#243;w, kt&#243;re zosta&#322;y udokumentowane, przesta&#322;o dzia&#322;a&#263; w kolejnych 
wersjach. Jest to pewna przypad&#322;o&#347;&#263; j&#281;zyk&#243;w dynamicznych, w szczeg&#243;lno&#347;ci Rubiego, &#380;e tw&#243;rcy rozwi&#261;za&#324; 
mniejsz&#261; wag&#281; przywi&#261;zuj&#261; do zachowania stabilnego &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; &amp;#8211; w my&#347;l zasady: &amp;#8220;lepsze wrogiem dobrego&amp;#8221;, zapominaj&#261;c
jednak, &#380;e cz&#281;sto &amp;#8220;dzia&#322;aj&#261;ce lepsze od &#380;adnego&amp;#8221;. Pomijaj&#261;c jednak te filozoficzne dywagacje, warto
wspomnie&#263;, &#380;e obecnie ActiveRDF ma swoje &lt;a href=&quot;http://github.com/ActiveRDF/ActiveRDF&quot;&gt;konto na Githubie&lt;/a&gt; i jest
rozwijane. Niemniej jednak uruchomienie najnowszej (1.7.0) wersji, w szczeg&#243;lno&#347;ci je&#347;li u&#380;ywamy Rubiego 1.9
nie jest wcale banalne.&lt;/p&gt;


	&lt;p&gt;Niestety aktualny opiekun biblioteki nie otagowa&#322; tej wersji, nie wys&#322;a&#322; jej tak&#380;e na &lt;a href=&quot;/blog/gemcutter&quot;&gt;gemcuttera&lt;/a&gt;,
przez co skazani jeste&#347;my na budowanie gema ze &#378;r&#243;de&#322;, co wcale nie jest takie banalne (specyfikacja
gem&#243;w zdefiniowana jest z u&#380;yciem jewelera, kt&#243;ry jest niekompatybilny z Rubim 1.9). Dlatego najpro&#347;ciej
jest &#347;ci&#261;gn&#261;&#263; &lt;a href=&quot;http://github.com/apohllo/ActiveRDF/tree/1_7_0&quot;&gt;mojego brancha 1_7_0&lt;/a&gt;&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ git clone git://github.com/apohllo/ActiveRDF.git&lt;/span&gt;
...
&lt;span class='bash'&gt;$ cd ActiveRDF&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;Niestety nie obejdzie si&#281; bez u&#380;ycia Rubiego 1.8 do zbudowania gema. Ja korzystam z Gentoo, dlatego 
mog&#281; zmieni&#263; wersj&#281; wykonuj&#261;c polecenie:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ sudo eselect ruby set 1&lt;/span&gt;
Successfully switched to profile:
  ruby18
&lt;span class='bash'&gt;$ /usr/bin/ruby18 /usr/bin/rake build&lt;/span&gt;
(in /home/fox/src/ruby/ActiveRDF)
Gokdok is not available. Install with: gem install gokdok
Rcov or dependency is not available
Generated: activerdf_net7.gemspec
activerdf_net7.gemspec is valid.
WARNING:  no rubyforge_project specified
WARNING:  deprecated autorequire specified
  Successfully built RubyGem
  Name: activerdf_net7
  Version: 1.7.0
  File: activerdf_net7-1.7.0.gem
&lt;span class='bash'&gt;$ sudo eselect ruby set 2&lt;/span&gt;
Successfully switched to profile:
  ruby19
&lt;span class='bash'&gt;$ sudo gem install pkg/activerdf_net7-1.7.0.gem&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;Mo&#380;na r&#243;wnie&#380; skorzysta&#263; z &lt;a href=&quot;http://rvm.beginrescueend.com/&quot;&gt;rvm&lt;/a&gt;, ale nie b&#281;d&#281; tego opisywa&#322; w szczeg&#243;&#322;ach.&lt;/p&gt;


	&lt;p&gt;Kiedy mamy ju&#380; zbudowany i zainstalowany gem &lt;strong&gt;activerdf&lt;/strong&gt; w wersji 1.7.0 musimy jeszcze doinstalowa&#263; 
odpowiedni adapter &lt;span class=&quot;caps&quot;&gt;RDF&lt;/span&gt;. Poniewa&#380; Musicbrainz eksponuje &lt;a href=&quot;http://dbtune.org/musicbrainz/sparql&quot;&gt;sparql endpoint&lt;/a&gt;,
musimy doinstalowa&#263; w&#322;a&#347;nie ten adapter:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ cd activerdf-sparql/&lt;/span&gt;
&lt;span class='bash'&gt;$ gem build activerdf-sparql.gemspec&lt;/span&gt;
WARNING:  no email specified
WARNING:  no homepage specified
WARNING:  no rubyforge_project specified
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: activerdf-sparql
  Version: 1.3.6
  File: activerdf-sparql-1.3.6.gem
&lt;span class='bash'&gt;$ sudo gem install activerdf-sparql-1.3.6.gem&lt;/span&gt;
...&lt;/pre&gt;


	&lt;p&gt;W tej chwili jeste&#347;my ju&#380; w pe&#322;ni wyposa&#380;eni aby korzysta&#263; z ActiveRDF w najnowszej wersji w Rubim 1.9&lt;/p&gt;


	&lt;h2&gt;Musicbrainz&lt;/h2&gt;


	&lt;p&gt;&lt;a href=&quot;http://dbtune.org/musicbrainz/sparql&quot;&gt;Sparql endpoint&lt;/a&gt; Musicbrainz jest obs&#322;ugiwany przez serwer 
&lt;a href=&quot;http://www.wiwiss.fu-berlin.de/suhl/bizer/d2r-server/&quot;&gt;d2r&lt;/a&gt;, kt&#243;ry oficjalnie nie jest wspierany 
przez aktualny adapter ActiveRDF. Najwyra&#378;niej jednak standard &lt;span class=&quot;caps&quot;&gt;SPARQL&lt;/span&gt; staje si&#281; na tyle dojrza&#322;y, &#380;e
nie ma zbyt wielu r&#243;&#380;nic pomi&#281;dzy poszczeg&#243;lnymi implementacjami, dzi&#281;ki czemu mo&#380;na wykorzysta&#263; np.
implementacj&#281; dla serwera Virtuoso.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
require &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;active_rdf&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
include &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;
&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ConnectionPool&lt;/span&gt;.add(&lt;span style=&quot;color:#A60&quot;&gt;:type&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#A60&quot;&gt;:sparql&lt;/span&gt;, &lt;span style=&quot;color:#A60&quot;&gt;:url&lt;/span&gt; =&amp;gt; &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;http://dbtune.org/musicbrainz/sparql&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#A60&quot;&gt;:engine&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color:#A60&quot;&gt;:virtuoso&lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;Powy&#380;szy kod tworzy po&#322;&#261;czenie z ontologi&#261; Musicbrainz. Nast&#281;pnie rejestrujemy najistotniejsze
przestrzenie nazw (FOAF:http://www.foaf-project.org/, oraz MusicOntology:http://musicontology.com/):&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Namespace&lt;/span&gt;.register &lt;span style=&quot;color:#A60&quot;&gt;:foaf&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;http://xmlns.com/foaf/0.1/&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Namespace&lt;/span&gt;.register &lt;span style=&quot;color:#A60&quot;&gt;:mo&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;http://purl.org/ontology/mo/&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;W zasadzie w tym momencie mogliby&#347;my ju&#380; przegl&#261;da&#263; zawarto&#347;&#263; Musicbrainza, ale jest jeszcze jeden 
haczyk &amp;#8211; ot&#243;&#380; najwyra&#378;niej serwer &lt;span class=&quot;caps&quot;&gt;D2R&lt;/span&gt; nie radzi sobie z zapytaniami, w kt&#243;rych explicite podane s&#261; 
typy atrybut&#243;w (np. dla &#322;a&#324;cucha znak&#243;w). Dlatego te&#380; musimy ustawi&#263; zmienn&#261; globaln&#261; (sic!) 
&lt;code&gt;$activerdf_without_datatype&lt;/code&gt; na &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
&lt;span style=&quot;color:#d70&quot;&gt;$activerdf_without_datatype&lt;/span&gt; = &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;Mam nadziej&#281;, &#380;e w kolejnych wersjach ActiveRDF mo&#380;na b&#281;dzie zrobi&#263; to w bardziej cywilizowany spos&#243;b.
Tak, czy owak, w tej chwili mo&#380;emy ju&#380; przegl&#261;da&#263; szczeg&#243;&#322;owe informacje na temat muzyk&#243;w, zespo&#322;&#243;w i innych, np.
W teorii wygl&#261;d prosto, ale w praktyce (ze wzgl&#281;du na rozproszony charakter wiedzy), sprawy si&#281; komplikuj&#261;:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
sting = &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Query&lt;/span&gt;.new.select(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;).where(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;, &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;FOAF&lt;/span&gt;::name, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Sting&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).execute[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;]
sting.foaf::name.first
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt; &amp;quot;Sting&amp;quot; &lt;/span&gt;
groups = &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Query&lt;/span&gt;.new.select(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;).where(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;, &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;FOAF&lt;/span&gt;::member, sting).execute
groups.each{|g| puts g.foaf::name.first}
&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Strontium&lt;/span&gt; &lt;span style=&quot;color:#00D&quot;&gt;90&lt;/span&gt;
&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;The&lt;/span&gt; &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Police&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;W powy&#380;szym przyk&#322;adzie z bazy pobieram zas&#243;b, kt&#243;ry reprezentuje Stinga. Nast&#281;pnie odpytujemy si&#281; o jego
&amp;#8220;nazw&#281;&amp;#8221; &amp;#8211; i tutaj w&#322;a&#347;nie pierwsza niespodzianka, bo musimy dla tej nazwy (kt&#243;re te&#380; jest zasobem) wywo&#322;a&#263;
metod&#281; &amp;#8220;first&amp;#8221;. Pow&#243;d tego (w moim najlepszym mniemaniu) jest taki, &#380;e mogliby&#347;my mie&#263; w kilku &#378;r&#243;d&#322;ach
wiedzy r&#243;&#380;ne warto&#347;ci tego predykatu i musimy mie&#263; dost&#281;p do wszystkich.&lt;/p&gt;


	&lt;p&gt;Nast&#281;pnie pobieramy informacje o zespo&#322;ach, w kt&#243;rych gra&#322; Sting. Wykorzystujemy do tego predykat &lt;span class=&quot;caps&quot;&gt;FOAF&lt;/span&gt;:member,
kt&#243;ry wi&#261;&#380;e grup&#281; z jej cz&#322;onkami (grupa jest podmiotem w tej relacji). Dostajemy dwa rezultaty, do kt&#243;rych 
dobieramy si&#281; tak jak wcze&#347;niej.&lt;/p&gt;


	&lt;p&gt;Na koniec pobierzemy informacje o zarejestrowanych koncertach, w kt&#243;rych Sting by&#322; wiod&#261;cym wokalist&#261;:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
performances = &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;ActiveRDF&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Query&lt;/span&gt;.new.select(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;).where(&lt;span style=&quot;color:#A60&quot;&gt;:x&lt;/span&gt;, &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;MO&lt;/span&gt;::lead_singer, sting).execute
performances.each{|g| puts g.label}
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt; Sting performing (recorded on album Why Don't You Answer?)&lt;/span&gt;
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt; Sting performing (recorded on album Zenyatt&#224; Mondatta)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;Jak wida&#263; powy&#380;ej, w bazie widniej&#261; tylko informacje o dw&#243;ch zarejestrowanych koncertach.&lt;/p&gt;


	&lt;h2&gt;Podsumowanie&lt;/h2&gt;


	&lt;p&gt;Pomimo problem&#243;w jakie trzeba rozwi&#261;za&#263;, korzystaj&#261;c z wiedzy zawartej w SemanticWeb, mo&#380;na przyj&#261;&#263;
na chwil&#281; obecn&#261;, &#380;e technologie semantyczne s&#261; ju&#380; &amp;#8220;u&#380;ywalne&amp;#8221;, a w Rubim, czego mogli&#347;my si&#281; spodziewa&#263;,
po przezwyci&#281;&#380;eniu problem&#243;w konfiguracyjnych, mo&#380;na ca&#322;kiem przyjemnie je przetwarza&#263;.&lt;/p&gt;    </content>
  </entry>
  <entry>
    <title>poliqarpr 0.0.5</title>
    <link rel="alternate" href="https://apohllo.pl/blog/poliqarpr-0-0-5" type="text/html"/>
    <id>https://apohllo.pl/blog/poliqarpr-0-0-5</id>
    <updated>2009-12-10T14:06:27Z</updated>
    <published>2009-12-10T13:08:00Z</published>
    <author>
      <name>Aleksander Pohl</name>
    </author>
    <summary type="html">&lt;p&gt;Poliqarpr jest nak&#322;adk&#261; dla Rubiego, pozwalaj&#261;c&#261; w prosty spos&#243;b korzysta&#263; z serwera &lt;a href=&quot;http://poliqarp.sourceforge.net/&quot;&gt;Poliqarp&lt;/a&gt;.&lt;/p&gt;


	&lt;h4&gt;Poliqarp &amp;#8211; serwer korpus&#243;w&lt;/h4&gt;


	&lt;p&gt;Sam Poliqarp zosta&#322; pomy&#347;lany jako narz&#281;dzie u&#322;atwiaj&#261;ce prac&#281; z korpusami tekst&#243;w. Jego zasadnic...</summary>
    <category term="ruby" label="Ruby" scheme="https://apohllo.pl/tags/show/ruby"/>
    <category term="nlp" label="Nlp" scheme="https://apohllo.pl/tags/show/nlp"/>
    <category term="gem" label="Gem" scheme="https://apohllo.pl/tags/show/gem"/>
    <category term="poliqarpr" label="Poliqarpr" scheme="https://apohllo.pl/tags/show/poliqarpr"/>
    <content type="html">
&lt;p&gt;Poliqarpr jest nak&#322;adk&#261; dla Rubiego, pozwalaj&#261;c&#261; w prosty spos&#243;b korzysta&#263; z serwera &lt;a href=&quot;http://poliqarp.sourceforge.net/&quot;&gt;Poliqarp&lt;/a&gt;.&lt;/p&gt;


	&lt;h4&gt;Poliqarp &amp;#8211; serwer korpus&#243;w&lt;/h4&gt;


	&lt;p&gt;Sam Poliqarp zosta&#322; pomy&#347;lany jako narz&#281;dzie u&#322;atwiaj&#261;ce prac&#281; z korpusami tekst&#243;w. Jego zasadnicze przeznaczenie
to wyszukiwanie fragment&#243;w tekst&#243;w na potrzeby r&#243;&#380;nych zada&#324; z dziedziny przetwarzania j&#281;zyka naturalnego. 
W obecnej chwili jest wykorzystywany w projekcie &lt;a href=&quot;http://nkjp.pl&quot;&gt;Narodowego Korpusu J&#281;zyka Polskiego&lt;/a&gt;, ale zosta&#322;
zaprojektowany w spos&#243;b, kt&#243;ry pozwala stosowa&#263; go r&#243;wnie&#380; dla innych j&#281;zyk&#243;w.&lt;/p&gt;


	&lt;p&gt;Co wi&#281;cej &amp;#8211; j&#281;zyk zapyta&#324;
Poliqarpa pozwala wyszukiwa&#263; s&#322;owa w korpusie nie tylko w oparciu o odmienione formy (wtedy nie r&#243;&#380;ni&#322;by si&#281;
on specjalnie od funkcjonalno&#347;ci baz danych z wyszukiwaniem pe&#322;notekstowym), ale pozwala np. okre&#347;li&#263;,
form&#281; podstawow&#261; (tzw. lemat) s&#322;owa, a znalezione zostan&#261; wszystkie wyst&#261;pienia, r&#243;wnie&#380; form derywowanych 
(np. mo&#380;emy zada&#263; pytanie o &amp;#8220;b&#243;j&amp;#8221;, a w wynikach otrzymamy formy odmienione: boju, boje, bojom).&lt;/p&gt;


	&lt;p&gt;R&#243;wnie&#380; ta funkcjonalno&#347;&#263; nie jest zwi&#261;zana wy&#322;&#261;cznie z j&#281;zykiem polskim (cho&#263; ma zastosowanie g&#322;&#243;wnie dla j&#281;zyk&#243;w fleksyjnych),
ani nie jest przywi&#261;zana do jednego zbioru tag&#243;w. Dzi&#281;ki temu, w zale&#380;no&#347;ci od zastosowanego narz&#281;dzia, mo&#380;emy korzysta&#263;
z alternatywnych zbior&#243;w tag&#243;w, nawet w ramach jednego j&#281;zyka.&lt;/p&gt;


	&lt;h4&gt;Poliqarpr &amp;#8211; klient napisany w Rubim, dla serwera Poliqarp&lt;/h4&gt;


	&lt;p&gt;Poliqarp&lt;strong&gt;r&lt;/strong&gt;, jak by&#322;o wspomniane, jest napisanym w Ruby klientem, dla serwera Poliqarp. 
Jest on dost&#281;pny w publicznym repozytorium na &lt;a href=&quot;http://www.github.com/apohllo/poliqarp&quot;&gt;GitHubie&lt;/a&gt;. Mo&#380;emy go stamt&#261;d
pobra&#263; za pomoc&#261; poni&#380;szego polecenia:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ git clone git://github.com/apohllo/poliqarpr.git&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;Oczywi&#347;cie jest on r&#243;wnie&#380; dost&#281;pny jako gem na gemcutterze:&lt;/p&gt;


&lt;pre&gt;
 # sprawdzamy wersj&#281; rubygems
&lt;span class='bash'&gt;$ gem -v&lt;/span&gt;
1.3.5 #=&gt; OK!
 # dodajemy gemcutter do listy repozytori&#243;w, je&#347;li wcze&#347;niej na niej nie by&#322;
&lt;span class='bash'&gt;$ gem sources -a http://gemcutter.org &lt;/span&gt;
 # instalujemy poliqapr
&lt;span class='bash'&gt;$ gem install poliqarpr -a http://gemcutter.org&lt;/span&gt;
Successfully installed poliqarpr-0.0.5
1 gem installed
Installing ri documentation for poliqarpr-0.0.5...
Installing RDoc documentation for poliqarpr-0.0.5...&lt;/pre&gt;


	&lt;p&gt;Je&#347;li wszystko przebiegnie bez zak&#322;&#243;ce&#324; mo&#380;emy zacz&#261;&#263; testowa&#263; poliqarpa. Poniewa&#380; jednak bez korpusu nie ma to wi&#281;kszego sensu,
dost&#281;pny jest r&#243;wnie&#380; gem &lt;code&gt;poliqarpr-corpus&lt;/code&gt;, kt&#243;ry zawiera przyk&#322;adowy korpus dla j&#281;zyka polskiego (zr&#243;wnowa&#380;ony s&#322;ownik frekwencyjny).&lt;/p&gt;


	&lt;p&gt;Instalacja jest r&#243;wnie prosta:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ gem install poliqarpr-corpus&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;W tym momencie musimy uzbroi&#263; si&#281; w odrobin&#281; cierpliwo&#347;ci, bo korpus ma rozmiar kilku megabajt&#243;w.&lt;/p&gt;


Poliqarpr nie jest jedynym klientem dla serwera Poliqarp &amp;#8211; dost&#281;pna jest r&#243;wnie&#380; wersja w Javie, napisana przez autor&#243;w serwera.
W stosunku do klienta javowego otrzymujemy jednak kilka udogodnie&#324;:
	&lt;ul&gt;
	&lt;li&gt;specyfikacja w formie test&#243;w&lt;/li&gt;
		&lt;li&gt;segmenty, fragmenty oraz rezultaty zapyta&#324; s&#261; pe&#322;noprawnymi klasami&lt;/li&gt;
		&lt;li&gt;jest napisany w Rubim ;)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;W szczeg&#243;lno&#347;ci to, &#380;e rezultaty zapyta&#324; s&#261; klasami, pozwala w &#322;atwy spos&#243;b tworzy&#263; paginacj&#281;. Po szczeg&#243;&#322;y najlepiej 
zajrze&#263; do &lt;a href=&quot;http://github.com/apohllo/poliqarpr/tree/master/spec/&quot;&gt;dost&#281;pnych w repozytorium&lt;/a&gt; spec&#243;w.&lt;/p&gt;


	&lt;h4&gt;Przyk&#322;ad u&#380;ycia&lt;/h4&gt;


	&lt;p&gt;Przypu&#347;&#263;my, &#380;e mamy na naszym komputerze korpus j&#281;zyka polskiego o wielko&#347;ci 250 mln segment&#243;w, pobrany ze 
&lt;a href=&quot;http://korpus.pl/download/2.all.250.bin.tar.bz2&quot;&gt;strony korpus.pl&lt;/a&gt;. 
Za&#322;&#243;&#380;my, &#380;e znajduje si&#281; w katalogu &lt;code&gt;/home/user/korpus&lt;/code&gt;. Co nale&#380;y zrobi&#263;, aby mo&#380;na by&#322;o go wygodnie przegl&#261;da&#263; lub wykorzysta&#263;
w programie napisanym w Rubim?&lt;/p&gt;


	&lt;p&gt;Po pierwsze musimy upewni&#263; si&#281;, &#380;e serwer poliqarp jest zainstalowany i dzia&#322;a. Najpro&#347;ciej wykona&#263; w linii polece&#324; nast&#281;puj&#261;c&#261; komend&#281;:&lt;/p&gt;


&lt;pre&gt;
&lt;span class='bash'&gt;$ poliqarpd &amp;&lt;/span&gt;&lt;/pre&gt;


	&lt;p&gt;Je&#347;li nie pojawi&#261; si&#281; &#380;adne b&#322;&#281;dy, oznacza&#263; to b&#281;dzie, &#380;e serwer poliqarp zosta&#322; uruchomiony.&lt;/p&gt;


	&lt;p&gt;Nast&#281;pnie mo&#380;emy skorzysta&#263; z serwera w programie napisanym w Rubim. 
Na wst&#281;pie musimy za&#322;adowa&#263; zainstalowany wcze&#347;niej gem, stworzy&#263; klienta oraz za&#322;adowa&#263; korpus:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
require &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;poliqarpr&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
client = &lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Poliqarp&lt;/span&gt;::&lt;span style=&quot;color:#036;font-weight:bold&quot;&gt;Client&lt;/span&gt;.new(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;TEST&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
client.open_corpus(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;/home/user/korpus/all&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
client.right_context = &lt;span style=&quot;color:#00D&quot;&gt;10&lt;/span&gt;
client.left_context = &lt;span style=&quot;color:#00D&quot;&gt;10&lt;/span&gt;
client.lemmata = &lt;span style=&quot;color:#A60&quot;&gt;:all&lt;/span&gt;
client.buffer_size = &lt;span style=&quot;color:#00D&quot;&gt;1000&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;Kiedy tworzymy klienta, mo&#380;emy przekaza&#263; opcjonalny parametr b&#281;d&#261;cy nazw&#261; sesji z serwerem (pozwala odr&#243;&#380;nia&#263; od siebie 
wiele jednocze&#347;nie po&#322;&#261;czonych klient&#243;w). Potem mo&#380;emy otworzy&#263; korpus (polecenie &lt;code&gt;open_corpus&lt;/code&gt;), podaj&#261;c &#347;cie&#380;k&#281; do jego katalogu, wraz z nazw&#261;
(tutaj u&#380;ywamy korpusu 250 mln segment&#243;w, kt&#243;rego nazwa to &amp;#8220;all&amp;#8221;).&lt;/p&gt;


Opcjonalnie mo&#380;emy r&#243;wnie&#380; ustawi&#263; r&#243;&#380;ne parametry dot. zwracanych rezultat&#243;w:
	&lt;ul&gt;
	&lt;li&gt;rozmiar prawo- i lewostronnego kontekst&lt;/li&gt;
		&lt;li&gt;szczeg&#243;&#322;y opisu segment&#243;w&lt;/li&gt;
		&lt;li&gt;rozmiar bufora wynik&#243;w, itp.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Kiedy dokonamy tych wst&#281;pnych ustale&#324;, mo&#380;emy pobra&#263; wyniki, dla wybranego zapytania (szczeg&#243;&#322;y sk&#322;adni j&#281;zyka zapyta&#324; om&#243;wione s&#261; 
w artykule na &lt;a href=&quot;http://nlp.ipipan.waw.pl/~adamp/Papers/2004-corpus/&quot;&gt;stronie dr. hab. Adama Przepi&#243;rkowskiego&lt;/a&gt;):&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
result = client.find(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;[base=kot]&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
result[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;..&lt;span style=&quot;color:#00D&quot;&gt;5&lt;/span&gt;].each &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;do&lt;/span&gt; |excerpt|
  putes excerpt
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;end&lt;/span&gt;
 &lt;span style=&quot;color:#777&quot;&gt;# &#8211; kuku&#322;ka &#8211; pi&#322;a &#8211; kot Zaznacz te obrazki, kt&#243;re&lt;/span&gt;
 &lt;span style=&quot;color:#777&quot;&gt;# burza osy &#8211; ptaki &#8211; kot ptak &#8211; zegar &#8211; samoch&#243;d&lt;/span&gt;
 &lt;span style=&quot;color:#777&quot;&gt;# &#8211; orkiestra &#8211; telefon &#8211; kot Pos&#322;uchaj uwa&#380;nie nagranych d&#378;wi&#281;k&#243;w i&lt;/span&gt;
 &lt;span style=&quot;color:#777&quot;&gt;# ptaszek &#8211; burza lew &#8211; kot lec&#261;ca z kranu woda &#8211;&lt;/span&gt;
 &lt;span style=&quot;color:#777&quot;&gt;# strumyk telefon &#8211; sowa &#8211; kot baran &#8211; lew &#8211; ptaszek&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;W powy&#380;szym przyk&#322;adzie szukamy w korpusie wszystkich fragment&#243;w, w kt&#243;rych wyst&#281;puje wyraz &amp;#8220;kot&amp;#8221; w dowolnej formie. 
Nast&#281;pnie wy&#347;wietlany 6 pierwszych rezultat&#243;w. Ka&#380;dy z rezultat&#243;w jest jednak pe&#322;noprawnym obiektem, wi&#281;c mo&#380;emy
przyjrze&#263; mu si&#281; szczeg&#243;&#322;owo:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
result[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;].author
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt; Ma&#322;gorzata Pamu&#322;a&lt;/span&gt;
result[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;].title
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt; Wczesne nauczanie j&#281;zyk&#243;w obcych...&lt;/span&gt;
result[&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;].short_context.join(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span style=&quot;color:#777&quot;&gt;#=&amp;gt;  &#8211; kuku&#322;ka &#8211; pi&#322;a &#8211; kot Zaznacz te obrazki, kt&#243;re&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



	&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; w chwili obecnej jest nie&#378;le rozbudowane i udokumentowane, wi&#281;c nie b&#281;d&#281; omawia&#322; go szczeg&#243;&#322;owo.&lt;/p&gt;


	&lt;p&gt;Na koniec nie mo&#380;emy zapomnie&#263; o zamkni&#281;ciu po&#322;&#261;czenia z serwerem:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
client.close&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;    </content>
  </entry>
</feed>
