Yorumlar kapalı

Bezier Eğrisi Çizen Kod

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Soru: Üç noktanın koordinatlarını alarak bu noktalardan geçen eğriyi bezier algoritması ile ekrana çizen kodu yazınız.

Çözen : Şadi Evren ŞEKER

Çözüm:

Bezier eğrisini çizebilmek için ikinci dereceden bir denkleme ihtiyaç duyulur. Burada denklemin ikinci derece olmasının sebebi 3 nokta ile çizim yapılmasının istenmesidir.

Öncelikle programımızda kullanacağımız basit temel fonksiyonları kodlayalım:

İki nokta verildiğinde bu iki noktanın ortasındaki noktayı hesaplayan fonksiyonu kodlayalım:

(define (mid-point a-posn b-posn)

(make-posn

(mid (posn-x a-posn) (posn-x b-posn))

(mid (posn-y a-posn) (posn-y b-posn))))

Yukarıda iki sayının orta değerini (aritmetik ortalamasını) hesaplayan mid fonksiyonunu kullandık. Bu fonksiyonu basitçe iki sayının toplamının yarısı olarak aşağıdaki şekilde tanımlayabiliriz:

(define (mid x y)

(/ (+ x y) 2))

Artık bezier fonksiyonumuzu kodlayabiliriz. Buradaki püf noktası sürekli olarak noktaların arasındaki noktaların hesaplanmasıdır. Bu açıdan bir fraktal üretimine benzetilebilir:

(define ( bezier p1 p2 p3) (cond

[(too-small? p1 p2 p3) true]

[else (and (draw-solid-disk (mid-point (mid-point p1 p2) (mid-point p2 p3)) 3)

(bezier (mid-point (mid-point p1 p2) (mid-point p2 p3)) (mid-point p2 p3) p3)

(bezier p1 (mid-point p1 p2) (mid-point (mid-point p1 p2) (mid-point p2 p3)))

)]))

Yukarıdaki kod 3 nokta alıp bu noktalar arasındaki mesafe çizilemeyecek kadar küçük oluncaya kadar (bu mesafe aynı zamanda çizimdeki noktaların seyrekliğini de belirtmektedir) ara nokta hesaplamakta ve hesaplanan bu ara noktaları çizmektedir. Yukarıdaki fonksiyonda bitişi belirten too-small? Fonksiyonunu aşağıdaki şekilde tanımlayabiliriz:

(define (too-small? p1 p2 p3)(cond[(< (abs(- (posn-x p1) (posn-x p2))) 10) true]

[else false]

))

Burada noktalar arası mesafe 10 veya daha düşükse artık yeni nokta üretimi duracaktır.

Çözüm çalıştırması:

(define p1 (make-posn 50 50))

(define p2 (make-posn 150 150))

(define p3 (make-posn 250 100))

Üç nokta tanımlanmıştır

(start 300 200)

Çizim alanı açılmıştır

(bezier p1 p2 p3)

Ve son olarak fonksiyonumuza üç nokta parametre verilmiştir.

Kodun çalıştıktan sonra ekranda oluşturduğu çizim aşağıdaki şekilde görülebilir

Yorumlar kapalı

Bezier Eğrileri (Bezier Curves)

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinin bir çalışma alanı olan bilgisayar grafiklerinde kullanılan eğri biçimidir. Bezier eğri çiziminin özelliği parametrik olarak noktalar ile çalışmaları ve verilen noktalara göre bir eğri çizmesidir. Literatürde bézier curve veya bezier eğrisi olarak geçmektedir. İsmi bu hesaplama yöntemini ilk bulan Fransız matematikçiden gelmektedir.

Bezier eğrilerinin boyutlarından bahsetmek doğrudur. Buna göre bir bezier eğrisinin derecesi yada boyutu, bu eğriyi meydana getiren nokta sayısıyla ölçülebilir. Örneğin iki noktayı parametre alarak çalışan bir algoritmada sonuç olarak bir doğru çıkacaktır.

Bu çizim için P0 ve P1 olmak üzere iki nokta aldığımızı düşünürsek, eğrinin formülü (daha doğrusu doğrunun formülü) aşağıdaki şekilde yazılabilir

B(t) = P0 + t( P1 – P0 )

Daha açık bir ifadeyle iki noktadan birini başlangıç (P0) ve birini bitiş (P1) noktası olarak kabul edecek olursak. Bitiş noktasına giden yol üzerindeki her nokta, başlangıç noktasına eklenen ve bitiş noktası istikametindeki bir fark kadar ötelenmiş noktadır.

Bu gösterimi açacak olursak :

(1-t) P0 + t P1

Olarak yazmak da mümkündür. Bu yazılım bezier denklemleri açısından daha anlamlıdır. Bunu daha yüksek seviyeli denklemlerde anlayacağız.

Bu yazı şadi evren şeker tarafından yazılmış ve bilgisayarkavramlari.com sitesinde yayınlanmıştır. Bu içeriğin kopyalanması veya farklı bir sitede yayınlanması hırsızlıktır ve telif hakları yasası gereği suçtur.

Şimdi iki yerine 3 nokta ile teşkil edilen bir bezier eğrisini aynı mantıkla formülleştirmeye çalışalım.

Buna göre eğrimizde sırasıyla P0, P1 ve P2 noktaları olacaktır.

Yukarıdaki şekilde 3 noktadan oluşan ikinci derece eğri gösterilmiştir. Ayrıca eğrinin daha iyi anlaşılabilmesi için 3 noktayı birleştiren klavuz çizgileri de bulunmaktadır. Eğri aslında yukarıdaki iki çizginin arasında kalan şekil olup, eğrinin orjinali aşağıda açık olarak verilmiştir:

Yukarıdaki bu eğriyi elde etmek için kullanacağımız formül şu şekilde oluşturulur:

B(t) = (1-t)2 P0 +2 (1- t) t P1 + t2 P2

Yukarıdaki denklemde dikkat edilirse binom üçgenindeki (pascal triangle) bulunan katsayılar kullanılmıştır. Bunun sebebi iki bilinmeyenli ikinci derece denklem açılımı olmasıdır.

Benzer şekilde üçüncü derece bezier eğrisi için de binom üçgeninin üçüncü satırı kullanılır:

B(t) = (1-t)3 P0 +3 (1- t) 2 t P1 +3 (1-t) t2 P2 + t3 P3

Yukarıdaki denklemden de anlaşılacağı üzere t ve (1-t) değişkenlerinin 4 nokta üzerindeki dağılımları birer katsayı olarak gelmektedir. 4 nokta ile çizilebilen bezier eğrilerine aşağıda örnekler verilmiştir:

Bezier eğrilerinin bir avantajı da bu eğrilerin adım adım çizilebilmesidir. Yani eğrinin oluşturulması sırasında kesikli matematik (discrete math) kullanılabilir. Örneğin 2. Derecen olan bezier eğrisi aşağıdaki şekilde çizilebilir:

Yukarıda sadece doğrular çizilerek bir eğri oluşturulmuştur. Buradaki 3 nokta çizim alanı olan karenin 3 köşe noktasıdır ve bu noktalar kullanılarak doğru kaydırılmış ve şekilde eğri ortaya çıkmıştır.

Yukarıdaki formül binom dağılımı kullanılarak ilerletilebilir ve istenilen dereceden eğri çizimi elde edilebilir.

Yorumlar kapalı

Şanslı Sıralama (Lucky Sort)

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Yazan : Şadi Evren ŞEKER

Sadece teorik olarak literatürde geçen bir sıralama algoritmasıdır (sorting algorithm). Buna göre sıralanacak olan dizi şanslı bir şekilde zaten sıralı verilmiştir. Dolayısıyla dizinin sıralanmasına gerek yoktur. Hatta bu kabulü yaptığımız için dizinin sıralı olup olmadığını kontrol etmemize de gerek yoktur (ne de olsa şanslıyız J ) dolayısıyla giriş dizisi her zaman sıralı olan sıralama algoritmasıdır. Anlaşılacağı üzere hiçbir işe yaramaz. Sadece teorik olarak O(0) zamanda sıralama yaptığının bilinmesi ve bu durumun hem en iyi hem de en kötü zaman olduğunun anlaşılması yeterlidir. Algoritmaya çeşitli kaynaklarda şans sıralaması, lucksort, luckysort şeklinde isimler de verilir.

Bazı kaynaklarda bogo sıralamasının (rastgele sıralamanın) şanslı bir şekilde ilk atışta tutması olarak geçmektedir ancak bu kesinlikle yanlıştır. Çünkü bogo sıralamasında bir dizinin sıralı olup olmadığı en az bir kere kontrol edilmelidir. Bu yüzden bogo sıralamasında şanslı da olsak (ve diğer bütün sıralama algoritmaları için de bu durum geçerli) en iyi ihtimalle O(n) zamanda algoritma sona erer. Şanslı sıralamanın avantajı ise şanslı olduğumuzu biliyor olmamız ve kontrol etmeye bile ihtiyaç duymamamızdır.

Yorumlar kapalı

Binary Search Tree’yi Inorder olarak dolaşan Kod

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Soru: Bir adet ikili arama ağacı (binary search tree) oluşturunuz ve bu ağaç üzerinde ssn numarası ve bir isim tutunuz. Bu bilgileri ssn numarasına göre ağaca yerleştirin ve yerleşen bu verileri içsıraya göre (inorder) dolaşan bir kod yazınız. Bu kodu kullanarak ağaçta arama yapan bir fonksiyon yazınız.

Çözen : Şadi Evren ŞEKER

Çözüm :

Bu tip bir soruda verilerin tutulması ve işlenmesi önemli bir yer tutar. Verilerin tutulması için scheme dilinde bulunan struct özelliğinden faydalanacağız. Öncelikle verimizi tanımlayalım:

(define-struct tree (ssn label left right))

Yukarıdaki bu tanımda ağacın bir düğümü (node) için kullanılacak yapı verilmiştir. Bu yapıda bir düğümde ssn, label ve ağacın solunu gösteren left, sağını gösteren right değişkenleri bulunmaktadır. Yani solu ve sağı yine kendi yapısından birer üye olacaktır.

(define tree-1 (make-tree 1 ‘x null null))

(define tree-2 (make-tree 3 ‘y null null))

(define tree-3 (make-tree 2 ‘z tree-1 tree-2))

(define tree-4 (make-tree 5 ‘p null null))

(define tree-5 (make-tree 4 ‘q tree-3 tree-4))

Yukarıda örnek ağaç tanımları verilmiştir. Buna göre yukarıdaki ağacı çizecek olursak:

Yukarıdaki şekilde bir ağaç elde ederiz. Bu ağaçta en tepede tree-5 ile tanımlanan ve içerisinde 4,q bulunan düğüm bulunmaktadır. Bu düğümün solunda tree-3 yani 3,y ve sağında ise tree-4 yani 5,p bulunmaktadır ve ağaç bu şekilde birbirine düğümler eklenerek devam etmektedir.

Şimdi ağacı dolaşan fonksiyonumuzu yazalım:

(define (inorder bt) ( cond[(null? bt) null][else (cond[(and (null? (tree-left bt ))(null? (tree-right bt))) (list(tree-label bt) (tree-ssn bt))][else (append (inorder (tree-left bt)) (list(tree-label bt) (tree-ssn bt)) (inorder (tree-right bt)))])]))

Fonksiyon basitçe ağacın önce sol, sonra düğüm sonra sağ değerini ekrana bastırmaktadır. Yani gidebildiği kadar sola gidip en sondaki elemanı basıp bir yukarı çıkmakta ve sonra sağa gitmektedir. Bunu sağlayan sadece yukarıdaki fonksiyonda bulunan dolaşma sırasıdır. Fonksiyonu çalıştırmak için aşağıdaki komut verilebilir.

(inorder tree-5)

Kodun çalışması sonucunda yukarıdaki ekranda görüldüğü üzere ağacın sol-orta-sağ sırasıyla dolaşılmış hali ekrana basılmaktadır:

(x 1 z 2 y 3 q 4 p 5)

Şimdi sorunun ikinci kısmına yani ağaçta arama yapan kısma geçebiliriz:

(define (search bt n)(cond [(eq? (tree-ssn bt) n) (tree-label bt)][(and (null? (tree-left bt)) (null? (tree-right bt))) false]

[else (cond [(eq? (tree-ssn bt) n) (tree-name bt)]

[else (cond [(> (tree-ssn bt) n) (search (tree-left bt) n)][else (search (tree-right bt) n)])

])]))

Yukarıdaki kodu çalıştırmak için aşağıdaki komut verilebilir:

(search tree-5 4)

Yukarıda dikkat edilirse inorder fonksiyonunun aynısı kullanılmıştır. Tek farkı arama işlemi sırasında eşitlik durumu kontrol edilmiş ve bu sayede şayet aranan elemana ulaşıldıysa aram işlemi bitirilmiştir.

Bu kodun çalışan hali ise yukarıdaki şekildedir. Yani aranan değer 4 olarak verildiğinde, 4 ssn değerine sahip q label’ı döndürülmüştür.

Yorumlar kapalı

Bogo Sıralama (Bogosort)

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinde özellikle eğitim amacıyla kullanılan bir sıralama algoritmasıdır. Algoritmanın çalışması oldukça basittir, bogosort, verilen bir diziyi sıralamak için rast gele bir dizilim üretir ve sıralı olup olmadığına bakar, şayet sıralıysa algoritma sona erer, şayet sıralı değilse rastgele olarak yeni bir dizilim elde eder, ta ki sayılar sıralanana kadar sayıları rastgele dizmeye devam eder.

Bu algoritma basitçe bir dizinin sıralı olana kadar rastgele dizilmesi olarak ifade edilebilir. Algoritmaya rastgele sıralama (random sort) veya maymun sıralaması (monkey sort) veya çifteli tüfek sıralaması (shotgun sort) anlamında isimlerde verilmektedir.

Bu algoritmanın gerçek hayatta kullanılabilirliği işlem süresinin uzunluğundan dolayı yoktur. Ancak eğitim amaçlı olarak literatürde geçmektedir.

Algoritmanın en iyi ihtimali O(n) olarak düşünülebilir çünkü şayet verilen dizi sıralıysa sadece dizinin sıralı olduğunu kontrol etmek için n tane elemanın üzerinden bir kere geçilmesi yeterlidir.

Buna karşılık en kötü ihtimalle sonsuza kadar çalışabilecek bir algoritmadır. Algoritmanın ortalama performansı için biraz istatistik bilgilerimizi tazelememiz gerekir.

Bilindiği üzere bir dizideki n elemanın farklı dizilim sayısına permütasyon ismi verilir. Bir dizideki n elemanın n! Tane farklı dizilme ihtimali bulunur.

Bu durumda her dizilimin n elemanlı bir kontrolden geçeceğini düşünürsek algoritmanın ortalama performansı (Average case) O(n n!) olarak bulunur.

Yorumlar kapalı

Öğrencinin GPA’ini hesaplayan kod

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Soru: Bir öğrencinin okul numarası, ve aldığı dersler bulunur. Bir dersin ise kodu bulunur. Öğrencinin aldığı her dersin bir kodu ve öğrencinin bu dersten aldığı not bulunur. Buna göre bir öğrenci tanımlandığında aşağıda verilen not tablosuna göre bu öğrencinin ortalamasını hesaplayan bir kod yazınız.

Harf Notu (4 üzerinden)
A 4
A- 3.7
B+ 3
B- 2.7
C+ 2.3
C 2
C- 1.7
D+ 1.3
D 1

Çözen : Şadi Evren ŞEKER

Çözüm fonksiyonları:

Bu tip bir soruda verilerin tutulması ve işlenmesi önemli bir yer tutar. Verilerin tutulması için scheme dilinde bulunan struct özelliğinden faydalanacağız.

Öncelikle dersin yapısını tanımlayalım:

(define-struct course (name credit grade))

Ardından bir öğrencinin yapısını tanımlayalım:

(define-struct student (id listofcourses))

Yukarıda görüldüğü üzere bir ders, isim, kredi ve nottan; öğrenci ise bir numara ve aldığı derslerden oluşur. Şimdi fonksiyonları yazmaya başlayabiliriz:

Öncelikle bir harf notu verildiğinde sayısal karşılığını döndüren fonksiyonu yazalım:

(define (letter-grade grade)(cond [(eq? grade 'A) 4][(eq? grade 'A-) 3.70][(eq? grade 'B+) 3.30][(eq? grade 'B) 3][(eq? grade 'B-) 2.70][(eq? grade 'C+) 2.30][(eq? grade 'C) 2][(eq? grade 'C-) 1.70][(eq? grade 'D+) 1.30][(eq? grade 'D) 1][else 0]))

Ardından verilen bir listedeki dersler için ağırlıklı ortalama hesaplayan fonksiyonu yazalım:

(define (weightedaverage acourse) ( * (course-credit acourse)(letter-grade (course-grade acourse))))

(define (weightedaverage-sum acourselist)( cond [(null? acourselist) 0][else (+ (weightedaverage-sum (rest acourselist)) (weightedaverage (first acourselist)))]))

Yukarıdaki kodda derslerin bir liste olarak verildiği kabul edilmiştir. Buradaki weightedaverage-sum fonksiyonu özyineli (recursive) olarak listenin üzerinden geçer. Her geçişinde sıradaki elemanın değerini toplar ve sonuçta bütün elemanların toplam değerini döndürür.

Yukarıdaki toplamları alan fonksiyonlara ilave olarak derslerin kredilerinin toplamını veren bir fonksiyona ve nihayetinde bu not toplamını kredi toplamına bölen bir fonksiyona daha ihtiyaç vardır. Bunlar aşağıdaki şekilde yazılabilir:

(define (course-credits acourselist)( cond [(null? acourselist) 0][else (+ (course-credits (rest acourselist)) (cond[(eq? 'Z (course-grade (first acourselist))) 0][else ( course-credit (first acourselist))]))]))

(define (calculated-gpa astudent)(/ ( weightedaverage-sum (student-listofcourses astudent))(course-credits (student-listofcourses astudent))))

Sonuçta bir öğrenci dersleri ile birlikte aşağıdaki şekilde verilince ortalama GPA değeri başarıyla hesaplanır:

Çözüm çalıştırması:

(calculated-gpa (make-student 10022021 (list (make-course ‘Comp111 3 ‘B+) (make-course ‘Comp112 3 ‘D+) (make-course ‘FM302 3 ‘C+)(make-course ‘EC232 3 ‘A-)(make-course ‘FM412 3 ‘C+)(make-course ‘FM496 4 ‘C+))))

Yukarıdaki örnek öğrenci için ortalama 2.52 olarak bulunmuştur.

Yorumlar kapalı

Ekrana Trafik Işıkları Çizen Kod

Tarih: Cumartesi, Ekim 31, 2009 Kategori: Bilgisayar, Bilgisayar Kavramları

Soru: Sırasıyla, ekrana üç adet kırmızı, sarı, yeşilden oluşan trafik ışıklarını çiziniz, ışıklardan birini söndüren fonksiyonu, ışıklardan birini yakan fonksiyonu, ışık değiştiren fonksiyonu ve sıradaki ışığı yakan fonksiyonu yazınız.

Çözen : Şadi Evren ŞEKER

Çözüm fonksiyonları:

Öncelikle çizim yapacağımız için dr. Scheme üzerinde draw.ss teachpack’ini yüklememiz gerekiyor:

Ardından poligonu çizim için değişkenlerimizi tanımlayalım:

;;6.2.1

(define WIDTH 50)

(define HEIGHT 160)

(define BULB-RADIUS 20)

(define BULB-DISTANCE 10)

;; the positions of the bulbs

(define X-BULBS (quotient WIDTH 2))

(define Y-RED (+ BULB-DISTANCE BULB-RADIUS))

(define Y-YELLOW (+ Y-RED BULB-DISTANCE (* 2 BULB-RADIUS)))

(define Y-GREEN (+ Y-YELLOW BULB-DISTANCE (* 2 BULB-RADIUS)))

Yukarıdaki tanımlamada öncelikle trafik ışıklarının boyutları (width , height) yarı çapları ve birbirine mesafeleri tanımlanmıştır. Ardından aynı x değerine sahip farklı y değerlerindeki 3 adet x,y ikilisi hesaplanmıştır. Işıklar alt alta duracağı için tek x değeri bütün 3 ışık içinde yeterlidir.

Işıkları draw.ss kullanarak çizmek için aşağıdaki kod gerekmektedir:

(start WIDTH HEIGHT)

(draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS ‘red)

(draw-circle (make-posn X-BULBS Y-YELLOW) BULB-RADIUS ‘yellow)

(draw-circle (make-posn X-BULBS Y-GREEN) BULB-RADIUS ‘green)

Ardından sorunun ilk fonksiyonu olan ve bir trafik ışığını temizleyen koda geçebiliriz:

(define (clear-bulb color) ( cond [ (eq? color 'red) (draw-solid-disk (make-posn X-BULBS Y-RED) (- BULB-RADIUS 2) 'white)]

[ (eq? color 'yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) (- BULB-RADIUS 2) 'white)]

[ (eq? color 'green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) (- BULB-RADIUS 2) 'white)]

))

Yukarıdaki kodda verilen renk 3 ihtimalden birisi ile kontrol edilmektedir. Hangi ihtimal ise ilgili rengin bulunduğu koordinata yarı çapı 2 küçük yeni ve beyaz bir daire çizilmektedir. Bu sayede trafik ışığının içi boş izlenimi verilmektedir.

Sorudaki ikinci fonksiyon olan ve trafik ışığını yakan fonksiyonu yazacak olursak:

(define (draw-bulb color) ( cond [ (eq? color 'red) (draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS 'red)]

[ (eq? color 'yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) BULB-RADIUS 'yellow)]

[ (eq? color 'green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) BULB-RADIUS 'green)]

))

Yukarıdaki fonksiyonda bir öncekine benzer şekilde verilen renk 3 ihtimal ile kontrol edilmekte hangisine eşitse o ışık koordinatına ilgili renkte bir daire yerleştirilmektedir. Bu sayede ilgili renkteki ışık yanmış izlenimi verilmektedir.

Işık değiştirmek için, bir ışığın sönüp diğerinin yanması gerekir. Bunun için öncelikle renk söndürülür ve sonra istenen diğer renk yakılır.

(define (switch color1 color2)( and (clear-bulb color1)(draw-bulb color2)))

Son olarak sorudaki son fonksiyon olan sıradaki rengin yakılması yani kırımızı->sarı->yeşil->kırmızı döngüsünü yapan fonksiyon için mevcut rengi alan ve bu rengi söndürüp döngüdeki bir sonraki rengi yakan fonksiyon aşağıdaki şekilde yazılabilir

(define (next color) (cond [ (eq? color 'red) (switch 'red 'yellow)]

[ (eq? color 'yellow) (switch 'yellow 'green)]

[ (eq? color 'green) (switch 'green 'red)]))

Çözüm çalıştırması:

İlk fonksiyon olan ışığı söndürme:

(clear-bulb ‘red)

İkinci fonksiyon ışığı yakma

(draw-bulb ‘green)

Üçüncü fonksiyon ışığı değiştirme

(switch ‘green ‘yellow)

Son fonksiyon sıradaki ışığı yakma

(next ‘yellow)

(next ‘green)

Açıklama:

Çalışmanın sonucunda görülen ekran aşağıda verilmiştir:

Yorumlar kapalı

E-Mail Nasıl Gönderilir ?

Tarih: Cuma, Ekim 30, 2009 Kategori: Makaleler, Teknoloji


spam Şimdi başlığa bakıpta “Abi naptın yok yani o kadarda cahil değiliz” diye bir tepki verebilirsiniz. Fakat malesef ki sektöründe Türkiye’nin en çok taktir ettiğim, başarılı bulduğum, en büyük ve en güçlü firmalarından bir tanesinin bugün bana attığı e-maili görünce bunuda yazmak zorunda olduğumu düşünmeye başladım.

Düşünün büyük bir firmasınız, kalitelisiniz ve çok güzel işler yapıyorsunuz.  İnternet üzerinden iş yaptığınız için e-mail, web sayfası gibi birçok konuda sanal olarak müşterilerinize hitap etmektesiniz.  O zaman gönderdiğiniz e-maillere veya internet sayfanıza yada internet hizmetlerinize çok çok dikkat ederdiniz doğru mu ?

İnternet hizmeti veryorsanız ve ülkenin büyük internet sayfaları ile çalışıyorsanız muhakkak ki e-maillerinize özelliklede müşterileriniz ile ilişkilerinize dikkat etmelisiniz.

Bugün bir mail aldım. Mailde firma benden Logomu istiyor.  İyi güzel dedim Logomu gönderdim. Fakat maile dikkatle baktığımda toplu bir mail olduğunu anladım.  Yani firma tüm müşterilerine maili toplu olarak göndermiş ve TÜM MÜŞTERİLERİNİN E-mail adreslerini bir güzel afişe etmişti. Sonrada arkadaşın biri Logosunu yine Tüm Listeye Forwet etmişti.

Bu insanlar Türkiye’nin en çok hit alan en önemli site sahipleri. Bildiğim kadarıylada 100bin den fazla hit sahibiler.  Yani toplamda bu e-mail sahipleri milyonlarca ziyaretçi potansiyeline sahip insanlar.

Peki bu arkadaşların mail adreslerini kötü niyetli birisi bir güzel alıp spam yaparsa ?  Ne olacak demeyin bazıları kişisel e-mail benim için sorun olmayabilir yada X kişi içinde sorun olmayabilir.  Ama bir spamcının eline bu mailler düşerse ciddi şekilde rahatsız olacağımız kesindir.   Hele ki böyle bir mail olduğunu gören bir spamcı bu fırsatı asla kaçırmaz.

Firmaya daha doğrusu bana mail atan arkadaşa durumu izah ettim.  Fakat böyle bir firmanın en azından internet hizmeti veren ve ülkemizde başarılara imza atan bu denli önemli bir firmanın kalkıpta böyle bir hata yapması içime sinmedi.  Bu hatayı sineye çekelim derim. Diğer arkadaşlarda anlayışla karşılayacağını düşünerek konuyu bitirmek istiyorum.  Merak etmeyin CC Nedir? BCC Nedir hepimiz biliyoruz.

Bilmeyenler arkadaşlar aynı durumdan yakından Wolkanca‘nın yazısına bir göz gezdirebilirler.

İlgilinizi çekebilecek diğer yazılar…

Yorumlar kapalı

Scanning–part 1

Tarih: Cuma, Ekim 30, 2009 Kategori: Makaleler, Teknoloji


Bu modülde taramadan bahsedeceğim arkadaşlar. Tarama aşaması hacking döngümüzün ikinci aşamasıdır. Üç türlü tarama vardır :

  1. Network
  2. Port
  3. Zaafiyet

Network taraması hedefimizin networkünde bulunan bütün sistemler ve aygıtları bulmak için kullanılır.

Zaafiyet taraması, hedefimizin açıklarını bulmak için kullandığımız tarama türüdür.

Port taraması bizim en çok kullanacağımız, hedefimizin ayakta olup olmadığını bulmak ve ayakta ise hangi port ve servislerinin açık olduğunu bulmak için kullanılır.

Hedefimizin dnsini veya IPsini bildiğimiz sürece karşı tarafa port taraması yapabiliriz. Tarama artık hedefimiz üzerinde fiziksel olarak birşeylere başladığımız adımdır ve arkadaşlar tarama yapmak normalde yasaktır. Kanuni olarak yaptırımları bulunur.

Hedefimizin açık olup olmadığını bulmak için ping kullanırız. Ping paketleri karşı taraftan engellenmediği ve hedefimiz fiziksel olarak açık olduğu sürece karşıya ulaşacaktır ve cevabına göre hedefimizin açık olup olmadığını öğreniriz.

Normalde pingi kullandığımız zaman 4 tane paket gönderilir. Eğer sürekli ping atmak istersek ping -t parametresi ile sınırsız şekilde ping atarız. Bunu sonlandırmak içinde Control+C tuşlarına basarız.

Peki ping paketlerimiz karşı taraftaki firewall tarafından engelleniyorsa ne yapmamız gerekir?

Firewalking denilen bir yöntem sayesinde firewall üzerinde kurulu olan kuralları bulabiliriz. Bu yöntem yapması gerçekten çok zor olan bir yöntemdir. Çünkü firewall zeki bir aygıttır ve alt etmesi zordur. Gönderdiğimiz paketlerin TTL değerleri vardır. TTL iki şekilde bilinir; Time To Live ( yaşama süresi) ve Time To Leave ( ayrılma süresi ). En çok kullanılan haliyle Time To Live bilinir. TTL değerini düzgün olarak incelersek fiziki uzaklıkları hesap edebiliriz. TTL değeri sayesinde iki hop arasındaki uzaklıkları ortalama olarak bulabiliriz. Firewalking yönteminde firewallın önündeki en son hopun ( bu genelde ISP routerı olur ) TTL değerini hesaplayıp, kendi paketlerimizin TTL değerini en son hopun TTL değeri gibi yaparsak firewall üzerindeki kuralları öğrenerebiliriz. Ancak dediğim gibi bu yöntem çok zordur ve geliştirilen son aygıtlar bu tür saldırı yöntemlerini geçiştirebiliyor.

Tarama yaparken kullanacağımız TCP bayrakları vardır. Bu bayraklar iletişim kurmak yada iletişimi kapatmak gibi bir çok işlevi yerine getirmek için kullanılır. Bu bayraklar :

  • Syn : İletişimi başlatmak için kullanılır. Senkronizasyon olarak bilinir.
  • Ack : Bilgilendirme bayrağıdır.
  • Fin : Finish paketidir. İletişimi kapatmak için kullanılır.
  • Rst : Reset paketidir. İletişimi kesmek için kullanılır.
  • Urg : Urgent paketidir. Acil mesajlaşma için kullanıldığı bilinir. Genelde ISP tarafında kullanılır.
  • Psh : Push paketi. Çok farklı çalışma prensibi olan bir pakettir. Bu paket sayesinde, göndereceğimiz paketleri zorlayarak karşımızdaki aygıt veya hostun hafızasında yer tutmasını sağlarız. Bununla ilgili olarak ayrı bir saldırı tür var. Bu konuyu ilerleyen zamanlarda göstereceğim.
  • NULL : Boş paket yani bayraksız pakettir.

Bu paketleri kullanıp tarama yapmamız için öncelikle networkte iletişim kurma yöntemi olarak Three Way Handshake denilen üçlü el sıkışma yöntemini bilmemiz gerekir.

A                                                                                         B

Syn ———————————————–>

<———————————————– Syn/Ack

Ack ———————————————–>

Yukarıdaki grafta üçlü el sıkışmanın çizimini yaptım. Burada iletişim kurmak isteyen A hostu B hostuna syn paketi gönderir. B hostuda bu pakete karşılık olarak syn/ack paketi gönderir. Bu paket “iletişim isteğini gördüm ve bilgim var anlamına gelir, iletişim B hostu tarafından onaylanır”. En son olarakta A hostuda ack paketi göndererek bilgisi olduğunu B hostuna bildirir ve bu sayede iletişim başlar.

Bu bilgiler ışığında şimdi tarama türlerini göstereceğim.

Full Connection Scan : Three Way Handshake yaparak yani karşı hostla iletişim kurarak, hostun açık olup olmadığını öğrenebiliriz. Bu yöntem en sağlıklı tarama türüdür anca yakalanma riski en fazla olandır. CEH sınav sorularından biridir ;)

Syn Stealth :

A                                                                             B

Syn ——————————————>

<—————————————- Syn/Ack

Rst ——————————————->

Bu yöntem kapıyı çalıp kaçma yöntemi olarak bilinir. Amacımız tam bağlantı kurmak değildir sadece karşı taraftan tepki almak için alınır. Tepki alıyorsak karşı taraf açıktır ancak başarı oranı full connection kadar başarılı olmayabilir. Kapıyı çalıp kaçma yöntemi yüzünde yarı açık yani half open olarak bilinir.

Şimdi söyleyeceğim üç tarama türü portların açık veya kapalı olma durumlarına göre aynı tepkileri verecektir.

XMAS Scan :

A                                                                        B

Fin,Urg,Psh ——————————>

1-  <—————————————- Cevap yoksa port açıktır

2- <—————————————-Rst/Ack paketi geliyorsa port kapalıdır.

Burada bilmemiz gereken en önemli şey, bazı bayraklara port açıksa cevap gönderilmez; bunlar fin,urg,psh, rst ve nulldür. Bu bayraklı paketlere normalde port açıksa cevap gelmez. Fin,urg, psh paketleriyle yapılır.

Fin Scan : XMAS scanle anı şekilde yapılır, hedef hosttan gelen tepkiler aynıdır  ancak sadece fin paketiyle yapılır.

NULL Scan : XMAS scanle aynı şekilde yapılır, hedef hosttan gelen tepkiler aynıdır ancak sadece null paketiyle yapılır.

İlgilinizi çekebilecek diğer yazılar…