Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Ödeme sistemlerinde ISO Mesajlaşma

Günümüz ödeme sistemleri dünyasında kredi kartı ve banka kartı kullanarak ödeme yaptığımızda ödeme verisi bir sistemden diğerine aktarılır.  Örneğin üye iş yeri terminalinden yapılan bir kredi kartı ödeme işlem(transaction) verisi önce terminalin sahibi (acquirer) olan bankaya oradan da kartın sahibi (issuer) bankaya transfer edilir.

İşlem mesajı içerisinde işlem tipi, kullanılan kart, üye iş yeri bilgisi, işlem tutarı, güvenlik bilgileri vs bir çok bilgi yer almaktadır. Bu mesajın cevabı (response) olarak ise bu işlemden otorizasyon alınıp alınmadığı bilgisi dönülür.

Farklı sistemler arasında veri alış verişi olduğu için bu veriyi her sistemin anlayabilmesi yani bir standardının olması gereklidir. Finansal alanda dünyada kabul gören standart da ISO dur. ISO’nun açılımı da International Organization for Standardization’dır.

ISO bir çok standart getirmiştir. Örneğin kartın biçimi ve boyutu ISO 7810 standardında tanımlanmış. SO/IEC 7816-4 standardı akıllı kartlar için bir dosya sistemi yapısı tanımlar. Bizim konumuz olan ISO 8583 ise bizim için POS/ATM ile banka, banka ile BKM, BKM ile Mastercard/Visa arasında konuşurken kullandığı dildir diyebiliriz.

ISO mesaj desenine başlamadan önce aşağıdaki kavramları ön bilgi olarak edinmemiz gerekiyor.

1 byte : 8 bit
Binary : 0 ve 1 den oluşan 2’li gösterimdir.
Hex: 16’lı gösterim şeklidir. 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Her karakter 4 bit ile gösterilir.

Hex karakterlerin bitmap karşılıkları da aşağıdaki tabloda verilmiştir.

Reklamlar

Nisan 23, 2017 Posted by | Yazılım | , , , , | Yorum bırakın

C# ile Sertifika Yükleme

Merhabalar,
İş yerinde bir sertifika geçişimiz oldu ve bunu kod ile cihazlara yüklememiz gerekti. Hemen ufak bir uygulama yazdım ve işe yarayabileceğini düşünerek paylaşıyorum. AddCert() metodundaki parametreleri değiştirerek sertifikayı istediğimiz yere yükleyebiliriz. Aşağıdaki kod örneğimde Personal altına yükleme yapıyoruz.  Run->mmc yazarak PC’nizde yüklü olan sertifikaları inceleyebilirsiniz.

Capture


class Program
{
static void Main(string[] args)
{
Console.WriteLine("Loading has started......");
var cert = new X509Certificate2("CertificateName.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
AddCert(StoreName.My, StoreLocation.LocalMachine, cert);
AddAccessToCertificate(cert, "IIS_IUSRS");
Console.WriteLine("Loading has finished......");
}
private static void AddCert(StoreName storeName, StoreLocation storeLocation, X509Certificate2 cert)
{
X509Store store = new X509Store(storeName, storeLocation);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();
}

private static void AddAccessToCertificate(X509Certificate2 cert, string user)
{
RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;

if (rsa != null)
{
string keyfilepath =
FindKeyLocation(rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileInfo file = new FileInfo(keyfilepath + "\\" +
rsa.CspKeyContainerInfo.UniqueKeyContainerName);

FileSecurity fs = file.GetAccessControl();

NTAccount account = new NTAccount(user);
fs.AddAccessRule(new FileSystemAccessRule(account,
FileSystemRights.FullControl, AccessControlType.Allow));

file.SetAccessControl(fs);
}
}
private static string FindKeyLocation(string keyFileName)
{
string text1 =
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string text2 = text1 + @"\Microsoft\Crypto\RSA\MachineKeys";
string[] textArray1 = Directory.GetFiles(text2, keyFileName);
if (textArray1.Length > 0)
{
return text2;
}
string text3 =
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string text4 = text3 + @"\Microsoft\Crypto\RSA\";
textArray1 = Directory.GetDirectories(text4);
if (textArray1.Length > 0)
{
foreach (string text5 in textArray1)
{
textArray1 = Directory.GetFiles(text5, keyFileName);
if (textArray1.Length != 0)
{
return text5;
}
}
}
return "Private key exists but is not accessible";
}
}

Aralık 23, 2015 Posted by | C# | , , , , | Yorum bırakın

Yazılım Kalite Buzdağı

Geliştirilen yazılımlarda genellikle buz dağının görülen tarafı ile ilgilenilir ancak gerçek şudur ki buz dağının görülmeyen tarafında kaliteyi etkileyen faktörler çok daha fazladır. Biz genellikle yazılımları test ettiririz ve UI testinden geçerse, yani sadece çalışırsa çoğu zaman production’a çıkma onayı verilir. Ama etkin bir code review yapıldığında gerçeklerle yüzleşmeye hazır olun :) Görünmeyen tasarımsal ve kodsal yanlışlar bir süre sonra başınıza bela olabilir veya siz o projeden ayrıldıktan sonra yeni gelen bir yazılımcı kulaklarınız çınlatabilir. O yüzden nasıl bulmak istiyorsan öyle bırak, Yaptığın işe özen göster ve asla baştan savma yapma :)

qualityIceberg
Alıntı : Steve McConell

 

Temmuz 11, 2015 Posted by | Yazılım | , | Yorum bırakın

Nedir Bu XTM?

XTM yazılımı tamamen Kuveyt Türk mühendisleri tarafından geliştirilen ve bankacılığa yeni bir soluk getirmeyi hedefleyen inovatif bir ürün olarak karşımıza çıkmakta. İlk bakışta görüntülü ATM gibi algılansa da, işin içerisine girdiğinizde aslında yeni bir şube konsepti olduğunu söyleyebiliriz. XTM’lerden para çekip, para yatırabilir, hesap açabilir, özel eğitimli müşteri temsilcileri ile görüntülü görüşme yapabilir, dijital olarak evrak paylaşımı yapılabilir, kredi kullanılabilir, dekont ve A4 çıktı verebilir, tarama yapabilir, banka kartı basabilir, kısacası bir şubeye gidip yapabildiğiniz hemen hemen her işlemi gerçekleştirebilirsiniz. Bu açıdan baktığınızda şube maliyetlerini azaltılıp Kuveyt Türk’e rekabet avantajı sağlamaktadır ve ilerde çok daha fazla ses getirecektir..  Tek bir XTM dijital şubesi ATM, internet şube, çağrı merkezi ve şube fonksiyonlarının harmanlanmasından oluşmaktadır.

xtm v2

Uzun uğraşlar sonucu elle tutulur, stabil bir ürün haline getirilen XTM oldukça olgunlaştı ve 2. nesli de piyasaya çıkmaya hazırlanıyor. Her XTM versiyonu artık yapılamaz deneni yapıyor ve bankacılık sektöründe de çığır açmaya devam ediyor. Şu an çok fazla reklamı yapılmamasına rağmen fısıltı gazetesiyle kulaktan kulağa yayılmakta ve görenlerin yoğun ilgilisini çekmektedir. Öyle ki Arjantinden, Çin’e , Mısırdan Polonyaya kadar bir çok banka XTM’i görmek için ofisimize site visitlerde bulundular.  XTM bu başarısını 2014 de rakamlarla da ispatladı ve oldukça karlı bir yatırım olacağının sinyallerini de vermiş oldu.

Bu tarz projeler ülkemiz adına da büyük bir kazanç ve devletin de bu ar-ge projemizi destekliyor olması oldukça sevindirici.  Emeği geçen herkesin ellerine sağlık. Umarım ekibimizde çok daha büyük işlere imza atarız.
IMG-20150615-WA0000

XTM ile bir çok fuara ve seminere katıldık, ödüller aldık.
Büyük Firma Dalında Yenilikçiliğin Ticarileştirilmesi Ödülü –  http://www.tesid.org.tr/tsd/ttPage.asp?pageID=213#sthash.REiCOJaB.dpuf
SIBOS – https://www.sibos.com/exhibition/about-exhibition/exhibitors/kuveyt-turk-participation-bank-rd-center
CEBIT  – http://www.cebitbilisim.com
CNR EXPO Ar-ge fuarı – http://cnrexpo.com

XTM ile ilgili daha detaylı bilgi için aşağıdaki linkleri ziyaret edebilirsiniz.
http://www.kuveytturk.com.tr/xtm.aspx
http://architecht.com/en/products/xtm




Haziran 15, 2015 Posted by | Ödeme Sistemleri, Yazılım, Yaşam | , , | Yorum bırakın

WPF Threading Modeli

Yazılım geliştirirken hep şu thread’ler başımın belası olmuştur. Öldürürsün ölmez,  açık kalır, debug ederken sıkıntı, memory şişer bulurken göbeğin çatlar, Pool’a at geri çağır sürekli hep sıkıntı yaratır. Bu dezavantajları olmasına rağmen onsuz da olmuyor ne yazık ki.  Neyseki Microsoft WPF ile birlikte thread kullanımını bana bırak sen business’a odaklan demeye başladı. Çünkü aslında hayal ettiğimiz birinci resimdeki gibi olmasına rağmen, gerçekleşen ne yazık ki ikinci resimdeki gibi olabiliyor :)

HAYALİMDEKİ MULTITHREADING                           ASLINDA OLAN MULTITHREADING
thread1               Thread2
WPF de temel olarak geri planda 2 thread bulunmakta; birisi rendering için diğeri UI’ı yönetmek için kullanılır.
Rendering thread UI’a veri getirirken, ekrana çizim yaparken, eventler’i handle ederken devreye girer.  UI Thread’i ise genellikle 1 tane olur, bazı durumlarda birden fazla da olabilir.

UI Thread’i çalışacak parçaları Dispatcher denen bir nesnede kuyruğa sokar ve öncelik sırasına göre çalıştırır. HEr bir UI threadi en az bir Dispatcher, ve herbir Dispatcher iş parçacıkları sadece 1 thread de çalıştırabilir. WPF de çoğu nesne DispatcherObject sınıfından türer.

Yazdığımız programın müşterileri memnun etmesi için tabi ki müşterinin her butona bastığında, her işlem yaptığında programın hızlıca cevap vermesi gerekiyor ve buradaki anahtar nokta da Dispatcher kuyruğuna atılacak iş parçacıklarının küçük olmasıdır, bu yöntem ile iş parçacıklarını kuyrukta fazla bekletmemiş oluruz.

Genel mantık olarak uzun sürecek işlemleri ana UI thread’inde değil ayrı bir thread de yapmamız gerekiyor. Eskiden windows uygulamaları yazarken bir UI nesnelerine sadece onu oluşturan thread üzerinden erişebilirken, WPF ile birlikte farklı thread’lerden de UI nesnelerini güncelleyebiliyoruz. Örneğin bir datagridi ana thread’den bağımsız olarak arka planda güncelleyebiliyor olmak büyük veriler ile çalışırken çok faydalı olacaktır. WPF bunu ana UI thread’inin dispatcherına iş parçacıkları register ederek sağlıyor. Dispatcher.Invoke, Dispatcher.BeginInvoke metodları bu register işlemini yapar. Invoke senkron, BeginInvoke asenkron çalışır. Bunların önceliklerini de DispatcherPriority enumu ile belirtebilirsiniz.

Örnek kullanım : Yeni bir thread açarak dispatcher invoke yöntemiyle UI daki listbox ekran kilitlenmeden doldurulabiliyor.

Thread tt = new Thread(FillListBox);
tt.Start();

private void FillListBox()
{
for (int i = 0; i < 500; i++)
{
listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate()
{
listBox1.Items.Add(“A” + i.ToString());
});

Thread.Sleep(100);

}
}

Mayıs 28, 2015 Posted by | C#, WPF | , , , , | Yorum bırakın

C# ile Video Recorder

Merhabalar, bir ihtiyaç neticesinde bilgisayarın ekran görüntüsünü video şeklinde kaydetme ihtiyacım oldu. Çözümü microsoftun bir dll i sayesinde oldukça kolaylaştı.   Microsoft.Expression.Encoder.ScreenCapture ‘ı projemize referans verdikten sonra aşağıdaki kod yardımı ile ekranın videosunu çekmeye hemen başlayabiliyorsunuz.  İster ekranın tamamını ister bir bölümünü alabilirsiniz. Videonun kalitesini ve saniyedeki frame sayısı gibi özelliklerini set edebilirsiniz.

Bu linkten dll’i download edebilirsiniz.

Rectangle _screenRectangle = Screen.PrimaryScreen.Bounds;
 ScreenCaptureJob _screenCaptureJob = new ScreenCaptureJob();
 _screenCaptureJob.CaptureRectangle = _screenRectangle;
 _screenCaptureJob.ShowFlashingBoundary = true;
 _screenCaptureJob.ScreenCaptureVideoProfile.FrameRate = 20;
 _screenCaptureJob.CaptureMouseCursor = true;

 _screenCaptureJob.OutputScreenCaptureFileName = string.Format(@"C:\test.wmv");
 if (File.Exists(_screenCaptureJob.OutputScreenCaptureFileName))
 {
 File.Delete(_screenCaptureJob.OutputScreenCaptureFileName);
 }
 _screenCaptureJob.Start();</pre>
<pre>

Aralık 13, 2014 Posted by | C#, Yazılım | , , , , | Yorum bırakın

C# Ftp sınıfı

Aşağıdaki sınıf ile c# da FTP upload, download, delete gibi işlemleri yapabilirsiniz.

public class FTP
    {
        private string host = null;
        private string user = null;
        private string pass = null;
        private FtpWebRequest ftpRequest = null;
        private FtpWebResponse ftpResponse = null;
        private Stream ftpStream = null;
        private int bufferSize = 2048;

        public FTP(string hostIP, string userName, string password)
        {
            host = hostIP; user = userName; pass = password;
        }

        public void Download(string remoteFile, string localFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                FileStream localFileStream = new FileStream(localFile, FileMode.Create);
                byte[] byteBuffer = new byte[bufferSize];
                int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                try
                {
                    while (bytesRead > 0)
                    {
                        localFileStream.Write(byteBuffer, 0, bytesRead);
                        bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                    }
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                localFileStream.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Download: ",ex);
            }
            return;
        }

        public void Upload(string remoteFile, string localFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                ftpStream = ftpRequest.GetRequestStream();
                FileStream localFileStream = new FileStream(localFile, FileMode.Create);
                byte[] byteBuffer = new byte[bufferSize];
                int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                try
                {
                    while (bytesSent != 0)
                    {
                        ftpStream.Write(byteBuffer, 0, bytesSent);
                        bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                    }
                }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
                localFileStream.Close();
                ftpStream.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Upload: ", ex);
            }
            return;
        }

        public void Delete(string deleteFile)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + deleteFile);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Delete: ", ex);
            }
            return;
        }

        public void Rename(string currentFileNameAndPath, string newFileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + currentFileNameAndPath);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.Rename;
                ftpRequest.RenameTo = newFileName;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP Rename: ", ex);
            }
            return;
        }

        public void CreateDirectory(string newDirectory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)WebRequest.Create(host + "/" + newDirectory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse.Close();
                ftpRequest = null;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP CreateDirectory: ", ex);
            }
            return;
        }

        public string GetFileCreatedDateTime(string fileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + fileName);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.GetDateTimestamp;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string fileInfo = null;
                try
                {
                    fileInfo = ftpReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP GetFileCreatedDateTime1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                return fileInfo;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP GetFileCreatedDateTime2: ", ex);
            }
            return "";
        }

        public string GetFileSize(string fileName)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + fileName);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string fileInfo = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        fileInfo = ftpReader.ReadToEnd();
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP GetFileSize1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                return fileInfo;
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP GetFileSize2: ", ex);
            }
            return "";
        }

        public string[] DirectoryListSimple(string directory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string directoryRaw = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        directoryRaw += ftpReader.ReadLine() + "|";
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListSimple1: ", ex);
                }
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                try
                {
                    string[] directoryList = directoryRaw.Split("|".ToCharArray()); return directoryList;
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListSimple2: ", ex);
                }
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP DirectoryListSimple3: ", ex);
            }
            return new string[] { "" };
        }

        public string[] DirectoryListDetailed(string directory)
        {
            try
            {
                ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + directory);
                ftpRequest.Credentials = new NetworkCredential(user, pass);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
                ftpStream = ftpResponse.GetResponseStream();
                StreamReader ftpReader = new StreamReader(ftpStream);
                string directoryRaw = null;
                try
                {
                    while (ftpReader.Peek() != -1)
                    {
                        directoryRaw += ftpReader.ReadLine() + "|";
                    }
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListDetailed1: ", ex);
                }
                /* Resource Cleanup */
                ftpReader.Close();
                ftpStream.Close();
                ftpResponse.Close();
                ftpRequest = null;
                /* Return the Directory Listing as a string Array by Parsing 'directoryRaw' with the Delimiter you Append (I use | in This Example) */
                try
                {
                    string[] directoryList = directoryRaw.Split("|".ToCharArray());
                    return directoryList;
                }
                catch (Exception ex)
                {
                    LogManager.Log("FTP DirectoryListDetailed2: ", ex);
                }
            }
            catch (Exception ex)
            {
                LogManager.Log("FTP DirectoryListDetailed3: ", ex);
            }
            return new string[] { "" };
        }
    }

Nisan 2, 2014 Posted by | C#, Yazılım | , , , , | 1 Yorum

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Bazı C# projelerinde unmanaged kodlar kullanmak durumunda kalabiliyoruz. Managed kod demek hafıza yönetimi(memory management) yonetilen demek oluyor.Oluşturduğumuz değişkenlerin yok edilmesi işini kullandığımız sistem(FrameWork, Programlama dili.) yapıyor demektir. Bir değişkeni tanımladığımızda bir süre kullanılmadığında bunu otomatik olarak GAC(Garbage Collector) tarafından hafızadan silinir. Bu yönetilen koda bir örnektir. “Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt” hatasını da unmanaged kodu debug modda çalıştırdığımızda almıştım. Biraz araştırdım ve bunu Visual Studio da basit bir ayar yaparak geçebileceğimi öğrendim. Tools menu -> Options -> Debugging -> General  menüsüne girerek “Suppress JIT optimization on module load” check’ini kaldırıyoruz.   suppress

Nisan 1, 2014 Posted by | C#, Yazılım | , , | Yorum bırakın

C# ile Resim Sıkıştırma

Uzun zaman resim sıkıştırmak için araştırdıktan sonra işime en çok aşağıdaki kod parçası yaradı. 4 MB lık bitmap bir resmi, 10KB a kadar düşürebiliyor. Umarım işinize yarar.

 /// <summary>
        /// Method to resize, convert and save the image.
        /// </summary>
        /// <param name="image">Bitmap image.</param>
        /// <param name="maxWidth">resize width.</param>
        /// <param name="maxHeight">resize height.</param>
        /// <param name="quality">quality setting value.</param>
        /// <param name="filePath">file path.</param>      
        public static Image ResizeImage(Bitmap image, int maxWidth, int maxHeight, int quality, string filePath)
        {
            // Get the image's original width and height
            int originalWidth = image.Width;
            int originalHeight = image.Height;

            // To preserve the aspect ratio
            float ratioX = (float)maxWidth / (float)originalWidth;
            float ratioY = (float)maxHeight / (float)originalHeight;
            float ratio = Math.Min(ratioX, ratioY);

            // New width and height based on aspect ratio
            int newWidth = (int)(originalWidth * ratio);
            int newHeight = (int)(originalHeight * ratio);

            // Convert other formats (including CMYK) to RGB.
            Bitmap newImage = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb);

            // Draws the image in the specified size with quality mode set to HighQuality
            using (Graphics graphics = Graphics.FromImage(newImage))
            {
                graphics.CompositingQuality = CompositingQuality.HighQuality;
                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode = SmoothingMode.HighQuality;
                graphics.DrawImage(image, 0, 0, newWidth, newHeight);
            }

            // Get an ImageCodecInfo object that represents the JPEG codec.
            ImageCodecInfo imageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg);

            // Create an Encoder object for the Quality parameter.
            Encoder encoder = Encoder.Quality;

            // Create an EncoderParameters object. 
            EncoderParameters encoderParameters = new EncoderParameters(1);

            // Save the image as a JPEG file with quality level.
            EncoderParameter encoderParameter = new EncoderParameter(encoder, quality);
            encoderParameters.Param[0] = encoderParameter;
            newImage.Save(filePath, imageCodecInfo, encoderParameters);

            return Image.FromFile(filePath);
        }

        /// <summary>
        /// Method to get encoder infor for given image format.
        /// </summary>
        /// <param name="format">Image format</param>
        /// <returns>image codec info.</returns>
        private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
        {
            return ImageCodecInfo.GetImageDecoders().SingleOrDefault(c => c.FormatID == format.Guid);
        }

Mart 21, 2014 Posted by | C# | , , , , | Yorum bırakın

Visual Studio Varsayılan Ayarlar

Merhabalar, kurduğum bir eklenti yüzünden visual studio intelisense özelliği girmişti. Çözümü de oldukça basit. Visual Studio varsayılan ayarlara geri dönmek için Tools->Import and Export Settings e tıklayıp Restore all settings demeniz yeterli.

Untitled

Mart 20, 2014 Posted by | C# | , | 1 Yorum