TBD sozlugu
- From: Alper Ersoy <aersoy tfz net>
- To: GNU-Tr <gnu-tr-u12a lists sourceforge net>,Gnome Turkce <gnome-turk gnome org>
- Subject: TBD sozlugu
- Date: Sun, 2 Dec 2001 10:31:07 +0200
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ılacak saklama yöntemi.
# mysql ya da csv'den biri olabilir. Her yöntemin ihtiyaç
# duyduğu ayarlar farklı:
# csv => dbdir: kelimeleri saklayacak CSV dosyasını bulunduracak dizin
# table: kelimeleri saklayacak dosya ismi
#
# mysql => dbhost: MySQL sunucusu
# dbase : Veritabanı ismi
# dbuser: Sunucuya bağlanırken kullanılacak isim
# dbpass: Sunucu parolası
# table : Kelimelerin saklanacağı tablo
######
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 ("Çalıştırmadan önce ayarlamaları yapın ve bu satırı silin!!!\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 yöntemi: $store_method\n";
print "\$store_method değişkeni sadece 'mysql' ya da 'csv' ";
print "değerlerinden 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ürkiye Bilişim Derneği'nin sözlüğünü kullanmak için
# browser yerine perl'e ihtiyac duymayı sağlayan program
use strict;
use Getopt::Long;
use DBI;
# Ayarlar
# $store_method: Kullanılacak saklama yöntemi.
# mysql ya da csv'den biri olabilir. Her yöntemin ihtiyaç
# duyduğu ayarlar farklı:
# csv => dbdir: Kelimeleri saklayacak CSV dosyasını bulunduracak dizin
# table: Kelimeleri saklayacak dosya ismi
#
# mysql => dbhost: MySQL sunucusu
# dbase : Veritabanı ismi
# dbuser: Sunucuya bağlanırken kullanılacak isim
# dbpass: Sunucu parolası
# table : Kelimelerin saklanacağı tablo
######
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 ("Çalıştırmadan önce ayarlamaları yapın ve bu satırı silin!!!\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] KELİME
KELİME'yi Türkiye Bilişim Derneği sözlüğünde ara ve sonucu göster.
-r, --regex, --regexp REGEX ifadesi
-p, --partial Bütün bir kelimenin parçası
-t, --turkish Aranacak kelime Türkçe
-h, --help Bu yazıları göster
--version Sürüm bilgisi
Ön tanımlı yöntem kelimeyi İngilizce'den Türkçe'ye çevirme ve bütün
olarak aramadır. Lütfen yanlışlıkları aersoy\@tfz.net adresine bildirin.
};
exit
}
if ($version) {
print "$0 v1.0\n";
print "Alper Ersoy (aersoy\@tfz.net) tarafından yazıldı\n";
exit
}
if (scalar(@ARGV) == 0) {
print "$0: aranacak kelime verilmedi\n";
print "Daha fazla bilgi için '$0 --help' yazın\n";
exit 1;
}
if ($regexp and $partial) {
print "Uyarı: -r parametresi -p'den öncelikli, partial parametresi gözardı edildi\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 yöntemi: $store_method\n";
print "\$store_method değişkeni sadece 'mysql' ya da 'csv' ";
print "değerlerinden 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 aramalarını desteklemiyor!\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 aramalarını desteklemiyor!\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 "'$_' üzerine arama sonuç vermedi.\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
[Date Prev][
Date Next] [Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]