TBD sozlugu



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]