Umut Ulus

Kişisel İnternet Günlüğü

Aziz Bey, yani Cem Yılmaz ile Lemi Bey (Ozan Güven), 19. yüzyılın sonlarında padişah tarafından görevlendirilerek Amerika’ya giderler. Yanlarına da hediye olarak verilmek üzere çok değerli bir elmas taş ve yüksek miktarda para vardır. İkili Amerika’ya varınca, gidecekleri menzil için bir posta arabasına binerler.

Malumunuz Vahşi Batı’da posta arabaları haydutlar tarafından hep soyulur. İşte Lemi Bey ile Aziz Bey de bu kaçınılmaz sona uğrarlar. Önce ellerinden elmas taş gider. Sonra da paralarını kaptırırlar. İşte film de asıl bu noktada başlar. İki Osmanlı, kaptırdıkları parayı tekrar toparlamak için ödül avcılığı yaparlar.

Tabii çeşitli cinliklerle. Gördükleri ‘Wanted’ ilanlarını kendilerine uyarlayıp, sırasıyla aranan haydutların yerine geçer ve ödül avcılığıyla para kazanmaya çalışırlar. Biri haydut olur, diğeri onu yakalar. Tabii başlarına her defasında binbir olay gelir. Bir defasında da Calamity Jane vari, kadın silahşör rolünü canlandıran Demet Evgar ile karşılarlar. Tam canlarından olacakken Aziz Bey (Cem Yılmaz) birbirinden komikliklerle aslında ödül avcısı olmadıklarını, Lemi Bey’in (Ozan Güven) haydut olmadığını, ikisinin de Osmanlı olduğunu anlatmaya çalışır.

Posted by Umut On Kasım - 21 - 2009 Genel Kişisel

Web ortamında sayfaların her post-back olmasında ilgili sayfanın yeni bir örneği oluşturulur. Peki yeni bir örneğinin oluşması ne demek?

  1. Sayfamızdaki bilgilerin
  2. Sayfadaki kontrollerin (TextBox, Grid, CheckBox, Button vb.)

tamamen keybolması demektir. Örneğin kullanıcı sayfamızdaki bir TextBox a veri girdiğinde, artık biliyoruz ki bu veri tamamen kaybolacaktır. Ancak bunu deneyip yaptığımızda gerçek ortamda TextBox taki verinin kaybolmadığını görüyoruz.

Peki bu nasıl oluyor?

Geleneksel Web Programlamanın bu sınırlılığının üstesinden gelmek için .NET platformu bize bazı sayfa-tabanlı ve uygulama-tabanlı seçenekleri sunmakta. Bunlar:

  1. View State
  2. Control State
  3. Hidden Fields
  4. Cookies
  5. Query Strings
  6. Application State
  7. Session State

Bu seçeneklerden (View State, Control State, Hidden Fields, Cookies ve Query Strings) sayfamızdaki bilgileri ve kontrol bilgileri bir takım yollarla kullanıcının kendi bilgisayarında (Client-Based State Manegement) saklarlar. Geri kalan seçenekler ise (Application State, Session State ve Profile Property) bu bilgileri uygulama tarafında yani sunucuda (Server-Based State Management) saklarlar.

.NET platformunun bizlere sunduğu bu seçenekleri incelersek:

View State

Post-Back sırasında default olarak sayfa ve kontrol bilgilerini tutan bu yapı, dictionary mantığıyla çalışır. Her bir kontrolün ve sayfa bilgisinin değerleri “Key”, “Value” şeklinde, hidden field lar olarak korunur. sayfa sunucuya gönderildiğinde,gelen isteğe göre işlem yapıldıkran sonra sunucu view-state değerine göre sayfayı tekrardan render eder ve client a tekrar gönderir. Böylece sayfamızdaki verilerimizi kaybetmemiş ve sunucuya gitmeden önceki halleriyle tekrar tarayıcımızda görürüz.

View state yapısında kendi verilerimizide saklayabiliriz. Dictionar mantığıyla çalıştığını daha önce belirtmiştik. Aşağıdaki gibi basit bir şekilde View State yapısını kullanabilirsiniz

View State e veri ekleme:
ViewState.Add(”[Key]“,”[Value]“);

Eklenen bir veriyi alma:
ViewState["[Key]“].ToString();

Bu yöntemi kullanmanın avantajları:

  1. Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
  2. Kolay uygulanabilirlik : Ekstra kodlama gerektirmez. Zaten default olarak kullanılan metoddur
  3. Güvenlik : View-State değerleri şifrelenmiş bir şekilde saklandıkları için Hidden field lara göre daha güvenlidirler

Dezavantajları:

  1. Performans düşüklüğü : View-State değerleri sayfamızla beraber sunucuya gittiği için view-state de büyük boyutta veri saklamak sunucuya gidiş-geliş süresini uzatacaktır. özellikle mobil uygulamalarda büyük veriler büyük performans kaybı demektir.
  2. Potansiyel Güvenlik Riski : Veriler şifrelenmiş bir şekilde saklansa bile sayfa kaynağını görüntülediğimizde bu verileri şifreli halde bile olsa görebiliriz. Bu durum güvenlik riski oluşturabilir.

Control State

.NET ControlState özelliği post-back ler arasında custom kontrol verilerini tutmamıza olanak sağlar. Örneğin sayfamızda farklı içerikler gösteren farklı tab yapılarımızın olduğunu düşünün. Hangi tabın seçili olduğunu post-back işleminden önce bilmek istiyorsak bu yapı uygun bir yapıdır. Bu senaryo ViewState ile de yapılabilir, ancak ViewState sayfa bazında kapatılabildiği için uygulamamızda aksaklıklara neden olabilir. ControlState ise ViewState gibi kapatılamaz.

peki nasıl kullanılır?

Veri ekleme:
PageStatePersister.ControlState = “[Data]“;  //(veri object türünde eklenebilir)

Veri alma:
string value = PageStatePersister.ControlState.ToString();

Kullanım Avantajları:

  1. Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
  2. Güvenilirlik : ViewState gibi kapatılamadığından kullanımı daha kesin sonuçlar verir.
  3. Çok Yönlülük : Control state tekli verilerin nasıl ve nerede saklanması konusunda custom adaptörler yazılabilir

Dezavantajları:

  1. Programlama bilgisi gerektirir : ASP.NET kullanım için limitli imkan sağlasa da, tam kullanım için kodlama gerektirmektedir.

Hidden Fields

Hemen hemen hepimizin bildiği bir state yönetim aracıdır. Normal bir HTML kontrolü olarak sayfamıza ekleyenilirsiniz. Veri saklama ve veri alma, normal bir TextBox tan farksızdır.

Kullanım avantajları:

  1. Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
  2. Yaygın Destek : Hemen hemen tüm tarayıcılar hidden field desteği vermektedir.
  3. Kullanım kolaylığı : Standart HTML kontrolü olarak sayfanıza ekleyebilirsiniz.

Dezavantajları:

  1. Güvenlik Riski : Sayfa kaynağı direkt olarak görüntülenirse hidden field değerleri açıkça görülebilir. Değerler şifrelenebilir ancak şifrelenmesi ve şifrelerin tekrar çözülmesi işlemi ekstra kodlama demektir.
  2. Basit Depolama Mantığı : Hidden field larda rich değerler saklayamayız. Daha çok basit veriler saklanması için tasarlanmıştır.
  3. Performans Kaybı : Büyük veriler saklayamadığımız gibi, aşırı kullanımı durumunda sayfada HTML kontrolü olarak saklandığı için performans kayıplarına neden olacaktır

Cookies (Çerezler)

Uygulamamızda sıklıkla değişen verilerin Client taraflı saklanmasında en çok kullanılan state yönetim aracıdır. En çok karşımıza çıkan senaryosu ise bildiğimiz gibi Login işlemlerinde kullanıcıyı hatırlamaktır.

Kullanımı:

HttpCookie cookie = new HttpCookie(”myCookie”);
cookie.Values.Add(”UserName”, UserName);
cookie.Values.Add(”Password”, Password);
cookie.Expires = DateTime.Now.AddDays(30); //Cookie nin zaman aşımına uğrama süresi
Response.Cookies.Add(cookie);

Veri Okuma:

if (Request.Cookies["myCookie"] != null)
{
string UserName = Request.Cookies["myCookie"].Values["UserName"].ToString();
string Pwd = Request.Cookies["myCookie"].Values["Password"].ToString();
}

Kullanım Avantajları:

  1. Konfigüre Edilebilme : Cookie lerin ayarlanabilir birçok özelliği vardır. isim, değer, zaman aşımı süresi vb.
  2. Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
  3. Veri Devamlılığı : Client bilgisayarlarda veri bütünlülüğünü en yüksek oranda garanti edebilen yapılardır.
  4. Kullanım kolaylığı : text tabanlı key-value mantığıyla çalışırlar

Dezavantajları :

  1. Boyut limiti : Bir çok browser cookie boyutu olarak 4096 byte sınırını getirmektedir.
  2. Kullanıcı Kontrolü : Bazı kullanıcılar cookie alımını tarayıcılarından kapatabilirler, bu da cookie kullanımını olanaksız hale getirir
  3. Güvenlik Riski : Cookie kullanıcılar tarafından görülebilmektedir. Bu da güvenlik açıklarına neden olabilir. Cookie değerleri manuel olarak şifrelenebilir, ancak bu da ekstra kod demektir

Query Strings

Query String lerde yine en çok aşina olduğumuz state yönetim araçlarındandır. URL lerin ardına eklenen kullanıcılar için çok da bir anlam ifade etmeyen, yazılımcılar için anlamlı bilgilerdir.

Örneğin :xyz/index.php?option=com_comprofiler&task=userProfile&user=142 adresindeki “?” işaretinden sonra gelen
“option”, “task” ve “user” kelimeleri birer Query String anatarlarıdır. Bu anahtarlar kullanıcılar için fazla bir anlam ifade etmez ancak yazılımcılar için çok anlamlıdırlar.

Kullanımı :

xyzindex.php?option=com_comprofiler

Her iki kullanımda aynı işi görmektedir.

Veri Alma:

if (Request["[Key]“] != null)
{
string value = Request["[Key]“].ToString();
}

Kullanım Avantajları:

  1. Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
  2. Yaygın Destek : Hemen hemen tüm tarayıcıların Query String iler veri taşıma desteği vardır.

Dezavantajları:

  1. Güvenlik Riski : Query String ile taşınan veriler clear text olarak tüm kullanacılar tarafından görülebilmektedir. Bu nedenle değerli veriler kesinlikle query string ile taşınmamalıdır. Bunun yerine Hidden field veya diğer yapılar kullanılabilir.
  2. Kapasite Limiti : Bazı tarayıcılar URL uzunluklarını en fazla 2083 karakter olarak sınırladıklarından istenilen uzunlukta veri taşınamıyor.

Böylece ASP.NET State (Durum) yönetiminin Client tarafındaki yapılarını incelemiş olduk. Umarım yardımcı olabilmişimdir. Diğer yazımda Server tarafındaki yapılara göz atıyor olacağız.

Posted by Umut On Kasım - 19 - 2009 Genel Kişisel Programlama

PARDUS 2009 geçen gün, kullanıma hazır hale getirilmiş. Bu sürümün yeniliklerini ve neler sunduğunu incelemek için http://www.ozgurlukicin.com/haber/pardus-2009-duyuruldu/ adresini ziyaret edebilirsiniz. Eğer kurmak isteyenler olursa, http://www.ozgurlukicin.com/ia/pardus-nasil-kurulur/ adresinden, adım adım kurulumu gerçekleştirebilirler.

Açıkçası, grafiklerini biraz inceledikten sonra, PARDUS hakkındaki görüşlerim değişti denebilir. Yeni arayüz, bence mükemmel gözüküyor. Ancak deneme fırsatım olmadı-en kısa zamanda deneyeceğim. Kurulum sırasında “F4″ tuşuna basınca, karşımıza bir “tetris” oyunu çıkmakta:D Bu bakıma kurulumun bitmesini istemeyebilirsiniz:D Ayrıca, kulağıma gelen söylemlere göre, PARDUS’un 64 bit versiyonunun çıkacağı yönünde. Bence çoktan geç kalınmış bir teknoloji. Günümüzde nerdeyse tek çekirdekli sistem kalmadı. Öyleyse, bu çift çekirdek işlemcilerimizi niye tam performans ile kullanmayalım ki? Çok çekirdekli işlemcilerin çekirdek sayısı çoğalmakta, ancak bizim halimizi soran yok:) Durum böyle olunca(çekirdekleri yazılımsal olarak kullanamazsak), para boşa gidiyor.

Bence, bu sefer olmuş gibi. Tabi grafiklere bakıp da aldanmamak lazım. En kısa zamanda deneyeceğim;)

Posted by Umut On Kasım - 12 - 2009 Genel Kişisel

Javascript, bütün web tarayıcıları tarafından kullanılan bir dildir. Yani eğer web üzerinde programlama yapıyorsak bu dili öğrenmek bize inanılmaz avantaj sağlar. İşi gereği Ajax kullanma ihtiyacı hisseden herkes eninde sonunda bir şekilde Javascript’e bulaşmak zorunda kalır. Ancak diğer zamanlarda C#, Vb.Net, vbscript ya da coldfusion gibi diller kullanan yazılımcılar günün birinde -zorunluluktan- javascript kullanmaya niyetlendiğinde, çok iyi bildiği diğer dilden vaz geçip hiç araştırmaya vakit bulamadan javascript kullanmaya başlayınca ne yazık ki sonunda oradan buradan bulduğu kodları “güzelce” kopyala yapıştır yapıp çalışmasını beklerler. Elbette bu da sorunlara yol açtığı zaman sorunu “mülayim” javascript’te bulurlar. Evet, Javascript aslında oldukça mülayim bir dildir. Öyle ki, aslında javascript derleyicisi bize dert çıkartmamak için elinden geleni yapar. Örneğin, hepimizin bildiği gibi javascript komutları noktalı virgül (semicolon [;]) ile ayrılır. Diğer pek çok C türevi dilde bunu yerleştirmediğimizde derleyiciden hata alır komutumuzu derleyemeyiz. Ancak javascript derleyicisinde, her kod satırı çalışsın diye “semicolon correction” adında bir mekanizma yer alır. Bu mekanizma ile birlikte satır sonlarında eğer scope parantezi, ({ ya da }) yoksa derleyici otomatik olarak noktalı virgül işaretini yerleştirecektir. Tabi ki bu da çoğu zaman başımıza dert açabilir. Bu yüzden javascript ile kod yazarken en dikkat etmemiz gereken şey, herşeyi kuralına göre yapmış olmamızdır. örneğin,

return
{
degisken : true
}

gibi bir kod yazdığımızı düşünelim. Bu durumda derleyici üstteki kodu aşağıdaki gibi düzeltecektir,

return;
{
degisken : true;
}

yani böyle bir durumda geri dönüş değerinin bir nesne olmasını beklerken sürekli undefined sonucunu elde etmemiz çok da süpriz olmamalıdır. Bu kodun doğrusu aşağıdaki gibi yazılmalıdır,

return {
degisken: true;
};


Bu gibi sorunların yanında en çok problem “if” gibi mantıksal ifadelerde karşımıza çıkar. C ve türevi dillerden gelen alışkanlıkla mantıksal eşitlik için daima “==”(eqeq) kullanmaya alışmış bir yazılımcı javascript için de aynısını kullanır. Ancak burada diğer dillerden farklı olarak, javascript derleyicisi eqeq operatörünü kullanırken tipler arasında sıkıntı yaşamamak için tip dönüşümü yapar. Yani bu durumda aşağıdaki sorunlar karşımıza çıkabilir,


alert(’\r\n\t’ == 0); // true
alert(false == ‘0′); // true
alert(0 == ‘0′); // true
alert(” == 0); // true
alert(undefined == null); // true

Ancak javascript bu durumun bir çözümünü de bizlere sunmaktadır. Bu sorunla karşılaşmamak için “===”(eqeqeq) operatörünü kullanabiliyoruz. yani (false === ‘0′) ifadesi bize false değerini döndürüyor. Çünkü ifadenin bir yanında boolean bir değer varken diğer tarafta ise bir string değeri yer alıyor. Benzer şekilde bir başka problem ise, değeri verilmemiş bir değişkenin değerinin ne olacağıdır. Bu undefined ya da null olabilir. Bunun içinse çoğu zaman

if(degisken != null || degisken != undefined || degisken != ‘undefined’) { .. }

yazmak zorunda kalabiliriz. Bunun bir çözümü de basitçe değişkeni mantıksal yolla sınamaktır,

if(degisken){…}

Bu şekilde yazdığımızda bir ifadede javascript derleyicisi, if mantıksal sınamasında öncelikle degisken’in değerine bakar, eğer bu değer dolu ise true, değil ise false değerini döndürür.

Javascript number, string, boolean, null ve undefined gibi tiplerden oluşur. Yani diğer dillerde gördüğümüz kadar çok tip yer almaz. Bunun dışındaki tüm tipler birer object tir. Tanımlanmamış her object undefined ya da null değerini alır. Eğer bu değerlere sahip olmayan bir nesne yaratmak istiyorsak bunu aşağıdaki gibi yapabiliriz,

var bos_nesne = {};

Yukarıdaki tanımda yer alan nesnenin değeri object olarak gelecektir. Bu nesnenin içerisine özellikler eklememiz de mümkün,

var yeni_nesne = {
ozellik1 : ’string değer’,
ozellik2 : 12,
ozellik3 : true,
fonksiyon : function(x){
return x * 2;
}
};

Yukarıdaki örnekte de görüldüğü gibi bir nesnenin özellikleri değişken tipleri olarak verilebileceği gibi birer fonksiyon olarak da tanımlanabiliyor. Böyle bir yaklaşımla gayet nesneye yönelik bir tasarıma da izin verilmektedir. Benzer şekilde bir nesneye yapıcı method da tanımlamak mümkündür,

var nokta = function(x, y){
this._x = x;
this._y = y;
};

Javascript nesnelerinin (javascript 1.1′den itibaren) her birinde prototype adında bir özellik bulunur. Biraz ciddi bakıldığında bu prototype özelliğinin, javascript nesnelerinin nesneye yönelik programlamaya açılan kapıları gibi olduğu söylenebilir. Bir nesneye ait prototype özelliğine eklediğiniz her yeni fonksiyon ya da özellik o nesnenin tüm kopyaları için geçerli olur. Yani bir nesnenin prototype özelliğini kopyaladığınızda o nesneye ait tüm özellik ve fonksiyonları da miras almış olursunuz. Bu şekilde çok daha karmaşık sistemleri kısa ve etkili bir şekilde tasarlayabilir, nesneye yönelik tasarım kalıplarını javascript ile uygulama şansını elde edebilirsiniz. Şimdi aşağıda, üstte tanımladığımız nokta nesnesine yeni bir fonksiyon ekleyelim,

nokta.prototype.MesajGoster = function(){
alert(this._x + ‘:’ + this._y);
};


Böylece aşağıdaki gibi bir kullanımı rahatlıkla yapabiliriz,

var yeni_nokta = new nokta(10,12);
nokta.MesajGoster();

Bu tanımla birlikte, nokta nesnesini miras alan bir baska nesne de MesajGoster fonksiyonundan faydalanabilir. Şimdi yeni bir nokta nesnesi yapalım ve bu nesne daha once yaptığımız nokta nesnesinin MesajGoster ozelligini miras alsın,

var altNokta = function(x, y){
this._x = x * 2;
this._y = y * 2;
};

altNokta.prototype = nokta.prototype;
var alt_nokta = new altNokta(1,2);
alt_nokta.MesajGoster();

Yukarıdaki örneği de uyguladığımız zaman, aslında altNokta nesnesine MesajGoster() fonksiyonunu tanımlamamış olmamıza rağmen, bu fonksiyonun çalıştığını görebilirsiniz. Peki şimdi burada bir problemimiz daha var. Farkındaysanız yapıcı metodlar arasında kodu tekrarlamak durumunda kaldık. Şimdi de hem bunu engelleyelim, hem de miras alma olayını ortak bir yapıya çekelim. Bunun bu tarz işlemlerde bize kolaylık sağlayacak aşağıdaki fonksiyonu kullanabiliriz,

var inherits = function(subObject, baseObject){
subObject.prototype["base"] = baseObject;
for (var subPrototype in baseObject.prototype) {
if(subPrototype !== “base”){
subObject.prototype[subPrototype] = baseObject.prototype[subPrototype];
}
}
}

Öncelikle yukarıda ne yaptığımızı biraz anlamaya çalışalım. İlk başta miras alacak olan nesnenin prototipine base isminde yeni bir özellik ekledik. Bu şu demek, artık miras alacak olan subObject nesnesinin miras aldığı nesne değerine sahip bir özelliği var. Yani kendi içerisinde this.base dediğimizde ya da dışarıdan nesneAdi.base dediğimizde o nesnenin ust sınıfına erişebiliyoruz. Üstte yaptığımız örneği bu yapıda tekrar edelim,

var altNokta = function(x, y){
this.base(x * 2, y * 2);
};
inherits(altNokta, nokta);

Sanırım bu şekilde nesneye yönelik diğer dillere daha yakın bir kullanım elde edebildik. Javascript ile temel düzeyde miras alma işlemini öğrendiğimize göre son bir örnek yapalım. Şimdi yapacağımız örnekte aynı tipten türemiş iki tane nesneden tipine göre bizim ihtiyacımızı döndüren bir fabrika methodu hazırlayalım. Aynı Urunler nesnesinden türeyen iki nesnemiz olsun, biri Kalemler diğeri ise Kitaplar. öncelikle Urunler nesnesini tasarlayalim,

var Urunler = function(urunTipi, urunAdi){
this._urunTipi = urunTipi;
this._urunAdi  = urunAdi;
};
Urunler.prototype.Yukle = function(){
alert(”Urun tipi ” + this._urunTipi + ” olan ” + this._urunAdi + ” yuklendi.”);
};

Ardından bu nesneyi miras almış olan Kalemler ve Kitaplar nesnelerini tasarlayalım.

var Kalemler = function(urunAdi){
this.base(”kalem”, urunAdi);
};
inherits(Kalemler, Urunler);

var Kitaplar = function(urunAdi){
this.base(”kitap”, urunAdi);
};
inherits(Kitaplar, Urunler);

Şimdi de bu iki nesneyi yaratıcak olan UrunFabrikasi’ni tasarlayalim,

var UrunFabrikasi = {
UrunYarat : function(urunTipi, urunAdi){
switch(urunTipi){
case “kitap”:
return new Kitaplar(urunAdi);
break;
case “kalem”:
return new Kalemler(urunAdi);
break;
}
}
};

Artık örneğimizi bitirdik, buradaki yapıyı aşağıdaki gibi kullanabiliriz,

var urun = UrunFabrikasi.UrunYarat(”kalem”, “Yeni bir kalem”);
urun.Yukle();

Daha anlatılacak çok şey olmasına rağmen burada ara veriyorum. Bu yazıya başlarken amaçladığım şey, her ne kadar yazılım dilleri değişse de ortak yöntemlerin ya da methodların bir şekilde adapte edilebileceğini ve javascript’in de doğru kullanıldığında neler başarabileceğini göstermekti. Umarım artık sizin de javascript’e bakış açınız bu yazıyı okumadan önceki gibi değildir. Görüşmek üzere

Alıntıdır.

Posted by Umut On Kasım - 11 - 2009 Alıntılar Genel

Rss Besleme

Video

Etiketler

Porno İzle