6 Aralık 2017 Çarşamba

C# Windows Form - Combobox Linq İle Veri Ekleme

Merhaba Arkadaşlar,

Bu yazıda işinize yarayacak ve benim de uzun süre çözüm aradığım konuda küçük bir bilgi paylaşacağım. C# Windows Form uygulamasında diyelim ki personel tablomuza verileri eklerken personelin departmanı combobox listeden seçtiğimizi ve aynı zamanda uygulamada departman ekleme silme de yaptığımızı düşünelim. Buna göre veritabanında departman tablomuz da olmalıdır.

Departman Tablosu

Veri tabanından departman listesini combobox bağladığımızda resimdeki gibi olacaktır.



using (var context = new MuhasebeContext())
            {
                var departman = (from g in context.PersonelDepartmanlari orderby g.Tanim select new { g.Id, g.Tanim}).ToList();

                cbDepartman.DataSource = departman;
                cbDepartman.DisplayMember = "Tanim";
                cbDepartman.ValueMember = "Id";
}

DbContext sınıfından türetilmiş MuhasebeContext PersonelDepartmanlari varlığından verileri getirdik. Verileri toList() ile liste koleksiyonunda dönüştürdük. 

Diyelim ki biz personel listesini departman kriterine göre veya departman kriterini belirtmeden filtreleyeceğiz. Bunun için combobox listesinde "Seçim Yapılmadı" gibi bir eleman daha eklemeliyiz. 
Kodumuzu buna göre değiştirip.
using (var context = new MuhasebeContext())
            {
                var departman = (from g in context.PersonelDepartmanlari orderby g.Tanim select new { g.Id, g.Tanim}).ToList();
                departman.Add(new { Id = -1, Tanim = "Seçim Yok" });
                cbDepartman.DataSource = departman;
                cbDepartman.DisplayMember = "Tanim";
                cbDepartman.ValueMember = "Id";
}

Yani combobox resimdeki gibi olmalıdır.

İyi çalışmalar.

6 Kasım 2017 Pazartesi

DHCP SERVER

Bu yazı kullanıcı(veya ağ cihazı) sayıları fazla olmayan ve fazla konfigürasyon gerektirmeyen sistemleri yöneten bilgi işlem personellerine DHCP Server önemini, kurulumunu ve konfigürasyonunu göstermek amacıyla hazırlanmıştır. Daha önce çalıştığım kurumda yaklaşık 70 kullanıcı ve 120 ağ cihazı vardı. Bu ağ cihazları arasında Masaüstü Bilgisayarlar, Tablet Bilgisayarlar, Yazıcılar ve Tarayıcılar vardı. Yapımızda Windows Server 2012 R2 Sunucu işletim sistemine DHCP Server kurmuştum. Böyle bir yapıyı göz önünde bulundurarak konuyu anlatmaya çalışacağım. İstemci(Client) bilgisayarlara Windows 8 işletim sistemi kuruludur.

DHCP Nedir?
Ağ cihazlarının otomatik IP adresi almalarını sağlayan protokoldür. Sadece IP adresi değil ağ cihazlarının DNS ve Ağgeçidi adreslerini de otomatik almasını sağlar.

Ağdaki cihazlarına iki şeçenekle IP adresi ataması yapılabilir.
Statik IP ataması: tüm IP bilgileri elle girilir.
Dinamik IP ataması: seçeneğiyle IP bilgileri DHCP sunucudan belli süreliğine bir IP kiralanır ve otomatik atanır.


























Statik IP ve Dinamik IP Karşılaştırılması

Statik IP
Dinamik IP
IP ayarı çok zaman alır.
IP ayarı daha az zaman alır.
IP ayarı elle yapıldığı için zordur. Aynı zamanda sıkıcı ve yorucudur.
IP ayarı otomatik yapıldığı için daha kolaydır.
IP ayarları doğruluğundan emin olunur.
IP ayarı doğrulanmaz ve IP çakışmasına neden olabilir.
İstemci başka ağa taşındığında IP ayarı yeniden yapılmalıdır.
Yeni ağda IP ayarı yapılmaz.


Windows Server 2012 R2 DHCP Server Kurulumu ve Konfigürasyonu

DHCP Server Kurulumu

  1. Server Manager'ı aç Add roles and features tıklayınız.
  2. Before you begin pencereside, rol ve özellik kurulumu hakkında bilgiler içermektedir Next tıklayınız.
  3. Selection installation type penceresinde, role-based or feature-based installation seçeneğini işaretleyerek Next tıklayınız.
  4. Selection Destination Server penceresinde, DHCP Server'ün kurulacağı server seçilip, Next tıklayınız.
  5. Server Select Roles penceresinde, DHCP Server seçip Next tıklayınız.
  6. Features penceresinde seçeceğiniz özellik olmadığından direkt Next tıklayıp devam ediniz.
  7. DHCP Server penceresinde, bir kaç uyarı ve bilgi bulunmaktadır Next deyip devam ediniz.
  8. Configuration penceresinde Restart kutusnu işaretleyerek install tıklayarak kurulumu başlatın ve kurulum bitince close tıklayınız.
  9. DHCP Server kurulduktan sonra açılan sihirbazda bu rolün yetkilendirme işlemleri yapılır.
Yukarıdaki adımlardan sora DHCP Server kullanıma hazırdır.

DHCP Server Konfigürasyonu

DHCP Server konfigürasyonuna gelmek için Server Manager -> DHCP tıklayınız.

Açılan pencerenin sol panelinde DHCP ->Active Directory İsmi -> IPv4 ikonunu sağ tıklayarak yapılabilecek konfigürasyonlar menüsü listelenmektedir.

Menüden New Scope tıklanarak yeni scope tanımlanabilir.
  1. Scope adı ve açıklaması bilgileri girilir.
  2. IP aralığı (örnek 192.168.1.20 – 192.168.1.30) ve alt ağ maskesi bilgileri girilir.
  3. Add Exclusions and Delay penceresinde, istemcilere kiralanmayacak IP aralıkları belirlenir.
  4. Lease Duration penceresinde kiralanan IP'lerin istemcilere kiralanma süresi belirlenir.
  5. Configuration DHCP Options penceresinden YES seçeneğiyle, Varsayılan ağ geçidi(Default Gateway) ve DNS bilgilerinin de otomatik ataması için gerekli adımlara yönlendirilir.
  6. Varsayılan ağ geçidi ve DNS bilgileri de belirlendikten sonra oluşturulan yeni scope' un aktif scope yapıp yapmayacağımız sorulur. Seçimimizi yeni scope oluşturmayı tamamlıyoruz.

Oluşturulan scope'un altında Address Pools, Address Leasses, Reservations, Scope Options ve Policies menüleri mevcuttur.


Reservations menüsünden bazı istemcilere daimi IP rezerve edilebilir. Örneğin bir ap yazıcının IP adresinin değişmesini istemiyorsanız bu seçeneği kullanarak veya statik IP ayarlama yöntemiyle yapabilirsiniz.

Son olarak Active Directory isminin ikonunu sağ tıklayarak DHCP Server veritabanını yedekleyebilir ve geri yükleyebilirsiniz.


DHCP Scope : DHCP Server tarafından istemcilere kiralanan IP aralığıdır.


Sistem konusunda hatırladığım kadarıyla ilk yazımdır. Umarım faydalı olur.


Kaynak : Windows Server 2012 R2 Sistem Uzmanlığı – Fahrettin ERDİNÇ

22 Ekim 2017 Pazar

AngularJS Framework Örnekleri - Yeni Başlayanlar için...

Merhaba arkadaşlar bu yazıda AngularJS yeni başlayan için basit ve aynı zamanda AngularJS temelini öğretecek 8 örnek hazırlayıp yayınladım. Örnekler tek html sayfasının içerisindedir. Controller scriptlerini de < script > tagı ile aynı sayfanın içine koydum. Dilerseniz sayfayı buradan indirebilirsiniz.
AngularJS JavaScript ile hazırlanmış bir client-side frameworktür. Mobile web siteleri hazırlamak için kullanabilir. Kullanıcıların istek ve cevapları hızlı sonuçlanır. Route sayesisinde sayfa geçişlerinde sürekli server ile iletişime geçmeye gerek yoktur. RESTful web servis ile çalışmak çok kolaydır.

1. AgullarJS çalıştı mı?

AngularJS uygulamaları HTML tagı içerisinde ng-app direktifi ile başlar. ng-app Direktifinin bulunduğu HTML tagın < /.. > kapatılması ile sonlanır.
AngularJS bağlantısı yapılmışsa ve çalışıyorsa { { 4+3 } } ifadesinin çıktısı 7 olacaktır.

   // Module tanımlanması.
   var app=angular.module("app",[]);
  
Çıktı:{{ 4+3 }}

2. Direktifler 1 - ng-model ve ng-bind

Bu örnekte ng-model="name" direktifi olan text içinde yazılan değeri ng-bind="name" direktifi olan span tagı içerisinde göstermektedir.
İsminizi Giriniz:
Merhaba

3. Direktifler 2 - ng-repeat ve ng-init

ng-repeat direktifi foreach mantığıya çalışır. Listelenen kayıt sayısı kadar tag tekrarlanır. Veriler ng-init direktifi içinde json formata yazılmıştır.
Şehir Tablosu
  • Şehir: {{ item.city }} Plaka Kodu: {{ item.plate }}

4. İfadeler

İfadeler { { ifadeler } } içiçe iki süslü parantez içinde yazılır.
Merhaba {{student.firstname + " " + student.lastname}}!
Kitabın Fiyatı : {{cost * quantity}} TL
Öğrenci No: {{student.rollno}}
Puan(Mat): {{marks[3]}}

5. Controller

MVC Direktif: ng-controller
AngularJS uygulamarının temelinde Controller vardır. Uygulamanın içindeki verilerin akışını Controller kontroler eder. ng-controller direktifi ile tanımlanır. Controller içinde özellikleri ve fonksiyonları barındıran JavaScript nesnesidir. Her Controller'ün bir $scope parametresi vardır.

  // FirstController
  app.controller('FirstController',['$scope', function FirstController($scope) {
   $scope.message="{ { message } } İlk Controller";
  }])
  
{{ message }}

6. Controller devam...

Örnek: Öğrenci Listesi

  // Student Controller
  app.controller('StudentController',['$scope', function StudentController($scope) {
   $scope.students=[
    {
     name:"Berken",
     no:101,
     lessons:['math:70','history:87']
    },
    {
     name:"Neslihan",
     no:102,
     lessons:['lineer:67','math:50','datastructer:47']  
    }
   ];
  }])
  
Öğrenci Numarası Dersler
{{ student.name }} {{ student.no }}
  • {{ lesson }}

7. Controller devam...

Örnek: Controller içinde metot tanımlanması
Aynı zamada ng-model ve ng-click direktiflerinin nasıl kullanıldığını gösteren bir örnek.

  // Cutomer Controller
  app.controller('CustomerController', ['$scope',
   function CustomerControler($scope) {
    $scope.customer={};
    $scope.customer.name = "Resul GÜNEŞ";
    $scope.customer.number = 44522;
    // scopa metot ekleme
    $scope.changeCustomer = function(){
    $scope.customer.name = $scope.cName;
    $scope.customer.number = $scope.cNumber;
   };
  }]);
  
Müşteri Adı: {{ customer.name }} Numara: {{ customer.number }}
Müşteri Adı:
Numarası:

8. Controller devam...

Örnek: Form Submit
ng-submit direktifinin nasıl kullanıldığını gösteren bir örnek.

  // AddCustomer Controller
  app.controller('AddCustomerController',['$scope','$location',
   function AddCustomerController($scope,$location){
    $scope.submit=function(){
     $location.path('/AddCustomer/'+$scope.cName+'/'+$scope.cNumber);
    };
  }]);
  
Müşteri Adı:
Numarası:

18 Ekim 2017 Çarşamba

Laravel Framework ile RESTful Web Servis Oluşturma ve C# ile RESTful Web Servisten Veri Çekme

Merhaba arkadaşlar bu yazımda; kullanıcıların yazılımlarımızın güncelliğini kontrol edebilmeleri için İnternet sitemizde çalışan bir Restful web service hazırladım ve yazılımda web service i çağırarak yazılım güncelliğini kontrol ettirdim.

Arkadaşlar Rest mimarisine fazla girmeyeceğim. Veri iletişimini HTTP protokolü ile yapar. HTTP metotlarını kullanır. Veri almak için GET, veri eklemek için POST, veri güncellemek için PUT ve veri silmek için DELETE  HTTP'nin metodunu kullanır. Yani requset ve response mantığına dayanır. Rest response(İstek cevabı) xml, json veya text   formatlarında olabilir. JSON formatının parse edilmesinin kolay olması ve veri boyutunun hafif olması nedeniyle bu uygulamada JSON formatı kullanılmıştır. JSON format web servislere yaygın olarak kullanılmaktadır.
Web servisi, uygulamalar veya sistemler arasında veri alışverişinde kullanılan açık protokol ve standartlara denir. Rest mimarisini kullanan servislere Restful service denilmektedir.

Restful servis oluştururken; veri çekme, veri ekleme, veri güncelleme ve veri silme metotları(GET, POST, PUT, DELETE) için bir yönlendirmeyle (route)  ve response üretecek bir fonksiyonun yazılmasıyla gerçekleşir. Arkadaşlar bu uygulamada sadece HTTP GET metodu kullanılmıştır. Diğer metotları get metodunu anladıktan sonra kolaylıkla oluşturabilirsiniz.

LARAVEL FRAMEWORK RESTful SERVİS OLUŞTURMA

1. Route Oluşturma: Rotanıza resource metodunu yazarsanız Laravel sizler için get, post, put ve delete rotları oluşturur. Yazılım güncelleme kontrolüm (MVC deki C) bir namespace içinde olduğu için ve belki ilerde başka fonksiyon ve web servisler yazarım diye aşağıda görüldüğü gibi rotayı Route grubu içine koydum.

 // Web Sevices Routes  
 Route::group(['prefix'=>'webservices','namespace'=>'webservices'],function()  
 {  
      Route::resource('softwareupdate', 'SoftwareUpdateController');  
 });  


Url'nin sonunda softwareupdate yazdığımızda bütün kayıtlar, softwareupdate/{id} yazdığımızda ise id yerine yazdığımız değer ile eşleşen kayıt döndürülecektir.

2. Controller Oluşturma: Laravel frameworkte controller oluşturmak için çalıştırdan cmd komutu ile  ms-dos konsolunu açın ve resindeki komutları uygulayın. Ben kontrolü webservices dizini altında oluşturdum sizler istediğiniz yerde oluşturabilirsiniz. Laravel framework kullanıyorsanız muhtemelen composer bilgisayarınıza kurmuşsunuzdur.



SoftwareUpdateCotroller kontrolün kodlarına gelince açıklamalarıyla birlikte aşağıdadır.

 // $softwares yazılımlarımızın dizisi  
      private $softwares;  
      public function __construct()  
      {  
           // Yazılımlarımızın dizisi oluştur  
        $this->softwares=[  
             'software'=>[  
                     [  
                       'id'=>'tiventisay',  
                       'description'=>'Tiventi Site ve Apartman Yonetimi',  
                       'version'=>'0.0.0.2',  
                       'update'=>'2017-10-16',  
                       'download'=>'http://www.tiventi.com/software/download/tiventi-site-ve-apartman-yonetimi'  
                     ],  
                  [  
                       'id'=>'tiventist',  
                       'description'=>'Tiventi Sinav Takibi',  
                       'version'=>'0.0.0.2',  
                       'update'=>'2017-10-16',  
                       'download'=>'http://www.tiventi.com/software/download/tiventi-sinav-takibi'  
                  ],  
                  [  
                       'id'=>'tiventites',  
                       'description'=>'Tiventi Teknik Servis',  
                       'version'=>'1.0.0.2',  
                       'update'=>'2017-10-16',  
                       'download'=>'http://www.tiventi.com/software/download/tiventi-teknik-servis'  
                  ]  
             ],  
             'error'=>'Bilgiler okunmadi!'  
        ];  
      }  
   // Bütün yazılımların listesi  
   public function index()  
   {  
        // Listeyi json formatta döndür.  
        return response()->json($this->softwares);  
   }  
   // Belirli bir yazılımın bilgisini alma  
   public function show($id)  
   {  
        $software;  
        // Dizide yazılımın bulunması  
        foreach ($this->softwares['software'] as $key => $value)   
        {  
             if($id==$value['id'])  
             {  
                  $software=$value;  
                  break;  
             }  
        }  
        // Bulunan yazılımı json formatta döndür.  
        return response()->json($software);  
   }  

 Aşağıdaki resimlerde de girdiğimiz url ye göre aldığımız JSON format response leri göreceksiniz.





Arkadaşlar iki adımda RESTful web servisini oluşturduk. Şimdi bu web servisini C# tarafından çağırıp bilgilerini okumaya geldi. Tahmin edeceğiniz gibi C# tarafında bir url ile yukarıdaki resimlerdeki JSON formatında veri ürettikten sonra JSON veriyi parse edip veriyi kullanmak kalıyor.

C# İLE RESTful Web Service Çağırmak

1. Windows Form Uygulaması Projesini Oluşturmak: Uygulamamız CheckSoftwareUpdate adında Windows Form Uygulaması olarak oluşturuldu. MainForm adında uygulama çalıştığında ilk gösterilecek form oluşturuldu. Daha sonra verinin Model sınıfının olduğu Software.cs adında bir dosya oluşturuldu. Son olarak JSON formatındaki verileri parse etmemizi sağlayan ve hızlandıran JSON.NET kütüphanesini referanslara ekledik. Kendinizde JSON verisini parse edebilirsiniz ama çok zahmetli bir iş ve verileriniz karmaşıklaştıkça içinden çıkmazsınız. C# tarafındaki dizin resmi aşağıdaki gibidir.


2. Veri Modelimiz: Bu modelin oluşturulması get yapılan verinin tutarlılığı ve diğer HTTP metotları için veri modeli avantaj sağlayacaktır. Model kodu aşağıdadır.



 using System;  
 using System.Collections.Generic;  
 namespace CheckSoftwareUpdate  
 {  
   public class Software  
   {  
     public string Id { get; set; }  
     public string description { get; set; }  
     public string version { get; set; }  
     public string update { get; set; }  
     public string download { get; set; }  
   }  
   public class Softwares  
   {  
     public List<Software> software { get; set; }  
     public string error { get; set; }  
   }  
 }  

3. Verinin Alınması ve Diğer İşlemler: C# RESTful web servis çağırmak daha doğrusu HTTP metotlarını işlemek için bir çok yöntem vardır. Hazır kütüphanelerde mevcut. Restsharp gibi. Ama .Net içinde olan HttpClient bu uygulama için yeterli ve hızlıdır. Kod ile birlikle açıklamalar mevcuttur. Son olarak form resmi eklenmiştir.

 using System.Windows.Forms;  
 using Newtonsoft.Json;  
 using System.Net.Http;  
 using System.Net.Http.Headers;  
 namespace CheckSoftwareUpdate  
 {  
   public partial class MainForm : Form  
   {  
     // Kurulu yazılımın sürüm bilgilerinin tutulacağı nesne; Gerçekte bu bilgi bir config dosyayından veya veritabanından alınmalıdır.  
     Software swk =new Software();  
     // Güncel yazılımın sürüm bilgilerinin tutulacağı nesne  
     Software sw;  
     // Bütün yazılımların tutulacağı nesne  
     Softwares sws;  
     public MainForm()  
     {  
       swk.Id = "tiventist";  
       swk.description = "Tiventi Sınav Takibi";  
       swk.version = "0.0.0.1";  
       swk.update = "2017-09-12";  
       InitializeComponent();  
     }  
     private void MainForm_Load(object sender, EventArgs e)  
     {  
       // Temel url  
       string url = "http://localhost/tiventi/public/webservices/softwareupdate";  
       // GET fonksiyonu bir yazılımın bilgilerini alacağı için id="tiventist" veya swk.id  
       string id = "tiventist";  
       // GET fonksiyonu sadece bir yazılımın bilgisini döndereceği için JSON dönüşümünü Software nesnesine atandı.  
       sw = JsonConvert.DeserializeObject<Software>(GET(url, id));  
       // Bilgilerin formda gösterilmesi  
       // Güncel yazılımın bilgileri  
       lbName.Text += sw.Id;  
       lbDescription.Text += sw.description;  
       lbVersion.Text += sw.version;  
       lbUpdate.Text += sw.update;  
       linkDownload.Text = sw.download;  
       // Kurulu yazılım bilgileri   
       lbDescription2.Text += swk.description;  
       lbVersion2.Text += swk.version;  
       lbUpdate2.Text += swk.update;  
       // Kurulu ve Güncel sürüm aynı mı?  
       if (swk.version == sw.update)  
       {  
         btnUpdate.Enabled = false;  
         lbStatus.Text = "Yazılım güncel.";  
       }  
       else  
       {  
         lbStatus.Text = "Yazılım güncel değil!";  
         btnUpdate.Enabled = true;  
       }  
       // Bütün yazılımların listesi  
       sws = JsonConvert.DeserializeObject<Softwares>(GET(url));  
       Console.WriteLine(sws.software.Count);  
       //MessageBox.Show(sws.software.ToList().Count.ToString());  
       foreach (var item in sws.software)  
       {  
         lbSoftwares.Items.Add(item.description);  
       }  
     }  
     // GET Metodu --> string türünden JSON verisi döndürür. HttpClient  
     public string GET(string url, string id = "")  
     {  
       // Yazılımlardan birini veya hepsini alma seçeneği  
       if (id != "")  
         url = url +"/"+ id;  
       using (var httpClient = new HttpClient())  
       {  
         // JSON formata olacağını belirlemek  
         httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
         HttpResponseMessage response = httpClient.GetAsync(new Uri(url)).Result;  
         if (response.IsSuccessStatusCode)  
         {  
           return response.Content.ReadAsStringAsync().Result;  
         }  
         else  
           return string.Empty;  
       }  
     }  
     // Kurulu ve güncel sürümleri karşılaştırıp eşit değilse kullanıcı indirme bağlantısını açabilsin.  
     private void btnUpdate_Click(object sender, EventArgs e)  
     {  
       // İndirme bağlantısına gidilicek ve yazılım indirilecektir.  
     }  
   }  


Umarım yardımcı olacaktır. Uzun bir aradan sonra bir şeyler paylaşmak güzeldi.