16 Şubat 2014 Pazar

Sıralı Örüntü Madenciliği (Sequential Pattern Mining)

Eğer veri madenciliği ile ilgileniyorsanız mutlaka adını duymuşsunuzdur. Sıralı örüntü madenciliği veri madenciliğinin bir konusudur ve sıralı bir şekilde ilerleyen değerlerin bulunduğu veri örnekleri arasında, istatiksel olarak uygun örüntüleri bulmayı amaçlar. Örneğin bir mağazada alışveriş yapan müşterilerin 3 ay içerisinde önce bilgisayar, sonraki tarihlerde CD-ROM ve en son dijital kamera satın almaları örüntüsü gibi. Bu alanda birçok önemli bilişimsel problem vardır: verimli veritabanları oluşturmak ve bu veritabanlarında tutulan dizilere erişim için indeksler üretmek, sıklıkla tekrar eden örüntüleri elde etmek, benzerlik için dizileri karşılaştırmak (DNA’daki gibi) ve dizinin kayıp elemanlarını yeniden oluşturmak. Genelde sıra madenciliği problemleri, metin işleme algoritmalarına dayanan karakter dizisi madenciliği (string mining) ve ilişki kuralı öğrenimine (association rule learning) dayanan eleman kümesi madenciliği (itemset mining) olarak iki gruba ayrılır.

Karakter dizisi madenciliği
Karakter dizisi madenciliği, sınırlı sayıda harf bulunan bir alfabenin kullanılarak oluşturulduğu elemanlarda, belirli örüntülerin aranması ile ilgilenir. Fakat örüntünün kendisi çok uzun olabilir. Alfabe olarak günlük hayatta kullandığımız ASCII karakter kümesinden oluşturulan, protein dizilimleri oluşturmak için DNA veya aminoasitlerde kullanılan ‘A’, ‘G’, ‘C’ ve ‘T’ nükleotit isimleri örnek olarak verilebilir. 
Karakter dizilerindeki alfabe düzeninin analizinde kullanılan biyoloji uygulamaları, gen ve protein dizilimlerinin özelliklerinin tespit edilmesi için incelenmesinde kullanılabilir. Amaç sadece, bir proteindeki DNA’da bulunan harflerin dizilimini bilmek değildir. Bunun yerine dizilimin bir anlam ifade etmesi için, yapısının ve hangi biyolojik fonksiyonu ifade ettiğinin bilinmesi gerekir. Bunun için öncelikle her dizilimde bulunan ayrı bölgeler ve yapısal birimler tanımlanır ve devamında her yapısal birime bir fonksiyon atanır. Bunun sağlanması için önceki çalışılan dizilimler ile verilen dizilimin karşılaştırılması gereklidir. Eğer karakter dizisinde eklemeler, silinmeler veya mutasyonlar varsa dizilerdeki benzerliği bulmak oldukça karmaşıklaşır.

Eleman Kümesi Madenciliği
Sıralı örüntü madenciliğinde, eleman kümelerinin oluşma sıklığı ve hangi sıra ile oluştuğu da incelenir. Örneğin, eğer bir müşteri araba almışsa, 1 hafta içerisinde sigorta yaptıracağı öngörülebilir. Veya borsada, Nokia ve Samsung hisseleri yükselişte ise HTC ve IPhone’un da 2 gün içerisinde hisse senetlerinde yükselişi beklenebilir.

Eleman kümesi madenciliği genellikle pazarlama uygulamalarında, sıklıkla birlikte ortaya çıkan ürünlerin düzenliliğinin keşfedilmesinde kullanılır. Örneğin bir süpermarketteki müşterinin alışveriş sepetlerindeki işlemi analiz edelim: Eğer bir müşteri soğan ve patatesi birlikte alıyorsa, aynı alışveriş esnasında kırmızı et de alacağını öngörebiliriz.
Eleman kümelerin madenciliğinde yaygın olarak kullanılan iki teknikten söz edebiliriz: 
  • Etkili ön bilgi algoritması (influential apriori algorithm).
  • FP-Growth tekniği.
Sonraki yazımda görüşmek üzere..

14 Şubat 2014 Cuma

Büyük Veride Analiz İşlemlerinde MapReduce Kullanımı

Önceki yazımda da anlattığım gibi eğer elimizde oldukça büyük hacimli veriler varsa şu anki ilişkisel veritabanı yönetim sistemleri ile bu verileri saklayabilmemiz ve analiz edebilmemiz mümkün değil. Google tarafından 2004 yılında yayımlanan bir sistem ile bu işlemleri gerçekleştirebilmemiz mümkün hale gelmiştir. Bu sisteme ise MapReduce adını vermişler. Tanımsal olarak MapReduce, büyük veri kümeleri üzerinde dağıtık ve paralel bir şekilde işlem yapmayı sağlayan bir programlama modelidir.  Bu sistem aslen 1960′lı yıllarda geliştirilen fonksiyonel programlamadaki map ve reduce fonksiyonlarından esinlenmiştir. Veriler işlenirken bu iki fonksiyon kullanılır.

  • Map(): Filtreleme ve sıralama işlemlerini gerçekleştirir. Örneğin elimizde öğrencilerin bilgileri varsa, adlarına göre ayrı ayrı kuyruklar oluşturup bunlar üzerinde sıralama işlemleri gerçekleştirebiliriz.
  • Reduce(): İşlemin sonuçlarının birleştirilmesini ve dökümünü sağlar. Şekildeki gibi her bir kuyruktaki şekilleri sayarak isimlerine göre frekanslarının bulunmasını sağlar. 
MapReduce sistemi, dağıtık sunucuları harekete geçirir, çeşitli görevleri paralel olarak çalıştırılmasını sağlar, sistemin çeşitli parçaları arasındaki veri akışını kontrol eder, ve tüm bu işlemleri sistemde redundancy ve hata toleransı sağlayarak gerçekleştirir. 

MapReduce modeli fonksiyonel programlamada yaygın olarak kullanılan map ve reduce fonksiyonlarından esinlenmiştir fakat MapReduce çatısı altında aynı işleri yürütmezler. Ayrıca, MapReduce Framework’ünün en önemli fonksiyonları, asıl map ve reduce fonksiyonları değildir, fakat çeşitli uygulamalarda bu fonksiyonların çalışma motoru optimize etmesiyle, ölçeklenebilirliğe ve hata toleransına ulaşılabilir.


MapReduce çok sayıda bilgisayar (node/düğüm) kullanarak büyük veri kümeleri arasında paralelleştirilebilir problemleri çözmeye yarar. Çok sayıdaki bilgisayarların hepsi aynı yerel ağı kullanıyorlarsa ve benzer donanımlara sahiplerse cluster(küme), coğrafi olarak farklı alanlara yayılmışlarsa ve farklı donanım konfigürasyonlarına sahiplerse grid olarak adlandırılırlar.


İşlenilen veri, veritabanındaki gibi (yapılandırılmış) veya dosya sistemindeki gibi (yapılandırılmamış) bir ortamda bulunabilir. MapReduce’un kalıcı girdi ve çıktıları genellikle dağıtık bir dosya sisteminde saklanır. Geçici veriler ise genellikle yerel diskte saklanır ve reducer’lar tarafından uzaktan getirilir. MapReduce, yerel verileri kendisine daha yakın konumdaki kaynaklarda işleyerek veri aktarımında oluşan gecikmeleri optimize edebilir ve hız artışı sağlayabilir.

Map adımı:
İlk (ana) düğüm girdiyi alır, daha küçük alt problemlere böler ve işçi düğümlere iletir. İşçi düğüm çok seviyeli ağaç yapısının ilk düğümlerinde bulunuyorsa bu işlemi çocuklara aktarmak suretiyle tekrar gerçekleştirebilir. İşçi düğümler ise küçülen problemi işler ve ana düğüme geri iletir.

Reduce Adımı:
Ana düğüm tüm alt problemlerden gelen çözümleri toplar ve birleştirerek belirli bir biçimde dökümünü sağlar.

MapReduce, dağıtık olarak map ve reduction işlemlerinin çalıştırılabilmesine olanak tanır. Her bir map işlemini diğerlerinden bağımsız olarak yürütür. Aslında bu paralellik bağımsız veri kaynakları sayısı ve bu veri kaynaklarının yakınında bulunan işlemci sayısına oranla sınırlıdır. Benzer olarak indirgen kümeleri (reducer), aynı anda aynı anahtarı kullanan map işleminin bütün çıktılarını alarak reduction evresini gerçekleştirebilirler. Bu süreci işleyen, daha sıralı çalışan algoritmalar da var fakat genelde verimsiz çalışıyorlar. MapReduce ise, elimizde yetersiz sunucular olsa bile daha geniş veri kümelerinde uygulanabilir. Örneğin geniş bir sunucu kümesiyle bir petabyte’lık bir veride, MapReduce kullanılarak birkaç saat içerisinde sıralama işlemi tamamlanabilir. Paralelliğin sağlanması ile eğer girdi verisi hala elimizde ise, işlem esnasında herhangi bir sunucu çökse bile, yapılan iş tekrar zamanlanabilir.


MapReduce’un işlem sırası:
  • Map() girdisinin hazırlanması: MapReduce sistemi, Map işlemcilerini tanımlar, her işlemcinin üzerinde çalışacağı K1 girdi anahtarının atamasını yapar, ve işlemciye bu anahtar değeri ile ilişkili bütün girdi verisini iletir.
  • Kullanıcının tanımladığı Map() kodunun çalıştırılması: Map() fonksiyonu her bir K1 anahtar değeri için yalnızca bir kez çalışır ve K2 anahtar değerleri tarafından düzenlenecek çıktıyı oluşturur.
  • Map çıktısının karıştırılarak (shuffle) reduce işlemcilerine iletilmesi: MapReduce sistemi Reduce işlemcilerini tanımlar ve K2 anahtar değerini, çalıştıracak her işlemciye birer birer atar, ve o anki işlemciye bu anahtar ile ilişkili bütün Map’in oluşturduğu çıktı verisini aktarır.
  • Kullanıcının tanımladığı Reduce() kodunun çalıştırılması: Map adımından oluşturulan her K2 anahtar değeri ile ilişkili değer için bir Reduce() fonksiyonu çalıştırılır.
  • Son çıktının üretilmesi: MapReduce sistemi bütün Reduce çıktısını toplar ve son ürünü oluşturmak için K2 anahtarı ile sıralar.
Bu 5 adımı mantıksal olarak üstteki gibi bir sıra halinde çalıştığını düşünebiliriz – her adım, başlamak için önceki adımın bitmesini bekler. Ama pratikte ise adımlar tabi ki iç içedir.


Genelde girdi verisi önceden farklı sunuculara dağıtılmış olur ve bazen Map sunucularına yerel olarak temsil edilen veriler atanarak 1. Adım oldukça basitleştirilmiş bir hale getirilir. Benzer olarak 3. Adımda da, Reduce işlemcilerine yerel Map fonksiyonundan oluşturulan veri aktarılarak bu adım hızlandırılabiliyor.

MapReduce'e mantıksal açıdan bakalım
MapReduce’ün Map() ve Reduce() fonksiyonları (anahtar,değer) alacak şekilde yapılandırılmışlardır. Map fonksiyonu veri alanını (data domain) içeren bir çift veri alır ve farklı bir domain çıktı listesini return eder:
  • Map(k1,v1) -> list(k2,v2)

Map fonksiyonu girdi veri kümesindeki her çift veriye paralel olarak uygulanabilir. Her Map fonksiyonunun çağrımı için ayrı ayrı birer liste oluşturulur. Sonrasında MapReduce sistemi bütün listelerden aynı anahtarlı veri çiftlerini toplar ve her anahtara bir grup düşecek şekilde gruplar.
Sırayla aynı domaindeki verilerden ayrı bir liste üreten Reduce fonksiyonu daha sonra her gruba paralel olarak uygulanabilir.
  • Reduce(k2, list(v2)) -> list(v3)
Her Reduce çağırımı, bir kez çağırıldığı zaman birden fazla değeri geri döndürebilecek kapasitede olsa bile genellikle bir v3 değeri veya bir null değeri döndürür. Bütün fonksiyon çağırımlarından toplanan değerler belirlenen sonuç listesine aktarılır.

Böylece MapReduce sistemi (anahtar,değer) çiftlerinin bulunduğu listeyi değer listesine dönüştürür. Bu davranış, fonksiyonel programlamada keyfi değerlerin bulunduğu bir listeyi alan ve listedeki tüm değerleri sadece tek bir değer olarak düzenleyerek geri döndüren map ve reduce fonksiyonlarından faklıdır.


Örnekler
Aşağıdaki örnek, dökümanlardaki her kelimenin oluşma sıklığını hesaplar:

    function map(String belgeAdi, String belgeIcerigi):
      for each kelime k in belgeIcerigi:
        emit (k, 1)

    function reduce(String kelime, Iterator parcaSayisi):
      kelimeSayisi = 0
      for each parca in parcaSayisi:
        kelimeSayisi += ParseInt(parca)
      emit (kelime, kelimeSayisi)

Burada girdi olarak verilen doküman splitting işleminde önce  satırlara sonra da kelimelere ayrılır. Her kelime bir unique key gibi ele alınır ve ayrı ayrı map fonksiyonu tarafından saydırılır. Sonra shuffling işleminde MapReduce Framework’ü, aynı anahtarlı tüm çiftleri bir araya getirir ve reduce’a iletir. Reducing işleminde aynı anahtarlı kelimeler saydırılır ve nihai sonuç olarak birleştirilir. Böylece bu fonksiyon, sadece girdi değerlerini kullanarak verilen kelimenin toplam görülme sıklığını elde etmiş olur.

Kullanım Alanları
MapReduce dağıtık şablon-temelli (pattern based) aramalarda, dağıtık sıralama işlemlerinde, web tarafından erişilen log istatistiklerinde, belgelerin kümelenmesi işlemlerinde, makine öğreniminde ve istatistiksel makine çevrimi olmak üzere geniş çaplı uygulamalarda kullanılıyor. Çok işlemcili sistemlerde, masaüstü  ağlarında, eyewire uygulaması gibi gönüllü işlem yapma ortamlarında, dinamik bulut sistemlerinde ve mobil tarafında da adapte bir şekilde çalışabiliyor.

MapReduce, Google’da dünyadaki tüm sitelerin indekslerini tamamen yenilemek için kullanılıyordu. Önceden de indeksi güncelleyen ve çeşitli analizler gerçekleştiren programlar kullanıyorlardı. Fakat MapReduce’un üretilmesi ile hepsi rafa kaldırıldı.



Şu an sadece Google değil, Facebook, Twitter, Linkedin, Foursquare gibi çok fazla veri toplayan sosyal ağ uygulamalarında kullanılıyor. Son 2 yılda üretilen verilerin geçen 10 seneden fazla olduğunu düşünürsek, MapReduce sisteminin geleceğinin parlak olduğunu söylemek yanlış olmaz.

MapReduce kütüphaneleri farklı optimizasyon seviyesindeki birçok farklı programlama dili ile yazılmışlardır. Açık kaynaklı popüler implementasyonu ise Apache Hadoop’tur. Sonraki yazımda Hadoop'tan bahsedeceğim, görüşmek üzere... 

Kaynaklar: Wikipedia, Devveri



13 Şubat 2014 Perşembe

Büyük Veri (Big Data) Nedir?

Son zamanlarda birçok çevre tarafından adının yaygın olarak kullanıldığı fakat tam olarak da ne olduğu hakkında herkesin pek az şey bildiği büyük verinin (big data) nasıl bir kavram olduğundan bahsedeceğim.

Günümüzde makul zamanda işlememiz gereken veri boyutu ekzabaytlara ulaştı. Bilim adamları meteoroloji, genetik, konnektomi, karmaşık fizik simülasyonları ve biyolojik ve çevresel araştırma gibi alanlardaki  büyük veri kümeleri üzerinde işlemler yapabilmesi kısıtlı seviyelere geldi. 
Bu sınırlar ayrıca arama motorları, finans ve ticari bilişime de etki etti.

Veriler bu hızlı çağda katlanarak artıyor, çünkü herkesin elinde bulundurduğu mobil cihazlardaki bilgi toplama birimleri, uzaktan algılayan sensörlü teknolojiler, yazılım logları, kameralar, mikrofonlar, radyo frekansı ile kimlik okuyucuları ve kablosuz sensör ağları kullanımı bu duruma yol açıyor. 1980’lerden beri dünyada kişi başına düşen veri miktarı neredeyse her 40 ayda bir ikiye katlandı ve 2012 rakamlarına bakacak olursak her gün 2.5 ekzabayt veri üretiliyor.


Büyük veri bilimde de kullanılıyor. Büyük Hadron Çarpıştırıcısı deneylerinde 150 milyon adet sensör kullanılıyor ve bu sensörler saniyede 40 milyon defa veri topluyor. Saniyede yaklaşık olarak 600 milyon defa çarpışma meydana geliyor ve bu çarpışmalardan %99.999’u filtrenerek, geriye kalan 100 çarpışma/sn ile ilgileniliyor.


Sonuç olarak sensör akışlarından gelen verilerin sadece %0.001’i bile kullanılsa da yıllık oluşan veri 25 petabaytı buluyor ve bu veri üzerinde çıkarsamalar yapılarak ve kopyalanmalar sonucu oluşan veri 200 petabaytı geçiyor.

Veriler bu seviyelerde gezindiği için geleneksel yöntemlerle iş yapmak zor hale geliyor. Çünkü veritabanlarının bu kadar veriyi üzerinde barındırabilmesi ve işlem yapabilmesi çok zor ve zaman açısından maliyetli. 

Bu şekilde halihazırda bulunan veri yönetimi araçları veya geleneksel veri işleme uygulamaları kullanılarak işlenmesinin mümkün olmadığı, çok büyük ve oldukça karmaşık veri yığınlarına büyük veri denilir.

Eğer elimizde oldukça büyük veriler varsa bu verilerin üzerinde yapılan iyileştirmeler, verilerin saklanması, aramaların yapılması, paylaşılması, başka birimlere aktarılması, üzerlerinde analizlerin gerçekleştirilmesi ve görselleştirilmesi  bize zorluk çıkarabilir. Böylesine büyük veri kümelerinin ortaya çıkabilmesinin nedenlerinden biri de küçük bir veri kümesi ile ilişkili verilerin birbirleri ile analizi sonucu ek bilgilerin türetilmesinin gerçekleşmesidir.

Büyük Verinin 4V'si
2001 yılında yapılan bir araştırma raporunda ve ilişkili konferanslarda META Grup analisti Doug Laney veri artışında yüzleşilecek sorunların ve sorumlulukların 3 boyutta seyir ettiğini tanımlamıştır:                              

  • Volume (Hacim):  Şu an dünya üzerinde 7 miyar insan bulunurken elinde cep telefonu olanların sayısı ise 6 milyar seviyesinde. Durum bu seviyedeyken büyük veriyi  belki de gerçekten "büyük" yapan şey şu anki tutulan verilerin zamanla üssel olarak artması. Veriler bu hızlar artarken kuruluşların da bu verileri yönetmek için olan maliyetleri de artıyor.  Bu yüzden büyük verinin tutulacağı ortamın ayarlanması gerekiyor.
  • Velocity (Hız): New York Stock Exchange her işlem seansında 1TB ticari bilgi tutuyor. 2016'da 18.9 milyar bilgisayar ağının oluşması bekleniyor. Veriler bu şekilde büyüyerek artarken çok hızlı bir şekilde sisteme aktarılıyor ve sistemin de bu hızla akan verileri karşılaması gerekiyor. Bu yüzden hız da büyük veriyi karşılayan bir diğer etmen haline geliyor.
  • Variety (Çeşitlilik): Bilgi toplamada kullanılan sensörlerin artışı, sosyal ağlar, RSS'ler ve bu kaynaklardan gelen verilerin çeşitliliği büyük verinin önemini daha çok vurguluyor. Örneğin modern arabalarda benzin seviyesi ve gaz basıncını ölçen yaklaşık 100'e yakın sensör bulunuyor. 
  • Veracity (Doğruluk): Üstte tanımlanan 3V'ye Gartner şirketi 2012 yılında bir V daha ekliyor. Veriler bu kadar hızlı toplanırken kalitesi de önem arz ediyor. Bir rapora göre bozuk verilerin Amerikan Hükümeti'ne yıllık maliyeti 3.1 trilyon dolar. Bu yüzden toplanan büyük verinin ayrıştırılmaya ihtiyacı var.
Sonraki yazımda büyük verinin nasıl işletileceğine değineceğim. Görüşmek üzere...

Kaynaklar: Wikipedia, Oracle, IBM, HP



18 Ocak 2014 Cumartesi

Windows Phone 8 Uygulamaları Geliştirimi İçin Başlangıç

      Teknolojinin gelişmesiyle bilişim sektörü artık daha çok mobil sektöre kayar oldu. Intel mobil dizüstü bilgisayarlar için daha az güç tüketimli Haswell işlemcisi üretiyor, öte yandan Nvidia, Las Vegas'taki CES fuarında tanıttığı 192 çekirdekli Tegra K1 işlemcisi ile oyun piyasasını mobil tarafına kaydırmak niyetinde.
      Durum böyleyken geliştiriciler de artık masaüstü uygulamaları yerine artık mobil uygulamalar üretmek istiyorlar. Ben de yeni başladığım Windows Phone 8 (WP8) geliştirimi serüvenimde elde edindiğim bilgileri bu yazımda aktarmaya çalışacağım.
      WPF ve XAML üzerinde geliştirim yapanların WP8'e daha kolay alışacaklarına eminim. Fakat ne kadar Windows Phone uygulamalarının görünümü WPF uygulamalarına benzese bile kullandığınız mobil cihazın donanım kısıtlamalarından dolayı PC'de yaptığınız her atraksiyonu Phone'da aynı şekilde yapamayabilirsiniz. Buna rağmen Phone uygulamaları geliştirmek oldukça keyifli.

Hazırlık Aşamaları
      Öncelikle Windows Phone 8 uygulaması geliştirebilmemiz için sisteminizin 64-bit Windows 8 veya üstü olması gerekiyor. Çünkü Windows Phone 8 emülatörü daha özel donanım, yazılım ve yapılandırma gereksinimleri istiyor. Bu yüzden Windows 7 veya daha alt bir versiyona sahip işletim sisteminiz varsa WP8 uygulamalarını geliştirebilmeniz mümkün değil.
      Ayrıca Visual Studio'nun kurulu olması gerekiyor. Visual Studio 2013'ün 90 günlük deneme sürümünü indirebilirsiniz.
      Eğer önceden sisteminizde Visual Studio 2012 Professional ve üstü yüklü ise Phone SDK 8.0'ı indirmenize gerek yok çünkü zaten entegre bir şekilde geliyor. Fakat daha eski bir Visual Studio sürümünü kullanıyorsanız SDK'yı indirmeniz gerekecektir.
      "Emülatör yerine kendi Windows 8 telefonumu kullanayım." diyorsanız bunun için bir geliştirici hesabınızın olması gerekiyor. Geliştirici hesabı için belirli bir ücret ödemeniz gerekiyor. Şu an için bireysel geliştiriciler 37 lira, şirket sahipleri 160 lira civarında bir meblağ ödeyerek hesap açabilirler.

Başlangıç için:
1. Öncelikle Visual Studio'yu açalım ve üst menüden File -> New Project'i seçelim.
2. Yeni Proje penceresinde sol taraftaki yüklü Template'lerden Visual C# -> Windows Phone'u seçtiğimizde orta menüde birçok proje türlerinin sıralandığını görebiliriz.


Windows Phone App Tek sayfalık basit uygulamalar oluşturmak içindir. Herhangi bir uygulamaya başlamanın en kolay yolu bu tür proje şablonu kullanmaktır.
Windows Phone Databound App: İçerisinde bir liste ve gezinti elemanlarının yer aldığı temel bir MVVM(Model-View-View-Model) uygulamasıdır.
Windows Phone Class Library: Bir arayüzü (UI) olmayan, sınıf kütüphaneleri oluşturmak için özelleşmiş bir şablondur.
Windows Phone Panorama App: Windows 8'deki başlangıç menüsünde olduğu gibi Panaroma control içeren uygulamalar oluşturmanızı sağlar.
Windows Phone Pivot App: Uygulama içerisinde bir başlık ve gövde kısmından oluşan, sayfalar arasında gezinebilmenizi sağlayan bir uygulama türü oluşturmak için özelleşmiştir.
Windows Phone XAML and Direct3D App C++ bileşenleriyle 3D uygulamalar oluşturmanızı sağlar.
Windows Phone XAML and XNA App XNA çatısı altında Phone için oyun uygulamaları oluşturmanızı sağlar.
Windows Phone HTML5 App Adından da anlaşılacağı gibi HTML5 bileşenleri içeren bir uygulama oluşturmanızı sağlar.
Windows Phone Audio Playback Agent Ses içeren uygulamalar oluşturmak için bu kod kütüphanesini kullanabilirsiniz.
Windows Phone Audio Streaming Agent: Bu da rolü akış seslerini oynatma için bir kütüphanedir.
Windows Phone Scheduled Task Agent Eğer uygulamanızda belirli aralıklarla bir bildirim veya web servis isteği yapmak istiyorsanız, bu kütüphaneyi kullanmalısınız.

      Biz şimdilik bu şablonlardan en kolay olanını Windows Phone App'i seçelim. Aşağıda Name: kısmını HelloWorld olarak değiştirelim. OK butonuna tıkladıktan sonra hangi Windows Phone işletim sistemi altında uygulama yapmak istediğimizi soracak.
      Windows Phone OS 8.0 uygulaması geliştireceğimiz için bu Alana dokunmadan OK dediğimizde Visual Studio bizim için gerekli dosyaları oluşturacak ve MainPage.xaml dosyasını görüntüleyecek.
MainPage.xaml dosyasının içeriğine daha yakından bakalım:

      3. ve 8. satırlar arasında 6 tane schema tanımlanmış. Bileşenleri kullanacağımız zaman öncelikle bu şekilde şemalarını tanıtmalıyız. Her tanımlanan şemayı kullanmak için ise xmlns özelliğini kullanmalıyız ve her xmlns özelliğini kullanmak için o şemayı bir namespace ile belirtiriz (Örneğin: xmlns:phone şeklinde). "Fakat 3. satırda bir kolon tanımlaması yapılmamış." diye düşünülebilir.

      Evet bu doğru burada bir namespace tanımlaması yapmadık çünkü bu satırda belirtilen, uygulamamızı XAML namespace'i ile eşleştirmemizi sağlayan ve varsayılan olarak tanımlanan şemamızdır. XAML şemaları ağaç yapısında olduğu için bu bir Root şemasıdır ve diğer child şemaların birer namespace ile belirtilmesi gerekir.
      4-8.nci satırlar arasında ise diğer çocuk şemalar yer almakta. Eğer uygulamalarımızda harici bir bileşen kullanırsak ve o bileşen için ayrılan şemanın tanımlaması yapmazsak oluşturduğumuz XAML dökümanı geçersiz/bozuk olur. Bozuktan kastım, derleyici o bileşenin hangi namespace'e ait olduğunu ve hangi gerekli komutu çalıştıracağını bilememesinden dolayı kodu derleyememesidir.
      Ayrıca, bu şemaların URL gibi göründüğüne kapılarak belirli bir siteye işaret ettiğini düşünmeyelim. Örneğin: http://schemas.microsoft.com/winfx/2006/xaml linkini tarayıcınızın adres bölümüne girdiğinizde sayfanın bulunamadığı mesajı ile karşılaşırsınız. Aslında aynı C# dosyasında namespace'leri tanımladığımız gibi şemalar da birer unique ifadelerdir ve sınıf isimlerini belirli bir sırada tutmayı sağlarlar (Aynı isim, soyisim gibi). Şemalar URL (Uniform Resource Locator) (kaynak bulucu) değil aslında birer URI (Uniform Resource Identifier)(kaynak tanımlayıcısı)'dırlar.
      5-6. satırda farklı URI'lere sahip Phone ve Shell için tanımlanan şemalar, Windows Phone 8 API'sini kurduktan sonra bilgisayarlarımıza yüklenen Microsoft.Phone CLR namespace'inin temel elemanlarıdırlar. İlk satırda da gördüğümüz gibi <phone:PhoneApplicationPage ile
PhoneApplicationPage sınıfının tanımlaması yapılmıştır. Bu sınıf diğer Windows Presentation Foundation (WPF) sınıfları ve Windows Store App sınıfları gibi Windows.System.Controls.Page 'den türemiştir. Bu nedenle, 3 proje türünün (WPF, Store, Phone) birbiri ile paylaştığı birçok temel özellikleri vardır. Bu yüzden eğer daha önceden WPF masaüstü uygulamaları ve Windows Store uygulamaları ile ilgilenmemişseniz veya bazı alanlarda eksiğiniz varsa geriye dönüp kısa bir tekrar etmekte fayda var.
      7-8. satırlarda tanımlanan şemalar sol taraftaki dizayn önizleme penceresinin görüntülenmesini sağlarlar. Bu şemalar sadece önizleme ile ilgili komutları içerdiği için uygulamanın derlenmesi sırasında gereksiz yer kaplamamalıdırlar. 9'daki mc:Ignorable="d" satırından sayesinde bu komutlar için derleme yapılması engellenmiş olur.
      10-12 satırlarda tanımlanan özellikler ile sayfa içerisinde kullanacağımız font ile ilgili belirlemeleri yapmış oluyoruz. PhoneFontFamilyNormal gibi kaynaklar halihazırda emülatörde varolan kaynaklardır. Phone uygulamalarında bu şekilde WPF'teki gibi Binding mekanizması çok kullanılıyor.
      13.satırda tanımlanan özellikler ile uygulamamızın çalışma esnasında ekranda duracağı konumu (yatay/düşey) belirtiyoruz. SupportedOrientations ile telefon yatay konuma alındığında uygulamanın da yatay moda geçmesi desteğini verebiliyoruz. Orientation="Portrait" ile soldaki pencerede, tasarım emülatör'ünün yukarıdan aşağıya olacak şekilde durmasını sağlıyoruz.
      14.satırda SystemTray denilen ise, yukarıdaki şarj durum, saat, GPRS çekim gücü gibi bilgilerinin bulunduğu alanın, uygulamanın çalışması esnasında görünüp görünmemesini sağlıyoruz.
Peki ya .xaml ve .xaml.cs dosyaları arasındaki ilişki?

      Visual Studio'nun sağda, Solution Explorer'da MainPage.xaml'ın sol tarafında bir üçgen şekli vardır. Bu şekile tıklayıp genişlettiğimizde ise isimleri aynı fakat sadece sonu .cs ile biten bir dosya ile karşılaşırız.
      Bu dosyayı açtığımızda MainPage sınıfını ve üstelik partial anahtar kelimesi ile tanımlandığını görebiliriz.
      Bir diğer benzerlik de XAML dosyamızdaki 1-2 satırlarında tanımlanmıştır:


      Bu şekilde iki dosyada da benzer tanımlamaların yapılmasının sebebi, derleyicinin MainPage.xaml ve MainPage.xaml.cs dosyalarını tek bir sınıf haline getirmesi içindir. Bu iki dosya aslında bir elmanın iki yarısı gibidirler. MainPage.xaml.cs dosyasındaki, constructorda yer alan InitializeComponent() fonksiyonu XAML dosyasının parse edilmesi esnasında tüm arayüz bileşenlerinin yüklenmesini sağlar. XAML dosyası da aynı C# dosyası gibi bir ara dil (intermediate language)'e çevrilir ve ikisi de tek bir sınıfın parçalar halinde kodlarını oluştururlar. Bu şekilde ayrımın yapılmasıyla bir sınıfta oluşturduğumuz bileşeni diğer sınıfta kullanabiliriz ve böylece bu iki ayrı sınıfın birbiriyle haberleşmesini sağlarız. Örneğin XAML dosyasında:
şeklinde tanımladığımız bir Button bileşeninin; en, boy, stil gibi diğer özelliklerini C# dosyasında ismini kullanarak değiştirebiliriz.
Peki ya XAML dosyasında bileşenler nasıl oluşturulacak?
      Aslında her XAML dosyası özelleşmiş bir XML dosyasıdır. Bir elemanın içerisine diğer elemanları gömerek hiyerarşik bir yapı oluşturabiliriz:
<PhoneApplicationPage ...>
    <Grid>
        <TextBlock ... />
        <Button ... />
    </Grid>
</PhoneApplicationPage>
      Burada PhoneApplicationPage bileşeni bir Grid içeriyor ve Grid bileşeni de TextBlock ve Button içeriyor. Daha detaylı açıklayacak olursak, oluşturduğumuz her MainPage.xaml sayfası aslında birer UserControl'dür. Buradaki UserControl'ün Content değişkenine bir Grid atanmış ve Grid'in Children listesi ise TextBlock ve bir Button içermiştir. Burada <Grid> şeklinde ayrı bir tag olarak gösterdik ama kullandığımız bileşene göre embedded (gömülü) bir tarzda bileşenin default içeriğinde değişiklikler yapabiliriz:

veya

örneğinde Button'ın Content özelliği default bir özelliktir.
Button’ın Content özelliğini atadık da oldu bitti mi şimdi?
      Tabi ki bitmedi daha ne özellikler var. Mesela XAML dosyasındaki bileşenlerin özelliklerinin değiştirilmesi, bu işi C#'da yapmaya göre daha kolay ve kısa. Örneğin Butonun arkaplan rengini değiştirmek için C#'da:

bu şekilde önce SolidColorBrush nesnesi oluşturup sonra da Colors enumerable'ındaki Blue'yu parametre olarak göndermemiz gerekiyor halbuki XAML tarafında:

üstteki Background kod parçasını eklememiz kafî gelecektir. Tabi her zaman yaptığımız işler bu kadar basit olmayabiliyor. Mesela

şeklinde bir buton tanımlayalım ve sonra sağdaki Properties penceresine
gelip Brush alanına tıklayarak, Background özelliğinin altındaki 3. kutucuğu seçerek, Button’ın Background özellğinin türünü LinearGradientBrush olarak değiştirelim. Sonra köşedeki renk seçim aracını kullanarak mavi renk ve tonlarını seçelim. Button'umuz önizleme penceresinde bu şekilde görünüyor olmalı:
      Visual Studio'nun da boş durmayıp bize bu kodları hazırladığı için ayrıca teşekkürler:
      Eğer yukarıdaki kodları Properties penceresi kullanmadan hazırlayacak olsaydık. LinearGradientBrush oluşturup içerisindeki parametreleri iyice düşünerek, tamamen doğru bir şekilde girmek zorunda kalırdık.
      Dikkat edersek burada oluşan kod, öncekinde oluşturduğumuz gibi Background="Red" şeklinde değil. <Button.Background> gibi <Control.Property> formuna property element syntax denir.
      Burada kullandığımız Brush kelimesi ise, aynı resim fırçaları gibi boyamaya yarayan ve renkleri temsil eden birer nesnedir. Linear olması ise renk düzeylerinin yukarıdan aşağıya veya soldan sağa doğrusal bir şekilde değişiklik göstermesidir. Ben burada örnek olsun diye LinearGradientColor kullandım fakat siz kendi geliştireceğiniz uygulamalarda bunu asla yapmamanız gerekir. Çünkü, gradyanlı bir       şekilde bileşenleri boyamak Windows Phone 8 uygulamalarının estetiği için aykırıdır ve kullanıcıların da daha çok görünüme önem verdiği için bizim uygulamamızı kullanmak isteyemeyebilirler. Fakat şimdilik kendi örneğimizde rahatça tüm bileşenlerle oynayabiliriz :)
      GradientStop özellikleri ise, LinearGradientBrush'ın sahip olduğu bir GradientStop collection’ının içerdiği renk aralıklarıdır. Fakat nedense kod kısmında bu renk aralıklarını barındıran collection tanımlanmamış. Çünkü Visual Studio bizim için otomatik olarak kod satırlarını kısaltmıştır. Aslında kod şu şekilde olmalıdır:

      Farkettiğimiz gibi <LinearGradientBrush.GradientStops> ve <GradientStopCollection> elemanları koddan çıkarılmıştır. Bu kısa ve öz olan kod satırları XAML parser'ın yetenekleri doğrultusunda oluşturulmuştur. GradientStops tanımlaması, LinearGradientBrush'ın ön tanımlı bir özelliğidir. Aynı zamanda GradientStopCollection'ın bir türüdür ve GradientStopCollection'da IList<T>'yi implement eder. Bu yüzden buradaki T değeri bir GradientStop nesnesine karşılık gelir. <LinearGradientBrush ../> etiketleri arasında kalan nesneler, GradientStopCollection'a çalışma zamanında .Add() fonksiyonu gibi eklenir.

      Uygulamamızdaki XAML kodunda, butona eklediğimiz Click metodununun üstüne sağ tıklayıp çıkan menüde Navigate to Event Handler'ı seçerek, metodun C# koduna gidebiliriz.

      Fonksiyonumuzda iki tane parametre var. sender nesnesi o an için olayı çağıran bileşeni kullanmamızı sağlar (Örneğin şu anki bileşenimiz olan Button gibi). RoutedEventArgs e ise o olayla ilgili bilgilerin tutulduğu nesnedir. RoutedEvent bir olayı görsel nesnelerin bulunduğu ağaçta aşağıdan yukarı (Tunnel) veya yukarıdan aşağı (Bubble) bir şekilde iletmeyi sağlar. Örneğin:
Bubble (Click olayı) ile Button->StackPanel->Grid
Tunnel (PreviewClick olayı) ile Grid->StackPanel->Button
      şeklinde ağacı dolaşabiliriz. RoutedEvent sayesinde, Click olayını tek bir bileşenin işlemesi yerine, ağaçtaki tüm parent/child'ların işlemesi sağlanır. Eğer sadece tek bir bileşenin bu olayı işlemesini istiyorsak, bileşenin gerçekleştirdiği fonksiyonun içerisine e.Handled = true; yazmamız yeterlidir.

      Bu kadar bilgiden sonra aşağıdaki kod satırını fonksiyonumuza ekleyelim

      (sender as Button) ile aslında varolan sender objesi primitive(ilkel) ve temel obje sınıfı olduğu için Button'a dönüştürmemiz gerekiyor (Aslında içeriği alabilmek için Button'ın adını (myButton’ı) da kullanabilrdim ama sender'ın nasıl kullanıldığını göstermek için bu örneği verdim). Sonrasında içeriğini yani "HelloWorld" yazısını alıp sonuna ünlem işareti ekledik. F5'e basıp emülatörde nasıl çalıştığına bakalım.
      Button'a tıkladığımızda telefonumuzun tema rengi yan statik PhoneAccentBrush kaynağından dolayı kırmızı rengi aldı. PhoneAccentBrush da ne diyenler olabilir fakat o da başka bir yazının konusu olsun. Görüşmek dileğiyle :)

Kaynaklar:
StackoverFlow
MSDN

30 Mart 2013 Cumartesi

Açık ve Gizli Anahtarlı Şifreleme Arasındaki Farklar


Açık anahtarlı şifrelemenin temel avantajı gelişmiş güvenlik ve kolaylıktır, çünkü gizli anahtarlar kimseye verilmek zorunda değildir. Bunun aksine gizli anahtar sisteminde, şifreleme ve çözümleme için aynı anahtar kullanıldığından dolayı,  gizli anahtarların karşıya iletilmesi gerekir (görüşme veya iletişim kanalıyla). En büyük kaygı ise, hasımların anahtar iletimi sırasında gizli anahtarı ele geçirebileceğidir.

Açık anahtarlı şifreleme sistemlerinin diğer büyük avantajı ise reddedilemez dijital imzalar sağlayabilir olmasıdır.

Gizli anahtar sistemleri aracılığıyla kimlik doğrulama, bazen biraz gizli veriyi paylaşmak ve bazen de üçüncü tarafa güvenmeyi gerektiriyor. Bunun sonucunda gönderen taraf, önceki kimlik doğrulaması yapılmış mesajın gizliliğini, bir şekilde taraflardan birinin güvenliğinin aşıldığını iddia ederek kendisinin gönderdiğini reddedebilir. Örnek olarak Kerberos gizli anahtar doğrulama sistemi, merkezi bir veritabanında tüm kullanıcıların gizli anahtarlarının kopyalarının tutulmasını kapsar; veritabanının saldırıya uğraması halinde veritabanı büyük bir sahteciliğe izin vermiş olur. Açık anahtarlı kimlik doğrulama diğer taraftan bu tür reddedişleri de önler; her kullanıcının tek sorumluluğu sadece ellerindeki gizli anahtarı korumaktır. Açık anahtarlı doğrulamanın bu özelliğine genellikle inkar edilemezlik denir.
Açık anahtarlı şifrelemenin dezavantajı şifreleme hızıdır. Birçok gizli anahtarlı şifreleme metodları, herhangi bir açık anahtarlı şifreleme metodundan önemli ölçüde hızlıdırlar. Yine de açık anahtarlı şifrelemenin  gizli anahtar şifreleme ile birlikte kullanılabilmesi en iyi yöntemlerden birisidir.  Şifreleme için en iyi çözüm, açık anahtarlı şifrelemenin güvenliği ve gizli anahtarlı şifrelemenin hız avantajı için bu iki sistemi birlikte kullanmaktır (örneğin dijital zarf (digital envelope) adı verilen protokol).

  Açık anahtarlı şifreleme kullanıcıların gizli anahtarı kullanılmıyor olsa bile kişileştirme için savunmasız olabilir. Bir sertifika yetkilisi üzerinde başarılı bir saldırı yapılması, hasmın herkesi taklit etmesi ve bir kişinin, ödün verilen yetkiliden açık anahtarları alırken hasmın kendi seçimine yönlendirmesine yol açacaktır.

Birçok durumda, açık anahtarlı şifreleme gerekli değildir ve yalnızca gizli anahtarlı şifreleme kullanımı daha verimlidir. Bu uygulama, güvenli gizli anahtar dağıtımının yapılabildiği ortamlarda yapılır, örneğin kullanıcıların özel toplantılarında. Bunlara ayrıca tek yetkilinin tüm anahtarları bildiği ve yönettiği ortamlar dahildir, örneğin kapalı bir bankacılık sistemi. Yetkilinin önceden herkesin anahtarlarını bilmesinden itibaren, bir kısım anahtarın açık ve diğerlerinin gizli olmasının fazla bir avantajı yoktur. Dikkat edilmesi gereken nokta ise sistemin eğer kullanıcı sayısı genişler ve kullanışsız hale gelebilirse; açık anahtarlı sistemde herhangi bir kısıtlama yapılmasına gerek kalmaz.

Açık anahtarlı şifreleme tek kullanıcılı ortam için çok gerekli değildir. Örneğin, eğer kişisel dosyalarınızı şifrelenmiş bir şekilde saklamak istiyorsanız, kişisel parolanızı gizli anahtar gibi herhangi bir gizli anahtarlı şifrelemede kullanabilirsiniz. Genel olarak açık anahtarlı şifreleme, çok kullanıcı ortamında için uygundur. 

Açık anahtarlı şifreleme, gizli anahtarlı şifrelemenin yerine geçmez, aksine onu daha güvenli hale getirmek için kullanılır. İlk çıkan güvenli gizli anahtar taşıma tekniği Diffie-Hellman gizli anahtarlı sistemi üzerine kurulmuştur; bu hala Diffie-Hellman sisteminin birincil görevidir. Gizli ve açık anahtarlı şifreleme son derece önemlidir ve hala birçok çalışma ve araştırma konularındandır.