Quantcast
Channel: Fırat Esmer

Visual Studio 2013 Update 1 Hazır

$
0
0

Visual Studio 2012

Visual Studio 2013 için ilk güncelleme hazır. Microsoft'un özellikle Windows 8'in piyasaya sürülmesiyle değişikliğe gittiği yeniliklerden birisi de Service Pack yerine Update tabirinin kullanılması. (Benim gözümde pek önemli değil açıkçası)

Visual Studio 2013 çıkalı çok olmamıştı ki ilk güncelleme içerisinde gelen bazı yenilikler:

  • IntelliTrace Viewer Internet Explorer 9 desteği,
  • ASP.NET MVC 5.1 desteği,
  • SignalR 2.0.1 desteği,
  • Nuget 2.7.2

... listenin devamı ve Visual Studio 2013 Update 1'i indirmek isterseniz buraya tıklayın.


Visual Studio 2013 İçin Kod Arama Eklentisi

$
0
0

Visual Studio 2012

Microsoft Research'ün programlama işi ile ilgilenenlere ufak bir sürprizi var : Bing Code Search Add-in for Visual Studio 2013

Öncelikle eklenti,yazmak istediğiniz kod bloğunu nasıl yazmanız gerektiğini bilmediğiniz durumlarda can kurtarabiliyor. Kod bloğunu yazacağınız kısımda IntelliSense'i açın. IntelliSense açıldığında en üst sırada "How Do I.. (Nasıl yaparım)" seçeneği mevcut. Bu seçenek tıklandığında bir ekran açılıyor ve aramak istediğiniz kod bloğunu yazıyorsunuz. Ekranda size satır satır sonuçlar dönüyor. Bunlardan herhangi birisini seçtiğinizde ise (şimdilik 4 partner var: MSDN, stackoverflow, dotnetperls ve csharp411) kod bloğu önünüze çıkıyor. Ayrıca oylama seçeneği de mevcut böylece yüksek oy almış kod bloğunu direkt olarak kendi kodunuza ekleyebilirsiniz. İsterseniz Microsoft Research tarafından yapılmış bu demoya bakabilirsiniz.

 

Get Microsoft Silverlight

Eklenti şimdilik indirilebilir durumda değil lakin bir kaç gün içerisinde indirilmeye sunulacakmış. Daha fazla bilgi ve deneme için buraya tıklayabilirsiniz.

Hewlett Packard - Şikayet

$
0
0

Hewlett-Packard

Bu yazımda, IT sektörünün önde gelen firmalarından birisi olan HP ile ilgili görüşlerimi yazacağım. Tabi ki durup dururken övmeyeceğime göre bu yazı bayağı isyan ve öfke dolu olacak.

2010 yılının yanlış hatırlamıyorsam Eylül ayında laptop alma ihtiyacı duydum. Piyasa araştırmamda HP'nin "dv6-3050et" modeli gözüme takıldı. 2bin TL'ye yakındı. i7 3.nesil işlemcisi, 4 GB ram'i, ATI Radeon HD 5xxx serisi ekran kartı vardı. Fena değildi. Tasarımı da hoştu. Aldım... Ve kabus başladı.

İlk 4 ay gibi bir süre performansın dibine vurdum. Adeta uçuyordum. Sonra laptop inanılmaz absürd derecede ısınmaya başladı. Zaten tasarımında fan deliklerinin hep hatalı yerde olduğuna dair kuşkularım vardı ama neyse diyordum. Artık diyememeye başladım. 90 dereceye gelip kapanmalar başladı. Kaldı ki bir programcı olarak bilgisayarın püf noktalarını, nasıl kullanılması gerektiğini ve periyodik bakımlarının ne zaman ve nasıl yapılması gerektiğini biliyordum lakin onlar da işlememeye başladı. Artık laptop bana itaat etmemeye başladı. Ben onun kölesi olmuştum.

Soğutucu aldım, tüm gereksiz işlemleri sonlandırdım, driverlarımı (sürücü) güncel tuttum yine olmadı. Laptopun içini açtım tüm fan deliklerini sıkıştırılmış hava temizledim. Termal macun sürülmesi gereken yerlere sürdüm. Zaten laptopun içini açtığımda termal macuna dair bir şey yoktu, hepsi buharlaşmış atmosfere karışmıştı. Bir süre daha 65-70 derece civarında gezdi. Gülmeyin, bu benim için bir başarıydı. Sonraki günler yine sapıttı. Artık son noktaya geldiğimde youtube videosu izlediğimde 5 dk. sonra kapanmaya başladı.

Bu işin bir de sosyal etkisi var. "Fırat programcı adamsın bu ne biçim laptop", "sen bu işlerden anlardın ne oldu da böyle boktan bir laptopa kaldın", "benim laptop bile i3 ama kaldırıyor" tarzı arkadaşlarımın söylemleriyle eziliyordum. HP'nin dv6 serisinden önceki modellerinde sorun varmış, ama bu seride düzeltilmiş sözleri de etkiliydi beni bu laptopu almamda. Kaldı ki "Elitebook" serisi bir kamyonu rampada durdurabilecek büyüklüğe sahip olmasına rağmen güçlü bir makineydi. Bu olmamıştı. dv6 olmamış HP. Bir arkadaşım da laptopu aldığım vakit bana güvenerek laptopu almış ve bana "moruk benim laptop sürekli ısınıp kapanıyor" dediğinde içim kan ağlıyordu.

Servise vermek benim için kabul edilebilir bir şey değildi çünkü programcı adamın bırakın 15 günü 1 gün bile laptopsuz kalması o kişi için karanlık çağın belirtisidir. İşler bizi bekliyor nereye servise veriyorsun? Vursan vuramıyorsun böyle bir ikilemde kaldım. Servisi aradığımda temizlik ile ilgili yapmam gerekenleri söylediler ki inanın zaten yaptım. Bir seçenek daha sundular. Sıkı tutunun... BIOS GÜNCELLEMESİ. Evet, bir BIOS güncellemesi her şeyi çözebilirmiş. Bana 10 KB'lık bir exe yolladılar ve çalıştırıp sonuçlara tekrar bakmamı istediler. Ah... Hiç bu kadar güldüğümü hatırlamıyorum. Tabi ki olmadı. Konu güncellemelere gelmişken şunu da belirteyim. Windows 8 yükledim, evet bir hata yaptım Windows 8 için driver var mı yok mu bakmamıştım. Yokmuş. 2010 yılında çıkan bir laptopun Windows 8 için driver sunmaması gülünç. Böyle şirket olmaz olsun dedim. Olmadı, o yıl yanlış hatırlamıyorsam 9 milyar dolar gibi "oh dedirten" miktarda zarar yazdılar hanelerine. Türkiye'deki çoğu teknik destek birimini kapattıklarına dair duyum aldım. Hatta işten çıkartılan bir kişi benim arkadaşımdı. Yazıcı kartuşu bittiğinde yazıcıdan daha pahalı kartuşu satmaya benzemez bu işler HP.

Şimdi böyle bir laptopa sahip olmanın avantajlarını yazacağım

  • Çıkardığı ses bir Apache helikopterininkine yakın olduğu için sizi bir nevi helikopter sürüyormuş havasına sokuyor. Karşınızda sizin sahip olduğunuz askerin 10 katına sahip bir ordu ile karşılaşırsanız hemen 2-3 tane dv6 model HP laptopu yan yana açın, arkalarına bakmadan kaçacaklardır "bu adamların ne manyak hava gücü var" diyerek...
  • Üşüme derdine son. Tabi, bu kadar ısınıp da ortamı ısıtmaması mümkün mü? Küresel ısınmanın veya buzulların erimesinin gerçekten çok-uluslu şirketlerin, devletlerin veya 3-5 ineğin osuruğu ile sera gazının artmasına bağlıyorsanız yanılıyorsunuz. Suçlu : dv6 HP.
  • Dayanıklılığna gelirsek, bu kadar sıcaklığa dayanan dış kaplama size aktif bir volkanik yanardağın yanında çalışma fırsatı verebilir. dv6 model HP laptopun üzerine sıçrayacak lav parçası inanın sönecektir. Sen kimsin ki dv6'nın üzerine sıçrıyorsun? Kendini daha mı sıcak sanıyorsun nedir yani?

Touchpad'inin de inanılmaz boyutlarda kalitesiz olduğunu belirteyim.

Şimdilik söyleyeceklerim bu kadar.

Bir daha HP AS-LA.

2 Yılın Ardında Buradayım!

$
0
0

 

Son yazım 5 Temmuz 2014 tarihli olunca bloga giren kişiler muhtemelen "başka bir blog yazarı daha bıkmış çekip gitmiş bu diyardan" demiştir. Demeyin, gizli gizli bloguma her gün bakıyordum. Peki beni 2 yıl alıkoyan sebep neydi? Çok basit. BlogEngine'ın yeni versiyonunda kullanılan WebApi'ler hosting'te Full Trust yetkisi istiyordu. SadeceHosting'te de Full Trust yetkisi verilmiyordu, en fazla Medium Trust yetkisi veriliyordu. Dolayısıyla yönetici paneline giremedim, ben de pek üstüne düşmedim, düne kadar. Çünkü süresi doldu ve süreyi uzatmadım.

Şimdi bir bakalım buralarda yokken neler oldu yazılım dünyasında

1. Windows 10 ve Universal Windows Platform (UWP)

Windows 10 işletim sistemi çıktığında tüm Windows ürün ailesinde çalışmak, kısacası tek bir Windows'u her yerde kullanmak uygun görüldü. Buna masaüstü, telefon, Xbox, IoT ve HoloLens dahil. Kısacası tüm ürün ailesinde çalışacak. Bunun için yeni bir platform oluşturuldu buna da Universal Windows Platform (UWP) dendi. One platform to rule them all. Daha fazla bilgi için buraya tıklayabilirsiniz. Bu arada daha önceden yazmış olduğunuz uygulamarı (iOS, Windows Runtime 8.x, Windows Phone Silverlight) UWP'ye convert eden (bridge) projeler hakkında buradan bilgi alabilirsiniz. Böylece Windows Store uygulama sayısında artış sağlanacak, asıl amaç budur.
UWP programlama yapıyorum, çok basit sadece belli Windows ürün ailesi için spesifik API'lere ihtiyaç duyabiliyorsunuz, gerisi bildiğiniz Microsoft yazılımı :)

Universal Windows Platform

2. Microsoft ve Open Source (Açık Kaynak)

Microsoft yıllarca "open source" olmamakla anıldı ve sonunda şirket politikasında değişikliğe gidildi. Artık .NET Framework hem açık kaynak hem de platform bağımsız oluyor. Kıscası Linux (Ubuntu, Debian vs.) ve MacOS üzerinde çalışacak. Hatta bunun için Linux ve MacOS üzerinde çalışan Visual Studio Code editörünü de yayınladı. İsimlendirmeler .NET Core 1 (.NET Core 5), ASP.NET Core 1 (ASP.NET 5) ve Entity Framework 7 ise Entity Framework Core 1 şeklinde değiştirildi ve yavaş yavaş .NET Framework'deki özellikleri aktarılıyor.

Ayrıca GitHub üzerinde açık kaynak yazılıma en çok katkıda bulunan şirketlerin başında geliyor Microsoft. Bunların arasında Visual Studio Code, TypeScript, EntityFramework, .NET Core, ASP.NET Core, .NET Compiler Platform (Roslyn), Microsoft Edge JavaScript Engine Chakra gibi projeler de yer alıyor. Listenin tamamı için buraya tıklayabilirsiniz.
(Açık kaynak açık kaynak diye bağırmakla olmuyor gidin katkıda bulunun)

GitHub Contributor

3. Microsoft Xamarin'i Satın Alır

Xamarin, Visual Studio IDE aracılığıyla (veya kendi IDE'si Xamarin Studio) ve C# dilini kullanarak Android, iOS ve Windows Phone uygulamaları geliştirmemizi sağlayan uygulama geliştirme platformudur. Muhtemelen de çoğunuz Xamarin'i duymuştur. Microsoft'un Xamarin'in iOS, Mac ve Android SDK'larını da açık kaynak haline getirmesi ayrı bir güzellik. UWP de cross-platform olsa tadından yenmez, orası beklemede.

Xamarin

4. Steve Ballmer Gider, Satya Nadella Gelir

Microsoft CEO'su projelere ne derece müdahale ediyor, hangi CEO zamanında hangi kararlar alındı bilmiyorum fakat Steve Ballmer Microsoft'un en sevilmeyen (zaten Bill Gates'ten sonra sadece kendisi var) CEO'su olsa gerek. Bu sebeple Satya Nadella geldiğinde özellikle yazılımcılar hafiften bir heyecan yaşadı. Hazır Nokia satın alınmış, geldiğinde verdiği ilk söz "Mobile First, Cloud First" olmuştur (aslında Microsoft'un yeni vizyonu buydu). Sanırsınız akıllı telefon piyasasında kaybedilen topraklar geri alınacaktır... Sanıyorsunuz? Amma ve lakin yanılıyorsunuz. Bu seneki Build 2016 konferansında "bu sene Windows Phone'a yoğunlaşmayacağız" dendi. Hakikaten de öyle oldu Mobile gitti Cloud kaldı. Azure ve Office 365 coştukça çoşuyor. AWS ile mücadelede sürekli Forbes 500 şirketlerinin kullandığı teknolojiden ve Azure'un getirdiği karlardan bahsediliyordu ama Windows Phone 8 kullanıcılarının bir çoğu Windows Mobile 10'a bile geçemedi. Kısacası Windows Mobile bırakın olduğu yerde kalmayı yapılan araştırmalar sonucunda gördük ki geriledi de geriledi... 2017 sene başlarında Surface Phone duyurulacak gibi söylentiler var. Sürekli amiral telefonu olmadığı için başarısızlığa mahkummuş gibi gösteriliyor ama çoğu kişi sorunu biliyor : Windows Store App GAP (ve bence işletim sistemi diğerlerine göre her ne kadar stabil olsa da çoğu yönden eksik).

Microsoft'un dönüşüm içerisinde olduğu bir gerçek fakat adamı delirtmeye de devam ediyorlar. Hele o çıkardıkları uygulamaları ilk Android ve iOS'a getirmek nedir yahu... Microsoft Edge de tırt. Chrome gibi materyal dizayna mı özendiler nedir iğrenç bir görünüme sahip olmuş. Tablar, açılış sayfası ve ayarlar sekmesinin profesyonellikten uzak hazırlanışı bana yine olmamış dedirtti. Performans mı? Ehh...

Yeni makalelerle burada olacağım ufak bir "previously on development" oldu bu.

LG - Şikayet

$
0
0

LG

Merhaba arkadaşlar. Gün geçmiyor ki kapitalist sistemin "rekabet kaliteyi artırır yalanıyla" yine çok uluslu bir firmanın mağduriyetini yaşamayalım. Bu sefer bize kazık atan firma : LG.

"Merhaba. Benim param var ve paramla hizmet satın alıp mağduriyet yaşamak istiyorum." mu diyorsunuz? O halde doğru yerdesiniz. LG, Life is Good. Life is Good çünkü sattıkları ürünlerin hizmetini sağlayamıyorlar. Yani hayat onlara güzel, bize değil.

Anneme ait LG G2 model telefonumu dün Android 4.4.2 (KitKat) versiyondan Android 5.0.2 (Lollipop) versiyonuna yükledim. Yüklemeden önce de tüm medya dosyalarını manuel yedekledim. Geri kalan tüm uygulamaları, rehberi, ayarları ve mesajları ise LG'nin resmi (official) Windows uygulaması LG PC Suite aracılığıyla yedekledim. Anlayacağınız kafam rahat, güncelleme de bitmiş şimdi yapılması gereken tek şey yedeği geri yüklemek... Ve Murphy Kanunları devreye girer. Yapılması gereken tek ve en önemli iş olan yedeği yüklemek terleten boyutlara ulaşmaya başlar. Söz konusu elektronik ortamda bir sorunu gidermekse genelde içimiz rahat olur çünkü her şeyin bir çözümü internetin en derin ve karanlık köşesinde de olsa bulunur ve çözüme kavuşulur. Benim sorunum için yapılacak hiçbir şey yoktu, çünkü LG'nin resmi uygulaması LG PC Suite yedeği yükleme işlemi çalışmıyormuş. Evet, çalışmıyormuş. %100'de takılıyor, devamı gelmiyor.

Tabi ben daha umudumu yitirmeden önce LG destek sayfasına girdim. Baktım ki destek birimiyle chat yapabiliyorsunuz fakat gece geç saatler olduğu için ben de ABD merkezli desteğe bağlandım. Konuştuk ve bana sunabildikleri tek çözüm yedeği yükleme işleminde %100 olsa bile 3-4 saat beklememmiş. Ben de bir bildikleri vardır diye bekledim fakat 20-30 dk. sonra uygulama kendisi "telefonunuzun bağlantısı koptu" diye uyarı veriyor ve işlem iptal oluyor. Yani bırakın 3-4 saati yarım saat bile bekleyemiyordum, yani tırt. Bir daha bağlandım. Nereden bağlanıyorsunuz dedi ben de dürüstçe (?) Türkiye dedim ve o an anladım. "O halde LG Türkiye ile irtibat kurmanız gerekiyor" dediler. "Ne alaka peki?" dedim. Dil ayarları farklı filan sıktılar 1-2 şey ve kapattık. Sabah oldu LG Türkiye müşteri destek ile chat yapmaya başladım. Dedim ki "yazılımcılarınıza söyleyin, yapamayacaklarsa programı bana haber verin ben yapayım bari?" Çünkü çalışmayan bir programa güncelleme yayınlamak, güncelleme kontrolü yaptırmak nedir yani... LG Türkiye ise daha büyük bir komediye imza attı. Telefonumun IMEI numarasını istediler, verdim. Bu telefon LG Türkiye adına kayıtlı değil, nereden aldıysanız orası ile irtibar kurun dediler ve kapattılar. Bu telefonu da abim senelerce önce internet üzerinden fakat Türkiye'den aldı. Düşünsenize ben bunu X.com adlı bir siteden alıyorum ve satın aldığım yer ile irtibat kurup "LG PC Suite programı yedeği yükleyemiyor ne yapmamız lazım?" diyorum. Böyle saçmalık mı olur be? Adam "Ne bileyim ben? Programı yazan ekipten biz mi sorumluyuz?" diyecek haklı olarak. Geriye de LG kalıyor fakat LG de yardımcı olmuyor.

Şimdi saçmalıkları bir sıralayalım:

  1. Böylesine ciddi bir durumda kronik soruna sebep olan yazılımın LG'ye ait olması yüz kızartıcı,
  2. Telefonumun sistemde bulunamaması bir facia,
  3. Programda bulunan bir soruna yaklaşım biçimleri önce müşteri olup olmadığınızla başlıyor. Programda hata varmış, şirkete zarar verebilirmiş, müşteri desteği kalitesi filan bunlar yalan dolan arkadaşlar. Bu sözler bu toprakları terk edeli çok oluyor,
  4. Bu program öyle geliştirilmesi yıllar önce bitmiş bir program değil, ara ara güncelleme almasına rağmen bu sorun devam ediyor.

Sorunun programda değil de telefonda olmadığını nasıl anladım? İnternette sorunla ilgili arama yaptığım an umudumun kalmadığını anladım. Herkes aynı sorundan muzdarip. Sadece G2 de değil. G3'te de aynı sorun var G4'te de, G5'te de. Kimse aldığı yedeği tekrardan telefonuna yükleyemiyor.

Yine olan bize oldu. Verilerimizi kaybettik az buz değil. Dijital ortamda başınıza gelebilecek en kötü senaryolardan birisi bana göre.

Üstad George Carlin bundan bahsetmişti : "Reklam Ninnisi"

İzlemeyeceğim özet geçer misiniz diyenlere buyrun :

Bir daha LG AS-LA.

Desktop App Converter Hazır

$
0
0

Microsoft'un mağaza uygulama çeşitliliğini ve sayısını artırmak ve daha önceden yazılmış .NET kodunun tekrar tekrar yazılmasını engellemek adına Windows uygulamalarınızı (.NET Framework 4.6.1 veya Win32) Universal Windows Platform'a (UWP) çevirmenizi mümkün kılan aracı Desktop App Converter indirilmeye hazır.

Microsoft'un yeni vizyonunun bir parçası olan ve Windows 10'un piyasaya sunulması ile her ürün ailesinin aynı uygulamayı farklı cihazlarda çalıştırabilmesi için yazılımcılara kolaylık sağlayan bu araç aslında sadece komut isteminden ibaret. Uygulamanızın nerede olduğunu ve çevrilmiş halinin de nereye konulacağını (bunun yanı sıra yayıncı, versiyon vs.) parametreler şeklinde sizden istiyor ve son kalan işlem de bunu deploy etmek oluyor. Ortaya nasıl bir şey çıkıyor denemedim, ihtiyacım olana kadar da denemeyi düşünmüyorum. Fakat siz merak ediyorsanız;

Windows mağazasından indirmek için buraya, hakkında detaylı bilgi almak için de buraya tıklayabilirsiniz.

MSDN üzerinde bulunan teknik detayları da buradan görebilirsiniz.

Visual Studio Eklentisi - UWP Tile Generator

$
0
0

Windows 10 piyasaya sürüldükten sonra Universal Windows Platform (UWP) ile ilgili biraz araştırma yapıp bir kaç ufak uygulama geliştirmiştim. Uygulama geliştirme esnasında kolaylık sağlayan bir kaç ipucundan bahsedeceğim. Bu başlık altında bunlardan bir tanesi olan UWP Tile Generator eklentisinden bahsedeceğim. Nedir bu eklenti, ne işe yarar? Başlayalım...

Windows 10 bize ne demişti? Tüm cihazlar tek bir işletim sistemi çalıştıracak, tek bir market altında tüm uygulamalara ulaşılabilecek. Bunun önünü açan tabi ki UWP'den başka bir şey değil. E tabi bunun yanında ufak bir kaç sorun geliyor mesela her cihazın ekran boyutu farklı olduğu için açılış ekranında gözüken resim (splash screen) veya işletim sisteminin başlat menüsünde bulunan kutucuğun boyutu (small, medium, wide, large) da değişken olabiliyor. Zaten Windows mağazasına koyacağınız UWP uygulamanızın farklı ekran boyutlarını destekliyor olması lazım. Sebebi de aşağıda belli.

Windows Phone Emulators

Hal böyle olunca uygulamanın package.appxmanifest kısmında istenilen oranlarda uygulamanızın kaynağını (Tile Image & Logo, Splash Screen, Badge Logo) yüklemeniz gerekiyor.

Visual Studio üzerinde UWP uygulaması açtığımızda default olarak Assets klasörü altında 7 adet dosya oluyor fakar bunlar boş içerikli.

UWP Assets

Şimdi tek bir tıkla tüm boyutlarda kaynak üretebildiğinizi düşünün. İşte burada UWP Tile Generator eklentisi devreye giriyor. Tüm hepsini silin ve bir tane bırakın. O da sizin default kaynak dosyanız olsun. Örnek olsun diye Microsoft logosunu koyacağım.

NOT :

  • Eklentiyi kullanabilmek için Visual Studio 2015 versiyonları dışında çalışmamaktadır. Zaten UWP development için Visual Studio 2015'e ihtiyacınız var,
  • .PNG uzantılı olmasına, 400x400 boyutundan daha büyük ve padding olmamasına dikkat edin aksi takdirde uyarı almanıza rağmen çalışacaktır fakat kötü bir görüntüye sahip olacaktır.

Assets altında bulunan tek dosyamıza sağ tıklayıp "Generate UWP Tiles (ve Splash)" dediğinizde ise size ihtiyacınız olan tüm boyutlarda dosyaları hazırlayıp Assets klasörü içerisine yerleştirecek. Durun, bitmedi! Package.appxmanifest dosyasında da (bu dosya uygulamanızı mağazaya koymadan önce gerekli ayarları barındırıyor) gerekli yerlere koyuyor bunları. Size ise sadece uygulamayı çalıştırmak kalıyor.

Çıktıyı ve programın açlış görüntüsünü gösterelim ve bu işi bitirelim.

Visual Studio Assets

UWP Splash Screen

(Uygulamanın arka plan rengini blog renginden ayırmak için kararttım)

Son olarak başlat menüsünde Tile Image'a bakalım. Wide'da böyle görünüyor.

Siz de benim gibi bu tür görsel işlerle uğraşmaktan nefret ediyorsanız buyrun eklentiyi kullanın.

Eklentiyi indirmek (ücretsiz) için buraya tıklayabilirsiniz, görüşmek üzere.

Hoşgeldin .NET Standard

$
0
0

Microsoft'un cross platform vizyonu ile değişikliğe uğrayan .NET kütüphanesinin son adımı .NET Standard oldu. Kısaca .NET Standard nedir, neden böyle bir şey var bunlardan bahsedelim.

Microsoft, son zamanlarda "One [X] to rule them all" (hatırlayın UWP) mottosu .NET kütüphanesine dokundu ve artık .NET kütüphanesinin (aslında API'lerinin) her yerde kullanılabileceğinin işareti verilmiş oldu. Böylece diğer platformlarda da aynı kütüphanenin kullanılmasının önü açılmış oldu.

Öncesinde .NET Framework, .NET Core ve Xamarin'in kendine ait kütüphaneleri vardı, şimdi ise hepsinin temelinde .NET Standard bulunuyor. Böylece .NET'in sahip olduğu tüm API'ler tüm platformlarda kullanılabilecek. Evet, Portable Class Library (PCL) artık yok.

Birden fazla ortamda kod yazmanın farklı kütüphaneleri kullanma gerekliliğinin tek bir çatı altında toplanmasından ne eksik ne de fazla .NET Standard. Bu arada, .NET Standard 2.0'dan bahsediyoruz. 1.0 nerede? O zaten vardı, .NET Core 1.0 ile gelmişti. Hatta şu alanlarda kod yazanlar bilir => .NET Core 1.6, .NET Framework 4.5+, Universal Windows Platform 10.0.

.NET Standard'ın modelde nerede olacağını aşağıdaki resimlerden görebilirsiniz.

  

.NET Standard yokken

.NET Standard varken

Microsoft .NET Blog sayfasındaki haber ile ilgili makaleyi okumak için buraya tıklayabilirsiniz.


Template 10 - UWP Template Eklentisi

$
0
0

Son zamanlarda UWP (Universal Windows Platform) ile ilgileniyor olmam sayesinde yeni şeyler öğrendim, bu öğrendiklerimi parça parça -eğer siz de Windows 10 uygulama geliştirme işleriyle uğraşıyorsanız- anlatmak isterim. Bunların başında bir template geliyor ve bu template aslında yapmanız gereken işlerin %80'ini sizin için yapıyor. Tamam da neden buradan başlıyoruz? Hemen konuya girelim.

Geçmişte WPF uygulamalar yaptıysanız yani az da olsa XAML/C# biliyorsanız UWP sizin için zor olmayacaktır. Çünkü XAML ile ilgili çok fazla değişiklik yok. UWP'de olup WPF'de olmayan veya tam tersi gibi bir durum söz konusu fakat işler bizler için zorlaşmamış aksine kolaylaşmış. Compiled Binding (x:Bind) işlemlerinden event binding'e çok güzel özellikler eklenmiş ki konumuz bu değil buna ileride de değinmek istiyorum.

Gelelim template (şablon) mevzusuna. UWP application tasarımı için Microsoft'un geliştiricilere sunduğu bazı kurallar var ve sizlerden bunlara uymanız bekleniyor. Uymadığınız takdirde en fazla mağazaya uygulamanız kabul edilmez. Kısacası araştırmam ihtiyaçlarımdan doğdu ve tasarım yapmaktan hiç hoşlanmıyorum, külfet geliyor bana. O yüzden Jerry Nixon adında Microsoft çalışanı abimiz demiş ki "Bir template olsun içerisinde Hamburger Menu'den navigation service'e, Dependency Injection'dan Messenger'a, MVVM'den behavior'lara ve White/Dark tema desteğine kadar her şey olsun ve bu template bir de open source" olsun demiş. Çok da iyi demiş.

Tüm Windows cihaz ailesi ile uyumlu mu bilmiyorum fakat telefon/tablet ve bilgisayarlarda uygulama çok güzel görünüyor. VisualStateManager dahi eklenmiş, ekran küçüldüğü zaman siz bir şey yapmıyorsunuz, Hamburger Menu'nün görünümü kendisi değişiyor. Control görünümü ile ilgili değişiklikleri eklemeniz gerekiyor hepsi bu. Bir örnek göstereyim.

Kısacası sizin layout ile ilgili yapmanız gereken çoğu şey yapılmış. Sürekli sadece layout yükmüş gibi bahsediyorum ama MVVM implement edilmiş, ayarlar konmuş, splash screen'i hazır, NavigationService metotları "buyrun size nasıl yardımcı olabilir" der gibi gözlerinizin içine bakıyor.

Windows SDK Güncellendiğinde Ne Olacak?

Windows işletim sistemi ara ara büyük güncellemeler alıyor ve SDK'lar güncelleniyor. Windows 10 yayınladığı günden bu yana 10240, 10586 ve Anniversary Edition 14393 (Yıldönümü Güncellemesi) versiyonları çıktı ve T10 da bu hıza ayak uydurabiliyor. Hatta Windows Insider (beta katılım) sayesinde yayınlanmadan önce ne gibi değişiklikler geleceği, nelerin değişmesi gerektiği gibi kritik adımları önceden tespit edip T10'u güncelliyorlar. Buna da bir örnek vereyim. Windows 14393 ile gelen UI değişikliklerinden birisi de Hamburger Menu'de seçili olan item'ın solunda "seçili olduğuna dair bir ifade beliriyor" bu da T10'da var.

Soldaki image Windows'un ayarlar menüsü, sağdaki ise benim T10 Template kullanarak yarattığım bir application'ın menüsü.

Gördüğünüz gibi Windows üzerinde yaşanan değişiklikler de T10 Template'e ekleniyor. Ayrıca sizi temin ederim ki güncellemenin çıkmasıyla NuGet üzerinden uygulamamı güncelledim.

T10'u Kullanmalı mıyım? Neden?

UWP için uygulama hazırlayacaksanız kullanmanızı öneririm. Sebepleri ise:

  1. Microsoft'un, dediğim gibi uygulamanızı hazırlarken uymanızı istediği Windows uygulamarına ait belli bir tasarım kalıbı var. Nasıl Google'ın Material Design'ı varsa aynısı Microsoft için de geçerli. Sebebi ise göze ve kullanıma uygun olması,
  2. Sizi bir çok kod yazma işinden kurtarıyor. Dediğim gibi kendi içerisinde implement edilmiş (ve eklenmeye devam edecek) servisler, metotlar var,
  3. Uygulama open source (açık kaynak) ve GitHub üzerinde talepleriniz ciddiyetle dinlenip uygulanabiliyor.

Bu arada size 3 farklı şablon seçeneği sunuluyor. Bunlar :

  1. Blank,
  2. Hamburger,
  3. Minimal.

Evet geldik bu şablonu nerede bulabileceğiniz konusuna. T10 hakkında kod örnekleri, yol haritası, hatalar veya geliştirmeler, Wiki gibi bilgilere GitHubüzerinden erişebilirsiniz. Eklentiyi (template) direkt indirmek istiyorsanız Visual Studio'nun eklentiler kısmından (Tools -> Extensions & Updates) aratarak veya Visual Studio Galleryüzerinden indirebilirsiniz.

NOT : Visual Studio 2015 için geçerlidir.

UWP Community Toolkit

$
0
0

UWP Community Toolkit

Hatırlarsınız eskiden Microsoft'un ASP.NET projelerinde kullanılması için hazırladığı fakat herkesin kullanırken 2 kere düşündüğü 2.sinde ise vazgeçtiği bir AJAX Toolkit'i vardı. Daha sonra AJAX Toolkit'in yerini DevExpress, Telerik vs. gibi hazır kontroller sunan 3.parti kütüphaneler almıştı. Sebebi basit; ihtiyaçtı. Şimdi size anlatacağım UWP Community Toolkit de bu duruma benzer konumda.

UWP, Windows SDK'nın güncellenmesi ile beraber yeni özellikler kazanan bir platform fakat insanların ihtiyaçlarını karşılama konusunda yetersiz olduğu anlar da olabiliyor. Microsoft bunu görüp açık kaynak kodlu bir toolkit hazırlamış: UWP Community Toolkit. Eğer UWP için kod yazdıysanız ne dediğimi anlıyorsunuzdur. En basit örneğiyle Facebook veya Twitter mobil uygulamalarında yukarıdan aşağıya çekildiğinde veri kaynağını güncelleyen bir kontrol (PullToRefreshList) olsa da (hazıra konmak evet) bunu uygulamamızda kullansak demişsinizdir. İşte UWP Community Toolkit ile mümkün.

UWP, HoloLens'ten IoT'ye, Xbox'dan mobile kadar her platforma hitap ettiği için bir çok alanda kullanılabiliyor. Gelelim içerisinde neler olduğuna...

Toolkit 4 bölümden oluşuyor :

  1. Kontroller (HamburgerMenu, AdaptiveGridView vs.),
  2. Servisler (Bing, Facebook, Twitter, LinkedIn vs.),
  3. Bildirimler (LiveTile, Toast vs.),
  4. Animasyonlar (Fade, Scale vs.).

Ek olarak yardımcı metotların (HttpHelper, ImageCache vs.) da bulunduğunu söyleyeyim.

Ben bu yazıyı yazarken versiyon 1.2 de yayınlanmış. Hazır yayınlanmışken incelemek isteyenler için kaynakların arasında onu da belirteyim.

UWP Community Toolkit v1.1 duyurusu için buraya,

UWP Community Toolkit v1.2 duyurusu için buraya,

Kaynak koduna (GitHub) ulaşmak için buraya, dokümantasyona ulaşmak için buraya, örnek uygulamalara indirip denemek isterseniz de buraya tıklayabilirsiniz. UWP Community Toolkit'i kullanacaksanız demoya kesinlikle bakın. İçerisinde direkt hazır XAML kodu bile var. İşinizi kolaylaştıracaktır.

Biraz fazla link verdim farkındayım fakat neler olup bittiğini öğrenmek istiyorsanız aradığınız her şey burada var. Son olarak, versiyon 1.3'te neler olacağını (Roadmap) görmek isterseniz de buraya tıklayabilirsiniz.

Son olarak nasıl indiririm diyenlere => Buyrun UWP Community Toolkit Nuget paketleri

NOT

  1. Visual Studio yüklediğinizde umarım Universal Windows App Development Tools seçeneğini seçmişsinizdir. Bu şartlardan ilki (Visual Studio kurulumu esnasında seçmediyseniz daha sonra installer üzerinden ekleme yapabiliyorsunuz),
  2. UWP uygulamarınızın çalıştırılacağı Windows 10 versiyonu minimum 10586 olmalı.

Bol linkli yazının bonusu

Microsoft Connect(); // 2016

$
0
0

Connect(); //2016

Microsoft'un 16-17 Kasım tarihlerinde düzenlediği Connect etkinliğinde hepimizi yakından ilgilendirecek gelişmeler açıklandı. Sadece Microsoft teknolojileri ile ilgili olmadığını vurgulamak istiyorum.

Etkinlikte çok sayıda gelişmeden bahsedildi fakat ben size bazı önemli olan açıklamaları yazacağım. Merak ediyorsanız tüm gelişmelere buradan ulaşabilirsiniz, 120'den fazla oturum var.

Mac için Visual Studio (Preview)

Microsoft'un açık kaynak koda yüzünü çevirmesi ile yaşanan gelişmelerin haddi hesabı yok. Linux tarafında yaşanan gelişmeler her ne kadar daha heyecanlandırıcı olsa da (benim için) Mac için de güzel gelişmeler var. Bunlardan birisi Visual Studio'nun Mac'te çalışacak olması. Her ne kadar tüm VS proje tiplerini desteklemese de native iOS, Android ve Mac geliştirme yapılabiliyor (teşekkürler Xamarin). İsmi Visual Studio olsa da aslında IDE Xamarin Studio tabanlı fakat UX Visual Studio'ya ait.

C# ve F# desteği mevcut. IntelliSense ve refactor ise Roslyn Compiler tabanlı. Ayrıca Xamarin ve .NET Core uygulamarı, Xamarin.iOS ve Xamarin.Android'de kullanılan debug motoru burada da var.

Daha fazla bilgi ve indirmek için buraya, etkinlik oturumunu izlemek için ise buraya tıklayabilirsiniz.

Visual Studio 2017 (RC)

Visual Studio 2017 yeniliklerinden bahsetmektense direkt olarak kaynak linki vereyim ve siz bakın. Çünkü Microsoft, Visual Studio 2017 için detaylı açıklamalarla ve resimlerle dolu bir sayfa hazırlamış. Buyrun, yeniliklere göz atmak veya indirmek isterseniz buraya, etkinlik oturumunu izlemek istiyorsanız buraya tıklayabilirsiniz. Ayrıca Visual Studio Team Foundation Server 2017 RTM de duyuruldu, yenilikler için buraya tıklayabilirsiniz.

Microsoft Linux Vakfı'na Platinum Üye olarak katıldı

Dediğim gibi, yeni bir Microsoft vizyonu hepimize iyi gelecek. Şimdiden hızlı gelişmelere şait oluyoruz. (Bu arada Platinum üyeler her sene 500.000$ bağış yapmalıymış. #HerGünGereksizBirBilgi)

Google ve Samsung .NET Vakfı'na katıldı

Samsung'u anlarım da Google'ın bunca zaman kötülüğünden sonra açıkçası biraz şaşırdım. Gözümde Evil Co. olarak mimlenmiş (bir diğeri de eski Microsoft), Windows Phone camiasına hiç uygulama yazmayan, yazanlara da karşı çıkan (Microsoft'un yaptığı uygulamalar kaldırılmıştı), API desteğini kısıtlayan bir şirketten bahsediyoruz. Neyse, sonuçta güzel bir hamle. Biz insanlar birlikten kuvvet doğduğunu biliyoruz ama firmalar kendi ürünlerine talebi artırmak adına bundan uzak duruyordu, yola geliyorlar. Gelecekler.

Samsung'un açık kaynak kod işletim sistemi Tizen'i duydunuz mu bilmiyorum fakat .NET desteğini duyurdu. 50 milyondan fazla cihazda (TV, IoT, mobil, giyilebilir teknoloji vs.) var olan Tizen için taze kan, .NET kullanmak için ise başka bir sebep.

Visual Studio için Tizen etkinliğini izlemek için buraya tıklayabilirsiniz.

SQL Server 2016 Service Pack 1 (SP1) duyuruldu

SQL Server 2016 SP1 ile gelen yenilik/değişiklik listesi için buraya tıklayabilirsiniz.

Linux için SQL Server duyuruldu

Bu duyuru var ya bu duyuru, muazzam yenilikçi bir duyuru. Artık Windows OS'yi kullanma zorunluluğunun olmadığı bir dünyada oyun baştan aşağı değişecektir. (Bir yerde okumuştum SQL Server'ın yeniden yazılması söz konusu değil, sadece çerçevesi değiştirilmiş.)

Etkinlik oturumunu izlemek için buraya tıklayabilirsiniz.

Bu duyuruların dışında

  • .NET Core, ASP.NET Core, Entity Framework Core 1.1,
  • Visual Studio Mobile Center Preview.

duyuruları da yapıldı. Etkinlik ile ilgili kısa kısa notlar, haberler ve açıklamalar içeren bu sheet'e göz atmanızı öneririm.

Ek olarak, Microsoft Türkiye Blog sayfasında duyuruları Türkçe bulabilirsiniz.

Windows 10 Creators Update - 2017

$
0
0

Windows 10

Az biraz Windows platformu için uygulama yazıyorsanız Redstone adını duymuşsunuzdur. Redstone, Microsoft'un Windows 10 için yapılacak büyük güncellemelerine verdiği kod adı. Redstone 1, hepinizin de muhtemelen şu an kullandığı Windows 10 Anniversary Update veya diğer şekilde ifade edelim Windows 10 versiyon 1607 (10.0.14393) oluyor.

Nisan 2017 gibi gelecek olan Redstone 2 (Windows 10 Creators Update veya Windows 10 versiyon 1703) için dün Microsoft bir etkinlik düzenledi. Gelelim bu etkinlikte biz yazılımcıları neler bekliyor, ucundan bakalım.

Başlamadan önce; oturumları izlemek istiyorum derseniz buraya, Microsoft tarafından etkinliğe dair paylaşımı okumak istiyorum derseniz de buraya tıklayabilirsiniz.

  • Universal Windows Platform

Microsoft'un akıllı telefon piyasasına geç girmesi ve Windows 8 sonrası işletim sistemlerinde yaşadığı uygulama ekosistemi faciası hala devam ediyor. Piyasada bırakın amiral gemisini artık telefonu bile bulunmuyor. Hatta Nokia Android işletim sistemi tabanlı telefonları duyurduğu vakit 250.000'e yakın sipariş aldığını açıkladı. Bunun sebebi Windows'un mobil pazarda tek haneli paya sahip olması. Aslında bu kadar düşük pazar payına sahip olmasının diğer bir sebebi de telefon bulunmaması. Telefon olsa satmıyor çünkü uygulama yok derken böyle bir döngüye sokuyor insanı Microsoft. Xamarin olsun, Desktop Bridge (masaüstü uygulamarını UWP'ye çevirmek) olsun Microsoft'un kan kaybı durulmuyor. ÇÜNKÜ! UWP başlı başına hala geliştiriciler için uygun bir ortam değil. Öncelikle cezbetmiyor. Cezbetmesi için güzel görünüyor olması lazım, değil mi? Günümüzde işler öyle yürümüyor mu? (Evet) Son zamanlarda tanıtılan yeni Surface ürünleri de bunun bir göstergesi. Zaten Surface ailesinden geriye sadece Surface Phone kaldı, onu da göreceğiz. O yüzden Microsoft, bu etkinliği en çok UWP ve görselliğe ayırdı (Composition & XAML). Bunun yanı sıra ekstra componentler de tanıtıldı.

Adobe, Windows 10 ile tanıtılan Ink için ve core uygulamaları için componentler yayınlayacağını söyledi,
Facebook, Universal Windows Platform uygulamaları için Facebook App Install Ads desteği yayınlıyor,
Telerik, Universal Windows Platform uygulamaları için 20'den fazla kontrolü (Telerik UI for UWP) ücretsiz hale getirdi ve açık kaynak koda geçtiğini duyurdu. Kontroller hakkında bilgi almak için buraya (resmi paylaşımı için buraya), GitHub üzerinden indirmek için buraya, NuGet üzerinden indirmek içinse buraya tıklayabilirsiniz.

Visual Studio 2017 XAML için "Edit and Continue" seçeneği ile UI'da yapılacak değişiklikler direkt olarak uygulamamıza yansıyacak. Ek olarak performans artışı ve stabilite sağlanacak. UWP için kod yazdıysanız design ekranlarının ne kadar yavaş yüklendiğini ve sık sık hata verdiğini görmüşsünüzdür. Burası biraz daha detaylı fakat kısa geçiyorum.

Ekstra not olarak düşeyim, mağazaya uygulamayı gönderme işlemleri, "Dev Center" gibi konularda da yenilikler mevcut.

NOTLAR

  1. Visual Studio 2017, Mart'ın 7'sinde yayınlanıyor (RTM) daha fazla bilgi için buraya tıklayabilirsiniz,
  2. Microsoft, tüm dokümanlarını yeni site altında toplama işlemine kaldığı yerden devam ediyor. UWP de eklendi. Buradan inceleyebilirsiniz,
  3. Universal Windows Platform için yol haritası (roadmap) ve Windows platformu için bug takip listesi yayınladı. Buradan inceleyebilirsiniz (iki kısma da aynı sayfadan erişilebiliyor),
  4. Son zamanlarda Project Neon adı altında Windows'un yenilenmiş ve şeffaflandırılmış arayüz görselleri paylaşılıyordu. Etkinlikte göstere göstere gözümüze soktular. Bu da sanırım 2017 sonlarına doğru yayınlanacak olan Redstone 3 güncellemesi ile yayınlanacak. Aşağıda henüz konsept olan görseli inceleyebilirsiniz.
    Project Neon
  • Windows SDK for Google Analytics

Universal Windows Platform (UWP) uygulamaları, .NET Windows uygulamaları ve Xamarin uygulamaları tarafından kullanılabilecek bu SDK (Google Universal Analytics) ile kullanıcılar gerçek zamanlı verilere ulaşabilecek. Windows Developer blogunda yayınlanan paylaşıma buradan, Github üzerinden SDK'ya erişmek için buraya tıklayabilirsiniz.

BONUS

  • Önceki yazımda Samsung'un işletim sistemi Tizen için .NET uygulamaları yazılabileceğini ve ilk önizleme versiyonunu yayınladığını açıklamıştım. Önizleme versiyonunun ikincisi de geçen günlerde yayınlandı. İncelemek isterseniz buraya tıklayın,
  • Windows 10 Anniversary Update ile yayınlanan Project Rome için SDK yayınlandı. GitHubüzerinden erişebilirsiniz.

Hangfire Hakkında

$
0
0

Bugünün konusu olarak belki duyduğunuz, belki de çoktan büyük ölçekli uygulamalarınızda kullandığınız Hangfire kütüphanesinden bahsedeceğim. Hadi başlayalım. (Github)

Hangfire Nedir?

Background job'ları (arka plan işleri) yaratmanıza, yürütmenize ve yönetmenize kolaylık sağlayan açık kaynaklı kütüphanedir. Job storage olarak bir çok veritabanı (SQL Server, SQL Server + MSMQ, Redis ve daha fazlası), IoC Container ve Unit Test desteklemektedir. Listesi için Hangfire Extension sayfasına göz atabilirsiniz. Hangfire Sidekiq, Resque ve Celery uygulamalarına .NET alternatifidir. 

Background Job Nedir?

Bazı kodların arka planda çalışması gerekmektedir. Çünkü bir iş parçacığının ana thread'de çalışması hem doğası gereği hem de bazı ihtiyaçlar dahilinde uygun olmayabiliyor.

Hangfire Kullanımının Artıları

  • Kullanımı kolay, bir kaç satırla tüm .NET uygulamalarınızda çalıştırabilirsiniz,
  • Yönetilebilirlik ve görünebilirlik sağlar,
  • İşler veritabanında tutulduğu için güvenilirdir. İş tamamlanmadıkça tamamlandı durumuna geçmez, kod bloğunun bitimine kadar çıkacak herhangi bir sorunda iş tekrar çalışacaktır,
  • Uygulamanızdan farklı, dağıtık şekilde kullanılabilir (Infrastructure),
  • ASP.NET uygulamalarında yaşanan sorunlara çözüm sağlar
    • Uzun süren request thread'ler,
    • Birden fazla yaratılmış background job instance'ı (aynı işin aynı zamanda yapılabiliyor olması sorunu),
    • IIS'in AppDomain ve App Pool recycle etmesi (Background job'ların yarım kalması ve tekrarlanmaması).

Hangfire'ın Desteklediği Background Job Tipleri

  • Fire and forget : Bir kere ve hemen çalışan background job tipi
var jobId = BackgroundJob.Enqueue(
    () => Console.WriteLine("Fire-and-forget!"));
  • Delayed : Bir kere fakat belirtilen sürenin sonunda çalışan background job tipi
var jobId = BackgroundJob.Schedule(
    () => Console.WriteLine("Delayed!"),
    TimeSpan.FromDays(7));
  • Recurring : Çok kez ve belirtilmiş CRON sürecinde (günlük, saatlik, haftalık veya CRON expressions vb.) çalışan background job tipi
RecurringJob.AddOrUpdate(
    () => Console.WriteLine("Recurring!"),
    Cron.Daily);
  • Continuations : Tanımlanan ana işin bitiminde çalışan background job tipi
BackgroundJob.ContinueWith(
    jobId,
    () => Console.WriteLine("Continuation!"));
  • Batch(PRO) : Birden fazla işin grup halinde çalışan background job tipi
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
  • BatchContinuations(PRO) : Grup halinde çalışan ana background job'ın bitimiyle çalışan background job tipi
BatchJob.ContinueWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});

NOT : PRO olarak ifade edilen background job tipleri Hangfire'ın ücretsiz sürümünde yer almamaktadır. Yıllık ücret karşılığında bu background job'lara erişilebilir. Ücretlendirme ile ilgili bilgilere ulaşmak için Hangfire Pricing ekranına göz atabilirsiniz. (Ek olarak : Compleks iş akışları, Redis depolama desteği, performance counter işlemleri)

Hangfire Architecture

Hangfire Kurulum ve Konfigürasyon

Hangfire'ı kullanmak istediğiniz projenize Nuget Package Manager yoluyla veya komutla Hangfire'ı yükleyin.

Hangfire NuGet Package

Komut : PM> Install-Package Hangfire (Nuget)

NOT : Farklı proje tipleri için farklı paketler yüklemeniz gerekebilir. Örneğin console uygulaması için Hangfire.Core yüklemeniz lazım fakat IIS'de host edilen web uygulaması için Owin de yüklenmelidir (dependency => Hangfire). Yükleme ve paket ile ilgili bilgiler için Hangfire Installation sayfasına göz atabilirsiniz.

Aşağıda paylaştığım konfigürasyon örneği (en basit haliyle), ASP.NET MVC projesidir.

using Owin;
using Microsoft.Owin;
using Hangfire;
using HangfireDemo;

[assembly: OwinStartup(typeof(Startup))]
namespace HangfireDemo
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Hangfire sunucu bağlantı
            GlobalConfiguration.Configuration.
                UseSqlServerStorage(@"Server=.\SQLExpress;Database=HangfireDemo;Trusted_Connection=True;");

            // Hangfire dashboard kullan
            app.UseHangfireDashboard();

            // Hangfire sunucu kullan
            app.UseHangfireServer();
        }
    }
}

NOT : Batch kullanmak istiyorsanız ekstradan "GlobalConfiguration.Configuration.UseBatches()" satırını eklemeniz gerekiyor.

Hangfire yaratılan job'ları veritabanında tutar, tamamlandıkça da kendisi siler. Veritabanını kendisi yaratmıyor fakat gerekli tabloları kendisi oluşturuyor. (Uygulamanızın veritabanı ile Hangfire veritabanı farklı olabilir.)

Uygulamayı çalıştırdığınızda tabloların oluştuğunu göreceksiniz.

Hangfire veritabanı tabloları

Hangfire dashboard'a ulaşmak için uygulamanızın URL'inin sonuna "/hangfire" yazmanız yeterli.

Hangfire Dashboard

Hangfire Entegrasyonu

Hangfire'ı uygulamanızda kullanırken uygulayabileceğiniz bir kaç farklı senaryo var.

  • Single Process
    Hangfire Single Process
  • Web Garden
    Hangfire Web Garden
  • Web Farm
    Hangfire Web Farm
  • Separate Service
    Hangfire Separate Service
  • Separate Server
    Hangfire Separate Server

Hangfire Parametre İşlemleri

  • Çoklu parametre desteği var,
  • Parametreler serialise (JSON) edilip veritabanında tutuluyor (Array, collection, custom object),
  • Referans parametre ve ref ve out keyword'leri için desteği bulunmamaktadır,
  • Tüm kayıt yerine Id gibi belirgin değerin tutulması tavsiye edilir. Sebebi ise job storage'da tutulacak kaydın boyutu daha küçük olması.

Hangfire Dashboard

Host İşlemi

  • OWIN Middleware olarak yazılmıştır
    • ASP.NET, Nancy ve ServiceStack
  • OWIN Self Host
    • Console uygulaması ve Windows Service
  • Gereklilikler
    • Microsoft.Owin.Host.SystemWeb
    • OWIN Startup class
    • app.UseHangfireDashboard() konfigürasyon kodu

Sunduğu Özellikler

  • Servers (sunucular) : Kullanılan Hangfire sunucuları ve bilgilerini (name, workers, queues, başladığı an ve en son çalıştığı an vs.) gösterir
  • Recurring Jobs : Yaratılan recurring job bilgilerini gösterir. Bunlar : Cron, Time Zone, Job, ne zaman çalışacağı, en son ne zaman çalıştığı ve yaratıldığı tarih. Ayrıca, her ne kadar belirli bir tarih tanımlanmış olsa da Trigger özelliği ile istenilen an tetiklenebilir.
  • Retries (tekrar) : Yaratılan job'ların hata alması durumunda job'ların gösterildiği ekrandır. Kaç kere denendiği de görülebilir. Default olarak atanmış deneme (retry) sayısı 10'dur.
  • Jobs (işler)
    • Enqueued : Sırada olan işler,
    • Scheduled : İleri tarihe ayarlanmış işler,
    • Processing : Çalışan işler,
    • Succeeded : Başarılı şekilde tamamlanmış işler,
    • Failed : Başarısız olmuş işler (tanınmış atama sayısından sonra bile hata alınıyorsa iş buraya düşer),
    • Deleted : Silinmiş işler,
    • Awaiting : Sırasını bekleyen (continuations) işler.

Hangfire Dashboard Gelişmiş Konfigürasyon Seçenekleri

Hangfire Dashboard URL değişikliği ve geri yönlendirme opsiyonu

            // Dashboard üzerinden "back to site" button
            var options = new DashboardOptions { AppPath = VirtualPathUtility.ToAbsolute("/Home/Index") };
            // Dashboard custom URL
            app.UseHangfireDashboard("/ApplicationHangfireDashboard", options);

Birden fazla Hangfire Dashboard (ve/veya farklı veritabanları) kullanımı

            var storage1 = new SqlServerStorage("HangfireDatabase1");
            var storage2 = new SqlServerStorage("HangfireDatabase2");

            app.UseHangfireDashboard("/Hangfire1", new DashboardOptions(), storage1);
            app.UseHangfireDashboard("/Hangfire2", new DashboardOptions(), storage2);

            // Hangfire sunucu kullan
            // app.UseHangfireServer();

Hangfire Dashboard Güvenlik

Hangfire Dashboard'a default; local olarak erişilebilir. Örneğin sunucuda IIS'de çalışan bir web uygulamanızın Hangfire Dashboard'una remote (uzaktan erişim) makineden erişemezsiniz. Fakat uzaktan erişim için yetki vermeniz mümkün. Bunun için (IAuthorizationFilter 2.0.0 ile silinecek) IDashboardAuthorizationFilter interface'ini kullanmanız gerekiyor.

        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration.
                UseSqlServerStorage(@"Server=.\SQLExpress;Database=HangfireDemo;Trusted_Connection=True;");

            app.UseHangfireDashboard("/hangfire", new DashboardOptions()
            {
                Authorization = new[] { new HangfireAuthorizationFilter() }
            });

            // Methodları çağırma sırası önemlidir
            // Önce authentication sonra 
            // HangFireServer
            app.UseHangfireServer();
        }

        public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
        {
            public bool Authorize(DashboardContext context)
            {
                if (HttpContext.Current.User.IsInRole("RoleName"))
                    return true;

                return false;
            }
        }

Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-dashboard.html#configuring-authorization

Hangfire Exception

Hangfire, uygulamanızda alacağınız hataları (default tekrar deneme sayısı : 10) hata detayı ile birlikte gösterir. Hata aldığınız job, retries sekmesine düşer. Retry sayısını Global ve Method seviyesinde değiştirmek mümkün. Örneğin retry sayısını 1 yaparsanız 1. denemeden sonra tekrar hata alınması durumunda job Failed sekmesine düşecektir.
Global seviyede retry sayısını değiştirmek için aşağıdaki kodu kullanabilirsiniz.

GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute() {  Attempts = 1});

Method seviyesinde değiştirmek isterseniz, methodunuza aşağıdaki attribute'u ekleyebilirsiniz.

[AutomaticRetry(Attempts = 1)]

Eğer fail olan joblarınızın manuel değil de otomatik olarak silinmesini istiyorsanız
AutomaticRetry(OnAttemptsExceeded = AttemptsExceededAction.Delete) kodunu kullanabilirsiniz.
Daha fazla bilgi için => http://docs.hangfire.io/en/latest/background-processing/dealing-with-exceptions.html

HangFire Logging

Hangfire otomatik loglama desteğine (Serilog, NLog, Log4Net, EntLib Logging, Loupe ve Elmah) sahiptir. Otomatik loglama; startup sınıfında log provider tanımlamanızın yettiği anlamına geliyor. Ayrıca custom loglama desteği (ILogProvider, ILog) de mevcuttur.
Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/configuring-logging.html

HangFire SQL Server Ayarları

            var serverOptions = new SqlServerStorageOptions
            {
                // Hangfire'ın ne kadar süre aralıkta kontrol edeceği bilgisi
                // Default değeri 15 saniye
                QueuePollInterval = TimeSpan.FromSeconds(45),
                // Veritabanında tabloların yaratılıp yaratılmayacağı bilgisi
                // Manuel migration işlemleri için false yapılabilir
                // Default değeri true
                PrepareSchemaIfNecessary = false
            };

            GlobalConfiguration.Configuration.UseSqlServerStorage("Veritabanı", serverOptions);

Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-sql-server.html

NOT : Hangfire, Redis desteklemektedir. Redis'in tercih sebepleri arasında yüksek performans (in-memory) ilk sıradadır fakat Redis kullanmak için Hangfire PRO yani ücretli versiyonu kullanılması zorunludur. Daha fazla bilgi için => http://docs.hangfire.io/en/latest/configuration/using-redis.html

Hangfire Performance Comparison

Ve son olarak dikkat edilmesi gerekenler...

  • Job'ları kullandığınız metotlar yarıda kesilebilir ve tekrarlanabilir,
  • Methodlarda kullandığınız parametreler, kompleks olmayan (basit), küçük ve object yerine primitif tip,
  • Unit test ve IoC'ye uygun,
  • Job takibi Polling vs. Pushing (örnek : SignalR) ayrımı gözetilerek

yazılırsa kodunuz optimize olmuş olur.

Developer Summit 8 Nisan’da İstanbul'da & 6 Mayıs'ta Ankara'da

$
0
0

8 Nisan 2017 Cumartesi günü Kadir Has Üniversitesi Cibali Kampüsü'nde ve 6 Mayıs 2017 Cumartesi günü ise Bilkent Cyberpark'ta yazılım sektörünün önemli isimleri Devnot organizasyonu ile bir araya geliyor.

Etkinliğin konuşmacılarını gösteren afişi aşağıya bırakıyorum. Etkinlik ücretsiz.

Etkinlik sayfası için buraya, kayıt olmak içinse buraya tıklayınız.

Devnot Summit 2017

Developer Summit Beykent Cyberpark

Yeni Windows 10 SDK Kullanıma Hazır

$
0
0

Windows 10

Microsoft'un Creators Update olarak adlandırdığı kod adı ise Redstone 2 olan son ve büyük Windows 10 güncellemesi hazır. Bu güncelleme ile beraber Windows 10'un versiyonu 1703 (15063.13) olarak güncellendi. Yeni güncellemenin gelmesi demek, Windows 10'a yeni özellikler, yeni build numarası, yeni emulatorlar demek. Dolayısıyla biz yazılım geliştiriciler için güzel haberler var. Haberin sonunda sizlere gerekli bilgileri ve araçları nerelerden edinebileceğinize dair bağlantı listesi vereceğim.

Bir önceki yazımda sene sonuna kadar çıkacak 3 büyük güncellemeden birisi olduğunu, lansmanı yapıldığında biz geliştiriciler için özellikle görsel anlamda yenilikler kattığını belirtmiştim. Bunun yanı sıra Bluetooth geliştirmeleri, Desktop Bridge iyileştirmeleri, yeni paylaşma deneyimi, Project Rome, uygulama güvenliği adına Windows Hello eklentisi gibi yenilikleri de var. Liste aslında Windows 10'un yeniliklerinden daha fazla ve heyecan verici. Windows 10'u çıkış tarihinden (11 Nisan) önce indirmeniz için Windows Upgrade Assistant uygulamasını kullanmanız gerekiyor. Bir kaç gün daha beklerseniz değişen hiçbir şey olmayacak.

Ayrıca .NET Framework 4.7 duyuruldu. (Ekstradan Developer Tools ekranları, dokümantasyon sisteminde de geliştirmeler yapıldı.)

NOT : Visual Studio 2017'ye yeni SDK'yı ve yeni emülatörleri yüklemenin en kolay yolu Visual Studio Installer kullanıp "Individual components" sekmesinden  Windows 10 SDK (10.0.15063.0) for UWP ve Windows 10 Mobile Emulator (Creators Update) seçeneklerini eklemek.

  1. Windows Blog yenilik listesi için buraya
    https://blogs.windows.com/buildingapps/2017/04/05/windows-10-creators-update-creators-update-sdk-released/#y1MUh2RvkLAsGxud.97
  2. Windows 10 versiyon 1703 - Mart 2017 yenilik listesi için buraya
    https://docs.microsoft.com/en-us/windows/uwp/whats-new/windows-10-version-1703
  3. Windows 10 version 1703 yeni API listesi için buraya
    https://docs.microsoft.com/en-us/windows/uwp/whats-new/windows-10-version-1703-api-diff
  4. Windows 10 SDK indirmek için buraya
    https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
  5. .NET Framework 4.7 yenilikler listesi
    https://github.com/Microsoft/dotnet/blob/master/releases/net47/README.md

.NET Dünyasında Kriptografi

$
0
0

Kriptografi Nedir? Neden ve Nerede Kullanılır?

Kriptografi, en geniş anlamıyla bilgileri gizlemektir. Fiziksel dünyadaki bilginin elektronik dünyaya taşınması ile ortaya çıkan güvenlik endişelerini gidermek için kullanıldığında söz bize, yazılımcılara düşer. Hepimiz gündelik hayatta güvenlik önlemleri altında hayatımıza devam ediyoruz. Bilgisayarınızı açtığınızda kim olduğunuzu kanıtlamak veya alışveriş sitesinde kredi kartı ile alışveriş yapmak bunlara verilebilecek en basit örneklerdir. Her iki işlemde de belirli parametreler (kredi kartı no. veya kullanıcı adı ve parolası) belirli adreslere gönderilip kontrol edilirken şifrelenirler.

Encryption & Decryption

Gizleme işlemine şifreleme diğer bir adıyla da encryption, şifrelenen mesajın şifresinin kaldırılmasına (okunması) ise decryptiondenir.
Örneğin, size bir mesaj gönderildiğini, bu mesajın şifrelendiğini ve anahtarın sadece mesajı gönderen kişide ve sizde olduğunu düşünün. Böylece mesaj vericinin elinden çıktığı andan alıcının eline ulaştığı ana kadar şifrelenmiş olacaktır. (Aynı şifreleme algoritmasının kullanıldığı bu işleme simetrik anahtar algoritması diğer adıyla symmeric encryption denir. İleride değineceğim.)

Encryption

Mesajın gönderilmeden önce şifrelenmesi

Decryption

Mesajın alıcıya ulaşmadan önce şifrenin kaldırılması

Kriptografinin Ana Konseptleri

  • Gizlilik: Yaptığınız işin içeriğinde kullanılan parametrelerin ne olduğunun asla bilinmemesi,
  • Bütünlük: İşlemin başından sonuna kadar şifrelenmiş verinin değişime uğramadan gideceği adrese ulaşması,
  • Reddedilmeme: Şifrelemeyi gerçekleştiren kişinin doğrulama adına imzasının olması,
  • Kimlik: Gizliliğin olduğu herhangi bir ortama erişim için kanıtlanmış kimlik.

> Rastgele Sayılarla Kriptografi

  • Şifreleme anahtarı oluşturmak için kullanılır,
  • Bazı sistemlerde cihazın sahip olduğu donanım bilgisi şifreleme işlemlerinde kullanılır. Mesela MAC ethernet adresi gibi. Donanımda bunun kullanılamadığı durumlar da söz konusu. Burada devreye yazılım tabanlı şifreleme girmeli. Bu yöntem için tamamen "rastgele" denemez,
  • Rastgelelik durumu insan etkileşimi ile oluşturulabilir,
  • Sunucu uygulamaları için uygun değildir çünkü manipülasyona açıktır. O yüzden belirli bir algoritma ya da donanıma ait bilgiler kullanılmalıdır.

Donald. E.Knuth adlı bilgisayar bilimcinin "Subtractive Random Number Generator" çalışması temel alınmıştır. Daha fazla bilgi için => The Art of Computer Programming

            // Farklı .NET Framework versiyonlarında
            // farklı değerler üretir (aynı seed değerler
            // olsa da)

            // Deterministtir, öngörülebilir

            Random rnd = new Random(350);

            for (int i = 0; i < 10; i++)
                Console.Write("{0,3}   ",rnd.Next(-10, 11));

            Console.Read();

System.Random ve Sorunları

  • Microsoft, uygulamanızda tek bir System.Random sınıfı instance'ı kullanılmasını öneriyor. Bkz. Random Class,
  • System.Random thread safe değildir (tek thread kullanımına dikkat edin aksi takdirde 0 değeri dönebilir),

Rastgele Numaraları RNGCryptoServiceProvidersınıfı ile kullanırsanız daha güvenli şifreleme işlemleri gerçekleştirirsiniz. System.Random'a göre performans açısından daha yavaştır fakat tamamen rastgeledir.

        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
                // Base64 işlemi daha okunabilir hale gelmesi için uygulanıyor
                Console.WriteLine($"Rastgele Numara {i + 1}: {Convert.ToBase64String(GenerateRandomNumber(32))}");

            Console.ReadLine();
        }

        public static byte[] GenerateRandomNumber(int length)
        {
            // 256-bit şifreleme için
            // Length = 32 (32 byte * 8 bit = 256 bit)
            using (var randomNumberGenerator = new RNGCryptoServiceProvider())
            {
                var randomNumber = new byte[length];
                randomNumberGenerator.GetBytes(randomNumber);

                return randomNumber;
            }
        }

RNGCryptoServiceProvider

> Hashing Algoritmaları İle Kriptografi

  • Verilen parametreyi kolayca hash'leyip hazırlar,
  • Hash'lenmiş bir veriyi ilk haline çevirmek için kullanılamaz, tek yönlüdür,
  • Hash'lenmiş verinin, orijinal halinde yapılacak en ufak bir değişiklik, tamamen farklı bir değerin üretilmesine sebep olacaktır,
  • İki farklı parametre aynı hash değeri üretemez (parmak izi örnek verilebilir, eşi yoktur),

.NET uygulamarında kullanılabilecek hash çeşitleri

Hashing Algorithms

  • Hashing ile geri döndürme işlemi yapılamaz. Yani, şifreli bir mesajı tekrar orijinal parametre haline çeviremezsiniz. Encryption'da bu mümkün. Yön farkları buradan gelmektedir,
  • Orijinal parametre değişmedikçe hash işlemi yapıldıkça üretilecek değerler aynı olacaktır (tek bir karakteri bile değişse, çok farklı bir değer üretileceğini belirtmiştik),

MD5

  • 1991 yılında MD4'un yerini almıştır,
  • 128-bit,
  • 1996 yılında ilk açık bulundu, 2004 yılında bulunan açıkların sayısı arttı. Kriptografcılar SHA gibi diğer yöntemlerin kullanılmasını öneriyor (çok nadir de olsa iki farklı veri seti aynı hash değer üretebiliyordu),
  • Yine de eski uygulamalarda kullanılmaktadır.

SHA (Secure Hash Algorithm)

  • SHA-1, NSA (National Security Agency) tarafından geliştirildi. 160 bit uzunluktadır. Bulunan sorunlardan ötürü daha fazla gelişimi sürmedi,
  • SHA-2, SHA-256 ve SHA-512 ailelerini temsil eder. SHA-256 256-bit, SHA-512 542-bit. NSA tarafından geliştirilmiştir,
  • SHA-3, 2012 yılında non-NSA yarışması sonucu doğmuştur. SHA-2'nin sahip olduğu hash uzunluğuna sahiptir. .NET Framework tarafından desteklenmemektedir. Üçüncü parti yazılımlarla ekleme yapmak mümnkün (.NET Framework desteği olmadığı için üzerinde durmayacağım).
        // Aşağıda belirtilen kriptografi sınıfları aynı
        // Interface'i kullanmakta => HashAlgorithm

        public static byte[] ComputeHashSHA1(byte[] toBeHashed)
        {
            using (var sha1 = SHA1.Create())
                return sha1.ComputeHash(toBeHashed);
        }

        public static byte[] ComputeHashSHA256(byte[] toBeHashed)
        {
            using (var sha256 = SHA256.Create())
                return sha256.ComputeHash(toBeHashed);
        }

        public static byte[] ComputeHashSHA512(byte[] toBeHashed)
        {
            using (var sha512 = SHA512.Create())
                return sha512.ComputeHash(toBeHashed);
        }

        public static byte[] ComputeHashMD5(byte[] toBeHashed)
        {
            using (var md5 = MD5.Create())
                return md5.ComputeHash(toBeHashed);
        }

Hashed Message Authentication Codes (HMAC)

Diğer adı hash MAC olan yöntemle verinizin bütünlüğü yine bir anahtar aracılığıyla kontrol edilebilir. Anahtar (input) kullanılarak şifrelenmiş veriniz, aynı anahtar kullanılarak tekrar üretilecek şifre değeri ile aynı olur ve tutarlılık kontrolü yapılabilir. Temel seviyedeki hash şifreleme sistemine göre daha az etkilidir. MD5 veya SHA ailesi kullanılarak şifreleme yapılır. Bu şifreleme yöntemine karşı en çok yapılan saldırı tipi Brute Force'tur.

HMAC

private const int KeySize = 64;

public static byte[] GenerateKey()
{
	using (var randomNumberGenerator = new RNGCryptoServiceProvider())
	{
		var randomNumber = new byte[KeySize];
		randomNumberGenerator.GetBytes(randomNumber);

		return randomNumber;
	}
}

//HMACxx sınıfına key verilmezse tamamen rastgele değer üretir

/*HMACxx sınıfına verilecek parametrenin uzunluğu olarak 64 bit
 kullanılması öneriliyor. Düşükse tamamlanır, fazlaysa kırpılır.
*/

public static byte[] ComputeHMACSHA1(byte[] toBeHashed, byte[] key)
{
	using (var hmac = new HMACSHA1(key))
		return hmac.ComputeHash(toBeHashed);
}

public static byte[] ComputeHMACSHA256(byte[] toBeHashed, byte[] key)
{
	using (var hmac = new HMACSHA256(key))
		return hmac.ComputeHash(toBeHashed);
}

public static byte[] ComputeHMACSHA512(byte[] toBeHashed, byte[] key)
{
	using (var hmac = new HMACSHA512(key))
		return hmac.ComputeHash(toBeHashed);
}

public static byte[] ComputeHMACMD5(byte[] toBeHashed, byte[] key)
{
	using (var hmac = new HMACMD5(key))
		return hmac.ComputeHash(toBeHashed);
}

> Şifre Depolama Yöntemleri

  • Şifresiz Kayıt

Kesinlikle uygulanmaması gereken depolama şekli. Eğer şifrelenmesi gereken veriniz şifresiz bir şekilde yolculuk ediyor ve gideceği noktada yine şifrelenmemiş bir şekilde kayıt altında tutuluyorsa, sisteminizde çok büyük güvenlik zafiyeti vardır. Sisteme erişim halinde hassas verileriniz çıplak bir şekilde sergileniyor olacak (plain text).

Clear Text Storage

  • Encryption

Uygulamalarımızda hassas verilerin veritabanına şifreli olarak kaydedilmesi, veritabanına erişim sonrası yaşanacak sorunları bir nebze azaltacaktır. Fakat encrypt edilen bir verinin, tekrar kullanımı için decrypt edilmesi lazım. Yani şifre oluşturulurken kullanılan anahtar sözcüğün (key) de yönetimi söz konusu. Veritabanına kaydedilmiş şifreli verinin decrypt edilememesi gerekir. Çünkü anahtar çalınırsa tüm kilitler açılır.

Encryption

  • Hash

Encryption'dan daha güvenilir ve kullanışlı olan hash yönteminin de kendince sorunlar var. Önce artılarına bakalım; hash işlemi geri çevrilemediği için şifrelenmeden önceki halinin ne olacağı bilinemiyor böylece sisteme sızılması durumunda veriler kötü niyetli kişiler için anlamsız oluyor. Ayrıca key kullanılmadığı, tamamen rastgele değerler üretildiği için key management gibi bir sorun da yok.

  1. Brute Force Attack: Saldıran kişi, farklı kombinasyonlarla üretilmiş hash değerini sisteminizde kaydedilmiş herhangi bir kayıtla eşleşmesi için sürekli deneyecektir. Kulağa eşleşmesi neredeyse imkansızmış gibi geldiğinin farkındayım fakat teknolojinin nimetlerinden yararlanarak milyonlarca kaydı çok kısa süre içerisinde çoktan eşleştirmiş oluyorlar (o yüzden kullanılmış, herkes tarafından bilinen 12345 gibi şifreleri kullanmayın).
  2. Rainbow Table Attack :  Farklı şifrelerin hashlenmiş hallerini üzerinde bulunduran büyük bir kaynak (key-value ve GB'larca olması mümkün) ve bu kaynaktan sisteme girilmeye çalışıldığını düşünün,
  • Salted Hashes

Hash kullanarak yarattığınız değerlere kendi kombinasyonlarınızı da uygulayabilirsiniz. Mesela hash'lemek istediğiniz parametrenin byte dizisi ile yine kendi yarattığınız rastgele (random) sayıların byte dizisini birleştirebilir (combine) ve bu birleşimi hash'leyebilirsiniz. Böylece Brute Force ve Rainbow Table saldırılarında önceden hashlenmiş değerlerin sizinki ile uyuşması, ya da tahmin edilebilir olması zorlaşacaktır.

Password Salt Hashing

public static byte[] GenerateSalt()
{
	const int saltLength = 32;

	using (var randomNumberGenerator = new RNGCryptoServiceProvider())
	{
		var randomNumber = new byte[saltLength];
		randomNumberGenerator.GetBytes(randomNumber);

		return randomNumber;
	}
}

private static byte[] Combine(byte[] first, byte[] second)
{
	var value = new byte[first.Length + second.Length];

	Buffer.BlockCopy(first, 0, value,0, first.Length);
	Buffer.BlockCopy(second, 0, value, first.Length, second.Length);

	return value;
}

private static byte[] HashPasswordWithSalt(byte[] toBeHashed, byte[] salt)
{
	using (var sha256 = SHA256.Create())
	{
		return sha256.ComputeHash(Combine(toBeHashed, salt));
	}
}
  • Password-Based Key Derivation Function (PBKDF2)

Hash fonksiyonun salt ile birlikte kullanımı bile bizim için yeteri kadar güvenli bir ortam oluşturmuyor. Bunun sebebi ise her geçen gün işlemcilerin veya bilgisayarların giderek daha da hızlanması ile Brute Force ve Rainbow Table saldırılarının tehlikeli boyutlara gelmiş olması (bkz. Moore Yasası) Haliyle bize daha güvenli bir yöntem lazım. Burada devreye RSA Public Key Cryptographic Standards serisi devreye giriyor. Diğer adı Internet Engineering Task Force's RFC 2898'dır.

PBKDF, parametreyi (şifrelenecek veri, password) alır, üstüne salt ekler daha sonra ise belirtilen sayıda algoritmanın üreteceği değeri daha da karmaşık hale getirir. Böylece saldırılara karşı daha da güvenilir, karmaşık ve denendiği halde eşleşmesi çok daha uzun süre alacak bir değer üretilecektir. (LastPass, şifrelerinizi tek bir yerde toplayan ve yönetilebirliği artıran bir uygulama. JavaScript client için 5bin, server-side için 100bin iterasyon kullanmış bkz. LastPass Password Iterations (PBKDF2))

NOT

  1. 64bit (8byte) salt uzunluğu öneriliyor,
  2. Sisteminizi performans açısından zorlamayacak sayıda yineleme (iterasyon) işlemi yapılmalı,
  3. Moore Yasası baz alınırsa, her iki senede yineleme sayısını iki kat artıracak şekilde işlemlerinizi gerçekleştirin,
  4. Salt hiçbir yöntemde gizli olma zorunluluğu taşımaz.

PBKDF2

static void Main(string[] args)
{
	string password = "Kompleks Şifre Örneği";

	HashPassword(password, 100);
	HashPassword(password, 1000);
	HashPassword(password, 10000);
	HashPassword(password, 100000);

	Console.Read();
}

public static byte[] GenerateSalt()
{
	using (var randomNumberGenerator = new RNGCryptoServiceProvider())
	{
		var randomNumber = new byte[32];
		randomNumberGenerator.GetBytes(randomNumber);

		return randomNumber;
	}
}

private static void HashPassword(string passwordToHash, int iterationNumber)
{
	Stopwatch stopwatch = new Stopwatch();
	stopwatch.Start();

	var hashedPassword = HashPassword(Encoding.UTF8.GetBytes(passwordToHash), GenerateSalt(), iterationNumber);

	stopwatch.Stop();

	Console.WriteLine($"Parametre : {passwordToHash}");
	Console.WriteLine($"Parametrenin Hash'li Hali : {Convert.ToBase64String(hashedPassword)}");
	Console.WriteLine($"Yineleme sayısı : {iterationNumber}, geçen süre : {stopwatch.ElapsedMilliseconds} ms");
	Console.WriteLine();
}

private static byte[] HashPassword(byte[] password, byte[] salt, int iterationNumber)
{
	// Rfc2898DeriveBytes sınıfı PBKD fonksiyonudur
	using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, iterationNumber))
		return rfc2898.GetBytes(32);
}

Çıktısı =>

PBKDF2 Örnek Çıktısı

> Simetrik Şifreleme (Symmetric Encryption)

Çift yönlü şifrelemede kısaca değindik, birazdan farklı şifreleme tekniklerine bakacağız ama yine de kısaca değinelim.

Hızlı, güvenilir fakat yine ortada anahtar olan, anahtar ile tüm şifrelemelerin çözülebildiği bir şifreleme türü. Tüm simetrik şifreleme sınıfları SymmetricAlgorithm abstract sınıfını miras alır. Hızlı ve güvenlidir. Encrypt ve decrypt işlemlerinde aynı anahtarı kullanıyor olmasından ötürü simetrik denmektedir.

Simetrik Şifreleme

  • Data Encryption Standard (DES)
    IBM tarafından geliştirilmiştir. 64 bitlik key vardır fakat algoritma 56 bitlik kısmını kullanır. Güvenilirliğini test etmek için açılan meydan okuma yarışmasının (DESCHALL) 96. gününde şifre kırılmıştır. (Yarışma ve yaşanan hack olayı için daha fazla bilgiyi bu kitapta bulabilirsiniz => Brute Force: Cracking the Data Encryption Standard)

    DES
    static void Main(string[] args)
    {
    	string password = "Kompleks Şifre Örneği";
    
    	var key = GenerateRandomNumber(8);
    	var iv = GenerateRandomNumber(8);
    
    	var encrypted = Encrypt(Encoding.UTF8.GetBytes(password), key, iv);
    	var decrypted = Encoding.UTF8.GetString(Decrypt(encrypted, key, iv));
    
    	Console.WriteLine($"Orijinal hali : {password}");
    	Console.WriteLine($"Şifrelenmiş hali : {Convert.ToBase64String(encrypted)}");
    	Console.WriteLine($"Şifresi çözülmüş hali : {decrypted}");
    
    	Console.Read();
    }
    
    private static byte[] GenerateRandomNumber(int length)
    {
    	using (RNGCryptoServiceProvider randomNumberGenerator = new RNGCryptoServiceProvider())
    	{
    		var randomNumber = new byte[length];
    		randomNumberGenerator.GetBytes(randomNumber);
    
    		return randomNumber;
    	}
    }
    
    private static byte[] Encrypt(byte[] dataToEncrypt, byte[] key, byte[] iv)
    {
    	using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
    	{
    		des.Key = key;
    		des.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), 
    										CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    
    private static byte[] Decrypt(byte[] dataToDecrypt, byte[] key, byte[] iv)
    {
    	using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
    	{
    		des.Key = key;
    		des.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateDecryptor(), 
    											CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToDecrypt, 0, dataToDecrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    DES

  • Triples DES
    DES'in güvenilirliği sorgulanmaya başladıktan sonra yeni bir şifreleme algoritmasının temelleri de atılmış oldu. DES'e göre en büyük farklılığı yine DES'i uyguluyor olması fakat üstüne farklı 2-3 anahtarın ekleniyor olması. Birinci adımda anahtar ile oluşturulan şifreye, ikinci anahtar eklenerek tekrardan şifreleniyor (2. veya 3. anahtar. Şifrelenmiş halinden orjinal haline geri döndürmek için kullandığınız anahtar sırasını tersten işlemeniz gerekiyor.)

    Triple DES
    static void Main(string[] args)
    {
    	string password = "Kompleks Şifre Örneği";
    
    	// 3 key kullanımı
    	// 24 / 8 = 3 tane 64bit anahtar
            // 32 verirseniz hata alırsınız. Maksimum : 3 anahtar
    	// UNUTMA : 56bit kullanılıyor
    	var key = GenerateRandomNumber(24);
    	var iv = GenerateRandomNumber(8);
    
    	var encrypted = Encrypt(Encoding.UTF8.GetBytes(password), key, iv);
    	var decrypted = Encoding.UTF8.GetString(Decrypt(encrypted, key, iv));
    
    	Console.WriteLine($"Orijinal hali : {password}");
    	Console.WriteLine($"Şifrelenmiş hali : {Convert.ToBase64String(encrypted)}");
    	Console.WriteLine($"Şifresi çözülmüş hali : {decrypted}");
    
    	Console.Read();
    }
    
    private static byte[] GenerateRandomNumber(int length)
    {
    	using (RNGCryptoServiceProvider randomNumberGenerator = new RNGCryptoServiceProvider())
    	{
    		var randomNumber = new byte[length];
    		randomNumberGenerator.GetBytes(randomNumber);
    
    		return randomNumber;
    	}
    }
    
    private static byte[] Encrypt(byte[] dataToEncrypt, byte[] key, byte[] iv)
    {
    	using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider())
    	{
    		tripleDES.Key = key;
    		tripleDES.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, tripleDES.CreateEncryptor(), 
    											CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    
    private static byte[] Decrypt(byte[] dataToDecrypt, byte[] key, byte[] iv)
    {
    	using (TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider())
    	{
    		tripleDES.Key = key;
    		tripleDES.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, tripleDES.CreateDecryptor(), 
    										CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToDecrypt, 0, dataToDecrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    Triple DES

  • Advanced Encryption Standard (AES)
    DES'in yerini alması için 2001 yılında kullanılmaya başlanmıştır. DES'in aksine Feistel Network kullanmaz. 128 bit girdi, 128, 192 veya 256 bitlik anahtar (sırasıyla 10, 12,14 yineleme yapar) kullanır. AES, en çok güvenilen şifreleme yöntemlerinden birisidir. Değiştirme-Karıştırma yöntemi ile çok karmaşık bir değer üretilir. Şifrenin kırılması için gerekli süre adına şuan bulunan süper bilgisayarlar kullanılsa bile evrenin yaşından daha fazla vakit alacağı söyleniyor. (256bit = 1.1x1077 ihtimal)

    AES

    static void Main(string[] args)
    {
    	string password = "Kompleks Şifre Örneği";
    
    	var key = GenerateRandomNumber(32);
    	var iv = GenerateRandomNumber(16);
    
    	var encrypted = Encrypt(Encoding.UTF8.GetBytes(password), key, iv);
    	var decrypted = Encoding.UTF8.GetString(Decrypt(encrypted, key, iv));
    
    	Console.WriteLine($"Orijinal hali : {password}");
    	Console.WriteLine($"Şifrelenmiş hali : {Convert.ToBase64String(encrypted)}");
    	Console.WriteLine($"Şifresi çözülmüş hali : {decrypted}");
    
    	Console.Read();
    }
    
    private static byte[] GenerateRandomNumber(int length)
    {
    	using (RNGCryptoServiceProvider randomNumberGenerator = new RNGCryptoServiceProvider())
    	{
    		var randomNumber = new byte[length];
    		randomNumberGenerator.GetBytes(randomNumber);
    
    		return randomNumber;
    	}
    }
    
    private static byte[] Encrypt(byte[] dataToEncrypt, byte[] key, byte[] iv)
    {
    	using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
    	{
    		aes.Key = key;
    		aes.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), 
    										CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToEncrypt, 0, dataToEncrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    
    private static byte[] Decrypt(byte[] dataToDecrypt, byte[] key, byte[] iv)
    {
    	using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
    	{
    		aes.Key = key;
    		aes.IV = iv;
    
    		using (MemoryStream memoryStream = new MemoryStream())
    		{
    			CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), 
    										CryptoStreamMode.Write);
    
    			cryptoStream.Write(dataToDecrypt, 0, dataToDecrypt.Length);
    			cryptoStream.FlushFinalBlock();
    
    			return memoryStream.ToArray();
    		}
    	}
    }
    AES

> Asimetrik Şifreleme (Asymmetric Encryption)

Simetrik şifrelemenin hızlı ve güvenilir olduğundan bahsetmiştik fakat anahtar yönetimi sorunu mevcut. Anahtara sahip kişinin verebileceği hasar, tüm şifreleri kırabilmesiyle başlıyor. Bunun çözümü asimetrik şifrelemede. Asimetrik şifreleme de iki çeşit anahtar var. Birisi açık (public) diğeri ise kapalı (private). Bu iki anahtar birbiri ile (matematiksel olarak) bağlantılı ve sadece private anahtarın saklanması gerekiyor. Public key herkesin erişimine açıkken, private key sadece alıcıya aittir. Public key ile encrypt, private key ile decrypt yapılıyor. Peki private key'in ele geçirilmesi ile yaşanacak sorunlar nasıl önleniyor? Şöyle; private key'e sahip olan kişi, hangi public key'e bağlı olduğunu bilmiyor çünkü anahtar değişimi yok. Simetrik şifrelemeye göre dezavantajı ise işlemin daha yavaş olması. Sebebi ise daha kompleks bir yapıda olması.

Asimetrik Şifreleme

  • RSA (Rivest, Shamin ve Adelman)
    • İsmini, tekniğin mucitlerinden almaktadır. RSA Security LLC firmasının bir ürünüdür,
    • RSA, diğer simetrik şifrelemelerle kullanılabilir. Birazdan hibrit şifrelemede bu konuya değineceğim,
    • 1024, 2048 ve 4096 bit anahtar kullanır. Günümüz koşullarında en az 2048 bitlik anahtar kullanılması öneriliyor. 1024 bitlik anahtar zayıf görülüyor,
    • Açık ve kapalı anahtarlar asal sayı temellidir,
    • Encryption ve decryption işlemleri matematik operasyonlarından oluşuyor, yavaş olmasının sebebi de budur (modüler matematik, çarpımların ayrımı, iki asal sayının çarpımı).

      İki farklı kullanımı mevcut. İlki, XML çıktı alabileceğiniz (ToXmlString()) veya in-memory saklayabileceğiniz provider kullanmak diğeri ise Microsoft'un kendi konteyner (container) yapısını kullanmak. Böylece yaratılan key kullanıcıya bağlanabilir, kullanıcı silindiği zaman bu bilgiler de silinir. Diğer bir avantajı ise korumak istediğiniz bir uygulamayı, sistemi veya birden fazla uygulama grubunu korumak için bir kullanıcıya (örnek : admin) bunu bağlamak. NOT : Yaratılan keyler açık şekilde bilgisayarda tutulmamalı.
private RSAParameters _publicKey;
private RSAParameters _privateKey;

private void AssignKey()
{
	using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
	{
		// Konteyner kullanımı
		rsa.PersistKeyInCsp = false;
		// Public için parametre false
		_publicKey = rsa.ExportParameters(false);
		// Private için parametre true
		_privateKey = rsa.ExportParameters(true);
	}
}

private byte[] EncryptData(byte[] dataToEncrypt)
{
	byte[] cipherBytes;

	using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
	{
		rsa.PersistKeyInCsp = false;
		// Encrypt için public
		rsa.ImportParameters(_publicKey);

		cipherBytes = rsa.Encrypt(dataToEncrypt, false);
	}

	return cipherBytes;
}

private byte[] DecryptData(byte[] dataToDecrypt)
{
	byte[] plain;

	using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
	{
		rsa.PersistKeyInCsp = false;

		rsa.ImportParameters(_privateKey);
		// Decrypt için private
		plain = rsa.Decrypt(dataToDecrypt, true);
	}

	return plain;
}

               Konteyner kod örneği =>

const string ContainerName = "Konteyner";

private void AssignKey()
{
	CspParameters cspParams = new CspParameters(1);
	cspParams.KeyContainerName = ContainerName;
	cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
	cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";

	var rsa = new RSACryptoServiceProvider(cspParams) { PersistKeyInCsp = true };
}

private byte[] EncryptData(byte[] dataToEncrypt)
{
	byte[] cipherBytes;

	var cspParams = new CspParameters { KeyContainerName = ContainerName };

	using (var rsa = new RSACryptoServiceProvider(2048, cspParams))
		cipherBytes = rsa.Encrypt(dataToEncrypt, false);

	return cipherBytes;
}

private byte[] DecryptData(byte[] dataToDecrypt)
{
	byte[] plain;

	var cspParams = new CspParameters { KeyContainerName = ContainerName };

	using (var rsa = new RSACryptoServiceProvider(2048, cspParams))
		plain = rsa.Decrypt(dataToDecrypt, false);

	return plain;
}

// Konteynerdaki anahtarları silme işlemi
//private void DeleteKeyInCsp()
//{
//    var cspParams = new CspParameters { KeyContainerName = ContainerName };
//    var rsa = new RSACryptoServiceProvider(cspParams) { PersistKeyInCsp = true };

//    rsa.Clear();
//}

> Hibrid Şifreleme (Hybrid Encryption)

  • Simetrik şifrelemede anahtar paylaşımı riskli,
  • Asimetrik şifrelemede ise simetrik şifrelemeye göre anahtar paylaşımı daha güvenilir fakat işlem yavaş.

İki şifreleme yönteminin de dahil edildiği, daha güvenilir ve iyi bir çözüm sunmak adına hibrid şifreleme yapmak mümkün. Simetrik şifreleme anahtarının asimetrik şifreleme (RSA gibi) ile şifrelenmesi. Ortaya çıkan bu unique anahtara Session Key denir. Örnek için AES + RSA kodu yazılabilir, tekrar tekrar yazmamak adına pas geçiyorum.

> Dijital İmza (Digital Signature)

Kriptografinin ilkeleri konusunda bahsedilen reddedilmeme ilkesi dijital imza ile alakalıdır. Dijital imza, size, yaratılan mesajın bir sahibi olduğunu ve buna güvenmeniz için gerekli sebepleri barındırdığını belirten ibaredir. Kısacası dijital imza, uygun bir private key ile bir kullanıcı tarafından yaratıldığının en belirgin ve güvenilir ifadesidir. Asimetrik şifreleme tabanlıdır.

  • Public ve private key'lerden oluşur,
  • İmzalama işlemi private key ile gerçekleşir,
  • Doğrulama işlemi public key ile gerçekleşir.

.NET Framework'te dijital imza 3 sınıf kullanır:

  1. RSACryptoServiceProvider,
  2. RSAPKCS1SignatureFormatter,
  3. RSAPKCS1SignatureDeformatter.

Bu sınıflar verimizin doğruluğunu ve güvenilirliğini sağlar.

static void Main(string[] args)
{
	var document = Encoding.UTF8.GetBytes("Top Secret Document");
	byte[] hashedDocument;

	using (var sha256 = SHA256.Create())
		hashedDocument = sha256.ComputeHash(document);

	AssignKey();

	var signature = SignData(hashedDocument);

	// True olursa kodumuz sorunsuz çalışmış demektir
	// Verify oldu = true
	var isVerified = VerifySignature(hashedDocument, signature);

	Console.Read();
}

private static RSAParameters _publicKey;
private static RSAParameters _privateKey;

private static void AssignKey()
{
	using (var rsa = new RSACryptoServiceProvider(2048))
	{
		rsa.PersistKeyInCsp = false;
		_publicKey = rsa.ExportParameters(false);
		_privateKey = rsa.ExportParameters(true);
	}
}

private static byte[] SignData(byte[] hash)
{
	using (var rsa = new RSACryptoServiceProvider(2048))
	{
		rsa.PersistKeyInCsp = false;
		rsa.ImportParameters(_privateKey);

		var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
		rsaFormatter.SetHashAlgorithm("SHA256");

		return rsaFormatter.CreateSignature(hash);
	}
}

private static bool VerifySignature(byte[] hash, byte[] signature)
{
	using (var rsa = new RSACryptoServiceProvider(2048))
	{
		rsa.ImportParameters(_publicKey);

		var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
		rsaDeformatter.SetHashAlgorithm("SHA256");

		return rsaDeformatter.VerifySignature(hash, signature);
	}
}

Yukarıdaki örnekte verify işlemi sırasında hashedDocument değişkenindeki byte dizisi değerinden herhangi birisini değiştirmeniz sonucun false olmasına sebep olacaktır çünkü orijinal değerden farklı olacaktır.

NOT : Hibrid yöntemle kodunuzu genişletmeniz mümkün.

> SecureString

  • System.String kütüphanesi güvenli bir çözüm değil,
  • System.String kütüphanesi bazı sorunlar barındırmaktadır
    • Bellekte birden fazla kopya,
    • Şifreli değil,
    • Değiştirilebilir

Yukarıda belirtilen sorunlar bildiğimiz string veri tipinde tutulan hassas veriler için geçerli. System.String kullanımı yerine SecureString kullanımı tavsiye edilir.

  • SecureString bellekte şifreli tutulur (erişildiğinde şifresiz hale gelir),
  • GarbaceCollector bellekte gezinirken müdahale etmez, tek kopası bulunur,
  • IDisposable interface eklentisi var,
  • Pointer kullanımı mümkün (char array).

SecureString'in varlığı hassas bilgiyi string üzerinde tutmamanız için vardır. Hassas bilgi dışında kullanmamanız tavsiye edilir. Arka yapıda DPAPI kullanır.

Data Protection API (DPAPI)

  • DPAPI, şifreleme ile veri güvenliği sunar (şifre ve private key),
  • İşletim sistemi seviyesinde güvenlik sağlar yani başka kütüphanelere gereksinim duymaz,
  • Parola bazlı veri güvenliği sunan bir servistir. Güvenliğin sağlanması için parola gereklidir (giriş yapan kullanıcının parolası),
  • Crypt32.dll'in bir parçasıdır, tüm Windows işletim sistemlerinde bulunur,
  • DPAPI şifrelenmiş veriyi sizin için saklamaz, saklama işlemi için kendi depolama kodunuz olmalı,
  • DPAPI kullanıcının giriş bilgilerini kullanır,
  • Master Key adında güçlü bir anahtar (TripleDES ile) üretir. Bu anahtarı da üretirken kullanıcının parolasını kullanır. Bu anahtar da depolanmaz ve bir süre sonra kullanım ömrü dolar.
static void Main(string[] args)
{
	var str = ToSecureString(new[] { '1', '3', '5' });

	char[] charArray = CharacterData(str);

	// Baştaki orijinal verilere ulaşıyoruz
	string unsecureString = ConvertToString(str);

	Console.Read();
}

private static SecureString ToSecureString(char[] str)
{
	var secureString = new SecureString();

	Array.ForEach(str, secureString.AppendChar);

	return secureString;
}

private static char[] CharacterData(SecureString secureString)
{
	char[] bytes;
	var ptr = IntPtr.Zero;

	try
	{
		ptr = Marshal.SecureStringToBSTR(secureString);
		bytes = new char[secureString.Length];

		// Unmanaged bellekten char dizisine
		Marshal.Copy(ptr, bytes, 0, secureString.Length);
	}

	finally
	{
		if (ptr != IntPtr.Zero)
			// Unmanaged bellek temizleniyor
			Marshal.ZeroFreeBSTR(ptr);
	}

	return bytes;
}

// Hassas verinin tekrar string'e dönüştürülmesi önerilmez
// Bellekte birden fazla kopyası olması mümkün hale gelir
private static string ConvertToString(SecureString securePassowrd)
{
	var unmanagedString = IntPtr.Zero;

	try
	{
		// Unmanaged belleğe kopyalanıyor
		unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassowrd);

		return Marshal.PtrToStringUni(unmanagedString);
	}

	finally
	{
		Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
	}
}

GÜNCELLEME
.NET Framework 4.7 ile gelen ve bu konuyu ilgilendiren bazı değişiklikler var

  • Improved support of RSA decryption with hardware keys,
  • Opening a cryptographic key with CspParameters.ParentWindowHandle set to this.Handle will now correctly make any PIN or password prompt be modal to the current window,
  • Enabled ClickOnce signing scenarios where certificate is identified by a cryptographic provider and private key container names.

C# 7 - İlk Bakış

$
0
0

C# History

Visual Studio 2017'nin yayınlanması ile birlikte C# 7.0 da aramıza katılmış oldu. VS2017 RTM'e (son/kararlı hal) geçmeden önce dil hakkında bilgileri zaten ediniyor hatta kullanıyoruz. C# 7 ile gelen yeniliklerin yaşantımızda kullanacak kıvama gelmeden hemen önceki turumuza başlayalım.

Bahsedeceğim konular

  • Out Variables
  • Pattern Matching,
  • Tuples,
  • Local Functions,
  • Literals, Ref. Returns, Exceptions

Out Variables

  • Önceden tanımlamada var kullanılamıyor (int.TryParse(input, out var answer)),
  • Kullanmadan önce tanımlanması gerekiyor (demo),

Yukarıdaki sorunlara çözüm olarak Out Variables sunuldu.

// Eski yöntem
private static void Run()
{
	string name;
	string lastName;

	GetName(out name, out lastName);
	Console.WriteLine($"{name} {lastName}");
}

// C# 7.0 ile gelen yeni yöntem
private static void Run2()
{
	GetName(out string name, out string lastName);
	Console.WriteLine($"{name} {lastName}");
}

private static void GetName(out string name, out string lastName)
{
	name = "Fırat";
	lastName = "Esmer";
}

Pattern Matching

Pattern'in tanımı için şöyle güzel bir yorum var:

Syntactic elements that can test that a value has a certain "shape".

Bir değerin belirli bir şekle sahip olduğunu test edebilen sözdizimsel öğeler.

static void Main(string[] args)
{
	PrintSum(10);
	PrintSum2("10");
}

public static void PrintSum(object o)
{
	if (o is null) return; //Constant Pattern
	if (!(o is int i)) return; // Type Pattern (Int32)

	int sum = 0;

	for (int j = 0; j <= i; j++)
		sum += j;
}

public static void PrintSum2(object o)
{
	if (o is int i || o is string s && int.TryParse(s, out i))
	{
		int sum = 0;

		for (int j = 0; j <= i; j++)
			sum += j;
	}
}

Koşullu switch'e de bir göz atalım, burada gelen yenilik case durumunda koşul girebiliyor olmamız. Yani test edebiliyor olmamız.

class Program
{
	static void Main(string[] args)
	{
		Employee employee = new President();
		employee.Salary = 200000;
		employee.Years = 10;
		(employee as President).ManagedEmployeeNumber = 500;
		(employee as President).StockShares = 12000;

		// Switch içerisindeki sıralama önemli
		// Manager Employee'nin altında olsaydı hata alırdık
		// Kalıtım alan sınıf alınan sınıftan üstte olmalı
		switch (employee)
		{
			case President p when (p.StockShares < 10000):
				Console.WriteLine($"Düşük profilli yönetici hisse senedi payı : {p.StockShares}");
				break;

			case President p when (p.StockShares >= 10000):
				Console.WriteLine($"Yüksek profilli yönetici hisse senedi payı : {p.StockShares}");
				break;

			case Manager m:
				Console.WriteLine($"Yönetiye bağlı kişi : {m.ManagedEmployeeNumber}");
				break;

			case Employee e:
				Console.WriteLine($"Çalışan maaşı : {e.Salary}");
				break;
		}
	}
}

public class Employee
{
	public int Salary { get; set; }
	public int Years { get; set; }
}

public class Manager : Employee
{
	public int ManagedEmployeeNumber { get; set; }
}

public class President : Manager
{
	public int StockShares { get; set; }
}

Tuples

Metotlardan birden fazla değeri geri döndürmek istediğimizde aklımıza gelen en uygun yöntem out parametresi. Fakat out parametresinin de elimizi kolumuzu bağladığı bazı noktalar var. Mesela okunabilirliği zayıf, async metotlarla kullanılamıyor. Burada yardımımıza Tuple (System.Tuple<T>) yetişiyor. Tuple'ı başka bir Tuple'a convert edebilirsiniz. Tuple value type'dır (referans değil).

Öncelikle Tuples'ı kullanmak için NuGet Package kullanmamız gerektiğini belirteyim. Aşağıdaki resimde gördüğünüz gibi yüklemeyi gerçekleştirin.

System.Tuples Nuget Package

static void Main(string[] args)
{
	var numbers = GetThreeNumbers();
	// İsimlendirme işlemini biz yapmadığımız için
	// kendisi otomatik olarak yapıyor
	Console.WriteLine($"{numbers.Item1},{numbers.Item2},{numbers.Item3}");

	var numbersWithNames = GetThreeNumbersWithNames();
	Console.WriteLine($"{numbersWithNames.number1},{numbersWithNames.number2},{numbersWithNames.number3}");
}

public static (int, int, int) GetThreeNumbers()
{
	return (1, 56, 187);
}

public static (int number1, int number2, int number3) GetThreeNumbersWithNames()
{
	return (1, 56, 187);
}

Tuple ile Dictionary kullanımı

var tupleDictionary = new Dictionary<(int, int), string>();
tupleDictionary.Add((16, 21), "İki kardeşin yaşları");

// Sonuç = İki kardeşin yaşları
var result = tupleDictionary[(16, 21)];

Tuple Deconstruction örneği

static void Main(string[] args)
{
	(int number1, int number2, int number3) = GetThreeNumbers();
	Console.WriteLine($"{number1},{number2},{number3}");

	// Diğer kullanım şekli
	int _number1;
	int _number2;
	int _number3;
	(_number1, _number2, _number3) = GetThreeNumbers();
	Console.WriteLine($"{_number1},{_number2},{_number3}");
}

public static (int, int, int) GetThreeNumbers()
{
	return (1, 56, 187);
}

Local Functions

Local function, metot içerisinde metot kullanımıdır. Direkt örnekle açıklayayım, daha kolay olacaktır.

NOT : Örnekte Tuples kullanıldığı için Tuples başlığındaki gibi yükleme işlemini yapmanız gerekiyor.

static void Main(string[] args)
{
	// Fibonacci => 1, 1, 2, 3, 5, 8
	// Mevcut değerin bir önceki değer ile toplamı bir sonraki
	// değeri vermekte
	Console.WriteLine(Fibonacci(6));
	Console.Read();
	// Sonuç (6-1) + 8 = 13
}

public static int Fibonacci(int x)
{
	if (x < 0)
		throw new ArgumentException("Değer en az sıfır olmalı",
									nameof(x));

	return Fib(x).current;

	(int current, int previous) Fib(int i)
	{
		if (i == 0) return (1, 0);
		var (current, previous) = Fib(i - 1);
		return (current + previous, current);
	}
}

Literals, Ref. Returns, Exceptions

static void Main(string[] args)
{
	// Sonuç => 5781231
	Console.WriteLine(GetNumber());

	// Referans Return
	int[] numbers = { 1, 3, 5, 7, 9, 11 };
	ref int position = ref Substitute(5, numbers);
	position = -30;
	Console.WriteLine(numbers[2]);

	// Sonuç => Fırat
	Employee employee = new Employee("Fırat");
	Console.WriteLine(employee.Name);
	// Sonuç => Hata / Exception
	Employee employee2 = new Employee(null);
	Console.WriteLine(employee.Name);

	Console.Read();
}

// Literal: Altçizgi (underscore) seperator (ayırıcı)
// olarak değil dönüş tipi olarak dönüyor
private static int GetNumber()
{
	return 5_7_8_123_1;
}

// Reference Return örneği
private static ref int Substitute(int value, int[] numbers)
{
	for (int i = 0; i < numbers.Length; i++)
		if (numbers[i] == value)
			return ref numbers[i];

	throw new IndexOutOfRangeException("Bulunamadı!");
}

// Exception as expression örneği
public class Employee
{
	public string Name { get; }
	public Employee(string name) => Name = name ?? throw new ArgumentNullException();
}

Son olarak

C# 7 yenilikler listesini Microsoft Documents üzerinden incelemek için => https://docs.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7

Razer - Şikayet

$
0
0

Razer Logo

Şikayet temalı yazılarım, içerisinde yaşadığımız kapitalist sistem sürdükçe var olacak. Bu günkü yazımın kahramanı Razer. Umarım yazdıklarım ürünü/hizmeti satın alma noktasında olanlara yardımcı oluyordur da ben de burada kendi kendime şikayet edip deşarj olmuyorumdur.

Hikayeme direkt başlıyorum. Çocukluğumdan beri oyunlarla aram iyidir. Gerek SNES (Super Nintendo) gerekse bilgisayar hep yakın olmuştur. Oyun kategorileri arasında FPS'ye ayrı bir ilgim var. Dolayısıyla bilgisayar ürünlerinde belli parçaları FPS'ye özel almaya çalışıyorum. Başta mouse geliyor. Mouse'u da Razer DeathAdder 2013 (Model : RZ01-0084) aldım. 2014 yılının Nisan-Mayıs ayı gibi 100-130 TL fiyat aralığında aldım. Şu an ürün daha pahalı çünkü kur farkı Büyük Türkiye'de daha fazla.

Nasıl ki bir insanın en temel ihtiyaçlarının başında konut, gıda ve güvenlik geliyorsa mouse'dan da yapmasını beklediğimiz ilk şey "tıklaması"dır öyle değil mi? Mouse'tan sonuçta bu beklenir. Bu mouse bunu bir süre sonra sağlayamıyor ya da şöyle diyeyim, fazlasıyla sağlıyor. Çift tıklama sorunu. Araştırdım, baktım ki abov. İnternet dünyası kaynıyor. Kronik sorun. Herkes şikayetçi. Güncelleme öneren, temizlik yap diyen, çöpe at diyeniyle yüzlerce yorum var internette/forumlarda. Size mouse'un da fotoğrafını atacağım ki hor kullanmadığımı ve içi boş yorumlarla eleştirmediğimi görün.

Öncelikle mouse'un kullanımı için Razer'ın yazmış olduğu Synapse uygulamasından bahsedeyim. Hiçbir işe yaramıyor. Hatta çift tıklama sorununu çözmek için programı silin diyenler var. Bana bunu Razer Support'tan birisi bile söylemişti. E sileceksek ne anlamı kaldı? Sonuçta ayarlarımız, profillerimiz o uygulamada. Neyse, sildim. Olmadı. Sıkıştırılmış dosyalarla güncellemeler yolladılar, bir süre olur gibi oldu sonra yine olmadı. Sonra bir şekilde "füüüüyt" kendiliğinden düzeldi. Bir süre daha kullandım. Bu sefer sorun scroll. Scroll yaptığımda bir yukarı bir aşağı kayıyor. Aslında 2 ileri 1 geri diyelim. Aşağı scroll yapıyorsanız sonunda bir miktar yukarı, tam tersinde ise aşağı kayıyor. "Sonuçta kaç yıllık mouse, bunun da bir temizlikten geçmesi lazım" diyerek mouse'un nasıl parçalarına ayrıldığına dair video izlemeye başladım. İlk adım, mouse'un altındaki 3 vidayı sökün. O 3 vidadan hiçbirisini sökemedim. Başkalarına verdim onlar da sökemedi. Mouse'un altındaki, köşelerde bulunan ve sürtünmeyi azaltan yapışkanlı parçaları da bir daha yapıştıramadım ve hikayem burada son buldu. Sorunlar kronik olmasa onarıma göndereceğim ama... Sorunlar bitmiyor.

Aşağıdaki fotoğraflar da mouse'un son hali, az önce çektim.

Razer

Razer 2

Not

  • Razer DeathAdder 2013 kullanmadan önce başka bir Razer mouse kullanmışlığım var: Razer Diamondback. Birisi tarafından hediye edildi, bir süre sonra onun da scroll'u bozuldu ama ürün sıfır değildi. O yüzden pek de ciddiye almamıştım o sorunu,
  • Mouse belki de klavyeden sonra bilgisayarın en çok kullanılan parçası olabilir, o yüzden kolayca kirlenip bozuluyor da olabilir fakat yıllarca sorunsuzca kullandığım mouselar da oldu o yüzden...

BİR DAHA RAZER BEL-Kİ. BİR İHTİMAL. SANMIYORUM.

Bitcoin ve Decentralized Yapıya Giriş (Biraz da Blockchain)

$
0
0

Bu makalede adından sürekli söz ettiren Bitcoin ve Bitcoin'in kullandığı merkezi olmayan (dağıtık) teknolojik altyapıyı inceleyeceğiz. Borsa ve politik konularda yorum yapmayacağım, işin teknik kısmı ile ilgileneceğiz.

Bitcoin (BTC)

Bitcoin Nedir?

Kendi tabirleriyle : Bitcoin açık kaynaklıdır; tasarımı halka açıktır, kimse Bitcoin'e sahip değildir ve onu kontrol edemez, herkes katılabilir.

Bitcoin, merkezi olmayan, insanların dünyanın herhangi bir noktasından diğer bir noktasına anonim bilgilerle transfer veya alışveriş yapabildiği dijital para birimidir. Ulusal para birimlerinin aksine Bitcoin'in merkezi yoktur. Yani, paranın basıldığı bir darphane veya yetkili bir merci (ne devlet ne banka ne de şirket) yok. Bunun yerine dağıtık bir sisteme sahiptir. Bu sistemde Bitcoin yazılımı (node) kullanılır. Bu yazılım, diğer yazılımlarda yapılan işlemleri (para transferi) ve blokları (sonra değineceğim) onaylar. Kısacası herkesin çalıştığı bir komün düşünün. Sisteme dahil olanlara bookkeeper (finans işlemlerini kayıt eden / muhasebeci) denir. Daha sonra miner / madenci diyeceğiz.

Muhasebeciler (bookkeepers) en temel seviyede defter (defter-i kebir, büyük defter) tutarlar. Bu defter yapılan işlemlerin kayıtlarını tutar. Bitcoin'in hangi hesaptan hangi hesaba ne kadar yollandığının kaydı tutulur. Yapılan her işlemin kaydı herkese açıktır. Az önce saydığım 3 kriteri (kimden, kime, ne kadar) herkes görebilir, bunun için sisteme dahil olmanıza bile gerek yok.

Bitcoin'in değerini belirleyen şey arz-talep dengesidir ve diğer adından bahsetmeyeceğim parametrelerdir. Üretilecek Bitcoin sayısı bellidir 21 milyon BTC. Dolayısıyla bir dönem kıtlık yaşanacak. Çünkü kıtlığı aşmak için Bitcoin üretecek bir merkez bulunmayacak. Bunun yanı sıra kullanımı kolay, hızlı, ucuz ve güvenlidir. Güvenliğin aşılabilmesi için ya sizin hesabınıza (cüzdan) girmeleri gerekir ya da muhasebeciler defterde kayıtları manipüle etmeli. Manipüle etmek de kolay değil çünkü dağıtık bir ağ olduğu ve yapılan işlemlerin tümü şeffaftır ve herkesin onayına açıktır. Böylece işlemin validasyonu (oy verme) da yine diğer katılımcılar tarafından sağlanacaktır (Muhasebecinin defterini tüm geçmişiyle birlikte indirmek mümkün).

Bitcoin Güvenliği

Bitcoin'in bize kazandırdığı kavramların başında cryptocurrency (dijital para birimi) gelmekte. Aslında bu ismi güvenliği sağlamak adına arka planda gerçekleştirdiği algoritmalardan alır.

Bir hesaptan diğer hesaba para aktarma işlemi esnasında bu transfer işlemi kriptografik dijital imza ile imzalanır. Böylece muhasebeciler bu transfer işlemini onaylamak için ellerinde kanıt bulundurmuş olurlar. Kriptografik dijital imzayı bir kağıda atılan ıslak imza gibi düşünebilirsiniz. Her işlem için farklı imzalar yaratılacağı için kullanılmış bir imzayı tekrar kullanamazlar veya imzanın herhangi bir noktasında değişiklik yapamazlar. Sebebi ise kullanılan anahtarlar ve bu anahtarların validasyonu gerçekleştirecek diğer kullanıcılarda bulunması.

NOT : Kriptografi ile ilgili bilginiz yok ve merak ediyorsanız daha önce yazdığım yazıya göz atabilirsiniz. Bitcoin SHA256 algoritmasını kullanıyor.

Her bir Bitcoin hesabı veya adresi aslında public key tabanlıdır. Transfer işleminde kullanılan dijital imzalama işlemi ise private key tabanlıdır. Geri kalan işlem ise muhasebecilerin validasyon işlemini gerçekleştirmesidir.

Neden Merkeziyetçi Değil?

Merkeziyetçilik örneği -konu bağımsız- tepeden aşağı inmeciliktir. Bu da sorunları beraberinde getirir. Gücün tek bir elde toplanması, sizin elinizde tuttuğunuz paranın (ne olursa olsun) değerinin bu güç tarafından istenilen zamanda değiştirilebilir olduğu anlamına gelir. Örneğin; ABD'nin merkez bankası FED'in alacağı kararlar doğrultusunda cebinizdeki doların değeri değişmektedir. İnternet, özünde özgürlüğü barındırır. Merkeziyetçi olmayan sisteme bir örnek daha vermek gerekirse Torrent. Torrent dünyası P2P (peer-to-peer) kişiden-kişiye dediğimiz sistemle çalışır. Dosyalar, o dosyayı download/upload eden kişilerden sağlanır. Dolayısıyla bir kişinin dudaklarından çıkacak lafın gücü, bu dünyada yer edinemez. Bitcoin de P2P sistemle çalışır. Bitcoin'in de gücü aslında buradan gelmektedir. Asıl inovasyon burada yatmakta.

Merkeziyetçiliğin Dezavantajları

  • Kötüye kullanım,
  • Saldırılara açık,
  • Sansür uygulanabilir.

Merkezi Olmayan Sistemin Avantajları

  • Şeffaf ve kayıt tutulabilir,
  • Hızlı ve kolay (e-posta atmak kadar),
  • Daha az maliyetli,
  • Sınır tanımaz.

Muhasebeciler

Bookkeepers dediğimiz kişilerin bu ağda edindikleri bir görev var. Bu kişiler belli ücretler veya ödüller karşılığında yapılan finansal işlemlerin doğruluğunu onaylar. Peki, muhasebecileri hile yapmasına engel olan (mesela kendi hesabına para ekleme) şey nedir? Bunun için önce Bitcoin'in piyasaya sürülmesi ile ilgili bir kaç bilgi vereyim. Tüm para; 21 milyon BTC üretilecek demiştik. Üretilene kadar her geçen sürede yeni paranın üretilmesi süreci git gide yavaşlamakta. Bunun sebebi ise BTC üretmek için gerekli algoritmaların her üretim sonrasında git gide zorlaşması. Daha fazla zaman ve makine gücü gerekiyor. Son para 2140 yılında kadar üretilecek. Şimdi gelelim asıl soruya, muhasebecinin buna engel olmasına sebep olan şey nedir veya iki farklı muhasebeciden iki farklı sonuç (defter) gelirse ne olacak?

Merkeziyetçi sistemde -örnek olarak PayPal'i ele alalım- yapılan finansal işlemler belli bir sıraya göre işleme konur fakat dağıtık sistemde farklı zamanlarda farklı muhasebecilerin önüne düşer.

Hesabımda 5 BTC olduğunu düşünün. Bunu önce Eren'e, onaylanmadan da Sevda'ya gönderdiğimi düşünün (bkz. double spend). Farklı muhasebecilerin önüne farklı sıra ile düşeceği için parayı aslında kimin tutması gerektiğini bilemeyecekler ve burada bir sorun oluşacak.

Bitcoin dünyasının bu soruna yaklaşımı için fikir birliğine varması gerekiyor. Çözüm; finans işleminin doğru olup olmadığının oylanması yani validasyon. Fakat kimliksiz bir dünyada bir muhasebecinin birden fazla oy vermesi nasıl engellenecek? Bunun çözümü, muhasebecilerin çok özel bir matematik problemini (algoritma) çözmesinde yatıyor. Bu yönteme proof-of-work denir. Bunun tabi bir bedeli var. Güç ve zaman.

"...bir işlemci bir oy (...one cpu one vote)" - Orjinal Bitcoin whitepaper (sayfa 3)

Her yeni oylama için geçen süre 10 dakikadır. Böylece tüm muhasebeciler senkron kalırlar. İşlem gruplarına block (blok) ve birbirine bağlı olan bu blokların oluşturduğu zincire de blockchain (blok zinciri) / Distributed Ledger Technology (DLT) denir. Blockchain teknolojisi ise başlı başına bir devrim. Şimdiden bir çok üniversite, startup, firma bu teknoloji üzerinde çalışmalara başladı. Şimdi blockchain içerisindeki her bloğun nasıl onaylandığına bakalım.

Blockchain içerisinde bulunan her bir block, bir önceki block'un cevabını probleme girdi olarak alır. Böylece bloklar güvenli hale gelmeden önce oy ve işlem sürecinden geçerler. Problem dediğimiz şey kriptografi dünyasından, diğer bir tabirle kırılması gereken bir problem, algoritma. Algoritma üzerinde harcanan/harcanacak olan iş yükü bellidir ve kanıtlanabilir. Sonuç olarak bir merkeze bağlı olmadan, kimliğinizi gizli tutarak oylama işlemi yapabilirsiniz. Bu da Bitcoin dünyasının sunduğu (güven ihtiyacının azaltılması) güzelliklerden sadece bir tanesi.

Güven ihtiyacının azaltılması sözünü biraz açmak istiyorum. Bir hesaptan başka bir hesaba transfer yapılırken işlemi yapacak olan kişi sadece hesap sahibi olabilir. Arada banka veya başka bir şahıs yok (borsa üzerinden yapmıyorsanız). Bir diğer konu da yüksek tutarlı işlemlerin gerçekleşmesi için gereken süre uzayabiliyor. Son olarak, sistemde yapılmak istenen değişikliğin çoğunluk tarafından kabul edilmesi de diğer bir dezavantaj. Çünkü bunu zorla kabul ettirebilecek herhangi bir merci yok. Örnek vermek gerekirse Bitcoin'in 1 Ağustos tarihinde ikiye bölünme ihtimali var(dı). Bunun için oylama katılımı yapılmakta.

NOT : Zero Confirmation Transactions kavramı onay süreci olmadan hızlıca transfer yapılmasıdır. Alışveriş yaptığınız yerde bekleme lüksünüz yoksa (market gibi) bunu kullanabilirsiniz fakat dolandırıcılığa açık bir yöntem. Bunun da önüne geçmek için bazı ödeme biçimleri mevcut fakat konuya girmeyeceğim.

Cüzdan

Cüzdan, sahip olduğunuz parayı tutan, para transfer işlemlerinizi yaparken kullanılan ve önceki işlemlerinizi listeleyen bir uygulamadan fazlası değil. Herhangi bir firmanın cüzdanını kullanabilirsiniz, yeter ki uyumlu olsun. Ethereum (başka bir coin) cüzdanı üzerinde Bitcoin tutamazsınız. Ayrıca cüzdanınızda yaşayacağınız sorunların coin ile alakası olmadığını da belirtmek isterim.Örnek transfer işlemleri veya cüzdan örnekleri için buraya tıklayabilirsiniz. Cüzdanınız web, mobil veya masaüstü tabanlı uygulamalar olabilir. Uygulamanızda QR kod okuyucu var ise ödemelerinizi daha kolay yapabilirsiniz hatta yeni yeni yerleştirilmeye başlanan Bitcoin ATM'lerini kullanabilirsiniz. Eğer cüzdanınızın şifresini unutursanız (private key'e ulaşamadığınız durum) asla tekrar paranıza kavuşamazsınız, bunu unutmayın.

Örnek bir cüzdan adresi => 1CatFTRHtMNngkdLEeobF76b57LETtpyVx

Cold Storage Cüzdan

Yüksek miktarda para barındıran hesapların cold storage denen yani internete hiç çıkmamış hesaplarda tutulması öneriliyor. Bu adreste üretilen Bitcoin cüzdanı client-side yani internete hiç dokunmamış oluyor. Böylece private-key çalınma korkunuzu da aşmış oluyorsunuz. Hatta site size sayfayı HTML olarak indirip bilgisayarınızda çalıştırmanızı öneriyor.

Donanım Tabanlı Cüzdan

Private-key'inizi internetten korumak adına başka bir yöntem ise donanım tabanlı cüzdanlar. USB ile bilgisayarınıza bağladıktan sonra uyumlu cüzdanlarla çalışan, transfer işlemleri sırasında her türlü hırsızlığı koruyan bu yöntem daha da güvenlik korkusu olanların ilacı. Hatta virüslü bir bilgisayarda bile güvenle kullanabilirsiniz. Bkz. Trezor

Yedekleme

Kısa ve öz; private-key'e erişimi olmayan (cüzdanı yaratan kişi/şirket) cüzdan tiplerinde sakın ama sakın yedeklemeyi unutmayın.

Mining (Madencilik)

İşte geldik en can alıcı noktaya. Çoğu kişinin Bitcoin'in nasıl çalıştığı, neler yaptığıyla ilgilenmeyip bir an önce madencilikten para kırmayı umduğu kısım. Öncelikle şunu söyleyeyim, diğer coin'ler için değil ama Bitcoin için çok geç. 2013 yılında olsaydık bir şeyler yapabilirdiniz ama şu an çok geç. Mining hiç efektif değil çünkü üretilecek Bitcoin'lerin çoğu üretildi ve çözülmesi gereken algoritma şu an o kadar zor noktadaki tüketilen elektrik ve makine gücü karşılığında üretilen Bitcoin'in miktarı zarar etmenize sebep oluyor (tabi Bitcoin'in değeri uçuk noktalara gelmezse, fakat gelecek gibi görünüyor). Bitcoin Mining Calculator tarzı sitelerde harcanan elektrik ve zamana göre üretilen coin ve kar oranlarını belirleyen siteler var. Neyse, konuya dönelim.

Bitcoin'i ATM, borsa, web veya direkt olarak diğer insanlardan almanın dışında bir yol daha var; mining, diğer adıyla madencilik.

Muhasebeci (Bookkeper) = Madenci (Miner)

Yazıda bunca zaman bookkeeper olarak bahsettiğim muhasebeciler aslında birer madenci. Peki neden böyle isimlendirdik? Tek sebebi daha anlaşılabilir olması için ve isminin hakkını vermesi. Muhasebecinin oylama sürecinde yaptıkları iş kadar ödül aldığı sistemden fazlası değil madencilik. Böylece dünyanın dört bir tarafına yeni Bitcoin dağıtılmış olur. Madenciliğin ekran kartı işlemcisi veya işlemcinin kullanılmasıyla yeni para üretimi olduğu gibi bir yanlış algı var fakat asıl işleri tuttukları defterin sürdürülebilirliğini sağlamak. Defterlerin sürdürülebilirliğini sağlamaktan kastım transfer işlemlenin doğrulanmasında harcadıkları emek. Emeğin karşıtı yeni para.

Soru : Madenciler transfer işlemlerindeki oylama süreci sonucu para ile ödüllendiriliyorsa para üretimi 2140 yılında bittiğinde nasıl para kazanılacak?
Her 4 senede bir para üretiminin (ödül) yarı yarıya azalacağına dair kural var. Son BTC üretiminin (2140) sonrasında ise madencilik olmayacak. Çünkü piyasaya yeni para çıkmayacak. Madenciler para transferlerini kontrol edip oylama işlemlerini yapmaya devam edecekler defterlerini senktron tutacaklar fakat para kazanamayacaklar (tabi madencilerin alacağı fikir birliği ile değişiklik olmazsa). İşlem ücreti hariç. Oylama (validasyon) işlemlerinin hızlı olması için küçük miktarlarda ödül koyabilirsiniz bunu da belirteyim.

Bu dönemde bilgisayarınızın CPU veya GPU'sunu kullanarak BTC madencilik yapmak gerçekten de hiç karlı bir işlem değil. Madencilik yapacaksanız diğer coin'lere (altcoin) bakmanızı öneririm. Markette bulunan coinlerin listesini buradan görebilirsiniz. (değeri, market hacmi vs.)

Bitcoin Yazılım Evreni

Bitcoin ilk çıktığı zaman tüm işlemleri yapan tek bir uygulama vardı. Sadece cüzdan istiyorsanız yine de tüm defteri indirmeniz gerekiyordu. Bu da gereksiz işlem ve hacim kaybına sebep oluyordu. Örneğin; defter kaydını tutmak istemiyorsunuz. Bunun için de mantıklı bir sebebiniz var; neden yapılan tüm işlemlerin kaydını tutasınız ki? Temmuz 2017'ye kadar yapılan işlemlerin defter boyutu 65 GB ve uygulamanızın depolama şekline göre 100 GB'a kadar çıkabiliyor (hatta geçebiliyor). Defteri diğer node'larla (noktalarla) paylaşmanın bedeli ise her ay yüzlerce GB'lık veri transferine sebep oluyor.

Bitcoin Core tüm defter kaydını tutan,resmi bir uygulama ve Bitcoin.org'dan indirilebilir.

Şimdi ise Bitcoin'in açık kaynak olması nedeniyle bir çok uygulama var ve ihtiyacınıza göre uygulamaları edinebiliyorsunuz. Örneğin; sadece cüzdana sahip olmak, madencilik yapmak istemiyorsanız bunun için tek bir uygulama var. Ayrıca Bitcoin kütüphaneleri Python, Java, Ruby, Go ve daha fazla popüler programlama dilini desteklemekte.

Bir diğer Bitcoin uygulaması ise BitPay imzalı bitcore uygulaması. Uygulama Javascript tabanlı, açık kaynak koda sahip.

Dijital İmzalar

Dijital imzalar public ve private key'lerin kullanılması ile oluşturulan bir sürecin çıktısıdır. Bir cüzdandan başka bir cüzdana para transferi yapılırken ortaya çıkan sürece bakalım.

Yukarıdaki dijital imza süreci; mesaj public key kullanılarak elde ediliyor ve orjinal mesaj ile eşleşiyorsa bu transfer işlemini yapan kişinin private key'i kullanılarak yapıldığını kanıtlar. Eşleşme doğruysa bu mesajın değiştirilmediğini de kanıtlamış olur. Sağlamasını şöyle yapabiliriz; imza mesajın bir parçası olduğu için ve biz yine aynı mesaja ulaştıysak, mesaj değiştirilmemiş demektir.

Dijital imzanın nasıl yaratıldığı konusunu da gördükten sonra şimdi bir işlem (transaction) yapıldığı zaman nasıl süreçlerden geçtiğine bakalım.

Bitcoin adresi : dijital imza algoritması kullanılarak oluşturulmuş bir public key.

Senaryo : Tayfun, Sevda'ya para yollamak istediğinde parayı yollayacağı adres Sevda'nın public key'i oluyor. Bu işlem sırasında bu public key'in Sevda'ya ait olduğu da üretilen imza ile tescilleniyor. Bitcoin adresi bir havuz gibi düşünebilirsiniz. İsteyen herkes bu adrese istediği miktarda para yollamakta serbest. Fakat sadece private key'e sahip kişi bu havuzun anahtarına sahip. Bu da parayı sadece Sevda'nın çekebileceği anlamına geliyor.

Soru : Private key random karakterlerden oluşuyorsa, aynı key'e sahip olmamız mümkün değil mi?
Cevap : Kağıt üzerinde mümkün fakat cüzdan oluşturmak için 1048 ihtimal mevcut.

Bitcoin İşlemleri (Transaction)

Adres ve işlem hakkında bilgi sahibi olduğumuza göre şimdi işlemlerin defterlerde nasıl kayıt edildiğine bakalım.

Defterde işlem esnasında gönderilen para miktarı görünür fakat bakiye (balance) gözükmez. O halde başka bir soru işareti doğuyor : Parayı gönderen kişinin hesabındaki para miktarını nasıl bilip işlemi onaylayacağız? Eren, Sevda'ya 5 BTC yollamak isterse hesabındaki BTC miktarını görmeden bu transaction'ı nasıl onaylarız? Şöyle : Eren'in hesabında 5 BTC olduğuna göre, birisi veya birileri Eren'e 5 BTC yollamış olmalı. Bu transactionlarda bulunup işleme katılıyor ve böylece işlem onaylanıyor. Çok fazla işlem olduğu zaman performansa yansıyacak fakat sorun indexlerle hallediliyor.

Unspent Output Kavramı

Harcanmamış çıktı, henüz başka bir transaction'ın girdisi olmayan çıktıdır. Unspent Transaction Outputs "utxo's" olarak adlandırılır. Farklı bir veri tabanında tutulur ve sık sık, kontrol amaçlı kullanılır.

Aşağıda bir örnekle açıklayayım, bunun işlemlerin hızlı gerçekleştiği (küçük blok zinciri) bir sistemde olduğunu varsayıyorum.

İlk blok : A adresinde mine edilmiş 10 BTC var. (A = 10)
İkinci blok : A adresinde mine edilmiş 10 BTC var, A adresinden B adresine 3 BTC gönderiliyor, para üstü adreste kalıyor (A = 10, B = 3, C = 7)
Üçüncü blok : A adresinde 10 BTC var, B adresinden D adresine 3 BTC gönderiliyor (A = 10 + 10, C = 7, D = 3)

Üç blok sonrası toplamda 4 tane harcanmamış çıktı (unspent output) bulunuyor

  1. A'da iki tane 10 BTC değerinde unspent output bulunuyor,
  2. C'de 7 BTC değerinde tek unspent output bulunuyor,
  3. D'de 3 BTC değerinde tek unspent output bulunuyor.

İki tane de harcanmış çıktı (spent output) mevcut

  1. İlk blokta 10 BTC üretildi, 2. blokta harcandı,
  2. 2. blokta 3 BTC çıktı üretildi ve 3. blokta harcandı.

Harcanmamış çıktılar birleşmez. A adresindeki iki harcanmamış çıkı birbirinden ayrıdır ve transaction'da kullanılana kadar ayrı kalacaklar.

NOT : Para üstünü almak da bir transaction oluyor. Dolayısıyla para üstü de paranın sahibinin adresine geri gönderiliyor. Bunun sebebi bir kerede tüm parayı harcama kuralı.

İşlem Zinciri Güvenliği

Her ne kadar cüzdan sahibinin kimliği bilinmese de yapılan işlemlerle cüzdana ulaşmak mümkün. Her para birimi değil fakat Bitcoin'de mümkün.
Bitcoin Transaction

Yukarı resim bir transaction'a ait. scriptSig denen kısım ise adres sahibi tarafından girdiler için oluşturduğu bir dijital imza. Bu imza izni içerisinde barındırıyor. Ayrıca gönderen kişinin cüzdan kimliğini de barındırıyor. Bu yüzden Bitcoin için anonim değil pseudonymous (takma isim) ifadesi kullanılır.

Soru : Bunun bizim için ne gibi sakıncası olabilir?
Cevap : Örneğin; Microsoft Bitcoin kabul ediyor olsun ve alışveriş yaparak kendinize bir ürün aldınız. Yaptığınız transaction'ı diğer transaction'larla bağlayabilir ve nelere para harcadığınızı görebilir. Bir nevi "shopping behavior" analizi elde edilebilir.

Fikir Birliği Hakkında

"Dijital" kelimesi sanki çok kolay bir şekilde çoğaltılabilirmiş anlamına geliyor. Aslında doğru, bir siteden .mp3 indirdiğinizi düşünün. Orjinali + (1) sizin indirdiğinizle beraber sayısı artmış olacak. Peki Bitcoin dünyasında bu işler nasıl yürüyor? Cüzdanınızda 10 BTC olduğunu düşünün, bunun tümünü harcadığınızı ve asıl defter yerine henüz güncellenmemiş defterle bir dükkana gidip alışveriş yapmaya çalıştığınızı düşünün. Bu durumda sahip olduğunuz + sahip olduğunuzu iddia ettiğiniz kadar paranız olacak. Daha da kötüsü, bir grup miner'ın düzenbazlık yaparak alışverişlerde hile yapmaya çalıştığını düşünün. Mümkün mü? Hayır. Güven sistemi çoğunluğa dayalı olduğu için transaction'ın valid olup olmaması belli olmayan sıralarla diğer miner'ların önüne sunulacak. O yüzden, para yaratma, nasıl validasyon edileceği, yazılım güncellemeleri vb. gibi sorular tüm minerlara yöneltilen, fikir birliğine varılan bir sistemi oluşturuyor.

Blockchain ile İşlemleri Kilitleme

Mining işleminin şifrelenmiş bir problemin çözümünden başka bir şey olmadığını söylemiştik. Altında yatan çözüm ise verilmiş bir çıktı için girdiyi bulmak, diğer bir şekilde söylemek gerekirse değer kısmında bulunan yere sürekli sayılar vererek deneme işlemi yapmak.

SHA256(X) < t ........... t / 256 = Başarı İhtimali ......... t ne kadar küçük ise işlem o kadar zor.

SHA256(ÖNCEKİ BLOCK HASH, TRANSACTIONS, değer)  < t ?
SHA256(ÖNCEKİ BLOCK HASH, TRANSACTIONS, 0)        < t ?
SHA256(ÖNCEKİ BLOCK HASH, TRANSACTIONS, 1)        < t ?

Açıklanan istatistiklere göre 2016 Ocak ayı itibariyle madenciler saniyede 1 kentilyon deneme yapıyormuş.

Bitcoin Network

Yapılan her transaction sonrasında bu transaction network'e dağıtılır fakat dağıtıldığı an gerçek kabul edilmez. Önce "onaylanmamış işlem havuzu" denen havuza düşer. Madenciler bu havuzdan transaction'ları alarak yeni bir blok adayı yaratırlar. Her madenci cevabı bulan ilk kişi olmak için yarışır ve çözüme ulaşan ilk kişi cevabı ağ ile paylaşır.  Bir kişinin cevabı bulması yeterlidir. Çünkü bir blockchain'de block bir önceki block'un hash değerini üzerinde tutar. Burada anlaşılması gereken bir konu var. Farklı transaction'lar farklı miner'ların önüne farklı zamanlarda düştükleri için bir block'un input'una verdikleri değer (çözülmüş bir block'un output'u) farklı block'tan gelmiş olabilir.

Bitcoin Fork

İki madencinin aynı anda block'u çözüp aynı sonuca ulaşması blockchain'de fork (çatallaşma bkz. yukarıdaki resim) meydana getirir. Bu sorun, hangi branch üzerinde işleme devam edileceği oylaması ile sonuçlanır. Genel kural, en uzun blockchain'in işleme alınmasıdır fakat daha fazla ve daha hızlı bilgisayarların ağa katılımı sonucu zorluk derecesi artar ve en uzun blockchain değil, çözümü en zorlu ve en ağır iş yükü olan blockchain seçilir (oluşturulur).

Çatallaşmaya ve kararsızlığa engel olmak adına kısa süreli kabul işlemleri yerine ortalama bir süre vardır bu süre 10 dakikadır.

Blockchain Onay Süreci

6 onay 6 blok geri demek ve yüksek tutarlı ödemeler için önerilen onay sayı budur.

Ortadan kaldırılan kısa branch'ler yok olmaz. Onaylanmamış işlem havuzuna geri dönerler.

Bitcoin Yaratma

Bitcoin yaratma sürecinin başında problemini çözdüğünüz bloktan blok ödülü almak yer alıyor. Bunun dışında blokta bulunan transaction'lara konan ödül (fee)'yi de alırlar. Transaction'a onaylanması adına ufak bir ödül koymak burada önem kazanıyor. Madenciler ödülü olmayan veya az olan transaction'ları (onaylanmamış işlem havuzu) görmezden gelebilir veya önemini azaltabilir.

Block'a çözüm bulmak ve blok ödülünü almak zor bir iş. Bitcoin dünyasında bunun karşılığı sizin ürettiğiniz hash yüzdesi ile ağdaki diğer insanların ürettiği hash yüzdesiyle orantılı. Bu sebeple insanlar "mining pools" denen madencilik havuzlarında beraber güç kullanarak çözüm bulmaya çalışırlar. Ödül az fakat istikrarlı. Dezavantaj => mining pool'lar özünde merkeziyetçidir. Çünkü havuz operatörleri bulunuyor. Şu an halihazırda çalışan poolların listesi (bazıları ağdaki tüm hash gücünün %10'una sahip) ve kullanım oranları için tıklayınız.

Merkeziyetçlik ve Baskı

Bitcoin'in merkeziyetçi yapıda olmaması sizi merkeziyetçi bir yapıdan kurtarmaya yetmiyor. Bu da ne demek?

Merkeziyetçi Madencilik

Bloktan ödül kazanmanın zor olduğunu söylemiştik. Ne kadar zor diye sorarsanız piyangoyu kazanmak kadar zor diyenler olacaktır. O yüzden insanların çoğu "madencilik havuzu" denen yönteme yöneliyorlar. Maden havuzları kendi sunucularını barındıran merkezi yapılardan fazlası değil. Blockchain'in nasıl oluşturulacağına karar veren, kesinti yapan ve operatörlere sahip bir sistem. Dolayısıyla sizi bazı dezavantajlar bekliyor. Operatörler sizin için işlem seçen, branch'e ve hangi yazılım versiyonunun kullanılacağına karar veren yetkililerdir. Yani kişilere güç tanınıyor, aracı ile çalışmış oluyorsunuz.

Merkeziyetçi Yazılım

Bitcoin'in kodu her ne kadar açık kaynak kod da olsa sonuçta belirli geliştiriciler ve bu geliştiricilerin ürettikleri yazılımlar var. Bu yazılımların dışına çıkıldığında (başka uygulamalar) sorunlar da beraberinde geliyor. Öncelikle şunu soralım. İnsanlar neden başka yazılımlara geçiş yapıyor? Bitcoin, block başına 1 MB veri tutabiliyor. Bu da işlem hacmi büyük bir kripto-para için sorun çünkü işlemler aksayabiliyor. Bazı programlar bundan fazlasını sunabiliyor fakat bu da transaction'ların ve block'ların reddedilmesine sebep olabiliyor çünkü yazılım orjinal değil, farklı versiyon. Bu sorun göz önüne alındığında herkes (sorunsuzca mine etmek istiyorlarsa) tek bir yazılım, orjinal yazılımı kullanmak zorunda kalıyor.

Hard Fork vs. Soft Fork

Fork (çatallaşma, ayrışma) işlemini github'daki fork gibi düşünebilirsiniz. Sizi, master branch'ten ayıran başka bir yol.

Mesela Bitcoin'in 1 MB'lık block size'ı ileride sorunlara sebebiyet verebilir. Bu sebeple madenciler arasında bir tartışma gerçekleşir. Kimileri bunun sabit kalması gerektiğini savunurken kimileri de kuralların değişmesi gerektiğini savunuyor. Bunun sebepleri başında fikirbirliğine varılamaması yatıyor. Peki bu ayrışmalar nasıl oluyor?

Hard Fork
Yazılım / kural değişir; eski yazılımın desteği olmaz.

Hard Fork
Senaryo : Blok boyutunun 2MB'a çıkarıldığını ve çoğunluğun yeni yazılımı kullandığını düşünün . Eski node'lar 1MB'tan fazla olan blokları onaylamayacak ve görmezden gelecektir. Madencilerin çoğu yeni yazılımı kullanıyor olsa da eski yazılımı kullanan azınlık kendi branch'inde devam edecektir. Eski yazılımı kullanan servisler veya cüzdanlar da bundan etkilenecektir.

Soft Fork
Yazılım / kural değişir; eski yazılımın, yapılan her transaction ve blockları destekleyeceği ayrışma biçimi.

Soft Fork

Senaryo : Blok boyutunun 2MB olduğunu ve çoğunluğun yeni yazılımı kullandığını düşünün. Eski yazılım, yeni bloğu tanımaz fakat geçerli sayar. Yeni bloklar yaratıldıkça eski yazılım farkında olmadan blok zincirini inşa etmeye çalışır fakat blok zincirine boyutu büyük bloklar gelir. Daha sonra blok zincirine yeni bloklar gelmez çünkü çoğunluğun hash gücü daha fazladır. Soft fork'un avantajı yeni yazılım tanınmasa da blok zincirine eklenir. Fakat şöyle bir karışıklık meydana gelir: eski yazılımı kullanmaya devam eden madencilerin oluşturdukları bloklar israf olacak çünkü kabul edilmeyecekler.

Bitcoin'den Fazlası

Altcoin

Bitcoin, cryptocurrency dünyasının ilk ürünü fakat şu an 800'den fazla dijital para var. Bu kadar dijital para türetmek yerine neden Bitcoin'e katkı sağlanmadı veya neden tek bir dijital para birimi yok diyorsanız altcoin dünyasına hoşgeldiniz.

Bitcoin, dünyanın dört bir yanında madencilere sahip, market hacmi ve işlem sayısı büyük bir ağ. Ağ ne kadar büyükse güncelleme işlemleri de bir o kadar zor oluyor. Dolayısıyla yeni fikirleri böylesine büyük bir ağda hayata geçirmek hem riskli hem de zor olduğu için katkı yerine yeni dijital para birimleri üretiliyor. Türetilen bu yeni dijital paralara altcoin deniyor. Altcoin'lerin bu kadar çok olmasının başka bir sebebi ise güzel fikirlerin, yanında kendi coin'i ile gelip geliştiricilere para kazandırması.

Soru : Yeni para nasıl dağıtılıyor?
Cevap : Bitcoin yavaşça para üretir ve rastgele katılımcılara madencilik yoluyla para dağıtır. Bazı dijital paralar ise ufak miktarda tedarik ile veya crowdsale / Initial Public Offering (İlk Halka Arz / IPO) ile dağıtıma başlıyor. IPO'nun yerini Initial Coin Offering (ICO) ifadesi almış durumda.

Proof-of-Work

Yazımda bir kere de olsa bahsettiğim proof-of-work mekanizmasını biraz açmak istiyorum. Anonim olarak dünyanın dört bir yanından transaction'ların oylanması mekanizması proof-of-work'e örnektir. Bunun yapılma sebebi ise defterin doğruluğunu sağlamak. Doğruluk, çoğulculuk ile elde ediliyor.

Bizans Generalleri Sorunu: Bir şehri 5 farklı yerden 5 generalle kuşatan Bizans ordularını hayal edin. Hep beraber hareket ederlerse -ister saldırı olsun ister geri çekilme- başarılı olma ihtimalleri yükselecek çünkü güçlerini birleştirmiş olacaklar. Fakat kimisi saldırıp kimisi geri çekilmeye çalışırsa muhtemelen yenileceklerdir. Bu generallerin birbirlerine bir ulak gönderip hangi kararı alacaklarını bildirdikleri sistem, proof-of-work sistemine güzel bir örnek. Çoğunluk ne karar alırsa o doğru kabul edilir ve işlenir.

Soru : Proof-of-work mekanizması sonucunda üretilen çözümler kullanışlı olabilir mi?
Cevap : Bir kaç altcoin var ki arkada mine etmeniz için çözdüğünüz algoritmalar, gerçek hayatta karşımıza çıkan sorunlara cevap olabiliyor. Mesela Primecoin (XPM), çözdüğünüz her algoritma ile asal sayıları bulmayı hedefliyor. FoldingCoin (FLDC) (mine medicine, not hashes) sağlık sektörüyle ilgili sorunlara çözüm bulmayı hedefliyor. Gridcoin (GRC) ise makinelerin gücünü bilimsel araştırmalarda kullanıyor.

Proof-of-Stake

Proof-of-Stake, Bitcoin'indeki transaction sırasına göre işlem gücüyle çözüm bulmak yerine, kaç adet paranız olduğuna bakan oylama sistemidir. Paranız çoksa, işlerin ters gitme ihtimaline karşı daha fazla risk altında olduğunuz için parası çok olanın ağda etkin olduğu bir oylama sistemi.

Bitcoin Proof-of-Work

HASH(önceki blok bilgisi, transactions, değer) < x

Peercoin (PPC) Proof-of-Stake

HASH(önceki blok bilgisi, simdiki_zaman, coin_id) < bakiye * x

Yukarıdaki algoritmada (Peercoin = başka bir altcoin) değişen tek şey zaman parametresi. Bu algoritmayı bir saniyede birden fazla kez çalıştırmaya gerek yok.

Avantajları

  • Daha az enerji tüketimi,
  • Maden havuzu ve özel donanıma ihtiyaç olmadığı için daha az merkeziyetçi,
  • Daha güvenli.

Proof-of-Stake tabanlı oylama sisteminde fork işlemlerinde blok üretmek için hiçbir yük olmayacağından kolayca branch'ler uzayıp gidebilir. Bu da tabi ileride sorunlara sebep olabilir fakat bu sorunlar  için de çözüm mevcut. Fork konusunu zaten anlattığım için pek fazla derine inmeden geçiyorum bu konuyu.

Zero Knowledge Proofs

Zero knowledge proof, transaction protokolünde paranın tutarını ve katılımcılarını (kimden ve kime) gizleyen, buna rağmen bir kişinin iki kişiye onaylanmadan aynı parayı yollamasına engel olan yöntemdir.

Soru : Hiçbir bilgi yoksa, bir kişinin aynı tutarı birden fazla kişiye yollaması nasıl engellenecek?
Cevap : Algoritma çözüldükten sonra çözümün sadece bir kısmı ki bu kısımdaki değerler de şifrelenip kontrol ediliyor.

Bu yöntemi kullanan halihazırda dijital paralar var. Bunlardan bir tanesi (şu an en popüleri) Zcash (ZEC).

Stabilite Sorunu

Dijital paralar henüz gerçek değerine ulaşamadığı için marketlerde veya diğer alışveriş lokasyonlarında fiyatın ürününü göstermekte sorunlar ortaya çıkıyor. Dolayısıyla dijital paraların dolar değerinden cinsinden, yani direkt olarak kağıt para cinsinden değerleri tutuluyor.

Smart Contracts denen kavram ise (bkz. Ethereum) para transferi yapan programların, önceden programlanmış belli kurallara göre işlem yapması. Durum burada daha da kötü. Örneğin evinizin kirasını BTC cinsinden ödüyor olun. Bugünün değeriyle 2 BTC ödeyecekken bu değer bir dahaki ay 1 BTC olabilir.

Bir dijital para, ne kadar çok kullanılırsa o kadar değeri gerçeğe yaklaşır. Şu an için dalgalanmalar mevcuttur ve normaldir. Bu duruma çözüm üretmeye çalışan başka dijital para birimleri mevcut.

Digix (DGD) : Direkt olarak Singapur'da bir kasada duran altınla eşleşmiş olan bu coin, token (para) başına 1 gram altın değer taşıyor. Gerçekten altına sahip olduğunuzu da size gönderdikleri fotoğraftan anlayabilirsiniz. Hatta Singapur'a gidip dijital paranız karşılığında değeri kadar altın alabilirsiniz. Şu an için tek kasanın olması risk barındırıyor olabilir ama işler ileride değişebilir. Not : Ethereum tabanlıdır.

Tether (USDT) : Digix'in aksine altın ile değil bildiğimiz Amerikan Doları ile ilişkili. Hesapların kayıtları tutuluyor ve hesap Honk Kong'da. Tether firmasına vereceğiniz dolar karşılığında token elde ediyorsunuz. Bunu da Bitcoin ağında tekrar Amerikan Doları'na çevirebiliyorsunuz.

Konu ile alakalı diğer dijital para birimlerinden bazıları : NuBits (USNBT), bitUSD (BITUSD)

Konuyu burada bitiriyorum. İnanın bu yeni teknolojinin detayları çok fazla ve teknik konular çok derin. Maksat bir ön bilginiz olması. Ethereum'dan da ayrı bir makalede bahsetmek istiyorum. O yüzden pek detaya inmedim.

Bitcoin ile ilgili temel sorulara (kim yaptı, yasal mı, nasıl satın alır veya alışveriş yaparım) cevap bulmak isterseniz bu sayfayı inceleyebilirsiniz => https://bitcoin.org/tr/sss

Dijital parayı destekleyin, ben öyle yapıyorum. Para transferlerinde aracı firmalara mesela legal mafya olan bankalara para vermemek, merkeziyetçi, sansürcü ve baskıcı ortamlardan özgürlükçü VE HAFTASONU BİLE FARKLI ADRESLERE IŞIK HIZINDA PARA TRANSFERİ YAPABİLECEĞİMİZ ortamlara evrilmenin önü açıldı, kimse engel olamaz.

Microsoft Cognitive Services - Text Analytics API

$
0
0
Microsoft'un Build 2016'da açıkladığı Microsoft Cognitive Services'ı duymamış olabilirsiniz, kısa bir özet geçeyim; Microsoft, yapay zeka (AI / Artifical Intelligence) yarışında diğer firmalarla kıyasıya mücadele ediyor ve bunu sektörde kullanıma hazır hale getirmek için geliştiricilere bir takım API'ler sunuyor. Bu API'ler Azure'da barınan, belli bir kullanıma kadar ücretsiz olup sonrasında kullanım başına hesap ödediğiniz servislerden fazlası değil.
 
Şu an için 5 kategori altında 30'a yakın servis var. Kategoriler:
  • Vision (Vizyon) : Yüz ifadelerinden duygulara, uygulamaların resim ve videolardan veri elde etmesi,
  • Speech (Konuşma) : Gürültü filtresi ile kullanıcıları tanımlama, konuşulanları analiz etme,
  • Language (Dil) : Metni işleyip, kullanıcıların neyi nasıl istediklerini öğrenmek,
  • Knowledge (Bilgi) : Web, akademik ya da kendi verilerinizden toplanan zengin bilgileri analiz edin,
  • Search (Arama) : Bing API'lerinin gücü ile milyarlarca web sayfasına, resimlere, videolara ve haberlere erişin.
Bir kaç servis örneği vereyim:
  • Face API (Yüz API'si) : Fotoğraflardaki yüzleri algılayın, tanımlayın, çözümleyin, düzenleyin ve etiketleyin,
  • Computer Vision API (Görüntü İşleme API'si) : Görüntülerden eyleme dönüştürülebilir bilgiler çıkarın,
  • Text Analytics API (Metin Analizi API'si) : Duyguları ve konuları kolayca değerlendirerek kullanıcıların ne istediğini anlayın,
  • Emotion API (Duygu Tanıma API'si) : Duygu tanıma ile kullanıcı deneyimlerini kişiselleştirin.
Soru : Neden servise ihtiyacımız var?
AI veya Machine Learning konusunda tek başımıza pek de efektif işler çıkaramamamız sebep gösterilebilir. Servisi bize sunan Microsoft'un hem AI hem de Machine Learning konusunda araştırmalar yaptığı, halihazırda bir çok müşterisi ve test etmek için de milyonlarca verisi mevcut. Dolayısıyla bize altın tepside sunulan bu fırsatın kullanılması bizim yararımıza olacaktır.
 

Soru : Neden Azure?

Çünkü, bugün (özellikle Microsoft) her şeyin buluta taşınması gibi bir çılgınlık söz konusu. Aslında bunun bize sağladığı faydalar da var. İlki, her yerden erişilebilir ve stabil olması. İkincisi ise kullandığın kadar öde söz konusu olduğu için kullanımı da epey kolay.
 
Soru : API ne işe yarayacak?
Sosyal medyada bir ürün/hesap hakkında veya mağazada bulunan uygulamanız hakkında yapılan yorumların ne duygular içerdiğini, insanların nasıl tepkiler verdiğini ölçebilirsiniz. Aslında, size herhangi bir konuda API veren her platformda bu API'yı kullanabilirsiniz. Buna GitHub'da yapılan yorumlardan, veri tabanında bulunan herhangi bir alana karşı kullanmak da mümkün.
 
Makalemizde Text Analytics / Metin Analiz API servisini kullanacağız. (Tüm servisler ve kategorileri görmek için buraya bakabilirsiniz.)

Text Analytics API / Metin Analiz API'si

Servis 3 ayrı bölümden oluşmakta. Bunlar:

  • Sentiment analysis (Duygu analizi) : API, 0 ile 1 arasında bir sayısal puan döndürür. Puanın 1’e yakın olması yaklaşımın olumlu olduğunu, 0’a yakın olması ise olumsuz olduğunu gösterir.
    Örnek : Bilmiyorum ifadesi 0.5, Seni seviyorum ifadesi ise 0.98... puan döndürüyor.

  • Key phrase extraxtion (Anahtar tümcecik ayıklama) : API, giriş metnindeki başlıca konuşma noktalarını gösteren bir dize listesi döndürür.
    Örnek : Anahtar tümcecik ayırma işlemi Türkçe dil desteği yok. ("Supplied language is not supported. Pass in one of: de,en,es,fi,fr,it,ja,pl,pt-BR,pt-PT,sv.") fakat İngilizce örnek vermek gerekirse I had a wonderful experience! The rooms were wonderful and the staff was helpful (Harika bir deneyimdi! Odalar harika ve personel yardımcıydı) ifadesinin anahtar tümceleri wonderful (harika), experience (deneyim), staff (personel), rooms (odalar).

  • Language Detection (Dil algılama) : API, algılanan dile ek olarak 0 ile 1 arasında bir sayısal puan döndürür. Puanın 1’e yakın olması, tanımlanan dilin %100 olasılıkla doğru olduğunu gösterir. 120 dil desteği mevcut.
    Örnek : Merhaba, benim adım Fırat ifadesi için Türkçe ve 1.0 puan değer dönüyor.

Metin Analiz API'sini deneyebileceğiniz bir sayfa mevcut, bakmak isterseniz buraya tıklayın.

Şimdi, servisi 3 ayrı bölümde inceleyelim. Çünkü üçünün de farklı request/response json verileri mevcut.

ÖNEMLİ NOTLAR

  • Senaryo : Basit bir console uygulaması ile belirli ifadeleri analiz edip, bilgi edinebileceğimiz bir uygulama yapacağız,
  • Visual Studio 2017 kullanacağım / .NET Framework 4.7 (uygulama indirme linkini sonda paylaşacağım),
  • Servisi kullanabilmek için (sizi şimdilik Azure Portal'e sokmayacağım) API anahtarını ve Azure sunucu bilgisini buradan alabilirsiniz,
  • Yüklemeniz gereken NuGet Package'ın adı "Microsoft.Azure.CognitiveServices.Language" (DİKKAT : Include Prelease kutusunu seçin)

Microsoft Azure Cognitive Services Language

Servisi kullanmadan önce ayar yapmamız gerekiyor. Ayarlarda dikkat edilmesi gereken 2 husus var.

  1. Azure Region (Bölge) bilgisinin API'yi aldığınız region ile bir olması,
  2. Subscription Key (API anahtarı) size verilen ile birebir olmalı.
            ITextAnalyticsAPI client = new TextAnalyticsAPI();
            client.AzureRegion = AzureRegions.Westcentralus;
            client.SubscriptionKey = "SİZİN KEY'İNİZ";

Text Analytics API

Sentiment Analysis / Duygu Analizi

Duygu analizi kısmında yapmamız gereken tek şey API'nin istemiş olduğu parametreleri sağlamak.
Parametreler

  • Dil : Duygu analizinin yapılacağı dil (TR = Türkçe verdik),
  • Id : Sıradan bir Id, takip edebilmeniz için,
  • Text : Analiz edilecek ifade
            #region Duygu Analizi
            SentimentBatchResult sentimentResults = client.Sentiment(
                new MultiLanguageBatchInput(
                    new List<MultiLanguageInput>()
                    {
                        new MultiLanguageInput("tr", "0", "Çok güzeldi, çok beğendim."),
                        new MultiLanguageInput("tr", "1", "Kesinlikle gitmeyeceğim."),
                        new MultiLanguageInput("tr", "2", "Nasıl olacak bilemiyorum?"),
                        new MultiLanguageInput("tr", "3", "Hiç beğenmedim, çok kötüydü."),
                    }));

            foreach (var document in sentimentResults.Documents)
                Console.WriteLine("Doküman Id: {0}, Duygu Skoru: {1:0.00}", document.Id, document.Score);
            #endregion
Ve sonuç aşağıdaki gibi
Text Analytics API Sentiment Results

Key Phrase Extraxtion / Anahtar Tümcecik Ayıklama

Anahtar kelimeleri ifademizden ayırabilmek için verilmesi gereken parametreler duygu analizi ile aynı parametreler. Dil, Id ve ifade.

Anahtar kelime ayırma Türkçe dil desteği bulunmadığı için İngilizce ifadeler kullanacağım. Bunlar
Last night I had too much to drink = Dün gece içmek için çok fazla şeyim oldu
I've got a bike. You can ride it if you like = Bir bisikletim var. İstersen sürebilirsin
You reached for the secret too soon = Sırra çok erken ulaştın
No dark sarcasm in the classroom = Sınıfta alaya yer yok

            KeyPhraseBatchResult keyPhraseResults = client.KeyPhrases(
                new MultiLanguageBatchInput(
                    new List<MultiLanguageInput>()
                    {
                          new MultiLanguageInput("en", "1", "Last night I had too much to drink."),
                          new MultiLanguageInput("en", "2", "I've got a bike. You can ride it if you like."),
                          new MultiLanguageInput("en", "3", "You reached for the secret too soon."),
                          new MultiLanguageInput("en", "4", "No dark sarcasm in the classroom.")
                    }));


            foreach (var document in keyPhraseResults.Documents)
            {
                Console.WriteLine("Doküman Id: {0} ", document.Id);

                Console.WriteLine("Anahtar kelimeler:");

                foreach (string keyphrase in document.KeyPhrases)
                    Console.WriteLine(keyphrase);

                Console.Write(Environment.NewLine);
            }

Sonuç aşağıdaki çıktı

Text Analytics API Key Phrase Results

Language Detection / Dil Algılama

Dil algılamayı en başta yapsam daha sağlıklı olurdu, çünkü verilen ifadenin önce dilini öğrenip ondan sonra Duygu ve Tümcecik Ayırma analizi yapmak en doğru yol fakat tümcecik ayırma analizinde TR dil desteği olmadığı için ayrı ayrı yapma fikri daha ağır bastı.
Dil algılama servisinin bizlerden istediği iki parametre var: Id ve ifade (text).
            LanguageBatchResult languageResult = client.DetectLanguage(
                    new BatchInput(
                        new List<Input>()
                        {
                          new Input("1", "This is a document written in English."),
                          new Input("2", "Este es un document escrito en Español."),
                          new Input("3", "Bu doküman Türkçe yazılmıştır.")
                        }));

            // Printing language results.
            foreach (var document in languageResult.Documents)
                Console.WriteLine("Doküman Id: {0} , Dil: {1}, Yakınlık {2:0.00}", 
                    document.Id, document.DetectedLanguages[0].Name, document.DetectedLanguages[0].Score);
Text Analytics API Language Detection Results
 
Dil algılama işlemini tamamladık, metin analiz servisini tamamen kullandık. Hepsi bu kadar. Siz de Microsoft'un API kullanımı için hazırladığı örnek kod sayfasına (C#) göz atmak isterseniz buraya, servis dokümanını incelemek isteseniz ise buraya tıklayın.
 Projeyi indirmek için tıklayınız : TextAnalyticsAPIDemo.7z (2,50 mb)