PDA

View Full Version : [Vari] Contest 19: Full Text Search(e non solo).


Pagine : 1 2 3 [4] 5

The_ouroboros
09-02-2013, 18:42
cmq in caso potrei passare l'ownership a VICIUS se è disponibile

Vincenzo1968
09-02-2013, 18:49
http://img854.imageshack.us/img854/3112/gitb.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
09-02-2013, 18:50
cmq in caso potrei passare l'ownership a VICIUS se è disponibile

Esatto. O a Msangi che ha avuto l'idea per primo. ;)

The_ouroboros
09-02-2013, 18:53
prima prova a vedere se ti trovi però:cool:

The_ouroboros
09-02-2013, 18:55
http://minddrivenit.blogspot.it/2008/04/git-il-controllo-versione-che-ti-fa.html

Vincenzo1968
09-02-2013, 18:56
Forte la pagina di Vicius:

http://img259.imageshack.us/img259/7263/viciusgit.jpg

:D

Vincenzo1968
09-02-2013, 19:00
prima prova a vedere se ti trovi però:cool:

Non è che non mi trovo. È che ho la testa ad asfaltare Vicius-Lucene. Magari dal prossimo contest lo gestisco io. ;)

:D

The_ouroboros
09-02-2013, 19:01
io posso occuparmene da fine canvass...da settimana prossima dovrei avere più tempo... finire alle 20 in ufficio a milano non è sempre easy

Vincenzo1968
09-02-2013, 19:08
io posso occuparmene da fine convass...da settimana prossima dovrei avere più tempo...

Vediamo se sono disponibili Msangi o Vicius(o qualcun altro). Casomai me ne occupo io.
Comunque da quello che sto vedendo sembra proprio un gran bel sistema. :D

Grazie Msangi e Ouro. ;)

Vincenzo1968
09-02-2013, 19:13
Eh si, è proprio un gran bel sistema:

Ebbene, Git è un sistema di controllo versione distribuito scritto da Linus Torvalds che viene utilizzato, tra le altre cose, per gestire lo sviluppo del Kernel di Linux.


:eek:

:yeah: :winner: :yeah:

msangi
09-02-2013, 19:27
Vediamo se sono disponibili Msangi o Vicius(o qualcun altro). Casomai me ne occupo io.
Comunque da quello che sto vedendo sembra proprio un gran bel sistema. :D

Grazie Msangi e Ouro. ;)

Io purtroppo non ho moltissimo tempo da dedicare al forum e questo è il motivo per cui sto seguendo questo contest ma non sto partecipando...

Comunque, se manteniamo una struttura in cui ciascuno forka il progetto, crea la sua cartella, modifica solo quella e infine fa una pull request, il compito dovrebbe essere abbastanza semplice.

La gestione delle pull request richiede attenzione quando tutti lavorano sullo stesso codice. In questo caso abbiamo delle implementazioni indipendenti, quindi dovrebbero essere accettate quasi automaticamente.

L'ideale potrebbe essere di avere due o tre persone che gestiscono il tutto. Io non posso garantire una presenza costante, però se facciamo un gruppetto di gestori delle pull request una mano posso darla.

Sent from my Nexus 7 using Tapatalk HD

The_ouroboros
09-02-2013, 19:28
Io purtroppo non ho moltissimo tempo da dedicare al forum e questo è il motivo per cui sto seguendo questo contest ma non sto partecipando...

Comunque, se manteniamo una struttura in cui ciascuno forka il progetto, crea la sua cartella, modifica solo quella e infine fa una pull request, il compito dovrebbe essere abbastanza semplice.

La gestione delle pull request richiede attenzione quando tutti lavorano sullo stesso codice. In questo caso abbiamo delle implementazioni indipendenti, quindi dovrebbero essere accettate quasi automaticamente.

L'ideale potrebbe essere di avere due o tre persone che gestiscono il tutto. Io non posso garantire una presenza costante, però se facciamo un gruppetto di gestori delle pull request una mano posso darla.

Sent from my Nexus 7 using Tapatalk HD

potrebbe funzionare

The_ouroboros
09-02-2013, 19:31
come dici tu creiamo un repo per ogni contest e il "gruppo pull" mergia.
Tanto l'account che ho creato. le credenziali Vincenzo le ha gia.
Se io e te e lui ci alterniamo in 3 dovrebbe essere possibile e non inficiare troppo con impegni lavorativi :cool:

VICIUS
09-02-2013, 19:51
Non conviene trasformare l'account da utente normale ad organizzazione? Quando un utente vuole partecipare ad un contest lo si aggiunge al gruppo dandogli i giusti permessi di scrittura poi si gestisce da solo la propria cartella senza dover scomodare tutte le volte uno di voi.

The_ouroboros
09-02-2013, 19:54
Non conviene trasformare l'account da utente normale ad organizzazione? Quando un utente vuole partecipare ad un contest lo si aggiunge al gruppo dandogli i giusti permessi di scrittura poi si gestisce da solo la propria cartella senza dover scomodare tutte le volte uno di voi.

non ho mai dovuto farlo... cosa implica questo passaggio?

VICIUS
10-02-2013, 08:10
non ho mai dovuto farlo... cosa implica questo passaggio?
Come su linux, quando più utenti devono accedere alla stessa cartella, la soluzione migliore è quella i creare un nuovo gruppo. Condividere lo stesso account tra più utenti è poco flessibile e sicuro. Ci sarà da gestire gli utenti e i permessi ma è una inezia se paragonata al doversi gestire tutte le pull request dei vari utenti.

VICIUS
10-02-2013, 08:22
Eh si, è proprio un gran bel sistema:


:eek:

:yeah: :winner: :yeah:

Saper usare un scm è fondamentale. Ferma tutto il resto e comincia a leggerti qualche guida e tutorial introduttivo su git. Programmare senza è un suicidio.

Un po' ti invidio. Cominciare con git e poter ignorare tutto quello che c'è stato prima è un grande lusso. Se penso al tempo che ho perso su file corrotti di cvs e a fare merge in subversion mi vengono i brividi.

Vincenzo1968
10-02-2013, 08:46
Saper usare un scm è fondamentale. Ferma tutto il resto e comincia a leggerti qualche guida e tutorial introduttivo su git. Programmare senza è un suicidio.

Un po' ti invidio. Cominciare con git e poter ignorare tutto quello che c'è stato prima è un grande lusso. Se penso al tempo che ho perso su file corrotti di cvs e a fare merge in subversion mi vengono i brividi.

Mi sto leggendo i tutorial postati da Ouro. Anche la guida in linea:


git help git


http://www.kernel.org/pub/software/scm/git/docs/

http://www.kernel.org/pub/software/scm/git/docs/user-manual.html

Ancora non mi avete detto cosa devo fare per mettere il mio codice nel sito.

The_ouroboros
10-02-2013, 09:28
Iscriverti al sito è l'inizio.
Poi ti aggiungo e ti do pieni diritti così puoi inserire codice e gestire il tutto.

Inviato dal mio LT22i con Tapatalk 2

The_ouroboros
10-02-2013, 09:28
Come su linux, quando più utenti devono accedere alla stessa cartella, la soluzione migliore è quella i creare un nuovo gruppo. Condividere lo stesso account tra più utenti è poco flessibile e sicuro. Ci sarà da gestire gli utenti e i permessi ma è una inezia se paragonata al doversi gestire tutte le pull request dei vari utenti.

Grazie! In effetti è molto comodo e unix-like :D

Inviato dal mio LT22i con Tapatalk 2

clockover
10-02-2013, 09:35
#!/usr/bin/perl -w

use v5.12;

my $count;

open (FH, $ARGV[0]);
while(my $w = <FH>) {
my @matches = $w =~ m/(ciao)/g;
$count += scalar(@matches);
}

if ($count == 1) {
say "Found 1 time"
}
else {
say "Found $count times"
}

Non l'ho provato il tuo ma misà che non è proprio corretto. Quando cerchi la parola "ciao", viene contato anche se nel tuo file c'è la parola "ciaoooooooooneeeeee", oppure "superciaooo", ecc... Devi utilizzare un delimitatore (non so tecnicamente come si chiama) che segni inizio e fine della tua parola da cercare. In perl il modo più semplice è usare "\b", ad esempio (codice semplice)
#!/bin/perl
use warnings;
use strict;

my($filename, $pattern) = ($ARGV[0], $ARGV[1]);

#########################RICERCA DELLA PAROLA######################
open my $HANDLE, "<", $filename or die "Errore apertura file: $!";

my $matched = 0;

$matched +=()= /\b$pattern\b/g while( <$HANDLE> );

##########################STAMPA DEL RISULTATO#####################

if(not $matched){
print "Nessuna corrispondenza trovata di \"$pattern\"\n";
}
elsif( $matched == 1 ){
print "Trovata una corrispondenza di \"$pattern\"\n";
}
else{
print "Trovate $matched corrispondenze di \"$pattern\"\n";
}

The_ouroboros
10-02-2013, 09:43
si chiama word bound e mi sono dimenticato di inserirlo :cry:
Grazie per l'osservazione :D

clockover
10-02-2013, 09:46
si chiama word bound e mi sono dimenticato di inserirlo :cry:
Grazie per l'osservazione :D

Si esatto "word bound" e l'ho conosciuto da poco proprio su Learning Perl nella sezione Word Anchors :D

Visto che sintesi il mio codice :sofico: mitico perl

secondo me si può fare di meglio

The_ouroboros
10-02-2013, 09:52
Piccolo consiglio mio invece.
Usa sempre #!/usr/bin/env perl che cosi eviti problemi quando il perl non è dove dovrebbe essere :D
E non fa male usare un
use v5.12;
use warnings;.
Il primo di suo comprende già strict

The_ouroboros
10-02-2013, 10:00
nuova versione messa su github che use given/when

clockover
10-02-2013, 10:05
Piccolo consiglio mio invece.
Usa sempre #!/usr/bin/env perl che cosi eviti problemi quando il perl non è dove dovrebbe essere :D
E non fa male usare un
use v5.12;
use warnings;.
Il primo di suo comprende già strict

Ottimo :D

The_ouroboros
10-02-2013, 10:05
#!/usr/bin/env perl
# Version 0.13 by Luca Francesca
# 0.13 Added given/when
# 0.12 Fixed search bounderies
# 0.11 added parameter passed to perl on invocation

use v5.12;
use warnings;

my $count;

open (FH, $ARGV[0]) or die "Error opening input file: $!";

if ($ARGV[1] eq "") {
say "I need a string to match";
exit(-1);
}

while(<FH>) {
my @matches = $_ =~ m/(\b$ARGV[1]\b)/g;
$count += scalar(@matches);
}

given ( $count ) {
when ( /1/ ) { say "$ARGV[1] found 1 time"; }
when ( /[0-9]*/ ) { say "$ARGV[1] found $count times"; }
default { }
}

clockover
10-02-2013, 10:09
#!/usr/bin/env perl
# Version 0.13 by Luca Francesca
# 0.13 Added given/when
# 0.12 Fixed search bounderies
# 0.11 added parameter passed to perl on invocation

use v5.12;
use warnings;

my $count;

open (FH, $ARGV[0]) or die "Error opening input file: $!";

if ($ARGV[1] eq "") {
say "I need a string to match";
exit(-1);
}

while(my $w = <FH>) {
my @matches = $w =~ m/(\b$ARGV[1]\b)/g;
$count += scalar(@matches);
}

given ( $count ) {
when ( /1/ ) { say "$ARGV[1] found 1 time"; }
when ( /[0-9]*/ ) { say "$ARGV[1] found $count times"; }
default { say "$ARGV[1] not found"; }
}


è una droga perl :D

The_ouroboros
10-02-2013, 10:21
nel repo github c'è movimento.
Forza signori fatevi li un account cosi potete mettere il vostro codice e tutto sarà più pulito :D
Ed è pure utile per il futuro perche si impara git :cool:

clockover
10-02-2013, 10:23
nel repo github c'è movimento.
Forza signori fatevi li un account cosi potete mettere il voareo codice e tutto sarà più pulito :D
Ed è pure utile per il futuro perche si impara git :cool:

Mi ci sto muovendo proprio io :D sto imparando git, sto facendo varie prove per capire bene come funziona.

Siccome mi sono fatto un account, posso già inviare il mio codice o c'è qualche restrizione?

The_ouroboros
10-02-2013, 10:23
Mi ci sto muovendo proprio io :D sto imparando git, sto facendo varie prove per capire bene come funziona.

Siccome mi sono fatto un account, posso già inviare il mio codice o c'è qualche restrizione?

Dammi il tuo nome utente :D

The_ouroboros
10-02-2013, 10:38
VICIUS... come altro owner dei repo... secondo te conviene scrivere qui un piccolo howto per aggiungere il proprio codice (fork+creazione cartella+pull request)?

Vincenzo1968
10-02-2013, 11:04
VICIUS... come altro owner dei repo... secondo te conviene scrivere qui un piccolo howto per aggiungere il proprio codice (fork+creazione cartella+pull request)?

Yes. Non sono Vicius ma yes.

:D

The_ouroboros
10-02-2013, 11:17
se volete aggiungere il vostro codice il tutto è molto semplice.
Ma andiamo per piccoli passi.

1. Iscrivetevi si github (è aggratisse) e comunicate a me o VICIUS o Vincenzo il vostro utente e aspettate un nostro ok.

2. Portatevi su https://github.com/hwupgradecontest e selezionate il repo del contest (in questa istanza il contest19)

[Su tutte le piattaforme potete usare da linea di comando

git clone https://github.com/hwupgradecontest/contest19.git

Dove la parte in grassetto cambierà da contest a contest.]

3. Sui comandi in alto cercate Fork e cliccateci sopra e vi chiederà di forkare(copiare tutto il codice) sul vostro utente.

4. Create una vostra cartella con il vostro nome e metteteci il vostro codice.

5. Ritornate su https://github.com/hwupgradecontest e il repo del contest corrente e cercate Pull Request.

6. Completate il tutto seguendo le istruzioni.

7. In base a quando potremo, noi owner mergeremo il vostro codice. :cool:

Vincenzo1968
10-02-2013, 11:20
Non l'ho provato il tuo ma misà che non è proprio corretto. Quando cerchi la parola "ciao", viene contato anche se nel tuo file c'è la parola "ciaoooooooooneeeeee", oppure "superciaooo", ecc... Devi utilizzare un delimitatore (non so tecnicamente come si chiama) che segni inizio e fine della tua parola da cercare. In perl il modo più semplice è usare "\b", ad esempio (codice semplice)


Occhio che il punto B.2 prevede anche la ricerca parziale. Va passato come parametro opzionale dalla riga di comando.
Nel mio se passi --partial ti trova "ciao" anche in "ciaoooooooneeeee" e in "superciaoooo".

Se non passi il parametro --partial invece fa un exact match.

È prevista anche la ricerca case-insensitive col parametro --case-insensitive.

;)

EDIT: Ho scritto una cavolata. Era il punto B.1. come non detto.

Vincenzo1968
10-02-2013, 11:31
se volete aggiungere il vostro codice il tutto è molto semplice.
Ma andiamo per piccoli passi.

1. Iscrivetevi si github (è aggratisse) e comunicate a me o VICIUS o Vincenzo il vostro utente e aspettate un nostro ok.

2. Portatevi su https://github.com/hwupgradecontest e selezionate il repo del contest (in questa istanza il contest19)

[Su tutte le piattaforme potete usare da linea di comando

git clone https://github.com/hwupgradecontest/contest19.git

Dove la parte in grassetto cambierà da contest a contest.]

3. Sui comandi in alto cercate Fork e cliccateci sopra e vi chiederà di forkare(copiare tutto il codice) sul vostro utente.

4. Create una vostra cartella con il vostro nome e metteteci il vostro codice.

5. Ritornate su https://github.com/hwupgradecontest e il repo del contest corrente e cercate Pull Request.

6. Completate il tutto seguendo le istruzioni.

7. In base a quando potremo, noi owner mergeremo il vostro codice. :cool:

Aggiunto riferimento a questo post nel post iniziale della prima pagina ;)

The_ouroboros
10-02-2013, 11:35
#!/usr/bin/env perl

use v5.12;
#use warnings;

my $count;
my $file = $ARGV[0];
my $str = $ARGV[1];

open (FH, $file) or die "Error opening input file: $!";

if ($str eq "") {
say "I need a string to match";
say "Usage: $0 <file> <string> [--partial]";
exit -1;
}

while(my $w = <FH>) {
given ( $ARGV[2] ) {
when ( /--partial/ ) { my @matches = $w =~ m/($str)/g; $count += scalar(@matches); }
default { my @matches = $w =~ m/(\b$str\b)/g; $count += scalar(@matches); }
}
}

given ( $count ) {
when ( /1/ ) { say "Found $str 1 time"; }
when ( /[0-9]*/ ) { say "Found $str $count times"; }
default { }
}

The_ouroboros
10-02-2013, 11:37
nella versione sopra basta mettere --partial alla fine e prende anche i parziali :D
Non è bellissima ma funziona

Vincenzo1968
10-02-2013, 11:57
se volete aggiungere il vostro codice il tutto è molto semplice.
Ma andiamo per piccoli passi.

1. Iscrivetevi si github (è aggratisse) e comunicate a me o VICIUS o Vincenzo il vostro utente e aspettate un nostro ok.

2. Portatevi su https://github.com/hwupgradecontest e selezionate il repo del contest (in questa istanza il contest19)

[Su tutte le piattaforme potete usare da linea di comando

git clone https://github.com/hwupgradecontest/contest19.git

Dove la parte in grassetto cambierà da contest a contest.]

3. Sui comandi in alto cercate Fork e cliccateci sopra e vi chiederà di forkare(copiare tutto il codice) sul vostro utente.

4. Create una vostra cartella con il vostro nome e metteteci il vostro codice.

5. Ritornate su https://github.com/hwupgradecontest e il repo del contest corrente e cercate Pull Request.

6. Completate il tutto seguendo le istruzioni.

7. In base a quando potremo, noi owner mergeremo il vostro codice. :cool:

Per organizzare il codice per i vari punti in cartelle e sottocartelle, come ha fatto Vicius, che bisogna fare?

The_ouroboros
10-02-2013, 12:06
quando forki, sul tuo repo locale crei la cartella con solo il tuo nome e quando fai il pull lui te la carica.
All'interno della stessa l'alberatura è quello che vuoi... quando fai il push viene aggiornata. :D

Vincenzo1968
10-02-2013, 12:11
quando forki, sul tuo repo locale crei la cartella con solo il tuo nome e quando fai il pull lui te la carica.
All'interno della stessa l'alberatura è quello che vuoi... quando fai il push viene aggiornata. :D

Ah bene, bellissimo! :D

The_ouroboros
10-02-2013, 12:12
il bello dei sistemi come git. :cool:

p.s: fixato e messo usage nello script perl

VICIUS
10-02-2013, 12:30
Può bastare come introduzione? Spiegare git non è cosa da poche parole e ci sono già mille guide eccellenti quindi mi sono limitato a mettere un po' di link.

https://github.com/hwupgradecontest/README

The_ouroboros
10-02-2013, 12:44
molto bene. :D
In caso si aggiunge alla tua guida qualcosa di specifico dovesse saltare fuori.

Il fatto è che git e i sistemi di versioning non sono un argomento semplice ma sono fondamentali :stordita:

Vincenzo1968
10-02-2013, 13:20
Può bastare come introduzione? Spiegare git non è cosa da poche parole e ci sono già mille guide eccellenti quindi mi sono limitato a mettere un po' di link.

https://github.com/hwupgradecontest/README

http://img818.imageshack.us/img818/7678/githowto.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
10-02-2013, 13:23
Può bastare come introduzione? Spiegare git non è cosa da poche parole e ci sono già mille guide eccellenti quindi mi sono limitato a mettere un po' di link.

https://github.com/hwupgradecontest/README

Aggiunto riferimento nel primo post della prima pagina. :O

Quasi finito il mio punto B.1 con indice :O

Asfalting :O

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

The_ouroboros
10-02-2013, 13:34
mi piace coem sta venendo su l'organizazione :D

Vincenzo1968
10-02-2013, 13:36
Alt! Fermi tutti!

apt-get mi installa la versione 1.7:


$ git --version
git version 1.7.10.4


Come faccio a installare l'ultima, la 1.8.1.3?

The_ouroboros
10-02-2013, 13:45
compila da sorgenti :stordita:

Vincenzo1968
10-02-2013, 13:51
compila da sorgenti :stordita:

E dove li trovo i sorgenti?

http://img27.imageshack.us/img27/5250/gitupdatenonfunge.png

Su Windows ho la versione 1.8...

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

The_ouroboros
10-02-2013, 13:54
git clone https://github.com/git/git.git

Vincenzo1968
10-02-2013, 14:06
git clone https://github.com/git/git.git

Già fatto:

http://img27.imageshack.us/img27/5250/gitupdatenonfunge.png

Ho compilato e installato con


make -j2 prefix=/usr/local
su
make install


Ma niente da fare.

The_ouroboros
10-02-2013, 14:08
http://evgeny-goldin.com/blog/3-ways-install-git-linux-ubuntu/

or

http://git-scm.com/book/en/Getting-Started-Installing-Git

Vincenzo1968
10-02-2013, 14:20
http://www.lyraphase.com/wp/projects/installing-latest-git-on-ubuntu-with-git-subtree-support/

http://img132.imageshack.us/img132/17/gitupdated.png

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

clockover
10-02-2013, 14:37
Forse il miglior tutorial su git che sono riuscito a trovare --> http://www.vogella.com/articles/Git/article.html

Per ora sto facendo delle prove su /GenericCode con delle stupidaggini

The_ouroboros
10-02-2013, 14:47
prova a fare una pull e un merge ;)

clockover
10-02-2013, 14:51
prova a fare una pull e un merge ;)

Finora ho fatto solo delle push, ora provo il resto :)

The_ouroboros
10-02-2013, 14:53
non vedo nulla sul repo per ora.
Dai una pull request e prova un merge...fai modifiche a cazzo e poi prova a tornare ad una versione prima... cosi capisci il pieno potere di git :cool:

clockover
10-02-2013, 15:07
non vedo nulla sul repo per ora.
Dai una pull request e prova un merge...fai modifiche a cazzo e poi prova a tornare ad una versione prima... cosi capisci il pieno potere di git :cool:

Non è proprio immediata la cosa ma piano piano piano ce la farò

The_ouroboros
10-02-2013, 15:10
io per vedere il livello di difficoltà da interfaccia web ho appena forkato, aggiunto mio codice personale, pullato e mergiato :D

marco.r
10-02-2013, 15:14
Piccolo consiglio mio invece.
Usa sempre #!/usr/bin/env perl che cosi eviti problemi quando il perl non è dove dovrebbe essere :D
E non fa male usare un
use v5.12;
use warnings;.
Il primo di suo comprende già strict

Tranne quanto ti trovi /bin/env invece che /usr/bin/env :D
(gia' capitato)

The_ouroboros
10-02-2013, 15:16
il mondo di *nix è bello perchè è vario (cit.)

Un bel which e passa la paura (ma anche un softlink se proprio..)

The_ouroboros
10-02-2013, 15:27
Non è proprio immediata la cosa ma piano piano piano ce la farò

visto i tuoi esperimenti.... ti ho anche commentato :fagiano:

marco.r
10-02-2013, 15:41
il mondo di *nix è bello perchè è vario (cit.)

Un bel which e passa la paura (ma anche un softlink se proprio..)
Se puoi mettere malo alla macchina (e.g. e' tua ) non e' un problema. Diverso se sei in un contesto dove uno cerca di fare uno script che vada anceh su macchine di altri. Comunque sto andando ot, scusate

The_ouroboros
10-02-2013, 15:44
[ot]
il bello/brutto di non avere uno standard che seguono tutti nell'alberatura

Vincenzo1968
10-02-2013, 15:50
Io purtroppo non ho moltissimo tempo da dedicare al forum e questo è il motivo per cui sto seguendo questo contest ma non sto partecipando...

Comunque, se manteniamo una struttura in cui ciascuno forka il progetto, crea la sua cartella, modifica solo quella e infine fa una pull request, il compito dovrebbe essere abbastanza semplice.

La gestione delle pull request richiede attenzione quando tutti lavorano sullo stesso codice. In questo caso abbiamo delle implementazioni indipendenti, quindi dovrebbero essere accettate quasi automaticamente.

L'ideale potrebbe essere di avere due o tre persone che gestiscono il tutto. Io non posso garantire una presenza costante, però se facciamo un gruppetto di gestori delle pull request una mano posso darla.

Sent from my Nexus 7 using Tapatalk HD

Non è che ti andrebbe di fare l'amministratore al posto mio insieme a Ouro e Vicius?

Io non è che non voglia occuparmene, è solo che prima vorrei essere abbastanza esperto(e invece sono niubbissimo). Dal prossimo contest farò l'amministratore anch'io ma, per il momento, non me la sento.

Che ne dici?

Ragazzi, l'invito è rivolto a chiunque conosca abbastanza bene git e github. ;)

The_ouroboros
10-02-2013, 15:53
Non è che ti andrebbe di fare l'amministratore al posto mio insieme a Ouro E Vicius?

Io non è che non voglia occuparmene, è solo che prima vorrei essere abbastanza esperto(e invece sono niubbissimo). Dal prossimo contest farò l'amministratore anch'io ma, per il momento, non me la sento.

Che ne dici?

Ragazzi, l'invito è rivolto a chiunque conosca abbastanza bene git e github. ;)

fatemi sapere come risolvete.
Cmq, Vincenzo, hai una richiesta di pull...vedi se ti viene di accettarla ;)

Vincenzo1968
10-02-2013, 15:55
fatemi sapere come risolvete.
Cmq, Vincenzo, hai una richiesta di pull...vedi se ti viene di accettarla ;)

Ecco, ora che cacchio faccio? Come si fa ad accettarla?

Ouro, per il momento toglimi come amministratore, mettimi come utente normale. Quando sarò in grado, lo farò volentieri l'amministratore. ;)

Intanto spiegami come accettare la richiesta di pull. ;)

EDIT: puoi farlo tu al posto mio o sto dicendo una cavolata?

The_ouroboros
10-02-2013, 15:58
Ecco, ora che cacchio faccio? Come si fa ad accettarla?

Ouro, per il momento toglimi come amministratore, mettimi come utente normale. Quando sarò in grado, lo farò volentieri l'amministratore. ;)

Intanto spiegami come accettare la richiesta di pull. ;)


vai sulla richiesta, è stata assegnata a te.
C'è un tasto che dice merge(o dovrebbe dirlo).
Io lo vedo come circondato di verde
http://i45.tinypic.com/13z7h3.jpg

The_ouroboros
10-02-2013, 16:00
e cmq non temere, si impara anche così (l'ho vissuto molto spesso in effetti "l'apprendimento per trauma")

Vincenzo1968
10-02-2013, 16:02
http://img38.imageshack.us/img38/337/pullrequests.jpg

:confused:

The_ouroboros
10-02-2013, 16:03
e nel repo del codice comune :D
Guarda quella palla blu in alto...è una notifica per te

The_ouroboros
10-02-2013, 16:07
Perfetto, sei stato velocissimo :D

Vincenzo1968
10-02-2013, 16:08
Perfetto, sei stato velocissimo :D

:yeah: :winner: :yeah:

Vincenzo1968
10-02-2013, 16:15
e nel repo del codice comune :D
Guarda quella palla blu in alto...è una notifica per te

Però non l'ho capito cos'è il codice comune. Cos'è? :confused:

:D

The_ouroboros
10-02-2013, 16:19
was? Mi sono perso il riferimento mi sa :doh:

Vincenzo1968
10-02-2013, 16:31
was? Mi sono perso il riferimento mi sa :doh:

No dico, perché c'è una cartella "Contest19" e una cartella "GenericCode"?
:confused:

The_ouroboros
10-02-2013, 16:33
No dico, perché c'è una cartella "Contest19" e una cartella "GenericCode"?
:confused:

leggi i file README.
Cmq GenericCode è un repo comune per prove di codice vario :)

Vincenzo1968
10-02-2013, 20:11
Il mio per creare l'indice su un file da 5 GiB ci mette 14 minuti:

http://img254.imageshack.us/img254/7775/myb01index.jpg

Sempre meglio dei 24 minuti di Vicius-Lucene. :O

E comunque è migliorabile: posso fargli scrivere blocchi da 4096 byte anziché le singole parole. È per questo che perde tutto 'sto tempo.:O

:D

Vincenzo1968
10-02-2013, 23:45
Creazione indice file da 5 GiB in meno di sei minuti.

http://img834.imageshack.us/img834/676/myinvertedindex.jpg

Chi dici?

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
11-02-2013, 13:41
Il file indice però risulta troppo grande se uno deve indicizzare le parole così come sono. In pratica risulta uguale o addirittura più grosso del file originale.

Il che, per file di grosse e grossissime dimensioni, non mi pare una buona cosa.

Voglio provare a creare un indice parziale. Una via di mezzo fra la ricerca "brute-force" con automa e l'indicizzazione piena.

In questo modo si impiega più tempo per la ricerca rispetto all'inverted index regolare, ma il file indice risulta molto più piccolo.

A proposito, Vicius, ancora non m'hai detto dove Lucene piazza il file(o i file) indice. Vorrei liberare lo spazio su disco dopo le prove effettuate. ;)

VICIUS
11-02-2013, 13:50
Crea una cartella di nome "indice" dove hai lanciato il programma. I file sono tutti quanti li dentro.

Vincenzo1968
11-02-2013, 14:19
http://img194.imageshack.us/img194/6906/dimindexlucene5gib.jpg

Vedi? L'indice risulta più grosso del file originale(5 GiB).
Questo tipo di indice va bene per un server web, motori come google, etc.
Non vorremo mica esaurire lo spazio dell'utente se le ricerche avvengono su file grossissimi nella macchina locale?

Io implemento l'indice parziale; me ne frego se impiega un po' più di tempo rispetto a Lucene per la ricerca(ma impiega molto meno tempo e spazio per creare l'indice :D )

;)

banryu79
11-02-2013, 17:00
Io implemento l'indice parziale; me ne frego se impiega un po' più di tempo rispetto a Lucene per la ricerca(ma impiega molto meno tempo e spazio per creare l'indice :D )

;)
Secondo me è una buona idea: bisogna trovare il giusto compromesso rispetto allo scenario (use-case mi verrebbe da dire) di utilizzo. :)

Vincenzo1968
11-02-2013, 17:08
Secondo me è una buona idea: bisogna trovare il giusto compromesso rispetto allo scenario (use-case mi verrebbe da dire) di utilizzo. :)

Sembrava buona pure a me ma spazio non se ne risparmia molto.
Volevo implementare un indice che memorizzasse:

- La lettera iniziale della parola.
- La pagina(blocco da 4096 o 8192 byte) dove si trova la parola.
- Lo spiazzamento della parola all'interno del blocco.

Purtroppo il file risuta solo leggermente inferiore(come dimensioni) all'indice normale.

A questo punto conviene implementare l'indice integrale. A meno che qualcuno non tiri fuori un'idea migliore per risparmiare spazio/tempo.

;)

clockover
11-02-2013, 18:00
Forse ci sto capendo qualcosa con git :D

Un paio di domandine
1) Il local repository è quella cartella .git e il remote è il file, su dico o su github, con estensione .git?
2) Quando lavoro in locale e effettuo delle modifiche su dei files e magari voglio effettuare uno snapshot della situazione effettuo un commit della situazione. Posso lavorare in locale quanto mi pare, poi se voglio effettuo un'operazione di push, in questo caso è come se facessi una copia del mio repository locale in quello remoto
3) Quando si parla di shortname è come se stessi usando una variabile per memorizzare l'URL, ed esempio
git remote add contest https://github.com/clockover/contest19.git
in questo modo un'operazione di push o di clone potrebbe essere effettuata solo con lo shortnamegit push contest
4) Un'operazione di pull serve semplicemente ad aggiornare il mio codice in locale con quello memorizzato sul repository remoto. Ad esempio qualcuno che ha lavorato su quella stessa branch e ha effettuato una push ha modificato alcuni files.

Quando ho capito queste cose per bene e ho fatto varie prove passerò al merge

Vincenzo1968
11-02-2013, 19:25
Indice integrale:

http://img818.imageshack.us/img818/4152/myindex.jpg

E tanti saluti a Lucene.

Ciao Vicius :D

VICIUS
11-02-2013, 21:59
Vedi? L'indice risulta più grosso del file originale(5 GiB).
Questo tipo di indice va bene per un server web, motori come google, etc.
Non vorremo mica esaurire lo spazio dell'utente se le ricerche avvengono su file grossissimi nella macchina locale?

Io implemento l'indice parziale; me ne frego se impiega un po' più di tempo rispetto a Lucene per la ricerca(ma impiega molto meno tempo e spazio per creare l'indice :D )

;)
Si è normale. Ho detto a lucene di memorizzare anche il testo originale del documento. È grazie a questo che ho potuto stampare in output la riga ed evidenziarla. Quando è configurato così lucene funziona come un db. Una volta aggiunti i file originali puoi anche buttarli visto che se li vuoi "leggere" ti basta l'indice.

Se vuoi fare un'altra prova basta che cerchi Store.YES dentro a CreateIndex.java e lo cambi in Store.NO. Ricreando da zero l'indice i file dovrebbe risultare molto più piccoli ed aggirarsi sui 2 gb vista la dimensione della cartella nello screenshot.

Altre due cose che influiscono sulla dimensione dell'indice sono il numero di documenti e delle parole.

Il numero di documenti purtroppo come ti ho già detto nella mia implementazione è molto alto ed equivale al numero di righe che ci sono nel file. Se ci fossero 30 mila documenti invece di 30 milioni di piccole righe le l'indice sarebbe molto più semplice e le dimensioni diminuirebbero.

Per le parole se si è disposto a scendere a compromessi si può fare qualcosa anche su questo fronte. Una delle cose più immediate è aggiungere una lista di stop words che l'indice deve ignorare. Articoli, preposizioni, pronomi ed avverbi sono tutte parole talmente frequenti che perdono rilevanza. Raramente si cerca "il" oppure "noi" eppure sono parole che hanno una frequenza altassima rispetto al resto e in un file di testo da 5 gb è probabile che siano ripetute decine di milioni di volte. Poi si potrebbe agire sulla lunghezza ponendo limiti minimi e massimi. Oppure decidere di ignorare le differenze tra miauscole e minuscole o in caso di accentate rendendo "ÈLétTTòre" ed "elettore" uguali per l'indice.

Se parliamo del tuo indice invece non avendo visto il codice non so bene che cosa hai realizzato quindi non so aiutarti. Magari posta il codice così ci possiamo fare tutti quanti un idea.

Vincenzo1968
11-02-2013, 22:11
Grazie per le spiegazioni ;)

comunque ho deciso che l'indice lo implemento integrale e buonanotte.

Senti non è che tu(o Banryu o chiuque programmi in Java e conosca Lucene) puoi scrivere un'applicazioncina per creare l'indice Lucene su una cartella contenente un insieme di file(tipo quelli di input del punto A)?

Puoi? Potete?

banryu79
12-02-2013, 11:21
Grazie per le spiegazioni ;)

comunque ho deciso che l'indice lo implemento integrale e buonanotte.

Senti non è che tu(o Banryu o chiuque programmi in Java e conosca Lucene) puoi scrivere un'applicazioncina per creare l'indice Lucene su una cartella contenente un insieme di file(tipo quelli di input del punto A)?

Puoi? Potete?
Di Lucene sonasegaio... e poi in questi giorni non ho tempo, però vi seguo (quando posso) con interesse.


Per le parole se si è disposto a scendere a compromessi si può fare qualcosa anche su questo fronte. Una delle cose più immediate è aggiungere una lista di stop words che l'indice deve ignorare. Articoli, preposizioni, pronomi ed avverbi sono tutte parole talmente frequenti che perdono rilevanza. Raramente si cerca "il" oppure "noi" eppure sono parole che hanno una frequenza altassima rispetto al resto e in un file di testo da 5 gb è probabile che siano ripetute decine di milioni di volte.

Pensavo che sarebbe interessante registrare la frequenza di tutte le parole uniche (case insensitive) di quei 5 giga di roba e vedere che salta fuori...

Vincenzo1968
12-02-2013, 11:46
Di Lucene sonasegaio... e poi in questi giorni non ho tempo, però vi seguo (quando posso) con interesse.
...


Allora il libro che l'hai comprato a fare? :mbe:





Scherzo! :D

VICIUS
12-02-2013, 12:22
Pensavo che sarebbe interessante registrare la frequenza di tutte le parole uniche (case insensitive) di quei 5 giga di roba e vedere che salta fuori...

Non ho il file grosso per provare. Però usando un txt con mattia pascal queste sono le top 25.
➜ Downloads grep -iEo '[a-zèéàùòì]+' il_fu_ma.txt | sort | uniq -c | sort -n | tail -25
384 Ma
409 me
415 da
430 d
438 era
451 l
453 più
467 come
477 una
517 si
529 io
573 le
603 con
712 I
821 mi
893 in
1049 un
1060 il
1062 per
1131 non
1373 la
1436 a
1755 che
1856 e
1914 di

Vincenzo1968
12-02-2013, 13:04
Si potrebbe mettere come punto B.5:


Si scriva un programmino per calcolare la frequenza delle parole con lunghezza <= 5.
Si stampi a video o su file la lista della parole trovate con accanto la relativa frequenza.

banryu79
12-02-2013, 17:08
Chissà se il fatto di ignorare tutte quelle parole "inutili" riduce in maniera considerevole la dimensione del file indice... era per questo che pensavo fosse interessante calcolarne la frequenza su tutti e 5 i gigabyte.

Vincenzo1968
12-02-2013, 17:40
Chissà se il fatto di ignorare tutte quelle parole "inutili" riduce in maniera considerevole la dimensione del file indice... era per questo che pensavo fosse interessante calcolarne la frequenza su tutti e 5 i gigabyte.

Sicuramente si. Guarda qua:

File da 1 GiB:
http://img844.imageshack.us/img844/60/perer.jpg

2.043.950 di occorrenze per la stringa "per".

Per il numero di cui sopra leggasi: duemilioniquarantatremilanovecentocinquanta.

;)

Si si, Vicius ha avuto un'ottima idea. Io nel mio indice escluderò gli articoli etc. Dovrei risparmiare un bel po' di spazio.

Vincenzo1968
12-02-2013, 18:14
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt il --case-insensitive

Exact match della stringa: <il>
Ho trovato 2695288 occorrenze della stringa "il".

real 0m7.480s
user 0m6.948s
sys 0m0.524s
-------------------------------------------------------------------------------
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt lo --case-insensitive
Exact match della stringa: <lo>
Ho trovato 631970 occorrenze della stringa "lo".

real 0m7.174s
user 0m6.688s
sys 0m0.480s
-------------------------------------------------------------------------------
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt la --case-insensitive
Exact match della stringa: <la>
Ho trovato 3242131 occorrenze della stringa "la".

real 0m7.322s
user 0m6.808s
sys 0m0.504s
-------------------------------------------------------------------------------
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt i --case-insensitive
Exact match della stringa: <i>
Ho trovato 1869509 occorrenze della stringa "i".

real 0m7.922s
user 0m7.348s
sys 0m0.572s
-------------------------------------------------------------------------------
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt gli --case-insensitive
Exact match della stringa: <gli>
Ho trovato 683330 occorrenze della stringa "gli".

real 0m6.871s
user 0m6.336s
sys 0m0.528s
-------------------------------------------------------------------------------
$ time ./c19b01Vincenzo1968New fileA_1GiB.txt le --case-insensitive
Exact match della stringa: <le>
Ho trovato 1519552 occorrenze della stringa "le".

real 0m7.179s
user 0m6.700s
sys 0m0.468s


;)

banryu79
13-02-2013, 11:25
Alcuni set (non esaustivi) di singole parole (odinate lessicograficamente) potenzialmente "ignorabili" ai fini della creazione dell'indice.
Sarebbe interessante misurarne l'effettiva frequenza nel corpus.


Articoli=[gli, i, il, l', la, le, lo, un, un', una, uno]

Perposizioni=[agli, ai, al, all', alla, alle, allo, dagli, dai, dal, dall', dalla, dalle, dallo, degli, dei, del, dell', della, delle, dello, negli, nei, nel, nell', nella, nelle, nello]

Pronomi=[ci, esse, essi, gli, gliela, gliele, glieli, glielo, io, la, le, lei, li, lo, loro, lui, me, mi, noi, te, ti, tu, vi, voi]

Congiunzioni=[acciocché, affinché, allora, allorché, altrimenti, anche, ancorché, anzi, appena, benché, che, cioè, come, così, dunque, e, ed, eppure, fuorché, giacché, infatti, laddove, ma, neanche, nemmeno, neppure, non, nonché, nondimeno, né, o, oppure, ossia, ovvero, perché, perciò, pertanto, però, piuttosto, poiché, purché, pure, qualora, quando, quantunque, quasi, quindi, se, sebbene, seppure, siccome, tanto, tranne, tuttavia]


Space-separated:

Articoli=[ gli i il l' la le lo un un' una uno ]

Preposizioni=[ agli ai al all' alla alle allo dagli dai dal dall' dalla dalle dallo degli dei del dell' della delle dello negli nei nel nell' nella nelle nello ]

Pronomi=[ ci esse essi gli gliela gliele glieli glielo io la le lei li lo loro lui me mi noi te ti tu vi voi ]

Congiunzioni=[ acciocché affinché allora allorché altrimenti anche ancorché anzi appena benché che cioè come così dunque e ed eppure fuorché giacché infatti laddove ma neanche nemmeno neppure non nonché nondimeno né o oppure ossia ovvero perché perciò pertanto però piuttosto poiché purché pure qualora quando quantunque quasi quindi se sebbene seppure siccome tanto tranne tuttavia ]

Vincenzo1968
13-02-2013, 11:43
Alcuni set (non esaustivi) di singole parole (odinate lessicograficamente) potenzialmente "ignorabili" ai fini della creazione dell'indice.
Sarebbe interessante misurarne l'effettiva frequenza nel corpus.

Grazie!!!

M'hai evitato la fatica di andarmeli a cercare nel libro di grammatica. :D

E per i file contenenti testi in lingua inglese?

Le congiunzioni direi di includerle nell'indice(tranne quelle brevi: "che", "cioè", "e", "ed", "se", "né", etc).

banryu79
13-02-2013, 11:51
Grazie!!!

M'hai evitato la fatica di andarmeli a cercare nel libro di grammatica. :D

E per i file contenenti testi in lingua inglese?

Le congiunzioni direi di includerle nell'indice.
Dovresti avere un "dizionario" per ogni lingua.

Io vi ho fornito quelle per l'italiano (fonte: vari siti online) perchè pensavo che il corpus da 5 GB che state usando fosse tutto in lingua nostrana.

E chiaro che se hai un corpus mono-lingua basta un dizionario solo per quella.
Se il corpus è in più lingue ci vuole un dizionario per lingua, non solo: devi anche sapere quale dizionario applicare a quale documento nel corpus perchè sennò rischi di ignorare parole che (probabilmente) non dovresti.

Vincenzo1968
13-02-2013, 11:55
Dovresti avere un "dizionario" per ogni lingua.

Io vi ho fornito quelle per l'italiano (fonte: vari siti online) perchè pensavo che il corpus da 5 GB che state usando fosse tutto in lingua nostrana.

E chiaro che se hai un corpus mono-lingua basta un dizionario solo per quella.
Se il corpus è in più lingue ci vuole un dizionario per lingua, non solo: devi anche sapere quale dizionario applicare a quale documento nel corpus perchè sennò rischi di ignorare parole che (probabilmente) non dovresti.

Vero è. Concentriamoci su testi in lingua italiana tanto, una volta implementato l'algoritmo, è(dovrebbe essere) facile, in seguito, estenderlo a più dizionari(avendo a disposizione i dizionari).

Vincenzo1968
13-02-2013, 12:38
typedef struct tagIndexBlockHeaderInfo
{
uint32_t firstByteFree;
uint64_t nextBlock;
} IndexBlockHeaderInfo;


http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
13-02-2013, 13:03
typedef struct tagIndexBlockHeaderInfo
{
uint32_t firstByteFree;
uint64_t nextBlock;
} IndexBlockHeaderInfo;

typedef struct tagIndexInfo
{
unsigned char *szWord;
uint8_t wordLen;
uint32_t row;
uint32_t col;
uint64_t idBlock;
} IndexInfo;


http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
13-02-2013, 14:00
L'applicazioncina comincia a prendere corpo:

http://img15.imageshack.us/img15/7796/c19b01indexcorpo.jpg

banryu79
13-02-2013, 14:34
*erased

banryu79
13-02-2013, 15:08
Posto l'insieme delle parole da escludere.
Il risultato è l'unione senza ripetizioni dei set presentati prima, con il solo set delle Congiunzioni contenente solo le congiunzioni di 3 lettere o meno:

Exclude=[ agli ai al all' alla alle allo che ci dagli dai dal dall' dalla dalle dallo degli dei del dell' della delle dello e ed esse essi gli gliela gliele glieli glielo i il io l' la le lei li lo loro lui ma me mi negli nei nel nell' nella nelle nello noi non né o se te ti tu un un' una uno vi voi ]

count: 67

Vincenzo1968
13-02-2013, 17:37
Posto l'insieme delle parole da escludere.
Il risultato è l'unione senza ripetizioni dei set presentati prima, con il solo set delle Congiunzioni contenente solo le congiunzioni di 3 lettere o meno:

count: 67

Ottimo Banryuzzo, grazie :D

Il mio indice ha complessità O(1). Dico O(1) non O(n) e nemmeno O(lg n).
Grazie agli indici con hashtable su file(illustrati nei testi sui DBMS).

Vicius-Lucene non ha dove andare... È spacciato. :D

Vincenzo1968
13-02-2013, 17:57
Ohé!

Top 10 Git Tutorials for Beginners:

http://sixrevisions.com/resources/git-tutorials-beginners/

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
14-02-2013, 15:27
Alla fine ce l'ho fatta a caricare i miei sorgenti su github:


vincenzo@gio feb 14$ git push https://github.com/hwupgradecontest/contest19.git
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Username for 'https://github.com': Vincenzo1968
Password for 'https://Vincenzo1968@github.com':
Counting objects: 32, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (31/31), 708.59 KiB, done.
Total 31 (delta 5), reused 0 (delta 0)
To https://github.com/hwupgradecontest/contest19.git
47bb086..c9c29a9 master -> master


Alla fine, però.

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

banryu79
14-02-2013, 16:37
Il mio indice ha complessità O(1). Dico O(1) non O(n) e nemmeno O(lg n).
Grazie agli indici con hashtable su file(illustrati nei testi sui DBMS).

Aspetto di vederlo in azione... quanto ci vuole a crearlo e che dimensioni ha?

VICIUS
14-02-2013, 16:51
Ottimo Banryuzzo, grazie :D

Il mio indice ha complessità O(1). Dico O(1) non O(n) e nemmeno O(lg n).
Grazie agli indici con hashtable su file(illustrati nei testi sui DBMS).

Vicius-Lucene non ha dove andare... È spacciato. :D

Si ma quanto è grosso quel "1"? Sbrigati a postare il codice che sono curioso. :O

Alla fine ce l'ho fatta a caricare i miei sorgenti su github:


vincenzo@gio feb 14$ git push https://github.com/hwupgradecontest/contest19.git
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Username for 'https://github.com': Vincenzo1968
Password for 'https://Vincenzo1968@github.com':
Counting objects: 32, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (31/31), 708.59 KiB, done.
Total 31 (delta 5), reused 0 (delta 0)
To https://github.com/hwupgradecontest/contest19.git
47bb086..c9c29a9 master -> master


Alla fine, però.

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Dovresti settare per bene il tuo nome/email e la chiave per accedere a github. Altrimenti è scomodo.

Vincenzo1968
14-02-2013, 17:11
Si ma quanto è grosso quel "1"? Sbrigati a postare il codice che sono curioso. :O



Dovresti settare per bene il tuo nome/email e la chiave per accedere a github. Altrimenti è scomodo.

Piuttosto mi spieghi come faccio a eliminare tutti quei file con la tilde finale?
Che cacchio sono? Sono file temporanei/nascosti che crea Linux? E perché sono stati copiati nel repository su github? Come li tolgo da github?

E poi, go messo la versione compressa(tar.gz) degli eseguibili nella cartella Binary. Come faccio a togliere gli eseguibili non compressi dalla cartella?

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
14-02-2013, 17:16
Aspetto di vederlo in azione... quanto ci vuole a crearlo e che dimensioni ha?

Ho ancora una piccola rogna da risolvere ed è quella di scegliere la funzione hash più adatta in modo da minimizzare i conflitti e non avere troppe pagine di overflow. Forse riesco a non avere nessuna pagina di overflow e, in questo caso, l'indice avrebbe realmente complessità O(1). Ma crescerebbe la dimensione del file-indice.

Debbo riuscire a trovare un buon compromesso.

Ci vorranno, perlomeno, altri due o tre giorni.

;)

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
14-02-2013, 17:21
Poi stavo pensando pure a comprimere le chiavi e i dati nella pagine del file-indice.

Si riducono notevolmente le dimensioni del file indice ma, ovviamente, si allungano i tempi per la ricerca(bisogna decomprimere la pagina prima di trovare la stringa di ricerca).

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
14-02-2013, 17:24
Dovresti settare per bene il tuo nome/email e la chiave per accedere a github. Altrimenti è scomodo.

E come?

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
14-02-2013, 17:31
http://img849.imageshack.us/img849/9408/githubmailverified.jpg

:yeah: :winner: :yeah:

Si ma la chiave? Che è la chiave? :confused:

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

The_ouroboros
14-02-2013, 19:02
Rsa pubblica tipo quella x accedere a server remoti..

Inviato dal mio LT22i con Tapatalk 2

VICIUS
14-02-2013, 19:30
Piuttosto mi spieghi come faccio a eliminare tutti quei file con la tilde finale?
Che cacchio sono? Sono file temporanei/nascosti che crea Linux? E perché sono stati copiati nel repository su github? Come li tolgo da github?
File con la tilde finale in genere sono copie di backup creati quando fai salva. Immagino che tu stia usando un editor di testo come gedit su ubuntu. Per cancellarli dal repo devi:
1. Usare git rm primo_file~ secondo_file~*ecc~
2. Fare un commit per rendere effettiva la cancellazione dal repo
3. Un push per mandare su github le modifiche

Ti consiglio di dare una letta a come usare un file .gitignore per escludere dal repository tutto quello che non ti interessa. https://help.github.com/articles/ignoring-files

E poi, go messo la versione compressa(tar.gz) degli eseguibili nella cartella Binary. Come faccio a togliere gli eseguibili non compressi dalla cartella?

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png
Aggiungere ad un repository anche i binari ha poco senso. Ci sono già i sorgenti e quelli bastano per ricreare tutto. Oltre ad uno spreco di spazio per i binari non è possibile mostrare le differenze tra una versione e l'altra annullando praticamente tutti i vantaggi di un scm. Nel tuo caso poi essendo un programma c sei legato all'architettura, al sistema operativo e alle versioni delle librerie che hai usato. Il mio consiglio è di cancellare binari e file tar.gz dal repository.

In futuro se per compilare basta un comando aggiungi un file readme in cui spieghi come fare. In caso di programmi più complessi con dipendenze non banali magari aggiungi anche uno script o un Makefile.

Vincenzo1968
14-02-2013, 19:47
File con la tilde finale in genere sono copie di backup creati quando fai salva. Immagino che tu stia usando un editor di testo come gedit su ubuntu. Per cancellarli dal repo devi:
1. Usare git rm primo_file~ secondo_file~*ecc~
2. Fare un commit per rendere effettiva la cancellazione dal repo
3. Un push per mandare su github le modifiche

Ti consiglio di dare una letta a come usare un file .gitignore per escludere dal repository tutto quello che non ti interessa. https://help.github.com/articles/ignoring-files


Aggiungere ad un repository anche i binari ha poco senso. Ci sono già i sorgenti e quelli bastano per ricreare tutto. Oltre ad uno spreco di spazio per i binari non è possibile mostrare le differenze tra una versione e l'altra annullando praticamente tutti i vantaggi di un scm. Nel tuo caso poi essendo un programma c sei legato all'architettura, al sistema operativo e alle versioni delle librerie che hai usato. Il mio consiglio è di cancellare binari e file tar.gz dal repository.

In futuro se per compilare basta un comando aggiungi un file readme in cui spieghi come fare. In caso di programmi più complessi con dipendenze non banali magari aggiungi anche uno script o un Makefile.



vincenzo@gio feb 14$ git rm *~
rm 'Vincenzo1968/Algoritmo.txt~'
rm 'Vincenzo1968/CaratteriDaSistemare.txt~'
rm 'Vincenzo1968/filePiccolo.txt~'
rm 'Vincenzo1968/myOutputB01.txt~'
rm 'Vincenzo1968/output.txt~'
rm 'Vincenzo1968/prova.txt~'
rm 'Vincenzo1968/provaUTF8.txt~'
vincenzo@gio feb 14$ git commit -m "Eliminati file inutili."
[master 5244992] Eliminati file inutili.
Committer: Vincenzo Lo Cicero <vincenzo@Ubuntu12-10-AMD64.homenet.telecomitalia.it>
Il tuo nome e l'indirizzo email sono stati configurati automaticamente usando
il tuo nome utente ed il nome host. Per favore, verifica che siano esatti.
È possibile eliminare questo messaggio impostandoli esplicitamente:

git config --global user.name "Tuo Nome"
git config --global user.email tu@esempio.com

Dopo questa operazione, puoi ripristinare l'identità usata in questo commit con:

git commit --amend --reset-author

7 files changed, 4906 deletions(-)
delete mode 100644 Vincenzo1968/Algoritmo.txt~
delete mode 100644 Vincenzo1968/CaratteriDaSistemare.txt~
delete mode 100644 Vincenzo1968/filePiccolo.txt~
delete mode 100644 Vincenzo1968/myOutputB01.txt~
delete mode 100644 Vincenzo1968/output.txt~
delete mode 100644 Vincenzo1968/prova.txt~
delete mode 100644 Vincenzo1968/provaUTF8.txt~
vincenzo@gio feb 14$ git push https://github.com/hwupgradecontest/contest19.git
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Username for 'https://github.com': Vincenzo1968
Password for 'https://Vincenzo1968@github.com':
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 323 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
To https://github.com/hwupgradecontest/contest19.git
0285f45..5244992 master -> master


http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vado a vedere se sono stati effettivamente eliminati. :D

EDIT: Yes!

http://img255.imageshack.us/img255/151/githubrimozionefileinut.jpg

Grande Vicius!
:yeah: :winner: :yeah:

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
14-02-2013, 19:55
Ancora una cosa. Per eliminare questo fastidioso warning:


warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

git config --global push.default simple


quale delle due opzioni scelgo? matching o simple?

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
15-02-2013, 18:48
Aggiunta una prima versione del punto B.1 con implementazione dell'indice:

https://github.com/hwupgradecontest/contest19

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

The_ouroboros
15-02-2013, 18:51
Direi simple..

Inviato dal mio LT22i con Tapatalk 2

Vincenzo1968
15-02-2013, 18:58
Direi simple..

Inviato dal mio LT22i con Tapatalk 2

simple ma velocissimo. Se prendi i tempi con time ci sta 0.00000 secondi :O

:D

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

The_ouroboros
15-02-2013, 19:03
I'got git power.. Yeah

Inviato dal mio LT22i con Tapatalk 2

Vincenzo1968
16-02-2013, 19:44
La mia versione impiega bene o male lo stesso tempo di Lucene per creare l'indice(a dire il vero un minuto e mezzo in meno :D ) ma guardate i tempi di ricerca sul file da 5 GiB:

http://img42.imageshack.us/img42/802/c19b02invertedindex.jpg

:yeah: :winner: :yeah:

Ciao Vicius, ciao Lucene. :bimbo:

:D

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

banryu79
16-02-2013, 20:19
Stica...
E il file indice quanto grosso è? Le dimensioni, si sa, contano :D

Vincenzo1968
16-02-2013, 21:51
Stica...
E il file indice quanto grosso è? Le dimensioni, si sa, contano :D

Il file, anzi i file, in totale raggiungono la dimensione del file originale. E c'è poco da fare perché nonostante l'esclusione delle parole brevi(articoli, etc) devi memorizzare per ogni parola la posizione all'interno del file. Se non vuoi memorizzare riga e colonna devi quantomeno memorizzare la riga(o perlomeno la pagina all'interno della quale si trova la parola).

E ancora non avete visto niente. La pagina dell'indice viene trovata con complessità O(1) grazie alla tecnica dell'hashing su file. Ma la ricerca della parola all'interno della pagina la faccio, attualmente, in modalità lineare. Posso migliorare ulteriormente i tempi effettuando una ricerca binaria.
E, per come ho strutturato l'indice, posso parallelizzare la ricerca(nel caso di query composte da due o più parole).

:yeah: :winner: :yeah:

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
17-02-2013, 09:54
Occhio!

Le parole più lunghe dela lingua italiana:

http://www.arcarussa.it/forum/le-parole-pi-lunghe-vt4546.html
http://archiviostorico.corriere.it/2001/settembre/24/parola_piu_lunga_lettere_ce_0_0109241882.shtml
http://www.focus.it/curiosita/Qual_e_la_parola_piu_lunga_della_lingua_italiana_C39.aspx
http://thepolloweb.blogspot.it/2009/11/la-parola-piu-lunga-nella-lingua.html

http://img154.imageshack.us/img154/1703/firmaclanubuntuhwupgrade0ot.png

Vincenzo1968
18-02-2013, 12:35
Sono riuscito a ridurre i tempi per la creazione del file indice:

File da 5 GiB:
http://img690.imageshack.us/img690/5011/tempicreateindex.jpg
10 minuti contro i 23 minuti di Vicius-Lucene.

Tempi per la ricerca: 0(zero!) secondi:
http://img651.imageshack.us/img651/2159/tempiricerca.jpg

Ciao Vicius. Ciao Lucene.

VICIUS
18-02-2013, 13:45
A cercare parole singole son capaci tutti. Probabilmente basta una Map<String, Set<Long>> come indice. Con ricerche che terminano in pochi nano secondi.

Ancora non vedo niente che possa essere paragonato a lucene. Ma neanche da lontano. Riprova sarai più fortunato ;)

Vincenzo1968
18-02-2013, 14:06
A cercare parole singole son capaci tutti. Probabilmente basta una Map<String, Set<Long>> come indice. Con ricerche che terminano in pochi nano secondi.

Ancora non vedo niente che possa essere paragonato a lucene. Ma neanche da lontano. Riprova sarai più fortunato ;)

Quello che ho postato è solo un esempio. Il programma fa le ricerche anche su stringhe composte da più parole. Basta passare il parametro racchiuso tra virgolette:


./c19b01MyIndex --use-index=MyIndex --find="Questa è la stringa da ricercare"


E impiega lo stesso tempo: 0s (leggasi: ZERO secondi).
:D

Adesso voglio migliorarlo ulteriormente aggiungendo caratteristiche come i wildcards nelle parole(*, ?, etc) come fa Lucene.
Inoltre la stringa di ricerca la passerò tramite file invece che dalla riga di comando.
Sto creando un piccolo interprete in modo che si possa specificare la ricerca in questo modo:


SELECT ROWS CONTAIN "Questa è la str? di ric*" WHERE ROWID > 89


:D

Ciao Vicius. Ciao Lucene. :bimbo:

P.S.: dando un'occhiata ai tuoi sorgenti mi sono accorto che hai furbescamente escluso i tempi per il parsing della stringa di ricerca. :D

Vincenzo1968
18-02-2013, 14:36
Altro esempio:


SELECT ROWS CONTAIN "stringa di ric*" WHERE ROWID > 89 AND ROWLENGTH >= 34

:D

Ma, Vicius, l'hai capito che sto utilizzando l'hashing su file per l'indice? La complessità è O(1). :D

VICIUS
18-02-2013, 14:42
Adesso voglio migliorarlo ulteriormente aggiungendo caratteristiche come i wildcards nelle parole(*, ?, etc) come fa Lucene.
Tutto qui?
Quando ti arriva il libro su lucene comincia a studiare. Poi ne riparliamo

P.S.: dando un'occhiata ai tuoi sorgenti mi sono accorto che hai furbescamente escluso i tempi per il parsing della stringa di ricerca. :D
"Furbescamente" :rolleyes:

Il parsing della query non fa parte della ricerca. Sono due cose distinte. Se vuoi sposta pure lo "start" ma non vedo come possa qualche ciclo di clock in più cambiare i tempi. Stiamo parlando di leggere stringhe di pochi byte e di creare un paio di oggetti.

Vincenzo1968
18-02-2013, 15:01
Tutto qui?
Quando ti arriva il libro su lucene comincia a studiare. Poi ne riparliamo


"Furbescamente" :rolleyes:

Il parsing della query non fa parte della ricerca. Sono due cose distinte. Se vuoi sposta pure lo "start" ma non vedo come possa qualche ciclo di clock in più cambiare i tempi. Stiamo parlando di leggere stringhe di pochi byte e di creare un paio di oggetti.

No, non tutto qui. Implementerò tutte le caratteristiche avenzate di programmi come Lucene e simili.
Il libro m'è arrivato ma non l'ho ancora letto.
Intanto non potresti illustrarla tu, qui, qualche caratteristica avanzata? Non dico con esempi di codice, anche così, a parole.
È, per esempio, dotato Lucene di un proprio linguaggio SQL-like come quello che sto implementando per il mio programma?

Explain, please.

EDIT: che poi, "tutto qui"? I tempi per creare l'indice sono 10 minuti contro 23. Ti sembra poco? :D

Vincenzo1968
18-02-2013, 15:13
E considera che ancora non gli faccio escudere le parole listate da Banryu. I tempi per la creazione dell'indice dovrebbero ulteriormente calare. :D

Vincenzo1968
18-02-2013, 15:42
Vicius, look here:

http://img845.imageshack.us/img845/3541/viciuslookhere.jpg

;)

shinya
18-02-2013, 15:52
EDIT: che poi, "tutto qui"? I tempi per creare l'indice sono 10 minuti contro 23. Ti sembra poco? :D
Secondo me stai confrontanto le mele con le pere. Così a naso.

Vincenzo1968
18-02-2013, 16:11
Secondo me stai confrontanto le mele con le pere. Così a naso.

Se ti riferisci al fatto che Lucene implementa un indice più funzionale perché fornisce caratteristiche avanzate che il mio programma, per il momento, non ha, può essere. Io intanto sto cominciando a leggere il libro. Se qualcuno di voi, nel frattempo, volesse illustrare queste caratteristiche avanzate, penso che farebbe cosa gradita a tutti quanti.

;)

Vincenzo1968
18-02-2013, 16:53
Occhio!:

http://lucene.apache.org/core/old_versioned_docs/versions/3_0_1/fileformats.html

Vincenzo1968
18-02-2013, 17:24
Occhio! È disponibile il pdf del Manning:

http://nlp.stanford.edu/IR-book/iir.jpg

http://nlp.stanford.edu/IR-book/

http://nlp.stanford.edu/IR-book/newslides.html

Vincenzo1968
18-02-2013, 22:43
Non ho capito perché Lucene non consenta di usare i wildcard all'inizio della parola. Se voglio cercare tutte le parole che terminano in "aio"?


*aio


notaio, calzolaio, etc.

Quindi il mio programma è superiore a Lucene, al momento, per:

1) Prestazioni.
2) Uso dei wildcard.

Ciao.

GByTe87
19-02-2013, 08:14
Non ho capito perché Lucene non consenta di usare i wildcard all'inizio della parola. Se voglio cercare tutte le parole che terminano in "aio"?


*aio


Questioni di efficienza. Una wildcard iniziale ti uccide un inverted index.

La soluzione esiste (in Solr sicuramente, non so se è utilizzata già da Lucene): indicizzare anche al contrario.

Vincenzo1968
19-02-2013, 09:34
Questioni di efficienza. Una wildcard iniziale ti uccide un inverted index.

La soluzione esiste (in Solr sicuramente, non so se è utilizzata già da Lucene): indicizzare anche al contrario.

Lucene, leggevo nella documentazione, non consente i wildcard nel carattere iniziale.

Io indicizzo, in un file a parte, le ultime tre lettere di ogni parola. Ma forse non ne vale la pena. Togliendo 'sta cosa potrei risparmiare spazio e tempo nella creazione dell'indice.
Eventualmente faccio una ricerca sequenziale, tanto il programma con automa impiega 30 secondi su un file da 5 GiB.
Si si , quasi quasi la tolgo.

VICIUS
19-02-2013, 09:42
Ma, Vicius, l'hai capito che sto utilizzando l'hashing su file per l'indice? La complessità è O(1). :D
Io si. Ora mi chiedo se tu hai capito che:

O(1) non implica che l'algoritmo che hai usato sia automaticamente migliore di tutto il resto. Ti dice piuttosto che nel caso peggiore la soluzione non dipende dalla dimensione dell'input. Cavolo non significa nemmeno che debba essere costante!

Usare una hashmap in questo caso specifico è probabilmente una pessima scelta. Prima di tutto hai bisogno di una ottima funzione di hashing che riesca a distribuire bene le parole. Se usi qualcosa tipo md5 o sha1 ci riesci ma hai sicuramente perso in prestazioni. Calcolare l'hash di una stringa con algoritmi di quel tipo è molto più dispendioso che navigare un normale albero. Se ti sei fatto qualcosa in casa più semplice non hai problemi di prestazioni ma di sicuro ci saranno dei bucket in cui finiranno la maggior parte degli elementi e, nel caso peggiore, la tua hashmap O(1) diventa una linked list O(n). Se i dati arrivassero da utenti tramite web dovresti stare molto attento perché creare un ddos sfruttando le collisioni del algoritmo di hashing sarebbe molto facile.

Non ho capito perché Lucene non consenta di usare i wildcard all'inizio della parola. Se voglio cercare tutte le parole che terminano in "aio"?
Lucene supporta questo tipo di query ma il queryparser standard non ti permette di crearle perché sono molto più lente. Se te lo configuri da solo puoi superare questo limite ma devi tenere in conto che ci saranno pesanti penalizzazioni quando una query contiene uno di questi termini di ricerca.

Vincenzo1968
19-02-2013, 10:14
Io si. Ora mi chiedo se tu hai capito che:

O(1) non implica che l'algoritmo che hai usato sia automaticamente migliore di tutto il resto. Ti dice piuttosto che nel caso peggiore la soluzione non dipende dalla dimensione dell'input. Cavolo non significa nemmeno che debba essere costante!

Usare una hashmap in questo caso specifico è probabilmente una pessima scelta. Prima di tutto hai bisogno di una ottima funzione di hashing che riesca a distribuire bene le parole. Se usi qualcosa tipo md5 o sha1 ci riesci ma hai sicuramente perso in prestazioni. Calcolare l'hash di una stringa con algoritmi di quel tipo è molto più dispendioso che navigare un normale albero. Se ti sei fatto qualcosa in casa più semplice non hai problemi di prestazioni ma di sicuro ci saranno dei bucket in cui finiranno la maggior parte degli elementi e, nel caso peggiore, la tua hashmap O(1) diventa una linked list O(n). Se i dati arrivassero da utenti tramite web dovresti stare molto attento perché creare un ddos sfruttando le collisioni del algoritmo di hashing sarebbe molto facile.

Per il ddos non c'è problema. La mia applicazioncina lavora in locale, non voglio sviluppare un motore di ricerca per il web. E comunque avevo tenuto in considerazione il fatto che l'hashing può degenerare in una linked list. Ho controllato. Con la funzione che uso pochissime sono le collisioni. E in questo caso le pagine di overflow non vanno mai oltre le tre. E dunque: O(1).
Secondo me potrei annullare del tutto le collisioni comprimendo i dati(mi pare di ricordare, dall'articolo che postò Banryu in un altro thread, che Lucene già lo faccia).
Comunque voglio provare anche altre soluzioni(B+Tree); vediamo se le prestazioni non scacano troppo.


Lucene supporta questo tipo di query ma il queryparser standard non ti permette di crearle perché sono molto più lente. Se te lo configuri da solo puoi superare questo limite ma devi tenere in conto che ci saranno pesanti penalizzazioni quando una query contiene uno di questi termini di ricerca.
Non se indicizzi separatamente, come dicevamo prima, le parole tramite le ultime lettere. Ma forse, ripeto, non ne vale la pena.

Vincenzo1968
19-02-2013, 13:28
Ecco le feature della mia applicazioncina finale(come indicate da Baeza-Yates per ogni buon search engine):

-------------------------------------------------------------------------

Storage: Indicates the way the indexer stores the index, either using a
database engine or simple file structure (e.g. an inverted index).

Incremental Index: Indicates if the indexer is capable of adding files to an
existent index without the need of regenerating the whole index.

Results Template: Some engines give the possibility to use a template for
parsing the results of a query.

Stop words: Indicates if the indexer can use a list of words used as stop
words in order to discard too frequent terms.

Filetype: The types of files the indexer is capable of parsing. The common
filetype of the engines analyzed was HTML.

Stemming: If the indexer/searcher is capable of doing stemming operations
over the words.

Fuzzy Search: Ability of solving queries in a fuzzy way, i.e. not necessarily
matching the query exactly.

Sort: Ability to sort the results by several criteria.
Ranking Indicates if the engine gives the results based on a ranking function.

Search Type: The type of searches it is capable of doing, and whether it
accepts query operators.

Indexer Language: The programming language used to implement the
indexer. This information is useful in order to extend the functionalities or
integrate it into an existent platform.

-------------------------------------------------------------------------

Comunque più tardi(o domani) posto una prima versione semplificata.

Vincenzo1968
19-02-2013, 13:46
Prontamente ordinato! :O

http://ww2.cs.mu.oz.au/~alistair/mg/

http://ww2.cs.mu.oz.au/~alistair/mg/witten.jpg

Paragrafo 3.3: Inverted file compression

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
19-02-2013, 15:11
http://swish-e.org/index.html

http://img69.imageshack.us/img69/3996/swishe.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
19-02-2013, 15:56
Swish-e impiega 8 minuti e mezzo per indicizzare un file di soli 250 MB:

http://img15.imageshack.us/img15/843/swishtempi250mb.jpg

:mbe:

Vincenzo1968
19-02-2013, 16:06
http://img29.imageshack.us/img29/8426/swishnotaio.jpg

Mah!

Vincenzo1968
19-02-2013, 21:52
Ho messo i binari della versione 0.1.0 su github:

https://github.com/hwupgradecontest/contest19/tree/master/Vincenzo1968/Binary

http://img822.imageshack.us/img822/7302/vlcindex010.jpg

Per il momento solo i binari. Quando l'applicazione sarà completa metterò anche i sorgenti.

Vincenzo1968
20-02-2013, 15:55
Allucinante! Poco fa il capo m'ha detto che un cliente ha chiesto di sviluppare un'applicazione simile a quella che sto facendo qui.

Ma si tratta di indicizzare file con una loro particolare struttura, diversa dai normali file di testo o dai formati più diffusi(html, xml, etc).

:D

wingman87
20-02-2013, 19:46
Stavo pensando che riguardo alla questione dell'hashing c'è da dire che, sebbene vasto, il numero di vocaboli di ogni lingua è comunque limitato. Facendo una ricerca trovo valori discordanti ma per l'italiano dovrebbero comunque essere meno di 400.000, quante collisioni possono verificarsi su un set così limitato? La risposta dipende dall'algoritmo di hashing, però tenendo queste cifre a mente si potrebbe arrivare a una buona soluzione impattando al minimo sulle prestazioni.

WarDuck
20-02-2013, 20:41
Allucinante! Poco fa il capo m'ha detto che un cliente ha chiesto di sviluppare un'applicazione simile a quella che sto facendo qui.

Ma si tratta di indicizzare file con una loro particolare struttura, diversa dai normali file di testo o dai formati più diffusi(html, xml, etc).

:D

Il mio pensiero, visto il tempo e le energie che ci stai dedicando, è che in realtà hai aperto questo contest perché è una cosa che ti serviva per lavoro, altrimenti non si spiega dove trovi il tempo :asd:

WarDuck
20-02-2013, 20:43
Stavo pensando che riguardo alla questione dell'hashing c'è da dire che, sebbene vasto, il numero di vocaboli di ogni lingua è comunque limitato. Facendo una ricerca trovo valori discordanti ma per l'italiano dovrebbero comunque essere meno di 400.000, quante collisioni possono verificarsi su un set così limitato? La risposta dipende dall'algoritmo di hashing, però tenendo queste cifre a mente si potrebbe arrivare a una buona soluzione impattando al minimo sulle prestazioni.

Le collisioni dipendono dal numero di bit che usi, ed è tutto spiegato dal paradosso del compleanno (http://it.wikipedia.org/wiki/Paradosso_del_compleanno).

Comunque le collisioni le risolvi nei modi più variegati... uno carino è ricorrere al D-Left hashing (una estensione del 2-left hashing).

Vincenzo1968
20-02-2013, 22:14
Il mio pensiero, visto il tempo e le energie che ci stai dedicando, è che in realtà hai aperto questo contest perché è una cosa che ti serviva per lavoro, altrimenti non si spiega dove trovi il tempo :asd:

Eh già! Avevo bisogno del tuo aiuto per risolvere i miei problemi di lavoro. Visto i consigli che dai, tipo quello di utilizzare strstr per il punto B.2, cosa che peggiora di molto le prestazioni rispetto all'automa, sarebbe proprio una cosa intelligente da fare. Minchia! si si, hai capito tutto, sei un genio.

Ohé m'avete stufato. A quanto pare interessa a pochi discutere di algoritmi. Per qualcuno di voi il problem solving è utilizzare meno codice possibile e quanta più pappa pronta possibile.

E dunque: adieu e cavoli vostri(cit.).

shinya
21-02-2013, 08:01
Eh già! Avevo bisogno del tuo aiuto per risolvere i miei problemi di lavoro. Visto i consigli che dai, tipo quello di utilizzare strstr per il punto B.2, cosa che peggiora di molto le prestazioni rispetto all'automa, sarebbe proprio una cosa intelligente da fare. Minchia! si si, hai capito tutto, sei un genio.
Secondo me devi stare più calmo e viverla più serenamente...

Ohé m'avete stufato. A quanto pare interessa a pochi discutere di algoritmi. Per qualcuno di voi il problem solving è utilizzare meno codice possibile e quanta più pappa pronta possibile.

E dunque: adieu e cavoli vostri(cit.).
Forse perché è un problema noioso? Forse perché è già risolto? Forse perché Lucene non c'entra un cazzo perché è un sistema pensato per uno spettro di utilizzi infitamente più ampio e deve pensare a scenari molto diversi tra loro (tipo il problema potenziale del dos evidenziato da vicius)? Forse perché non si capisce quale sia lo scopo dato che aggiungi variazioni sul tema ogni 5 messaggi? Forse perché un "contest" che si risolve SOLO sulla misurazione dei tempi di esecuzione è una palla disumana?? Boh... non so!

Però adesso non te la prendere eh...

EDIT: prima che tu dice "Allora proponilo tu un contest!!", l'ho già fatto, ma forse te lo sei perso: http://www.hwupgrade.it/forum/showthread.php?t=2465013

VICIUS
21-02-2013, 08:07
Per qualcuno di voi il problem solving è utilizzare meno codice possibile e quanta più pappa pronta possibile.
In sostanza si. Questo è quello che fa un ottimo programmatore. Perdere tempo a risolvere problemi che già altri hanno affrontato e risolto con successo è da idioti. Farlo nel tempo libero per crescita personale è una cosa. Ma perdere tempo quando si lavora non è una cosa accettabile.

VICIUS
21-02-2013, 08:14
Stavo pensando che riguardo alla questione dell'hashing c'è da dire che, sebbene vasto, il numero di vocaboli di ogni lingua è comunque limitato. Facendo una ricerca trovo valori discordanti ma per l'italiano dovrebbero comunque essere meno di 400.000, quante collisioni possono verificarsi su un set così limitato? La risposta dipende dall'algoritmo di hashing, però tenendo queste cifre a mente si potrebbe arrivare a una buona soluzione impattando al minimo sulle prestazioni.

Non pensavo a parole italiane valide ma a qualcosa di generato di proposito da un utente con l'intenzione di far saltare il sistema. Se per esempio scopro che aggiungo una 'o' alle parole che finiscono con 'a' ottengo lo stesso hash e magari che aggiungendo una 'z' subito dopo a queste parole ottengo ancora lo stesso hash e così via. Posso cominciare a generare centinaia di migliaia di parole che sono si senza senso ma hanno lo stesso hash. Il sistema non avendo un dizionario su cui controllare se una parola è valida o meno finirebbe per crollare sotto il peso delle richieste.

Vincenzo1968
21-02-2013, 10:10
In sostanza si. Questo è quello che fa un ottimo programmatore. Perdere tempo a risolvere problemi che già altri hanno affrontato e risolto con successo è da idioti. Farlo nel tempo libero per crescita personale è una cosa. Ma perdere tempo quando si lavora non è una cosa accettabile.

Tu quoque, Brute, fili mi! Pure tu, Vicius, che mi stai simpatico...

Non nego che la pappa pronta sia una cosa buona(anzi eccellente) quando uno deve realizzare un programma in tempi stretti.
Ma, un utente, in un altro thread: "spesso scrivo cose che non capisco". Ti rendi conto?

Per me non è una perdita di tempo. Io mi dedico alla scrittura del codice principalmente la sera. Ma in ufficio, quando ho del tempo libero, il mio "capo" non ha niente in contrario. L'avevo scritto nell'altro thread, quello che ha dato il via a questo contest. Perciò, cortesemente, non fatemi passare per un idiota che perde tempo durante le ore di lavoro.

Qualche pagina fa avevi scritto di fischiare quando i tempi si fossero avvicinati a quelli di Lucene. Non avevi scritto di fischiare quando l'applicazione avesse avuto tutte le caratteristiche e funzionalità di Lucene.
Ebbene, i miei tempi sono 0: ZERO! Zero secondi tutto compreso: Caricamento indice, parsing query e ricerca. E dunque fischio: fiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.

Look, Vicius, look here:
http://img845.imageshack.us/img845/3541/viciuslookhere.jpg

Inoltre che male c'è a voler implementare una propria versione? Esiste Lucene e dunque "è da idioti" voler provare a fare di meglio? Per me non è cosi.
Io quando la mia applicazioncina sarà pronta, la renderò disponibile in un sito dedicato. Sarà una libreria condivisa disponibile per quei linguaggi(praticamente tutti) di programmazione in grado di interfacciarsi con una dll/so scritta in C.
Non solo avrà tutte le caratteristiche avanzate di Lucene, come l'indicizzazione incrementale su più documenti, ma sarà(già è) molto piu prestante, soprattutto in fase di creazione dell'indice.

;)

Vincenzo1968
21-02-2013, 10:48
Secondo me devi stare più calmo e viverla più serenamente...


Forse perché è un problema noioso? Forse perché è già risolto? Forse perché Lucene non c'entra un cazzo perché è un sistema pensato per uno spettro di utilizzi infitamente più ampio e deve pensare a scenari molto diversi tra loro (tipo il problema potenziale del dos evidenziato da vicius)? Forse perché non si capisce quale sia lo scopo dato che aggiungi variazioni sul tema ogni 5 messaggi? Forse perché un "contest" che si risolve SOLO sulla misurazione dei tempi di esecuzione è una palla disumana?? Boh... non so!

Però adesso non te la prendere eh...

EDIT: prima che tu dice "Allora proponilo tu un contest!!", l'ho già fatto, ma forse te lo sei perso: http://www.hwupgrade.it/forum/showthread.php?t=2465013

Ti avevo chiesto in precedenza di indicare cortesemente quali sono questi spettri di utilizzo e questi scenari infinitamente più ampi di cui parli.
Penso che sia nell'interesse generale.

Per quanto riguarda "Forse perché un "contest" che si risolve SOLO sulla misurazione dei tempi di esecuzione è una palla disumana?", avrei avuto il piacere di rispondere e illustrare il mio algoritmo-metodo. Ma non l'ha chiesto nessuno. Solo Banryu, via pm.

Io ogni caso qui i tempi contano. Non mi vorrai far credere che 10 minuti non sono meglio di 23.

Allora, vuoi cortesemente indicare gli "ampi spettri", gli "scenari infinitamente più ampi"?
O magari non lo sai, non conosci affatto Lucene, e parli così, tanto per polemizzare?

Vincenzo1968
21-02-2013, 11:08
Mi autoquoto:


Ecco le feature della mia applicazioncina finale(come indicate da Baeza-Yates per ogni buon search engine):

-------------------------------------------------------------------------

Storage: Indicates the way the indexer stores the index, either using a
database engine or simple file structure (e.g. an inverted index).

Incremental Index: Indicates if the indexer is capable of adding files to an
existent index without the need of regenerating the whole index.

Results Template: Some engines give the possibility to use a template for
parsing the results of a query.

Stop words: Indicates if the indexer can use a list of words used as stop
words in order to discard too frequent terms.

Filetype: The types of files the indexer is capable of parsing. The common
filetype of the engines analyzed was HTML.

Stemming: If the indexer/searcher is capable of doing stemming operations
over the words.

Fuzzy Search: Ability of solving queries in a fuzzy way, i.e. not necessarily
matching the query exactly.

Sort: Ability to sort the results by several criteria.
Ranking Indicates if the engine gives the results based on a ranking function.

Search Type: The type of searches it is capable of doing, and whether it
accepts query operators.

Indexer Language: The programming language used to implement the
indexer. This information is useful in order to extend the functionalities or
integrate it into an existent platform.

-------------------------------------------------------------------------

Comunque più tardi(o domani) posto una prima versione semplificata.


Quelle sopra sono le caratteristiche che avrà la mia versione finale. Si può sapere cosa farebbe Lucene(Lucene, eh, non Solr) in più?

cerbert
21-02-2013, 11:35
Eh già! Avevo bisogno del tuo aiuto per risolvere i miei problemi di lavoro. Visto i consigli che dai, tipo quello di utilizzare strstr per il punto B.2, cosa che peggiora di molto le prestazioni rispetto all'automa, sarebbe proprio una cosa intelligente da fare. Minchia! si si, hai capito tutto, sei un genio.

Ohé m'avete stufato. A quanto pare interessa a pochi discutere di algoritmi. Per qualcuno di voi il problem solving è utilizzare meno codice possibile e quanta più pappa pronta possibile.

E dunque: adieu e cavoli vostri(cit.).

Secondo me devi stare più calmo e viverla più serenamente...


Forse perché è un problema noioso? Forse perché è già risolto? Forse perché Lucene non c'entra un cazzo perché è un sistema pensato per uno spettro di utilizzi infitamente più ampio e deve pensare a scenari molto diversi tra loro (tipo il problema potenziale del dos evidenziato da vicius)? Forse perché non si capisce quale sia lo scopo dato che aggiungi variazioni sul tema ogni 5 messaggi? Forse perché un "contest" che si risolve SOLO sulla misurazione dei tempi di esecuzione è una palla disumana?? Boh... non so!

Però adesso non te la prendere eh...

EDIT: prima che tu dice "Allora proponilo tu un contest!!", l'ho già fatto, ma forse te lo sei perso: http://www.hwupgrade.it/forum/showthread.php?t=2465013


Signori, quando cominciano a saltare fuori pure utenze fatte apposta per insultare, direi che è evidente che si è passato il segno.
Consiglio a tutti una bella calmatona e di ripassare il vecchio adagio: "nessuno è obbligato a seguire thread che non gli interessano"

Vincenzo1968
21-02-2013, 11:42
E nel primo mese Ilvio ci restituirà l'IMU, nel secondo condonerà i nostri peccati ed il terzo mese annullerà lo Spread sconfiggendo l'intera Germania con una sola mano. All'Italia manca tutto, tranne la comicità.

:asd:

VICIUS
21-02-2013, 11:52
Tu quoque, Brute, fili mi! Pure tu, Vicius, che mi stai simpatico...

Non nego che la pappa pronta sia una cosa buona(anzi eccellente) quando uno deve realizzare un programma in tempi stretti.
Ma, un utente, in un altro thread: "spesso scrivo cose che non capisco". Ti rendi conto?
E questo come è collegato alla "pappa pronta"? Se quell'utente non capisce cosa scrive significa che non conosce bene il sistema, linguaggio, libreria o framework che sta usando. Si tratta di semplice mancanza di esperienza con un certo strumento.
Per me non è una perdita di tempo. Io mi dedico alla scrittura del codice principalmente la sera. Ma in ufficio, quando ho del tempo libero, il mio "capo" non ha niente in contrario. L'avevo scritto nell'altro thread, quello che ha dato il via a questo contest. Perciò, cortesemente, non fatemi passare per un idiota che perde tempo durante le ore di lavoro.
Prima di tutto lasciami dire che non volevo attaccarti personalmente dandoti del idiota. Provo ad elaborare di più quanto volevo dire prima.

Se sei un hobbista e lo fai come passatempo oppure come studente per imparare un certo argomento non ho nulla in contrario. Anzi saresti da premiare per l'impegno e la passione.

Se però parliamo di lavoro la questione cambia. Programmare significa risolvere problemi e se vuoi mangiarci con questo lavoro devi essere efficiente perché altrimenti non ti rimane niente in tasca. Il riutilizzo del codice, o "la pappa pronta" come la chiami te, è alla base del mestiere. Se per un problema esiste già una soluzione eccellente, lo sai, ma parti a testa bassa a riscrivere tutto da zero significa che non sai fare il tuo lavoro.
Qualche pagina fa avevi scritto di fischiare quando i tempi si fossero avvicinati a quelli di Lucene. Non avevi scritto di fischiare quando l'applicazione avesse avuto tutte le caratteristiche e funzionalità di Lucene.
Ebbene, i miei tempi sono 0: ZERO! Zero secondi tutto compreso: Caricamento indice, parsing query e ricerca. E dunque fischio: fiuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.

Look, Vicius, look here:

Bravo. Se avrò tempo finirò il mio esperimento poi lo posto.
Inoltre che male c'è a voler implementare una propria versione? Esiste Lucene e dunque "è da idioti" voler provare a fare di meglio? Per me non è cosi.
Io quando la mia applicazioncina sarà pronta, la renderò disponibile in un sito dedicato. Sarà una libreria condivisa disponibile per quei linguaggi(praticamente tutti) di programmazione in grado di interfacciarsi con una dll/so scritta in C.
Non solo avrà tutte le caratteristiche avanzate di Lucene, come l'indicizzazione incrementale su più documenti, ma sarà(già è) molto piu prestante, soprattutto in fase di creazione dell'indice.

;)
Se parliamo di lavoro c'è di male che il costo di una soluzione come questa non è giustificabile dai benefici. Se eri un mio dipendente e mi suggerivi di partire da zero quando c'è disponibile solr ti avrei cacciato a pedate. E mi tenevo pure il tuo tfr. :O

WarDuck
21-02-2013, 11:58
Eh già! Avevo bisogno del tuo aiuto per risolvere i miei problemi di lavoro. Visto i consigli che dai, tipo quello di utilizzare strstr per il punto B.2, cosa che peggiora di molto le prestazioni rispetto all'automa, sarebbe proprio una cosa intelligente da fare. Minchia! si si, hai capito tutto, sei un genio.

Ohé m'avete stufato. A quanto pare interessa a pochi discutere di algoritmi. Per qualcuno di voi il problem solving è utilizzare meno codice possibile e quanta più pappa pronta possibile.

E dunque: adieu e cavoli vostri(cit.).

Stai facendo tutto da solo, la mia era una battuta :asd: .

E comunque tanto per la cronaca, ti avevo detto di usare strstr (che a seconda delle implementazioni può usare o meno il Boyer-More-Horspool) per fare una prova, è chiaro che non voleva essere la soluzione finale :rolleyes: .

Anche perché se volevo semplificarmi ulteriormente la vita, non avrei usato C/C++, ma un linguaggio di più alto livello.

Vincenzo1968
21-02-2013, 12:08
E questo come è collegato alla "pappa pronta"? Se quell'utente non capisce cosa scrive significa che non conosce bene il sistema, linguaggio, libreria o framework che sta usando. Si tratta di semplice mancanza di esperienza con un certo strumento.

Prima di tutto lasciami dire che non volevo attaccarti personalmente dandoti del idiota. Provo ad elaborare di più quanto volevo dire prima.

Se sei un hobbista e lo fai come passatempo oppure come studente per imparare un certo argomento non ho nulla in contrario. Anzi saresti da premiare per l'impegno e la passione.

Se però parliamo di lavoro la questione cambia. Programmare significa risolvere problemi e se vuoi mangiarci con questo lavoro devi essere efficiente perché altrimenti non ti rimane niente in tasca. Il riutilizzo del codice, o "la pappa pronta" come la chiami te, è alla base del mestiere. Se per un problema esiste già una soluzione eccellente, lo sai, ma parti a testa bassa a riscrivere tutto da zero significa che non sai fare il tuo lavoro.

Bravo. Se avrò tempo finirò il mio esperimento poi lo posto.

Se parliamo di lavoro c'è di male che il costo di una soluzione come questa non è giustificabile dai benefici. Se eri un mio dipendente e mi suggerivi di partire da zero quando c'è disponibile solr ti avrei cacciato a pedate. E mi tenevo pure il tuo tfr. :O

Ma quale lavoro? Che nel frattempo si sia presentato un cliente con una richiesta per un programma simile a quello che sto scrivendo è soltanto una coincidenza. Ho scritto infatti: allucinante!

Poi valuteremo se per il programma richiesto dal cliente è il caso di utilizzare Lucene o un adattamento del programma che sto scrivendo io. Si tratta di file di testo si, .txt, ma con una struttura particolare. Lucene può essere adattato per gestire file che non siano .txt, .html, .xml, etc?
È una domanda eh, davvero non lo so. Te l'ho detto, il libro m'è arrivato ma non ho ancora cominciato a leggerlo.

Non è per lavoro. Così come per tutti i contest precedenti è solo per curiosità, per la voglia di scoprire cosa c'è sotto la pappa pronta. E se mi esce qualcosa di carino, la metto in un sito dedicato come software open source.

Tutto qui.

;)

Vincenzo1968
21-02-2013, 12:11
Stai facendo tutto da solo, la mia era una battuta :asd: .

E comunque tanto per la cronaca, ti avevo detto di usare strstr (che a seconda delle implementazioni può usare o meno il Boyer-More-Horspool) per fare una prova, è chiaro che non voleva essere la soluzione finale :rolleyes: .

Anche perché se volevo semplificarmi ulteriormente la vita, non avrei usato C/C++, ma un linguaggio di più alto livello.

A me è sembrata piuttosto acida come battuta(col sottinteso che avrei aperto questo contest per risolvere i miei problemi di lavoro). Poi, se mi sono sbagliato, ti chiedo scusa.

Vincenzo1968
21-02-2013, 12:39
Domanda:

a proposito di Indexer Language Lucene com'è combinato? Ho visto che ha gli operatori AND e OR; ma si limita a questo o fornisce un vero e proprio linguaggio di query?

No perché stavo pensando, per la mia applicazione, di fare qualcosa di simile:


myIndex --queryfile=myQueryFile.txt


Si passerà un solo parametro dalla riga di comando: il nome di un file di testo.
Il file in questione conterrà un linguaggetto per specificare i vari parametri: query, quale indice utilizzare, etc.

Per esempio:


USE INDEX myIndex;

SELECT ROWSID WHERE ROW CONTAIN "questa è la stringa da ricercare" AND (ROWID >= 55 OR ROWLENGTH > 89);


o, per creare l'indice:


CREATE INDEX myIndex ON nome;


dove 'nome' sta per il nome di una directory contenente i file da indicizzare o il nome di un singolo file.

Lucene?

EDIT: 'nome' potrebbe indicare anche il nome di un ulteriore file di testo contenente quali file indicizzare all'interno della directory. Eventualmente anche con espressioni regolari tipo *.txt, *.html.
Si si, penso proprio che implementerò anche 'sta cosa qui. ;)

ARIEDIT: e quindi i comandi sarebbero:

per indicizzare tutti i file all'interno di una directory:

CREATE INDEX myIndex ON nomedir[|nomefile];


Per indicizzare tramite file/regexp:

CREATE INDEX myIndex ON FILE-SPECS="nomeFileSpecs.txt";

shinya
21-02-2013, 13:08
Signori, quando cominciano a saltare fuori pure utenze fatte apposta per insultare, direi che è evidente che si è passato il segno.
Consiglio a tutti una bella calmatona e di ripassare il vecchio adagio: "nessuno è obbligato a seguire thread che non gli interessano"
No va beh, se ti riferivi al mio messaggio, mi sa che c'è un grosso malinteso. Non mi interessa offendere nessuno. Né mi interessa denigrare il lavoro di altri. Proprio non me ne frega niente.
Stavo solo elencando una serie di considerazioni in modo sardonico perché Vincenzo si stava lamentando che a nessuno interessa il problem solving...

@Vincenzo: io non sono un esperto di Lucene, ma tanto per dire un paio: per quanto ne so Lucene è pensato per cercare un termine in una serie di file eterogenei (txt, pdf, ecc...), non tutte le occorrenze di un termine in un file. E' uno sforzo di decine di persone, ed è un progetto che dura da anni. E tu lo stai confrontando con un progetto che ancora non c'è, perché le feature che hai elencato sono di un programma immaginario.

Lungi da me demolire il lavoro di altri. Fai benissimo a fare quello che fai, ma:
A) non è più un contest e
B) uscirsene con "ciaociao lucene!" col tuo programmino, ed esaltarsi deridendo il concorrente mi sembra quando meno prematuro, se non poco professionale.

Vincenzo1968
21-02-2013, 13:14
Shinya, Cerbert non si riferiva al tuo messaggio. Era stato postato un messaggio(cancellato da Cerbert) nel quale mi si definiva ragionierucolo da parte di un nuovo utente(messaggi: 1).

Vincenzo1968
21-02-2013, 13:19
... Vincenzo si stava lamentando che a nessuno interessa il problem solving...

@Vincenzo: io non sono un esperto di Lucene, ma tanto per dire un paio: per quanto ne so Lucene è pensato per cercare un termine in una serie di file eterogenei (txt, pdf, ecc...), non tutte le occorrenze di un termine in un file. E' uno sforzo di decine di persone, ed è un progetto che dura da anni. E tu lo stai confrontando con un progetto che ancora non c'è, perché le feature che hai elencato sono di un programma immaginario.

Lungi da me demolire il lavoro di altri. Fai benissimo a fare quello che fai, ma:
A) non è più un contest e
B) uscirsene con "ciaociao lucene!" col tuo programmino, ed esaltarsi deridendo il concorrente mi sembra quando meno prematuro, se non poco professionale.

No no, non mi lamento che a nessuno interessi. Interessa eccome: lo dimostra il numero di visite di questo thread, oltre le dodicimila. Mi lamento del fatto che si parli poco degli algoritmi. Ogni volta che qualcuno posta una soluzione, sembra si sia solo interessati a vedere se batte nei tempi le soluzioni altrui.

Anche la mia versione alla fine farà ricerche su una serie di file eterogenei. Per il momento sono solo alla versione 0.1. Dammi il tempo di arrivare alla versione 1.0 ;)

"ciao ciao Lucene" è un modo affettuoso per prendere un po' in giro(ma amichevolmente, ma affettuosamente) Vicius che, ripeto, mi sta simpatico(anche il nomignolo Vicius-Lucene serve a questo).

;)

Vincenzo1968
21-02-2013, 13:30
@Vincenzo: io non sono un esperto di Lucene, ma tanto per dire un paio: per quanto ne so Lucene è pensato per cercare un termine in una serie di file eterogenei (txt, pdf, ecc...), non tutte le occorrenze di un termine in un file. E' uno sforzo di decine di persone, ed è un progetto che dura da anni. E tu lo stai confrontando con un progetto che ancora non c'è, perché le feature che hai elencato sono di un programma immaginario.


Alla fine la versione sarà open source e chiunque potrà scaricare i sorgenti e proporre migliorìe al programma-libreria(magari utilizzeremo github). Chissà che non venga fuori qualcosa di carino con una bella community di sviluppatori. Forse sto solo sognando, ma perché no?

Vincenzo1968
21-02-2013, 16:14
...
@Vincenzo: io non sono un esperto di Lucene, ma tanto per dire un paio: per quanto ne so Lucene è pensato per cercare un termine in una serie di file eterogenei (txt, pdf, ecc...), non tutte le occorrenze di un termine in un file. E' uno sforzo di decine di persone, ed è un progetto che dura da anni. E tu lo stai confrontando con un progetto che ancora non c'è, perché le feature che hai elencato sono di un programma immaginario.
...


Parsing? Tokenizations? Macché! Analysys! :rotfl:

http://img801.imageshack.us/img801/1109/luceneparsing.jpg
http://lucene.apache.org/core/4_1_0/core/org/apache/lucene/analysis/package-summary.html#package_description

Applications that build their search capabilities upon Lucene may support documents in various formats – HTML, XML, PDF, Word – just to name a few. Lucene does not care about the Parsing of these and other document formats, and it is the responsibility of the application using Lucene to use an appropriate Parser to convert the original format into plain text before passing that plain text to Lucene.


http://www.hwupgrade.org/public/style_emoticons/default/dumb.png

In quindici anni non si sono presi la briga di creare uno straccetto di classe per il parsing dei formati più comuni? html, pdf, xml, etc? :rotfl:

La mia libreria sarà provvista di questa feature. http://www.hwupgrade.org/public/style_emoticons/default/challenge.png

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

VICIUS
21-02-2013, 16:27
In quindici anni non si sono presi la briga di creare uno straccetto di classe per il parsing dei formati più comuni? html, pdf, xml, etc? :rotfl:
Non lo hanno fatto perché estrarre il contenuto dai documenti non è compito del motore di ricerca ;)

Giusto un paio di librerie a caso : apache poi, itext, jsoup, tika…

Vincenzo1968
21-02-2013, 16:34
Non lo hanno fatto perché estrarre il contenuto dai documenti non è compito del motore di ricerca ;)

Giusto un paio di librerie a caso : apache poi, itext, jsoup, tika…

Si si, tika, stika...

:mc:

Scherzo Viciussuzzo ;)

:D

Comunque si, non è compito del motore di ricerca ma io implementerò questa feature. Magari in una dll a parte. Tie' :tie:

Vincenzo1968
21-02-2013, 16:46
Stai facendo tutto da solo, la mia era una battuta :asd: .

E comunque tanto per la cronaca, ti avevo detto di usare strstr (che a seconda delle implementazioni può usare o meno il Boyer-More-Horspool) per fare una prova, è chiaro che non voleva essere la soluzione finale :rolleyes: .

Anche perché se volevo semplificarmi ulteriormente la vita, non avrei usato C/C++, ma un linguaggio di più alto livello.

C'è da dire, a tal proposito, che il pappaprontismo non sempre paga. Come amo ripetere spesso, a volte conviene scrivere un po' di codice in più e implementarsi gli algoritmi da soli, a mano.
Se avessi utilizzato strstr, nonostante l'uso di un algoritmo-pappapronta estremamente efficiente(Boyer-More-Horspool), non sarei stato in grado di asfaltare Vicius-Lucene.

:bimbo:

Vincenzo1968
21-02-2013, 18:32
http://lucene.apache.org/core/4_1_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description

Ah quindi Lucene non dispone di un linguaggio di query vero e proprio. Si limita ad alcune interessanti caratteristiche; interessanti ma limitate(rispetto a un linguaggio, dico):

Fields, Wildcard Searches, Regular Expression Searches, Fuzzy Searches, Proximity Searches, Range Searches, Boosting a Term, Boolean Operators, Grouping.

http://www.hwupgrade.org/public/style_emoticons/default/dumb.png

The_ouroboros
21-02-2013, 18:35
secondo me si è limitato in fase di progettazione, sono scelte.

P.S: trovo quelle faccine di un fastidioso che non ha idea :doh:

Vincenzo1968
21-02-2013, 18:55
secondo me si è limitato in fase di progettazione, sono scelte.


Vabbé che, come dice Vicius, non fanno strettamente parte di un motore di ricerca, ma, cacchio, potevano fornirle come add-on, no? Dopo quindici anni... uno se le deve implementare a mano o si deve andare a cercare delle librerie esterne: tika, stika...
La mia libreria sarà modularizzata. Il core, costituito dalle caratteristiche Lucene-Like, sarà piazzato in una dll/so indipendente. Cosicché se uno vuole fare una ricerca su file, diciamo, pdf, potrà utilizzare la libreria add-on fornita insieme al core; sennò ne utilizza un'altra o una scritta di propria mano.

;)

Vincenzo1968
21-02-2013, 19:56
Incredibile! Visual Studio 2012 ha fatto il miracolo!

Il mio programma impiega la metà del tempo(5 minuti contro 10) su Windows 8:

http://img43.imageshack.us/img43/9674/c19b01myindextempiwindo.jpg

:yeah: :winner: :yeah:

Nel punto A, s'era verificato il contrario: GCC/Linux risultava più veloce.

:D

kwb
21-02-2013, 20:42
Non nego che la pappa pronta sia una cosa buona(anzi eccellente) quando uno deve realizzare un programma in tempi stretti.
Ma, un utente, in un altro thread: "spesso scrivo cose che non capisco". Ti rendi conto?
Quell'utente ero probabilmente io.
Non sono un programmatore esperto, non studio programmazione ( purtroppo ) e non me ne occupo quotidianamente.
La pratico e la seguo solo per passione.
Quelle parole che ho scritto sono scaturite dal fatto che mi trovo ancora molto inesperto con Python ( ma anche Java, perchè no ) rispetto a quanto non lo sia con C.

Non è che se uso/userò linguaggi di alto livello sarà sempre così.. Anzi, spero proprio di no..

Se quell'utente non capisce cosa scrive significa che non conosce bene il sistema, linguaggio, libreria o framework che sta usando. Si tratta di semplice mancanza di esperienza con un certo strumento.

Esatto ;)

Vincenzo1968
21-02-2013, 21:59
Nel portatilino invece i tempi salgono a 16 minuti:

http://img580.imageshack.us/img580/9590/c19b01indextempiportati.jpg

Ho dato l'eseguibile a Banryu che lo testerà su Windows 7. ;)

Vincenzo1968
21-02-2013, 22:06
Quell'utente ero probabilmente io.
Non sono un programmatore esperto, non studio programmazione ( purtroppo ) e non me ne occupo quotidianamente.
La pratico e la seguo solo per passione.
Quelle parole che ho scritto sono scaturite dal fatto che mi trovo ancora molto inesperto con Python ( ma anche Java, perchè no ) rispetto a quanto non lo sia con C.

Non è che se uso/userò linguaggi di alto livello sarà sempre così.. Anzi, spero proprio di no..


Esatto ;)

No Kwb, non mi riferivo a te. Parlavo di un altro utente, di un'altra discussione.
Comunque voglio dire che, a parer mio, gli strumenti che offrono i linguaggi di altissimo livello(che io chiamo pappa pronta), sarebbe bene utilizzarli dopo che ci si è fatti le ossa con un linguaggio di basso livello. Prima implementi a mano algoritmi e strutture dati(stack, liste, alberi, dizionari, etc), ti ci rompi la testa, e solo dopo potrai utilizzare proficuamente la pappa pronta.
Altrimenti può capitare, com'è sfortunatamente capitato anche a te, di utilizzare strumenti e di non capire che cosa si stia facendo.

;)

Vincenzo1968
22-02-2013, 10:19
Ah quindi c'è anche MG4J sviluppata dalla nostra università di Milano e non m'avevate detto niente:

http://mg4j.dsi.unimi.it/

esterofili :rolleyes:

kwb
22-02-2013, 11:30
No Kwb, non mi riferivo a te. Parlavo di un altro utente, di un'altra discussione.
Comunque voglio dire che, a parer mio, gli strumenti che offrono i linguaggi di altissimo livello(che io chiamo pappa pronta), sarebbe bene utilizzarli dopo che ci si è fatti le ossa con un linguaggio di basso livello. Prima implementi a mano algoritmi e strutture dati(stack, liste, alberi, dizionari, etc), ti ci rompi la testa, e solo dopo potrai utilizzare proficuamente la pappa pronta.
Altrimenti può capitare, com'è sfortunatamente capitato anche a te, di utilizzare strumenti e di non capire che cosa si stia facendo.

;)
Beh come ho potuto osservare, ogni linguaggio ha il suo modo di essere scritto.
E lo stesso algoritmo può non essere sempre quello ottimale con molti linguaggi.

Non dico che imparare un nuovo linguaggio è come imparare una nuova lingua, ma ci sono pratiche che funzionano bene con alcuni linguaggi e altre pratiche no.
Ciò quindi indica che se un approccio va bene ( ed è il migliore che ci sia ) per un linguaggio a basso livello, non vuol dire che allora devo fare la stessa implementazione con il linguaggio di alto livello.

Ne è la dimostrazione l'approccio utilizzato da cdimauro per leggere il file in input con python: prendere le righe, processarle una ad una e solo al termine di tutto ciò analizzare il singolo carattere.
Venendo dal C, io ho all'inizio adottato il procedimento inverso: carattere, righe, file. E si è dimostrato difficile da fare e non una buona soluzione.

Quindi le pratiche di buona programmazione variano da linguaggio a linguaggio.
Avrei potuto implementare la cosa in Assembly 8086 ma lo stesso approccio avrebbe funzionato per C? Java? Python? Perl?

Non lo so.

Vincenzo1968
22-02-2013, 17:19
Kwb, non ne faccio una questione di linguaggio. Dico che, a parer mio, prima di passare a utilizzare i mezzi supersonici che offrono i vari linguaggi di altissimo livello, sarebbe bene che uno prendesse in mano un buon libro di algoritmi(chiedere a van9) e provasse a implementarli a mano(non solo gli algoritmi ma anche le strutture dati).
Puoi farlo anche in python non devi farlo necessariamente in C o Assembly.
Prova per esempio a implementare un dizionario senza utilizzare le librerie fornite da python, solo coi dati "grezzi" che il linguaggio ti mette a disposizione.
Solo così, alla fine, uno sarà in grado di utilizzare proficuamente la "pappa pronta".

In fondo, tutti quelli che qui maneggiano agevolmente le librerie dei linguaggi ad altissimo livello, hanno cominciato facendosi le ossa con linguaggi che di pappa pronta ne avevano ben poca. Cdimauro, per esempio, se non erro, se non ricordo male, ha cominciato con Pascal e C(e QuickBasic?). Anche perché, all'epoca, ancora python non c'era.

cdimauro
22-02-2013, 17:32
Ho cominciato con BASIC e linguaggio macchina, perché all'epoca non avevo altro a disposizione.

Ma non consiglio di partire con concetti di basso livello. Per chi inizia è sempre meglio non perdere tempo in questo modo, ma focalizzare l'attenzione nella cosa più importante: il problem solving.

Ovviamente una buona infarinatura degli algoritmi principali lo ritengo un must-have nel bagaglio di un buon programmatore, da fare subito dopo l'apprendimento della programmazione.

Successivamente penso sia molto importante smazzarsi gli aspetti più avanzati del linguaggio che si è scelto, avendo una buona padronanza del linguaggio, e una buona visione della libreria standard.

Poi, tempo permettendo, approfondire altri concetti, anche di basso livello, va benissimo. Al solito, più cose si sanno, e meglio è, ma è bene spendere il proprio tempo in base alle priorità.

Vincenzo1968
23-02-2013, 13:43
Raghi,

ci sarebbe da sistemare la versione python la cui soluzione non si può certo dire qualitativamente buona.

La qualità, per me, è trovare che la parola più lunga è "magnificentissimamente" e non "httpwwwliberliberantanilasupercazzolaprematurataconscappellamentoadestra".

Ecco il codice python:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def Main():

def fileSize(f):

f.seek(0, 2)
result = f.tell()
f.seek(0)

return result

currWordLen = maxWordLen = currLineLen = maxLineLen = lines = words = chars = 0
longestWord = longestLine = ''

with open(sys.argv[1], 'r') as f:
chars = fileSize(f)

for line in f:
lines += 1
currLineLen = len(line)
if currLineLen > maxLineLen:
maxLineLen = currLineLen
longestLine = line

list = line.split()
words += len(list)
for word in list:
currWordLen = len(word)
if currWordLen > maxWordLen:
maxWordLen = currWordLen
longestWord = word

f.close()

print '\nNel file ci sono {} caratteri.'.format(chars)
print 'Nel file ci sono {} righe.'.format(lines)
print 'La riga più lunga ha {} caratteri.'.format(maxLineLen)
print 'Nel file ci sono {} parole.'.format(words)
print 'La parola più lunga ha {} caratteri.'.format(maxWordLen)
print 'Ecco una delle parole più lunghe: {} '.format(longestWord)


Chi ci vuol mettere mano? Nell'interesse dei tanti, che qui, si avvicinano entusiasticamente(e giustamente) al linguaggio python.

http://img687.imageshack.us/img687/2703/c19b02classifica01.jpg

;)

cdimauro
23-02-2013, 14:02
Qui (http://www.hwupgrade.it/forum/showpost.php?p=38995682&postcount=665) avevo già fornito la soluzione, dopo il cambiamento dei requisiti.

Vincenzo1968
23-02-2013, 14:08
Qui (http://www.hwupgrade.it/forum/showpost.php?p=38995682&postcount=665) avevo già fornito la soluzione, dopo il cambiamento dei requisiti.

Non vedo il codice. Avevo detto che è già abbastanza pesante per me scaricare il codice di tutti quanti, testarlo, fare gli screenshot e postare il risultato. Se mi debbo mettere a modificare pure i sorgenti è la fine. Fra l'altro di un linguaggio che non conosco per niente.

Se gentilmente, nell'interesse di tutti, vuoi postare il codice con le modifiche effettuate, io lo testo e posto volentieri i risultati.

;)

cdimauro
23-02-2013, 14:12
Ecco qui:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import with_statement

import sys


def Main():

def fileSize(f):

f.seek(0, 2)
result = f.tell()
f.seek(0)

return result

currWordLen = maxWordLen = currLineLen = maxLineLen = lines = words = chars = 0
longestWord = longestLine = ''
TranslationTable = ' ' * 65 + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + ' ' * 6 + 'abcdefghijklmnopqrstuvwxyz' + ' ' * 69 + ''.join(chr(i) for i in xrange(192, 215)) + ' ' * 2 + ''.join(chr(i) for i in xrange(217, 247)) + ' ' * 2 + ''.join(chr(i) for i in xrange(249, 256))

with open(sys.argv[1], 'r') as f:
chars = fileSize(f)

for line in f:
lines += 1
currLineLen = len(line)
if currLineLen > maxLineLen:
maxLineLen = currLineLen
longestLine = line

line = line.translate(TranslationTable)
list = line.split()
words += len(list)
for word in list:
currWordLen = len(word)
if currWordLen > maxWordLen:
maxWordLen = currWordLen
longestWord = word

f.close()

print '\nNel file ci sono {} caratteri.'.format(chars)
print 'Nel file ci sono {} righe.'.format(lines)
print 'La riga più lunga ha {} caratteri.'.format(maxLineLen)
print 'Nel file ci sono {} parole.'.format(words)
print 'La parola più lunga ha {} caratteri.'.format(maxWordLen)
print 'Ecco una delle parole più lunghe: {} '.format(longestWord)


Main()

Non ho i file e non l'ho potuto testare, ma dovrebbe essere corretto (il codice di traslazione, modificato per le mie esigenze, lo uso per il mio progetto su Google App Engine, e funziona bene).

Vincenzo1968
23-02-2013, 14:48
Alleluia!

Finalmente ce l'abbiamo fatta ad avere una versione pienamente funzionante in python:

http://img5.imageshack.us/img5/5109/c19b02python.jpg

:yeah: :winner: :yeah:

Vincenzo1968
23-02-2013, 14:49
Se Vicius ci sistema pure la sua in JavaScript siamo a posto.

:D

Vincenzo1968
23-02-2013, 14:58
PyPy è più prestante:

http://img827.imageshack.us/img827/9434/c19b02pypy.jpg

:D

Peccato che non riesca a far funzionare Cython. E quando dico peccato dico peccato, alla lettera, che davvero mi piacerebbe vederlo all'opera. Anche per provare la mia versione python con automa.

Vincenzo1968
23-02-2013, 15:15
http://www.cl.cam.ac.uk/teaching/1213/AlgorithI/

http://img594.imageshack.us/img594/6697/algo1.jpg

http://img827.imageshack.us/img827/9082/algo2z.jpg

http://img823.imageshack.us/img823/7867/attackingtheproblem.jpg


I recommend you spend some time attacking the three problems above, as seriously as if
they were exam questions, before going any further with the course. Then, after each new
lecture, ask yourself whether what you learnt that day gives any insight towards a better
solution. The first and most obvious question (and the one often requiring the greatest
creativity) is of course:

What strategy to use? What is the algorithm? What is the data structure?


;)

cdimauro
23-02-2013, 15:53
PyPy è più prestante:

http://img827.imageshack.us/img827/9434/c19b02pypy.jpg

:D

Peccato che non riesca a far funzionare Cython. E quando dico peccato dico peccato, alla lettera, che davvero mi piacerebbe vederlo all'opera. Anche per provare la mia versione python con automa.
Potresti provare con Shedskin, che tira fuori un'applicazione C (C++ mi pare) dal codice Python. Ha alcune limitazioni, ma se il codice è "ad hoc" consente prestazioni notevoli.

Vincenzo1968
23-02-2013, 16:06
http://code.google.com/p/shedskin/


Shed Skin is an experimental compiler, that can translate pure, but implicitly statically typed Python (2.4-2.6) programs into optimized C++. It can generate stand-alone programs or extension modules that can be imported and used in larger Python programs.


:D

Mo lo provo.

Comunque sarà una minchiata la faccenda di Cython. Ci sarà qualche libreria da installare. Ma il messaggio d'errore che viene fuori è cosi lungo e incasinato che non ci si capisce molto.

Vincenzo1968
23-02-2013, 16:19
Ah! un minuto...

mi stavo chiedendo una cosa. Una volta mi pare avessimo parlato del fatto che le stringhe di python sono immutabili. E tu mi avevi spiegato che si può usare una versione di stringhe mutabili, come avviene in C.
Tutto questo se non ricordo male, magari si parlava di un altro linguaggio, tipo Java, boh! :confused:

Ora, se in python ci fosse la possibilità di usare stringhe(buffer) di byte anziché stringhe di char? Mi pare che in Java ci sia questa possibilità. Può essere che in questo caso si velocizzi di molto la lettura dei file a blocchi di 4096 byte? Esistono gli array di byte in Python?

cdimauro
23-02-2013, 16:29
Ah! un minuto...

mi stavo chiedendo una cosa. Una volta mi pare avessimo parlato del fatto che le stringhe di python sono immutabili. E tu mi avevi spiegato che si può usare una versione di stringhe mutabili, come avviene in C.
Tutto questo se non ricordo male, magari si parlava di un altro linguaggio, tipo Java, boh! :confused:
E' corretto. Da Python 2.6 c'è il tipo bytearray, che è equivalente alle stringhe di byte, ma è mutabile: puoi cambiare i caratteri, rimuoverli, aggiungerli:
>>> s = bytearray('Prova')
>>> s
20: bytearray(b'Prova')
>>> s[1 : 3] = 'WXYZ'
>>> s
21: bytearray(b'PWXYZva')
>>> s[2 : 4] = ''
>>> s
22: bytearray(b'PWZva')
Ora, se in python ci fosse la possibilità di usare stringhe(buffer) di byte anziché stringhe di char? Mi pare che in Java ci sia questa possibilità.
C'è anche in Python, si chiama StringIO:
import io

output = io.StringIO()
output.write(u'First line.\n')
output.write(u'Second line.\n')

# Retrieve file contents -- this will be
# u'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()
Può essere che in questo caso si velocizzi di molto la lettura dei file a blocchi di 4096 byte?
Per leggere file no, non avrai vantaggi rispetto al codice già postato. In Python 3 c'è il nuovo modulo io riscritto in C, che ha prestazioni molto elevate.

In generale, ti conviene usare gli StringIO quando hai da bufferizzare la scrittura, ad esempio.
Esistono gli array di byte in Python?
Sì, c'è bytearray ormai. In precedenza c'era il tipo array:
import array

a = array.array('B', 'Prova')

Vincenzo1968
23-02-2013, 16:49
Siiiiiiiiiiiiiiii, la mia versione con bytearray, scende da più di sei minuti a un minuto e 43 secondi:


import sys

def fileSize(n):
F = open(n,'r')
F.seek(0,2)
sz = F.tell()
F.seek(0,0)
F.close()
return sz

currPos = 0
nRows = 0
dimcurr = 0
dimBuffer = 4096
r = bytearray()

dimFile = fileSize(sys.argv[1])

f = file(sys.argv[1], 'rb')

while dimcurr < dimFile:
r = f.read(dimBuffer)
dimcurr += dimBuffer
while currPos < len(r) :
if r[currPos] == "\n" :
nRows += 1
currPos += 1
currPos = 0

f.close()

print "\nIl file contiene ", nRows, " righe\n"


http://stor.altervista.org/python3/tipi.html

Datemi il tempo di fare lo screenshot!
Vabbè che conta solo le righe, ma il tempo non dovrebbe crescere di molto facendogli contare tutto il resto(parole, linee, etc). In fondo pure prima contava solo le righe e ci stava più di sei minuti.

:yeah: :winner: :yeah:

Evviva gli automi a stati finiti!!! :D

Vincenzo1968
23-02-2013, 16:54
http://img692.imageshack.us/img692/3654/c19b02myautomatonversio.jpg

:yeah: :winner: :yeah:

Vincenzo1968
23-02-2013, 16:58
Per leggere file no, non avrai vantaggi rispetto al codice già postato. In Python 3 c'è il nuovo modulo io riscritto in C, che ha prestazioni molto elevate.



E invece, a quanto pare, si!

http://img844.imageshack.us/img844/5247/pythonversion273.jpg

:yeah: :winner: :yeah:

cdimauro
23-02-2013, 17:05
Riparliamone quando avrai finito, e il tuo codice sarà esattamente equivalente a quello che ho postato prima.

EDIT: dimenticavo. NON stai usando i bytearray, ma le classiche stringhe. L'oggetto bytearray lo hai creato, ma viene distrutto alla successiva assegnazione di r.

Vincenzo1968
23-02-2013, 17:06
Raghi, ora c'è da fare contare le parole al mio programma. È semplice semplice. Basta creare una funzioncina che legga ogni blocco da 4096 byte letto, leggerlo byte per byte e contare le parole.

Chi se ne incarica? Badate che se mi ci metto... :D

Vincenzo1968
23-02-2013, 17:08
Riparliamone quando avrai finito, e il tuo codice sarà esattamente equivalente a quello che ho postato prima.

Ma già c'è stato un notevolissimo guadagno di tempo rispetto alla versione da sei minuti.
Penso che se applico quanto scritto nel post sopra, come ho fatto in C, i tempi si dovrebbero mantenere sotto i due minuti.

Domani mi ci metto con calma. :D

Vincenzo1968
23-02-2013, 17:09
Riparliamone quando avrai finito, e il tuo codice sarà esattamente equivalente a quello che ho postato prima.

EDIT: dimenticavo. NON stai usando i bytearray, ma le classiche stringhe. L'oggetto bytearray lo hai creato, ma viene distrutto alla successiva assegnazione di r.

E come si spiega l'incremento nelle prestazioni? Che miracolo è? :D

Vincenzo1968
23-02-2013, 17:26
Ah no, è come dici tu, anche se commento la riga


#r = bytearray()


il tempo è all'incirca lo stesso con pypy.

Allora era demerito di CPython e non del mio algoritmo. Con uno strumento che funziona a dovere, come PyPy, il mio algoritmo si rivela per quello che è: efficiente. :D


vincenzo@sab feb 23$ time pypy c19b02MyVersion.py fileA_5GiB.txt

Il file contiene 24786789 righe


real 1m47.224s
user 1m36.846s
sys 0m9.213s

cdimauro
23-02-2013, 17:33
Raghi, ora c'è da fare contare le parole al mio programma. È semplice semplice. Basta creare una funzioncina che legga ogni blocco da 4096 byte letto, leggerlo byte per byte e contare le parole.

Chi se ne incarica? Badate che se mi ci metto... :D
Vedrai che il codice diventerà molto più complesso e lento.
Ma già c'è stato un notevolissimo guadagno di tempo rispetto alla versione da sei minuti.
Penso che se applico quanto scritto nel post sopra, come ho fatto in C, i tempi si dovrebbero mantenere sotto i due minuti.

Domani mi ci metto con calma. :D
Va bene. Vedrai che il tempo salirà velocemente, perché se pensi di usare un automa cellulare, dovrai necessariamente analizzare quali caratteri ti stanno arrivando, e lì perderai non poco tempo.
E come si spiega l'incremento nelle prestazioni? Che miracolo è? :D
Perché ancora hai implementato una sola operazione: il conteggio delle linee. Mentre l'altro codice fa tutto.

Il tuo codice dovresti confrontarlo con la prima versione di Vicius, che leggeva soltanto le righe, per avere una versione "equivalente" rispetto a quello che hai scritto adesso.

Vincenzo1968
24-02-2013, 09:05
Niente, non riesco a usare bytearray:

vincenzo@dom feb 24$ pypy c19b02MyVersion.py fileA_10MB.txt
Traceback (most recent call last):
File "app_main.py", line 51, in run_toplevel
File "c19b02MyVersion.py", line 30, in <module>
szWord[0] = r[0]
IndexError: bytearray index out of range

Pensavo che bastasse dichiarare szWord come bytearray(szWord = bytearray()) in modo da poter usare la variabile a mo' di array di caratteri del C, e invece mi da quell'errore.

:confused:

cdimauro
24-02-2013, 09:25
Posta il codice completo. Se ho tempo, gli darò un'occhiata (al limite stasera, quando ritorno dal paese).

Vincenzo1968
24-02-2013, 10:11
Posta il codice completo. Se ho tempo, gli darò un'occhiata (al limite stasera, quando ritorno dal paese).

No, ormai ho rinunciato all'idea d'implementare l'automa in Python. Sicuramente è come dici tu: i tempi si dovrebbero allungare di molto anche utilizzando PyPy.

Ma mi piacerebbe sapere come utilizzare i bytearray in python.

Io ho fatto questa semplice prova:


import sys

def fileSize(n):
F = open(n,'r')
F.seek(0,2)
sz = F.tell()
F.seek(0,0)
F.close()
return sz

currPos = 0
nRows = 0
dimcurr = 0
dimBuffer = 4096
szWord = bytearray()

dimFile = fileSize(sys.argv[1])

f = file(sys.argv[1], 'rb')

while dimcurr < dimFile:
r = f.read(dimBuffer)
szWord[0] = r[0]
dimcurr += dimBuffer
while currPos < len(r) :
if r[currPos] == "\n" :
nRows += 1
currPos += 1
currPos = 0

f.close()

print "\nIl file contiene ", dimFile, " caratteri\n"
print "Il file contiene ", nRows, " righe\n"


e il risultato è questo:

vincenzo@dom feb 24$ pypy c19b02MyVersion.py fileA_10MB.txt
Traceback (most recent call last):
File "app_main.py", line 51, in run_toplevel
File "c19b02MyVersion.py", line 23, in <module>
szWord[0] = r[0]
IndexError: bytearray index out of range
vincenzo@dom feb 24$

cdimauro
24-02-2013, 10:32
Ho ancora un paio di minuti prima di partire per il paese.

L'errore che commetti sta nell'accedere a un elemento inesistente. Prima, quando creato l'istanza di bytearray, l'hai lasciata vuota, quindi senza alcun elemento.

Ecco perché successivamente ti solleva l'eccezione.

Se vuoi convertire un'intera stringa in bytearray, per poi manipolarlo come ti piace (come ho riportato nell'esempio che ti ho fornito nella precedente pagina), dovresti eliminare questa:
szWord = bytearray()
e cambiare il codice così:
r = bytearray(f.read(dimBuffer))
In questo modo r viene convertito in bytearray, e puoi farci quello che vuoi (cambiare singoli elementi, cancellarli, aggiungerli).

Se hai altri problemi, vedo stasera, al mio ritorno.

Vincenzo1968
24-02-2013, 11:22
Adesso mi dice che il file contiene 0 righe:


vincenzo@dom feb 24$ pypy c19b02MyVersion.py fileA_10MB.txt

Il file contiene 10485760 caratteri

Il file contiene 0 righe



import sys

def fileSize(n):
F = open(n,'r')
F.seek(0,2)
sz = F.tell()
F.seek(0,0)
F.close()
return sz

currPos = 0
nRows = 0
dimcurr = 0
dimBuffer = 4096

dimFile = fileSize(sys.argv[1])

f = file(sys.argv[1], 'rb')

while dimcurr < dimFile:
r = bytearray(f.read(dimBuffer))
dimcurr += dimBuffer
while currPos < len(r) :
if r[currPos] == "\n" :
nRows += 1
currPos += 1
currPos = 0

f.close()

print "\nIl file contiene ", dimFile, " caratteri\n"
print "Il file contiene ", nRows, " righe\n"

Vincenzo1968
24-02-2013, 11:27
Ah no, ho risolto utilizzando chr:


vincenzo@dom feb 24$ pypy c19b02MyVersion.py fileA_10MB.txt

Il file contiene 10485760 caratteri

Il file contiene 48856 righe



import sys

def fileSize(n):
F = open(n,'r')
F.seek(0,2)
sz = F.tell()
F.seek(0,0)
F.close()
return sz

currPos = 0
nRows = 0
dimcurr = 0
dimBuffer = 4096

dimFile = fileSize(sys.argv[1])

f = file(sys.argv[1], 'rb')

while dimcurr < dimFile:
r = bytearray(f.read(dimBuffer))
dimcurr += dimBuffer
#while currPos < len(r) :
while currPos < dimBuffer :
if chr(r[currPos]) == '\n' :
nRows += 1
currPos += 1
currPos = 0

f.close()

print "\nIl file contiene ", dimFile, " caratteri\n"
print "Il file contiene ", nRows, " righe\n"


:D

Vincenzo1968
24-02-2013, 11:33
Eh ma peggiorano i tempi col bytearray:


vincenzo@dom feb 24$ time pypy c19b02MyVersion.py fileA_5GiB.txt

Il file contiene 5368709120 caratteri

Il file contiene 24786789 righe


real 2m39.453s
user 2m28.073s
sys 0m10.173s


Niente, non è cosa. :cry:

WarDuck
24-02-2013, 13:38
Ma come si comporta Ruby vs Pypy? :D

Vincenzo1968
24-02-2013, 15:07
Nonsi,

PyPy lo possiamo confrontare, chessò, con JRuby. Altrimenti il confronto non sarebbe leale. Credo. :confused:

Vincenzo1968
24-02-2013, 15:13
A proposito, chissà se in Ruby gli array di byte vengono gestiti in maniera più efficiente che in Python? Chi lo sa? Chi mi fa vedere come si usano i bytearray in Ruby?

Vincenzo1968
24-02-2013, 15:25
Ohé, un fanatico di Ruby:

http://www.alfonsomartone.itb.it/qqvaqs.html

:D

Vincenzo1968
24-02-2013, 17:25
Ohé Banryu,

ho risolto il bug col Don Chisciotte:

http://img692.imageshack.us/img692/8531/donchisciotte.jpg

:D

Vincenzo1968
24-02-2013, 18:07
http://img825.imageshack.us/img825/3884/donchisciotte2.jpg

http://img829.imageshack.us/img829/923/donchisciotte3.jpg

:D

WarDuck
24-02-2013, 18:41
Nonsi,

PyPy lo possiamo confrontare, chessò, con JRuby. Altrimenti il confronto non sarebbe leale. Credo. :confused:

Se non erro Ruby è già JIT, comunque io lo confronterei lo stesso per vedere come va.

Proprio mentre stavo controllando mi sono accorto che è uscito Ruby 2.0:

http://www.ruby-lang.org/en/

Vincenzo1968
24-02-2013, 18:43
Minchione! su Windows i tempi per creare l'indice si dimezzano. :D

http://img819.imageshack.us/img819/3371/chisciottewin.jpg

:yeah: :winner: :yeah:

Vincenzo1968
24-02-2013, 18:44
Se non erro Ruby è già JIT, comunque io lo confronterei lo stesso per vedere come va.

Proprio mentre stavo controllando mi sono accorto che è uscito Ruby 2.0:

http://www.ruby-lang.org/en/

Minchia! Me lo scarico senza perdere nemmeno un nanosecondo!

Vincenzo1968
24-02-2013, 18:47
Certo che Ruby è proprio bellino!

http://img5.imageshack.us/img5/2456/ruby2g.jpg

:D

Vincenzo1968
24-02-2013, 19:29
Che si deve fare per compilare i sorgenti di Vicius nel file punto-b.jar? Su Windows non ce l'ho ant.

https://github.com/hwupgradecontest/contest19/tree/master/vicius/punto-b1

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
24-02-2013, 23:05
Sul portatilino:

http://img835.imageshack.us/img835/3946/portatilino01.jpg

http://img541.imageshack.us/img541/6131/portatilino02.jpg

cdimauro
25-02-2013, 06:48
Ah no, ho risolto utilizzando chr:
Scusami, avevo dimenticato di dirti che i byte array sono array di byte, appunto, per cui quando accedi a un elemento non ti restituisce una stringa (di un solo carattere), ma un intero che rappresenta il valore del byte.

Non li ho mai usati, per cui questo è un dettaglio che mi sfugge spesso quando ne parlo.
Eh ma peggiorano i tempi col bytearray:


vincenzo@dom feb 24$ time pypy c19b02MyVersion.py fileA_5GiB.txt

Il file contiene 5368709120 caratteri

Il file contiene 24786789 righe


real 2m39.453s
user 2m28.073s
sys 0m10.173s


Niente, non è cosa. :cry:
Non lo è perché stai facendo delle operazioni sostanzialmente inutili. Non hai bisogno di un byte array in questo contesto, perché questo ti costringe a convertire i byte in caratteri per farci qualcosa, ed è un'operazione gravosa.

Inoltre per ogni 4KB letti, questi li devi convertire in byte array.

Sono due passaggi inutili, perché le stringhe sono già una sequenza di byte, e ti restituiscono caratteri (stringhe di un solo carattere, per la precisione).

Anche se dovessi implementare il tuo automa a stati finiti, potresti benissimo continuare a usare le stringhe così come sono.
Nonsi,

PyPy lo possiamo confrontare, chessò, con JRuby. Altrimenti il confronto non sarebbe leale. Credo. :confused:
In realtà JRuby lo dovresti confrontare con Jython, se vuoi fare un confronto usando la stessa virtual machine (Java).

PyPy è una cosa completamente diversa, e va presa "di per sé".

Comunque, visto che parliamo di linguaggi, e di questi esistono implementazioni diverse, si dovrebbe prendere quella che offre i risultati migliori. Nello specifico, PyPy s'è comportata meglio finora.

Per Ruby puoi usare quello che vuoi: JRuby, Ruby 1.9 o la 2.0, o IronRuby (ci sarebbe anche IronPython, tra l'altro, che non è mai stato provato finora).

Vincenzo1968
25-02-2013, 10:18
Grazie per le spiegazioni, Cesare, grazie mille ;)

Da niubbo del linguaggio pensavo che il bytearray fosse trattato come array di dati grezzi, un po' come avviene con gli array in C. E invece, a quanto pare, è il contrario.
In Java, se non erro, invece è proprio così: gli array di byte sono simili agli array C. O sbaglio? :confused:

Io, tra i tanti strumenti, vorrei provare Cython. Come dicevo qualche pagina fa, visto che converte il codice Python in codice C, e visto che quest'ultimo è efficiente con la lettura/scritture di file in blocchi, penso che la mia versione-automa dovrebbe risultare bella veloce. Forse(ma forse).

:D

cdimauro
25-02-2013, 11:07
Grazie per le spiegazioni, Cesare, grazie mille ;)
Di nulla. Anzi, scusami per non averti descritto meglio i byte array prima, ma l'ero proprio dimenticato quel dettaglio.
Da niubbo del linguaggio pensavo che il bytearray fosse trattato come array di dati grezzi, un po' come avviene con gli array in C. E invece, a quanto pare, è il contrario.
Diciamo che sono grezzi perché effettivamente è una sequenza di byte, e quando accedi a un elemento recuperi proprio il valore del byte.
In Java, se non erro, invece è proprio così: gli array di byte sono simili agli array C. O sbaglio? :confused:
Sì, esatto.
Io, tra i tanti strumenti, vorrei provare Cython. Come dicevo qualche pagina fa, visto che converte il codice Python in codice C, e visto che quest'ultimo è efficiente con la lettura/scritture di file in blocchi, penso che la mia versione-automa dovrebbe risultare bella veloce. Forse(ma forse).

:D
Penso che ne guadagneresti molto, perché tira fuori codice C, appunto, ma devi dargli qualche indicazione sui tipi usati, in modo che Cython possa generare codice quanto più ottimale possibile.

Al limite, come dicevo, puoi provare con Shedskin, visto che con Cython hai avuto alcuni problemi (e io non ti posso aiutare, perché non ho nessuna esperienza).

Vincenzo1968
25-02-2013, 12:21
Diciamo che sono grezzi perché effettivamente è una sequenza di byte, e quando accedi a un elemento recuperi proprio il valore del byte.


No intendevo dire che pensavo l'interprete-compilatore non facesse nessun controllo a runtime sui bytearray e quindi il programma sarebbe risultato più veloce. Non mi so spiegare bene ma penso che ci siamo capiti. :D


Al limite, come dicevo, puoi provare con Shedskin, visto che con Cython hai avuto alcuni problemi (e io non ti posso aiutare, perché non ho nessuna esperienza).

Eh si, prima o poi lo debbo provare. Per il momento ho la testa a finire la libreria inverted-index per il bunto B.1.

Ah, a proposito, la domanda è rivolta a tutti, per quanto riguarda la ricerca su una stringa composta da più parole, come ci si deve regolare?
Voglio dire, io faccio restituire per il momento i numeri di riga dove trovo le parole. Per esempio, se si inserisce la stringa "prova stringa da trovare" e il programma trova che le righe 21 e 34 contengono tutt'e tre(quattro) le parole, dico che ho trovato la stringa alle righe 21 e 34.
E nel caso in cui il file fosse costituito da un'unica enorme riga?
E le parole debbono essere adiacenti o andrebbe bene trovarne, per esempio, una all'inizio della riga, una in mezzo e l'altra alla fine(purché, dunque, siano presenti tutte nella medesima riga).
Come si regolano i motori di ricerca? Google come fa?

Poi, vabbé, ci sono i vari tipi di ricerca: per corrispondenza esatta o per almeno una o più parole(anche se non tutte), etc, non è questo il problema.

cdimauro
25-02-2013, 13:34
A livello di motore di ricerca dovrebbe beccarti le pagine che hanno tutte le parole specificate, e non importa che siano vicine.

Questo con un algoritmo "grezzo", perché da anni ci sono algoritmi di page-ranking che funzionano in maniera diversa (Google c'ha costruito sopra la sua fortuna).

P.S. Sì, ci siamo capiti.

Vincenzo1968
25-02-2013, 13:39
A livello di motore di ricerca dovrebbe beccarti le pagine che hanno tutte le parole specificate, e non importa che siano vicine.

Questo con un algoritmo "grezzo", perché da anni ci sono algoritmi di page-ranking che funzionano in maniera diversa (Google c'ha costruito sopra la sua fortuna).

P.S. Sì, ci siamo capiti.

Quindi come risolvo? Naturalmente non voglio fare una libreria per un mega motore di ricerca tipo google. Mi accontento di una piccola libreria per l'indicizzazione efficiente di un insieme di file in locale.

Stavo pensando di memorizzare nell'indice, anziché il riferimento alla riga, il riferimento al blocco da 4096 byte(e l'offset della parola all'interno del blocco).

EDIT: o anche direttamente l'offset della parola relativo all'intero file anziché al blocco.

cdimauro
25-02-2013, 14:59
Non so quale soluzione potresti usare. Posso dirti, da utente, cosa vorrei da un motore di ricerca che mi possa essere realmente utile, ed è quello che ti ho detto prima: trovare tutti i documenti in cui si trovano tutte le parole che ho scritto. Non mi servono i numeri di riga: giusto i documenti.

Come seconda cosa, ma la trovo meno importante, mi servirebbe conoscere dove si trovano le parole che ho inserito.

Vincenzo1968
25-02-2013, 15:34
Cazzo ma dalle prime proiezioni risulta in testa il pedonano? :mad:

Voglio emigrare. Me ne vado a Londra. Voglio essere adottato da Gugo.

Ciao.

Vincenzo1968
25-02-2013, 15:39
Non so quale soluzione potresti usare. Posso dirti, da utente, cosa vorrei da un motore di ricerca che mi possa essere realmente utile, ed è quello che ti ho detto prima: trovare tutti i documenti in cui si trovano tutte le parole che ho scritto. Non mi servono i numeri di riga: giusto i documenti.

Come seconda cosa, ma la trovo meno importante, mi servirebbe conoscere dove si trovano le parole che ho inserito.

Se quello che interessa sono solo i documenti mi "viene allo scendere": posso risparmiare e spazio su disco e tempo(per la creazione dell'indice). :D

Ma bisognerà pensare a indicare anche la posizione delle parole cercate nel documento. Metti che l'utente vuole stampare a video o su file le righe, per esempio.

Si ho deciso che memorizzo l'offset assoluto della parola nel file.

VICIUS
25-02-2013, 15:56
Ma bisognerà pensare a indicare anche la posizione delle parole cercate nel documento. Metti che l'utente vuole stampare a video o su file le righe, per esempio.

Si ho deciso che memorizzo l'offset assoluto della parola nel file.

Io se cerco "cioccolata" con spotlight l'unica cosa che mi interessa è che venga mostrato il file lista_della_spesa.doc. Che sia scritta alla riga 3,4 e 5 non mi interessa.

Se poi tiriamo in ballo file come i pdf in cui il concetto di linea non esiste ma è tutto posizionato in maniera assoluta il tuo programma darebbe informazioni non veritiere.

Come ti ho ripetuto più volte da quando hai cominciato. Non serve memorizzare il numero di riga e la posizione della parola all'interno della stessa.

Vincenzo1968
25-02-2013, 16:04
Io se cerco "cioccolata" con spotlight l'unica cosa che mi interessa è che venga mostrato il file lista_della_spesa.doc. Che sia scritta alla riga 3,4 e 5 non mi interessa.

Se poi tiriamo in ballo file come i pdf in cui il concetto di linea non esiste ma è tutto posizionato in maniera assoluta il tuo programma darebbe informazioni non veritiere.

Come ti ho ripetuto più volte da quando hai cominciato. Non serve memorizzare il numero di riga e la posizione della parola all'interno della stessa.

Ma allora nell'indice memorizzo solo l'id del documento e, per ogni parola, la frequenza. Giusto?

Oh raghi, se è così non posso che esserne felice: velocizzo il programma e sparagno un sacco di spazio su disco.

EDIT: Se eventualmente l'utente richiedesse la posizione precisa all'interno del documento posso sempre far partire l'automa a stati finiti. Tanto è velocissimo su file di piccole dimensioni. Giusto?

VICIUS
25-02-2013, 16:27
Ma allora nell'indice memorizzo solo l'id del documento e, per ogni parola, la frequenza. Giusto?
Ma che ci fai con la frequenza? Se cerco "panino con la nutella" come fai a dirmi se c'è quella frase esatta nel testo a partire dalle frequenze delle singole parole.

Vincenzo1968
25-02-2013, 16:35
Ma che ci fai con la frequenza? Se cerco "panino con la nutella" come fai a dirmi se c'è quella frase esatta nel testo a partire dalle frequenze delle singole parole.

No vabbè, la frequenza per fornire un servizio in più all'utente. Mettiamo che l'utente voglia sapere quante parole di lunghezza 8 ci sono nei documenti. O quante volte è presente la parola "mucca" nei documenti(e distinguendo magari la frequenza documento per documento).

Vincenzo1968
25-02-2013, 19:23
Alla fine il tutto andrà testato sui documenti TREC, mica su quei pochi file che abbiamo preso su liberliber:

http://trec.nist.gov/

Eh! ;)

http://img221.imageshack.us/img221/8840/trec.jpg

Eqque qua i documenti:

http://trec.nist.gov/data.html

cdimauro
26-02-2013, 04:30
Se quei testi sono soltanto in inglese, non so quanto possano essere utili.

Come avevo già scritto, una cosa su cui avete sorvolato è la codifica dei testi. Un engine che esegua ricerche dev'essere in grado di farle qualunque sia la codifica del documento originale (ASCII, Latin-1, CP1252, MacRoman, UTF-8/16/32, ecc.).

Dovreste prevedere che l'engine converta il testo originale in una sola codifica "universale", per poi indicizzarlo.
No vabbè, la frequenza per fornire un servizio in più all'utente. Mettiamo che l'utente voglia sapere quante parole di lunghezza 8 ci sono nei documenti. O quante volte è presente la parola "mucca" nei documenti(e distinguendo magari la frequenza documento per documento).
YAGNI. Non ne hai bisogno. A me, utente, interessa aver trovato ciò che cercavo. Questo è il primo, più importante, e spesso unico obiettivo quando faccio una ricerca.

Se hai altre esigenze, si possono risolvere "offline", con altri strumenti appositamente creati allo scopo.

L'over-engineering è una piaga dell'informatica. Non possiamo e non dobbiamo scrivere codice soltanto perché "poi, in futuro, forse, potrebbe servire".

Si deve rivolvere il problema con quei requisiti. Poi, se e quando dovesse verificarsi un cambio di requisiti, lo si affronterà.

Vincenzo1968
26-02-2013, 12:40
Se quei testi sono soltanto in inglese, non so quanto possano essere utili.

Come avevo già scritto, una cosa su cui avete sorvolato è la codifica dei testi. Un engine che esegua ricerche dev'essere in grado di farle qualunque sia la codifica del documento originale (ASCII, Latin-1, CP1252, MacRoman, UTF-8/16/32, ecc.).

Dovreste prevedere che l'engine converta il testo originale in una sola codifica "universale", per poi indicizzarlo.


Più utili dei file che abbiamo preso su liberliber lo sono sicuramente. Sono presi a esempio sui libri che trattano l'argomento come "Managing Gigabytes" che sto leggendo(affascinante lettura e, soprattutto, utile):

http://ww2.cs.mu.oz.au/mg/
http://ecx.images-amazon.com/images/I/414SCU9MxqL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg
http://www.amazon.com/Managing-Gigabytes-Compressing-Multimedia-Information/dp/1558605703


YAGNI. Non ne hai bisogno. A me, utente, interessa aver trovato ciò che cercavo. Questo è il primo, più importante, e spesso unico obiettivo quando faccio una ricerca.

Se hai altre esigenze, si possono risolvere "offline", con altri strumenti appositamente creati allo scopo.

L'over-engineering è una piaga dell'informatica. Non possiamo e non dobbiamo scrivere codice soltanto perché "poi, in futuro, forse, potrebbe servire".

Si deve rivolvere il problema con quei requisiti. Poi, se e quando dovesse verificarsi un cambio di requisiti, lo si affronterà.

Si certo, offline, in una dll/so a parte. Ma lo debbo memorizzare nell'indice il conteggio delle parole. Non è che posso fare una scansione lineare ogni volta che l'utente esegue, per esempio, query come queste:

Contare le parole lunghe 8 caratteri:

count words where wordlen = 8



Mostrare una lista di parole lunghe 8 carateri, in ordine alfabetico, con la relativa frequenza

count distinct words where wordlen = 8

Vincenzo1968
26-02-2013, 12:52
Occhio!

http://www.evanjones.ca/unicode-in-c.html
http://www.evanjones.ca/python-utf8.html
http://www.tbray.org/ongoing/When/200x/2003/04/06/Unicode
http://www.joelonsoftware.com/articles/Unicode.html
http://www.tbray.org/ongoing/When/200x/2003/04/26/UTF

http://unicode.org/
http://www.i18nguy.com/unicode/codepages.html#msftdos

http://utf8everywhere.org/

http://utfcpp.sourceforge.net/

http://www.cl.cam.ac.uk/~mgk25/unicode.html

http://stackoverflow.com/questions/14337764/how-to-deal-with-presumable-utf-8-strings-in-c-programs-on-osx

http://www.cprogramming.com/tutorial/unicode.html

http://www.nubaria.com/en/blog/?p=289

http://linuxgazette.net/147/pfeiffer.html

http://htmlpurifier.org/docs/enduser-utf8.html

http://www.czyborra.com/utf/

http://rosettacode.org/wiki/String_length

http://perlgeek.de/en/article/set-up-a-clean-utf8-environment

http://programmers.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful

http://stackoverflow.com/questions/2722951/how-to-deal-with-unicode-strings-in-c-c-in-a-cross-platform-friendly-way

Vincenzo1968
26-02-2013, 13:17
http://www.joelonsoftware.com/articles/Unicode.html

What do web browsers do if they don't find any Content-Type, either in the http headers or the meta tag? Internet Explorer actually does something quite interesting: it tries to guess, based on the frequency in which various bytes appear in typical text in typical encodings of various languages, what language and encoding was used. Because the various old 8 bit code pages tended to put their national letters in different ranges between 128 and 255, and because every human language has a different characteristic histogram of letter usage, this actually has a chance of working. It's truly weird, but it does seem to work often enough that naïve web-page writers who never knew they needed a Content-Type header look at their page in a web browser and it looks ok, until one day, they write something that doesn't exactly conform to the letter-frequency-distribution of their native language, and Internet Explorer decides it's Korean and displays it thusly, proving, I think, the point that Postel's Law about being "conservative in what you emit and liberal in what you accept" is quite frankly not a good engineering principle. Anyway, what does the poor reader of this website, which was written in Bulgarian but appears to be Korean (and not even cohesive Korean), do? He uses the View | Encoding menu and tries a bunch of different encodings (there are at least a dozen for Eastern European languages) until the picture comes in clearer. If he knew to do that, which most people don't.

banryu79
26-02-2013, 14:00
http://www.joelonsoftware.com/articles/Unicode.html

Ah sì, ricordo questo post, penso che in molti l'abbiano letto.
Di tutti i post (interessantissimi) scritti da J. Spolsky questo secondo me dovrebbe essere considerato come una "lettura obbligatoria" per chiunque abbia mai scritto anche un solo "hello world" in vita sua :D

Vincenzo1968
26-02-2013, 14:26
Ohé! altro gran bell'articolo:

http://www.tbray.org/ongoing/When/200x/2003/04/26/UTF


Conclusions · There are Unicode and non-Unicode ways of storing your Unicode characters. In general, you're better off using the Unicode ways, because they're designed to not break no matter what kind of characters you throw at them, and there's better support from XML processors.

None of the three UTF approaches (-32, -16, -8) are really better than any of the others. UTF-8 works better with traditional C programming practice, while Java and C# share a sort-of-UTF-16 culture. I think there are real problems with the Java/C# approach, which I'll discuss next time, but for everyday work that doesn't have huge text-processing requirements, they get the job done well enough.

The good news is that all of these are well-specified in one place in the Unicode documentation, and if you have to write code to deal with them, it's just not that hard.


Java :rolleyes: C# :rolleyes: UTF-16 :rolleyes:

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
27-02-2013, 10:51
Occhio!

Per Unicode abbiamo un bel po' di pappa pronta con la popolarissima libreria libiconv:

http://www.gnu.org/software/libiconv/

Per quelli che preferiscono Visual Studio c'è da fare qualche modifica manuale:

http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio

Ma, su CodeProject, si possono scaricare le dll e le librerie statiche(32/64 bit) gia bell'e pronte.


Libiconv is one of the most useful and famous libraries that converts texts between encodings and has been developed under GNU projects. However, now it does not provide the way to build it with Microsoft Visual Studio but with gcc. Before, it had provided but now stopped explaining how to build it with Microsoft Visual Studio. However, many of the computer programmers are using Microsoft Visual Studio and want to build libiconv with Microsoft Visual Studio. So, this article is about how to build libiconv with Microsoft Visual Studio. If you can build libiconv with Microsoft Visual Studio, you will be able to change various compilation options and build it in order to optimize libiconv according to your preference and needs.


Ruby: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/iconv/rdoc/Iconv.html

Vincenzo1968
27-02-2013, 12:33
Occhio!

Guida Git:
http://www.lemoda.net/git/index.html

UTF-8:
http://www.lemoda.net/utf8/index.html
http://www.lemoda.net/unicode/index.html

Compression:
http://www.lemoda.net/compression/index.html

Regular Expression:
http://www.lemoda.net/regex/index.html

cdimauro
27-02-2013, 12:47
Più utili dei file che abbiamo preso su liberliber lo sono sicuramente. Sono presi a esempio sui libri che trattano l'argomento come "Managing Gigabytes" che sto leggendo(affascinante lettura e, soprattutto, utile):

http://ww2.cs.mu.oz.au/mg/
http://ecx.images-amazon.com/images/I/414SCU9MxqL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg
http://www.amazon.com/Managing-Gigabytes-Compressing-Multimedia-Information/dp/1558605703
Se sono tutti ASCII lasciano il tempo che trovano.
Si certo, offline, in una dll/so a parte. Ma lo debbo memorizzare nell'indice il conteggio delle parole. Non è che posso fare una scansione lineare ogni volta che l'utente esegue, per esempio, query come queste:

Contare le parole lunghe 8 caratteri:

count words where wordlen = 8



Mostrare una lista di parole lunghe 8 carateri, in ordine alfabetico, con la relativa frequenza

count distinct words where wordlen = 8

Ho capito, ma devi porti questa domanda: "mi serve il conteggio delle parole per quello che sto andando a fare?". Se la risposta è sì, allora lo implementi. Se è no, lascia perdere.

Prima di rispondere mettiti nelle condizioni di un utente qualunque e delle sue esigenze "medie" / "standard".