TRForumcu.NeTWebmaster / Web Dizayn Scriptler / Programlama DilleriWeb tasarım / ASp, PHP,CGI Scriptler (Moderatör: Gondolin)Cgi - Perl Kullanımı
Konu Bilgileri
Konu Başlığı Cgi - Perl Kullanımı
Cevaplar 10
Sonraki Sonraki Konu
Görüntüleyenler0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Görüntülenme 396
Önceki Önceki Konu
Sayfa: [1] 2   Aşağı git
Yazdır
Konu Derecelendirme: 0 Bookmark and Share
Konu: Cgi - Perl Kullanımı  (Okunma Sayısı 396 defa) EkleBunu Sosyal Paylaşım Butonu
Gondolin
Bölüm Sorumlusu
*


Mesaj : 1.169
Forum Para : 7896.00 YTL
« : 02 Mayıs 2008, 11:03:03 »


HTML ile uğraşmaya başladınız ve hemen bu dilin yetersizliklerini keşfettiniz. Bu eksikleri Javascript ile gidermeye çalıştınız. Fakat halâ eksik bir şeyler var. Sayfalarınıza Form koyuyorsunuz, fakat “mailto:” köprüsünden başka bir ACTION koyamıyorsunuz. Veya koyuyorsunuz da hep başkalarının yazdığı programlara, Script’lere köprü veriyorsunuz. Çoğu zaman bu köprüler de işlemiyor.
CGI dünyasına hoşgeldiniz!
Eğer şu andaki planlarınızın arasında yeni bir dil öğrenmek yoksa, korkarım planlarınızı değiştireceksiniz. Bir dil öğrenmeye çoktandır niyetli idiniz, fakat bir türlü dili belirleyemiyor idi iseniz, tebrikler, Perl öğreniyorsunuz!
Hemen gözünüz korkmasın! Muhasebe veya kelime-işlemci bir program yazacak şekilde Perl öğrenmeye kalkmayacağız. Zaten bu kadarcık bir kitapçıkla, Perl gibi bir dil öğrenilemez. Sadece CGI’a yetecek kadar Perl öğreneceğiz. Bu, Web sitenize evsahipliği yapan Web Server’a “Filanca formdaki bilgileri al; şu dosyaya ekle; sonra formu dolduran kişiyle elektronik mektup yollayarak teşekkür et vebana da durumu bildir!” demeye yetecek kadar Perl demektir.
Perl, Internet bu kadar yaygın değilken, yani tarihin karanlık çağlarında (illâ bilmek istiyorsanız, 1986 yılında!), Larry Wall adında Unix işletim sistemi ile çalışan bir bilgisayar ağının yöneticisi tarafından, hergün yaptığı işleri kolaylaştıracak bir makro dili olarak geliştirilmiş. Larry, sorumlu olduğu sistemin kullanımı ve durumu ile ilgili yüzlerce raporu yazdırmak için komut istemci satırından aynı komutları tek-tek girmekten bıkmış. Kendi kendine “Şu sisteme bütün bu komutları hergün tek tek vermektense bir dosya olarak versem; ne kadar kolay olur!” demiş. Fakat o tarihte Larry’nin Unix’inde ve diğer Unix türevlerinde bir çok programlama dili mevcut olduğu halde, “pratik,” bir yığın raporu alıp içinden gerekli bilgileri “çeken” ve bunu “rapor” haline getiren bir dil yoktu. Larry, çaresiz kalan bütün bilgisayarcılar gibi, oturdu, kendi programlama dilini kendisi yazdı! Ortaya çıkan dile, Practical Extraction and Report Language (Pratik Çekme ve Rapor [etme] Dili) adı verildi. Tek işlevi vardı: Unix operatörünün çeşitli kayıt (log) dosyalarından ihtiyacı olan bilgileri çekip, bir rapor biçimine sokarak, ya yeni dosyaya kaydetmek, ya ekranda görüntülemek ya da yazıcıda yazdırmaktı.
Fakat ilk sürümünü paylaşanlar Perl’ü (ki ilk sürümünde adı bile yoktu!) o kadar sevdiler ki, 1988 Usenet Konferansı’na katılanların kapış kapış paylaştığı tek şey Perl disketleri oldu. Perl’ün şöhreti Unix ile sınırlı kalmadı; Microsoft firması NT, IBM ise OS/2 için sürümlerinin hazırlanmasına yardımcı oldular. Netscape, Apache ve Microsoft Web Server programlarına Internet Client (istemci) programları (Internet sitelerini ziyaret eden kişinin Browser’ı) tarafından gönderilecek bilgilerin işlenmesi gibi Web Server’a bir dizi komut vermek vermek gerektiğinde kullanılacak Script (betik) dili aradıklarında tereddütsüz Perl’e de yer verdiler. Perl bu amaçla kullanılabilecek diller arasında gerek kullanım kolaylığı, gerekse Unix uzmanları tarafından zaten yaygın olarak kullanılması sebebiple ön sıraya geçti. Şimdi 5’nci sürümüne ulaşmış bulunan Perl ile ilgili temel bilgiyi 200 küsur sayfalık “perl manpage” dosyasında bulabilirsiniz. Bu dosyayı indirebileceğiniz yerlerin başında Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresi gelir. Ayrıca Usenet’te Perl’ün gelişimi konusundaki şu Haber Gruplarına bakabilirsiniz:
news://comp.lang.perl.announce
news://comp.infosystems.www.authoring.cgi
Perl’ün bu denli tutulması ve Internet’te istemci ve sunucu sistemler (Browser ve Web Server) arasında aracı olarak kullanılması bir kaç sebebe bağlanabilir. Bunların başında Perl’ün bir Script dili olması gelir: yani Perl ile yazdığınız program, bir düz yazı dosyasıdır ve çalışabilmesi için bir yorumlayıcıya ihtiyaç vardır. Derlenmemiştir; yani ortada bir .exe veya .com dosyası bulunmaz.
Şimdi biraz da CGI üzerinde duralım. Yukarıda CGI’ın, Internet istemcisi ile sunucusunun buluştuğu nokta olduğunu belirttik. Bu noktaya Common Gateway Interface (Ortak Geçit Arayüzü) denir, çünkü Web Server programı, istemci programdan (browser) kendisini çalıştıran bilgisayara gönderilen komutlar için bir geçit noktasıdır. Sizin Web tasarımcısı olarak sözgelimi bir Form’daki bilgilerin alınıp, bir dosyaya kaydedilmesi için vereceğiniz komutu, sitenizin bulunduğu bilgisayarın işletim sistemi icra edecektir. Formunuzdaki bilgilerin alınıp, söz gelimi size elektronik mesaj olarak gönderilmesini istiyorsanız, gerçekte sitenizin evsahibi olan bilgisayara, “E-mail programının mektup gönderme bölümünü çalıştır da, şu mektubu gönder bakalım!” demiş oluyorsunuz. Bu komut icra taleplerinin, Internet’ten (browser’dan) alınıp evsahibi bilgisayarın işletim sistemine aktarılması için bir ortak geçit ve bu geçitte sizin bu komut taleplerinizi karşılayıp, işletim sistemine aktaracak bir ara-birim gerekir. Bu arabirim, CGI’dır.
CGI programı dediğimiz şey ise Perl’le yazılabilir; C, Delphi, Visual Basic ile yazılabilir; yeter ki Web Server bu programı çalıştırabilsin; programın vereceği komutları alıp, kendisinin de “üzerinde” bulunduğu işletim sistemine iletebilsin.
<cgi-perl001.tif>
Bu ilişkileri daha iyi anlayabilmek için biraz daha yakından bakalım. Internet’te istemciler ve sunucular vardır. İstemci (client), bir Internet Browser programıdır; bu program kullanıcı olarak bizim arzu ettiğimiz Internet adresini bulmak ve bu adresteki HTML belgesini Browser penceresinde görüntülemekle görevlidir. Internet dediğilmiz kablolar, uydular, Router’lar kümesinin nasıl çalıştığınızı bildiğinizi varsayıyorum. Bu konuda birçok yerde, örneğin Byte Dergisinin Kasım 1998 sayısıyla birlikte verilen Bir Web Sitesi Kuralım adlı kitapçıkta, gerekli bilgiyi bulabilirsiniz. Internet’in diğer ucunda bulunan sunucu da tıpkı bizim Browser programımız gibi bir programdır; bir bilgisayarda çalışır ve o bilgisayarda da tıpkı bizim istemci bilgisayarımız gibi bir işletim sistemi bulunur. Bizim istemci olarak gönderdiğimiz talep, sunucuya ulaştığında neler olur? Önce Web Server programı, talebi inceler, taleple birlikte kendisine gelen bir çok bilgiyi kaydedeceği bir ortam (Enivronment) oluşturur. Sonra talep edilen HTML dosyasını kendi bilgisayarında bulur ve istemciye gönderir.
İstemci olarak her zaman “düz” bir HTML dosyası talep etmeyiz. Kimi zaman sözgelimi bir form’da “Gönder” düğmesini tıklarız. HTML bilginizi yoklayın; genellikle bir Gönder düğmesi, ait olduğu Form etiketinin ACTION bölümünde yazılı “komutu” harekete geçirir. Böyle bir “istem” halinde neler olur? Bizim açımızdan farklı hiç bir şey olmaz: bizim Browser programımız tıpkı düz bir HTML talep ettiği gibi, Formun bilgisini derler-toplar paketler Sunucu’ya gönderir. Gönderilen “şey” yine Internet denen ortamdan geçer ve sunucuya ulaşır. Fakat bu kez sunucuda farklı işlemler olur:
<cgi-perl002.tif>
Sunucu, kendisine gelenleri inceler ve ikiye ayırır: Veriler ve komutlar. Veriler, bizim için o anda oluşturulan ortamda kaydedilir; komutlar ise çalıştırılmak üzere işletim sistemine aktarılır. Web Server programının çalıştığı işletim sistemi, kendisine Web Server tarafından iletilen “Şu komutu icra et bakalım!” talebini inceler; ve gereğini yerine getirir. (Bu komut, “C: sürücüsündeki bütün bilgileri sil!” bile olsa! Buna aşağıda döneceğiz.)
Bu anlamda CGI, istemcinin Web Server’a ve onun işletim sistemine “iş yaptırttığı” noktadır. CGI programı, bu işleri belirten programdır. Perl, bu programları yazdığımız ve çağırdığımız programı yazmakta kullandığımız bir dildir.
Perl ile çok iş yapılabilir. Fakat bu kitapçıkta biz Perl’ün sadece CGI’ı ilgilendirdiği kadarıyla ilgileneceğiz. Başka bir deyişle bu kitapçık bir Perl kitapçığı değil, bir CGI kitapçıdır. İlgimiz dil olarak Perl’den çok Perl’ün CGI’da nasıl kullanılacağına yönelik olacaktır. Dolayısıyla, önce uzun uzun CGI’ı tanıyacağız. Bunun için Web Server’ın ne olduğuna ve nasıl çalıştığına bakacağız. Ve tabiî bu amaçla bir çok Perl programı yazacağız.
Perl ile veya hangi dille yazılırsa yazılsın, CGI programı kendi başına iş yapmaz, Web Server’a o işin yapılmasını bildirir. Başka bir deyişle Perl ile yazacağımız CGI programı aslında sadece Web Server’ı “programlamaya” yarar. Kelime-işlem programınız için makro yazarken nasıl bu programın neler yapabileceğini bilmek zorunda iseniz, CGI programı yazabilmek için de Web Server programını tanımanız, imkan ve yeteneklerini, işletim sistemi ile nasıl etkileştiğini bilmeniz, dolayısıyla bir ölçüde de olsa işletim sistemi tanımanız gerekir. Bu kitapçıkta bu bilgiler yer alıyor.
Kişisel Web Server Kuralım
Şimdi asıl mevzuya girmeden kısa bir hazırlık yapmamız gerekir. Diyelim ki bir CGI programı yazdık. Bu programı Web Server’a gönderip, uygulamaya koymadan önce, kendi bilgisayarımızda denememiz gerekmez mi? Fakat dedik ki, CGI programları Server için yazılır ve Server’da çalışır. Bugüne kadar istemci olmaktan başka bir işlevi olmayan kendi bilgisayarımızda bu işi yapabilir miyiz? Evet yaparız; yapmak zorundayız. Bir CGI programını gerçek Web Server’da, gerçek Internet’te denemeye kalkmak, hem çok tehlikeli olabilir, hem de çok masraflı. Önce kendi istemci bilgisayarımızı, küçük bir sunucu haline getirelim ve CGI programlarımızı kendi bilgisayarımızda deneyelim.
Perl, Unix dilidir; dolayısıyla herhangi bir Unix-türevi işletim sisteminde (örneğin Linux’ta) hiç bir şey yapmaya gerek olmadan çalışır. NT işletim sistemiyle çalışan Web Server programları da Perl ile yazılmış CGI programlarını çalıştırabilirler. Ücretsiz site yeri veren Web Evsahibi firmalar (Hosting şirketleri) genellikle Unix-tabanlı sistemlere sahiptir. Fakat sizin evsahibiniz NT-tabanlı bir Web Server’a sahipse, büyük bir ihtimalle sistemini Perl’ü tanıyacak ve çalıştırabilecek ekleri yapmıştır.
Yazacağımız CGI programlarını sınayacağınız kişisel bilgisayarınız Linux ile çalışıyorsa, muhtemelen bir Web Server programı ya kurulmuştur; ya da elinizdeki Linux dağıtım CD-ROM’unda bunu yapmanızı sağlayacak dosyalar vardır. Linux ile çalışan bilgisayarınıza Web Server programını kurduğunuz zaman bu program Perl’ü anlar, yorumlar ve uygular; özel bir önlem almanız gerekmez.
Kişisel bilgisayarınız Windows 95, 98, NT4 WorkStation veya NT4 Server ile çalışıyorsa, sisteminize bir Web Server programını siz kurmak zorundasınız. Windows 2000 Professional veya Windows 200 Server ise Kişisel Web Server programını kendiliğinden kurar. Ancak bütün Windows sistemlerinde, kişisel Web Server’ın Perl ile yazılmış CGI programını anlar hale gelmesini sağlamak size düşer. Şimdi kısaca bir Windows sistemine kişisel Web Server kurma ve bu Server’ı Perl anlar hale getirme konusu üzerinde duralım.
Windows 98’e bir kişisel Web Server kurmaya geçmeden önce bilgisayarımıza bir kimlik vermemiz gerekir: Bilgisayarım/Denetim Masası/Ağ’ı tıklayarak açacağınız diyaloğ kutusunda ikinci sekme olan Tanımlama’yı açın ve “Bilgisayar adı” kutusuna istediğiniz adı yazın. Bilgisayarın ağ ortamında olması gerekmez. Sonra Win98 CD-ROM’unda Add-ons klasöründeki PWS dizininde Kur.exe’yi tıklayın. Aynı işlemi NT için Option Pack CD-ROM’unu kullanarak da yapabilirsiniz. Option Pack CD-ROM’undaki Default.htm’i açarsanız, bilgisayarınızın Windows 98 ile çalıştığını algılayacak olan program size Personal (kişisel) Web Server (PWS) kurmayı önerecektir. NT4 Workstation veya NT4 Sevrer sistemlerine kişisel Web Server olarak Internet Information Server (IIS) kurulmalıdır. NT Option Pack CD-ROM’unundaki Default.htm’i açarsanız, program size IIS’ii kurmayı önerecektir. (NT4 sistemlerine IIS’i kurmadan önce, Service Pack 3’ü uygulayın; Internet Explorer 5’i kurun. Elinizde varsa Service Pack 4, 5 veya 6’yı en son uygulayın.)
//////////////////////KUTU//////////////////
PWS Kurulurken Hata Verirse
Windows 98’e PWS kurarken, programın Microsoft Transaction Server bölümüne ilişkin sistem kayıtları yapılırken, iki hata mesajı ile karşılaşabilirsiniz (0x80004005 ve 0xfee662). Bu, orijinal Windows 98 CD-ROM’undaki PWS Kur programının, Windows Registry dosyasının büyük olması halinde hata vermesinden kaynaklanıyor. Böyle bir durumla karşılaşırsanız, Bilgisayarım/Denetim Masası/Program Ekle Kaldır aracılığıyla, Personel Web Server’ı kaldırın. Bilgisayar kapanıp açıldıktan sonra, Windows 98 CD-ROM’unda Add-ons/PWS dizinindeki bütün dosyaları, sabit diskinizde Temp dizinine kopyalayın. Sonra Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresinde “Dowload Mstsetup.dll” satırını tıklayın. Mssetup.exe adlı bir dosya bilgisayarınıza indirilince; bu dosyası iki kere tıklayın ve dosyanın genişletileceği yer olarak C:\Temp’i gösterin; program Mstsetup.dll dosyasının değiştirilmesini isteyip istemedğinizi sorduğu zaman “Tamam”ı tıklayın. Şimdi, C:\Temp’deki Kur.exe (Windows CD-ROM’unuz İngilizce ise Setup.exe) programını iki kere tıklayın. PWS şimdi hatasız kurulacaktır.
///////////////////KUTU BİTTİ//////////////////////////////
Windows 987e Kişisel Web Server kurulduğunda Masaüstü’nde Yayınla (Publish) adlı bir simge belirecektir. NT sistemlerinde ise Başlat menüsünde Programlar bölümüne IIS Manager satırı eklenir. Bu yollardan biriyle PWS veya IIS’i çalıştırın; Kişisel Web Server Yönetici penceresi açılacaktır. Soldaki araç çubuğunda Yönetici’nin çeşitli bölümlerine gitmeniz gerekli gezinme simgeleri var. Şimdi, açılan ana pencerede iki unsura dikkat edin:
<cgi-perl003.tif>
1. Kişisel Web Server’ınızın adı. Bilgisayarınızın adı buraya Server adı olarak yazılmış olmalı. Biraz sonra, Internet’e koymadan önce sınayacağımız CGI programlarını içeren HTML sayfalarını çağırırken, Browser’ın adres kutusuna burada gördüğümüz adı yazacağız.
2. Kişisel Web Server’ın bilgisayarımızda sabit diskteki gerçek adresi. Bu, sizin Kişisel Web Server’ınızın kök (root) dizinidir. Bu genellikle C:\inetpub\wwwroot klasörüdür. Kişisel Web sitesi yaparsanız, sitenin gerektirdiği bütün dizinleriniz ve dosyalarınız burada gördüğünüz dizinin içinde olmalıdır. Yapacağımız CGI dosyalarını işte bu dizinin içine koyacağız.
Bunları bir kenara not ettikten sonra, soldaki araç çubuğunda Gelişmiş simgesini tıklayın; ortadaki pencerede sanal dizinlerinizi görüyorsunuz. Bunlardan Home’u seçin ve sağdaki “Özellikleri düzenle” düğmesini tıklayın.
<cgi-perl004.tif>
Ana dizinin okuma, yürütme ve makro erişim haklarının işaretli olmasına dikkat edin. İlerde kendinize Kişisel Web Server’ınızın kök dizininde yeni bir dizin oluşturursanız (örneğin “resimler” gibi) ve içine sitenizle ilgili dosyalar koyarsanız, Gelişmiş penceresinde Ekle düğmesini tıklayarak bu gerçek dizini de sitenin sanal dizinlerinden biri haline getirmeniz gerekir. Gerçek dizinin adı XYZ bile olsa, sanal dizin haline getirirken istediğiniz sanal adı verebilirsiniz. Ama unutmayın, Browser’ın adres hanesine gerçek dizin adını değil sanal dizin adını yazmanız gerekir.
Bu işlemleri IIS’te değişik görüntülerle, fakat temel ilkeler itibariyle aynı şekilde yapabilirsiniz.
Windows İçin Perl
Şimdi sıra geldi Windows ortamını Perl’den anlar hale getirmeye! Bunun için Internet’ten ActivePerl’ü indirmek veya ActiveState firmasından CD-ROM ısmarlamak zorundayız. Her iki işlem için de Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresine gitmemiz gerekir. ActiveState sitesinden ActivePerl’ün son sürümünü indirin ve bilgisayarınıza kurun. Windows 95 kullanıcıları, sistemlerinde Perl programlarını çalıştırabilmek için sistemlerinin DCOM bileşenlerini güncelleştirmek için Microsoft’un sitesinden bazı dosyaları indirmek zorundalar. Bu güncelleştirme için dosyaları Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresinde bulabilirsiniz. (Distributed Component Object Model (DCOM), Windows’un ağda güvenli ve etkin bir tarzda yazılım bileşeni dağıtma teknolojisidir. Eski adıyla "Network OLE," olan DCOM, HTTP dahil, bütün ağ dağıtım ve ulaştırma protokolleri ile uyumludur ve kendi bilgisayarımızda Perl programlarını sınamak için bile olsa Windows açısından gereklidir.)
/////////////////KUTU/////////////
ActivePerl’ü kurarken
ActiveState’in bu kitapçığı yazarken 5.22 sürümüne ulaşmış olan ActivePerl programının kuruluşu sırasında bazı hata mesajları ile karşılaşmak mümkündür. 102, 104, 105, 112 veya 301 sayılı hata mesajlarını alırsanız, bilgisayarınızı kapatıp, açın ve ActivePerl’ü kurmadan önce herhangi bir 16-bit program çalıştırmayın. Sorunu bu yöntemle çözemezseniz, Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresinde Q100198 sayılı yaardım dosyasını indirerek, önerileri sırasıyla uygulayın.
ActivePerl’ün kurulumununsonuna doğru “Cannot Craeta Perl Interpreter” mesajını alırsanız, muhtemelen daha önce kurulmuş eski sürüm ActivePerl ile çatışma var demektir. Bu durumda ya eski ActivePerl’ü kaldırır ve klasörlerini silemeniz ya da yeni sürüm ActivePerl’ü yeni bir klasöre kurmanız gerekir.
ActivePerl’ü adında boşluk olan dizine kurmayın. ActivePerl’ün işlemesi için gerekli bazı programlar, adında boşluk olan dizinleri göremezler. ActivePerl’ün Kur programının önerdiği varsayılan dizini kabul etmek doğru olur. Ayrıca Kur programının Autoexec.bat ve config,sys dosyalarında yapmayı önerdiği değişiklikleri yapmasına izin verin.
Kurma ve diğer sorunlarla ilgili olarak ActiveState’in sitesindeki FAQ (Sıkça sorulan Sorular) dosyalarına başvurabilirsiniz. Özellikle Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap sayfasında Windows sistemleriyle ilgili geniş bilgi bulabilirsiniz.
//////////////////KUTU BİTTİ///////////////////
ActivePerl’ü kurduktan sonra, küçük bir işlemle, PWS veya IIS’i, uzatması .pl olan dosyaları görüntülenmesi için Perl.exe programını çalıştırmak üzere ayarlamanız gerekir. Bu ayar, Windows’un kayıt dosyasını (Regitry) düzenlemeyi gerektiriyor. Kayıt dosyası, Windows 95/98/NT/2000 sistemlerinin düzgün çalışması için gereklidir; bu dosyada yapılacak bir yanlışlık sistemin tümünü çalışmaz hale getirebilir. Aşağıdaki işlemleri yapmaya başlamadan önce Registry’nin yedeğini almak ve bunu bir diskette saklamlak gerekir. Buna rağmen çalışırken çok dikkatli olmanızı salık veririm.
Şimdi önce Perl.exe’nin yol bilgisini (Path) bir kenara yazın: örneğin c\Perl\bin\perl exe); ve PWS’i durdurun. Sonra 95/98’de Regedit.exe, NT’de Regedt32.exe programını çalıştırın. Soldaki dizide altı ana-kayıt bölümü göreceksiniz. Bunlardan HKEY_LOCAL_MACHINE’nin önündeki artı işaretini tıklayın. Açılacak listede SYSTEM’i bulun ve önündeki artıyı tıklayın. Açılacak listede CurrentControlSet’i bulun; önündeki artıyı tıklayın. Açılacak listede Services satırını bulun ve önündeki artıyı tıklayın; yeni listede W3SVC satırının önündeki artıyı, sonra Parameter satırının önündeki artıyı tıklayın. Şimdi, açılacak lisdede ScriptMap satırını tıklayın. Sağda, “Varsayılan...(değer atanmamış)” satırını görüyor musunuz? Güzel. Şimdi, Düzen menüsünü tıklayın, açılacak listede Yeni, açılacak alt-listede Dize Değeri maddesini seçin. Sağda, “Varsayılan...” satırının altında “Yeni Değer #1” adlı bir satır oluşacak ve bu kelimeler seçilecektir. Klavyede “.pl” yazın (Nokta işareti, p ve l harfleri). Sonra kKlavyede iki kere Enter’a basın; açılacak Dize Düzenle kutusunda “Değer verisi” hanesine kendi sisteminize uygun olan Perl’ün sabit diskteki yol bilgisini (Path) ile birlikte “%s %s” yazın. Örneğin:
c:\Perl\bin\perl.exe %s %s
Burada “%s” yazarken s harfinin küçük harf olmasına dikkat edin; büyük S yazarsanız Perl çalışmaz. Bu bilgiyi girdikten sonra Dize Değeri kutusunun Tamam düğmesini tıklayın. Aynen şu görünümü elde etmiş olmalısınız:
<cgi-perl005.tif>
Bu işlem sırasında Dize adını verirken hata yaparsanız, örneğin .pl yerine pl veya .pp yazarsanız, bu kelimeyi sağ tıklayın ve açılan menüden Yeniden Adlandır maddesini seçin. Dize değerini yazarken hata yaparsanız, yine .pl’i sağ tıklayın ve açılan menüden Değiştir maddesini seçin. (Eğer ActivePerl’ün varsayılan değerlerini değiştirmediyseniz, Perl dizininin adının büyük harfle, “bin” dizininin ve programın adının küçük harfle başladığına dikkat edin. %s iki kere kere yazılıyor ve ikisinde de s harfi küçük!)
Regedit’i kapatın. Bilgisayarı kapatıp, açın ve PWS’i başlatın. Şimdi PWS’ınız Perlce bilir hale gelmiş olmalı!
Aynı işlemi NT’de IIS için yapacaksanız, IIS Manager’da Default Web Server’ı durdurun. Regedt32.exe’yi çalıştırdığınızda ve HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\W3SVC\Parameter\ScriptMap’i bulunca Edit menüsünden Add Value maddesini tıklayın. Value Name olarak .pl yazın. Data Type olarak Reg_SZ’i seçin ve String Value olarak perl.exe’nin tam Path’ ile perl.exe %s %s yazın. Örneğin:
c:\Perl\bin\perl.exe %s %s
Regedt32’yi kapatın; IIS Manager’dan Default Web Server’ı çalıştırın. Şimdi sizin NT sisteminiz de Perl anlar hale gelmiş olacak.
Ama her iki durumda sistemi sınamak gerekir. Bunun için Not Defterini açıp, şunları yazın:
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>MERHABA DÜNYA</TITLE>\n";
print "<meta http-equiv=\"content-type\" ***********\"text/html; charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" ***********\"text/html; charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H4>Merhaba Dünya</H4>\n";
print "<P>\n";
print "IP adresiniz: $ENV{REMOTE_ADDR}.\n";
print "<P>\n";
print "<H5>Başarılar dileriz!</H5>\n";
print "</BODY>\n";
print "</HTML>\n";

Bu dosyayı merhaba.pl adıyla, PWS’ın kök (root) dizinine kaydedin. Browser’ınızı açın ve adres hanesine kişisel Web Server’ınızın adresi ile birlikte dosyanın adını yazın. Örneğin: Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap
<cgi-perl006.tif>
Tebrikler! Bir taşla kaç kuş birden vurdunuz. Ve en önemlisi, ilk CGI programınıza “Merhaba Dünya!” yazdırarak, bir geleneği korumuş oldunuz. İlk Perl programımızı yazmış olduk; gerçi şu anda yazdıklarımızın ne işe yaradığını pek bilmiyoruz, ama yukarıda belirttiiğimiz gibi bu programla Server’a bir “iş” yaptırıyoruz. Bu iş, ana hatlarıyla, bir HTML sayfası oluşturmak ve bunu talep eden istemciye göndermesini sağlamaktan ibadet. Kodumuza dikkatle bakarsanız bu işin bölümlerini görebilirsiniz; ama şimdilik bu ayrıntıların üzerinde durmayalım.
Burada önemli olan, Windows sistemimizi Unix’e ait bir dili anlar hale getirmiş ve bunu kurduğumuz kişisel Web Server’ımıza tanıtmış olmamız.
Şimdi kolları sıvayıp, CGI için Perl öğrenmeye başlayabiliriz. Ama isterseniz bu işlemi bir kere de “.cgi” uzatması için yapabilirsiniz. Perl program dosyalarını “.cgi” uzatmasıyla kaydetmek yaygın bir uygulamadır; böyle bir örnekle karşılaştığınız ve uyguladığınız zaman kişisel Web Server’ınızın hata vermesini önlemiş olursunuz.
Daha fazla bilgi için
Bu kitapçıktaki Perl, metin ve HTML örneklerini, PCWorld-Türkiye dergisinin Web Sitesinden, ......................................./cgiperl.zip dosyasını indirerek edinebilirsiniz. Bu dosyayı indirseniz bile, aşağıda vereceğimiz Perl örneklerini kendiniz yazmalısınız; Perl bilmenin bir şartı fonksiyonları tanımaksa, diğer şartı Perl’ün yazım kurallarını iyice öğrenmektir.
CGI programı olarak herhangi bir dille yazdığınız uygun bir çalıştırılabilir dosya (dosya adı uzatması “.exe” veya “.com” olan bir Executable’ı) kullanabilirsiniz. Fakat bu kitapçıkta, aksini belirtmediğim taktirde CGI programı dediğim zaman bir Perl dosyasını kastediyorum.
Bu kitapçıkta yeri geldikçe HTML konusunda da bilgiler bulacaksınız; bununla birlikte HTML’i bir dil olarak bildiğinizi varsayıyoruz. Bu konuda eksiğiniz varsa, Byte Dergisinin Ekim 1998’de verdiği Internet Tasarım Rehberi kitapçığına veya Internet’te bulabileceğiniz bir çok on-line HTML kurs malzemesine (örneğin Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap) başvurabilirsiniz.
Bir iki not
Bu kitapçıkta “|” (Pipe, Bağlama) işaretini “veya” anlamına anlamına kullanıyorum. Örneğin “METHOD=[“POST” | “GET”]” ifadesi, “METHOT=” kelimesinin karşısına, tırnak işareti içinde, ya POST ya da GET yazmanız gerektiğini belirtiyor.
Türkçe konusunda: Dosya adlarında, HTML’in TITLE etiketinde ve INPUT etiketinin NAME özelliğinde, Perl programlarında değişken adlarında, Türkçe, Fransızca, Flemenkçe, Vietnamca, yani içinde içinde non-ASCII karakter bulunan kelime kullanmak hatalıdır. Bunu sadece görünüm açısından değil, fakat özellikle değişken adlarının daha sonra bulunamaması, hata vermesi gibi durumları önlemek için yapmamak gerekir. Windows ve Unicode uyumlu işletim sistemlerinde veya kendisini Unicde uyumlu olmayıp da sonradan Türkçe sistem desteği kazandırılmış işletim sistemlerinde sorun olmayabilir; fakat cGI programlarınızın nerede, hangi Server’da ve hangi işletim sisteminde çalışacağını bilemezsiniz. Buna karşılık metin alanlarında Türkçe kullanmak, Browser’ı Türkçe-şifreleme konusunda yönlendiren komutları unutmamak şartıyla daima mümkündür. Bu ilkeye uygun olarak bu kitapçıkta sistemle ilgili yerlerde Türkçe kelimelerde Türkçe karakter kullanmaktan kaçındım. Bir çok konuda sık sık imdadıma yetişen Ahmet Usta ve Osman Hömek, bir çok bilimsel notasyonun Türkçesi konusundaki yardımlarını Perl konusunda da esirgemediler. Kendilene teşekkür borçluyum.
Bu kitapçığı yazarken, hemen hemen sonuna geldiğim sırada, Selçuk Üniversitesi Teknik Eğitim Fakültesi Bilgisayar Sistemleri Öğretmenliği bölümünde öğretim görevlisi Sayın Adem Güneş’in Perl ve Perl ile CGI Programlama ders notlarının farkına vardım. Bu notları Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adresinde bulabilirsiniz. Bu kitapçığın ileri bir aşamasına gelmemiş olsaydım, Sn. Güneş’in ders notlarını gördükten sonra boşuna zahmet etmezdim!
Bazı Türkçe kaynak tarama çabamı kolaylaştıran genç kuşak sayısal tasarımcı ve Web Yönetmeni arkadaşlarım K. Emre Güray ve Argıt Usuğ'a katkıları için teşekkür ederim.
Bu kitapçığı, Erhan Mataracı’ya ve liselerinin Web sitesini kuran, yöneten ve Perl programını yazmak için kolları sıvayan diğer kardeşlerime armağan ediyorum. Ama sınıflarını geçmeleri şartıyla!

HTML-CGI İlişkisi
CGI’a ilk adımımızı HTML’in FORM etiketine ilişkin bilgilerimizi atmak çok lyerinde olur. Çünkü Internet’te istemci ile sunucunun bilinçli şekilde etkileştikleri nokta CGI ise, ikisini bu noktada buluşturan ögeler, HTML’in Form ve Anchor (<A>) etiketleridir. Form etiketi bir formdaki <Input> değerlerini, <A> etiketi ise Browser’i CGI programına gönderir.
HTML ile yazılmış ve görüntülenmek üzere Browser programlarına gönderilen metinler başlık ve gövde olmak üzere iki bölüme ayrılır. Başlık bölümü <HEAD>...</HEAD> etiketlerinin, gövde bölümü ise <BODY>...</BODY> etiketlerinin arasında kalır. Bir HTML belgesinin başlık bölümünde yer alan bilgilerin büyük bölümü Browser’da görüntülenmez; ancak Browser bu bölümdeki bilgilere bakarak, HTML belgesini tanır; bu belgeyi nasıl görüntüleyeceğini öğrenir. Gövde bölümünde ise ziyaretçinin Browser programının görüntülemesini istediğimiz verileri ve bunların nasıl görüntüleneceğine ilişkin kodlarımız yer alır. Bu kodların hemen hepsi, bizim, yani Web sayfası tasarımcısının ziyaretçimize göndermek istediğimiz veriler ve bunların görüntülenmesine ilişkindir; bizden ziyaretçiye, Sunucu’dan İstemci’ye doğru giden bilgilerdir.
FORM ve onun içinde yer alan INPUT etiketleri ise, tersine işler: istemciden sunucuya, ziyaretçiden tasarımcıya veri taşır. HTML’in ilk sürümünde Form ve Input etiketleri yoktu; <ISINDEX> etiketi ile ziyaretçi sadece sitede arama yapabilirdi. Ancak hiç bir Browser (ki o zaman sadece Mosaic vardı!) tarafından tam uygulanmamış olan bu etiketin yerine HTML’in daha sonraki sürümlerinde istemcinin sunucuya daha çok bilgi gönderebilmesini sağlayan Form ve Input etiketleri geldi. CGI programlarımızı, yukarıdaki örnekte olduğu gibi adreslerini doğruca Browser’ın URL adres kutusuna yazarak da çağırabiliriz. Fakat CGI programlarını çalıştırmanın en yaygın yolu Form etiketidir. Bunu Form etiketinin ACTION özelliği (attribute) yapar. Hatırlarsanız, FORM etiketini şöyle yazarız:
<FORM ACTION=”cgi-programı” METHOD=[“POST” | “GET”]>...</FORM>
Burada Form etiketinin ACTION özelliğinin karşısına CGI programımızın adını, Örneğin, Perl programının dosya adının uzantısına göre, ACTION=”/cgi-bin/merhaba.pl” veya ACTION=”/cgi-bin/merhaba.cgi” yazarız. İstemcinin Form bilgilerini CGI programımıza hangi yöntemle ulaştıracağını belirleyen “Get” ve “Post” özelliklerinin farklarını birazdan ele alacağız. Şimdilik bunu atlayalım. Bu arada Form etiketinin başka özellikleri de vardır; bunlardan “Accept=” ile form bilgisini işleyecek olan Server’a, gönderilen verinin hangi dosya türüne girdiğini, “Enctype=” ile gönderilen verinin nasıl şifrelendiğini bildiririz.
Form etiketinin içinde, onun eylemi (Action) ve yöntemi (Method) ile gönderilecek bilgileri derlemeye yarayan başka etiketler bulunur. Şimdi kısaca onları ele alalım:
Bir Internet sitesi ziyaretçisinden Input etiketi aracılığıyla tam on ayrı tür bilgi alabiliriz. Input etiketi şöyle yazılır:
<INPUT NAME=”Bu alanın adı” TYPE=[TEXT | PASSWORD | CHECKBOX | RADIO | SUBMIT | RESET | FILE | HIDDEN | IMAGE | BUTTON] VALUE=”Alfanümerik değer” SIZE=”girdi_kutusu_genişliği”>
Input etiketinin kapanmadığını (yani </INPUT> şeklinde bir etiket olmadığını) ve girdi tipine göre daha başka özellikleri bulunabileceğini hatırlayalım.
Input etiketi ile sunucuya, onun arıcılığıyla CGI’ya gelen bilgiye programcılık dilinde değişken denir. Değişkeni, sabit bir adı olan fakat içeriği değişebilen bir bilgi tutucu öge olarak düşünebilirsiniz; bir tür kap. Input’un oluşturduğu değişkenin adı, etiketin NAME (ad) özelliğinden alınır; yani Input’a ad verirken, daha sonra bu adla bir değişkeniniz olacağını düşünmelisiniz. Bu değişkenin değeri ise Ipnut’un türüne göre değişir. Örneğin, TEXT (metin) türü Input’un değeri, Browser’da oluşturacağı kutuya Internet ziyaretçimizin yazacağı kelimelerdir. Input etiketini yazarken VALUE (değer) özelliğini de yazmışsak, (ve ziyaretçinin bunu değiştirmesi olanağı yoksa), değişkenin değeri VALUE özelliğinin karşısına yazdığımız alfanümerik (rakam, harfler veya her ikisi birden) metindir.
Bir Form’un içindeki bilgilerle, ziyaretçinin Browser’ından (istemci) kalkıp, bizim Web Server’ımıza ve oradan da CGI’a gelmesi için, genellikle ziyaretçinin ya klavyesinde Enter tuşuna basması ya da tipi Submit (Gönder) olan ve Browser tarafından düğme simgesiyle görüntülenen bir başka Input’u tıklaması gerekir. Fakat “gönder” düğmesi de bir Input olduğu için Form etiketi, içindeki bilgileri paketleyip gönderirken Submit’in (varsa) değerini de gönderir.
Şimdi “paketleyip gönderme” olayı üzerinde duralım; çünkü hemen hemen tüm CGI kavramı, bu Internet ziyaretçimizden gelen bu “şey” üzerine kurulacak. CGI programlarımız ziyaretçiden “girdi” olmadan da çalışabilir. Nitekim yukarıda yazdığımız ilk Perl programı ziyaretçinin bir bilgi vermesini gerektirmiyordu. Fakat CGI programı, ziyaretçinin IP adresini, öğrenip, kendisine bildirilyordu. IP numarası, ziyaretçinin sadece bu CGI programını çalıştırmak üzere programın adını Browser’ının adres hanesine yazması ve Enter’a basması (veya yeni Browser’lardaki Go/git düğmesini tıklaması) ile Browser tarafından CGI’a gönderilmiş bir bilgidir. Bu yüzden CGI, ziyaretçi isteyerek ve bilerek Server’a bilgi göndermese de Server ziyaretçiden bilgi edinmesini ve bunu CGI programımıza vermesini bilir! Şimdi bu bilgilerin neler olduğunu görelim.
CGI programına Server tarafından iki tür bilgi verilir:
1. Browser, Server ve kendisini hakkındaki bilgiler: Browser’ın türü, yetenekleri, Browser’ın Internet’e giriş noktası (Remote Host, kullanıcı açısından ISS), Server’ın türü, Internet’e bağlandığı geçit (Port), CGI programının adı, bulunduğu dizin, sahip olduğu değişkenler gibi bilgiler, CGI’a çevre değişkenleri (Enivonment Variables) kümesi olarak ulaştırılır (Bu değişkenlere bazı kaynaklarda Ortam Değişkenleri denildiğini görebilirsiniz..
2. Kullanıcının (Internet ziyaretçisinin) girdiği bilgiler: Kullanıcı Browser penceresinde bir Form doldurmuş ise Form’daki değişkenler ve değerleri (Input etiketlerine verdiğimiz adın değişken adı, bizim verdiğimiz veya kullanıcının girdiği değerlerin de değişkenin değerini oluşturduğunu yukarıda görmüştük) de CGI programına aktarılır. Bu aktarma işlemi iki türlü yapılabilir. Form’un METHOD özelliği GET ise bu bilgiler yukarıda belirttiğimiz çevre değişkenlerine katılarak verilir; METHOD olarak POST kullanmışsak, bu bilgiler standart girdi (standart input veya Perl’ün ifadesiyle stdin) olarak gönderilir.
CGI programcısı olarak yapacağımız işin özü, bu iki grup değişkeni alıp, içeriklerini kullanılır hale getirmek ve kullanmaktan ibarettir. Burada ifade ettiğimiz “almak,” “kullanılır hale getirmek” ve “kullanmak” ifadelerine dikkat edin: çünkü CGI programı ile sadece bu üç işi yapacağız. Dolayısıyla neyi alabileceğimi, nasıl alabileceğimizi öğrenerek işe başlamak zorundayız. Perl, bir programlama dili olarak bize bu üç işte kullanabileceğimiz komutları sağlar; fakat bu komutlarlı kullanarak hangi bilgi ile ne yapacağımızı bilmemiz gerekir.
Çevre Değişkenleri
Aşağıda bir liste göreceksiniz; bu listede bir CGI programının içinde bulunduğu çevrenin bütün önemli bilgileri yer alıyor. Ama şimdi bu listeye geçmeden, biz kendi bilgisayarımızdan kendi CGI çevremizin değişkenlerini ve değerlerini öğrenelim. Şimdi, açın en sevdiğiniz düzyazı programını ve başlayın yazmaya (Eğer illâ kelime iişlem programı kullanmaya kararlıysanız, metni düzyazı, salt metin, ASCII, ANSI veya “Text only” olarak kaydetmeyi unutmayın):
print "HTTP/1.0 200 OK\n";
print "Content-Type: text/html\n\n";

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>CGI Cevre Degiskenleri</TITLE>\n";
print "<meta http-equiv=\"content-type\" ***********\"text/html; charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" ***********\"text/html; charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<P>\n";
print "<H1>CGI Çevre Değişkenleri ve Değerleri</H1>\n";
foreach $env_var (keys %ENV)
   {
   print "<B>$env_var</B> = $ENV{$env_var}<BR>\n";
   }

print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

Sonra bu metni örneğin cevre.pl (veya kişisel Web Server’ınızın “.pl” uzatması gibi “.cgi” uzatmasını da Perl dosyası saymasını sağladıysanız, cevre.cgi) adıyla, kişisel Server’ınızın kök dizinine (Windows ortamında muhtemelen c:\inetpub\wwwroot olmalı) kaydedin. Ve Browser’ınızın URL adresi hanesine Server’ınızın protokol ve yol adıyla birlikte bu dosyanın adını yazın (örneğin: Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap), klavyede Enter’a basın.
<cgi-perl007.tif>
İşte sizin kişisel Web Server’ınızın cevre.pl veya cevre.cgi programına sağladığı ortam! Bütün değişkenlerinizi ve değerlerini görüyorsunuz. Muhtemelen kendi bilgisayarınızın burada görüntülenen bir çok özelliğini tanıdınız: Autoexec.bat dosyasındaki Path satırının değerini, bilgisayarınızın ve dolayısıyla kişisel Server’ınızın adını, hatta bu programı Windows ortamında çalıştırdıysanız, Windows’un sürümünü bile görüyorsunuz. CGI, bunları nereden biliyor? Kişisel Web Server’ınız ona bildirdiği için. Kişisel Web Server bunu CGI nasıl bildiriyor? Çevre Değişkenleri kümesi ile.
//////////////////KUTU/////////////////
“Shebang” nereye gitti!
Kim nereye gitti? Madem ki Perl öğreniyoruz, öğleyse yılların Unixçisi gibi konuşmaya da alışmamız gerek: # ve ! işaretleri Unix işletim sistemine, aşağıdaki Script’i (betik’i) Perl yorumlayıcısı ile yorumlamasını ve bu yorumlayıcının nerede bulunduğunu bildirir. “Shebang” [şi-beng] denmesinin sebebi de müzikte kullanılan diyez (#) işaretinin “Sharp,” ünlem (!) işaretinin de “bang” diye okunmasından kaynaklanır; ikisine birarada shebang denir. Bu komut satırı genellikle şöşle yazılır:
#!/usr/local/bin/perl
Bununla Unix işletim sistemine Perl yorumlayıcısının kök dizinde, usr klasöründe, local alt-klasöründeki bin alt-alt klasöründe olduğunu belirtmiş oluruz. Windows ortamında buna gerek yok; çünkü kişisel Web Server’ımızı kurduktan sonra Registry kayıtlarında Browser’lara ve diğer ilgili programlara Perl konusunda kimden nasıl yardım isteyecekleri gösteren değişlikler yapmıştık.
Bununla birlikte, yazacağınız Perl programları kendi bilgisayarınızda ve Windows işletim sisteminde değil, büyük bir ihtimalle Web sitenize evsahipliği yapan firmanın bilgisayarında ve Unix sisteminde çalışacak. Dolayısıyla CGI programlarınızda Shebang’e ve Perl’ün yerini belirten ilk satıra ihtiyacınız olacak. Bundan böyle, kendi bilgisayarımızda ihtiyaç olmasa da elimizi alıştırmak için örnek kodlarımızda Shebang’e yer vereceğiz. Bunun Windows ortamında hiç bir zararı olmaz. Server’a gönderdiğiniz CGI programlarınız işlemezse, önce birinci satırda Shebang bulunup bulunmadığına ve yazdığınız yolun doğru olup olmadığına bakın. Perl yorumlayıcısının nerede bulunduğunu Server operatörüne sorabilirsiniz.
////////////////////////////////////////////////////KUTU BİTTİ/////////
Kendi bilgisayarımızda CGI’ın çalıştığı çevrenin bu kadar çok değişkeni ve değeri olmasına rağmen, normal durumlarda CGI programlarımızda bu değişkenlerin tümünü kullanmayız. CGI programlama açısından önemli çevre değişkenleri ve değerleri şöyle sıralanır:
ÇEVRE DEĞİŞKENİ   ANLAMI
REMOTE_ADDR   İstemci bilgisayarın IP adresi
REMOTE_HOST   İstemcinin bilgisayarının adı (Muhtemelen yine istemcinin IP’si)
HTTP_ACCEPT   Browser’ın tanıyabileceği MIME türleri
HTTP_USER_AGENT   Browser hakkında bilgi (adı, sürümü işletim sistemi, vs.)
HTTP_REFERER   Browser’ın bizim sitemize gelmeden önce görüntülediği son URL (Burada “referer” referansta bulunan, köprü veren, gönderen anlamına gelmekle birlikte, sitemizi ziyaret eden kullanıcının sizim sitemize geçtiği son sitede bizim sayfamıza bir köprü bulunduğu anlamı çıkmaz; ziyaretçi bizim adresimizi URL adres kutusuna kendisi yazsa bile, HTTP_REFERER değişkeninin değeri olarak son URL kaydedilir.)
REQUEST_METHOD   GET veya POST
CONTENT_LENGTH   POST yoluyla gönderilmiş bilginin boyutu (büyüklüğü). GET yöntemi kullanıldığında veya istemci bilgi göndermediğinde tanımlanmamış sayılır)
QUERY_STRING   İstemcinin GET yoluyla gönderdiği bütün bilgilerden yapılmış bilgi yumağı (String)
PATH_INFO   CGI programının çalıştırıldığı dizine göre (göreli) Path (arama yolu) bilgisi.
PATH_TRANSLATED   Göreli arama yolunun gerçek disk ve dizin adlarıyla ifadesi
Şimdi bu listeye göre kendi kişisel Web Server’ınızın verdiği bilgileri yorumlayabilirsiniz; fakat çok sık kullanacağımız iki değişkenin, CONTENT_LENGTH ve QUERY_STRING değişkenlerinin tanımlanmamış ve boş olduğunu görüyor olmalısınız.
Yöntem Farkı: GET ve POST
CONTENT_LENGTH ve QUERY_STRING değişkenlerinin doğrudan bizim Form etiketimizin METHOD özelliğine bağlı olduğunu farkettiniz mi? METHOD olarak GET veya POST kullanabiliriz. Bu, bizim ziyaretçimizden nasıl ve ne boyutta bilgi alacağımızı ve bilginin CGI programına nasıl aktarılacağını belirler.
Form’un oluşturduğu ve sizin GET yöntemi ile aldığınız bilgiler, çevre değişkenlerinden QUERY_STRING değişkeninin içine yazılır. Başka bir ifade ile Form’daki bütün değişkenlerin adları ve bu değişkenin içerdiği değer yumak yapılır (bu yumağın niteliğine ve nasıl çözeceğimize geleceğiz!) ve Server’da QUERY_STRING değişkeninin değeri olarak yazılır. Daha sonra belirteceğiz, ama şimdiden bir kenara yazın: Form’un gönderdiği değişkenler ve değerleri artık düz metin haline gelmiştir; bundan yeniden program yoluyla kullanılabilir değişkenler üretmek ve bu değişkenlere ziyaretçiden gelen değerleri atamak bizim işimiz olacak (ve galiba Perl ile CGI progralamanın da en can alıcı noktasını oluşturacak!).
Form’un bilgilerini POST yoluyla almış olsaydık bunlar CGI programı için standart girdi (stdin) olarak gelecekti. Bu iki yöntem arasındaki başlıca fark (ve herkesin POST yöntemini tercih etmesinin sebebi) stdin’in bilgi tutma kapasitesinin sınırsız olmasından ibarettir. QUERY_STRING değişkeni, Server’a, ve bu programın ayarlarına göre sınırlı boyutta bilgi tutabilir. Formlarınızda çok alan (yani çok değişken ve çok değer) varsa, mutlaka POST yöntemini kullanmalısınız. Aksi taktirde, bu bilgilerin QUERY_STRING değişkeninin bilgi tutma kapasitesini aşan bölümü, Server tarafından silinir, CGI programına aktarılmaz.
Çevre değişkenlerimizden REQUEST_METHOD, Form’dan bilgilerin hangi yöntemle geldiğini gösterdiğinize göre, CGI programımızı yazarken, önce bu değişkenin içeriğini kontrol edebiliriz; bu GET ise, demek ki Formun bilgileri QUERY_STRING değişkeninin içinde paket halinde duruyor. REQUEST_METHOD değişkenin değeri POST ise, ziyaretçimizin Formumuza yazdığı bilgiler, stdin olarak gelmiş ve stdin’in o andaki boyutunu gösteren bilgi de CONTENT_LENGTH değişkenine işlenmiş demektir. Bunları tekrar ediyoruz; çünkü birazdan bu bilgilerin tümününden, Form bilgilerini kullanılır hale getirirken yararlanacağız.
Bilgi Yumağı
Peki, bu kadar teori yeter; şimdi bir deney daha yapalım. Hem Form bilgimizi tazeleyelim, hem de Form’dan gelen bilginin nasıl yumaklandığını görelim. Açın Not Defterini veya onsuz olamadığınız düz yazı programını ve başlayın yazmaya:
<HTML>
<HEAD>
<TITLE>FORM ORNEGI</TITLE>
<meta http-equiv="content-type" ***********"text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" ***********"text/html; charset=windows-1254">
</HEAD>
<BODY>
<FORM ACTION="isim-yas.pl" METHOD=POST>
Adınız: <INPUT TYPE=text NAME="isim"><p>
Yaşınız: <INPUT TYPE=text NAME="yas"><p>
<INPUT TYPE=submit VALUE="Gönder">
</FORM>
</BODY>
</HEAD>
</HTML>

Bitirince, bu belgeyi isim-yas.htm adıyla kaydedin, fakat kapatmayın; Form etiketinin her iki özelliğini silin; etiket tek başına (<FORM>) kalsın. Bu dosyayı yeniden fakat adını değiştirerek, örneğin isim-yas-gecici.htm adıyla, kaydedin. Tamam mı? Şimdi ikinci kaydettiğiniz geçici HTML dosyasını Browser’ınızda açın. Adınızı ve yaşınızı yazın; Gönder düğmesini tıklayın ve Browser’ınızın Adtres hanesine bakın:
<cgi-perl008.tif>
Burada şuna benzer bilgi yumağını görüyor olmalısınız:
“isim=Mustafa+Durcan&yas=23”
Bu, Form’daki değişkenlerin (“isim” ve yas”), Formu dolduran kişi tarafından verilen değerlerle birlikte Server’a, oradan da CGI programına sunuluş biçimidir. Browser, bir Form’un Input’larının adları ile bu alana yazılan değerleri, bir String (bağ) haline getirir; ve Server’a gönderir. Bu String’in oluşturulmasında şu kuralların izlenmiş olduğuna dikkat edin:
1. Değişken adları kendilerine ait değerle eşittir (=) işaretiyle birleştiriliyor;
2. “değişken=değer” çiftleri “ve” anlamına gelen Ampersand (&) işaretiyle birbirine ekleniyor;
3. Değerin içinde boşluk varsa yerine artı (+) işareti konuyor.
Bu işleme “URL Encoding” sistemi denir; buradaki örnekte görülmemekle birlikte, standart ASCII karakterler dışındaki harfler ve işaretler yüzde (%) işareti ve heksadesimal (16 tabanlı) kodlara çevrilir.
////////////////////////KUTU/////////////////////
Hexadecimal Türkçe!
URL Encoding şemasında, Türkçe karakterlerin kodları şöyledir:
ğ: F0
Ğ: D0
ı: FD
İ: DD
ü: FC
Ü: DC
ş: FE
Ş: DE
ö: F6
Ö: D6
ç: E7
Ç: C7
(URL Encoding şemasına göre, yüzde işareti “%25”, Ve (&) işareti “%26” ve çiftçatal (#) işareti ise “%23” olarak şifrelenir.)
///////////////////KUTU BİTTİ////////////////
Bu deneyi yapmakla, Browser’ın Form’daki bilgileri Server’a nasıl gönderdiğini görmüş olduk. Şimdi bu bilgi yumağını açan bir CGI programı yazalım. Bu sizin ilk form işleme programınız olacak! Evet, Not Defteri gibi bir programı açarak, yazmaya başlıyoruz:
#!/usr/local/bin/perl
# isim-yas.pl
require 'cgi-lib.pl'

&ReadParse(*girdi);
print "Content-Type: text/html\r\n\r\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>ISIM-YAS</TITLE>\n";
print "<meta http-equiv=\"content-type\" ***********\"text/html; charset=ISO-8859-9\">\n";
print "<meta http-equiv=\"Content-Type\" ***********\"text/html; charset=windows-1254\">\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<P>\n";
print "Merhaba, " . $girdi{'isim'} . ". Sen\n";
print $girdi{'yas'} . " yaşındasın.<p>\n";
print "</BODY>\n";
print "</HEAD>\n";
print "</HTML>\n";

Yazmayı bitirince bu kodu “isim-yas.pl” adıyla kaydetmek zorundasınız. Neden? Çünkü bu programı çağıracak veya çalıştıracak olan bir önceki HTML kodunda Form etiketinde ACTION hanesine bu adı verdik. “isim-yas.htm” sayfasında Form’u dolduran kişi Gönder düğmesini tıkladığı anda, Browser Server’a, “Sizin oralarda ‘isim-yas.pl’ adında bir CGI programı olacak.. Şu yumak yaptığım bilgileri ona verir misin, lütfen?” diyecek; Server, bu isimli CGI programını arayacak; bulamazsa Browser’a hata mesajı gönderecek; bulursa CGI programına “Al bakalım, sana bir yumak bilgi geldi; ne yapacaksan, yap!” diyerek, ziyaretçinin gönderdiği bilgileri devredecektir. Dıolayısıyla Form’un ACTION hanesine adını yazdığımız CGI programının belirtilen yerde olmasını sağlamak Web Tasarımcısı olarak bizim görevimiz.
(CGI programcıları Perl programı yazarken, kodun başına dosyanın kendi adını da yazarlar. Burada gördüğünüz örnekte Shebang’inin hemen altındaki “# isim-yas.pl” satırı, programcının kendisi ve daha sonra bu kodu irdeleyecek veya kullanacak kişiler için aldığı bir güvenlik önlemidir.)
Biz de birazdan kodumuzu irdeleyeceğiz; ama önce “isim-yas.htm” sayfasını Browser’ınızda açın; Form’u doldurup, gönder düğmesini tıklayın; şuna benzer bir karşılık almış olmalısınız:
<cgi-perl009.tif>
Yumağı açalım
Yukarıda, CGI programlarıının yaptığı işleri kavramsal olarak belirtirken, “bilgi yumağını açma” işinin Perl programının aslî görevlerinden biri olduğunu kaydetmiştik. Yazdığımız Perl programı bunu yaparak, kendisine String halinde gelen (örneğin: “isim=Mustafa+Durcan&yas=23”) bilgiyi kullanılabilir hale getiriyor. String halindeki verinin kullanılır hale getirilmesine Parsing (dilbilgisi bilimindebir cümleyi gramer bakımından incelemek anlamına gelir) denir. Form’dan gelen ve adeta birbirine girmiş ve hatta şifrelenmiş olan değerlerin açılması, eşittir (=) işaretinin solundaki kelime, rakam veya işaretin değişken adı, sağındakilerin değişkenin değeri haline getirilmesi gerekir. Bu arada artı (+) işaretinin yerine boşluk konması, önünde yüzde işareti bulunan iki karakterin URL Encoding şemasına göre harfe veya işarete çevrilmesi şarttır. Aksi taktirde değerlerimizi kullanamayız. (“Sizin adınız Hakk%FD+%D6cal’dır” diye bir karşılık verdiğimizi düşünebiliyor musunuz?)
Fakat biz Web amaçlı CGI programcıları bu bakımdan şanslıyız; çünkü ciddî programcılık amacıyla Perl öğrenmiş Steven K. Brenner gibi uzmanlar, oturmuş bir CGI programına GET veya POST yöntemiyle gelebilecek verileri inceleyip, değişken=değer çiftlerini ortaya tıkartan ve bunu Perl’e dizi değişken olarak öğreten program parçacıkları yazmışlar. Bizim bütün yapacağımız, Perl Kitaplığı (Library) adı verilen bu program parçacıklarını kendi Perl programımızda kullanılır hale getirmektir. Böyle, dışarıdaki bir Perl programını kendi programımızın içinde kullanmak istersek, kendi programımızın başında Perl yorumlayıcısına (örneğin perl.exe) bizim programı icra etmeye başlamadan önce dışarıdaki bu kitaplığı alıp, çalıştırmasını bildirmemiz gerekir. Buradaki örneğimizde bunu, “require 'cgi-lib.pl'” satırı ile yapıyoruz. Bu satırdaki require komutu, bizim bilgisayarımızdaki perl.exe’ye veya Server’ın bulunduğu bilgisayardaki Perl yorumlayıcısına işe başlamadan önce “cgi-lib.pl” adındaki Perl programını çalıştırmasını bildiriyor. “cgi-lib.pl” programını Steven K. Brenner 1995’te yazarak Prel programcılarına armağan etmiş bulunuyor. (Bu programı, bu kitapçığın örnek dosyaları arasında bulabilirsiniz.)
“cgi-lib.pl” programında bir kaç fonskiyon tanımlanmış bulunuyor. Perl’ün defalarca yapması gereken işleri, bu işin yapılması için gerekli bilgi kümesi ve komutlarla birlikte bir grup haline getirir ve bu gruba bir isim verirsek ortaya bir fonksiyon çıkartmış oluruz. Sözgelimi, Perl’e “Filanca yerdeki şu String’i al; içindeki filanca işareti bul; eğer bu işaret şuna eşitse, önündeki grubu dizi değişken adı yap...” diye bir dizi komut verebilirdik. Fakat bu hem yorucu olurdu; hem de hata yapma olasılığımızı arttırmaya yarardı. Oysa, “cgi-lib.pl” programında Parsing işlemi için geliştirilmiş fonksiyonlar var. Biz bu fonksiyonların yaptığı iş kümesine ihtiyaç duyduğumuz yerde kendi yazdığımız Perl programına “Steven’ın programındaki filanca fonksilonu al, ne emrediyorsa yap, sonucu da gel bana bildir!” dersek, işlerimiz daha kolay hale gelmiş olur.
İşte bu tür, bir isim altında toplanmış işlem paketlerine Function (işlev) adı verilir; Perl diğer bütün programlar gibi kendisine “Şu fonksiyonu yap!” dediğiniz noktada yapmakta olduğu işi durdurur ve fonksiyon paketindeki işleri yapar; bu paket ortaya bir değişken veya sonuç çıkartıyorsa, o bilgiyi edinmiş olarak yarım bıraktığı işleme geri döner. Fonksiyon yazmamızdaki veya hazır fonksiyonları kullanmamızdaki birinci sebep, Perl’e, Fonksiyon’un sağlayacağı bilgiyi kazandırmaktır.
Perl’ün yukarıdaki örneklerde kullandığımız bazı komutları, örneğin “print” komutu aslında Fonksiyon diye adlandırılır; eğer biz bir fonksiyon yazıyorsak, buna subrutin (subroutine) denir. Daha sonra subrutin yazmayı göreceğiz; şimdi sadece Steven’ın (veya kendi Perl’ümüze eklediğimiz herhangi bir haricî kitaplık dosyalarındaki) subrutinlerine nasıl atıf yaptığımıza dikkat edelim. “cgi-lib.pl” programında tanımlanmış olan “ReadParse” subrutin’i, GET veya POST yoluyla alınmış veriyi okur ve bunları—türünü ve niteliğini daha sonra göreceğimiz—dizi değişkenlerin (array) içine yazar. Perl işine iyice ısındığımıza göre, bu dilin kendi argosunu öğrenebilmek için belirtelim: Perl’de buradaki gibi dışarıdan aldığımız “değişken=değer” çiftlerine “anahtar/değer” denir; “değişken” adı Perl’ün kendi içinde oluşturduğu veri tutma alanları için kullanılır.
Perl programcılık çevrelerinde bir çok kitaplık-program bulabilirsiniz; cgi-lib.pl’nin en çok kullanılan kitaplık olmasının sebebi, anahtar/değer dizisinin yazılacağı değişkenin adını bizim verebilmemizdir. cgi-lib.pl’in GET veya POST verisini okuyan ve irderelen subrutininin adı ReadParse’dır; dolayısıyla bu subrutine biz &ReadParse şeklinde göndermede bulunuruz. Bu gönderme “&ReadParse(*girdi);” şeklinde yapılır. Bu komutla, cgi-lib.pl programına “Benim GET veya POST verilerimi okuyur, anahtar/değer çiftlerini bul; bunları ‘girdi’ isimli dizi değişkenin içine yaz!” demiş oluyoruz. Form’un bulunduğu HTML sayfasını tasarlayan biz olduğumuza göre, Input etiketlerimizin adlarını (yani CGI’da anahtar/değer çiftinde anahtar olacak kelimeleri biliyoruz. (Buradaki örnekte, “isim” ve “yas”.) Eğer “isim” adlı anahtarın değerini bilmek istiyorsam, bütün yapacağım şey, ‘girdi’ dizi-değişkeninin “isim” ve “yas” adlı anahtarlarının değerlerini sorgulamaktan ibaret. Bunu “$girdi{'isim'} “ ve “$girdi{'yas'}” ifadeleriyle yapıyoruz. Fakat henüz Perl’ün yapı taşları olan değişkenleri tanımadığımız için, bunun üzerinde durmuyoruz. O da ilerde!
//////////////////////////////KUTU/////////////////////////////////

Logged
 
TRForumcu.NeT | Bilgi ve Paylaşım Platformu
Gondolin
Bölüm Sorumlusu
*


Mesaj : 1.169
Forum Para : 7896.00 YTL
« Yanıtla #1 : 02 Mayıs 2008, 11:03:39 »

İki önemli HTML etiketi
CGI’ın HTML’in Form ve Input etiketleri ile yakından ilgili olduğunu gördük; ne var ki HTML ile işimiz bitmedi. Gerçekten de HTML belgesindeki bir çok etiket, CGI programımızla ilgili olabilir veya biz CGI programıyla oluşturduğumuz HTML belgelerinde bu etiketleri ve içeriklerini yazabiliriz. CGI tasarımcısı için HTML bilgisi çok önemlidir. Burada bazı HTML etiketlerine ilişkin bilgilerimizi kısaca tekrar edelim. HTML’i çok iyi bilseniz de burada ele alacağımız etiketlerin CGI açısından önemi üzerinde duracağımız için bu bölümü atlamasanız, iyi olur.
<BASE> Etiketi
Bir belgede daha sonra belirtilecek kaynakların aranması gereken temel URL’i gösterir. Diyelim ki HTML belgesinde bir resme yer veriyorsunuz. HTML dosyasını siz yazdığınızda bunu muhtemelen şöyle yazarsınız:
<IMG SRC=”cicekler.png”>
Web Server “cicekler.png” dosyasını da HTML ile birlikte Browser’a gönderebilmek için bu resmi ona atıf yapılan HTML dosyası ile aynı dizinde arayacaktır. Böyle bir HTML etiketini CGI programı yoluyla yazdırırsanız, muhtemelen şöyle bir Perl kodu yazacaksınız:
print "<IMG SRC=\”cicekler.png\”>\n";
Şimdi, eğer daha sonra önereceğimiz güvenlik önlemlerini yerine getirir ve bütün Perl dosyalarını sitenizin kök dizininde /cgi-bin/ alt-dizininde toplarsanız, Server bu kez resim dosyasını CGI programınızın durduğu dizinde arayacak; ve büyük bir olasılıkla bulamayacaktır. BASE etiketi, Server ve Browser’a bütün bölge için geçerli bir temel hareket noktası veya temel dizin vermeye yarar. HTML belgesinin başlık bölümünde şöyle bir etiket yazarsanız, Server da, Browser da, neyi nerede arayacaklarını bilmiş olurlar:
<BASE HREF=”Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap
CGI programlama kolaylığı bakımından düşünmeseniz bile, her resim için ayrı ayrı:
print “<IMG SRC=\”Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap
yazmaktan kurtulursunuz. Kaldı ki, resimlerinizi bir başka dizine aldığınızda sitedeki bütün kodları tek tek düzeltmektense, sadece CGI programınızın bir satırını düzeltmek daha kolay olmalı.
<META> Etiketi
Siz Browser’ın URL adres hanesine “Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap yazıp Enter’a bastığınızda, Internet’te “Bilmemne.com” olarak bilinen bilgisayar, sizin bilgisayarınıza “filanca.htm” dosyasını göndermeye kalkmadan önce, “HTTP Headers” denen bir takım “ön bilgiler” gönderir; ve böyölece bir bakıma Browser’ı alacağı belgeyi “nasıl anlaması ve yorumlaması” gerektiği konusunda uyarmış olur. HTML dili ikinci sürümüne ulaştığında, uzmanlar, bu başlıkları da standardize ederek, HTML belgesinin başlık (<HEAD>..</HEAD>) bölümüne koymayı düşündüler. Böylece Server’ın Browser’a göndereceği ön bilgiler de Web tasarımcısının kontrolüne girdi.
Biz yukarıdaki örneklerde bir META etiketini (“http-equiv=.. ***********.. charset=..”) kullandık. Bundan başka meta etiketleri de vardır. Örneğin, “Keywords” META etiketi, HTML belgesiyle ilgili arama yapıldığın bu kelimelere bakılmasını sağlar. CGI programcısı olarak dinamik bir içerik sunabilmek içn ziyaretçiye uygun HTML sayfasını Perl programımıza, bu kelimelerle arattırabiliriz.
Bazı Web Server programları META etiketleri tam olarak okumazlar; veya aynı META etiketinden iki kere yazarsak, birincisini unutabilirler. Fakat bu bizi yıldırmamalı; sayfalarımıza uygun META etiketleri daima koymalıyız.
////////////////////////////////KUTU BITTI////////////////
İstemcinin İstekleri - Sunucunun Sundukları
CGI programlarının Browser’la ilişkisini ele aldık. Fakat CGI programı, “Browser için” yazıldığı kadar “Server için” de yazılır. CGI ile Server’ın çalışmasını da programlamış oluruz. Bu yüzden, Server’ın CGI-HTML ilişkisindeki yerini da tanımak zorundayız. Server’ı tanımaya Browser ile istem-sunuş ilişkisindeki yerinden başlayabiliriz. Browser ile Server nasıl alış veriş yapıyorlar; ne alıp, ne veriyorlar!
Ziyaretçi olarak siz Browser’ın URL adres kutusuna, sözgelimi server.com adlı halayî sunucudaki merhaba.htm belgesinin adını (adresini) yazdığınızda neler olur? Bunu kısaca, adım adım görelim:
1. Browser’ın Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap adlı belgeyi talep etmesi, Server’a bir “HTTP Request” (HTTP Talep) komutu göndermesi demektir. “GET” şeklindeki bu komut sadece “Bana şu kaynağı gönder!” şeklinde olmaz. Browser komutun arkasına Browser’ın ne tür belgeler (text, HTML, Access, Excel, vs uygulama programı dosyaları) ve media (GIF, JPEG, Bitmap, vs.) kabul edebileceğini, ve Browser’ın türü ve sürümünü, ve dosya ilgili (varsa) önşartlarını da ekler.
Diyelim ki bir Browser, bir Server’dan index.htm adlı dosyayı istiyor ve bu dosyayı ancak ve sadece 12 Ocak 2000, GMT saat 10:00’dan sonra değişmişse göndermesini şart koşuyor. Bu durumda “HTTP Request” şöyle olur:
   GET /index.htm HTTP/1.1
   If-Modified-Since: Sun, 12 Jan 2000 10:00:00 GMT
   Accept: text-html
   Accept: */*
   User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)

Burada, Browser, varsayılan talep komutu olan GET ile ne istediğini ve ne kabul edebileceğini Server’a bildiriyor.
2. Server bu talebi alınca önce belgeyi arar; bulamazsa Browser’a hata mesajı gönderir. Server, bu dosyayı bulursa, önce uzantısına bakarak, ne tür bir dosya olduğuna karar verir; ve
3. Bu karara dayanarak, gerekli başlık (header) bilgilerini ve dosyanın içeriğini talep sahibi Browser’a gönderir. (Bu arada başlıkla içerik arasına bir boş satır koyması da ihmal etmez! Bu boş satır, Server’ın Browser’a gönderdiği iki önemli veri kümesini birbirinden ayırmaya yarar.)
Bu bilgi aşağı yukarı şuna benzer:
HTTP 1.1 200 OK
Date: Mon, 12 Jan 2000 02:30:49 GMT
Server: Internet Information Server 4.02.06.31
Content-type: text/html
Content-length: 235
Last-modified: Mon, 12 Jan 2000 02:25:00 GMT

<HTML>
<HEAD>
<TITLE>MERHABA DÜNYA</TITLE>
<meta http-equiv=\"content-type\" ***********\"text/html; charset=ISO-8859-9\">
<meta http-equiv=\"Content-Type\" ***********\"text/html; charset=windows-1254\">
</HEAD>
<BODY>
<H4>Merhaba Dünya</H4>
</BODY>
</HTML>

///////////////////TASARIM İÇİN NOT//////////////
Yukarıdaki kodda <HTML> diye başlayan satırın üzerinde bir satır boşluk olması gerekir! 
/////////////////NOT BITTI///////////////////////////////

Logged
 
TRForumcu.NeT | Bilgi ve Paylaşım Platformu
Gondolin
Bölüm Sorumlusu
*


Mesaj : 1.169
Forum Para : 7896.00 YTL
« Yanıtla #2 : 02 Mayıs 2008, 11:04:06 »

Bu bilgileri yakından incelersek, başlık bölümü ile gövdeyi birbirinden bir boşluğun ayırdığını görürüz. Bu boşluğun görevi başlık bölümü ile gövdeyi ayırmak değil, başlık bölümünün bittiğini Browser’a belirtmek içindir. Bu boşluğun üstündeki başlık bölümünde birinci satırda durum başlığı (status header) denilen Server Protokolünün istenen belgeyi bulup, bulamadığını belirten bilgi yer alır. Buradaki örnekte yer alan “200” kodu, belgenin bulunduğunu gösterir.
////////////////KUTU//////////////////
HTTP Statü Kodları:
Kod   Mesaj   Anlamı
200   OK   Aranan belge bulundu ve gönderildi
204   No Content   Belge bulundu, fakat gönderilecek bir içerik yok (Browser’da mevcut görüntü değişmez)
301   Moved Permamently   Aranan belge temelli başka bir adrese aktarıldı (Yeni adres Location Header-Yer Başlığı bölümüne yazılır)
302   Moved temporarily   Aranan belge geçici olarak başka bir adrese aktarıldı (Yeni adres Location Header-Yer Başlığı bölümüne yazılır)
400   Cannot be found   Erişmek istediğiniz dosya bulunamıyor
401   Unauthorized   Erişmek istediğiniz belge korunmuştur (Browser, kullanıcı adı ve parola soran bir pencere açabilir)
403   Forbidden   Erişmek istediğiniz belgeye erişim yasaklanmıştır
403.10   Access Forbidden   Erişmek için sunduğunuz yetki kaydı yeterli değil
403.11   Access Forbidden   Erişmek için sunduğunuz parola değişmiş
404   Site not found   Aradığınız site (URL) bulunamıyor.
405   Resource not allowed    Dosya, yanlış adres verdiğiniz için bulunamıyor
406   Not acceptable   Browser’ınız istediğiniz kaynağı görünteleme yeteneğinde olmadığı için istediğiniz dosya gönderilmiyor
410   Does not exist   Aradığınız dosya temelli bulunamıyor
412   Precondition Failed   Dosya istemcinin ileri sürdüğü önşartlara uymadığı için gönderilmiyor.
414   URI Too Long   Dosya için yazılan yol çok uzun
500   Internal server error   Dahilî Server Hatası oluştu
501   Not implemented   İstediğiniz yazılım/media türü bu Server’da uygulanamıyor
502   Bad Gateway   Server geçit olarak görev yaparken, kendisinden sonraki bir Server’dan hatalı yanıt aldı
//////////////////KUTU BİTTİ///////////////////////////
Durum Başlıklarını, CGI yoluyla talep ettiğimiz bir sayfa veya başka bir dosyanın bulunamaması halinde, ziyaretçinin ekranına hata mesajı gönderilmesini önleyecek tarzda kullanabiliriz. Ayrıca ilerde göreceğimiz gibi, CGI programımız, Server’a doğrudan bir sayfanın yerini HTTP Request komutu olarak bildirebilir. Şimdilik sadece bunu “location” (yer) başlığını kullanarak yapacağızı belirtelim.
Peki, bu isteme-sunma ilişkisinde CGI programımız nerede yer alıyor? Yukarıda Server’ın Browser’ın talebini aldığında bir karar verdiğini belirttiğimiz 2’nci maddeyi hatırlıyor musunuz? İşte o karar sırasında Server, talep edilen kaynağın bir CGI programı olduğunu görürse, derhal bu program için bir “Çevre” (Environment) hazırlar, ve CGI programını çalıştıracak yardımcı programı (örneğin Perl) çağırır. CGI programı (yani perl.exe), kendisine verilen “çevre” değişkenlerini kullanarak, yine kendisine ulaştırılan Perl Script’ini (betiğini) çalıştırır ve elde ettiği sonucu Server’a verir. Server bu sonucu irdeler ve elde ettiği çıktıyı (Output’u, sonucu) Browser’a gönderir. Bu sonuç Perl programının beklediği sonuç olabilir; örneğin Form bilgisi başarıyla işlenebilir. Veya sonuç arzu edildiği gibi olmaz; bir hata durumu oluşur. Bu kez Browser’a hata mesajı iletilir.
Buraya kadar anlattıklarımızı bir de görsel olarak belirtelim.
<cgi-perl010.tif>
Burada genel bir CGI uygulamasının akış şemasını görüyoruz; fakat öyle programlarımız olabilir ki, CGI programının sonucu doğruca istemci Browser’a gönderilir. Kimi zaman, CGI programının sonucu Server’ın başka bir kaynağa yöneltilmesi (Redirect) komutu olabilir. CGI programı, söz gelimi bir siteye girişini koruyan parola programı ise, Server’ı, istemciden yeni bilgi edinmeye zorlayabilir.
Çıktı Türleri ve Yer
Bu şemanın son aşaması olan çıktının istemci Browser’a gönderilmesi, CGI programcısı olarak bizim açımızdan çok önem taşır; çünkü şu ana kadar geri planda yaptığımız her şey, bu noktada Internet ziyaretçimizin huzuruna çıkacaktır. Yukarıda yazdığımız küçük Perl örneklerine tekrar bakarsanız, hepsinde şuna benzeyen bir komut satırı göreceksiniz:
print "Content-Type: text/html\r\n\r\n";
Bu satır, Web Server’ın, CGI programının sonucunu istemciye gönderebilmek için kendi üreteceği başlık (Header) bölümüne koyması gereken asgarî bilgiyi vermektedir. Server, istemciye, istediği dosyayı, belgeyi, kaynağı veya çalıştırılmasını istediği programın sonuçlarını bildirirken, belirttiğimiz başlık bölümünü yazmak zorundadır; yoksa gönderilenleri Browser’ın anlaması ve yorumlaması mümkün olmaz; en azından bu unsurlar Browser tarafından bizim istediğimiz tarzda görüntülenmeyebilir. Server’ın istemciye göndereceği unsur bir HTML sayfası ise, tasarımcı olarak HTML kodumuzun içine hiç META etiketi koymamış olsak bile sorun olmaz: Server, başlık bölümünü kendi üretebilir. Fakat iş CGI programına geldiği zaman, Server kendisini programın yerine koyup, başlığın tümünü üretemez; programdan da en azından kendi bölümüne ilişkin başlık bilgilerini vermesini ister. Bizim örnek Perl programlarımızda yer verdiğimiz “Content-Type” bilgisi, Server tarafından programımızın çıktı’sını (Output’unu) Browser’a tanıtmasına yarar.
CGI programlarımızın Server’a bir çok başlık bilgisi (üst-bilgi) vermesi gerekir; ama bunların asgarîsi, içerik türü (Content-Type) veya gönderilecek malzemenin yeri (Location) bilgisidir. İçerik türü bilgisi, Browser’a kendisine gönderilmekte olan veriyi nasıl yorumlayacağını bildirir. Browser’ların genellikle Server’ların anlayabildiği içerik türlerinin tümünü anlayabilirler. Bununla birlikte bugün piyasada birçok Server programı vardır; bunların hepsi her türlü metin veya çoklu-ortam (Multimedia) dosyasını tanımazlar. Farklı Server ve Browser programları arasında anlayış birliği sağlamak için geliştirilmiş olan standarta, MIME (Multimedia Internet Mail Extensions) adı verilir. MIME gerçekte HTTP Server’ları ve Web Browser’ları için değil POP ve SMTP Server’ları ile elektronik mesaj editörleri arasında içinde ses, grafik ve görüntü (video) bulunan elektronik mesaj alışverişine birlik getirmek üzere geliştirilmişti. Fakat Web’in hızlı gelişimi sırasında HTTP Server ile Web Browser arasında bir belge yorumlama standardı geliştirme ihtiyacı doğunca, kullanılmaya hazır MIME’dan yararlanıldı. Bu standarta göre, “Content=Type:” bilgisi “tür/alt-tür” şeklinde yazılır. Örneğin, CGI programımızın çıktısı Browser’a HTML dosyası olarak gönderiliyorsa, buna ilişkin bilgi “text/html” şeklinde yazılır. Çünkü MIME’a göre HTML dosyası bir düz metin dosyasıdır.
/////////////////////KUTU//////////////////////////////
Belli başlı MIME tür/alt-tür grupları
text/plain   Düz metin. Server istenen belgenin uzantısından türünü anlamazsa veya siz CGI programınızda çıktı’nızın içerik türünü belirtmezseniz, Server düz metni varsayılan içerik türü sayar.
text/html   HTML dosyası
text/richtext   Rich Text biçimi. Bir çok kelime-işlemcisinin ortak dosya biçimidir; bir çok Browser tarafından anlaşılabilir.
image/gif   GIF grafik dosyası. Ortak bir biçim olmakla birlikte, içendiği sıkıştırma teknolojisinin kullanımı için bir firmaya telif hakkı bedeli ödeme zorunluğu getirildiğinden bu yana yerini diğer biçimlere bırakıyor. Browser’lar tarafından IMG etiketiyle birlikte kullanıldığında HTML belgesinin parçası olarak görüntülenir.
image/jpeg   JPEG grafik dosyası. GIF’ten daha çok renk derinliği içerebilir. Bütün Browserlar tarafından tanınır ve IMG etiketiyle birlikte kullanılabilir.
image/png   PGN grafik dosyası. Internet için geliştirilmekte olan grafik biçimi. Henüz bütün Browserlar tarafından tanınmıyor. Bu biçimi tanıyan Browserlar, IMG etiketiyle kullanılan PNG dosyasını HTML belgesi içinde görüntüleyebilirler.
image/x-xbitmap   Bitmap grafik dosyası. (Genellikle dosya adının uzatması .xbm olur.) Görüntü, piksel olarak tanımlandığı için fazla ayrıntılı görüntüler için elverişli değildir. Bütün Browserlar tarafından tanınmaz.
audio/basic   8-bit ulaw sıkıştırma tekniği ile üretilen ses kayıt dosyası. (Genellikle dosya adının uzatması .au olur.) Bütün Browserlar tarafından tanınmaz.
audio/x-wav   Microsoft firmasının geliştirdiği Windows sistemi için ses kayıt dosyası. (Bütün Browserlar tarafından tanınmaz)
video/mpeg   MPEG video kayıt dosyası. Bütün Browserlar tarafından tanınır.
video/quicktime   Apple firmasının geliştirdiği MacOS ve Windows sistemleri için video dosyası. Browseın tanıması için ek program çalıştırılması (plug-in) gerekebilir.
video/x-msvideo   Microsoft firmasının geliştirdiği Windows sistemi için video kayıt dosyası. (Genellikle dosya adının uzatması .avi olur.)
application/octet-stream   Server tarafından tanınmayan bütün dosya türleri için bu içaret türü gönderilir ve bunu gören Browser kullanıcıyü bu dosyayı çalıştırmak veya görüntülemek yerine sabit diske kaydetme imkanı tanır.
application/postscript   Postscript yazıcı dili ile gönderilen herhangi bir içerik.
application/vnd.ms-excel   MS Site Server, Internet Information Server veya kişisel Web Server programlarının tanıdığı MS Office yazılım paketindeki Excel programının dosyası. Microsoft işletim sistemlerinde çalışan hemen hemen bütün Web Server programları tarafından da tanınmaktadır. (Bu türün alt türleri arasında “application/vnd.ms-powerpoint” ve “application/msword” de bulunur. MS firmasının Internet Browser programı IE tarafından bu içarek türü tanınır ve ilgili MS yazılı çalıştırılarak dosyanın içeriği görüntülenir; diğer browserlar bu içerik türünü sabit diske kaydetmeyi önerirler.
///////////////KUTU BİTTİ//////////////////////
Bir içerik türü satırında parametre de kullanılabilir. CGI programlarının bu tür özellik belirten parametrelere ihtiyacı çoğu zaman olmaz; ama örneğin gönderdiğiniz HTML sayfasının dili burada belirtilebilir.
CGI programlarımızda belirtebileceğimiz asgarî başlık bilgisi (üst-bilgi) “Location” (yer) de olabilir. CGI programımız kimi zaman ortaya bir belge çıkartmaz; diyelim ki mevcut bir başka kaynağa göndermede bulunabilir. Internet’teki belge veya diğer görüntülenebilir, çalıştırabilir, seslendirebilir, oynatılabilir herhangi bir unsura “URI” denir. “Uniform Resource Identifier” (Tekdüze Kaynak Kimliklendirici) kelimelerinin başharfi olan URI, isim veya adres+isim olabilir.
////////////////KUTU//////////////////
URI türleri
Beli başlı URI’lerin arasında “URL” (Uniform Resource Locator/Tekdüze Kaynak Yer-belirleyici) vardır. Bir diğer “URI” türü ise “URN” (Uniform Resource Name/Tekdüze Kaynak Adı) sayılabilir. Bir başka “URI” türü olarak, “URC” (Uniform Resource Citation/Tekdüze Kaynak Göndermesi) türü vardır. Başka bir deyişle Internet’te herhangi bir kaynağın kimliği (URI’sini) belirmek için yerini (URL), adını (URN) veya ona yapılan bir göndermeyi (URC) belirtebilirsiniz.
“http:”, “ftp:”, “gopher:” diye başlayan Internet kaynak adresi, URL’dir.
URN’lerin adresleri “urn:” şeklinde başlar.
URC türü adreslendirme standardında ise henüz World Wide Web Konsorsiyomu (w3c.org) içinde görüşmeler tamamlanmamış bulunuyor.
//////////////////////////////////////////KUTU BİTTİ////////////////////
Diyelim ki, bir CGI programında, Browser’a program sonucu olarak kendimiz “print..” komutlarıyla bir HTML belgesi oluşturmayacağız, fakat mevcut bir HTML belgesini göndereceğiz. Örneğin istiyoruz ki programımız istemciye “merhaba.htm” dosyasının yerini (Location) bildirmekle yetinsin. Bunu, şöyle bir Perl programıyla yapabiliriz:
#!/usr/local/bin/perl
# dosya-gonder.pl

print “Location: /merhaba.htm\n\n”;


///////////////////TASARIM İÇİN NOT//////////////
Yukarıdaki kodda print diye başlayan satırın üstünde ve altında bir satır boşluk olması gerekir! 
/////////////////NOT BITTI///////////////////////////////
Burada Location başlık bilgisini oluşturacak satırın altında da boşluk bıraktığımıza dikkat edin: bu Server’a başkaca bir başlık (Header) bilgisi vermeyeceğimizi gösöterir. Bu tek satırlık komutu alan Server, Browser’a (sanki Browser bu sayfayı istemiş gibi) bu kaynaktaki sayfayı gönderir. Kimi zaman kaynak, burada olduğu gibi Server’ın kendi sabit diskinde bir dizide bulunmayabilir ve tam bir URL olabilir. Örneğin:
#!/usr/local/bin/perl
# dosya-gonder.pl

print “Location: Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap


///////////////////TASARIM İÇİN NOT//////////////
Yukarıdaki kodda print diye başlayan satırın üstünde ve altında bir satır boşluk olması gerekir! 
/////////////////NOT BITTI///////////////////////////////
Bu durumda bizim Server, istemci Browser’a “302” yani “Dosya başka yere nakledildi!” sonucu ve kendi ürettiği HTML sayfası içinde “Aradığınız dosya için <A HREF= Linklerin Görülmesine İzin Verilmiyor
Linki Görebilmek İçin Üye Ol veya Giriş Yap burayı</A> tıklayınız!” gibi bir mesaj gönderir. (Bu HTML sayfasının şablonu Server’da bulunur ve Server operatörü tarafından belirlenir. Server’larda bütün HTTP Statü Kodları için kullanılmaya hazır şablon HTML sayfaları bulunur.)
Diğer Başlıklar
Yukarıda bir HTTP Server’nın Browser’a gönderdiği tipik bir başlık örneği olarak verdiğimiz metinde, tarih ve saat dikkatinizi çekmiş olmalı. Biçimi Server’ına göre değişmekle birlikte hemen bütün Web Server’lar, başlık (Header) bilgisinin içine tarih ve saat bilgisi de koyarlar. Browser bu bilgiye bakarak, almakta olduğu belgenin (varsa) kendi yedek deposunda (cache, veya Windows sistemlerinde Geçici Internet Dosyaları dizini) sakladığı sürümünü mü görüntüleyeceğine, yoksa yeni gelen sürümünü mü görüntüleyeceğine karar verir. Örnek:
#!/usr/local/bin/perl
# tarih-saat.pl

print "Content-Type: text/html\r\n\r\n";
print $time = (localtime), “\n”;


///////////////////TASARIM İÇİN NOT//////////////
Yukarıdaki kodda print diye başlayan satırın üstünde ve altında bir satır boşluk olması gerekir! 
/////////////////NOT BITTI///////////////////////////////
Browser’a göndereceğimiz başlık bilgileri içine Expires başlığını koyarak, sayfanın “cache edilmesini” (depolanmasını) önleyebiliriz. Bu durumda Browser, gelmekte olan belgenin kendi yedek deposunda bir örneğini aramaz.
Sonuç
Bu bölümde, Internet’te sunucu ile istemcinin, Web Server ile Internet Browser programının buluştuğu yeri, CGI’ı tanıdık; Internet ilişkisinin iki ucundaki bu varlıkların etkileşmesinin esaslarını gördük; ve bu ilişkiyi CGI programı yoluyla nasıl etkilediğimizden söz ettik. Küçük de olsa Perl programı yazdık ve Perl’ün nasıl işlediği hakkında fikir edindik. Fakat henüz bu dil hakkında temel kavramları bilmiyoruz.
Şimdi sıra, CGI’da yolumuzu şaşırmayacak kadar Perl öğrenmekte!

Logged
 
TRForumcu.NeT | Bilgi ve Paylaşım Platformu
Gondolin
Bölüm Sorumlusu
*


Mesaj : 1.169
Forum Para : 7896.00 YTL
« Yanıtla #3 : 02 Mayıs 2008, 11:04:35 »

Perl’ün Yapı Taşları
Sadece bir Web Server’da çalışacak da olsa CGI programımızı yazmakta kullandığımız Perl dili, güçlü bir dildir. Perl ile çok şey yapılabilir. CGI programı yazmak, Perl ile yapabileceğimiz işlerden belki de en basitidir. Perl’ü dil olarak öğreten bir çok kaynak bulabilirsiniz. Biz burada Perl’ü sadece CGI programcısının bilmesi gerektiği düzeyde tanımaya çalışacağız.
Perl ile program yazmak için ne büyük derleyiciler, ne de “Visual Perl Programlama Araçları” yok! Perl programı yazarken kullanacağımız tek araç, Windows ortamında Not Defteri, Macintosh’ta Simple Text, Linux’ta ise CoolEdit olabilir. Perl programı yazmak için kelime-işlem programı kullanırsanız, metinlerinizi düz yazı veya ASCII biçiminde kaydetmelisiniz.
Her program, bir öbek veriyi alır ve işler; ortaya bir sonuç çıkartır; veya çıkartmaz. Ortaya somut bir sonuç çıkmaması da programın sonucu olabilir. Perl de işleyebilmek için önce veriye ihtiyaç duyor. Biz insanlar veriyi gördüğümüz anda türünü de anlarız. Bazı bilgisayar programlama dilleri, bizim gibi, verinin türünü, verinin kendisini görünce anlar. Perl’e verinin türünü belirtmek gerekir. Perl’ün verilerle yapabileceği işlemler (operator) klasik aritmetik işlemlerdir. Fakat Perl daha bir çok işlem yapabilir. Bunlar ya Perl’ü geliştirenler tarafından belirlenmiştir (bunlara fonksiyon, işlev denir; ya da fonksiyonlarımızı biz yazarız veya başkalarından (kitaplık/library denen dosyalar halinde) ödünç alırız (bunlara da subrutin denir). Ve bütün bunların sonunda Perl programı ortaya bir sonuç çıkartır ve bu sonucu kendisini göreve çağırana, yani Web Server’a verir.
Bilgisayar programlama uzmanları, Perl’ü bir “okuma ve yazma dili” sayarlar. Perl ile bir veya daha fazla dosya (bilgi, kaynak) okunur; bir sonuç çıkartılır; ve bu sonuç bir başka dosyaya (bilgi deposuna, kaynağa) yazılır. Şimdi Perl’ün bu okuma-yazma işini nasıl yaptığına yakından bakalım:
Perl’de Veri
Veri, Perl’ün üzerinde işlem yaptığı şeylerin tümüdür. Veriler, rakam, harf veya işaretlerden ibarettir. Ancak her rakam sayı değildir; bizim Perl’e belirtmemiz gereken ilk şey, ona verdiğimiz verinin sayı mı, yoksa rakam bile olsa sayı-dışı, alfanümerik bir değer (hem harf, hem rakam veya sadece harf veya sadece rakam ve diğer işaretleri içeren karakter dizisi) mi olduğunu söylememiz gerekir. Buna dikkat edin. Çünkü Perl’de daha sonra göreceğimiz herşey verileri bu şekilde ikiye bölmekten kaynaklanır. Şimdi 45’in sayı olması için toplanabilir, çıkartılabilir olması gerekir. 34 yaş olarak, kilo olarak, kilometre olarak bir anlam taşıyorsa, sayıdır. Buna karşılık 34, Istanbul’un il sıra numarası ise sayı-dışı bir rakamdır; buna Perl’ün dilinde String denir. Bir sınıftaki 20 öğrencinin “yaş” rakamları toplanır, 20’ye bölünürse ortaya çıkan rakam, halâ sayıdır: adına “sınıfın yaş ortalaması” denir ve bu rakam (doğru adıyla sayı) başka istatistik hesaplarda kullanırsanız size istatistikçi denir. Buna karşılık 20 ilin il sıra numaraları toplanır, 20’ye bölünürse ortaya anlamsız bir şey çıkar; ve bunu görenler size şaşkın gözlerle bakarlar. Sayılarla aritmetik işlemler yapılır. String (karakter dizeleri) ile, rakam bile olsa, aritmetik işlem yapılmaz. Perl için, 0’dan 255 ASCII değerine kadar herşey String’dir. Bir harf, Perl için String’dir; bir kelime veya bir cümle de String sayılır. Perl için String’lerin sınırı yoktur. Buna karşılık sayılar, sınırlıdır.
Perl’e bir rakamın sayı olduğunu