[Gnu-tr-u12a] TBD sozlugu
Status: Pre-Alpha
Brought to you by:
deniz02
|
From: Alper E. <ae...@tf...> - 2001-12-02 08:31:25
|
Merhaba, Bir ay kadar once asagidaki postayi yollamistim fakat ulasmamis, tekrar yolluyorum (umarim ulasmamistir). ---- Merhaba, Ne zaman TBD'nin sozlugune ihtiyac duysam ayni anda bir browser'a da ihtiyac duymaktan bunaldim ve oturup kelimelere browser olmadan bakabilmemi saglayacak kucuk (cok kucuk) bir Perl programi yazdim. Calismak icin Perl'e, DBI modulune ve kullanmayi tercih ettiginiz saklama yonteminin gerektirdigi DBD modulune ihtiyac duyuyor. Iki cesit saklama yontemi mevcut; MySQL ve CSV. MySQL icin DBD::mysql modulu gerekli (Msql-Mysql-modules paketinin parcasi). CSV icin DBD::CSV modulu gerekli. DBD::CSV de bir takim modullere ihtiyac duyuyor, SQL::Statement ve Text::CSV_XS. Bu modullerin hepsini http://www.cpan.org'da bulmak mumkun. Bu modulleri kurdugunuzu varsayip anlatmaya devam ediyorum. Program iki parca halinde: kurulum icin tbd_install.pl ve sozlukten yararlanmak icin tbd.pl. Her ikisini de kullanmadan once bir editorde acip bazi ayarlar yapmaniz gerekiyor. Her iki dosyada yapilmasi gereken ayarlar ayni ve dosyalarda kabaca aciklamalari var. Bu ayarlamalari yaptiktan sonra tbd_install.pl'yi TBD'nin ing_turk.html isimli sozluguyle besleyin: ./tbd_install.pl < ing_turk.html Bir sure calistiktan sonra sozluk kullanima hazir olacak. Saklama yontemi olarak csv'yi sectiyseniz kelimeler virgulle ayrilmis olarak $dbdir dizininde $table isimli dosyada birikecek. Eger $dbdir dizininde onceden $table isimli bir dosyaniz varsa o dosyayi kaybedersiniz!! Sormadan siler, sakasi yok. Diger saklama yontemi olan MySQL'i sectiyseniz bu sefer kelimeler ve karsiliklari ayarladiginiz veritabaninda birikecek. Veritabani icin bir tehlike yok ama tablo icin var! Belirlediginiz veritabanina birsey olmayacak ama tablo silinip bastan yaratilacak, o yuzden ne sectiginize dikkat edin!! Tekrar: hangi saklama yontemi olursa olsun, saklanacak yerlerin onceden kullanilmadigindan emin olun!! Kac kelimenin saklandigini ogrendikten sonra ihtiyaciniz olacagini dusunmuyorsaniz tbd_install.pl'yi silebilirsiniz. tbd.pl'nin ayarlarini tbd_install.pl ile ayni yaptiysaniz artik dilediginiz kelimenin anlamina bakabilirsiniz. Hicbir parametre vermeden sadece kelime verirseniz kelimenin ingilizce oldugunu ve turkcesini ogrenmek istediginizi varsayar. Tersini belirtmek icin -t veya --turkish parametresini kullanabilirsiniz. -r veya --regex(p) parametresi verdiginiz kelimenin Regular Expression oldugunu belirtmek icin (CSV yontemi regex'i maalesef desteklemiyor). Ayni sekilde -p veya --partial verdiginiz kelimenin aslinda daha buyuk bir kelimenin veya kelime grubunun parcasi oldugunu belirtmek icin. Ayni anda pekcok kelimeye bakmak mumkun. tbd.pl arama yonteminize gore okunakli bir sekilde sonucu gosterecektir. Ayrica --help ve --version parametreleri de var. Her iki saklama metodunun avantajlari ve dezavantajlari var. CSV daha once soyledigim gibi regex ile aramayi desteklemiyor ve MySQL'e nazaran oldukca yavas. MySQL'i ise herkes calistirmiyor, ve cok nadiren kullanilacak kucuk bir sozluk icin kimse ugrasmak istemeyebilir. Bende kurulu olan ilgili programlarin ve modullerin surumleri: Perl-5.6.0 MySQL-3.23.32 DBI-1.20 DBD::mysql 2.0415 DBD::CSV 0.1027 Text::CSV_XS 0.23 SQL::Statement 0.1021 Kullanan olursa, benim isime yaradigi kadar onun da isine yaramasini dilerim. -------- tbd_install.pl -------- #!/usr/bin/perl -w use strict; use POSIX qw(locale_h); use locale; use DBI; setlocale(LC_ALL, "tr_TR"); # Ayarlar # $store_method: Kullan saklama ymi. # mysql ya da csv'den biri olabilir. Her ymin ihtiya duyduyarlar farkl csv => dbdir: kelimeleri saklayacak CSV dosyaslunduracak dizin # table: kelimeleri saklayacak dosya ismi # # mysql => dbhost: MySQL sunucusu # dbase : Veritaban # dbuser: Sunucuya bakullan isim # dbpass: Sunucu parolas table : Kelimelerin saklanacaablo ###### my $store_method = "mysql"; my $dbhost = "localhost"; my $dbase = "sozluk"; my $dbuser = "user"; my $dbpass = "pass"; my $dbdir = "/path/to/sozluk"; my $table = "tbd_csv"; die ("ladan ayarlamalarn ve bu satlin!!!\n"); ###### if ($store_method eq "mysql") { $DBI::drh = DBI->install_driver("mysql"); my @dbs = $DBI::drh->func($dbhost, "_ListDBs"); my $have_db = ""; foreach (@dbs) { if ($_ eq $dbase) { $have_db = 1; } } unless ($have_db) { $DBI::drh->func("createdb", $dbase, $dbhost, $dbuser, $dbpass, "admin") or die "db initialization error: " . $DBI::drh->errstr; } $DBI::dbh = DBI->connect("DBI:mysql:database=$dbase;host=$dbhost", $dbuser, $dbpass); $DBI::sth = $DBI::dbh->do("DROP TABLE IF EXISTS $table"); $DBI::sth = $DBI::dbh->do(qq{ CREATE TABLE $table ( en VARCHAR(70) NULL default '', tr VARCHAR(70) NULL default '', KEY (en(20), tr(20)), KEY (tr(20), en(20)) ) TYPE=MyISAM }); } elsif ($store_method eq "csv") { $DBI::dbh = DBI->connect("DBI:CSV:f_dir=$dbdir"); my (@list) = $DBI::dbh->func('list_tables'); foreach (@list) { if ($table eq $_) { $DBI::dbh->do("DROP TABLE $table"); last; } } $DBI::dbh->do("CREATE TABLE $table (en VARCHAR(70), tr VARCHAR(70))"); } else { print "Bilinmeyen saklama ymi: $store_method\n"; print "\$store_method deeni sadece 'mysql' ya da 'csv' "; print "deerinden birini alabilir!\n"; exit 1; } $DBI::sth = $DBI::dbh->prepare("INSERT INTO $table (en, tr) VALUES (?, ?)"); extract(<STDIN>); $DBI::sth->finish(); $DBI::dbh->disconnect(); sub extract { my $word = ""; my $count = 0; foreach (@_) { chomp(); if (/valign=top/) { s/.*<td valign=top>([[:alnum:][:punct:] ]+)<\/td>.*/$1/i; s/^ *| *$//g; tr/A-Z/a-z/; if ($word eq "") { $word = $_; } else { $DBI::sth->execute($word, $_); $count++; $word = ""; } } } print "$count kelime veritabanina yerlestirildi ($store_method).\n"; } -------- tbd.pl -------- #!/usr/bin/perl -w # T Biliim Dernein s kullanmak i # browser yerine perl'e ihtiyac duymayayan program use strict; use Getopt::Long; use DBI; # Ayarlar # $store_method: Kullan saklama ymi. # mysql ya da csv'den biri olabilir. Her ymin ihtiya duyduyarlar farkl csv => dbdir: Kelimeleri saklayacak CSV dosyaslunduracak dizin # table: Kelimeleri saklayacak dosya ismi # # mysql => dbhost: MySQL sunucusu # dbase : Veritaban # dbuser: Sunucuya bakullan isim # dbpass: Sunucu parolas table : Kelimelerin saklanacaablo ###### my $store_method = "mysql"; my $dbhost = "localhost"; my $dbase = "sozluk"; my $dbuser = "user"; my $dbpass = "pass"; my $dbdir = "/path/to/sozluk"; my $table = "tbd_csv"; die ("ladan ayarlamalarn ve bu satlin!!!\n"); ###### my $word = ""; my $regexp = ""; my $partial = ""; my $turkish = ""; my $help = ""; my $version = ""; Getopt::Long::Configure("bundling"); GetOptions( 'regex|regexp|r' => \$regexp, 'partial|p' => \$partial, 'turkish|t' => \$turkish, 'help|h' => \$help, 'version' => \$version ); if ($help) { print qq{Kullanimi: $0 [SECENEK] KELE KELE'yi T Biliim Dernee ara ve sonucu gr. -r, --regex, --regexp REGEX ifadesi -p, --partial Bir kelimenin par, --turkish Aranacak kelime T -h, --help Bu yazgr --version Silgisi tanm kelimeyi gilizce'den Tye irme ve blarak aramadtfen yanlaroy\@tfz.net adresine bildirin. }; exit } if ($version) { print "$0 v1.0\n"; print "Alper Ersoy (aersoy\@tfz.net) tarafyaz"; exit } if (scalar(@ARGV) == 0) { print "$0: aranacak kelime verilmedi\n"; print "Daha fazla bilgi i '$0 --help' yaz exit 1; } if ($regexp and $partial) { print "Uyarparametresi -p'den likli, partial parametresi gddi\n"; $partial = ""; } if ($store_method eq "mysql") { $DBI::dbh = DBI->connect("DBI:mysql:database=$dbase;host=$dbhost", $dbuser, $dbpass); foreach (@ARGV) { lookup_mysql($_); complete_lookup($_); } } elsif ($store_method eq "csv") { $DBI::dbh = DBI->connect("DBI:CSV:f_dir=$dbdir"); foreach (@ARGV) { lookup_csv($_); complete_lookup($_); } } else { print "Bilinmeyen saklama ymi: $store_method\n"; print "\$store_method deeni sadece 'mysql' ya da 'csv' "; print "deerinden birini alabilir!\n"; exit 1; } $DBI::sth->finish; $DBI::dbh->disconnect; exit; sub lookup_mysql { if ($turkish) { if ($regexp) { $DBI::sth = $DBI::dbh->prepare("SELECT tr, en FROM $table WHERE tr RLIKE ?"); } elsif ($partial) { $_ = "%" . "$_" . "%"; $DBI::sth = $DBI::dbh->prepare("SELECT tr, en FROM $table WHERE tr LIKE ?"); } else { $DBI::sth = $DBI::dbh->prepare("SELECT tr, en FROM $table WHERE tr = ?"); } } else { if ($regexp) { $DBI::sth = $DBI::dbh->prepare("SELECT en, tr FROM $table WHERE en RLIKE ?"); } elsif ($partial) { $_ = "%" . "$_" . "%"; $DBI::sth = $DBI::dbh->prepare("SELECT en, tr FROM $table WHERE en LIKE ?"); } else { $DBI::sth = $DBI::dbh->prepare("SELECT en, tr FROM $table WHERE en = ?"); } } } sub lookup_csv { if ($turkish) { if ($regexp) { print "CSV metodu regex aramalarsteklemiyor!\n"; exit; } elsif ($partial) { $_ = "%" . "$_" . "%"; $DBI::sth = $DBI::dbh->prepare("SELECT tr, en FROM $table WHERE tr LIKE ?"); } else { $DBI::sth = $DBI::dbh->prepare("SELECT tr, en FROM $table WHERE tr = ?"); } } else { if ($regexp) { print "CSV metodu regex aramalarsteklemiyor!\n"; exit; } elsif ($partial) { $_ = "%" . "$_" . "%"; $DBI::sth = $DBI::dbh->prepare("SELECT en, tr FROM $table WHERE en LIKE ?"); } else { $DBI::sth = $DBI::dbh->prepare("SELECT en, tr FROM $table WHERE en = ?"); } } } sub complete_lookup { my @data; print "$_:\n" if (scalar(@ARGV) > 1 and not ($regexp or $partial)); $DBI::sth->execute($_); # Read the matching records and print them out if ($DBI::sth->rows == 0) { print "'$_' e arama sonuermedi.\n"; return; } if ($regexp) { while (@data = $DBI::sth->fetchrow_array()) { print "$data[0] => $data[1]\n"; } } elsif ($partial) { while (@data = $DBI::sth->fetchrow_array()) { print "$data[0] => $data[1]\n"; } } else { while (@data = $DBI::sth->fetchrow_array()) { print $data[1] . "\n"; } } print "-" x 10 . "\n" if (scalar(@ARGV) > 1 and not ($regexp or $partial)); } ------------ -- Alper Ersoy |