12 Mart 2020 Perşembe
C# Dersleri 4 - Veri Tipleri : Byte Veri Tipi
Byte Veri Tipi:
Byte(byte) tam sayıları tuttuğumuz 8 bitlik veri depolayan bir değer tipidir.
Byte veri tipi 0 ile 255 arasında ki değerleri alabilir. Görüldüğü üzere eksi (negatif) bir tam sayı değeri alamaz.
Örnek Uygulama:
Byte veri tipi 0 ile 255 arasında ki değerleri alabilir. Görüldüğü üzere eksi (negatif) bir tam sayı değeri alamaz.
Örnek Uygulama:
Örnek Çıktı:
Ilk Sayi: 5
Ilk Sayi: 8
Max Sayi: 255
Min Sayi: 0
Ilk Sayi: 8
Max Sayi: 255
Min Sayi: 0
Github Adresi : https://github.com/emrakin/CSharpDersleri
Tüm Derslerin Listesi için Tıkla
C# Dersleri 3 - Veri Tipleri : Short Veri Tipi
Short Veri Tipi:
Short(short) tam sayıları tuttuğumuz 16 bitlik veri depolayan bir değer tipidir.
Integer ve Long veri tiplerine göre bellekte daha az yer kaplarlar ve değer aralıkları da daha küçüktür. Short veri tipi -32768 ile 32767 arasında ki değerleri alabilir.
short ilknumara = 10;
Örnek Uygulama:
Örnek Çıktı:
Ilk Sayi: 10
Ilk Sayi: -15
Max Sayi: 32767
Min Sayi: -32768
Ilk Sayi: -15
Max Sayi: 32767
Min Sayi: -32768
Github Adresi : https://github.com/emrakin/CSharpDersleri
Tüm Derslerin Listesi için Tıkla
11 Mart 2020 Çarşamba
C# Dersleri 2 - Veri Tipleri : Long Veri Tipi
Long Veri Tipi:
Bir önce ki yazı da Integer Veri Tipini öğrendik ve -2147483648 ile 2147483647 arasında değer alabileceğini belirttik. Peki kullanmak istediğim değer bu sayı değerlerinin arasında yer almıyorsa ne yapmalıyız?
Bu tarz durumlarda integer veri tipinden daha büyük aralığa sahip"long" veri tipini kullanabiliriz. Long veri tipi integer veri tipinin aldığı her değeri alabilir.
long ilknumara = 2147483647 ;Burada aklınıza şu soru gelebilir. Madem long veri tipi integer veri tipinin aldığı tüm değerleri ve daha fazlasını alabiliyor o zaman neden integer kullanayım her değişkeni long tanımlarım.
Long veri tipi 64 bitlik veri depolamasından dolayı bellek üzerinde kapladığı alan integer veri tipinden büyüktür. Bu bakımdan zorunlu kalınmadıkça (integer ihtiyacımızı karşılıyorsa) long veri tipini kullanmak bellek üzerinde fazladan bir alan kaybına neden olacaktır.
Bellekte ayrılan alanın, tuttuğumuz değerle bir alakası yoktur, değer tipimizle bir alakası vardır. Bu bakımdan long veri tipinde değeri 15 olan bir değişkeni tutmak istediğimizde kullandığımız bellek alanı ile int veri tipinde değeri 15 olan bir değişkeni tutmak istediğimizde kullandığımız bellek alanı arasında fark vardır.
Bu bakımdan integer ihtiyacımızı karşılıyor iken long veri tipini tutmamızın bir anlamı yoktur.
Örnek Uygulama:
static void Main(string[] args)
{
long ilknumara = 92233720368547;
long ikincinumara = -92233720368547;
Console.WriteLine("İlk Sayı: {0}", ilknumara);
Console.WriteLine("İkinci Sayı: {0}", ikincinumara);
Console.ReadLine();
}
{
long ilknumara = 92233720368547;
long ikincinumara = -92233720368547;
Console.WriteLine("İlk Sayı: {0}", ilknumara);
Console.WriteLine("İkinci Sayı: {0}", ikincinumara);
Console.ReadLine();
}
Uygulama Çıktısı:
Ilk Sayi: 92233720368547
Ikinci Sayi: -92233720368547
Ikinci Sayi: -92233720368547
Long veri tipinin değer aralığı –9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasındadır.
Örnek Uygulama:
static void Main(string[] args)
{
long ilknumara = 92233720368547;
long ikincinumara = -92233720368547;
long maxdeger = 9223372036854775807;
long mindeger = -9223372036854775808;
Console.WriteLine("İlk Sayı: {0}", ilknumara);
Console.WriteLine("İkinci Sayı: {0}", ikincinumara);
Console.WriteLine("Max Sayı: {0}",maxdeger);
Console.WriteLine("Min Sayı: {0}",mindeger);
Console.ReadLine();
}
{
long ilknumara = 92233720368547;
long ikincinumara = -92233720368547;
long maxdeger = 9223372036854775807;
long mindeger = -9223372036854775808;
Console.WriteLine("İlk Sayı: {0}", ilknumara);
Console.WriteLine("İkinci Sayı: {0}", ikincinumara);
Console.WriteLine("Max Sayı: {0}",maxdeger);
Console.WriteLine("Min Sayı: {0}",mindeger);
Console.ReadLine();
}
Uygulama Çıktısı:
Ilk Sayi: 92233720368547
Ikinci Sayi: -92233720368547
Max Sayı: 9223372036854775807
Min Sayı: -9223372036854775808
Ikinci Sayi: -92233720368547
Max Sayı: 9223372036854775807
Min Sayı: -9223372036854775808
Github Adresi : https://github.com/emrakin/CSharpDersleri
Tüm Derslerin Listesi için Tıkla
C# Dersleri 1 - Veri Tipleri : Integer Veri Tipi
Değer ve Referans Tipleri
C# dilinde iki tür veri tipi mevcuttur.Bunlar değer ve referans tipleridir. Değer tipleri; veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türleridir. Referans türleri ise, bellek bölgesinde veri yerine verinin bellekteki adresini tutarlar ve o adresin gösterdiği yerde de veri tutulur.
Değer tipleri: "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum"
Referans tipleri: "string", "object", "class", "interface", "array", "delegate", "pointer"
Integer Veri Tipi:
Integer (int) tam sayıları tuttuğumuz 32 bitlik veri depolayan bir değer tipidir (Value Type). Integer bir veri tipini tanımlamak için int keyword ünden faydalanırız.
Eğer veri tipi integer ve değeri 15 olan bir değişken tanımlamak istersek.
int ilknumara = 15;bura da "int" veri tipini, ilknumara değişkeni, 15 ise değeri ifade eder.
static void Main(string[] args)
{
int ilknumara = 10;
Console.WriteLine(ilknumara);
Console.ReadLine();
}
{
int ilknumara = 10;
Console.WriteLine(ilknumara);
Console.ReadLine();
}
Burada kodu çalıştırdığımızda konsol ekranına "10" yazacaktır.
static void Main(string[] args)
{
int ilknumara = 10;
Console.WriteLine("İlk Sayı: {0}",ilknumara);
Console.ReadLine();
}
{
int ilknumara = 10;
Console.WriteLine("İlk Sayı: {0}",ilknumara);
Console.ReadLine();
}
Kodumuzu bu şekilde yazdığımız da ise konsol ekranında "İlk Sayı: 10" yazacaktır. Burada küme parantezi içine yazdığımız "0" virgülde sonra ki ilk değerdir. Bu olaya index denir ve çoğu programlama dilinde index sıfırdan başlar.
Bu örnekler projenin github reposunda yer almaktadır.
Integer ile ilgili sınırlara gelecek olursak mesela aşağıda ki kodu şu şekilde değiştirsek;
static void Main(string[] args)
{
int ilknumara = 10;
int ikincinumara = -10;
Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
Console.ReadLine();
}
{
int ilknumara = 10;
int ikincinumara = -10;
Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
Console.ReadLine();
}
ve programı çalıştırırsak konsol ekranına 10 ve -10 değerlerini yazacaktır. Demek ki integer veri tipi eksi değerde alabilmektedir.
Bunun yanında bütün veri tiplerinin bir sınırı vardır. Integer veri tipinin sınırı -2147483648 ile 2147483647 arasındadır.
static void Main(string[] args)
{
int ilknumara = 10;
int ikincinumara = -10;
Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
int maxnumara = 2147483647;
int minnumara = -2147483648;
Console.WriteLine("Max Sayı: {0} - Min Sayı: {1}", maxnumara, minnumara);
Console.ReadLine();
}
{
int ilknumara = 10;
int ikincinumara = -10;
Console.WriteLine("İlk Sayı: {0} - İkinci Sayı: {1}",ilknumara,ikincinumara);
int maxnumara = 2147483647;
int minnumara = -2147483648;
Console.WriteLine("Max Sayı: {0} - Min Sayı: {1}", maxnumara, minnumara);
Console.ReadLine();
}
Github Adresi : https://github.com/emrakin/CSharpDersleri
Tüm Derslerin Listesi için Tıkla
14 Haziran 2019 Cuma
Thread ve Multithreading Nedir?
Hepinizin bildiği üzere işletim sistemlerinde uygulamaların çalışmasını sağlayan process(işlem)ler vardır. Bunlar uygulamaları izole ederek çalışan diğer uygulamalarla beraber birbirlerinin verilerini bozmamasını sağlayarak her uygulamalanın kendi memori adreslerinde çalışmasını sağlarlar. Bu uygulamaların CPU ya bakan tarafına geldiğimizde ise bunun için ayrı bir kavram devreye giriyor ve bu kavrama da Thread diyoruz.
Thread ler dillerin kendi yapılarından gelen bir şey değil, işletim sistemlerinin yapısından gelen bir durumdur. İşletim sistemlerinin birden fazla uygulamayı aynı anda çalıştırabilmek için geliştirilmiş bir yaklaşımdır. Thread mantığı olmasaydı aynı anda birden çok uygulama yada program kullanılamaz olur ve diğer uygulama yada program kullanabilmek için mevcut çalışanı sonlandırmamız gerekirdi. Umarım bu kısa giriş Thread kavramını anlayabilmek için yeterli olmuştur.
Not: Anlatım ve örnekleri C# üzerinden gerçekleştiriyorum fakat genel olarak diğer dillerde de mantık hemen hemen aynıdır. Önemli olan meseleyi anlamak
Thread Priority
Bazı durumlarda bir Thread’e öncelik vermek isteyebiliriz. Bu durumda öncelikli işlemyapmasını istediğimiz Thread’e Thread.Priority özelliğini vermeliyiz.
Thread a = new Thread(()=>{
Console.WriteLine("İkinci Thread");
});
Thread b = new Thread(()=>{
Console.WriteLine("Birinci Thread");
});
b.Priority = ThreadPriority.Normal;
a.Start();
b.Start();
Thread.Sleep
Başlatılacak Thread işleminin uygulama çalıştırıldıktan belli bir zaman sonra çalışmasını istiyorsan Thread.Sleep özelliğini kullanabiliriz.
Mesela uygulama çalıştıktan 2sn sonra çalışmasını istediğimiz bir Thread için Thread.Sleep(2000); şeklinde bir komut vermeliyiz.
Thread a = new Thread(()=>{
Thread.Sleep(2000);
Console.WriteLine("İkinci");
});
a.Start();
Thread.Join
Birbirini beklemesi gerek Thread işlemlerinde
Thread.Join kullanılır. Böylece bir önceki iş bitmeden diğer işleme geçiş
yapılması engellenir. Aşağıda ki örnekte a işlemi 2sn sonra başlatılıyor ve bu
işlem bitmeden b işlemine geçilmiyor.
Thread a = new
Thread(()=>{
Thread.Sleep(2000);
Console.WriteLine("ilk
işlem");
});
Thread b = new
Thread(()=>{
Console.WriteLine("Bekletilen
işlem");
});
a.Start();
a.Join();
b.Start();
Şimdilik bu kadar. Thread konusuna devam etmeyi ve
özellikle Thread Locks ve ThreadPools kavramları üzerinde durduğum bir yazı yasmak
istiyorum. Umarım burada ki bilgiler işinize yaramıştır.
22 Mayıs 2019 Çarşamba
C# Erişim Belirleyiciler (Access Modifiers)
PrivateBir nesne private olarak tanımlandığında sadece kendi kod bloğu içerisinden çağrılabilir. Güvenlik nedeniyle dışarıya kesinlikle açmamamız gereken nesnelerde kullanılır.
Public
Bir nesne public olarak tanımlandığında hiç bir kısıtlaması olmaz. Yani hem kendi kod bloğu üzerinden hem de dışarıdan hatta farklı projeler üzerinden dahi çağrılabilir.
Internal
Kendi projesi içerisinde public, farklı bir projeden/dışarıdan çağırılmak istenildiğinde ise private özelliklerini taşır. Yani aynı Assembly (dll) üzerinde istediğiniz şekilde kullanabilirsiniz ancak dışarıdan (farklı bir projeden) çağramayız.
Protected
Bir nesne protected olarak tanımlandığında yalnızca bulunduğu class üzerinde ve bu class ı miras alan (bu class’tan türetilmiş) classlar üzerinden çağrılabilir.
Proteced Internal
Bir nesne protected internal olarak tanımlandığında aynı protected gibi kendi bulunduğu class üzerinde ve bu class ı miras alan classlar üzerinden çağrılabilir. Artı olarak aynı proje (assembly/dll) üzerinde olmasalar dahi, tanımlandığı class’tan türetilmiş diğer class’ların içinden de çağrılabilirler.
Özel bir durum olmadıkça varsayılan olarak değişkenler ve methodlar private, classlar ise internal dır.
30 Nisan 2019 Salı
.Net Core Uygulamasında Redis Cache Kullanımı
Bu yazıda Docker üzerinde bir Redis Container'ı koşturup, artından bir .Net Core Mvc projesinde nasıl kullanılacağını inceleyeceğiz. Redis (distributed cahce)' de amaç, bir web sayfası yada bir web API' dan gelen istekler olduğunda her seferinde servise ya da DB'ye gitmektense bu istekleri In Memory olarak yani ram'den karşılanması ve bu sayede performansın arttırılmasıdır.
Yazının tamamında kullanılacak teknolojiler;
- Docker
- Redis
- .Net Core
Öncelikle eğer makinamızda Docker yok ise https://www.emrakin.com/2019/04/docker-nedir-neden-kullanlr-nasl.html bu adresten Docker kurulumu hakkında bilgi edinebilirsiniz.
Docker üzerinde bir Redis Container koştumak için aşağıdaki kodu kullanalar "6379" portundan ayağa kalkması sağlanır.
docker run -d --name Redis -p 6379:6379 redis
Ben .Net Core Mvc projesinde Redis için ServiceStack kullandım. İlgili kütüphaneyi https://www.nuget.org/packages/ServiceStack.Redis.Core bu linkten inceleyebilir ve Nuget ile projenize ekleyebilirsiniz.
PM> Install-Package ServiceStack.Redis.Core
Redis'in .Net Core projesinde kullanımı için Startup.cs'de AddDistributedRedisCache() methodu ile redisserver'ın IP ve Portu'nu tanımlıyoruz.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
AddDistributedRedisCache() methodunu Startup.cs' de kullanmak için Microsoft.Extensions.Caching.Redis'i Nugetten projenize dahil etmeniz gerekiyor.
PM> Install-Package Microsoft.Extensions.Caching.Redis
Models: Models klasörü altında Person.cs adında bir sınıf oluşturuyoruz.
public class Personal
{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
Projemize RedisRepository adında bir klasör ekliyoruz. Bu klasör altında Redis'le ilgili işlemlerimizi bir interface yapı da tutacağız. RedisRepository klasörünün altında IRedisService adında bir interface oluşturuyoruz.{
public int ID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
public interface IRedisService
{
List<Person> GetAll(string cachekey);
Person GetById(string cachekey);
}
{
List<Person> GetAll(string cachekey);
Person GetById(string cachekey);
}
RedisRepository klasörü altına IRedisService.cs den inheritance olmuş RedisManager.cs adında bir sınıf oluşturuyoruz.
public class RedisManager : IRedisService
{
public List<Person> GetAll(string cachekey)
{
using (IRedisClient client = new RedisClient())
{
List<Person> dataList = new List<Person>();
List<string> allKeys = client.SearchKeys(cachekey);
foreach (string key in allKeys)
{
dataList.Add(client.Get<Person>(key));
}
return dataList;
}
}
public Person GetById(int personId, string cachekey)
{
using (IRedisClient client = new RedisClient())
{
var redisdata = client.Get<Person>(cachekey);
return redisdata;
}
}
}
{
public List<Person> GetAll(string cachekey)
{
using (IRedisClient client = new RedisClient())
{
List<Person> dataList = new List<Person>();
List<string> allKeys = client.SearchKeys(cachekey);
foreach (string key in allKeys)
{
dataList.Add(client.Get<Person>(key));
}
return dataList;
}
}
public Person GetById(int personId, string cachekey)
{
using (IRedisClient client = new RedisClient())
{
var redisdata = client.Get<Person>(cachekey);
return redisdata;
}
}
}
IRedisServise ve RedisManager'ı Startup.cs'e dahil etmemiz gerekiyor.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<IRedisService, RedisManager>();
}
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedRedisCache(options =>
{
options.InstanceName = "RedisNetCoreSample";
options.Configuration = "localhost:6379"; //Your Redis Connection
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddScoped<IRedisService, RedisManager>();
}
HomeController.cs/HomeController(): Öncelikle person sınıfı tipinde yeni bir kayıt oluşturup Redis cache'e atıyoruz.
- "cachedata.SetValue("Person"+personvalue.ID, personvalue);": Redis'de "Person+ID" key'ine karşılık value değeri olarak oluşturulan dataByte[] dizisi SetValue() methodu ile atıyoruz.
private readonly IRedisService _redisService;
public HomeController(IRedisService redisService)
{
_redisService = redisService;
using (IRedisClient client = new RedisClient())
{
if (client.SearchKeys("Person*").Count == 0)
{
var personvalue = new Person();
personvalue.ID = 1;
personvalue.Name = "Emrah";
personvalue.Surname = "Akın";
personvalue.Age = 40;
var cachedata = client.As<Person>();
cachedata.SetValue("Person"+personvalue.ID, personvalue);
}
}
}
public HomeController(IRedisService redisService)
{
_redisService = redisService;
using (IRedisClient client = new RedisClient())
{
if (client.SearchKeys("Person*").Count == 0)
{
var personvalue = new Person();
personvalue.ID = 1;
personvalue.Name = "Emrah";
personvalue.Surname = "Akın";
personvalue.Age = 40;
var cachedata = client.As<Person>();
cachedata.SetValue("Person"+personvalue.ID, personvalue);
}
}
}
HomController.cs/Index: Redis'e "Person" key'i ile atılan tüm verileri getirmek için "Person*" ile çağırıyoruz.
public IActionResult Index()
{
const string cacheKey = "Person*";
var redisdata = _redisService.GetAll(cacheKey);
return View(redisdata);
}
{
const string cacheKey = "Person*";
var redisdata = _redisService.GetAll(cacheKey);
return View(redisdata);
}
Index.cshtml: View modelden gelenleri ekrana yansıtıyoruz
@model IEnumerable<NetCoreRedis.Models.Person>
@{
ViewData["Title"] = "Index";
}
<table class="table">
<thead>
<tr>
<th>
ID
</th>
<th>
Name
</th>
<th>
SurName
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Surname)
</td>
<td>
@Html.ActionLink("Details", "Home", new { id = item.ID }) |
</td>
</tr>
}
</tbody>
</table>
HomeController.cs/Detail: @{
ViewData["Title"] = "Index";
}
<table class="table">
<thead>
<tr>
<th>
ID
</th>
<th>
Name
</th>
<th>
SurName
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Surname)
</td>
<td>
@Html.ActionLink("Details", "Home", new { id = item.ID }) |
</td>
</tr>
}
</tbody>
</table>
public IActionResult Detail(int Id)
{
string cacheKey = "Person"+Id;
var redisdata = _redisService.GetById(cacheKey);
return View(redisdata);
}
{
string cacheKey = "Person"+Id;
var redisdata = _redisService.GetById(cacheKey);
return View(redisdata);
}
Detail.cshtml:
@model NetCoreRedis.Models.Person
@{
ViewData["Title"] = "Detail";
}
<h3><b>Person:</b></h3>
<table class="table">
<tr>
<td>Ad:</td>
<td>@Model.Name</td>
</tr>
<tr>
<td>Soyad:</td>
<td>@Model.Surname</td>
</tr>
<tr>
<td>Yaş:</td>
<td>@Model.Age</td>
</tr>
</table>
@{
ViewData["Title"] = "Detail";
}
<h3><b>Person:</b></h3>
<table class="table">
<tr>
<td>Ad:</td>
<td>@Model.Name</td>
</tr>
<tr>
<td>Soyad:</td>
<td>@Model.Surname</td>
</tr>
<tr>
<td>Yaş:</td>
<td>@Model.Age</td>
</tr>
</table>
Docker container olarak ayaklandırdığımız Redis cache üzerinden key value'larımızı görmek için terminal ekranına aşağıdaki kodu yazdıktan sonra "Keys *" komunu kullanabilirsiniz.
docker exec -it Redis redis-cli
Projenin bitmiş haline https://github.com/emrakin/.NetCore-Redis buradan ulaşabilirsiniz.
İlgili Kaynaklar:
22 Nisan 2019 Pazartesi
Docker Nedir, Neden Kullanılır, Nasıl Kurulur, Nasıl Kullanılır?(Wordpress Kurulumu)
Kısa tanımıyla Docker; geliştirdiğiniz uygulamaları platform bağımsız bir şekilde kullanabilmenizi sağlayan "container" teknolojisidir.
Docker' ı anlayabilmek için öncelikle virtualization teknolojilerini anlamak gerektiğine inanıyorum.
Virtualization teknolojilerisinin ne olduğunu derinlemesine anlatmak yerine en kısa en basit anlatımıyla virtualization bir işletim sisteminin içerisine birden fazla işletim sistemini kurabilmektir. Yani bir Windows içerisine bir Windows daha kurmak ya da bir MacOs veya Linux kurabilmek gibi kısa, basit ama olayı anlatan bir tanımla başlamış olalım.
Peki bunu neden kullanmak isteriz?
Elinizde bir tane bilgisayar var diyelim ve bunu birden fazla kişinin kullanmasını istiyorsunuz. Her kullanıcının istediği programları kurmasını, kendi işlerini yapmalarını ve bütün bunlar olurken de birbirleriyle çakışmayacak şekilde tamamen izole edilmiş ortamlar oluşturmak istiyorsunuz.Daha sonra herhangi bir kişinin artık bu ortamı kullanmasını istemediğinizde sadece ona ayırdığınız izole edilmiş ortamı silerek bu kişi için kurduğunuz işletim sisteminin ve programların diğer kullanıcılar etkilemeden ortamdan kaldırılmasını istiyorsunuz. İşte bu isteklerinizi yapabildiğiniz teknolojin adı Virtualization Teknolojisi.
Docker'ı neden kullanmak isteriz?
Yine bir örnek üzerinden gitmemiz gerekirse bir .Net Core API projesinde datalarınızı Redis üzerinden okuyup yazdırsak daha mı iyi olur sorusuna cevap arıyorsunuz. Bunun için önce Redis'i kurmanız ve ayaklandırmamız gerekir. Peki aradığınız teknoloji Redis değilse? O zaman ya kurduğunuz Redis'i bilgisayarınızda bırakıp başka bir şeyler arayacaksınız yada Redis'i bilgisayarınızdan kaldırmaya çalışacaksınız yada bunların hiç birini yapmayıp Docker için hazırlanmış bir Redis imageını makinenizde çalıştıracak ve testlerinizi gerçekleştirdikten sonra oluşturmuş olduğunuz Docker Container'ı silip hayatınıza kaldığınız yerden devam edeceksiniz.
Docker tarihçesi ve daha detaylı bilgi için Gökhan Şengün tarafından yazılan şu yazıyı okuyabilirsiniz.
Docker'ın en temel mantığı "benim bilgisayarımda çalışan her bilgisayarda çalışır." dır.
Docker Nasıl Kurulur?
İşletim sisteminiz MacOs ise aşağıdaki linkten kurulumu yapabilirsiniz.
https://docs.docker.com/docker-for-mac/install/
İşletim sisteminiz Linux ise aşağıdaki linkten sol tarafta ki menüden kendi Linux'ınıza uygun kurulumu yapabilirsiniz.
https://docs.docker.com/install/
İşletim sisteminiz Hyper-V içeriyorsa. (Windows Pro, Enterprise vb) Aşağıdaki linkten indirip kurulumu yapabilirsiniz.
https://docs.docker.com/docker-for-windows/install/
Eğer işletim sisteminiz Windows 10'sa Docker toolbox ile kurulumu yapabilirsiniz.
https://docs.docker.com/toolbox/toolbox_install_windows/
NOT: Kurulum sonrası Docker Quickstart Terminal'i açın. Bunun öncesinde BIOS' dan VIRTUALIZATION ayarlarını Enable yapmayı unutmayın.
https://www.youtube.com/watch?v=za5eAnVVWfs
Artık kurulumu tamamladığımıza göre Docker-CLI üzerinde çalışmaya başlayabiliriz.
Docker CLI
Ben komutları Windows üzerinde çalıştırıp çıktıları sizinle paylaşacağım ancak bütün komutlar Mac OS X ve Linux sistemlerde de aynen çalışacaktır sadece çıktılar farklı olabilir.
İşletim sistemimizin terminalini açıp komutları yazmaya başlayabiliriz.
1. Öncelikle Docker kurulumumuzun doğru çalışıp çalışmadığını kontrol etmek için docker version komutunu yazalım.
C:\Users\xxx>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
Dikkat ederseniz Client (Docker CLI) kısmında windows/amd64 olan Os/Arch tipi Server (Docker Daemon) kısmında linux/amd64 olarak görünüyor. Bunun nedeni Daemon Windows içinde ki Hypervisor tarafından çalıştırılan bir Linux makinede koşuyor.
2. Artık Docker kurulumumuzun başarılı olduğunu biliyoruz o zaman DockerHub'dan ilk Docker Image'ımızı inidirip çalıştıralım.
Benim amacım Windows bir makinede Wordpress'i kurmak. Şuan benim bilgisayarımda Wordpress için gerekli hiç bir şey kurulu değil. (MySQL, Apache Server vb.).
Öncelikle bize bir MySQL birde Wordpress Image'ı gerekli.
Wordpress image: https://hub.docker.com/_/wordpress
MySQL Image: https://hub.docker.com/_/mysql
Image dosyalarını nasıl indireceğimiz ve nasıl kullanacağımız hakkında detaylı bilgiler ilgili linklerde mevcut ben sadece temel olarak bir örneklendirme yapacağım ayrıntıya girmek isteyenler ilgili linklerde ki anlatımları takip edebilirler.
docker pull mysql pull komutu ile ilgili mySQL Docker Image'ını indiriyoruz.
C:\Users\xxx>docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
27833a3ba0a5: Already exists
864c283b3c4b: Pull complete
cea281b2278b: Pull complete
8f856c14f5af: Pull complete
9c4f38c23b6f: Pull complete
1b810e1751b3: Pull complete
5479aaef3d30: Pull complete
ded8fa2e1614: Pull complete
636033ba4d2e: Pull complete
902e6010661d: Pull complete
dbe44d2bf055: Pull complete
e906385f419d: Pull complete
Digest: sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Status: Downloaded newer image for mysql:latest
Using default tag: latest
latest: Pulling from library/mysql
27833a3ba0a5: Already exists
864c283b3c4b: Pull complete
cea281b2278b: Pull complete
8f856c14f5af: Pull complete
9c4f38c23b6f: Pull complete
1b810e1751b3: Pull complete
5479aaef3d30: Pull complete
ded8fa2e1614: Pull complete
636033ba4d2e: Pull complete
902e6010661d: Pull complete
dbe44d2bf055: Pull complete
e906385f419d: Pull complete
Digest: sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Status: Downloaded newer image for mysql:latest
docker pull wordperss ile WordPress Docker Image'ını indiriyoruz.
docker images komutu ile indirdiğimiz ve kullanıma hazır Docker Image' larımızı görebilirsiniz.
Şimdi sıra geldi mySQL ve WordPress Image'larını çalıştırmaya.
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=Password1234 -d mysql --default-authentication-plugin=mysql_native_password
Bu komut ile MySQL'i çalıştırıyoruz.
docker run --name wordpress01 --link mysql01 -p 8080:80 -e WORDPRESS_DB_HOST=mysql01:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=Password1234 -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_TABLE_PREFIX=wp_ -d wordpress
Bu komut ile Wordpress'i çalıştırıyoruz.
MySQL ve Wordpress Container'larımızı çalıştırdıktan sonra docker ps komutu ile çalışan Container'larımıza göz atalım.
Bu komut ile Wordpress'i çalıştırıyoruz.
MySQL ve Wordpress Container'larımızı çalıştırdıktan sonra docker ps komutu ile çalışan Container'larımıza göz atalım.
72818047f6f4 wordpress ... 0.0.0.0:8080->80/tcp wordpress01
f3193821ad7b mysql ... 306/tcp, 33060/tcp mysql01
f3193821ad7b mysql ... 306/tcp, 33060/tcp mysql01
Görüldüğü gibi iki Container da çalışıyor. Kullandığımızdan browserdan http:localhos:8080 adresini yazarak wordpress sitemizi kurmaya başlayabiliriz.
Kaynaklar:
https://medium.com/5bayt/windows-10-home-docker-kurulumu-7bc71475558
https://gokhansengun.com/docker-nedir-nasil-calisir-nerede-kullanilir/
https://www.youtube.com/watch?v=g_Q7TDsrwgo&list=PL_Z0TaFYSF3LTfMIRjPUlVoUipQA0JlL2&index=8
21 Eylül 2018 Cuma
.Net Core File Upload
.Net Core kullanarak dosyaları karşıya yüklemenin bir çok yolu vardır.Benim şimdiye kadar kullandığım en basit yol aşağıda bahsettiğim şekilde. Daha basit bir yol bulursam bu kodu güncelleyeceğim.
view (cshtml) :
<form method="post" asp-action="Upload" asp-controller="Home" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="upload"/>
</form>
controller(cs) :
Eğer Dosyayı uygulamınızda bir dizine yüklemek istiyorsanız, webroot yolunu almak için IHostingEnvironment'i kullanmalısınız.
public class HomeController : Controller
{
private readonly IHostingEnvironment _environment;
public HomeController(IHostingEnvironment environment) {_environment = environment; }
public IActionResult Upload()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Create(IFormFile Getfile)
{
string fileName = Guid.NewGuid().ToString();
if (Getfile != null)
{
var Upload = Path.Combine(_environment.WebRootPath, "Dosya Yolu",fileName);
Getfile.CopyTo(new FileStream(Upload, FileMode.Create));
}
return View();
}
}
Umarım faydalı olmuştur...
19 Temmuz 2018 Perşembe
Twilio SMS Mesajlarını E-Posta Olarak İletme (Forwarding SMS Messages to your Email Inbox)
Twilio, gelen sms mesajlarını bir mail adresine iletmenize izin veriyor. Ben örneğimde .NET Core kullandım ve örneklemeyi de .NET Core üzerinden yapacağım.
Senaryoya göre Twilio gelen Sms mesajını Webhook aracılığı ile bizim sunucumuza gönderiyor, bizde gelen Reguestler ile dilediğimiz işlemi yapıyoruz.
Webhook Nedir?
Webhook özetle HTTP callbacks'dir. Yani Web API'leri ve SaaS hizmetlerini bir arada sunan bir HTTP patterndir. Webhook çoğu yönü ile websocket'lere benzerlik gösterir. En önemli farkı ise websocket browser ile haberleşirken, webhook diğer bir uygulama sunucu (Twilio) ile haberleşir.
.NET Core Projesi ve Webhook
Örnek senaryomuzda Twilio bir Sms mesajı aldığında sunucumuz ile iletişime geçecek ve gelen mesajda ki bilgileri bize gönderecektir. Biz burada Sms üzerinden örnekleme yapacağız. Bu örnekleri Voice, Chat, Video ve diğer Twilio API'leri için de uygulayabilirsiniz.
Bir Proje Oluşturalım
Twilio'dan gelen istekleri işleyebilecek bir ASP.NET Core projesi oluşturalım. Eğer siz .NET Core yerine ASP.NET MVC üzerinden gidecekseniz MVC projesi oluşturun. Aralarında tek bir fark var ona da aşağıda değineceğim.
Ben projeye "TwilioSms" adını verdim siz istediğiniz ismi verebilirsiniz.
Eğer .NET Core kullanacaksanız ASP.NET Core 2.0 ın yüklü ve seçili olduğundan emin olun.
NuGET Packages
Projemize NuGet Paket aracılığı ile 2 tane paket yüklememiz gerekiyor. Bu yüklemeleri "Package Manager Console" yi kullanarak hızlı bir şekilde yapabiliriz.
PM> Install-Package Twilio
İkinci Paketimiz ise
- .NET Core kullanacaksanız Twilio.AspNet.Core
PM> Install-Package Twilio.AspNET.Core
- .NET Mvc kullanacaksanız Twilio.AspNet.Mvc
PM> Install-Package Twilio.AspNET.Mvc
Eğer .NET Core bir projeye Twilio.AspNET.Mvc paketini yüklerseniz yada tam tersi bir .NET Mvc projeye Twilio.AspNET.Core paketini yüklerseniz projeniziz çalışmasında hatalar oluşacaktır. Bu bakımdan hangi teknolojiyi kullanıyorsanız o paketi eklemeye dikkat edin.
Paketleri yükledikten sonra benim projemki paketler şu şekilde:
Siz bu yazıyı okduğunuzda bu paketlerin yeni versiyonları çıkmış olabilir. Benim yazıyı hazırladığım tarihte ki versiyonlar bu şekilde.
Control Oluşturulması
Oluşturduğumuz projeye yeni bir Controller ekleyeceğiz. Bunun için Projenizde ki Controller klasörüne sağ tıklayın ve sırasıyla Add -- Controllers -- MVC Controller ı tıklıyoruz.
Controller!a bir isim veriyoruz ben SmsToEmail ismini verdim.
Controller oluşturulduktan sonra Twilio' nun kullanacağı namespace leri controler ımıza ekliyoruz
using Twilio.AspNet.Common;
using Twilio.AspNet.Mvc;
using Twilio.TwiML;
Ardından, Controller sınıfımızı, Twilio dan devralabilmesi için TwilioController ile değiştiriyoruz.
public class SmsToEmailController : TwilioController
Ardından bir Action Method oluşturuyoruz. Eğer geriye bir değer döndürmek istiyorsak (Gelen mesaja otomatik cevap gibi) [HttpPost] yapısını kullanmanız gerekiyor.
[HttpPost]
public IActionResult Index()
{
string body = Request.Form["Body"];
string to = Request.Form["To"];
string from = Request.Form["From"];
//Forward Sms to Email
var message = new MailMessage();
message.To.Add(new MailAddress("kime@mail.com"));
message.From = new MailAddress("kimden@mail.com");
message.Subject = "You have received a message from " + from;
message.Body = "Message: " + body;
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
var credential = new NetworkCredential
{
UserName = "username@mail.com",
Password = "Password"
};
smtp.Credentials = credential;
smtp.Host = "mail servis smtp"; // smtp-mail.outlook.com
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.Send(message);
}
return TwiML(response);
}
Ben bu örnekte bir mail yollama kısmı yapmaya çalıştım fakat siz daha farklı yollarla da maillerinizi gönderebilirsiniz.
Örnekte görüldüğü gibi Twilio dan bize "Body, To ve From" değerleri geliyor. Bizde bu değerleri alıp mail yollama işleminde kullanıyoruz. Burada ki To ve From değerleri Twilio üzerinden birbirine Sms atan kullanıcıların numarlarıdır
string body = Request.Form["Body"]; //Mesaj içeriği
string to = Request.Form["To"]; //Kime Sms Atıldı
string from = Request.Form["From"]; //Kim Sms Attı
Proje kısmında yapacaklarımız bu kadar. Şimdi Twilio kısmında bir kaç ayar yapmamız gerekecek.
Buraya kadar okuduysanız bir Twilio numaranız vardır diye tahmin ediyorum ve bu varsayımla devam ediyorum.
Twilio'da yönlendirmek istediğimiz numara tıklıyoruz.
ve açılan sayfada Messaging kısmına aşağıda ki gibi projeyi çalıştıracağımız sunucunun adresini yazıyoruz.
Bu örnek ile ASP:NET MVC ve ASP.NET Core projelerinde Twilio ya gelen Sms Mesajını bir mail adresine yönlendirebilirsiniz. Daha fazla örnek için Twilio nun kendi sayfasını ziyaret edebilirsiniz. Twilio Tutorials Umarım işinize yarayan bir örnek olmuştur.