Ders Notları Tamamı - Endüstri Mühendisliği Bölümü Üretim
Transkript
Ders Notları Tamamı - Endüstri Mühendisliği Bölümü Üretim
Çukurova Üniversitesi Mühendislik Mimarlık Fakültesi Endüstri Mühendisliği Bölümü ENM424 Endüstride Bilgisayar Uygulamaları Ders Notları Öğr. Gör. İrfan MACİT Adana,2006 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) 1.1 Giriş Bilgisayarlar yazılımları olmadan çalışmaları mümkün olmayan makine ve makine parçaları olarak tanımlayabiliriz. Bir sabit disk düşünelim tek başına durduğunda veya elektrik besleme girişine uygun elektrik ve sinyaller verildiğinde sadece sabit diskin plakaları dönecek ve başka herhangi bir işlem yapamayacaktır. Uygun elektriksel parçalar ile bir araya getirildiğinde bilgi giriş ve çıkışı yapabilecek çevresel birimler eklendiğinde bilgisayar haline gelecektir. Yazılımı olmadan yine bilgisayar oluşacak fakat bilgi giriş ve çıkışı olmadığı için herhangi bir kullanıcı tarafından kullanılamayacaktır. Bilgisayarlar yazılımları olmadan kullanılmaları veya bilgi akışı mümkün değildir. Yazılımlar bir bilgisayara uygun arabirimler kullanarak bilgi girişi ve çıkışı yapmamıza olanak tanır. İşletim sistemleri çevresel birimlerin birbirleri ile haberleşmesini yöneten yazılımlardır. Bu sayede bilgisayarlar çevresel birimleri ile haberleşir hangi birimde neler oluyor işletim sistemi sayesinde ortaya çıkar. Yazılım nasıl yazılır sorusu her bilgisayar kullanıcısının aklına takılan bir sorudur. Yazılımlar işletim sisteminin bir sabit disk veya bilgisayar çevresel birimleri tarafından okunabilen bir ortamdan alınan ikilik bilgilerin yorumlanması ile çalışır. Yorumlanan bilgiler uygun yazılım kesmeleri ile ortamları arasında taşınır. Yazılım kesmeleri (Software Interrupt) onaltılık tabanda belirlenen komut setlerinden oluşur. Komut setleri her bir işlem için ayrı olarak 1 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) tanımlanmıştır. Sabit diskten bir veri okumak veya işlemciye gönderilecek olan verinin nasıl işleneceği gibi birçok komut işletim sisteminin özelliğine göre değişiklik gösterir. Yazılım geliştirme süreci çok maliyetli ve bazı durumlarda uzun zaman gerektirir. Yazılımları ilk kuşak bilgisayarlarda ölçeklemek gerekir ise küçük, orta ve büyük ölçekli olarak sınıflandırabiliriz. Bu sınıflandırma artık geçerliliğini korumamaktadır. Yazılım geliştirme her geçen gün daha detaylı ve karmaşıklaşmaktadır. Bu karmaşıklığı aşabilmek için çeşitli araçlar geliştirilmiştir. Yazılım geliştirme ekipleri bir araya geldiğinde bu araçların önemi daha çok ortaya çıkmaktadır. 1.2. Yazılım Geliştirme Araçları Yazılım geliştirme sürecinde kullanılan araçlar olduğu gibi yöntemler vardır. Bu yöntemler kullanılan araçlara veya yaklaşımlara göre de değişmektedir. Son yılara genel kabul gören yaklaşımların başında analiz ve tasarım aşamasında etkili olan sistematik yaklaşım gelmektedir. Sistematik yaklaşımda problemin analizi, yapısal tasarımı, deneysel sistemin gerçekleştirmesi, test yatağı (test bed) ve bütünleştirmeden (Integration) oluşan beş aşama vardır. Bu aşamalarda geliştirilecek olan yazılımın sistematik olarak adımlandığı ve hata bulma toleransının yüksek olduğunu görebiliriz. Sistematik yaklaşıma daha önceleri yazılım yaşam süreci (Software Life Cycle) olarak tanımlanan süreçlerden oluştuğu bilinmekteydi. i) Analiz aşaması, geliştirilecek olan yazılım ve problemin tanımının yapıldığı aşamadır. Yazılımın ölçeğine göre değişiklik gösterebilen yapısı vardır. ii) yapısal tasarım aşamasında yazlımın genelde kaç katmandan oluşacağı, denetim mekanizmaları gibi öbeklerim belirlendiği aşamadır. iii) deneysel gerçekleştirim aşamasında yapılandırma aşamasında gözden kaçan veya hata ayıklama ve toleranslarının düzeltme yüzdelerinin gözden geçirilir. iv) test yatağı aşamasına gelindiğinde yazılım artık kullanıcılar ile karşılaşacak aşamaya gelmiştir. Yazılıma bağlı platformları gözden geçirilir daha sonra kullanıcıların geri beslemeleri alınarak son ince ayarlamalar yapılır. v) bütünleştirme son aşamadır. Kullanıcıların verdiği geri beslemeye göre yazılıma görsellik kazandırılır. Diğer çalışacağı yazılım veya platformlara uygunluğu saptanır. Hatalar bu aşamada tamamen giderilmiş olur ve yazılım paketlenir. 2 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) 1.2.1 Yazılımlarda Projelendirme Aşaması Yazılım yapan mühendisler genellikle tasarım ve projelendirme aşamasından yapısal hatalar yapmaktadırlar. Değişik aşamalarda yapılan hataların kontrol ve değerlendirme aşaması olarak kabul ettiğimiz test ve bütünleştirme aşamalarında giderildiği kabul edilse de daha sonraları bu hatalara bağlı değişik kodlama ve mantıksal hatalar ortaya çıkmaktadır. Donanımsal hataların giderilebildiği mühendislik faaliyetleri içerisinde düzelte veya yeniden işleme gibi süreçler yazılım mühendisliğinde hata ayıklama (debugging) ve yeniden kodlama (recoding) olarak tarif edilmektedir. Yazılım yapan mühendislerin hata yapması veya hata ile karşılaşılan durumlarda bu hatalar nasıl tarif edilmelidir. Hataları toleransları ve hata kriterleri neler olmalıdır gibi sorula sorulduğunda cevaplanabilir kriterlerin olması gerekmektedir. Yazılımda ölçme ve değerlendirme yapabilecek yönetici veya proje sorumlularının dikkat etmesi gereken bir çok nokta vardır. Çünkü yazılım mühendislerinin yaptıkları hataların bulunması çok zordur. Bu hatalar kod hataları ile sınırlı değildir. Yazılım mühendisi veya yazılımcı yaptığı mantık hatasının da değerlendirilmesi gerekecektir. Bir işlev için yazılan fonksiyon kodları on satır ile bitirilebildiği gibi bazı durumlarda yüz satırda da bitirilebilir. Hangi durumda kod hatalıdır belirlenecek olan kriterler ile bu problemler aşılabilmektedir. Diğer bir durumda yazılan kodlar adam/saat yerine satır/kod maliyetli ise yazılımcı satırları arttırarak maliyetleri arttırabilir. Bu gibi bir çok problemden söz edilebilir. 1.2.2 Bilgisayar Yazılımlarında Ölçme ve Değerlendirme Kriterleri Bir çok projede karşılaşılan problemin kaynağının kesin olarak bulunması mümkün değildir. Bulunan hataların değerlendirme yöntemleri ve kriterlerini ölçmek için kullanılan çeşitli yöntemler vardır. Bu yöntemler ölçülebilir büyüklükler dolaylı ve direk olarak sınıflanır. Direk olarak ölçülebilen büyüklükler yazılım maliyeti, ortaya çıkan hata sayısı, yazılımcı gayreti, yazılan satır/kod sayısı, yazılımcı adam/saat. Diğer ölçülebilen dolaylı büyüklükler ise yazılımın işlevselliği, güvenilirliği, bakım ve onarım kolaylığı, yazılımın kalitesi olarak sınıflandırılabilir. Bu tip sınıflandırma yazılım projelerinde genel bir kural olarak benimsenmeyebilir. Bunun temel nedeni yazılım projeleri aynı olsa bile çalıştırılan kodların sayılarına göre değişiklik gösterebilecektir. 3 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) 1.2.3 Yazılım Ölçmede Kullanılan Hesap Yöntemleri Yazılım projeleri değerlendirilirken dikkat edilecek kriterlerden bahsettik. Bu kriterlerin ölçümü yanı sıra hesaplanma değerleri nasıl ve hangi yöntemler ile hesaplanacaktır. Hesap yöntemleri yazılımın sadece kaç satır kod ile üretildiğini göstermemektedir. Karmaşık veya mantıksal durum ifade edebilen örneğin yapay zeka yazılımları değerlendirilirken nasıl bir yöntem izlenmelidir soru akla gelmektedir. Bu yazılımın maliyeti çok değişken ve uzun zaman alan bir süreç olabilir. Daha önceden kullanılan ve üretilen yazılım kodları da bazı durumlarda maliyeti arttırıp azaltabilmektedir. Kullanılan yazılım kodu daha önceki bir projeden oluşturulabilir veya yazılım ekibi dışında bir başkasından temin edilmesi durumu olabilir. Böyle durumlarda maliyet azalabilir veya artabilir. Yazılımın oluşturulması sırasında temel değerlendirme kriteri olarak genelde satır/kaynak kod göz önüne alınır. Ek olarak satır/kaynak kod bazı durumlarda açıklayıcı olmayabilir. Satır kaynak kod yerine açıklayıcı olabilmesi için işlevsel gösterge ölçüm birimi kullanmak daha yararlı ve sonucu almak açısından önemli olmaktadır. İşlev göstere bir puanlama şekli olarak kabul edilebilir. Bunun için kesinlik bildiren bir birimsel dönüşüm oluşturulması yararlı olur. Projelerin değişik zamanlama ve ölçüm kriterleri proje geliştiricilere bağlı olarak değişiklik gösterebilir. Burada kullanılan yöntemler daha çok genel olarak yazılım projelerinde kullanılan yöntemleri kapsamaktadır. Bir yazılım evinin geliştirdiği projelere göre örnek ele alalım. Bu örneğe göre projeye ait olarak maliyetler ve gerekli olan değerler aşağıdaki tablodaki gibi olsun. Tablo 1.1 Yazılım Projelerinde Kullanılan Sayısal Büyüklükler. Proje Satır/kod Maliyet TRL Sayfa Sayısı Hata Bozunma X1000 Yazılımcı Gayret Sayısı P1 24000 480000 300 24 12 24 18 P2 36000 640000 600 18 8 40 24 P3 48000 72000 800 20 14 50 28 Yazılım evleri diğer adları ile yazılım firmaları daha önceleri karşılaştıkları problemleri ve durumları kayıt altında tutarak bir veri tabanı oluştururlar. Bu veri tabanları yazılım projelerinde geçmiş veriler ile geliştirilen yazılımda çıkabileceklere bir öngörü/tahmin oluşturur. Daha 4 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) önceden geliştirilen yazılımlar yeni geliştirilen için bir emsal teşkil etmemesine rağmen bir fikir verme açısından başvurulacak bilgilerdir. Projeler bu şekilde tablo olarak göz önüne alındığında hem maliyet hem de projede karşılaşılacak diğer durumlar hakkında bilgi sahibi olunabilir. P1 yazılım projesi için bazı maliyet ve oranlar aşağıdaki gibi hesaplanmaktadır. Yazılımcı Maliyeti : (480000000/24) = 20000000 TRL / ay (kişi başına) Bilgisayar Programının Satırı Maliyeti : (480000000/24000) = 20000 TRL Hata Oranı : (24/24000) = 0.001 Hata / Satır = 1 Hata/ 1000 Satır Bozunma Oranı: (12/24000) = 0.0005 Bozunma Oranı = 0.5 Bozunma / 1000 Satır Yazılımcı maliyeti yukarıdaki hesaplamadan aylık olarak 20 milyon olarak bulunmuştur. Bunun anlamı yazılım projesinde bir yazılımcı bu proje geliştirilirken aylık maliyeti 20 milyon liradır. Hata oranına baktığımızda her bin satır kod karşılığında bir hata üretildiği veya hata oluştuğunu görmekteyiz. Buradan hareket ile hata kodları karşılığına satır sayısı LOC (Lines Of Codes) kısaltması ile bir ölçüm kriteri olarak kabul edebiliriz. Genel kabul görmüş olan LOC birimi bin satır için KLOC şeklini alacaktır. İşlevsel gösterge puanı diğer yöntemlere göre sayısal olarak verilerin gösterilmesini de sağlamaktadır. Sayısal olarak yazılımın değerlendirilmesini sağlayan bu yöntemde istenilen bileşenleri için değişik ağırlıklar verilerek yazılıma katkısı araştırılabilir. Bu tip değerlendirme sistemlerinde ağırlık ve sonuç göstergeleri yazılım yöneticisi tarafından değişik şekillerde bir araya getirilerek sayısal göstergeleri oluşturulabilir. Bu göstergelerde bulunan bileşenler yer değiştirilerek gösterge üzerinde anlamlı ifadeler çıkarılabilir. Bunu bir örnek vererek açıklamak gerekir ise kullanılan bilgisayar programlama dillerinden birisinin ikame etkisi diğer bir değiş ile diğerinin yerine kullanılması değerlendirilebilir. Fortran bilgisayar programlama dili ile yazılan bilgisayar program yerine C++ bilgisayar programlama dili kullanılarak bazı kodların fazladan yazılması engellenebilir. Nesne yönelimli dillerden birisi ile oluşturulan bilgisayar programı yerine yapısal programlama dillerinden birisi ile yapılan programlarda daha fazla kod yazmak maliyetleri ve hata oranını arttırabilmektedir. Bunun için işlevsel göstergelerin neler olduğunu veya nasıl hesaplanması gerektiğinin iyi belirlenmesi gerekmektedir. Belirleme işlemleri sırasında eş değer bilgisayar yazılım dilleri tablosu oluşturularak hangi programlama dilinin 5 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) temel fonksiyonlardan birinin kaç satır kod ile yazılabildiğinin ortaya konulması gerekir. Bunun için temel olarak belirlenen matematiksel veya mantıksal birkaç genel kabul görmüş algoritma bilgisayar programlama dili ile programlanır ve kaç satır kod ile oluştuğu belirlenir. Bu bize bir fonksiyon veya alt programın hangi programlama dilinde kaç satır koda (KLOC) karşılık geldiği belirlenmiş olur. Satır kod sayısı işlemine programlama dillerinin işlevselliğini de katacak olursak yapılması gereken işlevsel göstergenin satır sayısı (KLOC)/ işlevsel gösterge oranının bulunması gerekecektir. Bu oransal değer bize satır kod sayısının ne kadar işlevsel olduğu hakkında oransal bilgi verecektir. Oransal değer dönüşüm tablosu oluşturmak işlemleri daha kolaylaştıracak ve yazılım kodları konusunda daha açıklayıcı bilgi edinmemizi sağlayacaktır. Tablo 1.2 Örnek Kod Satır Sayısı (LOC) / İşlevsel Gösterge Dönüşümü Tablosu Bilgisayar Programlama Dili LOC / İşlevsel Gösterge (ψ) Ağılıklı Sonuç Değerlendirme Oranı (λ) C++ 400 15 Turbo Pascal 7.0 350 18 Fortran 77 310 23 gcc 700 11 g++ 770 10 fp 420 20 İşlevsel gösterge (ψ) ve değerlendirme tablosuna göre ağırlıklı sonuç değerlendirme indeksi oluşturulur. Bu indeks yazılımı geliştiren takıma ait başarım oranım olarak kabul edilir. Ağırlıklı sonuç değerlendirme oranı işlevsel göstergeler ile sonuca etkiyen faktördür. Sonucu etkileyen faktörleri aşağıdaki gibi sıralayabiliriz. Bu sıralamada her bir ağırlık sonuç indeksine etkiyen oransal değerlere ihtiyaç vardır. Hesaplama yöntemi ise bu tablodan verilecek olan ağırlık değerlerine paralel değerlerdir. Ağırlık değerleri 0 ile 10 arasında rakamsal değerlerdir. ψ = LOC * (λ/100+ εi /100) 6 (1.1) İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Tablo 1.3. Ağırlık Değerleri indeksi (εi) i Değer Kriteri εi Değeri 1 Hızlı kod geliştirme desteği gerekli mi ? 0..10 2 Veri haberleşmesinin önemi nedir ? 0..10 3 Gerçek zamanlı veriler kullanılacak mı? 0..10 4 Dağıtık işlem ve süreçler var mı ? 0..10 5 Çoklu kullanıcı desteği var mı ? 0..10 6 İşletim sistemi servis desteği var mı ? 0..10 7 Kullanıcı arabirimleri tek/çoklu ? 0..10 8 Veri depolama aygıtları dağıtık mı? 0..10 9 Program kodları yeniden kullanılır mı? 0..10 Tablodan alınan değerler formül 1.1 de yerine konarak İşlevsel gösterge (ψ) değeri hesaplanır. Sonuç olarak bulunana değerler bütün yazılım projelerinde kesinlik belirtemeyebilir. Kesinlik durumunu belirleme oldukça zordur. İşlevsel gösterge (ψ) değeri bize daha çok somut olarak ele alamadığımız kesinlik ifade etmeyen bileşenlerin hesaplanmasında yardımcı olur. Bununla birlikte diğer ölçüm kriterleri göz önüne alınarak değerlendirme yapmak çoğu zaman daha belirleyicidir. 1.2.4. Bilgisayar Yazılımında Hesap Tahmini ve Proje Yönetimi Yazılım projelerinde maliyet hesabı diğer projelerin hesabında kullanılan yöntemlere benzemektedir. Tahmini yazılım maliyet hesaplarındaki tahmini ve sonuç arasındaki fark çoğu zaman istenen yazılım ile ortaya çıkan yazılımın arasındaki farkından oluşur. Yazılım projelerine başlarken projeci ve müşteri istenen ile projede ulaşılan sonuçları istemeyebilirler. Müşteri bazı durumlarda veya iletişim farkından veya teknik bilgi yetersizliğinden projeci ile anlaşmazlığa düşebilirler. Müşteri tam olarak kavrayamadığı bilgisayar yazılım projesinden beklentileri projede öngörülenden farklı olabilir. Yazılım projelerinde ortaya çıkan anlaşmazlıkların genelde nedenlerini şu şekilde sıralayabiliriz; i) Müşterinin teknik bilgi yetersizliği ii) Projede detayların tam olarak belirlenmemesi iii) Yazılımcıların kodlama hatası 7 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) iv) Geliştirme ortamlarının iyi seçilmemesi v) Müşterinin eksik bilgilendirilmesi vi) Projede kullanılan teknik donanım ile çalışacak donanımları uyumsuzluğu v.b. Yazılım projelerindeki anlaşmazlıların maliyetlere direk etkisi vardır. Geliştirilen yazılımların maliyetleri süre uzadıkça veya çalışanlar değiştikçe artmaktadır. Kesin olarak maliyetlerin miktarlarının bilinmesi de kimi zaman olanaksızdır. Yazılım projelerinde mutlaka proje yönetimi yaklaşımları kullanılmadır. Bu bize projenin mevcut durumunu, ilerleme hızını, gelinecek aşamaları ve bir sonraki aşamada neler olabileceğini göstermesi açısından da yararlı olacaktır.Proje başlangıcında tahmin edilmeyen giderler projenin yürütülmesini zorlaştırabilmektedir. Doğru tahmin edilen ve sonuca ulaşan projelerde de mutlaka detaylı olarak incelendiğinde bir muğlaklık veya bilinmezlik durumu vardır. Belirsizlik durumları projede çalışanların gayretlerinin de ölçülmesini güçleştirmektedir. İlk başlarda projenin geliştirilmesinde yazınla kodların değiştirilmesi veya yeni kodların eklenmesi çok fazla zaman almamaktadır. Yazılım için geliştirilen kodlar arttıkça eklenen kodların sayısı için geçen süre üstel olarak artmaktadır. Bunu üstel dağılım ile açıklayan formül; Süre (t) = (KLOC)δ (1.2) δ : Τekrarlı komut KLOC : Satır Sayırı x 1000 ile gösterilmiştir. Formülden de anlaşıldığı gibi yazılım projelerinde satır sayısı ve tekrar edilen komutların üstel olarak artması ile sonuçlanır ve proje geliştiricileri her yeni komut veya satır eklediğinde bu durum daha da güçleşir. 1.2.5 Satır Sayısı Yöntemi ile Kestirim Bu yöntemde, proje tahmin edilen alt birimlerine ayrıştırılır . Parçala - yönet stratejisi sonucunda ortaya çıkan, üzerinde tahmin yapılması daha kolay olan daha küçük her birim için satır sayıları önerilir. Bu kestirimler yapılırken de en küçük, en olası, ve en büyük ihtimaller belirlenip bunlarla bir ortalama işlemi yapılabilir. Bir birim için tahmin edilecek en küçük satır sayısına k, en olası satır sayısı tahminine o, ve en büyük tahmin değerine de b denecek olursa, o birim için: Satır sayısı kestirimi: (k + 4o + b) / 6 şeklinde hesaplanabilir. 8 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Birimler için ayrı ayrı tahminler yapılır ve daha önceki deneyimlerden benzeri birimlerin geliştirilmesindeki şirketin verimliliği gibi değerler kullanılarak satır sayısı tahminlerinden çaba, zaman ve maliyet kestirimlerine varılır. Projenin bütünü için, birimlerin çaba, zaman ve maliyet kestirimleri toplanarak değerler elde edilir. Birimlerin satır sayıları toplanarak proje bütünü hakkında çaba ve zaman gibi kestirim hesaplarını bir kerede yapmaktan kaçınılmalıdır. Satır sayısı büyüklüğü ile diğer sonuç değerlerinin doğrusal olmayan bir ilişki ile bağlantılı oldukları hatırlanmalıdır. 1.2.6 İşlev Puanı Yöntemi ile Kestirim Daha önce değinilen işlev puanı ölçme tekniği, kestirim yapılmasında da kullanılabilir. Eğer proje ile ilgili girdi çıktı gibi özellikler tahmin edilebiliyorsa (işlev puanı formülleri için gerekli bilgiler) bunlar kullanılarak geliştirilecek sisteme ait bir değer elde edilir. Satır sayısı tekniğinin tersine bu yöntemde bir yazılım birimi için -doğrudan- büyüklük tahmini yapma zorluğu yoktur. Aksine, ihtiyaçlar belirlemesi çalışmalarında ortaya çıkabilecek değerler kullanılarak sonuca varılabilir. Elde edilen sonucun diğer yöntemlerle karşılaştırılabilmeleri için Tablo 2.2 deki değerler kullanılarak işlev puanından satır sayısı değerine ulaşmak mümkündür. 1.3 COCOMO Modeli Gereken çabanın, program büyüklüğünün bir üstel değerine bağlı olması prensibi ve endüstriden toplanan bilgiler ışığı altında bina edilmiş bir kestirim metodu vardır: COCOMO (Constructıve Costing Model). Yapılacak hesapların kapsamları açısından üç değişik modelden oluşur. Basit model, orta ve detaylı modeller. Ayrıca bu modellerde kulanılacak problemler, ‘organik, yarık ayrık ve gömülü sınıfları altında toplanmıştır: Organik problemler için küçük boyuttaki programcı takımları, bildikleri ortamlarda iyi anlaşılmış uygulamaları geliştirirler. İletişim kamburu azdır ve elemanlar çabucak işlerini halledebilecek durumdadırlar. 9 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Yarı ayrık problemlerde ise ekipte tecrübeli ve tecrübesiz elemanlar bulunabilir. İlgili sistemler konusunda deneyimleri sınırlı olabilir ve geliştirilen sistemin her veçhesini bilmeyebilirler. Gömülü problemler: Geliştirilecek yazılım, sistemin donanım, kurallar, işletim süreçleri veya yazılım gibi diğer bileşenleri ile çok kuvvetli bağlantılar oluşturur. Gereksinim değişiklikleri ile problemleri halletmek olanaksızlaşmıştır. İhtiyaç belirtiminin geçerlilik irdelemesi çok pahalıdır. Elemanların herşeyi bilme olasılığı iyice azalmıştır. COCOMO bu model ve problem sınıfı saptamalarından sonra ortaya çıkan formüllerle tahmin hesaplama yolunu önerir. Tablo 2.4, problem sınıflarına göre basit model için formülleri göstermektedir. Tablo 1.4 Basit COCOMO Modelleri Problem Çaba Süre Organik Çaba = 2.4 (KLOC) Yarı ayrık Çaba = 3 (KLOC) Gömülü 1.05 0.38 Süre = 2.5 (Çaba) 1.12 Çaba = 3.6 (KLOC) 0.35 Süre = 2.5 (Çaba) 1.20 0.32 Süre = 2.5 (Çaba) Orta detaydaki model ise sistemin (güvenilirlik, veri tabanı büyüklüğü, işletme ve kayıt sınırlandırmaları, personel özellikleri ve kullanılan yazılım araçları gibi) diğer özelliklerinin hesaba katılması amaçlanmıştır. Belirli bir dizi özelliğin, proje açısından etkileri ayrı ayrı ağırlandırılarak katsayılar ortaya çıkarılır. Bu faktörler, ilgili özellik için düşük (<1), nominal (1) veya yüksek (>1) olarak saptanırlar. Katsayılar birbiri ile çarpıldığında Çaba Ayarlama Katsayısı (ÇAK) (Effort Adjustment Factor) bulunur. Bu katsayı 0.9 ile 1.4 arasında bir değer alır ve Tablo 1.5 de gösterilen Orta COCOMO modeli formülleri kullanılarak çaba hesaplaması sonuçlandırılır. Süre hesaplaması ise Basit COCOMO modelinde olduğu gibi yapılır. Tablo 1.5 Orta Detayda COCOMO Çaba Formülleri Problem Çaba 10 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Organik Çaba = 3.2 (KLOC) Yarı ayrık Çaba = 3.0 (KLOC) Gömülü Çaba = 2.8 (KLOC) 1.05 1.12 1.20 * ÇAK * ÇAK * ÇAK Çaba Ayarlama Katsayısı için sözügeçen etkenleri dört grupta toplayarak Tablo 2.6 da görüldüğü gibi sıralayabiliriz. Tablo 1.6 Çaba Ayarlama Etkenleri Ürün Donanım İnsan Proje güvenilirlik Hız çözümleyici yeteneği yazılım aracı kullanımı uygulama deneyimi zamanlandırma veri tabanı bellek yeterliliği büyüklüğü ürün karmaşıklığı sanal değişkenliği kullanılabilme süresi makina geliştirme ortamı yeni deneyimi programlama teknikleri programcı yeteneği programlama dili deneyimi Detaylı COCOMO modeli ise projenin evrelerine bağlı olarak süreç içinde değişiklikleri hesaba katarak arada bir kestirim hesaplamasını önerir. Bu modelde zamana bağlılık temel değişikliktir. Projenin farklı evrelerinde çaba yoğunluğu ve yapılacak işin karmaşıklığı değişecektir. Benzer bir anlayış, yazılım eğrisi denilen bir sonucu yansıtan Putnam modelinde de kendisini gösterir. Evrelere bağlılığın bir sonucu olarak Raleigh adam-ay eğrileri ortaya çıkar. Şekil 2.2’de gösterilen bu eğriler, proje başlangıcındaki az iş gücü ile gereksinimlerin ilk çabalarını düşük düzeylerle temsil eder. Hızla tırmanan eğri, geliştirmenin analiz, tasarım ve uygulama gibi evrelerinde yükseklerdedir. Daha sonra geliştirme sonrası faaliyet azalır. İleride bakım ve onarım yine bazı geçici yükselmeler yapabilir. 11 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) 1.3 Kestirimde İzlenecek Yol Birden fazla tahmin tekniği kullanılmalıdır. Bunun yanında, herhangi bir teknik için veri toplarken değişik personelden yararlanmalı ve bireylerin özellikleri de düşünülerek veriler değerlendirilmelidir. Tahminlerin doğruluğu, önceden edinilen bilgilerin düzenli tutulmasına da bağlıdır. Önce sistem tanımındaki veriler kullanılarak bir İşlev Puanı hesabı yapılabilir ve sonuçlar satır sayısına çevrilebilir. Daha önceki verimlilik ve pahalılık gibi bilgiler ışığında bu satır sayısından maliyet, çaba ve süre tahmini yapılır. İkinci bir yol olarak elde edilmiş satır sayısından hareket ederek COCOMO modeli aracılığı ile çaba ve süre hesaplanabilir. Daha sonra diğer bir yol olarak da satır sayısı yöntemine başvurulabilir. Bu durumda sistemi üst seviyedeki bileşenlerine ayırabilmek gerekir. Bu alt sistemler için satır sayısı tahminlerinde bulunulur ve ayrı ayrı çaba, süre gibi hesaplar yapılır. Alt sistemlere ait bilgiler toplanarak sistem için izlediğimiz üçüncü kestirimler elde edilmiş olur. Ayrıca alt sistemler için de önce İşlev Puanı yöntemi uygulanabilir. Sözü geçen değişik kestirimler birbiriyle karşılaştırılarak arada çok büyük farklar gözlendiği taktirde hangi yöntemde hatalı varsayımlarımız olduğu ortaya çıkarılmaya çalışılır. Büyük fark olduğunda hangi kestirimin hatalı olabileceği yönünde bir ipucu olmak üzere bir veya bir kaç diğer yöntem sonuçları da kullanılabilir. Belirli bir kanaate ulaşılınca da bu durum kabul edilir ve bir süre olduğu gibi bırakılır. İlk kestirmeler - ki en yönlendirici olanlardır ! - bilgi azlığı nedeniyle en hatalı olanlardır. Geliştirme ilerledikçe tahmin hesapları arada bir yapılabilir. Projenin sonlarında ise daha önce yapılan kestirimlerin hatalarının en çok hangi parametrelerden kaynaklandığı bulunmaya çalışılır: artık elde kesin bilgiler vardır, bu sonuç bilgileri, kestirim formüllerine geri konarak bu formüllerdeki sabit katsayılar, ayarlama katsayıları gibi değerlerde oynama yapılarak kendi şirketimiz için uyarlanmış daha geçerli formülleri ortaya çıkarmış oluruz. Bu çalışmalar, ilerde geliştirilecek projeler için daha doğru kestirim yapmaya yöneliktir. Ayrıca, ölçme bilgilerinin de tutlmasında düzenlemeler ve düzeltmeler de benzeri tedbirlerdir. 1.4 Diğer kestirim ve ölçüm teknikleri Proje yönetiminde sıkça karşımıza çıkacak tekniklere değindikten sonra ilginç bazı diğer tekniklere de içerdikleri farklı özellikler açısından bakmamızda yarar vardır. Bu bölümde bir kestirim metodu olan Putnam metodunu, ve program karmaşıklık ölçüleri olan Halstead tekniği ve çevrimsellik ölçüsünü (cyclomatic complexity) özetleyeceğiz. 12 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Putnam metodunda, sistem geliştirme sürecinin zamana bağlı olarak çaba ve malıiyetin eğrilerinin sunulduğunu görüyoruz. Gerçekçi bir projede hesaplanan adam-ay değeri, süreç boyunca sabit kalmaz. Dolayısıyla bazı ayların personel gereksinimi, diğerlerine göre farklı olacaktır. Bu çaba-zaman eğrisi gözlenerek personel istihdamı ayarlanabilir. Aynı kuruluş içerisinde farklı projeler arasında eleman kaydırmaları da Putnam eğrilerinin bir sonucu olarak mümkün olur: Çaba = (LOC) x Y 0.333 3 4 /V) x (1/t ) Burada ‘Y’, özel yetenekler katsayısıdır, küçük projeler için (KLOC = 5 ... 15) değeri 0.16 iken, 70 KLOC dan büyük projeler için 0.39 dur. ‘V’ ise verimliliğe bağlı olarak değişir: gerçek zamanlı sistemler için 2000 olan değer, sistem programları ve iletişim programları için 10000 ve iş bilgi sistemleri için 28000 dir. Verimliliğe etki eden bazı faktörler: süreç olgunluğu ve yönetim uygulamaları yazılım mühendisliği uygulanmasının niceliği programlama dilinin soyutlama düzeyi yazılım geliştirme ortamı ekibin yetenekleri ve deneyimi uygulamanın karmaşıklığı Halstead tekniği, bir yazılım biriminin iç yapısını inceler. Yazılım içerisinde kullanılan değişik işlemlerin sayısını ve bu işlemlere parametre olarak kullanılan değerlerin sayısını kullanarak bir karmaşıklık hesaplaması yapar. Dolayısıyla satır sayısından bağımsız, doğrudan programın yaptığı işleve yönelik bir değerlendirme girişimi olarak ortaya çıkmıştır. Daha küçük ve karmaşık projeler için bir değerlendirme aracı olarak kullanılmıştır. Veriler ve program yapılarındaki işlem dışı etkenlerin hesaba katılmadığı bir gerçektir. Çevrimsellik Karmaşıklığı ise yine bir programın iç yapısı ile ilgilidir ve komutlardaki ardışıllıktan çok çevrim ve karar verme gibi noktaların karmaşıklığı etkilediği gerçeğine dayanır. Bu gibi noktaların toplam sayısı ile ilgili bir ölçümdür. Ayrıca program yapısı bir ‘graf’a dönüştürüldüğünde bu sayının oluşacak çevrimlerin sayısı ile olan ilgisini gözlemlemek oldukça kolaydır. Örneğin bu teknik, programlama ödevlerini teslim eden öğrencilerin diğerlerinin ödevlerinden ne derece faydalandığını ortaya çıkarmak için kullanılmıştır: Programda yapıların yerleri değiştirilebilir ve farklı isimlendirmeler kulanılarak iki programdaki benzerlikler, göz ile 13 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) anlaşılmaları çok zor bir duruma getirilebilir. Çevrim ve karar noktalarını sayan bir teknik ile programın esas yapısının bir veçhesi kolayca ortaya çıkarılmaktadır. Bu ölçümün ortaya çıkış nedeni, test amacı ile bir programın akışı diyagramını çizecek olursak, her patikanın ele alınması için ne kadar iş yapılması gerekir gibi bir sorudur. Bu diyagram incelendiğinde, patika sayıları, karar noktaları denilen düğümlerin sayıları toplamı artı '1' dir. Karar noktaları ise 'IF' komutları (koşutlar) ve çevrimlerin başlangıç noktalarıdır. 1.8. Risk ve Planlama Yazılım proje yönetiminin önemli alanlarından biri de risk yönetimidir. Projeyi tehdit edebilecek tehlikeler önceden düşünülmeli, onları ortaya çıkmadan önleme yolları aranmalı ve yine de önlenemeyen ve gerçekleşen tehlikeler sonucunda yapılacak düzeltme faaliyetleri de bilinmelidir. Önce olası riskler tanımlanır, bunların gerçekleşme ihtimalleri kestirilir ve sonucunda projeyi ne derece etkileyebilecekleri rakamsal bir değer tahmini ile ortaya konur. Bunlara ek olarak bir de yapılan tahminlerin doğruluk olasılığı da kayıt edilir. Bir tehlikenin projeyi etkilemesi, teslim tarihinin ötelenmesi veya maliyetin artması şeklinde değerlendirilir. En kötü durumda, projenin devam etmemesine karar verilebilecek kadar bir zarar söz konusudur. Yönetim, bu sınır değerleri önceden ortaya koymalı ve projenin gelişimi devamlı izlenirken risk konusu da denetlenmelidir. Şekil 2.3 de risklerin teslim zamanı ve maliyet artışı parametreleri açısından projenin devamına karar vermede kullanılabilecek bir eğri gösterilmektedir. Ancak, proje yönetiminde yapılan süre ve çaba kestirimlerinde olduğu gibi risk ile ilgili değerlerde nesnel olmaktan uzak olacaklardır, hesap ve verilerin değerlendirilmesi sonucunda ele geçen değerler aklıselimlik ile yargılanmalı ve deneyimler sonucu elde edilen bilgi ve düşüncelerle karar verilmelidir. Örneğin Şekil 2.3 de herhangi bir riskin yerleştirileceği bölgeye göre devam kararı alınır. Ya birden fazla risk tehlike çizgisine yakınsa? Bunların birbiri ile bağlantıları da gözönünde tutularak projenin bütünü akıl kontrolünde bulunduran yönetici kararını uyarlayacaktır. Yine de rakamsal kesinlik isteyen yöneticiler, olası risklerin birlikte oluşturacağı gecikme ve pahalılaşma noktasını belirleyebilirler. Şekil 1.3 Riskin oluşturduğu tehlikeli bölge Yaygın riskler gruplanmış bulunduğundan, bu liste üzerinden giderek eldeki proje için olası riskler tanımlanarak yola çıkılabilir. Yazılım proje risklerini aşağıdaki gibi gruplarda inceleyebiliriz: • Yazılım büyüklüğü 14 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) • Pazar ve yönetim gibi iş konuları • Kullanıcı • Süreç • Geliştirme • Personel 1.9 Risk Alanları Genelde riskler proje, teknik ve iş yönetimi sahalarında olur. Ayrıca müşterilerin de büyük bir risk sahası oluşturacağı düşünülürse genelde iş yönetimi alanı içinde değerlendirilebilirse de müşteri risklerini ayrıca inceleyebiliriz. Proje riskleri, teslim zamanındaki gecikme veya bütçe dışına taşma gibi sonuçlara neden olur. Bununla yakından ilgili olan teknik riskler de çaba evrelerinden herhangi birinde ortaya çıkacak yanlışlıkların sonucu oluşurlar. Ayrıca kullanılacak yeni teknolojiler de bu gruptadır. İş yönetimi açısından ise üretilecek yazılımın kullanılma nedeninin ortadan kalkması ile ilgilidir. Bu gibi nedenlere örnek olarak kullanıcının istememesi, yöneticilerin ilgi kaybı verilebilir. Kestirilebilen risklerden çok kestirilemeyen riskler zararlıdır ve bunlar konusunda alınabilecek fazla önlem de yoktur. Şekil 2.4 de bazı risk grupları ve etkiledikleri parametreler gösterilmektedir. 1.9.1 Müşteri İle İlişkili Riskler Müşterilerin yapısı aynı değildir, projeyi ilgilendiren farklılıklarından bazıları aşağıda sıralanmıştır: • Değişik istekler • Değişik kişilikler • Değişik geliştirici ilişki düzey ve istekleri • Çelişen istekler Yine sıralanan maddeler, müşteri ile ilgili risklerin irdelenmesini gerektirir: • Müşterinin geliştirici için yeni olması • Müşterinin ihtiyaçları somut bir şekilde bilmemesi • Resmi ihtiyaçlar toplantılarına katılmak istememesi 15 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) • Geliştirici ile haberleşme kanallarının kurulmasına karşı çıkması • Değerlendirme toplantılarına katılmada isteksizlik • Ürün sahasında teknik bilgiye sahip olmaması • Yazılım sürecinden anlamaması 1.9.2 Süreç İle İlişkili Riskler Süreçlerin yapısı aynı değildir, projeyi ilgilendiren farklılıklarından bazıları aşağıda sıralanmıştır: • Yönetimin yazılmış bir süreç politikası olmaması • Proje için yazılmış bir süreç tanımı olmaması • Personelin sürece göre atanmış olmaması • Süreç modelinin önceden denenmemiş olması • Yazılım mühendisliği eğitiminin herhangi bir personel seviyesinde eksikliği • Standartlar yönetici ve geliştiriciler için temin edilmemiş olması • Belgeleme kuralları sürece katılmamış olması • Resmi değerlendirmeler (her evre için) ve testler düzenli olarak yapılmaması • Değerlendirme sonuçlarının belgelenmemesi • Kurum yönetimi (configuration management) kullanılmamas • Kullanıcı ihtiyaç değişimleri istekleri denetlenmemesi • Taşeronlar yönlendirilip kontrol edilmemesi 1.9.3 Teknoloji Riskleri Yeni teknolojilere geçmek, kuruluşların atması gereken bir adımdır. Personelin de özendiği bir değişimdir. İş açısından da ileride faydası görülecek bir yatırımdır. Ancak eldeki proje için risk oluşturur: • Ürün teknolojisinin kuruluş için yeni olması • Yeni yordamların (algoritma) ve girdi/çıktı (input/output) teknolojilerinin gerekmesi 16 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) • Denenmemiş donanım ile arayüzün (interface) kullanılması • Dışarıdan alınan ve denenmemiş yazılım birimleri ile arayüz kullanılması • Yeni veritabanı ile arayüz kullanılması • Özelliği olan bir kullanıcı arayüzü kullanılması • Yeni çözümleme, tasarım, test metotlarının kullanılması • Matematiksel metotlar, yapay us gibi alışılagelmiş geliştirme dışında tekniklerin kullanılması • Aşırı performans zorlamaları 1.9.4 Geliştirme Ortamı Riskleri • Yazılım proje yönetimi aracının olmayışı • Yazılım süreç modelleme aracının olmayışı • Çözümleme ve tasarım araçlarının olmayışı • Bu araçların projeye uygun çıktılarının olmayışı • Gerekli derleyicilerinin elde bulunmayışı • Ürün için uygun test araçlarının bulunmayışı • Yazılım kurum yönetimi araçlarının (software configuration management) olmayışı • Geliştirme ortamının bir veritabanı kullanmaması • Araçların bütünleşmemiş olması • Araçlar için eğitim alınmamış olması • Araçlar için sorulara cevap verecek yerel hizmet kuvvetinin bulunmayışı • Araçlar için çevrim içi (on line) yardım ve belgeleme kolaylıklarının olmayışı 1.9.5 Personel Riskleri • Kalifiye elemanların olmaması • Gerekli kabiliyetlerin toplanmaması • Yeterli sayıda personel olmaması 17 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) • Personelin proje süresince adanmaması • Yarı zamanlı personel bulunması • Proje hakkında doğru beklentilerin oluşmaması • Gerekli eğitimin eksik olması 1.9.6 Ürün Büyüklüğü İle İlgili Riskleri Genelde yazılımın büyüklüğü birliğinde riskleri getirir: • Gerçekten uzak büyüklük kestirimleri • Program, kütük ve sorgulama sayılarında tahmin edilen büyüklük • Ortalama ürünlerden hayli büyük bir kestirim • Kullanılacak veritabanı büyüklüğü • Fazla kullanıcı sayısı • Yeniden kullanılan yazılım (reused software) miktarı fazlalığı • İhtiyaçlar değişimindeki fazlalık 1.9.7 İş Yönetimi İle İlişkili Riskler Bazen organizasyonun istekleri teknik zorluklar oluşturur. İşyeri açısından projenin yaşamsal tehlikeleri oluşabilir: • Beklenen kar getirisinin az olması • Üst yönetim için geçersiz olması • Teslim tarihinin gerçekçi olmaması • Müşteri ihtiyaçlarının ürün ile karşılanacağı şüphesinin bulunması • Ürünün diğer ürünlerle birlikte çalışmasının gerekmesi • Kullanıcıların yetenek eksikliği • İstenen belge miktar ve kalitesindeki büyüklük • Kanuni sınırlandırmalar 18 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) • Geç veya hatalı ürün yüzünden oluşacak maliyet artışı 1.9.8 Risk Kestirim Yöntemi Risklerin tanımlanmasından sonra tehlikenin gerçekleşme olasılığı ve sonucunda projeye olan etkisi nümerik değerler ile kaydedilir. Ayrıca yapılan tahminin doğruluk derecesini de nicelendirerek bu tahminlerin yanlış kullanımını azaltma yönünde çaba sarfetmiş olur. Bu konuda kullanılacak basit bir teknik, risk tablosu oluşturmaktır. Şekil 2.5, bir risk tablosu örneği vermektedir. İlk sütunda riskin tanımı, ikinci sütunda ilgili alan, üçüncü sütunda gerçekleşme ihtimali, dördüncü sütunda projeye olan etkisi ve en son olarak da bu riski önleyici, gözlemleyici ve gerçekleşme durumunda düzeltici hareketler açıklanmaktadır. Riskin projeye olan etkisi yine nicel olarak sınıflandırılmıştır. Etki Değerleri: 1. Felaket 2. Kritik 3. Sınırda 4. İhmal edilebilir Riske karşı savaşım, RMMM (Risk mitigation, monitoring and management) deyimi ile özetlenebilir. Bunun anlamı risk tablosunun son sütununda yer alan risk önleme, gözetleme ve sonucu tamir edici yöntemlerden oluşan risk yönetimidir. Proje planının bir alt bölümü olarak da düşünülebilecek olan bir RMMM planı hazırlanabilir. Böyle bir planın ana maddeleri aşağıdaki gibi sıralanabilir: 1. Giriş a. Belgenin amaç ve kapsamı b. Esas risklerin tanıtımı c. Sorumluluklar (idari ve teknik personel için) 2. Proje Risk Tablosu 19 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) a. Projeyi sekteye uğratacak risklerin açıklanması b. Olasılık ve etkiyi değiştirebilecek etkenler 3. RMMM 1. Risk 1 (her risk için tekrarlanmalıdır) a. Önlemler 2. Genel strateji 3. Önleyici adımlar 1 b. Gözetleme 4. Gözetlenecek parametreler 5. Gözetleme yaklaşım c. Yönetim 6. Düzeltme planı 7. Özel durumlar 4. Özet 1.4.2.1 Risk Değerlendirmesi Risklerin tanmlanması ve olasılık ile etkileri birer üçlü olarak kaydedilir: [ri, oi, ei] Burada 'i', her bir riske karşı düşen ayrı risk numarasıdır. Daha sonra her bir risk Şekil 11.1 de gösterilen referans eğrisine göre değerlendirilir. Bazen bir arada gerçekleşecek riskler için de bu değerlendirme yapılır. Ancak bu eğriyi bir değişmez sınır olarak ele almamalıdır. Bazı bölgeler tanımsız olabilir ya da bazı durumlarda örneğin maliyet artışının önemi daha öne çıkabilir. Dolayısıyla her riske göre bu referans eğrisini gözden geçirmek gerekebilir. Yapılacak işleri özetleyebiliriz: 1. Proje için risk referans düzeylerinin tanımlanması 2. Her risk için referans düzeyleri ile ilişkiler kurulması 3. Projeyi durduracak bölgeyi ve içindeki risk referans noktalarını saptamak 20 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) 4. Bir arada risklerin referans düzeyine olan etkisini irdelemek. 1.10. Planlama Yazılım proje yönetiminde en önemli unsur projenin zamanında yetişmesidir. Mühendisliklerde eski bir kural geçerlidir: 80-20 kuralı: Bir projenin %80 lik kısmı (beklenen işlevselliğin veya tahmin edilen ürün büyüklüğünün % 80'i) proje süresinin %20 sinde tamamlanır. Geriye kalan %20'lik iş ise zamanın % 80'ini alır. Bu kural ilk derslerde ortaya konan çaba dağılımı ile ilgili bilgileri desteklemektedir (Şekil 1.3). Yazılım mühendisliğinde ise benzer kuraldan biraz ayrıntı katılarak söz edilebilir: 40-20-40 kuralı olarak değişen bu kural, toplam çabanın %40'ı kodlama öncesi, kalan %40'ı ise bu ilk tanımlama işlemine karşı düşen test çabalarına ayrılacağını belirtmektedir. %20 ise kodlama çabasının payıdır. Ayrıca erken evrelerde kalite için yapılacak yatırım, bu dağılımlarda hesaba katılmayan bakım çabasını azaltacaktır. Zamanlama ile ilgili diğer ilginç bir bilgi de proje zamanını uzatarak kazanılacak toplam çaba miktarıdır. Ayrıca bu kazanılmış vaktin oluşturacağı ikincil yararlar da kalite göstergelerini etkiler. Bu gerçeği daha önce sözü geçen Putnam formülü ile gösterebiliriz: Çaba = (LOC) x Y 0.333/V)3 x (1/t4) Burada ‘Y’, özel yetenekler katsayısıdır, projeler büyüklüğüne bağlı olarak 0.16 ile 0.39 arasında değişir. 'V' ise 2000'in altında değerlerden başlayan 30000e yaklaşabilen verimlilik faktörüdür. 't' ise proje süresidir. 33 KLOC büyüklüğünde gerçek zamanlı bir sistem için 12 adam-ay çaba tahmin edilmiştir. 8 kişi ile bu proje 1.3 yılda tamamlanabilir. Ancak süreyi 1.75 yıla çıkarma şansımız varsa, Putnam fomülünün ortaya koyacağı sonuca göre toplam çaba 12 adam-ay'dan 3.8 adam-ay'a düşecektir. Bu sonuç bize az da olsa süre arttırımının sağlayacağı büyük rahatlığı göstermektedir. 1.11 Görev Dağıtımı Yazılım geliştirme projesi boyunca yapılacak bütün işler, ayrıştırılmış görevler olarak düzenlenmelidir. Bu görevlerin başlama ve bitme zamanları, üstlenecek personel isimleri ve ihtiyaç duyulacak kaynaklar (araçlar, altyapı, yazılım vb.), son olarak da görevin çıktısı olacak ürün tanımlanır. Bir büyük görev, alt görevlere de ayrılabilir. Bu ayrıştırmayı yaparken proje 21 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) takvimi gözönünde tutulmalıdır. Bazı görevler diğerlerine bağlı olacaklardır ve bitiş zamanları proje teslimini etkileyecektir. BDYM araçları konusunda gösterilen proje yönetimi araç grafikleri bu sahada kullanılmaktadır. Şekil 2.6 ve 2.7 de gösterilen grafikler taskların sıralanması ve bağımlılıklarını sunmaktadırlar. Daha önce Gantt diyagramı olarak adlandırılan ve genelde zaman çizgisi diyagramları sınıfından olan görev sıralandırma amaçlı grafik yöntem, Şekil 2.6 da yinelenmektedir. Bu görev ayrıştırılmasının yapılabilmesi için önceden yapılmış olması gereken işlemler vardır: • Çaba tahminleri • Ürün işlevlerinin ayrıştırılması • Süreç modelinin seçilmesi Görevler arasındaki bağımlılığın da incelenmesini ve aslında zamanlamanın bu bilgiler ışığında yapılmasını isteriz. Şekil 2.7 de gösterilen görevler arasındaki bağımlılık ise PERT ve CPM gibi araçlar tarafından irdelenebilmektedir. Bu araçlar yardımı ile projenin 1. Kritik yolu 2. Görevlerin en olası tamamlama süresi (statistiksel metodlar kullanılarak) ve 3. Görevlerin zamanlarının sınır değerleri bulunup görselleştirilir. Kritik yol üzerindeki görevlerin gecikmeleri proje teslim tarihini etkiler. Çabanın diğer yoldaki işlemlerin tamamlanmasından daha çabuk biteceği biliniyorsa, belgeleme görevindeki kabul edilir bir gecikme proje tesliminde bir gecikmeye sebep olmaz. Ancak kabul edilir şeklinde sözü geçen gecikme, bu görevin sınır değerlerinden olan en geç tamamlanma değerini de aşmamalıdır. Ayrıca bu görevlerin geliştirme sırasında da gözetlenmesi ve proje teslimini geciktirici durumların farkedilerek planda değişiklik yapılması da sıkça rastlanan bir durumdur. Proje süresince gözetleme devam etmeli ve tablolar tutularak kayıt edilmelidir. Şekil 2.8 bu tür gözlem sonuçlarının yansıtıldığı bir proje tablosunu göstermektedir. 1.12 Proje Planı 22 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) Planlama ile ilgili bilgiler, verilen kararlar ve olası önlemler bir belge şeklinde sunulmalıdır. Bu proje planı belgesi, projenin amacını yönetici ve teknik kadrolara olduğu gibi müşteriye de aktarabilmelidir. Riskler, maliyet ve zamanlama açıklanmalı ve projenin her safhasında bütün personeli kapsayıcı genel yaklaşım belirtilmelidir. Ayrıca kalitenin nasıl teminat altına alınacağı da belirtilmelidir. Ana hatları ile bir proje planı taslağı 1. Giriş A. Planın amacı B. Projenin amacı ve konumu 1. Konum ve sınırlandırmalar 2. Ana işlevler 3. Performans parametreleri 4. Yönetim ve teknik ile ilgili sınırlandırmalar 2. Proje Kestirimleri A. Kullanılan tarihi veriler B. Kestirim teknikleri C. Çaba, maliyet ve süre kestirimleri 3. Risk yönetimi stratejisi A. Risk tablosu B. Yönetilecek risklerin açıklanması C. Her risk için RMMM planı: 1. Önlemler 2. Gözetleme 3. Düzeltme yönetimi 4. Zamanlama A. Projenin ayrıştırılmış görev yapısı B. Görev bağımlılık diyagramı 23 aşağıda verilmektedir: İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) C. Görev zamanlama diyagramı (Gantt Diyagramı) D. Kaynaklar tablosu 5. Kaynaklar A.Personel B. Donanım ve yazılım C. Özel kaynaklar 6. Personel organizasyonu A. Programcı takımları B. Yönetim raporları 7. Gözetleme A. Kalite teminatı ve denetimi B. Değişim yönetimi ve denetimi 8. Ekler 1.13 Programcı Takımları Kodlama ile ilgili görevler genellikler programcı takımlarına atanır. Bu takımlar 2 kişiden başlayarak büyük gruplara kadar uzanan sayıdan oluşabilirler ancak bu sayının fazla büyük tutulması pratik değildir. En çok 4 ila 7 kişilik gruplar söz konusu ise de bu sayının ideal olarak 4 veya 5 ile sınırlandırılması gerekir. Grup büyüdükçe bireyler arası iletişim yolları da artacak ve çabanın büyük bir kısmını iletişim işlemi tüketecektir. Ortalama oran değişmekle birlikte bir programcının toplam çaba kapasitesinin belirli bir oranının her iletişim bağlantısı için aynı olmak üzere ayrılacağı geçerli bir yaklaşımdır. Buradan yola çıkarak iletişim bağlantıları arttıkça toplam çabanın daha büyük bir kısmının iletişime ayrılacağı görülür. Her iletişim bağlantısı için bir programcının toplam çabasının %10'unu harcayacağını varsayarsak, 4 kişilik bir takımda iletişim kaybı %30 olacakken 7 kişilik bir takımda bu kayıp %60'a çıkacaktır. Bir programcı takımı ve iletişim bağlantıları modellenmektedir. Takımların yapılanması da önemlidir. Klasik yaklaşımlarda bir programcı aynı zamanda takımın kütüphanecisidir. Bazı durumlarda bu kütüphaneci programlama yapmaz. Görevi yazılan kodları ve belgeleri sınıflandırmak ve saklamaktır. Ayrıca programcılara gerekli algoritmalar, yeniden 24 İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE) kullanılacak kod parçaları bulmakta yardımcı olur. Takımın ürettiği son çıktı onun bir araya getirdiği bir bütünleştirme ürünüdür. Takımların bir lideri olur ve yine genellikle bu lider de programcıdır. Aynı zamanda kod geliştirilmesi ile uğraşır. Ancak grubun uyumlu çalışmasını sağlamakla görevlidir. Alışılagelmiş fazla denetleyici bir idareci görünümünden uzak olmalıdır. Bu konuda da değişik yaklaşımlar mevcut olsa da genelde programcılar üzerinde fazla sıkı bir yönetim yapısı benimsenmemektedir. Takımlarda kütüphaneci ve olası diğer kritik alan bilgisi gerektirecek rolleri üstlenen üyelerin yedeklenmesi gerekir. Bu yedekleme de genelde takım içerisinden sağlanır. Fazla ara vermeden toplantılar düzenlenerek takım elemanları ve hatta takımlar arasında bilgi paylaşımı arttırılmalıdır. Bu şekilde yedeklemelere hazırlık yapılmış olur. Yedeklemenin amacı ayrılacak bir üyenin proje devamını çok etkilememesidir. Son olarak da bir programcının genelde çabasının ne gibi işlemlere harcadığı hakkında yapılmış bir araçtırmadan söz edeceğiz. Bu araştırma, çabaları bir programcının temel görevi olan üretim ile doğrudan ilgilenmesi, diğer elemanlar ile iletişimde bulunması ve üretken olmayan işler yapması olarak üç sınıfta incelemektedir. Sonuçlar çabanın yarısı gibi bir oranının iletişim, kalan yarının da çoğunun üretken olmayan (toplantılar, eğitim vb.) etkinliklere ve en az oranının da program yazmak gibi temel göreve ayrıldığını göstermektedir. Bu sonucun verimsizlik olarak yorumlanmasına gerek yoktur. 25 İrfan MACİT Bölüm 2 Algoritmalar Bölüm 2 Algoritmalar 2.1 Giriş İnsanlar ilk çağlardan beri istek veya arzularını ifade etmek çeşitli yöntemler ile anlatmaya çalışmışlardır. İlk olarak çeşitli şekil ve simgeler daha sonra ise yazının bulunmasıyla bu istek veya arzularını yazı ile ifade etmeye başlamışlardır. Tüm bu çabaların amacı insanlar birbirleri ile iletişim kurmak, anlatmak istediklerini başkalarına aktarmak veya kalıcılığını sağlamak olabilmektedir. Değişik toplumlarda dil farkı olması bazı durumlarda insanları ortak dil arayışı içerisine itmiştir. Fakat bu durum çok fazlar etkili olmamıştır. Günümüzde ortak konuşma ve yazı dili yerini genel kabul görmüş konuşma ve yazı diline bırakmıştır. Bilgisayar dünyasında durum biraz daha farklıdır. İletişim her geçen gün biraz daha fazla gelişmekte ve uygulama alanları değişiklik göstermektedir. Internet ve bilgisayar ağlarının dünyayı sarması, bilgisayar dünyasında bir devrim olarak kabul edilmektedir. Sanayi devriminin modern toplum oluşmasında bir işaret (mihenk) taşı olduğu gibi Internet bilgisayar dünyasındaki gelişimin bir işaret taşıdır. Ortak haberleşme dilinin gelişimi bu aşamada öne çıkmaktadır. Herkes acaba nasıl ortak anlaşabilecekleri bir dili kullanacak ve kabul edecektir. Bu konu ilerdeki bölümlerde ayrıntılı olarak tartışılacaktır. Algoritma kelime anlamı bu günkü Irak doğumlu matematikçi Muhammet ibni Musa El-Harezmi tarafından M.S. 825 yılında aritmetik hesap yöntemlerinin kurallarının ve aşamalarının gösterildiği “Kitab el cebr ve’l mukabele” adlı kitabında bahsedilmiştir. İlk zamanlar Algorizme olarak kullanılan kelime artık günümüzde algoritma olarak telafuz edilmektedir. Algoritmalar bir işi veya yöntemi simgeler yardımıyla açıklamak için kullanılan işaret dili olarak tarif edilebilir. Bilgisayar dünyasında bu işler bir yazılımın uygulanma veya geliştirilmesi aşamasında tarif edilecek bilgileri simgelemektedir. Bir yazılımcı yeni başlayacağı bir projeyi bilgisayar programlama dili ile yazmaya başlamadan önce bu projenin genel çatısını oluşturur. Oluşturulan bu çatı yazınsal bir dil olabildiği gibi bir simgesel olarak 26 İrfan MACİT Bölüm 2 Algoritmalar da ifade edilebilir. Yazınsal ifadeler kodları, alt programları veya fonksiyonları gösterirken genelde karmaşıklaşabilmektedir. Sade ve anlaşılabilir bir gösterimden yararlanmak isteyebilirler. Bu durumda bilgisayar yazılımı geliştirenler çeşitli şekillerin olduğu ve herkes tarafından benimsenen bir gösterimi kullanmaktadır. Algoritmalar Harezmi’den çok önceleri bilinmekteydi. Eski yunan uygarlığında yaklaşık olarak M.Ö. 300 yıllarında Öklid (Euklides) hesap yöntemi olarak bilinen basit bir algoritma şeklinde tanımlanmakta idi. Bu algoritmada yöntem iki sayının en büyük ortak böleninin bulunduğu hesaptır. Öklid (Euklides) algoritması olarak bahsedebileceğimiz bu yöntemde verilen iki sayıyı beraber bölen en büyük sayının bulunmasıdır. Öklid (Euklides) algoritmasını uygulamak istediğimiz iki sayı için şu şekilde yapılır; Adım 1) Büyük sayı A küçük sayı B’ye bölünür Adım 2) Küçük sayı B kalan sayı çifti oluşturulur Adım 3) Küçük sayı B kalan sayıya bölünür Adım 4) Tam olarak bölünme sağlanana kadar Adım 2’ye geri dön. Yukarıdan da anlaşıldığı gibi aslında temel bir algoritma işlemini gerçekleştirmektedir. Bu sayı çiftleri arasıda sistematik olarak uygulanabilen kayıtlı ilk hesap yöntemidir. Sayı çiftlerinin değeri ne kadar yüksek olur ise çözüm süresinin de uzayacağı kesindir. Sonsuz büyüklükte iki sayının bile bu yöntem ile sonlu olarak bölünebileceği bilimsel olarak araştırılması gereken önemli bir konudur. Çözüm süresi sayıların büyüklüğü ile çok yakından ilgili olması bu yönteme daha büyük ilgi uyandırmaktadır. Bu algoritmayı sayısal olarak çözmek yerine belirlenen büyüklükte sayılara uygulanabilirliğini akış seması olarak göstermek akılcı bir yaklaşım olacaktır. Öklid (Euklides) algoritması günümüzde matematik dahil bir çok bilim dalında kullanılan yöntemlerin en basitine bir örnek olarak kabul edilebilir. 20. yüzyıla kadar bilinen pek çok yöntemde algoritma yöntemi içerisinde görülmemiştir. 1950 ve sonrasında ise akış diyagramları ve şekilsel anlatımlarında önem kazanması artık algoritmaları şekilse olarak anlatıma ihtiyaç duyulması da akış diyagramlarının önemini arttırmıştır. Akış diyagramları bu ve benzeri bir çok algoritmayı şekilsel olarak ifade etmekte ve anlaşılırlığını kolaylaştırmaktadır. 27 İrfan MACİT Bölüm 2 Algoritmalar A ve B sayılarını Oku A sayısını B sayısına böl Kalanı Al A sayısı yerine B sayısını koy B sayısı yerine C sayısını koy C = 0 B’yi Yaz ve Son Şekil 2.1. Öklid (Euklides) Algoritmasının Akış Diyagramı Bilgisayar programlama dilleri ile bilgisayar programlamanın zor olduğu bilinmektedir. Bilimsel çalışmalarda ise bu zorluğun derecesi daha da artmaktadır. Örneğin birinci dereceden bir bilinmeyenli bir denklemi çözmek için kullanılan yöntemin basit olduğunu bilinmektedir. Eğer denklemimiz ikinci dereceden ve üç bilinmeyenli olsaydı ne yapmalıyız veya doğrusal olmayan bir fonksiyonun eğrisinin belirli aralıklardaki değerini hesaplamak istiyorsak ne yapmalıyız. Bu durumlarda bilgisayar programlarından yararlanıyoruz fakat bilgisayarlar bu problemleri nasıl çözüyor. Birkaç bilgisayar kodunu ardışık olarak yazmaya kalksak acaba bize sonuç verir mi. Bu sorunun cevabını az çok hepimiz hayır olarak vermekteyiz. Bilgisayarlara karşılaştığımız problemleri belirli bir yöntem ve sıra ile bilgisayarın anlayabileceği kodlar halinde vermeliyiz. Bu kodların verilmesi mantıksal bir süreç izlenerek yapılmaktadır. Bilgisayar programlama dilleri ile problemleri çözmek için iki aşamadan bahsedebiliriz. Birinci aşamada problemin çözümünün el ile yapıldığı (analitik çözüm) aşamasıdır. Bu aşamada problem her zaman çözülemeyebilir veya çözüm süresi çok uzun zaman alabilir. Genelde bu aşama algoritmanın geliştirilmesinden öncedir ve algoritmanın geliştirilmesine bir hazırlık oluşturur. İkinci aşama uygulama aşamasıdır. Burada algoritma 28 İrfan MACİT Bölüm 2 Algoritmalar geliştirilmiş artık problem çözülmek üzeredir. Problem adımlara ayrılmış ve parçalı olarak çözüm yöntemleri denenmeye çalışılmaktadır. Problem Çözüm Aşaması Ele Alınan Problem Uygulama Aşaması Çözümün Algoritma şekline gelmesi Bilgisayar programlama dili kodları Şekil 2.2 Algoritma Geliştirme Süreci. 2.2 Algoritma Geliştirme Kılavuzu Bu bölümde algoritmalardan bahsedilirken bilgisayar programlama ile ilgili olan algoritmalardan bahsedilecektir. Geliştirilen algoritmalar ise yalnızca bilgisayar programlama dillerine ait olan kodları içeren algoritmalar olacaktır. Algoritmalar geliştirilirken dikkat edilmesi gereken çeşitli durumlar vardır. Bu durumları şu şekilde açıklayabiliriz; i) Geliştirilen bilgisayar programlama algoritmalar şekil olarak basit ve anlaşılabilir olmalıdır. ii) Bilgisayar programlama kodlarını açıkça ifade edebilmelidir. iii) Genel kabul görmüş olan simgesel gösterimler kullanılmalıdır. iv) Birden fazla bilgisayar programlama diline uygulanabilir olmalı. v) Aşamalar halinde gerçekleştirilecek programlama diline ait gösterimleri içermeli. vi) Bilgisayar programlama dillerine uygulanabilmeli. vii) Bilgisayar programlama kodları yenilendiğinde veya değiştirildiğinde algoritmaya ait şekillerde de değişiklik yapılabilmeli. 2.3 Bilgisayar Programlama Dillerinde Kullanılan Algoritma Şekilleri (Akış Diyagramları) Algoritmaların belirlenen özel şekiller ile ifadesine akış diyagramlarının oluşturulması olarak tanımlanabilir. Akış diyagramları geliştirilen bir algoritmayı şekilsel olarak ifade etmekte ve anlaşılabilirliğini kolaylaştırmaktadır.akış diyagramlarını gösterir çeşitli şekiller vardır. Bu şekiller işlevlerin simgesel gösterimidir. Bilgisayar programlama dilinde kullanılan programlama kodları bu şekiller ile basit olarak gösterilerek programı yazan programcı yanı sıra başka bir programcı tarafından incelendiğinde anlaşılabilirliğini kolaylaştırmak veya programcı uzun süre önce yazdığı program kodunu unutmuş ise hatırlamasına yardımcı olmak 29 İrfan MACİT Bölüm 2 Algoritmalar amacına da sahiptir. Bilgisayar programlama dillerinde kullanılan ortak simgesel ve şekiller programlama dilinin gerçekleştireceği kodlar vardır. Genel olarak bilgisayar programlama dillerinde programlamaya başlarken kodlar yazılmadan önce belirlenen algoritma akış diyagramları ile ifade edilir. Akış diyagramları belirlenen bilgisayar programlarının kaynak kodlaması yapılır. Bu işlem programın kaynak kodlarının geliştirilmesi için gerekli olan öngörü ve işlem kolaylığını sağlar. Akış diyagramı oluşturulan bilgisayar programında algoritmanın nasıl uygulanacağının bilinmesi veya daha kısa bir yolu var ise bu şekilsel olarak görülmesi konusunda yardımcı olmaktadır. Algoritmalar bir iş veya işlemin nasıl yapılacağını gösteren yazı veya şekillerden oluşur. Tablo 2.1 Akış Diyagramları Sembol Açıklama Program üzerinde işlem yapılacak Program karar durumunda, program karar veriyor Programa doküman giriş/çıkışı Programa veri giriş/çıkışı yapılacak Programdaki veriler kaydedilecek veya okunacak Program bilgisayarın iç hafızasından bilgi alacak veya okuyacak Program işaret edilen cihaza çıktı / sonuç gönderecek Programa El ile veri girişi yapılacak 30 İrfan MACİT Bölüm 2 Algoritmalar Program değişkeleri döngü işlemine tutacak Programa bağlantı yapılacak veya diğer sayfaya geçiş için bağlantı noktası Bilgisayar ile problem çözmek için birden fazla yöntem olması algoritma kullanılmasını zorunluluk haline getirmektedir. Bazı durumlarda yazı ile algoritmanın geliştirilmesi olanaksız olabilmektedir. Bu durumda şekiller ile anlatmak istediğimiz işlemleri sembolize ederek işlevleri anlatırız. Bir bilgisayar programının en basit hali ile akış diyagramlarında gösterimi Şekil 2.3‘deki gibidir. Şekil 2.3. En Basit Algoritma Gösterimi 31 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları Bölüm 3 Endüstri Mühendisliğinde Kullanılan Bilgisayar Algoritmaları 1.Giriş Bilgisayar algoritmaları endüstri mühendisliğinin uygulama alanının genişliğinden dolayı çok fazla kullanılmaktadır. En kısa yol (shortest path), en fazla akış (maximum flow), en az dallanma (minimum span) gibi endüstri mühendisliğinde kullanılan algoritmalar el ile sonuçlandırılması düğüm sayısı arttıkça çözüm süresi de uzamaktadır. Bilgisayar yardımı ile benzer bir çok algoritma geliştirilen bilgisayar programları ile çok kısa sürede tamamlanabilmektedir. Bilgisayar programlama dillerinin çeşitliliği de bu algoritmaların yazılmasını ve uygulanmasını daha da kolaylaştırmıştır. Bilgisayar programlama dillerindeki gelişme ile birlikte bir çok problem bu programlama dillerinde modellenerek ve çözüm algoritmaları geliştirilerek oluşturulmaktadır. Bir algoritma belirli kurallar ile bir problemi incelenmesi ve sonucunun bulunması işlemini, girdi ve çıktı işlemlerinin hesap yöntemlerinin adımlarını veya genelleştirilen bir veri yapısının işlemsel sıralar ile yapılması şekline kabaca tarif edilebilir. Uygulanacak olan algoritmalar kolay ve güvenilir olmalıdır. Endüstri mühendisliğinde diğer mühendislik bilimlerinde olduğu gibi bir çok problem için kullanılan veya yeni geliştirilen algoritmalar vardır. Kullanılan algoritmalar daha önceden bilinen problemlerin çözüm yöntemleri ile oluşturulan algoritmalardır. Geliştirilen algoritmalar ise var olan problemleri yeni teknolojiler ile çözmeye çalışan algoritmalardır. Her problemin kendine ait 32 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları çözüm yöntemleri olduğu gibi genel çözümleri de bulunabilmektedir. Genel çözümlerde mühendislik biliminin ortak problemlerinin çözümünde daha çok karşılaşılır. Genel çözümlerin uygulandığı grafik yöntemleri yanında matematiksel olarak semboller ile ifade edilen çözüm yöntemleri vardır. Bilgisayar bilimlerindeki gelişmeler bazı türdeki problemlerin çözümünü oldukça basitleştirmiş bazıların çözümünü de oldukça kolaylaştırmıştır. En kısa yol (Shortest Path - SP) algoritmasının düğüm sayılarının arttıkça çözüm uzayının da çok genişlediği bilinmektedir. El ile çözümlerde çözüm süresinin uzaması düğüm sayısının artması ile daha da artmaktadır. Gezgin satıcı probleminin (Travel Salesman Problem- TSP) klasik çözümü el ile yapıldığında düğüm sayısının bir tane daha artması problemin çözüm uzayını tamamen değiştirebilmekte ve çözüm için geçen süre oldukça artmaktadır. Bunun gibi daha bir çok örnek verilebilecek problem vardır. Bu tip problemlerin çözümünü bilgisayar yardımı ile nasıl yapılabileceğini ve algoritmaların bilgisayar programlarında nasıl uygulanacağını anlatılacaktır. 3.2. Sırt Çantası Problemi Sırt çantası problemi ( Knapsack Problem- SÇP) tam sayılı programlamada en çok uğraşılan problemlerden birisidir. 1950 yılından beri bu türde problemlerin artması sonucu bilgisayar teknolojisin ile çözüm aranan ve çözüm sürelerinin iyileştirmeye çalışılan problemdir. Bilgisayar kullanımı ile birlikte karşılaşılan problemlerin bir çoğu çözüme ulaşmıştır. Bu tip problemleri incelersek en önemlisinin çözüm sürelerinde görülen uzamalardır. SÇP bilindiği gibi karar değişkeni kesikli olmasından dolayı çözüm kümesi dış bükey olamamaktadır. Bu da çözüm süresini kısıtlar arttıkça logaritmik artmasına sebep olmaktadır. Genel olarak matematiksel gösterimi aşağıdaki gibidir. Modelde n adet parça olma üzere, wi her parçanın ağırlığını, Pi kar edilecek miktarı ve C çantanın kapasitesini göstermektedir. Çantaya toplam C kapasitesini geçmeden en fazla karı yakalayacak olan parça miktarını seçmek istenmektedir. Bu problemi Turbo Pascal bilgisayar programlama dili ile programlamak istediğimizde aşağıda yazan kodlar ile programlayabiliriz. Bu programda veri dosyası oluşturulması gerekiyor. Veri dosyasında parça sayısı, her parçanın kar miktarı, her parçanın ağırlığı ve toplam kapasite sınırı verilmelidir. Veri dosyasında ilk sıra parça sayısı, ikinci sıra sırt 33 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları çantasının toplam kapasitesini son sıra ise parçaların ağırlığını göstermektedir. Bu problemin algoritmasını ise şu şekilde oluşturabiliriz. Adım 1) max SUM (Pi*Xi) i= 1 to N Adım 2) s.t. SUM (Wi*Xi) <= V for i = 1 to N Xi = 0 or 1 for i = 1 to N Pi = i değişkenin toplam karı Wi = i değişkenin ağırlığı V = en fazla sırt çanta ağırlığı Adım 3) Değişken değerlerini P1/W1 >= P2/W2 >= P3/W3 ...>= Pn/Wn Olacak şekilde düzenle Max parça sayısını maxobject = 50 olacak şekilde ayarla. OUTPUT (Çıktı) : Çıktıların dosyadaki durumu 1. Toplam kar ne kadar 2. Hangi parçadan ne kadar alınacağının belirlenmesidir. program KnapApproximation(input,output,KnapAppxDatafile,KnapAppxOutfile); const INF = 1000; maxobject = 50; CONSTANT 0.33333; = 34 İrfan MACİT type Bölüm 3 Bilgisayar Programlama Algoritmaları CHARFILE ARRN var = = array[1..maxobject] of integer; KnapAppxDatafile KnapAppxOutfile : : CHARFILE; CHARFILE; N, Nextint : integer; P, W : ARRN; X V, file of char; PROFIT : ARRN; : integer; EPS procedure Infile (var Nextint var N var P, W var V : real; : integer; : integer; : ARRN; : integer); var counter : integer; begin reset(KnapAppxDatafile); readln(KnapAppxDatafile, Nextint); N := Nextint; readln(KnapAppxDatafile, Nextint); V := Nextint; for counter := 1 to N do begin read(KnapAppxDatafile, Nextint); P[counter] := Nextint; end; readln(KnapAppxDatafile); for counter := 1 to N do begin read(KnapAppxDatafile, Nextint); W[counter] := Nextint; 35 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları end; readln(KnapAppxDatafile); end; procedure KNAPAPPROX( N :integer; var P,W,X :ARRN; var V,PROFIT:integer; var EPS :real); var I,J,K,L,MAXP1,MAXP2,MAXP3,PP,Q,R,S,U,VV:integer; procedure LB(G,H:integer;var Q,U:integer); (* LB FINDS PROFIT Q and RESIDUAL WEIGHT OF GREEDY TYPE SOLUTION WHICH IS ASSUMED to CONTAIN OBJECTS G and H *) var K:integer; begin K:=0; repeat K:=K+1; if (K <> G) and (K <> H) and (W[K] <= U) then begin Q:=Q+P[K]; U:=U-W[K] end until K=N end; (* LOWER BOUND *) procedure MAX; (* MAX UPDATES MAXP1, MAXP2, and MAXP3: LARGEST, SECOND and THIRD LARGEST ELEMENTS OF THE PROFIT VECtoR *) begin if P[I] > MAXP1 then begin MAXP3:=MAXP2; MAXP2:=MAXP1; MAXP1:=P[I] end else if P[I] > MAXP2 then begin MAXP3:=MAXP2; else if P[I] > MAXP3 then MAXP3:=P[I] 36 MAXP2:=P[I] end İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları end; (* MAX *) begin (* MAIN BODY *) I:=1; U:=V; MAXP1:=0; PROFIT:=0; MAXP2:=0; MAXP3:=0; while W[I] <= U do begin U:=U-W[I]; MAX; (* FINDING GREEDY SOLUTION *) X[I]:=1; PROFIT:=PROFIT+P[I]; I:=I+1 end; I:=I-1; S:=I; repeat I:=I+1; if W[I] <= U then begin U:=U-W[I]; X[I]:=1; PROFIT:=PROFIT+P[I] end else X[I]:=0; MAX until I=N; Q:=PROFIT; (* ONE ELEMENT SUBSETS OF OBJECT *) K:=0; L:=0; (* K and L IDENTifY THE OBJECTS WHICH *) for I:=S to N do (* ARE ASSUMED to BE IN A SOLUTION *) if X[I] <> 1 then begin VV:=V-W[I]; PP:=P[I]; LB(I,I,PP,VV); if PP > PROFIT then begin PROFIT:=PP; end; K:=I end (*if X[I] <> 1, for I *) R:=S; (* TWO ELEMENT SUBSETS OF OBJECTS *) for I:=1 to N-1 do begin if I > S then R:=I; for J:=R+1 to N do begin VV:=V-W[I]-W[J]; if VV >= 0 then begin PP:=P[I]+P[J]; LB(I,J,PP,VV); if PP > PROFIT then begin PROFIT:=PP; end 37 K:=I; L:=J end İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları end end; (* for J *) (* for I *) if PROFIT > Q then begin if K > 0 then begin V:=V-W[K]; X[K]:=1 end; if L > 0 then begin V:=V-W[L]; X[L]:=1 end; for I:=1 to N do if (I <> K) and (I <> L) then if W[I] <= V then begin X[I]:=1; V:=V-W[I] end else X[I]:=0 end; (* if PROFIT > Q *) EPS:=MAXP3/PROFIT; if EPS > 0.33333 then EPS:=0.33333 end; (* KNAPAPPROX *) procedure Outfile(N : integer; PROFIT : integer; X : ARRN); var counter : integer; begin rewrite(KnapAppxOutfile); writeln (KnapAppxOutfile,' PROFIT is ',PROFIT,' with '); for counter := 1 to N do begin writeln(KnapAppxOutfile,' X',counter:2,' = ',X[counter]); end; end; begin (* main *) EPS := CONSTANT; Infile(Nextint,N,P,W,V); KNAPAPPROX(N,P,W,X,V,PROFIT,EPS); Outfile(N,PROFIT,X); end. 38 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları 3.3 Gezgin Satıcı Problemi ( Travel Salesman Problem-TSP) Gezgin satıcı problemi (GSP) ulaşılacak olan düğümler arası uzaklığın bilindiği ve her birisinden yalnızca bir kez geçilerek en kısa yolun (maliyetin) bulunduğu tam sayılı programlama yöntemidir. Gezgin satıcı problemlerini (GSP) Simetrik atama yöntemli, Asimetrik atama yöntemli ve çoklu güzergahlı olarak sınıflandırabiliriz. Kesikli optimizasyon problemi olan Gezgin Satıcı Problemi düğümlerin sıralı olarak gidilmesini gerektiren bir problemdir. Literatürde de en fazla üzerinde durulan Tam Sayılı Algoritmaların başında gelmektedir. Gezgin satıcı problemi modeli kurulan sistemdeki istenen parçaları veya nesneleri en kısa zamanda, en az maliyet ve en çok kar ile toplamak, dağıtmak gibi tanımlayabiliriz. Bu tür problemler her sektöre uygulanabilir olduğundan günümüz araştırma konularının içerisinde yer almaktadır. Volgenant and van den Hout tarafından Solving TSP with 1-tree Relaxation (TURBO-PASCAL) EJOR 49/1 (1990) 153-154 sayılı makaleden alınan Gezgin Satıcı Problemi Turbo Pascal bilgisayar programlama kodlarını gelişrtirmişler. {$a+,b-,d-,e-,f-,i+,l-,o-,r-,s+,v-} {$ifdef cpu87} {$n+} {$else} {$n-} {$endif} {$m 65000,0,655360} program tsp1; uses tspalgo,crt,dos; var cat,error,tourlength: longint; tour: vec; inputstr,outputstr: string[80]; input: text; procedure printusage; var r: real; begin clrscr; write('traveling salesman problem version 1.2'); if sizeof(r)=8 then writeln('(coprocessor required)':40) else writeln('(no coprocessor required)':40); writeln('university of amsterdam, institute of actuarial science ' 39 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları ,'& econometrics (c)1990'); writeln('usage'); writeln(' file input : tsp1 category input output {+} ' ,'(e.g. tsp1 1 b:\file.dta prn)'); writeln(' random input : tsp1 category n s output {+} ' ,'(e.g. tsp1 5 20 0 file.out +)'); writeln; writeln('there are six input categories:'); writeln(' 1 : xyco-ordinates from file without upper bound'); writeln(' 2 : cost matrix from file without upper bound'); writeln(' 3 : xyco-ordinates from file with upper 4 : cost matrix from file bound'); writeln(' with upper bound'); writeln(' 5 : random xyco-ordinates'); writeln(' 6 : random cost matrix'); writeln('the other parameters are:'); writeln(' input : input filename with path'); writeln(' output : output filename with path ' ,'(''con''=screen,''prn''=printer)'); writeln(' n writeln(' : s number of cities'); : seed (initializes random generator)'); writeln(' + : option for more information'); writeln('the input file must be conform some rules:'); writeln(' first line : size (<=',maxn ,') and sequence number (optional)'); writeln(' from second : xyco-ordinates or ' ,'strict lower triangular matrix'); writeln(' final line : halt end; procedure ranxy; const mac1: longint= 16807; 40 upper bound (optional)'); detailed İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları mac2: longint= 2147483647; var i,j: integer; ran,xi,yi: longint; x,y: longvec; begin ran:=n*n+nr; for i:=1 to n do begin ran:=ran*mac1+trunc(1.0*ran*mac1/mac2); if ran<0 then ran:=ran+mac2+1; yi:=round(ran/mac2*1000); y[i]:=yi; ran:=ran*mac1+trunc(1.0*ran*mac1/mac2); if ran<0 then ran:=ran+mac2+1; xi:=round(ran/mac2*1000); x[i]:=xi; for j:=1 to i-1 do begin c[j]^[i]:=round(sqrt(sqr(xi-x[j])+sqr(yi-y[j]))); c[i]^[j]:=c[j]^[i] end; if screen then begin gotoxy(17,wherey); write(i) end end end; procedure ransym; const mac1: longint= 16807; mac2: longint= 2147483647; var i,j: integer; hulp,ran: longint; begin ran:=n*n+nr; for i:=2 to n do begin for j:=1 to i-1 do begin ran:=ran*mac1+trunc(1.0*ran*mac1/mac2); if ran<0 then ran:=ran+mac2+1; c[i]^[j]:=round((ran/mac2*1000) + 0.5); c[j]^[i]:=c[i]^[j] 41 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları end; if screen then begin gotoxy(17,wherey); write(i) end end end; procedure xycoord; var i,j: integer; xi,yi: longint; x,y: longvec; begin for i:=1 to n do begin read(input,xi); if (i=n)and seekeof(input) then begin gotoxy(1,wherey); writeln('run-time error: not enough data on file'); halt end; read(input,yi); x[i]:=xi; y[i]:=yi; for j:=1 to i-1 do begin c[i]^[j]:=round(sqrt(sqr(xi-x[j])+sqr(yi-y[j]))); c[j]^[i]:=c[i]^[j] end; if screen then begin gotoxy(15,wherey); write(i) end end end; procedure symtable; var i,j: integer; cij: longint; begin for i:=2 to n do begin for j:=1 to i-1 do begin if (i=n)and(j=n-1)and seekeof(input) then 42 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları begin gotoxy(1,wherey); writeln('run-time error: not enough data on file'); halt end; read(input,cij); c[i]^[j]:=cij; c[j]^[i]:=cij end; if screen then begin gotoxy(15,wherey); write(i) end end end; procedure initialize; const charset=[33,35..41,45,48..57,64..90,92,94..123,125..255]; var i,code: integer; begin val(paramstr(1),cat,code); { inputcategory } if not(cat in [1..6]) then begin writeln; writeln('run-time error: category incorrect'); halt end; if cat<=4 then begin outputstr:=paramstr(3); info:=paramstr(4)='+' end else begin outputstr:=paramstr(4); info:=paramstr(5)='+' end; for i:=1 to length(outputstr) do outputstr[i]:=upcase(outputstr[i]); if (outputstr<>'') and not(ord(outputstr[1]) in charset) then begin writeln; writeln('run-time error: output file incorrect'); halt end; screen:=(outputstr<>'')and(outputstr<>'con'); } if not screen then clrscr; assign(output,outputstr); rewrite(output); if cat<=4 then begin inputstr:=paramstr(2); 43 { line to screen İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları for i:=1 to length(inputstr) do inputstr[i]:=upcase(inputstr[i]); if (inputstr='')or(inputstr='con') or not(ord(inputstr[1]) in charset) then begin writeln; writeln('run-time error: input file incorrect'); halt end; if screen then begin gotoxy(1,wherey); write('loading data:') end; assign(input,inputstr); reset(input); read(input,n); { read size } if n>maxn then begin writeln; writeln('run-time error: inputsize too large'); halt end; if n>memavail div sizeof(longvec)+3 then begin writeln; writeln('run-time error: not enough memory'); halt end; if seekeoln(input) then nr:=0 else readln(input,nr); { read sequence number } for i:=1 to n do new(c[i]); if cat in [1,3] then xycoord else symtable; { read matrix } if cat in [3,4] then if seekeof(input) then begin writeln; writeln('run-time error: no upper bound on file'); halt end else read(input,inpub); bound } close(input); end else begin 44 { read upper İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları val(paramstr(2),n,code); { read size } val(paramstr(3),nr,code); { read seed } if n>maxn then begin writeln; writeln('run-time error: inputsize too large'); halt end; if n>memavail div sizeof(longvec)+3 then begin writeln; writeln('run-time error: not enough memory'); halt end; for i:=1 to n do new(c[i]); if screen then begin gotoxy(1,wherey); write('computing data:') end; if cat=5 then ranxy else ransym { read matrix } end; if screen then gotoxy(1,wherey) end; function currenttime: string; var i: integer; t1,t2,t3,t4: word; year,month,day,hour,minute: string[4]; begin gettime(t1,t2,t3,t4); str(t1,hour); str(t2,minute); if length(hour)=1 then hour:=' '+hour; if length(minute)=1 then minute:='0'+minute; getdate(t1,t2,t3,t4); if (t1=1980)and(t2=1)and(t3=1) then currenttime:=' '+hour+':'+minute else begin str(t1,year); str(t2,month); str(t3,day); if length(day)=1 then hour:=' '+hour; if length(month)=1 then hour:=' '+hour; currenttime:=day+'-'+month+'-'+year+' end end; 45 '+hour+':'+minute İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları procedure printtitel; var l1,l2: integer; r: real; tekst: string[20]; begin writeln(output,' _______________ tsp version 1.2 ',currenttime ,' _______________'); writeln(output,'| institute of actuarial science & econometrics' ,' writeln(output,'| (c)1990 |'); university of amsterdam ' ,'department of operations research |'); if info then begin writeln(output,'| for more information see manual or' ,' |'); writeln(output,'| ''nonoptimal edges for the ' ,'symmetric traveling salesman problem'' |'); writeln(output,'| r.jonker ,'operations and a.volgenant, research 32 ' (1984), 837-846 |') end; writeln(output,'|','|':77); if sizeof(r)=8 then writeln(output,'| coprocessor utilized','|':54) else writeln(output,'| coprocessor not utilized','|':50); if cat<=4 then writeln(output,'| input : ',inputstr,'|':59- length(inputstr)); str(cat,tekst); writeln(output,'| category : ',cat,'|':59-length(tekst)); size : ',n,'|':59-length(tekst)); number : ',nr,'|':59-length(tekst)) str(n,tekst); writeln(output,'| str(nr,tekst); if cat<=4 then writeln(output,'| 46 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları else writeln(output,'| seed : ',nr,'|':59-length(tekst)); if cat in [3,4] then if inpub>=0 then begin if abs(inpub-round(inpub))<tol then str(inpub:0:0,tekst) else str(inpub:0:2,tekst); l1:=length(tekst); write(output,'| bound : ',tekst); if info then begin str(trunc(inpub+1+tol),tekst); l2:=length(tekst); writeln(output,' ( appears as ',tekst,' in output )' ,'|':27-l1-l2) end else writeln(output,'|':59-l1); end else begin str(-inpub:0:10,tekst); while (tekst[length(tekst)]='0')and(tekst[length(tekst)- 1]<>'.') do delete(tekst,length(tekst),1); writeln(output,'| bound : ',tekst,'':18- length(tekst), '( fraction over initial lower bound ) end; writeln(output,'|______________________________________' ,'______________________________________|'); writeln(output) end; procedure printoptimum; var i,j: integer; begin writeln(output); writeln(output); 47 |') İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları case error of 1: begin writeln(output,'stack overflow, solution is possibly not optimal !'); writeln(output,'you could try solving this problem ' ,'with upper bound ',ub) end; 2: begin writeln(output,'execution has been ended ' ,'without reaching optimality !'); writeln(output,'upper bound was too low.') end; 3: begin writeln(output,'execution has been ended ' ,'without reaching optimality !'); writeln(output,'the number of available edges was too large.') end; 4: writeln(output,'size not correctly initialized.'); 5: writeln(output,'costmatrix not correctly initialized.') end; if error in [0,1,3] then begin writeln(output); if error=0 then writeln(output,'optimal tour :',tourlength:8) else begin writeln(output,'upper bound :',1.0*ub:11:2); writeln(output,'lower bound :',lb2:11:2); writeln(output,'maximum error :' ,100*(ub/trunc(lb2+1-tol)-1):11:3,' %') end; writeln(output); i:=1; j:=1; repeat write(output,i:3,'-'); i:=tour[i]; inc(j); if j=20 then begin j:=1; writeln(output) end 48 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları until i=1; writeln(output,' 1') end end; begin if paramcount=0 then printusage; initialize; printtitel; tsp(error,tourlength,tour); printoptimum; close(output) end. 3.4. Düzeltilmiş Simplex Metodu Simplex Metodu doğrusal programlama (DP) modellerini çözmek için Yöneylem Araştırmasından en çok kullanılan yöntemlerden birisidir. Amaç fonksiyonu n enk Z = ∑ c j xi olan ve kısıtları ise j =1 ∑a ij x j ≥ bi i = 1,2,..., n ve x j ≥ 0 şeklindedir. Simplex yöntemi hesaplama sürelerinin çok olmasından dolayı bilgisayar kullanımını zorunlu kılmaktadır. Çoğu zaman çözüm süresini uzun olması veya dönge girilmesi ile çözüm zorlaşmaktadır. Bu durum ise bilgisayarın işlemci ve hafızasında taşmalara veya geçici hatalara sebep olmaktadır. Standart simplex yöntemi bilindiği gibi her tabloyu bir önceki tabloya göre türetir. Düzeltilmiş simplex yönteminde hazırlanan tablodaki matrisin tersi biliniyorsa herhangi bir tablonun değerlerini temel tablodan elde etme şansı vardır. FIRST NUMBER in "DualplexDatafile" represents # of VARIABLES in Linear Program problem(LP). SECOND NUMBER represents # of CONSTRINTS in LP. First number in each of rest of rows in "DualplexDatafile" represents the Right Hand Side(RHS) 49 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları vector b. Initially objective value is 0. THIRD set of numbers represents the cost matrix C of then object function. Cost matrix strats on second #. FOURTH set of numbers represents the constraint MATRIX A Matrix A also starts on the second number. Algorithm : The dual simplex method solves the LP problem in the following form: minimize(or maximize) s.t. z=cTx+c^Tx^ Ax + Ix^ = b x, x^ >= 0 Maximum # of variables, and maximum # of constraints are set to maxvar =100 and maxconstraint=50 respectively. One can modify them according to their needs. But maxconstraint is <= maxvar. EPSis small ral number such that if for ant real number a, |a|< EPS, then a =0.0 Initially, EPS = 0.0001 INF is maximal real number available in the floating point number system that is used. Initially, INF = 999.00 OUTPUT : Outputs are 1.Check if a LP 2.Determine the corresponding 3.Determine the is feasible and optimal solution exists. optimal basic variables and their values. optimal value of the objective function. *) program Dualplex (input, output, DualplexDatafile,DualplexOutfile); const INF = 999.00; maxvar = 100; maxconstraint = 50; EPS = 0.0001; type CHARFILE ARRMN ARRN ARRMIN var DualplexDatafile : CHARFILE; DualplexOutfile : CHARFILE; = = = = file of char; array[0..maxconstraint,0..maxvar] of real; array[0..maxvar] of integer; array[0..maxvar-maxconstraint] of integer; 50 İrfan MACİT N,M, NMINM FOPT A U NOFEAS, NOSOL Nextint Nextreal procedure Infile(var var var var var Bölüm 3 Bilgisayar Programlama Algoritmaları : : : : : : : integer; integer; ARRMN; ARRN; boolean; integer; real; N,M,NMINM Nextint Nextreal A : : : : integer; integer; real; ARRMN); row,column : integer; begin reset(DualplexDatafile); readln(DualplexDatafile,Nextint); N := Nextint; readln(DualplexDatafile,Nextint); M := Nextint; NMINM := N-M; for row := 0 to M do begin if row = 0 then begin for column := 0 to N do begin read(DualplexDatafile,Nextreal); A[row,column] := Nextreal; end; readln(DualplexDatafile); end else begin for column := 0 to NMINM do begin read(DualplexDatafile, Nextreal); A[row,column] := Nextreal; end; readln(DualplexDatafile); end; end; end; procedure DSIMPLEX( M,N,FOPT :integer; var A :ARRMN; var U :ARRN; EPS,INF :real; var NOFEAS,NOSOL:boolean); var I,J,K,K1,K2,K3,K4,L,W:integer; MIN,XM,XS :real; B,StoP :boolean; Z,Z1 :ARRMIN; begin 51 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları NOFEAS:=false; NOSOL:=false; K4:=N-M; A[0,0]:=0.0; for I:=0 to K4 do begin XS:=0.0; for J:=1 to M do XS:=XS+A[J,I]*A[0,K4+J]; A[0,I]:=XS-A[0,I] end; for I:=K4+1 to N do for J:=1 to M do if I = K4+J then A[J,I]:=1.0 else A[J,I]:=0.0; I:=0; while (not NOFEAS) and (I < K4) do begin I:=I+1; XS:=A[0,I]; NOFEAS:=(abs(XS) > EPS) and (XS*FOPT < 0); if not NOFEAS then U[M+I]:=I end; if not NOFEAS then begin for I:=1 to M do U[I]:=K4+I; StoP:=false; repeat (* until StoP *) MIN:=0.0; B:=true; I:=0; repeat (* until StoP or (I >= M) *) I:=I+1; J:=M; XS:=A[I,0]; if XS < -EPS then begin StoP:=true; while (J < N) and StoP do begin J:=J+1; W:=U[J]; StoP:=A[I,W] >= -EPS end; if StoP then NOSOL:=true else begin B:=false; if XS-MIN < -EPS then begin MIN:=XS; L:=I end end (* else: not StoP *) end (* if XS < -EPS *) until StoP or (I >= M); if not StoP then begin if B then begin NOSOL:=false; StoP:=true end else begin MIN:=INF; for J:=1 to K4 do Z1[J]:=M+J; for I:=0 to M do if (I <> 1) and (not B) then begin K:=0; for J:=1 to K4 do Z[J]:=Z1[J]; K3:=1; for J:=M+1 to N do if J = Z[K3] then begin K3:=K3+1; W:=U[J]; XS:=A[L,W]; if XS < -EPS then begin XS:=abs(A[I,W]/XS); XM:=XS-MIN; if abs(XM) < EPS then begin K:=K+1; Z1[K]:=J; 52 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları B:=false end else if XM < 0.0 then begin MIN:=XS; K1:=J; K2:=W; Z1[1]:=1; K:=1; for W:=2 to K4 do Z1[W]:=0; B:=true end end (* if XS < -EPS *) end (* if J = Z[K3], for J *) end; (* if I <> 1 and (not B), for I *) MIN:=1.0/A[L,K2]; U[K1]:=U[L]; if L = 0 then I:=1 else I:=0; repeat XS:=A[I,K2]*MIN; A[I,0]:=A[I,0]-A[L,0]*XS; for J:=M+1 to N do begin W:=U[J]; A[I,W]:=A[I,W]-A[L,W]*XS end; if I = L-1 then I:=I+2 else I:=I+1 until I > M; for J:=M+1 to N do begin W:=U[J]; A[L,W]:=A[L,W]*MIN end; A[L,0]:=A[L,0]*MIN; for I:=0 to M do if I = 1 then A[I,K2]:=1.0 else A[I,K2]:=0.0; U[L]:=K2 end (* else: not B *) end (* if not StoP *) until StoP end (* if not NOFEAS *) end; (* DSIMPLEX *) procedure Outfile(NOFEAS,NOSOL : boolean; M : integer; A : ARRMN; U : ARRN); var counter : integer; begin rewrite(DualplexOutfile); writeln (DualplexOutfile,' NOFEAS = ',NOFEAS,' NOSOL = ',NOSOL); if (NOFEAS = false) and (NOSOL = false) then begin writeln (DualplexOutfile,' Optimal Value is ',A[0,0]:9:2); writeln (DualplexOutfile,' Basic-Var Value '); for counter := 1 to M do begin write(DualplexOutfile,U[counter]); 53 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları writeln(DualplexOutfile,' end; end; end; ',A[counter,0]:9:2); begin (* main *) Infile(N,M,NMINM,Nextint,Nextreal,A); DSIMPLEX(M,N,FOPT,A,U,EPS,INF,NOFEAS,NOSOL); Outfile(NOFEAS,NOSOL,M,A,U); end. 3.5. Gözden geçirilmiş Simplex Yöntemi (* INPUT : The associated datafile for PSIMPLEX (Revised Simplex Method) is called "SimplexDatafile". FIRST NUMBER in "SimplexDatafile" represents # of VARIABLES in Linear Program problem(LP). SECOND NUMBER represents # of CONSTRINTS in LP. Third set of number is M x N constraint matrix. FOURTH set of number is 1 x M Right Hand Side(RHS) matrix. FIFTH set of number is 1 x N Cost Matrix in the objective function. Algorithm : The Psimplex algorithm simplex method. is based on the revised This algorithm solves the LP problems in STANDARD FORM minimize s.t. cTx Ax=b x>= 0 where vector b is non-negative. Maximum # of variables, and maximum # of constraints are set to maxvar =50 and maxconstraint=40 respectively. One can modify them according to their needs. But maxconstraint is <= maxvar. EPS is small ral number such that if for ant real 54 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları number a, |a|< EPS, then a =0.0 EPS is set to 10^-16 <= EPS <= 10^-4. OUTPUT NOTE : Outputs are 1. Check if a LP 2. Determine the corresponding 3. Determine the is feasible and optimal solution exists. optimal basic variables and their values. optimal value of the objective function : This algorithm tests all nonbasic varables as candidates for entering the basis. This is very time comsuming *) program Simplex(input,output,SimplexDatafile,SimplexOutfile); const maxvar = 50; maxconstraint = 40; EPS = 0.00001; type CHARFILE ARRM2M2 ARRM2N ARRM2 ARRN ARRM var Nextreal : real; N,M : integer; A : ARRM2N; B,X : ARRM2; C : ARRN; W : ARRM; F : real; NOFEAS : boolean; NOSOL : boolean; SimplexDatafile, SimplexOutfile : CHARFILE; Nextint : integer; = file of char; = array[1..maxconstraint+2,1..maxconstraint+2] of real; = array[1..maxconstraint+2,1..maxvar] of real; = array[1..maxconstraint+2] of real; = array[1..maxvar] of real; = array[1..maxconstraint] of integer; procedure Infile(var var var var var var N,M : A : B : C : Nextreal Nextint integer; ARRM2N; ARRM2; ARRN; : real; : integer); var row,column : integer; begin reset(SimplexDatafile); readln(SimplexDatafile,Nextint); N := Nextint; readln(SimplexDatafile, Nextint); M := Nextint; for row := 1 to M do 55 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları begin for column := 1 to N do begin read(SimplexDatafile,Nextreal); A[row,column] := Nextreal; end; readln(SimplexDatafile); end; for row := 1 to M do begin read(SimplexDatafile, Nextreal); B[row] := Nextreal; end; readln(SimplexDatafile); for column := 1 to N do begin read(SimplexDatafile,Nextreal); C[column] := Nextreal; end; readln(SimplexDatafile); end; procedure PSIMPLEX( M,N EPS var A var B,X var C var W var F var NOFEAS,NOSOL :integer; :real; :ARRM2N; :ARRM2; :ARRN; :ARRM; :real; :boolean); var I,J,K,L,P,Q :integer; D,R,S :real; U :ARRM2M2; Y :ARRM2; EX,PHASE,STOP:boolean; begin NOFEAS:=false; NOSOL:=false; P:=M+2; Q:=M+2; PHASE:=true; K:=M+1; for J:=1 to N do begin A[K,J]:=C[J]; S:=0.0; for I:=1 to M do S:=S-A[I,J]; A[P,J]:=S end; (* FOR J *) S:=0.0; for I:=1 to M do begin W[I]:=N+I; R:=B[I]; X[I]:=R; S:=S-R end; (* FOR I *) 56 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları X[K]:=0.0; X[P]:=S; for I:=1 to P do begin for J:=1 to P do U[I,J]:=0.0; U[I,I]:=1.0 end; STOP:=false; repeat (* UNTIL STOP *) (* PHASE 1 *) if (X[P] >= -EPS) and PHASE then begin PHASE:=false; Q:=M+1 end; D:=0.0; (* PHASE 2 *) for J:=1 to N do begin S:=0.0; for I:=1 to P do S:=S+U[Q,I]*A[I,J]; if D > S then begin D:=S; K:=J end end; (* FOR J *) if D > -EPS then begin STOP:=true; if PHASE then NOFEAS:=true else F:=-X[Q] end else begin for I:=1 to Q do begin S:=0.0; for J:=1 to P do S:=S+U[I,J]*A[J,K]; Y[I]:=S end; (* FOR I *) EX:=true; for I:=1 to M do if Y[I] >= EPS then begin S:=X[I]/Y[I]; if EX or (S < D) then begin D:=S; L:=I end; EX:=false end; (* IF Y[I] >= EPS *) if EX then begin NOSOL :=true; STOP:=true end else begin W[L]:=K; S:=1.0/Y[L]; for J:=1 to M do U[L,J]:=U[L,J]*S; if L = 1 then I:=2 else I:=1; repeat S:=Y[I]; X[I]:=X[I]-D*S; for J:=1 to M do U[I,J]:=U[I,J]-U[L,J]*S; if I = L-1 then I:=I+2 else I:=I+1 until I > Q; X[L]:=D end (* ELSE: NOT EX *) end (* ELSE: D <= -EPS *) until STOP end; (* PSIMPLEX *) procedure Outfile(NOFEAS, NOSOL : boolean; M : integer; F : real; W : ARRM); var counter : integer; 57 İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları begin rewrite (SimplexOutfile); if (NOFEAS = false) and (NOSOL = false) then begin writeln(SimplexOutfile,' NOFEAS = NOSOL ', NOFEAS); writeln(SimplexOutfile,' Basic-Var Value'); for counter := 1 to M do begin write(SimplexOutfile,W[counter]); writeln(SimplexOutfile,' ',X[counter]:9:2); end; writeln(SimplexOutfile,' Objective value for min problem is end; end; begin (* main *) Infile(N,M,A,B,C,Nextreal,Nextint); PSIMPLEX(M,N,EPS,A,B,X,C,W,F,NOFEAS,NOSOL); Outfile(NOFEAS,NOSOL,M,F,W); end. 58 ',F:9:2); İrfan MACİT Bölüm 4 Apache Web Sunucusu Bölüm 4 Apache Web Sunucu 1. Giriş Hizmet sunucuları işlevini görecek bilgisayarlar iki alt grupta toplanabilir. Birincisi Internet erişimini sağlayan diğer bir deyişle Internet bağlantı hizmetini verecek olan bilgisayar,diğeri ise hizmet sunucu bilgisayar buna da web servislerinin verildiği bilgisayar olarak tanımlayabiliriz. Değişik firmaların ürettiği çeşitli web sunucu yazılımları bulunmaktadır. Dünyadaki web servislerinin yarısından fazlasını apache web sunucuları vermektedir. Bu sunucular güvenli erişim ve web üzerinde yönetim sağlayan cgi (Common Gateway Interface) yapısında web arayüzlerini de sağlamaktadır. Bu proje kapsamında apache web sunucusu kurulumu ve yapılandırmasında bahsedilecektir. Apache web sunucusunun tercih edilmesinin ana sebebi geniş uygulama ve kullanım alanı yanı sıra değişik işletim sistemi platformlarında çalışabilmesidir. Internet erişiminin sağlanması işlevini yine Linux işletim sistemi veya FreeBSD/OpenBSD işletim sistemlerinden birisi tarafından verilmesi tasarlanmaktadır. Projenin maliyetlerinin düşürülmesi için daha çok herkes tarafından kolayca bulunup kullanılabilen ve uygulama alanının geniş olduğu işletim sistemleri tercih edilmektedir. Internet erişiminin sağlanacağı işletim sistemin olarak belirlenen Linux işletim sisteminin yanı sıra güvenlik testlerinden uzmanların tercih ettiği ve önerdiği bir diğer işletim sistemin ise OpenBSD Unix’tir. OpenBSD Berkeley üniversitesindeki bir araştırma projesi sonucunda ortaya çıkan ve Unix çekirdeğini kullanan güvenli bir işletim sisteminin. Profesyonel güvenlik sağlayıcı şirketlerinde önerdiği bu sistemin geliştirilme amaçlarından birisi güvenli Internet erişiminin sağlanmasıdır. Kurulumu ve yapılandırması bir güç olan bu sistemin kurulduktan sonra herhangi bir ek yapılmaya ihtiyaç kalmadan güvenli olarak çalışması ise güvenilirliğinin artmasını sağlamıştır. 59 İrfan MACİT Bölüm 4 Apache Web Sunucusu Apache web sunucusu hakkında detaylı bilgi ve belgelere ulaşmak için URL:http://httpd.apache.org/docs-2.0/ adresini veya URL:http://www.belgeler.org adresi kullanılabilir. 2. Windows İşletim Sisteminde Apache Web Sunucu Servisinin Kurulması ve Yapılandırılması Apache web servisi ilk olarak Microsoft Windows işletim sistemi üzerinde nasıl kurulacağından bahsedilecektir. Apache http://www.apache.org/dist/httpd/binaries/win32 web sunucusunu adresinden güncel Internet sürümünü üzerinde temin edebiliriz. Bu web sitesinde çalıştırılabilir kod uzantılı (.exe), derlenmiş Windows dosyası (.msi) ve sıkıştırılmış (.zip) apache web sunucusunun hangisini sistemimize kurmak istiyorsak bilgisayarımıza indirip kurabiliriz. Kurulumun Microsoft Windows versiyonu kurulumu sırasında bir Windows bilgisayar programının kurulumu gibidir. Apache web sunucusun kurulumu sırasında sunulan seçeneklerden yararlanılarak kolayca kurulabilmektedir. Kurulum başladıktan sonra ilk gelen pencere Şekil 1’deki gibidir. Bu pencereden web sunucusunun sürümü ile ilgili bilgiler gelecektir. Burası web sunucusunun kurulumunun ilk aşamasıdır. “Next” düğmesi işaretlenerek kurulumun bir sonraki aşamaya geçmesi sağlanır. Şekil 3.1. Apache web sunucusu kurulum başlangıcı İkinci aşamada web sunucusunun ilgili firmanın lisans anlaşması görüntüsü Şekil 2’de gelmektedir. Bu aşamada lisans anlaşmasının kabul edilip edilmediği sorulu ve kurulum 60 İrfan MACİT Bölüm 4 Apache Web Sunucusu yapan kullanıcıdan burayı dikkat ile okuması istenir. "I accept the terms in the license agreement" işaretlendikten sonra “Next” düğmesi ile kuruluma devam edilir. Eğer ikinci seçenek olan “I do not accept the term in the license agreement ” seçilirse kurulum kesilmesi istenip istenmediği sorulur. Bu soruya “yes” cevabı verilir ise kurulum yarıda kesilir ve programın kurulumu durdurulur. Şekil 3.2. Lisans anlaşması metni Üçüncü aşamaya gelindiğinde apache web sunucusu ile ilgili teknik bilgilerin bulunduğu Şekil 3’teki görüntü ekrana gelir. Burada geliştiricilerin yaptığı yenilikler veya apache web sunucusunun sürümü ile ilgili kısa kurulum bilgileri verilmektedir. “Next” düğmesini işaretleyerek kurulumun diğer aşamasında geçilmesi sağlanır. 61 İrfan MACİT Bölüm 4 Apache Web Sunucusu Şekil 3.3. Apache web sunucusu kısa kurulum bilgisi. Diğer aşama olan dördüncü aşamada apache web sunucusu ve kullanıcı ile ilgili bilgilerin girilmesi beklenir. “Network Domain” kutusu apache web sunucusunun çalışacağı bilgisayar ağının bölge ağ adı verilir. Burada kişisel bir bilgisayar yüklenmesi durumunda “localhost” olarak girilmesi istenir. Eğer bir “DNS” kaydı olan bir ağ kullanılıyor ise örneğin “bizimsirket.com” gibi ağ kaydı yapılmış ise buraya kaydı bulunan bu ağ adının girilmesi beklenir. “Server Name” kutusuna apache web sunucusunun çalışacağı ağ kaydı yapılmış olan bilgisayarın adı tamamı ile girilir, örneğin bilgisayarın ismi “www” ise buraya girilecek olan adres “www.bizimsirket.com” seklindedir. Bu adres bize Internet üzerinden erişecek olan bilgisayarların bu adresi yazdığında ulaşmasını ve ağ üzerinde tanımlı olmasını sağlar. En alt kutucukta “Administrator’s E-mail Adress” kısmında apache web sunucunun cevap bekleyen kullanıcıya hata mesajı vermesi durumunda iletişimde bulunacağı yönetici e-posta adresidir. En altta bulunan "Install Apache HTTP Server programs and shortcuts to" seçimilik düğme ise bilgisayarımızın çalıştığı işletim sisteminin özelliğinden kaynaklanan bir duruma göre yapılandırma yapmamızı sağlar. Microsoft Windows XP,NT ve 2000üzeri işletim sistemlerinde kullanıcıları ayrı olarak açılması sağlandığından her kullanıcı sisteme kendi adı ile açılış sağlar. Bu durumda kullanıcılar aynı bilgisayarı kullansalar bile kendilerine ait olan hesaplara ait haklar ile işlem yapabilirler. Bu durumda yönetici olmayan birisi bu bilgisayarı açması durumunda apache web sunucusunu çalıştıramayacaktır. Eğer bu bilgisayarı kullanan tüm kullanıcıların web sunucusunu çalıştırması isteniyor ise ilk seçenek olan “Run as a service for All Users -- Recommended” seçeneğin işaretlenmesi istenir. Bu kutucuğun işaretlenmesi durumunda apache web sunucusu bir Windows işletim sistemin servisi gibi çalışacaktır . Diğer seçenek olan “Run when started manually, only for me (kişi)” işaretlenmesi durumunda apache web sunucusu sadece bilgisayar kullanıcısı olan “kişi” tarafından çalıştırılabilir. 62 İrfan MACİT Bölüm 4 Apache Web Sunucusu Şekil 3.4. Kurulum ve kullanıcı bilgileri Kurulum tipinin seçildiği beşinci aşamada kurulumun nasıl yapılması istendiği sorulur bu aşamada kurulumu yapan kişi kendi isteğine göre bir takım değişiklikler yapmak istiyor ise buradaki “Custom” seçeneğini seçerek kendine özel kurulum yapabilir. Eğer kurulum yapan kişi “Complete” seçeneğini seçerek devam eder ise kurulum standart olarak daha önce geliştiriciler tarafından belirlenen tüm ayarları ile kurulur Şekil 5. “Custom” seçeneği ile kurulum yapan kullanıcı kurulum sırasında apache web sunucusuna ait dokümanları veya “Runtime” olarak bahsedilen apache web sunucusunun çalıştırma dosyalarını seçmesi beklenir. Apache web sunucusu “Runtime” dosyaları programın çalışması için gerekli olan tüm dosyaları içerdiğinden kurulması gerekir kurulmadığı durumda web sunucusu çalışmayacaktır. Dokümantasyon apache web sunucusunun sürümüne göre yaklaşık olarak 5 megabyte disk alanı kaplamaktadır. Yardım ve yapılandırma ayarları sabit olarak kalacak ve geliştirilme işlemi yapılmayacak ise dokümanların kurulması işlemi iptal edilebilir. Günümüzde web sunucularının disk alanları kısıtlı olmadığı için kurulması tavsiye edilmektedir. 63 İrfan MACİT Bölüm 4 Apache Web Sunucusu Şekil 3.5. Kurulum tipinin seçilmesi Şekil 6’da kurulum seçeneği “Custom” olarak seçildiği durumda sunucu bilgisayardaki kurulum yolu değiştirilmek isteniyor ise “Change” düğmesi ile disk üzerindeki programın kurulacağı dizin değiştirilebilir. Ayrıca “Custom” seçeneği seçildiğinde kurulum sırasında yardım dosyaları da kurulumu sağlanmaktadır. Şekil 3.6. Kurulum yeri ve yardım dosyalarının yerleşiminin seçimi Kurulum yerinin seçimi web sunucusunun kullanacağı dosyalarının yerleşiminin belirlenmesi amacıyla düzenlenmektedir. Genellikle kurulum yeri “C:\Program Files\Apache2 Group” dizini içerisindedir. Beşinci aşamada kurulum 64 İrfan MACİT Bölüm 4 Apache Web Sunucusu seçeneği “Complete” olarak seçilirse kurulum dizini belirtilen yol olarak kalır. Eğer farklı bir kurulum yeri belirlenecek ise “Change” düğmesine basılarak Şekil 7’deki gibi kurulum dizininin yeri değiştirilebilir. Şekil 3.7 Kurulum dizininin değiştirilmesi. Kurulum yerinin değiştirilmesinin tercih nedeni kurulum yapılacak disk alanı her zaman bilgisayarın kendi disk alanı üzerinde olmayabilir. Bazı durumlarda dağıtık dosya sistemi kullanılabilir. Bu durumlarda disk yerinin seçimi önem kazanmaktadır. ”change” düğmesi kullanılarak bu durum düzeltilir. Şekil 3.8. Kurulumun başlatılması. 65 İrfan MACİT Bölüm 4 Apache Web Sunucusu Kurulum ayarları tamamlandıktan sonra artık bilgisayara web sunucusunun kurulması işlemi başlayacaktır. Şekil 8’de “Install” düğmesine basılarak kurulum aşamasına geçilir. Şekil 3.9 Kurulum işlemi. Kurulum işlemi başladıktan sonra disk alanına kurulum için gerekli dosyalar kopyalanmaya başlar. Bu aşamada kurulum programı web sunucusuna ait dosyaları bilgisayarda daha önce ayarladığımız yerlere kopyalanmaya başlamıştır. En son aşamada kopyalanma işlemi bitmiştir. Şekil 10’da “Finish” düğmesine basılarak kurulum işleminin bitirilmesi sağlanır. Şekil 3.10. Kurulumun sonlandırılması. 66 İrfan MACİT Bölüm 4 Apache Web Sunucusu Kurulum işlemi bittikten sonra Windows gezgini ile “C:\Program Files\Apache2 Group” dizinine gidilerek apache web sunucusu kontrol paneli çalıştırılarak web sunucusunun durumu kontrol edilebilir. Bu kontrol panelinde daha sonradan ihtiyaç duyulur ise web sunucusu “stop” düğmesi ile durdurulur. Kontrol panelinde bulunan “start” düğmesi daha önceden durdurulmuş olan web sunucusu yeniden başlatır. Kontrol paneli bize web sunucusunun durumu hakkında bilgi verir. Eğer web sunucusu herhangi bir nedenden dolayı durmuş veya çalışmıyor ise yeniden çalıştırmak için veya diğer araçlar yardımıyla durma nedenini araştırmamıza yardımcı olmaktadır. Windows 2000 veya Windows XP işletim sistemleri Windows NT çekirdeği üzerinde çalıştığından “services” Windows yönetim modülünden servis olarak kontrol edilebilir. Windows 2000 veya Windows XP işletim sistemlerinde yönetimsel araçlar veya bilgisayarımdan yönet mönüsüne girilerek “services” araçlarının bulunduğu mönüye ulaşılır burada Windows işletim sistemi servisi olarak görünen “apache” servisi ile web sunucusunun çalışması kontrol edilebilir. Eğer istenirse Windows bilgisayar programlama araçları ile servislere ek yazılımlar geliştirilerek web sunucunun kontrol edilmesi sağlanır. Bu sistem yöneticisine bulunmadığı başka bir ortama gsm mesajı gönderilmesini veya çağrı bırakılmasını sağlayan mekanizmaların çalışmasını sağlar. Yüksek bulunurluluk gerektiren çalışma durumlarında bu programlama araçları sistem yöneticilerinin işlerini oldukça kolaylaştırmaktadır. Şekil 3.11. Windows Servis Penceresinde Apache web Sunucu Servisi 67 İrfan MACİT Bölüm 4 Apache Web Sunucusu Apache web sunucusu ayarlarının yapılması işlemi kurulum işleminin hemen ardından yapılması beklenir. Genellikle Windows işletim sisteminde kurulum sonrası ayarlamalara gerek duyulmamaktadır. Bir betik dili desteği verilecek ise bu kurulum yapılan dizindeki “conf” dizini içerisinde bulunan httpd.conf dosyası bir kelime işlemci ile açılarak gerekli düzeltmelerin yapılması gerekir. Bu düzeltmeler öncelikle sunucunun çalışacağı port numarası sunucu ismi ve bağlantı kurulacak e-posta adresleri gibidir. Windows işletim sisteminde olduğu gibi httpd.conf dosyası bir kelime işlemci ile açılarak gerekli düzeltmelerin yapılması gerekir. Bu yapılandırma dosyasının bir çok ayarı Windows işletim sisteminin aynısıdır. Farkları sadece dizin yapılarında değişmektedir. Dizin yapısı Windows işletim sisteminde “C:\Program Files\Apache2 Group” şeklindedir. Linux veya unix işletim sisteminde dizin yapısı ise “/usr/var/www” veya “/home/www” şeklindedir. Daha sonra betik dili veya veritabanı desteği gibi verilecek desteklere göre yapılandırma ayarları oluşturulur. Burada daha çok PHP betik dili ile ilgili ayarların nasıl yapılacağından bahsedilecektir. PHP betik dili ile geniş açıklama ayrı bir bölümde ele alınacaktır. PHP betik dili kurulumu için gerekli dosyaları http://www.php.net/downloads.php adresinden indirilebilir. bu web adresinde bulunan zip uzantılı dosya bilgisayarın kök dizininde açılacak olan “C:\PHP” dizinine kopyalanarak sıkıştırılmış dosya açılır. Bu dizin içerisine açılan dosyalar içerisinde bulunan “php.ini-dist” isimli dosyayı “php.ini” olarak ismini değiştirerek Windows işletim sisteminizin bulunduğu dizine kopyalayınız. Bu dosya içerisinde kullanmak istediğimiz satırları aktif hale getirmek için satır başlarında bulunan ; işaretini kaldırmamız yeterlidir. Bu dizin kullanmakta olduğunuz işletim sisteminin özelliğine göre değişmektedir. Windows işletim sistemini kurduğunuz kök dizi “C:\windows” veya “C:\winnt” şeklinde olabilir. Kopyalama işleminden sonra “php.ini” dosyasını bir kelime işlemci ile açarak “extention_dir” satırını bulunuz. Bu satır php yorumlayıcısının hangi uzantılar ile ilişkili olarak çalışacağını gösteren ayarların olduğu dizini işaret eder. Bu dizin “php_xxx” ile başlayan dll uzantılı dosyaların olduğu dizindir. Php betik dili ile ilişkili olarak kullanmak istediğimiz php uzantısından başka bir uzantıda olan betiklerin ilişkili olduğu dosyaları bu dizine kopyalamamız gerekir. Bu satırdaki ayarlama aşağıdaki gibi olmalıdır. extention_dir = C:\PHP\extention Bu dizinde php betik dilinin görüntü (images) dosyaları ile ilgili olarak kullanılan fonksiyonları kullanmak için “php.ini” dosyasında bulunan bir satıra extention=php_gd.dll yazmak yeterlidir. Bu satır yazıldıktan sonra artık php ile görüntülere ait olan fonksiyonları 68 İrfan MACİT Bölüm 4 Apache Web Sunucusu kullanabiliriz. Aşağıdaki satırlar ise Windows işletim sisteminde çalışan apache web sunucusunun çalıştırılmasını sağlayan dll dosyasının dizin yerini göstererek yükleyen ve php’nin bir uygulama olduğunu belirten tanımlamadır. Bu tanımlama sonucunda php uzantılı dosyalar apache web sunucusu tarafından Windows işletim sisteminden bir uygulama gibi çağrılacaktır. LoadModule php4_module c:/php/sapi/php4apache2.dll AddType application/x-httpd-php .php Diğer değişiklikler ve yapılandırma ayarlarının bir çoğu Linux işletim sistemindeki gibi yapılandırılmaktadır. Sanal web sunucusunun oluşturulması işlemine “virtual hosting” denmektedir. İki türlü olarak yapılandırılabilir. İlki IP (Internet Protokolü) numarası tabanlı yapılandırma, ikincisi dns (Domain Name Server) tabanlı yapılandırmadır. Detaylı bilgi Linux işletim sistemindekinin aynısı olarak yapılandırılmaktadır. Unutulmaması gereken önemli bir nokta apache web sunucusunun yapılandırma dosyalarında bir değişiklik yapıldığında değişikliğin geçerli olabilmesi için sunucuyu tekrar çalıştırmak gerekir. Bu durumda web sunucu yapılandırma dosyasını tekrar okuyarak değişikliğe göre yeniden başlatılacaktır. 3.3 Linux İşletim Sisteminde Apache Web Sunucu Servisinin Kurulması ve Yapılandırılması Önceki bölümde web sunucusunun daha önceden var Windows işletim sistemi altında kurulması ve yapılandırmasından bahsedilmişti. Linux veya unix işletim sisteminde web sunucusu işletim sistemi kurulurken sunucu olarak yapılandırıldığında kendiliğinden bilgisayara yüklenir. Bu işlem işletim sistemi kurulan bilgisayarın sunucu olarak kullanılması durumunda geçerlidir. Eğer bilgisayarımızı masa üstü olarak kurulu ise yine Apache web sunucusunu yükleyebiliriz bunun için yapılması gereken kullandığımız Linux dağıtımının cdrom medyasına sahip olmamız veya bilgisayarımızın internet’e bağlı olması yeterlidir. Kullanılan dağıtımlarda çok değişiklik yoktur. Unix işletim sistemi kullanılıyor ise burada önemli olan bilgisayarın mimarisine bağlı olarak değişmektedir. Aynı durum Linux dağıtımlarını da ilgilendirir örneğin sun microsystem ultra sparc 4 veya 5 işlemcili bir bilgisayara Linux (RedHat, Gentoo, Gelecek, SuSE v.s) veya unix (Solaris, FreeBSD, OpenBSD, SCO v.s.) dağıtımı kurmak istiyorsak bu mimariye uygun bir dağıtım seçmemiz 69 İrfan MACİT Bölüm 4 Apache Web Sunucusu gerekmektedir. Birçok dağıtım firması bunları göz önüne alarak dağıtımlarını medya üzerine yerleştirmektedir. Bu kitapta intel işlemci mimarisine uygun olan RedHat Linux dağıtımı ve kurulum ayarlarından bahsedilecektir. Genellikle Linux dağıtımlarının hepsinde aynı paketleme sistemi ile gelmektedir. RedHat dağıtımının rpm ve tar uzantılı dosyalara desteği olduğu için her iki şekilde de kurulabilmektedir. Bunun kurulumları sadece paketleri bilgisayara yüklerken bazı komut değişikliklerine gerek duyduğu bilinmektedir. Apache web sunucusu paketi debian dağıtımlarında tar veya deb uzantılı gelmektedir. Bu tamamen dağıtımın veya geliştiricilerin kendi uygulama genelleştirme politikaları ile ilgilidir. Linux işletim sistemi dağıtımının seçilmesi kurulumun başlatılması ve komutların verilmesini değiştirebilir. Bu projede daha çok rpm uzantılı paketlerin kullanıldığı işletim sistemi esas kabul edilerek anlatılacaktır. Bu tip uzantılı dosyaların seçilmesinin diğer bir nedeni kurulum komutlarının çok kolay olması ve parametrelerinin akılda kalır olmasıdır. Önce bilgisayarımızda Apache web sunucusunun bulunup bulunmadığını test etmemiz gerekmektedir. Bunun için komut satırında root yetkisiyle sorgulamamız gerekmektedir. #rpm –q Apache komutu ile gelen cevaba göre tekrardan bilgisayarımıza Apache web sunucusunu yükleriz. Bunun için komut satırında #rpm –i Apache yazarak web sunucusunun yüklemesini sağlarız. Yükleme sonunda ekrana gelen yazıda apahce web sunucusu bilgisayarınıza başarı ile yüklendi yazmaktadır. Bu aşamadan sonra Yapılandırma dosyaları genellikle “/etc/www” veya “/etc/Apache” dizini gibi olabilmektedir. Yapılandırma işlemine başlarken kullanacağımız kelime işlemci (vi, emacs, xedit v.s.) ile yapılandırma ayarlarının bulunduğu dizine giderek (burada/etc/apache olduğu varsayılmıştır) httpd.conf dosyası açılarak önce ServerName satırı bulunarak önündeki # (diyez) işareti kaldırılır. Bu satıra sunucunun çalıştığı FQDN (Fully Qualyfied Domain Name) olarak bilinen sunucunun tüm Internet kayıt adres ismi yazılır. Bu işlem daha çok isim tescili “Domain Registrar” servisleri tarafından yapılır. Bu tür kayıtları tutan veya bu hizmeti veren firmalar tüm adresleri http://www.internic.net adresindeki yönergelere göre yaparlar veya bir DNS (Domain Name Service) servisi veren bir firmaya kayıt yaptırarak kullanırlar. 70 İrfan MACİT Bölüm 4 Apache Web Sunucusu Aşağıdaki yapılandırma ayarında web sunucusunun çalışacağı kök dizinin neresi olduğunu göstermektedir. Bunun anlamı sunucu bilgisayar yazılan dizin içerisinde çalışmaktadır. Bazı durumlarda sunucu bilgisayar NFS (Networked File System) şeklinde bir dizin hizmeti olan sistemde çalışabilir ve bağlanılan dizin başka bir bilgisayarda olabilir. Bu durumda bu satıra bağlanılan (mount edilen) dizin yazılır. Örneğin sunucunun çalıştırıldığı bilgisayar www.bizimsirket.com adresine sahip bilgisayarda yapılandırma ve dokümanların bulunduğu bilgisayar ise NFS sisteminde URL:nfs://doc.bizimsirket.com adresinde olsun, buradaki doc bilgisayarının “/var/htdocs” dizinine www sunucu bilgisayarı “/etc/htdocs” olarak bağlansın. Web sunucusunun çalıştığı bilgisayar dizini aşağıdaki gibi olacaktır. # Do NOT add a slash at the end of the directory path. # ServerRoot "/etc/httpd" # # # # # ScoreBoardFile: File used to store internal server process information. If unspecified (the default), the scoreboard will be stored in an anonymous shared memory segment, and will be unavailable to third-party applications. Dokümanların bulunduğu dizin ise NFS ile başka bir biligisayarda bağlandığı için biz aşağıdaki satıra ise “/etc/htdocs” yazarak yapılandırmayı tamamlayacağız. Bu tanımlama bize diğer bilgisayarda bulunan ve NFS hizmeti ile sanki bizim bilgisayarımızda bir dizinde çalışıyormuş gibi ayarlama yapmamıza olanak verir. # # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/etc/htdocs” # # Each directory to which Apache has access can be configured with respect # to which services and features are allowed and/or disabled in that # directory (and its subdirectories). Yukarıda bahsedilen durum NFS kullanılan gerekli durumlara bir örnek olarak verilmiştir. Genellikle bu durum istisnadır. Eğer kurulum yaptığımız bilgisayar bir NFS sisteminde değil ve bizde buna ihtiyaç duymuyorsak yapılandırma ayarları RedHat dağıtımlarında doküman dizini“/var/www/html/” altında standart olarak tanımlıdır. Bu satırları değiştirdiğimizde aşağıdaki yazan satırlarada aynı dizin yolunu girmemiz gerekir. # This should be changed to whatever you set DocumentRoot to. # 71 İrfan MACİT Bölüm 4 Apache Web Sunucusu <Directory "/var/www/html"> # Yapılandırma ayarlarında önemli ve dikkat edilmesi gereken bir nokta ise PID (Process IDentification) olarak tanımlanan ve çalışma süreç bilgisidir. Bu bilgi apache web sunucusu başladığında tutulan bir dosyadır. Sistem yöneticisi web sunucu servisini başlattığında ve sonlandırdığında bu dosyaya bir sistem sinyali gönderilir. Bu sinyalin gönderilmesinin amacı sistemin çalışmasının çekirdek tarafından kontrolünü sağlamaktır. Örneğin sistemin yeniden başlatılması için HUP (HangUp) veya unix sinyali olan USR1 sinyali gönderildiğinde web sunucusu yapılandırma ayarlarını tekrar okuyarak yeniden başlatılır. # PidFile: The file in which the server should record its process # identification number when it starts. # PidFile run/httpd.pid # Apache web sunucusunun çalışacağı port numarasını değiştirmek için aşağıdaki yazılı olan satırdaki geçerli numarayı değiştirmemiz yeterlidir. Bu değişiklik apache web sunucusunun bilgisayarımızın farklı bir port numarası ile çalışmasını sağlar. Port numarasının değişikliğin temel sebebi web sunucumuz bir güvenlik duvarı (FireWall-FW) arkasında çalışması istendiğinde veya bu port numarasını başka bir bilgisayara port yönlendiriciler ile yönlendirildiğinde ihtiyaç duyulmaktadır. Burada önemli olan bir konuda web sunucumuz bir içağ (Intranet) çalışıyor ise ve web sunucusunun çalıştığı bilgisayara dışarıdan yönlendirilecek veya ilerletilecek (forwarding) olan port numaralarının kontrolünü de sağlar. # #Listen 12.34.56.78:80 Listen 80 # Linux işletim sisteminde kullanıcılar ve gruplar sınıflandırılmıştır. Bu sınıflandırma servis hizmetleri içinde geçerlidir. Web sunucu bir servis mekanizması içerisinde çalıştığı için çekirdek sistemine bunun bilgisin verilmesi gerekir. Bu bilgi aşağıdaki satırda verilmektedir. # don't use Group #-1 on these systems! # User apache Group apache 72 İrfan MACİT Bölüm 4 Apache Web Sunucusu # Apache web sunucusu bazı durumlarda istemcilere hata mesajı gönderebilir. Karşılaşılan bu durumlarda sistem yöneticisinin bilinmesi veya iletişim kurulacak e-postanın istemciye gönderilmesi gerekir. Yapılandırma dosyasında bu isim ve e-poasta adresini aşağıdaki satırda belirleyerek gerekli olduğu durumlarda istemcilerin iletişim kurmasını sağlarız. # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. e.g. [email protected] # ServerAdmin [email protected] # Sunucun kendi kendini tanımlaması için aşağıdaki satırın yazılması gerekir. Web sunucusunun adresinin DNS tanımlamaları yapılmış ise buraya bu adres ve port numarasın girilmesi gerekir. Bir çok dağıtımda gelen web sunucusu bu adres girilmediği için çalışmayacaktır. “ServerName” satırı aktif olmadığı durumda sunucu tarafında oluşturulan yönlendirme (server-generated redirection) özelliği çalışmayacaktır. Eğer DNS kaydı yapılmamış bir sunucu kullanıyorsanız bu durumda buraya sunucu bilgisayarın IP adresini girmeniz gerekecektir. # #ServerName new.host.name:80 ServerName www.bizimsirket.com:80 # # Redirect permanent /etc/htdocs http://yedek.bizimsirket.com/var/www/html # Web sunucularında çalışacak sayfaları değişik programlama dilleri ile oluşturmak mümkündür. Betik dilleri veya Internet’in temel betik dili olan html kodları ile oluşturulan web sayfalarını uzantılarını tanımlanması gerekmektedir. Web göz atıcıları (browser) ile internet üzerinde gezinirken adres olarak yazdığımız yerde hangi betik dilinin geçerli veya öncelikli olduğunu belirlememiz gerekecektir. PHP veya htm uzantılı bir web sayfasının hangisinin web sunucu üzerinde dizine yönlendiğinde çalışacağını bu sıralamada belirlemek mümkündür. Bunu şu şekilde açıklayabiliriz; web göz atıcı adres çubuğuna girilen adresi 73 İrfan MACİT Bölüm 4 Apache Web Sunucusu DNS kaydını arayarak bulur ve 80 numaralı port’tan erişim kurmaya çalışır. Bu sırada sunucu isteğin sıralanacağı sayfa şekline göre sunucudaki doküman dizininden ilgili dosyayı çağırır. Bu dosyalar index.html, index.htm veya index.php olabilir. İste bu sıraların hangisinin bağlantı esnasında geçerli ve öncelikli olduğunun belirlenmesi işleminde aşağıdaki satırlardaki sıralama kullanılır. Aşağıdaki sıralamada bir göz atıcı bu sunucuya ulaşmaya çalıştığında sunucunun doküman dizininde bulunan dosyalardan index.php’yi öncelikle istemci yani göz atıcı tarafına göndermeye çalışacaktır. Sıralama ilk olarak index.php, sonra index.html şeklindedir. Açıklamayı şu şekilde genişletebiliriz; göz atıcı adres çubuğuna http://www.bizimsirket.com yazıldığında sunucu göz atıcıya ilk olarak index.php dosyasını göndermeye çalışacak ve göz atıcıda bunu görmeye çalışacaktır. # DirectoryIndex index.php index.html index.html.var # Web sunucularda Türkçe problemi karşılaşılan problemlerden birisidir. Web sunucusu değişik dillerde destek vermek üzere yapılandırılmaktadır. Dünyadaki bir çok dilin yazımında kullanılan alfabe farklıdır. Bu farlılıklar çeşitli sorunları da beraberinde getirmektedir. Örneğin Japonca’nın kendine özgü bir dili ve yazım kuralı vardır. Aynı şekilde Türkçe’de bulunan bir çok harf İngilizce’de bulunmamaktadır. Bu durumda Türkçe harflerin görülmesinin sağlanması gerekmektedir. Apache web sunucusunda bunun için karakter setlerini ve dil kodlamasının yapılandırılması gerekir. Geçerli dil kodlaması için aşağıdaki satırı yazmak yeterlidir. Bundan sonraki aşamada dil kodunun eklenmesini sağlayan satır yazılır. # DefaultLanguage tr # AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage tr nl en et fr de he el it ja pl kr pt .tr .nl .en .et .fr .de .he .el .it .ja .po .kr .pt 74 İrfan MACİT AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage AddLanguage Bölüm 4 Apache Web Sunucusu nn .nn no .no pt-br .pt-br ltz .ltz ca .ca es .es sv .se cz .cz ru .ru tw .tw zh-tw .tw hr .hr Dil kodlaması geçerli dil kodlama yapılandırmasında sonra dil önceliğinin göz atıcılara bildiren satırı yazmak gerekir. Bu satırda web sunucunun dil önceliği belirlenmiştir. # LanguagePriority tr en da nl et fr de el it ja kr no pl pt pt-br ltz ca es # Dil öncelikleri belirlendikten sonra geçerli kodlama sayfasının eklenmesine gelir. Bu sayfada uluslar arası karakter seti tablosunda belirlenen kodlama şekli kullanılır. Her dil ve kodlamasının uluslararası yapı tablosu bulunmaktadır. Genellikle o ülkede konuşulan dile ve yazım kurallarına göre çeşitli kısaltmalar veya simgeler bulunmaktadır. Bu ifadeleri gösteren tablolarda web sayfaları tasarlanırken kullanılacak olan dil kodları da html veya web kodları içerisine gömülmektedir. Bu kodlamalar web sayfalarının hangi dilde nasıl görüneceğini fontlara kadar bir çok değişkeni etkilemektedir. Türkçe için kullanılan karakter seti tablosu ISO-8859-9 ve latin9 şeklindedir. Geçerli kodlamalar ve diğer ülke karakter setleri tablolarına ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets dizininden ulaşılabilir. # AddDefaultCharset ISO-8859-9 # # Commonly used filename extensions to character sets. You probably # want to avoid clashes with the language extensions, unless you # are good at carefully testing your setup after each change. # See ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets for # the official list of charset names and their respective RFCs # AddCharset ISO-8859-1 .iso8859-1 .latin1 AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen AddCharset ISO-8859-3 .iso8859-3 .latin3 AddCharset ISO-8859-4 .iso8859-4 .latin4 AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ru AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk AddCharset ISO-2022-JP .iso2022-jp .jis AddCharset ISO-2022-KR .iso2022-kr .kis AddCharset ISO-2022-CN .iso2022-cn .cis 75 İrfan MACİT Bölüm 4 Apache Web Sunucusu AddCharset Big5 .Big5 .big5 # For russian, more than one charset is used (depends on client, mostly): AddCharset WINDOWS-1251 .cp-1251 .win-1251 AddCharset CP866 .cp866 AddCharset KOI8-r .koi8-r .koi8-ru AddCharset KOI8-ru .koi8-uk .ua AddCharset ISO-10646-UCS-2 .ucs2 AddCharset ISO-10646-UCS-4 .ucs4 AddCharset UTF-8 .utf8 # Apache bilgisayar sunucu sistemlerinde bazı durumlarda birden fazla web sitesi tek sunucuda barındırılabilir. Sanal web sunucuları tanımlama ve yapılandırmaları temel olarak beş kısımdan oluşmaktadır. Buna sanal web sunucusu kullanma denir. Sanal web sunucuları iki şekilde barındırılabilir. Birincisi IP tabanlı web sunucusu tutma, ikincisi isim tabanlı web sunucusu tutmadır. IP tabanlı sunucu tutma işleminde her web sitesi için ayrı IP adresine ihtiyaç yoktur. Örneğin 1.2.3.4 nolu IP adresine birden fazla sanal web sunucusu oluşturulabilir. Bu adreslerin DNS tanımlamaları yapılmalıdır. Eğer DNS tanımlamaları yapılmadı ise web sunucuları oluşturulamayacaktır. Web sunucusunun oluşturulması sırasında tanımlama kısmına sadece IP numarası girilir ise DNS’te reverse dns tanımlamasının yapılması gerekir. Aksi takdirde IP numarasının kaydı bulunamadığı mesajı gelecek ve web sunucusuna erişilemeyecektir. Aşağıdaki yapılandırma örneğinde her IP adresi DNS kayıtları yapılarak bir web sunucusu üzerinde çalışmaktadır. Listen www.bizimsirket.com:80 <VirtualHost www. bizimsirket.com> ServerAdmin webmaster@mail. bizimsirket.com DocumentRoot /groups/bizimsirket/www ServerName www.bizimsirket.com ErrorLog /groups/bizimsirket/logs/error_log TransferLog /groups/bizimsirket/logs/access_log </VirtualHost> <VirtualHost www.digersirket.org> ServerAdmin [email protected] DocumentRoot /groups/digersirket/www ServerName www.digersirket.org ErrorLog /groups/digersirket/logs/error_log TransferLog /groups/digersirket/logs/access_log </VirtualHost> 76 İrfan MACİT Bölüm 4 Apache Web Sunucusu Bu tanımlamaları açıklayacak olursak temel olarak altı kısımdan oluştuğunu söyleyebiliriz. İlk kısımda yapılandırma dosyasında DNS kaydı yapılmış hangi web adresi ve dinleyeceği port numarasının bildirimi vardır. sanal web sunucusunun tanımlanması vardır. Listen www.bizimsirket.com:80 İkinci kısımda sanal sunucunun adresi ve yapılandırma ayarlarının olduğu satır yeralır. Bu satır bize sunucumuzun hangi kayıtlı adres üzerinden çalışacağı bilgisi vardır. <VirtualHost www.bizimsirket.com> Üçüncü kısımda sunucu yetkilisinin adı yeralır. Sunucu arızası veya herhangi bir kırık link veya diğer öenmli durumların bildirileceği sistem yetkilisi tanım olarak anılır. ServerAdmin webmaster@mail. bizimsirket.com Dokümanların yer alacağı dizinin tanımlanması ise dördüncü kısım olarak belirteceğimiz yerde bulunmaktadır. Buradaki dizin yolu kendi bilgisayarımızda olabileceği gibi NFS üzerinde başka bir bilgisayar üzerinde de bulunabilir. DocumentRoot /groups/bizimsirket/www Beşinci kısım sunucunun adının yer aldığı bölümdür. Bu bölümde DNS kaydı yapılmış olan kayıt ismi vardır. ServerName www.bizimsirket.com Altıncı kısımda sunucu hata ve erişim kayıtlarının tutulduğu dizinleri yeri belirtilir. İstenmesi durumunda syslogd sunucu sistemi devreye alınarak diğer baçka kayıtlarında buradan tutulması mümkündür. Bu kısmın sonunda sanal web sunucusunun bitirildiği başlık etiketi bulunur. ErrorLog /groups/bizimsirket/logs/error_log TransferLog /groups/bizimsirket/logs/access_log </VirtualHost> 77 İrfan MACİT Bölüm 4 Apache Web Sunucusu İsim tahsisli web sunucusu ise bir web sunucusunun DNS kaydı üzerinde birden fazla web sunucusunun tutulması işlemidir. Bu işlem httpd.conf dosyası tanımlama kısmında aşağıdaki yapılandırma satırı eklenerek oluşturulur. Bu satırda web sunucusunun hangi web sitelerine hizmet vereceği yazılır. NameVirtualHost *:80 <VirtualHost *:80> ServerName www.bizimsirket.com ServerAlias bizimsirket.com *.bizimsirket.com DocumentRoot /www/bizimsirket </VirtualHost> <VirtualHost *:80> ServerName www.digersirket.com DocumentRoot /www/digersirket </VirtualHost> Bazı durumlarda web sunucularında bir adresin birden fazla karşılığı olması istenmektedir bu durumda ise aşağıdaki satırları yapılandırma dosyasında “VirtualHost” kısmına ekleyerek bu işlemi sağlarız. ServerAlias www.digersirket.com *.digersirket.com Kullanıcılar kurumlarında bazı durumlarda kendilerine ait web sayfalarının olmasını veya web sayfalarını kendileri oluşturmak isterler. Böyle durumlarda yapılandırma dosyasına “Userdir” satırı yazılarak tanımlamalar yapılır ve her kullanıcıya kendisine ait dizin içerisinde web sayfası oluşturulmasına izin verilir. Bu yapılandırma ayarı Linux sistemi üzerinde bulunan kullanıcıları kendi ev dizinlerinde web sayfalarının tutulmasına olanak tanır. Userdir http://www.bizimkurum.org.tr/~kullanıcı1 Linux veya unix altında betik dillerinin desteği genelde modüller ile verilmektedir. Modül bildirimi sistemin kurulacağı yapı ve kullanılacak betik dilleri ile birlikte web sunucusunun üzerinde çalışacak olan yapının da önemi vardır. Örneğin PHP betikleri ile yapılandırılan bir sistemde Perl betik dili ile CGI programlama yapılamayacak ise bu modüllerin de 78 İrfan MACİT Bölüm 4 Apache Web Sunucusu yüklenmesinin bir anlamı olmayacak ve güvenlik açlıklarının çıkmasına sebep olabilecektir. Modül olarak bir PHP desteği Linux işletim sisteminde aşağıdaki gibi verilebilmektedir. <IfModule mod_php3.c> AddType application/x-httpd-php3 .php3 AddType application/x-httpd-php3-source .phps AddType application/x-httpd-php3 .phtml </IfModule> <IfModule mod_php4.c> AddType application/x-httpd-php .php AddType application/x-httpd-php .php4 AddType application/x-httpd-php-source .phps </IfModule> Yukarıdaki ilke blokta php sürüm 3 desteğinin verilişi, alttaki blokta ise php 4 sürümünün desteği verilişi gösterilmiştir. Bu satırların yazılması ile php modülleri yüklendiğinde php uzantıları ve çalışma zamanı dosyalarının (runtime) apache web sunucusundan çalıştırılması mümkün olacaktır. Web sunucularında yetkilendirme işlemi çok kapsamlı olarak yapılandırılması gereken önemli bir durumdur. Web sunucunuza belirlediğiniz kişilerin erişimine izin verilmesi istendiğinde “allow from all” satırında işlem yapılır. <Directory> Allow from all </Directory> Diğer bir durum ise bir bizine belirli kullanıcıların erişmesini durumudur. Bu durumda ise .htaccess dosyası oluşturulur. Apache web sunucusu bu dosyayı kontrol ederek dizin veya dosya erişiminde izin verir. Bu işlemler genel olarak üç aşamaya ayrılabilir. Birinci aşamada kullanıcı ve parolaların bulunduğu bir dizin oluşturulur. Bu dizine tüm kullanıcıların erişiminin olabileceği “/usr/local” dizini altında olması tercih edilmelidir. Çünkü kullanıcılar bu dizinde bulunan erişim bilgilerinin yetkilendirme işlemleri ile dosya veya dizin erişimine sahip olacaktır. İkinci aşamada oluşturduğumuz bu dizin altına “.htaccess” içeriği aşağıdaki gibi olan satırları ekleriz. 79 İrfan MACİT Bölüm 4 Apache Web Sunucusu #bizim şirket özel erişim alanı AuthName “Sirket Özel Erişim Alanı” AuthType Advaced AuthUserFile /usr/local/sirket/sifre Require valid-user En son aşama olan üçüncü aşamada ise kullanıcıların ve şifrelerinin oluşturulması işlemi vardır. Burada komut satırından gerekli olan parametreler verilerek bu şifrelerin oluşturulması sağlanır. burada dikkat edilmesi gereken bir nokta “-c” parametresi yalnızca dosya oluşturulurken sadece bir kez girilir ve daha sonra bu parametre eğer bu dosya yeniden oluşturulmayacaksa kullanılmaz.Kullanıcı1 için şifre oluşturulması sırasında ekrana gelen şifre girme mesajında şifre girilirken ekranda güvenlik nedeniyle herhangi bir karakter görünmez. E#htpasswd –c /usr/local/sirket/sifre kullanici1 Adding password for kullanici1 New pasword: Re-type new password: Bu işlemin sonucunda “/usr/local/sirket/sifre” dosyasında oluşturulan kullanıcılar ve bun kullanıcılara ait şifreler bulunur. herhangi ir web göz atıcısından ilişki kurulan bu dizine ulaşılmaya çalışıldığında istemci ekranına kullanıcı ve şifresinin girilmesini isteyen bir mesaj kutucuğu çıkar. Kullanıcı ve şifre doğrulandığı durumda göz atıcının dizine erişimine izin verilir. 80 İrfan MACİT Bölüm 5 HTML Giriş Bölüm 5 HTML’e Giriş (Sayın Hocam Doç. Dr. Mustafa Akgul’e teşekkür ederim) Bu notlar esas olarak [3] kaynakdan bazi bolumler alinarak ve ufak tefek degisikliklerle Unix ortaminda kendi kisisel web'ini olusturmak isteyen kisiler icin Turkce bir baslangic dokumani olmayi hedeflemektedir. Iyi orneklere bakmak ve onlari bicim olarak taklit etmek oldukca hizli bir yoldur. Begendiginiz bir web dokumanini kaynak halinde saklamak mumkundur (Netscape'de `File' menusunde `Save as ..' secenegi ve `source' bicimini secmek; lynx'de ise once \ ve daha sonra `print'i secmek yeterlidir). Daha sonra sevdiginiz bir editorle kendi istediginiz gibi degistirebilirsiniz. 5.1 URL: Internet'de Nesne Adresleri Internet'de sunulan nesne adresleri genellikle, protokol, makina adi, ve o makinada soz konusu protokole gore erisim yolu (path)'i icerir. Internet uzerinde evrensel adrese URL (Uniform Resorce Label) diyoruz. En genel halinde bir URL'i soyle yazabiliriz: URL: protokol://[[user[:passwd]@]dagitici-makina[:port][/path-selection] burada [..] olarak belirtilen kisim secimli kisimdir. Bazi URL ornekleri: file://localhost/ftp/ftp/pub/INFO/Turkce/Internet/inet2.tex ftp://ftp.bilkent.edu.tr/pub/INFO/Turkce/Internet/inet2.tex gopher://gopher.bilkent.edu.tr:70/00/bilkent/archive/INFO/.../inet2.tex http://www.bilkent.edu.tr/prv/ftp/INFO/Turkce/Internet/inet2.tex wais://dagitici-makina:210/veritabani-adi telnet://user@makina news:news-grup news:makale-numarasi@makina news://makina/news-grup ftp://user:passwd@makina 81 İrfan MACİT Bölüm 5 HTML Giriş http://www.bilkent.edu.tr/cgi-bin/phf?Qnamecaglar$Qtitle&Qdepartment http://www2.infoseek.com/Titles?qtturkey http://query3.lycos.cs.cmu.edu/cgi-bin/pursuit?usenetsite Ilk 4 URL [1] nolu referansin \TeX \ formatindaki kopyasini belirtir. file: sadece `/ftp' diskini goren Bilkent'teki her makina icin gecerlidir, digerleri evrenseldir. Sondaki ftp://'li ornek'de mosaic gibi bir web istemcisi ile kendi hesabiniza ftp yapmak icin kullanabileceginiz bir URL'dir. Sayet kullanilan port standart ise :port kismina gerek yoktur. `path-selection' kisminda soz konusu nesneye erismek icin gerekli yol belirtilir. Telnet'de `user' kullanilmasi gereken kullanici adidir. Bu genellikle kullaniciya hatirlatilir ve kullanicinin bu bilgiyi girmesi beklenilir. /cgi-bin/phf?.. URL'inde ise,`phf' programina ? in sagindakiler, cesitli saha ve aldigi deger olarak iletilmistir. phf telefon/email adreslerin tutuldugu veri tabanina sorguluyan `ph' programina gecit veren bir programdir. 5.2 Kisisel Web Sayfalari Unix ortaminda bir web sunucusunun calistigi bir bilgisayarda hesabi olan kullanicilar, kendi dizinlerinde bir ozel dizin acip, oraya yerlestikleri dokumanlari tum Internet dunyasina acabilirler. Bu dizinin adi sunucuya bagli olarak secilebilirsede bugun en yaygin hali public_html dizinidir. Bu durumda kendi giris dizininde yarataciginiz public_html dizinin URL'i http://www-serverin-adi/~username/ seklindedir. burada `username' sizin login adiniz, `www-serverin-adi' da ilgili web sunucusun kanonik adi olmasinda yarar var. http://www.bilkent.edu.tr/\~ali/ http://www.metaksan.com.tr/\~ant/ gibi. URL bir dizini isaret edince, web sunucusu {\bf index.html} dosyasini arar ve varsa onu sunar; yoksa o dizinin bir ls -l (DIR) ciktisini sunar esas olarak. index.html dosyasi ve onun isaret ettigi dosyalarda referans verilmeyen dosyalari dis kullanici gormez; ama sayet bir kullanici dosyanin adini dolayisiyla URL'ini biliyorsa, o dosyaya erisebilir. Bir dosyanin web'de sunulabilmesi icin, dosyanin ve dosyaya giden yoldaki dizinlerin web sunucunu calistiran kullaniciya erisim hakki olmasini gerektirir. Bu da sizin ana dizinin x (execute), public_html'in x (execute) dosyalarin ise r (read) hakki olmasi gerekir. Bunun kolay bir yolu, sizin ana dizininizin ve public_html'in 755, public_html'deki dosyalarin ise 644 seklinde izinli olmasi gerekir. 82 İrfan MACİT chmod 755 chmod Bölüm 5 HTML Giriş username; 755 chmod 644 public_html ; * komutlari, ana dizinin disinda, ana dizinde ve public_html icinde verilmesi yeterli olur. 5.3 HTML Dosyalari { Biz burada HTML'in temellerini anlatmayi amacliyoruz. HTML, HTML2 ve HTML3'den anlatmadigimiz pek cok sey olacaktir. Kaynakca'da ve Internet uzerinde pek cok kaynak bulabilirsiniz. Ilk olarak http://www.bilkent.edu.tr/WWW/'den basliyabilirsiniz.} HTML -- HyperText Markup Language, SGML (Standart Generalized Markup Language)'in akrabasidir, ondan DTD (dokuman tipi tanimlarini) alir. HTML hypertext dokumanlarinin mantiksal yapisini belirler. (Bu anlamda TeX/LaTeX'le benzerlik gosterir). Ama dokumanlarin kullanicinin ekraninda nasil gosterilecegi kullanicinin web programi (Browser) belirler: yetenekleri ve yapilan tercihlere bagli olarak. Dolayisiyla HTML'i WYSIWYG programlarin kavramlarindan ayirmak gerekir. Web yada http protokolunda sunulan dosyalarin buyuk cogunlugu html dilinde yazilmis dosyalardir ve bunlari cogunlukla .html yada .htm (DOS temelli sistemler) ile gosterilir. Aslinda bir web'i, bir miktar eksigiyle, ftp ve gopher sunuculariyla sunmak mumkundur. Mosaic, Netscsape gibi programlar ftp://host/File.html.Z URL'ini bile alip kullaniciya sunabilirler. Cok az sayida da olsa bu tur sunucular vardir. Bir HTML dosyasinda <XXX OPSIYONLAR diger cesitli tanimlar> `markup'lar vardir: Isimlendirme </XXX> <YYY OPSIYONLAR> seklinde ya tekli yada esli olurlar. < > HTML `syntax'i icin cok onemlidir. Once onemli tekli isaretleyicileri <BASE>, <IMG>, verelim: <ISINDEX>, <BR>, <P>, <LINK>, <NEXTID>, <HR> . Kullanilan `markup' kelimelerinde kucuk harf buyuk harf farketmez ama, isaret edilen dosya isimlerinde bu fark onemlidir. Duzgun bir HTML dosyasi su mantiksal yapiyi gosterir: <HTML> 83 İrfan MACİT Bölüm 5 HTML Giriş <HEAD> ....... </HEAD> <BODY> ..... </BODY> </HTML> Komutlarin mantiksal yapisi onemlidir, goruntunun ve bosluklarin genelde hic bir onemi yoktur, sadece <PRE> .. </PRE> icinde gecerlidir. Bilkent baslangic sayfasinin HEAD kismi <HTML> <HEAD> <TITLE>Bilkent University Home Page</TITLE> <LINK rev=made HREF="mailto:[email protected]"> <!-- OWNER_INFO="Bilkent University" --> </HEAD> Bunlara ek olarak NEXITID'yi genellikle editorler koyar, <BASE HREF=URL> seklinde kullanilir, ISINDEX ise o dokuman uzerinde tarama yapilacagi zaman kullanilir. 5.4 Hypertext baglantilari Hypertext'in en onemli ozelligi baska dokumanlara baglantilarin olmasidir. Bu ise <a HREF="URL"> Isimlendirme </A> seklinde olur. <a HREF="http://gn.bilkent.edu.tr:7001/">GN </a> <a HREF="gopher://gopher.bilkent.edu.tr">Main </a> <a HREF="telnet://[email protected]">Bilkent Library - Bliss </A> Use <i>guest</i> for login <a HREF="ftp://ftp.bilkent.edu.tr/pub/">FTP Interface </a> or <a HREF="/inet-turkey/"> Internet Services In Turkey </A> Ve gercek goruntu GN Main Bilkent Library - Bliss Use 84 guest for login İrfan MACİT FTP Bölüm 5 HTML Giriş Interface or Internet Services In Turkey Burada sirasiyla, http, gopher, telnet, ftp ve dosya'ya olan referansi gorduk. Ayni sunucu uzerinde olan dosyalara isaret ederken HREF="dosya.adi" o anda okunan dosya ile ayni dizindeki bir dosyayi gosterir, HREF=/dir1/dosya.html ise web'in baslangic noktasina gore patikayi belirtir. <a HREF="../../dosyax.html"> seklinde referanslar da gecerlidir; iki ust dizindeki bir dosyaya isaret eder. Sayet <BASE="URL"> belirtilmisse goreceli olarak adreslendirilmis dokumanlar adreslerinin onune `BASE'de belirtilen URL eklenerek yorumlanir. Bir dokumanin istenen noktalarini isaretlemek ve o noktalara baglanti koymak; dolayisiyla, dokuman icinde bir noktadan oteki noktaya atlamak mumkundur. Bunun icin <A NAME=web> Turkiye deki Webler </a> ornegindeki gibi isaretleyip sonra'da <a HREF="#web"> Webler ya </a> <a HREF="http://www.alfa.edu.tr/turkiye.html#web"> da Weblerin Listesi </a> seklinde baglanti koyabiliriz. Belirtilen dosya .html disinda her hangi bir dosya da olabilir: .gif, .jpeg, .txt v.s. sayet bu dosya turu bir MIME tipi ise ve `browser' onu taniyorsa gerekli islemi yapacaktir; aksi halde `default' dosya olarak islem gorecektir: yani .txt ya da .text sonekli dosya duz metin dosyasi olarak sergileyecektir. .gif, .jpeg, .xbm, .xpm degisik formatlarda resim (image) dosyalari, .mpeg film dosyasi, .au ses dosyasi, .Z ve .gz compress/gzip ile sikistirilmis dosya. 5.5 Headings, Paragraphs, Breaks Dokuman icinde <h2> Metin </h2> seklinde H1'den, h6'ya kadar baslik kullanabilirsiniz. Ana baslik icin H1, giderek alt basliklar icin h2, h3 seklinde kullanabilirsiniz. Iki paragrafi ayirmak icin <p> kullanabilirsiniz. HTML'da <p> .... <p> seklinde de kullanabilirsiniz. Basliklarda (H1,..), Listeleme elemanlarinda, <address> ve <blockquote> icin <p> koymak zorunda degilsiniz. <P> yeni bir paragraf baslatirken bir miktar fazladan bosluk birakir. <br> ise satiri orada keser ama fazla boslugu birakmaz. 5.6 Listelemeler 85 İrfan MACİT Bölüm 5 HTML Giriş HTML iki ana gurup olarak liste yapmaya izin verir: Tanimsal listeler ve normal listeler. Tanimsal listelerde 3 `markup' var:<DL> </DL> <DT> </DT> ve <DD> </DD>. DL liste gurubunu baslatir, `compact' argumani alabilir, sonucun daha derli toplu olmasini istemek icin. Daha sonra bir satirlik tanim iceren DT ve biraz icerden baslayan daha uzun olabilen ve tanimi aciklayan DD. DD kismi bos birakilabilir. bilkent.html'den ornek verirsek: (kisaltarak), ve biraz degistirerek <dl compact> Bilkent Services <dt> Bilkent Web-Cwis services <dd><ul> <li> <a HREF="http://www.bilkent.edu.tr/prv/bilkent-cwis/">Bilkent CWIS</a> | <a HREF="http://www.ug.bcc.bilkent.edu.tr/">Undergraduate </A> </ul> <dt> Bilkent Gopher Servers <dd><ul> <li><a HREF="gopher://gopher.bilkent.edu.tr">Main </a> </ul> <dt>Bilkent Library, Catalog, Phonebook etc : <ul> <li><a HREF="telnet://[email protected]">Bilkent Library - Bliss </A> Use <i>guest</i> for login <li>Phonebooks <a HREF="gopher://ns.bilkent.edu.tr:105/2"> Main via Gopher </a> </ul> <dt> Archives in Bilkent <dd> Bilkent Main Archive <ol> <li> <a HREF="ftp://ftp.bilkent.edu.tr/pub/">FTP Interface </a> <li><a HREF="http://www.bilkent.edu.tr/prv/ftp/">HTTP Interface </a> <li> <a HREF="ftp://ftp.cs.bilkent.edu.tr/">Bilkent CS Archive</a> <li> <a HREF="ftp://ftp.bups.bilkent.edu.tr/">Bups Mac Archive (Prep School) </a> </ul> </dl> Bilkent Services Bilkent Web-Cwis services • Bilkent CWIS | Undergraduate 86 İrfan MACİT Bölüm 5 HTML Giriş Bilkent Gopher Servers • Main Bilkent Library, Catalog, Phonebook etc : • Bilkent Library - Bliss Use guest for login • Phonebooks Main via Gopher Archives in Bilkent Bilkent Main Archive 1. FTP Interface 2. HTTP Interface 3. Bilkent CS Archive 4. Bups Mac Archive (Prep School) Diger liste mekanizmalari OL (sirali listeler icin) , UL, MENU ve DIR'dir. Her listeleme nesnesi • ile isaret edilir. Son 3'u arasindaki fark cok azdir. DIR'de liste nesneleri icin isaretleyici kullanmaz. <OL> <li> nesne-1 <li> nesne-2 <li> nesne-3 </OL> seklinde bir listelemede liste isaretleyici olarak 1., 2., 3. gibi sayilar goruruz. OL yerine UL kullandigimizda 1, 2, 3 yerine, web uygulama programina bagli olarak,`*', `bullet', kucuk kareler goruruz. 1. nesne-1 2. nesne-2 3. nesne-3 Bir metin icinde altini cizmek istediginiz kisimlari isaretlemek icin kullanabileceginiz: EM STRONG CODE ikilileri vardir. Normal olarak <EM> Italik </EM>, <strong> Siyah </strong> ve <code> type writer </code> seklinde sunulur. Ayni sekilde <CODE><SAMP> <KBD> <VAR> <DFN> <CITE></CODE> ciftleri arasina konan metin hem ``text'' seklinde gosterilir, hemde yer yer siyah, italik gibi yorumlar alir. Bunlarin hepsi mantiksal isaretlemelerdir, ve Web programi bunlari kendisi yorumlar. 87 İrfan MACİT Bölüm 5 HTML Giriş Fiziksel olarak adlandirilan bir diger gurup ise <CODE><TT> <B> <I> <U></CODE> ciftlerinden olusur. Bu tanimlar ise fontlar onceden secilmis, web istemcisine fazla secenek birakilmamis komutlardir. Sirasiyla, typewriter, siyah, italik, ve alti-cizgili (underline) fontlari belirler. Daha once de belirtigimiz gibi bilgisayar ciktilari, tablolar icin kolay bir yol <CODE><PRE> .. </PRE></CODE> isaretlemesini kullanmaktir. Bu gruplama icinde baslik, paragraf isaretleyici, tab (H1, P) kullanmamak gerekir ama <a HREF=url> .. </a> seklindeki capalari (anchor) kullanabilirsiniz. <Quotation> ikilisi ise belirtilen metni sayfanin iki tarafindan da yer birakarak iceriden yazar, ve bir yerden aktarilmis oldugunu gosterir. Alinti metnin onunde ve sonunda birer satir da bos birakir. (TeX'deki gibi bir yapisi vardir.) ADDRESS ikilisi ise adres belirtmek icin kullanilir: ya <address> <a HREF="adres.html"> M. Akgul </address> seklinde yada <address> M. Akgul <br> Bilkent University <br> [email protected] </address> M. Akgul Bilkent University [email protected] Cok kullanilan bir diger tanim ise mailto 'dur. <a HREF="mailto:[email protected]"> [email protected] <a> size [email protected] capasi olarak sunulur. 5.7 Resimler Resim dosyalarini web icinde sunmanin iki temel yolu var. Birincisi bir capa olarak sunmak ve kullanicinin kendi HREF="kampus.gif"> istegiyle Kampus secim Haritasi yapmasina olanak saglamaktir. <a </a> gibi. Bu resimler ayri bir pencerede gosterilir. Digeri ise metnin icine sikistirilabilen, metnin parcasi, arayuzu kolay, cekici, guzel 88 İrfan MACİT Bölüm 5 HTML Giriş yapmaya yoneliktir. <IMG SRC="dosya" ALIGN=yer ALT="alt" ISMAP> kullanilabilecek genel formattir. SRC disindakiler opsiyoneldir. ALIGN icin MIDDLE, BOTTOM ve TOP secilebilir. Goruntuyu etrafindaki metinle ortadan, alttan yada ust'den hizaya koyma komutudur. Hic ALIGN koymazsaniz alt esas alinacakdir. ALT parametresi, istemci resmi goruntuleyemedigi zaman ALT'de belirtilen yaziyi sunar. ALT="[Bilkent Logo]" gibi. ISMAP ise resmin ozel bir sekilde desteklendigini, uzerine fare ile isaretleyince sizi degisik URL'lerin isaret ettigi nesnelere baglayacagini belirtir. Tabii ki bu albenisi olan bir goruntu olur, hazirlamasi biraz uzmanlik ister. IMG'nin diger onemli bir fonksiyonu capa olarak kullanilmasindadir. Bir resmi adiyla tanitmak yerine kucuk bir kopyasini sunmak kullanici acisindan daha cekicidir: <a HREF="buyuk.jpg"> <IMG src="kucuk.gif" ALT="Cankaya"> </A> gibi. IMG icin kullanilacak goruntulerin .gif, .xbm, .xpm formatlarinda olmasi gerekir. Sadece netscape gibi yeni istemciler .jpeg dosyalarini metin icinde gosterebilirler. 5.9 Dokunmaya Hassas Resimler Web'de bir resmi (.gif dosyasini) kullanicinin nereye dokunduguna gore degisik URL'lere gondermek mumkundur. Bu kullanici arayuzu acisindan guzel ama hatlara biraz fazla yuklenebilir. Boyle bir mekanizmanin kurulmasi sunucu yazilimina ve bu is icin kullanilacak `cgi' programina baglidir. Biz burada esas olarak Ncsa imagemap programina gore anlatacagiz. Elinizde bir .gif formatinda bir resim, onun koordinatlari bilinen bolgelere ayrilmasi ve bu bolgeler icin URL'lerin tespit edilmesi gerekiyor. Bu koordinat ve URL bilgisi soyadi `map' olan bir dosyada tutuluyor. Boyle bir mekanizmayi calistirmak icin gerekli HTML parcasi: <a HREF="/cgi-bin/imagemap/path-to-map-file"> <IMG SRC="/path-to-gif" ISMAP> Tanitim </a> seklinde olmaktadir. `map' dosyasina basit bir ornek: default /examples/none.html circle URL1 313,28 313,44 poly URL2 298,93 251,26 300,0 453,0 rect URL3 336,119 436,261 89 İrfan MACİT Bölüm 5 HTML Giriş Ilgili .gif'i yaratmak, koordinatlari okumak vs icin, xpaint, mapedit, xv gibi programlari ve baskalarini kullanabilirsiniz. Daire (circle)'de merkezin ve cember uzerindeki bir noktanin koordinatlarini bildirmek gerekir. Bir polygon'da (poly) en fazla 100 nokta belirtebilirsiniz. Ilk nokta son nokta ile kendiliginden birlestirilir. Her noktanin $x$ ve $y$ koordinatlarini bildirmek yeterli olur. Dikdortgende (rect) ise ust-sol ve sag alt kosenin koordinatlarini bildirmek gerekir. Bunlarin disinda nokta (point) yontemide var; sadece noktanin koordinatini vermek gerekir. Bu yontemde en yakin noktanin ilgili URL'i kullanilir. `nokta'nin olmadigi durumda `default' disinda ilk uyan bolgeye ait URL islem gorur; hic uyan yoksa `default URL' kullanilir. mapthis gibi yeni programlar ile map dosyasini kolayca hzirlamak mumkundur. Yeni surum `browserlar' ve sunucular map dosyasindaki bilgiyi html dosyasinda sunup, yuku sunucudan, istemciye kaydirabiliyorlar. imagemap'in yapisinda bir farklilik oldu ve eskiye uyumlulugu saglamak icin, path-to-mapfile'da bazi kisitlamalar meydana geldi. Sayet bu patika bir eleman iceriyorsa, eski tur, yani imagemap'de derlenmis olan conf dizinine gore davaraniyor; sayet en az 2 eleman var ise, yeni sekliyle, map dosyasinin adresi olarak aliniyor. Aklinizda olsun. 5.10 Sayac Yerlestirilmesi Bir web dokumanina erisim sayisini dogrudan olcmek ve okuyuca sunmak icin cesitli mekanizmalar vardir. Normal olarak sunucu tum dokuman isteklerini, istemci programin adini, istemcinin geldigi makina ve URL'i loglara yazar. Su anda Bilkent'te kullanilan {\em wwwcount=.tar.gz} paketinden elde edilen {\bf Count.cgi} programidir. En basit kullanimi <IMG src="/cgi-bin/Count.cgi?df=isim.dat" align=absmiddle> </CODE> seklinde olabilir. Daha fazla bilgiyi dizininde bulabilirsiniz. Burada isim sizin login adiniz, yada ondan tureyen bir isim olmalidir. Bir diger ise, kendi home dizininizde basit bir {\em perl} programi calistirmaktir. Bir satirdan olusan .htaccess 90 dosyasini yaratin: İrfan MACİT Bölüm 5 HTML Giriş AddType text/x-server-parsed-html .html ve herkesin okuma izni olsun. Icinde {\bf 1} sayisinin oldugu adi {\bf countfile} olan bir dosya yaratin. ve {\bf count.cgi} dosyasini yaratin: #!/usr/local/bin/perl open (COUNT, "countfile"); $counter = ; # open "countf" counter file # input value from file close (COUNT); # close file (primarily to "re-set") open (COUNT, ">countfile"); # open "countf" for 'output' print COUNT ($counter1); # increment value of counter by one & write close (COUNT); # close file print $counter; # put the value on the page Daha sonra sayiciyi istediginiz yerde i<!--#exec cmd="./count.cgi" --> seklinde kullanin. ftp://ftp.bilkent.edu.tr/pub/UNIX/Internet/Web/Count/ dizininde gerekli kaynak ve dokumentasyon vardir. 5.11 Tablolar Tablolar <table> .. </table> cifti arasina gerekli tanimlar ve bilgiler giriler. Tanim ve bilgiler satir esasina gore girilir : (table row) bir satirin basladigini belirtir. Bir satirdaki, farkli elemanlari ise veri (table data) isaretleyicileri ile belirtiriz. Ornegin 2 satiri 3 sutunu olan bir tablo yada matriks'i soyle gosteririz: <table> <tr> <td> 1-1 </td><td> 1-2 </td> <td> 1-3 </td> </tr> <tr> <td> 2-1 </td><td>2-2 </td><td> 2-3 </td> </table> <BR> <table border> <tr> <td> 1-1 </td><td> 1-2 </td> <td> 1-3 </td> </tr> <tr> 91 İrfan MACİT Bölüm 5 HTML Giriş <td> 2-1 </td><td>2-2 </td><td> 2-3 </td> </table> 1-1 1-2 1-3 2-1 2-2 2-3 1-1 1-2 1-3 2-1 2-2 2-3 <table border cellpading=5 cellspacing=10> <tr> <td> 1-1 </td><td> 1-2 </td> <td> 1-3 </td> </tr> <tr> <td> 2-1 </td><td>2-2 </td><td> 2-3 </td> </table> 1-1 1-2 1-3 2-1 2-2 2-3 <table border cellpading2> seklinde bir tanim, tabloya cerceve cizilmesini ve ortaya cikan tablo elamanlari arasinda 2 birimlik bir bosluk istemektedir. Tablo basliklarini <TH> Baslik .. </TH> isaretleyici arasina koymak mumkundur. Bu basliklarin Koyu harflerle yazilmasini sagalayacaktir. <TH ALIGNLEFT COLSPAN2> Baslik </th> orneginde Baslik iki sutuna yayilacak ama sola yapisacaktir. ALIGNLEFT yerine alignright (sag) kullanilabilir. Bir sey belirtilmeyince, ortala anlamina gelmektedir. Bir tablo elemanini <td> bir <br> iki </td> seklinde ikiye ayirmak mumkundur. Ayni satirdaki diger elemanlar ortadan hizaya konacaktir. colspan komutuna paralel olarak rowspan komutunu bir tablo elamaninin ayni sutunda birden fazla satira yayilmasini sagalmaktadir: 92 İrfan MACİT Bölüm 5 HTML Giriş <TABLE BORDER CELLPADDING=2> <TH ALIGN=LEFT>Language</TH> <TH ALIGN=LEFT COLSPAN=2>Encapsulation <BR> </TH> <TR> <TD> Ada 95</TD> <TD ROWSPAN=2>Using</TD> <TD> Class</TD> <TR> <TD> C</CODE></CODE></TD> <TD> Package</TD> </TABLE> Language Encapsulation Ada 95 Using C Class Package 5.12 CGI ve Formlar Bir web sunucunda `cgi-bin' dizinindeki programlar, shell, perl vs scriptleri kullaniciyla etkilesime girebilirler; kullanicidan tarama icin kelime isteyip, o kelimeler icin yapilan tarama sonuclarini kullaniciya sunabilir. Gene bir web sunucu kullaniciya tarama icin basit kelime girmesini istemenin disinda karmasik secenekler sunabilir ve kullanicidan paragraflar dolusu girdi alabilir. Bunlar birbirine baglidir, ikisi de cgi-bin'den bir program kullanmak zorundadir. Bir html dosyasinda tarama olanagi oldugunu istemciye bildirmenin yolu Bu dizinde arama yapabilirsiniz. Aramak yazın: 93 istediğiniz anahtar sözcükleri İrfan MACİT Bölüm 5 HTML Giriş yapisinin bulunmasi. Bunu goren istemci program, sorgulama penceresini/mekanizmasini alir ve sonucu sunucuya gonderir. Tarama yapip sonucu gene istemciye sunmak sunucunun gorevidir. Bir URL'nin sonunda ? ve ?keyword bulunabilir. Daha dogrusu, istemci bazi anahtar kelimeleri sunucuya bu sekilde bir URL ile gonderir. NCSA cgi-bin'de gelen finger programina bakalim: #!/bin/sh FINGER=/usr/ucb/finger # burayi denetle ! echo Content-type: text/html echo if [ -x $FINGER ]; then if [ $# = 0 ]; then cat << EOM 5.13 Finger Gateway Bu dizinde arama yapabilirsiniz. Aramak istediğiniz anahtar sözcükleri yazın: This is a gateway to "finger". Type a user@host combination in your browser's search dialog. EOM else echo \ $FINGER "$*" 94 İrfan MACİT Bölüm 5 HTML Giriş echo \ fi else echo Cannot find finger on this system. fi cat << EOM EOM http://www.alfa.edu.tr/cgi-bin/finger URL'ine erisen bir istemci icin sunucu ?keyword olmadigini gorecek ve yukaridaki scriptin ilk yarisini istemciye sunacaktir. Istemci program ISINDEX'i gorup sorgulama mekanizmasini harekete gecirecek, ve kullanici ekraninda sunu gorecektir: 5.14 Finger Gateway Bu dizinde arama yapabilirsiniz. Aramak istediğiniz anahtar sözcükleri yazın: This is a gateway to "finger". Type a user@host combination in your browser's search dialog. kullanicinin doldurdugu `user@host' seklindeki bilgiyi sunucu bilgisyardaki bulunan `finger' programina gecirecek, onun sonucunu da tekrar istemciye sunacaktir. Buna cok benzeyen ayni basitlikte bir archie gecit programi da vardir. Belirli bir dosya uzerinden `grep' taramasi yapan bir script ise: #!/bin/sh echo Content-type: text/html echo if [ $# = 0 ] then echo "<HEAD>" 95 İrfan MACİT Bölüm 5 HTML Giriş echo "<TITLE>UTIRC Phonebook Search</TITLE>" echo "<ISINDEX>" echo "</HEAD>" echo "<BODY>" echo "<H1>UTIRC Phonebook Search</H1>" echo "Enter your search in the search field.<P>" echo "This is a case-insensitive substring search: thus" echo "searching for 'ian' will find 'Ian' and Adriana'." echo "</BODY>" else echo "<HEAD>" echo "<TITLE>Result of search for \"$*\".</TITLE>" echo "</HEAD>" echo "<BODY>" echo "<H1>Result of search for \"$*\".</H1>" echo "<PRE>" grep -i "$*" /u/www/Webdocs/Personnel echo "</PRE>" echo "</BODY>" fi (Burada <'nin < demek oldugunu belirtelim.) Diyelimki bu script'i cgi-bin/grep-per adiyla sakliyoruz ve modu 0755. http://sunucu/cgi-bin/grep-per URL'ini gonderen bir istemciye {\tt if .. else} arasindaki kisim gonderilir. Istemci o zaman bunun taranabilen bir dosya oldugunu anlayip (ISINDEX) kullaniciya tarama mekanizmasini sunacaktir. Kullanici istedigi kelimeyi dolduracak; istemci bunu sunucuya gonderecek. Bu defa else .. fi gecerlik kazanacak, ve bu arada grep -i "$*" /u/www/Webdocs/Personnel islemi sonucu olusan cikti da istemciye gonderilecektir. Sayet bu `script'i kullanmak isterseniz, /u/www/Webdocs/Personnel kismini degistirmek yeterli olacaktir. Yanliz bu `script'in guvenli olmadigini, kullanicidan gelen kelimeleri bir suzgecden gecirmeden shell'e iletmenin tehlikeleri oldugunu belirtmek isterim. Bu script'i perl ile yapmak ve istemciden donen kelimeleri bir guvenirlilik suzgecinden gecirmekte yarar vardir. Bu tip bir perl script'i bu kitapciktaki diger orneklerle birlikte Bilkent arsivinde bulmak mumkundur. Form'lar kullanicinin bos kisimlarini doldurup sunucuya sunabilecegi bu sekille otomatik kayit, gorus bildirme, ankete katilma, sinav yapma gibi olanaklar sunmaktadir. Basit bir ornek olarak: 96 İrfan MACİT Bölüm 5 HTML Giriş <FORM ACTION="url" METHODPOST> First entry field: <INPUT NAME="entry1"> <P> Second entry field: <INPUT NAME="entry2"> <P> Third entry field: <INPUT NAME="entry3"> <P> To submit the query, press: <INPUT TYPE="submit" VALUE="Submit Query">. <P> </FORM> Bunu ise lynx'de soyle gorursunuz First Second Third entry field: entry entry ____________________ field: ____________________ field: ____________________ To submit the query, press Submit Query First entry field: Second entry field: Third entry field: To submit the query, press: Submit Query . Yetenekli istemci programlari burada gordugunuz bu formu cok daha guzel bir sekilde sunacaktir. Web sunucusu kullanicinin doldurdugu bilgileri ACTION'da belirtilen URL'e iletir. Sayet ACTION belirtilmediyse, formu iceren html dosyasi bu bilgiyi ne yapacagini bilmesi gerekir. ACTION'da belirtilen URL'in gosterdigi program bu bilgiyi ne yapacagini bilmek zorunda. Isin en zor tarafi orasi. METHOD girilen enformasyon ilgili URL'e iletim seklini belirtir. POST ve GET yontemleri var su anda. GET basit formlar icin uygundur; kullanicinin yazdiklari ilgili URL'e `?girdiler' 97 İrfan MACİT seklinde Bölüm 5 HTML Giriş eklenerek iletilir. Bu arada bosluklar `' <ACTION="http://www.alfa.edu.tr/cgi-bin/mypost" forma Mustafa ile yer degistirilir. METHOD=GET> ise ve kullanici yazdiysa, Akgul Ornegin istemci CODEhttp://www.alfa.edu.tr/cgi-bin/mypost?MustafaAkgul| URL'ini kullanir. `mypost' programinin ? ve sonrasini ne yapmasi gerektigini bilmesi gerekir. ISINDEX'de ayni sey gecerlidir. GET yonteminde bu bilgi QUERY_STRING cevresel degiskeni icinde verilir. Baska hangi cevresel degisken oldugunu gormek isteyenler her hangi bir NCSA sunucusuna http://sunucu/cgi-bin/test-cgi gondersinler, ornegin Bilkent'e. POST yonteminde girdiler `standart input'da verilir. Girdinin buyuklugunu CONTENT_LENGTH cevresel degiskeninden ogrenebilirsiniz. Doldurulacak formda her degiskenin yada boslugun bir adi vardir. Bu bosluk adi - girilen deger cifti `namevalu' ciftleri aralarina \& koyarak iletilir. Yukaridaki ornekde kullanici `birinci', `ikinci', `ucuncu' girdilerini verdi ise, ilgili cgi programina entry1=birinci&entry2=ikinci&entry3=ucuncu iletilir. Formlarda doldurulacak bir satir icin kullanilan bazi `tag'ler: <INPUT NAME="isim" VALUE="default" SIZE="sayi" MAXLENGTH=Sayi TYPE=tipi>. `isim' ilgili `action' programinin kullanacagi degiskenin adi olacaktir. VALUEdefault, sayet kullanici o satiri doldurmazsa, `isim' degiskeninin alacagi deger'i belirtir. SIZE degiskeni ekranda kac karakterlik yer ayrilacagini belirtir. Kullanicinin yazabilecegi en fazla deger, sayet verildiyse, MAXLENGTH sayisidir. TYPE ise Text, Number, Password, Checkbox, Radio, Submit, Reset degerlerinden biri olmak zorundadir, belirtilmeyince `text' kabul edilir. Normal olarak ilk 3 tip doldurulacak metin olarak, son dordu ise secilecek dugme/kutu olarak sergilenir. Bazi ornekler verirsek: <H1>BILKENT UNIVERSITY PHONE BOOK</H1> (This form will send a PH query to Bilkent ph server.) <HR> <FORM ACTION="http://www.bilkent.edu.tr:80/cgi-bin/phf"> <H4> At least one of these fields must be specified:</H4><UL> <LI><INPUT TYPE="text" NAME="Qname" MAXLENGTH="256"><B> NAME </B> 98 İrfan MACİT Bölüm 5 HTML Giriş <LI><INPUT TYPE="text" NAME="Qtitle" MAXLENGTH="256"><B> TITLE </B> <LI><INPUT TYPE="text" NAME="Qdepartment" MAXLENGTH="256"><B> DEPARTMENT </B> <LI><INPUT TYPE="text" NAME="Qoffice_phone" MAXLENGTH="60"> <B> OFFICE PHONE NUM </B> </UL> <INPUT TYPE="submit"> </FORM> <P> Press <A HREF=./phone_book.help.html>here</A> for help. And <A HREF=./phone_book.info.html>here</A> for info on phone data. BILKENT UNIVERSITY PHONE BOOK (This form will send a PH query to Bilkent ph server.) At least one of these fields must be specified: • NAME • TITLE • DEPARTMENT • OFFICE PHONE NUM Sorguyu Gönder Press here for help. And here for info on phone data. Isim, adres, ve `comments' isteyen bir form: <FORM METHOD="POST" ACTION="/cgi-bin/comments"> Isim: <INPUT text NAME="isim" size=36><br> Email: <input text <textarea name="eposta" size=36> <p> name="oneri" ROWS=8 COLS=40></textare> <p> <input type="submit" Value="Gonder"> <input type="reset" Value="Formu Tazele"> 99 İrfan MACİT Bölüm 5 HTML Giriş </FORM> Isim: Email: </textare> <p> <input type="submit" Value="Gonder"> <input type="reset" Value="Formu Tazele" </FORM> <hr><hr> <p> <h3>Dugmelere ornek kismi </H3> <PRE> Bu dokumanda anlatılanlar Sayın Doç. Dr. Mustafa Akgül’ün yazdığı notlardan derlenmiştir. Türkiyede interneti geliştirme çabalarından dolayı kendisine ve şu anda burada yazamadığım kadar çok kişiye ayrıca teşekkür ederim. 100 İrfan MACİT Bölüm 6 PHP Betik Dili Bölüm 6 PHP Betik Dili 6.1 Giriş Rasmus Lerdorf tarafından 1990’lı yıllarda öncelikle kendi kişisel web sayfalarını yazmak için geliştirilmesi nedeniyle 'P'ersonal 'H'ome 'P'ages adının kısaltması olarak karşımıza çıkan PHP, HTML gömülü (HTML-embedded) bir script dilidir. özellikle web uygulamaları geliştirenlerin dinamik ve havada (on the fly) üretilen web sayfalarını hızlı bir şekilde yazmaları için düşünülmüştür. Dilin sentaksı gelştirilirken C, Java ve en çok da Perl'den esinlenilmiştir. Bu nedenle bu dillerden her hangi birisini bilen bir kullanıcı için PHP'ye geçmek hiç de zor olmamaktadır. PHP’nin çok tutulması üzerine web tasarımcılarının çok ihtiyacı olan, yani form yoluyla ziyaretçiden gelen bilgileri işlemeyi sağlayan eklemeler yapılarak adına PHP/FI (Form Interpreter) adını aldı. Kimileri tarafından programın bu versiyonu PHP2 olarak adlandırıldı. 1995 yılının ortalarında PHP Lerdorf’un kurmuş olduğu bir grup tarafından daha da geliştirildi. Bu sefer Perl dilindeki fonksiyonlardan tamamen arındırılmış ve Object Oriented (Nesneye Dayalı) bir dil haline getirildi. Günümüzde PHP4 versiyonu geliştirilmiş durumdadır. PHP dili Linux gibi Açık Kaynak Kodlu bir dildir ve ücretsiz olarak dağıtılmaktadır ve geliştirilmektedir. Linux, Unix, Windows tabanlı işletim sistemlerinde çalışabilen versiyonları mevcuttur. Bir çok kitapta bulunan uygulamaların internet üzerinden temin edilebildiğinden dolayı bu konuda çok fazla örnek verilmeyecektir. 6.2 PHP Nedir PHP bir betik dilidir. Betik dili programlama açısından bakıldığında program kodları değişiklik yapıldığında herhangi bir derleyiciye gerek kalmadan anında yorumlayıcı tarafından işlenrek sonucun görülmesine olanak tanır. Derleyici gerektiren programlama dillerinde yapılan kodl değişikliklerinde sonucu görebilmek için derleyici ile kodlar derlenir ve çalıştırılır. PHP programlama dilinde yazılan kodlar herhangi bir editörde yazılıp .php veya .php3 şeklindeki uzantılı dosya olarak kaydedilir. Daha sonra bu kodları işleyecek bir web 101 İrfan MACİT Bölüm 6 PHP Betik Dili sunucu veya PHP derleyici ile çalıştırılırlar. Web sunucuda çalışrıtılacak olan php kodları için web sunucunun php yprumlayıcısının nerede olduğuna dair yer bilgisine ihtiyacı vardır. Microsoft IIS web sunucu için gerkeli olan bir .dll (php4isapi.dll) uzantılı dosyanın web sunucuya tanıtılması ile gerçekleşir. Bu .dll uzantılı dosya web sunucu tarafından .php uzantılı dosyaların çlıştırılması için gerekli olan yorumlayıcı bilgisini tutar. Unix ve Linux sistemlerindeki web sunucusunda ise durum daha farklıdır. Bu tür sistemlerde .php uzantılı dosyaların çalıştırılması için egerekli olan yer bilgisinin verilmesi ve php ortam değişkenlerinin web sunucu için belirlenmesi ile php kodları web sunucu tarafından çalıştırılır. . 6.3 PHP Dosyaları Web Sunucuda Çalıştırılması PHP programlama dilinin bir web sunucusu üzerinde çalıştırılması işleim için .php uzantılı dosyaların web sunucu tarafından tanınmasını sağlayacak gerekli dosyal işlemlerinden önceki bölümde bahsetmiştik. Bu işlemlerden sonra .php uzantılı dosya web sunucuda nasıl çalışır sorusu aklımıza gelmektedir. PHP kodları herhangi bir edtör programnı ile yazıldığı gibi sadece php program kodlarını yazmak için geliştirilmiş php editörleri de vardır. Bir çok programcı bu hazır php ediötlerini kullanmaktadır. PHP ile yazılmış kodları web sunucuda çalıştırmak için web sunucu dizinine kopyalanan .php uzantılı kodlar yorumlayıcı yardımı ile web sunucu tarafından istek gelmesi halinde işlenirler. İnternet üzerinden bir istemci web sunucusu üzerindeki yazılmış olan bu kodlara ulaşır ve bir istek yapar. Oluşan istek web sunucu tarafından işlenir ve gerekli olan php kodları çalıştırılır daha sonra web sunucuya php yorumlayıcı tarafından gönderilen işlenmiş php kodları web sunucu tarafından istemcinini bilgisayarına gönderilir. 6.4 PHP ile Kurallı İfadeler Bütün bilgisayar programlama dillerinde olduğu gibi php betik dilinde program yazmak için komutları kurallara uygun olarak yazmak gerekir. PHP yorumlayıcısı Zend-çekirdeği adı verilen bir betik dili teknolojisi yardımı ile işletim sistemine uyumlu betik dili programları çalıştıran bir teknolojidir. Web sunucular üzerinde php kodları geliştirmek için önce düzenli komut yazım kurallarını gösterir bir php editörüne ihtiyaç vardır. PHP editörleri konusunda internet üzerinde bir çok bedava ve ücretli php kod üretici yazılımlar 102 bulunabilir. Bunlardan birisi İrfan MACİT http://sourceforge.net/projects/devphp Bölüm 6 PHP Betik Dili adresinde bulunan php kodlarını geliştirmek için kullanılan php geliştirici çevresi (Php Developer Environment) olarak bilinen programlama geliştirme aracıdır. Bu türden bir çok paylaşımlı projede php kodlarını üretebilir ve geliştirdiğiniz bu kodları denereyerek hangi sonuçları verdğini görebilirsiniz. Web sunucu üzerinde bu tür kodları görebilmenirde mümkündür. Php geliştirici ortamı (PHP_Dev) size bu konuda yardımcı olmaktadır. Bu türden paralı olarak bilinen yazılımların en gelişmişlerinden birisi MacroMedia firmasının DreamWeaver programındır. Bu programda geliştirdğiniz bilgisayar programını gerekli ayarlamalar yaptıktan sonra yazdığınız kodları web sunucunuzun üzerinde anında görebilirsiniz. PHP betik dilini HTML kodları içine gömerek web sunucusunda bir html kodu gibi çalıştırabiliriz. Bunun için html etiketleri içerisinde uygun tanımlamaları yapmalıyız. HTML kodları içerisine bu kodları gömerken dikkat etmemiz gereken en önemli husus html kodlarını çalıştıran web sunucuya “bu bir php kodudur” mesajını göndermektir. Bu işlem için aşağıdaki şekilde bildirim yapmamaız gerekir. <html> <?php //Yazılacak php komutları (6.1) ?> </hmtl> PHP kodları html içerinsinden çalıştırılması için daha önceden gerekli olan ayarlarmaların yapılması gerektiğinden bahsetmiştik. Web sunucusu bu türden komutları gördüğünde yazılacak php komutlarındaki alanları php yorumlayıcısına gönderir ve yorumlayıcıdan gelen sonuçları istemci bilgisayarına gönderir. Windows işletim sistemi platformundaki web sunucularında php.exe yorumlayıcının bulunduğu yerin tanımlanması gerekir. Linux ve unix platformlarında php yorumlayıcısının oluduğu yer ve ortam değişkenleri dikkatlice tanımlanmalıdır. PHP yorumlayıcı dili internet üzerinde web sunucusu programlamada daha fazla kullanılmaktadır. Bu tür web sunucularında işlemler php derleyicisi tarafından işlenerek web sunucusuna gönderilir. Web sunucusu tarafında çalışan bu tür istekler SSI (server Side Include) tekniği olarak ta adlandırılır. İnternet gezgini yazılan bü php programlama kodlarını 103 İrfan MACİT Bölüm 6 PHP Betik Dili istek olarak web sunucusuna gönderir ve web sunucusu değişkenlerden bunun bir php programlama kodlarını oluduğunu anlar ve bu kodları yorumlayıcıya gönderir. Daha sonra bu gönderilen kodlar asp kodları gibi php derleycisi tarafından işlenir ve web sunucusuna gönderilir. Web sunucusu işlenen verileri istemcinin bilgisayarına gönderir ve işelem bitmiş olur. Bu işlemin sonucunda kaynak kodları html programlamada olduğu gibi kodlar istemci tarafından görüntülenemez. İstemci sadece sonuçları gördüğünden kaynak görüntüleme şansı yoktur. Bu tür programların bir avantajıda yazmış olduğunuz programlar ve kodları başkaları tarafından görüntülenememektedir. Internet alt yapınız, teknik donanım, vertabanı dosyalarınız ve web sunucusu ile ilgili temel bilgileriniz gizli kalmış olur. Html aynı zamanda web sunucusu üzerinde bulunan veritabanı dosyaları ve ilgili bağlantılar ve bunlar ile ilgili bilgileri istemci bilgisayarında görüntüleme işlemini gerçekleştiremez. Bu işler için web taraflı işlem yapabilen yorumlayıcı dillere ihtiyaç duyulur. Bu türden işlemleri yapılabilmesi için sunucu taraflı dillerin aynı zamanda geliştirilmesi kolay ve güvenilir olması gerekir. C++ gibi bilgisayar programlama dilleri çok güvenli olmasına rağmen geliştiriciler için bazı durumlarda güçlük çıkarmaktadır. Php gibi dillerde bu türden problemler ortadan kaldırılmaktadır. İstemciler web sunucularından her zaman aynı türden ve aynı işletim sisteminden istemde bulunmazlar. Kişisel bilgisayr kullanıcılarının işletim sistemlerinden internet gezginlerine kadar tüm programları farklıdır. Bu farklılıklar istemcilerin web sunuculardan istediği bilgileri ve istem şeklinide değiştirmektedir. Internet gezginleri ortak bir dil olan html yanında diğer istek ve işlemleri gerçekleştirecek web taraflı betik dillerini ortak dil konuşulması açısından da fayda sağlamaktadır. Betik dili açısından bakıldığında geliştirme ve uygulama aşamaları olduş-kça kolaylaşabilir. İstemci tarafından bakıldığında ise bazı betik dillerini bazı internet gezginleri desteklememktedir. Bu tür betik dili desteğinin olmayışı görüntülenecek olan sayfalarda hataların ortaya çıkmasına neden olur. Microsoft VisualBasic script’ler mozilla ve mozillar tabanlı (Netscape) gezginlerde görüntülenemektedir. Aynı şekilde Opera internet gezgininde java desteğinin olmayışı da bu tipten sorunların ortaya çıkmasına sebep olmaktadır. 6.5 PHP Windows İşletim Sistemine Kurulumu Windows işletim sisteminde php yorumlayıcısını çalıştırmak için http://www.php.net/downloads.php internet adresinden php yorumlayıcısını sabit diskimize indirip kurabiliriz. Php PHP 5.0.4 zip package adlı dosya içerisinde windows 9X/NT/2K/XP işletim sitemlerinin hepsinde çalışacak şekilde paketlenmiştir. Indirme sayfası bizi bir yansı 104 İrfan MACİT Bölüm 6 PHP Betik Dili sayfasında yönlendirecek ve biz buradan kendimize en yakın yansıdan php yorumlayıcısını indirebiliriz. Indirilen dosyayı sabit diskimiz üzerinde açacağımız geçici bir dizine (C:\TEMP) kopyalarız. Bu kopyalama işleminden sonra kurulum için genel olarak C:\PHP dizini kullanılacağından bu isimde bir dizin açılır. Bu belirlenen C:\PHP dizinine php yorumlayıcısı kopyalanır ve çevresel değişkenlere bu açılan dizin yolu belirtilir. 6.5.1 IIS 4.0 ve IIS 5.0 Web Sunucusu Üzerinde İşlemler Windows NT veya Windows 2000 işletim sistemi üzerinde kurulu olan IIS (Internet Information Server ) web sunucusu için php.ini yapılandırma dosyasında aşağıdaki ayarlamaları yapmamız gerekir. Noktalı virgül olan yerleri yapılandırma dosyasında yok sayılcağı için gezgin kabiliyeti (Browser Capability – browscap) dosyasının önündeki noktalı virgülü kaldırın. extension_dir=C:\PHP browscap = c:\Windows\browscap.ini ; Buraya windows kurulu dizin ismi olacak şekilde ayarlayın. Bu dosya Windows işletim sistemi göz atıcı (browser) ayarlarını ve parametrelerinin tutulduğu dosyadır. Windows işletim sisteminde web sunucusu (IIS) ayarlarının olarak bilinen API ayarlarının yapılması için IIS Services Manager yönetim programını açarak Default Web Server sekmesi (tab) kısmında properties (seçenekler) kısmını tıklayın. Burada açılacak olan menüden home directory kısmına tıklayın, daha sonra Configuration düğmesine tıklayarak yeni bir Application Mapping ekleyin. Executable kutusuna PHP4isapi.dll dosyasının tam dizin yolunu yazın ve extension kısmına .php (Windows işletim sisteminde çalışacak uzantı olacak şekilde) yazdıktan sonra script engine (çalışma motoru) işaret kutusunu işaretleyin. Windows işletim sistemi ISAPI filtes kullanarak web sunusunun kullancağı filtreleri belirlemektedir. Bu işlem için yine az önceki uzantı ekleme işlemine kadar olan menü işlemlerini tekrarlayarak ISAP Filters kısmına girin, daha sonra PHP4ISAP.DLL dosyasının bulunduğu ( genellikle bu yol C:\PHP4\PHP4ISAPI.DLL şeklindedir ) yolu yazın. Bu işlem işlem ile web sunucu filtreleme işlemini gerçekleştirecektir. Bu işlemlerden sonra web sunucusunu (IIS) Internet Services Manager menüsünde bulunan stop (durdur) düğmesinden durdurup tekrar aynı menüden aktif hale gelen start ( başlat) tıklayarak yeniden başlatın. Bu işlemlerden sonra web sunucusu (IIS) php yorumlayıcıyı çalıştırmaya hazır duruma gelmiştir. Web sunucusu tekrar çalıştırılarak yapılan ayarların aktif hale gelmesi sağlanır. 105 İrfan MACİT Bölüm 6 PHP Betik Dili 6.6 PHP Unux/Linux İşletim Sistemine Kurulumu Bilindiği gibi Linux işletim sistemi geliştiricileri işletim sistemini GNU lisansı ile bedelsiz dağıtmaktadırlar. Bir çok program gelişitirme aracı da bedelsiz olarak dağıtılmaktadır. Bu programlama araçlarından biriside PHP yorumlayıcısıdır. Bir çok dağıtımda artık standart haline gelmiş olan php yorumlayıcısı işletim sistemi kurulurken direk sisteme kurulmaktadır. Bu yüzden Linux/unix türevi işletim sistemlerinde çok fazla bir değişiklik yapmadan php yorumlayıcıları Linux/unix işletim sistemleride problemsiz çalışmaktadır. Linux dağıtımı ile gelmeyen php yorumlayıcısı elde etmek ise çok kolaydır. İnternet üzerinden elde edilebilen php yorumlayıcısı http://tr2.php.net/downloads.php adresinde temin edilebilmektedir. bu adresten elde edilen program Linux veya diğer işletim sistemlerine oldukça kolay kurulmaktadır. 6.7 PHP Betik Dili Betik dilleri 1980 ve 1990’lı yıllarda çok fazla kullanılan bilgisayar yazılımlarıydı. Betik dillerinin en önemli özelliği derlenmesine gerek kalmadan düz yazı şeklinde yazılan bilgisayar programlama komutlarını yazarak yorumlayıcıya parametre olarak verildikten sonra yorumlayıcını bu yazılan düz yazı şeklindeki komutları işleyerek sonuca ulaşmaktadır. Betik dilleri genellikle bir yazı düzenleyici (text editor) programı yardımı ile yazılır ve sonuçları biligisayar ekranına veya saklanmak istenen ortama göre saklamaktadır. Değişik işletim sistemlerinde çalışacak php yorumlayıcı kendi sürümüne göre çevresel değişkenlerinin alacağı ayar ve değerleri farklı olmaktadır. Ayar ve yapılandırma dosyalarından program çalışırken yorumlayıcının yeri bildirilmektedir. Bölüm 6.4’te verilen yazım ifadesine göre komutlar web sunucu üzerinden 6.1’de görüldüğü gibi yazılmaktadır. Genellikle php yorumlayıcısı web sunucularda kullanılmaktadır. Gün geçtikçe php yorumlayıcısı web sunucuların vazgeçilmez tamamlayıcısı haline gelmektedir. Php yorumlayıcısı komutları araken yazı dosyasının içerisindeki ilk baktığı komutların yazılı olduğu ayraç kısmıdır. Bu kısımda şkş şekilde yazılabilmektedir. Uzun ayraç ve kısa ayraç yazım şekli, uzun ayraç şeklinde yazım 6.2’de görüldüğü gibidir. <? Php PHP komutları …… (6.2) ……. ?> 106 İrfan MACİT Bölüm 6 PHP Betik Dili Kısa ayraç şekli ise 6.3’de görülen yazım şeklindedir. Bu şekilde yazılan pph komutlarının uzun şekilde yazılanlardan bir farkı bulunmamaktadır. <? PHP komutları ……… (6.3) ………. ?> Php yazım kurallarında kısa şekilde yazılan ayraçlarda başka bir programlama dilinde dışarıdan çağırma veya XML gibi yeni nesil web arayüzü programlama dillerinde kullanılmaması tavsiye edlimektedir. Diğer web arayüz programlama dillerinde bazı başlık ve etiket bildirimleri 6.3 te gösterilen kısa ayraç şekliden çalışmamaktadır. Bu durumun önlenmesi için php.ini dosyasının içindeki short_open_tag = on satırını aşağıdaki şekilde değiştimek yeterlidir. Değişiklik yapıdıktan sonra php oyırmlayıcısı kısa ayraç şekliden çalışmayacaktır. short_open_tag = off kısaca verilen bu bilgilerden sonra klasik merhaba dünya programı yazımı ise aşağıdaki gibidir. Bu yazım şeklinde web sunucuna betik dilinin php olduğunu hatırlatacak bir satır daha ekliyoruz. Bu satır web sunucusuna du dosya içerisinde yazılı olan betik dilinin php olduğunu hatırlatmaktadır. Aşağıdaki program parçacığını merhaba.php adı ile saklayalım. <html> <SCRIPT LANGUAGE = “php”> print (“merhaba dünya”); </script> </html> Web sunucusunun çalıştığı kök dizine veya bize ayrılan web sunucu dizinine merhaba.php dosyasını kopyalayalım. Web sunuucusunua bağlanarak kök dizinde internet göz atıcısı (internet browser) ile adres kısmına merhaba.php yazarak enter tuşuna bastığımızda göz atıcının ekrana “merhaba dünya” yazısını getirdiğni görürüz. 107 İrfan MACİT Bölüm 6 PHP Betik Dili 6.8 Php Programlama 6.8.1 Değişkenler Bütüm bilgisayar programlama dillerinde işlemleri yaptımak için bilgisayar programında işlenecek olan değeleri elde etmek için programlama değişkenleri kullanırız. Bu değişkenler programlama yaparken işleyeceğimiz verilerin program içerisinde bir veya birden fazla değişmesine olanak sağlayan yapılardır. Değişkenlerin en önemli özelliği kullanılmadan önce tanımlanması gerekir. Her değişken kullanılacağı tipe göre belirlenmelidir. Nesne yönelimli bilgisayar programlama dillerinde her değişkenin belirlendiği tipten başka bir tipte kullanılması doğru değildir. Php programlamada ise değişkenleri böyle bir zorunluluğu yoktur. Php’de değişken tanımlamak için değişken olarak tanımlanan karakter ve karakter dizisinin önüne $ işareti koyarak yaparız. Aşağıdaki örneklerde php içerisinde kullanmadan önce tanımlanan değişkenler verilmiştir. $adi; $soyadi; $ögrenci_no; $sira_no; $_alfa; $_gamma_func; Yukarıda verilen değişkenlerin içerdiği değerler farklı türlerde olabilir. Değişkelerin alabileceği değerler karakter, sayı ve değişken içeriğide olabilir. Aşağıda verilen örneklerde değişkelere değer atanması ile ilgili örnekler görülmektedir. $adi = ”ahmet”; $soyadi = “ak”; $ogrenci_no = “2005238000”; $sira_no = “000001”; Değişkenlere değer atamanın yapılmasından sonra değişkelere atanan değerlerin okunması işlemini gerçekleştirmek için print php komutu kullanılır. Değişkenler program içerisinde aldığı değerleri program sırasında veya program sonlandıktan sonra görmek istersek print komutu ile değişkenin o an için aldığı değerleri görebiliriz. 108 İrfan MACİT Bölüm 6 PHP Betik Dili Print $adi ahmet Php’de değişken değerleri yazdırılırken bir başka değşkeninde değeri veya kendiside yazdırılabilir. Örneğin bir değişkene değer atayalım daha sonra bu değişkeni bir başka değişkene atayalım ve bu değeri ekrana yazdıralım. $adi = “ahmet”; $_ad = “adi” ; print $$_ad; Bilgisayarın göz atıcısı ekrana ahmet yazısını çıkaracaktır. Php yorumlayıcısı iki $$ (dolar) işaretini görünce bunun bir değişken yardımı ile başka bir değişkeni tuttuğunu anlayacak ve diğer değikenin hafızadaki değerini ekrana yazdıracaktır. Bu komutları fonksiyonel şekilde yazmak istersek ağağıdaki gibi yazabiliriz. Komutların yazılması sonucunda ekrana üç ahmet yazısı yazılacaktır. $adi = “ahmet”; $_ad = “adi” ; print $$_ad; print “${$_ad}”; print “${‘adi’}”; bu yöntem de değişken değerleri durağandır. Değişkenlerin değerleri dinamik olarak değiştirilmek istenirse değiştirilmesi istenen değişkenin önüne & (ampersand) işareti konur. $adi = “ahmet”; $_ad = &$adi ; $adi = “mehmet”; print $_ad; Burada ilk değişkenin $adi değerini ikinci değişkene atayarak içeriğin değişmesini sağladık, daha sonra ikinci değişkenin değerinin değişmesini sağlayarak ilk değişkenin de değerinin değişmesini sağlamış olduk. 109 İrfan MACİT Bölüm 6 PHP Betik Dili Diğer bilgisayar programlarında olduğu gibi php programlama dilinde kullanılan verilerin tiplerininde kullanılmasına dikkat edilmesinde yarar vardır. Veri tipleri porogram yazarken aynı türden olmasına özen gösterilmelidir. Ayrı türden olan deüişkenler arasında operatör işlemleri yapılamayacağı için programda hatalar ortaya çıkabilmektedir. Genel olrak bahsetmek gerekirse veri tipleri tamsayı (integer), ondalıklı dsayı (double), alfanumerik (sayıharf karışık) ve dizi gibi değişken tipleri kullanılmaktadır . 6.8.2 Sabitler sabitler bilgisayar programları çalışırker, çalışma sırasında değerleri değişmeyen veri tipleridir. Program içerisinde birden fazla defa kullanıma ihtiyaç duyulan zamanlarda kullanılırlar. Yazılan programın içerisinde kullanılan bir değer örneği pi (3.1416…) gibi bir değerin noktadan sonraki hassasiyeti zaman zaman değişebililr. Bu durumda değeri program içerisinde kullanıldığı her yere gidip yazmak yerine sadece bildirim yapıldıuğı yerde değiştirerek ortaya çıkabilecek yanlışı da engellemiş oluruz. Sabit değer programın sadece bildirim yerinde değiştirildikten sonra her yerinde aynı hassasiyet ile kullanır. PHP programlamada değişmeyen sabit değer program betik içerisinde define (“sab_deg”,değer) fonksiyonu ile tanımlanır. Define fonksiyonunun ilk aldığı değer sabitin program içerisinde kullanılacak olan adıdır. İkinci parametre değeri ise sabitin program içerisindeki sayısal değeri olacaktır. define(“pi”,3.1436); Betik içerisinde dairenin alanını hesaplayan kodları aşağıdaki gibi yazarız. <?php $daire_ycap = 3; define (“pi”,4.3116); $alan = pi * (daire_cap * daire_ycap) print ($alan); ?> 110 İrfan MACİT Bölüm 6 PHP Betik Dili 6.8.3 Artimetik ve Mantıksal Operatörler Operatörler bilgisayar programlarının aritmetiksel veya mantıksal işlemleri ve atama işlemlerini yapan ve bilgisayar programlarının vazgeçilmez işlevleridir. Bir değişkene veya sabite harhangi bir değeri atamak için = (eşit) operatötünü kullanmaktadır. Bu operatörün görevi sayısal bir değeri bir sabit veya değişkene eşitleyerek program içerisinde bu değerin işlenmesini sağlamaktır. Aynı şekilde artimetiksel veya cebirsel işlemlerinde yapılması için kullanılan operatörler vardır. Bunların genel adına aritmeksel operatörler denmektedir. Aiağıdaki tabloda bu tür operatörlerin yaptığı işler ve basit örnekler yeralmaktadır. Tablo 6.1 Aritmetik Operatörler Tablosu. Operatör İşlev Örnek + Toplama 2+3=5 - Çıkarma 4–1=3 * Çarpma 4*2=8 / Bölme 6/3=2 % Modülüs 3%2=1 += $x = $x + 3 $x += 5 -= $x = $x - 3 $x -= 5 /= $x = $x / 3 $x /= 5 *= $x = $x * 3 $x *= 5 %= $x = $x % 3 $x %= 5 .= $m .= “text” $m= $m“text” Bazı durumlarda php programlama dilinde den aynı C++ programlama dilinde olduğu gibi bir artırmak veya azaltmak için hazır olan operatörleri kullanabiliriz. Bu türden kullanımlar kod yazarken bize kolaylık sağlamaktadır. İlk anlarda zor veya anlaşılmaz gelen bu kodlama şekli ileri seviye programcılığa doğru gidildiğinde çok kolaylık sağlamaktadır. Değişkenlerinde değerlerini bir arttırmak için $değişken++ şeklinde yazılır. Bu x değişkenini ($x) değerini bir arttırır. Aynı şekilde $değişken-- ise değişkenin değerini bir azaltır. Mantıksal operatörler bilgisayar programlarında mantıksal karşılaştırma işlemlerini yapan operatörlerdir. Bu tür operatörleri genellikle şart yapılarında karşılaştırma amacıyla kullanılır. Tablo 6.2’de karşılaştırma operatörleri ile ilgili bilgiler veirlmektedir. 111 İrfan MACİT Bölüm 6 PHP Betik Dili Tablo 6.2 Mantıksal Operatörler. Mantıksal Operatör İşlev Örnek == Eşitlik $x == 2 != Eşit değil ise $x != 2 < Büyük ise $x > 4 > Küçük ise $x < 4 <= Büyük eşit ise $x <= 4 >= Küçük eşit ise $x >= 4 operatörlerin yanına diğer operatörler ise karşılaştırma operatörleridir. Karşılaştırma operatörleri iki değişken veya değişken grubu arasında karşılaştırma yapabilmek için kullanılırlar. Bu tip yapılar genellikle şart yapıları ve döngü yapılarında kullanılır. Döngülerde kontrol değişkenini takibi ve sonuç değerinde ulaşması ile ilgili kontroller yapılır. Tablo 6.3’te karşılaştırma operatörleri verilmiştir. Tablo 6.3 Karşılaştırma Operatörleri. Operatör İşlev Örnek || Doğru (D) veya Yanlış(Y) D||Y =D/ Y||D = D Or Doğru (D) veya Yanlış(Y) DorY =D/ YorD = D && Doğru (D) ve Yanlış(Y) D&&Y=Y/Y&&D=Y and Doğru (D) ve Yanlış(Y) DandY=Y/YandD=Y Xor veya tersi herhangi bir D DorY =D Şartın değili DandY=Y (Değili D) ! Bu operatörler ile ilgili örnekleri diğer bölümlerde verilecektir. 6.8.4 Şart yapıları Bütün bilgisayar programlarında programın kontrolü veya şartlarının gerçekleşmesi durumunda çalıştırılacak komutlar bulunur. Gerçekleşen şartların ortaya çıktığında çalıştırılması istenen komutlar bu şart yapıları içerisine yazılırlar. Şart yapıları genellikle dalsınır algoriltması gibi çalışır. Belirlenen şart gerçekleşir ise bu komut çalışsın gerçekleşmez ise diğeri çalışsın gibi söz dizimsel anlamı vardır. Şart yapılarında karşılaştırma ve mantıksal 112 İrfan MACİT Bölüm 6 PHP Betik Dili operatörler kullanılır. Bu operatörler if ve switch şart yapılarında kullanılırlar. İf deyiminin kullanıldıpı şart yapılarında yazım kuralı aşağıdaki gibidir. if (şart) { şart gerçekleştiğinde çalıştırılacak komutlar } elseif (diğer şart) { birinci şart gerçekleşmediğinde çalıştırılacak komutlar } else { yukarıdaki şartların hiç birisi gerçekleşmediğinde çalıştırılacak komutlar } Bazı durumlarda elseif veya else deyimleri olmadan bu şart yapıları kullanılabilmektedir. Şart yapılarındas elseif ve else kullanılmayanlara birinci tip şart yapıları denilmektedir. Diğer bir şart yapısı ise switch-case yapısıdır. Bu tür yapılar genelde değişkenin bir değer veya değer aralığında kaldığı veya bu aralıktaki değerlerin işlenmesi gerektiği durumlarda kullanılır. Bu yapının en önemlki unsuru break deyimidir. Bu deyim kullanılmadan komutlar switch-case yapısının dışında işlem yapamazlar. Genel yazım kuralı olarak aşağıdaki gib yazılır. switch (değişken) { case şart_1; işlenecek komutlar; break; case şart_2; işlenecek komutlar; break; case şart_3; işlenecek komutlar; 113 İrfan MACİT Bölüm 6 PHP Betik Dili break; default; diğer durumda işlenecek komutlar; } 6.8.5 Döngüler Döngüler bilgisayar programlarında birden fazla aritmetiksel veya mantıksal işlemler için yapılması gereken sıralı işlemlerde kullanılır. Döngüler genel olarak program denetiminde kullanılan yapılardır. Bu yapılar program içerisinde dallanma veya bir başka program satırında bulunan program kodlarına ulaşılmasını sağlar. Bazı problemlerin çözümünde program içerisinde arka arkaya birkaç kez çalıştırılması istenen komutlarıda döngüler vasıtası ile çalıştırılması sağlanır. Php bilgisayar betik programlama dilinde döngüler while, do-while, for ve for-each yapılarında yazılır. While komutunun genel yazım kuralı aşağıdaki gibidir. Bu döngü yapısında kontrol edilecek olan şart gerçekleştiğinde komutlar çalıştırılır ve şart durumu ortadan kalktığında program yapı içerisinde çıkar. while (şart) { şartın gerçekleşmesi durumunda yapılacak olan komutlar; } Diğer bir while ile yapılan döngü yapısı ise do-while yapısıdır. Bu yapı ile while yapısının arasıdaki en önemli fark do-while yapısındaki komutlar çalıştırılmadan önde en az bir kez şart yapısının gerçekleşip gerçekleşmediği sınanır ve daha sonra şart gerçekleşir ise işletilecek olan komutlar çalıştırılır. do-while yapısında ise şartın gerçekleşip gerçekleşmediğine bakılmaksızın do-while yapısı içerisindeki komutlar en az bir kez çalıştırılır ve şart gerçekleşiyor ise komutlar çalıştırılmaya devam edilir. Do-while yapısının genel yazım kuralı ise aşağıdaki gibidir. do{ şart gerçekleşir ise çalıştırılacak komutlar } while (şart); 114 İrfan MACİT Bölüm 6 PHP Betik Dili Aşağıdaki örnekte ekrana 1 ile 10 arasında rakamların yazıdığını görmekteyiz. Burada şart gerçekleşmesede ekrana en az bir kez degisken ile belirlenen değer yazılır. <?php $degisken = 1; do { print (“$degisken”); $degisken++; } while( $degisken <= 10); ?> Diğer bir döngü yapısı for ile yapılandır. For döngüsü while döngüsünden farkı burada kontrol değişkenleri vardır. While yapısında şart yapısı söz konusu iken burada kontrol değişkenleri ile çalıştırılacak olan komutlar kontrol edilir. Genel yazım kuralı aşağıdaki gibidir. for ($degisken ; kontrol_degiskeni; artım) { kontrol değişkeni gerçekleştiği süre çalıştırılacak olan komutlar; } Döngülerde kontrolü en kolay olan yapıdır. Kontrol değişkeni tüm tekrarlanacak olan komutları denetim altına aldığından bu yapıda tekrarlanacak işlemlerde sonsuz döngüye girme ihtimali daha azdır. Bir örnek vermek gerekir ise aşağıda birden başlayıp ona kadar sayıları yazan for örneği görülmektedir. <?php for ($degisken =1; $degisken <=10; $degisken); { print(“$degisken”); } ?> 115 İrfan MACİT Bölüm 6 PHP Betik Dili 6.8.6 Fonksiyonlar Bilgisayar programlarında en çok kullanılan program kodlar parçacıkları fonksiyonlar ve alt programlar (subroutine) dır. Birden fazla sefer kullanılacak olan hesaplama veya tekrarlı hesap veya işlemler bütünü kodları şelinde kullanılır. Bir dosya açılması, belirlenen oransal işlem değer hesapları veya matematiksel hesap fonksiyonlarının yazılması sırasında kullanılır. Bilgisayar programcısı defalarca açması gereken dosyaları veya dosyadan okuma için gerekli olan kodları bir defa yazarak tekrar tekrar kullnanabilir. Aynı kodu her dosya açmada veya dosyadan okumada yazmasıan gerek yoktur. Fonksiyonları alt programlardan farkı fonksiyonlar çağrıldıklarında sadece bir değer veya parametre geri döndürürler, örneğin sin(x) gibi daha önceden tanımlanmış bir fonksiyon göz önüne alırsan bu fonksiyonun kullanılması ile sadece x değerinin alacağı değer geri döndürülür. Her fonksiyonun mutlaka tanımlanması gerekir. Daha öncedfen tanımlanmış olan fonksiyonlara öntanımlı fonksiyon (predefined function) denir. Öntanımlı fonksiyonlar genelde üretici firmaların yazarak derleyici veya yorumlayıcıların kütüphanelerinde dağıttıkları türden fonksiyonlardır. Php fonksiyon çağırmadan önce tanımlanması ve kullanılacak olan parametrelerin belirlenmesi gerekir. Genel olrak fonksiyon tanımlama ve yazım kuralı aşağıdaki gibidir. Function fonksiyon_adi (parametre_1, parametre_2 ) { fonksiyonun yaptığı işlemler veya komutları; return geri_gönderilecek_sonuç_değer; } Fonksiyonun çağrılaması için program içerisinde fonksiyonun alacağı parametre değerleri sırası ile verilerek çağrılır. Fonksiyon verilen parametre değerlerini alarak elde ettiği sonuçları tek bir değer olarak veya paramtere listesine göre çıkış değeri olarak programa geri gönderir. <?php function topla ($sayi1, $sayi2) { $sonuc = $sayi1 + $sayi2; return $sonuc; } ?> 116 İrfan MACİT Bölüm 6 PHP Betik Dili Yukarıdaki topla() fonksiyon program parçacığındaki işlem iki sayı değişkeninin (sayı_1 ve sayı_2) toıplanmasını gerçekleştiren fonksiyon kodlarıdır. Bu fonksiyon kodları php programı içerisinde tanımlandıktan sonra istenen yerde kullanılırlar ve sonuç $sonuç değişkeni ile programa geri gönderilir. 6.8.7 PHP’de Diziler Bilgisayar programlama dillerinde değişkenlerin bir tanesi ile yapılan işlemlerde sonuç bir değer olarak geri alınır. Birden fazla değer ile işlem yapılması istendiğinde diziler kullanılarak işlemler yapılmaktadır. Diziler birden fazla değeri ayrı ayrı bir değişkene atamak için çok faydalıdır. Değişkeni bir tren vagonu gibi düşünürsek değeri vagonun içerisindeki yük olarak varsayalım. Diziler ise bu vagonlardan birden fazla ve birbirine ardışık sıra ile bağlı vagonlar topluluğudur. Her vagonun içerisindeki yük değeri farklı olabilmektedir. Değerlerin tek kriteri vagonun yük kapasitesidir ki buna dizinin veri tipi denir. Dizini veri tipi içerisinde taşıncak olan verinin ne kadar büyüklükte olduğunu belirlemektedir. Php bilgisayar betik programında dizi tanımlaması ile yapılmakyadır, genel yazım kuralı $değişken = array(parametreler) list(parametreler) şeklindedir. veya $değişken = Tek boyutlu diziler genellikle array() veya list()ile kullanılmadan değişkenin adından sonra köşeli parantezin içerisine yazılan dizi boyutu ile yazılmaktadır. Aşağıdaki örnekte haftanın günlerini sırasal (ordinary) gösteren php bilgisayar kodları verilmiştir. <?php $hafta= array( “pazartesi” , “sali”, “persembe”,”cuma”, “cumartesi”,”pazar”) ?> http://www.php.net/FAQ.php http://www.php.net/manual/config-odbc.html http://www.techdevelopers.com http://www.lilali.net http://www.sqlcourse.com/ ttp://www.apache.org/info/apache_users.html 117 “carsamba”,
Benzer belgeler
5- Turbo Pascalda Kullanılan Döngü Yapıları
yazılması engellenebilir. Nesne yönelimli dillerden birisi ile oluşturulan bilgisayar programı
yerine yapısal programlama dillerinden birisi ile yapılan programlarda daha fazla kod yazmak
maliyetle...