118
Ç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

ENM424 Endüstride Bilgisayar Uygulamalar Ders …hpss.endustri.cu.edu.tr/ders/ENM424/EBU-KitapTum.pdfmantıksal durum ifade edebilen örneğin yapay zeka yazılımları değerlendirilirken

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Ç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)

1

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

2

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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

3

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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

4

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

X1000

Sayfa Sayısı Hata Bozunma Yazılımcı

Sayısı

Gayret

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

5

ö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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

6

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) (1.1)

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

7

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ı

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

8

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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

9

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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

10

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)1.05

Süre = 2.5 (Çaba)0.38

Yarı ayrık Çaba = 3 (KLOC)1.12

Süre = 2.5 (Çaba)0.35

Gömülü Çaba = 3.6 (KLOC)1.20

Süre = 2.5 (Çaba)0.32

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

11

Organik Çaba = 3.2 (KLOC)1.05

* ÇAK

Yarı ayrık Çaba = 3.0 (KLOC)1.12

* ÇAK

Gömülü Çaba = 2.8 (KLOC)1.20

* Ç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ı

veri tabanı

büyüklüğü

bellek yeterliliği uygulama deneyimi zamanlandırma

ürün karmaşıklığı sanal makina

değişkenliği

geliştirme ortamı

deneyimi

yeni programlama

teknikleri

kullanılabilme süresi 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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

12

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.

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

13

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

/V)3 x (1/t

4)

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

14

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üğü

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

15

• 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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

16

• 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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

17

• 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ı

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

18

• 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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

19

• 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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

20

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

21

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

22

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ı

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

23

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ğı aşağıda verilmektedir:

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ı

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

24

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

İrfan MACİT Bölüm 1 Yazılım Mühendisliği ve Araçları (CASE)

25

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.

İrfan MACİT Bölüm 2 Algoritmalar

26

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

İrfan MACİT Bölüm 2 Algoritmalar

27

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.

İrfan MACİT Bölüm 2 Algoritmalar

28

A ve B sayılarını Oku

A sayısı yerine B sayısını koyB sayısı yerine C sayısını koy

A sayısını B sayısına böl

Kalanı Al

B’yi Yaz ve Son

C = 0

Ş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

İrfan MACİT Bölüm 2 Algoritmalar

29

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.

Ş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

Ele Alınan Problem

Çözümün Algoritma şekline gelmesi

Bilgisayar programlama dili

kodları

Problem Çözüm Aşaması Uygulama Aşaması

İrfan MACİT Bölüm 2 Algoritmalar

30

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

İrfan MACİT Bölüm 2 Algoritmalar

31

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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

32

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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

33

çö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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

34

ç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;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

35

type CHARFILE = file of char;

ARRN = array[1..maxobject] of integer;

var KnapAppxDatafile : CHARFILE;

KnapAppxOutfile : CHARFILE;

N, Nextint : integer;

P, W : ARRN;

X : ARRN;

V, PROFIT : integer;

EPS : real;

procedure Infile (var Nextint : integer;

var N : integer;

var P, W : ARRN;

var V : 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;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

36

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; MAXP2:=P[I] end

else if P[I] > MAXP3 then MAXP3:=P[I]

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

37

end; (* MAX *)

begin (* MAIN BODY *)

I:=1; U:=V; PROFIT:=0;

MAXP1:=0; MAXP2:=0; MAXP3:=0;

while W[I] <= U do begin (* FINDING GREEDY SOLUTION *)

U:=U-W[I]; MAX; 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; K:=I end

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; K:=I; L:=J end

end

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

38

end (* for J *)

end; (* 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.

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

39

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

'

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

40

,'& 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

bound');

writeln(' 4 : cost matrix from file 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 : number of cities');

writeln(' s : seed (initializes random

generator)');

writeln(' + : option for more detailed

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 : upper bound (optional)');

halt

end;

procedure ranxy;

const mac1: longint= 16807;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

41

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]

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

42

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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

43

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'); { line to screen

}

if not screen then clrscr;

assign(output,outputstr); rewrite(output);

if cat<=4 then

begin

inputstr:=paramstr(2);

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

44

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); { read upper

bound }

close(input);

end

else

begin

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

45

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+' '+hour+':'+minute

end

end;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

46

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'

,' (c)1990 |');

writeln(output,'| 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 and a.volgenant, '

,'operations 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));

str(n,tekst);

writeln(output,'| size : ',n,'|':59-length(tekst));

str(nr,tekst);

if cat<=4 then

writeln(output,'| number : ',nr,'|':59-length(tekst))

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

47

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);

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

48

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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

49

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

jij xcZenk

1 olan ve kısıtları ise

∑ ≥=≥ 0,...,2,1 jijij xvenibxa ş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)

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

50

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) z=cTx+c^Tx^ s.t. 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 is feasible and optimal solution exists. 2.Determine the optimal basic variables and their corresponding values. 3.Determine the 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 = file of char; ARRMN = array[0..maxconstraint,0..maxvar] of real; ARRN = array[0..maxvar] of integer; ARRMIN = array[0..maxvar-maxconstraint] of integer; var DualplexDatafile : CHARFILE; DualplexOutfile : CHARFILE;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

51

N,M, NMINM : integer; FOPT : integer; A : ARRMN; U : ARRN; NOFEAS, NOSOL : boolean; Nextint : integer; Nextreal : real; procedure Infile(var N,M,NMINM : integer; var Nextint : integer; var Nextreal : real; var A : ARRMN); var 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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

52

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;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

53

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]);

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

54

writeln(DualplexOutfile,' ',A[counter,0]:9:2); end; end; end; 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 is based on the revised simplex method. This algorithm solves the LP problems in STANDARD FORM minimize cTx s.t. 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

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

55

number a, |a|< EPS, then a =0.0 EPS is set to 10^-16 <= EPS <= 10^-4. OUTPUT : Outputs are 1. Check if a LP is feasible and optimal solution exists. 2. Determine the optimal basic variables and their corresponding values. 3. Determine the optimal value of the objective function NOTE : 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 = file of char; ARRM2M2 = array[1..maxconstraint+2,1..maxconstraint+2] of real; ARRM2N = array[1..maxconstraint+2,1..maxvar] of real; ARRM2 = array[1..maxconstraint+2] of real; ARRN = array[1..maxvar] of real; ARRM = array[1..maxconstraint] of integer; 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; procedure Infile(var N,M : integer; var A : ARRM2N; var B : ARRM2; var C : ARRN; var Nextreal : real; var Nextint : integer); var row,column : integer; begin reset(SimplexDatafile); readln(SimplexDatafile,Nextint); N := Nextint; readln(SimplexDatafile, Nextint); M := Nextint; for row := 1 to M do

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

56

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 :integer; EPS :real; var A :ARRM2N; var B,X :ARRM2; var C :ARRN; var W :ARRM; var F :real; var NOFEAS,NOSOL :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 *)

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

57

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;

İrfan MACİT Bölüm 3 Bilgisayar Programlama Algoritmaları

58

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 ',F:9:2); 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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

59

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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

60

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 web sunucusunu Internet üzerinde

http://www.apache.org/dist/httpd/binaries/win32 adresinden güncel sürümünü 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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

61

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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

62

Ş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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

63

Ş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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

64

Ş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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

65

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ı.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

66

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ı.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

67

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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

68

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ı

İrfan MACİT Bölüm 4 Apache Web Sunucusu

69

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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

70

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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

71

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. #

İrfan MACİT Bölüm 4 Apache Web Sunucusu

72

<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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

73

#

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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

74

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 tr .tr AddLanguage nl .nl AddLanguage en .en AddLanguage et .et AddLanguage fr .fr AddLanguage de .de AddLanguage he .he AddLanguage el .el AddLanguage it .it AddLanguage ja .ja AddLanguage pl .po AddLanguage kr .kr AddLanguage pt .pt

İrfan MACİT Bölüm 4 Apache Web Sunucusu

75

AddLanguage nn .nn AddLanguage no .no AddLanguage pt-br .pt-br AddLanguage ltz .ltz AddLanguage ca .ca AddLanguage es .es AddLanguage sv .se AddLanguage cz .cz AddLanguage ru .ru AddLanguage tw .tw AddLanguage zh-tw .tw AddLanguage 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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

76

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>

İrfan MACİT Bölüm 4 Apache Web Sunucusu

77

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>

İrfan MACİT Bölüm 4 Apache Web Sunucusu

78

İ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

İrfan MACİT Bölüm 4 Apache Web Sunucusu

79

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.

İrfan MACİT Bölüm 4 Apache Web Sunucusu

80

#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.

İrfan MACİT Bölüm 5 HTML Giriş

81

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

İrfan MACİT Bölüm 5 HTML Giriş

82

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.

İrfan MACİT Bölüm 5 HTML Giriş

83

chmod 755 username;

chmod 755 public_html ;

chmod 644 *

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 cesitli `markup'lar vardir: <XXX OPSIYONLAR diger tanimlar> Isimlendirme </XXX> <YYY OPSIYONLAR>

seklinde ya tekli yada esli olurlar. < > HTML `syntax'i icin cok onemlidir. Once onemli tekli

isaretleyicileri verelim:

<BASE>, <IMG>, <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>

İrfan MACİT Bölüm 5 HTML Giriş

84

<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 guest for login

İrfan MACİT Bölüm 5 HTML Giriş

85

FTP 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

</a> ya da <a HREF="http://www.alfa.edu.tr/turkiye.html#web"> 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

İrfan MACİT Bölüm 5 HTML Giriş

86

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

İrfan MACİT Bölüm 5 HTML Giriş

87

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.

İrfan MACİT Bölüm 5 HTML Giriş

88

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 istegiyle secim yapmasina olanak saglamaktir. <a

HREF="kampus.gif"> Kampus Haritasi </a> gibi. Bu resimler ayri bir pencerede

gosterilir. Digeri ise metnin icine sikistirilabilen, metnin parcasi, arayuzu kolay, cekici, guzel

İrfan MACİT Bölüm 5 HTML Giriş

89

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

İrfan MACİT Bölüm 5 HTML Giriş

90

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-map-

file'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 dosyasini yaratin:

İrfan MACİT Bölüm 5 HTML Giriş

91

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"); # open "countf" counter file

$counter = ; # 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>

İrfan MACİT Bölüm 5 HTML Giriş

92

<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:

İrfan MACİT Bölüm 5 HTML Giriş

93

<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 Class

C Using

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 istediğiniz anahtar sözcükleri

yazın:

İrfan MACİT Bölüm 5 HTML Giriş

94

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 "$*"

İrfan MACİT Bölüm 5 HTML Giriş

95

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>"

İrfan MACİT Bölüm 5 HTML Giriş

96

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:

İrfan MACİT Bölüm 5 HTML Giriş

97

<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 entry field: ____________________

Second entry field: ____________________

Third entry 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'

İrfan MACİT Bölüm 5 HTML Giriş

98

seklinde eklenerek iletilir. Bu arada bosluklar `' ile yer degistirilir. Ornegin

<ACTION="http://www.alfa.edu.tr/cgi-bin/mypost" METHOD=GET> ise ve kullanici

forma Mustafa Akgul yazdiysa, 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>

İrfan MACİT Bölüm 5 HTML Giriş

99

<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 name="eposta" size=36> <p>

<textarea name="oneri" ROWS=8 COLS=40></textare> <p>

<input type="submit" Value="Gonder">

<input type="reset" Value="Formu Tazele">

İrfan MACİT Bölüm 5 HTML Giriş

100

</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.

İ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 bulunabilir. Bunlardan birisi

102

İrfan MACİT Bölüm 6 PHP Betik Dili

http://sourceforge.net/projects/devphp 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.

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

Mantıksal 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 dal-

sı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) veya $değişken =

list(parametreler) şeklindedir. 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”, “carsamba”,

“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