Mandelbrot Fraktal Çizimi & C#

Fraktal; matematikte, çoğunlukla kendine benzeme özelliği gösteren karmaşık geometrik şekillerin ortak adıdır. En bilinen fraktal kümelerinden birisi olan Mandelbrot kümesinin C# ile oluşturulmuş hali aşağıdadır.

mandelbrot

using System;
using System.Drawing;
using System.Numerics;

namespace SG.Algoritma
{
    public class Fractal
    {
        // Mandelbort kümesinde, yarıçağı 2'den büyük her karmaşık sayı çemberi sonsuza götürmektedir.
        private const int MaxMagnitude = 2;

        // Maksimum iterasyon sayısı
        private const int MaxIterations = 1000;

        // Karmaşık sayı koordinat sisteminde, Mandelbort kümesinin bölgesi.
        // Mandelbort kümesinin sadece bir kısmını çizmek için farklı bir bölge verilebilir. 
        private static Complex AreaMin = new Complex(-2, -2);
        private static Complex AreaMax = new Complex(2, 2);

        /// <summary>
        /// Mandelbort kümesi imajı oluşturuluyor
        /// </summary>
        /// <param name="dimension">Oluşacak imajın genişlik ve yükseklik değeri (Kare imaj oluşturulacak)</param>
        public static Bitmap GenerateBitmap(int dimension)
        {
            return Fractal.GenerateBitmap(dimension, Fractal.AreaMin, Fractal.AreaMax);
        }

        /// <summary>
        /// Mandelbort kümesi imajı oluşturuluyor
        /// </summary>
        /// <param name="width">Oluşacak imajın genişliği. Yükseklik, çizilmek istenen bölgeyenin genişlik ve yükseklik değerlerine bakılarak belirlenecek.</param>
        /// <param name="areaMin">Karmaşık sayo kooordinat sisteminde, Mandelbort kümesinin sadece belirli bir bölgeye karşılık düşen kısmı çizdirilmek istendiği zaman, bu bölgenin sol alt kösesi</param>
        /// <param name="areaMax">Sağ üst köşe</param>
        public static Bitmap GenerateBitmap(int width, Complex areaMin, Complex areaMax)
        {
            var height = (int)(width * (areaMax - areaMin).Imaginary / (areaMax - areaMin).Real);

            // Boş bir bitmap oluştur
            var bitmap = new Bitmap(width, height);

            // Oluşturulacak imajın her piksel değerine karşılık düşen karmaşık sayı oluşturulacak.
            // Oluşturacağımız karmaşık sayıların, seçtiğimiz bölge içerisinde kalması gerekmektedir.
            
            var rScale = (areaMax - areaMin).Real / width;
            var iScale = (areaMax - areaMin).Imaginary / height;

            for (var x = 0; x < width; x++)
            {
                // Karmaşık sayısının real kısmı
                var real = areaMin.Real + x * rScale;

                for (var y = 0; y < height; y++)
                {
                    // Karmaşık sayısının imaginary kısmı
                    var imaginary = areaMin.Imaginary + y * iScale;

                    // Mandelbort kümesi iterasyon değeri hesaplanıyor.
                    var iteration = Fractal.CalculateIteration(new Complex(real, imaginary));

                    // Iterasyon değerine göre noktanın rengi ayarlanıyor.
                    bitmap.SetPixel(x, y, Fractal.GetColor(iteration));
                }
            }

            return bitmap;
        }

        private static int CalculateIteration(Complex c)
        {
            var z = new Complex();
            var iteration = 0;

            // MaxIterations adedince f(z) = z^2 + c işlemini uygula
            // İşlem sonucu Mandelbort kümesi içerisinde kalmaya devam ettiği sürece işlemi tekrarla
            while (iteration < Fractal.MaxIterations && z.Magnitude < Fractal.MaxMagnitude)
            {
                z = z * z + c;
                iteration++;
            }

            return iteration;
        }

        /// <summary>
        /// // Iterasyona karşılık renk seçiliyor.
        /// </summary>
        private static Color GetColor(int iteration)
        {
            // Rasgele bir renk seçiliyor.
            // 256 tane rengin olduğu bir liste oluşturularak, listeden iteration % 256. renk de seçilebilir.
            // Ya da, oluşan imajın tek renkten oluşmasını istiyorsak, Color.FromArgb(iteration % 256, 0, 0) rengi seçilebilir. Bu durumda kırmızı toplanda imaj oluşacaktır.

            return Color.FromArgb((iteration * iteration * iteration) % 256, (iteration * iteration) % 256, (iteration) % 256);
        }
    }
}

Mandelbrot kümesini fraktal resmini oluşturmak için, ilgili metot aşağıdaki şekilde çağrılabilir. Bu durumda en üstte yer alan resim oluşacaktır.

var bitmap = Fractal.GenerateBitmap(800);

bitmap.Save(@"D:\mandelbort.png", ImageFormat.Png);

Mandelbrot fraktalının sadece belirli bir bölgesini çizdirmek için, ilgili metot aşağıdaki şekilde çağrılabilir. Böylece fraktalın istenilen bölgesi daha detaylı bir şekilde çizdirilebilir.

var bitmap = Fractal.GenerateBitmap(800, new Complex(-0.4, -1.3), new Complex(0.1, -0.5));

mandelbrot

Etiketler:  C#

Encrypt & Decrypt a String in C#

Encrypt and decrypt data using a symmetric key in C#.

Usage

var str = "String to be encrypted";
var password = "p@SSword";
var strEncryptred = Cipher.Encrypt(str, password);
var strDecrypted = Cipher.Decrypt(strEncryptred, password);

Encryption

Cipher class

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace SG.Algoritma
{
    public static class Cipher
    {
        /// <summary>
        /// Encrypt a string.
        /// </summary>
        /// <param name="plainText">String to be encrypted</param>
        /// <param name="password">Password</param>
        public static string Encrypt(string plainText, string password)
        {
            if (plainText == null)
            {
                return null;
            }

            if (password == null)
            {
                password = String.Empty;
            }

            // Get the bytes of the string
            var bytesToBeEncrypted = Encoding.UTF8.GetBytes(plainText);
            var passwordBytes = Encoding.UTF8.GetBytes(password);

            // Hash the password with SHA256
            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            var bytesEncrypted = Cipher.Encrypt(bytesToBeEncrypted, passwordBytes);

            return Convert.ToBase64String(bytesEncrypted);
        }

        /// <summary>
        /// Decrypt a string.
        /// </summary>
        /// <param name="encryptedText">String to be decrypted</param>
        /// <param name="password">Password used during encryption</param>
        /// <exception cref="FormatException"></exception>
        public static string Decrypt(string encryptedText, string password)
        {
            if (encryptedText == null)
            {
                return null;
            }

            if (password == null)
            {
                password = String.Empty;
            }

            // Get the bytes of the string
            var bytesToBeDecrypted = Convert.FromBase64String(encryptedText);
            var passwordBytes = Encoding.UTF8.GetBytes(password);

            passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

            var bytesDecrypted = Cipher.Decrypt(bytesToBeDecrypted, passwordBytes);

            return Encoding.UTF8.GetString(bytesDecrypted);
        }

        private static byte[] Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
        {
            byte[] encryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                        cs.Close();
                    }

                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        private static byte[] Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);
                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }

                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }
    }
}
Etiketler:  C#

SQL ROW_NUMBER

SQL sorgu sonucunda, satırlara numara vermek için kullanılır. kendime not

En yüksek değere sahip etiketin sıra numarası 1 olacak şekilde, tüm satırlar DEGER sütununa göre sıralanıyor.

SELECT AD, DEGER, SIRA = ROW_NUMBER() OVER (ORDER BY DEGER DESC)
FROM ETIKET

PARTITION BY ile, sorgu sonucu etiket kategorisine göre gruplandıktan sonra, her bir grupta yer alan etiketlere kendi içerisinde sıra numarası veriliyor. Gruplarda, en küçük değere sahip etiketlerin sıra numarası 1'dir.

SELECT AD, DEGER, SIRA = ROW_NUMBER() OVER (PARTITION BY KATEGORI_ID ORDER BY DEGER)
FROM ETIKET
Etiketler:  SQL

CDN Çift Slah // Kullanımı

tip

Jquery, Twitter Bootstrap vb. third party javascript, css, resim ve font dosyalarını CDN üzerinden kendi web sitemize eklerken, http:// ve https:// protokolü yerine sadece // kullanabiliriz. Eğer sitemiz http protokülü ile çalışıyorsa, // yerine http:// ifadesi eklenecektir. Eğer SSL sertifikası kullanıyorsak, // yerine https:// ifadesi eklenecektir.

SSL sertifikası ile sitemizi yayınlıyorsa, harici içeriklerin http:// protokolü ile eklenmesi, güvenlik dolayısıyla, bu içeriklerin tarayıcı tarafından yüklenmemesine ve dolayısıyla saylarımızın düzgün çalışmamasına sebep olabilir.

Örnek kullanım: <link href="//fonts.googleapis.com/css?family=Roboto" rel="stylesheet" />

stackoverflow.com

Etiketler:  HTML

Database Management & SQL Workshop İçeriği

Database Management & SQL konusunda düzenlenecek workshop içeriği aşağıdaki gibidir.

Toplam çalışmanın 3 hafta sürmesi planladık. Katılımcıların durumuna göre, bir hafta kısa ya da uzun sürme ihtimali, az da olsa, mevcut.

Workshop
  • 1. Hafta

    Veritabanı yönetim sisteminin ne olduğu ve temel kavramlar üzerinde durulacak.

    • DBMS nedir?
    • Temel kavramlar
      • Table
      • Architecture
        • Clustered & Nonclustered Index
        • B-tree
        • Heap

  • 2. Hafta

    Veritabanı normalizasyon kuralları üzerinde durulacak ve seçilecek bir konu hakkında örnek bir ilişkisel varitabanı tasarlanacak.

    • Normalizasyon
    • Örnek veritabanı tasarımı

  • 3. Hafta

    SQL komutları hatırlanarak, önceki hafta hazırlanan örnek veritabanı üzerinde örnek sorgular çalıştırılacak. Sorgu optimizasyonu üzerinde durularak, sorguların daha performanslı çalışması için neler yapılabileceği tartışılacak.

    • SQL
    • Hazırlanan veritabanı üzerinde çalışacak örnek sorguların hazırlanması
    • Sorgu optimizasyonu

Monte Carlo İntegrali Alan Hesabı

Bir eğrinin altında yer alan alanı istatiksel bir yöntemle hesaplamak için Monte Carlo integral algoritması kullanılabilir. Bu algoritma ile, rasgele üretilen N adet noktanın kaç tanesinin fonksiyon eğrisinin altında yer aldığına bakılır. Rasgele seçilen noktaların yüzde kaçının eğri altında yer aldığına bakılarak, yaklaşık olarak alan hesabı yapılabilir.

Algoritma adımları aşağıdaki şekilde sıralanabilir:

  • Fonksiyonun verilen aralıktaki tüm değerlerini içine alacak şekilde bir dikdörtgen belirlenir.
  • Bu dörtgen içerisinde, N adet nokta rastgele olarak oluşturulur.
  • Bu noktaların ne kadarının, fonksiyonun belirlediği alanın altında olduğuna bakılır.
  • N değerinin, eğri altında olan nokta sayısına oranı, bize yaklaşık olarak, dikdörtgenin alanın fonksiyon eğrisi alanına oranını verecektir.

Aşağıda, Monte Carlo algoritmasının C# dilinde yazılmış kaynak kodu yer almaktadır.

using System;

namespace SG.Algoritma
{
    partial class MonteCarlo
    {
        // Deneme adet
        public uint N { get; set; }

        public MonteCarlo(uint n)
        {
            if (n == 0)
            {
                throw new ArgumentException(nameof(N));
            }

            this.N = n;
        }

        /// <summary>
        /// Verilen fonksiyon eğrisinin altında bulunan alan hesaplanıyor.
        /// </summary>
        /// <param name="func">Fonksiyon</param>
        /// <param name="x1">X ekseni üzerinde, aralık başlangıcı</param>
        /// <param name="x2">Aralık bitiş</param>
        public double CalculateArea(Func<double, double> func, double x1, double x2)
        {
            // Verilen aralıkta, fonksiyonun aldığı minimum ve maksimum değerler
            double min;
            double max;

            // Fonksiyonun minimum ve maksimum değeri hesaplanıyor
            this.CalculateMinMaxValue(func, x1, x2, out min, out max);

            // Denemelerden kaç tanesi, fonksiyon eğrisinin altında
            var hit = 0;

            // Rasgele sayı üretici
            var rand = new Random();

            // N adet dememe yap
            for (int i = 0; i < this.N; i++)
            {
                // Dikdörtgen içerisinde rasgele bir nokta üret
                var x = x1 + (x2 - x1) * rand.NextDouble();
                var y = min + (max - min) * rand.NextDouble();

                // Rasgele seçilen nokta ve fonksiyonun değeri, eğrinin aynı tarafındaysa. (İki negatif sayının çarpımı pozitiftir)
                if (func(x) * y > 0)
                {
                    // Fonksiyon değeri pozitifse
                    if (func(x) > 0)
                    {
                        // Rasgele üretilen y değeri fonsiyon eğrisinin altındaysa
                        if (func(x) > y) hit++;
                    }
                    else
                    {
                        // Rasgele üretilen y değeri fonsiyon eğrisinin üstündeyse
                        if (y < 0 && func(x) < y) hit++;
                    }
                }
            }

            var areaRectangle = Math.Abs(x2 - x1) * (max - min);

            // Seçilen rasgelen noktaların yüzde hit / N kadarı dikdörtgenin içerisinde.
            // Noktaların yüzde kaçının dikdörtgen içerisinde olduğuna bakılarak alan hesabı yapılıyor.

            return areaRectangle * (double)hit / this.N;
        }

        /// <summary>
        /// Verilen aralıkta, fornksiyonun minimum ve maksimum değerleri hesaplanıyor.
        /// </summary>
        /// <param name="func">Fonksiyon</param>
        /// <param name="x1">Aralık başlangıç</param>
        /// <param name="x2">Aralık bitiş</param>
        /// <param name="min">Hesaplanan minimum değer</param>
        /// <param name="max">Hesaplanan maksimum değer</param>
        private void CalculateMinMaxValue(Func<double, double> func, double x1, double x2, out double min, out double max)
        {
            min = double.MaxValue;
            max = double.MinValue;

            // Aralık N parçaya bölünüyor.
            var h = (x2 - x1) / this.N;

            // Verilen aralıkta, N adet nokta için, her bir noktanın fonksiyon değeri hesaplanıyor.
            for (int i = 0; i <= this.N; i++)
            {
                var x = x1 + i * h;
                var y = func(x);

                if (y < min) min = y;
                if (y > max) max = y;
            }
        }
    }
}

Monte Carlo alan hesabı algoritması ile, istediğiniz fonksiyon grafiği altında yer alan bölgenin alanını çok rahat bir şekilde hesaplayabiliriz. Fonksiyonun ne kadar karmaşık olduğunu bir önemi yok. Örneğin f(x) = x - sin(x) - 1 fonksiyon eğrisinin x ekseni {0,3} aralığındaki alanı hesaplamak için, alan hesaplama metodunu aşağıdaki gibi çalıştırabiliriz.

var mc = new MonteCarlo(1000);
var area = mc.CalculateArea(x => x - Math.Sin(x) - 1, 0, 3);

Bu durumda aşağıdaki eğri altında yer alan alan yaklaşık olarak hesaplanacaktır. Daha hassas bir hesaplamak için N değerinin artırılması gerekmektedir.

Monte Carlo Integration

Aynı algoritmada yapılacak küçük bir değişiklikle, fonksiyonun integral değeri de rahatlıkla hesaplanabilir. İntegral hesabında, pozitif alanlardan negatif alanlar çıkarılacağı için, bu alanlara düşen noktalar ayrı ayrı sayılır.

Etiketler:  C#

Workshop Başvuru Sonuçları

Hafta başı, hangi konularda çalışma grupları oluşturacağımıza dair önerilerini topladık. Şimdiye kadar 165 kişi, çalışma gruplarına katılmak istediğini belirtti ve katılmak istediği konuları seçti. Adaylar katılmak istedikleri çalışma gruplarının listesi aşağıdaki gibidir. (Bir aday birden fazla tercihte bulunabiliyor.)

Planlarımız, ilk çalışma grubunun, 19 Mart 2016 Cumartesi günü toplanması şeklinde. Son dakika bir değişiklik olmazsa, ilk workshop konumuz, aşağıdaki listede dördüncü sırada olan, Database Management & SQL konusu olacak. Bu konutu tercih eden kişilerden 10 kişilik bir grup oluşturmaya çalışacağız.

Hafta sonuna kadar, workshop sırasında üzerinde duracağımız konular netleştirilip, Database Management & SQL konusunda workshop yapmak isteyen adaylarla iletişime geçilecek. En uygun 10 aday ile ilk grup oluşturulmaya çalışacağız. sonraki 10 kişi için, ileri bir tarihte, aynı konuda bir çalışma grubu oluşturulabilir.

C#% 70
MS SQL Server% 58
HTML% 52
Database Management & SQL% 48
JavaScript% 45
CSS% 43
OOP% 39
Android Development% 33
MVC% 32
Entity Framework% 30
Bootstrap% 30
jQuery% 27
Web Service% 25
Linq% 24
Linux% 21
Testing% 21
Software Security% 19
XML, Json% 19
AJAX% 19
Data Structures% 19
NoSQL% 18
Design Patterns% 17
Web Api% 17
IOS Development% 16
MongoDB% 12
WCF% 12
MS Office Development% 10
Debugging% 10
Source Control & TFS% 10
Windows Service% 10
Azure% 9
Architecture% 8
SSAS% 5
SSIS% 5
Caching% 5
SharePoint% 5
SSRS% 5
Functional Programming & F#% 3
SignalR% 3

Yazılım Çalışma Grupları

Empatik Akademi tarafından, Birbirimizi Eğitelim Okulları kapsamında düzenlenecek olan Çalışma Grupları için ön başvurular başladı.

Yazılım sektöründe ilerleyen profesyonellerin katılımıyla oluşturulacak ve C#, NoSQL, Twitter Bootstrap vb. farklı konularda yapılacak workshoplar ile, katılımcıların konular hakkında derinleme bilgi sahibi olmaları, bu teknolojilerin kullanım alanları hakkında fikir alış verişinde bulunmaları ve örnek projeler ile konuların pekiştirilmesi amaçlanmaktadır.

Workshop

Her bir çalışma grubunun 10 kişiden oluşması ve bir konu hakkındaki çalışmanın bir ya da birkaç hafta sürmesi, adayların sadece istedikleri ve öncesinde bilgi sahibi oldukları çalışma grubuna katılmaları istenmektedir. Çalışmalar Empatik'in Merter ofisinde, Cumartesi sabahları yapılacaktır. Talebe göre, hafta içi bir akşam da, çalışma grubu oluşturulabilir.

C#, Linq, Entity Framework, MS Office Development, HTML, CSS, Bootstrap, XML, Json, JavaScript, jQuery, AJAX, Source Control & TFS, OOP, Functional Programming & F#, Architecture, Data Structures, Database Management & SQL, Design Patterns, MS SQL Server, NoSQL, MongoDB, SSIS, SSRS, SSAS, WCF, MVC, Web Api, Web Service, Windows Service, SignalR, Debugging, Testing, Caching, Software Security, SharePoint, Android Development, IOS Development, Bluetooth Beacon, Linux, Azure ve talep edilecek diğer konularda, yıl içerisinde çalışma grupları oluşturulması planlanmaktadır.

Çalışma gruplarının biri ya da bir kaçında yer almak için, ön talep anketini doldurmanız ve katılmak istediğiniz grupları seçmeniz gerekmektedir. Katılmak istediğiniz konuları seçtikten sonra, yıl içerisinde oluşturulacak gruplar için, gerekli duyurular e-posta adresinize gönderilecek ve istemeniz durumunda çalışma gruplarına katılımınız sağlanacaktır.

Ön talep formunu doldurmak için:

www.empatik.net/anket/ata.aspx?f=5AF3EC8218154F00AC7379C63E69579B

Sayfa 1 2 3

Kategoriler

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

Etiketler

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

İngilizce / Türkçe

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