27 Aralık 2015 Pazar

MVC EntityFramework Bağlantısı, Bal-Dal Katmanları Ve Verilerin Listelenmesi

MVC projemizde Veritabanı ile çalışmak

Bu yazımızda veritabanı işlemlerini DAL katmanını ve alınan dataların listelenmesi işlemlerini anlatacağım daha onceki MVC yazımızın devamı netiliğinde olacaktır.
Veri tabanı ile haberleşme işlemini yaptığımız kod bloğunun bulunduğu katmana Data access Layer(dal) denir. Veritabanı ile haberleşmede EntityFramework kullanacağız. Peki entityFramework nedir dersek? Entityframework microsoftun ORM(object relational mapping) aracıdır.
Entityframework ile bizler aşağıdaki üç yaklaşımdan birini kullanırız
1. DatabaseFirst : Veritabanının hazır oluşturulduğu colonların tabloların ilişkilerin hazır olarak alınıp entityframeworkte kullanıldığı durumdur.(sadece verilen veritabanına uygun yapıyı üretiriz)
2. ModelFirst : Model sınıfının ve ilişkilerin visual studiodan oluşturulduğu entityframeworkun bize DAL  ve veritabanını (colon ve ilişkilerle birlikte) ürettiği yaklaşımdır.
3. CodeFirst : Herşeyin onceden code ile tasarlanıp yazıldığı yaklaşımdır. Uygulama ilk kez çalıştığında entityframework bizlere DAL ı aynı zamanda veritabanını colon ve ilişkiler ile birlikte ürettiği yaklaşımdır. 
Daha önceki çalışmalarımızı veritabanından bağmsız kendi oluşturduğumuz sınıflar ile yapmıştık bundan sonraki çalışmalarımızda veritabanını ve daha çok codefirst yapısını kullanarak ilerliyor olacağız bunun için işlemlerimize öncelikle yeni bir veritabanı oluşturarak başlamak istiyorum.
Bilgisayarımızda kurulu olan sql servera bağlanıp yeni bir veritabanı oluşturuyoruz.

Veritabanı oluşturma ve liste halinde gosterme
1.Sqlserver da database kısmına sağ tıklayıp CanliSatis Adında yeni bir veritabanı oluşturun.
2.Visual Studiomuzda projemizi açıp connectionString oluşturmak için Web.Config dosyasını açalım ve Configuration bolumunun içerisine
connectionStrings
add connectionString="Data Source=SAHIN;Initial Catalog=CanliSatis;Integrated Security =True"
name="CanliSatisDal"
providerName="System.Data.SqlClient"
connectionStrings
ifadesini ekliyoruz.
3.Projemize Entityframework u referans olarak ekliyoruz
Projemizin üzerine sağ tıklayıp->Manage Nuget packages diyoruz ve online kısmından entity framework aratıyoruz. Daha sonra install deyip projemize ekliyoruz.
4.Projemizin üzerine sağ tıkayip yeni klasor ekle diyoruz ve daha sonra bu klasorun icerisine CanliSatisDal diye bir class oluşturuyoruz.
Oluşturduğumuz sınıfın üstkısmında using olarak :using System.Data.Entity; referansını ekliyoruz daha sonra dbContext sınıfından miras alıyoruz.
public class CanliSatisDal:DbContext
{
}

5.Calisanlar sınıfımıza birincil anahtar ekleme islemini yapıyoruz. oncelikle using olarak
System.ComponentModel.DataAnnotations; ekliyoruz.Sonra key anahtarini gosteriyoruz
public class Calisanlar
{
[Key]
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}

6. Simdi veritabani için maping işlemlerine başlıyoruz CanliSatisDal sinifimiza gidip OnModelCreating methodunu ezmemiz gerekiyor(override ediyoruz) using olarak proje adimizi ve model klasorumuzu ekliyoruz
using MVCSevenDayStart.Models;
public class CanliSatisDal:DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}
(Run time) çalışma zamanında otomatik olarak tblCalisanlar tablomuzu oluşturacaktır.
7.Database clasımızı uygulamamızda tutmak için CanliSatisDal sinifimiza birde çalışanları dbSet olarak ekliyoruz
public class CanliSatisDal:DbContext
{
public DbSet Calisanlar { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}

8.Simdi bir klasor daha ekliyoruz ismine Bal diyoruz ve içerisinde CanliSatisBal adinda bir klasor ekliyoruz. Daha once olusturdugumuz BusinessLayer(iş katmanı) içerisindeki kodu, verilerimiz databaseten gelecek şekilde değiştiriyoruz ve bu yeni sinifimiza ekliyoruz.(Bu işlemden sonra Model içerisindeki CalisanBusinesslayer sınıfını silebiliriz)
Tabiki ilk işlem olarak using sınıfını ekliyoruz. Bal sinifimiz aşagidadir
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using MVCSevenDayStart.Dal;
using MVCSevenDayStart.Models;
namespace MVCSevenDayStart.Bal
{
public class CanliSatisBal
{
public List GetCalisanlar()
{
CanliSatisDal canliSatisDal = new CanliSatisDal();

return canliSatisDal.Calisanlar.ToList();
}}}

Daha sonra bir hata alirsanız eger CalisanListController içerisine using olarak Bal klasorumuzu( using MVCSevenDayStart.Bal;) de eklemeyi unutmuyoruz.

CalisanlarListViewimizin son guncel hali
@using MVCSevenDayStart.Models
@model CalisanListViewModel
..
..
body div
Merhaba @Model.KullaniciAdi
div
div table tr
thCalisan Adi th
thMaasi th
tr
@foreach (CalisanViewModel item in Model.CalisanlarList)
{
tr
td@item.Ad td
td style="background-color:@item.CalisanRenk">@item.Maas td
tr
}
table div body
Eger derleme sonrasında sadece "Merhaba admin çalışan adi maasi"  yazan bir sayfa karşımıza geldi ise dogru adimları yapmışız :)

9.Simdi sqlserver tarafında veritabanımızı kontrol ediyoruz bakalım istedigimiz tblCalisanlar Sınıfımız oluştumu.

Evet adımları tektek yapı iseniz ve hata almadan çalıştırabildiyseniz sizinde tblCalisanlar sınıfınız oluşmustur ve simdi el ile birkac kayıt ekleyip tekrardan projemizi derleyelim. Eklediğimiz kayıtların listelendiğini görebiliriz.
Not:Hata almayan ve veritabanı oluşmayan arkadaşlar  içerisini tekrardan kontrol etmelerini oneririm burdaki yazım hataları bizim veritabanımızın oluşmasına engel olabilir.

Peki ya kullandığımız DbSet neyi ifade eder?
     Bizim veritabanından sorgu ile çektiğimiz tüm dataların tutulduğu, veritabanındaki tabloların temsil edildiği bir sınıfı ifade eder.Linq sorgusu yazdığımızda biz bu dbset nesnesini kullanırız oda veritabanındaki tablolara ceviri yaparak istedigimiz kolleksiyonları bizlere döndürür.
  
ConnectionString ve Dal arasındaki bağlantı nasıl olur?
Mapping işlemi connectionstring ifadesindeki name üzerinden yapılır. ConnectionStringName ve DalClass name aynı olduğu için otomatik olarak mapping "CanliSatisDal" gerçekleşir.

Simdi projemizde bazı değişiklikler yaparak katmanlı yapıyı daha anlamlı bir hale getirelim
İlk MVC Baslangic yazımızda anlattığımız bazı sınıfların isimlerini değistirelim ve daha anlamlı bir yapı oluşturalım.
* CalışanConroller olarak yeni bir controller olusturuyoruz ve icerisine index ile birlikte getcalisanlist action methodunu olusturuyoruz(CalisanListController icerisinden alabiliriz).
*Methodlara sağ tıklayıp add view diyoruz ve calisanview olusuyor icerisinde de iki methoda ait classlarımız olusuyor.
*GetCalisanDetay action methodumuzu yorum satirina alıyoruz Index methodumuzu yorum satırında ise yorum satırından çıkarıyoruz
*CalisanlarListViewModel içerisindeki calisanadi ozelliğini kaldırıyoruz. Ve Viewin içerisinde kullanılan alnıda kaldırıyoruz.
Son olarak SolutionExplorer goruntumuz aşağıdaki gibi oluyor


CalısanController.cs içerigi
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using MVCSevenDayStart.Models;
using MVCSevenDayStart.Bal;
namespace MVCSevenDayStart.Controllers
{
public class CalisanController : Controller
{

public ActionResult Index()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;


return View("Index", calisanListViewModel);//-->View ismini degistiriyoruz
}

public ActionResult GetCalisanListesi()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad ;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;

return View("GetCalisanListesi", calisanListViewModel);
}

public string YaziYaz()
{
return "Merhaba Dunya’lı";
}
//müsteri donduren bir action method
//public Musteri getMusteri()
//{
// Musteri m = new Musteri();
// m.adi = "sahin";
// m.soyadı = "yaral";
// return m;
//}

//bir method içerisinde birden cok view çağırılabilir.
public ActionResult ilkView()
{
Random r = new Random();
int sayi= r.Next(0, 10);
if (sayi<5 br="">{
return Content(YaziYaz());
}
else
{
return View("Index");
}
}

//public ActionResult getCalisanDetay()
//{
// Calisanlar c = new Calisanlar();
// c.Ad = "safak";
// c.Soyad = "yaral";
// c.Maas = 1234;
// c.BaslamaTarihi = DateTime.Now;

// //viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
// //ViewData["Calisan"] = c;
// //return View("Calisan");

// //viewdata yerine viewbag kullanımı
// //ViewBag.Calisanlar = c;
// //return View("Calisan");

// //genel olarak calisanlar sınıfını gondermek
// return View("Calisan", c);
//}
}
}
GetCalisanListesi.cshtml icerigi
Index.cshtml icerigi

F5  .../Calisan/Index sayfasına gittigimizde çalışanlarımızın listelendiğini gorebiliriz ayni zamanda .../Calisan/GetCalisanListesi ile de ayni listeyi elde edebiliriz.
Bu yazımızda database bağlantımızı ve kayıtları listeleme işlemini ele aldık bir sonraki yazımızda kayıt ekleme silme ve guncelleme işlemlerini ele alacağız
Kaynak :http://www.codeproject.com/Articles/986730/Learn-MVC-Project-in-days-Day

14 Aralık 2015 Pazartesi

MVC (model-view-controller) yeni başlayanlar için

     Bu yazımızda asp.net webform üzerinde biraz geliştirme yapmış ve daha önce asp.net MVC konusunu duymus fakat baslayamamıs olan arkadaşlarımıza giriş düzeyinde bir anlatım olacaktır.
     Bu işe yeni başlayan MVCyi yeni öğrenecek arkadaşlarımızın çoğunluğunun aklına ilk gelen asp.net MVC nin asp.net webformun gelişmiş hali veya yeni bir versiyonu olduğudur. Fakat bu kesinlikle yanlış bir düşüncedir. Fakat web form ile web uygulamaları yapılırken MVC bir mimari yaklaşımdır, bizim kodlarımızın daha doğru ve daha temiz olması mimari açıdan uygulamalarımızın daha hızlı daha güvenli çalışmasını sağlamaktadır.
     Microsoft Asp.net Webform dan sonra MVC mimarisi uzerinde Asp.net MVC geliştirdi. Bu gelişimi yaparken bizlere webformun ayrı MVCnin ayri tutulacağını ve birbirinin yerini almayacağını duyurmuştu. Bu nedenle ki günümüzde web uygulamaları hem webform ile yapılmakta hem de MVC ile yapılmaktadır. Tabi ki gelecekte web uygulamaların MVC üzerine inşaa edileceği öngörülüyor benim düşüncem de bu öngörünün doğru ve mantıklı olduğudur.
    Peki ya ASP.net Web Formu 12 yıldır populer kılan neden nedir?
    Bunun asıl nedenlerinden biri Microsoftun sahip olduğu vede tüm platformlarda kullandığı ide si VisualStudio. .Net yazılımcıları ilk yıllarından buya bu ide üzerinde uygulamalarını geliştirmiştir. Bunun yanında VB.net ten buyana süre gelen bir yazım alışkanlıkları vardır "Code Behind". Yazılımcılar kendi uygulamalarını UI tarafında sürükle bırak yöntemine alışmış ve daha sonra mantık ve veritabanı işlerini çift tık ile UI arkasına geçerek burada tamamlamışlardır. Bu nedenle web formlarda bir aspx ve birde aspx.cs uzantılı dosyalar mevcuttur. Bu şekilde kodlama bir süre sonrasında alışkanlık haline gelmiştir. Bu alışkanlıklardan günümüzde vazgeçmek hiçte kolay değildir.
    Her şey iyi güzel iken Web Formun sahip olduğu eksiklikler nelerdi?
    Web Formun en önemli iki eksikliğe de sahipti. Bunlar:
-Cevap süresi: yani serverın kullanıcının isteğine verdiği cevabın süresi
-Bant genişliği: Servera nekadar datanın gönderildiğidir.(Viewstate'tin fazla data taşıması sistemi ağırlastırmaktadır.)
MVC Contorller
1.  Yeni bir .net MVC projesi(empty) oluşturalım.
2.  Solution explorer dan controler klasorunun uzerine sağ tıklayım yeni controler ekleyelim
3. "MVC 5 Controller – Empty" seçip change authentication kısmından No authentication seciyoruz ve tamam diyoruz. MVC projemiz oluşuyor.
4.  Sıra yeni Controller eklemeye geldi. Controllers sekmesine sağtıklayıp add new Controller diyoruz ve MVC 5 Controller Empty seçiyoruz. Ismine TestController deyip tamam diyoruz.
5. Controller içerisine alttaki actionı ekliyoruz. 
public string YaziYaz()
{
return "Hello World is old now. It’s time for wassup bro ;)";
}
Run dedikten sonra Tarayıcımızda “ControllerName/ActionName” olarak çağırıyoruz. localhost:25654/Test/YaziYaz ve çıktısını goruyoruz :) 

Not: Buraya kadar sizlere .net webform ve asp.net MVC arasındaki ilişkiyi web formların eksik kısımlarını ve yeni bir MVC projesi oluşturup Merhaba Dunya yazmayi gosterdim. 

 TestControler ve Test ilişkisi
TestControler bizim classımızın ismidir Test ise bizim controllerımızın ismidir. Yani biz url de controller ismini yazmank istediğimizde sadece ../Test dememiz yeterli olacaktır.

Action method nedir
Bunlar controler içerisinde bulunan public methodlarımızdır. Kullanıcının istekte bulundugu ve bu isteğe karşı verilen yanıtları içerir.
Yukarıdaki örneğimizde YaziYaz() action methodumuz bizim string değer döndürür.
Web Form projelerinde geri dönüş tipleri html olurdu fakat .net MVC ile biz istediğimiz tipte bir geri dönüş değeri elde ederiz.

public class TestController : Controller
{
public string YaziYaz()
{
return "Hello World is old now. It’s time for wassup bro ;)";
}
//müsteri donduren bir action method
public Musteri getMusteri()
{
Musteri m = new Musteri();
m.adi = "sahin";
m.soyadı = "yaral";
return m;
}
}
public class Musteri
{
public string adi { get; set; }
public string soyadı { get; set; }
}
}
TestController icersine aşağıdaki kodları yazdıktan sonra tarayıcımızda projemizin (NameSpace.ClassName) uzantısını goruruz. Nedeni ise ToString() methodunu ezmemiş olmamızdır.

public class Musteri
{
public string adi { get; set; }
public string soyadı { get; set; }
public override string ToString()
{
return this.adi + "***"+ this.soyadı;
}
}
Yukarıdaki seklinde duzenleyip tekrar F5 yapıyoruz ve action methodtan istedigimiz donuş tipini elde ediyoruz. 
MVC View
Mimari olarak UI katmanıda denir. Kullanıcılara sunulan ara yüzü içermektedir.
1. TestController içerisinde GetView() adinda birtane ActionResult method oluşturalım.
2. Daha sonra bu GetView() uzerinde sağ tıklayarak AddView diyoruz.
3. UseLayoutpage secimini kaldırıyoruz ismini MusteriView olarak koyuyoruz ve add butonuna tıklıyoruz

Views->Test->MusteriView.cshtml olarak oluşturduğumuz viewi görebiliriz.
Not: F5 ile çalıştırma da dikkat edilmesi gereken iki nokta var
Eğerki view üzerinde debug ediyor iseniz controller tarafinda view adında ait bir methodunuz yok ise hata alırsınız!
Controler üzerinde debug ederseniz home klasörüne gider ve buradan siz kendiniz urli yazıp ulaşmalısınız.
Oluşturduğumuz bir method içerisinde durumu kontrol ederek istediğimiz view'i çağırabiliriz.
Aynı Sekilde bir view birden cok method tarafından çağırılabilir.

//bir methodiçerisinde birden cok view çağırılabilir.
public ActionResult ilkView()
{
Random r = new Random();
int sayi=r.Next(0, 10);
if (sayi<5 br="" clear="none">{
return View("YaziYaz");
}
else
{
return View("MusteriView");
}
}
ActionResult ve ViewResult Arasındaki bağlantı
ViewResult actionResult tın iki alt sınıfıdır. Nasıl iki alt sınıfı derseniz eğer: 
ViewResult ViewResultBase'in alt sınıfıdır. ViewResultBase ise actionResult'ın alt sınıfıdır. Burada polymorphism devreye giriyor. Aşağıdaki örneği inceleyelim
 public ActionResult ilkView()
        {
            Random r = new Random();
            int sayi=  r.Next(0, 10);
            if (sayi<5 br="" clear="none">            {
                return Content(YaziYaz());
            }
            else
            {
            return View("MusteriView");
            }
        }
Bu ornekte ActionResult kullandık çünkü ilk durum ViewResult döner iken ikinci durum ContentResult donuyor. ContentResult ta ActionResult'ın alt sınıfıdır. Bizde Polymorphism nimetlerinden faydalanıyoruz.

ViewResult ve ContentResult
ViewResult bizlere yanıt olarak tum htmli döndürmektedir fakat ContentResult ise bize dönüş değeri olarak sadece string degerler doner fakat ikiside actionResult sınıfındandir.

Not: ActionName ile ViewName eşit ise return view içerisine olusturdugumuz view in ismini yazmamıza gerek yoktur.
Routing
Bizim URLimizde yer alan değerlerin anlamsız rakam ve yazılar barındırmasını engeller. Yani sadece klasor goruntusunu verir ve son olarak bulundugumuz sayfanın ismini verir.
RouteConfig
Bizim routemap ayarlarımızın yapıldığı config dosyasıdır. Url haritamızın default değerleri ve routemap yapımızı belirleriz.Birden fazla maproute olusturabiliriz fakat name alanları birbirinden farklı olmalıdır.

MVC Model
Model bizim verilerimizin tutuldu sınıflardır. Örnek üzerinden inceleyelim
1. Model klasörüne sağ tıklayım add->new class diyoruz ve ilk model sınıfımızı oluşturuyoruz. İsmine Calısanlar diyoruz.
2. İçerisine adı soyadı maas ve baslama tarihi parametrelerini ekliyoruz.
public class Calisanlar
{
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}
3. Controllerdan model sınıfımıza erisiyoruz. Erişebilmek için öncelikle using olarak model sınıfımızı eklemeyi unutmuyoruz. 
ViewData Bizim controller ve viewler arasında veri aktarımımızı sağlar.  asp.net ve mvc3 e kadar kullanılmıstır mvc3 ten sonra yerini dinamik yapıya sahip olan ViewBag almıştır.

public ActionResult getCalisanDetay()
{
Calisanlar c = new Calisanlar();
c.Ad = "safak";
c.Soyad = "yaral";
c.Maas = 1234;
c.BaslamaTarihi = DateTime.Now;

//viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
ViewData["Calisan"] = c;
return View("Calisan");
}
4. Yeni bir view olusturmak icin getCalisanDetya() uzerine sağ tıklayip addview diyoruz ve ismine Calisan diyoruz.
5. ViewCalisanların içerisini aşağıdaki gibi düzenliyoruz ve f5 ile çalıştırıyoruz. 

Not: Tarayıcıda .../Calisan diye aratırsanız hata alırsınız çünkü controller icerisindeki action ismi ile view ismi farklıdır. Burada action ismini yazmamız gerekmekteri yani .../getCalisanDetay dediğimizde bu methodumuz bizi calısanlar viewine yonlendiricektir.
@{
Projeadi.Modelklasorunadi.Modelsınıfınızınadi cls = (Projeadi.Modelklasorunadi.Modelsınıfınızınadi)
ViewData["Calisan"];
}


Çalışan adı : @cls.Ad

Çalışan soyadı : @cls.Soyad

Çalışan maaş :@cls.Maas.ToString("C")

Çalışan giriş tarihi :@cls.BaslamaTarihi

Çalışan adı-soyadı :@(cls.Ad+” “+cls.Soyad)

ViewBag
C# 4.0 dan sonra geliştirilmistir. MVC3ten sonra viewdata nin yerini almıs ve viewdata nın dinamik hali olarak kullanılmaktadır. Yukarı ki örneğimizde değiştirmemiz gereken alanlar sunlardır:
Controller icerisinde yorumsatirina aldığımız kısım
//viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
//ViewData["Calisan"] = c;
//return View("Calisan");
//viewdata yerine viewbag kullanımı
ViewBag.Calisanlar = c;
return View("Calisan");
View içerisinde yorum satırına aldığımız kısım
@*@{
MVCSevenDayStart.Models.Calisanlar cls = (MVCSevenDayStart.Models.Calisanlar)
ViewData["Calisan"];
}*@
@{
MVCSevenDayStart.Models.Calisanlar cls = (MVCSevenDayStart.Models.Calisanlar)
ViewBag.Calisanlar;
}
veya view icerisinde 
@{
@Model;
}

Çalışan adı : @Model.Ad

Çalışan soyadı : @Model.Soyad

Çalışan maaş :@Model.Maas.ToString("C")

Çalışan giriş tarihi :@Model.BaslamaTarihi
gibi bir değişiklik yaparsak çalışan detaylarına ulaşabiliriz. Daha fazla ornek için

View içerisine liste göndermek
1. Bunun için öncelikle yeni bir model oluşturalım ve adina CalisanviewModel diyelim.
public class CalisanViewModel
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
public string CalisanRenk { get; set; }
}
2. Daha sonra list model oluşturalim ve adına CalisanListViewModel diyelim.
public class CalisanListViewModel
{
public List CalisanlarList { get; set; }
public string KullaniciAdi { get; set; }
}

3. Yeni bir view oluşturalim ve adına CalisanlarListesi diyelim. Ve içerisini aşağıdaki gibi düzenleyelim.
@foreach (CalisanViewModel item in Model.CalisanlarList)
{

@item.Ad

@item.Maas

}
4. Simdi sıra projemizi bir basamak ilerletmeye geldi ve business layer katmanını olusturuyoruz. Bunun için model klasorunun içerisine CalisanlarBusinessLayer adinda bir sinif olusturuyoruz. Ve içerisine GetCalisanlar methodunu ekliyoruz.
public List GetCalisanlar()
{
List calisanList = new List();
for (int i = 0; i < 5;i++ )
{
Calisanlar cls = new Calisanlar();
cls.Ad = "sahin" +i;
cls.Soyad = " yaral"+i;
cls.Maas = 1234 +i*100;
calisanList.Add(cls);
}
return calisanList;
}

5. Sıra verilerimizi view icerisine gostermeye  geldi bunun için yeni bir controller oluşturuyoruz tabi isteyenler testController içerisindede yapabilirdi.Ve olusturdugumuz controller içerigini aşagıdaki gibi düzenliyoruz.
public ActionResult CalisanListesi()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CaslisanlarBusinessLayer clsBal = new CaslisanlarBusinessLayer();
List calisanlarList = clsBal.GetCalisanlar();
List clsViewModels = new List();
foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel clsViewModel = new CalisanViewModel();
clsViewModel.Ad = item.Ad + " " + item.Soyad;
clsViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
clsViewModel.CalisanRenk = "yellow";
}
else
{
clsViewModel.CalisanRenk = "green";
}
clsViewModels.Add(clsViewModel);
}
calisanListViewModel.CalisanlarList = clsViewModels;
calisanListViewModel.KullaniciAdi = "Admin";
return View("CalisanlarListesi", calisanListViewModel);
}

simdi F5 deyip sonucu kontrol edebiliriz bende .../CalisanList/CalisanListesi altında gorunmektedir.

MVCde başlagıç seviyesinde bir girisimiz oldu.Sanırım birazda uzunca oldu :) Kaynaklar:

28 Ekim 2015 Çarşamba

Yazılım Stajı Vestel ve Veriyaz

     Merhaba arkadaşlar bu yazımda sizlere daha önceden de söylediğim gibi yazılım stajları hakkında bilgi vereceğim. Kurumsal mı olmalı? Yazılım evimi? Küçük bir sirketmi?
     Arkadaşlar öncelikle şunun kararını vermeniz gerekiyor. Ben bu stajı ne amaçla yapacağım? Staj günümü doldurmak için mi? Yoksa gelecek günlerim adına tecrübe edinebilmek bir şeyler öğrenebilmek için mi? Tabi ki şimdi gelecek kariyeriniz derken? İkinci sınıftaki arkadaşlar için hatta üçüncü sınıftaki arkadaşlar için de bunun kararını vermek birazcık zor durum oluyor. Bunun için size önerim tanıdığınız birilerinin fikirlerini dinler ve tecrübelerinden yararlanabilirsiniz. Bu hocanız olabilir, üst sınıftaki arkadaşlarınız olabilir akrabanız vs olabilir.
     Her şeyden önce hangi işi yaparken daha çok keyif alıyorsunuz? kod yazarken mi? Tasarım yaparken mi? Algoritmalarla uğraşırken mi? Veritabanı ile mi? Mobil mi? Aynı zamanda yazılımın diğer alanı İş zekası kısımlarını ve SAP kısmını da incelemeniz öneririm.
    Bunları inceledikten sonra sizden daha tecrübeli olan tanıdıklarınızın da fikirlerini ama son karar yine sizin olsun. Kararınızı verdikten sonra bu kez staj yeri seçimi nasıl olmalı nerelerde olmalı istanbul da yaşayan arkadaşlar için durum biraz daha kolay bu konuda diğer şehirler de yaşayan arkadaşların fazla seçimleri olmuyor. Kurumsal yerlerde küçük firmalara nazaran stajyer arkadaşlar ile daha az ilgileniyor bu benim görüşüm tabi ki.
    Ben stajımın birini Vestel Dijital de yapmıştım. Vestel özellikle stajyer öğrenciler için fazlaca disipline sahip bir şirkettir. Giyim kurallarına uymanız ve ilk gün belirtilen yerde olmanız gerekiyor diğer türlü kapıda fazlaca beklemeniz gerekebilir. Size ilk günden itibaren bir kaç eğitim veriyorlar iş güvenliği eğitiminden başlayarak bulunduğunuz birimin tüm süreçleri inceleyebileceğiniz eğitimler oluyor. Son olarak birim müdürünüzün size verdiği görevi yapıyorsunuz ilk zamanlar biraz canınız sıkılabilir is istemekten çekinmemelisiniz. Ben ve stajyer arkadaşlarım Vestel dijital da seri ve paralel port haberleşmesini üzerine ve daha sonra fatih projesi için hazırlanan tabletlerin işletim sitemi testlerini yaptık. Vestel de staj yapmaktan ise Part-time olarak çalışmanızı öneririm. Part-time çalışan arkadaşlarımızın ile daha fazla ilgileniliyor ve iş atamaları daha ciddi oluyordu.
     Bir diğer stajımı da Veriyaz yazılım şirketinde yaptım. Burası kurumsal olmayan kendi içerisinde projeler geliştiren bir yazılım şirketiydi. Yeri İzmir AOSB yeni parsellerde bulunmaktadır. Ulaşım olarak sabahları kendi servisi mevcuttur mavisehir izban metrodan almaktadır. Tabi ki bu söylediklerim 2013-2014 tarihleri arasında geçerliydi. Veriyaz da ise C# Winform uygulama geliştirdik. Şirket sahibi Erkan bey gayet mantıklı ve iyi biridir. Gelişmeye açık ve sizden de yeni teknolojileri takip etmenizi bekler. Yazılım departmanı 5 ile 10 kisi arasındaydı. Tasarım ve sistem kısımında da çalışan arkadaşlarımız vardı. Projemizi TFS kullanarak geliştiriyorduk projede C#, LinqtoSql aynı zamanda WCF servislerini kullanıyorduk. Tabi ki bunları stajımdan sonra çalışmaya başladığımda projeye dahil olduğum zaman yaptım ondan önce linqtosql ve winformda birkaç küçük proje çalışmaları yaptırmıştım.
    Evet şuanda okulunun 3 ve 4. sınıfında olan arkadaşlarımıza ilk tavsiye edeceğim ilk şey imkanları var ise part-time olarak bir projede yer almalarıdır. İkincisi ise Stajlarınız da sizlere görevler verilmez ise kendi kendinize proje düşünüp başlamanızdır. http://www.codeproject.com/
    Biz yazılımcılar için olmazsa olmazı "parmak klavyeye deyecek" kuralıdır unutmayalım!
 

29 Haziran 2015 Pazartesi

Asp.Net Web application vs Asp.Net Web Site

Web application
     Visual studiomuzdan ctrl+shift+N tuş kombinasyonu ile yeni bir web uygulamasi oluşturabiliriz. 


  • Proje bilgileri .csproj veya .vbproj uzantılı dosyada saklanır.
  • Sayfalara,sınıflara namespace eklenir
  • Projeyi tek bir assembly icerisinde toplanir ve versiyonlama islemi yapılır
  •  Canli ortama kaynak kodlar eklenmeyebilir
  •   Dağıtımını yaparken olusan assembly(.dll) dosyasını sunucuya atmamız yeterlidir.


  • Web Site
        Visual studiomuz dan Shift+Alt+N tuş kombinasyonu ile yeni bir web sitesi oluşturabiliriz.
    • Proje dosyasi ayri olarak olusturulmaz.Klasör yapısındaki tüm dosyalar projemize eklenir
    • Kodlar sunucuya ilk ulaştığı anda derleme yapılır.Her sayfa kendi assembly dosyasini oluşturur
    • Dağıtım yaparken projenin kaynak kodlarını Server’da IIS in klasörüne eklenmelidir veya önderleme çıktıları eklenmelidir.

    Kaynaklar
    https://msdn.microsoft.com/en-us/library/dd547590(v=vs.110).aspx
    http://serkanyarbas.com/web-application-projesi-ile-web-site-projesi-arasindaki-farklar/


    15 Haziran 2015 Pazartesi

    SQL T-SQL Sorguları4

    Sorgularımıza kaldığımız yeden devam ediyoruz biraz daha karışık diyebilceğimiz bir iki sorgu örnegini de ekliyoruz. Aşağıda select ifadesini kullanarak Northwınd veri tabanında CROSS JOIN,CAST, INNER JOIN, LEFT JOIN , RIGHT JOINFULL JOINHAVING,GROUP BY, ORDER BY, AS vs. fonksiyonları kullanarak çalışmalar yaptık.
    -- ilk 3 ürünü ile ilk 3 kategori ile her ürünün her kategori ile eşleşmesini sağlayalım.
    --1. Cozum
    SELECT  *
    FROM   (
       SELECT TOP(3) ProductName
       FROM Products
     ) as Table1
    cross join(
      SELECT TOP(3) CategoryName
      FROM Categories
      )AS Table2
    order by   Table2.CategoryName
    --2. Cozum
    SELECT
    ProductName,
    C.CategoryName
    FROM Products AS P
    CROSS JOIN Categories AS C
    WHERE ProductID<=3 AND C.CategoryID<=3

    --24000 TL'den fazla satılan ürün isimleri nelerdir?
    SELECT P.ProductName,
    CAST(CAST(SUM(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) AS DECIMAL(8,2)) AS NVARCHAR(15)) + ' TL' AS Total
    FROM [Order Details] AS OD
    INNER JOIN Products AS P ON P.ProductID = OD.ProductID
    GROUP BY P.ProductName
    HAVING SUM(OD.Quantity*OD.UnitPrice*(1-OD.Discount)) > 24000
    ORDER BY Total DESC

    -- Siparişlerim hangi müşteriye, ne zaman, hangi çalışanım tarafından gerçekleştirilmiştir.
    -- CompanyName alfabetik, siparişler en yeniden en eskiye doğru ve aynı sipariş günü olanlarda çalışan adına göre alfabetik olsun.
    SELECT Cus.CompanyName, E.FirstName, O.OrderDate
    FROM Orders AS O
    INNER JOIN Employees AS E ON E.EmployeeID = O.EmployeeID
    INNER JOIN Customers AS Cus ON Cus.CustomerID = O.CustomerID
    ORDER BY Cus.CompanyName, OrderDate DESC, E.FirstName ASC

    -- Hangi ülkeye ne kadarlık satış yapmışım?
    SELECT O.ShipCountry, SUM(OrD.UnitPrice*OrD.Quantity) AS TotalRevenue
    FROM [Order Details] AS OrD
    INNER JOIN Orders AS O ON O.OrderID=OrD.OrderID
    GROUP BY ShipCountry
    ORDER BY TotalRevenue DESC

    -- Hangi kategoriden ne kadarlık satış yapmışım?
    SELECT C.CategoryID, C.CategoryName, SUM(OrD.UnitPrice*OrD.Quantity)
    FROM [Order Details] AS OrD
    INNER JOIN Products AS P ON P.ProductID=OrD.ProductID
    INNER JOIN Categories AS C ON C.CategoryID=P.CategoryID
    GROUP BY C.CategoryID,C.CategoryName

    -- EmployeeId=1 olan çalışanın satmış olduğu ürünleri listeleyelim.
    SELECT P.ProductName, COUNT(P.ProductID) , SUM(OD.Quantity * OD.UnitPrice)
    FROM Products AS P
    INNER JOIN [Order Details] AS OD ON P.ProductID = OD.ProductID
    INNER JOIN Orders AS O ON OD.OrderID = O.OrderID
    WHERE O.EmployeeID = 1
    GROUP BY P.ProductName

    -- ÖDÜLLÜ SORUMUZ
    -- Hangi siparişi hangi çalışan hangi müşteriden almış.
    -- Bu sipariş hangi kargo şirketi ile gönderilmiştir? Bu siparişte hangi kategori den
    -- Hangi tedarikçinin sağladığı hangi üründen kaç adet satın alınmıştır?

    SELECT 
    O.OrderID,
    E.FirstName,
    C.CompanyName,
    S.CompanyName,
    CA.CategoryName,
    SU.CompanyName,
    P.ProductName,
    OD.Quantity
    FROM
    Orders AS O
    INNER JOIN Employees AS E ON O.EmployeeID=E.EmployeeID
    INNER JOIN Customers AS C ON C.CustomerID=o.CustomerID
    INNER JOIN Shippers AS S ON O.ShipVia=S.ShipperID
    INNER JOIN [Order Details] AS OD ON OD.OrderID=O.OrderID
    INNER JOIN Products AS P ON P.ProductID=OD.ProductID
    INNER JOIN Categories AS CA ON CA.CategoryID=P.CategoryID
    INNER JOIN Suppliers AS SU ON SU.SupplierID=O.ShipVia

    SQL T-SQL Sorguları3

    Sorgularımıza kaldığımız yeden devam ediyoruz 
    Aşağıda select ifadesini kullanarak Northwınd veri tabanında INNER JOIN, LEFT JOIN , RIGHT JOINFULL JOINHAVING,GROUP BY, ORDER BY, AS vs. fonksiyonları kullanarak çalışmalar yaptık.

    Yararlı olması dileğiyle...
    --Federal Shipping(SHİPPER) ile tasinmis ve Nancy(EMPLOYEE)'nin almış oldugu siparişler(ORDER) ve adet ile tutarları

    SELECT e.FirstName,
    s.CompanyName,
    OD.Quantity,
    OD.UnitPrice,
    (OD.UnitPrice*OD.Quantity) AS [TOPLAM TUTAR]
    FROM Orders O
    INNER JOIN Shippers S ON S.ShipperID = o.ShipVia
    INNER JOIN Employees E ON E.EmployeeID = O.EmployeeID
    INNER JOIN [Order Details] OD ON OD.OrderID = O.OrderID
    WHERE  S.CompanyName LIKE 'Federal Shipping'
    AND E.FirstName = 'Nancy'

    --  Ürünleri ve bağlı bulundukları kategorileri listeleyiniz. Ancak ürünü olmayan kategorilerde olmalı.

    SELECT
    P.ProductName,
    C.CategoryName
    FROM Categories C
    LEFT JOIN Products P
    ON P.CategoryID = C.CategoryID

    --Ürünleri ve bağlı bulundukları kategorileri listeleyiniz. Ancak kategorisi olmayan ürünleri de gösterelim.
    SELECT P.ProductName, C.CategoryName
    FROM Categories AS C
    RIGHT JOIN Products AS P
     ON P.CategoryID = C.CategoryID



    -- Ürünleri ve bağlı bulundukları kategorileri listeleyiniz. Ancak kategorisi olmayan ürünler ve ürünleri olmayan kategoriler de listelensin.

    SELECT P.ProductName, C.CategoryName
    FROM Categories C
    FULL JOIN Products P ON C.CategoryID=P.CategoryID
    ORDER BY P.ProductName DESC



    -- En çok ürün aldığımız 3 tedarikçiyi, almış olduğumuz ürün miktarlarına göre raporlayalım...
    SELECT TOP(3) S.CompanyName,SUM(P.UnitsInStock+P.UnitsOnOrder) AS ADET
    FROM Products AS P
    INNER JOIN Suppliers AS S
    ON P.SupplierID = S.SupplierID
    GROUP BY S.CompanyName
    ORDER BY ADET DESC

    -- Her üründen toplam ne kadarlık satış yapılmıştır ve o ürünler hangi kategoriye aittir?

    select P.ProductName,sum (O2.Quantity*O2.UnitPrice) AS TOPLAM_ÜRÜN_FİYATI
    from Products as P
    inner join Categories as C on C.CategoryID=P.CategoryID
    inner join [Order Details] as O2 on O2.ProductID=P.ProductID
    group by P.ProductName
    ORDER BY P.ProductName

    select P.ProductName,c.CategoryName,sum (O2.Quantity*O2.UnitPrice) AS TOPLAM_URUN_FİYATI
    from Products as P
    inner join Categories as C on C.CategoryID=P.CategoryID
    inner join [Order Details] as O2 on O2.ProductID=P.ProductID
    group by P.ProductName,c.CategoryName
    ORDER BY P.ProductName


    select P.ProductName,c.CategoryName
    ,sum (O2.Quantity) as Quantity
    ,sum (O2.Quantity*O2.UnitPrice) AS TOTAL
    from Products as P
    inner join Categories as C on C.CategoryID=P.CategoryID
    inner join [Order Details] as O2 on O2.ProductID=P.ProductID
    group by P.ProductName,c.CategoryName
    ORDER BY P.ProductName

    -- CompanyName'leri arasında A geçen müşterilerin vermiş olduğu siparişlerin;
    -- Nancy, Andrew ya da Janet tarafından alınmış olanlarının;
    -- Speedy Express ile taşınmamış siparişler ve ne kadarlık kargo ödemesi yapılmıştır?

    select e.FirstName, s.CompanyName, c.CompanyName,
    o.Freight
    from Orders as o
    inner join Customers as c on c.CustomerID=o.CustomerID
    inner join Employees as e on e.EmployeeID=o.EmployeeID
    inner join Shippers as s on s.ShipperID=o.ShipVia

    where s.CompanyName!='Speedy Express'
    and ( e.FirstName='Nancy'
    or e.FirstName='Andrew'
    or e.FirstName='Janet' )
    and c.CompanyName like'%a%'

    -- CompanyName'leri arasında A geçen müşterilerin vermiş olduğu siparişlerin;
    -- Nancy, Andrew ya da Janet tarafından alınmış olanlarının;
    -- Speedy Express ile taşınmamış siparişlerin Müşteri Company Name'e göre TOPLAM ne kadarlık kargo ödemesi yapılmıştır?
    SELECT
    SUM(O.Freight) AS Kargo,
    C.CompanyName
    FROM Orders AS O
    INNER JOIN Customers As C On C.CustomerID = O.CustomerID
    INNER JOIN Shippers AS S On S.ShipperID = O.ShipVia
    INNER JOIN Employees AS E ON E.EmployeeID = O.EmployeeID
    WHERE C.CompanyName LIKE '%A%' AND
    --E.FirstName IN ( 'Nancy','Andrew','Janet') AND
    E.FirstName IN ( Select TOP(3) FirstName From Employees order by FirstName desc ) AND
    S.CompanyName!='Speedy Express'
    GROUP BY C.CompanyName
    HAVING
    --SUM(O.Freight)>100
    --SUM(O.Freight)>100 and SUM(O.Freight)<200 p=""> SUM(O.Freight) BETWEEN 100 AND 200

    14 Haziran 2015 Pazar

    SQL T-SQL Sorguları2

     Veri İşleme Dili (Data Manipulation Language) (DML)
         Veritabanı içerisindeki veriler ile işlem yapmamızı sağlayan komutlar. Verilerin gösterilmesi eklenmesini düzenlenmesini ve silinmesini sağlar. Dört adet veri işleme ifadesi bulunmaktadır.
    1. SELECT  :Veri seçme 
    2. INSERT   :Veri ekleme
    3. UPDATE :Veri düzenleme
    4. DELETE :Veri silme
        Aşağıda select ifadesini kullanarak Northwınd veri tabanında DATEDIFF, LEN, AVG, MAX, MIN, COUNT, ORDER BY, AS vs. fonksiyonları kullanarak çalışmalar yaptık.
    Yararlı olması dileğiyle...

    USE NORTHWND --(benim sql serverdaki ismi)
    go
    --100 TL den büyük ürünler hangileridir?
    select ProductName
    from Products 
    where UnitPrice>100

    --UnitsInStock (stok) değeri 10'un altında olan ürünlerin adı, fiyatı ve stok bilgileri nedir?
    select ProductID,ProductName
    from Products where UnitsInStock <10 div="">

    --"Brazil" 'de bulunan müşterilerin Şirket Adı, TemsilciAdi, Adres, Şehir, Ülke bilgileri nedir? 
    select c.CompanyName,c.ContactName,c.Address,City,Country
    from Customers as c where Country='Brazil'

    --"Brazil" 'da olmayan müşteriler kimler?
    select c.CompanyName,c.ContactName,c.Address,City,Country
    from Customers as c where Country!='Brazil'

    --"London" 'da ya da "Paris" 'de bulunan müşterilerim kimlerdir?
    select c.CompanyName
    from Customers as c where City='London' or City='Paris'

    --Hem "Mataderos  2312" 'da ikamet eden HEM DE ContactTitle bilgisi "owner" olan müşteriler kimlerdir?
    select c.CompanyName,c.Address
    from Customers as c where  ContactTitle='owner' and Address='Mataderos  2312' 

    --C ile başlayan ürünlerimin isimleri ve fiyatları nelerdir?
    select p.ProductName,p.UnitPrice
    from Products as p where ProductName like 'C%'

    --Adı (FirstName) 'A' harfiyle başlayan çalışanların (Employees); Ad, Soyad ve Doğum Tarihlerini listeleyiniz.
    select FirstName,LastName,BirthDate
    from Employees where FirstName like 'A%'

    --İsminde 'RESTAURANT' geçen müşterilerimin şirket adları nelerdir?
    select CompanyName
    from Customers where CompanyName like '%RESTAURANT%'

    --50TL ile 100 TL arasında bulunan tüm ürünlerin adları ve fiyatları nedir?
    select ProductName,UnitPrice
    from Products where UnitPrice>50 and UnitPrice<100 div="">

    --1 temmuz 1996 ile 31 Aralık 1996 tarihleri arasındaki siparişlerin (Orders), SiparişID (OrderID) ve SiparişTarihi (OrderDate) bilgilerini listeleyin.
    select OrderID,OrderDate
    from Orders where OrderDate between '7.1.1996' and '12.31.1996'

    --Ülkesi (Country) Ya Spain, Ya France, Ya da Germany olan müşteriler kimlerdir? (Hem OR kullanarak sorguyu yazın. Aynı sorguyu ayrıca IN kullanarak yazın)
    select CompanyName
    from Customers where Country in('Spain','France','Germany') --where Country ='Spain' and Country='France' or Country='Germany'

    --Faks numarasını bilmediğim müşteriler kimlerdir?
    select *
    from Customers where Fax is null

    --Müşterilerimi ülkeye göre alfabetik sıralayınız.
    select CompanyName
    from Customers 
    order by CompanyName asc

    --Ürünlerimi en pahalıdan en ucuza doğru sıralama, sonuç olarak ürün adı ve fiyatını istiyoruz.
    select ProductName,UnitPrice
    from Products 
    order by UnitPrice desc

    --Ürünlerimi en pahalıdan en ucuza doğru sıralasın, ama stoklarını küçükten-büyüğe doğru göstersin sonuç olarak ürün adı ve fiyatını istiyoruz.
    select ProductName,UnitPrice,UnitsInStock
    from Products 
    order by  UnitsInStock desc, UnitPrice asc

    --Kaç  adet müşterim vardır?
    select count (CustomerID)
    from Customers

    --1 Numaralı kategoride kaç adet ürün vardır?
    select COUNT(ProductName)
    from Products where CategoryID =1

    --Birim fiyatı en pahalı ve en ucuz ürünün fiyatları nelerdir?(Ürün adını istemiyorum sadece, pahalı fiyat ve ucuz fiyat değeri)
    select MAX(UnitPrice),MIN(UnitPrice)
    from Products 

    --Ürünlerimin ortalama fiyatı nedir?
    select avg(UnitPrice)
    from Products

    --En az kazandıran sipariş (Kaynak: Order Details)  ??
    select MIN(OD.UnitPrice-Discount )
    from [Order Details] AS OD

    --Müşterilerimin içinde en uzun isimli müşteri (harf sayısı)
    SELECT top(1) CompanyName, LEN(CompanyName)  AS lenn  FROM Customers
    order by lenn desc

    --Çalışanlarımın Ad, Soyad ve Yaşları nedir?
    select FirstName,LastName,DATEDIFF(yy, BirthDate, getdate()) as Yas,BirthDate
    from Employees



    19 Şubat 2015 Perşembe

    Yazılım Sektörüne Yeni Başlayanların Dikkat Etmesi Gereken Noktalar!

         Arkadaşlar uzun zaman olmuştu bir şeyler karalamayı başlığımızın 5. maddesini karalamanın vakti gelmiş. Arkadaşımın isteği üzerine 5ten başlıyoruz. Bunlar benim kısa zamanda gördüğüm ve dikkate aldığım noktalar işinize yarayacağını umuyorum. Yazılım sektörüne yeni başlayanlar için bir şeyler karalayacağımızı söylemiştik bunların başında daha yeni sektöre giren öğrenci arkadaşlarımız için gelsin.
         Arkadaşlar şuanda daha yolun çok başındasınız biliyorum öğrencilik hayatı çok güzel bunu en güzel şekilde yaşayan öğrencilerden biri olmuşumdur.
         Fakat öğrencilikte bir yerekadar olmalı bilgisayar müh. veya yazılım okuyan arkadaşlarıma en azından son iki yıllarında proje bazlı olarak çalışmalarını öneriyorum. Son iki yılda yazılımın hangi tarafında yer alcağınızı kestirmeniz gerçekten de zor olabilir ama bir yerlerden başlamak yola girmek gerekir.Bu yolda yürüyecek seniz ve bu yoldan hayatınızı geçindirmeyi düşünüyorsanız sevdiğim birinin bana dediği gibi "Parmak klavyeye deyecek." evet doğru söz. Hocalarımız anlatmıyor diye üzülmeyin internette yeterince kaynak mevcut kendinize güvenin yeter.
         Son iki yılınızda yaptığınız projeleriniz sizin gelecek yıllarda neler yapabileceğinizi ve bu yolda daha hızlı adımlarla yürüyebilmenizi sağlayacaktır. Evet birde staj olayları var arkadaşlar stajlarınızı kendiniz isteyerek yapmanız her şeyden daha önemlidir. Kurumsal olmuş veya olmamış(tabi ki bazı şirketleri ayrı bir kenarda tutuyoruz) çok ta önemli değil önemli olan sizin neler yapacağınızdır. Staj sırasında soru sormaktan görev almaktan hiç mi hiç çekinmeyin.( soru konusunda ben tam olarak bunu yapamamıştım) Sorun araştırmalar yapıp kafanıza takılan her şeyi sorun kimse size sormadan bir şeyler anlatmaz hatta ki sorduğunuz zaman dahi karşınıza bildiklerini paylaşmayan insanlar çıkacaktır. Aldırmayın böyle insanlar her yerde var siz sadece işinize konsantre olun ve yapmanız gerekenleri yapın.Göreceksiniz bir yerden sonra işler yoluna girecektir bir kaç ay sabret ve çalış. Ama öyle bir iki ay ile pes etmek yok!
         Öğrencilik hayatımda iyi ki yapmışım dediğim olayların başında erasmus var yapabiliyorsanız bence yapın sizlere çok önemli deneyimler kazandıracaktır.(Teknik açıdan çok fazla bir şey beklemeyin)
        Eveet şimdi geldik erkek arkadaşlar için dananın kuyruğunun koptuğu noktaya. Arkadaşlar askerlik bildiğimiz üzere sıkıntılı bir mevzudur sizlere tavsiyem ya kararlı ve planlı bir şekilde erteletin yada mezun olduğunuz zaman hemen askerlik işini aradan çıkarın. Unutmayın eğer ki planlı bir şekilde ertelemezseniz bu her zaman önünüzde ki bir engel olacaktır.
         Simdi de son olarak sektörde işe yeni başlayan arkadaşlara bir kaç önerimiz olacak. Arkadaşlar açıkçası hangi üniversiteden hangi puanla mezun olduğunuzun sektörde pek bi önemi yok. Adamlar iş yapan eleman arıyorlar. Proje bazlı çalışan takıma uyum sağlayabilen verilen projeleri zamanında bitirebilen ve daha önemlisi kendini geliştirebilen kişileri tercih ediyorlar.Benim size önerim öncelikle yeni işe başlıyorsanız eğer PM(project manager/proje yöneticiniz) sizin çok fazla bir şey bilmediğinizin veya ne kadar bildiğinizin farkında olacaktır, fakat sizden yinede kendinizi geliştirmeniz için ve proje için güzel şeyler isteyebilir. Burada yapmanız gereken araştırmak ve sizin üstünüzde yer alan arkadaşlarınıza veya PM danışmak olacaktır. Dediğim gibi unutmayın  SORU SORMAKTA çekinmek yok! Eğer ki işe yeni başlayan arkadaşlarınızda varsa onlarla birlikte aktif bir çalışma yürütün.
         Kendinizi belli bir konuda uzmanlaştırır iken aynı zamanda başka konular da da hobiler edinin her zaman makaleler ve kitaplar okuyun aynı zamanda blogları ve güzel sayfalarıda takip ediniz. Özellikle internetteki WEBINERleri kaçırmadan izleyin. Bunlar sizleri daha profesyonel adımlarla ilerlemeniz de yardımcı olacaktır.
    https://www.khanacademy.org/contribute
    https://www.udemy.com/
    https://www.acikakademi.com/portal/default.aspx
    https://muratbaseren.wordpress.com/tag/murat-baseren/
    http://www.buraksenyurt.com/
        Unutmayın ki bir işe inanmak yarısı başlamakta diğer yarısıdır. Evet bize de bir şey kalmıyor bundan sonra :) Umarım keyif almışsınızdır hoşçakalın :)
                                                                                                                                 Şahin YARAL