0x7D3, Perl, NTP, vs.

0
FZ
Yeni yılda FM için yazacağım ilk makaleye başlamadan önce tüm okurlara ve katılımcılara barış dolu bir ömür diliyorum.

Bilen bilir zaman konusunda biraz hassasımdır. Hayır yani aşırı değil ama benimle "adama bak, ofisteki PC saatini California'daki bir atom saatine göre senkronize ediyor, deli midir nedir?" şeklinde dalga geçilmesine yol açacak kadar hassasım :).


Bu hassasiyetimi evimdeki Debian GNU/Linux yüklü bilgisayarıma taşımak istedim ve bu tam da 31 Aralık akşamına denk geldi. "Hazır yeni bir yıla giriyoruz, zamanımızı doğru düzgün ölçelim, saniye sektirmeyelim" diye düşünürken (sanki evde nükleer reaktör ya da uzay üssü var, peh!) bir de baktım ki tam da o hassas olduğum zaman benim aleyhime işliyordu çünkü yarım saat içinde yetişmem gereken bir yılbaşı partisi vardı. Ve ben elimdeki abuk sabuk bir HTML dosyasının içinden zaman sunucuların IP adreslerini çekmek istiyordum.

Bir dakika, bir dakika, baştan alalım. Kafalar karışmış olabilir. Eğer sisteminizdeki saat mümkün olabilecek en yüksek hassasiyetle doğru zamanı göstersin istiyorsanız, hassas derken kast ettiğim zaman dilimi değil, zamanın belli bir hassasiyette doğru olması, o zaman imdadınıza NTP yani Network Time Protocol denilen bir protokol ve bununla ilgili yazılımlar yetişir. İşte bu yazılımlardan bir tanesi olan ntpdate yazılımı tam da benim işimi görecek türden küçük, basit bir yazılımdı. Yaptığı iş bir zaman sunucusu bilgisayara bağlanıp NTP protokolünü kullanarak sistem saatini kontrol eden ve gerekli senkronizasyonu, düzeltmeyi gerçekleştirmek olan bu yazılıma komut satırından herhangi bir zaman sunucusunun IP adresini vermek yeterli olacaktı:

$ ntpdate 137.92.140.80

gibi. apt-get install ntpdate ile sistemime gerekli yazılımı kurduktan sonra sıra geldi zaman sunucu olarak çalışan bilgisayarların IP adresine ulaşmaya. Biraz araştırınca bunların bir listesine eriştim ve ilgili HTML dosyasını diske kaydettim. Tabii burada küçük bir mesele vardı, benim istediğim aslında yığınla HTML bilgisi değil içinde sadece ve sadece her bir satırında tek bir zaman sunucu IP adresi bulunan bir .txt dosya idi. İşte tüm zamanların en fantastik programlama dillerinden biri olan Perl bu aşamada devreye girdi. Yani elimde acilen işlemem gereken bir HTML dosyası vardı, bunun içinden belli bir kalıba uyan satırları bulup o kalıbı çekmem ve sonucu da başka bir dosyaya yazmam gerekiyordu. Bu arada acilen yetişmem gereken bir yılbaşı partisi olduğunu söylemiş miydim? Çabuk, çabuk!

Hemen aradığım kalıbın ne olduğunu düşündüm. Bir IP adresi. Hmm, ancak elimdeki HTML dosyasının içeriğine baktığımda genellikle bu IP adreslerinin parantezler arasında bulunduğunu gördüm. Ayrıca parantezler ile IP adresleri arasında bir miktar boşluk da bulunabiliyordu. Yani aradığım kalıp şöyle bir şeydi: Bir parantez, sonra sıfır ya da daha çok sayıda boşluk, sonra bir IP adresi, sonra gene sıfır ya da daha çok boşluk ve sonra gene bir parantez. Peki IP adresinin kalıbı? Basit: (En az 1, en fazla 3 sayı, sonra bir nokta) * 3 ve hemen ardından da en az 1 en fazla 3 sayı, yani 137.92.140.80 gibi bir şey. Bu kalıbı kafamda netleştirdikten sonra yapmam gereken bunu Perl dilindeki Regular Expression kurallarına uygun olarak söylemekti, o kuralların bir kısmı ise şöyleydi:

\s ==> boşluk ([ ] olarak da yazılabilir, bkz. devamı)
* ==> kendinden önce gelen her ne ise ondan sıfır ya da daha çok sayıda
{m, n} ==> kendinden önce gelen her ne ise ondan en az m, en çok n sayıda
{m} ==> kendinden önce gelen her ne ise sadece m sayıda ==> kendinden sonra gelen eğer özel (meta) karakteri normal karakter olarak algıla
[abc] ==> a, b, c veya d karakterlerinden herhangi birini yakala
(abc) ==> gruplandırma, yani "abc"yi tek bir karakter, bir kalıp gibi düşün

Bu kuralları ve elimdeki akıl yürütmeyi göz önünden bulundurarak şöyle bir RE (Regular Expression) kurdum:

\(\s*(\d{1,3}.){3}\d{1,3}\s*\)

(Parantez özel bir karakter yani gruplandırma operatörünün bir parçası olduğu için eğer RE dilinde "parantezi yakala" demek gerekiyorsa bunun için ( yazmam gerekiyordu, buna dikkat edin.)

Şimdi yapmam gereken neydi? Tabii ki ilgili HTML dosyasından yukarıdaki kalıba uyan satırları çekip çıkarmak. Bunun için Perl'e git falanca dosyayı aç diyebilirdim ama zaten Perl denilen güzel dil:

while (<>) { ... }

yapısını görünce benim komut satırında programa vereceğim herhangi bir dosyayı açıp içini okumaz mıydı ki? Bu durumda yapmam gereken bu yapıyı kullanıp okunan her satırda yukarıdaki RE kalıbına uyan bir şeyler olup olmadığını tespit etmek idi:

while (<>) {
      if (/\(s*(\d{1,3}.){3}\d{1,3}\s*\)/g) {
         ...
      }
}


Şimdi gerekli döngüyü ve kontrol yapısını kurduğuma göre ilk yapmam gereken ilgili kalıp bulunur bulunmaz bunu bir değişkene atamak idi. Perl'de bulunan bir kalıbın otomatik olarak $& değişkeninde depolandığını biliyordum. Ancak bu yeterli değildi, çünkü tamam yani benim kalıbıma uyanları böylece çekmiş olacaktım ama o zaman elimde (158.12.25.78) gibi bir şey yani parantezler içinde bir IP adresi olacaktı ve ben bu parantezlerden kurtulmak istiyordum. Yine RE kurallarına göre düşündüm ve kurtulmak istediğim kalıbın şu olduğunu gördüm:

[)(]

(Köşeli parantezler içindeki normal parantezlerin sırasını değiştirebilirdim tabii ki, ama o zaman daha doğal gibi görünmekle birlikte benim için biraz kafa karıştırıcı bir görüntü çıkacaktı, bu arada "iyi de parantezler özel karakterler değil miydi, neden onları olduğu gibi yazdın?" diye itiraz edeceklere cevabım: "[ ve ] karakterleri arasında parantez karakterlerinin özel bir anlamı yoktur yani metakarakter muamalesi görmezler.)

Kurtulmak istediğim kalıbın yerine ne koyacaktım? Hiçbir şey! :) İmdadıma Perl'deki SUBSTITUTION yani YERİNE KOYMA operatörü yetişti, kısaca:

s/ARANANKALIP/YERINEKONMASINIISTEDIGIMSEY/

Yani:

s/[)(]//g

(En dipteki g, bu işlemi global olarak yani ilgili karakter dizisinin her yerinde yapmak için).

IP adresini bir değişkene atadıktan sonra SUBSTITUTION işlemini uygulamanın ve sonucu basmanın yeterli olacağını düşündüm ve şöyle bir şeyler ekleyerek programın gövdesini nerede ise tamamladım:

while (<>) {
    if (/\(\s*(\d{1,3}.){3}\d{1,3}\s*\)/g) {
                 $ip_address = $&;
                 $ip_address =~ s/[)(]//g;
                 print $ip_address . "\n";
    }
}


Yapılması gereken bir iki ufak tefek iş kalmıştı: 1) Bu programı Perl'in anlayabileceği şekilde temp.pl dosyasının içine yerleştir:

temp.pl :
#!/usr/bin/perl -w 
 
while (<>) { 
        if (/(\s*(\d{1,3}.){3}\d{1,3}\s*\)/g) { 
                $ip_address = $&; 
                $ip_address =~ s/[)(]//g; 
                print $ip_address . "\n"; 
        } 
} 
2) Komut satırından bu programa clock1.html dosyasını girdi olarak verip çıktıyı da TimeServers.txt diye yeni yaratılacak olan bir dosyaya yönlendir:

$ ./temp.pl clock1.html > TimeServers.txt

1.5 haftadır, akşamları 30 dk. harcayarak Perl öğrenmeye çalışan ve daha yolun çok başında olan benim gibi Perl programcısı için fena sayılmaz. Yukarıdaki işlemi gerçekleştirmem yaklaşık 20-25 dakikamı aldı (birkaç deneme yanılma, hata ayıklama vs.) dahil. Yılbaşı partisine de tam zamanında yetiştim ve arkadaşlarımla oynadığım TABU oyununda sıra bana gelip de LAMA ile karşılaşınca yine Perl'den faydalanarak kolayca bu sözcüğü de anlatabildim ;-) Sonra da gelip bu küçük ama anlamlı deneyimi sizinle paylaştım.

Yorumları ile bu yazıyı zenginleştirecek arkadaşlara şimdiden teşekkürler.

Görüşler

0
anonim
perl için hangi kaynakları önerebilirsin?
0
cayfer
Reklam yapmak gibi olmasın ama

Perl ve MySQL ile CGI Programlama kitabımın üçte biri Perl ile ilgili.

0
FZ
cayfer hocamız konu ile ilgili çok güzel bir Türkçe kaynak önermiş.

Benim elimde ise Randal L. Schwartz ve Tom Christiansen isimli iki büyücü tarafından yazılmış Learning Perl kitabı var. Ben de bunu tavsiye ediyorum (eğer İngilizce biliyorsan).

Bunun haricinde Internet''te de pek çok kaynak bulabilirsin ayrıca Perl ile birlikte gelen dokümantasyon da epey iyidir (referans, başvuru kılavuzu olarak).

Bu arada aklında bulunsun ki Perl gayet kolay bir şekilde MS Windows ortamlarında da kurulup canavar gibi çalıştırılabiliyor yani UNIX, Linux ortamları ile sınırlı değilsin sadece Perl ile sınırlısın :)
0
tongucyumruk
Peki ama sed, grep dururken niye Perl?

tonguc@serafettin $ sed dosyaadi.html -e > timesserver.txt

veya sed'de daha önce ile ilgili sorunlar yaşadığımı düşünürsek:

tonguc@serafettin $ grep (s*(d{1,3}.){3}d{1,3}s*) clock.html | sed s/[)(]//g - > TimeServer.txt

daha kolay olmazmıydı? Gerçi denemedim ama herhalde çalışacaktır...

Bu arada Regular Expressions ile uğraşmak isteyen herkese RegExplorer programını tavsiye ederim...

apt-get regexplorer

Eski bilgisayarımın saati her kapandığında durmaya başlamıştı (hala da durur) benim de Ntp ile tanışmam bu sayede olmuştu. Kablo bağlantısı sahibi olduğumdan beri de ntpdate her bilgisayarım açıldığında çalışır saatimi bir kontrol eder. Pek bir severim kendisini.
0
tongucyumruk
ah birde şu backslash'ler adam olsa...
0
FZ
Backslashler harbi problemli, bugün epey uğraştırdı FM editörlerini.

Gelelim senin sorularına valla Perl çünkü şu anda Perl çalışıyorum ve öğrendiğim bir iki şeyle elimdeki bir problemi kısaca nasıl çözebileceğimi merak etmiştim. Tabii ki Perl olmadan da yapılabilir sed ile, ya da awk ile ancak burada vurgulamaya çalıştığım şey Perl idi. Fazla bilgi göz çıkarmaz elbette ve tabii ki Perl yoksa ortamda awk, sed, grep vs. ile de bu işi çözebilecek bilgi seviyesinde olmak gayet güzel olur. Ve fakat tüm bu programların en iyi özelliklerini barındıran ve üstüne de harika ve geniş mi geniş bir işlevsellik koymuş olan Perl diline de biraz dikkat çekmek istedim. Bir de tersinden düşünelim, eğer ben çok iyi Perl biliyorsam ve ortamda Perl yoksa diğer GNU araçları (utility'leri) ile işi nasıl çözeceğimi 'sökmem' çok kısa sürecektir (ve tersi de bir miktar doğrudur ;-)
0
tongucyumruk
Tabiiki Perl'e ve yeteneklerine dikkat çekmek açısından oldukça iştahlandırıcı bir yazı. Şu anda bulamadım ama 7 satırlık bir Perl kodu ile DVD'lerin CSS korumasının kmırılabildiği düşünülürse Perl'ün nasıl bir dil olduğu daha iyi anlaşılır sanırım.

İster Perl ister grep, sed ile yapılsın sonuçta asıl işi yapanın scriptteki RegEx olduğu düşünülürse bence nasıl olduğunun o kadarda önemi yok...

Ama yine de sadece yönlendirme karakterlerini kullanarak tek satırda bu tip işler yapmak bana her zaman daha çekici gelmiştir.
0
anonim
regexplorer tam da benim gibi bir cekirge gibi ideal bir programmis...
ama ne yazikki illa da qt deyip duruyor
bunun gtk ui'sine sahip olani yok mudur kinem?
0
FZ
Aslında sundance arkadaşımız bana vakti zamanında demişti ki: 'Bir Regular Expression makalesi yazacam ki yok böyle, efsunlu bir şey, 3 kere üst üste yüksek sesle okuyan farklı bir boyuta geçecek, gözü kapalı herhangi bir şiire uyan RE'yi kurabilecek, falan filan' işte ben bizzat şahsen o makaleyi bekliyorum ;-)
0
tongucyumruk
Allah allah? Ben sisteme isminin başında Q veya K olan paketleri kurmadım ama RegExplorer sağlam çalışıyor...
0
anonim
ona cok benzer baska bir program daha buldum: visual-regexp. gtk tabanli olmasa da tcl/tk ile calisiyor en azindan qt'den daha hafif bir sey...

ama bu sefer de baska bir problem ortaya cikti: RE ogrenmem gerekiyor =)
en iyisi bende su bahsedilen makeleyi beklemeye koyulayim...
0
FZ
Eminim sundance çok daha güzelini yazacaktır ama sen neden şimdiden konuya girmiyorsun:

1) Perl Regular Expression Tutorial (güzel)


2) Regular Expression Tutorial (fena degil, biraz daha basit)


3) Linux RegEx Tutorial (biraz daha kapsamlı ve ileri seviyeli, buna daha sonra bak)


Takıldığın bir şey olursa lütfen sormaktan çekinme.
0
m1a2
Vayy, yeni yıla perl hacking`le girmek ha... Bu işi sevdim :)

Yazı gerçi perl etrafında ama bu `ntpdate` ve `linux`da zaman` hakkında birkaç laf da ben edeyim. Birçok kullanıcının önemsemediği fakat Unix`de çok çok önemli olan bir konudur bu. Sistem zaman ayarına göre işini yürüten bir ton araç var. Hâl böyle olunca zamanı ayarlama hakkı da öyle herkese verilmiyor ve ayrıca linux donanim saati bilgisini bir kere CMOS clock`dan aldıktan sonra olayla bizzat kendisi ilgileniyor. Burada bazı ilginç noktalar var. Meselâ kernel, BIOS`dan saati okuduktan sonra bir kaç sistem değişkeni üzerinden yaptığı ön kalibrasyondan sonra sistem saatindeki (dikkat donanım saati yani hardware clock değil) -istatistiksel olarak beklenen- kaymaları (`drift`) düzeltmek için hiç de basit olmayan bir algoritma kullanıyor. Neyse bu `zaman` hadisesi üzerine ayrı bir makale yazılası bir konudur. Meselenin göründüğünden de çok daha kompleks ve önemli olduğunu vurgulamak için yazdım bunları. (HOWTO`lara müracaat.)

Burada değinmek istediğim pratik bir husus var. Linux (micros~1`un konseptlerinden farklı olarak ;) bir kere boot edildiğinde -kernel update`leri dışında- reboot edilmeyecek tarzda dizayn edilmiştir. (İsmini şu an hatırlamadığım bir kernel patch`i vb. bir şey görmüştüm, bu tür kernel güncellemeleriyle reboot edilmesini önlemek için) Bu time-server olayı da unix`un `design requirements`ları ile uyumludur. Peki -elektrik faturalarını da göz önüne alırsak- bizim gibi makinasını hergün aç-kapa yapmak durumunda olan biçare kullanıcılar ne yapacak? Evet, `ntpdate` _sistem saatini_ tune ediyor ama makinayı kapattığımızda bu ayar yok olacaktır, çünkü düzeltilen _sistem saati_ -root olarak- bu istikamette bir girişiminiz olmadığı müddetçe donanım saatine (=BIOS saati) yazılmaz. Windows ne yapar dersiniz? Bir kere saati direk BIOS`dan okur ve `day light saving`de de yaptığı gibi herhangi bir kullanıcıya BIOS saatini değiştirmesi için bir güzel izin verir. Sonuç: Linux`u açtığınızda -boot aşamasındaki sistem saat=donanım saati önyüklemesinden dolayı düzgün şekilde kaymış bir sistem saati. Saati bu tip sebeplerle kaymış o kadar makina gördüm ki bahsetmeden geçmeyeyim dedim. Hatalı bir sistem saatiyle sakın ha sakın ciddi `development` işleri yapmayın. Saat bir kere doğru ayarladıktan sonra fazla kurcalamaya da gelmez. Bir makinada başıma gelmişti. Saatle epey oynadıktan sonra bazı programların göçtüğünü gördüm. Esasında `zaman ayarlarıyla` tetiklenen bug`ları yakalamak için ayrı bir seans düzenlemek gerekiyor ;)

Başlangıçtaki soruya döneyim. `ntpdate` ile ayarlanmış sistem saatini donanım saatine yazmak gerekmekte. Internet`e `ppp` ile çıkan kullanıcılar için doğru yöntem bir `ip-up` script`i kullanmak. Yani: `ppp` bağlantısı gerçekleştiğinde `ntpdate` ile saati senkronla ve sonra da donanıma yaz. `ntpdate` paketiyle bir `init` script`i geliyor, fakat bu script ev kullanıcıları için pek uygun değil. Kendi makinamda `/etc/ppp/ip-up.d`ye koyduğum `ntpdate` script`ini buraya alayım:

#! /bin/sh # `/etc/ppp/ip-up.d/ntpdate` olarak kaydedilmeli... test -f /usr/sbin/ntpdate || exit 0 if [ -z $NTPSERVERS -a -f /etc/default/ntp-servers ]; then . /etc/default/ntp-servers fi # Hicbirsey bulamazsaniz diye sey ettim :) [ -z $NTPSERVERS ] && NTPSERVERS=tick.usno.navy.mil /usr/sbin/ntpdate -u -s -t 5 $NTPSERVERS # Kritik: sistem saati --> hardware saati /sbin/hwclock --systohc
Tabii bu ayarlar Debian için. Diğer dağıtımları bilemiyorum. `ntpdate` dışında bir de `chrony` var ama doğrusu ben biraz karışık buldum. `ntpdate`den çok memnunum. Internet`e her çıkışınızda saatinizin saliseler düzeyinde düzeltilmesini istiyorsanız derhal kurunuz :) Ha bir de şu: bunca laftan sonra `yaa düşünebiliyormusunuz, bu linux`da ben makinanın saatini bile ayarlayamıyorum, ne kadar uyuz bir iş bu` diyeni ne yapmalı?
0
m1a2
`pire` tag`iyle html olarak gönderdim ama script bozuldu :( Bir kere daha deniyorum... #! /bin/sh # `/etc/ppp/ip-up.d/ntpdate` olarak kaydedilmeli... test -f /usr/sbin/ntpdate || exit 0 if [ -z $NTPSERVERS -a -f /etc/default/ntp-servers ]; then . /etc/default/ntp-servers fi # Hicbirsey bulamazsaniz diye sey ettim :) [ -z $NTPSERVERS ] && NTPSERVERS=tick.usno.navy.mil /usr/sbin/ntpdate -u -s -t 5 $NTPSERVERS # Kritik: sistem saati --> hardware saati /sbin/hwclock --systohc
0
FZ
Yukaridaki scripti denedim sorunsuz çalıştı (tabii ilgili dosyaya çalıştırma izni vermeyi unutmamak lazım :)

Teşekkürler.
0
FZ
m1a2 durdu durdu ve yine süper yapıcı, bilgilendirici, aydınlatıcı bir yorumla makaleyi zenginleştirdi!

Ben de tam, 'yahu Internet'e hala dial-up bağlanıyorum, şöyle bir düzenek kursam da sadece Internet'e bağlandığımda zaman ayarı çekse sistem kendi kendine, boot esnasında Internete bağlı olmadığım için ayarlamaya çalışmasının bir manası yok' diyordum ki m1a2 beynimi okudu sanki!

En kısa sürede verdiğin betik (script) dosyasını deneyeceğim (bu arada şu betik lafının da hastasıyım :-P

Bu arada NTP dokümantasyonunda ntpdate artık eskidi, aynı işlevsellik ntpd içinde var onu kullanın falan yazmışlar ama ben gene de ntpdate yazılımını tercih ediyorum çünkü ntpd yani NTP daemon çok genel ve benim o kadar işlevselliğe ihtiyacım yok açıkçası.
0
conan
script yorum olarak yollaninca bozuluyor. O yuzden buraya bakalim. ;)
0
FZ
CROM adına! Yani diyorsun ki siz sıradan ölümlüler gibi Internet tarayıcı benzeri hantal programlarla uğraşamam, madem elimin altında Perl var gider ilgili HTML dosyasını da yine Perl ile çekip anında üzerinde işlem yaparım.

Susuyorum ve içimden TIMTOWTDI diyorum ;-)
0
conan
CROM! TCP packetlerini say!
cat /proc/net/dev | grep eth0 | cut -d -f 4
0
FZ
Ama kılıç tek başına işe yaramaz, onu ölümcül kılan sahibinin ruhundaki bilgeliktir!
0
HoLY
how about
echo -ne ''GET /~mills/ntp/clock1.html HTTP/1.0'' | nc www.eecis.udel.edu 80 | sed -n -e ''/
  • /p'' | awk --field-separator='')'' ''{print $1}'' | awk --field-separator=''('' ''{print $2}'' | sort | cut -d , -f 1 > ipfile.txt
  • 0
    conan
    perl bilmio tabii heueheuh
    0
    FZ
    Ama nc (Netcat, TCP/IP Swissknife), sed (stream editor), awk (Aho, Weinberger, Kerninghan), sort, cut ve genel olarak shell programlama biliyor. Saygı duyarım ;-)

    Ben gidip biraz daha Perl çalışayım :)

    Bu arada benim one-liner'ı geliştirebilecek kimse yok mu yahu? E hadi ama, ne güzel girdik konuya ;-)
    0
    conan
    scriptin yeni versiyonu.
    0
    sundance
    Bir başka laf da der ki; `Eğer usta bir marangozun aletlerini kullanırsan, büyük ihtimalle elini kesersin` :)
    0
    FZ
    Şu benim uzun mu uzun (!) Perl programının tek satırlık hali (Perl one liner):

    perl -wlne '/(s*(d{1,3}.){3}d{1,3}s*)/g&&(print $&)' clock1.html

    Bu hali parantezleri ayıklamıyor, usta bir Perl programcısı olmadığımı (henüz) söylemiştim ;-) Parantez ayıklayabilme işlevini de yukarıdaki tek satırlık programa ekleyip yollayan olursa sevinirim ;-)

    Not: Çift tırnaklar aslında tek tırnak olmalı ve eğer backslash görmezseniz orjinal programdaki RE''ye bakın, orada var (yalnız noktadan önce de bir backslash olması gerekiyor buna dikkatedin).

    Meraklısı için not:

    -w Enable warnings (Saçmaladı isem uyar)

    -l Enable line-end processing (Satır basarken dibine yani ENTER da bas ;-)

    -n Implicit non-printing loop (while ile uğraştırma beni, açıktır ki bir döngü içinde çalışmanı istiyorum)

    -e Execute the following commands (sana verdiğim komut dizisini hemen ardından gelen dosya üzerinde çalıştır)

    Bir şeyi yapmanın birden fazla yolu vardır. Gerçek programcılar tembel ve sabırsızdır. Larry Wall
    0
    FZ
    Şu benim uzun mu uzun (!) Perl programının tek satırlık hali (Perl one liner):

    perl -wlne '/\\(\\s*(\\d{1,3}\\.){3}\\d{1,3}\\s*)/g&&(print $&)' clock1.html

    Bu hali parantezleri ayıklamıyor, usta bir Perl programcısı olmadığımı (henüz) söylemiştim ;-) Parantez ayıklayabilme işlevini de yukarıdaki tek satırlık programa ekleyip yollayan olursa sevinirim ;-)

    Not: Çift tırnaklar aslında tek tırnak olmalı ve eğer backslash görmezseniz orjinal programdaki RE'ye bakın, orada var (yalnız noktadan önce de bir backslash olması gerekiyor buna dikkatedin).

    Meraklısı için not:

    -w Enable warnings (Saçmaladı isem uyar)

    -l Enable line-end processing (Satır basarken dibine yani ENTER da bas ;-)

    -n Implicit non-printing loop (while ile uğraştırma beni, açıktır ki bir döngü içinde çalışmanı istiyorum)

    -e Execute the following commands (sana verdiğim komut dizisini hemen ardından gelen dosya üzerinde çalıştır)

    'Bir şeyi yapmanın birden fazla yolu vardır. Gerçek programcılar tembel ve sabırsızdır.' Larry Wall
    0
    conan
    >Biraz araştırınca bunların bir listesine eriştim ve ilgili HTML dosyasını diske kaydettim.

    Listenin sayfasi degismis.
    http://www.eecis.udel.edu/~mills/ntp/clock1.html degil artik
    http://www.eecis.udel.edu/~mills/ntp/clock1a.html
    olmus
    Görüş belirtmek için giriş yapın...

    İlgili Yazılar

    FINDIK - Herkese Açık Filtre

    anonim

    İçerik analizi ve filtreleme alanında yeni bir enerji yiyeceği, yolculuğuna başladı. Bugün 0.2g sürümüyle erişebileceğiniz FINDIK, benzer kapsamdaki diğer yazılımlar ile çekişmeli bir yarış içerisine girmeye hazırlanırken, Türkiye’deki açık kaynak gönüllülerinin yardımlarını bekliyor.

    Dil Hatası Yapanları Engerek 0.1 Isırıyor Dikkatli Olun!

    FZ

    Ali Alphan Bayazıt'ın duyurduğuna göre özgür Türkçe yazım denetçisi engerek, Debian GNU/Linux paketiyle beraber piyasaya çıktı. Bu sürüm, muhtemel gelecek sürümler gibi Zemberek kütüphanesinin gcj dostu bir çeşidini kullanıyor.

    Kurulum detaylarını buradan öğrenmek mümkün. Alphan Bayazıt, engerek sistemini Emacs, Kate, Kedit, KOffice ve Konqueror ile denediğini, sonuçtan memnun kaldığını belirtiyor.

    Kendisine teşekkür ediyor ve yazılımını acımasızca test edip hata raporuna boğmak için hep birlikte kolları sıvıyoruz (yapıyoruz değil mi? ;-)

    Siz İngilizce Sorun, PRECISE SQL´e Dönüştürsün

    FZ

    Bir sürü tablo, en ufak bir sorguda bile bir sürü `JOIN´ işlemi. Kullanıcıların talep ettiği raporlar için her seferinde sıfırdan tasarlanan SQL sorguları ya da parametrik arabirimler vs. Oysa kullanıcılar kendi doğal ve alışık oldukları dillerinde veritabanını sorgulayabilseler işimiz kolaylaşmaz mı? Washington Üniversitesi araştırmacıları da bu problem üzerinde uzunca bir süredir çalışıyorlar ve bunun sonucunda ortaya şunu koymuşlar: `The PRECISE Natural Language Interface to Databases´

    Açık Squeak Kitabı Yayınlandı

    zekzekus

    Geçtiğimiz günlerde burada haberini verdiğimiz açık Squeak kitabı yayınlandı.

    StarLogo'nun Yeni Versiyonu Duyuruldu

    ahmetozdemir

    Modelleme ve simülasyon yazılımı StarLogo'nun yeni versiyonu StarLogo TNG (The Next Generation) Preview 2 duyuruldu. Bu sürümdeki en büyük özellik Preview 1'den her bakımdan daha hızlı olması.