C# 7 Tuple Kullanımı

Klasik Kullanım

var point = new Tuple<int, int>(0, 1);
var x = point.Item1;

Pratik Yazım

var point = (0, 1);
var x = point.Item1;

Tuple üzerindeki değerleri isimlendirme

var point = (X: 0, Y: 1);
var x = point.X;

Değer isimlerinin değişkenden alınması

var X = 0;
var Y = 1;
var point = (X, Y);
var x = point.X;

Metot geri dönüş tipi olarak.

Anonim tiplerin geri dönüş değeri olarak kullanılamaması dolayısıyla, anonim tipler için büyük bir alternatif.

Değerlere ad verebildiğimiz için, basit DTO'lar için, ayrı bir DTO yazmak yerine doğrudan Tuple kullanımını da mümkün kılıyor.

class MyClass
{
    (int X, int Y) GetPoint()
    {
        return (0, 1);
    }
}

var point = new MyClass().GetPoint();
var x = point.X;
Etiketler:  C#

Kalbin Yuvaya Dönüşü - Mekke'ye Giden Yol 2

Kalbin Yuvaya Dönüşü - Mekke

Muhammed Esed'in Mekke'ye Giden Yol kitabının devamı niteliğinde ikinci biyografi çalışması. Eşinin ısrarları üzerinde, Muhammed Esed tarafından hayatının son dönemlerinde kaleme alınmış fakat tamamlayamadan vefat ettiği için, kitabın ikinci kısmı eşi Pola Hamide Esed tarafından tamamlanmış.

İlk kitap, Muhammed Esed'in İslam'la tanışması ve Arabistan yıllarını anlatıyordu. Bu kitap kaldığı yerden, Muhammed Esed'in Hindistan-Pakistan yıllarından başlıyor. Burada geçirdiği yıllar, ikincisi dünya savaşında toplama kampında tutulması,Birleşmiş Milletler yılları, Pakistan adına Müslüman ülkeleri ziyaretleri, Kuzey Afrika ve Avrupa'da geçirdiği sonraki yıllar.

İlk kitapta olduğu gibi, çok iyi bir biyografi ve roman tadında. Fakat kitabı okurken, gelişen olaylar karşısında Muhammed Esed'in kendi görüşlerini de daha detaylı olarak anlatmasını beklerdim. Örneğin, Mevdudi ile tanışıklıkları ve görüş ayrılıklarının olduğu anlatılıyor ama detaya hiç inilmiyor. İlk kitabı Mekke'ye giden yol bu konuda çok daha başarılıydı.

Eşi Pola Hamide Esed'in anlattığı ikinci bölüm ise, nerelere gidildiği, kimlerle tanışıldığı şeklinde, Muhammed Esed'in hayatının kronolojik bir şekilde anlatıldığı düz bir metin şeklinde. Eşi tarafından tamamlanan bu kısmı oldukça sıkıcı geldi. Belki bu kısım atlanabilir bile.

Kitanı okumak isteyenler, eğer okumamışlarsa, ilk olarak önceki kitabı okurlarsa daha iyi olur.

Sayfa Sayısı: 352
Puan: 7 / 10

Compress & Decompress String in C#

Compress and decompress string in C#.

Usage

var str = "String to be compressed";
var strCompressed = Cipher.Compress(str);
var strDecompressed = Cipher.Decompress(strCompressed);

Cipher class

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

public static class Cipher
{
    /// <summary>
    /// String compress
    /// </summary>
    public static string Compress(string uncompressedString)
    {
        if (String.IsNullOrEmpty(uncompressedString))
        {
            return uncompressedString;
        }

        using (var compressedStream = new MemoryStream())
        {
            using (var uncompressedStream = new MemoryStream(Encoding.UTF8.GetBytes(uncompressedString)))
            {
                using (var compressorStream = new DeflateStream(compressedStream, CompressionMode.Compress, true))
                {
                    uncompressedStream.CopyTo(compressorStream);
                }

                return Convert.ToBase64String(compressedStream.ToArray());
            }
        }
    }

    /// <summary>
    /// String decompress
    /// </summary>
    public static string Decompress(string compressedString)
    {
        if (String.IsNullOrEmpty(compressedString))
        {
            return compressedString;
        }

        using (var decompressedStream = new MemoryStream())
        {
            using (var compressedStream = new MemoryStream(Convert.FromBase64String(compressedString)))
            {
                using (var decompressorStream = new DeflateStream(compressedStream, CompressionMode.Decompress))
                {
                    decompressorStream.CopyTo(decompressedStream);
                }

                return Encoding.UTF8.GetString(decompressedStream.ToArray());
            }
        }
    }
}
Etiketler:  C#

Bab-ı Esrar

Bab-ı Esrar

Ahmet Ümit'in okuduğum ilk romanı. Bir sigorta eksperinin, çıkan bir yangını araştırmak için Konya'ya gidişi ve burada yaşadığı olaylar anlatılıyor. Polisiye türünde roman beklerken, içerisindeki polisiye ve esrarlı hikayeye ilaveten, daha çok Mevlana ve Şems-i Tebrizi arasında ilişkinin daha ağır bastığı bir anlatım var. Polisiye bir hikayenin Mevlana ile harmanlanmış hali diyebiliriz.

Son yıllar okuduğum kitaplar arasında en akıcı olanı. Hiçbir şekilde, paragrafları tekrar okumak zorunda kalmadan ve hiç takılmadan ilerleyebiliyorsunuz. En dikkatimi çeken şey, yazarın dili ustalıkla kullanması oldu. Fakat diyaloglar biraz yavan kalmış. Olayların da daha çok şok edici olmasını beklerdim. Yolculuklarda okumak için ideal olabilir.

Kitap, Elif Şafak'ın Aşk romanını akla getiriyor. Zaten iki eser de aynı zamanlarda yazılmış. Aşk romanını sevenler bu romanı da sevecektir. Farklı olarak, Mevlana ile ilgili diğer kitapların aksine, Mevlana ve Şems-i Tebrizi arasındaki ilişki, daha çok Şems'in gözünden anlatılmış.

Sayfa Sayısı: 548 / Cep boy
Puan: 6 / 10

Mersenne Asalları

Mersenne sayıları, ikinin kuvvetlerinin bir eksiği şeklinde olan sayılardır. n doğal sayısı için Mn = 2n - 1 şeklinde hesaplanır.

Mersenne asal sayıları, hem bir Mersenne sayısı hem de asal olan sayılardır. n sayısı için Mn = 2n - 1 işleminin sonucu bir asal sayı ise bu sayıya Mersenne asal sayısı denir.

Mersenne asal sayılarına örnek olarak,

n = 2 için 22 - 1 = 3
n = 3 için 23 - 1 = 7
n = 5 için 25 - 1 = 31

verilebilir. 3, 7 ve 31 asal sayılardır.

Günümüzde bulunan en büyük asal sayılar, Mersenne asallarından oluşmaktadır. Mersenne asallarının tespit edilmesinde kullanılan bazı pratik yöntemlerden dolayı, yeni asal sayı araştırması yapan gruplar, Mersenne asalları üzerine yoğunlaşmıştır.

2016 'nın Ocak ayı itibariyle 49 Mersenne asal sayısı bilinmektedir. Bilinen en büyük Mersenne asal sayısı 274.207.281 - 1'dir.

Teorem

Bir Mersenne sayısının asal olabilmesi için, ikinin kuvvetinin de asal olması gerekir.

Geometrik seriler için,

s = 1 + r + r2 + r3 + ... + rn-1

Eşitliğin her iki tarafını r ile çarparsak,

rs = r + r2 + r3 + r4 + ... + rn

İki eşitliğin farkı,

s - rs = 1 - rn
s(1 - r) = 1 - rn
rn -1 = s(r - 1)

Teoreme göre, ikinin kuvveti asal değilse, Mersenne sayısının da asal olmaması gerekir. İkinin kuvveti, yani n değeri asal değilse, n değeri axb şeklinde, iki tam sayının çarpımı şeklinde yazılabilir.

2ab değerini 2ab şeklinde yazarsak, 2ab - 1 = s(2a - 1) olur.
2ab değerini 2ba şeklinde yazarsak, 2ba - 1 = s(2b - 1) olur.

Yukarıdaki iki eşitliğe göre, 2ab - 1 değeri hem 2a - 1 hem de 2b - 1 değerine tam olarak bölünür. Yani bu durumda, birden fazla böleni olduğu için 2ab - 1 değeri asal olmaz.

Lucas-Lehmer Asallık Testi

Bir Mersenne sayısının asal olup olmadığını anlamak için kullanılan etkili bir yöntemdir. Klasik yöntemlere göre, bir Mersenne sayısının asal olup olmadığını tespit etmek için gerekli süre, bu test ile dramatik bir şekilde kısalmaktadır.

Lucas-Lehmer asallık testine göre, 2p - 1 sayısının asal olması için aşağıdaki şartın sağlanması gereklidir.

S(0) = 4
S(n) = (S(n-1)2 - 2) mod (2p-1)

rekürsif fonksiyona göre

S(p-2) = 0

değerini veriyorsa, 2p - 1 Mersenne sayısı asaldır.

Örnek vermek gerekirse, 27 - 1 sayısını asal olup olmadığına bakalım. Bu sayının asal olması için, S(p - 2) yani S(5) değerinin 0 olması gerekir.

S(0) = 4 
S(1) = (4x4 - 2) mod 127 = 14 
S(2) = (14x14 - 2) mod 127 = 67 
S(3) = (67x67 - 2) mod 127 = 42 
S(4) = (42x42 - 2) mod 127 = 111 
S(5) = (111x111 - 2) mod 127 = 0

Dolayısıyla, 27 - 1 sayısı asaldır.

Lucas-Lehmer testinin C# dilinde yazılmış kaynak kodu yer almaktadır.

using System;
using System.Numerics;

namespace SG.Algorithm
{
    public class MersenneNumber
    {
        /// <summary>
        /// (2^p - 1) değerinin asal sayı olup olmadığına bakılıyor.
        /// </summary>
        public bool IsPrimeNumber(int p)
        {
            if (p < 2)
            {
                throw new ArgumentException(nameof(p));
            }

            // Eğer p değeri çift ise, sadece 2 değeri için Mersenne asalı olur.
            if (p % 2 == 0)
            {
                return p == 2;
            }

            // (2^p - 1) sayısının asal olması için, p değerinin de asal olması gerekiyor.
            // Tüm tek sayılara göre mod alma işlemi uygulanarak, p sayısının asal olup olmadığına bakılıyor.
            // Döngünün p^(1/2) ye kadar çalışması yeterli. Hiçbir sayı, karekök değerinden büyük bir sayıya tam olarak bölünemez.
            for (int i = 3; i <= (int)Math.Sqrt(p); i += 2)
            {
                if (p % i == 0)
                {
                    // Tam olarak bölünüyor, asal değil.
                    return false;
                }
            }

            // Değer çok büyük olabileceği için BigInteger kullanılmıştır.
            var mode = BigInteger.Pow(2, p) - 1;

            // S fonksiyonu başlangıç değeri
            var S = new BigInteger(4);

            // S(p-2) değeri bulunacak
            for (int n = 1; n <= p - 2; n++)
            {
                // S(n) = (S(n-1)^2 - 2) mod (2p-1)
                S = (BigInteger.Pow(S, 2) - 2) % mode;
            }

            // S(p-2) değeri 0 ise, (2^p - 1) değeri asaldır.
            return S == 0;
        }
    }
}
Etiketler:  C#

Dünyanın İlk Günü

Dünyanın İlk Günü

Beyazıt Akman tarafından yazılan romanda, Fatih Sultan Mehmet ve İstanbul'un fethi konu alınıyor. Sultan Mehmet'in Fatih olma sürecine ilaveten, eklenen yan hikayelerle, başta yeniçeriler olmak üzere, öne çıkan karakterlerin hayat hikayelerine ve gelişim süreçlerine yer veriyor.

Yazarın bu konuda çokça okuma yaptığı, romanı yazmadan önce konuyu iyice özümsediği ortada. Zaten kitabın kaynakça bölümüne bakıldığı zamanda bu açıkça belli oluyor. Roman, aynı zamanda tarih bilgimize de geniş katkı sağlıyor.

Roman içerisinde çok fazla karakterin hikayesine yer verilmesi konuyu bazen dağıtabiliyor. Zaman zaman sıkıldığım bölümler de mevcut. Ayrıca, roman dili, örneğin bir İskender Pala ile karşılaştırıldığı zaman, o kadar akıcı değil. Edebi bir hava vermiyor. Bazı paragrafları tekrar okumak zorunda hissediyorsunuz.

Tarihe, ders kitapları üzerinden değil de romanlar üzerinden tanık olmayı seviyorsanız, yazarın eserini de seveceksiniz. Yazarın tarih bilgisine ve bunu karakterler üzerinde anlatmasına da hayranlık duyacaksınız.

Sayfa Sayısı: 630
Puan: 6 / 10

.NET Proje - Asal Sayı Bulucu

Asal Sayı Bulucu projesi ile, gönüllü katılımcılardan oluşan bir bilgisayar ağı oluşturarak, yeni asal sayıların bulunması için geliştirilecek dağıtık bir uygulama hazırlanacaktır.

Proje ile, gönüllü bilgilerinin ve hesaplama sonuçlarının ortak bir veritabanı üzerinde saklandığı, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Asal Sayı Bulucu

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

Windows Form Uygulaması

Gönüllülerin bilgisayarında asal sayı hesaplaması için kullanılacak, görev çubuğunda çalışacak Windows uygulaması

WCF Uygulaması (Windows Communication Foundation)

Gönüllülerin yaptığı hesaplamaları yönetecek, sunucu üzerinde çalışacak uygulama. Merkezi sunucu ile iletişim WCF kullanılarak sağlanacaktır.

SQL Server

Gönüllü bilgilerinin ve hesaplama sonuçlarının saklanacağı veritabanı

LINQ to SQL

SQL Server üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

C#

Tüm kodlama C# ile yapılacaktır.

Abum Rabum

Abum Rabum

İskender Pala tarafından yazılan romanda, üç büyük semavi dinin atası Hz. İbrahim'i konu alıyor. Hz. İbrahim'in mirası peşine düşen MİT, CIA, MOSSAD ile Zelotlar ve Grup Kardeşlik gibi radikal örgütlerin mücadelesinin konu edindiği polisiye bir roman şeklinde ilerliyor.

Diğer İskender Pala kitaplarında olduğu gibi, olay kurgusundan ziyade, Mezopotamya'nın kültürel ve dinsel tarihi üzerinde durularak, okuyucunun bu konuda ufkunun açılmasına sebep oluyor. Her şeyin başlangıcı gibi gösterilen Yunan medeniyetinden çok önceleri, Mezopotamya’da bir medeniyetin oluştuğu fikri sık sık işleniyor.

Kitabın çarpıcı bir sonla bitmiyor oluşu yine hayal kırıklığı oluşturuyor ama yazarın diğer eserlerinden bu duruma alışkınız.

İskender Pala’nın Babil'de Ölüm İstanbul'da Aşk eserini sevdiyseniz, bunu da seveceksiniz. Kitabı okurken sürekli aklım oraya gitti, bu yüzden kitabın sonunu da hemen tahmin edebildim.

Sayfa Sayısı: 528
Puan: 8 / 10

Newton-Raphson Metodu ile Fonksiyon Kök Bulma

Newton-Raphson metodu, sayısal analizde, eşitlik köklerinin bulunmasında en yaygın kullanılan metotlardan birisidir. Başlangıç için tahmini bir kök değeri seçilerek, yapılan iterasyon sonucu gerçek kök değerine oldukça yakın bir değere ulaşılır.

Newton-Raphson

Newton-Raphson metodunun C# dilinde yazılmış kaynak kodu yer almaktadır.

public class NewtonRaphson
{
    public uint MaxIteration { get; set; } = 50;
    public double Epsilon { get; set; } = 0.000001;

    public double Solve(Func<double, double> f, Func<double, double> df, double initialGuess)
    {
        var xn = initialGuess;

        for (var i = 0; i < this.MaxIteration; i++)
        {
            var xn1 = xn - f.Invoke(xn) / df.Invoke(xn);

            if (Math.Abs(xn - xn1) < this.Epsilon)
            {
                return xn1;
            }

            xn = xn1;
        }

        return xn;
    }
}

Örneğin f(x) = x^2 - 2 fonksiyonun köklerini bulmak için, metodu aşağıdaki şekilde çağırabiliriz. Tahmini kök değeri olarak 1 seçilmiştir.

var solver = new NewtonRaphson();
var root = solver.Solve(x => x * x - 2, x => 2 * x, 1);

Benzer şekilde, f(x) = x - Cos(x) fonksiyonun köklerini bulmak için ise, metodu aşağıdaki şekilde çağırabiliriz. f(x) = 1 + Sin(x) fonksiyonun türevidir.

var solver = new NewtonRaphson();
var root = solver.Solve(x => x - Math.Cos(x), x => 1 + Math.Sin(x), 2);
Etiketler:  C#

Bitcoin Altında Yatan Teknoloji / Blockchain

Blockchain, Bitcoin altında yatan teknolojidir.

Bitcoin para transferi konusunda alternatif bir yaklaşım getirmektedir. Mevcut sistemde, iki hesap arasında para transferi için, bankalar, WesternUnion, PayPal gibi aracı kurumlar kullanılır. Bu yöntem ile para transferi maliyetli ve yavaştır. Bitcoin ile, çok daha düşük maliyetlerle ve daha hızlı bir şekilde transfer işlemi yapmak mümkündür. Bitcoin'in bu avantajı sunmasının altında yatan ana sebep, aracı bir kuruma ihtiyaç duymamasıdır.

Bitcoin ile, merkezi otorite tarafından kontrol edilmeksizin ve dolayısıyla herhangi bir regülasyona tabi olmaksızın para transferi işlemi yapmak mümkündür. Merkez bankası, PayPal vb. merkezi otorite, yapılan transferin geçerliliğini kontrol eden ve her iki tarafa güven veren sistemdir. Bu görev, Bitcoin altında yatan Blockchain sistemi ile yerine getirilmektedir. Blockchain, şeffaf, merkezi olmayan, aracı yapılara ihtiyaç duymayan bir çözüm önerir.

Blockchain

Blockchain sisteminde veriler, katılımcılara açık bir dağıtık (distributed) ağ üzerinde, ağ üzerindeki her makinede birer kopyası olacak şekilde, blok (block) adı verdiğimiz yapılar üzerinde tutulur.

Blok, blockchain üzerinde, verilerin saklandığı yapılardır. Bloklar, bir zincir şeklinde birbirine bağlanarak dizilirler. Örnek gösterim aşağıda verilmiştir.

Blockchain Blocks

Zincir üzerindeki her blok, kendinden önceki bloğu bilmektedir. Dolayısıyla, bir önceki bloğun adresine sahiptir.

Blok, içerisindeki veriler ve üst bilgi (header) şeklinde iki bölümden oluşur. Üst bilgi, veri bütünlüğünü kontrol etmek, blok oluşturulduktan sonra, içerisindeki verilerin değiştirilmesini önlemek için kullanılır. Bunu sağlamak için, kriptografik özetleme (cryptographic hashing) işlemlerinden yararlanılır.

Her blok tekil bir adrese sahiptir. Blok üst bilgisi (header) içerisinde temel olarak, bloğun adresi, önceki bloğun adresi ve blok içerisindeki verilere ait Merkle kök değeri yer alır.

Blok adresi üretmek için özetleme (hash) fonksiyonlarından yararlanılır. Blok içerisindeki veriler ve önceki bloğun adresi kullanılarak bu değer hesaplanır.

Blok oluşturma işlemi, maliyetli bir işlemdir. Örneğin, Bitcoin sisteminde, bir blok üretimi 10 dakika kadar sürmektedir. Kötü niyetli bir kullanıcının bir bloğun verisini ve adresini değiştirmesi durumunda, blok adresi sonraki bloğun adres hesabında kullanıldığı için, kendinden sonraki tüm blok adreslerinin de yeniden hesaplanması gerekecektir. Bu sırada, ağ içerisinde yeni bloklar üretilmeye devam etmektedir. Blok oluşturma işleminin yüksek maliyetinden dolayı, blok içeriklerini değiştirmek pratikte mümkün değildir.

Blockchain üzerindeki tüm bloklar, dağıtık ağ (distributed network) üzerindeki tüm makinelerde kopyalar halinde bulunur. Dolayısıyla, ağ üzerindeki makinelerden birisinin, geçici ya da kalıcı olarak devre dışı kalması durumunda herhangi bir veri kaybı ya da aksama yaşanmaz. Bu durum, merkezi yapının getirdiği riskleri ortadan kaldırmaktadır.

Blockchain Network

Blockchain sistemi üzerinde sürekli yeni veriler dahil edilir. Dahil edilen veriler, ağ üzerindeki makinelerde bloklar şeklinde saklanır. Ağ üzerindeki makinelerin yeni bloklar üretme işlemine, madencilik (mining) denir. Blok oluşturma işlemi sırasında, blok içerisinde yer alacak verilerden Merkle ağacı ve kök değeri hesaplanır. Daha sonra, önceki bloğun adresi de kullanılarak, oluşturulacak yeni blok için uygun bir adres üretilmeye çalışılır. Adres bulma işlemi oldukça maliyetli bir işlemdir. Üretilecek blok adresi için bazı kısıtlamalar vardır. Dolayısıyla, uygun bir adres bulana kadar birçok deneme yapılır. Uygun adresi bulan ilk makine, oluşturduğu yeni bloğu ağ içerisindeki diğer makinelerle paylaşır. Diğer makinelerin çoğunluğunun yeni bloğu onaylaması durumunda, yeni oluşturulan blok blockchain içerisine eklenir. Bitcoin sisteminde, uygun adresi bulan makine Bitcoin ile ödüllendirilir.

Sayfa 1 2 3 4

Kategoriler

Algoritma (5), Cheat Sheet (2), Framework (3), İpucu (5), Kendime Not (1), Kitap (4), Kod (5), Matematik (1), Proje (5), Veritabanı (3), Workshop (3)

Etiketler

C# (13) HTML (1) JavaScript (2) SQL (3)

İngilizce / Türkçe

İngilizce / Türkçe kelime listesi kendime not