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

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>
    ...

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.