Ders Notları Tamamı - Endüstri Mühendisliği Bölümü Üretim

Transkript

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

Benzer belgeler

5- Turbo Pascalda Kullanılan Döngü Yapıları

5- Turbo Pascalda Kullanılan Döngü Yapıları yazılması engellenebilir. Nesne yönelimli dillerden birisi ile oluşturulan bilgisayar programı yerine yapısal programlama dillerinden birisi ile yapılan programlarda daha fazla kod yazmak maliyetle...

Detaylı