Uzman TV ile yaptığımız Sql röportajlarında bana sordukları sorular ve cevaplarım;
SQL nasıl bir veritabanı dilidir? (SQL nasıl ortaya çıktı? Kim tarafında bulundu? Veritabanı nedir?)
Önce veritabanı ne demektir, ondan bahsetmek lazım. Veritabanı, bilgisayar ortamında bir düzen ile saklanan, programatik erişim imkanı bulunan, yönetilebilir, güncellenebilir, birbirleri arasında ilişkiler tanımlanabilir, bilgiler kümesidir.
SQL, ilk olarak IBM Research Center tarafından DB2 veritabanı ailesi için geliştirilmiştir. Daha sonra SQL dili, ANSI tarafından standartlaştırılmıştır.
Türkçe açılımı Yapılandırılmış Sorgu Dili anlamına gelmektedir. Verileri ve veri kümelerini modellemek ve yönetmek için kullanılır.
SQL, tanımlı anahtar kelimelerden oluşturulan sql cümleleri ile, veritabanına kayıt ekleyebilir, güncelleyebilir, silebilir veya varolan kayıtları listeleyebilir.
Microsoft Sql Server, Oracle ve hatta Access kendi SQL cümle yapısına yani diyalektiğine sahiptir.
Hangi tür şirketler SQL’den yararlanabilir? (Veritabanı uygulamalarını tercih eden firmalar nelerdir? SQL kullanması gereken uygulamalar hangileri?)
Günümüzde bilgisayar ve dolayısıyla yazılım kullanmayan, bunlara ihtiyaç olmayan iş kolu kalmadı. Ne kadar küçükte olsa, ne kadar büyükte olsa, her alandaki her firmanın mutlaka bilgisayar ve yazılım kullan birimleri vardır.
Genelde firmalar, kullandıkları bilgisayar programlarının verileri güvenli bir ortamda kaydetmesini, daha sonra aradığında bulabilmesini, gerekirse analiz edebilmesini, yaptığı analize ilişkin raporlar üretebilmesini beklemektedir.
Veritabanı uygulamaları kullanmadan böyle bir işlevselliği sağlayabilmek olanaksız olmasa da çok zor olacağından, hemen hemen tüm firmaların bir veritabanı yönetim sistemine ihtiyacı vardır diyebiliriz.
Bu açıdan bakacak olursak, ticari değer taşıyan hemen hemen tüm uygulamaların ve web sitelerinin veritabanına ihtiyacı vardır.
Şirketler kendilerine uygun veritabanı uygulamasını nasıl seçmeli? (Küçük ve orta ölçekli şirketler açık yazılımlar mı tercih etmeli? Veritabanı desteği veren firmalar var mı?)
Küçük ve orta şirketli firmalar genel de ücretsiz olan açık kaynak kodlu veritabanı yönetim sistemlerini tercih etmektedirler.
Daha büyük ölçekli firmalar ise, hem donanım, hem işletme, hem de personel maliyetlerini göze alabilerek, ücretli veritabanı yönetim sistemlerini tercih edebilirler.
Açık kaynak kodlu veritabanı yönetim sistemlerinin, genelde desteğini veren firma bulmak zordur. Örneğin, bugün piyasada MySql desteği veren firma bulmak hakikatten zordur.
Microsoft Sql Server, Oracle, IBM DB2 gibi veritabanı yönetim sistemlerinin ise, desteği üretici firmaların Türkiye acentelerinden edinilebilir.
Firmalar, Microsoft Sql Server’ın desteğini, Microsoft Türkiye’den, Oracle’ın desteğini Oracle Türkiye’den, IBM DB2’nun desteğini IBM Türkiye’den alabilirler.
Veritabanı uygulamaları arasında ne tür farklar var? (MySQL, Windows SQL gibi programlar nasıl karşılaştırılmalı? Eksik ve fazlaları nasıl değerlendirilmeli?)
Microsoft’un Microsoft Sql Server ve Sql Express uygulamaları, Oracle’ın Oracle uygulaması, IBM’in DB2 uygulaması, gene Microsoft’un Access uygulaması ve açık kod olan MySQL uygulaması veritabanı yönetim sistemlerine örnektir.
Bu veritabanı yönetim sistemleri içinde ücretsiz olanlar vardır; Microsoft’un Sql Express versiyonu gibi. Bu ücretsiz veritabanı yönetim sistemleri genelde bazı kısıtlara sahiptirler. Örneğin, sunucunun hafızasının ve işlemcisinin sadece belli bir miktarını kullanabilirler, belli boyuta kadar veri saklayabilirler, gibi.
Ölçeklendirecek olursak, “büyük” ölçekli diyebileceğimiz Microsoft Sql Server, Oracle, IBM DB2 gibi veritabanı yönetim sistemleri, hem satın alma anlamında, hem de çalışmak için ihtiyaç duyduğu donanım ve yönetim için için gerekli personel maliyeti anlamında pahalıdır.
Bunların yanında MySql gibi, açık kaynaklı yazılımlar sayesinde, düşük maliyetli veritabanı yönetim sistemi sahibi olunabilir.
Bilgisayarın network aktivitesini ölçmemiz gerektiğinde, bu görevi gerçekleştirecek bir yazılım geliştirebiliriz.
Yapmamız gereken Windows’un Performance Counter listesinden doğru sayaçları okumak. Bu yazımda böyle bir uygulama geliştireceğim.
Öncelikle bilgisayarda bulunan ağ arayüzlerinin listesini alalım;
string[] NetworkAdapter = new PerformanceCounterCategory(“Network Interface”).GetInstanceNames(); /// ağ arayüzlerinin listesi</pre>
Şimdi System.Diagnostics namespace’inde yeralan PerformanceCounter sınıfından yeni bir örnek çıkartıp, doğru sayaçlardan bilgi okuyabiliriz.
Bilgisayarın ağ üzerinden yaptığı download ve upload miktarını ölçmek için, Network Interface isimli Performance Counter‘ın Bytes Received ve Bytes Sent isimli sayaçlarını kullanacağız.
PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]); PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);
NetworkChange sınıfının static üyelerinden NetworkAvailabilityChanged event‘ine bir delegate method atayarak, bilgisayarın ağ bağlantı durumunda değişiklik olunca farketmesini sağlayabiliriz.
Yazdığımız uygulamada her 10 saniye’de bir bilgisayarın download ve upload miktarını ekrana yazacak olalım;
Timer t = new Timer(10000); /// 10 saniye NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise { t.Start(); ///başla } else { t.Stop(); /// dur } };
Timer nesnesinin Elapsed event‘inde de ekrana download ve upload miktarı bilgilerini yazacağız;
t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) { Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz };
Örnek uygulamanın tüm kodu;
using System; using System.Net.NetworkInformation; using System.Timers; using System.Diagnostics; class Program { static void Main(string[] args) { string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// network kartlarının listesi PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]); PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]); Timer t = new Timer(10000); /// 10 saniye t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) { Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz }; NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise { t.Start(); ///başla } else { t.Stop(); /// dur } }; t.Start(); Console.ReadLine(); } }
Özellikle raporlama uygulamalarında, aylık dönemlere ait sorgulama yapılırken ilgili ayın ilk ve son günlerinin bilinmesi gerekir.
C# uygulamamızda, yazacağımız basit iki tane extension method ile ayın ilk ve son günlerini bulan kodu basitleştirebiliriz.
public static class ExtensionMethods { public static DateTime AyinIlkGunu(this DateTime dt) { return new DateTime(dt.Year, dt.Month, 1); }
public static DateTime AyinSonGunu(this DateTime dt)
{
return dt.AyinIlkGunu().AddMonths(1).AddDays(-1);
} }</pre>
Extension Method‘ların kullanımı;
static void Main(string[] args) { DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu(); DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu(); DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu(); DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu(); }
Örnek kodun tamamı;
using System; class Program { static void Main(string[] args) { DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu(); DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu(); DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu(); DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu(); } } public static class ExtensionMethods { public static DateTime AyinIlkGunu(this DateTime dt) { return new DateTime(dt.Year, dt.Month, 1); } public static DateTime AyinSonGunu(this DateTime dt) { return dt.AyinIlkGunu().AddMonths(1).AddDays(-1); } }
Windows uygulamalarınız üzerinden e-posta gönderebilmek güzel bir özellik.
Uygulama içerisinden e-posta gönderme konusunda ilk akla gelen sorulardan bir tanesi, “GMail üzerinden e-posta gönderebilir miyim?” oluyor.
Bu yazımda, GMail üzerinden e-posta gönderebileceğimiz bir uygulama geliştireceğim.
Öncelikle kodumuzun using kısmına System.Net ve System.Net.Mail namespace’ini eklememiz gerekiyor.
.Net Framework, System.Net.Mail namespace‘i içerisinde çeşitli class‘lar aracılığı ile uygulamanız içerisinden kolaylıkla e-posta gönderilmesini mümkün kılıyor.
using System.Net.Mail; using System.Net;</pre> İlk yapmamız gereken, SmtpClient sınıfından bir örnek oluşturmak ve bazı özelliklerini ayarlamak.
SmtpClient sc = new SmtpClient(); sc.Port = 587; sc.Host = "smtp.gmail.com"; sc.EnableSsl = true;
Port özelliği ile, Smtp sunucusuna erişeceğimiz port numarasını belirliyoruz
Host özelliği ile, GMail Smtp sunucusunun adresini belirliyoruz
EnableSsl özelliği ile, GMail Smtp sunucusuna bağlanacağımız protokolu belirliyoruz. Eğer true değer atarsak https, eğer false değer atarsak http protokolü kullanılır.
GMail e-posta adresimizi ve şifremizi, Credentials özelliğine NetworkCredential sınıfından bir örnek ile atamamız gerekiyor.
sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre");
SmtpClient örneği üzerinden gönderilecek posta, MailMessage tipinde olmalıdır. Bir sonraki adımda MailMessage sınıfından bir örnek oluşturuyoruz.
MailMessage mail = new MailMessage(); mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim"); mail.To.Add("alici1@mail.com"); mail.To.Add("alici2@mail.com"); mail.CC.Add("alici3@mail.com"); mail.CC.Add("alici4@mail.com"); mail.Subject = "E-Posta Konusu"; mail.IsBodyHtml = true; mail.Body = "E-Posta İçeriği"; mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx")); mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx"));
Son olarak, SmtpClient sınıfının Send() method’unu kullanarak, oluşturduğumuz MailMessage örneğini gönderiyoruz.
sc.Send(mail);
Kodların toparlanmış hali;
using System; using System.Net.Mail; using System.Net; class Program { static void Main(string[] args) { SmtpClient sc = new SmtpClient(); sc.Port = 587; sc.Host = "smtp.gmail.com"; sc.EnableSsl = true; sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre"); MailMessage mail = new MailMessage(); mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim"); mail.To.Add("alici1@mail.com"); mail.To.Add("alici2@mail.com"); mail.CC.Add("alici3@mail.com"); mail.CC.Add("alici4@mail.com"); mail.Subject = "E-Posta Konusu"; mail.IsBodyHtml = true; mail.Body = "E-Posta İçeriği"; mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx")); mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx")); sc.Send(mail); } }
Sql Server ile nasıl hash yapabileceğimizi daha önce Sql Server’da Hash işlemi isimli makalemde yazmıştım. Bu sefer, .net üzerinde C# ile nasıl hash işlemi yapabileceğimizi yazacağım.
Hash, büyük boyutta girdi verisi için sabit boyutlu üretilen benzersiz değerdir. Hash algoritmalarının yapısından dolayı, girdi verisindeki küçük değişiklikler sonuç verisinde büyük farklılıklara yol açmaktadır.
.Net Framework üzerinde bulunan System.Security.Cryptography namespace’i, güvenli şifreleme ve çözme işlemleri için şifreleme servislerini barındırır.
.Net Framework şu hash algoritmalarını destekler;
MD5, girdi verisini şifrelemek için 128 bit şifreleyici kullanır ** SHA1, girdi verisini şifrelemek için **160 bit şifreleyici kullanır ** SHA256, girdi verisini şifrelemek için **256 bit şifreleyici kullanır ** SHA384, girdi verisini şifrelemek için **384 bit şifreleyici kullanır ** SHA512, girdi verisini şifrelemek için **512 bit şifreleyici kullanır
En çok kullanılan şifreleme yöntemlerinden biri SHA1‘dir.
SHA1 Hashing Algoritması Örneği
Öncelikle kod yazdığımız dosyanın using kısmına System.Secuity.Cryptography namespace’ini eklemeliyiz;
using System.Secuity.Cryptography;</pre> SHA1 sınıfından bir örnek oluşturalım;
SHA1 sha = new SHA1CryptoServiceProvider();
SHA1 sınıfı abstract bir sınıf olduğu için kendisinden örnek oluşturamıyoruz. SHA1 sınıfından türetilen SHA1CryptoServiceProvider sınıfından bir örnek oluşturuyoruz.
Artık yapmamız gereken, sha isimli değişkenimizin ComputeHash() method’unu çağırmak. ComputeHash() method’u, şifrelenecek veriyi parametre olarak byte dizisi aldığı ve geriye şifrelenmiş veriyi byte dizisi olarak döndürdüğü için aşağıdaki örnekte olduğu gibi kullanabiliriz;
string SifrelenecekVeri = "http://www.enginpolat.com/"; string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));
Uygulamanın kodlarının toparlanmış hali;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; class Program { static void Main(string[] args) { SHA1 sha = new SHA1CryptoServiceProvider(); string SifrelenecekVeri = "http://www.enginpolat.com/"; string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri))); Console.WriteLine(SifrelenmisVeri); Console.ReadLine(); } } Yukarıdaki örneği çalıştırırsanız şifrelenmiş çıktı şöyle olacaktır; *8hocM3G7QhUoN7Nm3bWMSr0/SsM=*
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484