Apache tarafından geliştirilen açık kaynaklı, yüksek ölçeklenebilirliğe sahip ve yüksek performanslı NoSQL veritabanı mimarisi yapısında olan dağıtık bir veritabanı sistemidir. İlk olarak Amazon’un Dynamo ve Google’ın Bigtable veri tabanları temel alınarak Facebook tarafından geliştirilmiştir. Facebook 2009 da Cassandra’yı açık kaynak olarak açıp Apache kuruluşuna devretmiştir. Kapasitesi oldukça yüksek olan Cassandra petabaytlarca veriyi tutabilir. Çoklu veri merkezlerinde ya da bulut ortamında bulunan yapısal veya yapısal olmayan verileri yönetmek için oldukça iyi bir sistemdir. Esnek, dinamik ve hızlı cevap süresine sahiptir. Yüzde seksenlere varan veri sıkıştırma (Google’ın Snappy algoritması ile) yeteneğine sahiptir. Güçlü memory cache yazılımlarına (memcache ...) olan ihtiyacı ortadan kaldırır. SQL kullanımına oldukça benzeyen ve öğrenilmesi kolay olan CQL dili ile sorgulama yapar. Platform ve dil desteği vardır. Cassandra’yı çalıştırmak için özel olarak tasarlanmış yazılım ve donanımlara ihtiyaç yoktur. Kullanım oranı yüksek olan Cassandra CERN, Comcast, eBay, GitHub, GoDaddy,Hulu, Instagram, Intuit, Netflix, Reddit ve daha 1500 den fazla kurum tarafından kullanılmaktadır. Cassandra’nın sağladığı kolaylıklar ve faydalar Elastik ölçeklenebilirlik (Elastic scalability) : İhtiyaç duyulduğu herhangi bir zamanda kapasiteyi kolayca artırmaya izin verir. Sürekli aktif (Always on architecture) : Geleneksel master/slave RDBMS ya da NoSQL çözümleri gibi esas bileşendeki bir hatadan (single point of failure ) dolayı sistemin çökmesi söz konusu değildir. Çünkü böyle bir mimarisi yoktur. Sürekli kullanılabilirlik esasına dayanır ve asla uygulamaların çökmesini göze almaz. Doğrusal ölçekli hızlı performans (Fast linear-scale performance) : Doğrusal ölçeklenebilirlik yapısı sayesinde cevap süresi saniyenin altındadır. Cevap süresini beklenen süre içinde tutmak için sonuçları iki nodetan, dört nodetan ya da bu şekilde mümkün olan nodelardan elde eder. Esnek veri depolama (Flexible data storage) : Tüm veri formatlarını (yapısal, yarı-yapısal, yapısal olmayan) kolayca barındırır. Günümüzdeki modern uygulamalar ile çalışır. Aynı zamanda dinamik olarak verinin ihtiyaç duyduğu yapısal değişiklikleri yaparak barındırır. Kolay veri dağıtımı (Easy data distribution) : Verinin ihtiyaç duyulduğu kadar çoklu veri merkezlerine, bulut ortamlarına ya da başka ortamlara dağıtılması ve kopyalanması için maksimum esneklik sağlar. Herhangi bir node üzerinde yapılan okuma ve yazma işlemindeki değişiklikler otomatik olarak cluster içindeki tüm nodelara yansıtılır. Operasyonel basitlik (Operational simplicity): Cluster içindeki tüm nodelar aynıdır. Karmaşık bir konfigurasyon yapısı yoktur. Yönetim işlemleri oldukça basitleştirilmiştir. Transaction desteği (Transaction support) : Cassandra transaction içinde “AID” (atomicity, isolated, durability) özelliklerini garanti eder. Tutarlılık ise ayarlanabilir. Cassandra Mimarisi Cassandra dağıtık veritabanı mimarisi üzerine kurulmuştur. Bir cluster ve bu clusterı oluştruan bir veya daha fazla nodelardan oluşur. Cluster birbirine bağlı sunuculardan oluşur. node ise bir veritabanı sunucusudur. Dolayısıyla veritabanı birden fazla sunucuda saklanır. Nodelarda saklanan verilerin kopyası başka nodelarda saklanabilmektedir. Tüm nodeların kopyasının olması zorunluluğu yoktur. Cassandra peer-to-peer dağıtık mimariye sahiptir. Bu da çok daha iyi, kurulumu ve bakımı kolay bir yapı oluşturur. Cassandra da tüm nodelar aynıdır. Bir master node konsepti yoktur. Tüm nodelar birbirleriyle iletişim halindedir ve iletişim için gossip protokolunu kullanmaktadır. Cassandra’nın yüksek ölçeklenebilir yapısı, petabaylarca veri saklanmasına ve saniyede binlerce kullanıcı operasyonlarının gerçekleştirilmesine olanak sağlar. İsteğe yönelik sürekli kullanılabilirlik (offer continuous availability) mantığında çalışır. Cassandra doğrusal ölçeklenebilirliğe sahiptir. Örneğin iki node ile saniyede 100.000 işlem gerçekleştirirken node artırılğında işlem kapasitesi de artmaktadır. Veri Dağıtma ve Kopyalama Cassandra veriyi otomotaik olarak cluster ya da “ring” içindeki nodelara dağıtır. Developerların ya da Cassandra adminlerinin cluster içinde veriyi dağıtmak için herhangi bir geliştirme yapmasına gerek yoktur. Veri transparan parçalar halinde nodelara ya rastgele seçilerek ya da sıralı bir şekilde gönderilir. Varsayılan olarak rasgele seçilir. Cassandra aynı zamanda bir Cassandra “ring” i içerisinde fazladan kopya tutmak için gömülü ve özelleştirileilir kopyalama sağlar. Bunun anlamı bir node down olduğunda bu nodeun verileri cluster içindeki diğer makinelerde durmaya devam eder. RDBMS ve NoSQL veritabanlarının içindeki karmaşık koplayalama düzenlerinin aksine Cassandra’da konfigurasyon son derece kolaydır. Developer ya da admin basitçe ne kadar veri kopyası istediğini belirtir ve Cassandra gerisini halleder. Cassandra da kopyalama seçenekleri aynı zamanda verinin otomatik olarak farklı fiziksel yerlerde, çoklu-data merkezlerinde ve bulut platformların saklanmasına izin verir. Çoklu-Veri Merkezi ve Bulut Desteği Cassandra çoklu-data merkezlerinde ve bulut platformlarından veri kopyalama işlemlerinde önde gelen ve başarısı kabul görmüş bir NoSQL veritabanıdır. Bir developer ya da admin çoklu-data merkezlerini ya da melez bulut sistemlerini içeren bir cluster oluşturabilir. Yeni bir veritabanı (keyspace) oluştururken ya da çağırırken kullanıcı basit bir şekilde tek komutla hangi veri merkezlerinden ya da bulut ortamından veriyi çekeceğini belirtir. bundan sonrasını Cassandra otomatik olarak ilerletir ve bakımını kendi halleder. Veri Okuma ve Yazma Cassandra veri okuma ve yazma işlemleri sırasında “location independent” mimarisini kullanır. Bunun anlamı cluster içindeki bir node okunurken ya da yazılırken herhangi bir yere yaz/oku dizaynı(read/write-anywhere design) aktif edilir. Cassandra’ya veri yazılırken, tüm verinin dayanıklılığını ve güvenliğini sağlamak için veri ilk olarak bir commit loga yazılır. Veri in-memory olarak memtable adı verilen yapıda saklanır. Memtable dolduğunda veri diske flush edilerek sstable (sorted strings table) yapısında saklanır. Eğer belirli bir veri kümesinden sorumlu olan bir veya daha fazla node down olursa, veri basitçe başka bir nodea geçici olarak yazılır. Bu sorumlu nodelar ilk kez tekrar geri geldiğinde otomatik olarak yönettikleri veriyi back up larının olduğu nodelardan alıp veriyi güncellerler. Böylece veri kaybı ortadan kalkmış olur. Veri okuma cluster içinde paralel olarak yapılır. Kullanıcı veriyi herhangi bir node tan ister. Kullanıcın sorgusu gerekli veriye sahip nodelardan veri alarak cevaplandırılır. Eğer istenen veriye sahip node down olursa Cassandra verinin kopyasına sahip olan diğer nodelardan veriyi çeker. Cassandra RDBMS (ilişkisel veri tabanları) lerde olduğu gibi işlemsel (transactinal) bir veritabanı değildir. Biraz daha farklı bir transaction yapısı vardır. RDBMS ler ACID (Atomicity, Consistency, Isolation, Durability) transaction sağlarken Cassandra AID (Atomicity, Isolation, Durability) transaction sağlar. Cassandra’da bütünlük tutarlılığına ait bir konsept ya da foreign key yoktur. Veri Tutarlılığı Cassandra veritabanı clusterı içinde ayarlanabilir veri tutarlılığı sunar. Bunun anlamı bir developer ya da admin veriyi nasıl istediğine(ne kadar güçlü ya da nihai olsun) karar verir. Örneğin tüm node lardan cevap alarak veriyi oluştur ya da bir veya bir kaç node tan cevap aldıktan sonra geri kalanları güncelle gibi bir kaç farklı seçenek kullanılabilir. tek ya da çoklu-veri merkezlerini de destekler. Ayrıca tutarlılık işlem bazlı olarak ayarlanabilir. Yani bir developer ya da admin her bir işlem (SELECT, INSERT, UPDATE ve DELETE) sırasında tutarlılık seçeneklerini ayarlayabilir. adresinden alınmıştır.
6 Ağustos 2015 Perşembe
Apache Cassandra nedir
Apache tarafından geliştirilen açık kaynaklı, yüksek ölçeklenebilirliğe sahip ve yüksek performanslı NoSQL veritabanı mimarisi yapısında olan dağıtık bir veritabanı sistemidir. İlk olarak Amazon’un Dynamo ve Google’ın Bigtable veri tabanları temel alınarak Facebook tarafından geliştirilmiştir. Facebook 2009 da Cassandra’yı açık kaynak olarak açıp Apache kuruluşuna devretmiştir. Kapasitesi oldukça yüksek olan Cassandra petabaytlarca veriyi tutabilir. Çoklu veri merkezlerinde ya da bulut ortamında bulunan yapısal veya yapısal olmayan verileri yönetmek için oldukça iyi bir sistemdir. Esnek, dinamik ve hızlı cevap süresine sahiptir. Yüzde seksenlere varan veri sıkıştırma (Google’ın Snappy algoritması ile) yeteneğine sahiptir. Güçlü memory cache yazılımlarına (memcache ...) olan ihtiyacı ortadan kaldırır. SQL kullanımına oldukça benzeyen ve öğrenilmesi kolay olan CQL dili ile sorgulama yapar. Platform ve dil desteği vardır. Cassandra’yı çalıştırmak için özel olarak tasarlanmış yazılım ve donanımlara ihtiyaç yoktur. Kullanım oranı yüksek olan Cassandra CERN, Comcast, eBay, GitHub, GoDaddy,Hulu, Instagram, Intuit, Netflix, Reddit ve daha 1500 den fazla kurum tarafından kullanılmaktadır. Cassandra’nın sağladığı kolaylıklar ve faydalar Elastik ölçeklenebilirlik (Elastic scalability) : İhtiyaç duyulduğu herhangi bir zamanda kapasiteyi kolayca artırmaya izin verir. Sürekli aktif (Always on architecture) : Geleneksel master/slave RDBMS ya da NoSQL çözümleri gibi esas bileşendeki bir hatadan (single point of failure ) dolayı sistemin çökmesi söz konusu değildir. Çünkü böyle bir mimarisi yoktur. Sürekli kullanılabilirlik esasına dayanır ve asla uygulamaların çökmesini göze almaz. Doğrusal ölçekli hızlı performans (Fast linear-scale performance) : Doğrusal ölçeklenebilirlik yapısı sayesinde cevap süresi saniyenin altındadır. Cevap süresini beklenen süre içinde tutmak için sonuçları iki nodetan, dört nodetan ya da bu şekilde mümkün olan nodelardan elde eder. Esnek veri depolama (Flexible data storage) : Tüm veri formatlarını (yapısal, yarı-yapısal, yapısal olmayan) kolayca barındırır. Günümüzdeki modern uygulamalar ile çalışır. Aynı zamanda dinamik olarak verinin ihtiyaç duyduğu yapısal değişiklikleri yaparak barındırır. Kolay veri dağıtımı (Easy data distribution) : Verinin ihtiyaç duyulduğu kadar çoklu veri merkezlerine, bulut ortamlarına ya da başka ortamlara dağıtılması ve kopyalanması için maksimum esneklik sağlar. Herhangi bir node üzerinde yapılan okuma ve yazma işlemindeki değişiklikler otomatik olarak cluster içindeki tüm nodelara yansıtılır. Operasyonel basitlik (Operational simplicity): Cluster içindeki tüm nodelar aynıdır. Karmaşık bir konfigurasyon yapısı yoktur. Yönetim işlemleri oldukça basitleştirilmiştir. Transaction desteği (Transaction support) : Cassandra transaction içinde “AID” (atomicity, isolated, durability) özelliklerini garanti eder. Tutarlılık ise ayarlanabilir. Cassandra Mimarisi Cassandra dağıtık veritabanı mimarisi üzerine kurulmuştur. Bir cluster ve bu clusterı oluştruan bir veya daha fazla nodelardan oluşur. Cluster birbirine bağlı sunuculardan oluşur. node ise bir veritabanı sunucusudur. Dolayısıyla veritabanı birden fazla sunucuda saklanır. Nodelarda saklanan verilerin kopyası başka nodelarda saklanabilmektedir. Tüm nodeların kopyasının olması zorunluluğu yoktur. Cassandra peer-to-peer dağıtık mimariye sahiptir. Bu da çok daha iyi, kurulumu ve bakımı kolay bir yapı oluşturur. Cassandra da tüm nodelar aynıdır. Bir master node konsepti yoktur. Tüm nodelar birbirleriyle iletişim halindedir ve iletişim için gossip protokolunu kullanmaktadır. Cassandra’nın yüksek ölçeklenebilir yapısı, petabaylarca veri saklanmasına ve saniyede binlerce kullanıcı operasyonlarının gerçekleştirilmesine olanak sağlar. İsteğe yönelik sürekli kullanılabilirlik (offer continuous availability) mantığında çalışır. Cassandra doğrusal ölçeklenebilirliğe sahiptir. Örneğin iki node ile saniyede 100.000 işlem gerçekleştirirken node artırılğında işlem kapasitesi de artmaktadır. Veri Dağıtma ve Kopyalama Cassandra veriyi otomotaik olarak cluster ya da “ring” içindeki nodelara dağıtır. Developerların ya da Cassandra adminlerinin cluster içinde veriyi dağıtmak için herhangi bir geliştirme yapmasına gerek yoktur. Veri transparan parçalar halinde nodelara ya rastgele seçilerek ya da sıralı bir şekilde gönderilir. Varsayılan olarak rasgele seçilir. Cassandra aynı zamanda bir Cassandra “ring” i içerisinde fazladan kopya tutmak için gömülü ve özelleştirileilir kopyalama sağlar. Bunun anlamı bir node down olduğunda bu nodeun verileri cluster içindeki diğer makinelerde durmaya devam eder. RDBMS ve NoSQL veritabanlarının içindeki karmaşık koplayalama düzenlerinin aksine Cassandra’da konfigurasyon son derece kolaydır. Developer ya da admin basitçe ne kadar veri kopyası istediğini belirtir ve Cassandra gerisini halleder. Cassandra da kopyalama seçenekleri aynı zamanda verinin otomatik olarak farklı fiziksel yerlerde, çoklu-data merkezlerinde ve bulut platformların saklanmasına izin verir. Çoklu-Veri Merkezi ve Bulut Desteği Cassandra çoklu-data merkezlerinde ve bulut platformlarından veri kopyalama işlemlerinde önde gelen ve başarısı kabul görmüş bir NoSQL veritabanıdır. Bir developer ya da admin çoklu-data merkezlerini ya da melez bulut sistemlerini içeren bir cluster oluşturabilir. Yeni bir veritabanı (keyspace) oluştururken ya da çağırırken kullanıcı basit bir şekilde tek komutla hangi veri merkezlerinden ya da bulut ortamından veriyi çekeceğini belirtir. bundan sonrasını Cassandra otomatik olarak ilerletir ve bakımını kendi halleder. Veri Okuma ve Yazma Cassandra veri okuma ve yazma işlemleri sırasında “location independent” mimarisini kullanır. Bunun anlamı cluster içindeki bir node okunurken ya da yazılırken herhangi bir yere yaz/oku dizaynı(read/write-anywhere design) aktif edilir. Cassandra’ya veri yazılırken, tüm verinin dayanıklılığını ve güvenliğini sağlamak için veri ilk olarak bir commit loga yazılır. Veri in-memory olarak memtable adı verilen yapıda saklanır. Memtable dolduğunda veri diske flush edilerek sstable (sorted strings table) yapısında saklanır. Eğer belirli bir veri kümesinden sorumlu olan bir veya daha fazla node down olursa, veri basitçe başka bir nodea geçici olarak yazılır. Bu sorumlu nodelar ilk kez tekrar geri geldiğinde otomatik olarak yönettikleri veriyi back up larının olduğu nodelardan alıp veriyi güncellerler. Böylece veri kaybı ortadan kalkmış olur. Veri okuma cluster içinde paralel olarak yapılır. Kullanıcı veriyi herhangi bir node tan ister. Kullanıcın sorgusu gerekli veriye sahip nodelardan veri alarak cevaplandırılır. Eğer istenen veriye sahip node down olursa Cassandra verinin kopyasına sahip olan diğer nodelardan veriyi çeker. Cassandra RDBMS (ilişkisel veri tabanları) lerde olduğu gibi işlemsel (transactinal) bir veritabanı değildir. Biraz daha farklı bir transaction yapısı vardır. RDBMS ler ACID (Atomicity, Consistency, Isolation, Durability) transaction sağlarken Cassandra AID (Atomicity, Isolation, Durability) transaction sağlar. Cassandra’da bütünlük tutarlılığına ait bir konsept ya da foreign key yoktur. Veri Tutarlılığı Cassandra veritabanı clusterı içinde ayarlanabilir veri tutarlılığı sunar. Bunun anlamı bir developer ya da admin veriyi nasıl istediğine(ne kadar güçlü ya da nihai olsun) karar verir. Örneğin tüm node lardan cevap alarak veriyi oluştur ya da bir veya bir kaç node tan cevap aldıktan sonra geri kalanları güncelle gibi bir kaç farklı seçenek kullanılabilir. tek ya da çoklu-veri merkezlerini de destekler. Ayrıca tutarlılık işlem bazlı olarak ayarlanabilir. Yani bir developer ya da admin her bir işlem (SELECT, INSERT, UPDATE ve DELETE) sırasında tutarlılık seçeneklerini ayarlayabilir. adresinden alınmıştır.
RabbitMQ nedir?
RabbitMQ (Open Source EnterPrise Messaging) Anlık yapılması gerekmeyen işlerimizi belli bir kuyruk yapısına sokarak async olarak yapmamızı sağlayan bir uygulamadır.
https://www.rabbitmq.com/download.html adresini kullanarak üstünde çalıştığımız ortama indirebilir ve tutorial lara bakarak işlerimizi görebiliriz. Birçok dile entegre edilebilir durumdadır.
https://www.rabbitmq.com/download.html adresini kullanarak üstünde çalıştığımız ortama indirebilir ve tutorial lara bakarak işlerimizi görebiliriz. Birçok dile entegre edilebilir durumdadır.
10 Ekim 2014 Cuma
ITextSharp türkçe karakter problemi
ITextSharp Türkçe Karakter Sorunu
ITextSharp ile pdf çıktısı oluştururken Türkçe karakterler görünmeyebiliyor. Bu sorunu aşmak için yeni bir font tanımlayıp,
ekleyeceğin metinlerde de parametre olarak bu fontu eklemen gerekiyor. Örnek olarak pdftable adında bir tabloya yeni bir hücre eklerken;
gibi.
iTextSharp.text.pdf.BaseFont STF_Helvetica_Turkish = iTextSharp.text.pdf.BaseFont.CreateFont("Helvetica", "CP1254", iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font fontNormal = new iTextSharp.text.Font(STF_Helvetica_Turkish, 12, iTextSharp.text.Font.NORMAL);
ekleyeceğin metinlerde de parametre olarak bu fontu eklemen gerekiyor. Örnek olarak pdftable adında bir tabloya yeni bir hücre eklerken;
pdftable.AddCell(new Phrase("ğüşıöç ĞÜŞİÖÇ" , fontNormal));
gibi.
20 Mart 2014 Perşembe
ms sql coklu sonuc donduren subquery i concat etmek
SELECT
.
.
.
(SELECT
Stuff( (SELECT
N', ' + YTable.YArea2
FROM
YTable
WHERE
XTable.Xarea = YTable.YArea FOR XML PATH(''),TYPE) .value('text()[1]',
'nvarchar(max)'),
1,
2,
N'')) AS Area,
FROM XTable
WHERE
.
.
.
.
ayrıca mysql de de group_concat adlı fonksiyon bu işlemi yapabilir.
.
.
.
(SELECT
Stuff( (SELECT
N', ' + YTable.YArea2
FROM
YTable
WHERE
XTable.Xarea = YTable.YArea FOR XML PATH(''),TYPE) .value('text()[1]',
'nvarchar(max)'),
1,
2,
N'')) AS Area,
FROM XTable
WHERE
.
.
.
.
ayrıca mysql de de group_concat adlı fonksiyon bu işlemi yapabilir.
20 Kasım 2013 Çarşamba
Sayıyı yazıya dönüştürme.
var SayiYazdirma = function(yazdirilacakSayi){
this.desteklenebilecekSayiBasamagi = 4;
this.yazdirilacakSayi = parseInt(yazdirilacakSayi);
this.sayininRakamlari = new Array();
this.mevcutSayiBasamakSayisi = 0;
this.enBuyukBolen = 0;
this.sayininYaziHali = '';
this.sayiSistemiHesapla = function(){
if(this.desteklenebilecekSayiBasamagi == 1 || this.yazdirilacakSayi<10){
this.enBuyukBolen = 1;
this.mevcutSayiBasamakSayisi = 1;
return;
}
var bolen = 1;
for(var i=0;i<this.desteklenebilecekSayiBasamagi;i++){
bolen *= 10;
if(Math.floor(this.yazdirilacakSayi)/bolen<10){
this.enBuyukBolen = bolen;
this.mevcutSayiBasamakSayisi = i+2;
return;
}
}
this.enBuyukBolen = bolen/10;
this.mevcutSayiBasamakSayisi = this.desteklenebilecekSayiBasamagi;
};
this.sayiSistemiHesapla();
this.rakamlarinaAyir = function(){
if(this.mevcutSayiBasamakSayisi == 1){
this.sayininRakamlari[0] = yazdirilacakSayi;
}
var bolen = this.enBuyukBolen;
var sayiTemp = this.yazdirilacakSayi;
for(var i=0;i<this.mevcutSayiBasamakSayisi;i++){
if(i==this.mevcutSayiBasamakSayisi-1){
this.sayininRakamlari[i] = sayiTemp;
break;
}
this.sayininRakamlari[i] = Math.floor(sayiTemp/bolen);
if(this.sayininRakamlari[i]!=0){
sayiTemp = sayiTemp - (this.sayininRakamlari[i]* bolen);
}
bolen = bolen/10;
}
};
this.rakamlarinaAyir();
this.rakamBasamakYaziKarsiligi = function(rakam,rakamIndexi){
var deger = '';
switch (rakam) {
case 1:
switch (rakamIndexi) {
case 1:
deger = "bir";
break;
case 2:
deger = "on"
break;
case 3:
deger = "yuz"
break;
case 4:
deger = "bin"
break;
}
break;
case 2:
switch (rakamIndexi) {
case 1:
deger = "iki";
break;
case 2:
deger = "yirmi"
break;
case 3:
deger = "ikiyüz"
break;
case 4:
deger = "ikibin"
break;
}
break;
case 3:
switch (rakamIndexi) {
case 1:
deger = "üç";
break;
case 2:
deger = "otuz"
break;
case 3:
deger = "üçyüz"
break;
case 4:
deger = "üçbin"
break;
}
break;
case 4:
switch (rakamIndexi) {
case 1:
deger = "dört";
break;
case 2:
deger = "kırk"
break;
case 3:
deger = "dörtyüz"
break;
case 4:
deger = "dörtbin"
break;
}
break;
case 5:
switch (rakamIndexi) {
case 1:
deger = "beş";
break;
case 2:
deger = "elli"
break;
case 3:
deger = "beşyüz"
break;
case 4:
deger = "beşbin"
break;
}
break;
case 6:
switch (rakamIndexi) {
case 1:
deger = "altı";
break;
case 2:
deger = "altmış"
break;
case 3:
deger = "altıyüz"
break;
case 4:
deger = "altıbin"
break;
}
break;
case 7:
switch (rakamIndexi) {
case 1:
deger = "yedi";
break;
case 2:
deger = "yetmiş"
break;
case 3:
deger = "yediyüz"
break;
case 4:
deger = "yedibin"
break;
}
break;
case 8:
switch (rakamIndexi) {
case 1:
deger = "sekiz";
break;
case 2:
deger = "seksen"
break;
case 3:
deger = "sekizyüz"
break;
case 4:
deger = "sekizbin"
break;
}
break;
case 9:
switch (rakamIndexi) {
case 1:
deger = "dokuz";
break;
case 2:
deger = "doksan"
break;
case 3:
deger = "dokuzyüz"
break;
case 4:
deger = "dokuzbin"
break;
}
break;
case 0:
switch (rakamIndexi) {
case 1:
deger = "sıfır";
break;
case 2:
deger = ""
break;
case 3:
deger = ""
break;
case 4:
deger = ""
break;
}
break;
}
return deger;
}
this.sayiyiYaziyaDonustur = function(){
var deger = '';
for(var j= 1,i=this.mevcutSayiBasamakSayisi-1;i>=0;i--,j++){
deger = this.rakamBasamakYaziKarsiligi(this.sayininRakamlari[i],j) + ' ' + deger;
}
this.sayininYaziHali = deger;
return deger;
}
}
var sayiYazdirmaNesnesi = new SayiYazdirma(95214); window.alert(sayiYazdirmaNesnesi.sayiyiYaziyaDonustur());
http://www.daltinkurt.com/Icerik/185/Sayiyi-yaziya-donusturme.aspx
http://www.hayatisahin.com/BlogEngine/?tag=/C%23+Say%C4%B1y%C4%B1+Yaz%C4%B1ya+%C3%87evirme
this.desteklenebilecekSayiBasamagi = 4;
this.yazdirilacakSayi = parseInt(yazdirilacakSayi);
this.sayininRakamlari = new Array();
this.mevcutSayiBasamakSayisi = 0;
this.enBuyukBolen = 0;
this.sayininYaziHali = '';
this.sayiSistemiHesapla = function(){
if(this.desteklenebilecekSayiBasamagi == 1 || this.yazdirilacakSayi<10){
this.enBuyukBolen = 1;
this.mevcutSayiBasamakSayisi = 1;
return;
}
var bolen = 1;
for(var i=0;i<this.desteklenebilecekSayiBasamagi;i++){
bolen *= 10;
if(Math.floor(this.yazdirilacakSayi)/bolen<10){
this.enBuyukBolen = bolen;
this.mevcutSayiBasamakSayisi = i+2;
return;
}
}
this.enBuyukBolen = bolen/10;
this.mevcutSayiBasamakSayisi = this.desteklenebilecekSayiBasamagi;
};
this.sayiSistemiHesapla();
this.rakamlarinaAyir = function(){
if(this.mevcutSayiBasamakSayisi == 1){
this.sayininRakamlari[0] = yazdirilacakSayi;
}
var bolen = this.enBuyukBolen;
var sayiTemp = this.yazdirilacakSayi;
for(var i=0;i<this.mevcutSayiBasamakSayisi;i++){
if(i==this.mevcutSayiBasamakSayisi-1){
this.sayininRakamlari[i] = sayiTemp;
break;
}
this.sayininRakamlari[i] = Math.floor(sayiTemp/bolen);
if(this.sayininRakamlari[i]!=0){
sayiTemp = sayiTemp - (this.sayininRakamlari[i]* bolen);
}
bolen = bolen/10;
}
};
this.rakamlarinaAyir();
this.rakamBasamakYaziKarsiligi = function(rakam,rakamIndexi){
var deger = '';
switch (rakam) {
case 1:
switch (rakamIndexi) {
case 1:
deger = "bir";
break;
case 2:
deger = "on"
break;
case 3:
deger = "yuz"
break;
case 4:
deger = "bin"
break;
}
break;
case 2:
switch (rakamIndexi) {
case 1:
deger = "iki";
break;
case 2:
deger = "yirmi"
break;
case 3:
deger = "ikiyüz"
break;
case 4:
deger = "ikibin"
break;
}
break;
case 3:
switch (rakamIndexi) {
case 1:
deger = "üç";
break;
case 2:
deger = "otuz"
break;
case 3:
deger = "üçyüz"
break;
case 4:
deger = "üçbin"
break;
}
break;
case 4:
switch (rakamIndexi) {
case 1:
deger = "dört";
break;
case 2:
deger = "kırk"
break;
case 3:
deger = "dörtyüz"
break;
case 4:
deger = "dörtbin"
break;
}
break;
case 5:
switch (rakamIndexi) {
case 1:
deger = "beş";
break;
case 2:
deger = "elli"
break;
case 3:
deger = "beşyüz"
break;
case 4:
deger = "beşbin"
break;
}
break;
case 6:
switch (rakamIndexi) {
case 1:
deger = "altı";
break;
case 2:
deger = "altmış"
break;
case 3:
deger = "altıyüz"
break;
case 4:
deger = "altıbin"
break;
}
break;
case 7:
switch (rakamIndexi) {
case 1:
deger = "yedi";
break;
case 2:
deger = "yetmiş"
break;
case 3:
deger = "yediyüz"
break;
case 4:
deger = "yedibin"
break;
}
break;
case 8:
switch (rakamIndexi) {
case 1:
deger = "sekiz";
break;
case 2:
deger = "seksen"
break;
case 3:
deger = "sekizyüz"
break;
case 4:
deger = "sekizbin"
break;
}
break;
case 9:
switch (rakamIndexi) {
case 1:
deger = "dokuz";
break;
case 2:
deger = "doksan"
break;
case 3:
deger = "dokuzyüz"
break;
case 4:
deger = "dokuzbin"
break;
}
break;
case 0:
switch (rakamIndexi) {
case 1:
deger = "sıfır";
break;
case 2:
deger = ""
break;
case 3:
deger = ""
break;
case 4:
deger = ""
break;
}
break;
}
return deger;
}
this.sayiyiYaziyaDonustur = function(){
var deger = '';
for(var j= 1,i=this.mevcutSayiBasamakSayisi-1;i>=0;i--,j++){
deger = this.rakamBasamakYaziKarsiligi(this.sayininRakamlari[i],j) + ' ' + deger;
}
this.sayininYaziHali = deger;
return deger;
}
}
var sayiYazdirmaNesnesi = new SayiYazdirma(95214); window.alert(sayiYazdirmaNesnesi.sayiyiYaziyaDonustur());
http://www.daltinkurt.com/Icerik/185/Sayiyi-yaziya-donusturme.aspx
http://www.hayatisahin.com/BlogEngine/?tag=/C%23+Say%C4%B1y%C4%B1+Yaz%C4%B1ya+%C3%87evirme
11 Kasım 2013 Pazartesi
asp.net iss subdirectory webconfig probleminden kurtulma
Eğer iss application ununzda root directory altında subdirectory ler varsa webconfig ler karışıyorsa root webconfig dosyanızın system.web tagları üstüne location tagını inheritInChildApplications parametresini set ederek ekleyin.
<location path="." inheritInChildApplications="false">
<system.web>
...
...
</system.web>
</location>
</location>
1 Kasım 2013 Cuma
duck typing ve mix-in
http://yazilimsozluk.com/mixin-teknigi-ve-duck-typing-paradigmasi na istinaden yazılmıştır.
Dostum Duck typing i bildiğim kadarıyla anlatmaya çalışayım. Yazdığım şeylerin tamamı doğru olmayabilir ama benim anladığım bunlardır. Linq yu incelerken görmüştüm. Aslında javacıyım ama java da bu özellik direk olarak desteklenmiyor. O yüzden .net üzerinden anlatmaya çalışcam. Duck typing i java da sağlamak istiyorsan sanırım reflection kullanarak işin içinden çıkabilirsin fakat bilemiyorum kendisini pek sevmem.
Duck typing in bana ifade ettiği şey kısaca kalıtım özelliğini kullanmadan çok biçimlilik özelliğini destekleyebilmektir. O yüzden bence adamlar bunu nesneye yönelik olmayan dillerde çok biçimliliği desteklemek için yapmışlar. Aslında farkında olmadan javascriptte bu olayı çok kullanıyoruz. Ruby de de oldukça fazla kullanılır. Mesela javascriptte kullanırken diyelim ki bir A ve B diye 2 sınıfımız var. A ve B sınıfımızında birer denemeMetodu isimli metodu olsun. Ben bu metodları şu şekilde çağırabilirim.
var denemeArray = [];
denemeArray.push(aNesnesi);
denemeArray.push(bNesnesi);
var fakeFunction=function(nesne){
nesne.denemeMetodu();
}
for(var i=0;i<denemeArray.length;i++){
fakeFunction(denemeArray[i]);
}
Şimdi yukarıda javascript ile birbirinden tamamen bağımsız olan A ve B sınıflarının ortak olan metodunu sanki bunların atası aynıymış gibi (tamam teorik olarak hepsi object ten türüyor ama aynı değil) kullanabildik ve nesnenin ne oldugunu önemsemeden denemeMetodunu çağırabildik. Böyle birşeyi java ve ya c# ta nasıl sağlardık? Pseu olarak yazıyorum.
class C{
}
class A extends C{
public void denemeMetodu(){
}
}
class B extends C{
public void denemeMetodu(){
}
}
class E{
public static void cDenTuretilenleriAl(C nesne){
nesne.denemeMetodu();
}
public static void main(string [] args){
A aSinifi = new A();
B bSinifi = new B();
cDenTuretilenleriAl(aSinifi);
cDenTuretilenleriAl(bSinifi);
}
}
Yukarıda da cDenTuretilenleriAl ın parametre olarak A ve B sınıflarını beraber kabul edebilmesi için A ve B sınıflarını C den türetip parametre olarak C sınıfını geçtik. Şimdii...
.net içerisine 4 ile gelen dynamic tip ile bunu şöyle yazabiliyoruz.
class A{
public void denemeMetodu(){
}
}
class B{
public void denemeMetodu(){
}
}
class E{
public static void cDenTuretilenleriAl(dynamic nesne){
nesne.denemeMetodu();
}
main(string [] args){
A aSinifi = new A();
B bSinifi = new B();
cDenTuretilenleriAl(aSinifi);
cDenTuretilenleriAl(bSinifi);
}
}
böylece ne oldu. cDenTuretilenleriAl na çok biçimlilik kazandırmış olduk. Hemde kalıtım özelliğini kullanmadan. Bu kullanımın performans olayını falan bilmiyorum stress testi yapmak lazım ama bence bunu yapabilmesi için arkada biryerlerde yine reflection kullanıyordur. Reflection da java dan tanıdığım kadarıyla performans konusunda biraz sıkıntılı. Son çare dir her zaman.
mix-in olayına gelince. Buna fazla yazamıycam gücüm tükendi :-) Yine anladığım kadarıyla bir sınıfa çoklu kalıtım teknikleri kullanarak yeni özellikler katmak üzerine kurulu bi teknik. Mesela diyelim ki aynı özelliği kullanması gereken bir sürü class ın var. Run time da bu class ların tümüne birden bir özelliği katmana yarayan birşey bu olay. Ya da yine runtime da bazı sınıflara farklı işlevsellikleri kazandırmaya yarıyor. tabi bunu dediğim gibi kalıtım üzerinden yapıyorsun. Ama çoklu kalıtım. Yani bu teknik java c# gibi tekli kalıtım destekleyen dillerde kullanılamaz.Phyton gibi çoklu kalıtım destekleyen bir dilde kullanılabilir. Çünkü adam bi sınıfı sürekli extension lar ekliyor ve biz c# ta ve java da bir sınıfı sadece 1 sınıftan extend edebiliyoruz. tabi istediğimiz kadar interface den implement edebiliriz fakat metodların implementasyonları olmamış olur fakat bu teknik için implemantasyonları yapılmış metodlara ihtiyac var o yüzden sınıfa ihtiyacımız var.
Umarım biraz birşeyler anlatabilmişimdir dostum. Kolay gelsin.
Dostum Duck typing i bildiğim kadarıyla anlatmaya çalışayım. Yazdığım şeylerin tamamı doğru olmayabilir ama benim anladığım bunlardır. Linq yu incelerken görmüştüm. Aslında javacıyım ama java da bu özellik direk olarak desteklenmiyor. O yüzden .net üzerinden anlatmaya çalışcam. Duck typing i java da sağlamak istiyorsan sanırım reflection kullanarak işin içinden çıkabilirsin fakat bilemiyorum kendisini pek sevmem.
Duck typing in bana ifade ettiği şey kısaca kalıtım özelliğini kullanmadan çok biçimlilik özelliğini destekleyebilmektir. O yüzden bence adamlar bunu nesneye yönelik olmayan dillerde çok biçimliliği desteklemek için yapmışlar. Aslında farkında olmadan javascriptte bu olayı çok kullanıyoruz. Ruby de de oldukça fazla kullanılır. Mesela javascriptte kullanırken diyelim ki bir A ve B diye 2 sınıfımız var. A ve B sınıfımızında birer denemeMetodu isimli metodu olsun. Ben bu metodları şu şekilde çağırabilirim.
var denemeArray = [];
denemeArray.push(aNesnesi);
denemeArray.push(bNesnesi);
var fakeFunction=function(nesne){
nesne.denemeMetodu();
}
for(var i=0;i<denemeArray.length;i++){
fakeFunction(denemeArray[i]);
}
Şimdi yukarıda javascript ile birbirinden tamamen bağımsız olan A ve B sınıflarının ortak olan metodunu sanki bunların atası aynıymış gibi (tamam teorik olarak hepsi object ten türüyor ama aynı değil) kullanabildik ve nesnenin ne oldugunu önemsemeden denemeMetodunu çağırabildik. Böyle birşeyi java ve ya c# ta nasıl sağlardık? Pseu olarak yazıyorum.
class C{
}
class A extends C{
public void denemeMetodu(){
}
}
class B extends C{
public void denemeMetodu(){
}
}
class E{
public static void cDenTuretilenleriAl(C nesne){
nesne.denemeMetodu();
}
public static void main(string [] args){
A aSinifi = new A();
B bSinifi = new B();
cDenTuretilenleriAl(aSinifi);
cDenTuretilenleriAl(bSinifi);
}
}
Yukarıda da cDenTuretilenleriAl ın parametre olarak A ve B sınıflarını beraber kabul edebilmesi için A ve B sınıflarını C den türetip parametre olarak C sınıfını geçtik. Şimdii...
.net içerisine 4 ile gelen dynamic tip ile bunu şöyle yazabiliyoruz.
class A{
public void denemeMetodu(){
}
}
class B{
public void denemeMetodu(){
}
}
class E{
public static void cDenTuretilenleriAl(dynamic nesne){
nesne.denemeMetodu();
}
main(string [] args){
A aSinifi = new A();
B bSinifi = new B();
cDenTuretilenleriAl(aSinifi);
cDenTuretilenleriAl(bSinifi);
}
}
böylece ne oldu. cDenTuretilenleriAl na çok biçimlilik kazandırmış olduk. Hemde kalıtım özelliğini kullanmadan. Bu kullanımın performans olayını falan bilmiyorum stress testi yapmak lazım ama bence bunu yapabilmesi için arkada biryerlerde yine reflection kullanıyordur. Reflection da java dan tanıdığım kadarıyla performans konusunda biraz sıkıntılı. Son çare dir her zaman.
mix-in olayına gelince. Buna fazla yazamıycam gücüm tükendi :-) Yine anladığım kadarıyla bir sınıfa çoklu kalıtım teknikleri kullanarak yeni özellikler katmak üzerine kurulu bi teknik. Mesela diyelim ki aynı özelliği kullanması gereken bir sürü class ın var. Run time da bu class ların tümüne birden bir özelliği katmana yarayan birşey bu olay. Ya da yine runtime da bazı sınıflara farklı işlevsellikleri kazandırmaya yarıyor. tabi bunu dediğim gibi kalıtım üzerinden yapıyorsun. Ama çoklu kalıtım. Yani bu teknik java c# gibi tekli kalıtım destekleyen dillerde kullanılamaz.Phyton gibi çoklu kalıtım destekleyen bir dilde kullanılabilir. Çünkü adam bi sınıfı sürekli extension lar ekliyor ve biz c# ta ve java da bir sınıfı sadece 1 sınıftan extend edebiliyoruz. tabi istediğimiz kadar interface den implement edebiliriz fakat metodların implementasyonları olmamış olur fakat bu teknik için implemantasyonları yapılmış metodlara ihtiyac var o yüzden sınıfa ihtiyacımız var.
Umarım biraz birşeyler anlatabilmişimdir dostum. Kolay gelsin.
Kaydol:
Kayıtlar (Atom)