14.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Daha önce yazmış odluğum Logo API' ile ilgili yazıyı referans göstererek yazılmış bir çok e-posta alıyorum. Genelde e-posta içeriği SqlClause kullanımı ile alakalı olduğu için genel bir örnek yapıp burdan paylaşayım dedim.
Senaryomuz şöyle;
Logo üzerindeki bir carinin logo üzerindeki kodu ve ismini getiren bir sorgu yazmak istiyoruz. Bunun için de Logo api'sinde ki veritabanını bozmamak ve stabil, iyi sorgular oluşturmak için tasarlanmış SqlClause sorgu sınıfını kullanacağız. Bu sınıf'ı kullanarak yazdığınız sorgular kesinlikle logo'nun seveceği sorgular olup, sistem üzerinde herhangi bir probleme neden olmaz, kendileride zaten bu yöntemi öneriyorlar.
"Unity Object
kullanıcılara query yazmak için IQuery nesnesini sağlamıştır. IQuery nesnesi
ile Select tipindeki queryleri çalıştırmak hem çok kolay hemde çok hızlıdır.
Querylerle veri ilişkisini bozabileceğinden insert, update veya delete
tipindeki queryleri çalıştırma tavsiye edilmez, fakat IQuery nesnesi bu tür queryleri
çalıştırmanızada izin verecektir.
IQuery nesnesini kullanarak iki şekilde SQL cümleleri
oluşturabiliriz. İlk yöntem SQL cümlesini direct olarak Statement özelliğine
geçip OpenDirect veya Execute metodlarıyla çalıştırmak veya SQL Clause'lar
yardımıyla oluşturmak. Statement özelliğini kullanarak SQL cümlelerini
oluşturursak veri tabanına bağımlı hale geliriz. MS SQL Server için yazdığımız
bir sorgu ORACLE veya LBS UNITY programının desteklediği başka bir sunucuda
çalışmayabilir. Veri tabanına bağımlılığı ortadan kaldırmak için SQL Clause'lar
oluşturulmuştur. Clause'lar yardımıyla sorgumuzun belli kısımlarını tanımlar,
sorgunun birleştirilme kısmını UnityObject'e bırakırız. UnityObject
tanımlarımızı alır, UConfig programımızda belirtiğimiz veritabanı formatına
kendisi çevirir. Clauseları kullanmak biraz işyükü getirmekle beraber
veritabanı bağımlılığını ortadan kaldırır. Tanımladığınız sorgular LBS Unity
programının desteklediği ve ilerde destekleyebileceği ortamlara ek bir işlem
yapmanıza gerek kalmadan sorunsuz çevrilip çalıştırılacaktır"
Gelelim kod örneğine;
Ben .Net üzerinde C# kullanarak bir console uygulaması olarak geliştirdim.
class Program { static void Main(string[] args) { ARP_List(); }
static void ARP_List() { bool eof = false;
//COM bileşeni referansı oluşturuluyor UnityApplication unity = new UnityApplication(); if (unity.Connect()) { // Logo kullanıcısı ile giriş yapılıyor if (unity.UserLogin("LOGO_KULLANICISI", "SIFRE")) { // Hangi firma üzerinde işlem yapılacağı "firma no" ile belirleniyor. if (unity.CompanyLogin(310)) { //Yeni bir sql sorgusu çalıştırmak istediğimizi belirtiyoruz. Query qr = unity.NewQuery();
// Gerekli olan alanları (field) SelectClause ile belirtiyoruz. qr.SQLClause.SelectClause.New("A.CODE", "code"); qr.SQLClause.SelectClause.New("A.DEFINITION_", "def");
// Hangi tablo ile veri işleyeceğimizi belirtiyoruz. qr.SQLClause.FromClause.NewTable("LG_310_CLCARD", "A");
// Sorgumuzun kriterlerini belirtiyoruz. // Burda CODE'u 100'e eşit olan firmalar listeleniyor. qr.SQLClause.WhereClause.New("A.CODE", RelationalOperator.roEqual, "100", LogicalOperator.loNone);
//SQLClause ile oluşturulan sorgunun çıktısı Statement özelliğine atanıyor. qr.Statement = qr.SQLClause.SQL;
// Sorguyu çalıştırıyoruz. if (qr.OpenDirect()) { eof = qr.First(); //İlk kayıt isteniyor. Yoksa false döner;
//First(); ile alınan ilk kayıt bilgisi okunuyor. while (eof) { Console.WriteLine("{0}\t{1}", qr.QueryFields[0].Value, qr.QueryFields[1].Value);
eof = qr.Next(); // Sonraki kayıt isteniyor. Yoksa false döner; } }
11.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Yazılım
geliştirirken bizi sırtlayan programlama çatısının özelliklerini tek
tek ve çok ayrıntılı bilmemiz her zaman mümkün olmuyor, fakat bazı
özellikler var ki hem geliştirilen programın kalitesini, hem de
performansını büyük ölçüde etkileyebiliyor. Bu etkiyi C# programlama
dilinde yaratabilecek özelliklerden bir tanesi de Struct (Yapı) veri
tipidir ve konuda budur.
Bilindiği gibi Struct ile yapılabilen
her işlemi ve daha fazlasını Class ilede yapılabiliyor. Peki neden
Struct kullanalım? diye sorabilirsiniz. Aşağıda bu sorunun cevabını
kendi tecrübelerime dayanarak vermeye çalıştım.
Struct
bir değer türü olduğu için oluşturulduğunda Stack bellek bölgesinde
tutulur. Stack bellek bölgesinde yeni bir nesne tanımlamak ve nesneye
erişmek, class'ların tutulduğu Heap bölgesinden daha hızlıdır.
Programın
struct nesnesi ile işi bittiğinde Garbage Collector anında devreye
girip lazım olmayan struct nesnelerini temizler. Böylece siz programcı
olarak bu kaynağı işi bitti diye tekrar serbest bırakmak zorunda
kalmazsınız.
Algoritmanızda Birden fazla değişkeniniz varsa
bunları tek tek yönetmek yerine Struct ile bu değişkenleri tek bir
veritipi haline getirebilirsiniz.
Ben OOP'nin tüm
nimetlerinden yararlanmak istiyorum ama struct kadar performanslı da
olsun diyorsanız yine struct içinde method, constructor, değişken ve
indexleyici kullanabilrisiniz.
Struct, aynı class gibi private, public, internal, protected, protected internal değerlerini alabilir.
Struct'lar İçiçe tanımlanabilir (Nested Structure) hemde çok zevkli olur.
Tabi
Struct'ı her zaman kullanacağız diye bir şey yok, sadece işimize
geldiği zaman kullanalım. Bazı durumlarda da aşağıdaki nedenlerden
dolayı hiç kullanmamalıyız.
Struct'lar bir birlerinden türeyemez (Inheritance) ama birden fazla Interface'den türeyebilir.
Struct'lar
da yapıcı (Constructor) method varsayılan olarak parametresizdir ama
yinede siz kendi parametrik yapıcı metodlarınızı tanımlamayabilirsiniz.
Herhalükarda varsayılan yapıcı metod çalışacaktır.
Programınız içinde nesneler arası bağlantı, kompleks ilişkiler varsa struct kullanmamalısınız.
Struct'lar da statik üye tanımlayabilirsiniz ama nesneyi yarattıktan sonra erişemezsiniz.
Struct'lar
neredeyse her yönü ile Class'lara benzerler yalnız class'lardan biraz
daha kısıtlıdır ama daha da hızlıdır. Yukarıdaki maddeler size nerede
struct kullanmanız gerektiği hakkında az çok fikir verebilir ama doğru
karar vermeniz için tecrübeniz olması gerekir çünkü bu meslekte tecrübe
herşeydir ;)
Class ve Struct'ı basitçe karşılaştırıp aradaki
farkı performans açısından ele almak için basit bir test programı
hazırladım bakalım sonuç nasıl çıkacak.?
class Program { class clsHayvanlar { public string a { get; set; } }
struct srtHayvanlar { public string a { get; set; } }
List cls_list = new List(); for (int i = 0; i < 1000000; i++) { cls_list.Add(new clsHayvanlar() { a = "value" });// Heap bellek bölgesinde yer ayrılıyor. tmp_ = cls_list[i].a; // Heap bölgesinden okunuyor. } s1.Stop();
List str_list = new List(); for (int i = 0; i < 1000000; i++) { str_list.Add(new srtHayvanlar() { a = "value" }); // Stack bellek bölgesinde yer ayrılıyor. tmp_ = str_list[i].a; // Stack bölgesinden okunuyor. } s2.Stop();
----------------- class : 232,00 ms struct : 90,00 ms
Görüldüğü gibi Struct lehine bariz fark var ama bu durumun tam tersi olduğu zamanlarda olabiliyor tabi bu ayrı bir yazı konusu.
Ben
genelde Struct'ı dağınık verileri toparlamak, çoğu zamanda yeni bir
veri türü oluşturmak için kullanıyorum, gerisi zaten GC'a ve
Framework'e kalıyor. Genelde kullandığım yapı aşağıdaki gibi. Yeni bir
veri türüne ihtiyacım varsa bu türü yaratırken Struct kullanmam işimi
fazlasıyla görüyor.
class Program { static List d_list; static void Main(string[] args) { d_list = new List(Directory.GetFiles(".\\").Length);
foreach (var item in Directory.GetFiles(".\\")) { d_list.Add(new sistem_dosyasi( new FileInfo(item))); } }
struct sistem_dosyasi { public long size; public string name;
02.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Yine opensource bir uygulamanın kodlarını incelerken bazı yerleri refactor ettiğimde daha hızlı çalıştığını gördüm. Revize ettiğim yerlerde genelde operator'lerin kullanımı ile alakalıydı. Böyle bir kaç gereksiz ve performans düşürücü kod ile karşılaşınca da operatör performans'ı ile ilgli birşeyler yazmaya kadar verdim ;)
Sık sık kullandığım ve kullanmaya dikkat ettiğim karar verici operatörlerin kullanım yerleri ve karşılaştırmalarını basit olarak gösteren giriş seviyesi bir yazı oldu.
C# Condition'lar
Condition'dan kastımız if, switch, :?, ?? gibi operatörlerin yerine göre kullanı mı, karar verme mekanizmalarınızın hızlı
olmasını sağlayacaktır. Örnek vermek gerekirse aşağıdaki gibi string
karşılaştırması yapacaksanız switch kullanmanız en performanslı sonucu
almanızı sağlayacaktır.
static void switchCondition(string hayvan) { switch (hayvan) { case "At": break; case "Öküz": break; case "Eşşek": break; case "Kedi": break; case "Köpek": break; case "Ejderha": break; default: break; } }
Bu
kodun aynısını if blok'u ile de yapmanız mümkün fakat her ne olursa
olsun switch bu durumda çok daha hızlı çalışacaktır. Gel gelelim
switch'inde kötü performans verdiği yerler var. Aşağıdaki if kullanımı
da switch'den daha performanslı çalışacaktır.
static bool IfOrCondition(string hayvan) {
return (hayvan == "At" || hayvan == "Öküz" || hayvan == "Eşşek" ||
hayvan == "Kedi" || hayvan == "Köpek" || hayvan == "Ejderha");
}
Bu kodun birde switch karşılığını elealırsak aşağıdaki gibi yapı çıkıyor. Burda da if daha hızlı karar veriyor.
static bool switchOrCondition(string hayvan) { switch (hayvan) { case "At": case "Öküz": case "Eşşek": case "Kedi": case "Köpek": case "Ejderha": return true; default: return false; } }
Bire
bir değer karşılatırırken de == (Eşittir) operatörü yerine Equals
metodunu kullanmanız performansınızı hızlandıracak bir harekettir. Bunu
ufak bir test programı yazarak karşılaştırdım ve aşağıdaki gibi bir
sonuç çıktı.
static void EqualsCondition(string hayvan) { if (hayvan.Equals("At")) {
} else if (hayvan.Equals("Öküz")) {
} else if (hayvan.Equals("Eşşek")) {
} else if (hayvan.Equals("Kedi")) {
} else if (hayvan.Equals("Köpek")) {
} else if (hayvan.Equals("Ejderha")) {
} }
== : 9,7233 ms Equals : 0,8875 ms
Özellikle string karşılaştırırken Equals kullanmanız performans açısından yararınıza olacaktır.
Bazı
durumlarda da ne if, nede switch kullanmanız gerekmez, Diğer dillerde
olduğu gibi C#'da da Inline kullanılabilecek operatörler vardır ve
gerektiğinde kullanılırsa hem kodunuz daha kolay okunur hemde
performans kazanırsınız. If kullanarak uzun uzun oluşturduğunuz bu kod bloğunu.
Bu iki kod arasındaki karşılaştırma sonucunda da aşağıdaki gibi bir sonuç çıktı.
If : 0,9262ms :? : 0,4659ms
Inline
kullanabileceğimiz diğer bir operatörde ?? operatörü'dür. Herhangi bir
nesnenin null olup olmadığını kontrol eder eğer null ise
belirleyeceğiniz değeri nesnenin değerine atar. Bu operatörü yine if
ile karşılşatırırsak aşağıdaki gibi bir If kullanımını.
22.12.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Nacizane kendi tecrübelerimden ve gözlemlerimden yola çıkarak. Neden projeler planlandığı zamanda bitmez? Neden hep developer insanı daha çok çalışmak zorunda kalır? sorularına sebep olan maddeleri sıralamaya çalıştım.
Developer Neden Fazla Mesai Yapar?
İşe projeyi planlamak ile değil, işe direkt kod yazmakla başlıyorsa. (Bknz. guerilla coding, spaghetti coding)
Müşterinin gazlamasıyla gelecekte gerekli olabilecek veya hiç gerekli olmayacak modüller için fazladan kodlama yapıyorsa.
Her zaman her isteğe cevap verebilecek, tam donanımlı, mükkemmel bir yazılım çıkarma egosu varsa.
Her zaman en basit, en verimli, en hızlı çözümü sunmayı düşünmüyorsa.
Proje'nin ihtiyacı olan hızlı ve hatasız sistemi geliştireceğine proje için çok hayati olmayan "hata loglama sistemini" yazmaya kalkıyorsa.
Müşteri tarafında ne istediğini doğru anlatabilen bir partner bulamıyorsa.
Yazdığı programı başkalarına/müşteriye test ettirmeden, kendisi test ettikten sonra "tamam oldu release ediyorum" diyorsa.
Geri bildirime ve müşteri testlerine önem vermiyorsa.
Proje'de ki bug'ları sürekli erteleme eğilimi içindeyse.
Bir iş için tasarlayabileceği en basit modeli tasarlamaya çalışmıyorsa.
Müşterinin mantıklı ve saçma isteklerini analiz edip akıl süzgeçinden geçiremiyorsa.
Yanılmaktan ve yanlış yapmaktan korkuyorsa.
Ego'sunu sürekli sırtında taşıyorsa!
Yeni başlayan junior developer'dan da yeni şeyler öğrenebileceğinin farkında değilse.
Proje'nin nasıl işleyeceğini müşterisine en baştan öğretmiyorsa.
Projeyi bitirmek için sürekli kod yazmak gerektiğine inanıp, gerektiğinde dinlenmeyi ve iki tek bira atmayı bilmiyorsa.
Müşteriyi projeden uzak tutmak gerektiğine inanıyorsa.
Müşteri tarafında ki partnerini iyi bir şekilde yönetemiyorsa.
Proje başlangıcında gereksinimleri belirlemeden hareket ediyorsa.
Proje'de özellikleri mümkün olduğu kadar ufak parçalara bölmekten kaçınıyorsa.
Artık teknik kararları da müşteri almaya başlamışsa.
Müşteriye "müşteriliğini bilmesi" gerekitğini açık ve net söylemeye çekiniyorsa.
İş planının ne kadar süreceğine kendisi değil, müşteri karar vermeye başlamışsa.
...emektar developerımızın mesaisi bitmez, aldığı projeleri batar ve hep stresli mutsuz yaşar.
Bunların hepsi benim geçmiş zamanlarda yapmış olduğum hatlar, önemli olan bu hataları sürekli tekrarlamamak ki öyle yapmaya çalışıyorum. Aslında bütün maddelere birer örnek verip açıklamak istedim ama örnekleride okuyucu düşünsün diyerekten üşengeçliğimi haklı bir çerçeveye oturtarak yazıyı böyle bırakıyorum :)
16.12.2009 tarihinde yazıldıktan sonra, 2 kişi yorum yazmış.
Aldığımız kıllı bir CRUD projesinin sonuna geliyoruz ve ben nihayet yapmak istediklerimin ilk adımlarını geçte olsa atmaya başladım, bakalım yeni çıkacağım bu yolda beni neler bekleyecek. Şu an kesin bir şey gerçekleşmediğinden detaylı bilgi vermek istemiyorum fakat belirli bir sektörde ihtisaslaşmış ve sadece o sektöre hizmet verecek yeni bir oluşum içindeyim.
Belirli projelerin her zamanki gibi gecikmesi, çevik yazılım geliştirme sürecinin bazı dezavantajlarını külliyen yaşamamız sebebiyle blog'a istediğim kalitede yazılar yazmak için zaman ve istek duymuyordum. Artık o dönemi yavaş yavaş atlatıp biraz içerik üretme hevesim geldiğine göre bu yazıyı, bu site için yeni bir dönemin başlangıcı sayabilirim.
C#, Perl, Phyton programlama dili konularında yeni edindiğim bilgi ve tecrübeleri derinlemesine inceleyip olumlu ve olumsuz yanlarını irdelemek ve tartışmak, gerçek projelerde ki etkili ipuçlarını paylaşmak istiyorum. Umarım bu dediklerimi sistematik bir biçimde yapabilirim.
Yeni yılın herkese hayırlı ve uğurlu olması dileği ile...
20.11.2009 tarihinde yazıldıktan sonra, 10 kişi yorum yazmış.
Windows 7 dağıtılmaya başlandıktan sonra hayatımız nispeten daha
kolaylaştı. Bende böyle hayatı kolaylaştıran programlar keşfettikçe beşeriyetle paylaşasım geliyor.
Aslında tamamen aradığımı buraya girip bulayım diye yazıyorum.Yani
sanat, sanat içindir'i blog, blogger içindir olarak sallayabiliriz.
Akabinde faz bir olarak windows 7'nin çoklu wireless network desteği ile başlayalım.
Güzel ve hayatı kolaylaştıran bir özellik ama benim bahsetmek istediğim
bu özellik ve detayları değil buna bağlı olarak geliştirilen connectify programı.
Ürünü geliştirenler, ürünü tanımlarken Software-Based Wireless
router olarak tanımlamışlar ve cuk diye oturmuş. Connectify 'ı Windows
7 üzerine kurup çalıştırdığınızda sizi bir hotspot'a çeviriyor. Daha
sonra sizde başka kullanıcılara internet'iniz paylaştırabiliyorsunuz.
Şimdilik belirli wireless kartlarını destekliyor bunlarda piyasada her computer'da olan kartlar. Connectify'i burdan indirebilir, video'sunu burdan seyredebilirsiniz.
Gelelim faz 2'ye Windows'un page file olayı.
Windows XP'den beri gelen bu özellik, Windows 7 ile daha da optimize
edilmiş ve kullanılabilir duruma gelmiş. Önce page file'ı kapatmanın
yolunu yazayım daha sonra da neden kapttığımızı nacizane anlatmaya
çalışayım.
Windows Tuşu + Pause'a basarsanız karşınıza System penceresi gelir, daha sonra soldaki menüden Advanced System Settings'e, ardından Advanced tab'ına onun arkasından'da Performance butonuna bastığınızda Performance Options penceresine ulaşmış olursunuz. Burdan Advanced sekmesine tklayıp Change butonuna basarsanız Virtual Memory penceresine ulaşırsınız ve ortalarda olan No Paging File'ı görebilirsiniz işe bunun yanındaki radiobutonunu işaretleyip tamam dediğinizde işlem gerçekleşmiş oluyor.Sonra restart edip değişikliklerin aktif olmasını sağlayacaksınız.
Gelelim böyle bir manyaklık neden yapıyoruz. Disk yüzünden! Bildiğiniz
gibi windows page file'ı esasen disk üzerinde tutulan bir dosyadır.
Programlar çalışma esnasında bu disk üzerinde tutulan page file'a
erişirler ve değişken değerlerini buray yazarlar ve okurlar burda disk
üzerinde I/O denilen olayı yaratır. Diskiniz ne kadar zamanda yapılmak
istenen işleme tepki verebilirse windows'unu ve üzerinde çalışan
programlar o kadar hızlı veya yavaş çalışır. Diskiniz çok yavaşsa page
file kaldırmanız disk erişimini ortadan kaldıracağı için tüm değerlerin
RAM üzerinde tutulmasını sağlayacaktır.Ram'e erişmeniz disk'e
erişmenizden kat be kat hızlı olduğundan sizde gözle görülür bir hız
kazanacaksınız.
Dez avantajı nedir derseniz de ram'iniz az ise pek tavsiye etmiyorum
(2GB'nin altında). Ram'iniz dolduğunda çalışan programlar büyük ihtimal
hata verir ve kendini sonlandırır. Fakat oyunlarda güzel performanslar
elde edilebiliyor. Ben 4GB'ram ile C&G Generals III'de gerçekten
gözle görülür performans yaşadım.
14.11.2009 tarihinde yazıldıktan sonra, 1 kişi yorum yazmış.
Asp.Net sayfalarında runat="server" olarak işaretlenmiş kontrollerin HTML textlerini alma ihtiyacınız doğabilir. Bunu Web Kontrolü'nün (Control) RenderControl() metodu ile yapabiliyoruz. RenderControl metodu HtmlTextWriter tipinde parametre alıyor, HtmlTextWriter yapıcı metodunda (Constructor) da StringWriter tipinde bir parametre alıyor. Bunlar birbirlerini yazabilme kabiliyeti ile kontrol'ün HTML çıktısını kolaylıkla erişmenizi sağlıyor. Şöyle ki;
StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); panel.RenderControl(htw); //panel burda asp.net sayfasında herhangi bir kontrol string control_text = sw.GetStringBuilder().ToString();
Böylece control_text değişkenimize kontrol'ün sayfada gösterilmekte olan HTML çıktısını atamış oluyoruz. Bu durum asp.net sayfasının bir bölümünün e-posta ile göndermek durumunda kaldığım zaman lazım oldu. Oldukça da kolay bir şekilde işlemi gerçekleştirdik.
31.10.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Ortaca kardeşim kırmızı-yeşil renk körü. Esasen yaşantısına çok etki etmiyor ama ağ kablosu çakarken, lambalara bakarken zorlanıyor. Bu durumu düşünürken aklıma sorunu kısmen çözebilecek, medikal olmayan pratik bir fikir geldi. İnsanın her zaman yanında taşıyabileceği bir cihaz'a (cep telefonu, anahtarlık v.b.) yerleştirilen renk pigmentlerini algılayan ve yazı olarak çıktı veren bir sensör olsa renk körlerinin hayatı daha da çok kolaylaşır. Kendi açımdan sorunu şu şekilde çözebilrim:
Cep telefonu kamerasını kullanarak belirli bir hedefi capture eden ve hedefteki noktanın rengini algılayıp ekrana yazı olarak çıktı veren bir uygulama yazabilirim, hatta yazayım.
Diğer taraftan sensör olarak nasıl çözülür? veya bunu uzak mesafeler için lazer'li yapabilirmiyiz? sorularını da merak etmeye başladım şimdi.
17.10.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.
Alper hoca'ya bugün veri katmanımızdan kendi class'ımıza verileri
aktarırken null kontrolünü generic yapan bir fonksiyonu nasıl yazarız
diye sordum. "Yine başımıza iş çıkartıyorsun" diye bana takılırken, başka
bir yerdende kodu hemen yazmaya girişti. Olay burda Type olduğu için
C#'ın Generic Type Parameters'lardan
yararlandık. Böylelikle geri dönüş değerini istediğimiz bir tip verip
metod içinde de null value kontrolü rahatlıkla yapar olduk.
Metodu yazarken Alper hoca'nın DataRow.Field<>
isminde bir extensions metod dikkatini çekti esasen bizim yazmak
istediğimiz metodun aynısıydı adamlar yazmış diyip Reflector ile
incelemeye başladık. İnceleyip biraz kopya çektiktan sonra DataRow'dan
gelen verinin null kontrolünü yapan bu seksi örneği çıkardık.
public static T GetValue(DataRow dr, string field) { if (typeof(T).IsValueType) { if (dr[field] == DBNull.Value) { return default(T); } else { return (T)dr[field]; } }
Biraz daha detaylandırıp fazla uzatmaden kullanımını örneklersek:
DataTable DataTablom = new DataTable(); DataTablom = VerileriYukle();
foreach (DataRow row in DataTablom.Rows) { int tablo_id = GetValue<int>(row,"id"); DateTime tablo_tarih = GetValue<DateTime>(row, "tarih"); bool durum = GetValue<bool>(row, "durum"); }
şeklinde metodu kullanabilirsiniz. Esasen .Net takımı bizim yerimize Field<> metodunu zaten yazmış. Bu metodu kullanmak bazı durumlarda tam emin olmamakla birlikte daha stabil bir kontrol sağlar düşüncesindeyim. Metodu kullanmak içn System.Data.DataSetExtensions.dll'ini projenize referans vermeniz gerekir. Reflector ile inceleyeceksenizde yine bu dll dosyasını disassembly etmeniz gerekir.
Field<> Extension'una örnek vermek gerekirse:
DataTable DataTablom = new DataTable(); DataTablom = VerileriYukle();
foreach (DataRow row in DataTablom.Rows) { int tablo_id = row.Field<int>("id"); DateTime tablo_tarih = row.Field<DateTime>("tarih"); bool durum = row.Field<bool>("durum"); }
şeklinde kulllanımı var. Metodun mantığını kavradıktan sonra tabiki
DataRow.Field Extension Metodunu kullanıyorum. Ufak bir detay ama bu
kontrolleri yapmazsanız data access katmanındaki tutarsız veriler size
bug, sorun, bir sürü hata ekranı ve mutsuz kullanıcılar olarak geri
dönecektir...
Bu arada twitteramesaj.com olarak açtığımız ufak porjemizde bizi destekleyen bir sponsor bulduk. Bize sağlayacakları gms modem ile daha stabil ve hızlı bir alt yapımız olacak yoksa benim telefon'a kalsak 10 sms den sonra hararet yapıyor, kullanıcılar'da sms gönderdik yazmadı diye kızıyorlar :)
15.10.2009 tarihinde yazıldıktan sonra, 9 kişi yorum yazmış.
Özkan'ın fikir vermesiyle
ufak bir Twitter uygulaması yazdım. Twitter'ın Türkiye'ye SMS hizmeti
vermemesinden yola çıkarak insanların işine yarayacak bir
uygulama/servis oldu. Tabi kullanılır mı bilmem? Uygulamaya twitter hesabınızı kullanarak izin verip, telefon numaranızı tanıtıyorsunuz daha sonra +90 554 993 2429 numarasına durumunuz ile ilgil kısa mesaj atıyorsunuz ve twitter durumunuz güncelleniyor.
Servisi kullanabilmek için http://www.oguzhan.info/txtr adresinden (Şimdilik. Beta testlerinden sonra twitteramesaj.com
adresine alacağız) "Hemen Kullanmak İstiyorum" butonuna basmanız daha
sonra twitter.com üzerinden oturum açmanız ve cep telefonunuzu servise
tanıtmanız gerekiyor. İnsanlar bu yeni servise güvenmez ve şifrelerini
vermek istemezler diye Twitter'ın oAuth API'sini kullanarak
kullanıcıların güvenli oturum açmalarını ve kendilerini tanıtmalarını
sağladık.
Sms gateway olarak MessagingToolkit
kütüphanesini kullandım. Her ne kadar COM' portları ile ilgili sorun
çıkarsada open source olduğu için bir kaç patch yazdıktan sonra adam
ettik. Sms notification olayının çalışması içinde "AT+CNMI" modem komutunu
destekler nitelikte bir telefon olması lazım yoksa bu olay
tetiklenmiyor ve kendiniz bir watchdog yazmanız gerekiyor. Benim
kullandığım Motorola telefonda AT+CNMI destekler nitelikteydi
(Nokia'lar bu komutu külliyen desteklemiyor).
Telefon numarasını daha önce atıl durumdaki avea hattın numarası olarak belirledim +90 554 993 2429 tabi daha seksi bir numarada belirleyebilirdim ama eldeki malzeme bu.
Şimdi telefonu şarj'a taktım bir taraftanda bilgisayara bağlı sms bekliyor.
Son olarak sitenin projeler bölümünü güncelledim ve blog'larda ki modaya uyarak sosyal iletişim antenlerimi sağ üst köşeye menemen testtisi gibi dizdim. Şimdi trendy bir blog oldu diye kendimi kandırıyorum oh oh ne güzel.