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.

int dizi[5]={1,2,3,4,5};
   
    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;

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.

b değişkeni için ram organizasyonu
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;

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
Şimdi küçük bir kod yazıp sonuca bakalım;

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

 #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.
Genel olarak 26 harfli ingiliz alfabesi için çözüm;


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



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.


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.