Notice: Undefined index: height in C:\Inetpub\vhosts\egemenciftci.com\httpdocs\wp-content\themes\material-for-coders\includes\thumbnails.php on line 27
Egemen Çiftci – Page 4 – Personal Web Site

Blog


Dinamik Olarak Dll Yükleme ve Kullanma

.NET ile yazılmış bir dll’i projeye eklemeden, dosya yolunu göstererek kullanabiliriz. Aşağıdaki örnek için çağırılacak sınıf ve metot statik olmalıdır.

using System;
using System.IO;
using System.Reflection;

namespace DynamicLoadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var result = CallMethod(@"C:\SampleDll.dll", "Add", new object[] { 5, 4 });

            if (result is Exception)
            {
                Console.WriteLine("Some errors occured!");

                Console.ReadKey();
            }

            Console.WriteLine(result);

            Console.ReadKey();
        }

        private static object CallMethod(string assemblyFile, string methodName, object[] parameters)
        {
            try
            {
                var a = Assembly.LoadFrom(assemblyFile);

                var mi = a.GetTypes()[0].GetMethod(methodName);

                return mi.Invoke(null, parameters);
            }
            catch (Exception ex)
            {
                return ex;
            }
        }
    }
}

Yukarıdaki yöntem çok esnek bir yöntem değil. Methot adlarını bilmek gerekiyor. Bunun yerine .NET kütüphanesinde bulunan MEF(Managed Extensibility Framework) kütüphanesini kullanabiliriz. Bu kütüphane System.Composition altında bulunmaktadır.

Bir interface oluşturulur.

namespace CompositionTest
{
    public interface IOperation
    {
        int Add(int a, int b);

        int Subtract(int a, int b);

        double Divide(int a, int b);

        int Multiply(int a, int b);
    }
}

Interface’de kullanmak için modül tipi metadata’sı oluşturulur.

namespace CompositionTest
{
    public interface IOperationMetadata
    {
        ModuleTypes ModuleType { get; }
    }
}

MEF kütüphanesini kullanmak için yardımcı bir sınıf oluşturulur.

using DynamicLoadTest;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.IO;
using System.Reflection;

namespace CompositionTest
{
    public class MefHelper
    {
        [ImportMany]
        public IEnumerable<Lazy<IOperation, IOperationMetadata>> operations;

        public void Setup()
        {
            try
            {
                operations = new List<Lazy<IOperation, IOperationMetadata>>();

                var aggregate = new AggregateCatalog();
                //aggregate.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
                aggregate.Catalogs.Add(new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetAssembly(typeof(Program)).Location)));

                var parts = new CompositionBatch();
                parts.AddPart(this);

                var container = new CompositionContainer(aggregate);
                container.Compose(parts);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
}

Modül tipleri enum’u oluşturulur.

namespace CompositionTest
{
    public enum ModuleTypes
    {
        None, AnotherModule, SampleModule
    }
}

Aşağıdaki gibi kullanabiliriz.

using CompositionTest;
using System;
using System.Linq;

namespace DynamicLoadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var mh = new MefHelper();

            mh.Setup();

            Console.WriteLine(mh.operations.First(f => f.Metadata.ModuleType == ModuleTypes.AnotherModule).Value.Add(10, 4));

            Console.WriteLine(mh.operations.First(f => f.Metadata.ModuleType == ModuleTypes.SampleModule).Value.Add(10, 4));

            Console.ReadKey();

            Console.WriteLine(mh.operations.First(f => f.Metadata.ModuleType == ModuleTypes.AnotherModule).Value.Add(10, 4));

            Console.WriteLine(mh.operations.First(f => f.Metadata.ModuleType == ModuleTypes.SampleModule).Value.Add(10, 4));

            Console.ReadKey();
        }
    }
}

Örnek dll sınıfı.

using CompositionTest;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AnotherModule
{
    [Export(typeof(IOperation))]
    [ExportMetadata("ModuleType", ModuleTypes.AnotherModule)]
    public class Operation : IOperation
    {
        public int Add(int a, int b)
        {
            return -1;
        }

        public int Subtract(int a, int b)
        {
            return -2;
        }

        public double Divide(int a, int b)
        {
            return -3;
        }

        public int Multiply(int a, int b)
        {
            return -4;
        }
    }
}

Örnek projeyi buradan indirebilirsiniz.




Linq ile Gruplama

.NET’te yer alan ve bence en kullanışlı teknolojilerden biri olan Linq kütüphanesi ile istediğimiz koleksiyon gruplamak çok kolaydır.

Tek kolona göre gruplama:

var groupedCustomers = Customers.GroupBy(f => f.City);

Birden fazla kolona göre gruplama:

var groupedCustomers = Customers.GroupBy(f => new { f.City, f.Country });



Olay Tabanlı Asenkron Metotları “Task” Tabanlı Hale Getirme

.NET 4.5 ile gelen ve asenkron programlamayı oldukça kolaylaştıran “await” komutunu kullanabilmek için metodumuzun “Task” tabanlı olması gerekmekte. Aşağıdaki örnekteki gibi bunu başarabiliyoruz.

Olay Tabanlı Metot:

public void DoSomeAsyncJob(string someInput, Action<bool> onCompleted){}

“Task” Tabanlı Metot:

public Task<bool> DoSomeAsyncJob(string someInput)
{
     var t = new TaskCompletionSource<bool>();

     DoSomeAsyncJob(someInput, f => t.TrySetResult(f));

     return t.Task;
}



AES Şifreleme ve Çözme

AES (Advanced Encryption Standard; Gelişmiş Şifreleme Standardı), elektronik verinin şifrelenmesi için sunulan bir standarttır. Amerikan Hükümeti tarafından kabul edilen AES, uluslararası alanda da defacto şifreleme (kripto) standardı olarak kullanılmaktadır.
AES ile standartlaştırılan algoritma, esas olarak Vincent Rijmen ve Joan Daemen tarafından geliştirilen Rijndael algoritmasında bazı değişiklikler yapılarak oluşturulmuştur. Rijndael, geliştiricilerin isimleri kullanılarak elde edilen bir isimdir: RIJmen aNd DAEmen.
256-bit anahtar uzunluğuna sahip AES algoritması için 2200 işlem gerektiren bir saldırı algoritmanın kırılması olarak kabul edilirken, 2200 mertebesindeki bir işlem, şu an için, evrenin yaşından daha uzun bir süre gerektirmektedir.

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

namespace AES
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var text = "TeSt";

                using (var myRijndael = new RijndaelManaged())
                {
                    var key = myRijndael.Key;
                    var IV = myRijndael.IV;

                    Console.WriteLine("Original:   {0}", text);

                    var encrypted = EncryptStringToBytes(text, key, IV);

                    Console.WriteLine("Encrypted:   {0}", Convert.ToBase64String(encrypted));

                    var decrypted = DecryptStringFromBytes(encrypted, key, IV);

                    Console.WriteLine("Decrypted:   {0}", decrypted);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }

            Console.ReadKey();
        }

        static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
        {
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");

            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

            using (var rijAlg = new RijndaelManaged())
            {
                rijAlg.Key = Key;
                rijAlg.IV = IV;

                var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);

                using (var msEncrypt = new MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(plainText);
                        }

                        encrypted = msEncrypt.ToArray();
                    }
                }
            }

            return encrypted;
        }

        static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");

            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            string plaintext = null;

            using (var rijAlg = new RijndaelManaged())
            {
                rijAlg.Key = Key;
                rijAlg.IV = IV;

                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);

                using (var msDecrypt = new MemoryStream(cipherText))
                {
                    using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (var srDecrypt = new StreamReader(csDecrypt))
                        {
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }
            }

            return plaintext;
        }
    }
}




Basit Şifreleme ve Çözme

static Random r = new Random();

private static string Encode(string text)
{
     var key = r.Next(10000, 34465);

     var chars = text.ToCharArray();

     var encoded = string.Empty;

     for (int i = 0; i < chars.Length; i++)
     {
          encoded += (int)chars[i] + key;
     }

     var randomIndex = r.Next(0, encoded.Length);

     encoded = encoded.Insert(randomIndex, key.ToString());

     encoded += randomIndex;

     return encoded;
}

private static string Decode(string encodedString)
{
     var randomIndexLength = encodedString.Length % 5;

     if (randomIndexLength == 0)
     {
          randomIndexLength = 5;
     }

     var randomIndex = Convert.ToInt32(encodedString.Substring(encodedString.Length - randomIndexLength));

     var key = Convert.ToInt32(encodedString.Substring(randomIndex, 5));

     var encodedBody = encodedString.Substring(0, randomIndex) + encodedString.Substring(randomIndex + 5,  encodedString.Length - randomIndexLength - randomIndex - 5);

     var decodedChars = new char[encodedBody.Length / 5];

     for (int i = 0; i < decodedChars.Length; i++)
     {
          decodedChars[i] += (char)(Convert.ToInt32(encodedBody.Substring(i * 5, 5)) - key);
     }

     return new string(decodedChars);
}



Html5 ile Kameraya Erişim

navigator.getUserMedia() ile kamera ve mikrofona herhangi bir eklentiye ihtiyaç duymadan erişebiliriz. Kodlar için örnek sayfayı inceleyebilirsiniz.

Kameraya Erişim Örnek Sayfası




TC Kimlik Numarası ve Kredi Kartı Numarası Üretici

Bazı yazılımları test etmek  için yazdığım TCKN ve kredi kartı numarası üretici program. Kredi kartı numarası üretirken BIN numarası ile üretme seçeneği de mevcuttur. Kullanmak için NET Framework 4.5’in yüklü olması gerekmektedir.

İndir

Web üzerinden çalışan javascript ve HTML5 ile yazılmış versiyonu




NLog ile Loglama

Öncelikle projeye sağ tıklayıp “Manage NuGet Packages…” diyoruz. Oradan NLog’u bulup projeye ekliyoruz. Loglama yapacağımız sınıfın içine aşağıdaki satırı ekliyoruz.

private static Logger logger = LogManager.GetCurrentClassLogger();

NLog nereye, nasıl loglayacağını config dosyasından algılıyor. Bunun için NLog.config adında bir xml dökümanı oluşturuyoruz. Dosyanın Visual Studio üzerinden özellikleri Build Action:Content ve Copy To Output Directory:Copy if newer şeklinde olmalı.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target name="file" xsi:type="File" fileName="test.log" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}"/>
    <target name="eventLog" xsi:type="EventLog" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}"/>
  </targets>
  <rules>
    <logger name="*" writeTo="file"/>
    <logger name="*" writeTo="eventLog"/>
  </rules>
</nlog>

Yukarıdaki örnek konfigurasyon hem test.log adlı dosyaya hem de Windows Olay Görüntüleyicisi’ne kayıt atmaktadır. Sadece dosyaya log atmasını istersek rules altındaki ikinci sıradaki  logger’ı silmek yeterlidir.  Konfigurasyon ile ilgili daha fazla bilgiyi https://github.com/nlog/nlog/wiki/Configuration-file adresinden alabilirsiniz.

İstediğimiz metodun içine aşağıdaki örnek satırı ekleyerek log atabiliyoruz.

logger.Log(LogLevel.Debug, "Test");

veya exception loglamak istersek;

logger.LogException(LogLevel.Debug, "Mesaj", exception);



Xaml içinde StringFormat Türkçeleştirme

Xaml içinden StringFormat ile herhangi bir tarihin hangi güne denk geldiğini göstermek istediğimizde ingilizce olarak gösterildiğini göreceksiniz. Bunun nedeni xaml’in varsayılan dil olarak en-US kullanmasıdır.

<TextBlock Text="{Binding Path=Tarih, StringFormat=dd.MM.yyyy - dddd}"/>

Bu problemi aşmak için aynı xaml’de namespace’lerin tanımlandığı yere aşağıdaki kodu eklemek yeterlidir.

xml:lang="tr-TR"



Visual Studio 2012 Uzaktan Hata Ayıklama

Visual Studio 2012 ile ağınızdaki başka bir bilgisayarda çalışan programa bağlanıp hata ayıklayabiliyoruz. Bunu yapabilmek için bazı önkoşullar var.

  • Uzak bilgisayar ve Visual Studio’nun olduğu bilgisayar aynı ağda veya ethernet kablosuyla direkt olarak bağlı olmalıdır. İnternet üzerinden bağlantılar desteklenmiyor.
  • Uzak bilgisayarda Remote Debugging Components kurulu ve çalışıyor olmalıdır.
  • Uzak bilgisayara Remote Debugging Components yüklemek için yönetici hesabına ihtiyaç vardır. Ayrıca erişim içim yetkili bir kullanıcı olmak gereklidir.

Öncelikle Remote Tools’u indirip uzak bilgisayara kurmak gerekiyor. Aşağıdaki bağlantıdan x86, x64 veya arm mimarisine göre olanı indirebiliyoruz.

http://www.microsoft.com/visualstudio/11/en-us/downloads/remote-tools#remote-tools

Kurulum tamamlandıktan sonra Start –> Microsoft Visual Studio 2012 –> Remote Debugger Configuration Wizard’ı çalıştırıyoruz. Çıkan pencereyi onayladığımız zaman uzak bilgisayardaki işimiz tamamlanmış oluyor.

Visual Studio üzerinden Debug —> Attach to process… yaptığımızda çıkan pencereden Find… tuşuna basıyoruz. Orada uzak bilgisayarı seçiyoruz. Alt kısımda o bilgisayarda çalışan, bağlanmak istediğimiz process’i seçiyoruz ve Attach diyoruz.