25 Aralık 2015 Cuma

Labtop Isınma Sorununu Giderme


Geçtiğimiz günlerde bilgisayarıma uzun süredir bakım yapmamamdan kaynaklı aşırı ısınma sorunu vardı.Önce fan alıp bilgisayarı soğutmaya çalıştım fakat o da sonuç vermeyince  bilgisayarımı güzelce açıp İşlemcimin termal macununu değiştirmeye karar verdim.

Genellikle laptoplarda sonradan bir aşırı ısınma sorunu yaşanıyor ise büyük olasılıkla termal macun eskimesinden kaynaklı olabilir.Bu macunu değiştirdiğinizde bilgisayarımız ilk alındığı gün gibi rahat bir soğutma yapacaktır.Şimdi bakalım bu termal macunu nasıl değiştirebiliriz.


Termal Macun Değişimi

Bu işlem için aşağıdaki aşamaları uygulamamız gerekmektedir.

1.Bilgisayarımızın vidalarını söküp içini açıyoruz.

2.Fan ımızı çıkarıyoruz.

3.Fan altında ekran kartı işlemcisi ve normal işlemci olarak 2 adet işlemcimiz olacak,

4.İşlemcilerimizin üzerindeki termal macunları kuru bir peçete ile temizleyelim.

5.İşlemcilerimizin eski termal macunlarını temizledikten sonra yeni aldığımız termal macunu parmağımız ile çok çok az birşey alarak işlemcilerimizin üzerlerini tam olarak kapatacak şekilde sürüyoruz.

6.Termal macunlarımız yenillendi.Şimdi fanımızı güzelce temizlememiz gerekiyor.Var ise bir saç kurutma makinası ile de temizleyebiliriz.

7.Macunlarımız yenilendikten, fanlarımız temizlendikten sonra artık fanımızı geri takıyoruz.
8.Bilgisayarımızın arka kapağını da takıyor ve işlemi tamamlıyoruz :)


Tüm bu işlemler tamamlandıktan sonra, saatlerce yüksek grafik gerektiren oyunlarla bile test ettiğimde bir gram ısınma artık yok.



Kullanılan Malzemeler
 - Termal Macun ( İnternette çok kolay 3-5 liraya bulabilirsiniz, ayrıca yakınlarınızdaki bir bilgisayarcıdan da çok küçük bir parça isteyebilirsiniz para bile almayacaklardır)

 - İşlemcinin eski macununu silmek için peçete yada kuru bez

 - Yıldız uçlu tornovida.
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

23 Aralık 2015 Çarşamba

Git Bash ile GitHub kullanımı


Github hesabı açıp yaptığınız projeleri zaman paylaşmak yada projelerinizi açık kaynak olarak yayınlayıp insanlarında katkılarıyla büyütmek isteyebilirsiniz.

Bu yazımda github hesabı nasıl açılır, projeler nasıl yayınlanır bi bakıyor olacağız.

 - Öncelikle bir github hesabı açıp ilk projemiz için bir repository oluşturmamız gerekiyor.(https://github.com/)
 - Ardından bilgisayarımızdaki projemiz ile github hesabımız arasındaki senkronizasyonu sağlamak için kullanacağımız Git Bash uygulamasını indirmemiz gerekiyor.
(indirme linki : https://git-scm.com/downloads )
 - Git Bash indirdikten sonra bilgisayarımızda gitHub projelerimizi yayınlayacağımız bir klasör oluşturuyor ve bu klasör altındak ilk projemizi açıyoruz.
 - Proje klasörümüze git bash üzerinden "cd dizinadı" komutu ile ulaşıyoruz.
 - Ardından projemizi git e git bash ekranı üzerinden önce yüklüyor ve sonrasında projemizi github repository imize gönderiyoruz.
 - Git Bash üzerinden sırası ile aşağıdaki komutları çalıştırarak tüm bu işlemleri yapabiliriz.
1.cd dizinadi
2.git init
3.git add -A
4.git commit -m "commit message"
5.git remote add origin githubUrlBuraya
6.git pull origin master
7.git push origin master
bu işlem sonrasında bizden username ve password istenecektir,github hesabımıza ait  username,password bilgilerimizi girip işlemi tamamlıyoruz.
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

17 Aralık 2015 Perşembe

Google URL Shortener Kullanımı


URL kısaltma son zamanlarda biraz sık kullanılan bir özellik olmaya başladı.Biz de yurt dışında hizmet verdiğimiz bir firmada böyle bir implementasyon yapmaya karar verdik.Öncelikle bit.ly apileri kullanmaya başladık.Ama bu tarafta bazı sorunlar çıktı, çünkü bit.ly bizim kayıt ettiğimiz url leri kayıt etmeden önce bir request gönderiyor ve 1 kez kullanıyor.

İşte tamda burda bir sorun ortaya çıktı, biz url bilgilerini aktivasyon linkleride kullanıyoruz ve bit.ly bu url lere request attığında aktivasyonu kendisi yapıyor ve sorunumuzu çözmüyordu.
Sonrasında google url shortener ile ilgili birkaç test yaptıktan sonra çok temiz güzel çalışan bir apisi olduğunu gördüm ve implemente etmeye karar verdim.


Nasıl başlarız.

 - Öncelikle sistemin çalışması hakkında detaylı bilgi edinmek için https://developers.google.com/url-shortener/linkini ziyaret edebilirsiniz.

 - Ardından google developer hesabı oluşturup api credential üretmeniz gerekiyor.

 - Api kodumuzu temin ettikten sonra , küçük bir kaç request ile url shortener ı kullanabiliyoruz.

Aşağıdaki gibi bir metod ile url shortener apiyi rahatca kullanabiliyoruz.



        public string URLShortenerRequest(string URLtoShorten)
        {
            string shortUrl = string.Empty;

            string apiKey = "googledan alınan api key buraya gelecek";
            string urlAuth = "https://www.googleapis.com/urlshortener/v1/url?key=" + apiKey;
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(urlAuth);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.Method = "POST";

            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = "{\"longUrl\":\"" + URLtoShorten + "\"}";
                streamWriter.Write(json);
            }//End Using

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                shortUrl = JsonConvert.DeserializeObject<dynamic>(streamReader.ReadToEnd()).id;
            }//End Using

            return shortUrl;
         }
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

Asp.Net MVC Custom Authorization ile Üyelik Sistemi Yönetimi


Önceden Asp.Net tarafında System.Web.UI gibi bir sınıfıtan türeyen alan base bir sınıf oluşturup authorization olaylarını burada yapıyorduk.Hangi sınıflar için login gerekiyor ise de bu sınıfları bu base sınıfımızdan türetiyor ve örneğin Asp.Net Page Life Cycle daki  'Page_Initialize' event ın da bu base sınıf içerisnde kullanıcı oturum açmış ise devam et, açmamış ise login sayfasına yönlendir diyebiliyorduk.

Asp.net MVC de bu işlemler bizim için biraz daha kolay bir hale geldi, MVC yapısındaki ilgili view ımızın action metodunda view ı görüntülemek için işlem izni gerekiyor mu gerekmiyor mu kontrol etmek için metodlarımızın üzerine sadece  [TestAuthorize] şeklinde bir işaretleme yaparak o view ı kullanan kişinin login olup olmadığına bakabiliyor , üye olmadı ise login e yönlendirebiliyor yada uygulamamızın mantığı neyse ona göre işlem yapabiliyoruz.


Şimdi bakalım bunu nasıl yapabiliyoruz.

Örnek olarak aşağıdaki yapıya sahip basit bit uygulamamız olduğunu düşünelim

Controllerlarımız aşağıdaki gibi olsun.
/Home
/Login

View Klasörümüz içerisinde de aşağıdaki gibi view larımız olsun.

/Home/Index.cshtml-> üye girişi yapılmasını gerektiren uygulamamızın ana sayfası

/Login/Index.cshtml-> üye girişi yapılan sayfamız.



HomeControler.cs Dosyamız



    public class HomeController : Controller
    {

     
        //
        // GET: /Home/
         [TestAuthorize]/*Burada TestAuthorize adında bir custom authorization nesnemiz olduğundan ve metod çalışmadan önce bu kontrolün çalışacağından metodumuzu haberdar ediyoruz*/
        public ActionResult Index(string login)
        {
                    return View();

        }//End Metod

}//End Class




LoginControler.cs Dosyamız



    public class LoginController : Controller
    {
        //
        // GET: /Login/Index
     
        public ActionResult Index()
        {
                    return View();

        }//End Metod



        //
        // POST: /Login/
       [HttpPost]
        public ActionResult Login(string email,string password)
        {

                    //LOGİN olacak kodumuzu yazıyoruz

                    return RedirectToAction("Index","Home");/*üye girişi yapıldıktan sonraki sayfaya yönlendirme yapıyoruz.*/

        }//End Metod


}//End Class





Buraya kadar basit anlamda bir uygulama ifade etmiş olduk.Şimdi bakalım bu [TestAuthorize] kısmı için ne yapacağız.


Öncelikle AuthorizeAttribute nesnesinden türeyen "TestAuthorize" classımızı oluşturuyoruz.Ve 2 adet metodunu override ediyoruz.Bir tanesi kullanıcı oturum izni olmaz ise yönlendirme yapılacak metodumuz (HandleUnauthorizedRequest) diğeri ise bizim "[TestAuthorize]" kontrolümüzün yapıldığı bir metod çağrıldığında (AuthorizeCore) kullanılacak olan metodlarımız.



    public class TestAuthorize: AuthorizeAttribute
    {

         /*Eğer AuthorizeCore metodu false döndürülür ise bu metod tetikleniyor.Ve login sayfasına yönlendirme yapıyoruz.*/
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            filterContext.Result = new RedirectResult("/Login/Index");
        }//end override method

         /*[TestAuthorize] kullanılan bir metod çağrıldığında önce bu metodumuz tetikleniyor ve oturum kontrolünü yapıp, üye girişi başarı ile yapıldı ise true, yapılamadı ise false döndürüyoruz.*/
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if(HttpContext.Current.User.Identity.IsAuthenticated == true)
                   return true;
            else
                  return false;
        }//end override method

    }//End class



Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

1 Aralık 2015 Salı

Sql Database Schema ve Data Comparison İşlemleri


Genellikle bir yazılım ürettiğimizde sonrasında bu yazılımın geliştirmelerini yapar ve yayında olan projeyi, geliştirmiş olduğumuz yazılım versiyonu ile güncellemek isteriz.

Dosya tarafındaki güncellemeler de sıkıntı yok, dosyaları güncelledik ve yazılımımız artık güncel.Peki bu veri tabanı tarafında eklediğimiz, yeni tablolar, sütunlar, veriler, stored procedure, view, function lar neler olacak ?

Bu veri tabanı tarafındaki güncellemeler için de Visual Studio bize güzel bir araç sunuyor.Ve hiç farklı bir programa ihtiyaç duymadan yeni ve eski versiyon veri tabanımız arasındaki gerek şema gerek de veri tarafındaki farklılıkları script olarak alıp sadece aldığımız scriptleri çalıştırarak güncelleyebiliyoruz.

Bu kadar muhabbet yetsin artık şimdi bu işlemleri nasıl yapıyoruz ona bir bakalım.


Veri Tabanı Şema Güncelleme(table,function, view, stored procedure,...)

Öncelikle Visual Studio yu açıyoruz ve 'Tools' menüsünden "Sql Server" -> "New Schema Comparison" seçeneklerini seçerek Comparison(karşılaştırma) araçımıza ulaşıyoruz.

Ardından solda ve sağ da 2 adet "Select Source" yazan bölüme ulaşıyoruz.Bu alanlar kaynak ve hedef veri tabanlarımızı belirteceğimiz veri tabanlarımızı ifade ediyor.

Sol tarafa(Source) yeni veri tabanımızı, Sağ tarafa yeni eski tabanımızı "Select Source Schema" alanlarına tıkladıktan sonra  "New Connection" seçeneğini kullanarak seçiyoruz.

Ardından  sol üst kısımdaki "Compare" butonuna tıklayıp iki veri tabanı arasındaki farklılıkları görebiliyor, güncelleme script imiz için dahil etmek istediğimiz ve etmek istemediklerimizi checkbox ları işaretleyerek seçiyoruz.Bu işlem sonrasında "Update" butonu yanındaki kağıt simgesi gibi görünen üzerine geldiğimizde "Generate Script" tooltip i görünen butona tıklıyoruz ve işte bitti :)
Update script imiz hazır.

Sql Comparison Tool 



Karşılaştırmak için Veri Tabanı Seçimi




Veri Tabanı Veri Güncelleme (tablolarımızdaki veri farklılıklarını güncelleme işlemi)
Öncelikle Visual Studio yu açıyoruz ve 'Tools' menüsünden "Sql Server" -> "New Data Comparison" seçeneklerini seçerek Comparison(karşılaştırma) araçımıza ulaşıyoruz.

Ardından solda ve sağ da 2 adet "Select Source" yazan bölüme ulaşıyoruz.Bu alanlar kaynak ve hedef veri tabanlarımızı belirteceğimiz veri tabanlarımızı ifade ediyor.

Sol tarafa(Source) yeni veri tabanımızı, Sağ tarafa yeni eski tabanımızı "Select Source Schema" alanlarına tıkladıktan sonra  "New Connection" seçeneğini kullanarak seçiyoruz.

Ardından  sol üst kısımdaki "Compare" butonuna tıklayıp iki veri tabanı arasındaki farklılıkları görebiliyor, güncelleme script imiz için dahil etmek istediğimiz ve etmek istemediklerimizi checkbox ları işaretleyerek seçiyoruz.Bu işlem sonrasında "Update" butonu yanındaki kağıt simgesi gibi görünen üzerine geldiğimizde "Generate Script" tooltip i görünen butona tıklıyoruz ve işte bitti :)
Update script imiz hazır.







Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

19 Ekim 2015 Pazartesi

Git Üzerinden Clone Nasıl Yapılır


Git büyük projelerimizde takım haline çalışırken sık sık kullandığımız versiyon kontrol sistemlerinden biridir.Versiyon kontrol sistemlerine bakacak olursak en sık kullandığımız sistemler aşağıdaki gibidir.

Popüler Versiyon Kontrol Sistemleri
 - SVN
 - Git
 - Team Foundation Server (Microsoft temellidir, genellikle Visual Studio Platformu kullananlar tercih eder ama eclipse yada başka idelerinde desteği var ve gayet rahat bir kullanımı varıdr.)


Peki Nedir Bu Versiyon Kontrol Sistemi
Versiyon kontrol sistemleri kısaca projelerimizdeki kaynak kodumuzun yönetimini sağlayan oldukça faydalı sistemlerdir.Faydalarını sıralayacak olursak ;

 - Kaynak kodunuz güvende olur :
Online güvendiğiniz bir repository de tüm kodlarınız tutulur.

 - Her geliştirme ayrı bir versiyon olarak tutulur :
 Her satır kodunuz her yaptığınız geliştirme için repository commit yaptığınızda bir comment eklersiniz böylece her gün kim projede ne geliştirme yapmış takip edebilirsiniz.

 - Eski kodlarınızın kayıp olmaktan çıkması ve kolay erişim :
Geliştirdiğiniz ve sonrasında silip değiştirdiğiniz yıllar önceki kodlara bile sonrasında ulaşabilirsiniz çünkü her commit işleminiz repository üzerinde sizin almış olduğunuz notlar ve tarihler ile tutulur böylece önceki versiyondaki kodlarınızı gözden geçirebilirsiniz.

 - Birden fazla kişi aynı proje üzerinde çalışabilir.
Birden fazla kişi aynı projeyi kendi local repository sine indirip geliştirme yapar ve ortak kullanılan repository e geliştirmesi tamamlandığında gönderebilir.Böylece kodun tamamı ortak bir yerde toplanır, takım haline proje geliştirmek oldukça kolay, keyifli ve güvenilir bir hal alır.

 - Yapılan yanlış geliştirmeleri geri alabilirsiniz
Geliştirme esnasında yazdığınız yeni kodlar çalışmaz ise versiyon kontrol sistemi sizin için kodlarınızın tüm versiyonlarını tuttuğu için, bir önceki versiyona hemen geri alabilir ve gününüzü kurtarabilirsiniz :)

 - Eski ve yeni yazılan kodları karşılaştırabilme :
Örneğin projede bir arkadaş geliştirme yaptı ve sonra yeni gelen bir yazılımcı o kodu değiştirdi.Bu durumda eğer bir sorun çıkarsa yada kontrol etmek isterseniz eski ve yeni kodları karşılaştırabilirsiniz.

...


Gelelim Asıl Konumuza Git kullanarak Clone Nasıl Yapılır
Clone dan kastımız repository üzerindeki projeyi bilgisayarımıza indirip local repository oluşturmaktdır.


İki yöntemi vardır.Ya "Tortoise Git" i bilgisayarımıza kurup onun üzerinden görsel bir ekran ile yaparız yada comut satırı üzerinden Eğer "Git Bash" ile yaparız.


Git Bash ile Clone İşlemi
"git clone -b Development GITREPOSITORYURL" şeklinde komut satırınıza clone kodumuzu yazıyoruz, ardından kullanıcı şifre bilgisi soracaktır, siyah ekranda bu bilgiyi giriyoruz ve işlem tamam :) (not : komut satırında şifre girerken ekranda birşey görünmeyecektir, siz girin ve enter a basın)



-b -> burada hangi Branch i seçeceğimizi belirtiyoruz.eğer "-b Development" gibi bir branch seçimi yapmaz isek base branch baz alınır.

İlgili işlemi tamamladığınızda aşağıdaki dosya yoluna repository clone edilmiş olacak

"C:\Users\OturuAcilmisKullanıcıAdı\ProjeAdınız"


Tortoise Git ile Clone İşlemi
Tortoise Git i bilgisayarınıza kurduktan sonra repository inizi clone etmek istediğiniz klasör e gelip klasör içerisinde boş bir yere sağ tuş tıklıyor ve "Git Clone" u seçiyorsunuz.URL kısmına git repository url bilginizi girip, varsa Branch seçeneğini doldurup "OK" diyor ve ardından gelen kullanıcı adı ve şifre bilgilerinizi girdikten sonra işlem tamamlanmış oluyor :)




Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

Windows Servislerini Nasıl Sileriz


Normalde kendi geliştirdiğimiz yada var olan windows servislerini kurmak ve kaldırmak için installutil komutunu kullanırız.

Ama bazı durumlarda ilgili windows servisinin dosya yolunu tam bilmiyor isek instalutil komutu da çaresiz kalabilir yada buradan işlem yapmak zor geliyor olabilir.Bunun için çok daha kısa bir yolumuz var.

Sırasıyla aşağıdaki komutları uyguladığımızda saniyeler içerisinde silmek istediğimiz bir windows servisini silebiliyoruz.


Örneğin biz File Zilla ftp programının bilgisayarımızda otomatik olarak oluşturduğu servisi kaldırmak istiyoruz.
 1. Başlat -> Çalıştır
 2. Şu komuut giriliyor : sc delete "FileZilla Server"   (sc delete "silmek istediğimiz servis adı")


Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

22 Eylül 2015 Salı

Beni Ne Patronlar İstedi :)



Türk Ekonomi Bankası
Üniversiteliler Deneyim Kazanıyor | TEB Akıl Fikir Kampüsü

Nedir bu akıl fikir kampüsü

TEB akıl fikir kampüsü , TEB in ünivesite öğrencilerine yönelik yaptığı bir proje.Bu kapsamda öğrencilik hayatı boyunca bünyesindeki öğrencilere çeşitli workshoplar ,  eğitimler düzenleyip, network ve iş hayatı ile ilgili çeşitli fırsatların daha okul hayatındayken karşınıza çıkmasını sağlıyor.

http://www.akilfikirkampusu.com/ linki üzerinden hemen inceleeyip kolayca kayıt olabiliyorsunuz.



Biraz Eğlenelim - Beni Ne Patronlar İstedi :)

TEB in hazırladığı "Akılfikir kampüsü" projesini tanıtım amacı ile yapılan kendinize sadece linkedin hesabınızı kullarank çok güzel bir kısa film hazırlayabileceğiniz bir proje :) yazılımcıların eminim hoşuna gidecektir.

Benim filmim :

https://www.beninepatronlaristedi.com/Preview/88a866e8-ad30-4c51-a499-0f0c4d800c21


Sizde https://www.beninepatronlaristedi.com/ linkini kullanarak gideceğiniz sayfada linkedin hesabınız ile giriş yapıp hesabınıza erişime izin vererek kendi videonuzu hazırlatıp sosyal medya da paylaşabilirsniniz :)
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

19 Eylül 2015 Cumartesi

Asp.Net MVC global.asax - Could not load type '.MvcApplication' Hatası


Bu hata bazen uygulamanız IIS üzerinde çalışırken meydana gelebiliyor.Böyle bir hata oluştuğunda projenize aşağıdaki aşamaları uygulayıp publish ederseniz sorun çözülecektir.

 - Clean
 - Rebuild
 - Build

Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

21 Ağustos 2015 Cuma

Asp.Net Web API ile Abstract ve Türetilmiş Base Class Deserialization işlemi


Bazı durumlarda Asp.Net Web API ile çalışırken alınan parametrelerin ortak özellikleri olabilir.Bu durumlarda siz Web API ye json post işlemi yaptığınızda base class da olan parametreler, ilgili api metodunun parametre aldığı class da olmadığı için parametrelerinizi api tarafında göremeyebilirsiniz.

Şöyle bir örnekle açıklayalım.

Benim bir BaseClass ım var adı APIBase.cs olsun ve her api metodu çağrımında bunlara ihtiyaç duyuyor olayım.

public class APIBase{

public string userName{get;set;}
public string userPassword{get;set;}
}


public class ListProducts : APIBase
{
public string Name{get;set;}
public string Price{get;set;}
public string StokAmout{get;set;}
}



Diyelim ki biri ListProducts metodunu çağırmak istediğinde kullanıcı adı ve şifre bilgisi istiyoruz ve her class ımızın içerisinde bunu tek tek yazmak istemiyoruz.Çünkü bu APIBase class ı zaman zaman ihtiyaçlara göre değişebilir.Ama json post işlemi ile client tarafından ListProducts parmetrelerini gönderdiğinizde userName ve userPassword verileri Api tarafındaki c# kodunuzda görünmeyecektir.

Bu işlem için global asax da yada webapiconfig.cs dosyanızda aşağıdaki kodu eklemeniz gerekiyor configurasyon için ve artık bu base class verilerine de kod tarafında erişebiliyor.Client tarafında json post işlemi yaparken normal userName ve userPassword alanlarını ListProducts ın diğer parametrelerini gönderir gibi gönderiyorsunuz.

Json conver için konfigurasyon Kodu :

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;






Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

17 Ağustos 2015 Pazartesi

Asp.Net AjaxControlToolkit Hatası


Server Error in '/' Application.

Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.FileLoadException: Could not load file or assembly 'AjaxControlToolkit' or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))






Böyle bir hata aldığımızda ilgili asp.net versiyonu için aşağıdaki dosya yolunu kullanarak ulaşabileceğimiz dizindeki temp dosyaları silmemiz hatanın tamamen kaybolması için yeterli oluyor.

'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files'


(Yukarıda yazan 'v4.0.30319' kısmını kullanmakta olduğunuz asp.net framework ü ile değiştirmeniz gerekiyor.)
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

10 Temmuz 2015 Cuma

İzmir de Kod Yazılacak Yerler - Tea & Pot Cafe




Bu defa sizlere İzmir - Alsancakta bulunan ama gözlere pek çarpmayan sakin , dinlendirici ve bir o kadar da insanın içini açan güzel bir mekandan bahsedeceğim.

Tea & Pot kıbrıs şehitlerinden gül sokağa giden ara yol da bulunan küçük şirin bir cafe, diğer mekanlardan farklı olarak çok farklı bir menüye sahip.İnanılmaz taze yiyecekleri ve kendi demliğinizde demleyip içebileceğiniz bitki çaylarından oluşan geniş bir çay menüsü bulunuyor.

Eğer ben bitki çaylarına ve farklı tatlara bayılırım diyorsanız.Bilgisayarınızı kapıp gelebilir bolca priz ve wifi bulunan bu mekanda keyifle kodlarınızı yazabilirsiniz.Umarım sizler için farklı ve güzel bir deneyim olur :)

İşte Mekandan Görsellerimiz













Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

4 Temmuz 2015 Cumartesi

İzmir de Kod Yazılacak Yerler - Karagöl



Bugün izmir de kod yazacak mekanlar yazı dizimin ilkini paylaşıyor olucam.İlk durağımız KARAGÖL.Burası izmir karşıyaka dan 25 kilometre uzaklıkta ve arabanız yada motorunuz var ise gelebileceğiniz bir yer.


Karagöl Nasıl Bir Yer ? 
Karagöl şehirden uzak huzur dolu, sakin, muhteşem atmosferi ve iki dağın eteğinde bulunan gölü ile her yerde masa ve sandalyeleri olan bilgisayarınız ile rahat oturabileceğiniz,  ayrıca wifi ve her yerinde elektrik kullanabileceğiniz içerisinde prizler olan küçük trafoları bulunan bir yer.









Kamp Mı Yapsak ? 


Eğer biz hafta sonu kod yazma kampı yapıcaz büyük ve konsantrasyon gerektiren projelerimiz var diyorsanız karagöl biçilmiş kaftan :) dilerseniz kendi çadırınızı alıp gelebilir yada burada bulunan mevcut çadırlarda kalabilir internet ve elektrik ile doğa ile iç içe bir kod yazma deneyimi yaşayabilirsiniz.


























Tree Of Life
Burada ayrıca dünya üzerindeki tüm milletlerden ziyaretçileri olan her yıl düzenlenen Tree Of Life festivali bulunmakta. Bu festivalde 1 hafta boyunca sınırsız eğlence, tüm milletlerden insanlarla tanışma ve doğayle iç içe güzel bir tatil keyfi sizi bekliyor :) Fiyatlarda gayet uygun, daha detaylı bilgi için https://www.facebook.com/Tree.Of.Life.Festival?fref=ts.Festival adresini ziyaret edebilirsiniz.




Ücretler Nasıl ? 
Bu güzel yer malesefki beraberinde biraz maliyet getiriyor.Kişi başı 6 tl ye buraya girebiliyor yada çok fazla kişiyseniz 18 TL ye araba ile giriş imkanı bulunuyor.Eğer biz 2 kişi geldik 18 vermeyelim derseniz aracı dışarıya parkedip 12 tl ye 2 kişi giriş yapabiliyorsunuz.

Toplu olarak giriş yapmak isteyenler için  daha uygun maliyetler sunacak şekilde mevcut otobüs tarifeleri de mevcut.



Not : Tree of Life festivali fiyatları daha farklıdır, burada belirtilen fiyatlar normal zamanda kullanıma özeldir.

Yanımıza Ne Almalı
Burada çok fazla yiyecek içecek alma şansınız malesef ki bulunmuyor.Gelirken yanınızda yiyecek içecek getirirseniz burada tüm gün rahat bir çalışma ortamı sağlayabilirsiniz.

Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

21 Haziran 2015 Pazar

Bir Web Sitesini Gezip Verilerini Alacak Bot Yazmak


Bazı durumlarda projelerinizde bazı sitelerin veri tabanlarına ihtiyacınız olabilir fakat tabiki başka sistemler size veri tabanlarını açmayacaktır.Bugün bu web sitelerinin verilerini ihtiyacımız dahilinde nasıl çekebiliriz bu konu üzerine yoğunlaşacağız.


Başlangıç 
Uygulamamızı C# ile HTMLAgilityPack.dll ini kullanarak yapıyor olacağız.Visual studio üzerinden nuget manager ile HTMLAgilityPack i indirip kullanabileceğimiz gibi isterseniz code plex üzerinden de ilgili dll i indirebilirsiniz.(code plex url :https://htmlagilitypack.codeplex.com/releases/view/90925)

Kısa açıklama
Bu uygulamamız isbnsearch.org sitesindeki kitap bilgilerine ISBN numarası ile ulaşmamızı sağlayacak.
Yani şöyle bir ihtiyacımız olduğunu düşünelim sitemize kitap ekleyeceğiz ama kitap bilgilerini (resim,isim,yayınevi,yazar,vs) tek tek girmek istemiyoruz.İlgili kitabın ISBN numarasını girip kitabın bilgilerini resmiyle birlikte getirmek istiyoruz.


Hadi kodlayalım :)


Öncelikle Book adında bir class ımız olsun ve sonrasında bu class ın içerisindeki kitap bilgilerini dolduran bir metod yazalım.


Book.cs

public class Book
{
  
  private string ISBN;
  
  private string Name;
  
  private string Publisher;

  private string Author;
  
  private string CoverPhotoURL;
  
  private string PublishProperties;
  }

BookFinder.cs

 
public class BookFinder
{

        public Book GetBookInfoByIsbn(string isbn)
        {
            Book bookInfo = new Book();

            try
            {
                //bu kısımda Verilerini alacağımız HTML Sayfa URL kullanım formatını tanımlıyoruz.
                string isbnURL = string.Format("http://www.isbnsearch.org/isbn/{0}", isbn);
                 //Web sayfasına ISBN parametresi ile talep yollayıp, htmml veriyi indiriyoruz.
                Uri url = new Uri(isbnURL);
                WebClient client = new WebClient();
                string html = client.DownloadString(url);

                //HTMLAgilityPack nesnemizin içerisine indirdiğimiz html i yüklüyoruz.
                HtmlAgilityPack.HtmlDocument dokuman = new HtmlAgilityPack.HtmlDocument();
                dokuman.LoadHtml(html);
                 
                //Veri getireceğimiz alanları tanımlıyoruz
                string publisher = string.Empty;
                string published = string.Empty;
                string author = string.Empty;
                string bookName = string.Empty;
                string bookImg = string.Empty;

                #region Kitap detayları getir

                //sayfa içerisinde <div class='bookInfo'> html ini bulup, p taglarının listesini alıyoruz.Verilerimiz e '<p></p>' tagları içerisinde ulaşacağız.
                List bookInfoParagraphs = dokuman.DocumentNode.SelectNodes("//div[@class='bookinfo']").Descendants().Where(x => x.Name == "p").ToList();

                //P tagları içerisinden linq fonksiyonu yardımı ile içerisinde publisher geçen '<p>' tagını getiriyoruz.
                HtmlNode publisherNode = bookInfoParagraphs.FirstOrDefault(h => h.InnerText.Contains("Publisher: "));
                if (publisherNode != null)
                {//veri içerisinden 'Publisher: ' metnini çıkardığımızda elimizde publisher verisi olmuş oluyor.
                    publisher = publisherNode.InnerText.Replace("Publisher: ", "");
                }

                HtmlNode publishedNode = bookInfoParagraphs.FirstOrDefault(h => h.InnerText.Contains("Published: "));
                if (publishedNode != null)
                {
                    published = publishedNode.InnerText.Replace("Published: ", "");
                }

                HtmlNode authorNode = bookInfoParagraphs.FirstOrDefault(h => h.InnerText.Contains("Author: "));
                if (authorNode != null)
                {
                    author = authorNode.InnerText.Replace("Author: ", "");
                }

                HtmlNode bookNameNode = dokuman.DocumentNode.SelectNodes("//div[@class='bookinfo']").Descendants().FirstOrDefault(x => x.Name == "h2");
                if (bookNameNode != null)
                {
                    bookName = bookNameNode.InnerText;
                }

                HtmlNode coverImageNode = dokuman.DocumentNode.SelectNodes("//div[@class='thumbnail']").Descendants().FirstOrDefault(x => x.Name == "img");
                if (coverImageNode != null)
                {
                    bookImg = coverImageNode.GetAttributeValue("src", "");
                }
                if (bookImg.IsEmpty() || bookName.IsEmpty() || author.IsEmpty() || published.IsEmpty() || publisher.IsEmpty())
                {
                    throw new NullReferenceException("Kitap bilgileri bulunamadı!");
                }

                bookInfo.Name = bookName;
                bookInfo.Publisher = publisher;
                bookInfo.CoverPhotoFilePath = bookImg;
                bookInfo.PublishProperties = published;
                bookInfo.Author = author;
            }
            catch (NullReferenceException nullEx)
            {
                bookInfo = null;
            }
            catch (Exception ex)
            {
                bookInfo = null;
            }
                #endregion

            return bookInfo;

        }//End Method

}





Neler Yaptık ? 
 - Verilerine ihtiyacımız olan bir web sayfasına parametre gönderdik ve istediğimiz verileri html olarak aldık.(örnek olarak http://www.isbnsearch.org/isbn/9752103707 linkini inceleyerek kitap verilerinin geldiğini görebilirsiniz)
 - İlgili sayfamızın html ini indirdik ve HTMLAgilityPack i kullanarak html içerisinde gezip ihtiyacımız olan verilerin bulunduğu html taglarından verileri çektik.
 - Herşey hazır :) artık isbn verip istediğimiz kitabın verilerini alabiliriz.


Şimdi artık herhangi bir sitenin verilerine ihtiyacınız olduğunda bu kod da birkaç düzenleme yaparak istediğiniz web sayfasındaki verilere ulaşabilir, kendinize farklı sitelerin içeriklerinden oluşan ve sürekli güncellenen bir veri tabanı hazırlayabilir projelerinizde kullanabilirsiniz :)




Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

1 Haziran 2015 Pazartesi

Visual Studio için SVN Client Kurulumu ve Mevcut bir Proje ile SVN üzerinden çalışma


Bu hafta başladığım bir proje de SVN server üzerinde bulunan bir proje ile çalışmam gerekti.Sonrasında svn kurup projeye Visual Studio üzerinden SVN ile devam ettim.Şimdi bakalım SVN nasıl kurabiliriz?SVN repository üzerindeki mevcut bir projeyi bilgisayarımıza nasıl çekip kullanabiliriz ?


SVN Kurulumu
Öncelikle https://www.visualsvn.com/visualsvn/ adresinden svn imizi download ederek bilgisayarımıza indiriyoruz.

Sonrasında indirdiğimiz exe yi kuruyoruz ve Visual Studio yu açtığımıızda üst menü de VISUALSVN menüsünü gördüğümüzde kurulumumuzu başarı ile yapmış olduğumuzu anlıyoruz.


SVN ile Mevcut bir projeyi bilgisayarımıza çekmek ve üzerinde çalışmak

Bu işlem için VISUALSVN menüsünden "Get Solution from Subversion" seçeneğine tıklıyoruz.Ardından ilgili Subversion Repository URL sini , projelerin bilgisayarımızdaki dosya yollu(Local Repository) bilgisini seçiyoruz ve tamam diyoruz.

Ardından SVN Server tarafında bizim için oluşturulmuş olan kullanıcı bilgileri için authentication ekranı geliyor.Kullanıcı adı ve şifre bilgimizi giriyoruz ve proje bilgisayarımıza indirilimiş ve Visual Studio üzerinde proje olarak açılmışi olarak geliyor.


Tortoise SVN
Bu uygulama dilerseniz SVN kurulumu sonrasında kurabileceğiniz ek bir uygulama, bu uygulamayı kurduğunuzda takım olarak çalıştığınız proje dosyaları üzerinde yapılan değişiklikleri görebiliyor, proje değişim grafiklerini alabiliyor, proje commits leri için istatistiki veriler alabiliyorsunuz.

Tortoise SVN Kurulum
SVN kurulum işlemi sonunda zaten size son aşamada tortoise SVN kurmak istiyormusunuz, kurmak isterseniz "download " a tıklayın gibi bir aşama geliyor.Buradan Tortoise SVN ininizi de kurabilir keyifli keyifli versiyon kontrol ile proje geliştirmenin tadını çıkarabilirsiniz.


Bu yazımız burda son buluyor, tüm işlemleri adım adım yaptı iseniz artık Visual SVN üzerinde takım olarak projelerimizi geliştirebiliriz.Bol keyif :)
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

15 Mayıs 2015 Cuma

OOP Refactoring With SOLID Princible


Bu yazımızda SOLID prensiblerini kullanarak Refactoring yapma üzerine konuşuyor olacağız.Öncelikle Refactoring kelimesine bir bakalım.
Refactoring her yazılımcının mutlaka bilmesi gereken ve dilinden düşürmemesi gereken bir kelimedir.

Refactoring Nedir
Refactoring i kısaca yeniden düzenleme / gözden geçirme olarak tanımlayabiliriz code review olarak ta kullanılır sıklıkla.Bu bizim kodlarımızdaki eksikleri gidermemiz, reusable hale getirmemizde oldukça faydalı bir tekniktir.
Genellikle kod yazarken farkında olmadığımız eksiklerimiz olabilir, yazılım geliştirme süresinde ortaya çıkan talepler sonrası kodlarımız değişimlere uğrar ve başta yapılan tasarım ile çıkan tasarım değişiklikler göterebilir.Kodlarımızı daha basit, anlaşılabilir, değişimi daha kolay bir hale getirmek için sık sık yazdığımız kodlar üzerinde tekrar gözden geçirme yapmalıyız.

SOLID Prensibi Hakkında
Solid  aşağıdaki maddelerin baş harflerinin birleşmesi ile oluşan bir yazılım prensibidir.

  • Single Responsibility Principle
  • Open/Closed Principle
  • Liskov ‘s Substitution Principle
  • Interface Segregation Principle
  • Dependency Inversion Principle
Şimdi kısaca bu prensibleri açıklayalım.


Single Responsibility Principle: Her modülün(sınıf,nesne,metot) tek bir görevi, tek bir sorumluluğu olması ilkesine dayanır. Bir nesneyi değiştirmek için tek bir neden olmalıdır. Birden fazla neden varsa, o nesnenin birden fazla sorumluluğu var demektir ki burada da Single Responsibility den bahsedilemez.

Resim1 : Single Resposiblity Kullanılmaması Durumu

 Resim 2: Single Responsibility Prinsible ile Hedeflenen


Open/Closed Principle: Yazdığımız kod(sınıf,nesne,metot) gelişime açık, değişime kapalı olmalıdır. Yeni bir özellik ekleneceği zaman veya geliştirme yapılacağı zaman kodu değiştirmemek, sadece önceden yazılan kodun üstüne bir şeyler eklemek gerekir.Bu aşama da da bol bol soyut sınıflarla çalşmak abstract, interface,virtual,override gibi kavramları iyi bilmek gerekir.



Liskov’s Substitution Principle: Alt sınıflardan oluşturulan nesneler, üst sınıfların nesneleriyle yer değiştirildiklerinde aynı davranışı göstermek zorundadır. Yani üst sınıflardan implemente edilen metodlar her alt sınıfta çalışmak durumundadır.Bu prensib biraz complex olduğu için birkaç parça kod örneği verelim.

Yukarıdaki gibi bir sınıf hiyerarşimiz olduğunuz düşünelim.Tabloya baktığımızda gold ve silver customer davranışı gösterebilir.Fakat Enquiry örneğin bu tipte bir kullanıcı ekleme gibi bir davranışı gösteremez diye düşünelim.

class Enquiry : Customer
    {
        public override double getDiscount(double TotalSales)
        {
            return base.getDiscount(TotalSales) - 5;
        }

        public override void Add()
        {
            throw new Exception("Not allowed");
        }
    }

Bu durumda bu class ın aslında sadece discount sağlıyor.Ve liskov prensibine uymuyor.Bu durumda şöyle bir çözüm üretebiliriz :

interface IDiscount
{
        double getDiscount(double TotalSales);
}


interface IDatabase
{
        void Add();
}
Şimdi artık sınıflarımızın tüm metodlarını desteklediği üst sınıflardan devralmasını sağlamamız liskov prensibine uyması için yeterli olacaktır.Örnek olarak Enquiry e bakacak olursak.

class Enquiry : IDiscount
    {
        public  double getDiscount(double TotalSales)
        {
            return TotalSales - 5;
        }
    }

Robert C. Martin in bu konu ile ilgili ünlü bir sözü :

Subtypes must be substitutable for their base types.


Interface Segregation Principle: Benzer özellikleri barındıran sınıfları tek bir interface’ten türeterek o interface’e sonradan sınıflarda kesin olarak kullanılmayacak özellikler eklemek doğru değildir. Başta çözüm benzer özelliğe sahip sınıfları tek bir interface’ten türetmek gibi görünse de aslında çok da doğru değildir. Çözüm interface’leri oluştururken içindeki üyeleri ortak olacak şekilde parçalayıp bu üyeleri interface’ler altında toplayıp, ayrı interface’ler oluşturmaktır.

Dependency Inversion Principle: Somut sınıflara olan bağımlılıklar, soyut sınıflar ve interface’ler kullanılarak ortadan kaldırılmalıdır. Çünkü somut sınıflarda değişiklikler çok olur.
Bu prensipleri ne kadar iyi uygularsak nesne yönelimli programlamayı o kadar iyi yapmış oluruz, ancak amaç nesne yönelimli programlama yapmak için bu kuralları uygulamak değil, bu prensiplere bakarak yazılan koddaki eksikleri bulmak ve düzeltmektir.

Yazılım prensip ve standartlarına uygun şekilde kod yazmak istiyorum ne yapmalıyım ? 
Eğer kafanızda bu şekilde bir soru işareti var ise ;
1.Öncelikle yazımın başında belirttiğim gibi Refactoring kelimesini asla dilimizden düşürmemeliyiz.Hatta uzun zaman sonra bile eski kodlarınıza bakıp aman bozmıyayım demeden refactoring işlemini yapmalıyız.Bunun bir nedeni de en basitinden siz kendinizi geliştirdikçe yazdığınız kod kalitesi de her geçen artacaktır ve eski kodlarınıza baktığınzıda onları geliştirebilecek daha iyi duruma getirebilecek çok fazla nedeniniz olacaktır.
2.SOLID prensiplerini çok iyi öğrenmeye çalışmalı ve geliştirdiğimiz projelerde bu prensiblere uygun kod yazmalıyız.

3.Sizinde tahmin edebileceğiniz gibi refactoring işlemlerinde kendinize sürekli yazdığım kod SOLID prensiplerine uyuyor mu diye kendinize sorup bu ölçütte refactoring lerinizi yapabilirsiniz. 




Kaynak : http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp

Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

10 Mayıs 2015 Pazar

Team Foundation Server "TF10175 The "" project does not exist" hatası


Eclipse ve Visual studio üzerinde Team Foundation Server ile çalışırken böyle bir hata çıkabiliyor.Bunun sebebi mevcut workspace olarak oluşturduğunuz maping dosyalarının bulunmamasından kaynaklanıyor.

Visual Studio .net üzerinde sorunu çözmek için Team Foundation Server Connect işlemi sonrasında "Source Control" ü açarak workspace kısmına tıklamalı ve mevcut workspace inizi silmeli ardından yeni workspace oluşturmalısınız.Bu işlem sorununuzu çözecektir.

Eclipse de ise mevcut proje mapping ini silip ardından projenizi tekrar Team Foundation ile import ettiğinizde sorunu çözebilirsiniz.Bu işlem için File -> import -> Team Foundation Server adımlarını geçerek ardından Team deki import etmek istediğiniz projeyi seçmeniz yeterlidir.

Team foundation ile farklı platformlarda çalışmak bazen karmaşık sorunlara yol açabiliyor.Bu konuda herhangi bir sorunuz olur ise yorum bırakarak sorabilirsiniz.
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

20 Nisan 2015 Pazartesi

JSON ile Değer Döndüren Web Servis e HTTP Post Talebi


Bu sıralar çokca karşılaştığım bir süreci bloğumda da paylaşmak istedim.

.Net dışındaki dillerde web servis hazırlandığında genelde dönüş değeri olarak bu aralar popüler olan JSON ile değer döndürülüyor.Siz de bu web servise HTTP Post yöntemi ile C# üzerinden erişip işlem yapıyorsunuz.


Aşağıda ki metodu bir servise talep gönderip JSON olarak gelen dönüşü Generic Type dönüşümü ile istediğiniz tür de class veri tipine çevirme işlemi yaparak object oriented olarak projeniz de çalışabilirsiniz.

Not : Bu metodu kullanabilmeniz için http://www.newtonsoft.com/json adresindeki Newton json dll ini indirmeniz ve .Net projenize referans olarak eklemeniz gerekmektedir.Bu nesne json tipini bir class türüne, class türünden bir datanızı json türüne çevirimde kullanmanızda size yardımcı olacaktır.



       /// <summary>
        /// It provide that sent http post request and convert json response to entity tpye of T
        /// </summary>
        /// <typeparam name="T">Response Type For JSON Response</typeparam>
        /// <param name="postURL">HTTP Post URL</param>
        /// <param name="postData">HTTP Post Request Data type of string with seperate & character for ex : "username=test_user&password=1451"</param>
        /// <returns>return http post response with type of T</returns>
    private T SendHttpPost<T>(string postURL, string postData)
        {

            // Create a request using a URL that can receive a post.
            WebRequest request = WebRequest.Create(postURL);

            // Set the Method property of the request to POST.
            request.Method = "POST";

            // Create POST data and convert it to a byte array.
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;

            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);

            // Close the Stream object.
            dataStream.Close();


            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string autResponseJsonString = reader.ReadToEnd();


            /*set variable to return type to getting http response which converted with NewtonJson Object DeserializeObject method*/
            T reponseData = JsonConvert.DeserializeObject<T>(autResponseJsonString);


            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();

            return reponseData;

        }//End Method



Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

19 Mart 2015 Perşembe

.Net C# Object Serialization ve Deserialization


Zaman zaman çektiğimiz verilerin xml olarak alınması gerekebilir.Bu durumda yazılımcıların genelde ihtiyacı olan bu işlemi pratik bir şekilde yapabiliriz.Bu işlemi xml yayınlama, nesne listesi olarak aldığımız verilerin xml olarak incelenmesi, vb. gibi süreçleri için kullanabiliriz.


1.Bir nesneyi yada nesne listesini xml dosyası olarak serialize etme işlemi için kullanabileceğimiz metod :

 public bool SerializeObject<T>(T dataList, string filePath)
        {
            bool isSuccess = true;
            try
            {
                string requestString = string.Empty;
                XmlSerializer xmlSerializer = new XmlSerializer(dataList.GetType());
                using (StringWriter writer = new StringWriter())
                {
                    xmlSerializer.Serialize(writer, dataList);
                    requestString = writer.ToString();
                }//End Using

                File.WriteAllText(filePath);
            }
            catch (Exception ex)
            {
                isSuccess = false;
            }

            return isSuccess;

        }//End Method


2.Serialize ettiğimiz bir xml dosyasını deserialize etme işlemi için kullanabileceğimiz metod :

  public List<T> DeserializeObject<T>(string filePath)
        {
            try
            {
                if (!File.Exists(filePath))
                    return default(List<T>);

                string xmlString = File.ReadAllText(filePath);

                using (MemoryStream mStream = new MemoryStream(Encoding.Unicode.GetBytes(xmlString)))
                {
                    mStream.Position = 0;
                    XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
                    return (List<T>)serializer.Deserialize(mStream);

                }
            }
            catch (Exception ex)
            {
                return default(List<T>);
            }

        }//End Class


Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

Gitti Gidiyor API ile Kategori Hiyerarşisini Çekmek


Bu yazımda gitti gidiyor api leri ile kategori verilerini nasıl çekeriz ve gitti gidiyorun algoritması ile bu aldığımız kategori verileri ile nasıl bir kategori hiyerarşisi oluşturabilirz bundan bahsediyor olacağım.

Öncelikle servisleri kullanabilmeniz için dev.gittigidiyor.com üzerinden api bilgilerine sahip olmanız gerekiyor.

Kategorileri Getirme
1.BasicAuthentication işlemi : Bu işlem api bilgileriniz ile servisleri çağırmadan önce yapmanız gereken bir authentication işlemidir.Buradaki veriler gitti gidiyor geliştirici hesabınızda tanımladığınız bilgilerdir.

Aşağıdaki gibi bir metod oluşturarak bu işlemi yapabiliriz.

 public void SetBasicAuthentication(string apiKey, string secretKey, string roleName, string rolePass)
        {          
            /*create authentication*/
            AuthConfig config = new AuthConfig();
            config.ApiKey = apiKey;
            config.SecretKey = secretKey;
            config.RoleName = roleName;
            config.RolePass = rolePass;

            ConfigurationManager.setAuthParameters(config);

        }//End Method


2.Kategori Verilerini Getirme : Gitti gidiyor üzerindeki tüm kategorileri getirme işlemi.Normal şartlarda kategorileri getirmek için tek bir metod kullanmak yetmiyor.Fakat sayfalama tekniği kullanarak bu verileri sayfa sayfa 100 er adet çekebiliyoruz.

Ben bu örneğimde kendim bir class oluşturup bu class üzerinden gidiyor olacağım.Adımlarımız şu şekilde olacak.
1-Hiyerarşik olarak kategori verilerinin tutulacağı bir class oluşturma.
2-Gitti Gidiyor api leri ile tüm kategorileri çekme
3-Alınan kategori verilerinin hiyerarşik olarak düzenlenmesi.


/*1-Hiyerarşik olarak kategori verilerinin tutulacağı bir class oluşturma.*/

public partial class Integration_Category
{
private string ParentID { get; set; };

private string CategoryID { get; set; };

private string CategoryName { get; set; };

private string CategoryPath { get; set; };

private bool IsEnabled { get; set; };
        }//End Class



/*2-Gitti Gidiyor api leri ile tüm kategorileri çekme*/
public List<Integration_Category> GetGittiGidiyorCategories()
        {

            List<Integration_Category> listOfCategories = new List<Integration_Category>();

            /*set properties definitions*/
            bool getDetail = true;
            bool getSubCatDetail = true;
            string lang = "tr";

            int pageSize = 100;
            int pageCount = 1;
            int currentPageCount = 0;
            do
            {

                GittiGidiyor.Category.categoryServiceResponse catList = categoryService.getCategories((currentPageCount * pageSize),
                                                                                               pageSize,
                                                                                               getDetail,
                                                                                               getSubCatDetail,
                                                                                               true, lang);
                if (catList == null)
                    break;

                if (catList.categories == null)
                    break;

                foreach (categoryType category in catList.categories)
                {
                    Integration_Category currentCat = new Integration_Category()
                     { CategoryID = category.categoryCode,
                       CategoryName = category.categoryName,
                       ParentID = ""
                 };
                    listOfCategories.Add(currentCat);
             
                }//End Foreach

                /*pageCount is setted at first loop*/
                if (pageCount == 1)
                {
                    pageCount = (int)Math.Ceiling(catList.categoryCount / 100M);
                }
                currentPageCount++;
            } while (currentPageCount != pageCount);

            /*Kategoria ağacının getirileceği aşağıda yer alan metod*/
            listOfCategories = this.GetCategoryTree(listOfCategories);

            return listOfCategories;

        }//End Method




/*3-Alınan kategori verilerinin hiyerarşik olarak düzenlenmesi.*/
 private List<Integration_Category> GetCategoryTree(List<Integration_Category> tempCategoryList)
        {
            List<Integration_Category> listOfCategory = new List<Integration_Category>();
            foreach (Integration_Category parentCat in tempCategoryList.Where(c => c.CategoryID.Length == 1))
            {
                parentCat.ParentID = null;
                parentCat.IntegrationType = GittiGidiyorSetting.IntegrationType;
                parentCat.IsEnabled = true;
                parentCat.CategoryPath = parentCat.CategoryName;
                listOfCategory.Add(parentCat);
                int level = 1;
                listOfCategory.AddRange(this.GetSubCategoryList(tempCategoryList, parentCat.CategoryPath, parentCat.CategoryID, level + 1));

            }//End Foreach

            return listOfCategory;

        }//End Method

/*alt kategorileri getiren recursive method*/
 private List<Integration_Category> GetSubCategoryList(
                                                           List<Integration_Category> tempCategoryList,
                                                           string categoryPath,
                                                            string parentCategoryCode,
                                                           int level)
        {
            List<Integration_Category> listOfSubCategory = new List<Integration_Category>();

            foreach (Integration_Category subCat in tempCategoryList.Where(c => c.CategoryID.StartsWith(parentCategoryCode) && c.CategoryID.Length == level))
            {
                subCat.IntegrationType = GittiGidiyorSetting.IntegrationType;
                subCat.IsEnabled = true;
                subCat.ParentID = parentCategoryCode;
                subCat.CategoryPath = categoryPath + " / " + subCat.CategoryName;
                listOfSubCategory.Add(subCat);
                listOfSubCategory.AddRange(this.GetSubCategoryList(tempCategoryList, subCat.CategoryPath, subCat.CategoryID, level + 1));

            }//End Foreach

            return listOfSubCategory;

        }//End Method




Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

15 Mart 2015 Pazar

Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' in Assembly 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.


Linq to sql ile çalışırken serialize işlemi yapmaya çalıştığımızda aşağıdaki gibi bir hata alabiliriz.

Serializable Exception :
Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' in Assembly 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.



Bu durumda aşağıdaki işlemi yapmamız yeterlidir.

Örneğin 'TradeDataContext' isminde bir dbml imizin olduğunu düşünelim ve içerisinde Product isminde bir tablodan veri çekmek istediğimizi düşünelim.

Normalde hata alabileceğimiz şekli aşağıdaki gibi bir senaryoda olacaktır.

TradeDataContext context=new TradeDataContext();
context.Products.Tolist();

Bu hatadan geçmek için aşağıdaki şekilde bir ekleme yapıp kodumuzu yeniden düzenlersek sorun çözülmüş olacaktır.

TradeDataContext context=new TradeDataContext();
context.ObjectTrackingEnabled = false;/*kodumuz içerisinde eklenecek kod*/
context.Products.Tolist();

Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.

28 Şubat 2015 Cumartesi

"How to import XML data to Sql Server", Sql Server a XML ile veri aktarımı


Normal şartlarda Sql Server üzerindeki import seçenekleri arasında xml import olmadığı için bu işlemi biraz kodla halletmemiz gerekiyor.Bunun için izlememiz gereken adımlar aşağıdaki gibidir.

Bu işlemler için örnek olarak Product tablomuz olduğunu ve XML içerisinde ProductCode ve ProductName verileri olduğunu düşünelim.


Örnek XML Verimiz
<Products>   
    <Product>      
        <ProductCode>GFRT1001</ProductCode>      
        <ProductName>Ülker Çikolatlı Gofret</ProductName>
   </Product>
    <Product>     
        <ProductCode>GFRT1002</ProductCode>      
         <ProductName>Çokonat</ProductName>   
    </Product>
</Products>



1 - Öncelikle yapmamız gereken xml verisini sql de bir tabloda tutmak için bir tablo oluşturup, xml formatında verilerimizi bu tabloya aktarmak.

--Tablo oluşturuluyor.
CREATE TABLE ProductXML (IntCol int, XmlCol xml);

--Oluşturulan tabloya xml aktarılıyor.(sadece bir satır veri eklenecek ve bu işlem veri boyutu ile doğru orantılı olarak biraz uzun sürebilir)

INSERT INTO ProductXML (XmlCol)
SELECT * FROM OPENROWSET(
   BULK 'C:\XMLDataDirectory\products.xml',
   SINGLE_BLOB) AS x;


2- Sonrasında aşağıdaki kodlar ile ürün verilerimizi saklamak için gereken tabloyu oluşturuyor ve bu tabloya olması gereken formatta ürün verilerimizi aktarıyoruz.


--Product tablomuz oluşturuluyor.
CREATE TABLE Product(ProductCode nvarchar(50), ProductName nvarchar(250))


--XML dökümanı okunuyor ve Product tablosuna toplu olarak ekleniyor.

DECLARE @XML XML;
DECLARE @hDoc INT;


--XML değişkenine ProductXML tablosuna eklenen xml atanıyor.
SELECT @XML = XmlCol FROM ProductXML 

--Sql içerisindeki standart storedprocedure
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML


--Product tablosuna xml içerisindeki her Product elementi içerisindeki kod ve isim bilgileri ekleniyor.
INSERT INTO Product
SELECT ProductCode, ProductName FROM OPENXML(@hDoc, '/Products/Product')
WITH(
           ProductCode [nvarchar](50) 'Code',
           ProductName [nvarchar](250) 'Name'
         )
--Not : WITH kısmı içerisindeki elementler 'Name' şekllinde alınıyor, cümlelerin başına @ koyduğumuzda element yerine property verilerini alabilir alt elementlere ulaşmak için ise ../ kullanarak alt elementlerdeki veirilere ulaşabiliriz.


EXEC sp_xml_removedocument @hDoc

--Ve sonuç çıktımız

SELECT * FROM Product


ProductCode       ProductName
----------------       -------------------------
GFRT1001                 Ülker Çikolatlı Gofret
GFRT1002                 Çokonat



Karşılaşılabilecek hatalar : 

1. kısımda "You do not have permission to use the bulk load statement" hatasını alabilirsiniz.Bu durumda sql query penceresinde işlem yaptığınız kullanıcı ile ilgili bazı yetkilendirmeler yapmanız gerekiyor.Bunun için aşağıdaki aşamalar uygulanabilir.

1.Sql Server daki "Security" kısmını açarız.
2."Logins" bölümü açılır
3.İlgili kullanıcı için sağ tuş özellikler(Properties) tıklanır.
4.Sol bölümdeki "Roles" tabı açılır ve "bulkadmin" seçeneğine tıklanarak ilgili kullanıcı için bulk insert işlemine yetki verilir.
5.İşlem tamamdır :)



Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.