apohllo.pl
więcej niż strona domowa...
 

Blog

Moje prywatne publiczne notatki.

| Opublikowano 17:44 14-07-2009. Ostatnia modyfikacja 13:01 29-11-2010 |

Usuwanie autora z PDFa

Na podstawie:

https://askubuntu.com/questions/27381/how-to-edit-pdf-metadata-from-command-line

1. Instalujemy exiftools:

$ sudo apt-get install exiftool

2. Wywołujemy komendę:

$ exiftool -Author="" plik.pdf

Szczególnie przydatne dla wszystkich osób, które prowadzą proces redakcyjny, z założeniem, że dane autora nie powinny przedostać się do recenzentów (blind review).

| Opublikowano 11:25 01-08-2017. Ostatnia modyfikacja 11:25 01-08-2017 |

Instalacja IRuby

Aby zainstalować IRubiego oraz Ruby on Rails w najnowszych wersjach należy wykonać następujące polecenia (testowane na Ubuntu w wersji serwerowej 16.10):

$ sudo apt-get install zlib1g-dev libssl-dev libxml2-dev libsqlite3-dev libev-dev
$ sudo apt-get install ruby curl git-core libyaml-dev libgcrypt11-dev libgmp-dev
$ sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev libreadline6-dev
$ sudo apt-get install python3-dev libzmq3-dev python-dev python-pip
$ sudo pip install 'ipython[notebook]' markupsafe zmq certifi jsonschema  jupyter_console
$ curl https://rvm.io/mpapis.asc | gpg --import -
$ curl -L get.rvm.io | bash -s stable
$ source ~/.rvm/scripts/rvm
$ rvm install 2.4.1
$ rvm use 2.4.1 --default
$ gem install iruby rails

Weryfikacja poprawności instalacji może być przeprowadzona poprzez wywołanie polecenia:

$ iruby notebook

Uwaga!

Jeśli w trakcie instalacji IRubiego pojawi się komunikat:

autogen.sh: error: could not find libtool.

Należy wykonać następujące polecenie:

$ sudo ln -s /usr/bin/libtoolize /usr/bin/libtool

A następnie ponownie wywołać polecenie

$ gem install iruby rails
| Opublikowano 12:27 23-10-2015. Ostatnia modyfikacja 20:43 26-07-2017 |

Popieram Piotra Waglowskiego

Tyle w temacie nadchodzących wyborów parlamentarnych.

| Opublikowano 22:30 17-09-2015. Ostatnia modyfikacja 22:30 17-09-2015 |

Closed beta of entity linking service

Recently I have deployed an entity linking service. It can be found at klon.wzks.uj.edu.pl/asterion. So far this is a closed beta – in future I am going to provide a commercial linking service. If you are interested in testing this service, don’t hesitate to contact me.

The means of operation of the service are simple – you provide a text on input, via HTTP POST and you will receive a JSON response with names of Wikipedia articles, together with text offsets and confidence values for the proposed links. As with any machine learning algorithm the output is not perfect, so don’t expect “true artificial intelligence” ;-) Still, the output might be pretty valuable, e.g. for indexing.

The API might be tested as follows (Warsaw is the capital of Poland):

curl -X POST -d 'text=Warszawa jest stolicą Polski.' http://klon.wzks.uj.edu.pl/asterion/annotator/annotate.json -u 'login:password' -basic
The output will look as follows:
{"concepts": 
  [
    {"id":6605,"name":"Warszawa","confidence":0.21689995068611942,"start":0,"end":7},
    {"id":5664,"name":"Stolica Polski","confidence":0.21689995068611942,"start":14,"end":27}
  ]
}

So far only Polish is supported, but English will be provided soon.

| Opublikowano 23:41 17-07-2014. Ostatnia modyfikacja 23:47 17-07-2014 |

Dlaczego Kraków nie jest wart igrzysk?

Poniżej treść mojego wystąpienia na XCVI sesji Rady Miasta Krakowa 29.01.2014

Po co organizować debatę o igrzystkach olimpijskich? Żeby rozstrzygnąć, czy lepiej dać pieniądze na wioskę olimpijską, czy jednak na ścieżki rowerowe? Po to żeby posłowie Platformy mogli pokłócić się z posłami PiSu, jak robili to w trakcie ostatniej sesji Rady Miasta? A może tylko po to, by stworzyć złudzenie udziału mieszkańców w decydowaniu o losach miasta?

Kiedy 12 lat temu przyjechałem do Krakowa ze Śląska, sądziłem, że wygrałem los na loterii. Studia w Mieście Polski Królów, na Akademii Górniczo-Hutniczej, a potem również na Uniwersytecie Jagiellońskim, to było marzenie, które właśnie się urzeczywistniało. Dzięki pracy na Uniwerstecie Jagiellońskim oraz stypendium „Doctus” Małopolskiego Centrum Przedsiębiorczości skierowanego do doktorantów, mogłem pomyśleć o osiedleniu się na stałe w Krakowie. 3 lata temu kupiliśmy z żoną mieszkanie na Ruczaju.

Ale z każdym kolejnym dniem kiedy tutaj mieszkamy coraz częściej myślimy by stąd wyjechać. Do Kopenhagi, Ljubljany a może nieodległego Gaju. Wyjechać, ponieważ Kraków nie oferuje nam wizji, w której na pierwszym miejscu nie stawia się developerów, zagranicznych turystów, działaczy komitetu olimpijskiego, lecz mieszkańców.

Jeśli przez najbliższe 8 lat wszelkie decyzje oraz inwestycje w tym mieście uzależnione będą od igrzysk, a przez kolejnych 10 uzasadnieniem każdego „nie-da-się” będzie wcześniej zorganizowana olimpiada to ja stąd ucieknę.

Dlatego pytam się: czy Zimowe Igrzyska Olimpijskie to wszystko co Kraków może zaoferować ludziom, którzy w tym mieście chcą spędzić kolejne 15 lat? Czy taka jest wizja naszych władz? Chciałbym aby w tej debacie odpowiedziano przede wszystkim na to jedno zasadnicze pytanie!

| Opublikowano 11:13 14-03-2014. Ostatnia modyfikacja 11:13 14-03-2014 |

HackKrK 11

Firma Future Simple organizuje kolejny Hack KRK. Tym razem będziemy implementować konsolowe gry w Rubim. Polecam!

Aktualizacja:
ruby | Opublikowano 20:19 29-01-2013. Ostatnia modyfikacja 13:49 12-02-2013 |

Currying w Rubim

W nawiązaniu do wcześniejszego wpisu na temat możliwości zaimplementowania operatora kompozycji w Rubim w tym wpisie pokazuję, że Ruby posiada jeszcze jedną cechę języków funkcyjnych. Mianowicie umożliwia wywoływanie funkcji z niepełną listą parametrów. W terminologii programowania funkcyjnego nazywane jest to curryingiem. Zasadnicza idea polega na tym, że skoro funkcje traktujemy funkcje jako pierwszorzędnych obywateli w danym języku, to powinniśmy mieć możliwość częściowej aplikacji tych funkcji do ich argumentów – tzn. jeśli liczba argumentów jest mniejsza niż wymagana, otrzymujemy nową funkcję, która dopiero po dostarczeniu brakujących argumentów zwróci konkretną wartość.

W chwili gdy poznałem tę funkcję Haskella, uświadomiłem sobie, że w Rubim nie mamy takiej możliwości, tzn.

plus = ->(x,y) { x + y }
plus_two = plus[2]       # ArgumentError: wrong number of arguments (1 for 2)

Okazuje się jednak, że klasa Proc definiuje wywołanie curry, które realizuje tę funkcjonalność. Zatem korzystając z tego wywołanie możemy osiągnąć pożądany efekt:

plus = ->(x,y) { x + y }
plus_two = plus.curry[2]
plus_two[3]              # => 5
plut_two[5]              # => 7

Co więcej – uzyskana w ten sposób funkcja nie wymaga wywoływania curry w celu częściowej aplikacji argumentów:

multiply = ->(x,y,z) { x * y * z }
multiply_2 = multiply.curry[2]
multiply_2_3 = multiply_2[3]
multiply_2_3[5]                    #=> 30
currying | haskell | ruby | Opublikowano 14:46 28-08-2012. Ostatnia modyfikacja 14:46 28-08-2012 |

Operator kompozycji w Rubim

Jako język funkcyjny Haskell posiada wiele ciekawych własności, m.in. umożliwia kompozycje funkcji. Tzn. możemy zdefiniować dwie funkcje a operator kompozycji przekształca je w trzecią funkcję, która jest złożeniem tychże.

Zastanawiałem się przez chwilę, czy coś takiego możliwe jest do zrobienia w Rubim. Jak wiadomo posiada on pewne cechy języków funkcyjnych, ale nie jest tak zaawansowany jak Haskell – w szczególności jest dynamicznie typizowany, więc nie umożliwia statycznej analizy typów. Niemniej jednak możliwość zdefiniowania operatora kompozycji wydała mi się interesującym wyzwaniem.

Okazuje się, że w Rubim można zrobić to dość łatwo – wystarczy rozszerzyć definicję klasy Proc o operator powiedzmy *, który pozwalał będzie na składanie funkcji. Definicja tego operator wygląda następująco:

class Proc
  def *(other)
    ->(x){self[other[x]]}
  end
end

Dzięki tak zdefiniowanemu operatorowi możliwe jest składanie funkcji:

f = ->(x){x + 1}
g = ->(x){x * 2}
f[g[1]]            #=> 24 - zwykłe złożenie
(f * g)[1]         #=> 24 - złożenie z użyciem operatora)

Co więcej, okazuje się, że w Rubim dość łatwo można składać funkcje więcej niż 1-argumentowe (w Haskellu nie ma takiej możliwości – konieczne jest jawne użycie krotek (tuple); w praktyce sprowadza się to do składania funkcji jednoargumentowcych). Odpowiednia definicja wygląda następująco:

class Proc
  def *(other)
    ->(*args){self[*other[*args]]}
  end
end
f = ->(x,y){[x + y,x - y]}
g = ->(x,y){[x * y,x / y]}
(f * g)[10,2]               #=> [25,15]

Oczywiście w Rubim też w zasadzie budujemy krotki, ale nie zmienia to faktu, że funkcje f i g w tym przykładzie są dwuargumentowe.

Podsumowując – powyższe przykłady pokazują, że w Rubim można dość łatwo uzyskać niektóre interesujące cechy programowania funkcyjnego.

haskell | programowanie funkcyjne | ruby | Opublikowano 16:01 27-08-2012. Ostatnia modyfikacja 01:32 28-08-2012 |

RVM + Passenger

Kilka uwag przy korzystaniu z kombinacji RVM + Passenger:

  1. Sprawdź czy w pliku konfiguracyjnym passengera (np. /etc/apache2/mods-enabled/rails.load) używana jest ta sama wersja Rubiego co w konsoli. Jeśli Passenger informuje, że brakuje jakiegoś gema, a bundle install przebiegło bez problemu, to prawdopodobną przyczyną jest właśnie inna wersja Rubiego (i inny gemset) dla RVM oraz Passengera.
  2. Przy instalacji Passengera upewnij się, że rvm use ruby... --default było wywołane przez użytkownika uprzywilejowanego. Niestety użycie tego samego wywołania przez innego użytkownika spowoduje błędy.
  3. Więcej informacji na ten temat
passenger | ruby | rvm | Opublikowano 16:22 25-08-2012. Ostatnia modyfikacja 16:22 25-08-2012 |

Virtuoso installation in Debian

Introduction

Following the dbpedia mailing list discussion I am providing a step by step configuration procedure for the Virtuoso server in English. This also covers loading of the DBpedia data (n-triples) into the server. The procedure was tested on Debian, but it should work also for the other popular Linux distros, such as Ubuntu.

Virtuoso OS installation

The installation of Virtuoso OpenSource is easy, since there is a Debian package available in the default package tree. So the only thing to do is to type apt-get install virtuos-server in the console:

$ sudo apt-get install virtuoso-server
...

During the installation, the user will be asked for the password of the administrative account. If it is provided, the server will start automatically, when it is installed. This password will be used in the following steps of the configuration.

Server configuration

The Virtuoso distribution for Debian comes with a predefined configuration file, which can be found at /etc/virtuoso-opensource-6.1/virtuoso.ini The most important configuration options are as follows:

  • DatabaseFile – the Virtuoso database file
  • TransactionFile – the Virtuoso transaction file
  • ErrorLogFile – the Virtuoso error log file (important when something goes wrong)
  • DirsAllowed – the directories which are allowed to contain the data, that might be bulk-loaded to the server (important!)
  • ServerPort – there are two options of this kind – one in Parameter section and the other in HTTPServer section. The first one is an API endpoint of the server, while the other allows for querying the server via a web-based interface.

The only option that should be adjusted for this tutorial is DirsAllowed. It is good to add /home/username to the end of list of allowed dirs. The username of the path should be replaced with the actual name of the user in the system, e.g. fred.

To make the changes effective, the user has to restart the server by issuing the following command:

$ sudo /etc/init.d/virtuoso-opensource-6.1 restart

Loading the DBpedia data

First of all we have to download some data from the DBpedia download page (or any other providing RDF triples), to make sure we have something to load. For example we could download all the English DBpedia article titles in the form of n-triples.

$ wget http://downloads.dbpedia.org/3.6/en/labels_en.nt.bz2

This will take several minutes, since the file is more than 100 MB. You can download any other dataset to experiment with, but the rest of the tutorial will assume, that the labels_en.nt.bz2 is available.

It’s important to note that the data is available in bzip2 format, so we have to install the bzip2 tools, in order to extract the data:

$ sudo apt-get install bzip2
...
$ bzip2 -d labels_en.nt.bz2
...

The last important thing to download is the rdfloader script Since it is not available as a separate file on the wiki, I’ve put it on my server for convenience (and I hope not to be sued by OpenLink ;-). So downloading it is as simple as:

$ wget http://apohllo.pl/texts/rdfloader.sql
...

When we have all the necessary files, we can start the Virtuoso client. We have to provide the password, that was selected in the installation phase.

$ isql-vt -U dba
Enter password for dba:
Connected to OpenLink Virtuoso
...
SQL>

Virtuoso is a regular SQL database with support for RDF, hance the SQL prefix in the client.

To load the DBpedia data into the server first we have to load the rdfloader script:

SQL> load rdfloader.sql;
...
Then we can define the data we wish to be loaded into the server. This is done via call to ld_dir command defined in the script. This command takes three arguments:
  • directory path
  • pattern for loaded files
  • the name of the graph the data will be stored in

It is important to note, that the first option of the command have to be provided in the DirsAllowed option of the Virtuoso configuration file. I guess most of the problems with loading the data into the server comes from this option. Although the configuration file defines the current directory (’.’) as valid for loading the data, it doesn’t seem to work, at least if we interpret this directory as the one, the isql-vt command was issued in. So in the case of problems, it seems to be the first option to carefully inspect.

If we wish to load the data downloaded in the previous steps we have to issue the following command:

SQL> ld_dir('/home/username','*.nt','http://dbpedia.org');
Done -- 2 msec.

Surprisingly this command won’t load the data. This is done via call to rdf_loader_run:

SQL> rdf_loader_run;
...

This command can take much time (even several hours!), especially if you wish to load much of the contents of DBpedia. So please be patient.

Using the data

When the data has been loaded it’s time to issue some queries to server, to check if everything works fine. The easiest way is to start the sparql client and issue a simple select, such as:

SQL> sparql select ?s, ?p, ?o from <http://dbpedia.org> where {?s ?p ?o} limit 5;
s
  p
    o
VARCHAR
  VARCHAR
    VARCHAR
------------------------------------------------------------------------
http://www.dbpedia.org/resource/AccessibleComputing
  http://www.w3.org/2000/01/rdf-schema#label
    AccessibleComputing
...

If the result looks as above the DBpedia data is in the Virtuoso instance! Now you can issue more complex queries (assuming you have loaded more data than the mere labels).

There is also another option for accessing the data – via web interface. If you open the address http://localhost:8890/sparql in you browser you should have access to the web based client of the Virtuoso server.

dbpedia | semantic web | virtuoso | Opublikowano 18:00 15-02-2012. Ostatnia modyfikacja 00:37 09-03-2014 |
comments powered by Disqus