20 Aralık 2016 Salı
13 Aralık 2016 Salı
Uzman Sistemler Adli Karar Alma Sürecinde
Uzman sistemler, belirli bir uzmanlık alanında, gerçek kişilerden derlenen bilgileri temel alarak, zamanla kendisini geliştirebilme yeteneği de olan yazılımlardır. Uzman davranışını taklit etmek üzere çok farklı metotlar kullanılmakla birlikte, en yaygın kullanılanlar;
1)bilgi temsili yöntemleri ve
2)bilgi mühendisliği yöntemleridir.
Her uzman sistemde öğrenme davranışı olmayabilir fakat her uzman sistem geliştirildikten sonra gerçek problemler karşısında insan uzmanla aynı sonuca varmalıdır.
Londra'daki UCL Üniversitesi ile Sheffield Üniversitesi'ndeki bilgisayar mühendislerinin geliştirdiği algoritma, davaları hem yasal hem ahlâki boyutlarıyla inceleyebiliyor. Algoritmayı geliştiren ekip, yapay zekası olan bir bilgisayara AİHM'de görülen 584 davayı yükledi. Bilgisayar da ortada bir insan hakları ihlali olduğunda; bazı ifadelerin veya bilgilerin dava metinlerinde daha sık kullanıldığını tespit etti. Sistemin ifade metinlerindeki bazı kelimeleri süzerek, öğrenme yapıyor ve karar veriyor.
'Robot yargıç' 600'e yakın davanın hükümleriyle ilgili tahminlerde bulundu.Neredeyse her beş karardan dördü doğru tahmin edildi.
Araştırmayı yöneten UCL'den Dr Nikolaos Aletras, "Yapay zeka üzerinde büyük bir ilgi var ancak (yapay zekanın) yakın bir gelecekte yargıçların veya avukatların yerine geçebileceğini düşünmüyoruz. Yine de yapay zeka davaların yapısını daha hızlı algılayacağı için kullanışlı olabilir. Ayrıca Avrupa İnsan Hakları Mahkemesi'ne göre hak ihlalinin yaşandığı davaları bulmakta kolaylık sağlayabilir" dedi.
Uzmanlar 60'lı yıllarda, gelecekte makineler sayesinde dava sonuçlarının tahmin edilebileceğini öngörmüşlerdi.Araştırmanın bir sonraki aşamasında ise uzmanların sisteme daha fazla veri yükleyecekleri belirtildi."Sistemin tanıklardan ve avukatlardan gelen ifadeleri de algılayabilmesi için bir engel yok" dedi.
7 Aralık 2016 Çarşamba
GLA, ISIS'miydi?
Command&Conquer:Generals oyunu 2003 yılında piyasaya sürüldü. Oyunda dünyada 3 hakim güç vardı bunlar; ABD, Çin ve Ortadoğudaki bir terörist organizasyon olan GLA. Aradan 10 yıl gibi bir zaman geçiyor ve birde bakıyorsun ki dünya neredeyse oyundaki gibi 3 kutuplu bir hale gelmiş.
Çin'in üretimden gelen gücü doğu blokunu oluşturuyor, belki Rusya da bu blokda yer alacak. ABD ve Batılı diğer ülkeler bir diğer bloku oluşturacak. Bu ikisinin enerji hatları için savaştığı alan ise malesef bizimde içinde olduğumuz Ortadoğu bölgesi. Bu bölgede oluşturulmuş yapay terör grupları ise neredeyse oyunda anlatıldığı gibi.
Oyundaki 3 ana kuvvet şu şekilde idi;
USA (Amerika Birleşik Devletleri)
ABD'nin
yegane amacı dünyaya hakim olmak, terörizmi bitirip dünyaya demokrasiyi
yaymaktır. Ancak bu yegane amaç için ABD'nin kat edeceği yolda yeni
engeller, yeni düşmanlar beklemektedir. ABD, düşmanlarını yok etmek için
üstün hava gücünü ve üstün teknolojisini kullanır. Diğer taraflara göre
daha fazla para kazansa da, masrafları da bir o kadar fazladır. ABD,
süper silah olarak hedef bölgeye belirli bir süreliğine yıkıcı hasar
veren lazer ışınlarını kullanır.
PRC (Çin Halk Cumhuriyeti)
Bu
ülke, dünyayı kapitalizmden kurtarıp komünizmi dünyaya egemen yapmak
için düşmanlarına karşı cesur tanklarını ve askerlerini kullanır. Kara
kuvvetleri ağırlıklıdır. Çin'in savaş alanında Horde Effect (Kalabalık
Etkisi) vardır. Olabildiğince çok insan gücü kullanan Çin'in birimleri
bir arada saldırıda bulundukları zaman birbirlerinin yanında oldukları
sürece saldırı ve savunma gücü gibi özellikleri artar, güçlenirler. Eğer
sürüden ayrılırlarsa güçleri azalır. Savaşı havada da sürdürebilmek
için Sovyet/Rus yapımı MiG'leri kullanırlar. Çin yapımı bir hava alanına
dört adet MiG girebilir. Enerji üretmek için nükleer santralleri
kullanır. Çin, oyundaki tek nükleer güçtür. Taktik nükleer savaş
başlığını mermi olarak kullanan topçulara, atıldığı yere yüksek miktarda
hasar ve radyoaktivite yayan taktik nükleer silaha sahiptir.
GLA (Küresel Özgürlük Ordusu)
Orta
Doğu'da kurulan terörist bir örgüttür. Amaçları Orta Doğu'da bağımsız
bir ülke kurmaktır. Başlarda Çin ile ortak çıkarlara sahip olsalar da,
bir süre sonra bu örgüt Çin'e saldırır ve Çin bu sefer, ABD'ye yardım
etmeye başlar, ABD ile ortak çıkarlar güder. Bu örgüt, şehir içi
çatışmalarında ABD ve Çin'i geride bıraksa da, hava birimleri açısından
sadece bir Gazelle saldırı helikopterine sahip olduğu için Çin ve
özellikle ABD tarafından şehir içi çatışma avantajı yok edilmektedir.
Yine de örgütün güçlü silahları ve birimleri yok değildir. Oyunda diğer
taraflara göre daha az para kazanırlar. Ancak masrafları daha azdır.
GLA, düşmanlarını yok etmek için genelde gerilla savaşı taktiğine uygun
birimlerini, gizlenebilen birimlerini ve zehri kullanır. Zehir,
kullanıldığı yerde en çok piyadelere zarar verir. Bu yüzden Çin'in
yüksek insan gücü avantajını neredeyse yok etmektedir. Bu örgütün süper
silahı SCUD füzeleridir. Hedef bölgeye atıldığında zehir yayar ve
piyadeler başta olmak üzere birçok birime büyük hasar verir.
Oyunu yıllar önce oynayanlar GLA'in kullandığı araçların ve yöntemlerin birçoğunun ISIS (Işid Deaş) tarafından da kullanıldığını anımsayacaktır. Oyun Amerikalılar tarafından yapıldığı için İslam'ı kötüleme adına herşey düşünülmüş, daha da korkutucu olanın is oyunda tasvir edilen şeylerin yıllar sonra bir bir gerçekleşmesi. Sinirli halk, terörist gibi birimlerin yanısıra Toyota pikapları andıran araçlar, bomba yüklü kamyonlar, eski tanklar, scud füzeleri vs. tamamı son bir kaç yılda Işid (Isis veya Deaş) yöntemlerini hatırlatıyor.
Oyunda kullanılan pikap türü araçlar neredeyse aynısı gibi karşımıza çıktı,
Bomba yüklü kamyonlar oyundakinin neredeyse aynısı gibi kullanıldı;
Irak ordusundan çalınan Scud füzeleri bile oyundakinin neredeyse aynı;
Oyunu bundan yaklaşık 10 yıl önce oynayan herkesin bilinçaltına Müslümanların terörist olduğu algısı yerleştirildi. Daha sonra ise neredeyse tıpatıp aynısı yaşatıldı.
17 Kasım 2016 Perşembe
Yapısal Programlama (Structures) C++
Bazı durumlarda farklı tipteki verilerin aynı değişkende tutulması istenebilir. Öğrenci isim, soyisim, numara, yaş vb. bilgiler farklı türlerde olsalarda kullanım kolaylığı olması için aynı yapı altında bulunması gerekir. C++ dilinde bu tür veri yapıları tanımlanan Structure altında tutulur.
struct ogrenci{
char ad[20];
char soyad[20];
int numara;
int yas;
};
Yukarıdaki örnekte ogrenci yapısı ile tanımlanmış ve iki char türünde iki adet integer türünde veri tutan bir yapı görülmektedir. Bunda sonra ogrenci yapısı ile tanımlanan her değişken bu yapının altındaki verileri de tutacaktır.
#include <iostream>
#include <string.h>
struct ogrenci{
char ad[20];
char soyad[20];
int numara;
int yas;
};
int main() {
struct ogrenci o1={"yasin","saglam",442,34};
struct ogrenci o2;
strcpy(o2.ad,"abuzer");
strcpy(o2.soyad,"kadayif");
o2.numara=443;
o2.yas=33;
printf("%s - %s - %d - %d\n",o1.ad,o1.soyad,o1.numara,o1.yas);
printf("%s - %s - %d - %d\n",o2.ad,o2.soyad,o2.numara,o2.yas);
}
Yukarıdaki örnekte görüldüğü üzere struct veri yapılarına istenirse liste şeklinde;
struct ogrenci o1={"yasin","saglam",442,34};
ya da yapının elemanları için tek tek o2.numara=443 şeklinde veri girilebilir.
Struct yapıları iç içe kullanılarak karmaşık verilerin daha kolay seçilmesi ve işlenmesi sağlanabilir. Veritabanı normalizasyonunda olduğu gibi bir birinden farklı verilerin farklı structlarda tutulmaları efektifliği artıracaktır. aşağıdaki örneği inceleyelim;
#include <iostream>
#include <string.h>
struct gelen{
int urun_kodu;
int miktar;
};
struct giden{
int urun_kodu;
int miktar;
};
struct depo{
int urun_kodu;
char urun_ismi[20];
int miktar;
struct gelen gelen1;
struct giden giden1;
};
int main() {
struct depo d1;
d1.urun_kodu=1001;
strcpy(d1.urun_ismi,"Renkli Kalem");
d1.gelen1.urun_kodu = d1.urun_kodu;
d1.giden1.urun_kodu = d1.urun_kodu;
d1.gelen1.miktar=301;
d1.giden1.miktar=236;
d1.miktar = d1.gelen1.miktar - d1.giden1.miktar;
printf("DEPO Bilgileri\n");
printf("%d numarali %s isimli urunden %d adet bulunuyor",d1.urun_kodu,d1.urun_ismi,d1.miktar);
}
16 Kasım 2016 Çarşamba
Her Yönüyle Pointerlar - 2
Dizilerde pointer kullanımı biraz farklıdır. Tanımlanmış bir dizi için atanan adreslerin hepsi atanan pointer ile tutulabilir.
Alt satırda p =&dizi[0] diyerek istersek dizinin tek bir elemanını da pointera aktarabiliriz. Programın çıktısı aşağıdaki gibi olacaktır.
Pointer ile String Kullanımı
Aşağıdaki örneği inceleyelim;
int dizi[5]={1,2,3,4,5};
int *p;
p = dizi;
int *p;
p = dizi;
Dizinin tüm elemanlarını adresleri p pointerına aktarılmış olur. İndis değerlerine göre p, p+1, p+2 şeklinde tüm dizi elemanlarına ulaşılabilir.
Aşağıdaki örneğe bakalım;
#include <iostream>
int main() {
int dizi[5]={1,2,3,4,5};
int *p;
p = dizi;
printf("%u \n",p);
printf("%u \n",p+1);
printf("%u \n",p+2);
printf("%u \n",p+3);
printf("%u \n",p+4);
//adresteki veri yazdırılmak istenirse
printf("\nDizinin 3. elemaninin adresindeki veri = %d \n",*p+2);
//pointerlara istenirse dizinin ilk ve ikinci elemanları da atanabilir
p = &dizi[0]; // burada sadece dizinin ilk elemanının adresi tutulur
printf("\n\n%u ",p);
}
Alt satırda p =&dizi[0] diyerek istersek dizinin tek bir elemanını da pointera aktarabiliriz. Programın çıktısı aşağıdaki gibi olacaktır.
Pointer ile String Kullanımı
Pointer ile string kullanım mantığı normal diziler ile aynı şekildedir. Herhangi bir karakter dizisinin başlangıç adresi pointer değişkende saklanır, her karakter için pointer indeksi artırılabilir.
char yazi[]="karakter";
char *p;
p=yazi;
char *p;
p=yazi;
Aşağıdaki örneği inceleyelim;
#include <iostream>
int main() {
char yazi[]="karakter";
char *p;
p=yazi;
printf("%u adresindeki karakter: %c\n",p,*p);
printf("%u adresindeki karakter: %c\n",p+1,*p+1);
printf("%u adresindeki karakter: %c\n",p+2,*p+2);
}
Her bir karakter için bir byte alan tuttuğu için pointerların işaret ettiği adresler birer artacaktır. Programın çıktısı aşağıdaki gibi olacaktır.
Her Yönüyle Pointerlar - 1
Bilgisayar programcılığında tanımlanan her değişken Ram üzerindeki bellek gözlerinde bulunur. Bu bellek gözlerininde birer adresi mevcuttur. Derleme işlemi sonrasında bu değişkenler makine koduna dönüştürüldüğünde adresleri de derlenir böylece işlemci gerekli olduğunda o adrese giderek değişken değerini alır.
int b=5;
şeklinde tanımlanan b değişkeni aslında RAM üzerinde bir bellek gözünde yer tutar.
Yukarıda tanımlanan b değişkeni şekilde gösterildiği gibi belleğin 10548 nolu gözünde tutulsun. Derlenen program b değişkenine ulaşmak için bu adresi kullanacaktır. Bu gözde tutulan veri ise 5 değeridir. İşte tam bu noktada pointer tipi değişkenler işin içine girmektedir. Pointer tipi değişkenler herhangi bir değişkenin adresini tutarlar, istenildiğinde o göze giderek oradaki değeri getirirler. Unmanaged programlama ve performans gerektiren işlerde pointer tipi değişkenler sıklıkla kullanılır.
Pointer tipi değişkenler başlarında * işareti ile tanımlanırlar. Aşağıdaki resimde gösterileni örnek verirsek;
Şimdi küçük bir kod yazıp sonuca bakalım;
b değişkeni için ram organizasyonu |
Pointer tipi değişkenler başlarında * işareti ile tanımlanırlar. Aşağıdaki resimde gösterileni örnek verirsek;
int *a;
int b;
a=&b
Şeklinde tanımlanan *a ve b değişkenleri için b'nin adresi (1008) a değişkeninim bellek gözüne yazılmıştır. Programın ilerleyen aşamalarında *a şeklinde çağrılan a değişkeni her zaman 1008 numaralı gözüne gidecektir. O gözde hangi değer varsa onu getirecektir.
Bir pointer örneği |
#include <iostream>
int main() {
int b=5;
int *a;
a=&b; //b değişkeninin adresi a'nın bellek gözüne yazılır
printf("%d",a); // a değişkeni b değişkeninin adresini tutar
printf("\n%p",*a); // *a ise bu adresteki datayı alır.
printf("\n%u",*a); // pointerlar %p ve %u formatlarıyla ekrana bastırılır.
}
Programın çıktısı şu şekilde olacaktır;
a pointerına b değişkeninin adresi a=&b ifadesi ile aktarılır. Bundan sonra a değişkeni * işareti konulmadan yazdırılırsa direk bellek gözündeki veri, ki bu b'nin adresidir. Bu değer Ram'in 7339588 nolu adresidir. Alttaki %p ve %u şeklinde yazdırılırsa b'nin adresini işaret eder. Bu aşamadan sonra derleyici b'nin adresine gider ve oradaki 5 değerini yazar. Kısaca * karakteri işaretçidir, bellek gözünde eğer adres varsa, o adrese gider ve ordaki datayı alır.
Bir diğer örnek;
Bir diğer örnek;
#include <iostream>
int main() {
int b,a=1;
int *pa1, *pa2;
pa1 = &a;
pa2 = pa1;
b= ++(*pa1);
*pa1 = *pa2 + b;
printf("b degiskeni : %d\n", b);
printf("a degiskeni : %d\n", a);
printf("pa1 degiskeni : %u yonlendirdigi adres %d\n", *pa1,pa1);
printf("pa2 degiskeni : %u yonlendirdigi adres %d", *pa2,pa2);
}
Yukarıdaki programda değişkenler tanımlandıktan sonra pa1 içine &a ifadesi ile a değişkeninin adresi kopyalanıyor. Daha sonra pa1 ve pa2 birbirine eşitleniyor, bu aşamada her iki pointer değişkenimizde a değişkeninin adresini tutmaya başlıyor. b = ++(*pa1) ifadesinde ise pa1'in tuttuğu adresteki veriyi bir artırıyor yani a değişkenini 1 artırıp b'yi 2 yapıyor. *pa1 = *pa2 +b ifadesi aslına a değişkeni ile b değişkeninin toplamıdır ve sonuç 4 oluyor. Bu değer a'nın adresini tutan pa1 ile a'nın bellek gözüne yazılıyor. Program çıktısı ve değişkenler aşağıdaki gibi olacaktır;
15 Kasım 2016 Salı
Sıralama Algoritmaları
Sıralama algoritmaları bilgisayar programcılığı açısından oldukça önemli bir konudur. Her ne kadar gelişmiş programlama dillerinde dizi elemanlarını sıralayan hazır fonksiyonlar olsada programcılığa yeni başlayanlar için programlama mantığının kavranması için önemli konulardır. Temel sıralama yöntemleri aşağıda kısaca anlatılmıştır.
Kabarcık Sıralama (Bubble Sort)
Hafıza bloğunda yada bir dizide ard arda gelen iki elemanın birbirileri ile karşılaştırılması ile yapılır. Artan yada azalan sıralama isteğine göre kodda "<" veya ">" operatörü kullanılır. Yavaş bir sıralama operatörüdür.
Ancak bazı durumlarda dizinin sıralanması yukarıda geçen sayı (n
elemanlı bir dizi için n geçiş) kadar tekrarı gerektirmez. Bu durum
sadece dizi tersten sıralıysa gerekir. Ayrıca dizi zaten sıralı ise ilk
geçişten sonra sıralamanın durmasını bekleriz.
Bir diğer iyileştirme ise yukarıdaki örneğe dikkatle bakıldığında
fark edilebilir. Kabarcık sıralamasında dizi üzerindeki her geçişten
sonra dizinin en büyük elemanı dizinin sonuna atılmaktadır. Örneğin ilk
geçişten sonra en büyük eleman, 2. geçişten sonra en büyük iki eleman
20. geçişten sonra en büyük 20 eleman gibi dizinin sonunda yerleşmekte
ve bir daha hiç değişmemektedir. bu durumda örneğin 20. geçişte son 20
elemana bakmanın bir anlamı yoktur. Bu iyileştirme (optmisation) ile
de hız kazanmak mümkündür. Bu sıralama yöntemi diğer yöntemlere göre biraz yavaştır, çok büyük dizilerde bu hız farkı hissedilebilir.
Bubble Sort |
Beş elemanlı (random sayılardan oluşan) bir dizi için C++ kodları aşağıda verilmiştir.
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main() {
int dizi[5];
int i,j,temp;
srand(time(0));
for(i=0;i<5;i++)
{
dizi[i]=rand()%100+1;
printf("%d - ",dizi[i]);
}
for (i=0; i<5; i++)
{
for (j=0; j<5-i; j++)
{
if(dizi[j] > dizi[j+1])
{
temp = dizi [j];
dizi [j] = dizi [j+1];
dizi [j+1] = temp;
}
}
}
printf("\n");
for(i=0;i<5;i++) printf("%d - ",dizi[i]);
}
Seçmeli Sıralama (Selecton Sort)
Listedeki en küçük veya en büyük elemanın seçilerek, diğer elemanların yer değiştirmesi prensibi ile çalışan algoritmadır. İşlem başlangıcında belirlenen en küçük sayıyı tutan değişkene dizinin ilk elemanı atanır ve dizi elemanları ile tek kıyaslanır. Daha küçüğü bulunursa ordaki indis ile yer değiştirilir.
Bubble sorttan daha hızlıdır fakat çok elemanlı listelerde efektif değildir. Çalışma prensibi aşağıdaki grafikteki gibidir.
Selection Sort |
Beş elemanlı (random sayılardan oluşan) bir dizi için C++ kodları aşağıda verilmiştir.
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main() {
int dizi[5];
int i,j,enkucuk,enbuyuk,yedek;
srand(time(0));
for(i=0;i<5;i++)
{
dizi[i]=rand()%100+1;
printf("%d - ",dizi[i]);
}
for (int i = 0; i < 5-1; i++)
{
enkucuk = i;
for (int j = i+1; j < 5; j++)
{
if (dizi[j]<dizi[enkucuk])
{
enkucuk = j;
}
}
if (enkucuk != i)
{
yedek = dizi[i];
dizi[i] = dizi[enkucuk];
dizi[enkucuk] = yedek;
}
}
printf("\n");
for(i=0;i<5;i++) printf("%d - ",dizi[i]);
}
Eklemeli Sıralama (Insertion Sort)
Her adımda dizi elemanlarını sıralayan bir algoritmadır. Eklemeli sıralama algoritmasının zaman karmaşıklığı hesaplanırken,
yapılan karşılaştırmalar ve yer değiştirmeler dikkate alınır. Eklemeli
sıralama algoritması n elemanlı bir listede, ikinci eleman için en fazla 1 karşılaştırma ve 1
yer değiştirme yapar, üçüncü eleman için 2 karşılaştırma ve 2 yer
değiştirme, dördüncü eleman için 3 karşılaştırma ve 3 yer değiştirme
yapar. Kabarcık ve Seçmeli sıralamaya göre daha hızlıdır. Çalışma şekli aşağıdaki grafikteki gibidir.
Insertion Sort |
Beş elemanlı (random sayılardan oluşan) bir dizi için C++ kodları aşağıda verilmiştir.
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main() {
int dizi[5];
int i,j,yedek;
srand(time(0));
for(i=0;i<5;i++)
{
dizi[i]=rand()%100+1;
printf("%d - ",dizi[i]);
}
for (int i = 0; i < 5; i++){
j = i;
while (j > 0 && dizi[j] < dizi[j-1]){
yedek = dizi[j];
dizi[j] = dizi[j-1];
dizi[j-1] = yedek;
j--;
}
}
printf("\n");
for(i=0;i<5;i++)
{
printf("%d - ",dizi[i]);
}
}
13 Kasım 2016 Pazar
Sezar Şifreleme Yöntemi
En eski şifreleme yöntemlerinden bir tanesi de Romalı'ların geliştirmiş olduğu şifreleme yöntemidir. Harflerin sırasını kaydırma yöntemi ile yapılır. Kodu çözecek olan kişi kaydırma sayısını biliyorsa iletilen mesajı rahatlıkla çözebiliyor. Örneğin üç harf atlamalaı bir şifrelemede "abi" kelimesi "del" ile kodlanır.
3 harf kaydırmalı Sezar şifreleme |
Öte yandan, Sezar Şifresi(Cevrimsel alfabe) kırmak görece kolay
olmaktadır: Bir filolog, bir dilde en çok geçen harfleri bulabilir. O
harfler ile mesajda en sık geçen harfleri karşılaştırarak hangi harfin
hangi harf ile değiştirildiğini bulabilir. Bu adımların ardından, mesaj
çözülmüş olur. Sezar Şifresi Hakkında:
- Kaba kuvvet (brute-force) saldırısıyla çok kolay çözülür. ÇünküŞifreleme/Şifre çözme yöntemi gizli değildir.
- Sadece 25 (Latin alfabesi harf sayısı) farklı deneme yeterlidir. (Anahtar uzayı 25 elemanlıdır.)
- Düz metin (plaintext) ve formatı gizli değildir.
- Harf değiştirme şifrelemelerinde toplam 26! farklı şifre tablosu vardır.
kaydirma_indisi = (i + kaydirma_miktari) % 26;
sifreli[i] = alfabe[kaydirma_indisi];
C++ kodları ile Sezar şifreleme aşağıdaki gibi yapılır;
#include <iostream>
#include <string.h>
int main() {
int slength,i,j,as,indis;
char str1[]="abcdefghijklmnopqrstuvwxyz";
char str2[256];
printf("Lutfen sifrelenecek metni giriniz:");
scanf("%s",&str2);
printf("Lutfen atlama sayisini giriniz:");
scanf("%d",&as);
slength = strlen(str2);
for(i=0;i<slength;i++)
{
for(j=0;j<26;j++)
{
if(str2[i]==str1[j])
{
indis = (j + as)%26;
printf("%c",str1[indis]);
}
}
}
}
Scytale
Antik Yunan'da kullanılan bir gizli haberleşme ve şifreleme yöntemidir. Bir baston yada çubuğun etrafına sarılan şerit şeklinde kesilmiş, deri parçasına iletilecek mesaj yazılır. Şerit bastondan geri çıkarıldığında mesajın çözülmesi artık çok zordur. Mesajı okuyabilmek için aynı çapta ve boyutta çubuk bulmanız gerekiyor.
Burada cipher (şifreleyici) şeridin sarıldığı baston oluyor, mesajı gönderen ve alan kişi aynı ebatlarda bastona sahipse mesaj kusursuz biçimde karşı tarafa ulaşıyor. Çok güçlü bir şifreleme yöntemi değil tabiki ama bundan 3000 yıl öncesini düşünürsek kırılması epey zor bir yöntem.
Programcılık açısından ise orta zorlukta bir dizi işlemi gerektirir. Diyelim ki kodu oluşturacak sargı sayısı 10 olsun, her bir satır için 10 karakter saklayacaktır. İkinci satırın ilk harfi kodlama yağıldığında tüm metnin ikinci harfi olacaktır. Bu şekilde düşünüldüğünde 2 boyutlu dizinin tek boyutlu hale getirilmesi işlemi yapılyor demektir.
Alt satırdaki karakterler üst satırdaki karakterlerin arasına geçiş yapacaktır;
Yukarıdaki;
BUBİRŞİFRELİMESAJDIR kelimesi
BLUİBMİERSŞAİJFDRIER olarak şifrelenir.
12 Kasım 2016 Cumartesi
Atbash Şifreleme Yöntemi
Ortadoğuda kullanılan en eski şifreleme biçimlerinden biridir. Arami alfabesinin tersten yazılması ile oluşturulan bir kodlayıcıya sahiptir. Tarih boyunca Babil'liler, Yahudiler ve Araplar tarafından sıkça kullanılmıştır. Alfabenin tamamının ters çevrilerek oluşturulan kodlayıcı ile oluşturulan tablo;
Atbash şifreleme yöntemini bilgisayar ile kolayca kodlayabilmek için alfabe ortadan ikiye ayrılır ve her satır için bir karakter dizisi tutulur.
Örnek: Yukarıdaki tabloya göre;"avlu" kelimesi
"zeof" olarak çevrilir.
Atbash şifreleme yöntemi oldukça zayıf kırılması kolay bir şifreleme yöntemidir. Yeni harf üretirken herhangi bir "key" değişkeni yoktur. Tekrar eden kelimelere bakarak kolayca yada kullanılan dildeki en yoğun harflere bakarak (Türkçede K,L,A gibi harfler) kolayca kırılabilir. 2500 yıllık tarihine bakıldığında ve o dönemdeki okuma yazma oranları göz önüne alındığında zamanına göre kullanışlı bir şifreleme yöntemi.
Şifreleme yöntemini C++ dili ile gerçekleştirelim;
#include <iostream>
#include <string.h>
int main() {
int slength,i,j;
char str1[]="abcdefghijklmnopqrstuvwxyz";
char str2[]="zyxwvutsrqponmlkjihgfedcba";
char str3[256];
printf("Lutfen sifrelenecek metni giriniz:");
scanf("%s",&str3);
slength = strlen(str3);
for(i=0;i<slength;i++)
{
for(j=0;j<26;j++)
{
if(str3[i]==str1[j])
{
printf("%c",str2[j]);
}
}
}
}
3 Kasım 2016 Perşembe
WestWorld
2016 yılı güz sezonunda başlayan ve tahminimce adını gelecekte çok sık duyacağımız bir dizi. An itibari ile 5 bölüm yayınlandı ve şimdiden epey takipçisi oluştu. Dizi 1973 yılında aynı adla çekilmiş bir filmden uyarlanmış. Dizi hem bilim-kurgu, hem dram hemde western ögelerinin üçünü de barındırıyor. Yakın bir gelecekte gerçek insanla ayırt edilemeyecek şekilde üretilen robotlar, yapay olarak oluşturulan bir ortamda çeşitli rolleri üstlenirler. Oluşturulan ortam ise tarih olarak 1800'lü yılların son çeyreği yada bizim bildiğimiz şekliyle vahşi batı zamanları yani WestWorld.
Robotlar ki bu vahşi batı ortamında "Ev sahipleri" olarak adlandırılıyorlar. İçlerinde barındırdıkları yazılım ile kendilerine verilen döngüleri yaşıyorlar. Kovboy ise kovboy gibi davranıyor, şerif ise şerif gibi davranıyor, üreticiler istemediği sürece rollerinden ayrılamıyorlar. Gerçek dünyadan bu yapay dünyaya zevk için gelenlere ise "Misafirler yada Gelenler" deniyor. Westworld'de misafir yada oyuncu olarak gelenler ise genelde psikopat tipli zengin ve kariyerli insanlar. Gerçek dünyada yapamadıkları her türlü pisliği (cinayet, soygun, hırsızlık, tecavüz vb.) bu dünyada gerçekleştirerek mutlu oluyorlar. Misafirlerin bir özelliğide oyun içinde asla ölmemeleri, vurulsalar dahi ölmüyorlar ama ev sahibi robotlara istediklerini yapabiliyorlar. Gün sonunda yaralanan, ölen veya zarar gören robotlar tekrar tamir edilip oyuna dahil ediliyor ve kendilerine verilen döngüyü yaşamaya devam ediyorlar.
Dizinin ana karakteri ve olayların çevresinde döndüğü kişi bir robot olan Dolores Abarnathy adlı iyi huylu çiftlik kızı. Daha sonra ise kendisinin döngüsü kırılıyor ve bıçkın bir cowgirle dönüşüyor(5. bölüm itibari ile). Dolores Westworld'un en eski robotlarından ve kendisinin ve yaşamının sahte olduğunu yavaş yavaş seziyor fakat bunu gizliyor.
Dolores Abartnathy |
Dr. Robert Ford karakterini ise Anthony Hopkins canlandırıyor. Westworld ortamını uzun bir süre önce arkadaşı olan Arnold ile tasarlayan mühendis. Dr. Robert Ford arkadaşı gibi yapay zekaya inanmıyor dolayısı ile robotlara karşı acımasız bir tutum içinde. Arkadaşı ise arkasında bir çok sırla birlikte 35 yıl önce intihar etmiş.
Dr. Robert Ford |
Dizideki bir diğer önemli karakter ise The Man in Black rolü ile Ed Harris. Westworld oyununun en eski oyuncularından, nerdeyse bütün karakterlerin döngülerini ezbere biliyor. Aradığı şey ise geliştiricilerden Arnold'un bıraktığı bir sırrı bulabilmek. Bu sır ise bir labirent şeklinde çiziliyor. Dizideki bazı karakterlerde bu labirentin farkında. The Men in Black ise bu karakterle bir likte vahşi eylemler gerçekleştirerek hedefine ulaşmaya çalışıyor.
The Man in Black |
Dizinin bir diğer önemli karakteri ise Bernard Lowe. Robotlarında normal bir zekaya ulaşabileceğine gizliden gizliye inanan Bernard, Dolores ile gizli mulakatlar gerçekleştiriyor. Dr. Robert Ford (Anthony Hopkins) tarafından sık sık uyarılan Bernard ise robotlara acıyan onları seven bir karakter gibi duruyor.
Bernard Lowe |
Dizinin bir diğer önemli karakteri ise Maeve Millay. Bir bar çalışanı kadın olmasına rağmen, gerçeklere epey yaklaşan bir karakter. Tamirat esnasında bir kaç sefer uyandığı için bazı olayları hatırlayabiliyor. İlerleyen bölümlerde Dolores ile yolu kesişecek gibi bir hava var.
Maeve Millay |
Uzun süre döngüde kalan robotlar bazı bilgileri hatırlamaya başlıyorlar. Yaşadıkları dünyada bazı şeylerin yanlış gittiğinin farkına varıyorlar ve sorgulamaya başlıyorlar. Sonuca yaklaşan robotlar döngüden çıkarılıp depoya kaldırılıyor. Yaşadığımız dünyayı sorgulamımıza, yaşamın amacını sorgulamamıza yol açacak bir dizi olması izleyenleri epey etkiliyor. Davranış bilimleri ve yapay zeka ile uğraşanlar içinde ayrı bir merak konusu uyandırıyor.
1 Kasım 2016 Salı
DNA Dizilerini Karşılaştırma (BLAST)
DNA dizilerini karşılaştırma işlemi için en yaygın kullanılan uygulama BLAST yazılımıdır. NCBI (National Center for Biotechnology Information) kütüphanesi içinden istenen genom kodları hızlı bir şekilde karşılaştırılıp filogenetik soy ağaçları üretilebilir. Bu yazıda istenen bir DNA dizisi veritabanındaki diğer dizilerle kıyaslanıp, dizi hizalama işlemi gerçekleştirilecek ve soy ağaçları oluşturulacaktır.
Aşağıdaki videodaki anlatım ayrıca adım adım yazılı olarak da anlatılmıştır.
Aşağıdaki videodaki anlatım ayrıca adım adım yazılı olarak da anlatılmıştır.
1. Adım - Aranılan DNA dizisini kütüphaneden bulmak.
Bunun için ilke önce https://www.ncbi.nlm.nih.gov/ adresine giriş yapınız. Siteye giriş yaptıktan sonra üst taraftaki arama kutucuğunu "Gene" olarak ayarlayın.
Şimdi aradığınız Genomun ismini belirtiniz, ben Human Actin yazarak arama yaptım. Gene bölümünde yaklaşık 33 bin kayıt buldu.
Gene linkine tıkladığınızda bulunan sonuçlar için ayrı ayrı linklere ulaşırız. Ben buradan ikinci sıradaki FLNA isimli genomu seçeceğim.
Genomla ilgili temel bilgileri buradan görebilirsiniz. Fakat bizim aradığımız DNA dizisi sayfanın oldukça aşağısında "NCBI Reference Sequences (RefSeq)" adlı başlığın altında bulabiliriz. "FASTA" formatında almak için o seçeneği seçiyoruz.
Açıklama satırı hariç, tüm DNA kodlarını seçerek kopyalayalım. Bu aşamadan sonra Blast programına geçip oraya yapıştıracağız. İsterseniz kodları bir word yada txt doyasına yapıştırıp daha sonra kullanmak içinde saklayabilirsiniz.
2. Adım - BLAST Programı ile dizileri hizalama yaptırarak karşılaştırmak
Bu aşamada artık elde ettiğimiz DNA kodlarını Blast programı ile hizalama yaptıracağız ve Genom veritabanındaki benzer dizileri bulduracağız. Anasayfadan BLAST linkine tıklayarak yada şu adresten --> https://blast.ncbi.nlm.nih.gov/Blast.cgi
Linke ulaştığınızda Nükleotid, Protein yada translate edilmiş data ile yapacağınız hizalama ilgili seçeneği seçiniz. Biz nükleotid karşılaştırması yapacağımız için onu seçiyoruz.
Açılan pencerede ana text alanına az önce kopyaladığımız DNA kodlarını yapıştırıyoruz. Aşağıdaki alanda ise sadece insan genomu, fare genomu yada tüm genomları araştırmak istiyorsanız others seçeneğini seçiyoruz. Biz tüm kodları araştırarak daha geniş bir ağaç oluşturmak istediğimiz için others seçeneğini seçiyoruz. En aşağıda ise yüksek uyumluluktan - düşük uyumluluğa doğru seçim yapabilirsiniz. Düşük uyumluluk seçtiğinizde binlerce benzer dizi bulunabilir. Biz orada "Highly Similar" seçeneğini seçelim. Bu işlemler bittikten sonra En alttaki BLAST butonuna basıyoruz.
Bu aşamadan sonra araştırdığınız kodun uzunluğuna göre işlem biraz uzun sürecektir. Benim araştırdığım oldukça uzun olan DNA kodu için yaklaşık 40 saniye sürdü.
Sonuç olarak epey uzun bir açıklama sayfası oluşturuldu. 200 adet yüksek uyumlu DNA dizisi bulundu.
Sonuç olarak epey uzun bir açıklama sayfası oluşturuldu. 200 adet yüksek uyumlu DNA dizisi bulundu.
Sayfayı aşağıya doğru çekip ve bulunan dizileri ve uyumluluk yüzdelerini görebilirsiniz. Yüksek uyumlu %99 benzeri çıkan dizilerin yine İnsan gen dizileri olduğunu görebilirsiniz.
Sayfanın biraz daha altına indiğinizde bulunan tüm diziler için hizalama sonuçlarını görebilirsiniz. Burada sizi oldukça uzun bir sayfa bekliyor çünkü yüzbinlerce satırlık bir karşılaştırma yapıldı bunların dökümü sunuluyor.
3. Adım - Ağaç Yapısının oluşturulması
Bu aşamada hizalaması yapılan dizilerin benzerlik oranına göre Filogenetik ağaç yapısı oluşturulacaktır. Aynı sayfada bulunan gen dizilerinden isterseniz istediklerinizi seçin yada hepsini seçmek istiyorsanız en üstteki All seçeneğini seçiniz. Daha sonra "Distance tree of results" linkini tıklayınız. Sistemin ağaç yapısını oluşturması biraz zaman alabilir bekleyiniz.
İşlem bittikten sonra ağaç yapısını görebilirsiniz. İsterseniz sol üst köşedeki yaklaştırma aracı ile ağacı büyüterek inceleyebilirsiniz.
Tools seçeneği altında bulunan Layout türleri ile isterseniz ağaç yapısını farklı şekillerde inceleyebilirsiniz.
İyi çalışmalar.
Kaydol:
Kayıtlar (Atom)