Koray Kırdinli

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

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

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

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

C# da object initializer kullanımı

Object initializer C# 3.0 ile birlikte hayatımıza girdi. Object initializer kullanmak hem daha okunaklı hem de daha güvenli bir kod yazma yöntemi sunuyor.

Aşağıda object initializer ve normal yollarla yaratılan 2 nesne örneği bulunmakta. Klasik yöntem kullanırsak multithread uygulamalarda nesnenin parçalı olarak yaratılma ihtimali var. Bunu engellemek için ayrıca lock koymak gerekir. Ancak object initializer ile nesneler yaratıldığında bu risk ortadan kalkar.

Bir nesnenin object initializer ile yaratılması :

StudentName student = new StudentName
{
FirstName = "Koray",
LastName = "Kırdinli",
ID = 116
};

Nesnenin klasik yöntem ile yaratılması.

StudentName _tempStudent = new StudentName();
_tempStudent.FirstName = "Koray";
_tempStudent.LastName = "Kırdinli";
_tempStudent.ID = 488;
StudentName student = _tempStudent;

Aşağıdaki linkte olayı kavramak için güzel bir örnekten faydalanılmış.
http://community.bartdesmet.net/blogs/bart/archive/2007/11/22/c-3-0-object-initializers-revisited.aspx

Şubat 18, 2014 Posted by | C# | , , | Yorum bırakın

Binding failed because intellisense is out of date Hatası

Bir sınıf ismi veya değişken ismini değiştirdiğinizde Visual Studio altını kırmızı çiziyor ve o çizginin üzerine geldiğinizde bize rename etmek için seçenek sunuyor.

Untitled

 

Bunu yaptığınızda “Binding failed because intellisense is out of date” hatası alırsanız, önce projeyi clean yapıp rebuild yapın, yine olmazsa Visual Studio yu açıp kapayın.

 

Ocak 22, 2014 Posted by | C# | , , | Yorum bırakın

Kod ile istenilen kontrole event fırlatmak.

Bu örnekte koddan manuel event fırlatma ihtiyacınız olduğunda kullanabileceğiniz küçük bir metod paylaşıyorum. Aşağıdaki örnekte textbox’a sanki 1 tuşana basılmış gibi bir event fırlatıyoruz. Bu metod ile Keyboard nesnesi üzerindeki istediğimiz herhangi bir eventi fırlatabiliriz. Umarım bir yerlerde işinize yarar.

//Event Çağrılıyor.
currentTextbox.RaiseManuelEvent("1", Keyboard.KeyDownEvent);

public void RaiseManuelEvent(string charToSend, RoutedEvent routedEvent)
{
var key = GetKey(charToSend);   // Key to send
var target = XText;    // Target element
//var routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key) { RoutedEvent = routedEvent }
);
}

//Stringden Key değerini bulan metod.
private Key GetKey(string value)
{
KeyConverter k = new KeyConverter();
Key key = (Key)k.ConvertFromString(value);
return key;
}

Eylül 9, 2013 Posted by | C# | , , | Yorum bırakın

C# ile Sertifika Yüklemek

Merhaba arkadaşlar ,

Geçenlerde bir projemde dış firmanın bizim DMZ üzerinden bir web servise erişmesi gerekiyordu. Güvenlik yöntemi olarak sertifika kullandık. Servera bir web servis publish ettik localimden ilk önce web servisin metodunu çağırabiliyordum . Ne zamanki sunucu IIS’inde sertifika ayarları yapıldı aşağıdaki hatayı almaya başladık. Neyseki çözümü basit. “The request failed with HTTP status 403: Forbidden.”

Aşağıdaki kod ile servis metodunu hata almadan çağırabiliyoruz.

WebApplication1._Web_Service.TestWebService request = new _Web_Service. TestWebService();

WebProxy proxy = new WebProxy();

request.Credentials = CredentialCache.DefaultCredentials;

request.Proxy = proxy;

string certPath = @”C:test.cer”;

request.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath));

request.CallTestMethod();

Ekim 10, 2011 Posted by | C# | , , , | Yorum bırakın

Kodlama Pratikleri

 Bu yazıda aklımızda bulundurmamız gereken bazı kodlama pratiklerini maddeler halinde sıralayacağım.Kod yazarken sürekli aklımızın bir köşesinde bulundurmamız gerekir sizlerinde tavsiyeleri varsa yorumları bekliyorum.
-İlk önce değişken ve kontrollere isim verirken anlamlı isimler vererek başlayabiliriz.Örneğin sayıların toplamını tutmak için bir integer sayıyı int x yerine , int _toplam şeklinde yazmalıyız veya bir forma Form1 yerine frmAnasayfa.
– Örneğin bir design perceresine (winform olabilir webform da) veritabanından çektiğimiz verileri getiriyoruz.Buradaki yaklaşımımız txtAdi = ds.Tables[0].Rows[0][“kolon_adi”].ToString() olmamalı.Bunun yerine formun arkaplanına sınıf döndüren bir alt DAL katmanı olmalı ve sadece txtAdi = entity.Adi; demeliyiz.Reflection metodu ile dinamik bir şekilde bir datarowdaki kolonları sınıf propertylerine map edebiliriz. UI katmanı içerisinde kesinlikle sql cümleleri yazmayın.
– İş katmanında bir metoda parametre olarak Dataset yollamak ve dataseti fonksiyon içinde parse etmek te yanlış bir tercih olacaktır.Bunun yerine datasetin sınıfa dönüştürülmüş halini metoda yollamalıyız.Çünkü İş katmanındaki bir metod veritabanındaki alan adını harfiyen bilmek zorunda değildir.Ayrıca bu tarz bir yaklaşım veritabanındaki kolon ismi değiştiğinde de çok fazla sayıda metodun değişmesi ve değişim maliyetinin artması demektir.
-Uzun metodlarda bazen aralara //açıklama ‘lar serpiştiririz.Bunun yerine bu metodu alt metodlara bölüp aciklayıcı birer isim verip çağırmak daha sağlıklı.Çok fazla açıklamalarla kodu kirletmemeliyiz.
Bir metodun uzunluğu 80 satırı geçmemesine özen gösterelim.
– Standart sık olarak kullanılan method ve sınıfları bir class library projesi altında toplanarak yeni bir projeye başlarken aynı kodları tekrar tekrar yazmamış oluruz. Örneği stringi tarihe çevirme , excelden okuma , şifreleme , DataAccessLayer vs.vs. Bu yapılan projeyi iyice test edilirse her bir case için hem kalitemiz artar hem de hızımız.
– Bir sınıf sadece bir görevi yerine getirecek şekilde tasarlanmalı.Örneğin sınıf hem dinamik sql oluşturup hem de veritabanına bağlantı sağlamamlı.Her sınıf sadece bir işi ihtiva etmeli.
– Projeyi her zaman 3 katmanlı olarak geliştirmeye özen gösterilmeli.Veritabanı işlemleri DAL , hesaplama gibi işlemler business ve Presentation katmanı. Örnek proje.Core dlli , proje.DAL dll’i ve projenin UI si.
– Kıyaslama gerektiren yerlerde string veya sayılardan faydalanmak yerine Enumaration kullanmak gerekir.Bunu yapmak kodun okunurluğunu artırır.
– Tekrarlayan kod olduğunu farkettiğiniz an Design Patternlerden faydalanarak refactoring yapın.
– Yazmak istediğiniz bir sınıfı önce netten araştırın daha önce bunu nasıl yapmışlar , bulabilirseniz başkasının kodundan da kendinize birşeyler çıkartabilirsiniz.Bir başkasının kodunu okuyabilmek çok önemlidir.
– Örneğin bir veri tabanı bağlantısını açıyorsak herhangi bir hatada connectionın kapanmasını garanti altına almak için finally blogunda yapmalıyız veya using ifadesi ile işlemi yaptırmalıyız.
– Örneğin bir form üzerinde bazı kontroller yaptırmak istiyorsunuz,Eğer adı text boxı boş ise uyarı versin veya daha önce aynı isim soyisim varsa uyarı versin.Bu tür işlemlerde bir alt ara sınıf kullanarak iş katmanı ile gösterim katmanı ayrılmalıdır. Kontrol uyarılarını iş katmanı vermelidir. Bunu da bir interface IView ve class Presenter ile yapabiliriz.Böylece aynı sınıfı web ortamından windows ortamına taşımak son derece kolaylaşır ve gösterim katmanında gereksiz kod kalabalığı olmaz.KAYNAK : http://www.cihataltuntas.com/?p=204#comments
-Encapsulation : ASP.NET uygulamalarında her sayfada Session a değer atmak veya geri almak için tek tek Session[“data”]=12 gibi atama yapmak yerine Sessions diye bir sınıf oluşturup property kullanarak atama yapmak daha sağlıklı. Burada status’un arka planını saklamış olduk.

public static decimal status{get
{
if (HttpContext.Current.Session[“status”] == null) HttpContext.Current.Session[“status”] = 0;
return Convert.ToDecimal(HttpContext.Current.Session[“status”]); }
set { HttpContext.Current.Session[“status”] = value; }}

Tell Don’t Ask Principle bu method ile şunu yapıyoruz “sorma söyle”. Mantık olarak iki tane sınıfımız olsun birisi Banka diğeri de Müşteri. Müşteriler bankadan bankada para 1000 TL kalana kadar para çekebilirler.Bu karşılaştırmayı kim yapmalı müşteri mi yoksa Banka sınıfları mı. Eğer müşteri yaparsa bu bir hata olur. Çünkü her sınıf kendi görevini yapmakla mükelleftir.Bankada ne kadar para olduğu müşteriyi ilgilendirmez. Her sınıf kendi işini yapmadığı zaman yani bu kuralı çiğnediğimizde bir değişiklik için bir çok sınıf etkilenebilir tabi buda istenmeyen bir durumdur.
– High Coupling’i önlemek. Örneğin iki sınıfımız olsun. sinif1 ve sinif2. sinif2 sinif1 içerisinde ne kadar çok adı geçerse sinif2 ye olan bağımlılığı o kadar artar. NDepend gibi programlar sayesinde iki sınıf arasındaki bağımlılık derecesini öğrenebiliriz. İki sınıfın bağımlılığını önlemek için interface veya abstract sınıflar kullanılır.
– Windows formlarda veya web uygulamarında mutlaka basePage veya baseForm gibi bir yapı kullanın ki bütün formlara uygulamak istediğiniz bir özellik olursa tek tek hepsine uygulamak zorunda kalmayın. Örneğin ASP.NET sessiondan login kontrolü yapmak istiyorsunuz ve bunu her sayfada yapacak diyelim. Bunun içinpublicpartial class BasePage : System.Web.UI.Page { // todo } gibi bir türetme yaparak BasePAge in load eventini override ederek kullanabilirsiniz.

Örneğin 3 tip kullanıcınız var ve hepsinin ekran şekilleri farklı olacak. Bunun için bir base page ve bundan türeyen alt 3 base page yapıp ekranları standardize edebilirsiniz.

– Kendinizin fırlatacağı exceptionları (throw new Exception(“Not implemented”); kod içine exception açıklamasını yazmaktansa Resource.resx dosyalarına erroCode’larını ve karşılıklarını yazarak bu sınıftan exception fırlatmak daha sonra kodun yönetilmesi açısından esneklik sağlar. Örneğin throw new CoreException(100); gibi. Daha sonra bu exceptionın türkçesi istenirse sadece resource dosyasından değiştirilir ve bütün projeye uygulanmış olur.

– UNIT TESTS : Her bir metod için yazılacak birim testler hem metodun her bir case’de çalışmasını garanti eder. Örneğin bir stringi decimal’a çeviren bir metod yazdınız ve üzerinde bazı değişiklikler yaptınız bu metodu normalde bir çok yerde çalıştırıyorsunuz ve yanlış bir değişiklikte sistemin bir çok yeri çalışmaz hale gelecektir. Unit testlerde bu anlamda gelen input ve metodun vermesi gereken outputları tanımlanır.Örneğin 10 farklı input çeşitini metoda vererek bize vermesi gereken sonuçları test ederek olası hataların önüne geçilir.

– Windows veya web uygulaması yaptığımızı düşünelim bir butona tıklayınca bir işlem yaptıracağız diyelim ; işlem yapacak kodları butonun click eventi yerine bir fonksiyonda tanımlayıp butonun click eventinde bu fonksiyonu çağırabiliriz.

– Klasörler oluşturma : Belli amaca hizmet eden class’ları bir klasör altında toplayarak bir hiyerarşi sağlayabiliriz.

– Property’nin Gücünü kullan : Sınıflarda değişkenleri public yapmak işin kolayına kaçmaktır ancak daha sonra o değişken

ile ilgili bir kontrol veya herhangi bir işlem yapmak isterseniz işinizi zorlaştıracağınızı unutmayın. Bu gibi durumlarda property kullanın. Örnek bir Fatıra sınıfınız olsun ve Fatura Tarihi sistem tarihinden büyük olursa hata fırlatmasını istiyorsunuz. UI tarafında sınıfın property sine atama yapıldığı anda (SET) property içerisinde kontrolü yapıp exception fırlatabilirsiniz veya Loga yazdırabilirsiniz.

– İlerde lazım olur diye bir sınıf veya fonksiyon eklemeyin. Mantık kodumuz ne kadar sade olursa o kadar iyi.

– Fonsiyon ve sınıf isimlerini anlaşılır isimler verin bırakın uzun olsun : GetUserIdByUsernameAndPassword();

– İleri ve kurumsal düzey konulara eğilin. Ben biliyorum deyip bildiğinizi okumayın. Web services,.NET Remoting,WCF,delegate,test,assembly,culture,Threads,AppDomain,Process vs..

– String birleştirirken StringBuilder ve String.Format kullan.  Stringleri karşılaştırırken String.Compare metodlarını kullan.
Basit bir if else blogunundan sonra atama işlemi yapılacaksa  date = dr.Table.Columns.Contains(“kayit_tarihi”) == true ? TypeGenerator.ToDate(dr[“kayit_tarihi”]) : KayitTarihi; gibi bir kodlama daha kısa olur.

Aralık 12, 2009 Posted by | C# | , , | Yorum bırakın

Yeni Bilgisayar Mühendisinin Yol Haritası

            Bu makalemizde bilgisayar mühendisliği öğrencileri için iş hayatına girince neleri bilmek gerekir , hangi programlama alanına yönelmeliyim gibi sorulara cevap olabilecek bir takım konulara değineceğim. Çoğu bilgisayar mühendisi iş hayatına başlamadan önce eminim ki neleri öğrenirsem iş bulabilirim veya daha fazla kazanabilirim gibi sorular kendisine veya çevresindekilere soruyordur. Bende bu anlamda iş hayatında ilk etapta karşısına çıkacak konulara genel bir bakış açısıyla ışık tutmaya çalışacağım.

                Bilişim dünyası o kadar geniş bir  sektör ki gerçekten her şeyi dört dörtlük öğrenmenin imkanı yok. Yazılım mühendisliği , veritabanı yöneticisi , web programcısı , test uzmanı , proje yöneticisi ,  vs.vs. Türkiye’de bilgisayar mühendisliği tek bir iş yapmaz , işe başladığında iş neyi gerektirirse onu yapar.Tabi bu işin doğrusu bu değil ancak Türkiye’de bir çok yerde maalesef işler böyle yürüyor ve uzmanlaşmayı kişi ancak kendi gayretleriyle başarabiliyor.

                Öncelikle programlamayı dört ana başlıkta incelemekte yarar gördüm. Biz bir proje yapıyorsak bu ihtiyaca göre web , console,Windows veya mobil bir uygulama olabilir.Bunların neler olduğunu kısa kısa açıklayayım.

Console Uygulamaları : Belli bir sıraya göre ilerleyen , komut satırı görünümde çalışan uygulamalardır.Günümüzde hala üniversitelerde yeni başlayanlara console uygulamarı üzerinden algoritmalar anlatılmakta ki bu da yeni başlayan birisi için en uygunu. Örneğin C dili ile geliştirdiğimiz uygulamalar bunlara örnektir. Sistem kaynaklarını fazla tüketmediği için hızlı çalışır.

Windows Uygulamaları : Hepimizin bildiği üzere piyasada çok fazla kullanılan Windows ara yüzü olan uygulamalardır. Piyasada kullanımı çok yaygındır.Bir çok şirket kayıtlarını Windows uygulamaları ile tutmaktadır. Stok takip programları , muhasebe programları , en basitinden kullanmış olduğumuz winamp dahil Windows uygulamalarına örnek teşkil eder.

Web Uygulamaları : Web uygulamaları kabaca web browserı ile çalışan görünümünü HTML kodları ile belirleyen uygulamalardır.(Facebook , Yahoo,.. )Internet erişiminin yaygınlaşmasıyla artık web uygulamaları basit birer web sitesi olmaktan çıktı ciddi anlamda iş dünyasının ihtiyaçlarına cevap verir duruma geldi. Firmalar farklı lokasyonlardaki birimlerini ortak bir dille konuşturmak için çoğunlukla web uygulamalarını tercih ediyorlar. Web uygulaması bir servera yüklenip internet üzerinden erişim sağlıyor.

Mobil Uygulamalar : El bilgisayarında çalışan uygulamalardır. Örneğin restoranlarda garson siparişlerini el terminali ile alır ve merkeze direk aktarımını sağlar.Bu gibi uygulamalar için gayet kullanışlıdır.

 

Yukardaki şekil aslında bize şunu anlatıyor.Uygulamalar aslında her şekilde yapılabilir.Örneğin bir web sitesi yapacaksam ben bunu düz HTML kodları ile de yapabilirim , ASP.NET ve C# ile de yapabilirim , Java ile de yapabilirim , PHP ile de yapabilirim.Buradaki kilit nokta şu benim ne tür bir uygulamaya ihtiyacım var. Her dilin birbirine göre üstünlükleri var ve bazı diller bazı uygulamalar için daha uygun.Zaten iş hayatında ilk etapta dili seçme imkanınız olmayacak.Şirket neyi kullanıyorsa sizde onu kullanmak durumunda olacaksınız.Yanlız tavsiyem çoğu hakkında az da olsa bilgi sahibi olmanız.Zaten dillerin yapısı mantık itibari ile.Bir tanesini çok iyi bilmek diğerlerine geçişi kolaylaştırır.Yani bunları bilmem gerekiyor diye hepsine gece gündüz çalışmaya gerek yok ,  sadece birinde uzmanlaşmaya gitmek yeterli .İhtiyaç anında zaten ister istemez kısa bir sürede başka bir dile de adapte olacaksınız.

                Keşke işimiz dil öğrenmekle bitseydi.Uygulamaları anlamlı kılan içindeki verilerdir.Veri olmadan uygulamanın da bir anlamı yok.Örneğin bir fabrikanın üretimini takip etmek için bir yazılıma ihtiyacı var diyelim.Sizin çalıştığınız firmaya bir talepte bulundular.Bu firma bana şu şu şu raporları verebilecek bir yazılıma ihtiyacım var der asla C# ile yazılmış bir yazılım istiyorum demez.Müşteri için neyle yazıldığı değil ona neleri sunduğu önemlidir. Verilerde veritabanlarında tutulur.(SQL Server,Oracle,Access,Firebird,MySQL). Aslında yazılımcının işi yazılımın tasarımını,kodlamasını ve testini yapmak olmasına rağmen veritabanını tasarlamakta üstünüze kalabilir.O yüzden okul bitmeden en az bir veritabanı sistemi üzerinde detaylı olarak bilgilenin.

                Türkiye piyasası şartlarında .NET veya JAVA platformlarında bilgili olmak size kolay iş bulmanızda yararlı olacaktır.En popüler veritabanları ise kuşkusuz Oracle ve SQL Server. Ben işim gereği .NET konularıyla uğraşıyorum ve iş sadece C# öğrenmekle bitmiyor tabi ki yeri geliyor ASP.NET eri geliyor WPF yeri geliyor Silvirligt, AJAX .Belki Sharepoint,CSS,Javascript,Linq,Devexpress,LLBLGEN . İşin özü iş neyi gerektiriyorsa onu yapıyoruz aslında ve emin olun öğreneceğiniz konular meslek hayatınız boyunca bitmeyecek.Ben oldum demek gibi bir şey yok. İşte bu yüzden neyi öğrenmeniz gerektiğinizin kesin bir cevabı yok. Belki bundan seneler sonra çok farklı şeyler üzerine tartışıyor olacağız.Çünkü artık yeni çıkan araçlar ile kod yazmaktan giderek uzaklaştığımızı hissediyorum.

Nisan 26, 2009 Posted by | Yazılım | , , , , , , , , , , | Yorum bırakın