Arda Çetinkaya Thoughts on software, with the occasional personal rambling…

Önceki yazılarımdan bir tanesinde TypeScript’den bahsetmeye çalışmıştım. Sonunda da oldukça basit bir kod örneği ile biraz dikkatleri çekmek istemiştim. Javascript oldukça esnek bir dil olduğundan, öğrenmesi daha doğrusu düşündüğünüz şeylerin implementation’ı biraz zor. TypeScript, OOP notasyonlarına daha uygun bir dil olduğu için, OOP ile uğraşanlara bu açıdan bazı şeyler daha kolay gelecektir. Ama bu noktada da Javascript’in ve TypeScript’in iyi anlaşılıyor olması gerekmekte. Bundan dolayı önceki örnek üzerinden giderek, çok basit bir şekilde bir örnek daha paylaşmak istiyorum. Bunun üstüne birşeyler koyarak TypeScript tarafında bazı şeyleri beraberce zamanla görmüş olabiliriz. İlerleyen günlerde OOP yaklaşımlarına ve C#’daki benzer şeylere göre örnekleri geliştiriyor olacağım. Sizinde sorularınız olursa, sormaktan çekinmeyin. Bu arada çok basit diyorum ama tabi ki temel Javascript bilgisi şart…

TypescriptCapture1

Bu örneğimizde daha önceki yazıdaki kod parçasını biraz dana anlamlı hale getiriyoruz. Basit bir alışveriş listesi yapıyor olacağız. Bir tane text alanından girdiğimiz şeyleri, listemize atıyor olacağız. Daha sonra listemizdeki bir elemana tıkladığımızda, onu listeden üstünü çizerek kaldırmış olacağız.

 

 

 

Bunun için önce alışveriş listemizdeki elemanları temsil edecek Note diye bir sınıf yapıyoruz.

//Alışveriş listemizdeki elemanları temsil edecek
//Note diye bir sınıfımız olsun.
class Note {

    //DOM'daki HTMLElement tipinde karşılığı
    private _container: HTMLElement;
    //Listedeki elemanımız içeriği
    private _text: string;

    constructor(t: string) {
        //Constructor'da text'imizi set ediyoruz.
        this._text = t;

        //DOM'da ki elemanı bir DIV olarak tanımlayıp
        //text'i bu div'in innertext değişkenine atıyoruz.
        this._container = document.createElement("div");
        this._container.innerText = this._text;

        //DIV'imize tıklandığı zaman listemizdeki elemanın
        //üstünü çizip,italik yapıyoruz
        this._container.onclick = () =>
        {
            this._container.style.textDecoration = 'line-through';
            this._container.style.fontStyle = 'italic';
        }
    }

    public GetText(): string {
        return this._text;
    }

    //Listemizdeki item'ı verilen HTML parent elemanına
    //ekleyip, render yapıyoruz diyebiliriz.
    public Render(parent:HTMLElement) {
        parent.appendChild(this._container);
    }

}

Alışveriş listemizi yaratacak olan sıfımızıda aşağıdaki gibi tanımlıyoruz.


class CustomHTMLControl {

    container: HTMLElement;
    header: HTMLElement;
    content: HTMLElement;
    footer: HTMLElement;
    inputField: HTMLInputElement;
    private button: HTMLInputElement;

    //Listemizde ki elemanları Note tipinde bir array'de tutuyoruz.
    private _notes: Note[] = [];
    private noteCount: number = 0;

    constructor(element: HTMLElement) {

        //DOM içerisindeki gerekli elemanları yaratıyoruz
        //Burada içeriği almak için bir tane input alanımız
        //bir tane button yeterli olacaktır.
        //Button'a tıkladığımızda, Note tipinde bir elemanı
        //listemize ekliyoruz.
        this.container = element;
        this.header = document.createElement('div');
        this.header.innerText = 'This is a Shopping List';
        this.container.appendChild(this.header);

        this.inputField = document.createElement("input");
        this.inputField.type = "text";

        this.container.appendChild(this.inputField);

        this.content = document.createElement("div");
        this.button = document.createElement("input");
        this.button.type = "button";
        this.button.value = "Add";

        //Burada bind(this) ifadesini kullanmazsak
        //onClick metodunda bu sınıf içerisinde ki local
        //değişkenlere ulaşamıyor oluruz. Bunun yerine
        //Fat Arrow fonksiyon deklarasyonunu da yapabiliriz.
        //TypeScript Fat Arrow deklarasyonunu da destekliyor.
        this.button.onclick = this.onClick.bind(this);

        this.content.appendChild(this.button);
        this.container.appendChild(this.content);

        this.footer = document.createElement("div");

        this.container.appendChild(this.footer);
    }

    public onClick(ev: MouseEvent) {
        //Listemizdeki eleman sayısını artırıyoruz.
        //Belki bu sayıyı göstermek isteriz.
        this.noteCount += 1;

        //Array'e ekliyoruz.
        this._notes.push(new Note(this.inputField.value));
        this.inputField.value = '';
        this.Render();

    }

    public Render(): void {
        //Array'mizden alıp; -ki burada aldığımız eleman Note tipinde olacaktır.
        var note = this._notes.pop();
        note.Render(this.content);
    }

}

window.onload = () => {
    //HTML sayfamızdaki herhangi bir div içeriğine ekliyoruz
    //oluşturduğumuz kontrolü
    var parent = document.getElementById('content');
    var customControl = new CustomHTMLControl(parent);
};

Agile yazılım geliştirme metodolijilerinden Scrum‘ın yaratıcılarından biri olan Jeff Sutherland 16-17 Ocak 2014 tarihinde Scrum Turkey’in düzenlediği bir etkinlikle İstanbul’da. 2 günlük bir eğitim için ülkemizde bulunacak Jeff Sutherland, bu etkinlik kapsamında Certified Scrum Master eğitimini veriyor olacak. Özellikle Jeff Sutherland’dan bu eğitimi almak, böyle bir fırsata sahip olmak kaçırılmayacak bir fırsat. İlgilenenlere ve imkanı olanlara şiddetle tavsiye ederim. İmkanı olanlara diyorum çünkü ücretli bir eğitim. Daha fazla ayrıntıyı ve katılım ile ilgili bilgileri http://www.creatorofscruminturkey.com/ adresinden takip edebilirsiniz.

Eğitime katılma imkanı ya da fırsatı bulumayacaklar için 16 Ocak 2014 akşamı 19:00-21:00 arası Jeff Sutherland’in konuşmacı olarak katılacağı ücretsiz bir etkinlik olacak. Bunu da hatırlatmak isterim… Bu etkinlik ile ilgili ayrıntılar zaman yaklaştıkca Scrum Turkey‘in web sitesinde olacaktır. Tarihi not alıp, siteyi takip edin derim.

Jeff Sutherland İstanbul'da...

Aşağıda Jeff Sutherland’in 5-6 yıl önce Google TechTalks’da “The Secret Sauce of Improving Your Scrum Team” konulu konuşmasını da izlemenizi tavsiye ederim.

TypeScript, geçen sene Microsoft’un çıkardığı yeni bir dil. Aslında tam olarak sadece yeni bir dil demek çok doğru olmaz. Javascript’in bir üst kümesi olarak ortaya çıkan, syntax olarak Javascript’e benzeyen, farklı bir grammer’i olan bir dil diye biraz daha anlamlı hale getirebiliriz.

TypeScriptJavascript, bildiğiniz üzere strongly-typed bir değil. Dolayısıyla oldukça esnek ve genişletilebilir. Oldukça güzel bir özellik belki ama geliştirmeyi zorlaştıran da bir özellik diyebilirim. C#, Java gibi strongly-typed diller ile geliştirme yapan kişiler özellikle oldukça zorlanır. TypeScript’in en büyük özelliği ve artısı belki bu noktada ortaya çıkıyor. TypeScript dilinin compile zamanında strong-type özelliği olması ama runtime’da klasik bir Javascript gibi çalışıyor olması, javascript geliştirenler için oldukça büyük bir kolaylık sağlıyor.

Bu son cümlede aslında yanlış bir ifade kullandım. Dikkat çekmek adına bile bile yaptığımı belirtmek isterim. “Javascript gibi çalışıyor” ifadesinde ki “gibi” aslında fazla oldu. TypeScript ile yapmış olduğunuz geliştirme derlendikten sonra Javascript’e dönüşüyor. Yani aslında çalışan şey direk Javascript. Javascript ile oldukça karmaşık ve zor bir şekilde yapabileceğin şeyleri, TypeScript kolayca yapmanızı sağlıyor diyebilirim.

Peki neden TypeScript? Neden şimdi?

TypeScript diline benzer, aynı yaklaşımla ortaya çıkmış CoffeeScript,Dart gibi başka diller de var aslında. Hatta bunlar TypeScript’den de önce var olan diller. Typescript’in bu açıdan farkı, .NET Framework’ündeki yaklaşım ve temel OOP prensiplerine dayalı geliştiriliyor olması. Bu açıdan server üzerinde uygulama geliştiren kişilerin, benzer yaklaşımla Javascript yazabiliyor olması TypeScript ile oldukça kolay. Özellikle Visual Studio gibi bir IDE’de yazabiliyor olmak oldukça kolaylık sağlıyor.

Neden şimdi sorusuna da; gelişen web teknolojilerinin ortaya çıkardığı ihtiyaçları, daha kaliteli ve hızlı bir şekilde karşılayabilmek adına, geliştirmenin kolay olması gerektiğinden diyerek kendi adıma cevap verebilirim.

TypesSript, inheritance, interfaces,encapsulation gibi OOP prensiplerine de destek vermekte. Dolayısıyla Javascript tarafında sadece fonksiyon olan kavramları biraz daha somut hale getirmek, hali hazırda OOP prensiplerine aşina olan kişilere oldukça kolay gelecektir.

TypeScript’e başlamak için http://www.typescriptlang.org/ adresine gitmeniz yeterli olacaktır. Visual Studio için ilgili eklentiyi yükledikten sonra, Visual Studio üzerinden, yeni gelen proje şablonları ile hemen geliştirmeye başlayabilirsiniz. Yok ben Visual Studio kullanmak istemiyorum derseniz de, Node.js üzerinden de TypeScript’i compile edebileceğiniz modül mevcut.

Daha v1.0 versiyonu ne yazık ki yayınlanmadı. 0.9.1.1 versiyonu ile ama sona çok yaklaşıldığını söyleyebilirim. Kendi projelerimde yavaştan hatta kullanmaya başladım. İlerleyen günlerde biraz daha ayrıntılı olarak TypeScript’e değiniyor olacağım. Şu an böyle giriş niteliğinde bir yazı olsun istedim. O yüzden fazla uzatmıyorum. Daha uzun ve ayrıntılı olarak aşağıda Anders Hejlsberg’ın Channel 9’da ki TypeScript videosu ve altında kendi yazdığım basit bir örnek ile bitiriyorum.

TypeScript ile yazmış olduğumuz kod örneği;


class CustomHTMLControl
{
    //sınıfımdaki değişkenler
    //3 tane HTMLElement tipinde
    //1 tane private HTMLInputElement tipinde
    //1 tane private number tipinde
    container: HTMLElement;
    header: HTMLElement;
    content: HTMLElement;
    private button: HTMLInputElement;
    private  dummy: number=0;

    //sınıfımın constructor'ı
    //bunun içinde OOP yaklaşımı doğrultusunda
    //nesnemi oluşturmak için gerekli tanımlamaları yapıyoruz
    constructor(element: HTMLElement)
    {
        this.container = element;
        this.header = document.createElement('div');
        this.header.innerText = 'This is CustomHTMLControl';
        this.container.appendChild(this.header);

        //Bir tane de metodumuz olsun
        this.initContent();
    }

    //private olan bu metodu sadece bu sınıf içerisinde
    //kullanabiliyoruz.
    private initContent()
    {
        this.content = document.createElement("div");
        this.button = document.createElement("input");
        this.button.type = "button";
        this.button.value = "Hello World";

        this.button.onclick = this.onClick;

        this.content.appendChild(this.button);
        this.container.appendChild(this.content);
    }
    //Button'a tıklandığında ki metodumuz
    public onClick() {

        alert('You just clicked the button');
    }

    //public bir metodumuz olsun.
    //Nesnemiz üzerinden bu metoda ulaşabiliyor olacağız.
    GetClickCount()
    {
        return this.dummy;
    }

}

window.onload = () => {
    var parent = document.getElementById('content');
    var customControl = new CustomHTMLControl(parent);

};

Derlendiği zaman ortaya çıkan Javascript kodu

var CustomHTMLControl = (function () {
    //sınıfımın constructor'ı
    //bunun içinde OOP yaklaşımı doğrultusunda
    //nesnemi oluşturmak için gerekli tanımlamaları yapıyoruz
    function CustomHTMLControl(element) {
        this.dummy = 0;
        this.container = element;
        this.header = document.createElement('div');
        this.header.innerText = 'This is CustomHTMLControl';
        this.container.appendChild(this.header);

        //Bir tane de metodumuz olsun
        this.initContent();
    }
    //private olan bu metodu sadece bu sınıf içerisinde
    //kullanabiliyoruz.
    CustomHTMLControl.prototype.initContent = function () {
        this.content = document.createElement("div");
        this.button = document.createElement("input");
        this.button.type = "button";
        this.button.value = "Hello World";

        this.button.onclick = this.onClick;

        this.content.appendChild(this.button);
        this.container.appendChild(this.content);
    };

    //Button'a tıklandığında ki metodumuz
    CustomHTMLControl.prototype.onClick = function () {
        alert('You just clicked the button');
    };

    //public bir metodumuz olsun.
    //Nesnemiz üzerinden bu metoda ulaşabiliyor olacağız.
    CustomHTMLControl.prototype.GetClickCount = function () {
        return this.dummy;
    };
    return CustomHTMLControl;
})();

window.onload = function () {
    var parent = document.getElementById('content');
    var customControl = new CustomHTMLControl(parent);
};
//# sourceMappingURL=app.js.map

Microsoft’tan Ümit Sunar, Windows Azure ile ilgili, baştan sona güzel bir giriş webiner serisi hazırlamış. Biraz geç paylaşıyorum ama seri daha başında ve devam ediyor. Windows Azure hakkında biraz olsun bilgi sahibi olup ama nereden başlayıp nereye gitmek konusunda soru işaretleri olanlara şiddetle tavsiye ederim…Kaçırmayın…

#1 – Windows Azure Overview: Cloud?

Title: Windows Azure Overview: Cloud?
Description: “Starting is Half the Task” and this session targets to give an overview of Cloud Computing and Windows Azure in your journey.
We’ll answer frequently asked questions such as “What is Windows Azure?”, “How Cloud Computing may help you?” and share Windows Azure resources that’ll help you to accelerate your adoption to Windows Azure
– Windows Azure InfoKit (http://aka.ms/WAInfoKit )
– Windows Azure Learning Poster (http://aka.ms/LearningPoster )
– Windows Azure Training Kit (http://aka.ms/g2jucu )
LiveMeeting URL: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032565435&Culture=en-TR&community=0
Date/Time: 9/24/2013 – 3:00pm – 4:30pm
Click here to see in your local time: http://bit.ly/18RmDHF


#2 – Windows Azure Web Sites: Create your Web Site in the Cloud in 5 min

Title: Windows Azure Web Sites: Create your Web Site in the Cloud in 5 min
Description: Windows Azure Web Sites is a simple and powerful hosting platform that helps you to easily build and deploy your web applications. You can develop using ASP.NET, PHP, Node.js and Python with your favorite frameworks (MVC 4, Django, Express), integrate with source control systems and manage with PowerShell, REST API or CLI Tools.
LiveMeeting URL: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032565443&Culture=en-TR&community=0
Date/Time: 10/01/2013 – 3:00pm – 4:30pm
Click here to see in your local time: http://bit.ly/19wUM0o


#3 – WAMSA #1: Windows Azure Mobile Services Academy

Title: WAMSA #1: Windows Azure Mobile Services Academy
Description: Mobile Services is state of the art cloud backend for all kind of applications and you can integrate it with almost all kind of applications. This session covers the basics of Windows Azure Mobile Services, integration with Windows Store, Windows Phone 8, iOS (iPhone, iPad), Android and HTML applications, authentication and authorization with Microsoft Account, Facebook, Twitter, Google, push notifications, source control and custom API.
Extending your applications is really simple and beneficial with Windows Azure Mobile Services.
LiveMeeting URL: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032565445&Culture=en-TR&community=0
Date/Time: 10/10/2013 – 3:00pm – 4:30pm
Click here to see in your local time: http://bit.ly/15lH5FJ

Devam…

Veritabanı uygulamaları yapan her yazılımcı, bir şekilde zamanı geldiğinde; -ki kesin gelir, veritabanı üzerinde çeşitli performans kriterlerine dikkat etmek durumda kalır. Çeşitli kontroller ile sistemin performansını ölçüp, gerekirse iyileştirmeleri bunların sonuçlarına göre yapar…

SQL Server ile uygulama geliştirirken zaman zaman kullandığım ve oldukça işime yarayan, hatta çoğu zaman hayat kurtarmaya bile destek sağlayan bir kaç SQL script’ini derledim. Benzerleri hatta daha faydalı olanlarını Google’da da çok rahat bulabilirsiniz. Burada benim işimi görenleri derleyip paylaşmak istedim, belki birilerinin daha işini görür.

En çok CPU tüketen 50 sorgu


select
 q.,
 SUBSTRING(q.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(q.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text,
 qs.last_execution_time,
 qs.execution_count,
 qs.total_worker_time/1000000 as total_cpu_time_sn,
 qs.total_worker_time/qs.execution_count/1000 as avg_cpu_time_ms,
 qp.query_plan,
 DB_NAME(q.dbid) as database_name,
 q.objectid,
 q.number,
 q.encrypted
from
 (select top 50
 qs.last_execution_time,
 qs.execution_count,
 qs.plan_handle,
 qs.total_worker_time,
 qs.statement_start_offset,
 qs.statement_end_offset
 from sys.dm_exec_query_stats qs
 order by qs.total_worker_time desc) qs
cross apply sys.dm_exec_sql_text(plan_handle) q
cross apply sys.dm_exec_query_plan(plan_handle) qp
order by qs.total_worker_time desc

En çok I/O yapan 50 sorgu


select
 q.,
 SUBSTRING(q.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(q.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text,
 qs.last_execution_time,
 qs.execution_count,
 qs.total_logical_reads as total_logical_read,
 qs.total_logical_reads/execution_count as avg_logical_read,
 qs.total_worker_time/1000000 as total_cpu_time_sn,
 qs.total_worker_time/qs.execution_count/1000 as avg_cpu_time_ms,
 qp.query_plan,
 DB_NAME(q.dbid) as database_name,
 q.objectid,
 q.number,
 q.encrypted
from
 (select top 50
 qs.last_execution_time,
 qs.execution_count,
 qs.plan_handle,
 qs.total_worker_time,
 qs.total_logical_reads,
 qs.statement_start_offset,
 qs.statement_end_offset
 from sys.dm_exec_query_stats qs
 order by qs.total_worker_time desc) qs
cross apply sys.dm_exec_sql_text(plan_handle) q
cross apply sys.dm_exec_query_plan(plan_handle) qp
order by qs.total_logical_reads desc

Index’lerin fragmentation oranları

Devam…