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";
}
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
Server
Manager'ı aç Add roles and features tıklayınız.
Before
you begin pencereside, rol ve özellik kurulumu hakkında
bilgiler içermektedir Next tıklayınız.
Selection
installation type penceresinde, role-based or feature-based
installation seçeneğini işaretleyerek Next tıklayınız.
Selection
Destination Server penceresinde, DHCP Server'ün kurulacağı
server seçilip, Next tıklayınız.
Server
Select Roles penceresinde, DHCP Server seçip Next
tıklayınız.
Features
penceresinde seçeceğiniz özellik olmadığından direkt Next
tıklayıp devam ediniz.
DHCP
Server penceresinde, bir kaç uyarı ve bilgi bulunmaktadır
Next deyip devam ediniz.
Configuration
penceresinde Restart kutusnu işaretleyerek install
tıklayarak kurulumu başlatın ve kurulum bitince close
tıklayınız.
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.
Scope
adı ve açıklaması bilgileri girilir.
IP
aralığı (örnek 192.168.1.20 – 192.168.1.30) ve alt ağ maskesi
bilgileri girilir.
Add
Exclusions and Delay penceresinde, istemcilere kiralanmayacak IP
aralıkları belirlenir.
Lease
Duration penceresinde kiralanan IP'lerin istemcilere kiralanma
süresi belirlenir.
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.
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Ç
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.
İ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";
}])
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.