Infix, Prefix, Postfix Notasyonu

Bilgisayarda 3 x 4 + 5 vb. aritmetik ifadeleri çözümlemek zor olabilir. Yazacağımız kodda, işlem öncelikleri ve parantezler ifade sonucunu bulmayı zorlaştırabilir. Bu yüzden, aritmetik ifadeleri göstermek için farklı notasyonlar geliştirilmiştir.

Infix Notasyonu

Halihazırda kullandığımız notasyondur. 3 + 4 örneğinde olduğu gibi, operatörler ifade içerisindedir.

3 + 4 x 5 örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından toplama işlemi yapılır.

İşlem sırasını değiştirmek için parantezler kullanılır. Örneğin, (3 + 4) x 5

Prefix Notasyonu (Polish Notation)

+34 örneğinde olduğu gibi operatörler, işleme sokulacak ifadelerin öncesine yazılır. Verilen örnekte, iki sayı toplanmak istenmektedir.

+3x45 örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından, bulunan çarpım sonucu ile toplama işlemi yapılır. (Daha anlaşılır olması için +3x45 ifadesini +3[x45] şeklinde anlayabiliriz.)

İşlem önceliğini değiştirmek için parantez kullanmak gerekmez. Örneğin, (3 + 4) x 5 ifadesi x+345 şeklinde ifade edilir. Toplama işlemi yapıldıktan sonra, bulunan toplam sonucuna çarpma işlemi uygulanır. (Daha anlaşılır olması için x+345 ifadesini x[+34]5 şeklinde anlayabiliriz.)

Postfix Notasyonu (Reverse Polish Notation)

34+ örneğinde olduğu gibi operatörler, işleme sokulacak ifadelerin sonrasına yazılır. Verilen örnekte, iki sayı toplanmak istenmektedir.

345x+ örneğinde olduğu gibi, operatörler arasında işlem önceliği vardır. Verilen örnekte, ilk olarak çarpma işlemi, ardından, bulunan çarpım sonucu ile toplama işlemi yapılır. (Daha anlaşılır olması için 345x+ ifadesini 3[45x]+ şeklinde anlayabiliriz.)

İşlem önceliğini değiştirmek için parantez kullanmak gerekmez. Örneğin, (3 + 4) x 5 ifadesi 34+5x şeklinde ifade edilir. Toplama işlemi yapıldıktan sonra, bulunan toplam sonucuna çarpma işlemi uygulanır. (Daha anlaşılır olması için 34+5x ifadesini [34+]5x şeklinde anlayabiliriz.)

Tüm notasyonlarda işlem önceliği; parantez, üs alma, çarpma / bölme, toplama / çıkarma şeklindedir. Aynı işlem önceliğine sahip birden fazla ifadenin gelmesi durumunda, üs alma hariç, soldan sağa doğru işlemler yapılır.

.NET Proje - Link Kısaltma Servisi

Link Kısaltma Servisi uzun linkleri kısaltmak için kullanılan bir yöntemdir. Genel olarak, Twitter, SMS vb. karakter sınırı olan ortamlarda uzun linkleri paylaşmak ve link tıklamalarını raporlamak için tercih edilir.

Proje ile, kullanıcıların uzun linklerini kısaltabileceği ve görüntüleme raporlarına erişebileceği, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Link kısaltma işlemi sırasında, linkleri açmak için parola ve süre belirleme, kullanıcı kısıtlama, link görüntülenme sırasında bildirimler alma vb. bir dizi özellik de uygulanacaktır.

Link Kısaltma Servisi

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Linkleri kısaltmak ve link tıklama raporlarına erişmek için hazırlanacak web uygulaması

SQL Server

Link verilerinin ve yapılan tıklamaların tutulacağı veritabanı

LINQ to SQL

Veritanını üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

SMTP

Link tıklamalarını link sahiplerine bildirmek için kullanılacak, elektronik posta gönderme protokolü

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

AJAX

AJAX (Asynchronous JavaScript And XML)

AJAX ile web sayfası yüklendikten sonra, sunucu üzerine veri göndermek ve sunucudan veri almak mümkündür. Böylece, sayfa yenilenmeden, sayfanın belirli bir bölümünün, sunucu tarafından alınan verilerle yenilenebilir.

AJAX

Sunucu ile iletişimi sağlamak için XMLHttpRequest nesnesi kullanılır. Tüm modern tarayıcılar XMLHttpRequest nesnesini destekler.

XMLHttpRequest nesnesi metotları

open(method, url, async) isteği oluşturur. method GET ya da POST olabilir. url iletişimin kurulacağı adrestir. async ise, iletişimin senkron ya da asenkron bir şekilde yapılacağını belirler. Asenkron işlemde, sunucu cevabı beklenmeksizin sayfa çalışmaya devam eder.

send() oluşturulan istediği sunucuya gönderir. method GET olarak seçildiği zaman kullanılır.

send(str) oluşturulan istediği sunucuya gönderir. method POST olarak seçildiği zaman kullanılır.

XMLHttpRequest nesnesi özellikleri

readyState XMLHttpRequest nesnesinin mevcut durumunu gösterir. 4 değeri, sunucu ile iletişimin kurulduğunu ve cevabın hazır olduğunu gösterir.

onreadystatechange readyState özelliğinde bir değişim olduğu zaman çağrılır. Örneğin, sunucuya yapılan istediğin tamamlanması durumunda tetiklenir.

status sunucudan alınan cevabın durumunu gösterir. 200 OK, 404 Not Found, 500 Internal Server Error vb. Ayrıca statusText özelliği de mevcuttur.

responseText sunucudan alınan cevaptır. Eğer sunucudan XML sonuç alınıyorsa, responseXML özelliği de kullanılabilir.

Örnek AJAX Kullanımı

<script type='text/javascript'>

    var request = new XMLHttpRequest();

    request.onreadystatechange = function () {
        // Sunucu cevabı hazır ve sunucudan bir hata alınmadıysa (200: OK)
        if (this.readyState == 4 && this.status == 200) {
            // Sunucudan dönen cevap
            var txt = this.responseText;
        }
    };

    // İstek oluşturuluyor.
    request.open("GET", "demo.aspx", true);

    // İstek gönderiliyor.
    request.send();

</script>

JQuery ile AJAX Kullanımı

JQuery kütüphanesi ile, tüm tarayıcılar ile uyumlu ve daha basit bir şekilde AJAX kullanımı mümkündür.

$.ajax() AJAX istediği oluşturur.

Örneğin, ASP.NET demo.aspx sayfası arkasında yer alan aşağıdaki metodun sonucunu sayfada göstermek istediğimiz zaman:

// JavaScript tarafından bu metoda erişebilmek için eklenmesi ve metodun statik olarak tanımlanması gerekiyor.
[WebMethod]
public static string Method1(string name, int number)
{
    return name + number;
}

JQuery ile yazılmış ilgili AJAX isteği:

<script type='text/javascript'>

    $.ajax({
        type: "POST", // GET ya da POST olabilir
        url: "demo.aspx/Method1", // Url
        data: '{"name":"selami","number":"3"}', // Sunucuya gönderilen veri
        contentType: "application/json",
        success: function (msg) {
            alert(msg.d);
        },
        error: function (err) { alert(err.responseText); }
    });

</script>

Data fazla detay için http://api.jquery.com/jquery.ajax/

Etiketler:  JavaScript

SQL Server Sparse Columns

Bir sütunun verileri genellikle NULL değer alıyorsa, saklanan verinin daha az yer kaplaması için, sütunun Sparse özelliğinin ayarlanması gerekiyor. Böylece %20 ile %40 arasında yer tasarrufu sağlanmış olur.

SQL Server, Sparse özelliği atanmış bir sütunun verilerini saklarken, NULL olmayan değerler için normalden daha fazla yer kullanırken NULL değerler içinse disk alanı kullanmaz. Bu yüzden, sadece NULL değerlerin çokça olduğu sütunlar için Sparse özelliğinin ayarlanması gerekmektedir.

sparse

https://msdn.microsoft.com/en-us/library/cc280604.aspx adresinde, hangi veri tipinde ne kadar yer kazancı olduğu tablo şeklinde verilmiştir.

Etiketler:  SQL

JQuery Cheat Sheet

JQuery, açık kaynak kodlu ve oldukça popüler JavaScript kütüphanelerinden birisidir. JQuery ile daha az zahmetle, anlaşılır, daha az hataya sahip ve tarayıcıdan bağımsız JavaScript kodları yazmak mümkündür.

JQuery

En sık kullandığım JQuery ifadeleri aşağıda listelendi.

Örnek HTML içerik. Bu içerik üzerinde aşağıdaki JQuery metotları uygulanacak.

 <div id="container">
    <a href="#" class="link">Link 1</a>
    <a href="#" class="link">Link 2</a>
    <input type="text" />
</div>

JQuery metotları

Sayfaya JQuery kütüphanesi eklemek için (CDN üzerinden)

<script src="https://code.jquery.com/jquery-latest.min.js"></script>
$(document).ready(function () { // Sayfa yüklenmesi bittikten sonra çalışacak JavaScript kodu });

$("#container"); // id değeri 'container' olan elaman seçiliyor.
$(".link"); // class değeri 'link' olan elamanlar seçiliyor.
$("input"); // Tüm input elamanları seçiliyor.
$("input[type='text']"); // Attribute kullanılarak elamanlar seçiliyor.
$("#container, .link, input"); // Birden fazla elaman aynı anda seçiliyor.
$("div > .link"); // Parent -> child ilişkisi (örnekte, div içerisinde .link sınıfına sahip tüm elemanlar seçiliyor)
$("div .link"); // Parent -> child ilişkisi (sadece bir alt seviye değil, tüm seviyelerdeki elemanlar seçiliyor)
$(".link").hide(); // Elemanları gizle
$(".link").show(); // Gizlenmiş elemanları görünür yap
$(".link").text(); // Eleman metnini al
$(".link").text("Link new text"); // Eleman metnini al
$("#container").html(); // Eleman HTML içeriğini al
$("#container").html("<a href='#'>new HTML content</a>"); // Eleman HTML içeriğini değiştir.
$("input").val(); // Eleman değeri alınıyor. (bu örnekte input metni)
$("input").val("newValue"); // Eleman değeri değiştiriliyor.
$(".link").attr("href"); // Elemanın özelliğini al (href özelliği alınıyor)
$(".link").attr("href", "http://www..."); // Elemanın bir özelliğini değiştir. Yoksa özelliği ekler.
$(".link").removeAttr("href"); // Elemanın özelliğini siliniyor.
$(".link").addClass("className"); // CSS sınıfı ekler
$(".link").removeClass("className"); // CSS sınıfını kaldırır
$(".link").hasClass("className"); // Eleman belirtilen CSS sınıfına sahip mi?
$("#container").css("propertyName"); // CSS style özelliğini geri döndürür. (örneğin, color)
$("#container").css("propertyName", "value"); // CSS style özelliği değiştiriliyor.
$("#container").width(); // Elemanın genişliği
$("#container").height(); // Elemanın yüksekliği,
$("#container").empty(); // Elemanın tüm içeriğini temizler
$(".link").remove(); // Elemanı siler
$(".link").wrap("<div class='new'></div>"); // Seçilen elemanların her birini, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip her bir elemanı div içerisine alıyor.)
$(".link").wrapAll("<div class='new'></div>"); // Seçilen elemanların tümünü, parametre olarak verilen elemanın içine koyar. (örnekte, .link sınıfına sahip tüm elemanları div içerisine alıyor.)
$(".link").unwrap(); // Seçilen elemanların parent elemanını siler. (örnekte, .link sınıfının yer aldığı div siliniyor.)
$("#container").append("<div class='new'></div>"); // Seçilen elemanların içerisine yeni bir eleman ekler.
$("#container").after("<div class='new'></div>"); // Seçilen elemanın peşine yeni bir eleman ekler.
$("#container").before("<div class='new'></div>"); // Seçilen elemanın öncesine yeni bir eleman ekler.
$(".link").parent(); // Seçilen elemanın içerisinde bulunduğu elaman alınıyor. (örnekte, .link sınıfına ait elamanların yer aldığı div)
$("#container").children(); // Seçilen elemanın tüm alt elemanları alınıyor. Sadece birinci seviyedeki elemanlar alınır.
$("#container").next(); // Sonraki eleman alınır.
$("#container").prev(); // Önceki eleman alınır.
$("#container").find("a"); // Seçilen elemanın, verilen kritere alt elemanları alınıyor. Tüm seviyedeki elemanlar alınır. (örnekte, div içerisindeki tüm a elamanları alınıyor)
$(".link").first(); // Seçilen elemanların ilki alınıyor.
$(".link").eq(1); // .link sınıfına ait ikinci eleman seçiliyor. (zero based index)
$(".link").slice(1, 2); // Seçilen elemanlardan sadece verilen aralıktakiler alınıyor. (örnekte, 2. ve 3. eleman alınıyor. üst sınır verilmezse, 2. elemandan itibaren tüm elemanlar alınır.)
$(".link").add("#container"); // Seçilen elemanlara yeni elemanlar ekler.
$(".link").filter(function () { return $(this).css("display") == "none"; }); // Filtre şartına uyan elemanlar seçiliyor. (örnek, .link sınıfına sahip ve gizlenmemiş tüm elemanlar seçiliyor)
$(".link").each(function (index) { return $(this).hide(); }); // Seçilen elemanların her biri için, verilen fonksiyondaki işlemi uygular.
$(".link").click(function () { alert(1); }); // Seçilen elemana tıklanıyor
$(".link").mouseover(function () { $(this).text("mouse over"); }); // Fare ile elemanın üzerine gelindi
$(".link").mouseout(function () { $(this).text("mouse out"); }); // Fare elemanın üzerinden ayrıldı
$(".link").first().focus(); // Seçilen elemana odaklan
$(window).resize(function () { alert(1); }); // Ekran büyültüldü ya da küçültüldü
Etiketler:  JavaScript

LINQ Cheat Sheet

LINQ kod içerisinde SQL tarzı sorgular yapabilmemize olanak sağlayan bir teknolojidir.

lambda

Urun nesnelerinin ve tamsayı değerlerinin yer aldığı iki farklı dizi üzerinde sorgulama işlemleri gerçekleştirilecektir.

        public class Urun
        {
            public int Numara { get; set; }
            public string Ad { get; set; }
            public string Kategori { get; set; }
            public double Deger { get; set; }
        }

        var dizi = new[] { 2, 3, 7, 4, 5, 4, 9, 1, 3 };
        var urunler = new[]
        {
            new Urun { Numara = 1, Ad = "Kalem", Kategori = "Kırtasiye", Deger = 3 },
            new Urun { Numara = 2, Ad = "Elma", Kategori = "Manav", Deger = 4.2 }
        };

Süzme (Filter)

        // Değeri 3 olan dizi elemanları alınıyor
        var sonuc = (from c in dizi
                        where c == 3
                        select c);

        // 2 farklı kritere göre süzme
        var sonuc = (from c in urunler
                        where c.Kategori == "Manav" && c.Deger > 1
                        select c);

        // Lambda Syntax
        var sonuc = urunler.Where(c => c.Ad == "Elma");

Yansıtma (Projection)

        // Ürünlerin sadece belirli özellikleri listeleniyor.
        // Anonim tip geri döndürülüyor.
        var sonuc = (from c in urunler
                        select new
                        {
                            c.Numara,
                            c.Ad
                        });

        // Lambda Syntax
        var sonuc = urunler.Select(c => new
        {
            c.Numara,
            c.Ad
        });

Sıralama (Order)

        // Dizi tersten sıralanıyor.
        var sonuc = (from c in dizi
                        orderby c descending
                        select c);

        // Birden fazla alana göre sıralanıyor.
        // İlk olarak değere, daha sonra kategoriye göre sıralanır. (sondan başa doğru)
        var sonuc = (from c in urunler
                        orderby c.Kategori, c.Deger descending
                        select c);

        // Lambda Syntax
        var sonuc = urunler.OrderByDescending(c => c.Deger).ThenBy(c => c.Kategori);

Birleştirme (Join)

        // İki liste birleştirilerek, listelerin sadece belirli özellikleri alınıyor.
        var sonuc = (from c in dizi
                        join urun in urunler on c equals urun.Numara
                        select new
                        {
                            c,
                            urun.Ad
                        });

        // Left join
        var sonuc = (from c in dizi
                        join u1 in urunler on c equals u1.Numara into u2
                        from urun in u2.DefaultIfEmpty()
                        select new
                        {
                            c,
                            urun.Ad
                        });

Gruplama (Group)

        // Ürünler kategorilerine göre gruplanıyor.
        // Her bir kategori grubunda kaç adet ürün bulunduğu ve kategorinin toplam değeri listeleniyor.
        var sonuc = (from c in urunler
                        group c by c.Kategori into g
                        select new
                        {
                            Kategori = g.Key,
                            Adet = g.Count(),
                            ToplamDeger = g.Sum(k => k.Deger)
                        });

        // Birden fazla alana göre gruplama
        var sonuc = (from c in urunler
                        group c by new { c.Ad, c.Kategori } into g
                        select new
                        {
                            g.Key.Kategori,
                            Adet = g.Count(),
                            ToplamDeger = g.Sum(k => k.Deger)
                        });
Etiketler:  C#

C# Nesne Özelliklerine Varsayılan Değer Atama

tip

Bir nesne üzerindeki özelliklerin varsayılan değerlerini atama işlemi yapıcı içerisinde yapılmaktadır. C# 6.0 ile beraber bu işlem, artık özelliğin tanımlandığı yerde yapılabilmektedir.

Eski kullanım

    public class Ogrenci
    {
        public int Numara { get; }
        public string AdSoyad { get; set; }

        public Ogrenci()
        {
            this.Numara = 3;
            this.AdSoyad = "Selami Güngör";
        }
    }

Yeni kullanım

    public class Ogrenci
    {
        public int Numara { get; } = 3;
        public string AdSoyad { get; set; } = "Selami Güngör";
    }
Etiketler:  C#

C# 6.0 Null Kontrolü

tip

Bir nesnenin özelliklerine ya da metotlarına erişmeden önce, nesne değerinin null olup olmadığının kontrol edilmesi gerekmektedir. Aksi halde NullReferenceException hatası fırlatılır.

Örneğin, str adı tanımlanmış bir string nesnesinin uzunluğu alınmak isteniyor. Uzunluk alınmadan önce ilk olarak str değerinin null olup olmadığının kontrol edilmesi gerekiyor. C# 6.0 ile beraber, bu kontrol aşağıdaki gibi ?. operatörü ile yapılabilir.

var length = str?.Length;

İşlem sonunda, eğer str değeri null ise, null değeri döndürülür. Aksi halde string uzunluğu elde edilir.

Etiketler:  C#

Generic Singleton Pattern & C#

Generic Singleton pattern with C# and .NET 4 (or higher)

// T is a class and must have a public default constructor.

public sealed class Singleton<T> where T : class, new()
{
    private static readonly Lazy<T> instance = new Lazy<T>(() => new T());
        
    public static T Instance
    {
        get
        {
            return instance.Value;
        }
    }

    private Singleton() { }
}

Usage:

var myClass = Singleton<MyClass>.Instance;
Etiketler:  C#

.NET Proje - Website Health Monitoring

Website Health Monitoring sistemleri, web sitesinin çalışır durumda olup olmadığını, veritabanı bağlantısı, e-posta gönderimi gibi işlemlerin sorunsuz bir şekilde yapılıp yapılmadığını düzenli aralıklarla kontrol eden ve sorun tespit etmesi durumunda, ilgili kişileri uyaran sistemlerdir.

Proje ile, birçok web uygulamasını aynı anda kontrol eden, sonuçlara İnternet tarayıcısı ya da mobil uygulama üzerinden erişebileceğimiz, bulut üzerinden çalışan bir .NET uygulaması hazırlanması amaçlanmıştır.

Website Health Monitoring

Projede bileşenleri ve kullanılacak teknolojiler aşağıdaki gibidir:

ASP.NET MVC Web Uygulaması

Kontrol edilecek web sitelerini kaydetmek ve monitör edilen web sitelerinin raporlarına erişmek için hazırlanacak web uygulaması

Apache Cordova Mobil Uygulaması

Monitör raporlarına mobil cihazlar üzerinden erişmek ve sorunlar hakkında anlık uyarılar almak için hazırlanacak mobil uygulama

Windows Service

Web sitesi kontrol işlemlerinin, belirli aralıklarla otomatik olarak yapılması ve sorun tespiti sırasında yetkililerin uyarılması için hazırlanacak Windows servisi

SQL Server

Web sitesi verilerinin ve kontrol sonuçlarının tutulacağı veritabanı

LINQ to SQL

Veritanını üzerinde sorgulamalar yapma ve verileri yönetmek için kullanacağımız .NET bileşeni

SMTP

Sorunları web sitesi sahibi yetkililere bildirmek için kullanılacak, elektronik posta gönderme protokolü

C#, HTML, CSS

Uygulama C# ile yazılacaktır. Ekranlar için HTML ve CSS konuları konusunda bilgi sahibi olmak gerekecektir.

Sayfa 1 2 3

Kategoriler

Algoritma (5), Cheat Sheet (2), İpucu (4), Kendime Not (1), Kitap (3), Kod (5), Matematik (1), Proje (5), Veritabanı (3), Workshop (3)

Etiketler

C# (11) HTML (1) JavaScript (2) SQL (3)

İngilizce / Türkçe

İngilizce / Türkçe kelime listesi kendime not