<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Berk Arat</title><description>Kişisel Yazılım Blogu</description><link>https://fuwari.vercel.app/</link><language>tr</language><item><title>GitHub Temel Kavramlar</title><link>https://fuwari.vercel.app/posts/github-temel-kavramlar/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/github-temel-kavramlar/</guid><description>Merhaba bu yazımız github üzerinde proje paylaşma hakkında yazımızın ([Visual Studio Github Publish İşlemi &amp;8211; Resimli Anlatım](https://blog.berkar</description><pubDate>Sun, 28 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_03_azure-repos.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_03_azure-repos.png&quot; alt=&quot;Azure Repos - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; title=&quot;azure repos&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımız github üzerinde proje paylaşma hakkında yazımızın (&lt;a href=&quot;https://blog.berkarat.com/github-publish/&quot;&gt;Visual Studio Github Publish İşlemi – Resimli Anlatım&lt;/a&gt; ) devamı niteliğindedir. Bu yazıda github üzerinden dosya paylaşımını branch oluşturma rebase işlemleri gibi konulara değineceğim.&lt;/p&gt;
&lt;p&gt;İş hayatında bir proje üzerinde birden fazla kişinin çalıştığı projelerde kullanımınında source code kavramı olmazsa olmazdır. Bunlara örnek olarka bitbucket da kullanılabilir ancak ben github üzerinden örneklendireceğim bunun kullanımları benzerdir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2021_03_github-master-300x163.png&quot; alt=&quot;Github Master - GitHub Temel Kavramlar&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2021_03_github-171x300.png&quot; alt=&quot;Github - GitHub Temel Kavramlar&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Github Branch Oluşturma?&lt;/h2&gt;
&lt;p&gt;Branch kelime anlamı oolarak kol dal olarak telaffuz edilmektedir. Ancak bizim dilimizde bir projenin yapılacak bir kısmı olarak belirtilmektedir. Örnek olarak hesap makinesi üzerinden gideceğim. Projemizde 2 kişinin çalıştığını düşünürsek bunlardan birincisi toplama çıkarma diğer grup ise bölme ve çarpma işleemlerini gerçekleştirsin. Projemizin bir adet master adında ana bir dosyası vardır. Bu master dosyasından bir alan oluşturarak bu projenin bir anlamda kopyasını almaktayız. Bu alan içerisinde artık kendi alanımızda hareket etmekteyiz. Burada toplama ve çıkarma fonksiyonlarını yazarken takım arkadaşımız paralel olarak bölme ve çarpma fonksiyonlarını yazabilmektedir. Burada bağımsız bir şekilde hareket etme özgürlüğü ve projenin hızlı ilerlenmesi hedeflenmektedir.&lt;/p&gt;
&lt;p&gt;Bizim oluşturduğumuz branch sayesinde bağımlılığı oratadan kaldırarak proejmizde kendi adımıza bir alanın kodlamasını gerçekleştirebiliriz.&lt;/p&gt;
&lt;h2&gt;Github Commit nedir ?&lt;/h2&gt;
&lt;p&gt;Commit kaydet olarak dilimize geçmiştir. Yazdığımız kodda bir değişiklik yaptığımızda commit alanı değişikliğe uğrar ve bizi kaydetmemiz için bir uyarı verir. Burada olay aslında bir anlamda kaydetmek ancak source code üzerinde kayıt anlamına gelmektedir. Yaptığımız değişiklikleri git gibi alanlarda kaydetmeye yarar.&lt;/p&gt;
&lt;h2&gt;Rebase ve Sync Nedir?&lt;/h2&gt;
&lt;p&gt;Sync kelime olarak senkronize etmek anlamına gelir. Bir projede birden fazla kişi çalışırken master (ana proje )projesinde birden fazla kişi projede değişikler yapmaktadır. Burada sizin yazdığınız kodda olan ve ana projeyi etkileyen durumlar olabilmektedir. Örnek vermek gerekirse .Net Core için örneğin bir mapper eklediniz ve bu mapperın projeye eklenmesi gerekir. Aynı anda başka birisi de bir mapper eklediğinde bunun sync yani eşlenmesi gerekir. Bunun için projemize rebase yani ana projeden örnek alıp bizim projemizle aynı duruma getirmemiz gerekir ki bu da projenin devamlılığı için gereklidir.&lt;/p&gt;
&lt;h2&gt;Pull Request Nedir ?&lt;/h2&gt;
&lt;p&gt;Projelerde genelde bir istek ve tamamlanma durumu söz konusudur. Yazılımcı olarak siz kodunuzu yazarsınız ve tamamlandığını düşündüğünüz anda projenizi merkeze aktarmak istersiniz. Bu durumda direkt erişimin engellenmesi ve kontrollerin sağlanması için bir onay mekanizması vardır. Bu onayı bir veya birden fazla kişinin onayından geçtikten sonra ana projeye publish edilir. Buradaki asıl amaç yazılan kodun verimliliği ve doğruluğunun kontrolünün sağlanmasıdır.&lt;/p&gt;
&lt;h2&gt;Conflict nedir ?  &lt;/h2&gt;
&lt;p&gt;Conflict kelime olarak ayrılık olarak algılanır. Genelde aynı projenin belli bölümlerinde çalışan developerlar arasında yaşanılır. Örnek vermek gerekirse siz toplama işleminde x=x+1; kullanırken diğer yazılımcı x++; olarak kullanmıştır. Bunlar temelde aynı şeylerdir. Ancak kod tarafında farklı olarak algılanır ve bunun bir ayırma gitmesi gerekir. Ya da daha önce birini eklediği kod ile sizin onu düzenlemeniz sonucu çıkan yeni bir kod bloğu oluşur. Bu da sonuç olarak bir fark yaratır. Bu farkta en güncel olan ve doğru olan kod bloğu merge edilir.&lt;/p&gt;
&lt;p&gt;Burada aynı zamanda sizin yazdığınız kod ile merkezdeki (master) kod bloğu eşleşmediği durumlarda farklılıklar ortaya çıkmaktadır. Burada en doğrusu rebase alarak master üzerindeki kod ile sizin yazdığınız kodun karşılaştırılması ve doğru olanın son olarak mastera gönderilmesidir.&lt;/p&gt;
</content:encoded></item><item><title>.Net Core AutoMapper Kurulumu ve Kullanımı</title><link>https://fuwari.vercel.app/posts/net-core-automapper-kurulumu-ve-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/net-core-automapper-kurulumu-ve-kullanimi/</guid><description>Merhabalar bugünün konusu olarak benim sıkça kullandığım AutoMapper kütüphanesinden  bahsedeceğim ve bir örnek uygulama yapacağım.</description><pubDate>Sat, 27 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2021_03_automapper.png&quot;&gt;&lt;img src=&quot;/wp-images/2021_03_automapper.png&quot; alt=&quot;Automapper - .Net Core AutoMapper Kurulumu ve Kullanımı&quot; title=&quot;automapper&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;automapper&lt;/p&gt;
&lt;p&gt;Merhabalar bugünün konusu olarak benim sıkça kullandığım AutoMapper kütüphanesinden  bahsedeceğim ve bir örnek uygulama yapacağım.&lt;/p&gt;
&lt;h2&gt;Auto Mapper nedir ?&lt;/h2&gt;
&lt;p&gt;.Net Core projelerinde database katmanına erişmek sadece CRUD işlemlerinde kullanılır. Yazılı olmayan bir kuraldır bu. Ancak bu veriler üzerinde logic işlemler yapmamız da gerekmektedir. Bunun için DTO yani data transfer objeleri kullanırız. Bu database ve DTO sınıfflarını birbirine eşlemek için AutoMapper kütüphanesi yardımımıza koşuyor. Bu sayede ekstra kod fazlalığında kurtulmuş ve sade bir yapıda kod oluşturabiliyoruz.&lt;/p&gt;
&lt;h2&gt;AutoMapper Kurulumu&lt;/h2&gt;
&lt;p&gt;İlk olarak Automapper kurulumu için package manager console üzerinden aşağıdaki nugetleri kurmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;Install-Package AutoMapper
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection&lt;/p&gt;
&lt;p&gt;Bu kurulumu yaptıktan sonra projenin altında MappingProfile adında bir class oluşturacağız ve burada CreateMap komutu ile  source ve destination yani neyi neye map edeceğimiz tanımlayacağız.&lt;/p&gt;
&lt;p&gt;Bu tanımlama bize neyin neye map edileceğini belirtmemize yaramaktadır. Örnek olarak bir decimali longa ya da tam tersi olarak maplememizi sağlar. Burada ReverseMap komutu ise database classından oluşturulan DTO classına map etmemize yararken aynı zamanda tam tersi bir işlemi de gerçekleştirmemize yaramaktadır.&lt;/p&gt;
&lt;p&gt;ForMember kullanımında ise class içerisindeki nesnenin tam olarak karşılığını belirttiğimiz durumlarda kullanılır. Buradaki örnekte ufak da olsa bir logic işlem gerçekleştirmekteyiz. Doğum tarihi verisini alıp günümüzden çıkararak yaş bilgisine ulaştırıp DTO üzerinde Age fieldına set etmiş oluyoruz. Buna benzer şekilde istediğimiz nesneyi belirttiğimiz nesneye atamamıza yarayan bir methoddur ForMember.&lt;/p&gt;
&lt;p&gt;MapFrom ise datayı nereden aldığımız yani database classı üzerinden aldığımız veriyi belirtmektedir.&lt;/p&gt;
&lt;p&gt;public MappingProfile()
{
CreateMap&amp;lt;UserDto, _dbUser&amp;gt;().ReverseMap()
.ForMember(x=&amp;gt;x.JsonString, opt=&amp;gt;opt.MapFrom(
x=&amp;gt;JsonConvert.DeserializeObject(x.JsonString) ))
.ForMember(dest =&amp;gt; dest.Age, opt =&amp;gt; opt
.MapFrom(src =&amp;gt; (DateTime.Now.Year - src.BirthDate.Year)
));&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Örnek üzerinden ilerleyeceğim için burada kullandığım ve karşılaştığım olaylardan bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Tanımlamalarda örnek bir json üzerinden ilerliyorum. Database kolonu içerisinde Json string olarak eklenmiş bir datayı karşıya obje olarak getirmek gerekmektedir. Bu durumlarda Newtonsoft kütüphanesi ile sadece mapper içinde küçük bir tanım yaparak  objeye çevirebilmekteyiz. Bunu eğer  mapper olmadan yaparsak tek tek objeyi oluşturup tanımlamaları yapmak gerekir ki bu da kod okunurluğu açısından olumsuz bir durumdur.&lt;/p&gt;
&lt;p&gt;Daha sonra tanımladığımız nesneyi ekranda görüntüleme yapmaktayız. AutoMapper sayesinde database erişiminden kurtulmuş ve o data üzerinde logic işlemler yapmaktayız. Bu da Core katmanında datanın işlenmesini sağlamaktadır. Bu sayede N katmanlı mimari dediğimiz yapının temellerinden de uzaklaşmamış oluyoruz. Büyük çaplı projelerde N katmanlı mimari olmazsa olmazlardandır ve mapping işlemi bunun için çok faydalı bir konumda yer almaktadır.&lt;/p&gt;
&lt;p&gt;public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAutoMapper(typeof(MappingProfile));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Bu yazımda bahsettiğim konuya dair oluşturduğum basit ama anlaşılır bir kaynak kodu ekliyorum. Burada veritabanı bağlantısı kurmadan manuel bir şekilde ilerliyorum. Ancak sizler database üzerinden bağlantı kurarak da işlemlere devam edebilirsiniz. Aşağıda kaynak kod bilgilerini bırakıyorum Github üzerinden erişebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/MapperProfileExample&quot;&gt;https://github.com/berkarat/MapperProfileExample&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Temiz Kod (Clean Code) Yazma Teknikleri ve Kodlama standartları – 2</title><link>https://fuwari.vercel.app/posts/temiz-kod-teknikleri-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/temiz-kod-teknikleri-2/</guid><description>Bu yazımız   [https://blog.berkarat.com/temiz-kod-teknikleri-1](https://blog.berkarat.com/temiz-kod-teknikleri-1/) konusunun devamı niteliğindedir. Ay</description><pubDate>Tue, 16 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2021_03_cleancode.png&quot;&gt;&lt;img src=&quot;/wp-images/2021_03_cleancode.png&quot; alt=&quot;temiz kod&quot; title=&quot;cleancode&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımız   &lt;a href=&quot;https://blog.berkarat.com/temiz-kod-teknikleri-1/&quot;&gt;https://blog.berkarat.com/temiz-kod-teknikleri-1&lt;/a&gt; konusunun devamı niteliğindedir. Aynı zamanda source control, iş takibi, memory leak gibi konulara da değineceğim&lt;/p&gt;
&lt;h2&gt;OOP(Object Oriented Programming) Nesne Yönelimli Programlama&lt;/h2&gt;
&lt;p&gt;Eğer üst seviye bir dil kullanıyorsanız nesne yapısı kaçınılmazdır. Örnek olarak C# dili  için nesne tabanlı bir dildir. Bu sayede lokal ya da genel olarak nesneler üretip bunlara işlemler ekleyip kullanıp sönümlendirebiliriz. Ancak burada da bir handikap olarak her oluşturulan nesne ramde yer kaplamaktadır. Bu yüzden nesneleri oluştururken 2 kere düşünmek gerekmektedir.&lt;/p&gt;
&lt;p&gt;Gereksiz yere nesne oluşturmak yerine duruma göre oluşturmak daha mantıklıdır. Örneğin sadece bir yerde kullanılacak nesneyi en başta constructor adımında oluşturmak  daha faydalıdır. Uygulama açılmadan constructor üzerinde oluşan nesne daha sonra başka bir yerde çağrılabilir.&lt;/p&gt;
&lt;h2&gt;Unit Testlerin Yazılması&lt;/h2&gt;
&lt;p&gt;Bir metod olsun class olsun ya da topyekün bir proje olsun Unit Teslerden geçmesi gerekmektedir. Bu testleri siz de yazabilirsiniz ya da hazır toollar kullanarak da gerçekleştirebilirsiniz. Bu sayede kodunuzda karşılaşabileceğiniz senaryoları test etmiş olup olası hataları ya da geliştirme gereken yerleri kolaylıkla görebilirsiniz.&lt;/p&gt;
&lt;h2&gt;Katmanlara Ayırmak&lt;/h2&gt;
&lt;p&gt;İlk olarak yapacağınız projeyi kafanızda oturttuktan sonra küçük parçalara bölmek çok önemlidir. Devasa yapılar bile en başta küçük parçalarla başlamıştır bunu unutmamak gerekir. En basitinden hesap makinesi uygulaması bile yazsak bunun bunun logic ve business yapılarını ayrı tutmak gerekir. Örneğin toplama işleminin yapıldığı şartların konulduğu kısımları logic olarak tanımlayabiliriz.&lt;/p&gt;
&lt;p&gt;Ayrıca MVC yapılarında model view ve controller katmanlarını erişimlerini keskin bir şekilde ayırmak da çok önemlidir. Örneğin Controller üzerinden bir database işlemi yapmak mümkün ancak kesinlikle yanlış bir durumdur. Bunun için önce servis katmanında logic kısmı işlenip daha sonra CRUD işlemlerine geçilip oradan bir dönüş sağlanmalıdır. Bu dönüşlerin de database olarak değil bir DTO (Data Transfer Object)  nesnesine maplenip bunun üzerinden dönmesi gerekmektedir. Her katmanın sadece bir işi olup diğer işleri yapmaması gerekmektedir.&lt;/p&gt;
&lt;h2&gt;Kalıtım ve Abstract Yapı&lt;/h2&gt;
&lt;p&gt;Uygulamalarımızda benzer metodlar aynı ya da benzer işleri gerçekleştiriyorsa bunları ortak bir yapıda oluşturmak daha mantıklıdır. Bu sayede hem kod tekrarından kurtuluruz ve standartı yakalamış oluruz. Bir  Base yapısı kurup Interface oluşturup bu Interfacede kullanılması zorunlu metodları belirlersek işimizi yönetmemiz çok daha kolay olur.  Örnek vermek gerekirse CRUD işlemleri için verebilirim. Bu işlemlerden Insert metodunu bir Generic class oluşturup Interface üzerinden tanımlarsak başka class üzerinde kalıtım yaparak kullanabiliriz.&lt;/p&gt;
&lt;h2&gt;Dökümanlaştırma&lt;/h2&gt;
&lt;p&gt;Bir api veya kullanıcıya sağlanan bir veri sağlayıcı yazdıysanız bunların örnek request gibi hangi metodların ne yaptığı gibi şeyleri doküman olarak hazırlamak sizin kodunuzun kullanımını kolaylaştıracaktır.&lt;/p&gt;
&lt;p&gt;Bu bahsettiğim şeyler en genel kolaylaştırıcı tarzlardır. Bunun gibi bir çok kural vardır.&lt;/p&gt;
&lt;h2&gt;İş Takibi&lt;/h2&gt;
&lt;p&gt;İşe başlamadan önce kendinize tecrübelerinize dayanarak bir plan oluşturmanız gerekmektedir. Bu işlem için işlerinizi parçalara bölüp kendinize tasklar ve süreler oluşturmak genel kuraldır. Dört işlem yapan basit bir hesap makinesi uygulamasında her işlem grubu için bir task oluşturup bu deadline süresi vermeniz hem işinizi kontrollü yapacak hem de takibini kolaylaştıracaktır. Bu işlem için JIRA gibi iş takip uygulamaları kullanarak kolayca akışlar dashboardlar oluşturarak yönetebilirsiniz.&lt;/p&gt;
&lt;h2&gt;Source Control&lt;/h2&gt;
&lt;p&gt;Eğer bir projede birden fazla kişi kod yazıyosa source control kaçınılmazdır. Yine hesap makinesi örneğinden devam etmek gerekirse bir kişi toplama bölümünü diğer kişi de bölme kısımını yazıyor diyelim. Bu durumda bir tane master proje oluşturulur. Bu master base olarak kabul edilir ve bunun üzerinde geliştirme yapılmaz. Master üzerinden rebase  alarak kendi branchlerinizi oluşturur ve taşkınız ne ise o işi o branch üzerinde geliştiririz. Bu sayede başkasının yazdığı kodla çakışma ya da birbirinizi ezme gibi durumlar ortadan kalkmış olur. Ayrıca her yerden erişim için de kodunuz localde değil cloud ortamda tutulmuş olur. Belli başlı GIT, Bitbucket gibi açık platformlar kullanılabilir.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/github-publish/&quot;&gt;Visual Studio Github Publish İşlemi – Resimli Anlatım&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Bonus&lt;/h3&gt;
&lt;h2&gt;Memory Leak&lt;/h2&gt;
&lt;p&gt;Genelde threadlerde ya da paralel çalışan uygulamalarda karşılaşılan bir hata durumudur. Bir thread açtıysanız tavsiyem abort ettikten sonra bir daha check etmenizdir. Çünkü bazı durumlarda threadler kapanamıyor ve arka planda açık kalıp bir süre sızıntı yani memory leak meydana gelir.Daha  sonra memory sınırına ulaştığında uygulamanız crash olabilmektedir. Örnek olarak 1024Mb hafızalı bir cihazda çalışan uygulamanız sürekli fiş versin. Bu fiş verme uygulamasında threadleri kapatmayı unutursanız eğer ve her adımda 1Mb gibi bir data kaybınız olması durumunda uygulamanızın ömrü maksimum 1024 işlem kadardır. Daha sonrasında out of memory hatasına düşersiniz ve uygulamanız fail olur.&lt;/p&gt;
&lt;p&gt;Bu memory leak olayını fark etmek için visual studioda diagnostic tool kullanabilirsiniz adım adım takip ederek nerede bir sızıntı olduğunu bulabilirsiniz. Ya da Jetbrainsin dotmemory uygulamasını kullanarak uygulamanızda nerede hata olduğunu detaylı dökümanlarla bulabilirsiniz. Bunun için belli aralıklarla snapshot alarak karşılaştırıp çözüme varabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jetbrains.com/dotmemory&quot;&gt;https://www.jetbrains.com/dotmemory&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Temiz Kod (Clean Code)  Yazma Teknikleri ve Kodlama standartları   – 1</title><link>https://fuwari.vercel.app/posts/temiz-kod-teknikleri-1/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/temiz-kod-teknikleri-1/</guid><description>Merhaba bu yazımızın konusu daha az kod satırı yazarak daha efektif yani temiz kod şeklinde bir uygulama yazmamız için gerekli niteliklerden bahsedece</description><pubDate>Mon, 15 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2021_03_cleancode.png&quot;&gt;&lt;img src=&quot;/wp-images/2021_03_cleancode.png&quot; alt=&quot;temiz kod&quot; title=&quot;cleancode&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımızın konusu daha az kod satırı yazarak daha efektif yani temiz kod şeklinde bir uygulama yazmamız için gerekli niteliklerden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Bir programlama diliyle bir uygulama oluşturmak kolaydır. Ancak bu uygulamanın maliyeti refactoring işlemi gibi işlemler ve güvenlik açığı ne kadar az ise yazdığınız kod o kadar kalitelidir. Bu tip işlemleri (temiz kod yazma ) peki nasıl yapacağız ? Bunun için dünya çapında geliştirilmiş bazı isimlendirme teknikleri, kodlama stilleri ve yardımcı extensionslar  gibi belli başlı yöntemler vardır. Bu yazımda bu yöntemlerin bazılarından ve kişisel deneyimlerimden edindiğim tecrübelerden başlayacağım. Konuya başlamadan önce dil olarak dünya dili olan İngilizce kullanmak yazılı olmayan bir kuraldır. Bu sayede başka kişilerin de anladığı bir ortam sağlanmaktadır.&lt;/p&gt;
&lt;p&gt; İlk adım olarak isimlendirme kuralları.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Metodların ve Tanımlamaların İsimlendirilmesi&lt;/strong&gt;&lt;/h2&gt;
&lt;h4&gt;CAMEL CASE&lt;/h4&gt;
&lt;p&gt;Genel olarak kullanılan standartlardan   Camel Case  ve Pascal Case den bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Camel case ilk harf küçük geri kalan her kelimede büyük harf kullanılarak başlanması gerekmektedir. Örnek olarak  bir db connection string oluştururkene bu tipte yapılmaktadır.&lt;/p&gt;
&lt;p&gt;“databaseConnectionString”&lt;/p&gt;
&lt;h4&gt;PASCAL CASE&lt;/h4&gt;
&lt;p&gt;Bir diğer standart ise Pascal Casedir bu da Camel case tarzında ancak her kelime başlangıcında büyük harf kullanılarak başlanmasıdır.&lt;/p&gt;
&lt;p&gt;“DatabaseConnectionString”&lt;/p&gt;
&lt;p&gt;Bir diğer kullanılan yöntem ise Uppercase yöntemidir. Genellikle struct ve enum tanımlarında kullanılır ve tüm harfler bütük olarak yazılmaktadır ve ayrım olarak da alt çizgi kullanılır.&lt;/p&gt;
&lt;p&gt;Const DATABASE_CONNECTION_STRING=”test.mysql.com;user=berk;password=123”&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Hataların yönetimi ve Loglama&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;İlk olarak bir projeye başlamadan önce loglama sistemini oluşturmak gerekmektedir. Yukarıda bahsettiğim gibi bakım maliyetinin düşük olması kodunuzun kalitesini arttıracaktır. Bunun için de olası hataların ya da güncellemelerin sebebini bulmak gerekmektedir. Bu durumu da ancak log kayıtlarından erişebiliriz. Kayıtları kullanmak için kimi sistemler text olarak tutarken kimisi database üzerinde tutarken bazı özel işlerde şifreli bir şekilde cloud üzerine anlık depolanabilmektir. Ben genel projelerimde Log4net hazır tool kullanmaktayım. Gelişmiş özelleştirebilir bir tool olduğu için tercih etmekteyim.&lt;/p&gt;
&lt;p&gt;Hatalar konusunda da olmazsa olmaz .NET için try catch finally bloklarıdır. Ancak bu blokları ard arda kullanmak uygulamanın hızı ve maliyeti açısından çok fazlalık yaratmaktadır. Bunu ben son aşamada kullanmayı tavsiye ediyorum. Çünkü iç içe dallanan bir fonksiyon kümesinde kullanmak n^* kadar bir maliyet çıkarır ki bu da çok fazladır. Örneğin database üzerinden veri alacak ve ekranda gösterecek bir web projesinde controller için bir try catch yerine database yani repository katmanında try catch koymak daha mantıklıdır. Eğer uygulamanızın throw atmayıp devam etmesini de istiyorsanız finally catch bloğunu da kullanmanız gerekmektedir. Execption kısmında ise birden fazla özelleşmiş tip vardır. Bunlardan biri de ThreadException. Bu threadlerin abort olmadığı durumlarda gibi olaylarda kullanılmaktadır.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Yorumlar, Summary, Gruplandırma ve TODO kavramı&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Kodlamaya ilk başlangıçta genel olarak tavsiyem her metodunuza comment yazmanızdır. Çünkü yazdığınız kodda ileride dönüp bakınca ne işe yaradığını anlamak için bir açıklama yazısı çok işe yarayacaktır. Ancak daha ileri seviyelerde özel durumlar haricinde comment kodun kalitesini bozmaktadır. Örneğin bir sql connection yapan fonksiyona ekstra comment yazmak yerine metodun adını doğru vererek bu sorunu giderebiliriz.&lt;/li&gt;
&lt;li&gt;Summary ise genelde apiler için kullanılan fonksiyon üzerinde örnek request gibi ya da yaptığı işlemi açıklayan kısa metinler olan durumlarda kullanılır.&lt;/li&gt;
&lt;li&gt;Gruplandırma işlemi için ise region tagi içerisinde kod bloğunu yazmanız sizin kodunuzu daha okunabilir ve temiz olması açısından fayda sağlamaktadır.&lt;/li&gt;
&lt;li&gt;TODO ise olmazsa olmazlardandır. Karışık bir projede takım arkadaşlarınızın verdiği bilgileri ya da yapılacak işleri taglemek için TODO tagi kullanılır. Özel bir durum olduğu için Visual Studio –&amp;gt; Output içerisinden eklenen TODOları görebilirsiniz.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Daha detaylı bilgileri w3.org sayfasında bulabillirsiniz. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/standards/&quot;&gt;Daha Fazla Bilgi İçin&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Azure IOT Hub ve Device Kullanımı</title><link>https://fuwari.vercel.app/posts/azure-iot-hub-ve-device-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/azure-iot-hub-ve-device-kullanimi/</guid><description>Merhabalar bu yazımızısn içeriği Azure IOT Hub ve Device bağlantıları gibi konulara değineceğim. Ardından device ve cloud arasında iletişimin sağlanma</description><pubDate>Sun, 12 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_04_Azure_IoT_Hub.png&quot;&gt;&lt;img src=&quot;/wp-images/2020_04_Azure_IoT_Hub-696x385.png&quot; alt=&quot;Azure Iot Hub - Azure IOT Hub ve Device Kullanımı&quot; title=&quot;Azure_IoT_Hub&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızısn içeriği Azure IOT Hub ve Device bağlantıları gibi konulara değineceğim. Ardından device ve cloud arasında iletişimin sağlanmasını gerçekleştireceğiz.&lt;/p&gt;
&lt;p&gt;İlk adım olarak bir tane Azure IOT Hub kurmamız gerekmektedir. Bu hub içerisine device ekleyerek ortak noktadan kontrolleri sağlayacağımız bir alan olarak düşünebiliriz. Bunun için kaynak oluşturmamız gerekmektedir. Bununla ilgili adımları Blob Storage kullanımında anlatmıştım.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/azure-blob-storage/&quot;&gt;Azure Blob Storage .Net Örnek Uygulama&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;İlk adımı tamamladıktan sonra hubımızın içerisine giriyoruz. Sol tarafta bir menu göreceğiz burada devices alanına tıklayıp yeni bir device eklemememiz gerekmektedir. Bu device bizim için Raspberry Pi olacak ama başka türde devicelar da bağlamak mümkün. Ben .Net üzerinde örneklerle devam edeceğim için cihazımda WindowsIOT Core yüklü olacak. Ancak bunu simulator üzerinden de console uygulamasıyla gerçekleştirmek mümkün.&lt;/p&gt;
&lt;h3&gt;Device Komutları Dinleme&lt;/h3&gt;
&lt;p&gt;İlk olarak uygulamız çalıştığı sırada gelecek komutları dinlemesi için bir Listener metodu yazmamız gerekli bunun için device connection stringi kullanarak device ile hubımızın bağlantısını gerçekleştiriyoruz ve metod veya mesajın gelmesi için bunu thread olarak paralelde dinlemesini sağlıyoruz.&lt;/p&gt;
&lt;p&gt;s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString, TransportType.Mqtt);&lt;/p&gt;
&lt;p&gt;s_deviceClient.SetMethodHandlerAsync(&quot;GetLocalIPAddress&quot;, GetLocalIPAddress, null).Wait();&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_04_AzureIOT-1024x406.png&quot; alt=&quot;Azureiot - Azure IOT Hub ve Device Kullanımı&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Device Connection String&lt;/p&gt;
&lt;h3&gt;Azure IOT Devices Mesaj Gönderme&lt;/h3&gt;
&lt;p&gt;Burada hub üzerinden mesajımızı deviceımıza gönderebiliriz. Kullanım tercihine göre cihazımızda bir mesaj geldiğinde yaptırabileceğimiz işlemi gerçekleştirebiliriz. Örneğim mesajı göndererek ona göre uygulamayı yeniden başlatabiliriz. Veya uygulamımıza gereken bilgiyi göndererek başka işlemler yaptırabiliriz.&lt;/p&gt;
&lt;p&gt;s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString, TransportType.Mqtt);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        // Create JSON message
        var Message = new
        {
            msg = messages
        };
        var messageString = JsonConvert.SerializeObject(Message);
        var message = new Message(Encoding.ASCII.GetBytes(messageString));
s\_deviceClient.SendEventAsync(message);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Azure Devices Method Çağırma&lt;/h3&gt;
&lt;p&gt;Asıl önemli kısım aslında biraz da bu. Device üzerinde yazdığımız kodlarla uzaktan device üzerindeki bilgiliyi çekebilmekteyiz. Örneğin ben uygulamada örnek anlaşılması açısından device IP adresini geri döndüren bir metodu uzaktan çağırmayı gösterdim. Böylece birden fazla device için aynı komutla hepsinin durumlarını görebilmekteyim.&lt;/p&gt;
&lt;p&gt;s_deviceClient = DeviceClient.CreateFromConnectionString(s_connectionString, TransportType.Mqtt);
// Create a handler for the direct method call
s_deviceClient.SetMethodHandlerAsync(&quot;GetLocalIPAddress&quot;, GetLocalIPAddress, null).Wait();&lt;/p&gt;
&lt;p&gt;Aşağıda örnek uygulamanın Linkini paylaştım buradan detaylara ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/AzureIOTHubDevice&quot;&gt;https://github.com/berkarat/AzureIOTHubDevice&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Azure Blob Storage  .Net Örnek Uygulama</title><link>https://fuwari.vercel.app/posts/azure-blob-storage/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/azure-blob-storage/</guid><description>Merhabalar bugünkü yazımızda Azure Blob Storage servisinden bahsedeceğim. Uygulamalarımızdaki logları, test verilerimizi ve daha bir çok dosyayı özel</description><pubDate>Thu, 26 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_03_blob_Storage.png&quot;&gt;&lt;img src=&quot;/wp-images/2020_03_blob_Storage.png&quot; alt=&quot;Blob Storage - Azure Blob Storage  .Net Örnek Uygulama&quot; title=&quot;blob_Storage&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bugünkü yazımızda Azure Blob Storage servisinden bahsedeceğim. Uygulamalarımızdaki logları, test verilerimizi ve daha bir çok dosyayı özel veya public bir şekilde depolayabilmek için Blob Storage servisini kullanabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Genel Kullanım alanları verilerin depolanması ve tarayıcıda doğrudan bir şekilde aktarılması gibi alanlarda çokça kullanılır.İstenildiği durumda bu blob depoları herhangi bir kullanıcının ulaşabileceği bir alana yönlendirilip tarayıcıda görüntülenebilir.&lt;/p&gt;
&lt;h2&gt;Azure Blob Storage Hesabı Oluşturma&lt;/h2&gt;
&lt;p&gt;Bu işlem için Microsoft Azure hesabınız olması gerekmektedir. Aşağıdaki linkten ücretsiz olarak bir hesap edinebilirsiniz ya da varsa hesabınız devam edebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/tr-tr/free/&quot;&gt;https://azure.microsoft.com/tr-tr/free/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;İlk adım olarak hesabı açtıktan sonra sol tarafta panelde bulunan “Create Resource” diyerek bir kaynak oluşturuyoruz. Ardından marketten Storage account – blob, file, table, queue seçiyoruz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_2020-03-27_17-51-39.png&quot; alt=&quot;Azure Blob Storage .Net Örnek Uygulama ekran görüntüsü 1&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_2020-03-27_17-52-38-1024x897.png&quot; alt=&quot;Azure Blob Storage .Net Örnek Uygulama ekran görüntüsü 2&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_2020-03-27_17-53-26.png&quot; alt=&quot;Azure Blob Storage .Net Örnek Uygulama ekran görüntüsü 3&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arından karşımıza gelen ekranda gerekli yerleri storage name gibi alanları dolduruyoruz. Review and Create dedikten sonra All Resources kısmında artık storage depomuzu görebiliyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_2020-03-27_18-02-47-1024x644.png&quot; alt=&quot;Azure Blob Storage .Net Örnek Uygulama ekran görüntüsü 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada manual olarak da container oluşturma ve dosya yükleme seçeneği var ancak bizim bunu otomatik yapmamız doğru olandır. O yüzden kalan kısmı .net ortamındaki bir örnek üzerinden devam edeceğim.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Storage Explorer&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Bu uygulamayı aşağıdaki linkten indirebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/tr-tr/features/storage-explorer/&quot;&gt;https://azure.microsoft.com/tr-tr/features/storage-explorer/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Burası da tıpkı portal gibi bize storagelarımızı control etmemizi sağlayan masaüstü bir uygulamadır. Avantajlı olarak portala bağlanmadan durumları görüntüleyebilmekteyiz. Ayrıca monitoring ile kontrol de sağlayabilimekteyiz.&lt;/p&gt;
&lt;h4&gt;Azure Blob Storage Uygulama&lt;/h4&gt;
&lt;p&gt;Burada ilk olarak bir tane .Net Console application oluşturuyoruz. Ardından projemize WindowsAzure.Storage paketini yüklüyoruz. Bu paket içerisindeki classları kullanarak depolarımıza ulaşıp upload download gibi işlemleri yapacağız&lt;/p&gt;
&lt;p&gt;Install-Package Azure.Storage.Blobs -Version 12.4.0&lt;/p&gt;
&lt;p&gt;Ardından metodlarımızı yazmaya başlıyoruz. Azure portal&amp;gt;Settings&amp;gt;AccessKeys dosyasının altından connection stringimizi alıyoruz. Bunu uygulamamızda bir stringe atıyoruz. Bu string değer bizim storage ile bağlantımızı sağlayacaktır.&lt;/p&gt;
&lt;p&gt;Bunun ardından containerımızı oluşturuyoruz. Bu containerları klasör gibi de düşünebiliriz. Böylece birden fazla projenin klasörlerini ayrı ayrı depolayabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Ardından aşağıdaki gibi basit bir kod bloğu oluşturuyoruz. ExistsAsync komutu ile aynı isimde bir container var mı onu control edip ardından yoksa yeni bir tane oluşturuyoruz. Ardından log dosyamızı yani bizim txt dosyamızı oluşturup karşıya gönderiyoruz. Eğer aynı dosyanın içine tek tek yasmak istiyorsak da yine aynı isimle verdiğimiz konteynır altındaki dosyaya ekleyebiliriz. İşlem aslında bu kadar basit.&lt;/p&gt;
&lt;p&gt;CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
cloudBlobContainer = cloudBlobClient.GetContainerReference(&quot;berkaratcontainer&quot;);
bool isExists = cloudBlobContainer.Exists();
if (!isExists)
{&lt;br /&gt;
await  CloudBlobContainer.CreateAsync();
Console.WriteLine($&quot;Created container &apos;{cloudBlobContainer.Name}&apos;&quot;);
}&lt;/p&gt;
&lt;p&gt;Bu kod bloğuyla blob tipinde yetkilendirme verdik.&lt;/p&gt;
&lt;p&gt;Container adını verirken dikkat etmemiz gereken şey küçük harfler kullanmaktır aksi taktirde exceptiona düşmektedir.Burada upload download  ve delete kodlarını paylaşıyorum. İsteğe bağlı olarak yeni farklı dosya tipleri de eklenebilmektedir. Bunu örnek uygulamanın git linkinden indirip test edebilirsiniz.&lt;/p&gt;
&lt;p&gt;Git Linki&lt;a href=&quot;https://github.com/berkarat/AzureBlobStorage&quot;&gt;https://github.com/berkarat/AzureBlobStorage&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows 10 IOT Core ve Raspberry Pi Kurulumu</title><link>https://fuwari.vercel.app/posts/windows-10-iot-core-raspbberrypi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/windows-10-iot-core-raspbberrypi/</guid><description>Merhabalar bu yazımda Windows 10 IOT Core bildiklerimi sizlere aktaracağım. İlk olarak bu platformun ne olduğundan bahsedeceğim. Ardından nasıl yüklem</description><pubDate>Tue, 17 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_03_win10iotcore.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2020_03_win10iotcore-696x392.jpg&quot; alt=&quot;Win10Iotcore - Windows 10 IOT Core ve Raspberry Pi Kurulumu&quot; title=&quot;win10iotcore&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows 10 IOT Core&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımda Windows 10 IOT Core bildiklerimi sizlere aktaracağım. İlk olarak bu platformun ne olduğundan bahsedeceğim. Ardından nasıl yükleme yapıldığı gibi konulara değineceğim&lt;/p&gt;
&lt;p&gt;Windows 10 IoT (Internet of Things) Microsoft tarafından gömülü sistemler için ortaya çıkarmış olduğu bir işletim sistemidir. Adından da anlaşılacağı gibi Windows kurulumu olarak karşımıza çıkıyor. Ancak windows olmasına ragmen bir çok özellikleri kırpılmış ve sadece ihtiyaç duyulan şeylerin bulunduğu bir platformdur.&lt;/p&gt;
&lt;p&gt;Raspberry Pi için konuşacak olursak genel işletim sistemi Raspbianda bahsedeyim. Bu işletim sisteminde komutlarla Raspberry üzerinden geliştirme yapabiliyorduk. Ancak bu bize bazı zorluklar çıkarıyordu. Windows 10 Iot ile birlikte artık tıpkı arduinoda olduğu gibi yazdığımız programı raspberry üzerine gömerek çalıştırabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Raspbianda geliştirme için ekstradan klavye mouse ve monitöre ihtiyaç duyuyorduk. Ancak bu platformda buna ihtiyaç bulunmamaktadır. Tek yapmamız gereken Visual Studio kullanarak oluşturduğumuz kodu raspberrye gömmek. Raspberry bilgisayar özelliğini yitirmiş olması bir dezavantaj olabilir ancak uzaktan Visual Studio üzerinden geliştirmek de çok büyük bir artı sağlamaktadır.&lt;/p&gt;
&lt;p&gt;Tabii bunun avantajları rahatlık gibi görünse de asıl güzel yanı platform olarak .Net kodları yazarak istediğimiz şekilde program geliştirebilmekteyiz. Ayrıca Azure IoT desteğiyle cloud programlamaya da imkan sağlamaktadır.&lt;/p&gt;
&lt;p&gt;Windows 10 IoT iki farklı modeli bulunmaktadır. Bir tanesi Enterprise diğeri ise IoT Core. Enterprise birden fazla cihaz üzerine kurulum sağlanırken Core ise tek bir cihazda kullanılabilmektedir.&lt;/p&gt;
&lt;p&gt;Bu platform Raspberry üzerindeki ek sensörlerle etkileşimlere uyumlu bir şekilde çalışmaktadır.&lt;/p&gt;
&lt;p&gt;IoT core arayüze sahip değildir. Bu yüzden geliştirdiğimiz uygulamayı Visual Studio üzerinden yapmalıyız. Buradaki görsellik için ise tıpkı WPF’de kullandığımız XAML yapısı karşımıza çıkıyor.&lt;/p&gt;
&lt;h2&gt;Windows IoT Kurulumu&lt;/h2&gt;
&lt;p&gt;İhtiyacımız olan malzemeler 1 adet raspberry ve minimun 4 GB boyutunda SD kart.&lt;/p&gt;
&lt;p&gt;İlk olarak yapmamız gerek aşağıdaki linkten Windows IoT Core Dashboard uygulamasını indirmek.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/iot-core/downloads&quot;&gt;https://docs.microsoft.com/en-us/windows/iot-core/downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ardından karşımıza aşağıdaki gibi bir ekran gelecek burada SD kartımızı takıyoruz ve gerekli yerleri dolduruyoruz. Eğer yazacağımız uygulama internet gerektiriyorsa buradan internet bağlantısını da yapabiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_Windows-10-IoT-Core-Dashboard-1024x676.png&quot; alt=&quot;Windows 10 Iot Core Dashboard - Windows 10 IOT Core ve Raspberry Pi Kurulumu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra download ve install diyerek  işletim sistemini kurmuş oluyoruz. Ardından cihazımızı ethernet kartı üzerinden kendi bilgisayarımıza bağlıyoruz. My Devices kısmından Dashboard ve IP ayarlamaları gibi özellikleri düzenleyebiliriz.&lt;/p&gt;
&lt;p&gt;Raspberrymizi bir ekrana bağladığımızda aşağıdaki ekran gelmektedir. Buradan birkaç ayar yapılabilir ancak bir geliştirmek yapmak mümkün değildir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_raspberrypi.jpeg&quot; alt=&quot;Raspberrypi - Windows 10 IOT Core ve Raspberry Pi Kurulumu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio Bağlantısı&lt;/p&gt;
&lt;p&gt;İlk olarak Visual Studio üzerinden Universal Windows App uygulaması oluşturmamız gerekmektedir. Burada Mainpage. üzerinde XAML yapısında düzenlemeler yapabiliriz. Run ettğimizde aynı görüntü çıkacaktır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_03_VisualStudioIOT-1024x392.png&quot; alt=&quot;Visualstudioiot - Windows 10 IOT Core ve Raspberry Pi Kurulumu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada artık geliştirdiğimiz uygulamaları Local Machine üzerinden kendi localimizde test edebileceğimiz gibi Remote Machine diyerek de Raspberry üzerinden Debug işlemi gerçekleştirebiliriz. Burada Debug tipi olarak ARM seçmemiz gerekmektedir. Debug&amp;gt; Properties alanından Find diyerek cihazımızın bağlantısını kontrol edebiliriz.&lt;/p&gt;
</content:encoded></item><item><title>ASP.NET MVC 5 Authorization ve Rol Bazlı Yetkilendirme</title><link>https://fuwari.vercel.app/posts/mvc-5-authorization-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/mvc-5-authorization-islemleri/</guid><description>Bu yazıda authorization yani  yetkilendirmeyi ve çeşitlerini konu alacağız. MVC’de Rol bazlı Yetkilendirme konusuna değinip bu kavramı açıklığa kavuşt</description><pubDate>Wed, 15 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_01_Authorization.png&quot;&gt;&lt;img src=&quot;/wp-images/2020_01_Authorization-696x307.png&quot; alt=&quot;Role based authorization&quot; title=&quot;Authorization&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda authorization yani  yetkilendirmeyi ve çeşitlerini konu alacağız. MVC’de Rol bazlı Yetkilendirme konusuna değinip bu kavramı açıklığa kavuşturup örnek uygulama ekleyeceğim. Rol bazlı yetkilendirme konusuna girmeden önce genel yetkilendirme authorization kavramından bahsetmek gerekir.&lt;/p&gt;
&lt;p&gt;İlk olarak yetkilendirme (Authorization)  uygulama güvenliği açısından genel bir kontrol noktası olarak düşünebilriz. Daha önceki konumuzda cookielerden bahsetmiştik. Burada giriş yapan kullanıcının yetkisini de aldıktan sonra cookiemize ekleyelim. Ardından controllerlarda bulunan sayfalara giriş için eğer yetkisi var ise giriş yapabilsin eğer yapamazsa zaten belirlediğimiz bir sayfaya veya aynı  sayfaya dönüş yapacaktır.&lt;br /&gt;
Bu yüzden genel web sitelerinde Login ekranını çağırdığımız controllerlara Allowanonymous özelliği kullanılmaktadır. Bu da genel olarak bir yetki sınıfından türetilmiştir. Kullandığımız yetkileri ActionResult olarak tanımlayabildiğimiz gibi Controller bazlı da tanımlayabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Bu &lt;strong&gt;AuthorizeAttribute&lt;/strong&gt; classından türeteceğimiz bir class oluşturalım. Ardından kalıtım işlemi yapıyoruz. Bunun içindeki metodlar sayesinde yetkilendirme işlemini yapıyoruz. Bu durum eğer kullanıcı ve user doğru ise giriş yapmak olarak düşünebiliriz.&lt;/p&gt;
&lt;p&gt;[AllowAnonymous]
public ActionResult Login() {
// ...
}&lt;/p&gt;
&lt;p&gt;Yetkilendirmeyi kullanmak için öncelikle  Web.config dosyamıza giriyoruz. Authentication modunu belirlememiz gerekmektedir.Bunun için yetki tipini biz Formdan alacağımız için type kısmını Form olarak seçiyoruz.&lt;/p&gt;
&lt;h5&gt;Yetki Tipleri&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Forms    Formdan doğrulama&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;None    Yetki verme durumu yok.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Passport  Yetkiyi Microsoft kullanıcı şifresiyle doğrulanır.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows  Bu yetki tipinde Windows ve IIS sertifikalarıyla doğrulama yapılır.&lt;/p&gt;
&lt;p&gt;&amp;lt;authentication mode=&quot;Forms&quot;&amp;gt;
&amp;lt;forms loginUrl=&quot;Account/Login&quot;&amp;gt;&amp;lt;/forms&amp;gt;
&amp;lt;/authentication&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;system.web&amp;gt;&amp;lt;/system.web&amp;gt; tagleri arasına yapıştırıyoruz.&lt;/p&gt;
&lt;h2&gt;Rol Bazlı Yetkilendirme (Role Based Authorization)&lt;/h2&gt;
&lt;p&gt;Burada ise yetkilendirme yani Authorization işlmenin daha gelişmiş hali gibi düşünebiliriz. Rol bazında yetkilendirme yapabilmemiz için ise Veritabanımızda Rol sütununu da tanımlamayı unutmamak gerekir.&lt;br /&gt;
Örneğin bir senaryoda rolü “Admin”  olan kullanıcı menüde Kullanıcı bilgilerini görebilirken, rolü “User”  olan kullanıcı göremeyecektir. Bunu sağlamak için de ActionResult kısmının üstüne &lt;strong&gt;Authorize&lt;/strong&gt; sınıfından türettiğimiz Rolü de eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;[Authorize(Roles = &quot;Admin,User&quot;)]
public ActionResult Logout()
{
CookieCheck.ExpireAllCookies();
FormsAuthentication.SignOut();&lt;br /&gt;
return RedirectToAction(&quot;Login&quot;);
}&lt;/p&gt;
&lt;h5&gt;RoleProvider Classının Kullanımı&lt;/h5&gt;
&lt;p&gt;İlk olarak RoleManager kısmını eklememiz ve provider olarak da hangisini kullanacağımızı belirlemek için aşağıdaki kod bloğunu  System.config içerisine ekliyoruz.&lt;/p&gt;
&lt;p&gt;&amp;lt;roleManager enabled=&quot;true&quot; defaultProvider=&quot;myprov&quot;&amp;gt;
&amp;lt;providers &amp;gt;
&amp;lt;add name=&quot;myprov&quot; type=&quot;Monitoring.Models.UsersRoleProvider&quot;/&amp;gt;
&amp;lt;/providers&amp;gt;
&amp;lt;/roleManager&amp;gt;&lt;/p&gt;
&lt;p&gt;UsersRoleProvider adında bir adet class oluşturuyoruz. Ardından RoleProvider sınıfını kalıtımla içindeki metodları ekliyoruz. &lt;/p&gt;
&lt;p&gt;Rolleri oluşturmak için database üzerinden almamız gerektiğini söyledik. Bu rolün “Roles= “..”” şeklinde boş yeri doldurmamız gerekmektedir. Bunu da RoleProvider classından türeteceğimiz metodlarla sağlayacağız. Örneğin userın Rolünü öğrenmek için GetRolesForUser() metodunu kullanmamız gerekir. Bu metoda parametre olarak username’i string olarak verip database üzerinden Rol ataması gerçekleştiriyoruz.&lt;/p&gt;
&lt;p&gt;Authorize(Roles[]) kısmı çalıştığı sırada buradaki metoda düşüyor. O metodda da gidip database üzerinden rolü seçmemiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;public class UsersRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// db CHECK&lt;br /&gt;
string[] Roles=new string[1];&lt;br /&gt;
if (username==&quot;Berk&quot;)
{
Roles[0]= &quot;Admin&quot;;
}
else&lt;br /&gt;
{
Roles[0] = &quot;User&quot;;
}
if(Roles[0].ToString()!=null)&lt;br /&gt;
return Roles;
}&lt;br /&gt;
}&lt;/p&gt;
&lt;h2&gt;ValidateAntiForgeryToken Nedir ?&lt;/h2&gt;
&lt;p&gt;Bu metod da bizim controllerımızda bulunan action resultları korumaya yönelik bir yöntemdir. Nasıl çalışır. Öncelikle bir token oluşturulur ve o tokena bağlı olarak giriş izni verir veya vermez. Kullanımı için de controller başına ValidateAntiForgeryTokenAttribute daha sonra da view içerimize &lt;strong&gt;@Html.AntiForgeryToken()&lt;/strong&gt;   ekliyoruz. Artık yapmamız gereken bir şey kalmadı. Burada SQL injection gibi dışarıdan gelebilecek saldırılara karşı bir koruma yöntemi olarak düşünebilirsiniz. Post metodlarında kullanılmaktadır. Get metodunda dışarıdan bir veri gönderilmediği için ihtiyaç duyulmamaktadır.&lt;/p&gt;
&lt;p&gt;[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Control()
{
return View();
}&lt;/p&gt;
</content:encoded></item><item><title>ASP.NET MVC 5 Cookie Kullanımı</title><link>https://fuwari.vercel.app/posts/mvc-5-cookie-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/mvc-5-cookie-kullanimi/</guid><description>cookie Merhabalar bu yazımızda (cookie -çerezler) konusunda , web uygulamalarında sıkça karşımıza çıkan ve bir web gelişitirici için de olmazsa olmaz</description><pubDate>Mon, 13 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-696x748.png&quot; alt=&quot;C Logo - C# QrCode Generator Uygulaması (Logo eklenebilir)&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;cookie Merhabalar bu yazımızda (cookie -çerezler) konusunda , web uygulamalarında sıkça karşımıza çıkan ve bir web gelişitirici için de olmazsa olmaz konu olan cookie konusuna değineceğim. Session konusuna da farkları olarak değinip küçük bir login uygulaması geliştireceğiz. Böylece kavramlar kafamızda tam oturacak neyi geliştirdiğimizi bileceğiz.&lt;/p&gt;
&lt;p&gt;Çerezler bizlerin işlerini kolaylaştırılmak için geliştirilmiş kavramlardır. Bunlar bizim bilgilerimizi belirtilen süreler boyunca tutmaya yarayan yapılardır. Örneğin kullanıcının username bilgisini ile 1 ay boyunca tutmamız demek o kullanıcının username bilgisini tekrar sorup vakit kaybı yaşamadan direkt olarak gösterebiliriz.&lt;/p&gt;
&lt;p&gt;Çerezler sessiondan farklı olarak sunucu tarafında değil client tarafında tutulur. Browserlar aracılığıyla uygulamımıza giren kullanıcının bilgilerini o bilgisayarda küçük bir metin dosyası içinde tutarız.  Çerezler iki tipte bulunmaktadır. Bunlardan birisi kalıcı diğeri de geçici cookilerdir. Kalıcı olması için belirli bir süre expire date verilmelidir. Eğer verilmezse browser kapandığı zaman cookie de silinmektedir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cookilerin çalışma yapısı&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Çerezler sunucu tarafında değil kullanıcı tarafında çalıştırılır. Browser tarafından browserin cinsine göre farklı yapılarda tutulmaktadır.  Bu yüzden bir tarayıcıdaki çerez diğer tarayıcı da bulunmamaktadır.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Avantajlar ve Dezavantajları nelerdir&lt;/strong&gt; ?&lt;/h4&gt;
&lt;p&gt;Avantaj olarak sayabileceğimiz şeyler; kolay bir şekilde kullanılmaktadır ve client tarafında tutulduğu için sunucu üzerinde veriler tutulmamaktadır. Bu da sunucuyu rahatlatmaktadır.&lt;/p&gt;
&lt;p&gt;Dezavantajlar da şunlardır. Verilerde bir şifreleme olmadığı için güvenlik açığı oluşturur. Tarayıcıdan tarayıcıya göre farklılık göstermektedir. Boyut olarak 4 kB sınırı vardır.&lt;/p&gt;
&lt;h4&gt;Kullanım alanları nelerdir&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Sitelerin reklam bilgilerini saklaması için kullanılabilir&lt;/li&gt;
&lt;li&gt;Kullanıcı bilgileri Gerektiren durumlarda kullanılabilir&lt;/li&gt;
&lt;li&gt;Örneğin bir e ticaret sitesinde Sepet bilgileri için kullanılabilir&lt;/li&gt;
&lt;li&gt;Örneğimizle çerezler kavramını daha derinlemesine inceleyelim.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Cookie Örnek Uygulama&lt;/h2&gt;
&lt;h5&gt;Cookie Oluşturma&lt;/h5&gt;
&lt;p&gt;ASP.NET mvc de cookieler HttpContext sınıfı içerisinden türemektedir. Bu yüzden HttpCookie üzerinden çerezimizi tanımlıyoruz. Daha önce aynı isimli var ise Remove metoduyla siliyoruz. Yoksa yeni oluşturuyoruz. Pair key yapısıyla çalıştığı için adını veriyoruz ve value değeri neyse onu ekliyoruz. Ardından yukarıda bahsettiğim gibi eğer kalıcı istiyorsak bir Expire date ekliyoruz. Bu örnekte 10 günlük gibi bir süre ekliyoruz. Daha sonra da bu class üzerinden Add metoduyla ekliyoruz. Burada response metodunu kullanıyoruz yani bir sonucu döndürüyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    static public void CookieCreate(string cookiename, string value)
    {
        HttpCookie Cookie = null;
        if (HttpContext.Current.Response.Cookies\[cookiename\] != null)
        {
      HttpContext.Current.Request.Cookies.Remove(cookiename);
      HttpContext.Current.Response.Cookies\[cookiename\].Value = value;
      Cookie = HttpContext.Current.Response.Cookies\[cookiename\];
        }
        else { 
            //Yoksa oluşturuyoruz.
            Cookie = new HttpCookie(&quot;OrnekCookie&quot;);
        Cookie.Expires = DateTime.Now.AddDays(10);
        Cookie\[cookiename\] = value;
        }
        HttpContext.Current.Response.Cookies.Add(Cookie);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Cookie Çağırma&lt;/h5&gt;
&lt;p&gt;Bu metod da aynı classtan oluştuğu için aynı yapıda ismini verip çağırıyoruz. Burada request yani talep ediyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static public HttpCookie CookieGet(string cookiename)
    {
        if (HttpContext.Current.Request.Cookies\[cookiename\] != null)
            return HttpContext.Current.Request.Cookies\[cookiename\];
        else
            return null;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Cookie Silme&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;static public void CookieDelete(string cookiename)
    {
    HttpContext.Current.Response.Cookies\[cookiename\].Expires = DateTime.Now.AddYears(-1);
        HttpContext.Current.Request.Cookies.Remove(cookiename);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kaynak dosyasına buradan ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;Github Link&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Asp.Net-MVC-cookie-Example&quot;&gt;https://github.com/berkarat/Asp.Net-MVC-cookie-Example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Azure Devops Link&lt;br /&gt;
&lt;a href=&quot;https://dev.azure.com/berkarat930482/_git/Cookie%20Example%20MVC%205&quot;&gt;https://dev.azure.com/berkarat930482/_git/Cookie%20Example%20MVC%205&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CDN (Content Delivery Network) Nedir?</title><link>https://fuwari.vercel.app/posts/cdn-nedir/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/cdn-nedir/</guid><description>CDN (_Content Delivery Network_) bir içerik dağıtım ağı olup sitelerin perfromansı için olmazsa olmazdır. Büyük sitelerin hemen hepsinde karşınıza çık</description><pubDate>Fri, 10 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_01_cdn.png&quot;&gt;&lt;img src=&quot;/wp-images/2020_01_cdn-696x348.png&quot; alt=&quot;Cdn - CDN (Content Delivery Network) Nedir?&quot; title=&quot;cdn&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CDN (&lt;strong&gt;&lt;em&gt;Content Delivery Network&lt;/em&gt;&lt;/strong&gt;) bir içerik dağıtım ağı olup sitelerin perfromansı için olmazsa olmazdır. Büyük sitelerin hemen hepsinde karşınıza çıkıp sorun yaşamanızı engellemektedir.&lt;/p&gt;
&lt;p&gt;CDN Web sitelerinin performansını arttırmak aynı zamanda kaynak tüketimini de azaltmak için İçerik Dağıtım Ağı kullanılmaktadır. Statik içerikleri, istek gönderen kullanıcıya en uygun sunucudan göndererek hız ve trafik kullanımı açısından büyük bir kazanç sağlar. Bu statik içerikler genellikle sitedeki resimler, videolar,CSS dosyaları gibi içeriklerdir.&lt;/p&gt;
&lt;p&gt;Bu hizmet genellikle içerisinde çok fazla içerik barındıran veya trafik yoğunuluğu yüksek olan siteler için kullanılır. Az da olsa düşük trafikli siteler için de sunucu olarak kullanılabilmektedir. Sitelerde içerik sayısı arttıkça ya da istek sayısı sıklaştıkça performansta kayıplar kaçınılmazdır.Burada  hizmeti devreye girmekte ve performans sorununu çözüp sitenin hızını arttırabilirsiniz. Kısaca özetlersek web sitesinin en hızlı bir biçimde ve gecikmeyi minimize ederek kullanıcıya ulaştırmasını sağlayan çeşitli lokasyonlarda bulunan sunucu kümeleridir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_01_cdn.jpeg&quot; alt=&quot;Cdn - CDN (Content Delivery Network) Nedir?&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Nasıl Çalışır?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CDN web sitesine ulaşmak için tarayıcıya o sitenin adresini yazıp sitenin bulunduğu sunucuya bir istek göndeririz.Bu sitenin içeriklerinin barındığı bir sunucu vardır. Bu sunucu sizin  istek yaptığınız lokasyon ne kadar yakınsa, sunucuda ne kadar az trafik yoğunluğu varsa istek o kadar hızlı bir şekilde yanıtlanır. Aynı sunucudan çok fazla istekte bulunulduğu zaman donma hata verme gibi sorunların oluşması kaçınılmazdır.&lt;/p&gt;
&lt;p&gt;Bu sırada CDN çözümü devreye girmektedir. Sitenin içeriklerini tek bir sunucuda değil birden fazla sunucuda tutar ve cachleme işlemi yaptığından tekrar origin siteden içerik çekmez. Bu da en uygun lokasyonu ya da en az trafik olan yoldan isteğin yanıtlanmasını sağlar. Bu sayede ağda bir dengelenme olmuş ve bir yerin yoğunluk yaşayıp çökmesi gibi problem de ortadan kaldırılmış olur.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;CDN Çeşitleri Nelerdir ve Nasıl Kullanılır?&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pull &amp;amp; Push&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En yaygın kullanılanı Pull CDN’dir. Kullanımı için sitenizde bulunan statik içeriklerin kaynaklarını değiştirmenizle geçiş yapılacak. Kaynak değişimi için URL adreslerini yenisi ile değiştirmek gerekmektedir. Sunucu ilk isteği sizin web sunucunuz üzerinden otomatik çekecek ve ardından gelen istekler bu hizöeüzerinden yanıtlanacaktır.&lt;/p&gt;
&lt;p&gt;Push CDN için ise sağlayıcı tarafından verilmiş bir FTP alanına static içeriklerin yüklenmesi ile artık isteklerde sabit alanlar üzerinden yanıtlanacaktır.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VOD Pull &amp;amp; Push&lt;/strong&gt; &lt;strong&gt;CDN&lt;/strong&gt; &lt;strong&gt;(Video On Demand)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pull ve push Cdn  ile aynı şekilde çalışmaktadır. Ancak bu tür daha çok videolar için kullanılmaktadır. Örneğin e-spor yayını yapan siteler için bu türü kullanmak avantaj sağlamaktadır. Videoların optimizasyonu gibi ekstralar ile daha da performans sağlanmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hangi Durumlarda İhtiyaç Duyulur?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yukarıda bu sunucu kümelerinin daha çok sabit yapıların olduğu web sitelerinde kullanılmasının yanı sıra haber sayfaları e-ticaret siteleri gibi yüklenme süresinin de önemli olduğu sitelerde de kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Çalışma yapısı olarak bir kümeleme ağ yapısıdır. Bir tane origin olarak isimlendirdiği asıl sunucu bulunmakta ve ağlar esas gereken bilgileri buradaki sunucudan almaktadır. Bu bilgileri istenilen süreye bağlı olarak cacheler. Bu süre dolduğunda yeniden istek gönderilerek bilginin yenilenmesi sağlanır. Genellikle cacheleme işlemini yaptığı dosyaları da sıkıştırma işleminden geçirip optimize eder bu sayede performansa ek katkı sağlanmış olur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Hizmetlerden en çok yaralanan site tipleri şunlardır:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Haber Siteleri&lt;/li&gt;
&lt;li&gt;E-Ticaret Siteleri&lt;/li&gt;
&lt;li&gt;Online Oyun Hizmeti Veren Siteler&lt;/li&gt;
&lt;li&gt;Haberleşme Siteleri&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kurulumu hakkında bilgilendirici bir yazı&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://boraarat.com/wordpress-cdn-kurulumu/&quot;&gt;WordPress CDN Kurulumu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>Azure Cognitive Services FACE</title><link>https://fuwari.vercel.app/posts/cognitive-services-face/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/cognitive-services-face/</guid><description>Merhabalar bu konumuzda Azure Marketinde bulunan servislerin genel kullanımından servislerin yapısına biraz giriş yapacağım.</description><pubDate>Sun, 05 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2020_01_cognitive-service.png&quot;&gt;&lt;img src=&quot;/wp-images/2020_01_cognitive-service-696x348.png&quot; alt=&quot;Azure cognitive-service&quot; title=&quot;cognitive-service&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu konumuzda Azure Marketinde bulunan servislerin genel kullanımından servislerin yapısına biraz giriş yapacağım.&lt;br /&gt;
Azure portalda bulunan servisler bizlerin kullanması için hazır hale getirilmiş binlerce servis API bulunmaktadır. Bu servisleriden birisi olan FACE isimli servisin kullanımını ve örnek uygulamasını yapacağım. Bu gibi binlerce apilerin oluştuğu servislere Azure ortamında Cognitive Services adı verilmektedir. Market içerisinde bu şekilde arama yaparak da bulabiliriz.&lt;/p&gt;
&lt;p&gt;Face servisi bulut tabanlı olarak geliştirilmiş bir yüz tanıma sistemidir. Artık sıfırdan yüz tanıma sistemi yazmak onun eğitimlerini testlerini gerçekleştirmek günümüzde anlamını yavaş yavaş yitirmektedir. Çünkü bu uygulama bizim için bunları yapmaktadır.&lt;/p&gt;
&lt;h2&gt;Azure Cognitive Services Kullanımı&lt;/h2&gt;
&lt;p&gt;Bu servisler bizim kullanınımımız için markette mevcutlar. Bunun için bir azure hesabınız olmalıdır. Hesap oluşturmak için &lt;a href=&quot;https://azure.microsoft.com/tr-tr/free/&quot;&gt;https://azure.microsoft.com/tr-tr/free/&lt;/a&gt; bu linki tıklayarak oradan üyelik oluşturmanız gerekmektedir. İlk 12 ay boyunca ücretsiz kullanma imkanı sağlıyor. Benim de göstermiş olacağım uygulamaları da bu sayede gerçekleştirebiliriz.&lt;/p&gt;
&lt;h4&gt;Azure Cognitive Services Face&lt;/h4&gt;
&lt;p&gt;Markete ve birçok diğer şeylere ulaşmak için azure portal içerisine girmemiz gerekmektedir. Bu portala girdikten ve login olduktan sonra karşımızda solda Create Resource yani kaynak oluşturmamız gereken yeşil artı işaretine tıklıyoruz ve market açılıyor. Bu markette search kısmında Face uygulamasını aratıyoruz. Ardından Create diyerekp aşağıdaki var olan boşlukları doldurup ilerliyoruz ve finish diyerek oluşturuyoruz.&lt;/p&gt;
&lt;p&gt;Bu işlemleri başarılı gerçekleştirdikten sonra artık bu servisi kullanabilmekteyiz. Bizim bu servisi kullanmamız için bir KEY ve API point veriyor. Bu key sayesinde uygulamamıza entegrasyon işlemlerini gerçekleştireceğiz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_01_azure-cognitive-services-Faceapp-1024x483.png&quot; alt=&quot;Azure Cognitive Services Faceapp - Azure Cognitive Services FACE&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_01_azure-cognitive-services-Face-1024x631.png&quot; alt=&quot;Azure Cognitive Services Face - Azure Cognitive Services FACE&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2020_01_azure-cognitive-services--1024x580.png&quot; alt=&quot;Azure Cognitive Services - Azure Cognitive Services FACE&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://%20https://azure.microsoft.com/tr-tr/features/azure-portal/&quot;&gt;http:// https://azure.microsoft.com/tr-tr/features/azure-portal/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Artık projemizi oluşturma kısmına geçebilriz. Visual Studio üzerinden console app oluşturuyoruz. Ardından aşağıdaki kod bloğunu uyguluyoruz. Bu kod bloğunda bir api çağırma işlemi yapıyoruz. Header kısmına subscriptionKey yazıyoruz. Daha sonra istediğimiz request parametreleri de yazıyoruz. Bunlar içerisinde saç rengi göz rengi cinsiyet yaş gibi özellikler de var. Ardından apiye resmimizi byteData haline çevirip gönderdikten sonra gelen bilgiyi de json olarak elde ediyoruz.&lt;/p&gt;
&lt;p&gt;Genellikle doğru sonuçlara ulaşşa da bazen hata yapabilmektedir. Ancak bunların gelişmesiyle birlikte çeşitli projeler uygulanabilirlik artmakta ve başka fikirlerle birleştirilerek daha büyük projelerde cognitive services kullanabiliriz.&lt;/p&gt;
&lt;p&gt;Projeye dair örnek uygulamayı github ve azure repos linkleri aşağıdadır.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Azure-Cognitive-Services-Face&quot;&gt;https://github.com/berkarat/Azure-Cognitive-Services-Face&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.azure.com/berkarat93/_git/Azure-Cognitive-Services-Face&quot;&gt;https://dev.azure.com/berkarat93/_git/Azure-Cognitive-Services-Face&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jquery  Virtual Keyboard Kullanımı</title><link>https://fuwari.vercel.app/posts/jquery-virtual-keyboard/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/jquery-virtual-keyboard/</guid><description>Merhabalar bu yazımızda html ve js kullanarak virtual keyboard oluşturup bu keyboard ile inputlara bilgiler gireceğiz. Virtual keyboard windowslarda i</description><pubDate>Tue, 12 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Merhabalar bu yazımızda html ve js kullanarak virtual keyboard oluşturup bu keyboard ile inputlara bilgiler gireceğiz. Virtual keyboard windowslarda işletim sisteminde bulunmaktadır ancak bu programın içinde gömülü olmadığından pek efektif kullanım sağlamamaktadır.&lt;/p&gt;
&lt;p&gt;Bir diğer konu da günümüzde dokunmatik ekranlarda html tasarımları yapıp üstüne virtual keyboard eklentisi yapmakta. Genel araştırmalarım sonucunda internette de bolca bulunan standart Jquery kütüphaneleri iş görmektedir. Ancak benim bahsetmek istediğim konu :&lt;/p&gt;
&lt;h2&gt;Aynı virtual keyboard ile birden fazla inputa bilgi girmek.&lt;/h2&gt;
&lt;p&gt;Bu yüzden her zamanki gibi örnek üzerinden başlayacağım. virtual keyboard anlatımında kodların ne işe yaradıkları neler yapılacağı gibi açıklamalar yapacağım.&lt;/p&gt;
&lt;p&gt;HTML sayfa yapısını kurmak için öncelikle aşağıdaki gibi bir kod bloğuna ihtiyacımız var. Ardından inputları bootstrap 4.3.1 ile birlikte kullanıyoruz. Aynı zamanda Jquery de kullanacağımız için link olarak eklememiz gerekmektedi. Sadece aşağıdaki linkleri eklesek yeterli ilk etap olarak.&lt;br /&gt;
Bunlar jquery ve bootstrap için yeterlidir.&lt;/p&gt;
&lt;p&gt;Daha fazla bilgi için bootstrap yazımı incelemenizi tavsiye ederim.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/bootstrap-1/&quot;&gt;Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Kaynak : &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;https://getbootstrap.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;Ardından inputları ekleme yapıyor. Bunun için tekrar tasarım yapmamıza gerek yok. Burada tasarımdan ziyade asıl konu virtural keyboard tarafına yoğunlaşmamız gerekli. O yüzden bootstrap üzerinden aldığımız input gruplarını düzenleyip divlerin arasına ekleyeceğiz. Bunun için bir adet örnek yeterlidir. Diğerlerini birbirinin tekrarı olarak eklerseniz bir problem olmaz. Sadece aynı ID ile farklı elementlerin olmamasına dikkat etmeniz yeterlidir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;div class=&quot;input-group &quot;&amp;gt;
        &amp;lt;div class=&quot;input-group-prepend&quot;&amp;gt;
          &amp;lt;span class=&quot;input-group-text&quot;   id=&quot;inputGroup-sizing-default&quot;&amp;gt;ADINIZ&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;input id=&quot;name&quot; type=&quot;text&quot; class=&quot;virtualKeyboard form-control&quot; aria-label=&quot;Default&quot;  aria-describedby=&quot;inputGroup-sizing-default&quot;&amp;gt;
      &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ardından keyboard kısmına yavaş yavaş geçiyoruz. Bir div içerisine “virtualKeyboard” class ile keyboard ekleme işlemini yapıyoruz&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;container-fluid&quot; style=&quot;height: 120px;&quot;id=&quot;keybd&quot; &amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;Şimdi son olarak 1-2 script daha ekledikten sonra script geçme işlemine başalayacağız. Bu ekleyeceğimiz scriptleri yazacağız.&lt;/p&gt;
&lt;p&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;./virtualKeyboard.css&quot;&amp;gt;    &amp;lt;script src=&quot;./virtualKeyboard.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;  $(&apos;.virtualKeyboard&apos;).vkb();&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;Yukarıdaki eklemelerle “virtualKeyboard.js” adındaki script dosyası bizim keyboard işlemimizi yapacak asıl görevli script. “virtualKeyboard.css” ise keyboard tarafında görünürlüğün css dosyasıdır. “$(‘.virtualKeyboard’).vkb()” metodunu sayfa yüklendiğinde çalışır.&lt;/p&gt;
&lt;p&gt;Gelelim şimdi artık Script dosyasını yazmaya. html dosyamızla aynı dosya yolunda bir tane “virtualKeyboard.js” adında bir javascript dosyası oluşturalım. Yazacağımız jQuery Kütüphanesi olduğu için aşağıdaki fonksiyonun içerisinde çalışacaktır.&lt;/p&gt;
&lt;p&gt;(function($){
...JQUERY KODUMUZU BURAYA EKLEYECEĞİZ ...
})(jQuery);&lt;/p&gt;
&lt;p&gt;Baştan sona adım adım gideceğimiz yöntemde ilk olarak çağırdığımız fonksiyonu yazmalıyız. Bu fonksiyonda neler olması gerektiği altta yazılıdır.&lt;/p&gt;
&lt;p&gt;function Vkb(element, options) {
this.config = $.extend({}, defaults, options);
this.element = element;
this.init();
}
$.fn.vkb = function (options) {
new Vkb(this, options);
return this;
}&lt;/p&gt;
&lt;p&gt;Default olarak genel classlarımızı yazalım.&lt;/p&gt;
&lt;p&gt;var defaults = {
styleClassParentInput: &apos;vkb-css-parent-input&apos;,
styleClassKeyboardIcon: &apos;vkb-css-keyboard-icon&apos;,
srcKeyboardIcon: &apos;image/keyboard.gif&apos;
};&lt;/p&gt;
&lt;p&gt;Artık bu işlem ile bir çok adımın ön planını yaptık. Şimdi keyboard template dediğimiz kısmı yani butonların olacağı yerleri ekleyeceğiz. Burada isteyen sadece numeric isteyen büyük küçük harf gibi seçenekler de ekleyebilir. Ben ortalama bir template ekleyeceğim.&lt;/p&gt;
&lt;p&gt;var virtualKeyboard = {
template: &apos; &amp;lt;div  id=&quot;vkb-js-keyboard&quot;   class=&quot;vkb-css-hide&quot;&amp;gt;&amp;lt;div class=&quot;vkb-css-background vkb-js-close&quot; &amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;vkb-css-keyboard-box&quot; &amp;gt;    &amp;lt;div class=&quot;vkb-css-button-box&quot;&amp;gt;            &amp;lt;div class=&quot;vkb-css-button-line&quot;&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;1&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;2&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;3&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;4&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;5&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;6&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;7&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;8&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;9&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;0&amp;lt;/button&amp;gt;      &amp;lt;button type=&quot;button&quot; id=&quot;vkb_8&quot;&amp;gt;SİL&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;  &amp;lt;div class=&quot;vkb-css-button-line&quot;&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;Q&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;W&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;E&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;R&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;T&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;Y&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;U&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;İ&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;O&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;P&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;  &amp;lt;div class=&quot;vkb-css-button-line&quot;&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;A&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;S&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;D&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;F&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;G&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;H&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;J&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;K&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;L&amp;lt;/button&amp;gt; &amp;lt;/div&amp;gt;  &amp;lt;div class=&quot;vkb-css-button-line&quot;&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;Z&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;X&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;C&amp;lt;/button&amp;gt;  &amp;lt;button type=&quot;button&quot;&amp;gt;Ç&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;V&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;B&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;N&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot;&amp;gt;M&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;vkb-css-button-line&quot;&amp;gt; &amp;lt;button type=&quot;button&quot;id=&quot;vkb_close&quot;&amp;gt;VAZGEÇ&amp;lt;/button&amp;gt; &amp;lt;button type=&quot;button&quot; id=&quot;vkb_success&quot;&amp;gt;TAMAM&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&apos;
...
}&lt;/p&gt;
&lt;p&gt;Burada template sonrası metodları da ekleyeceğiz.Örneğin butonların her birine tıkladığımızda inputlara yazması gerekli onun için de aşağıdaki metodu kullanacağız. Burada özel olarak tırnak space gibi butonlar için de ekstra butonlar ekleyip classlar verebilirsiniz. Aşağıda switch case işlemini gösterdim. Eğer özel butonlar dışında bir butona tıklarsanız en altta default olarak bulunan “pasteSymbolInPosition” metodu çağırılacak. Tıklanan butonun da içeriği inputa yazılacak.&lt;/p&gt;
&lt;p&gt;cClickSymbolButton: function (e) {&lt;br /&gt;
return function (e) {&lt;br /&gt;
e.currentTarget
switch($(e.currentTarget).attr(&apos;id&apos;)) {
case &quot;vkb_close&quot;:
this.keyboard.hide();
this.source.val(&apos;&apos;);
break
case &quot;vkb_success&quot;:
this.source.val(this.source.val());&lt;br /&gt;
break
default:
this.pasteSymbolInPosition($(e.currentTarget).html());&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;            }
        }
    },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Şimdi de ekrana yazdığımız kısmı ekleyelim. Burası nispeten daha karışık bir yer. Ancak yapılanı anlatacağım için çok da karışık gelmeyeceğini düşünüyorum. İlk olarak kod bloğunu aşağı ekleyeyim altında da açıklamasını yaparım.&lt;/p&gt;
&lt;p&gt;pasteSymbolInPosition: function (symbol) {
var selectionStart = (!symbol.length &amp;amp;&amp;amp; this.source[0].selectionStart === this.source[0].selectionEnd &amp;amp;&amp;amp; this.source[0].selectionStart !== 0) ? this.source[0].selectionStart - 1 : this.source[0].selectionStart; // 0 1 2 3 4 5
var part1 = this.source.val().slice(0, selectionStart); // 0 dan son rakama kadar
var part2 = this.source.val().slice(this.source[0].selectionEnd, this.source.val().length);
this.source.val(part1+ symbol + part2);
this.setCursorPosition(selectionStart + symbol.length+1); // cursoru sona gelir
this.source.focus();
}&lt;/p&gt;
&lt;p&gt;Burada “selectionStart” dediğimiz kısım bizim harfi nereye ekleyeceğimiz cursor nerede yani. Başı ve sonu ortası gibi yerleri bulmamıza yarayan küçük bir if else bloğu bulunmakta bu selectionStart bize 0,1,2,3… gibi pozisyon bilgileri vermektedir.&lt;/p&gt;
&lt;p&gt;part1 ve part2 dediğimiz kısımlar ise bize eğer cursor ortada bir yerde ise işimize yarar. Örnek vermek gerekirse PARİS kelimesini ele alalım&lt;/p&gt;
&lt;p&gt;Eğer cursor başta ise part1=”” , part2=kelime uzunluğu kadar yani “PARİS”&lt;br /&gt;
Eğer cursor A’dan sonra ise part1=”PA” part2=”RİS” olacak&lt;br /&gt;
Eğer cursor sonda bulunuyorsa da part1=”PARİS” part2=”” olacaktır.&lt;/p&gt;
&lt;p&gt;Yukarıdaki örnekten anlaşılacağı gibi sonuç olarak bize tıkladığımız harfin yerini buluyoruz. Daha sonra da this.source dediğimiz yani inputumuzun value değerini değiştirmiş oluyoruz ve cursor pozisyonunu +1 arttırıyoruz.&lt;/p&gt;
&lt;p&gt;En son olarak da init işlemini açıklayacağım&lt;/p&gt;
&lt;p&gt;Vkb.prototype.init = function () {
this.element.addClass(this.config.styleClassParentInput);
$(&apos;#keybd&apos;).append(virtualKeyboard.template);
virtualKeyboard.keyboard = $(&apos;#vkb-js-keyboard&apos;);
virtualKeyboard.input = $(&apos;#vkb-js-input&apos;);
$(&apos;#vkb-js-keyboard button&apos;).on(&apos;click&apos;, $.proxy(virtualKeyboard.clickSumbolButton(this), virtualKeyboard));&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    $(&apos;&amp;lt;img/&amp;gt;&apos;,{
        alt: &apos;Keyboard&apos;,
        src: this.config.srcKeyboardIcon,
        class: this.config.styleClassKeyboardIcon + &apos; vkb-js-key&apos;
    })
        .insertAfter(this.element)
        .on(&apos;click&apos;, function(e) {
            virtualKeyboard.show($(e.currentTarget).prev(&apos;input&apos;));
            $(&apos;#vkb-js-input&apos;).val($(e.currentTarget).prev(&apos;input&apos;).val()).focus();

        });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada en başta “keybd” idsi ile verdiğimiz dive append yani sonuna ekleme yaparak keyboard templatmizi ekliyoruz. Ardından &amp;lt;img&amp;gt; ile bir resim dosyası ekliyoruz ki tıklanıldığında keyboarda açılıp kapansın.&lt;/p&gt;
&lt;p&gt;Burada işlemlerimiz şimdilik bu kadar buna ek olarak css bilgilerini de vereceğim linkte bulabilirsiniz. Ancak css bilgilerini kendi keyfinize göre de yapabilirsiniz.&lt;/p&gt;
&lt;p&gt;Buraya kadar okuduğunuz için teşekkür ederim umarım faydalı bir yazı olmuştur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Github Link :&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/berkarat/Jquery-Virtural-Keyboard-&quot;&gt;https://github.com/berkarat/Jquery-Virtural-Keyboard-&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azure Link :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://berkarat93.visualstudio.com/Jquery%20Virtural%20Keyboard&quot;&gt;https://berkarat93.visualstudio.com/Jquery%20Virtural%20Keyboard&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>ASP.NET Core Repository Kavramı</title><link>https://fuwari.vercel.app/posts/dotnet-core-repository/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/dotnet-core-repository/</guid><description>Daha önce bahsettiğim .Net projesinin devamı olan bu yazıda repository oluşturmadan bahsedip bunun içerisine önce statik yapıda bir repository oluştur</description><pubDate>Sat, 20 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_07_net-core.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2019_07_net-core.jpg&quot; alt=&quot;asp.net&quot; title=&quot;asp.net core&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Daha önce bahsettiğim .Net projesinin devamı olan bu yazıda repository oluşturmadan bahsedip bunun içerisine önce statik yapıda bir repository oluşturacağız. Ardından dinamik olması açısından Generic kavramından bahsedeceğim. İlk olarak bu kavramın ne olduğundan bahsetmem gerek. Ardından da uygulamaya kaldığı yerden devam edebiliriz.&lt;/p&gt;
&lt;h2&gt;Repository Nedir?&lt;/h2&gt;
&lt;p&gt;Artık database oluşturma işlemini gerçekleştirdik ve sıra geldi yapmak istediğimiz işlemlere. Bu işlemler ekleme edit veya update gibi standart işlemler olabilir veya daha spesifik sorgular olabilmektedir. Bu sebeple yani depolama alanları oluşturmamız bizim için daha dinamik bir kullanım yaratmaktadır. Her controller için tekrar aynı sorguları yasmak performans açısından hayli olumsuz etkilere yol açacaktır.&lt;/p&gt;
&lt;p&gt;Repository kelimesi havuz depo olarak da kullanılmaktadır. Biz de burada metodlarımızı depolayacağımız bir alan olarak kullanacağız.Bunun için Repositorys adında bir klasör tanımlıyoruz. Ardından bu klasörün içerisine Abstract ve Concrete adında iki kasör oluşturuyoruz.&lt;/p&gt;
&lt;h3&gt;Abstract Repository&lt;/h3&gt;
&lt;p&gt;Bu klasör altında bir adet interface tanımlayacağız. &lt;strong&gt;&lt;em&gt;IProductRepository&lt;/em&gt;&lt;/strong&gt; adında bir interface tanımladım. Burada kullanacağımız metodları tanımlıyoruz.&lt;/p&gt;
&lt;p&gt;Ardından Concrete klasörü altından &lt;strong&gt;&lt;em&gt;EfProductRepository&lt;/em&gt;&lt;/strong&gt; adında bir class tanımlıyoruz. Bu class içerisine IProductRepository interface üzerinden kalıtım işlemi yapıyoruz. Böylece metodlar içerisine eklenmiş oluyor.&lt;/p&gt;
&lt;p&gt;İlk adım olarak db bağlantımızı sağlayacak context nesnesini constructor içerisinden alıyoruz.Bu context ile işlemlerimizi gerçekleştireceğiz.&lt;/p&gt;
&lt;p&gt;private AppDbContext context;
public EfProductRepository(AppDbContext _context)
{
context = _context;
}&lt;/p&gt;
&lt;h2&gt;Generic Repository&lt;/h2&gt;
&lt;p&gt;Yukarıda bahsetiğimiz yapı static olarak oluşan depolardı. Benzer şekilde kategori tablosu yaratıp kullansaydık yine add delete gibi işlemler gerçekleştireceğiz. Bu sebeple tekrara düşmemek için Generic bir repository kavramından yola çıkarsak her yerde kullanabiliriz.&lt;/p&gt;
&lt;p&gt;Generic türünde sınıf için ilk olarak &amp;lt;T&amp;gt; tipinde bir interface tanımlaması yapmamız gerekir.&lt;/p&gt;
&lt;p&gt;public interface IGenericRepository&amp;lt;T&amp;gt; where T:class //class tipinde
{
T GetAll();
}&lt;/p&gt;
&lt;p&gt;Benzer şekilde Concrete klasörüne de bu interfaceden türetilmiş bir EfGenericRepository adında bir class tanımlarız. Bu class da generic tipinde olması gerekmktedir. Artık elimizde bir generic yapıda olan repositorymiz var bunu controller içerisinden kullanabiliriz. Kullanımı aşağıdaki gibidir.&lt;/p&gt;
&lt;p&gt;public class EfGenericRepository&amp;lt;T&amp;gt; : IGenericRepository&amp;lt;T&amp;gt; where T : class
{
protected readonly DbContext context;
public EfGenericRepository(DbContext ctx)
{
context = ctx;
}
public IQueryable&amp;lt;T&amp;gt; GetAll()
{
return context.Set&amp;lt;T&amp;gt;();
}
}&lt;/p&gt;
&lt;h2&gt;IUnitOfWork Kavramı&lt;/h2&gt;
&lt;p&gt;Bu kavramda aslında bir controllerda kullanılan birden fazla repositoryleri birlikte kullanımında kullanılır. Bunun için IUnitOfWork tipinde bir interface yaratıp bunun içerisine diğer Repositoryleri tanımlayıp çağırıyoruz. Bu bize böylece ortak metodları bir nesne içerisinde çağırma imkanı sağlamaktadır.&lt;/p&gt;
&lt;p&gt;public interface IUnitOfWork: IDisposable
{
ICategoryRepository Categories { get; }
IProductRepository Products { get; }
}&lt;/p&gt;
&lt;p&gt;public class EfUnitOfWork : IUnitOfWork
{
private readonly EduraContext dbContext;
public EfUnitOfWork(EduraContext _dbContext)
{
dbContext = _dbContext;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    }
    private IProductRepository \_products;
    private ICategoryRepository \_categories;
    public ICategoryRepository Categories
    {
        get
        {

            if (\_categories == null)
            {
                \_categories = new EfCategoryRepository(dbContext);
            }
            return \_categories;
        }
    }

    public IProductRepository Products
    {
        get
        {
            if (\_products == null)
            {
                \_products = new EfProductRepository(dbContext);
            }
            return \_products;
        }
    }
     
    public void Dispose()
    {
        dbContext.Dispose();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kaynak Kod : &lt;a href=&quot;https://github.com/berkarat/.NetCore-EntityFramework-Example&quot;&gt;https://github.com/berkarat/.NetCore-EntityFramework-Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>ASP.NET CORE Entity FrameWork Kullanımı</title><link>https://fuwari.vercel.app/posts/dotnet-entity-framework/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/dotnet-entity-framework/</guid><description>Merhabalar bu yazımızda ASP.Net core işlemlerinde database işlemlerini yapacağız. Bunun için Microsoft Entity Framework kullanacağız. Bu yüzden önceli</description><pubDate>Fri, 19 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_07_net-core.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2019_07_net-core.jpg&quot; alt=&quot;asp.net&quot; title=&quot;asp.net core&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda ASP.Net core işlemlerinde database işlemlerini yapacağız. Bunun için Microsoft Entity Framework kullanacağız. Bu yüzden öncelikle bu Framework’ün ne olduğundan bahsedeceğim. Bu framework veritabanı ile programımızın arasındaki katmandır. Bu katman sayesinde veritabanında karmaşık sorgular yazmamızın önüne geçiliyor. Ado.Net teknolojisini kullanmaktadır. &lt;/p&gt;
&lt;p&gt;Bizim örneğimizde ise database işlemleri için Models Repositoryler gibi işlemleri adım adım yapacağız.&lt;br /&gt;
Entity Framework yapısında birden farklı şekilde database işlemleri gerçekleşebilir. Ben en sık kullanılan ve güncel olan yöntemi kullanacağım bunun için Code First yöntemini kullanacağız.&lt;/p&gt;
&lt;h3&gt;Entity FrameWork Kullanarak Tabloların Oluşturulması&lt;/h3&gt;
&lt;p&gt;İlk adım olarak modelimizi oluşturuyoruz. Burada oluşturduğumuz model veritabanında tabloyu ifade etmektedir. İçerisindekiler ise sütunları oluşturacaktır.&lt;/p&gt;
&lt;p&gt;Not: Tanımlama yaparken Classadı+Id olarak belirlediğimiz property otomatik olarak algılanım ID olarak tanımlanır.&lt;/p&gt;
&lt;p&gt;public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public double Price { get; set; }
}&lt;/p&gt;
&lt;p&gt;Modeli oluşturduktan sonra veritabanı ile henüz bir bağlantı gerçekleştirmedik. Bu işlem için DbContext sınıfından bir Entity oluşturmamız gerekir. Models klasörüne aşağıdaki AppDbContexti tanımlıyoruz. Burası bizim veritabanı ile iletişimi sağlayacak context nesnemizi oluşturacak.&lt;/p&gt;
&lt;p&gt;public class AppDbContext:DbContext
{
public AppDbContext(DbContextOptions&amp;lt;AppDbContext&amp;gt; options):base(options)
{
}
public DbSet&amp;lt;Product&amp;gt; Products { get; set; }&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu classı oluşturduktan sonra  başlangıçta bu dbcontexti tanımlamamız gerekmektedir. Bu yüzden Startup.cs dosyası içerisinde ConfigureServices fonksiyonu içine aşağıdaki satırı eklememiz gerekmektedir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        services.AddDbContext&amp;lt;AppDbContext&amp;gt;(options =&amp;gt; options.UseSqlServer(Configuration.GetConnectionString(&quot;DefaultConnection&quot;)));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada DefaultConnection kısmını ise appsettings.json dosyasının içerisinden alıyoruz. Karışık gibi dursa bile uygulayınca kolaylaşıyor.Özet olarak diğer bağlantı yöntemlerinde olduğu gibi connectionstringini contextimizin içine ekleyip bağlantı kurmuş oluyoruz.&lt;/p&gt;
&lt;p&gt;Ardından tablolarımız için gerekli bazı ayarları yapmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;Projeye sağ tıklayıp EditProjectFiles üzerinden aşağıdaki dotnet toolunu eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;&amp;lt;DotNetCliToolReference Include=&quot;Microsoft.EntityFrameWorkCore.Tools.Dotnet&quot; Version=&quot;2.0.0&quot;&amp;gt;&amp;lt;/DotNetCliToolReference&amp;gt;&lt;/p&gt;
&lt;p&gt;Ardından tablomuza başlangıçta veri eklemek için SeedData isminde bir class oluşturuyoruz. Burada bir AppDbContext üzerinden bir context nesnesi oluşturuyoruz. Yukarıda dediğim gibi bizim database ile bağlantı ve işlemlerimizi sağlayacak.&lt;/p&gt;
&lt;p&gt;Ardından Migrate  metodunu çağırıyoruz. Eğer bekleyen bir migration işlemi varsa onu gerçekleştiriyor ardından database boş ise verileri ekliyoruz.&lt;/p&gt;
&lt;p&gt;Daha sonra bu Seed metodu bizden IApplicationBuilder nesnesi beklediği için Startup.cs içerisinden app nesnesini iletiyoruz. Ardından savechanges metodu ile işlemimizi kaydediyoruz.&lt;/p&gt;
&lt;p&gt;Bu işlemler sonrasında migration çalıştırmamız gerekmekte. Bunun için projeye sağ tıklayıp dosya yoluna gideriz.Bu dosya yoluna “cmd” yazıp enter dediğimizde karşımıza komut satır ekranı çıkacak. Bu satır ekranına aşağıdaki komutu yazdığımızda migration eklenecek ve proje çalıştırdığımızda tablolar oluşturulmuş ve içerikleri doldurulacaktır.&lt;/p&gt;
&lt;p&gt;dotnet ef migrations add &quot;migrationname&quot;&lt;/p&gt;
&lt;p&gt;Bu işlemi kontrol etmek için sol tarafta SQL Server Object Explorer üzerinden tablomuzun durumunu görebiliriz. Buraya kadar projemize tablo ekleyip migration oluşturduk ve temel işlemleri gerçekleştirdik. Bundan sonraki yazımda repository kavramından bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Kaynak Kod : &lt;a href=&quot;https://github.com/berkarat/.NetCore-EntityFramework-Example&quot;&gt;&lt;em&gt;https://github.com/berkarat/.NetCore-EntityFramework-Example&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Asp.NET Core ViewComponents Kullanımı</title><link>https://fuwari.vercel.app/posts/asp-net-core-viewcomponents-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/asp-net-core-viewcomponents-kullanimi/</guid><description>Merhabalar bu yazımızda MVC ViewComponents konusundan bahsedeceğim. View Component ASP.Net Core ile kullanılmaya başlamıştır. Daha önce ASP  .Net MVC</description><pubDate>Thu, 18 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_07_net-core.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2019_07_net-core.jpg&quot; alt=&quot;asp.net&quot; title=&quot;asp.net core&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda MVC ViewComponents konusundan bahsedeceğim. View Component ASP.Net Core ile kullanılmaya başlamıştır. Daha önce ASP  .Net MVC de partial viewlere benzemektedir. Ancak daha performanslı çalışmaktadır ve güncel olanıdır. Bu yüzden bu konuya değineceğim ve bir örnek yapacağız.&lt;/p&gt;
&lt;p&gt;Neden partial view değil de ViewComponents kullanırız ? Çünkü daha performanslıdır. Dışarıdan url üzerinden erişilemez. Test etmesi ve derlenmesi daha kolaydır.&lt;/p&gt;
&lt;h4&gt;Nerelerde kullanılır ?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Menüler&lt;/li&gt;
&lt;li&gt;Login Panelleri&lt;/li&gt;
&lt;li&gt;E ticaret Sitelerinin sepetleri&lt;/li&gt;
&lt;li&gt;Sidebarlar gibi bir çok yerde kullanmaktadır.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu sayede tekrardan kurtulmuş oluruz ve her seferinde  view oluşturup eklemek yerine 1 satırlık kod ile işimizi halledebilmekteyiz.&lt;/p&gt;
&lt;h2&gt;Uygulamaya Giriş&lt;/h2&gt;
&lt;p&gt;Yapacağımız Bu örnekte 2 adet sayfam olacak ve 1 tane Component View oluşturacağım. Bu parçayı iki sayfada da kullanımını göstereceğim. Yalın bir anlatım olacağı için fazla detaya boğmayacağım.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_asp.net_-1024x710.png&quot; alt=&quot;Asp.net - Asp.NET Core ViewComponents Kullanımı&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_viewcomponents-1024x710.png&quot; alt=&quot;Viewcomponents - Asp.NET Core ViewComponents Kullanımı&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_viewcomponents-mvc-1024x710.png&quot; alt=&quot;Viewcomponents Mvc - Asp.NET Core ViewComponents Kullanımı&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;İlk olarak bir  adet MVC CORE projesi oluşturuyoruz. Daha sonra Modellerimizi oluşturuyoruz.&lt;/p&gt;
&lt;p&gt;public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}&lt;/p&gt;
&lt;p&gt;Burada Products ve Categories olarak 2 adet modelimiz bulunmaktadır. Bu iki modeli de aynı sayfada kullanmak için ortak bir model daha oluşturmamız gerekmektedir. ProductCategory adında bir class oluşturup Liste tipinde product ve category modellerimizi içine ekliyoruz. Bu işlemin adı da “ NAVIGATION PROPERTY “ olarak geçmektedir. Ortak tablo oluşturmak gibi düşünebiliriz.&lt;/p&gt;
&lt;p&gt;Modellerimizi oluşturduktan sonra  yeni bir Repository adında bir klasör bu klasörün içine de &lt;strong&gt;Abstract&lt;/strong&gt; ve &lt;strong&gt;Entity&lt;/strong&gt; adında 2 adet yeni klasör oluşturuyoruz. İlk olarak Abstract klasörünün içerisine   &lt;strong&gt;IProductRepository&lt;/strong&gt; ve &lt;strong&gt;ICategoryRepository&lt;/strong&gt;  adında 2 tane interface tanımlıyoruz. Bu interfaceler içerisine yapacağımız işlemleri (Get, Edit,Add) sadece method olarak ekliyoruz.&lt;/p&gt;
&lt;p&gt;public  interface IProductRepository
{&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   IEnumerable&amp;lt;Product&amp;gt; Products { get;  }

    void AddProduct(Product product);
    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sonraki adım olarak entity klasörüne de 2 adet  &lt;strong&gt;EfProductRepository&lt;/strong&gt; ve &lt;strong&gt;EfCategoryRepository&lt;/strong&gt; adında iki adet class oluşturuyoruz. Bu classlar içerisinde interface üzerinden kalıtım işlemi yaparak methodlarımızı alıyoruz. Aynı zamanda ben burada modellerin içerilerini de doldurdum. Daha sonra bu işlemleri database üzerinden yapacağız. Şimdilik yalın olması açısından elimizde veriler hazır olacak.&lt;/p&gt;
&lt;p&gt;public class EfProductRepository : IProductRepository
{
List&amp;lt;Product&amp;gt; _products = new List&amp;lt;Product&amp;gt;()
{
new Product(){Name=&quot;Computer&quot;,Price=2250},
new Product(){Name=&quot;Camera&quot;,Price=500},
new Product(){Name=&quot;Monitor&quot;,Price=1250},
new Product(){Name=&quot;Mouse&quot;,Price=50},
};&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public IEnumerable&amp;lt;Product&amp;gt; Products =&amp;gt; \_products;

    public void AddProduct(Product product)
    {
        \_products.Add(product);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada dikkat etmemiz gereken nokta Startup.cs dosyası içerisinde ConfigureServices alanına aşağıdakileri eklememiz gerekmektedir. Bu işleme de &lt;strong&gt;Depency Injection&lt;/strong&gt; denmektedir.&lt;/p&gt;
&lt;p&gt;services.AddSingleton&amp;lt;IProductRepository, EfProductRepository&amp;gt;();
services.AddSingleton&amp;lt;ICategoryRepository,EfCategoryRepository&amp;gt;();&lt;/p&gt;
&lt;p&gt;Bu sayede örneğin &lt;strong&gt;IProductRepository&lt;/strong&gt; çağırıldığı zaman &lt;strong&gt;EfProductRepository&lt;/strong&gt; classının çağrılacağını söylemiş bulunuyoruz.&lt;/p&gt;
&lt;h2&gt;ViewComponents Oluşturma&lt;/h2&gt;
&lt;p&gt;Sıra geldi Component classımızı oluşturmaya burada Components adında bir yeni klasör daha açıyoruz. Ardından içerisine CategoryMenu adından bir class oluşturuyoruz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ComponentViewinin dışarıdan alacağı modeli burada gönderiyoruz. Bu sebeple bu classın adıyla daha sonra View Kısmında oluşturacağımız klasörün aynı olması gerekmektedir aksi halde hata ile karşılaşılmaktadır.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Burada ViewComponents oluşturma işlemini kalıtım kullanarak yapıyoruz. Diğer yöntemler ise,  ViewComponents Attribute ve Oluşturacağımız class sonuna ViewComponents ekini koyarak oluşturabiliriz.&lt;/p&gt;
&lt;p&gt;public class CategoryMenu : ViewComponent
{
private ICategoryRepository repository;
public CategoryMenu(ICategoryRepository reposit)
{
repository = reposit;
}
public IViewComponentResult Invoke()
{
return View(repository.GetCategories);
}
}&lt;/p&gt;
&lt;p&gt;Bu işlemi de yaptıktan sonra geldik View kısmını oluşturmaya Aynı isimde klasör oluşturduktan sonra default.cshtml adında bir view oluşturuyoruz. Bu view içerisine ben menu yapmak istediğim için menu tipinde bir html ekliyorum. Model olarak da Category gönderdiğim için category ekliyorum. Ardından foreach döngüsü ile işlemimi tamamlıyorum.&lt;/p&gt;
&lt;p&gt;@model IEnumerable&amp;lt;Category&amp;gt;
&amp;lt;div class=&quot;tab&quot;&amp;gt;
@foreach (var item in Model)
{
&amp;lt;button&amp;gt;  @item.CategoryName&amp;lt;/button&amp;gt;
}    &amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;Bu işlemden sonra geriye sadece bu component kullanmak kalıyor. Bunun da kullanımı aşağıdaki gibidir&lt;/p&gt;
&lt;p&gt;@await Component.InvokeAsync(&quot;[ViewComponentName]&quot;)
Eğer parameter alıyorsa
@await Component.InvokeAsync(&quot;[ViewComponentName]&quot;,[parameters])&lt;/p&gt;
&lt;p&gt;Bizim işlemimizde dışarıdan parametreyi class ile gönderdiğimiz için ilkini kullanıyoruz ve çalıştırınca sonuç aşağıdaki gibi oluyor. Böylece iki farklı sayfada da aynı component kullanarak tekrar kod yazmaktan kurtuluyoruz ve dinamik bir yapıya kavuşturuyoruz.&lt;/p&gt;
&lt;p&gt;Kaynak Kod : &lt;a href=&quot;https://github.com/berkarat/.Net-Core-ViewComponents&quot;&gt;https://github.com/berkarat/.Net-Core-ViewComponents&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CLR Trigger Nedir? Kullanımı</title><link>https://fuwari.vercel.app/posts/clr-trigger-nedir-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/clr-trigger-nedir-kullanimi/</guid><description>Merhabalar, bu yazımda da  SQL trigger kavramından devam edeceğiz. Eğer Triggerlar ile alakalı daha fazla bilgi almak için aşağıdaki linki kullanabili</description><pubDate>Tue, 16 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_SQL-Server-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_SQL-Server-min-696x758.png&quot; alt=&quot;Microsoft Sql Server&quot; title=&quot;Sql Server&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar, bu yazımda da  SQL trigger kavramından devam edeceğiz. Eğer Triggerlar ile alakalı daha fazla bilgi almak için aşağıdaki linki kullanabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/mssql-trigger/&quot;&gt;https://blog.berkarat.com/mssql-trigger/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;CLR TRIGGER NEDİR ?&lt;/h3&gt;
&lt;p&gt;CLR (Common Language Runtime) ne olduğunu açıklayayım. CLR .Net platformunun çalışabilmesi için gereken ortamı yaraktmaktadır böylece Sql üzerinde daha karmaşık olabilecek sorguları .Net platformuna taşımış oluruz. Burada artık .Net ortamında olduğumuzdan dolayı yapabileceklerimiz çok daha basit bir şekil alacaktır.&lt;/p&gt;
&lt;h4&gt;CLR TRIGGER UYGULAMA ADIM-1 (.Net Tarafı)&lt;/h4&gt;
&lt;p&gt;İlk olarak dll dosyamızı oluşturalım. .Net ortamında geliştireceğim için Visual Studio kullanacağım. Visual Studio üzerinden .Net Class Library üzerinden bir tane class library oluşturuyoruz. Ardından karşımıza boş bir class gelecektir&lt;/p&gt;
&lt;p&gt;Burada “SqlTriggerContext triggContext = SqlContext.TriggerContext; ” komutu ile bir trigger nesnesi oluşturuyoruz. Bu nesne üzerinden trigger actionları alabileceğimiz kodu yazıyoruz. Bu da triggContext.TriggerAction;&lt;/p&gt;
&lt;p&gt;Bu actionlar INSERT UPDATE DELETE türlerindedir. Daha sonra bu işlemin Insert,Update veya Delete olduğunu anlamak için switch case yapısını kuruyoruz. Bu işlemden sonra artık triggerlarımızı yakalamış oluyoruz.&lt;/p&gt;
&lt;p&gt;public static void SqlTrigger1()
{
SqlTriggerContext triggContext = SqlContext.TriggerContext;&lt;br /&gt;
SqlContext.Pipe.Send(&quot;Trigger FIRED&quot;);
SqlCommand command;
SqlDataReader reader;
SqlPipe pipe = SqlContext.Pipe;&lt;br /&gt;
switch (triggContext.TriggerAction)
{
case TriggerAction.Insert:
using (SqlConnection conn = new SqlConnection(&quot;context connection=true&quot;))
{
conn.Open();
command = new SqlCommand(@&quot;SELECT * FROM INSERTED;&quot;, conn);
reader = command.ExecuteReader();
reader.Read();
SendMessage(reader, &quot;insert&quot;, TransactionType.QuoteInsert);
}
break; }    }&lt;/p&gt;
&lt;p&gt;Sonrasında sql bağlantısını yapıp hangi case geldiyse oradan işlemimizi gerçekleştiriyoruz. Ben bu örnekte MSMQ içerisine mesaj olarak yazdım isterseniz bir dosyaya da text olarak kaydedebilir veya başka bir program tetikleyebilirsiniz.&lt;/p&gt;
&lt;h4&gt;CLR TRIGGER UYGULAMA ADIM-2 (SQL TARAFI)&lt;/h4&gt;
&lt;p&gt;İlk önce boş bir sorgu açıyoruz CLR trigger enable etmek için aşağıdaki sorguyu çalıştırıyoruz. Bu sorgu çalıştığında CLR_Enabled 0 dan 1 konumuna geçmiş olur.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXEC sp_configure &apos;clr enabled&apos;, 1;
GO
    reconfigure
GO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;İkinci adım olarak konfigürasyon işlemini gerçekleştiriyoruz. Daha sonrasında bir adet Assembly oluşturuyoruz. Burada oluşturduğumuz dl dosyasının yolunu ekliyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EXEC sp_configure &apos;show advanced options&apos;, 1;
RECONFIGURE;
EXEC sp_configure &apos;clr strict security&apos;, 0;
RECONFIGURE;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dikkat etmemiz gereken konu eğer izinler verilmediyse dosyaya ulaşamayacağı için hata verecektir. Bunun için dosyaya izinleri vermemiz gerekmektedir. PERMISSION_SET=UNSAFE diyerek de bağlantının güvenlik dışında olduğunu belirtiyoruz.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alter database &quot;databasename&quot; set trustworthy on;
GO
CREATE ASSEMBLY CLRTrigger
FROM &apos;path of the dll file&apos;
WITH PERMISSION_SET = UNSAFE
GO 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Son adım olarak trigger oluşturma adımına geçiyoruz. Aşağıdaki komut satırında TriggerName olarak istediğimiz adı verebiliriz. Burada dikkat etmemiz gereken nokta EXTERNAL NAME kısmıdır. Buradaki sıralama oluşturduğunmuz &lt;strong&gt;&lt;em&gt;dll projesinin adı +class adı + fonksiyon adı&lt;/em&gt;&lt;/strong&gt;  olacak şekilde yapmamız gerekmektedir. Aksi durumda hata ile karşılaşırız.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TRIGGER  &quot;triggername&quot; 
ON  &quot;databasename&quot; 
FOR INSERT, UPDATE, DELETE
AS
EXTERNAL NAME &quot;(dllname+classname+functionname)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu adımları da yapıp çalıştırdıktan sonra artık işlemimiz tamamlanmış oluyor. Artık tablomuzda değişiklik yaptığımız zaman yaptığımız değişiklik mesaj olarak queue kuyruğuna eklenecek. Eğer isterseniz başka şekillerde tetikleme de yapmanız mümkündür. Bu işlemi de yazdığımız dll dosyasını güncelleyerek yapabilirsiniz. Burada dikkat etmemiz gereken konu SQL Server ile dll aynı bilgisayarda bulunmalıdır. Yani dosya yolu erişilemez ise triggerlar devreye girmeyecektir.&lt;/p&gt;
&lt;p&gt;Kaynak dosya:&lt;a href=&quot;https://github.com/berkarat/CLR-Trigger-Csharp&quot;&gt;https://github.com/berkarat/CLR-Trigger-Csharp&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Youtube Premium ve Youtube Music Türkiye’de !</title><link>https://fuwari.vercel.app/posts/youtube-premium/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/youtube-premium/</guid><description>Merhabalar bu yazımızda Youtube Premiumdan bahsedeceğim. Google geçmiş yıllarda Youtube Red servisi ile piyasaya bir yenilik kazandırmak istemişti. An</description><pubDate>Tue, 16 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_07_youtubepre.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2019_07_youtubepre.jpg&quot; alt=&quot;youtube premium Türkiye&quot; title=&quot;youtube premium&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda Youtube Premiumdan bahsedeceğim. Google geçmiş yıllarda Youtube Red servisi ile piyasaya bir yenilik kazandırmak istemişti. Ancak 2019 Mayıs ayında bu servisi durdurmuştu. Bunun üzerine&lt;br /&gt;
YouTube Premium ve YouTube Music olarak iki farklı servis oluşturmuştu. 1 yılı aşkın bir süreden sonra Youtube Red’i kaldırarak, Youtube Premium’u Türkiye’de kullanıma açtı.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_Youtube.png&quot; alt=&quot;Youtube - Youtube Premium ve Youtube Music Türkiye&apos;de !&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Avantajları nelerdir ?&lt;/h2&gt;
&lt;p&gt;YouTube Music ve Premium’un bize sağladığı belli başlı avantajlar şimdilik şunlar olacak&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reklamsız olarak video ve müzik dinleme imkanı&lt;/li&gt;
&lt;li&gt;Videoları offline olarak mobile indirme ve izleme olanağı&lt;/li&gt;
&lt;li&gt;Arka planda oynatmayı kullanıma izin vermesi&lt;/li&gt;
&lt;li&gt;Google Home ile uyumlu çalışma&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Evet en merak edilen konulardan birisi de bu olmuştur. Fiyatları ne kadar olacak. Bu platformda 2 tip bulunmaktadır. Premium ve Music olarak.&lt;/p&gt;
&lt;h2&gt;Youtube Premium Nedir?&lt;/h2&gt;
&lt;p&gt;Youtube bu servisi her şeyin bulunduğu bir servis olarak düşünmektedir. Bu serviste reklam olmadan video izleyebilme. Youtube music üzerinde kullandığımız tüm özelliklere sahip olabilme gibi imkanlarla rakiplerine bu oyunda ben de varım demiştir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_youtube-premium.png&quot; alt=&quot;youtube premium&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aynı zamanda Youtube Orginals içeriklerine de ücretsiz erişme hakkı vermektedir.&lt;/p&gt;
&lt;h2&gt;Youtube Premium Fiyatları&lt;/h2&gt;
&lt;p&gt;İlk 3 aylık deneme sürümünün ardından aylık &lt;em&gt;&lt;strong&gt;16,99 ₺&lt;/strong&gt;&lt;/em&gt; fiyatıyla tüm youtube imkanlarından faydalanılabilir. Tıpkı diğer platformlarda olduğu gibi ayni ailede yaşayan 5 kişiyi dahil edebileceğiniz aile paketi de mevcut. Bu paketin fiyatı ise 1 aylık ücretsiz deneme sonrasında aylık &lt;em&gt;&lt;strong&gt;25,99 ₺&lt;/strong&gt;&lt;/em&gt; olarak belirlenmiştir.&lt;/p&gt;
&lt;p&gt;Youtube Premiuma üye olmak için aşağıdaki linki tıklayabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/premium&quot;&gt;https://www.youtube.com/premium&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Youtube Music Nedir?&lt;/h2&gt;
&lt;p&gt;Google Spotify ve Apple Music gibi müzik servislerine bir alternatif olarak çıkarttığı Youtube Music servisini ülkemizde yayına soktur. İlk 3 ay boyunca deneme yapabilmek için &lt;strong&gt;ücretsiz üyelik&lt;/strong&gt; imkanı sunmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_youtube-music.png&quot; alt=&quot;Youtube Music - Youtube Premium ve Youtube Music Türkiye&apos;de !&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Youtube Music Fiyatları&lt;/h2&gt;
&lt;p&gt;Deneme süresi bittikten sonra aylık &lt;em&gt;&lt;strong&gt;13,99 ₺&lt;/strong&gt;&lt;/em&gt; fiyatlandırması olacak.&lt;/p&gt;
&lt;p&gt;Tıpkı Spotify’da olduğu gibi Aile paketini de kullanabilirsiniz. Bu serviste aynı aileden 5 adet üye ekleyebiliyorsunuz.Bunun için diğer üyelerle aynı hanede oturmanız gerekmektedir. Bu bilgileri kayıt olurken sizlerden istemektedir. Bu servisin ücreti ise ilk 1 ay boyunca deneme sürümünden sonra aylık &lt;strong&gt;&lt;em&gt;20,99 ₺&lt;/em&gt;&lt;/strong&gt; olacaktır.&lt;/p&gt;
&lt;p&gt;Youtube Music’e üye olmak için aşağıdaki linki tıklayabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/musicpremium&quot;&gt;https://www.youtube.com/musicpremium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google bu 2 servisiyle piyasaya hızlı bir giriş yaptı ve diğer rakiplerinin önüne geçebilip sektörü eline alabilecek mi ? bunu zaman gösterir ancak şimdilik faydalı bir uygulama olarak görünüyor.&lt;/p&gt;
</content:encoded></item><item><title>MSSQL Server Tetikleyici Kavramı ve Uygulaması</title><link>https://fuwari.vercel.app/posts/mssql-trigger/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/mssql-trigger/</guid><description>Merhabalar bu yazımızda MSSQL Serverda trigger kavramından bahsedeceğim. Bunlar birer tetikleyicidir. Bu tetikleyiciler bizim yapmamızı istediğimiz iş</description><pubDate>Mon, 08 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_07_Trigger.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_07_Trigger.png&quot; alt=&quot;Tetikleyiciler&quot; title=&quot;trigger&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda MSSQL Serverda trigger kavramından bahsedeceğim. Bunlar birer tetikleyicidir. Bu tetikleyiciler bizim yapmamızı istediğimiz işlevleri otomatik bir biçimde uygulamasını sağlamaktadır.&lt;/p&gt;
&lt;p&gt;T-SQL’de yazılması zor veya karmaşık olan işlemlerde , CLR&lt;br /&gt;
tetikleyiciler avantaj sağlamaktadır. Ya da SQL server üzerinde yapılan işlemlerin kaydını tutmak bunun tarih saat olarak güncellemek için arkada otomatik olarak işleyen bir yapının kurulmasında tetikleyiciler hayati öneme sahiptirler.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_07_sql-trigger.png&quot; alt=&quot;Sql Trigger - MSSQL Server Tetikleyici Kavramı ve Uygulaması&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Trigger Kullanımı ve Çeşitleri&lt;/h2&gt;
&lt;h4&gt;Triggerlar 3 çeşittir&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;DML tetikleyiciler otomatik olarak INSERT, UPDATE ve DELETE işlemlerinde tetiklenir.&lt;/li&gt;
&lt;li&gt;DDL tetikleyiciler CREATE , ALTER ve DROP işlemlerinde tetiklenirler.&lt;/li&gt;
&lt;li&gt;Logon tetikleyiciler ise Login işlemleri esnasında bir stored procedure veya başka bir komutu yerine getirerek tetiklenmektedir.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;CREATE TRIGGER &amp;lt;Schema_Name, sysname, Schema_Name&amp;gt;.&amp;lt;Trigger_Name, sysname, Trigger_Name&amp;gt; 
   ON  &amp;lt;Schema_Name, sysname, Schema_Name&amp;gt;.&amp;lt;Table_Name, sysname, Table_Name&amp;gt; 
   AFTER &amp;lt;Data_Modification_Statements, , INSERT,DELETE,UPDATE&amp;gt;
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for trigger here

END
GO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CREATE TRIGGER [schema_name.]trigger_nameON table_nameAFTER  {[INSERT],[UPDATE],[DELETE]}[NOT FOR REPLICATION]AS{sql_statements}&lt;/p&gt;
&lt;p&gt;Yukarıdaki genel tetikleyici oluşturma şablonudur. Bu şablonda;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SchemaName hangi tablo olduğuna dair bilgiyi içerir. Opsiyonel olarak kullanılır ve zorunlu değildir.&lt;/li&gt;
&lt;li&gt;nameON ise tetikleyicimizin adını belirtmekte kullanırız.&lt;/li&gt;
&lt;li&gt;AFTER kelimesinden sonra seçeceğimiz işleme göre sql_statements esnasında yapılacak sorguları yazarız.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Daha açıklayıcı olması açısından aşağıda basit bir tetikleyici örneği verilmiştir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TRIGGER [dbo].[Logging] on [dbo].[tbl_Test] 
AFTER  UPDATE 
as
begin
INSERT INTO [dbo].[tbl_log]
           ([LOGDATE]
           ,[PROCESS])
     VALUES
           (
           GETDATE()
           ,&apos;UPDATED&apos;)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu örnekte test adında bir tablomuz var ve buraya Logging adında bir tetitkleyici oluşturuyoruz. Bu işlem tabloda herhangi bir kolon update işlemi görürse bunun loglama işlemini başka bir tabloya işlenme anını yazan bir tetikleyici oluşturmuş oluruz. Bu kodu daha da geliştirerek database tarafında loglama işlemini de yapmış oluruz.&lt;/p&gt;
&lt;p&gt;Aynı işlemleri INSERT ve DELETE gibi komutlarla farklı ihtiyaçlara göre modifiye etmek mümkündür. Aynı şekilde CREATE DROP gibi işlemlerin de uygulaması benzerlik göstermektedir.&lt;/p&gt;
&lt;p&gt;Tetikleyiciler genel kullanım açısından programdan bağımsız bir şekilde database tarafında işlemleri yapmamıza yaramaktadır. Böylece daha hızlı bir şekilde ve sistemi yormadan işlemlerimize devam edebiliriz.&lt;/p&gt;
&lt;h2&gt;Örnek Tetikleyici Kullanımı&lt;/h2&gt;
&lt;p&gt;Aynı zamanda bu tabloya uyguladığımız tetikleyiciler dışında databasae işlemlerini de kontrol edip log tutabileceğimiz database tetikleyicileri de kullanabiliriz. Bu sayede olan biteni kontrol altında tutabiliriz.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE TRIGGER [trg_index_changes]
ON DATABASE
FOR 
    CREATE_INDEX,
    ALTER_INDEX, 
    DROP_INDEX
AS
BEGIN
    SET NOCOUNT ON;
 
    INSERT INTO index_logs (
        event_data,
        changed_by
    )
    VALUES (
        EVENTDATA(),
        USER
    );
END;
GO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yukarıdaki örnek sorguyu çalıştırarak database tetikleyici oluşturabiliriz. Bu yazımızda standart triggerlara giriş yapmış bulunuyoruz. Bir sonraki adımda ise CLR triggerları kullanarak daha karmaşık işlemleri C# üzerinden kontrol edilmesini göstereceğim.&lt;/p&gt;
&lt;p&gt;Daha fazla Sql örnekleri ve detaylı bilgi için : &lt;a href=&quot;https://blog.berkarat.com/category/yazilim/sql/&quot;&gt;https://blog.berkarat.com/category/yazilim/sql/&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Azure DevOps &amp; Azure Repos Git Depolama</title><link>https://fuwari.vercel.app/posts/azure-repos-ve-git/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/azure-repos-ve-git/</guid><description>Merhabalar bu yazımızda Microsoft tarafından geliştirilen Azure platformunun DevOps kısmından , bunun yanında azure repos dediğimiz depolama alanların</description><pubDate>Mon, 11 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_03_azure-repos.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_03_azure-repos.png&quot; alt=&quot;Azure Repos - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; title=&quot;azure repos&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda Microsoft tarafından geliştirilen Azure platformunun DevOps kısmından , bunun yanında azure repos dediğimiz depolama alanlarının kullanımından bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Azure DevOps development ve operations sözcüklerinden türetilmiştir. Geliştirme ve opreasyon süreçlerini birlikte kullanabildiğimiz bir yapı ortaya çıkmıştır. Bir çok avantajı da birlikte getirmiştir. Ben bu yazıda Azure repos konusuna değineceğim. Daha önceki github repositorieslerinden bahsetmiştim. &lt;a href=&quot;https://blog.berkarat.com/github-publish/&quot;&gt;https://blog.berkarat.com/github-publish/&lt;/a&gt; Bu sefer de benzer yapıda olan azure reposlardan bahsedeceğim.&lt;/p&gt;
&lt;h2&gt;Azure DevOps Ayarları&lt;/h2&gt;
&lt;p&gt;Daha önce olduğu gibi işlemlerimi Visual Studio 2017 üzerinden gerçekleştireceğim. İlk olarak bir microsoft accountumuz olması gerekmektedir. Azure erişimi için de bu account üzerinden işlem yapacağız. Eğer Azure DevOps hesabınız yok ise buradan ulaşabilirsiniz. &lt;a href=&quot;https://azure.microsoft.com/tr-tr/services/devops/&quot;&gt;https://azure.microsoft.com/tr-tr/services/devops/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_azure-1-1024x555.png&quot; alt=&quot;Azure 1 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_azure-2.png&quot; alt=&quot;Azure 2 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Azure Repos Oluşturma&lt;/h2&gt;
&lt;p&gt;Bu işlemi yapmak için iki yol vardır birisi manuel olarak girip new diyerek yeni bir depolama alanı oluşturabilirsiniz. Ancak bu yazıda Visual Studio üzerinden kurulumunu göstereceğim. Yapı github yapısıyla benzerlik göstermektedir. Aynı şekilde bir adet C# projesi oluşturuyoruz. Ardından sağ tarafta Team Explorer alanına geliyoruz burada üst tarafta Azure DevOps alanı bulunmaktadır. Buradan Connect seçeneğini tıklayıp hesabımıza giriş yapıyoruz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;/wp-images/2019_03_azure-3-1024x555.png&quot; alt=&quot;Azure 3 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Azure Publish Git Repo&lt;/h2&gt;
&lt;p&gt;Repository alanımızı oluşturduktan sonra projemizde yapacağımız değişikler. Alt tarafta mavi alanda görünmektedir. Tıpkı githubda olduğu gibi burada da sağ taraftaki Publish Git Repo seçeneğini seçiyoruz.&lt;/p&gt;
&lt;p&gt;Daha sonrasında karşımıza oluşturmamızı istediğimiz Repoya ait bilgiler istemektedir. Bunları doldurduktan sonra Changes bölümüne gelerek değişiklikleri Commit and Push seçeneğini seçerek karşıya yollamış oluyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_azure-5.png&quot; alt=&quot;Azure 5 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonrasında browserda azure üzerinden giriş yapıyoruz. Sol tarafta bulunan Repos alanında varsa daha önceki alanlarımız bulunmaktadır. Oluşturduğumuz alana geliyoruz ve Commits kısmına tıkladığımızda aşağıdaki gibi bir ekran karşımıza gelmektedir. Projemize eklediğimiz alanlar + işareti ile çıkardığımız alanlar ise – işareti ile karşımıza çıkmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_azure-6-1024x555.png&quot; alt=&quot;Azure 6 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pushes alanında da anlaşılacağı gibi yaptığımız güncellemelerin başlık olarak karşımıza sunmaktadır. Tıpkı github History alanında olduğu gibi burada da benzer bir yapı kullanılmıştır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_azure-7-1024x496.png&quot; alt=&quot;Azure 7 - Azure DevOps &amp;amp; Azure Repos Git Depolama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Azure Reposun githuba göre avantajı private paylaşımlar yapmamızdan bir ücret talep etmemektedir. Bu da projelerimizi gizli bir alanda kayıt altında tutabilmemize yaramaktadır.&lt;/p&gt;
</content:encoded></item><item><title>Visual Studio Github Publish İşlemi – Resimli Anlatım</title><link>https://fuwari.vercel.app/posts/github-publish/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/github-publish/</guid><description>Merhabalar bu yazımızda Visual Studio kullanarak Github publish işleminden bahsedeceğim. Öncelikle bu konu proje geliştirme safhasında olmazsa olmaz k</description><pubDate>Sun, 10 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_gt-2.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_gt-2-696x365.png&quot; alt=&quot;Gt 2&quot; title=&quot;github publish&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda Visual Studio kullanarak Github publish işleminden bahsedeceğim. Öncelikle bu konu proje geliştirme safhasında olmazsa olmaz konulardan biridir. Kimse o kadar emek verdiği projeyi yedek almadan çalışmak istemez. Ayrıca takım olarak çalışılması gereken projelerde projenin farklı yerlerden de ulaşılıp güncellenebilmesi için Github örneğinden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Daha önceki yazım olan &lt;a href=&quot;https://blog.berkarat.com/github-proje-yukleme/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blog.berkarat.com/github-proje-yukleme/&quot;&gt;https://blog.berkarat.com/github-proje-yukleme/&lt;/a&gt; bu konuyu manuel olarak da anlatmıştım. Ancak burada yaptığımız işlem kendi bilgisayarımızda bir depolama alanı oluşturuyoruz ve orada olan işlemleri teker teker sürükleyerek güncelliyorduk. Bu sefer yapacağımız işlemi otomatik bir biçimde Visual Studio kullanarak yapacağız.&lt;/p&gt;
&lt;h2&gt;Github Ayarları&lt;/h2&gt;
&lt;p&gt;İlk önce yapmamız gereken bir adet proje açıyoruz. Ben burada örnek olarak testappforgithub adından bir console uygulaması açtım. Ardından tools&amp;gt;Extensions and Updates kısmından Online bölümüne tıklıyoruz. Search kısmına GithubExtensions for Visual Studio yazıyoruz ve yükleme işlemini gerçekleştiriyoruz. Bu yükleme ardından programı tekrar açıp kapatmamız gerekmektedir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-6.png&quot; alt=&quot;Github 6 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-7.png&quot; alt=&quot;Github 7 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Github Repository Oluşturma&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-9.png&quot; alt=&quot;Github 9 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-11.png&quot; alt=&quot;Github 11 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bu işlemleri gerçekleştirdikten sonra publish işlemi için sağ tarafta bulunan Team Explorer bölümüne tıklıyoruz. Burada karşımıza 3 adet Connect bağlantısı çıkıyor. Bir tanesi Azure DevOps ( buna başka bir yazıda değineceğim.) bir diğeri ise Github (&lt;a href=&quot;https://github.com/&quot;&gt;https://github.com/&lt;/a&gt;). Bizim burada ilgilenmemiz gereken konu burasıdır. Eğer daha önceden bir github hesabınız yok ise ücretsiz olarak oluşturmanız gerekmektedir. Bu işlemleri yaptıktan sonra sol altta connect kısmını seçip hesabımıza giriş yapıyoruz. Giriş başarılı olduktan sonra sağ tarafta eğer daha önceden varsa repositorylerimiz teker teker çıkıyor. İster burada güncelleme yapmamız için istersek de yeni bir alan oluşturmak için seçenekler mevcut.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;/wp-images/2019_03_github-1-588x1024.png&quot; alt=&quot;Github 1 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-10.png&quot; alt=&quot;Github 10 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Biz yeni bir alan oluşturmak istediğimiz için Create seçeneğini seçip çıkan ekranda alan adını, açıklama gibi ilgili alanları dolduruyoruz. Github public paylaşımlar için ücretsizdir ancak private bir paylaşım yapmak için ücret talep etmektedir. Bu sebeple private seçeneğini işaretlemeden devam ediyoruz. Artık alanımızı oluşturduk. Geriye yapmamız gereken tek şey bu depolama alanını doldurmak.&lt;/p&gt;
&lt;h2&gt;Github Publish İşlemi&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-1-588x1024.png&quot; alt=&quot;Github 1 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada ise yazdığımız kod bloğunu veya classları artık paylaşmamız gerekmektedir. Bunun için birkaç seçenek mevcuttur. Bunlardan ilki Team Explorer kısmına gelerek changes alanına tıklamaktır. Ardından değişiklik yaptığımızı bize gösteren ibare bulunmaktadır. Üstte de açıklama kısmı yer almaktadır. Örneğin yaptığımız güncellemenin özetini buraya yazabiliriz. Böylece ileri bir zamanda baktığımızda güncelleme sebebimizi rahatlıkla görebilmelteyiz. Daha sonrasında Commit All kısmını seçiyoruz. Commit All sadece localdeki repositoryleri güncellemektedir. Commit All and push ve sync seçenekleri github hesabınızda oluşturduğunuz alanın da güncellenmesini sağlamaktadır.&lt;/p&gt;
&lt;h2&gt;Failed to Push Hatası&lt;/h2&gt;
&lt;p&gt;Eğer bu işlemde aşağıdaki hata ile karşılaşıyorsanız. Yapmanız gereken Visual Studio güncellemelerini kontrol etmektir. Bu sebeple bu hatayı vermektedir. Güncellemeleri yaptıktan sonra işlemi başarıyla gerçekleştirebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_fail-1024x265.png&quot; alt=&quot;Fail - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Failed to push the branch to the remote repository. See the Output window for more details.”&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Incoming Commits&lt;/h2&gt;
&lt;p&gt;Yukarıda bahsettiğim olaylar bizim bir projeyi publish etme işlemleriydi. Ancak başka birinin güncelleme yapması durumunda o bilgileri de almamız gerekmktedir. Bunun için Synchronization kısmında Incoming Commits alanından Fetch tıklayarak bir değişiklik olup olmadığını kontrol edebiliriz. Eğer var ise Pull işlemi ile projemize ekleyebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-5-588x1024.png&quot; alt=&quot;Github 5 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ardından github hesabımıza girip kontrol ediyoruz. Baktığımızda güncellemeler ve açıklamalarıyla birlikte history kısmında görebiliyoruz. Burada + ile işaretli yerler o güncellemede değişen yerleri göstermektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_03_github-4-970x1024.png&quot; alt=&quot;Github 4 - Visual Studio Github Publish İşlemi - Resimli Anlatım&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Genel olarak yazıya değinirsek github publish işlemleri birden fazla kişinin çalışıtığı ortak projelerde olmazsa olmaz bir yapıdır. Bu sayede son güncellemelerden haberdar olabilecek ve mesafe sorunu yaşamadan projelere ulaşabileceksiniz.&lt;/p&gt;
</content:encoded></item><item><title>Jquery Json Parse İşlemi ve Örnek Uygulama</title><link>https://fuwari.vercel.app/posts/jquery-json-parse/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/jquery-json-parse/</guid><description>Merhabalar bu yazıda Jquery işlemlerinden Json verileri okuma işlemi yapacağız. Bu yazı [Jquery Giriş](https://blog.berkarat.com/jquery-giris/) yazısı</description><pubDate>Fri, 01 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_02_jquery.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_02_jquery.png&quot; alt=&quot;jquery example&quot; title=&quot;jquery&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazıda Jquery işlemlerinden Json verileri okuma işlemi yapacağız. Bu yazı &lt;a href=&quot;https://blog.berkarat.com/jquery-giris/&quot;&gt;Jquery Giriş&lt;/a&gt; yazısının devamıdır. Bu yüzden öncelikle bu yazıdan yararlanmak gerekir. Konumuz olan json ile veri okumayı bir örnek üzerinden anlatacağım. Örneğin bir sayfanın dilini değiştirme işleminden bahsedeceğim bunun için öncelikle bir format oluşturmak gerekir. 4 adet dil seçeneğimiz olsun ve bunlara tıkladığımızda sayfaların dilleri değişsin istiyoruz. Bu işlemi yapmak için jquery kütüphanesinden jquery json parse json fonksiyonunu kullanacağız.&lt;/p&gt;
&lt;p&gt;İlk önce yapmamız gereken işlem bir adet json dosyası oluşturmak bunun için json dosyasını html  içerisine de gömebiliriz. Bunun için &amp;lt;script&amp;gt; tagleri arasında bir var tanımılıyoruz ve json olarak metni yazıyoruz ardından json dosya okuma işlemini gerçekleştiriyoruz.&lt;/p&gt;
&lt;p&gt;{
&quot;mainpage&quot;: [{
&quot;description&quot;: &quot;Merhaba bu yazı berkarat.com tarafından yazılmıştır. İletişim için aşağıdaki maile mesaj gönderebilirsiniz. Teşekkürler &quot;,
&quot;btnsendmessage&quot;: &quot;Mesaj Gönder&quot;
},
{
&quot;description&quot;: &quot;Hello this post was written by berkarat.com. You can send a message to the contact below. Thanks &quot;,
&quot;btnsendmessage&quot;: &quot;Send Message&quot;
},
{
&quot;description&quot;: &quot;Hola este post fue escrito por berkarat.com. Puede enviar un mensaje al contacto de abajo. gracias&quot;,
&quot;btnsendmessage&quot;: &quot;Enviar mensaje&quot;
},
{
&quot;description&quot;: &quot;مرحبا هذه المشاركة كتبت بواسطة berkarat.com. يمكنك إرسال رسالة إلى جهة الاتصال أدناه. شكر&quot;,
&quot;btnsendmessage&quot;: &quot;ارسل رسالة&quot;
}
]
}&lt;/p&gt;
&lt;h1&gt;Jquery Json Parse İşlemi&lt;/h1&gt;
&lt;p&gt;Yukarıdaki json değişkeninden json parse işlemini uygulayarak bir obje oluşturuyoruz. Javascript objeye yönelik bir dil olmasının avantajını da burada görmüş oluyoruz. Yazacağımız fonksiyonu dillere göre ayarlıyoruz. Ardından dildeki değişimi görüyoruz. Burada asıl işlemi yapan jquery json parse metodu yapmaktadır.&lt;/p&gt;
&lt;p&gt;var obj = jQuery.parseJSON(json);
function setlang(id) {
selected_language = id;
$(&quot;#description&quot;).text(obj.mainpage[id].description);
$(&quot;#btnsendmessage&quot;).text(obj.mainpage[id].btnsendmessage);
}&lt;/p&gt;
&lt;p&gt;Html içerisinden json okuma işlemi oldukça basit ancak bir json dosyasından okuma işlemi için bazı gerekli ayarlamalar yapmamız gerekmektedir. Ben uygulamaları chrome üzerinden gerçekleştirdiğim için chrome için bazı izinleri gerçekleştirmek gereklidir. Eğer bu izinleri yapmamamız durumunda json dosyasını okuyamayacağız ve safyayı incele dediğimizde aşağıdaki hata ile karşılacağız.&lt;/p&gt;
&lt;p&gt;var obj = JSON.parse($.getJSON({&apos;url&apos;: &quot;./text.json&quot;, &apos;async&apos;: false}).responseText);
function setlang(id) {
selected_language = id;
$(&quot;#description&quot;).text(obj.mainpage[id].description);
$(&quot;#btnsendmessage&quot;).text(obj.mainpage[id].btnsendmessage);
}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_jquery-example.png&quot; alt=&quot;Jquery Example - Jquery Json Parse İşlemi ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;CORS Policy Hatası Çözümü&lt;/h2&gt;
&lt;p&gt;jquery.js:10254 Access to XMLHttpRequest at ‘file:///C:/Users/Berk/Desktop/text.json’ from origin ‘null’ has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_chrome-allow.png&quot; alt=&quot;Chrome Allow - Jquery Json Parse İşlemi ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ancak bu hatanın çözümü ise olduça basit Chrome izinleri için Program Files klasörünün altında chrome’un dosya yolunu alıyoruz. Cmd yani komut satırını açıyoruz aşağıdaki texti kendi dosya yolumuzu seçerek yapıştırıyoruz ve bir çözüm oluşturuyoruz. Bunun için eğer chreome açık ise onu kapatmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;&quot;c:Program Files (x86)GoogleChromeApplicationchrome.exe&quot; --allow-file-access-from-files&lt;/p&gt;
&lt;p&gt;Ancak bu tek seferlik çözüm bunun sebebi chrome localden bir dosya almamıza geçici süreyle izin verecektir. Bunu engellemenin yolu bir web server kurup dosyalarımızı onun üzerinden çağırmayla kalıcı olarak çözülecektir. Bu web server kurlumu için &lt;a href=&quot;https://blog.berkarat.com/windows-iis-kurulumu/&quot;&gt;Windows IIS Kurulumu (Resimli Anlatım)&lt;/a&gt; yazısından yapabilirsiniz. Böylece lolcahost: üzerinden çağırdığımız html dosyalarda bu sorun ortadan kalkacaktır.&lt;/p&gt;
&lt;p&gt;Bu dosyadan örnek html sayfasına ve json dosyaya ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Html-css-javascript&quot;&gt;https://github.com/berkarat/Html-css-javascript&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Bootstrap Slider Yapımı</title><link>https://fuwari.vercel.app/posts/bootstrap-slider-yapimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/bootstrap-slider-yapimi/</guid><description>_📌 Güncelleme (Ağustos 2026): Carousel mantığı korunuyor; Bootstrap 5’te jQuery zorunluluğunun kalkması ve class adları güncel notlarla belirtildi._</description><pubDate>Thu, 28 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_02_Bootstrap-Logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_02_Bootstrap-Logo.png&quot; alt=&quot;Bootstrap Logo - Bootstrap Nedir ? Nasıl Eklenir ?   Uygulama Örnekleri&quot; title=&quot;Bootstrap-Logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): Carousel mantığı korunuyor; Bootstrap 5’te jQuery zorunluluğunun kalkması ve class adları güncel notlarla belirtildi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda bootstrap örneklerine devam etmekteyiz. Bu sefer slider yapımından bahsedeceğim. Genellikle sitelerin ana sayfasında olan kayan görüntüler olmaktadır. Bunu yapmak için bootstrap carouselden yararlanacağız. Böylece kendi bootstrap slider ımızı yapacağız. Bundan önce eğer JavaScript gibi konulara hakim değilseniz &lt;a href=&quot;https://blog.berkarat.com/jquery-giris/&quot;&gt;bu yazıyı&lt;/a&gt; okumanızı öneririm.&lt;/p&gt;
&lt;p&gt;Bunun için öncelikle bootstrap linklerini &amp;lt;head&amp;gt; tagleri arasına ekliyoruz. Bu kütüphaneler  bize sliderda kullanacağımız  jQuery işlemleri için gereklidir. Bootstrap 4 kullanıyorsanız jQuery gerekir; Bootstrap 5’te carousel bileşeni Bootstrap’ın kendi JavaScript paketiyle jQuery olmadan da çalışır.&lt;/p&gt;
&lt;p&gt;Ardından bir div oluşturuyoruz bu div içerisine slider eklemesini yapacağız. Bu divin classına “carousel slide” adını veriyoruz. Çünkü bootstrap içerisinde tanımlı class budur. Ardından Indıcators tanımlaması yapıyoruz. Bu indicatorler slider altında duran hangi sayfada olduğumuzu belirten küçük itemlerdir .Bunlar sayesinde hangi sayfada olduğumuzu belirleyebilir ya da istediğimiz sayfaya yönlendirme yapabiliriz.&lt;/p&gt;
&lt;p&gt;&amp;lt;ul class=&quot;carousel-indicators&quot;&amp;gt;
&amp;lt;li class=&quot;item1 active&quot;&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&quot;item2&quot;&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li class=&quot;item3&quot;&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/p&gt;
&lt;p&gt;Bu işlemi yaptıktan sonra slideshow kısmına geçiyoruz. Burada da div classını carousel-inner olarak ana bir div belirliyoruz. Bunun altına carousel-item olarak image ekliyoruz. Bunları yaparak sliderımızın bir sayfasının içeriğini ekliyoruz. İmage boyutunu önceden belirlememiz bizim için sayfa tasarımının image değiştikçe değişmesini engelleyecektir.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;carousel-inner&quot;&amp;gt;
&amp;lt;div class=&quot;carousel-item active&quot;&amp;gt;
&amp;lt;img src=&quot;1.jpg&quot; alt=&quot;Los Angeles&quot; width=&quot;1100&quot; height=&quot;500&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;carousel-item&quot;&amp;gt;
&amp;lt;img src=&quot;2.jpg&quot; alt=&quot;Chicago&quot; width=&quot;1100&quot; height=&quot;500&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;carousel-item&quot;&amp;gt;
&amp;lt;img src=&quot;3.jpg&quot; alt=&quot;New York&quot; width=&quot;1100&quot; height=&quot;500&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;Ardındın yönlendirme işlemini yapmamız için ileri geri iconlarını eklemek gerekli bunlar aslında icon görünümlük linklerdir. Bu yüzden &amp;lt;a&amp;gt; tagi ile iki adet link kodu yazıyoruz. Bu linklerin classları ise  “carousel-control-” olarak belirlidir. Prev ve next olarak iki tane vardır. Anlaşılacağı üzere ileri ve geri komutlarıdır.&lt;/p&gt;
&lt;p&gt;Buraya kadar olan işlemler slider için gereken görsel kısımlardı. Gerçekten bootstrap slider olması için bu işlemin hareket etmesi gerektir. Elbette bu işlemler için jquery metodları yazmak gerekir. Bunları aşağıda basamak basamak olarak açıklayacağım.&lt;/p&gt;
&lt;p&gt;Slider oluşturmak için   $(“#myCarousel”).carousel(); komutunu &amp;lt;script&amp;gt; tagleri arasına yazmalıyız.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_2019-02-24_16-43-03.png&quot; alt=&quot;bootstrap slider&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Bootstrap Slider Özellikleri&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Interval&lt;/strong&gt; özelliği sayesinde belirtilen süre aralıklarında değişimi gösterebiliriz. Bu sayede süre ayarı yapmak mümkündür.&lt;/p&gt;
&lt;p&gt;$(&quot;#myCarousel&quot;).carousel({ interval: 2000 });&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;İleri ve geri&lt;/strong&gt; özelliği slider için diğer özellikler ise prev ve next komutlarıdır. Yukarıda bahsettiğim şekilde oluşturduktan sonra aşağıdaki jquery kodları sayesinde hareket ettirebiliriz.&lt;/p&gt;
&lt;p&gt;$(&quot;.carousel-control-prev&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(&quot;prev&quot;);
});
$(&quot;.carousel-control-next&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(&quot;next&quot;);
});&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;İndex seçme özelliği&lt;/strong&gt; ise  indicator üzerine tıkladığımızda belirlediğimiz sayfaya yönlendirme işlemini yapmaktadır.&lt;/p&gt;
&lt;p&gt;$(&quot;.item1&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(0);
});
$(&quot;.item2&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(1);
});
$(&quot;.item3&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(2);
});&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Cycle ve pause&lt;/strong&gt; özellikleri ile sliderın durma ve döngüye devam etmesi seçeneklerini kontrol edebilmekteyiz.&lt;/p&gt;
&lt;p&gt;$(&quot;#myBtn&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(&quot;cycle&quot;);
});&lt;br /&gt;
$(&quot;#myBtn2&quot;).click(function () {
$(&quot;#myCarousel&quot;).carousel(&quot;pause&quot;);
});&lt;/p&gt;
&lt;p&gt;Konuyla ilgili örnek html dosyasını buradan ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Html-css-javascript&quot;&gt;https://github.com/berkarat/Html-css-javascript&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Bootstrap Nedir ? Nasıl Eklenir ?   Uygulama Örnekleri</title><link>https://fuwari.vercel.app/posts/bootstrap-1/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/bootstrap-1/</guid><description>Merhabalar bu yazımızın konusu web programlamada front end kısmıyla ilgili. Konumuz bootstrap kütüphanesi. Bu yazıda bootstrap kütüphanesi ile örnek u</description><pubDate>Tue, 26 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_02_Bootstrap-Logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_02_Bootstrap-Logo.png&quot; alt=&quot;Bootstrap Logo - Bootstrap Nedir ? Nasıl Eklenir ?   Uygulama Örnekleri&quot; title=&quot;Bootstrap-Logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızın konusu web programlamada front end kısmıyla ilgili. Konumuz bootstrap kütüphanesi. Bu yazıda bootstrap kütüphanesi ile örnek uygulamalar geliştireceğiz ve bu sayede sitemizin görsel olarak hoş ve kullanılabilir bir görüntü almasını sağlayacağız. Bu işlemleri yaparken de Jquery kullanmamız gerekmektedir. Bu yüzden bu yazıdan önce &lt;a href=&quot;https://blog.berkarat.com/jquery-giris/&quot;&gt;Jquery İşlemleri&lt;/a&gt; yazısındaki örnekleri incelemenizi öneririm. Aksi takdirde bazı komutları anlamak zorlaşacaktır.&lt;/p&gt;
&lt;h1&gt;Bootstrap Nedir ?&lt;/h1&gt;
&lt;p&gt;Twitter tarafından desteklenen sitelerin tasarımlarını geliştirmeye yarayan bir stil dosyası diyebiliriz. Bu stil dosyası sayesinde butonlar, menüler, sliderlar gibi bir çok görsel efektler de ekleyerek hoş bir görüntüyü rahatça oluşturabilmekteyiz. Ayrıca responsive dediğimiz mobil uyumlu web siteleri yapmamız da mümkündür. Kurulumu oldukça basittir. Temel olarak 3 ve 4. versiyonları vardır. Bu yazımızda son versiyon olan Bootsrap V4.3.1 paketini kullanacağız.&lt;/p&gt;
&lt;p&gt;Sayfaya import edilmesi için aşağıdaki metni &amp;lt;head&amp;gt; tagleri arasına ekliyoruz.&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;Ancak diğer js, jquery dosyalarını da eklememiz gerekmektedir. Bunun için de yine &amp;lt;head&amp;gt; tagleri arasına aşağıdaki linki ekliyoruz.&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://code.jquery.com/jquery-3.3.1.slim.min.js&quot; integrity=&quot;sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js&quot; integrity=&quot;sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js&quot; integrity=&quot;sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM&quot; crossorigin=&quot;anonymous&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;Daha sonrasına örnekler üzerinden gidelim. Bu stil dosyasıyla yapabileceğimiz bir çok şey var ancak ben temel olarak belli başlı şeylere değineceğim.&lt;/p&gt;
&lt;h2&gt;Grid Yapısı&lt;/h2&gt;
&lt;p&gt;Öncelikle Grid yani ızgara yapısından bahsetmemiz gerekmektedir. Bu yapı  sayfamızı 12 adet kolona bölmemize yaramaktadır. Bu 12 kolonu 4-4-4 veya 3-3-3-3 olarak gibi bir çok kombinasyonda bölerek kullanma rahatlığı sağlıyor. Boyut olarak ise xsmall, small, medium, large, xlarge gibi seçeneklerimiz de mevcuttur. Bu seçenekler ileride sitenin istenilen ekranlara uygun şekilde uyum sağlması için büyük kolaylık sağlamaktadır. Kısacasi responsive bir yapı kurmak gerekirse bu boyutlara dikkat etmemiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;container-fluid&quot;&amp;gt;
&amp;lt;div class=&quot;container-fluid&quot;&amp;gt;
&amp;lt;div class=&quot;row&quot;&amp;gt;
&amp;lt;div class=&quot;col-xs-6 col-sm-3  col-md-6  col-lg-9 bg-success&quot;&amp;gt;
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;             &amp;lt;/div&amp;gt;
             &amp;lt;div class=&quot;col-xs-6  col-sm-9 col-md-6  col-lg-3 bg-warning&quot;&amp;gt;
               Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
             &amp;lt;/div&amp;gt;
           &amp;lt;/div&amp;gt;
         &amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yukarıdaki yapıda sayfa 2ye 6-6  bölünmüştür. Ancak bu %100 bir yapıda eğer sayfa %50 olarak küçük bir ekrana geçerse yani mobile yakın veya tablet ekranına o zaman bölünme işlemi  %25 e %75 olarak bölünecek daha büyük bir ekrana geçerse de tam tersi olarak %75e %25 olarak değişecektir aşağıdaki resimdeki gibi olacaktır.&lt;img src=&quot;/wp-images/2019_02_bootstrap-example.png&quot; alt=&quot;Bootstrap Example - Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&quot; /&gt;&lt;img src=&quot;/wp-images/2019_02_bootstrap-example-1.png&quot; alt=&quot;Bootstrap Example 1 - Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&quot; /&gt;&lt;img src=&quot;/wp-images/2019_02_bootstrap-example-2-1024x148.png&quot; alt=&quot;Bootstrap Example 2 - Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Popover Menu&lt;/h2&gt;
&lt;p&gt;Bu popover işlemi ise son versiyonla gelen hoş bir güncellemedir. Bu sayede istediğimiz nesne üzerine tıklanınca ya da üzerine gelinince açılan bir bilgilendirme popup açılır.  Bu işlem için jquery kullanmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_bootstrap-example-3-300x149.png&quot; alt=&quot;Bootstrap Example 3 - Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&quot; /&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
&amp;lt;h3&amp;gt;Popover Example&amp;lt;/h3&amp;gt;
&amp;lt;a href=&quot;#&quot; title=&quot;Başlık - 1 &quot; data-toggle=&quot;popover&quot; data-content=&quot;Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis voluptatem iusto optio laborum &quot;&amp;gt;Click Me !&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href=&quot;#&quot; title=&quot;Başlık - 1&quot; data-toggle=&quot;popover&quot; data-trigger=&quot;hover&quot; data-content=&quot;Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis voluptatem iusto optio laborum &quot;&amp;gt;Hover over me !&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
$(document).ready(function () {
$(&apos;[data-toggle=&quot;popover&quot;]&apos;).popover();
});
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_bootstrap-example-3.png&quot; alt=&quot;Bootstrap Example 3 - Bootstrap Nedir ? Nasıl Eklenir ? Uygulama Örnekleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Collapse&lt;/h2&gt;
&lt;p&gt;Bu işlemde ise anlaşılacağı gibi bir bölümün açılır kapanır olmasını sağlamaktadır.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;container mt-3&quot;&amp;gt;
&amp;lt;h2&amp;gt;  Collapsible Example&amp;lt;/h2&amp;gt;
&amp;lt;a href=&quot;&quot; data-toggle=&quot;collapse&quot; data-target=&quot;#demo&quot;&amp;gt;Read More ! &amp;lt;/a&amp;gt;
&amp;lt;!-- &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; data-toggle=&quot;collapse&quot; data-target=&quot;#demo&quot;&amp;gt;Simple
collapsible&amp;lt;/button&amp;gt; --&amp;gt;
&amp;lt;div id=&quot;demo&quot; class=&quot;collapse&quot;&amp;gt;
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;Open Modal&lt;/h2&gt;
&lt;p&gt;Bu işlem ise alert fonksiyonun güzel bir görüntü halinde görünmesine yarar. Böylece daha hoş bir uyarı ekranına sahip oluruz.&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;container mt-3&quot;&amp;gt;
&amp;lt;h2&amp;gt;Activate Modal with JavaScript&amp;lt;/h2&amp;gt;
&amp;lt;!-- Trigger the modal with a button --&amp;gt;
&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot; id=&quot;myBtn&quot;&amp;gt;Click Me !&amp;lt;/button&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       &amp;lt;!-- The Modal --&amp;gt;
       &amp;lt;div class=&quot;modal fade&quot; id=&quot;myModal&quot;&amp;gt;
         &amp;lt;div class=&quot;modal-dialog&quot;&amp;gt;
           &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
           
             &amp;lt;!-- Modal Header --&amp;gt;
             &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
               &amp;lt;h4 class=&quot;modal-title&quot;&amp;gt;Header&amp;lt;/h4&amp;gt;
               &amp;lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;modal&quot;&amp;gt;X&amp;lt;/button&amp;gt;
             &amp;lt;/div&amp;gt;
             
             &amp;lt;!-- Modal body --&amp;gt;
             &amp;lt;div class=&quot;modal-body&quot;&amp;gt;
             Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ipsum pariatur nostrum, perspiciatis dolorem tempore fugiat dicta quaerat assumenda blanditiis quod provident aut maxime hic magni! Ipsum, ea ex! Ab, quam!
             &amp;lt;/div&amp;gt;
             
             &amp;lt;!-- Modal footer --&amp;gt;
             &amp;lt;div class=&quot;modal-footer&quot;&amp;gt;
               &amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; data-dismiss=&quot;modal&quot;&amp;gt;Close&amp;lt;/button&amp;gt;
             &amp;lt;/div&amp;gt;
             
           &amp;lt;/div&amp;gt;
         &amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
       
     &amp;lt;/div&amp;gt;
     
     &amp;lt;script&amp;gt;
     $(document).ready(function(){
       $(&quot;#myBtn&quot;).click(function(){
         $(&quot;#myModal&quot;).modal();
       });
     });
     &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Daha fazla örnek için &lt;a href=&quot;https://getbootstrap.com/docs/4.3/examples/&quot;&gt;https://getbootstrap.com/docs/4.3/examples/&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Jquery İşlemleri – Giriş</title><link>https://fuwari.vercel.app/posts/jquery-giris/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/jquery-giris/</guid><description>Merhabalar önceki yazımda bahsettiğim [web programlama genel bilgiler](https://blog.berkarat.com/web-programlama-genel-bilgiler/) konusunda bu seferki</description><pubDate>Sat, 23 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_02_jquery.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_02_jquery.png&quot; alt=&quot;jquery example&quot; title=&quot;jquery&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar önceki yazımda bahsettiğim &lt;a href=&quot;https://blog.berkarat.com/web-programlama-genel-bilgiler/&quot;&gt;web programlama genel bilgiler&lt;/a&gt; konusunda bu seferki yazımızda Jquery nedir ne değildir gibi konulara değineceğim. Bunun dışında nasıl kullanıldığını neler gerektiği gibi konulara değinip örnek uygulamalar yapacağız.&lt;/p&gt;
&lt;h2&gt;Jquery Nedir ?&lt;/h2&gt;
&lt;p&gt;Aslında Javascriptin daha hızlı ve kısa bir şekilde yazılması için geliştirilen bir tekniktir. Altyapı olarak Javascript kullansa da bunu kullanmamız için kendi kütüphanesini referans etmemiz gerekmektedir. Bu kütüphaneyi kendi sitesinden indirip html kodumuza referans edebiliriz. Bu bize localde çalışma olanağı verecektir. Genel yaygın kullanımı bir link üzerinden bu dosyalara ulaşmaktır.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jquery.com/download/&quot;&gt;https://jquery.com/download/&lt;/a&gt; bu link üzerinden kütüphanesini indirebilirsiniz.&lt;/p&gt;
&lt;p&gt;&amp;lt;head&amp;gt;
&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;p&gt;Yukarıdaki gibi referans edilir. Tıpkı javascript deki gibi &amp;lt;script&amp;gt; tagleri arasına yazılarak kullanılır.&lt;/p&gt;
&lt;h2&gt;Jquery Kullanımı ve Kütüphane Ekleme&lt;/h2&gt;
&lt;p&gt;Eğer javascript altyapınız var ise jqueryi anlamanız çok kısa bir zaman alacaktır. Ancak hiç javascript bilmiyorsanız jqueryi anlamak oldukça zor olacaktır. Genel yapıp seçici ve fonksiyon olarak iki bölümden oluşur. Tüm jquery kodları $ işareti ile başlamaktadır. Genel yapı aşağıdaki gibidir. İki bölümden oluşur.&lt;/p&gt;
&lt;p&gt;$(Seçici).fonksiyon();&lt;/p&gt;
&lt;p&gt;Basit bir örnek vererek başlarsak javascript de “window.onload” fonksiyonunun jquery karşılığı şudur  -&amp;gt; $(window).load(); Burada seçici kısım window yani seçtiğimiz bölüme dair fonksiyonlara yön vermekteyiz window yüklendiği zaman.&lt;/p&gt;
&lt;p&gt;Diğer örneklerle açıklarsak sayesinde animasyon olarak görüntüleme seçenekleri artmıştır. Örneğin fade efektinden bahsedeceğim. Bu sayede belirlediğimiz bir nesneyi bir alanı açılır kapanır bir şekle sokmamıza olanak sağlıyor. Bu sayede açılır kapanır menüler yapmak mümkündür. Bunun dışında bir süre veya slow gibi parametreler alabilmektedir.&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
function Fadein() {
$(&quot;#paragraph2&quot;).fadeIn();
//     $(&quot;#paragraph2&quot;).fadeIn(&quot;slow&quot;);
$(&quot;#paragraph2&quot;).fadeIn(3000);
}
function Fadeout() {
// $(&quot;#paragraph2&quot;).fadeOut();
// $(&quot;#paragraph2&quot;).fadeOut(&quot;slow&quot;);
$(&quot;#paragraph2&quot;).fadeOut(3000);
}
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;Bir diğer değineceğim slideup, slidedown ve toggle fonksiyonları. Bu fonksiyonlar genelde bir alanın açılıp kapanması için kullanılır. Adlarından da anlaşılacağı gibi slideup kapanma slidedown açılma anlamına gelir. İkisini bir arada yapmak için toggle fonksiyonunu kullanıyoruz. Tıpkı fade gibi bu da süre gibi parametreler alabilmektedir.&lt;/p&gt;
&lt;h2&gt;Jquery Chaining&lt;/h2&gt;
&lt;p&gt;Bu kütüphanin diğerlerinden ayrılan özellik bu özellikleri zincirleme olarak yapabilmek.  Yani ilk önce bir paragrafın görüntülenmesini ardından renginin değişmesi sonrasında da aşağı doğru kayması gibi işlemleri sırası ile yaptırabilmek avantaj sağlamaktadır. Üstelik bu işlemi kolay ve sade bir biçimde yapmak mümkündür.&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
$(document).ready(function () {
$(&quot;#button2&quot;).click(function () {
$(&quot;#button2&quot;).css(&quot;color&quot;, &quot;red&quot;).text(&quot;THANK YOU !&quot;).css(&quot;font-size&quot;, &quot;40px&quot;).slideUp(4000).slideDown(4000);
});
});
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;Bu örnekte butona tıklandığı zaman butona dair tüm özellikleri arka arkaya kullanabilmek mümkündür. Bu sayede kolayca işlem yapabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Bu tarz web işlemlerine diğer yazılarda devam edeceğiz.&lt;/p&gt;
</content:encoded></item><item><title>Web Programlama Hakkında Genel Bilgiler</title><link>https://fuwari.vercel.app/posts/web-programlama-genel-bilgiler/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/web-programlama-genel-bilgiler/</guid><description>Merhabalar bu yazı web programlama kategorisinin ilk yazısıdır. Bu yazımda genellikle bilinmesi gereken basit terimlerden ve bu terimlerin uygulanması</description><pubDate>Mon, 18 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_02_web1.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_02_web1-696x392.png&quot; alt=&quot;javascript&quot; title=&quot;web programlama&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazı web programlama kategorisinin ilk yazısıdır. Bu yazımda genellikle bilinmesi gereken basit terimlerden ve bu terimlerin uygulanmasında ne gibi durumlarla karşılaştığımız gibi konulara değineceğim genel bir yazı olacak. Daha ileriki yazılarda ise dillere ayırarak detaylar hakkında örnekler ve projeler paylaşmaya devam edeceğim.&lt;/p&gt;
&lt;p&gt;Web dediğimizde genel anlamda front end ve back end tarafı olarak iki bölüme ayrılmaktadır. Front end dediğimiz kısım kullanıcının doğrudan iletişim halinde olduğu görsel kısımlardır. Back end ise daha çok sunucu tarafında arka planda işleyişlerin yapıldığı kısımdır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_frontend.png&quot; alt=&quot;backend&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Front end programlama dillerine örnek vermek gerekirse bunların başında HTML CSS ve Javascript gibi diller ön plandadır. Back end için ise verebileceğim en genel olarak .Net MVC ve PHP vardır.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Html (hyper text markup language) bir işaretleme dilidir. Web programlama için olmazsa olmazdır. Aslında bir iskelet olarak düşünülebilir. Bir sayfanın menüsünden, sliderına , footer kısmına kadar gözle görünen her alanın arkasında olan bir iskelettir. Bir programlama dili değildir. Yazılması için herhangi bir program uygulama kullanmaya gerek yoktur.  HTML dili head ve body taglerinden oluşmaktadır.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CSS tam olarak bir programlama dili sayılmamaktadır. Html dosyalarının stil dosyaları olarak açıklayabiliriz. Görünen alanın estetik boyutu olarak bakabiliriz. Css için html içerisinde style taglerinin arasında yazacağız. Ancak ben genellikle ayrı bir .css dosyası oluşturup orada yazıp dosyayı referans olarak html içerisine ekliyorum.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Javascript ise şu an dünyada en popüler dillerin başında gelmektedir. Genellikle yazılarım Javascript üzerine olacak çünkü gerçek anlamda bir programlama dilidir. Html iskelet css derimiz olarak düşünürsek Javascript ise tüm kasları gösteriyor diyebiliriz. Yaptığımız her işlemin hareketin arkasında  bir javascript kodu bulunmaktadır.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Kullandığım Programlar&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Bu saydığım dillerin yazılması için ekstra bir programa gerek yoktur. Notepad++ içerisinde yazıp .html uzantılı olarak kaydettiğimiz zaman çalıştırabiliriz. Ancak gerçekçi projeler yapmaya başladıkça işler karmaşık hale geldiğinden ben kendi projelerimde Microsoftun desteklediği VisualStudio Code kullanacağım. Bir çok dili destekleyen bir text editör olarak düşünebilirsiniz. Daha gelişmiş gibi duran Adobe’un desteklediği Adobe Dreamweaver programı da vardır. Ancak bu sisteme ben pek alışamadım daha çok tasarımcı bakışı olarak faydalıdır ben daha çok işin arka planına baktığım için performasn olarak VisualStudio Code benim için daha pratik bir yerde bulunmaktadır.&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Berk Arat&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{
background-color:&quot;grey&quot;
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt; Hello berkarat.com &amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
alert(&quot;Hello World&quot;);
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;p&gt;Yazdığınız kodların derlenmesi gibi bir durum olmadığından debug işlemi de olmayacaktır. Bir diğer dezavantajı ise hata olsa bile çalışmaya devam edecektir. Diğer dilerde debug olamadığından çalışmıyor ve hatayı düzeltmemiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/windows-iis-kurulumu/&quot;&gt;IIS KURULUM&lt;/a&gt; yazısında yazdıklarımızı devam ettikçe daha açıklayıcı ve anlaşılır olacaktır.&lt;/p&gt;
</content:encoded></item><item><title>Nlog Kullanımı ve Örnek Uygulama</title><link>https://fuwari.vercel.app/posts/nlog-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/nlog-kullanimi/</guid><description>Bu yazımızda daha önceden değindiğin  [C Logger Kullanımı](https://blog.berkarat.com/c-logger-kullanimi/) yazısında bahsettiğim loglama konusundan bah</description><pubDate>Sat, 16 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_11_c-logger-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_11_c-logger-min.png&quot; alt=&quot;NLog&quot; title=&quot;c# logger&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda daha önceden değindiğin  &lt;a href=&quot;https://blog.berkarat.com/c-logger-kullanimi/&quot;&gt;C# Logger Kullanımı&lt;/a&gt; yazısında bahsettiğim loglama konusundan bahsedeceğim. Bu sefer yine loglama yapacağız ancak bu işlemi bir Nuget paketi kullanarak kolayca yapabileceğiz. Kullanacağımız paketin adı Nlog.&lt;/p&gt;
&lt;h2&gt;Neden loglamaya gerek var ? Nlog Nedir ?&lt;/h2&gt;
&lt;p&gt;Loglama işlemi projeler için vazgeçilmez olmazsa olmaz işlemlerin başında gelir. Yaptığımız bir çok işlemin kaydının tutulması projede oluşabilecek tersliklerin çözümünde büyük kolaylık sağlamaktadır. Projelerin belli kritik yerlerinde loglama yapmak gerekmektedir.&lt;/p&gt;
&lt;p&gt;NLog, .NET platformları için oluşturulmuş rahatça loglama yapmamıza yaran bir loglama paketidir. Ücretsizdir. Nlog sayesinde evetviewer, database , txt uzantılı dosyalara rahatça kayıtları tutabilmekteyiz.&lt;/p&gt;
&lt;h3&gt;Nlog Kurulumu&lt;/h3&gt;
&lt;p&gt;Yazının devamına uygulamalı olarak devam edeceğim. Öncelikle bir console uygulaması açacağız. Bu console uygulamasını servise çevirerek arka planda çalıştırabiliriz. Böylece projemize dahil etmeden servis olarak kullanabiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_nlog3.png&quot; alt=&quot;Nlog3 - Nlog Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu paket programı Nuget Package Manager üzerinden Nlog ve Config dosyasının kurulumunu yapıyoruz.  Sağ tarafta Nlog.config dosyasını açıyoruz. Karşımıza bazı karışık gibi görünen yazılar çıkıyor. Ancak bu yazılar bizim hangi işlemi database loglama, texte loglama gibi işlemleri belirlediğimiz en önemli kısım. Bu config dosyası 2 bölümden oluşuyor. Targets ve Rules tagleri bu bölümlerdir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_02_nlog2.png&quot; alt=&quot;Nlog2 - Nlog Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Nlog Eventlog Kullanımı&lt;/h3&gt;
&lt;p&gt;Örneğin Event log için target taglerinin arasına şu yazılmalı;&lt;/p&gt;
&lt;p&gt;&amp;lt;target xsi:type=&quot;EventLog&quot;
name=&quot;eventlog&quot;
layout=&quot;${message}${newline}${exception:format=ToString}&quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt;Burada type olarak File, database gibi seçenekler de belirleyebiliriz. Ardından name kısmını dolduruyoruz ve layout kısmına da hangi formatta dolduracağımızı belirliyoruz.&lt;/p&gt;
&lt;p&gt;Rules kısmına ise name kısmını hepsini kullanmak istediğimiz için * seçiyoruz. Minlevel ise Trace seçiyoruz böylece tüm seviye logları görebileceğiz. İstenilirse Error, Warning olarak da filtreleme yapabilmekteyiz.&lt;/p&gt;
&lt;p&gt;&amp;lt;logger name=&quot;*&quot;  minlevel=&quot;Trace&quot; writeTo=&quot;file&quot;/&amp;gt;&lt;/p&gt;
&lt;h3&gt;Nlog File Kullanımı&lt;/h3&gt;
&lt;p&gt;File olarak bulunduğu klasöre text formatında tutmamız için aşağıdaki yazıyı targets tagleri arasına ekliyoruzç Burada type file seçiyoruz. Filename kısmında ${basedir} kısmı projenin bulunduğu dosyaya text olarak log dosyası oluşturur. Bunun dosya yolunu istenilen bir yer seçilebilir.&lt;/p&gt;
&lt;p&gt;&amp;lt;target xsi:type=&quot;File&quot; name=&quot;file&quot; fileName=&quot;${basedir}/logs/${shortdate}.log&quot;
layout=&quot;${longdate} ${uppercase:${level}}  ${message}  &quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;Rules kısmını da aynı yukarıdaki şekilde level belirliyoruz. WriteTo ile de hangi name verdiğimiz targeti çağırıyoruz.&lt;/p&gt;
&lt;p&gt;&amp;lt;logger name=&quot;*&quot;  minlevel=&quot;Trace&quot; writeTo=&quot;file&quot;/&amp;gt;&lt;/p&gt;
&lt;h3&gt;Nlog Database Kullanımı&lt;/h3&gt;
&lt;p&gt;Burada işler biraz karmaşık oluyor. Ancak sistem basit ve aynı şekilde devam ediyor. Yine name  vs aynı şekilde ekliyoruz. Ancak bu sefer ekstradan database olduğu için bir connection string ve bu dbye yazma işlemi için de bir stored procedure ve tablo gerekiyor.&lt;/p&gt;
&lt;p&gt;&amp;lt;target     xsi:type=&quot;Database&quot;
name=&quot;db&quot;
connectionString=&quot;${gdc:item=myConnectionstring}&quot;
commandType=&quot;StoredProcedure&quot;
commandText=&quot;[dbo].[NLog_AddEntry]&quot;        &amp;gt;
&amp;lt;parameter name=&quot;@machineName&quot;    layout=&quot;${machinename}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@logged&quot;         layout=&quot;${date}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@level&quot;          layout=&quot;${level}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@message&quot;        layout=&quot;${message}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@logger&quot;         layout=&quot;${logger}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@properties&quot;     layout=&quot;${all-event-properties:separator=|}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@callsite&quot;       layout=&quot;${callsite}&quot; /&amp;gt;
&amp;lt;parameter name=&quot;@exception&quot;      layout=&quot;${exception:tostring}&quot; /&amp;gt;
&amp;lt;/target&amp;gt;&lt;/p&gt;
&lt;p&gt;Burada farklı olarak ben connection stringi  dışarıdan alıyorum. Böylece programa gömülü bir şey yok. Bu da esneklik sağlayarak her yerde kullanıma uygun hale geliyor. Database bilgilerini ise Settings kısmından alacağız.&lt;/p&gt;
&lt;p&gt;&amp;lt;logger name=&quot;*&quot;  minlevel=&quot;Trace&quot; writeTo=&quot;db&quot;  /&amp;gt;&lt;/p&gt;
&lt;p&gt;Yine aynı şekilde rules kısmını da aynı şekide belirliyoruz.&lt;/p&gt;
&lt;p&gt;Database ile ilgili kodları aşağıda vereceğim. Bunu sadce MSsql üzerinden bir sorgu ekranı açıp çalıştırmak yeterli.&lt;/p&gt;
&lt;p&gt;CREATE TABLE [dbo].[NLog] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[MachineName] [nvarchar](200) NULL,
[Logged] [datetime] NOT NULL,
[Level] [varchar](5) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[Logger] [nvarchar](300) NULL,
[Properties] [nvarchar](max) NULL,
[Callsite] [nvarchar](300) NULL,
[Exception] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;CREATE PROCEDURE [dbo].[NLog_AddEntry_p] (
@machineName nvarchar(200),
@logged datetime,
@level varchar(5),
@message nvarchar(max),
@logger nvarchar(300),
@properties nvarchar(max),
@callsite nvarchar(300),
@exception nvarchar(max)
) AS
BEGIN
INSERT INTO [dbo].[NLog] (
[MachineName],
[Logged],
[Level],
[Message],
[Logger],
[Properties],
[Callsite],
[Exception]
) VALUES (
@machineName,
@logged,
@level,
@message,
@logger,
@properties,
@callsite,
@exception
);
END&lt;/p&gt;
&lt;p&gt;Config işlemleri bu kadar. Şimdi console uygulamamıza dönelim. Burada ben Commander adından bir class oluşturdum. Bu işlemleri de yaptıktan sonra classımızı yazıyoruz.&lt;/p&gt;
&lt;p&gt;public class Commander
{
public Commander()
{
try
{
Commander.SetEventlogConfig(Properties.Settings.Default.EventLogName);
Commander.SetDatabaseConfig
(&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;            Properties.Settings.Default.ServerName,
            Properties.Settings.Default.DatabaseName,
             Properties.Settings.Default.UserName,
              Properties.Settings.Default.Password
    );
    }
    catch (Exception ex)
    {
        WriteLog(LogLevel.Error, &quot;Connection Error&quot;, ex);
    }
}
Logger logger = LogManager.GetCurrentClassLogger();
public void WriteLog(LogLevel loglevel, string Message)
{
    logger.Log(loglevel, Message);
}
public void WriteLog(LogLevel loglevel, string Message, Exception ex)
{
    logger.Log(loglevel, Message, ex);
}

public static void SetDatabaseConfig(string ServerName, string DatabaseName, string UserId, string Password)
{
    var databaseTarget = (DatabaseTarget)LogManager.Configuration.FindTargetByName(&quot;db&quot;);
    databaseTarget.ConnectionString = &quot;Server=&quot; + ServerName + &quot;;Database=&quot; + DatabaseName + &quot;;User id=&quot; + UserId + &quot;;Password=&quot; + Password + &quot;;&quot;;
    LogManager.ReconfigExistingLoggers();

}
public static void SetEventlogConfig(string EventLogName)
{
    var eventlogTarget = (EventLogTarget)LogManager.Configuration.FindTargetByName(&quot;eventlog&quot;);
    eventlogTarget.Log = EventLogName;
    eventlogTarget.Source = EventLogName;
    LogManager.ReconfigExistingLoggers();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Bu class oluşturduktan sonra sadece yapmamız gereken classı çağırmak böylece db,text ve eventviewer üzerinde loglama işlemi yapabiliyoruz. Devre dışı bırakmak için config dosyasında istemediğimizi disable etmek yeterlidir.&lt;/p&gt;
&lt;p&gt;Kaynak Kod : &lt;a href=&quot;https://github.com/berkarat/Nlog_Example&quot;&gt;https://github.com/berkarat/Nlog_Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CefSharp Kullanımı ve Örnek Uygulama -2</title><link>https://fuwari.vercel.app/posts/cefsharp-kullanimi-ve-ornek-uygulama-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/cefsharp-kullanimi-ve-ornek-uygulama-2/</guid><description>Merhaba bu yazıda Cefsharp Kullanımı yazımıza devam edeceğiz. Biraz daha detaylı olarak ilerleyip uygulamamızı yapacağız. Uygulamada localde oluşturac</description><pubDate>Wed, 23 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_01_articleocw-58dff32e7375c-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_01_articleocw-58dff32e7375c-min.png&quot; alt=&quot;cefsharp kurulum&quot; title=&quot;cefsharp&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazıda Cefsharp Kullanımı yazımıza devam edeceğiz. Biraz daha detaylı olarak ilerleyip uygulamamızı yapacağız. Uygulamada localde oluşturacağımız .html uzantılı bir index oluşturacağız. Daha sonra bu index.html içerisine yazacağımız bir Javascript  metodunu cefsharp üzerinden çağıracağız. Başlangıçta biraz karmaşık gibi görünse de yazının devamında çok da karışık olmadığını göreceksiniz. Bunalara değinmeden önce biraz Js konusuna değinmemiz ve html sayfamızı oluşturmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;Uygulamamızda 3 tane sayfa olacak ve bu sayfaları kendi browserımız üzerinde çalıştıracağız. İlk sayfa ana sayfa ikincisi bir şifre girme paneli üçüncü ekran ise girilen parola doğru veya yanlışsa bir tepki veren ekran olacak. Tasarım detaylarını basit tutmak istedim çünkü buradaki amaç css değil daha çok cefsharp üzerinde yapacağımız işlemler olacak. İsteğe göre basit bir css örneği yapıyoruz. Ardından işlemlerimizi yapacak kısım Javascript kodlarını yazmamız gerekmektedir.&lt;/p&gt;
&lt;h3&gt;Cefsharp Classları&lt;/h3&gt;
&lt;p&gt;Javascript kodlarını yazarken cefsharp uygulamamızda oluşturacağımız classı kullanacağız. İlk önce winform projesine Initialize sonrasında  aşağıdaki kodu ekliyoruz. Buradan CallBackObjectJS adında bir class oluşturuyoruz. Bu class Cefsharp içerisinde js kodlarını çağırmamıza ya da html sayfaya js komutları göndermemize yaramaktadır. Bu yazıda anlatılanların kalbini oluşturmaktadır.&lt;/p&gt;
&lt;p&gt;chrome.RegisterJsObject(&quot;object&quot;, new CallbackObjectForJs());&lt;/p&gt;
&lt;p&gt;Daha sonra bu class içerisine yapacağımız metodları yazıyoruz. Örneğin mainpage sayfasına gitmek için bir metod yapabiliriz. Bu metodda Load() sınıfını kullanarak  html bir sayfa çağırabiliriz.&lt;/p&gt;
&lt;p&gt;public void getpage(string pageurl)
{
chrome.Load(path+pageurl);
}&lt;/p&gt;
&lt;h2&gt;Javascript İşlemleri&lt;/h2&gt;
&lt;p&gt;Bunun dışında sayfada bir script metodu çağırabiliriz. Bunu da yine oluşturduğumuz classtan türetip ExecuteScriptAsync() komutuyla işleyebilir, aşağıdaki gibi basit bir alert() scripti çağırabiliriz.&lt;/p&gt;
&lt;p&gt;chrome.ExecuteScriptAsync(&quot;alert(&apos;Page Not Found !!&apos;);&quot;);&lt;/p&gt;
&lt;p&gt;Html sayfadan da bilgi bize gelmektedir.  Örnek uygulamada şifre bilgileri html üzerinden winforma gelip orada doğruluk kontrolü yapıp bir sonuç döndürebiliyoruz. Böylece js ile c# arasında bir iletişim kurmuş oluyoruz. Parola bilgisi bizde olduğundan bu bilgiyi database ile check edip ona göre bir sonuç da döndürebiliriz.&lt;/p&gt;
&lt;p&gt;Bu işlemleri yaptıracağımız js kodlarını da yazmamız gerekmektedir.  Örneğin basit olarak bir anasayfaya döndüren bir metod yazalım. C# üzerinde oluşturduğumuz object nesnesi üzerinden metodlara ulaşabiliyoruz.&lt;/p&gt;
&lt;p&gt;function go_mainpage(){&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;object.getpage(&apos;mainpage.html&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Biraz daha karmaşıklara geçersek c# tarafına array yollama metodunu da yazalım. Yine benzer mantıkla çalışmaktadır. Sadece JS tarafında diziye çeviriyoruz. c# tarafında da ayrıştırırken Array metodundan ayırıp işliyoruz.&lt;/p&gt;
&lt;p&gt;function  go_lastscreen (password,url){
let arr = new Array();
arr = [password,url];
object.go_lastscreen(arr);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Son olarak da bir timer ekleme örneği var. Bunda da eğer belli bir süreden sonra sayfayı yönlendirebiliriz. Burada timera vereceğimiz süre sonunda ana sayfaya dönüş yapacak bir metod.&lt;/p&gt;
&lt;p&gt;function startTimer(duration, display) {
var timer = duration;
setInterval(function () {  display.textContent =   timer;&lt;br /&gt;
if    (timer &amp;lt;10)
{
document.getElementById(&quot;timer&quot;).style.backgroundColor = &quot;red&quot;;
}
if (--timer &amp;lt; 0) {
timer = 0;&lt;br /&gt;
go_mainpage();
}
}, 1000);
}
window.onload =
function (seconds) {
var seconds=60;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       display = document.querySelector(&apos;#timer&apos;); 
   startTimer(seconds, display);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;Bu işlemleri de yaparken sayfanın yüklenme anında ya da sonrasinda gibi hareketleri de eventler üzerinden yakalayıp işlemek gerekmktedir. Bunun için loading state yani yüklenme bitti mi bitmedi mi kontrolü yapmak gerekmektedir. Aşağıdaki gibi bir örnek açıklayıcı olacaktır.&lt;/p&gt;
&lt;p&gt;private void Chrome_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
if (!e.IsLoading)
{
// sayfa yüklendi
switch (page)
{
case &quot;last&quot;:
if (passwordistrue)
{
// password true
chrome.ExecuteScriptAsync(&quot; window.onload(writepassword(&apos;&quot;+ password + &quot;&apos;));&quot;);
}
else
{
chrome.ExecuteScriptAsync(&quot; window.onload(writewrong(&apos;WRONG PASSWORD&apos;));&quot;);
}
page = string.Empty;
break;
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     }

 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Son olarak dikkat etmemiz gereken bir konudanbahsedeceğim. Oluşturduğumuz browserı tıpkı sqlde connection kapatır gibi kapatmamız gerekmektedirç Aksi takdirde arka planda çalışacak ve CPU kullanımını etkileyecektir.&lt;/p&gt;
&lt;p&gt;private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Cef.Shutdown();
}&lt;/p&gt;
&lt;p&gt;Son olarak bu html dosyalarını C:\inetpub\wwwroot dosya yoluna ekleyip çalıştırmamız gerekmektedir. Bu konuya dair detaylı bilgiyi   &lt;a href=&quot;https://blog.berkarat.com/windows-iis-kurulumu/&quot;&gt;IIS Kullanımı&lt;/a&gt; yazısında yazmıştım.&lt;/p&gt;
&lt;p&gt;Uygulamaya ait kaynak dosyalara aşağıdan ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Cefsharp_Example&quot;&gt;https://github.com/berkarat/Cefsharp_Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>CefSharp Kullanımı ve Örnek Uygulama – 1</title><link>https://fuwari.vercel.app/posts/cefsharp-kullanimi-ve-ornek-uygulama-1/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/cefsharp-kullanimi-ve-ornek-uygulama-1/</guid><description>_📌 Güncelleme (Ağustos 2026): CefSharp hâlâ kullanılabiliyor; yeni sürümlerde platform hedefi ve JavaScript binding kullanımındaki değişikliklere dik</description><pubDate>Sat, 19 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_01_articleocw-58dff32e7375c-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_01_articleocw-58dff32e7375c-min.png&quot; alt=&quot;cefsharp kurulum&quot; title=&quot;cefsharp&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): CefSharp hâlâ kullanılabiliyor; yeni sürümlerde platform hedefi ve JavaScript binding kullanımındaki değişikliklere dikkat edilmelidir.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımız devam niteliğinde bir yazı olacaktır. Daha önce  &lt;a href=&quot;https://blog.berkarat.com/webbrowser/&quot;&gt;C# Web Browser Kullanımı&lt;/a&gt; yazısında browser kullanımından bahsetmiştim. Ancak bu browser yapı olarak eski Internet Explorer altyapısını kullandığından dolayı JavaScript uyumluluk hataları almaktaydı. Bu sebeple bugün Cefsharp eklentisinin kurulumundan ve örnek uygulamadan bahsedeceğim. Bu anlatma işlemini winform üzerine bir web browser kurup onun üzerinde işlemler yaparak anlatacağım.&lt;/p&gt;
&lt;h2&gt;Cefsharp Nedir ?&lt;/h2&gt;
&lt;p&gt;Chromium altyapısını kullanan chrome web browserını kullanmamıza yarayan bir pakettir. Bu paket sayesinde chrome içerisinde kullandığımız browser özelliklerinin hepsine erişebilmekteyiz.&lt;/p&gt;
&lt;h2&gt;Cefsharp Kurulumu&lt;/h2&gt;
&lt;p&gt;Bu paketin iki türlü kurulum mevcuttur. Ya aşağıda vereceğim link üzerinden dosyaları indirip projemize eklemek. Diğer yol ise NuGet içerisinden CefSharp.WinForms paketini kurmaktır; güncel projelerde NuGet kurulumu tercih edilir. Ben NuGet üzerinden indirip işlemleri yapacağım. Aşağıdaki gibi install dedikten sonra birkaç saniye içinde hızlıca kurulum da gerçekleşmiş oluyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-19_13-10-25-min.png&quot; alt=&quot;cefsharp &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kurulum yaptıktan sonra debug işleminde  &lt;em&gt;” cefsharp.common contains unmanaged resources ”&lt;/em&gt;  hatasını alacağız. Bu hata aslında işlemci uyumundan kaynaklı olduğundan hangi işlemciyle debug etmemiz gerektiğini  ayarlamalıyız. Bunun için üstteki menüden Build&amp;gt;Configuration Manager yoluna gidiyoruz. Açılan ekranda platform sekmesine tıklayarak New seçeneğini seçiyoruz. Bu örnekte x86 yani 32 bitlik işlemci seçilmiştir. Güncel CefSharp sürümlerinde hedef platformu (x86/x64/AnyCPU) kullandığınız paket sürümü ve işletim sistemiyle uyumlu seçmelisiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-19_13-19-08-min.png&quot; alt=&quot;cefsharp kurulum&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Cefsharp Kullanım&lt;/h2&gt;
&lt;p&gt;Cefsharp kullanımı için bir adef winform/wpf gibi browser görüntülemek için gereken bir alan oluşturmamız yeterlidir. Bundan sonrasında using bloğuna gereken referansları ekleriz.&lt;/p&gt;
&lt;p&gt;using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;&lt;/p&gt;
&lt;p&gt;Sonrasında aşağıdaki kod bloğunu Form oluşturulduktan hemen sonra ekliyoruz.&lt;/p&gt;
&lt;p&gt;public Form1()
{
InitializeComponent();
this.WindowState = FormWindowState.Maximized;
CefSettings settings = new CefSettings();
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
Cef.Initialize(settings);&lt;br /&gt;
chrome = new ChromiumWebBrowser(&quot;http://google.com&quot;);
chrome.StatusMessage += Chrome_StatusMessage;
chrome.IsBrowserInitializedChanged += Chrome_IsBrowserInitializedChanged;
chrome.FrameLoadStart += Chrome_FrameLoadStart;
chrome.FrameLoadEnd += Chrome_FrameLoadEnd;
chrome.RegisterJsObject(&quot;object&quot;, new CallbackObjectForJs());
this.panel1.Controls.Add(chrome);
chrome.Dock = DockStyle.Fill;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 notu:&lt;/strong&gt; Yeni CefSharp sürümlerinde JavaScript binding tarafında JavascriptObjectRepository.Register kullanımını ve seçtiğiniz CefSharp sürümünün dokümantasyonunu kontrol edin; LegacyJavascriptBindingEnabled daha çok eski kodlarla uyumluluk içindir.&lt;/p&gt;
&lt;p&gt;nBu kodda Settings ayarlarını yapıyoruz. Tıpkı webbrowser örneğimizdekine benzer şekildedir. O örnekte Navigate metodu sayfaya gitmemize yaraken burada Load metodunu kullanıyoruz. Burada bazı eventlerden de bahsetmem gerekmekte. Bu eventler sayesinde sayfanının durumunu 404 hatası alıp almadığı gibi start stop durumlarını kontrol edebilmekteyiz. Durumuyla ilgili sorgulamaları da bu eventler sayesinde ulaşabiliriz.&lt;/p&gt;
&lt;p&gt;private void Chrome_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{&lt;br /&gt;
if (e.HttpStatusCode == 404 || e.HttpStatusCode == 0)
{
// 404 Not Found !!
}
}&lt;/p&gt;
&lt;p&gt;Bu Event sayesinde sayfa yüklenmediği hata aldığı durumları kontrol etmek mümkündür. Bir diğer event ise sayfanın değil browserın yüklenip yüklenemediğini sorgulamamıza yarayan Chrome_IsBrowserInitializedChanged eventi. Bu eventi de aşağıdaki gibi kullanıyoruz. Burada da !e.IsBrowserInitialized komutunu if bloğunda kullanarak browsera ait bir problem olduğunda nasıl bir refleks göstereceğimizi belirleyebiliriz.&lt;/p&gt;
&lt;p&gt;Kurulum dosyaları&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cefsharp/CefSharp&quot;&gt;https://github.com/cefsharp/CefSharp&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# WebBrowser Kullanımı ve Örnek Uygulama</title><link>https://fuwari.vercel.app/posts/webbrowser/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/webbrowser/</guid><description>_📌 Güncelleme (Ağustos 2026): WinForms WebBrowser nesnesi artık eski IE altyapısında kaldığı için WebView2/CefSharp alternatifleriyle birlikte değerl</description><pubDate>Tue, 15 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_01_browsers-min.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2019_01_browsers-min-696x543.jpg&quot; alt=&quot;Browsers Min - C# WebBrowser Kullanımı ve Örnek Uygulama&quot; title=&quot;browser&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): WinForms WebBrowser nesnesi artık eski IE altyapısında kaldığı için WebView2/CefSharp alternatifleriyle birlikte değerlendirildi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda iki güçlü dilin hibrit şekilde kullanımından bahsedeceğiz. Bu iki dilden birisi C# diğeri ise web dilleri olarak geçen js ve html. Visual Studio üzerinden webbrowser işlemleri yapacağız. Bu işlemleri ilk önce normal olarak visual studionun default webbrowser nesnesi üzerinden yapacağız. Bu browser nesnesi browser olarak eski Internet Explorer altyapısını kullanmaktadır, bunun eksik yanlarını göreceğiz. Ardından Cefsharp paketi ile birlikte browserımız chrome a dönecek ve artık daha uyumlu bir hal aldığından işlerimiz hızlı ilerleyecek.&lt;/p&gt;
&lt;p&gt;Bu yazımız ve devamındaki yazı serisinde iki programı birden kullanacağız. C# browser işlemlerimizi yapmak için Visual Studio diğer html css web işlemleri için ise editör olarak Visual Studio Code kullanacağız.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 notu:&lt;/strong&gt; Yeni WinForms/WPF projelerinde WebBrowser yerine Microsoft Edge Chromium tabanlı WebView2 önerilir. Chromium’u uygulamaya gömmek isterseniz CefSharp hâlâ bir alternatiftir.&lt;/p&gt;
&lt;p&gt;n&lt;/p&gt;
&lt;h3&gt;C# Webbrowser Kullanımı&lt;/h3&gt;
&lt;p&gt;İlk olarak bir adet winform projesi oluşturuyoruz. Ardından sol taraftaki toolbox menüsünden webbrowser nesnesini seçiyoruz. Daha önce oluşturduğumuz panelin içerisine ekliyoruz. Ardından ileri geri gibi webbrowser komutlarını ve refresh komutlarını kullanmak için bir tasarım yapmamız gerekiyor. Ben bunun için bir toolstrip nesnesi kullanarak en üstte bir bar oluşturdum. Bu işlemlerden sonra açılış sayfası olarak google belirlemek istedim. Burada webbrowser nesnesi üzerinden Navigate metodu ile birlikte gideceğimiz sayfayı belirleyebiliyoruz. Sayfa oluştuğu anda google sayfasına gitmesini belirliyorum. Aynı navigate metodunu diğer şeylerde de kullanacağız.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-13_13-30-37-min.png&quot; alt=&quot;2019 01 13 13 30 37 Min - C# WebBrowser Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forward&lt;/strong&gt; ve &lt;strong&gt;Back&lt;/strong&gt; işlemleri için bir if bloğu oluşturup cangoforward değerine bakıyoruz. Bu değer bool türündedir. Eğer false ise ileriki sayfaya gidemez. Ancak değilse goforward() metodunu çalıştırıp bir sonraki sayfaya devam edebilmekteyiz.&lt;/p&gt;
&lt;p&gt;private void forwardbtn_Click(object sender, EventArgs e)
{
if (webBrowser1.CanGoForward)
{
webBrowser1.GoForward();
}
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Home&lt;/strong&gt; işlemi için ise yine navigate metodunu belirleyeceğimiz bir sayfaya yönlendirerek yapmaktayız.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt; işlemini gerçekleştirmek için ben google arama motorunu kullandım. İsterseniz başka motorlar da seçebilirsiniz. Burada textbox içerisinden aldığım metini google üzerinden arama işlemine tabii tutuyoruz. Eğer textbox boş ise de direkt google arama sayfasına yönlendiriyoruz.&lt;/p&gt;
&lt;p&gt;private void toolStripButton2_Click(object sender, EventArgs e)
{
if (toolStripTextBox2.Text.Length &amp;gt; 1)
{
webBrowser1.Navigate(&quot;https://www.google.com/search?q=&quot; + toolStripTextBox2.Text);
}
else
{
webBrowser1.Navigate(&quot;https://www.google.com&quot;);
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Web browser eventlerinden olan  DocumentCompleted eventini örnek olarak kullandım. Bu event üzerinden e.url diyerek yüklenen url string olarak almamız mümkün. Aynı zamanda sayfanın yüklenip yüklenmediği gibi durumları da kontrol edebilmekteyiz.&lt;/p&gt;
&lt;p&gt;private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
gidilen_url = e.Url.ToString();&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Sık kullanılanlar işlemi için ise bir dropdown menü oluşturuyoruz. Ardından dropdown item olarak gidilen_url stringini dropdowna ekliyoruz. Bunların tekrar etmemisi için o listede bulunan string ile gidilen_url stringlerini karşılaştırmamız gerekmektedir. Aksi takdirde duplicate işlemi olur.&lt;/p&gt;
&lt;p&gt;Gerçek bir browser gibi görünmesi için winformumuzun state kısmını maximized olarak dönüştürebilir ve tam ekran olarak kullanabiliriz.&lt;/p&gt;
&lt;h3&gt;Web Browser Script Error&lt;/h3&gt;
&lt;p&gt;Ancak yazının başında bahsettiğim gibi winform browser olarak explorer kullandığından yeni scriptler ve csslerle uyumluluk sorunu göstermektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-13_13-31-20-min.png&quot; alt=&quot;2019 01 13 13 31 20 Min - C# WebBrowser Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu sebeple resimdeki gibi bir hata ile karşılaşabilirsiniz. Bu sorunu çözmek için farklı bir browser nesnesi kullanmak gerekmektedir. Güncel projelerde bunun için WebView2 veya CefSharp gibi Chromium tabanlı çözümler değerlendirilebilir.&lt;/p&gt;
&lt;p&gt;Örnek uygulama linkini aşağıdan bulabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/C-Webbrowser-Example&quot;&gt;https://github.com/berkarat/C-Webbrowser-Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows IIS Kurulumu (Resimli Anlatım)</title><link>https://fuwari.vercel.app/posts/windows-iis-kurulumu/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/windows-iis-kurulumu/</guid><description>Merhabalar bu yazımızın konusu IIS (Internet Information Services) olacak. Bu konu hakkında genel bilgiler verdikten sonra, nasıl kullanıldığı, kurulu</description><pubDate>Sat, 12 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_01_windows_IIS.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_01_windows_IIS-696x379.png&quot; alt=&quot;Windows Iis - Windows IIS Kurulumu (Resimli Anlatım)&quot; title=&quot;Windows IIS&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızın konusu IIS (Internet Information Services) olacak. Bu konu hakkında genel bilgiler verdikten sonra, nasıl kullanıldığı, kurulum gibi detaylı bilgilere değineceğim.&lt;/p&gt;
&lt;p&gt;IIS yani internet sunucusu olarak düşünebiliriz. Microsoft tarafından geliştirilmiş olan bir windows sunucudur. Kısacası  windows tabanlı ve web üzerinden işlem yapan programların kullabileceği bir sunucu olarak görebiliriz. Localhost üzerinden web geliştirmeleri yapmak mümkündür. ASP.NET veya Visual Studio ortamında geliştirilmiş projeler IIS üzerinde uyumlu bir şekilde çalışmaktadır. Bu yüzden bu yazılımları geliştirmek ve görüntülemek için kullanılmaktadır. Uzak bir sunucu gereksinimini ortadan kaldırıp  localhost üzerinden web tabanlı projeleri test edebilmekteyiz. Bunlara ek olarak web server dışında FTP server olarak da kullanmak mümkündür.&lt;/p&gt;
&lt;h2&gt;IIS KURULUMU&lt;/h2&gt;
&lt;p&gt;IIS kurulumu oldukça basittir. Kurulum için öncelikle Denetim Masasına giriyoruz. Ardından Programlar kısmına geliyoruz. Bunun kısa yolu olarak Windows+R yapıp Çalıştır menüsünden appwiz.cpl  yazarak ulaşabiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-12_20-01-28-min.png&quot; alt=&quot;2019 01 12 20 01 28 Min - Windows IIS Kurulumu (Resimli Anlatım)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ardından resimdeki gibi  Turn Windows features on or off kısmına tıklıyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-12_20-02-43-min.png&quot; alt=&quot;2019 01 12 20 02 43 Min - Windows IIS Kurulumu (Resimli Anlatım)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra karşımıza gelen ekrandan resimdeki gibi Internet Information Services kısmını seçiyoruz. Yukarıda bahsettiğim gibi FTP server olarak kullanmak istersek onu da seçmemiz gerekmektedir. Ardından OK seçeneğini seçiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-12_20-05-56-min-e1547315407701.png&quot; alt=&quot;2019 01 12 20 05 56 Min - Windows IIS Kurulumu (Resimli Anlatım)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra bu ekran gelecek ve sonuç olarak Serverimiz kurulumu tamamlanmış olacak. Bu işlem bir iki dakika sürebilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2019_01_2019-01-12_20-08-52-min.png&quot; alt=&quot;2019 01 12 20 08 52 Min - Windows IIS Kurulumu (Resimli Anlatım)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Yükleme tamamlandıktan sonra karşımıza bir yönetim paneli gelmektedir. Bu panel üzerinden port ayarları serverimizin start stop restart gibi komutlarını ve diğer detaylı değişimleri yapmak mümkündür. Sol taraftaki Default Web Site sağ tıklayıp explore dediğimizde klasöre gitmekte. Sağ tarafta browse*:80 yazan kısımda ise bu klasörde bulunan localhostumuzu çalıştıracaktır.&lt;/p&gt;
&lt;p&gt;Ardından işlemlerin sisteme girmesi için bilgisayarımızı yeniden başlatmamız gerekiyor. Bilgisayar açıldıktan sonra C:inetpubwwwroot klasörü bizim localhost diyeceğimiz yer olacak. Bu dosya içerisinde  default olarak iisstart isminde bir html dosyası bulunmaktadır. Bizim bununla değil kendi yaptığımız html sayfasını koyup işlemleri yaptıracağız. O yüzden içerisine bir tane test.html koyalım. Ardından browser üzerinden localhost/test.html yazdığımızda bizim test.html sayfamıza ulaşacaktır. Bundan sonra artık html,css,js gibi tüm dosyaları wwwroot klasörüne ekleyeceğiz.&lt;/p&gt;
&lt;p&gt;Microsoft son olarak IIS 10.0’ı piyasaya sürmüştür. Windows işletim sistemlerine özgün olduğundan ve diğer işletim sistemlerinde bulunmamaktadır. Aşağıda vereceğim linkler üzerinden güncel olarak kullanabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.microsoft.com/tr-tr/download/details.aspx?id=34679&quot;&gt;IIS 8.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.microsoft.com/tr-tr/download/details.aspx?id=48264&quot;&gt;IIS 10.0&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>SQL Temporary Table, Substring ve Charindex İşlemleri</title><link>https://fuwari.vercel.app/posts/sql-temporary-table-substring-ve-charindex-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/sql-temporary-table-substring-ve-charindex-islemleri/</guid><description>Bu yazıda Sql Server üzerinde kullanılan bazı sorgulama tiplerinden bahsedeceğiz. Bu sorgulamalar daha ileri seviye ve büyük verilerde kullanılan sorg</description><pubDate>Thu, 10 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_SQL-Server-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_SQL-Server-min-696x758.png&quot; alt=&quot;Microsoft Sql Server&quot; title=&quot;Sql Server&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda Sql Server üzerinde kullanılan bazı sorgulama tiplerinden bahsedeceğiz. Bu sorgulamalar daha ileri seviye ve büyük verilerde kullanılan sorgulama tipleridir. Temporary table  yani geçici tablolar kolaylık sağlamaları ve birden çok tablo işlemlerini tek bir sorguda halletmemize yaramaktadır. Bu yazıyı anlayabilmek için daha önceki yazılarımdan olan &lt;a href=&quot;https://blog.berkarat.com/stored-procedure-islemleri-2/&quot;&gt;Stored Procedur İşlemleri&lt;/a&gt; yazısını okumanızı tavsiye ederim aksi halde daha da karışacaktır.&lt;/p&gt;
&lt;h2&gt;Substring ve Charindex&lt;/h2&gt;
&lt;p&gt;İlk olarak Substring ve Charindexin ne olduğu hakkından bahsedeceğim. Substring diğer dillerde de olduğu gibi aynı şekilde kullanılmaktadır. Adından da anlaşıldığı gibi sublara yani alt metinlere böler. Elimizde bulunan text veriyi parçalamaya yaramaktadır. Bu sayede örneğin xml verisini parçalara ayırıp parse etme işlemini sql üzerinde yapabilmekteyiz. Bu sayede programda değil database üzerinde hallederek yük dağılımı yapabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Charindex de substring gibi bir fonksiyondur. Anlamı içinde gizlidir aslında char ve index. Bize aradığımız karakterin index konumunu vermektedir. Bu sayede hangi karakter nerede gibi sonuçlar alabiliriz.&lt;/p&gt;
&lt;p&gt;SELECT Name,
CHARINDEX(&apos;a&apos;,Name) AS &quot; A  harfinin konumu&quot;
FROM Testtable&lt;/p&gt;
&lt;p&gt;substring ([MESSAGEBODY], (SELECT CHARINDEX(&apos;&amp;lt;COMMANDID&amp;gt;&apos;, [MESSAGEBODY]))+len(&apos;&amp;lt;COMMANDID&amp;gt;&apos;),(SELECT CHARINDEX(&apos;&amp;lt;/COMMANDID&amp;gt;&apos;, [MESSAGEBODY])-len(&apos;&amp;lt;/COMMANDID&amp;gt;&apos;))-(SELECT CHARINDEX(&apos;&amp;lt;COMMANDID&amp;gt;&apos;, [MESSAGEBODY]))+1)&lt;/p&gt;
&lt;h2&gt;Temporary Table (Geçici Tablo)&lt;/h2&gt;
&lt;p&gt;Sql ile çalışırken genellike büyük verilerle uğraşmamız gerekmektedir. Bu gibi durumlarda da iki veya daha fazla tablodan gelen verileri birbirleri ile ilşkilendirip diğer tablo üzerinde işlemler yapmak gibi anlatması bile zor olan durumlarla sık sık karşılaşmaktayız. Bu yüzden aldığımız bazı bilgileri geçici olarak bir depolama alanına koymalı ve sonra bunları oradan kullanmalıyız.&lt;/p&gt;
&lt;p&gt;Bu bize ne fayda sağlamaktadır dersek. Bilgi karışıklığını önlemekte, sistem yükünü azaltmaktadır.&lt;/p&gt;
&lt;p&gt;Gelelim Temptable nasıl kullanılmaktadır. 3 temel tipte kurulmaktadır. Önce temptable create ediyoruz. Daha sonra bu temptable içerisini dolduruyoruz ve son adım olarak da bu tablodan select işlemini alıyoruz. Temporary tablolar iki tipe ayrılır. Local ve global olarak ayrılmaktadır. Local tablolar sadece o anda çalışır ve biter. Başka sorgular içerisinde çağırılamaz. Eğer çağırılıyorsa aşağıdaki uyarıyı alacaksınız.&lt;/p&gt;
&lt;p&gt;Msg 208, Level 16, State 1, Line 1
Invalid object name ‘temptable&apos;&lt;/p&gt;
&lt;p&gt;Ancak global tablolar bağlantı olduğu sürece istenilen her yerden her kullanıcı çağırabilmektedir.&lt;/p&gt;
&lt;p&gt;Birbilerinin tek farkı  local -&amp;gt; # global-&amp;gt; ## şeklinde kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;-- Eğer Global olarak tanımlamak isteseydik  ##TempLogTable şeklinde yazmamız yeterliydi
CREATE TABLE #TempLogTable (
[ID] [int]  NULL,
[MESSAGELABEL] [nvarchar](150) NULL,
[MESSAGEBODY] [text] NULL,
)
insert INTO #TempLogTable (
[ID],
[MESSAGELABEL],
[MESSAGEBODY])&lt;/p&gt;
&lt;p&gt;SELECT
[ID]
,[MESSAGELABEL]
,[MESSAGEBODY]
FROM [Test_db].[dbo].[tbl_test]&lt;/p&gt;
&lt;p&gt;Burada da görüldüğü gibi karmaşık bir yapısı bulunmamaktadır. Ancak select ve inser dışında update işlemini de yapmaktayız.&lt;/p&gt;
&lt;p&gt;update #TempLogTable
SET
[ID] = (select top 1 COMMAND FROM [APP_LIST] where ID = #TempSendCommandTable.ID),
[MESSAGELABEL] = (select top 1 MESSAGELABEL FROM #TempLogTable2 where APP_ID = #Temptabl2.ID and order by DATE_TIME desc),
[MESSAGEBODY] = (select top 1 [RESPDESCRIPTION] FROM #TempLogTable)&lt;/p&gt;
&lt;p&gt;where ID=@ID&lt;/p&gt;
&lt;p&gt;Ancak bunun gibi birazcık daha karmaşık bir yapı ve farklı tablolar işin içine girdiği zaman geçici tablolar hayat kurtarmaktadır. Bu gibi durumları farklı  sorgularla yazmak bazen mümkün olmamaktadır.&lt;br /&gt;
Aynı sorgu içerisinde birden fazla temp tablo kullanılabilir ve birbirleri ile ilişkilendirebilmek mümkündür.&lt;/p&gt;
&lt;p&gt;update #TempLogTable
SET
[RESPDESCRIPTION] =  (select top 1 substring ([MESSAGEBODY], (SELECT CHARINDEX(&apos;&amp;lt;DESCRIPTION&amp;gt;&apos;, [MESSAGEBODY]))+len(&apos;&amp;lt;DESCRIPTION&amp;gt;&apos;),(SELECT CHARINDEX(&apos;&amp;lt;/DESCRIPTION&amp;gt;&apos;, [MESSAGEBODY])-len(&apos;&amp;lt;/DESCRIPTION&amp;gt;&apos;))-(SELECT CHARINDEX(&apos;&amp;lt;DESCRIPTION&amp;gt;&apos;, [MESSAGEBODY]))+1)   FROM [DynamicKiosk].[dbo].[VK_APPLOG] where APPID=@APPID and KIOSKID=@KIOSKID and MESSAGETYPE = 4 order by INSERTDATE DESC),
[RESPONSECODE] =  (select top 1 substring ([MESSAGEBODY], (SELECT CHARINDEX(&apos;&amp;lt;RESPONSE_CODE&amp;gt;&apos;, [MESSAGEBODY]))+len(&apos;&amp;lt;RESPONSE_CODE&amp;gt;&apos;),(SELECT CHARINDEX(&apos;&amp;lt;/RESPONSE_CODE&amp;gt;&apos;, [MESSAGEBODY])-len(&apos;&amp;lt;/RESPONSE_CODE&amp;gt;&apos;))-(SELECT CHARINDEX(&apos;&amp;lt;RESPONSE_CODE&amp;gt;&apos;, [MESSAGEBODY]))+1)   FROM [DynamicKiosk].[dbo].[VK_APPLOG] where APPID=@APPID and KIOSKID=@KIOSKID and MESSAGETYPE = 4 order by INSERTDATE DESC),
[COMMANDID] = (select top 1 substring ([MESSAGEBODY], (SELECT CHARINDEX(&apos;&amp;lt;COMMANDID&amp;gt;&apos;, [MESSAGEBODY]))+len(&apos;&amp;lt;COMMANDID&amp;gt;&apos;),(SELECT CHARINDEX(&apos;&amp;lt;/COMMANDID&amp;gt;&apos;, [MESSAGEBODY])-len(&apos;&amp;lt;/COMMANDID&amp;gt;&apos;))-(SELECT CHARINDEX(&apos;&amp;lt;COMMANDID&amp;gt;&apos;, [MESSAGEBODY]))+1)   FROM [DynamicKiosk].[dbo].[VK_APPLOG] where APPID=@APPID and KIOSKID=@KIOSKID and MESSAGETYPE = 4 order by INSERTDATE DESC),
[COMMANDDESCRIPTION] =  (select top 1 COMMAND FROM [DynamicKiosk].[dbo].[VK_APP_COMMAND_LIST] where COMMAND_ID = @COMMANDID and APP_ID = @APPID)&lt;/p&gt;
&lt;p&gt;where KIOSKID = @KIOSKID and APPID=@APPID and COMMANDID = @COMMANDID&lt;/p&gt;
&lt;p&gt;Burada da Substring, Charindex ve temptable birlikte kullanımı örnklenmiştir. Bu sayede farklı tablolar farklı şekillerde birbirleriyle bağlanıp sonuç elde edilebilir.&lt;/p&gt;
&lt;p&gt;Ancak bunları test etmek için tavsiyen bir stored procedure oluşturmak ve bunun üzerinden işlemleri yapmaktır. Yoksa bir defa create ettiğimiz tabloyu ikinciye hata verecektir.&lt;/p&gt;
&lt;p&gt;Msg 2714, Level 16, State 6, Line 1
There is already an object named &apos;#Temptable&apos; in the database.&lt;/p&gt;
</content:encoded></item><item><title>Windows Service ve Application İşlemleri – 2</title><link>https://fuwari.vercel.app/posts/windows-service-ve-application-islemleri-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/windows-service-ve-application-islemleri-2/</guid><description>Bu yazımız da devam niteliğinde bir yazıdır. [Windows Service ve Application İşlemleri](https://blog.berkarat.com/windows-islemleri/) yazısının devamı</description><pubDate>Tue, 08 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2019_01_app-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2019_01_app-min.png&quot; alt=&quot;App Min - Windows Service ve Application İşlemleri&quot; title=&quot;application&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımız da devam niteliğinde bir yazıdır. &lt;a href=&quot;https://blog.berkarat.com/windows-islemleri/&quot;&gt;Windows Service ve Application İşlemleri&lt;/a&gt; yazısının devamıdır. İlk yazıda Windows applicationlar üzerinden start stop restart ve status işlemlerini anlatmıştım. Bu yazıda ise Windows service üzerinde bu işlemleri yapacağız. Servisler uygulamalar gibi benzer şekilde çalışmaktadır.  Bu işlemler için önce bir Ws adında bir class oluşturuyoruz. Metodlarımızı bu class üzerinden ilerleyeceğiz.&lt;/p&gt;
&lt;h2&gt;Service Start&lt;/h2&gt;
&lt;p&gt;Bu metodda sadece servis adı gerekli. İlk önce çalıştırmak istediğimiz metodun durumuna bakıyoruz. Bu işlem için ServiceController classından yararlanıyoruz. Bu classa ulaşabilmemiz için ise System.ServiceProcess sınıfına erişmemiz gerekmektedir. References üzerinden System.ServiceProcess referans olarak ekliyoruz.&lt;/p&gt;
&lt;p&gt;using System.ServiceProcess;&lt;/p&gt;
&lt;p&gt;Daha sonra servis var mı diye kontrol etmemiz gerekmektedir. Bu işlemi de ManagementObjectSearcher nesnesi ile yapabiliyoruz. Bu class içinde aşağıdaki sınıfı referans olarak eklemeliyiz.&lt;/p&gt;
&lt;p&gt;using System.Management;&lt;/p&gt;
&lt;p&gt;Daha sonra buradan system32 içerisinde bir sorgu yolluyoruz. Eğer servis bilgileri var ise devam ediyoruz. Bu bilgilerde servis çalışıp çalışmadığı da bulunmaktadır. Eğer çalışıyor ise zaten start komutu çalışmayıp sadcee mesaj dönecektir. Çalışmıyor ise de  ServiceController service olarak oluşturulan nesne ile start() metodunu çalıştırıyoruz ve servisimiz çalışıyor.&lt;/p&gt;
&lt;p&gt;try
{
ServiceControl(servicename);
service.Refresh();
if (service.Status != ServiceControllerStatus.Running)
{
Console.WriteLine(servicename.ToString() + &quot;  Service Starting....&quot;);&lt;br /&gt;
service.Start();
Thread.Sleep(200);
int i = 0;
while (service.Status != ServiceControllerStatus.Running)
{
service.Refresh();
Thread.Sleep(1000);
i++;
if (i &amp;gt;= RestartTimeout / 100)
{
break;
}
}
service.Refresh();
Console.WriteLine(&quot;Service Status  &quot; + service.Status.ToString());
}
else
{
// already service started
Console.WriteLine(&quot;Service Status  &quot; + service.Status.ToString());&lt;br /&gt;
}
}
catch (Exception Ex)
{
Console.WriteLine(Ex);
}&lt;/p&gt;
&lt;h2&gt;Service Stop&lt;/h2&gt;
&lt;p&gt;Yukarıdaki işlemler gibi servisin çalışıp çalışmadığına bakıyoruz. Ardından eğer çalışmıyor ise service.Stop() metodu ile servisi durdurabiliyoruz. Eğer servis otomatik olarak çalışmaya ayarlandıysa kapatma işlemi bazen yapılamadığı oluyor. Bu yüzden servisin kapatılıp kapanmadığını kontrol etmemiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;try
{
ServiceControl(servicename);
if (service.Status != ServiceControllerStatus.Stopped)
{
Console.WriteLine(servicename.ToString() + &quot;  Service Stoping....&quot;);
service.Stop();
int i = 0;
while (service.Status != ServiceControllerStatus.Stopped)
{
service.Refresh();
Thread.Sleep(1000);
i++;
if (i &amp;gt;= RestartTimeout / 100)
{
break;
}
}
Console.WriteLine(&quot;Service Status  &quot; + service.Status.ToString());
}
else
{
Console.WriteLine(servicename.ToString() + &quot;Service Already STOP&quot;);&lt;br /&gt;
// already service stop
}
}
catch (Exception ex)
{&lt;br /&gt;
Console.WriteLine(ex.Message.ToString());
}&lt;/p&gt;
&lt;h2&gt;Service Restart&lt;/h2&gt;
&lt;p&gt;Restart işlemi için önce servisin durumuna bakıyoruz eğer çalışıyorsa stop işlemini uyguluyoruz.Ardından start metodunu çalıştırıyoruz. Böylece restart işlemini yapmış bulunuyoruz.&lt;/p&gt;
&lt;h2&gt;Service Status&lt;/h2&gt;
&lt;p&gt;Yazının bana göre en önemli adımı burasıdır. Çünkü bir servise müdahale etmek sistemde bozulamalara yol açabilmektedir. Sisteme bağlı servisleri kimse kapatmak istemez. Bu yüzden servislerinin açıklamaları, başlama tipleri, açık kapalı gibi bilgilerin bulunduğu bir mesaj görmek ardından isteğe göre işlem yapmak isteriz. Bu yüzden GetServiceStatus adında bir class oluşturuyoruz. Bu class içerisine istediğimiz bilgileri doldurup döndüreceğiz.&lt;/p&gt;
&lt;p&gt;ManagementObjectCollection services = query.Get();&lt;/p&gt;
&lt;p&gt;Bu metod ile birlikte services nesnesi içerisine bu pathname, servistipi, start tipi, durumu, açıklaması gibi bilgiler dolacaktır. Bundan sonrasında bu nesneyi class içerisine pars etmek kalıyor. Böylece status bilgilerine ulaşmış oluyoruz.&lt;/p&gt;
&lt;p&gt;class GetServiceStatus
{
private static string wsserviceName;
public static string ServiceDescription { get; set; }
public static string PathName { get; set; }
public static string ServiceType { get; set; }
public static string StartMode { get; set; }
public static string State { get; set; }
public string ServiceName
{
set
{
wsserviceName = value;
}
}
public static void GetWindowsServiceStatus()
{
if (wsserviceName != null)
{
GetServiceStartMode(wsserviceName);
}
}
private static void GetServiceStartMode(string serviceName)
{
string filter = String.Format(&quot;SELECT * FROM Win32_Service WHERE Name = &apos;{0}&apos;&quot;, serviceName);
ManagementObjectSearcher query = new ManagementObjectSearcher(filter);
if (query != null)
{
try
{
ManagementObjectCollection services = query.Get();
foreach (ManagementObject service in services)
{
DateTime now = DateTime.Now;
PathName = service.GetPropertyValue(&quot;PathName&quot;).ToString();
ServiceType = service.GetPropertyValue(&quot;ServiceType&quot;).ToString();
StartMode = service.GetPropertyValue(&quot;StartMode&quot;).ToString();
State = service.GetPropertyValue(&quot;State&quot;).ToString();
ServiceDescription = &quot;None&quot;;
if (service.GetPropertyValue(&quot;Description&quot;) != null) ServiceDescription = service.GetPropertyValue(&quot;Description&quot;).ToString();
}
}
catch (Exception ex)
{
}
}
}
}&lt;/p&gt;
&lt;p&gt;Konu ile ilgili kaynak kodları buradadır.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Windows-app-service-Process&quot;&gt;https://github.com/berkarat/Windows-app-service-Process&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows Service ve Application İşlemleri</title><link>https://fuwari.vercel.app/posts/windows-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/windows-islemleri/</guid><description>Merhabalar bu yazımızda windows üzerinde çalışan uygulamalar ve servisler ile ilgili bazı işlemler yapacağız. Bunlar Start, Stop , Restart ve Status s</description><pubDate>Sun, 06 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-696x748.png&quot; alt=&quot;C Logo - C# QrCode Generator Uygulaması (Logo eklenebilir)&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda windows üzerinde çalışan uygulamalar ve servisler ile ilgili bazı işlemler yapacağız. Bunlar Start, Stop , Restart ve Status sorgulama işlemleri olacaktır. Bu bizim ne işimize yarayacak. Yazacağınız bir monitoring uygulamasında kullanabiliriz. Daha önceki &lt;a href=&quot;https://blog.berkarat.com/c-socket-programlama/&quot;&gt;soket programlama&lt;/a&gt; yazısındaki soket işlemleri ile birleşince uzaktaki windows makine içindeki service ve uygulamalar üzerinde yönetim elde edebiliriz. Bu da bize tam yetki vermekte ve işimizi rahatlıkla uızaktan yapmamıza yaramaktadır. Bu işlemleri bir console uygulaması olarak yazacağız. İsteğe göre diğer teknolojilere de uyarlayabilirsiniz. Yazımızın birinci kısmında application üzerinden devam edeceğim .&lt;/p&gt;
&lt;h2&gt;Application Start&lt;/h2&gt;
&lt;p&gt;Uygulamamızı start metodunu yazacağız. Bunun için bir app sınıfı oluşturuyoruz. Böylece karmaşıklıktan kurtuluyoruz.&lt;/p&gt;
&lt;p&gt;using System.Diagnostics;&lt;/p&gt;
&lt;p&gt;Diagnostics namespaceini ekliyoruz. Process sınıfına ulaşmamıza yarayan bir namespacedir.&lt;/p&gt;
&lt;p&gt;İlk adım olarak  appnin adını ve dosya yolunu kullanıcıdan alıyoruz. Daha sonra Process sınıfındanbir metod  türetiyoruz. Bu metodda procesnameinden yola çıkarak getprocess metodu ile işleme başlıyoruz. Eğer açıkta bir process yok ise bize null değer dönecek. Eğer açıkta bir process var ise start işlemi gerçekleşmez ve mesaj olarak dönüş yaparız.&lt;/p&gt;
&lt;p&gt;Process metodundan proc diye bir nesne türetiyoruz. Arından filename için verdiğimiz dosya yolunu + name.exe olarak belirliyoruz. Ardından Start metodunu çağırıyoruz. Eğer işlem başarılı ise uygulamamız çalışmaya başlayacak. Değilse zaten exceptiona düşecektir.&lt;/p&gt;
&lt;h4&gt;Not:&lt;/h4&gt;
&lt;p&gt;Burada bazı uygulamaların açılması için onay isteyebilir. Bunu VisualStudio’yu veya exeyi admin olarak çalıştırmamız gerekmektedir. Bu durumda izinler ayarlanmış olduğundan bu soruyu sormayacak ve direkt çalışacaktır.&lt;/p&gt;
&lt;p&gt;try
{
string _appname = _apppath + _progressname;
Process proc = new Process();
proc.StartInfo.FileName = _appname;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = &quot;runas&quot;;
proc.Start();
_retvalue = true;
}
catch (Exception ex)
{
_retvalue = false;
}&lt;/p&gt;
&lt;h2&gt;Application Stop&lt;/h2&gt;
&lt;p&gt;Stop işleminin de başı start gibidir. Yine çalışan bir process var mı yok mu kontrolünü yapıyoruz. Ardından eğer yoksa zaten stop işlemi gerçekleşmeyecektir sadece mesaj döndürürüz. Eğer çalışan uygulama var ise Process metodundan türettiğimiz nesne ile Kill() metodunu çağırırız. Ardından WaitForExit() kapanması için bir bekleme metodu çağırırız ve böylece çalışan uygulamamız kapanmış olur.&lt;/p&gt;
&lt;p&gt;if (_progressname == null) return false;&lt;/p&gt;
&lt;p&gt;bool _retvalue = false;
Process prcid = GetProgress(_progressname);
if (prcid != null)
{
try
{
if (prcid.Id &amp;gt; 1)
{
prcid.Kill();
prcid.WaitForExit();
_retvalue = true;
}
}
catch (Exception ex)
{
_retvalue = false;
}&lt;/p&gt;
&lt;p&gt;}
else
{
_retvalue = false;
}&lt;/p&gt;
&lt;p&gt;return _retvalue;&lt;/p&gt;
&lt;h2&gt;Application Restart&lt;/h2&gt;
&lt;p&gt;Restart işlemi aslında ayrı bir process değildir. Stop ve start işlemlerinin birlikte kullanılmasından oluşur. Program açıksa önce close edilir ardından start edilir. Böylece restart işlemi gerçekleşmiş olur. Eğer açık değilse start işlemi çalışır.&lt;/p&gt;
&lt;h2&gt;Application Status&lt;/h2&gt;
&lt;p&gt;Applicationlar için status işlemleri ikiye ayrılır. Ya çalışıyordur ya da çalışmıyordur. Üçüncü bir seçenek yoktur. Yukarıdaki işlemleri yaparken aslında statuslerine bakıp açma kapama ve restart işlemleri yapmaktaydık. Sadece durumuna bakarak da status işleminin gerçekleştirebiliriz.&lt;/p&gt;
&lt;p&gt;public bool Status(string _progressname, string _apppath)
{
bool _retvalue = false;
try
{
if (_progressname == null) return false;
_status = &quot;Not Found Progress&quot;;
if (GetProgress(_progressname) != null) _status = &quot;Running&quot;;
if (GetProgress(_progressname) == null) _status = &quot;Not Running&quot;;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;           \_retvalue = true;
       }
       catch (Exception)
       {
           \_retvalue = false;
       }
       return \_retvalue;
   }
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>SQL Veri Tipleri &amp; Cannot bulk load Error</title><link>https://fuwari.vercel.app/posts/sql-veri-tipleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/sql-veri-tipleri/</guid><description>Merhaba bu yazımızda sql işlemlerinden bazılarına genel bir bakış yapacak ve örneklerle açıklamaya çalışacağım.</description><pubDate>Fri, 28 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_SQL-Server-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_SQL-Server-min-696x758.png&quot; alt=&quot;Microsoft Sql Server&quot; title=&quot;Sql Server&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımızda sql işlemlerinden bazılarına genel bir bakış yapacak ve örneklerle açıklamaya çalışacağım.&lt;/p&gt;
&lt;p&gt;İlk adım olarak sql işlemlerinden birisi olan insert işlemi ve veri tiplerinden bahsedeceğim. Ardından #TempleTable kullanımından ve substring ile arama işlemlerini örneklerle açıklayacağım.&lt;/p&gt;
&lt;p&gt;Bu veri tiplerinden birisi image tipindeki verilerdir. İmage tipindeki veriler db üzerine kaydedilerek de kullanılabilmektedir. Genelede küçük iconlar burada tutulur. Ancak büyük dosyalar tutulmamaktadır.&lt;/p&gt;
&lt;p&gt;İlk olarak bir tane tablo oluşturacağız.&lt;/p&gt;
&lt;p&gt;USE [test]
GO
-- =============================================
-- Author:	&amp;lt;BERK ARAT&amp;gt;
-- Create date: &amp;lt;...&amp;gt;
-- Description:	&amp;lt;....&amp;gt;
-- =============================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO&lt;/p&gt;
&lt;p&gt;CREATE TABLE [dbo].[Test_table](
[image] [image] NULL,
[xml] [xml] NULL,
[geography] [geography] NULL,
[money] [money] NULL&lt;/p&gt;
&lt;p&gt;) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    INSERT INTO \[dbo\].\[Test\_table\] 
              (
	   image        
     
              )
 	  VALUES 
	    (
	      &apos;C:\\Users\\Berk\\Desktop\\images\\close.png&apos;	
	    )  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada gördüğümüz gibi türünü image seçiyoruz ve ekleme işlemini standart bir string ekler gibi image path seçerek gerçekleştiriyoruz.&lt;/p&gt;
&lt;p&gt;Xml dosya eklemek için ise biraz daha komplike bir işlem var ancak temel mantık yine aynı. İlk önce yapmamız gereken bir tane xml oluşturmak ardından bu xmli declare ederek xml türünde yazdırmak.&lt;/p&gt;
&lt;p&gt;DECLARE  @txt varchar(MAX)&lt;br /&gt;
SET @txt = &apos;&amp;lt;Root&amp;gt;&amp;lt;Name&amp;gt;Berk&amp;lt;/Name&amp;gt;&amp;lt;LastName&amp;gt;Arat&amp;lt;/LastName&amp;gt;&amp;lt;/Root&amp;gt;&apos;&lt;/p&gt;
&lt;p&gt;INSERT INTO [dbo].[Test_table]
(
[xml]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     )
 VALUES
       (cast (@txt as xml))
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;INSERT INTO [dbo].[Test_table]
(		
[xml]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     ) 
 VALUES 
      ( convert (xml,@txt)  )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Burada iki adet xml ekleme yöntemi bulunmaktadır. Bunlardan birisi cast ederek xmli ekleyebiliriz veya convert ederek xml ekleme işlemini yapabiliriz.&lt;/p&gt;
&lt;h2&gt;Msg 4861 Cannot bulk load Error&lt;/h2&gt;
&lt;p&gt;Bir diğer xml ekleme yöntemi ise dosyadan eklemektir. Bunun için aşağıdaki komutu kullanmak gerekmektedir.&lt;/p&gt;
&lt;p&gt;INSERT INTO Test_table (xml)
SELECT BulkColumn
FROM Openrowset( Bulk &apos;C:\Users\Berk\Desktop\tst.xml&apos;, Single_Blob) as xml&lt;/p&gt;
&lt;p&gt;Ancak bu komutu kullanınca aşağıdaki gibi bir hata alabiliriz.&lt;/p&gt;
&lt;p&gt;Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file &quot;C:\Users\Berk\Desktop\tst.xml&quot;
could not be opened. Operating system error code 5(Access is denied.).&lt;/p&gt;
&lt;p&gt;Bunun sebebi ya doğru formatta yazmamışızdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Örneğin&lt;/strong&gt; ” ~\Desktop\tst ” şeklinde yazım yanlıştır. Uzantıyı yazmamız gerekmektedir.”~\Desktop\tst.xml ” doğru formattır.&lt;/p&gt;
&lt;p&gt;Ancak genelde diğer sorun SQL izinleriyle alakalı bir sorundan kaynaklanmaktadır. Bu sorunu çözmek için çağıracağımız dosyaya gidiyoruz sağ tıklayıp properties diyoruz. Ardından &lt;em&gt;&lt;strong&gt;Security&amp;gt;Edit&amp;gt;Add&amp;gt;Advanced&amp;gt;Find Now&lt;/strong&gt;&lt;/em&gt; kısmına kadar ilerliyoruz. Karşımıza bir liste çıkıyor SQL ile ilgili kısmı seçiyor ve OK diyoruz. Ardından Allow kısmından izinleri veriyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_12_2018-12-23_15-54-31-min.png&quot; alt=&quot;sql example&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra SQL server &lt;strong&gt;admin&lt;/strong&gt; olarak çalıştırıyoruz. Artık xml dosyamızı sorunsuz bir şekilde yükleyebiliyoruz.&lt;/p&gt;
&lt;p&gt;Sonuç olarak aşağıdaki kod sayesinde farklı çeşitte sorgular yazılabilir. Farklı formattaki verileri ekleme işlemini gösterdim. Birkaç değişiklik dışında eklenmesi string ekleme ile aynı.&lt;/p&gt;
&lt;p&gt;INSERT INTO Test_table (
[xml],
[image],
[geography],
[money] )
values(
(SELECT BulkColumn FROM Openrowset( Bulk &apos;C:\Users\Berk\Desktop\tst.xml&apos;, Single_Blob) as xml),
(SELECT BulkColumn  FROM Openrowset( Bulk &apos;C:\Users\Berk\Desktop\images\back.png&apos;, Single_Blob) as image),
(geography::Point(47.65100, -122.34900, 4326)),
(&apos;999.87629&apos;)
)&lt;/p&gt;
</content:encoded></item><item><title>C# Socket Programlama – Send&amp;Receive İşlemleri</title><link>https://fuwari.vercel.app/posts/c-socket-programlama/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/c-socket-programlama/</guid><description>Bu yazımızda socket programlama hakkında bilgiler vereceğim. Socket üzerinden receive ve send işlmelerinin birer örneklerini yapacağız. Öncelikle kavr</description><pubDate>Wed, 26 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_socket-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_socket-min.png&quot; alt=&quot;socket programming&quot; title=&quot;socket&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda socket programlama hakkında bilgiler vereceğim. Socket üzerinden receive ve send işlmelerinin birer örneklerini yapacağız. Öncelikle kavramlardan bahsetmem gerekmektedir. Bu kavramları tam anlayamadan ilerlemek ilerde mantık sorunlarına yol açacaktır.&lt;/p&gt;
&lt;h4&gt;IP Nedir ?&lt;/h4&gt;
&lt;p&gt;TCP/IP protokolü ile haberleşen makinelerin birbirlerini tanımaları için verilmiş numaralardır. Örneğin: 192.168.10.54 gibi bir IP adresi olabilir. Bu karşıdaki bilgisayarla ilteişim kurabilmemiz için yeterlidir.&lt;/p&gt;
&lt;h4&gt;Port Nedir ?&lt;/h4&gt;
&lt;p&gt;Bilgisayarlardaki giriş çıkış noktaları port olarak adlandırılmaktadır. Örneğin USB giriş portu. Ancak bizim burada bahsedeceğimiz bu portlar değildir. Programların haberleşmesini yaptığı birbirleriyle köprü kurdukları portlardan bahsediyor olacağız.&lt;/p&gt;
&lt;h4&gt;Soket Nedir ?&lt;/h4&gt;
&lt;p&gt;Türkçesi soket olan bu kelimenin anlamı işe IP + PORT = socket olarak tanımlayabiliriz. Socketler sayesinde bir makineden diğerine iletişim kurulup veri transferi sağlayabiliriz. biz de bu yazıda veri transferinden bahsedeceğiz.&lt;/p&gt;
&lt;p&gt;İlk önce soket üzerinden veri yollama işleminden bahsedeceğim. Bunlardan önce projemize aşağıdaki kütüphaneleri  eklememiz ve tanımlamaları yapmamız gerekmektedir.&lt;/p&gt;
&lt;p&gt;using System.Net;
using System.Net.Sockets;&lt;/p&gt;
&lt;p&gt;#region DECLARES
static IPAddress localAddr = IPAddress.Parse(&quot;127.0.0.1&quot;);
static TcpClient serverSocket;
public static byte[] gonderveri_dizi;
byte[] gelenveri_dizi = new byte[2048];
public static bool read_treadstop = true;
Socket soket;
string gelen;
string autcode = string.Empty;
string ip;
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
#endregion&lt;/p&gt;
&lt;h2&gt;Socket Sender&lt;/h2&gt;
&lt;p&gt;Burada bir xml dosyayı karşı tarafa göndereceğiz. Bunun için bir soket yapısı kurmamız gerekmektedir. Bu da yukarıda bahsettiğim gibi ıp ve port numarasına ihtiyacımız var. Bu bilgileri register üzerinden belirtiyoruz. Ardından server socket oluşturuyoruz.&lt;/p&gt;
&lt;p&gt;static TcpClient serverSocket;&lt;/p&gt;
&lt;p&gt;public static bool SendServerXML(TestMessage Message, string _BodyLabel, out string ret_errorCode, out string ret_errorDesc)
{
//TODO: SendServerXML
bool _value = false;
ret_errorCode = string.Empty;
ret_errorDesc = string.Empty;
string result = string.Empty;
string errorCode = string.Empty;
string errorDesc = string.Empty;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// TODO: SERVER&apos;A GÖNDERİLEN KISIM 
#region connect server      
RegistryKey key = Registry.LocalMachine.OpenSubKey(@&quot;SOFTWARE\\Berk&quot;);

if (key != null)
{
    if (key.GetValue(&quot;ServerIP&quot;).ToString().Length &amp;gt; 0 &amp;amp;&amp;amp;   key.GetValue(&quot;ServerPort&quot;).ToString().Length &amp;gt; 0     )
    {
        localAddr = IPAddress.Parse(key.GetValue(&quot;ServerIP&quot;).ToString());
        IPEndPoint ipe = new IPEndPoint(localAddr, Convert.ToInt32(key.GetValue(&quot;ServerPort&quot;)));
        serverSocket = new TcpClient(ipe.Address.ToString(), ipe.Port);
        NetworkStream ns = serverSocket.GetStream();
        gonderveri\_dizi = new byte\[1024\];
        gonderveri\_dizi = Encoding.ASCII.GetBytes(Message.Serialize());
        if (gonderveri\_dizi.Length &amp;gt; 10)
        {               
          if (ns.CanWrite)
           {
            ns.Write(gonderveri\_dizi, 0, gonderveri\_dizi.Length);
            ns.Flush();
            \_value = true;
           }
        }
        else
        {
            \_value = false;
        }
        ns.Close();
    }
}
#endregion
Thread.Sleep(1000);
return \_value;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Daha sonra NetworkStream nesnesi üzerinden byte türünde bir değişken tanımlıyoruz. Ardından bu değişkenin içerisine mesajımızı ekliyoruz.&lt;/p&gt;
&lt;p&gt;Oluşturduğumuz NetworkStream nesnesinin Write komutu ile diziyi yani bufferımızı ve uzunluğunu yolluyoruz.Ardından flush() komutunu çalıştırıyoruz. Böylece bufferımızın tamamını karşı tarafa geçirmiş oluyoruz. Daha sonra da soketimizi kapatıyoruz.&lt;/p&gt;
&lt;h2&gt;Socket Receiver&lt;/h2&gt;
&lt;p&gt;Burada ise server üzerinde çalışacak komut olarak görebiliriz. Bu metodda ise IP adresi değil port numarası önemli olacak. Localde kendi belirtilen portunu dinlemesini sağladığımız zaman karşıdan gelen mesajı almış olacak. Karşıdan gelen mesajı dinlemek için önce bir Listener oluşturuyoruz. AcceptSocket() metodu ile gelen bağlantıyı kabul etmiş oluyoruz. Burada Thread ile işlem yapmamızın sebebi farklı soketlerden gelen taleplerin birbirini engellemesinin önüne geçilmiş olacak. Böylece birbirlerini beklemeyecekler.&lt;/p&gt;
&lt;p&gt;private void socket_read()
{
TestMessage message = new TestMessage();
gelenveri_dizi = new byte[1024]; // 1024 yeterli uzunluk gelmediği durumlarda arttırmak gerekir. Mesajın tamamı gelmez !
dinleyici.Start();
do
{
if (read_treadstop)
{
// TODO: SOKETİ DİNLEMEYE BAŞLADIĞI YER / SOCKET LISTENING START
Console.WriteLine(&quot;SOCKET LISTENING !!&quot;);
soket = dinleyici.AcceptSocket();
if (soket.Poll(1000, SelectMode.SelectRead))
{
//TODO: PARSING İŞLEMİNİ dYENİ BİR THREADLE YAPACAĞIZ !!
Thread th_write = new Thread(new ThreadStart(get_message));
th_write.IsBackground = true;
th_write.Name = &quot;thread_write&quot;;
th_write.Start();
//Thread.Sleep(2000);
}
else
{
gelen = &quot;NoReadData&quot;;
//no receive data
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;             //	Console.WriteLine(gelen); 
         }

     }
     while (read\_treadstop);

     //Log(&quot;port close...&quot;, EventLogEntryType.Information);
     //logyaz(&quot;port close...&quot;);
     dinleyici.Stop();

 }
 public void get\_message ()
 {
     string \_error = null;
     try
     {
         IPEndPoint remoteIpEndPoint = soket.RemoteEndPoint as IPEndPoint;
         #region write db
         gelenveri\_dizi = new byte\[2048\];
         soket.Receive(gelenveri\_dizi, gelenveri\_dizi.Length, 0);
         if (gelenveri\_dizi\[0\] != 0)
         {
             gelen = Encoding.ASCII.GetString(gelenveri\_dizi);
             ip = soket.RemoteEndPoint.ToString();

             int c = gelen.Length;
             if (gelen\[0\] == 0)
             {
                 Console.WriteLine(&quot;ERROR&quot;);
             }
             autcode = generation\_autcode(1, 10, 5).ToString();
             string\[\] sonuc = xml\_parser(gelen);

             RegistryKey key =                Registry.LocalMachine.OpenSubKey(&quot;SOFTWARE\\\\Berk&quot;);

             DataSet ds = new DataSet(&quot;TimeRanges&quot;);
             //XML ! 
             XmlSerializer serializer = new XmlSerializer(typeof(TestMessage));
             using (TextReader reader = new StringReader(gelen))
             {
                 TestMessage result = (TestMessage)serializer.Deserialize(reader);
                 
             }
         }

         else
         {
            Console.WriteLine(e.Message);
         }
         #endregion

     }
     catch (Exception e)
     {
         string tt = gelen;
         Console.WriteLine(e.Message);
     }
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Daha sonra oluşturduğumuz soketin Receive() metodu sayesinde bilgileri alıyoruz ardından Encoding işlemi uygulayıp stringe çevirmiş oluyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_12_2018-12-23_14-12-49-min.png&quot; alt=&quot;socket &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada programımız local adresi olan 10.142.0.2 ıpsinin 8002 numaralı portunu dinliyor. Karşımıza xml formatı geliyor. Bundan sonrası &lt;a href=&quot;https://blog.berkarat.com/xml-serialize-deserialize/&quot;&gt;C# XML serialize ve deserialize işlemleri&lt;/a&gt; yazısında göstermiş olduğum xml işlemlerini yapmak gerekmektedir.&lt;/p&gt;
&lt;p&gt;Yazıya ait kaynak kodları : &lt;a href=&quot;https://github.com/berkarat/Socket_Send_Receive_Example&quot;&gt;https://github.com/berkarat/Socket_Send_Receive_Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# XML Serialize ve Deserialize İşlemleri</title><link>https://fuwari.vercel.app/posts/xml-serialize-deserialize/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/xml-serialize-deserialize/</guid><description>Merhaba bu yazıda Serialize ve deserialize işlelerii hakkında kısa bir bilgi vereceğim. Xml (eXtensible Markup Language) anlamına gelmektedir. İnsan v</description><pubDate>Sun, 23 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_93659_adobe_512x512-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_93659_adobe_512x512-min.png&quot; alt=&quot;93659 Adobe 512X512 Min - C# XML Serialize ve Deserialize İşlemleri&quot; title=&quot;xml&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazıda Serialize ve deserialize işlelerii hakkında kısa bir bilgi vereceğim. Xml (eXtensible Markup Language) anlamına gelmektedir. İnsan ve bilgisayarın anlaşabilmesi açısından oluşturulmuş bir dildir.&lt;/p&gt;
&lt;p&gt;Kök ve yaprak olarak dallanan bir ağaç yapısından oluşmaktadır. Bu standartlaşma sebebiyle web sitelerinden kaynak almak da kolaylaşmıştır.&lt;/p&gt;
&lt;p&gt;Bu link üzerinden Merkez bankasından anlık kur bilgilerini çekebilmekteyiz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.tcmb.gov.tr/kurlar/201401/03012014.xml&quot;&gt;http://www.tcmb.gov.tr/kurlar/201401/03012014.xml&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bir çok projelerde haberleşme yapısı olarak kullanılmaktadır. Daha önceki MSMQ yazılarımda bahsettiğim haberleşme şekli de xml olarak kullanılmaktadır. Kendisine rakip olarak json dili çıksa da yine de bir çok alanda sıklıkla karşımıza çıkmaktadır. Bu sebeple oluşturma serialize ve deserialize işlemlerinin üzerinde duracağım.&lt;/p&gt;
&lt;h2&gt;Class Oluşturma&lt;/h2&gt;
&lt;p&gt;Öncelikle yapmamız gereken bir class oluşturmak ve bu class üzerinden obje oluşturacağız. Ardından bu objeye database üzerinden bilgileri ekleyeceğiz. Oluşan objeyi xml e çevirme işlemini gerçekleştireceğiz. Ardından işlemi tersine uygulayarak dosyaları obje türüne çevirme işlemini yapıp örneklerimizi tamamlayacağız.&lt;/p&gt;
&lt;p&gt;public class Product
{
public int ID { get; set; }
public string Type { get; set; }
public ProductDetails[] ProductDetay { get; set; }
}
public class ProductDetails
{
public string ProductSerialNumber { get; set; }
public string ProductName { get; set; }
}&lt;/p&gt;
&lt;p&gt;Burada   2 adet  class bulunmaktadır. İç içe gömülmüş olarak kullanacağız. Product classı en tepede ve geneldir. Product Details classı ise altındaki ve detaylandırdığımız class olacaktır.&lt;/p&gt;
&lt;p&gt;Bilgileri database üzerinden almak için aşağıdaki metodu kullanmaktayız.&lt;/p&gt;
&lt;p&gt;public DataTable Get_Datas()
{
try
{
SqlConnection sqlcon = new SqlConnection(&quot;Server=DESKTOP-U34S2C6; Database=test; User Id=berk;Password = 123456; &quot;);
sqlcon.Open();
SqlCommand _cmd = new SqlCommand(@&quot;SELECT TOP 1000 [ID] ,[NAME] ,[TYPE]  FROM [test].[dbo].[tbl_hardware]&quot;, sqlcon);
SqlDataAdapter dap = new SqlDataAdapter(_cmd);
DataTable dt = new DataTable();
dap.Fill(dt);
return dt;
}
catch (Exception)
{
return null;
}
}&lt;/p&gt;
&lt;h2&gt;Bilgileri Objeye Aktarma&lt;/h2&gt;
&lt;p&gt;Burada bilgileri class içerisine aktaracağız. Bu işlemi de elle yapmayacağız. Önceki yazım olan &lt;a href=&quot;https://blog.berkarat.com/dragdrop-kullanimi/&quot;&gt;Drag&amp;amp;Drop Kullanımı&lt;/a&gt;nda kullandığım database üzerinden işlemler yapacağım. Buradaki  hardware bilgilerini objeye aktaracağım ardından da bu objeyi dönüştüreceğim.&lt;/p&gt;
&lt;p&gt;public Product test(DataTable dt)
{
prd = new Product();
prd.ProductDetay = new ProductDetails[dt.Rows.Count];
Random rnd = new Random();
prd.ID = rnd.Next();
prd.Type = &quot;Hardware&quot;;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    for (int i = 0; i &amp;lt; dt.Rows.Count; i++)
    {
        ProductDetails de = new ProductDetails();
        de.ProductName = dt.Rows\[i\]\[&quot;NAME&quot;\].ToString();
        de.ProductSerialNumber = dt.Rows\[i\]\[&quot;TYPE&quot;\].ToString();
        prd.ProductDetay\[i\] = de;
    }
    return prd;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;XML Serialize&lt;/h2&gt;
&lt;p&gt;İşlemleri yapabilmek için aşağıdaki kütüphaneleri eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;using System.Xml;
using System.Xml.Serialization;&lt;/p&gt;
&lt;p&gt;Bir tane XmlSerializer nesnesi tanımlıyoruz. Daha sonra using bloğu içerisinde XmlWriter nesnesi ile birlikte objemizi ekleyerek seriliaze işlemi gerçekleştiriyoruz. Artık objemiz xml formatına gelmiş durumdadır.&lt;/p&gt;
&lt;p&gt;public string XMLCreator()
{
XmlSerializer XML = new XmlSerializer(typeof(Product));
using (var StringWriter = new StringWriter())
{
using (XmlWriter writer = XmlWriter.Create(StringWriter))
{
XML.Serialize(writer, prd);
return StringWriter.ToString();
}
}
}&lt;/p&gt;
&lt;h2&gt;XML Deserialize&lt;/h2&gt;
&lt;p&gt;Burada ise oluşturduğumuz dosya içerisindeki bilgileri classımıza aktaracağız. Bu sefer TextReader ile dosyayı okuyor ve nesneye aktarıyoruz. Deserialize işlemini gerçejkeştiriyoruz.&lt;/p&gt;
&lt;p&gt;public void XMLDeserialize(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(Product));
using (TextReader reader = new StringReader(xml))
{
Product result = (Product)serializer.Deserialize(reader);
}
}&lt;/p&gt;
&lt;h2&gt;String Search&lt;/h2&gt;
&lt;p&gt;Bu metod sayesinde dosya içerisinde string olarak arama yapabilmekteyiz. Böylece deserialize  işlemine gerek kalmadan hızlıca  içerisindeki bilgiye kavuşabilmekteyiz. Ancak bu kısa süreli çözüm olsa da pek kullanışlı değildir. Birden fazla aynı string olduğu durumlarda sadece bir tane değer döndüğünden karışma durumu olabilir.&lt;/p&gt;
&lt;p&gt;public string[] xml_parser(string xmlmessage)
{
string[] foundvalue;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       if (xmlmessage != null)
       {
           string \_ProductName = &quot;&amp;lt;ProductSerialNumber&amp;gt;&quot;;
           int\[,\] foundindex = new int\[3, 2\];
           foundvalue = new string\[3\];
           #region parse xml message
           if (xmlmessage.Length &amp;gt; 0) xmlmessage = xmlmessage.Replace(&quot;&amp;amp;lt;&quot;, &quot;&amp;lt;&quot;);
           if (xmlmessage.Length &amp;gt; 0) xmlmessage = xmlmessage.Replace(&quot;&amp;amp;gt;&quot;, &quot;&amp;gt;&quot;);

           //ProductSerialNumber
           foundindex\[0, 0\] = xmlmessage.IndexOf(\_ProductName) + \_ProductName.Length;
           foundindex\[0, 1\] = xmlmessage.IndexOf(&quot;&amp;lt;/ProductSerialNumber&amp;gt;&quot;);
           if (foundindex\[0, 1\] != -1) foundvalue\[0\] = xmlmessage.Substring(foundindex\[0, 0\], foundindex\[0, 1\] - foundindex\[0, 0\]);
           #endregion
           return foundvalue;
       }
       else
       {
           return null;
       }
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yazıya ait kaynak kodları : &lt;a href=&quot;https://github.com/berkarat/xml_example&quot;&gt;https://github.com/berkarat/xml_example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# DragDrop Kullanımı ve Örnek Uygulama</title><link>https://fuwari.vercel.app/posts/dragdrop-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/dragdrop-kullanimi/</guid><description>Bu yazıda kendi yazmış olduğum bir örnek uygulamadan ve DragDrop kullanımından bahsedeceğim. Bu uygulama öz olarak içinde bir çok event barındırmaktad</description><pubDate>Sun, 16 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_12_2018-12-16_14-16-05-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_12_2018-12-16_14-16-05-min-696x394.png&quot; alt=&quot;2018 12 16 14 16 05 Min - C# DragDrop Kullanımı ve Örnek Uygulama&quot; title=&quot;DragDrop&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda kendi yazmış olduğum bir örnek uygulamadan ve DragDrop kullanımından bahsedeceğim. Bu uygulama öz olarak içinde bir çok event barındırmaktadır. Bunların yanı sıra sql işlemlerini daha derinlemesine örnekler de bulundurmaktadır. Uygulamanın konusu bir adet bilgisayar oluşturma veya bu bilgisayarın bilgilerini update etmek. Bunların dışında içindeki donanımları da ekleme çıkarma yapmaktadır. Tabii bunları yaparken drag drop özelliğini kullanmaktayız. Bu örnekleri sizler çoğaltabilirsiniz.&lt;/p&gt;
&lt;p&gt;Öncelikle kod yazmaya başlamadan önce projemizin iskeletini oluşturmamız gerekmektedir. Bu da tasarım demektir. Bunun için önceden düşünülmesi gerekir. Yoksa ilerde bir tasarım değişikliği veya çıkarma işlemi işinizi daha da uzatacaktır. Bu yüzden ben daha sade bir tasarım ile ilerledim.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_12_2018-12-16_13-47-43-min.png&quot; alt=&quot;2018 12 16 13 47 43 Min - C# DragDrop Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada olduğu gibi yatay olarak 3 bölüme ayırdım. Tepeye de bir adet toolstrip menüsü ekledim. Böylece yukarıdaki toolstrip üzerinden yeni bilgisayar oluşturma save update gibi işlemlerini yönetebileceğim. İlk groupbox bölümünde bilgilerin girileceği bölüm bulunmaktadır. İkinci alanda datagridview vardır. Burada listelenen bilgisayarlar gelmektedir. En altta ise bir adet search butonu ve textbox vardır. Buradan Computer Id ile aranılan bilgisayara ulaşılabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_12_2018-12-16_13-47-57-min.png&quot; alt=&quot;2018 12 16 13 47 57 Min - C# DragDrop Kullanımı ve Örnek Uygulama&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu kısım ise hardware ekleme alanıdır. Burada solda ana sabit listemiz bulunmaktadır. Bu liste db üzerinden gelir ve sabittir. Diğer liste ise bilgisayar üzerinde bulunan donanımları db üzerinde bir sp çalıştırarak getirmektedir. Eğer ekleme değil çıkarma işlemi yapacaksak da burada listeden tutup çöp kutusuna sürüklememiz yeterlidir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not&lt;/strong&gt;: Burada dikkat edilmesi gereken nokta listelerin AllowDrop=True özellini yapmamız gerekir. Aksi takdirde seçmemize izin vermeyecektir.&lt;/p&gt;
&lt;h2&gt;New&amp;amp;Save&lt;/h2&gt;
&lt;p&gt;Bu butona tıkladığımızda eğer  bir değişiklik var ise çalışacaktır. Yok ise uyarı verecektir. Yeni oluşturduğumuz bir kayıt durumunda save işlemi çalışır.   Computer ID ise sql üzerindeki MAX komutur ile çalışır. En son ID üzerinden +1 fazlasını ID olarak kabul eder.&lt;/p&gt;
&lt;p&gt;SELECT MAX(ID)+1 FROM [test].[dbo].[tbl_computer]&lt;/p&gt;
&lt;h2&gt;DragDrop Event&lt;/h2&gt;
&lt;p&gt;Dragdrop özelliği için bazı eventleri kullanmamız gerekmektedir. Bu eventler sayesinde mouse tıklandığını veya sürüklendiğini algılıyoruz ve o durumda ne yapacağımızı belirliyoruz.&lt;/p&gt;
&lt;p&gt;#region List1-&amp;gt;List2&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private void listView1\_SelectedIndexChanged\_1(object sender, EventArgs e)
{
    msj.changed = true;
    if (listView1.SelectedItems.Count &amp;gt; 0)
    {
        ListViewItem item2 = listView1.SelectedItems\[0\];
        string path = get\_image(out err, item2.Tag.ToString()).Rows\[0\]\[&quot;IMG\_PATH&quot;\].ToString();
        pictureBox1.BackgroundImage = Image.FromFile(path);
    }
}

private void listView1\_MouseDown(object sender, MouseEventArgs e)
{
    msj.changed = true;
    if (listView1.SelectedItems.Count &amp;gt; 0)
    {
        listView2.AllowDrop = true;
        panel1.AllowDrop = false;
        //ListViewItem lt = new ListViewItem();
        //lt.Text = listView1.SelectedItems\[0\].Text;
        //listView1.DoDragDrop(lt, DragDropEffects.Copy | DragDropEffects.Move);

        ListViewItem item2 = listView1.SelectedItems\[0\];
        //string selected\_device\_id = item2.Tag.ToString();
        msj.selected\_hardware\_name = item2.Text;
        msj.selected\_hardware\_id = item2.Tag.ToString();
        listView1.DoDragDrop(item2, DragDropEffects.Copy | DragDropEffects.Move);

    }

}
private void listView2\_DragEnter\_1(object sender, DragEventArgs e)
{
    msj.changed = true;
    var obj = e.Data.GetData(e.Data.GetFormats()\[0\]);
    if (typeof(ListViewItem).IsAssignableFrom(obj.GetType()))
    {
        e.Effect = DragDropEffects.Copy;
    }
}
private void listView2\_DragDrop\_1(object sender, DragEventArgs e)
{
    msj.changed = true;
    bool check = false;
    ListViewItem lt = new ListViewItem();
    lt.Tag = msj.selected\_hardware\_id;
    lt.Text = msj.selected\_hardware\_name;
    for (int i = 0; i &amp;lt; listView2.Items.Count; i++)
    {
        if (listView2.Items\[i\].Tag.ToString() == lt.Tag.ToString())
        {
            MessageBox.Show(listView2.Items\[i\].Text + &quot; Still Exist ! &quot;);
            check = true;
            break;
        }
    }

    if (!check)
    {
        listView2.Items.Insert(0, lt);
    }
}

#endregion
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eğer bir örnek verilmesi gerekirse, tıklandığında listenin seçilen indexinin tagi ve text ini seçip bir item içine aktarıyoruz. Mouse seçili halde sürükleniyorsa yani drag işlemi başladıysa bu itemi kopyalayıp move komutunu çalıştırıyoru. List2 üzerine geldiğ zaman drop özelliği devreye girer ve burada da list2 içine ekleme işlemi yapılmaktadır.&lt;/p&gt;
&lt;p&gt;Yukarıdaki koddan da anlaşıldığı gibi dragrop işlemi bu kadardır. Delete işlemini ayıran tek nokta ise drop ettiğimiz anda list2 selecteditem silinmesi gerekmektedir. Başta karmaşık gibi bir yapı görünse de mantık olarak anlaşıldığında uygulaması kolaydır.&lt;/p&gt;
&lt;p&gt;Yazıya ait kaynak kodları : &lt;a href=&quot;https://github.com/berkarat/Drag_Drop_Example-&quot;&gt;https://github.com/berkarat/Drag_Drop_Example-&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Windows Service Oluşturma</title><link>https://fuwari.vercel.app/posts/windows-services/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/windows-services/</guid><description>_📌 Güncelleme (Ağustos 2026): Windows servis mantığı geçerli; Visual Studio’nun güncel sürümleri ve .NET Worker Service yaklaşımı için kısa notlar ek</description><pubDate>Fri, 16 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_11_berkarat.com-windows-services.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_11_berkarat.com-windows-services.jpg&quot; alt=&quot;windows service&quot; title=&quot;berkarat.com windows services&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): Windows servis mantığı geçerli; Visual Studio’nun güncel sürümleri ve .NET Worker Service yaklaşımı için kısa notlar eklendi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızın konusu windows service . Windows service arka planda çalışan, otomatik olarak çalışan, bir arayüz olmayan veya bir çıktısı bulunmayan sistemlerdir.  İşletim sistemlerinin arkasında çalışan programlar olarak değerlendirebiliriz. Dosya aktarımı güncelleme kontrolü log tutma gibi işlemlerin otomatik yapılması gibi olayları gerçekleştirebiliriz.&lt;/p&gt;
&lt;p&gt;Windows arama kısmına Services yazdığımızda karşımıza servisler çıkmaktadır. Bunlara sağ tıklayıp &amp;gt; özellikler dedikten sonra karşımıza bazı özellikler gelmektedir. Burada başlangıç türünü, servisin ne zaman başlayacağını otomatik veya manuel olarak belirleyebiliriz. Görünen ad ve açıklama kısımlarını da değiştirmek mümkündür.  Buradan servisi başlat durdur duraklat gibi seçeneklerle kontrol edebilmekteyiz. Örneğin kendi yazacağımız servisin çalışmasının durdumak için bu yolu seçebiliriz.&lt;/p&gt;
&lt;h2&gt;Windows Service Oluşturma Ayarları&lt;/h2&gt;
&lt;p&gt;Öncelikle Visual Studio içinden New Project diyoruz. Ardından Windows Service seçeneğini seçiyoruz. Güncel Visual Studio sürümlerinde .NET Framework altında Windows Service şablonu hâlâ kullanılabilir; modern .NET tarafında ise Worker Service projesi de tercih edilebilir. Karşımıza şu ekran geliyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_berkarat.com-Service-Install.png&quot; alt=&quot;Berkarat.com Service Install - Windows Service Oluşturma&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu ekrandan sağ tıklayacağız. Ardından Add Installer seçeneğini tıklıyoruz. Burada karşımızıa bir adet Service Installer ve Service Process Installer geliyor. Service Installer üzerine gelip sağ tıklayıp özellikler kısmına gidiyoruz. Burada isim açıklama başlama tipini ekranda görünecek adını belirliyoruz. Daha sonra Service process Installer üzerine tıklayıp özelliklere gidiyoruz. Burada da Account kısmını değiştiriyoruz. Burayı Local System olarak işaretliyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_berkarat.com_.png&quot; alt=&quot;Berkarat.com - Windows Service Oluşturma&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra sağ tarafta Service 1 üzerine geliyoruz. Kaynak kodu görüntüle dediğimiz zaman karşımıza servise ait düzenleyeceğimiz kodlar geliyor. Burada OnStart() ve OnStop() olarak iki fonksiyonumuz bulunmaktadır. Adından da anlaşılacağı gibi servisin başlangıç ve kapatma durumunda neler yapılacağını belirliyoruz.&lt;/p&gt;
&lt;p&gt;public partial class Service1 : ServiceBase
{
public Service1 ()
{
InitializeComponent ();
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   protected override void OnStart (string\[\] args)
   {
   }

   protected override void OnStop ()
   {
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h2&gt;Windows Service Oluşturma&lt;/h2&gt;
&lt;p&gt;Asıl işlemi yapacağımız yere geçersek öncelikle InnerOperation adından bir class oluşturuyoruz. Yazacağımız class kaynak klasörüne 5 saniye aralıklarla bir log yazacak ve servisin çalışır halde olduğunu göreceğiz. Bunun yanında başlangıç ve bitişlerde de mesajı text dosya içerisine yazacak. Daha önceki &lt;a href=&quot;https://blog.berkarat.com/c-logger-kullanimi/&quot;&gt;Logger Kullanımı&lt;/a&gt; yazısında dosya oluşturma ve dosya yazma işlemlerini anlatmıştım. Timer konusunu ise  &lt;a href=&quot;https://blog.berkarat.com/c-thread-ve-multithread-islemleri/&quot;&gt;Thread işlemleri&lt;/a&gt;  yazısında kullanmıştım.&lt;/p&gt;
&lt;p&gt;public  class InnerOperation
{
Timer timer = new Timer ();
public void Start ()
{
WriteToFile (&quot;Service Başladı &quot;+DateTime.Now);
timer.Elapsed+=new ElapsedEventHandler (OnElapsedTime);
timer.Interval=5000;
timer.Enabled=true;
}
public void Stop ()
{
WriteToFile (&quot;Service Durduruldu &quot;+DateTime.Now);
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;   public void WriteToFile (string Message)
   {
       string path = AppDomain.CurrentDomain.BaseDirectory+&quot;Logs&quot;;
       if (!Directory.Exists (path))
       {
           Directory.CreateDirectory (path);
       }
       string filepath = AppDomain.CurrentDomain.BaseDirectory+&quot;LogsServiceLog\_&quot;+DateTime.Now.Date.ToShortDateString ().Replace (&apos;/&apos;, &apos;\_&apos;)+&quot;.txt&quot;;
       if (!File.Exists (filepath))
       {

           using (StreamWriter sw = File.CreateText (filepath))
           {
               sw.WriteLine (Message);
           }
       }
       else {
           using (StreamWriter sw = File.AppendText (filepath))
           {
               sw.WriteLine (Message);
           }
       }
   }
   private void OnElapsedTime (object source, ElapsedEventArgs e)
   {
       WriteToFile (&quot;Service Message ! berkarat.com :    &quot;+DateTime.Now);
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Bu class içerisini de oluşturduktan sonra serviste oluşacak onstart ve onstop fonksiyonlarının içerisine start ve stop fonksiyonlarımızı çağırıyoruz. Ardından derleme işlemini gerçekleştiriyoruz. Standart bir console app uygulaması gibi bir exe oluşuyor.&lt;/p&gt;
&lt;p&gt;InnerOperation obj = new InnerOperation ();
protected override void OnStart (string[] args)
{
obj.Start ();
}
protected override void OnStop ()
{
obj.Stop();
}&lt;/p&gt;
&lt;h2&gt;Windows Servis Yükleme&lt;/h2&gt;
&lt;p&gt;Daha sonra cmd komut satırını &lt;strong&gt;yönetici olarak&lt;/strong&gt; çalıştırıyoruz. InstallUtil.exe, .NET Framework Windows Service projeleri için geçerlidir; .NET 8/9 Worker Service projelerinde servis kaydı için sc.exe, PowerShell New-Service veya publish edilen exe üzerinden kurulum tercih edilir.  Daha sonra aşağıdaki dosya yolu üzerinden InstallUtil.exe ile servisi sisteme yüklemiş oluyoruz. Sonra servisi çalıştırıyoruz. Artık kaynağımıza servis çalışmasına dair loglar yazılmaya başlamış oluyor.&lt;/p&gt;
&lt;p&gt;C:WindowsMicrosoft.NETFramework64v4.0.30319&amp;gt;InstallUtil.exe &quot;C:UsersberkDocumentsVisual Studio 2015ProjectsService_berkarat.comService_berkarat.combinDebugService_berkarat.com.exe&quot;&lt;/p&gt;
&lt;h2&gt;Windows Service Başlatma&lt;/h2&gt;
&lt;h2&gt;&lt;img src=&quot;/wp-images/2018_11_2018-11-16_19-29-28-min.png&quot; alt=&quot;2018 11 16 19 29 28 Min - Windows Service Oluşturma&quot; /&gt;&lt;/h2&gt;
&lt;p&gt;Servisi Hizmetler kısmına geliyoruz. Windows Service display name olarak verdiğimiz isimle görünmektedir. Buraya sağ tıklayıp çalıştır durdur veya restart et gibi işlemler uygulayabiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_berkarat.com-Service.png&quot; alt=&quot;Berkarat.com Service - Windows Service Oluşturma&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada da göreceğimiz gibi loglar tarih olarak yazılıyor.&lt;/p&gt;
</content:encoded></item><item><title>C# AES 256 Şifreleme ve Deşifreleme</title><link>https://fuwari.vercel.app/posts/aes-256-sifreleme/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/aes-256-sifreleme/</guid><description>Bu yazıda şifreleme teknikleri arasında sıkça kullanılan AES 256 şifreleme yönteminden bahsedeceğim. Özelliklerine değindikten sonra şifreleme ve çözm</description><pubDate>Fri, 09 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_11_aes-256-min.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_11_aes-256-min.jpg&quot; alt=&quot;Aes 256 Min - C# AES 256 Şifreleme ve Deşifreleme&quot; title=&quot;aes 256&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda şifreleme teknikleri arasında sıkça kullanılan AES 256 şifreleme yönteminden bahsedeceğim. Özelliklerine değindikten sonra şifreleme ve çözme işlemini yapan bir uygulama örneğinden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Şifreleme simetrik ve asimetrik şifreleme olarak 2 kategoriye ayrılmaktadır. AES 256 bu tekniklerden simetrik şifreleme grubuna dahil olmaktadır. Şifrelemek için tek bir anahtar bulunur. Aynı anda şifreyi çözmek için de bu anahtara ihtiyaç duyulur. AES Rijndael şifreleme algoritmasının standartlaşmış hali olarak da tanımlanabilir. Kelime anlamı olarak da AES(Advanced &lt;strong&gt;Encryption&lt;/strong&gt; Standard) gelişmiş şifreleme standartı olarak kabul edilmiştir. Uluslararası olarak bir standart haline gelmiştir. 256 bit anahtar uzunluğuna sahiptir.&lt;/p&gt;
&lt;h2&gt;AES 256 Şifreleme&lt;/h2&gt;
&lt;p&gt;C# üzerinden Cryptography sınıfı üzerinden işlemlerimizi yapacağız. Bu yüzden System.Security namespaceini projemize eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;Bu namespace içerisinde AES  sınıfından bir nesne türetiyoruz. Bu nesne üzerinden şifreleme modunu belirliyoruz. AES 256 blok şifreleme yaptığından dolayı ChiperMode üzerinden hangi blok kullanacağımızı belirliyoruz. Bu uygulamada CBC modu kullandım ancak CFB,CTS gibi 5 adet daha modu bulunmaktadır.&lt;/p&gt;
&lt;p&gt;CBC (Cipher Block Chaning)  blok olarak her bir blok yapısının ile şifrelenmesinden  önce bir önceki blok ile XOR işlemine tabii tutulması anlamına gelmektedir. Ancak ilk blok hangi blok ile XOR işlemine gireceği belirsizdir. Bunun önüne geçmek için IV dediğimiz kavram ortaya çıkmıştır. Bu sebeple son bloktaki şifrelenmiş bloğun çözümü bize metini vermeyecektir. IV ile tekrardan çözümü ana metini verir.&lt;/p&gt;
&lt;p&gt;Sonrasında blocksize ve keysize gibi kısıtlamalar yaparak şifreleme yöntemini düzenleyebiliyoruz. Ardından key ve IV dediğimiz şifrelemeyi yapacağımız anahtarları girmemiz gerekiyor. Bu anahtarlar gizli ve kimse tarafından bilinmemesi gerekmektedir.&lt;/p&gt;
&lt;p&gt;Metnimizi bloklara böldükten sonra okuma işlemi yapıp  her bloğu okuyup şifreleme işlemini gerçekleştiriyoruz. Ardından Convert.ToBase64() metodu ile şifreli metine hash işlemini uyguluyoruz.&lt;/p&gt;
&lt;p&gt;public static string EncryptString (string plainText, byte[] key, byte[] iv)
{
Aes encryptor = Aes.Create ();
encryptor.Mode=CipherMode.CBC;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//encryptor.KeySize = 256;
//encryptor.BlockSize = 128;
//encryptor.Padding = PaddingMode.Zeros;

// Set key and IV
encryptor.Key=key;
encryptor.IV=iv;
MemoryStream memoryStream = new MemoryStream ();
ICryptoTransform aesEncryptor = encryptor.CreateEncryptor ();

CryptoStream cryptoStream = new CryptoStream (memoryStream, aesEncryptor, CryptoStreamMode.Write);
byte\[\] plainBytes = Encoding.ASCII.GetBytes (plainText);
cryptoStream.Write (plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock ();
byte\[\] cipherBytes = memoryStream.ToArray ();

memoryStream.Close ();
cryptoStream.Close ();
string cipherText = Convert.ToBase64String (cipherBytes, 0, cipherBytes.Length);

return cipherText;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;h2&gt;AES 256 Deşifreleme&lt;/h2&gt;
&lt;p&gt;Şifre çözme işlemini de gerçekleştirirken yine benzer bir mantığın tersten işleyişi olarak düşünebiliriz. Blok olarak gelen şifreli metni elimizde bulundurduğumuz IV ve Key ile tersine şifreleme uygulayarak ana metine ulaşabilmekteyiz. Bunun için hangi CipherMode ile şifrelendiğini de bilmek zorundayız. Blok yapısını bilmeden okuma işlemini yapamayız.&lt;/p&gt;
&lt;p&gt;public static string DecryptString (string cipherText, byte[] key, byte[] iv)
{
Aes encryptor = Aes.Create ();
encryptor.Mode=CipherMode.CBC;
//encryptor.KeySize = 256;
//encryptor.BlockSize = 128;
//encryptor.Padding = PaddingMode.Zeros;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Set key and IV
encryptor.Key=key;
encryptor.IV=iv;

MemoryStream memoryStream = new MemoryStream ();
ICryptoTransform aesDecryptor = encryptor.CreateDecryptor ();

CryptoStream cryptoStream = new CryptoStream (memoryStream, aesDecryptor, CryptoStreamMode.Write);

 string plainText = String.Empty;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;try
{
byte[] cipherBytes = Convert.FromBase64String (cipherText);
cryptoStream.Write (cipherBytes, 0, cipherBytes.Length);
cryptoStream.FlushFinalBlock ();
byte[] plainBytes = memoryStream.ToArray ();
plainText=Encoding.ASCII.GetString (plainBytes, 0, plainBytes.Length);
}
finally
{
memoryStream.Close ();
cryptoStream.Close ();
}
return plainText;
}&lt;/p&gt;
&lt;h2&gt;SHA 256 Şifreleme&lt;/h2&gt;
&lt;p&gt;SHA 2- altında geliştirilmiş bir şifreleme algoritmasıdır. Aşağıda örnek kodu bulunmaktadır.&lt;/p&gt;
&lt;p&gt;public static string CreateSHA256 (string clearpwd, int x)
{
using (var sha = SHA256.Create ())
{
var computedHash = sha.ComputeHash (Encoding.Unicode.GetBytes (clearpwd+RandomString (x)));
return Convert.ToBase64String (computedHash);
}
}&lt;/p&gt;
&lt;p&gt;Örnek Proje : &lt;a href=&quot;https://github.com/berkarat/AES256-SHA_Encrypt_Decrypt&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# DLL Nedir ? DLL Oluşturma ve Kullanma</title><link>https://fuwari.vercel.app/posts/dll-olusturma/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/dll-olusturma/</guid><description>_📌 Güncelleme (Ağustos 2026): DLL/Class Library mantığı geçerliliğini koruyor; güncel Visual Studio ve NuGet kullanımına dair notlar eklendi._</description><pubDate>Thu, 08 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_11_dll-logo-min.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_11_dll-logo-min.jpg&quot; alt=&quot;Dll Logo Min - C# DLL Nedir ? DLL Oluşturma ve Kullanma&quot; title=&quot;dll logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): DLL/Class Library mantığı geçerliliğini koruyor; güncel Visual Studio ve NuGet kullanımına dair notlar eklendi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda dll nedir, nasıl kullanılır gibi tanımlamaları yapacağız. Ardından da örnek bir kütüphane oluşturma uygulamasını yapacağız. Açılımı Dynamic Link Library olan bir kütüphanedir.&lt;/p&gt;
&lt;p&gt;Programlamada aynı kod satırlarını tekrar tekrar yazmak bir program geliştici açısından yorucu bir iştir. Bu sebeple tekrar eden metodların tek bir yerde kullanılması düşünülmüştür. Farklı programlarda ya da dağıtık sistemlerde kullanılan aynı metodlar açısından bir kütüphane yani dll dosyası oluşturmak en mantıklı çözüm olarak bulunmuştur.&lt;/p&gt;
&lt;p&gt;Aynı zamanda kendi yazdığınız kodları başkasının kullanımına açık hale getirebilirsiniz. Bu kullanıcı kaynak koda erişemez ancak izin verilen metodları kullanabilmektedir. Böylece hem başkalarının kullanımına açık hem de kaynak kodu gizli bir durum gerçekleşir.&lt;/p&gt;
&lt;p&gt;Daha önce yazdığımız classların bir araya getirilerek oluşturduğumuz, içerisinde main yapısı olmadan çağırabildiğimiz uygulamalara benzerdir. Buradaki dikkat edilmesi gereken kısım başka modüllerin çağırılıyor olmasıdır.&lt;/p&gt;
&lt;h2&gt;C# DLL Oluşturma&lt;/h2&gt;
&lt;p&gt;C# ile kütüphane oluşturmak için daha önceden yazdığımız metodları, sınıfları kullanabiliriz veya bunları direkt kütüphane olarak da oluşturabiliriz. Bu oluşturacağım örnekte daha önceki yazılarda bahsettiğim metodları kütüphane olarak kullanacağım. Örneğin &lt;a href=&quot;https://blog.berkarat.com/qrcode-uygulamasi/&quot;&gt;qrcode generator&lt;/a&gt; konusunda  verdiğim örneği oradaki metodları kullanacağım. Uygulamalı örnek olarak da oradaki random sayı metodunu çağıracağım.&lt;/p&gt;
&lt;p&gt;Geçelim kodumuzu yazmaya. İlk önce Visual Studio içerisinde File&amp;gt;New&amp;gt;Project veya Ctrl+Shift+N işlemini yapıp ardından gelen ekrandan Class Library seçimini yapıyor ve isimlendiriyoruz. Güncel Visual Studio sürümlerinde hedef framework olarak .NET veya .NET Framework seçimini projenizin ihtiyacına göre belirleyebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_2018-11-04_14-35-05-min.png&quot; alt=&quot;2018 11 04 14 35 05 Min - C# DLL Nedir ? DLL Oluşturma ve Kullanma&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra burada Class isimini veriyoruz.  Daha sonrasında  çalıştırmak istediğimiz metodu bu class içerisine ekliyoruz.&lt;/p&gt;
&lt;p&gt;public class QRCreate
{
public static Bitmap GenerateQR (int width, int height, string js, out string err)
{
err=&quot;&quot;;
try
{
if (js!=null)
{
IBarcodeWriter barcodeWriter = new BarcodeWriter ();
barcodeWriter.Format=BarcodeFormat.QR_CODE;
QrCodeEncodingOptions options = new QrCodeEncodingOptions ();
options=new QrCodeEncodingOptions
{
Width=width,
Height=height,
Margin=0
};
options.Hints.Add (EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
barcodeWriter.Options=options;
var result = new Bitmap (barcodeWriter.Write (js));
return result;
}
else
return null;
}
catch (Exception)
{
err=&quot;METİN GİRİNİZ!&quot;;
return null;
}
}
}&lt;/p&gt;
&lt;p&gt;Bu örnekte GenerateQR() isimli metodumuzu kullanıyoruz. Burada ZXing.Net isimli referansı eklememiz gerekmektedir. Güncel projelerde bu tür paketleri NuGet üzerinden PackageReference ile eklemek en pratik yoldur. Bununla ilgili bilgiler örnek yazımızda mevcuttur. Daha sonra bu kod satırını ekledikten sonra Solution üzerinden Build işlemini yapıyoruz. Böylece 06kütüphanemiz oluşmuş oluyor.&lt;/p&gt;
&lt;h2&gt;C# Dll Kullanımı&lt;/h2&gt;
&lt;p&gt;DLL kütüphanemizi oluşturduktan sonra kullanmamız için örnek olarak bir form uygulaması açıyoruz. İçerisine picturebox ve button ekliyoruz. Sade bir uygulama olup qr code üretecek ancak bunu bir kütüphane içerisinden çağıracağız. Bu işlemi de Zxing üzerinden yaptığımız için bunu nuget üzerinden projemize ekliyoruz. Daha sonra sağ  tarafta Reference kısmından Add diyerek oluşturduğumuz dll dosyasını projemize referans olarak ekiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_2018-11-04_14-46-58-min.png&quot; alt=&quot;2018 11 04 14 46 58 Min - C# DLL Nedir ? DLL Oluşturma ve Kullanma&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada dikkat etmemiz gereken namespace kısmına oluşturduğumuz kütüphaneyi eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;using DLL_ADI;&lt;/p&gt;
&lt;p&gt;Daha sonra Metodumuzun adı ile qrCode oluşturma işlemini tamamlıyoruz. Böylece başka birisine veya başka bir uygulamada bu metodu tekrar yazmadan tek bir referans işlemi ile tamamlamış oluyoruz.&lt;/p&gt;
&lt;p&gt;pictureBox1.Image=berkarat.QRCreate.GenerateQR (150, 150, &quot;berkarat.com&quot;, out err);&lt;/p&gt;
&lt;p&gt;QrCreate üzerine sağ tıklayıp Go to Definition veya F12’ye bastığımızda kaynağımıza gideriz. Ancak sadece o class içerisindeki metodları görürüz içeriklerine erişemeyiz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Bu örneğin eski GitHub kaynak bağlantısı artık erişilebilir olmadığı için kaldırıldı; makaledeki kod parçaları temel akışı göstermeye devam ediyor.&lt;/p&gt;
</content:encoded></item><item><title>C# Logger Kullanımı</title><link>https://fuwari.vercel.app/posts/c-logger-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/c-logger-kullanimi/</guid><description>Merhabalar bu yazımızda c ile Logger kullanımından bahsedeceğim. Programların en temel yapılarından bir tanesidir logger. Loglama kelime anlamı olarak</description><pubDate>Mon, 05 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_11_c-logger-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_11_c-logger-min.png&quot; alt=&quot;NLog&quot; title=&quot;c# logger&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda c# ile Logger kullanımından bahsedeceğim. Programların en temel yapılarından bir tanesidir logger. Loglama kelime anlamı olarak günlük tutmak olarak çevrilebilir. Bir geliştirici için olmazsa olmazdır. Bir sistem veya programın hareketlerinin, yaptığı işlemlerin hareketini tutmamıza yarayan bir yapıdır.&lt;/p&gt;
&lt;p&gt;Logger sayesinde bir projede oluşan hataları, yapılan işlemleri kayıt altına alabiliriz. Hataların ayıklanmasında da sıkça kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Windows sistemlerinde Event log kavramı logger işleminin yapıldığı logların tutulduğu yer anlamındadır. İşletim sistemindeki hareketler buraya kaydedilir. Böylece hareket takibi yapılabilir. Arka planda çalışan servislerde oluşabilecek önemli bir hatayı veya saldırı gibi izinsiz hareketleri loglarda görüp müdahale edebiliriz.  Bu logları tarihe göre filtreleyebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_11_logger-1024x539.png&quot; alt=&quot;Event Viewer&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Windows için bu logları inceleyebileceğimiz kısım ise Event Viewer yani olay görüntüleyicidir.&lt;/p&gt;
&lt;p&gt;Başlat arama kısmına Event Viewer üzerinden ulaşabiliriz. Sol tarafta bulunan applications and services logs kısmından loglara ulaşabilmekteyiz.&lt;/p&gt;
&lt;h3&gt;Event Viewer ile Yapılabilecek İşlemler&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Event Viewer üzerinden logların kayıtlarına text olarak kayıt altına alıp depolayabiliriz.&lt;/li&gt;
&lt;li&gt;Filtreleme yaparak olayların önceliklerine göre sıralama yapabiliriz.&lt;/li&gt;
&lt;li&gt;Loglara görev ekleyebiliriz. Örneğin seçeceğimiz bir log geldiği zaman başka bir programı veya servisi aktif hale getirebiliriz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;C# ile Logger Oluşturma&lt;/h2&gt;
&lt;p&gt;Loglama işlemini C# ile yapmak için öncelikle System.Diagnostic.EventLog sınıfını kullanmaız gerekmektedir. Bu sınıf sayesinde loglama işlemini gerçekleştirebiliriz. Loglama işlemi için öncelikle bir log oluşturmamız gerekmektedir. Bu işlem için EventLog.CreateEventSource() metodunu kullanmamız gerekmektedir. Bu metoda kaynak ve logname parametrelerini eklediğimizde yeni bir log oluşturmuş oluyoruz.&lt;/p&gt;
&lt;p&gt;private bool CheckEventLog ()
{
//TODO:   LOG CREATE
try
{
if (!EventLog.Exists (logName))
{
EventLog.CreateEventSource (logName, logName);
Log (&quot;CREATE NEW LOG&quot;, EventLogEntryType.SuccessAudit);
return true;
}
else
{
Log (&quot;LOG HAS ALREADY EXIST&quot;, EventLogEntryType.SuccessAudit);
return true;
}
}
catch (Exception e1)
{
Log (&quot;Cannot check and create event log: &quot;+e1.Message, EventLogEntryType.Error);
return false;
}
}&lt;/p&gt;
&lt;h2&gt;C# ile Log Yazma&lt;/h2&gt;
&lt;p&gt;Log yazma işleminde de EventLog.WriteEntry() metodu ile yapılmaktadır. Bu metoda logname, mesaj ve tipini belirlediğimiz parametreleri vereceğiz.&lt;/p&gt;
&lt;p&gt;private void Log (string message, EventLogEntryType type)
{
//   EventLog.WriteEntry (logName, message, type);
try
{
if (EventLog.Exists (logName))
{
EventLog.WriteEntry (logName, message, type);
using (StreamWriter w = File.AppendText (DateTime.Now.ToLongDateString ()+&quot;-&quot;+logName+&quot;.txt&quot;))
{
Logtxt (message, w);
}
}
else
{
//CheckEventLog ();
Console.WriteLine (&quot;LOG YOK&quot;);
}
}
catch (Exception ex)
{
Console.WriteLine (&quot;FAIL&quot;);
}&lt;br /&gt;
}&lt;/p&gt;
&lt;h3&gt;Bu parametreler şunlardır&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;EventLogEntryType.Error&lt;/li&gt;
&lt;li&gt;EventLogEntryType.FailureAudit&lt;/li&gt;
&lt;li&gt;EventLogEntryType.Information&lt;/li&gt;
&lt;li&gt;EventLogEntryType.SuccessAudit&lt;/li&gt;
&lt;li&gt;EventLogEntryType.Warning&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;C# ile Text Log Yazma&lt;/h2&gt;
&lt;p&gt;Log tutarken bir yandan da text ile de tutmak bizim için bir avantaj sağlamktadır. Bunlardan bazıları text kayıt altına alırken depolama kolaylığı sağlamaktadır. Ek olarak da günlük olarak ayrı ayrı log tutma imkanı sunmaktadır.&lt;/p&gt;
&lt;p&gt;public static void Logtxt (string logMessage, TextWriter w)
{
try
{
w.WriteLine (&quot;{0} {1}&quot;, DateTime.Now.ToLongTimeString (),DateTime.Now.ToLongDateString ()+&quot; --&amp;gt; &quot;+logMessage);
w.WriteLine (&quot;-------------------------------&quot;);
}
catch (Exception)
{
Console.WriteLine (&quot;FAIL&quot;);
}
}&lt;/p&gt;
&lt;p&gt;Text yazarken StreamWriter I/O kullanmamız gerekmektedir. AppendText diyerek logumuzu text içerisine sona eklemiş oluruz. Log eklerken o anki tarih ve saati eklememiz kaydımızın ne zaman eklendiği açısından önemlidir.&lt;/p&gt;
&lt;h2&gt; C# Log Silme&lt;/h2&gt;
&lt;p&gt;Log silme işlemi için de EvenLog.Delete() metodunu kullanıyoruz. Metodun içine de sileceğimiz log ismini yazıyoruz.&lt;/p&gt;
&lt;p&gt;private void Log_Delete (string logname)
{
string msg = logname+&quot;--&amp;gt;LOG DELETED !&quot;;
try
{
EventLog.Delete (logname);
using (StreamWriter w = File.AppendText (DateTime.Now.ToLongDateString ()+&quot;-&quot;+logName+&quot;.txt&quot;))
{
Logtxt (msg, w);
}
}
catch (Exception)
{
Console.WriteLine (&quot;FAIL&quot;);
}
}&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Programın kaynak kodu :&lt;/strong&gt;&lt;/em&gt;  &lt;a href=&quot;https://github.com/berkarat/Logger&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# Veritabanı İşlemleri-2</title><link>https://fuwari.vercel.app/posts/c-veritabani-islemleri-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/c-veritabani-islemleri-2/</guid><description>Bu yazımızda Stored Procedure işlemlerine ve sql sorgularına devam edeceğiz. Önceki yazımızın devamı niteliğindedir.</description><pubDate>Sat, 03 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-696x748.png&quot; alt=&quot;C Logo - C# QrCode Generator Uygulaması (Logo eklenebilir)&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda Stored Procedure işlemlerine ve sql sorgularına devam edeceğiz. Önceki yazımızın devamı niteliğindedir.&lt;/p&gt;
&lt;p&gt;Bu yüzden registerdan bilgileri nasıl çektiğimiz veya sp nasıl oluşturduğumuz gibi temek konuların üzerinde tekrar durmayacağım.&lt;/p&gt;
&lt;p&gt;Bu yazıda Stored procedure ile Insert, Update, Delete işlemlerini C# kullanacağız ve proje olarak sayfanın sonunda paylaşacağım.&lt;/p&gt;
&lt;p&gt;Insert işlemi ile birlikte veritabanımıza gerekli olan bilgileri eklememize olanak sağlar. Bu bilgileri C# ortamından alıp  veritabanına sorgu göndererek yapabiliriz. Bu klasik bir yöntem olarak görülmektedir. Ancak her Insert işlemi için sorgu çalıştırmamız gerekirse bu durum yazdığımız prograrım şişmesine yol açar. Bunun yerine SQL Server üzerinde bir tane insert Stored Procedure yazmıştık önceki yazımızda. Şimdi bu spye parametreleri vererek insert işlemini gerçekleştireceğiz.&lt;/p&gt;
&lt;p&gt;Aynı durumlar Update işlemi için de gerekli. Burada update edeceğimiz bilgilerin de parametrelerini vererek eğer var ise güncelleme işlemini yapacağız.&lt;/p&gt;
&lt;p&gt;Diğer işlemimiz ise Delete işlemi burda da eğer var ise istenilen kişinin veya ID üzerinden belirlediğimiz bir satırı sileceğiz. Aynı zamanda bu satır silme işlemi yapılırken sadece satırdaki bilgiler silinmektedir. Indexleri de silmek için Truncate komutu kullanılmaktadır.Aşağıdaki komut tablodaki bilgileri tamamen siler. Delete işlemine göre daha etkilidir. Tamamen geri dönüş olmayacak şekilde siler. Tıpkı delete işleminde olduğu gibi truncate komutuna da where komutu kullanılarak bazı şartlar getirilerek istenilen bilginin silnmesi sağlanabilmektedir.&lt;/p&gt;
&lt;p&gt;TRUNCATE TABLE Tablo_Adı;&lt;/p&gt;
&lt;p&gt;Bu işlemlerle beraber örnek gösterdiğimiz stored procedure işlemlerinin C# tarafını da tamamlamış olacağız.&lt;/p&gt;
&lt;h2&gt;C# ile Stored Procedure Insert&lt;/h2&gt;
&lt;p&gt;Burada ad,soyad,şifre,mail,yaş gibi parametreleri textbox üzerinden girdiğimiz bu bilgileri veri tabanına yazan fonksiyonu göreceğiz. Bu fonksiyon parametrelerin alıp bool tipinde dönüş yapmaktadır. İlk adım olarak kontrol etmemiz gereken bu kullanıcının daha önce sistemde kayıtlı olup olmadığıdır. İlk adım olarak mail durumunu tablodan kontrol ederek duplicate işlem olmasının önüne geçiyoruz daha sonra stored procedure kullanarak işlemi tamamlayacağız. Parametreleri addwithValue komutuyla parametreleri ekliyoruz ve sp çalıştırıyoruz.&lt;/p&gt;
&lt;p&gt;public static bool sp_insert (string sp_name, string ad, string soyad, string parola, int yas, string email, out string _error)&lt;/p&gt;
&lt;p&gt;{
    DataSet ds = new DataSet ();&lt;/p&gt;
&lt;p&gt;    _error=null;&lt;/p&gt;
&lt;p&gt;    bool xs = true;&lt;/p&gt;
&lt;p&gt;    ds=check ();&lt;/p&gt;
&lt;p&gt;    List&amp;lt;string&amp;gt; l = new List&amp;lt;string&amp;gt; ();&lt;/p&gt;
&lt;p&gt;    foreach (DataRow item in ds.Tables[0].Rows)&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        //     l.Add (item[&quot;ad&quot;].ToString ());&lt;/p&gt;
&lt;p&gt;        if (item[&quot;email&quot;].ToString ()==email)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            xs=false;&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;    try&lt;/p&gt;
&lt;p&gt;    {
        using (SqlConnection con = sqldbsconnect ())&lt;/p&gt;
&lt;p&gt;        {
            if (con.State.ToString ()==&quot;Open&quot;&amp;amp;&amp;amp;xs==true)&lt;/p&gt;
&lt;p&gt;          {&lt;/p&gt;
&lt;p&gt;               SqlCommand sqlComm = new SqlCommand (sp_name, con);&lt;/p&gt;
&lt;p&gt;                sqlComm.Parameters.AddWithValue (&quot;ad&quot;, ad);&lt;/p&gt;
&lt;p&gt;                sqlComm.Parameters.AddWithValue (&quot;soyad&quot;, soyad);&lt;/p&gt;
&lt;p&gt;                sqlComm.Parameters.AddWithValue (&quot;yas&quot;, yas);&lt;/p&gt;
&lt;p&gt;                sqlComm.Parameters.AddWithValue (&quot;password&quot;, parola);&lt;/p&gt;
&lt;p&gt;                sqlComm.Parameters.AddWithValue (&quot;email&quot;, email);&lt;/p&gt;
&lt;p&gt;                sqlComm.CommandType=CommandType.StoredProcedure;&lt;/p&gt;
&lt;p&gt;                SqlDataAdapter da = new SqlDataAdapter ();&lt;/p&gt;
&lt;p&gt;                da.SelectCommand=sqlComm;&lt;/p&gt;
&lt;p&gt;                da.Fill (ds);&lt;/p&gt;
&lt;p&gt;                return true;&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;            else&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;                if (xs==false)&lt;/p&gt;
&lt;p&gt;                {&lt;/p&gt;
&lt;p&gt;                    _error=&quot;KULLANICI ZATEN KAYITLI &quot;;&lt;/p&gt;
&lt;p&gt;                    return false;&lt;/p&gt;
&lt;p&gt;                }&lt;/p&gt;
&lt;p&gt;                _error=&quot;DB SERVER CONNECTION = &quot;+con.State.ToString ();&lt;/p&gt;
&lt;p&gt;                return false;&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;    catch (Exception ex)&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        if (xs==false)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            _error=&quot;KULLANICI ZATEN KAYITLI &quot;;&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        _error=ex.ToString ();&lt;/p&gt;
&lt;p&gt;        return false;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Eğer değerimiz true yani başarılı dönmüşse sp_select fonksiyonu ile datagridviewin içeriğini doluruyoruz.&lt;/p&gt;
&lt;p&gt;private void button2_Click (object sender, EventArgs e)
{
if (db.sp_insert (&quot;sp_insert&quot;, textBox1.Text, textBox2.Text, textBox4.Text, Convert.ToInt32 (textBox3.Text), textBox5.Text, out _err))
{
dataGridView1.DataSource=db.sp_select (&quot;sp_select_uye&quot;, out _err);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       }
       else
       {
           MessageBox.Show (&quot;INSERT SUCCESS&quot;);
       }
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;C# ile Stored Procedure Update&lt;/h2&gt;
&lt;p&gt;Bu bölümde de update işleminden bahsedeceğim. Senaryomuzu şifresini değiştirmek isteyen bir kullanıcı üzerinden düşünelim. Sistemin ilk yapması gereken kullanıcının kim olduğunu bulmak. Burada da ad soyad ve mail kullanarak kullanıcının kim olduğunu buluyoruz. Diğer adım olarak da kullanıcının yeni parolasını alıyoruz ve eski parolasının yerine SET ediyoruz. Bu set etme işlemini sp kullanarak yapıyoruz.&lt;/p&gt;
&lt;p&gt;public static bool sp_update (string sp_name, string ad, string soyad, string parola, string email, string newpassw, out string _error)&lt;/p&gt;
&lt;p&gt;{
    DataSet ds = new DataSet ();&lt;/p&gt;
&lt;p&gt;    _error=null;&lt;/p&gt;
&lt;p&gt;    bool xs = true;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;    ds=check ();&lt;/p&gt;
&lt;p&gt;    List&amp;lt;string&amp;gt; l = new List&amp;lt;string&amp;gt; ();&lt;/p&gt;
&lt;p&gt;    foreach (DataRow item in ds.Tables[0].Rows)&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        //     l.Add (item[&quot;ad&quot;].ToString ());&lt;/p&gt;
&lt;p&gt;        if (item[&quot;email&quot;].ToString ()==email)&lt;/p&gt;
&lt;p&gt;        {
            xs=false;
        }&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;    if (!xs)&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        try&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            using (SqlConnection con = sqldbsconnect ())&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;                if (con.State.ToString ()==&quot;Open&quot;&amp;amp;&amp;amp;xs==false)&lt;/p&gt;
&lt;p&gt;                {&lt;/p&gt;
&lt;p&gt;                    SqlCommand sqlComm = new SqlCommand (sp_name, con);&lt;/p&gt;
&lt;p&gt;                    sqlComm.Parameters.AddWithValue (&quot;ad&quot;, ad);&lt;/p&gt;
&lt;p&gt;                    sqlComm.Parameters.AddWithValue (&quot;soyad&quot;, soyad);&lt;/p&gt;
&lt;p&gt;                    sqlComm.Parameters.AddWithValue (&quot;password&quot;, parola);&lt;/p&gt;
&lt;p&gt;                    sqlComm.Parameters.AddWithValue (&quot;email&quot;, email);&lt;/p&gt;
&lt;p&gt;                    sqlComm.Parameters.AddWithValue (&quot;newpassword&quot;, newpassw);&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;                    sqlComm.CommandType=CommandType.StoredProcedure;&lt;/p&gt;
&lt;p&gt;                    SqlDataAdapter da = new SqlDataAdapter ();&lt;/p&gt;
&lt;p&gt;                    da.SelectCommand=sqlComm;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;                    da.Fill (ds);&lt;/p&gt;
&lt;p&gt;                    return true;&lt;/p&gt;
&lt;p&gt;                }&lt;/p&gt;
&lt;p&gt;                else&lt;/p&gt;
&lt;p&gt;                {&lt;/p&gt;
&lt;p&gt;                    _error=&quot;DB SERVER CONNECTION = &quot;+con.State.ToString ();&lt;/p&gt;
&lt;p&gt;                    return false;&lt;/p&gt;
&lt;p&gt;                }&lt;/p&gt;
&lt;p&gt;            }
        }&lt;/p&gt;
&lt;p&gt;        catch (Exception ex)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            return false;&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;    else&lt;/p&gt;
&lt;p&gt;    {
        _error=&quot;KULLANICI  YOK !  &quot;;
        return false;&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Eğer işlem başarılı ise ekranda gösteriyoruz.&lt;/p&gt;
&lt;p&gt;private void button3_Click (object sender, EventArgs e)
       {
           if (db.sp_update (&quot;sp_update&quot;, textBox1.Text, textBox2.Text, textBox4.Text, textBox5.Text, textBox6.Text, out _err))&lt;/p&gt;
&lt;p&gt;           {
  MessageBox.Show (&quot;UPDATE SUCCESS&quot;);
               dataGridView1.DataSource=db.sp_select (&quot;sp_select_uye&quot;, out _err);
          }&lt;/p&gt;
&lt;p&gt;           else
           {
               MessageBox.Show (&quot;UPDATE FAIL!&quot;);
           }
       }&lt;/p&gt;
&lt;h2&gt;C# ile Stored Procedure Delete&lt;/h2&gt;
&lt;p&gt;Tıpkı Update işlemine benzer şekilde çalışmaktadır. Yapmamız gereken silinmek istenen kişilerin bilgilerini alıyoruz eğer sistemde böyle birisi var ise sistemden bilgilerini siliyoruz&lt;/p&gt;
&lt;p&gt;public static bool sp_delete (string sp_name, string ad, string soyad, string email, out string _error)&lt;/p&gt;
&lt;p&gt;  {
      DataSet ds = new DataSet ();&lt;/p&gt;
&lt;p&gt;      _error=null;&lt;/p&gt;
&lt;p&gt;      bool xs = true;&lt;/p&gt;
&lt;p&gt;      ds=check ();&lt;/p&gt;
&lt;p&gt;      List&amp;lt;string&amp;gt; l = new List&amp;lt;string&amp;gt; ();&lt;/p&gt;
&lt;p&gt;      foreach (DataRow item in ds.Tables[0].Rows)&lt;/p&gt;
&lt;p&gt;      {&lt;/p&gt;
&lt;p&gt;         //     l.Add (item[&quot;ad&quot;].ToString ());&lt;/p&gt;
&lt;p&gt;          if (item[&quot;email&quot;].ToString ()==email)&lt;/p&gt;
&lt;p&gt;          {&lt;/p&gt;
&lt;p&gt;              xs=false;&lt;/p&gt;
&lt;p&gt;          }&lt;/p&gt;
&lt;p&gt;      }&lt;/p&gt;
&lt;p&gt;      if (!xs)&lt;/p&gt;
&lt;p&gt;      {&lt;/p&gt;
&lt;p&gt;          try&lt;/p&gt;
&lt;p&gt;          {&lt;/p&gt;
&lt;p&gt;              using (SqlConnection con = sqldbsconnect ())&lt;/p&gt;
&lt;p&gt;              {&lt;/p&gt;
&lt;p&gt;                  if (con.State.ToString ()==&quot;Open&quot;&amp;amp;&amp;amp;xs==false)&lt;/p&gt;
&lt;p&gt;                  {&lt;/p&gt;
&lt;p&gt;                      SqlCommand sqlComm = new SqlCommand (sp_name, con);&lt;/p&gt;
&lt;p&gt;                      sqlComm.Parameters.AddWithValue (&quot;ad&quot;, ad);&lt;/p&gt;
&lt;p&gt;                      sqlComm.Parameters.AddWithValue (&quot;soyad&quot;, soyad);&lt;/p&gt;
&lt;p&gt;                      sqlComm.Parameters.AddWithValue (&quot;email&quot;, email);&lt;/p&gt;
&lt;p&gt;                      sqlComm.CommandType=CommandType.StoredProcedure;&lt;/p&gt;
&lt;p&gt;                      SqlDataAdapter da = new SqlDataAdapter ();&lt;/p&gt;
&lt;p&gt;                      da.SelectCommand=sqlComm;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;                      da.Fill (ds);&lt;/p&gt;
&lt;p&gt;                      return true;&lt;/p&gt;
&lt;p&gt;                  }&lt;/p&gt;
&lt;p&gt;                  else&lt;/p&gt;
&lt;p&gt;                  {
                      _error=&quot;DB SERVER CONNECTION = &quot;+con.State.ToString ();&lt;/p&gt;
&lt;p&gt;                      return false;&lt;/p&gt;
&lt;p&gt;                  }
              }&lt;/p&gt;
&lt;p&gt;          }&lt;/p&gt;
&lt;p&gt;          catch (Exception ex)&lt;/p&gt;
&lt;p&gt;          {
              return false;&lt;/p&gt;
&lt;p&gt;          }
      }&lt;/p&gt;
&lt;p&gt;      else&lt;/p&gt;
&lt;p&gt;      {
          _error=&quot;KULLANICI  YOK !  &quot;;
          return false;&lt;/p&gt;
&lt;p&gt;      }&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;  }&lt;/p&gt;
&lt;h3&gt;Projenin kaynak dosyaları :&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/stored_procedure-example&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# Veritabanı İşlemleri-1</title><link>https://fuwari.vercel.app/posts/c-stored-procedure-islemleri-1/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/c-stored-procedure-islemleri-1/</guid><description>Bu yazımızda daha [önceki yazılarımda](https://blog.berkarat.com/stored-procedure-islemleri/)  bahsettiğim Stored Procedure işlemlerini C ortamında ku</description><pubDate>Thu, 01 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-696x748.png&quot; alt=&quot;C Logo - C# QrCode Generator Uygulaması (Logo eklenebilir)&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda daha &lt;a href=&quot;https://blog.berkarat.com/stored-procedure-islemleri/&quot;&gt;önceki yazılarımda&lt;/a&gt;  bahsettiğim Stored Procedure işlemlerini C# ortamında kullanımından bahsedeceğim. Bu işlemleri örneklerle devam ederek anlatacağım.&lt;/p&gt;
&lt;p&gt;Bu işlemlere başlamadan önce veritabanına bağlantı yapmamız gerekmektedir. Bu işlemler için bir db connection işlemi yapmamız gerekiyor.  Aşağıda verdiğim linkte bir çok sql bağlantı stringlerini bulabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.connectionstrings.com/sql-server/&quot;&gt;https://www.connectionstrings.com/sql-server/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Data Source=berk;Initial Catalog=berkaratcom;Persist Security Info=False;User ID=berkaratsite;Password=123456&lt;/p&gt;
&lt;p&gt;Bu connection string kullanımını register üzerinden yapacağız bunun için Bilgisayar\HKEY_LOCAL_MACHINE\SOFTWARE yoluna gidiyoruz. Burada Yenil&amp;gt;Anahtar diyerek bir alan oluşturuyoruz daha sonra bu anahtarın üzerine gelerek sağ tıklıyoruz ve  Yeni&amp;gt;Dize değeri diyerek stringimizi oluşturuyoruz. Bu string değere yukarıda verdiğim connection stringi yazıyoruz.&lt;/p&gt;
&lt;p&gt;public static SqlConnection sqldbsconnect ()
{
var hklm = RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry64);
// System 64 üzerinden çalışıyor !!
var key = hklm.OpenSubKey (@&quot;SOFTWARE\berkarat\sql&quot;);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//  string constring = Settings.Default.dbconnection.ToString ();
string constring = key.GetValue (&quot;dbconnection&quot;).ToString ();
SqlConnection con = new SqlConnection (constring);
try
{
    con.Open ();
}
catch (Exception)
{
     MessageBox.Show(&quot; Server Bağlantı Sorunu &quot;, &quot;UYARI&quot;, MessageBoxButtons.OK);
    //EventLogaYaz.HataMesajiYaz(ex, 0);
}

return con;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Buradaki C# örneği sqlconnection işlemini yapmamıza yarayan metodu göstermektedir. KEY ile register üzerinden sql sorgumuzu çağırıyoruz. Bunun bize avantajı eğer bu programı farklı bir veritabanında uygulamak isterseniz yapmanız gereken tek şey register üzerinden bilgileri değiştirmek. Daha sonrasında da bildiğimiz connection açma işlemleri&lt;/p&gt;
&lt;h2&gt;C# ile Stored Procedure Select&lt;/h2&gt;
&lt;p&gt;Bu bölümde Stored procedure kullanacağız ve C# üzerinden select işlemini yapacağız. Yukarıda  bahsettiğim sqlconnection fonksiyonunu kullanarak bağlantıyı oluşturuyoruz. Ardından sql comand oluşturuyoruz ve tipini belirliyoruz. Daha sonra bu işlemleri DataTable’a aktaracağımız için Datatable olarak return dönüşü yapıyoruz.&lt;/p&gt;
&lt;p&gt;public static DataTable sp_select (string sp_name, out string _error)
{
DataTable ds = new DataTable ();
_error=null;
try
{
using (SqlConnection con = sqldbsconnect ())
{
if (con.State.ToString ()==&quot;Open&quot;)
{
SqlCommand sqlComm = new SqlCommand (sp_name, con);
sqlComm.CommandType=CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter ();
da.SelectCommand=sqlComm;
da.Fill (ds);
}
else
{
_error=&quot;DB SERVER CONNECTION = &quot;+con.State.ToString ();
}
}
}
catch (Exception ex)
{
_error=ex.ToString ();
}
return ds;
}&lt;/p&gt;
&lt;p&gt;Burada _error ise out tipinde tanımlamış olan string değer bizim işlemimiz eğer bir hata oluşursa dönüş mesajını görünteleyecektir. Eğer istenilirse bu mesajlar Log olarak da tutulabilir.&lt;/p&gt;
</content:encoded></item><item><title>Microsoft Sql Server Stored Procedure İşlemleri-2</title><link>https://fuwari.vercel.app/posts/stored-procedure-islemleri-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/stored-procedure-islemleri-2/</guid><description>Bu yazım daha önceki yazım olan Stored Procedure işlemlerinin devamı niteliğinde olan bir yazıdır. Veritabannı işlemlerine devam etmekteyiz. Bu seferk</description><pubDate>Wed, 31 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_sql.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_sql.png&quot; alt=&quot;sql server&quot; title=&quot;sql&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazım daha önceki yazım olan Stored Procedure işlemlerinin devamı niteliğinde olan bir yazıdır. Veritabannı işlemlerine devam etmekteyiz. Bu seferki konularımız update ve delete işlemleri olacak. Aslında sql işlemlerinde update ve delete işlemleri ayrı ayrı olarak görünse de update işlemi ile de delete işlemini gerçekleştirebilmekteyiz.&lt;/p&gt;
&lt;h3&gt;Stored Procdure Update&lt;/h3&gt;
&lt;p&gt;Update işlemini sql olarak yazdıktan sonra aşağıdaki gibi bir Stored Procedure oluşturuyoruz. Buradaki işlemde parolamızı yenileme işlemini gerçekleştiriyoruz. Newpassword isimli parametremizi password isimli parametreye SET ederek güncelleme işlemi yapıyoruz. Bu sql sorgusunu aşağıdaki gibi stored procedure çeviriyoruz. Böylece daha sonra göreceğimiz sorguları çağırma işlemi yaparken tekrar tekrar yazmamıza gerek kalmayacak.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO
CREATE PROCEDURE  [dbo].sp_Update&lt;/p&gt;
&lt;p&gt;@ad nvarchar(50),
@soyad nvarchar(50),
@email nvarchar(50) ,
@newpassword nvarchar(50)&lt;/p&gt;
&lt;p&gt;AS
BEGIN
SET NOCOUNT ON;
UPDATE tbl_test
SET password=@newpassword
WHERE
ad=@ad and
soyad=@soyad and
email=@email&lt;br /&gt;
END&lt;/p&gt;
&lt;p&gt;Daha sonra yazmış olduğumuz procedure doğru çalışıp çalışmadığını kontrol etmek için aşağıdaki sql sorgusunu kullanabiliriz veya daha önce dediğim gibi execute kısmından da test edebiliriz.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO&lt;/p&gt;
&lt;p&gt;DECLARE	@return_value int&lt;/p&gt;
&lt;p&gt;EXEC	@return_value = [dbo].[sp_update]
@ad =&apos;Berk&apos;,
@soyad =  &apos;Arat&apos;,
@password = &apos;123456&apos;,
@newpassword =  &apos;0012300&apos;,
@email = &apos;&lt;a href=&quot;/cdn-cgi/l/email-protection&quot;&gt;[email protected]&lt;/a&gt;&apos;&lt;/p&gt;
&lt;p&gt;SELECT	&apos;Return Value&apos; = @return_value&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;h3&gt;Stored Procedure Delete&lt;/h3&gt;
&lt;p&gt;Silme işlemi için de update işlemi gibi benzer bir yapıya sahiptir. Genellikle drop komutuyla karıştırılmaktadır. Ancak drop tamamen tablo üzerinde işlem yaparken delete ise sadece şartı sağlayan satırı silmektedir.&lt;/p&gt;
&lt;p&gt;Aşağıda belirttiğimiz Stored procedure örneğinde email adresi bizim verdiğimiz mail ile eşleşen üyenin kaydını tablodan silmektedir.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO
CREATE PROCEDURE  [dbo].[sp_delete]
@ad nvarchar(50),
@soyad nvarchar(50),
@email nvarchar(50)&lt;/p&gt;
&lt;p&gt;AS
BEGIN
SET NOCOUNT ON;&lt;br /&gt;
Delete tbl_uyebilgi
WHERE
ad=@ad       and
soyad=@soyad and
email=@email&lt;br /&gt;
END&lt;/p&gt;
&lt;p&gt;Bu işlemi yaptıktan  sonra yazdığımız sorgunun doğruluğunu kontrol etmek için aşağıdaki sorguyu execute ediyoruz ve kaydımızın silindiğini görüyoruz.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO&lt;/p&gt;
&lt;p&gt;DECLARE	@return_value int&lt;/p&gt;
&lt;p&gt;EXEC	@return_value = [dbo].[sp_delete]
@ad =  &apos;Berk&apos;,
@soyad =  &apos;Arat&apos;,
@email =  &apos;&lt;a href=&quot;/cdn-cgi/l/email-protection&quot;&gt;[email protected]&lt;/a&gt;&apos;&lt;/p&gt;
&lt;p&gt;SELECT	&apos;Return Value&apos; = @return_value&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;Bu iki yazımdaki örnekleri daha sonra C# üzerinde kullanacağımız programlarda çağıracağız. Böylece C# üzerinden stored procedureler kullanarak veritabanı işlemleri gerçekleştirebileceğiz. Program üzerinde yazılacak olan sıfırdan sorgular performans açısından çok yetersiz kalmaktadır. Bunun yanı sıra dinamik bir yapının oluşmasının da önüne geçmektedir. Genelde projelerde stored procedureler kullanılmakta ve bunlar temel rol almaktadır.&lt;/p&gt;
&lt;p&gt;Örneğin bir monitoring yani takip programı yazıldığını düşünürsek ve sürekli veri tabanına bilgi akışının olduğu bir senaryoyu ele alalım. Bu senaryoda program içerisinde farklı threadler farklı tablolara bilgi yazacak update edecek veya select işlemlerini yapacaklar. Eğer program üzerinden sorgular gönderilirse sorgulama işlemi c# üzerinde yapılmış olacak. Ancak stored procedureler kullanıldığı takdirde iş yükü paylaşılmış olacak ve c# üzerinden sadece parametreler gönderilecek sorgulama kısmı sql server üzerinde gerçekleşecektir.&lt;/p&gt;
</content:encoded></item><item><title>Microsoft Sql Server Stored Procedure İşlemleri-1</title><link>https://fuwari.vercel.app/posts/stored-procedure-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/stored-procedure-islemleri/</guid><description>Merhaba bu yazımda Sql server üzerinden bazı temel işlemlerin nasıl yapıldığına dair açıklamalar ve örneklerden bahsedeceğim.</description><pubDate>Tue, 30 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_sql.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_sql.png&quot; alt=&quot;sql server&quot; title=&quot;sql&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımda Sql server üzerinden bazı temel işlemlerin nasıl yapıldığına dair açıklamalar ve örneklerden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Öncelikle Stored Procedure dediğimiz kavramı açıklamak istiyorum. Bunlar bir görevi tamamlamak için yazmış olduğumu kod parçalarıdır. Örneğin bir tablo oluşturma işleminin sorgusunu biz hazır bir format haline getirip dışarıdan parametre alabilir bir forma dönüştürürsek bunu sp olarak kaydetme imkanımız vardır. Spler parametre aldıkları gibi kendi içlerinde de başka bir sp çağırabilirler. Performans açısından büyük verilerde çok hızlıdırlar.&lt;/p&gt;
&lt;p&gt;USE &quot;Database Name&quot;
GO&lt;/p&gt;
&lt;p&gt;CREATE PROCEDURE  &quot;Stored Procedure Name&quot;
// Varsa parametrelerin declare edileceği bölüm&lt;/p&gt;
&lt;p&gt;AS
BEGIN&lt;/p&gt;
&lt;p&gt;SET NOCOUNT ON;&lt;/p&gt;
&lt;p&gt;// Yazacağımız Sorgu
END&lt;/p&gt;
&lt;p&gt;Yukarıda gördüğümüz gibi temelde normal sql sorguları gibi aynıdır yapıdadır ancak parametre alma durumlarında declare dediğimiz tanımlama işlemleri yapmamız gerekmektedir.&lt;/p&gt;
&lt;h3&gt;Stored Procedure Create&lt;/h3&gt;
&lt;p&gt;Örnek olarak bir tablo oluşturalım ardından o tabloya veri ekleyelim ve ardından bu verileri çekme işlemini yapacak spleri oluşturalım.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO
CREATE PROCEDURE [dbo].[sp_CreateTable]
AS
BEGIN
SET NOCOUNT ON;&lt;/p&gt;
&lt;p&gt;CREATE TABLE  tbl_test(
[ad] [nvarchar](50) NULL,
[soyad] [nvarchar](50) NULL,
[yas] [int] NULL,
[password] [nvarchar](50) NULL,
[email] [nvarchar](50) NULL,&lt;/p&gt;
&lt;p&gt;) ON [PRIMARY]
END&lt;/p&gt;
&lt;p&gt;Bu sql sorgumuz bize tbl_test adında 5 tane parametresi olan bir tablo oluşturmaktadır. Stored procedur adımız ise sp_CreateTable olarak belirledik bu sorguyu execute ettiğimiz zaman Programmability&amp;gt;Stored Procedure yolunun altında procedure görünecektir.&lt;/p&gt;
&lt;h3&gt;Stored Procedure Select&lt;/h3&gt;
&lt;p&gt;Bu sql işleminde select yani çağırma işlemini gerçekleştireceğiz.&lt;/p&gt;
&lt;p&gt;Burada dikkat edilmesi gereken nokta iki farklı tablo ile işlem yapmaktayız. Bu tabloların birine “a” diğerine “b” olarak tanımlıyoruz. Ardından a. veya b. şeklinde o tablonun istenilen sütununu çağırabiliyoruz. Böylece bir sorguda iki tabloya hükmedebiliyoruz. Bu sayede birbirleriyle ilişkili tablolar da oluşturabilmekteyiz.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO
CREATE PROCEDURE [dbo].[sp_select]
AS
BEGIN&lt;/p&gt;
&lt;p&gt;SET NOCOUNT ON;&lt;/p&gt;
&lt;p&gt;SELECT
a.film_ad,
b.koltuk_sayisi,
a.dolu_koltuk sayisi&lt;/p&gt;
&lt;p&gt;FROM
dbo.tbl_koltukdurumu a,
dbo.tbl_koltukdurumu b
WHERE
a.film_id=b.film_id&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO&lt;/p&gt;
&lt;p&gt;DECLARE	@return_value int&lt;/p&gt;
&lt;p&gt;EXEC	@return_value = [dbo].[sp_select]&lt;/p&gt;
&lt;p&gt;SELECT	&apos;Return Value&apos; = @return_value&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;h3&gt;Stored Procedure Insert&lt;/h3&gt;
&lt;p&gt;Daha sonra tablolar kısmında tbl_test tablomuza insert işlemi gerçekleştirecek bir procedure oluşturalım.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO&lt;/p&gt;
&lt;p&gt;CREATE PROCEDURE  [dbo].[sp_insert]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@ad nvarchar(50),
@soyad nvarchar(50),
@yas int, 
@password nvarchar(50),
@email nvarchar(50) 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AS
BEGIN
SET NOCOUNT ON;&lt;/p&gt;
&lt;p&gt;INSERT INTO [dbo].tbl_test
([ad]
,[soyad]
,[yas]
,[password]
,[email])&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; VALUES
        ( 
     @ad,@soyad,@yas,@password,@email )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;END&lt;/p&gt;
&lt;p&gt;Buradaki sql örneğimizde  sp_insert adından bir sp oluşturuyoruz ve ardından declare dediğimiz parametreleri tanımlama yapıyoruz. Burada dikkat edilmesi gereken nokta parametrelerin değerleri ile tablodaki değerler aynı olmalıdır aksi takdirde hata mesajı ile karşılaşırız.&lt;/p&gt;
&lt;p&gt;USE [berkaratcom]
GO&lt;/p&gt;
&lt;p&gt;DECLARE	@return_value int&lt;/p&gt;
&lt;p&gt;EXEC	@return_value = [dbo].[sp_insert_test]
@ad = &apos;Berk&apos;,
@soyad = &apos;Arat&apos;,
@yas = 25,
@password = &apos;123456&apos;,
@email = N&apos;&lt;a href=&quot;/cdn-cgi/l/email-protection&quot;&gt;[email protected]&lt;/a&gt;&apos;&lt;/p&gt;
&lt;p&gt;SELECT	&apos;Return Value&apos; = @return_value&lt;/p&gt;
&lt;p&gt;GO&lt;/p&gt;
&lt;p&gt;Ardından sql querry modundan da yapacağımız bu sorgu ile işlemimizin doğru olup olmadığını test edebiliriz. Eğer sorgusuz yapılmasını istiyorsanız modify seçeneği ile de yapılabilir.&lt;/p&gt;
&lt;h4&gt;&lt;em&gt;&lt;strong&gt;Ek bilgi&lt;/strong&gt;&lt;/em&gt; &lt;/h4&gt;
&lt;h4&gt;nvarchar ile varchar arasındaki fark şudur :&lt;/h4&gt;
&lt;p&gt;varchar : latif alfabesi için kullanılır ve her karakter için 1 byte veri boyutuna sahiptir.&lt;/p&gt;
&lt;p&gt;nvarchar : Arap, Çin alfabeleri gibi Latin olmayan alfabeleri de kapsamaktadır ve her karakter için 2 byte veri boyutuna sahiptir.&lt;/p&gt;
</content:encoded></item><item><title>C# QrCode Generator Uygulaması (Logo eklenebilir)</title><link>https://fuwari.vercel.app/posts/qrcode-uygulamasi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/qrcode-uygulamasi/</guid><description>Bu yazımda C WPFile yazmış olduğum genel olarak da kullanılabilir durumda olan QR code uygulamasından bahsedeceğim. Bu sadece Qrcode uygulamasından öt</description><pubDate>Wed, 24 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-696x748.png&quot; alt=&quot;C Logo - C# QrCode Generator Uygulaması (Logo eklenebilir)&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımda C# WPFile yazmış olduğum genel olarak da kullanılabilir durumda olan QR code uygulamasından bahsedeceğim. Bu sadece Qrcode uygulamasından öte içerisinde logo barındırması açısından da farklılık göstermektedir.  Uygulamanın içerisinde isteğe bağlı olarak şifreleme yaparak da qrcode oluşturabilmektedir.&lt;/p&gt;
&lt;p&gt;QR(Quick Response) kodu kolaylık olması amacıyla içerisine link, bilgiler, belirli şifreler gibi bilgilerin kod haline çevrilmesiyle oluşur.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_xx-min.png&quot; alt=&quot;C#&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Uygulama Ekran Görüntüsü&lt;/p&gt;
&lt;p&gt;Bu uygulamada Qrcode için Nuget üzerinden Zxing.Net indirip referans etmemiz gerekmektedir veya cmd üzerinden de yükleyebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Install-Package ZXing.Net&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ardından System.Drawing, Newtonsoft gibi eklentileri de eklememiz gerekmektedir.&lt;/p&gt;
&lt;h2&gt;Kodların İncelenmesi&lt;/h2&gt;
&lt;p&gt;public class JsonTest
{
public string Banka_ID { get; set; }
public DateTime date { get; set; }
public string Language_ID { get; set; }
public string ReferansNo { get; set; }
public string Terminal_ID { get; set; }
}&lt;/p&gt;
&lt;p&gt;Bu bölümde newtonsoft ile bir json dosya oluşturmamız gerekmektedir. Bu json oluşması için bir mesaj yapısı yani bir class oluşturuyoruz. Bu class isteğe göre şekillendirilebilir. Qrcode içerisinde görünecek bilgileri belirliyoruz.&lt;/p&gt;
&lt;p&gt;public static string js (string TerminalID, DateTime date, string LanguageID, string BankaID, string refno)
{
var test = new JsonTest ()
{
ReferansNo=refno,
Terminal_ID=TerminalID,
date=date,
Language_ID=LanguageID,
Banka_ID=BankaID
};
return JsonConvert.SerializeObject (test, Formatting.Indented);
}&lt;/p&gt;
&lt;p&gt;Bu da json stringimizin “js” olarak oluşturmaya yarayan kod bloğudur.&lt;/p&gt;
&lt;p&gt;public static Bitmap GenerateQR (int width, int height, string js, out string err)
{
err=&quot;&quot;;
try
{
if (js!=null)
{
IBarcodeWriter barcodeWriter = new BarcodeWriter ();
barcodeWriter.Format=BarcodeFormat.QR_CODE;
QrCodeEncodingOptions options = new QrCodeEncodingOptions ();
options=new QrCodeEncodingOptions
{&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                   Width=width,
                   Height=height,
                   Margin=0
               };
               options.Hints.Add (EncodeHintType.ERROR\_CORRECTION, ErrorCorrectionLevel.H);
               barcodeWriter.Options=options;
               var result = new Bitmap (barcodeWriter.Write (js));
               return result;
           }
           else
               return null;
       }
       catch (Exception)
       {
           err=&quot;METİN  BOŞ GEÇİLEMEZ!&quot;;
           return null;
       }

       }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GenerateQR metodumuzda ise asıl işlem olan qrcode oluşturma işlemini gerçekleştiriyoruz. Burada sonuç Bitmap türünde dönmektedir. Daha sonra bu bitmap tipini bir image dosyasının içine gömüp ekranda göstereceğiz. Burada bitmap çıktısının en,boy ve kenar boşluklarını belirliyoruz.&lt;/p&gt;
&lt;p&gt;Eğer içerisinde image yani logo kullanmak istersek birkaç ekleme yapmamız gerekmektedir. Bu eklemler de şöyle:&lt;/p&gt;
&lt;p&gt;Bitmap bm = bw.Write (js);
Bitmap overlay = new Bitmap (imagePath);
int deltaHeigth = bm.Height-overlay.Height;
int deltaWidth = bm.Width-overlay.Width;
Graphics g = Graphics.FromImage (bm);
g.DrawImage (overlay, new System.Drawing.Point (deltaWidth/2, deltaHeigth/2));&lt;/p&gt;
&lt;p&gt;Bu kodları ekledikten sonra artık logo ile birlikte kullanabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Burada dikkat edilmesi gereke diğer noktalar da eklenmek istenilen logonun tipi ( .jpg .png ) gibi türler olması ve verinin boyutunun bir sınırı olması gerekmektedir. Bunu da aşağıdaki kod örneğindeki gibi uygulayabiliriz.&lt;/p&gt;
&lt;p&gt;if (openFileDialog.ShowDialog ()==true)
{
string path = openFileDialog.FileName;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FileInfo fi = new FileInfo (path);
string ext = fi.Extension;

if (ext.ToLower ()==&quot;.jpg&quot;||ext.ToLower()==&quot;.jpeg&quot; ||ext.ToLower ()==&quot;.png&quot;)
{
    if (File.Exists (path))
    {
        long length = new System.IO.FileInfo (path).Length;
    }
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buradan sonra yapacağımız tek şey bilgileri girip ardından qrcode okuyucu ile ekrandan çıkan bilgilerle sizin verdiğinizin eşleşmesi. Bunun için mobil üzerinden bir tarayıcı indirmeniz yeterlidir.&lt;/p&gt;
&lt;p&gt;Bu uygulamada image kullanımında Bitmap kullanımını, wpf kullanımının pratikleştirilmesi başka kütüphanelerin nasıl kullanıldığına dair bilgiler aktarmaya çalıştım. Eğer sorularınız olursa sorabilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/QrCodeWithLogo&quot;&gt;UYGULAMA KAYNAK KODU&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>WPF Blend Uygulaması</title><link>https://fuwari.vercel.app/posts/wpf-blend-uygulamasi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/wpf-blend-uygulamasi/</guid><description>Önceki yazımda Wpf nedir nasıl kullanılır bilgileri paylaşmıştım. Bu yazı devam niteliğindedir. Wpf tek başına görsel olarak yetersiz kalsa da bu konu</description><pubDate>Wed, 24 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_wpf_blend.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_wpf_blend-696x693.png&quot; alt=&quot;Wpf Blend - WPF Blend Uygulaması&quot; title=&quot;wpf_blend&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Önceki yazımda Wpf nedir nasıl kullanılır bilgileri paylaşmıştım. Bu yazı devam niteliğindedir. Wpf tek başına görsel olarak yetersiz kalsa da bu konuda yine Microfost tarafından geliştirlen Blend uygulaması devreye giriyor.&lt;/p&gt;
&lt;p&gt;Blend nedir sorusunu tek bir cümleyle özetlemek gerekirse WPF için tasarım yapmaya yarayan ortamımız diyebiliriz.&lt;/p&gt;
&lt;p&gt;Blend daha çok kod tarafından ziyade görsel olarak tasarım yapmamıza olanak sağlar. Böylece XAML dediğimiz asıl arka plan olan kodlara hiç dokunmamıza gerek kalmamaktadır. Tıpkı Web programlamada Html yazmak yerine sürükle bırak yapmamızı sağlayan uygulamalar nasıl varsa blend de buna örnek olabilir.&lt;/p&gt;
&lt;h2&gt;Blend Uygulama&lt;/h2&gt;
&lt;p&gt;Blend uygulamasını yapmak için önceki  yazılarda bahsettiğim gibi bir adet WPF uygulaması açmamız gerekmektedir. Tek başına da blend uygulaması kullanılabilmektedir ancak görsel olduğundan dolayı pek tercih edilmemektedir.&lt;br /&gt;
Wpf üzerinden yazdığımız uygulamaya görsellik katmak amacıyla WPF -&amp;gt; Blend geçişi bulunmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_5.png&quot; alt=&quot;WPF &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Okla gösterilen yerden “Desing in Blend” Blend uygulamasının arayüzüne  geçiş yapabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Bu adımdan sonra sol tarafta bulunan toolbox bölümünden tıpkı wpf gibi button label vs gibi elementler ekleyebilmekteyiz.&lt;/p&gt;
&lt;h2&gt;Blend Storyboard Kullanımı&lt;/h2&gt;
&lt;p&gt;Blend uygulamasında en çok kullanılan kısım storyboardlar ve animasyonlardır. Adı üzerinde olduğu gibi bir animasyon katmamızı ve bunu hiç kod yazmadan yapmamızı sağlıyor. Örneğin bir butonun veya bir logonun kendi etrafında 360 derece hareket etmesi veya başka bir sayfaya geçişin animasyon olarak geçiş yapması gibi özellikler uygulayabilmekteyiz.&lt;/p&gt;
&lt;p&gt;Buna ek olarak effect bölümünden de gölge vs gibi efektler de ekleyebilmekteyiz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_1.png&quot; alt=&quot;C#&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Burada okla gösterilen bölümden “+” sembolüne tıklıyoruz. Ardından storyboardımızın adını belirliyoruz. Ekranın çerçevesinin köşesinde “recording on” yazısı gözükemtedir. Bu adımdan sonra ekran izlemesi başlar ve ekranda yapılan değişikler kişi kontrolünde animasyona çevrilebilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_2.png&quot; alt=&quot;c#&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu adımda süre belirleme işlemi yapıyoruz. Bu örnekte $ logosunu 360 derece döndürme işlemi yapacağım. Bu işlem süresini 2sn olarak belirliyorum. Sarı çizgiyi sağ tarafa çekerek. Ardından logonun properties kısmından veya kenarlarındaki oklardan ekseni etrafında çeviriyorum. Daha sonra sol üst köşedeki recording on yazısında tıklıyorum ve off oluyor. Artık yaptığımız animasyon kayıt altına alındı.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_3.png&quot; alt=&quot;C#&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kayıt tamamlandıktan sonra sol tarafta bulunan Trigers kısmından neyin tetikleyeceğini belirlememiz gerekmektedir. Eğer belirlemezsek  varsayılan olarak Window Load yani ekran açıldığında animasyon çalışacaktır. Ancak bir çok event olduğundan istenilen durumlarda ayarlanabilir. Diğer ayarlardan da kaç kere tekrar edeceği ne zaman duracağı gibi özellikler eklenilerek geliştirilebilir.&lt;/p&gt;
</content:encoded></item><item><title>Visual Studio WPF(Windows Presentation Foundation) Nedir?  Uygulama Örnek</title><link>https://fuwari.vercel.app/posts/wpf-nedir-uygulama-ornek/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/wpf-nedir-uygulama-ornek/</guid><description>WPF (Windows Presentation Foundation) Microsoft’un çıkardığı .Net grafik altyapısını oluşturan XAML tabanlı sistemdir. Son kullanıcıya yönelik görsel</description><pubDate>Tue, 23 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_wpf_logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_wpf_logo.png&quot; alt=&quot;Wpf Logo - WPF Blend Uygulaması&quot; title=&quot;wpf_logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;WPF (Windows Presentation Foundation) Microsoft’un çıkardığı .Net grafik altyapısını oluşturan XAML tabanlı sistemdir. Son kullanıcıya yönelik görsel amaçlar düşünülerek kurulmuş bir sistemdir&lt;/p&gt;
&lt;p&gt;Daha eski teknoloji olan Windows Form uygulamalarının gelişmiş hali diyebiliriz. Bu platformun sağladığı birçok avantaj vardır. Bunlardan bazıları modern ara yüze sahip olması, ses ve görüntü eklemelerin hızlı ve rahat olması, kullanıcı ile etkileşimli olması gibi özellikleri avantaj sağlamaktır.&lt;/p&gt;
&lt;p&gt;En büyük sorunlardan birisi de çözünürlük sorunuydu. Örneğin 1024×768 bir ekrana göre ayarladığınız bir uygulamayı 1680×1050 çözünürlükteki bir ekrana uyarlamak çok zordur. Çözünürlük anlamında kayıplar olmaktadır.&lt;/p&gt;
&lt;p&gt;WPF bu sorunu çözerek görsellik ve çözünürlük sorununu ortadan kaldırmıştır. Daha modern bir görünüme geçmiştir.&lt;/p&gt;
&lt;p&gt;Bunun yanı sıra en önemli kısmı donanımı en yüksek verimle kullanmasıdır.&lt;/p&gt;
&lt;p&gt;Örneğin bir logonun 360 derece kendi etrafında dönmesini Windows Form tarafında ancak döngüler kullanılarak yapmak mümkünken. WPF ve Blend kullanarak çok daha hızlı ve verimli şekilde yapmak mümkündür.&lt;/p&gt;
&lt;p&gt;Gelelim WPF örneklerine.&lt;/p&gt;
&lt;p&gt;Tıpkı diğer uygulamalar gibi File&amp;gt;New&amp;gt;Project diyoruz ve karşımıza gelen ekrandan wpf uygulamasını seçiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_wpf.png&quot; alt=&quot;C#&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/c-thread-ve-multithread-islemleri/&quot;&gt;Daha önceki yazımda&lt;/a&gt; Threadlerden bahsetmiştim. Bu örnek de daha çok threadlerin kullanıldığı bir uygulama olacak. Windows Form uygulamalarında Timer kullanılırken WPF için timer kullanımı kaldırılmıştır. Onun yerine Background Worker denilen yapı kullanılmaya başlanmıştır.&lt;/p&gt;
&lt;p&gt;public MainWindow ()
{
InitializeComponent ();&lt;/p&gt;
&lt;p&gt;backgroundWorker1.WorkerReportsProgress=true;
backgroundWorker1.WorkerSupportsCancellation=true;
backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler (backgroundWorker1_ProgressChanged);
backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler (backgroundWorker1_Completed);
backgroundWorker1.DoWork+=new DoWorkEventHandler (backgroundWorker1_DoWork);
}&lt;/p&gt;
&lt;p&gt;private void backgroundWorker1_Completed (object sender, RunWorkerCompletedEventArgs e)
{
DateTime t = DateTime.Now;
if (e.Cancelled)
{&lt;/p&gt;
&lt;p&gt;// Canceled.&lt;/p&gt;
&lt;p&gt;}
else if (e.Error!=null)
{
// Error while performing background operation.
}
else
{
// Task Completed...
}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private void backgroundWorker1_ProgressChanged (object sender, ProgressChangedEventArgs e)
{
textBox.Text=DateTime.Now.ToString ();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e)
{
do
{&lt;/p&gt;
&lt;p&gt;backgroundWorker1.ReportProgress (1);&lt;/p&gt;
&lt;p&gt;if (backgroundWorker1.CancellationPending)
{
e.Cancel=true;
return;
}
Thread.Sleep (1000);&lt;/p&gt;
&lt;p&gt;} while (true);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Bu örnekte BackgorundWorkerların nasıl çalıştığını anlatacağım.&lt;/p&gt;
&lt;p&gt;Üç adımdan oluşmaktadır.&lt;/p&gt;
&lt;p&gt;İşlemi gerçekleştirme (Dowork)&lt;br /&gt;
Süreyi geçirme ( Progress Changed)&lt;br /&gt;
Tamamlama(Completed)&lt;br /&gt;
Adından da  anlaşılacağı gibi Dowork kısmında “ReportProgress” diyerek işlemimizi gerçekleştiriyoruz. Bunun yerine daha detaylı karmaşık bir yapı oluşturabiliriz.&lt;/p&gt;
&lt;p&gt;Progress Changed bölümünde ise bu örnekte ekrana görüntüleme yapılmış. Örneğin her adımda bir nesneyi new diyerek yeniden oluşturabiliriz veya  Thread başlatabiliriz.&lt;/p&gt;
&lt;p&gt;Completed kısmı ise adı üzerinde tamamlandığında ne yapacağımızı belirliyoruz. RunWorkerCompletedEventArgs argümentini kullanarak “Cancel”,”Error”,”Result” gibi  eventlara göre yapılmasını istediğimiz olayları belirliyoruz.&lt;/p&gt;
&lt;h3&gt;Örnek Uygulama&lt;/h3&gt;
&lt;p&gt;Daha iyi anlaşılabilmesi için bu linkteki örnek incelenebilir.  Bu örnek kronometre uygulamasının WPF ve BackgroundWorker kullanılarak yapılmıştır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_4.png&quot; alt=&quot;WPF Blend&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Uygulamanın ekran görüntüsü&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/BackgroundWorker_Example&quot;&gt;https://github.com/berkarat/BackgroundWorker_Example&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C# Thread  ve Multithread  İşlemleri</title><link>https://fuwari.vercel.app/posts/c-thread-ve-multithread-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/c-thread-ve-multithread-islemleri/</guid><description>_📌 Güncelleme (Ağustos 2026): Thread kavramları hâlâ temel; modern .NET’te Task, async/await ve ThreadPool tercihleriyle ilgili uyarılar eklendi._</description><pubDate>Mon, 15 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_10_c-logo-min.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_10_c-logo-min.jpg&quot; alt=&quot;C Logo Min&quot; title=&quot;c# logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): Thread kavramları hâlâ temel; modern .NET’te Task, async/await ve ThreadPool tercihleriyle ilgili uyarılar eklendi.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda programlamanın en temel konularından biri olan Thread konusundan bahsedeceğim. İş parçacıkları olarak da bilinir ve projelerde olmazsa olmaz terimler arasındadır.&lt;/p&gt;
&lt;p&gt;İş parçacıkları tek başına kullanıldığı gibi çoklu yani multithreading olarak da kullanılır. Genel kullanımı bu şekildedir. Bunun amacı da eş zamanlı olarak -paralel – yapılması istenilen işlemlerde kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Örneğin saati gösteren bir uygulamada aynı zamanda başka bir işlem de yapması gerekebilir. Bu durumda iş parçacıkları kullanılır ve ikisi de birbirinden bağımsız olarak işlemiş olurlar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 notu:&lt;/strong&gt; Thread sınıfı hâlâ kullanılabilir; ancak yeni .NET uygulamalarında çoğu senaryoda Task, async/await, ThreadPool ve CancellationToken daha güvenli ve yönetilebilir çözümler sunar.&lt;/p&gt;
&lt;p&gt;n&lt;/p&gt;
&lt;h2&gt;Threadlerde Öncelik (Thread Priority)&lt;/h2&gt;
&lt;p&gt;Eşzamanlı olarak çalışabilen iş parçacıkları olduğunu söylemiştim. Ancak bazı durumlarda öncelik değişebilmektedir. Aynı anda başlatılan iki parçacığın kullanımında birisini önce başlatabiliriz. &lt;strong&gt;Thread.Priority&lt;/strong&gt; özelliği ile bunu yapabiliriz&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Highest, AboveNormal, Normal, BelowNormal, Lowest&lt;/em&gt; gibi türleri vardır.&lt;/p&gt;
&lt;p&gt;thread_1.Priority = ThreadPriority.Normal;&lt;/p&gt;
&lt;h2&gt;Thread.Join İşlemi&lt;/h2&gt;
&lt;p&gt;Thread işleminde bazı durumların da birbirini beklemesi gerekmektedir. Bu durumlarda join işlemini uyguluyoruz. Böylece bir önceki iş bitmeden diğerine geçiş yapılmamış oluyor. Ayrıca bu metodun belirlenen bir süre kadar işlem yapılması gibi overload özellikleri de bulunur.&lt;/p&gt;
&lt;h3&gt;İş parçacıkları için bazı genel kullanılan özellikler şunlardır&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IsAlive :&lt;/strong&gt; Bu özellik iş parçacıklarının durumunu sorgulamaya yarar. Dönüş olarak bool değer tipi döner. Fakat Thread.ThreadState değerinden farklı olarak true veya false değer döner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ThreadState:&lt;/strong&gt;  Bu özellik ise durumu çalışıyor, iptal edildi, beklemede gibi daha detaylı özelliklerine ayırmamıza yarar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suspend:&lt;/strong&gt;  Eski örneklerde görülebilir; modern .NET’te Thread.Suspend desteklenmez/önerilmez. Bunun yerine CancellationToken, lock/semaphore ve kontrollü bekleme mekanizmaları kullanılmalıdır.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;&lt;/p&gt;
&lt;p&gt;namespace ThreadExample
{
public partial class Form1 : Form
{
Thread      thread_1,
thread_2,
thread_3,
thread_4,
thread_5;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer ();
    string Thread\_State;
    public Form1 ()
    {
        InitializeComponent ();
        thread\_1=new Thread (new ThreadStart (t\_1));
        thread\_2=new Thread (new ThreadStart (t\_2));
        thread\_3=new Thread (new ThreadStart (t\_3));
        thread\_4=new Thread (new ThreadStart (t\_4));
        thread\_5=new Thread (new ThreadStart (t\_5));

        Control.CheckForIllegalCrossThreadCalls=false;       // THREAD ÇAKIŞMASINI ENGELLER
        timer.Tick+=new EventHandler (Timer\_Tick);
        timer.Interval=(1000); timer.Start ();
        timer.Enabled=true;

    }

    private void button1\_Click (object sender, EventArgs e)
    {
        try
        {
            thread\_1.Start ();
            //thread\_1.Abort () ;  // Thread İptal İşlemi
            Thread\_State=thread\_1.ThreadState.ToString ();
            Thread\_State=thread\_1.IsAlive.ToString ();
            thread\_1.Join ();
            //thread\_1.Join (300);   //300 ms kadar işlem yapar
            Console.WriteLine (&quot;thread\_1 bitti&quot;);
            label1.Text=&quot;thread\_1 bitti&quot;;
            Thread.Sleep (2000);
            //thread\_2.Start ();
            //thread\_2.Join ();
            label1.Text=&quot;thread\_2 bitti&quot;;
            Console.WriteLine (&quot;thread\_2 bitti&quot;);
            thread\_3.Start ();
            thread\_4.Start ();

        }
        catch (Exception ex)
        {

            MessageBox.Show (ex.Message);
        }

    }

    private void t\_1 ()
    {
        thread\_5.Start ();

        for (int i = 0; i&amp;lt;=100; i++)
        {
            progressBar1.Value=i;
            Thread.Sleep (20);

        }

    }
    private void t\_2 ()
    {
        for (int i = 0; i&amp;lt;=100; i++)
        {
            //  trackBar1.Value=i;
            progressBar2.Value=i;
            Thread.Sleep (20);

        }

    }
    private void t\_3 ()
    {
        for (int i = 100; i&amp;gt;=0; i--)
        {
            //  trackBar1.Value=i;
            progressBar3.Value=i;
            Thread.Sleep (20);

        }
    }
    private void t\_4 ()
    {

        for (int i = 0; i&amp;lt;=10; i++)
        {
            trackBar1.Value=i;

            Thread.Sleep (200);

        }

    }
    private void t\_5 ()
    {

        for (int i = 0; i&amp;lt;=100; i++)
        {
            listBox1.Items.Add (i);

            Thread.Sleep (30);

        }

    }
    private void Timer\_Tick (object sender, EventArgs e)
    {
        label2.Text=DateTime.Now.ToString ();
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_10_berkarat.com-Form-300x239.png&quot; alt=&quot;Berkarat.com Form - C# Thread ve Multithread İşlemleri&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu örnekte konuyla alakalı örnekleri yaptım. Burada uygulama alanları, nasıl kullanıldıkları, paralel işlem yapmaları gibi noktalara vurgu yapıldı.&lt;/p&gt;
&lt;p&gt;Örneğin tanımlı iş parçacıklarına paralel olarak arka planda çalışan bir de timer bulunmakta.&lt;/p&gt;
&lt;p&gt;” Control.CheckForIllegalCrossThreadCalls=false ” komutu örneği basitleştirmek için kullanılmıştır. Gerçek uygulamalarda UI kontrollerine farklı threadlerden doğrudan erişmek yerine Invoke/BeginInvoke veya async/await desenleri tercih edilmelidir.&lt;/p&gt;
&lt;p&gt;Programın Linki : &lt;a href=&quot;https://github.com/berkarat/Threading.git&quot;&gt;https://github.com/berkarat/Threading.git&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>MSMQ (Microsoft Message Queuing)</title><link>https://fuwari.vercel.app/posts/msmq/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/msmq/</guid><description>Msmq Microsoft’un yayınlamış olduğu dağıtık sistemlerin güvenli bir şekilde iletişim kurmalarını sağlayan, sürekli iletişim halinde olma gibi bir zoru</description><pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_08_msmq-logo.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_08_msmq-logo.png&quot; alt=&quot;Msmq Logo - MSMQ (Microsoft Message Queuing)&quot; title=&quot;msmq&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;MSMQ Çalışma Yapısı&lt;/h1&gt;
&lt;p&gt;Msmq Microsoft’un yayınlamış olduğu dağıtık sistemlerin güvenli bir şekilde iletişim kurmalarını sağlayan, sürekli iletişim halinde olma gibi bir zorunluluğu olmayan bir mesajlaşma protokolüdür. Temelde güvenlik amacıyla çıkmıştır ve farklı modüllerin birbirleriyle haberleşmesini sağlayan bir mesaj yapısıdır. Genellikle Windows servislerinde kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Bu fotoğrafta mesajlaşma adımları gösterilmiş. Soldaki uygulama kendi içerisinde işlem yapıp bir mesaj oluşturuyor. Bu mesajı msmq içerisine atıyor. Sağdaki uygulama dinleme yaparak kendisine gelen mesajı okuyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_08_msmq_%C3%A7al%C4%B1%C5%9Fma.jpg&quot; alt=&quot;Msmq Çalışma - MSMQ (Microsoft Message Queuing)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ardından kendi içerisinde ne yapması gerekiyorsa işlemi gerçekleştirip tamamlandı mesajı döndürüyor. Bu sayede iki veya daha fazla sistem birbirleriyle dilden bağımsız olarak çalışabilme olanağı bulur. Ayrıca birbirlerinin işlerinin bitmesini de beklemek zorunda kalmıyorlar.&lt;/p&gt;
&lt;p&gt;Kullanım alanı olarak modüler olarak çalışan, güvenliğin ön planda olduğu, dağıtık sistemle kurgulanmış projelerde kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Örneğin bankacılık sektöründe atmlerin servislerinde, birbirleriyle bağımlı olmak zorunda olmayan yazılımların haberleşmesinde kullanılmaktadır.&lt;/p&gt;
&lt;h2&gt;MSMQ Oluşturma&lt;/h2&gt;
&lt;p&gt;Mesaj yapısını kullanabilmek için reference kısmından System.Messaging referans olarak eklememiz gerekmektedir. Ardından namespace olarak using System.Messaging; eklememiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;Mesaj yapısını elle oluşturabiliriz. Yönet&amp;gt;Hizmetler ve Uygulamalar &amp;gt;Message Queuing&amp;gt;Özel Sırlar &amp;gt;Yeni &amp;gt;Özel Sıra adımlarını takip ederek yeni bir mesaj oluşturmuş oluyoruz. Ardından karşımıza çıkan ekrandan isimlendiriyoruz ve artık bir mesaj yapımız oluşmuş oluyor. Bundan sonra işlemleri gerçekleştirebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_08_Msmq.png&quot; alt=&quot;Msmq - MSMQ (Microsoft Message Queuing)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bizim yapacağımız mesaj yapısını elle değil otomatik bir şekilde yazacağımız kod parçası sayesinde oluşturmak.&lt;/p&gt;
&lt;p&gt;private MessageQueue CreateMsmq(string path , out string error)
{
MessageQueue msj = null;
error = &quot; &quot;;
try
{&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;          if (MessageQueue.Exists(path))
          {
              msj = new MessageQueue(path);
              if (!msj.Transactional)
              {
                  error = &quot;Transaction Olmadı&quot;;
                  msj.Dispose();
              }

          }
          else
          {
              error = &quot;Message queue bulunmadı&quot;;
          }
      }
      catch (Exception e)
      {
          error = &quot;Message Queue Exception: &quot; + e.Message;
          
      }
      return msj;

  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Öncelikle try catch bloğuna alıyoruz böylece oluşabilecek sorunlarda neden kaynaklandığını bulmamız kolaylaşıyor.  İf bloğundaki MessageQueue.Exists(path) kısmı path olan yani bizim yolumuz kısmın daha önceden var olup olmadığını kontrol ederiz. Eğer var ise tekrardan oluşturmaz.&lt;/p&gt;
&lt;p&gt;Örnek bir path : @”.Private$deneme”&lt;/p&gt;
&lt;p&gt;Msmq yapımızı oluşturdan sonra içerisine bilgi alma ve okuma işlemlerine geçiyoruz.&lt;/p&gt;
&lt;h2&gt;MSMQ İçerisine Bilgi Ekleme&lt;/h2&gt;
&lt;p&gt;Gireceğimiz verilerin özelliklerini bir classta oluşturmamız gerekiyor. Ardından bu classı kullanarak msmq içerisine bilgileri aktaracağız.&lt;/p&gt;
&lt;p&gt;public class msmq_cl
{
public string id { get; set; }
public string ad { get; set; }
public string soyad { get; set; }
}&lt;/p&gt;
&lt;p&gt;Burada 3 özellikli bir class oluşturuyoruz.&lt;/p&gt;
&lt;p&gt;private void send(string ad,string soyad,string yas)
{
string path = @&quot;.Private$deneme&quot;;
string err;
MessageQueue mq = CreateMsmq(path, out err);
if (mq != null)
{
msmq_cl nesne = new msmq_cl()
{
ad = ad,
soyad = soyad,
id = yas
};&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;           System.Messaging.Message m = new System.Messaging.Message(nesne);
           m.Priority = MessagePriority.Low;
           m.Label = &quot;Label\_1&quot;;
           MessageQueueTransaction tr = new MessageQueueTransaction();
           mq.Send(m, tr);
       }
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ardından yukarıdaki işlemleri yapıyoruz. Burada mq nesnesi null değilse işleme devam ediyoruz. Eğer null dönerse queue oluşma işlemi başarısız olmuştur. Bunun için Create fonksiyonu veya kütüphaneler kontrol edilmeli. Eğer msmq oluşturulduysa içerikleri nesne olarak ekliyoruz. Yeni bir mesaj oluşturuyoruz ardından eğer gerekli ise öncelik tanımını ve label belirliyoruz. Daha sonra transaction işlemini başlatıp nesnemizi msmq içerisine gönderiyoruz.&lt;/p&gt;
&lt;h2&gt;MSMQ İçerisinden Bilgi Okuma&lt;/h2&gt;
&lt;p&gt;private void receive()
{&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    MessageQueueTransaction tr = new MessageQueueTransaction();
    tr.Begin();
    MessageQueue msq = new MessageQueue(@&quot;.Private$deneme&quot;);

    msq.Formatter = new XmlMessageFormatter(new Type\[\] { typeof(string) });

    try
    {
        System.Messaging.Message msj = msq.Receive();
        msj.Formatter= new XmlMessageFormatter(new Type\[\] { typeof ( string) });
        textBox1.Text = msj.Body.ToString();
        tr.Commit();
        msmq\_cl  s = (msmq\_cl)msj.Body;
        
       //label1.Text = s.ad;

        //System.Messaging.Message message = msq.Receive();
        //message.Formatter = new XmlMessageFormatter(new Type\[\] { typeof(string) });
        //label1.Text = message.ToString();
     
       // tr.Commit();
    }
    catch (Exception)
    {
        label1.Text = &quot;--&quot;;
      
        throw;
    }
    

  //  string dz = msq.ReadHandle.ToString();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buradaki fonksiyonda ise bir transaction işlemi başlatıyoruz. Bunun sebebi eğer okuma işlemi son bulmadıysa tekrar okuma işlemini yapıyor. Böylece eksik bilgi geri dönmesinin önüne geçilmiş oluyor.Gelecek mesajın format tipini belirledikten sonra Receive() metodunu kullanarak veriyi nesnenin içine eklemiş oluyoruz. Bundan sonrasında bu mesajın içeriğine erişebilmiş oluyoruz.&lt;/p&gt;
&lt;h2&gt;MSMQ Purge&lt;/h2&gt;
&lt;p&gt;Purge kelime anlamı olarak temizlemektir. Okunan mesajların tamamını temizlemek için kullanılan bir yapıdır. Bu sayede gereksiz mesajların veya istenmeyen mesajların silinmesi işlemini yapabilmekteyiz.&lt;/p&gt;
&lt;p&gt;static public MessageQueue MSMQPURGE(string queueName, out string error)
{
MessageQueue mq = null;
error = &quot;&quot;;
try
{
if (MessageQueue.Exists(queueName))
{
mq = new MessageQueue(queueName);
mq.Purge();
}
else
{
error = &quot;Message queue does not exist.&quot;;
}
}
catch (Exception e)
{
error = &quot;Message Queue Exception: &quot; + e.Message;
mq = null;
}
return mq;
}&lt;/p&gt;
</content:encoded></item><item><title>Json Nedir ? C# ile Json Verilerde İşlemler</title><link>https://fuwari.vercel.app/posts/csharp-json-islemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/csharp-json-islemleri/</guid><description>Json bir veri formatıdır. Açılımı Javascript Object Notation dur. Çıkarılma amacı XML dosya yapısından daha az yer kaplaması ve aynı zamanda XML yapın</description><pubDate>Sat, 11 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_08_json.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_08_json.png&quot; alt=&quot;RestSharp&quot; title=&quot;json&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Json bir veri formatıdır. Açılımı Javascript Object Notation dur. Çıkarılma amacı XML dosya yapısından daha az yer kaplaması ve aynı zamanda XML yapını Javascript ile çok uyumlu çalşmamasıdır. İlk olarak Javascript uygulamaları için çıkarılsa da günümüzde hemen her yazılım geliştirme uygulamalarında tercih edilmektedir. Bir çok teknoloji artık Json veri formatını tercih etmektedir. Web servislerde de çokça kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Json gövde yapısı Key :Value çiftlerinden oluştur  Key için özellik tanımlanır. Value için ise onun değeri tanımlanır. Tıpkı değişken tanımlama gibidir. Bu key value ikilisi string türünde tanımlanır.&lt;/p&gt;
&lt;p&gt;Temelde iki yapıdan oluşur. Bunlar object ve array yapılarıdır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Object&lt;/strong&gt; yapısı küme parantezi arasına yazılır. Key:Value mantığını barındırır.&lt;/p&gt;
&lt;p&gt;Bir object { ile başlar ve } ile de biter. Anahtar : Değer mantığı ile çalışır.  Ve her objemizi virgül ile ayırırız. Örneğin;&lt;/p&gt;
&lt;p&gt;{
&quot;Ad&quot;: &quot;Berk&quot;,
&quot;Soyad&quot;: &quot;Arat&quot;,
&quot;DogumYılı&quot;: &quot;1993&quot;,
&quot;DogumYeri&quot;: &quot;İstanbul&quot;,
&quot;Cinsiyet&quot;: &quot;Erkek&quot;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Array&lt;/strong&gt; yapısında ise key ve value çifti yoktur. Sadece değerleri aralarına virgül koyarak ayırırız.&lt;/p&gt;
&lt;p&gt;[ &quot;Berk&quot;, &quot;Bora&quot;, &quot;Ali&quot; ]&lt;/p&gt;
&lt;p&gt;Yukarıda örnek bir Array veri yapısı bulunmaktadır.&lt;/p&gt;
&lt;p&gt;Json verisi küme parantezleri içinde oluşturulur. Bu dosyada “Ad” kısmı keyi temsil ederken yanındaki kısım value değerini ifade etmektedir.&lt;/p&gt;
&lt;h2&gt;Json Dosya Okuma&lt;/h2&gt;
&lt;h3&gt;Localde Dosya Okuma&lt;/h3&gt;
&lt;p&gt;public class Veriler
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string DogumYili { get; set; }
public string DogumYeri { get; set; }
public string Cinsiyet { get; set; }
}&lt;/p&gt;
&lt;p&gt;İlk önce yapmamız gereken Json dosyamızın keyleriyle ve tipleriyle uyumlu bir class oluşturmak. String olan bir veri için int gibi bir değer tanımlamak hataya yol açacaktır. İsimlerin de aynı olması gerekmektedir.&lt;/p&gt;
&lt;p&gt;string path = &quot;json_dosya_yolu&quot;;
StreamReader stream_read = new StreamReader(path);
string js_data = stream_read.ReadToEnd();// dosyayı okuruz.
List&amp;lt;Veriler&amp;gt; veriler = JsonConvert.DeserializeObject&amp;lt;List&amp;lt;Veriler&amp;gt;&amp;gt;(js_data); // json datasını convert edip, Veriler clasından türettiğimiz nesneye aktarıyoruz.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oluşturduğumuz dosyanın veri yolunu tanımlarız.&lt;/li&gt;
&lt;li&gt;Ardından StreamReader nesnesi ile dosyayı okuma işlemini gerçekletiririz.&lt;/li&gt;
&lt;li&gt;JsonConvert ile bilgileri Veriler classımıza aktarırız.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not: NuGet Package Manager üzerinden Newtonsoft’u kurmamız gerekmekte ardından using ile “using Newtonsoft.Json; ” paketi eklemeliyiz. JsonConverter classına bu paket aracılığı ile ulaşıyoruz.&lt;/p&gt;
&lt;p&gt;Yukarıda yaptığımız işlem localde dosya okuma işlemiydi.&lt;/p&gt;
&lt;h3&gt;Server Üzerinden Dosya Okuma&lt;/h3&gt;
&lt;p&gt;string adres = &quot;json_talep_edeceğimiz_url&quot;;
WebRequest istek = HttpWebRequest.Create(adres); // istek yolladık
WebResponse cevap=istek.GetResponse(); // cevabı aldık
StreamReader donenBilgiler = new StreamReader(cevap.GetResponseStream()); // cevabı okuduk
string bilgilerial = donenBilgiler.ReadToEnd(); // okuduğumuz cevabı stringe atadık
List&amp;lt;Veriler&amp;gt; veriler= JsonConvert.DeserializeObject&amp;lt;List&amp;lt;Veriler&amp;gt;&amp;gt;(bilgilerial); // json dosyasını convert ettik&lt;/p&gt;
&lt;p&gt;Tıpkı localdeki gibi okuyacağımız dosyanın içeriğine bağlı olarak class oluşturmamız gerekmektedir. Adresimize WebRequest classından oluşturduğumuz nesne ile  istek yolluyoruz. Ardından WebResponse ile gelen bilgiyi alıyoruz ve StreamReader ile bilgiyi okuyoruz. Aldığımız bilgiyi stringe atıyoruz. Daha sonra bu stringi oluşturduğumuz class tipine aktarıyoruz ve bilgilere ulaşmış oluyoruz.&lt;/p&gt;
&lt;h1&gt;RestSharp İşlemleri&lt;/h1&gt;
&lt;p&gt;Restsharp bir Nuget paketidir. Client üzerinden serverdaki bilgiyi almamızda büyük kolaylık sağlayan bir pakettir. Nuget üzerinden “Restharp” yazarak indirilip kütüphaneye eklendikten sonra içeriğine ulaşabiliyoruz. Aşağıdaki örnekte bir kullanımı mevcuttur.&lt;/p&gt;
&lt;p&gt;private string get (string token, string url, Method mt )
{&lt;br /&gt;
var client = new RestClient(url);
RestRequest requ = new RestRequest(mt);
requ.AddHeader(&quot;Authorization&quot;, token);
requ.AddParameter(&quot;param_1&quot;, &quot;Param_1&quot;);
IRestResponse response = client.Execute(requ);
//RestResponse&amp;lt;Person&amp;gt; response2 = client.Execute&amp;lt;Person&amp;gt;(request);&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       return response.Content;
   }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bu fonksiyon örneğinde urlsi verilmiş adresten bir json dosyası çekmeye yaramaktadır. RestClient classından bir veri türetiyoruz. Ardından Method kısmını Post veya Get tipini belirleyerek servera ya da apiye bir istek gönderiyoruz. Bu isteğe ek olarak Header, Parameter gibi özellikler de ekleyebiliriz. Arından IRestResponse ile dosyayı alıyoruz. Artık elimizde bir Json dosyası var bunun content ile içeriğine ulaşabilir gerekli işlemleri yapabiliriz.  Veya RestResponse kullanarak verimizi belirlediğimiz bir classa atayarak işlemlerimizi gerçekleştirebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://restsharp.org/&quot;&gt;RestSharp Kullanım Örnekleri&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jsonutils.com/&quot;&gt;İşlemler için gereken classları buradan kontrol edip, otomatik oluşturabilirsiniz.&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi – 2</title><link>https://fuwari.vercel.app/posts/robotik-kol-projesi-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/robotik-kol-projesi-2/</guid><description>Projemizin birinci adımında sorunun ne olduğu nasıl bir hedefimiz olduğunu saptadık. Bu soruna çözüm olarak robotik kolların kullanılması böylece zama</description><pubDate>Sun, 27 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Projemizin birinci adımında sorunun ne olduğu nasıl bir hedefimiz olduğunu saptadık. Bu soruna çözüm olarak robotik kolların kullanılması böylece zaman ve iş gücünden tasarruf edileceğini ve daha hızlı bir üretimin gerçekleştiğinden bahsetmiştik. Bu yazımızda devam niteliğinde olup malzemelerin neler olduğu  nasıl kullanıldığı gibi konulara değineceğim.&lt;/p&gt;
&lt;h1&gt;Konveyör Bant Sistemi&lt;/h1&gt;
&lt;p&gt;Bu projede ürünleri bir noktadan diğer noktaya taşıması ardından robotik kolun alabileceği bir konuma getirmesi için kullanılmıştır.&lt;/p&gt;
&lt;p&gt;Konveyör bantlar çeşitli malzemelerin bir yerden başka bir yere taşımada kullanılan kauçuk kaplamalı veya bezli olarak üretilen taşıma ünitesidir. Kullanılacak ortamlara göre farklı malzemelerden üretilmeleri mümkündür. Kullanım alanları seri üretimin olduğu hemen her yere uygun şekilde tasarlanabilmektedir. Genel olarak başta demir-çelik fabrikaları olmak üzere, maden ocakları gibi üretimin önemli olduğu yerlerde kullanılmaktadır.&lt;/p&gt;
&lt;p&gt;Yapı olarak 2 ana bölümden oluşmaktadır. Birincisi “Karkas” denilen kısım ve “Kauçuk” denilen kısımlardır. Karkas kısmı yükü çeken kısımdır. Kauçuk kısım ise bandın genel görünen kısmıdır ve ürünle doğrudan temas halindedir.&lt;/p&gt;
&lt;h3&gt;Bu bantlar tiplerine göre 3 ana tiptedir&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Karkas tipine göre&lt;/li&gt;
&lt;li&gt;Kaplamasına göre&lt;/li&gt;
&lt;li&gt;Tırmanma açısına göre&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_konvey%C3%B6r-bant.jpg&quot; alt=&quot;Konveyör Bant - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Malzeme Listesi ve Tanıtımı&lt;/h1&gt;
&lt;p&gt;&amp;lt;table style=&quot;width: 580px;&quot; align=&quot;center&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;No&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Malzeme&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Adet&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;Arduino Uno R3&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;Robotik Kol&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;Konveyör Bant&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;Servo Motor (180° açılı)&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;4&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;5&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;IR Kızılötesi Sensör&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;6&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;L298-N Motor Sürücü Kart&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;7&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;TCS3200 Renk Sensörü&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;8&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;6V 250 Rpm Redüktörlü Motor&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;9&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px; text-align: left;&quot;&amp;gt;TP 4056 Şarj Devresi&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;10&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px;&quot;&amp;gt;Pil yuvası (18650 uyumlu)&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;11&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px;&quot;&amp;gt;18650 Lityum İyon Pil ( 3.7V)&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 30px; text-align: center;&quot;&amp;gt;12&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 413px;&quot;&amp;gt;Rulman&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 46px; text-align: center;&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;Arduino Uno R3&lt;/h2&gt;
&lt;p&gt;Arduino, sensörler yardımıyla çevresiyle etkileşime geçebilen, bu durumları kontrol edebileceğimiz açık kaynaklı bir geliştirme platformudur. Açık kaynak kütüphanesi olduğundan kolaylıkla programlanabilmektedir. Daha önceki yazılarımızda bu platform hakkında detaylı olarak bilgi vermiştik. &lt;a href=&quot;https://blog.berkarat.com/arduino-ve-cesitleri/&quot;&gt;Arduino Nedir?&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;TCS3200 Renk Sensörü Kartı&lt;/h2&gt;
&lt;p&gt;TCS3200 renk algılama sensörüdür. Projemizde gelen ürünlerin rengini algılamakta kullanılmıştır. Bu sensör kartı hakkında detaylı bir yazı yazmıştım. Bu yüzden &lt;a href=&quot;https://blog.berkarat.com/tcs3200-kullanimi/&quot;&gt;TCS3200 Kullanımı&lt;/a&gt;  yazısını okumanızı öneririm.&lt;/p&gt;
&lt;h2&gt;Robotik Kol&lt;/h2&gt;
&lt;p&gt;Projemizde 4 yönde ( yukarı-aşağı, öne-arkaya, sağa-sola, açma-kapatma) hareket edebilen sert plastik materyalden yapılmış, omuz, kol, dirsek ve el olmak üzere 4 ana parçadan meydana getirilen bir robot kolu kullandık. Arduino üzerinden gelen bilgiler doğrultusunda ürünlerin nereye konulacağını belirler ve ona uygun şekilde ürünü istenilen yere koyar. Yukarıda bahsedilen eklemli robot sınıfına girmektedir. Hareket gücünü üzerinde bulunan 4 adet servo motordan almaktadır. Bu sayede açı değerleri ile ayarlama yapılabilmektedir. Dikey ve yatay yönde çalışabilmektedir.&lt;/p&gt;
&lt;h2&gt;IR Kızılötesi Sensör&lt;/h2&gt;
&lt;p&gt;IR kızılötesi engel algılama sensörlerinin çalışma mantığı verici sinyali gönderir ve gönderilen sinyal yansıdığı zaman alıcı bu sinyali alır ve devreyi tamamlamış olur. Bu projedek konveyör bantı durdurmak, renk sensörü ve robotik kolu tetikleme görevi vardır. Projemizde 2 tane IR sensör bulunduğundan gelen ürünün boyutunun da belirlenmesi işlemi sağlanmaktadır. Sensör üzerinde bulunan ayarlama bölmesi üzerinden de mesafe ayarı yaparak konumlandırma yapılabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_IR-Sensor.jpg&quot; alt=&quot;Ir Sensor - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Servo Motor (180 ° açılı)&lt;/h2&gt;
&lt;p&gt;Servo motorlar, robot teknolojilerinde en çok kullanılan motor çeşididir. En çok kullanım alanı RC ( Radio Control) uygulamalarıdır. İstenilen pozisyonu alması ve yeni bir komut girilene kadar o pozisyonu değiştirilmemesi gibi özellikleri vardır. Çalışma mekanizması iki parçadan oluşur. İçerisinde bir tane DC motor ve dişli takımı bulundurmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_Servo-Motor-min.jpg&quot; alt=&quot;Servo Motor Min - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Dc motor dişlilerin hareket etmesini sağlar. Bu dişliler de hareket doğrultusunda yüksek tork üreterek servonun ucuna bağlanan nesneyi döndürebilmektedir. Açı verilerek kontrol edilmektedir. Bu projede robot kolunun hareket etmesini sağlamaktadır, dönüş açısı genellikle 180 derecedir fakat bazı özel servo motorlar 360 derece dönüş açısına da sahiptirler. 6V çalışma gerilimine sahiptir.&lt;/p&gt;
&lt;p&gt;Arduino üzerinde PWM (Pulse Width Modulation) pinlerin üzerinden kontrol edilmektedir. PWM pinlerinden gelen sinyallere göre koordinatları belirlenir ve en az hatayla hareket ederler&lt;/p&gt;
&lt;h2&gt;L298N Motor Sürücü Kartı&lt;/h2&gt;
&lt;p&gt;L298-N motor sürücü devresi 24V’a kadar motorları sürmek için tasarlanan sürücü kartı iki kanallıdır. İki adet motor sürebilme imkanı sunmakta ve kanal başına 2 ampere kadar akım verme kabiliyetine sahiptir. Biz bu projemizde bu kartı konveyör bantın hareketini sağlayan redüktörlü motoru sürmesi için kullandık. Üzerinde bulunan enable pinleri sayesinde motor hız kontrolüne de imkan sağlamaktadır. Bu sebeple konveyör bantımızın hız ayarını da kontrol etmek mümkün hale gelmektedir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.berkarat.com/l298-n-motor-surucu-kullanimi/&quot;&gt;L298-N Motor Sürücü Kullanımı&lt;/a&gt;  yazımızda daha detaylı anlatımı mevcuttur.&lt;/p&gt;
&lt;h2&gt;6V 250 Rpm Redüktörlü Motor&lt;/h2&gt;
&lt;p&gt;Motorlar elektrik enerjisini mekanik enerjiye çeviren elemanlarıdır.Bu projede konveyör bantın hareketini sağlamaktadır. Redüktörlü olmasının avantajı ise daha az amper çekerek daha çok tork üretebilmesidir. Bunu da içinde bulundurduğu dişliler sayesinde yapmaktadır. Bu sebeple tercih edilmiştir. Çalışma gerilimi 6V’dur. Projenin durumuna göre daha güçlü motorlar da kullanılabilmek mümkündür.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_red%C3%BCkt%C3%B6rl%C3%BC-motor-min-1-300x300.jpg&quot; alt=&quot;Redüktörlü Motor Min 1 - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;18650  3.7 V Lityum İyon Pil&lt;/h2&gt;
&lt;p&gt;18650 pil  bu projede tekrar şarj edilebilme ve normal pillere göre daha yüksek akım verebilmesi sebebiyle tercih edilmiştir. 3.7V 25Ampere kadar bir enerji sağlayabilmektedir. Maksimum 4.2 V enerji verebilmektedir. Kullanım alanları olarak en başta laptopların pilleri birden fazla 18650 pilin bir araya getirilmesiyle tasarlanabilmektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_18650-min-300x300.jpg&quot; alt=&quot;18650 Min - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;18650 sayısı da pilin geometrik şeklini ifade etmektedir. 18mm çapında, 65mm uzunluğunda ve 0 ise pilin silindir olduğunu belirtmekte kullanılır.&lt;/p&gt;
&lt;h2&gt;TP4056&lt;/h2&gt;
&lt;p&gt;Lityum iyon pillerin tekrar kullanılabilmesi için bir şarj ünitesine ihtiyacı vardır. TP4056 entegresi sayesinde pillerimizi tekrar tekrar kullanabilme imkanımız vardır. 5V’luk bir kaynakla besleyerek bu şarj devresi sayesinde pillerimizi tekrar şarj edebilmekteyiz.&lt;/p&gt;
&lt;h2&gt;Rulman&lt;/h2&gt;
&lt;p&gt;Rulmanların asıl işlevi verilmesi gereken hareketin mümkün olan en az sürtünmeyle yani güçten en az ödün verilerek iletimini sağlamaktır. İç ve dış kabuk arasına yerleştirilmiş bilyeler sayesinde sürtünme en aza indirgenmiştir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_rulman-min-300x211.jpg&quot; alt=&quot;Rulman Min - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Bu projede ise karkasların içlerine geçirilmiş redüktörlü motorla bağlantısı yapılmıştır. Bu sayede en az şekilde motoru ve motor sürücü kartını zorlayacak şekilde tasarlanmıştır. Bu sayede konveyör bantın dönüşünde bir aksama meydana gelmeden kusursuz bir şekilde hareket sağlanmış olacaktır.&lt;/p&gt;
</content:encoded></item><item><title>Robot Kol ile Ayrım Yapan Bant Sistemi Projesi – 3</title><link>https://fuwari.vercel.app/posts/robot-kol-projesi-3/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/robot-kol-projesi-3/</guid><description>Daha önceki yazıların devamı ve sonuç bölümü olarak devam edeceğimiz bu yazıda projemizi tamamlayacağız. Bu yazıda robot kolun, bant sisteminin ve sen</description><pubDate>Sat, 26 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Daha önceki yazıların devamı ve sonuç bölümü olarak devam edeceğimiz bu yazıda projemizi tamamlayacağız. Bu yazıda robot kolun, bant sisteminin ve sensörlerin ayarlarının nasıl yapılacağı, kodlamalarda nelere dikkat edilmesi gerektiğini ve sistemin, sensörlerin algoritmalarını anlatacağım. Önce yazımıza nasıl bir yöntem izlediğimiz hakkında başlayacağım.&lt;/p&gt;
&lt;h1&gt;Yöntem&lt;/h1&gt;
&lt;p&gt;Projemizde temelde 3 bölüm vardır. Konveyör bant üzerinde bir noktadan diğer noktaya elektrik enerjisini mekanik enerjiye çeviren redüktörlü motor sayesinde taşınması ilk adım olarak nitelendirilebilir. Redüktörlü motor rulmanlarla oluşturulmuş karkasa bağlıdır ve mekanik olarak güç üreterek bantın hareketini bir diğer anlamıyla bant üzerindeki ürünün hareket etmesini sağlamaktadır. İkinci adım bu projedeki en kritik adımdır. Bu adımda IR kızılötesi sensörler tarafından konveyör bant kontrolü, renk sensörü ve robot kolunun tetiklenmesi sağlanır. Projemizde biri alta, diğeri üste yerleştirilmiş olmak üzere 2 adet IR sensör kullanılmıştır. Altta bulunan sensörden okunan veriye göre önünde engel olup olmamasına göre bantın hareketini kontrol etmektedir. Bu durum gerçekleştiği sırada motor durur ve renk sensörü ardından robot kol devreye girer. İki IR sensörünün birlikte çalışmasıyla ürünün büyük ve küçük ayrımı da yapılmaktadır.&lt;/p&gt;
&lt;p&gt;Bant durup ürün gerekli yere geldiği zaman ürünün altına denk gelecek şekilde yerleştirilmiş TCS3200 renk algılama sensörü de tetiklenmiş olur.&lt;/p&gt;
&lt;p&gt;Bu sensör projemizde ürün renginin hangi renk olduğunu veya istediğimiz renkle uyup uymadığını karşılaştırmak için kullanmaktayız. Sensörün bağlantılarını yaptıktan sonra sensör renkleri serial monitöre gönderir. Elimizde 2 adet renk bulunmaktadır. Renklerin sayısı arttırılabilir. Red ve blue. Bu renklerin kendi aralarında kıyaslayarak kalibrasyon işlemine tabii tutuyoruz. Ancak bunu yaparken hassas ve sürekli değişken değerler karşımıza çıkmakta ve bu durum hataya yol açmaktadır.Bu istenilmeyen durumu  engellemek için sensörün algılama kısmına dışarıdan ışık almasını engellemek için koruyucu kılıf koyulması daha doğru sonuçlara ulaşmamızı sağlar. OUT bacağından aldığımız sinyaller sayesinde renk algılamasını yapmış oluruz. Renk algılama işlemi de bittikten sonra robotik kol devreye girmektedir.&lt;/p&gt;
&lt;p&gt;Ürünün boyutu ve rengi artık belleğe alındığından dolayı daha önceden koordinatları belli olan noktaya robotik kolumuz gelir ve ürünü alarak bırakması gereken yere bırakır ve başlangıç konumuna geri döner. Bu sayede gelen farklı ürünleri istenilen bölgelere istif etmiş bulunmaktayız. Aynı zamanda renklerin daha kolay anlaşılması için algılanan rengi RGB Led modülü sayesinde görsel bir şekilde de gösterilmektedir.&lt;/p&gt;
&lt;h1&gt;Sistemin Çalışma Algoritması&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_sistem-1024x954.png&quot; alt=&quot;Sistem - Robot Kol ile Ayrım Yapan Bant Sistemi Projesi – 3&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;IR Sensörlerinin Çalışma Algoritması&lt;/h1&gt;
&lt;h1&gt;&lt;img src=&quot;/wp-images/2018_05_IR.jpg&quot; alt=&quot;Robot Kol ile Ayrım Yapan Bant Sistemi Projesi – 3 ekran görüntüsü 2&quot; /&gt;&lt;/h1&gt;
&lt;h1&gt;Sistemin Devre Şeması&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_devre-min-1024x731.jpg&quot; alt=&quot;Devre Min - Robot Kol ile Ayrım Yapan Bant Sistemi Projesi – 3&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Robot Kolun Programlanması&lt;/h1&gt;
&lt;p&gt;#include&amp;lt;Servo.h&amp;gt;
Servo servo_on;
Servo servo_arka;
Servo servo_el;
Servo servo_alt;&lt;/p&gt;
&lt;p&gt;void setup() {
servo_arka.attach(5);
servo_on.attach(10);
servo_el.attach(9);
servo_alt.attach(6);
}&lt;/p&gt;
&lt;p&gt;void loop(){
saga_birak();
}&lt;/p&gt;
&lt;p&gt;void al() {
servo_arka.write(25);//60-25
ac();
ileri();
kapat();
geri();
}
void saga_birak(){
servo_arka.write(45);
ac();
ileri();
kapat();
geri();
saga();
en_ileri();
ac();
en_geri();
sagdan_baslangica();
}
void geri() {
for (int i = 140; i &amp;gt; 65; i--)
{ // geri
servo_on.write(i); delay(7);
}
}
void ileri() {
for (int i = 65; i &amp;lt; 140; i++)
{ //ileri
servo_on.write(i); delay(7);
}
}
void saga() {
for (int i = 87; i &amp;gt; 30; i--)
{ //saga
servo_alt.write(i); delay(7);
}
}
void sagdan_baslangica() {
for (int i = 30; i &amp;lt; 87; i++)
{ //sagdan baslangica
servo_alt.write(i); delay(7);
}
}
void kapat() {
for (int i = 85; i &amp;lt; 115; i++)
{ // kapa
servo_el.write(i); delay(7);
}
}
void ac() {
for (int i = 115; i &amp;gt; 85; i--)
{ // ac
servo_el.write(i); delay(7);
}
}&lt;/p&gt;
&lt;p&gt;Yukarıdaki kodda robot kolun sadece bir işlemi yapması için gereken komutlar mevcuttur. Diğer durumlarda yapması gerekenlerin de benzer şekilde programlanması gerekmektedir. Yazının sonunda GitHub linkinden ulaşılabilir detaylarına.&lt;/p&gt;
&lt;h1&gt;Konveyör Bandın Programlanması&lt;/h1&gt;
&lt;p&gt;#define Motor_enable  11 // motor sürücü hız kontrolü
#define Motor_ileri 12// motor sürücü ileri
void setup() {
pinMode(Motor_enable, OUTPUT);
pinMode(Motor_ileri, OUTPUT);    // MOTOR  çıkış pinleri
}
void loop() {
basla_motor();
dur_motor(); }&lt;/p&gt;
&lt;p&gt;/* MOTOR SÜRÜCÜ KODLARI*/
void basla_motor() {
digitalWrite(Motor_ileri, HIGH);
analogWrite(Motor_enable, 100);
}&lt;/p&gt;
&lt;p&gt;void dur_motor() {
digitalWrite(Motor_ileri, LOW);
analogWrite(Motor_enable, 0);
}&lt;/p&gt;
&lt;h1&gt;IR Sensörlerin Programlanması&lt;/h1&gt;
&lt;p&gt;char deger;
int val_1; // IR Sensör-1
int val_2;// IR Sensör-2
int d_alt = 8;
int d_ust = 7;
void setup() {
pinMode(d_alt, INPUT);
pinMode(d_ust, INPUT);}
void loop() {
int val_2 = digitalRead(d_ust);
int val_1 = digitalRead(d_alt);
Serial.println(val_1);
Serial.println(val_2);}&lt;/p&gt;
&lt;h1&gt;TCS3200 Programlanması&lt;/h1&gt;
&lt;p&gt;int S2 = 3; // TCS3200 bağlantı
int S3 = 4;// TCS3200 bağlantı
int outpin = 2;// TCS3200 bağlantı
char col;
int r ; // kirmizi renk
int g ;// yesil renk
int b ;// mavi renk
int w ;// beyaz renk
unsigned int plusewidth;
void setup() {
pinMode(S3, OUTPUT);            // TCS3200  sensör çikis pinleri
pinMode(S2, OUTPUT);
pinMode(outpin, INPUT);}
void loop() {
col = renk_oku();}
/* RENK ALGILAMA KODLARI */
char renk_oku() {
char color;
// kirimizi renk için okuma islemi
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
r = pulseIn(outpin, LOW);
//  r = plusewidth / 400. - 1;
//  r = (255 - r);
/*----------------------*/&lt;/p&gt;
&lt;p&gt;//yesil renk için okuma islemi
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
g = pulseIn(outpin, LOW);
// g = plusewidth / 400. - 1;
//    g = (255 - g);&lt;/p&gt;
&lt;p&gt;/*----------------------*/&lt;/p&gt;
&lt;p&gt;//mavi renk için okuma islemi
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
b = pulseIn(outpin, LOW);
//   b = plusewidth / 400. - 1;
//  b = (255 - b);&lt;/p&gt;
&lt;p&gt;/*----------------------*/&lt;/p&gt;
&lt;p&gt;//beyaz renk için okuma islemi
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
w = pulseIn(outpin, LOW);
//
//    w = (255 - w);}&lt;/p&gt;
&lt;h1&gt;Sonuçlar&lt;/h1&gt;
&lt;p&gt;Ülkemizde henüz robotik sistemler tam anlamıyla uygulama alanına geçmemiştir. Gelişmiş ülkelerde bu durum daha farklı ve uyum sağlanmıştır. Bu sayede fazla insan gücü kullanmak yerine robotik sistemlere geçilerek maaliyet ve zamandan tasarruf edilmiş, ekstra bir istihdam alanı yaratılmıştır. Dünya’da gelişen Endüstri 4.0 teknolojisiyle birlikte robotik sistemlerin üretimdeki rolü daha da artmıştır ve neredeyse zorunlu hale gelmiştir. Bu çalışmada prototip olarak bant sistemi – algılama bölümü( sensörlerin bulunduğu bölüm) ve robotik kol birbirleriyle  Arduino mikroişlemcisi sayesinde ortak iletişim kurarak birbirleriyle uyumlu bir şekilde çalışmaktadır. Maliyet açısından da en ucuz şekilde prototip olarak üretilmiştir. Çalışmadaki düzenekler geliştirilerek daha hızlı ve hassas duruma getirilebilir.  Bu sayede farklı alanlarda, farklı ortamlarda kullanılabilir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Örnek-1 bant sistemini açılı bir şekilde kullanılması ile zeminden yükseğe doğru bir sistemde alttan üretilen ürün yukarıda işleme tabii tutulabilir.&lt;/li&gt;
&lt;li&gt;Örnek-2 Robotik kolun plastik yerine metalden yapılması ile daha güçlü duruma gelmesi, kullanılan servo motorların güçlü servolarla değiştirilmesi ile sistem daha büyük yükler üzerinde işlemi rahatlıkla sağlayabilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hiçbir düzeneği olmayan ortamlarda uygulanması açısından eksikleri vardır. Ancak düzenlemenin yapılacağı ortamlarda verimli çalışıp düzenleme maaliyetini amorti edecektir.&lt;/p&gt;
&lt;h4&gt;Ekler&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://yadi.sk/i/F3sGqmzr3WZkty&quot;&gt;Projenin tez yazısı&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://yadi.sk/i/7lBhDBCk3WZm6z&quot;&gt;Projenin Poster Sunumu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Robotik-kol-kontrollu-bant-sistemi&quot;&gt;Projenin Kaynak Kodları&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi – 1</title><link>https://fuwari.vercel.app/posts/robotik-kol-projesi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/robotik-kol-projesi/</guid><description>Merhabalar bu yazı dizimizde Endüstri 4.0 ile beraber gelişen robotik teknoloji üzerine bir projenin detaylarından çalışma yapısından, robotik kol çeş</description><pubDate>Sat, 26 May 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Merhabalar bu yazı dizimizde Endüstri 4.0 ile beraber gelişen robotik teknoloji üzerine bir projenin detaylarından çalışma yapısından, robotik kol çeşitlerinden bahsedeceğim.&lt;/p&gt;
&lt;h2&gt;Proje Özeti&lt;/h2&gt;
&lt;p&gt;Günümüz son teknolojik gelişmeleri de takip edildiğinde ortaya çıkan en temel problemlerden birisi sanayide insan gücünü en aza indirgeyerek robotik güce geçilmesidir. Bu sorun geçmişten günümüze buharlı makinelerin bulunmasından, bantlı seri üretim sistemine geçilmesiyle günümüze kadar dayanmaktadır. 21. Yüzyıldaki teknolojik gelişmelerle birlikte Endüstri 4.0 teknolojisine geçiş adımlarına başlanmış, Türkiye’deki büyük firmalar bu teknolojiye yavaş yavaş geçiş yapmaya başlamışlardır. Endüstri 4.0 ile birlikte üretimin, akıllı fabrikalara doğru yönelmesiyle ortaya çıkan birbirleriyle iletişimli robotlara ihtiyaç doğmuştur. Fabrikalardaki insan gücünü, maliyeti minimuma indirip, üretim kalitesini ve hızı maksimuma çıkartmak hedeflenmektedir.&lt;/p&gt;
&lt;h2&gt;Projedeki Amaçlar ve Hedefler&lt;/h2&gt;
&lt;p&gt;Projemiz günümüzde duyulan “akıllı fabrika ihtiyaçlarından esinlenmiştir. Burada temel amaç sistemimizin en az hatayla ve en hızlı şekilde üretimin serileştirilmesi, insan gücünün en aza indirgenmesini bu sayede yapılacak hatalar, iş kazaları gibi istenmeyen durumların önüne geçmek amaçlanmış ve hedef olarak da üretimde her bir verinin toplanarak, işlenmesi, analiz edilmesi ve verimi arttırmayı, kendini kısa sürede amorti edip en yüksek katkıyı hedeflemiştir. Sınıflandırma işlemleri daha verimli bir şekilde yapılabilecek.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;İnsanların hızından daha hızlı ve doğru bir şekilde işlemeye sahip olacak.&lt;/li&gt;
&lt;li&gt;Birden fazla insanın tarafından yapabilecek iş tek bir robot sayesinde yapılacağı için ekonomik anlamda bir tasarruf sağlanacaktır.&lt;/li&gt;
&lt;li&gt;Standart bant sistemlerine ek olarak robotik kol sayesinde de sadece taşıma değil ayırma işlemi de yapabilecek.&lt;/li&gt;
&lt;li&gt;Akıllı fabrikaların kurulumunda ve hayata geçirilmesinde temel rol almayı hedeflemiştir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt; Robotik Sistemlerin Avantaj ve Dezavantajları&lt;/h2&gt;
&lt;p&gt;Her sistemde olduğu gibi robotik sistemlerin de avantajları ve dezavantajları vardır. Günümüz şartlarında ortaya konulacak ürünlerin hızlı, kaliteli ve güvenilir bir şekilde ortaya konulması önemlidir. Bu sistemin kullanılacağı ortam, getiri ve götürüleri, ihtiyaç olup olmadığı gibi etmenler dikkate alınmalıdır.&lt;/p&gt;
&lt;h3&gt;Avantajları&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hız artışı&lt;/li&gt;
&lt;li&gt;Maaliyetin düşmesi&lt;/li&gt;
&lt;li&gt;Oluşabilecek iş kazalarının azalması&lt;/li&gt;
&lt;li&gt;Zamandan tasarruf&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Dezavantajları&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;İlk montaj ve tasarım maaliyetinin yüksek olması&lt;/li&gt;
&lt;li&gt;Ortama göre plan yapılacağından güncelleme gereklilikleri&lt;/li&gt;
&lt;li&gt;Geliştirmek için yatırım maaliyetleri&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Robotik Kol&lt;/h1&gt;
&lt;p&gt;Robotik kollar günümüzde sanayi içerisinden, sağlık sektörüne göre her alanda kullanım kolaylığı sağlamaktadır. Bu sebeple bir çok sektörde tercih edilmektedir. Daha çok fabrikaların otomatikleşen bölümlerin eli ayağı konumunda yer almaktadır. Kullanım alanlarına göre de çeşitlendirilmişlerdir.&lt;/p&gt;
&lt;h2&gt;Robotik Kol Çeşitleri&lt;/h2&gt;
&lt;h3&gt;SCARA Robot Kolu&lt;/h3&gt;
&lt;p&gt;Scara tip robotik kol sanayide montaj uygulama alanlarında yaygın olarak kullanılmaktadır. Özellikle yüksek hızlı ve yoğun kapasiteli işlerde tercih edilmektedir. Eklem yerlerinde elektrik motorları bulunmaktadır. Bu kolun hareket etmesini kendi ve dönmesini sağlar. Ağız kısmında ise kavramayı esnek bir şekilde yapması için pnömatik motor bulunmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_scara-300x189.png&quot; alt=&quot;Scara - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Kartezyen Robot Kolu&lt;/h3&gt;
&lt;p&gt;Kartezyen robot kolu adından da anlaşılabileceği gibi X, Y, Z eksenlerinde hareket etmektedir. Taşıma ve tutma işlemlerini gerçekleştirmektedir. Avantajı olarak dar alanlarda basit bir şekilde ağır yükleri ve büyük cisimleri taşımaktadır. Ancak sınırlı bir alanda çalıştığından bu bir dezavantajdır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_kartezyen-300x197.gif&quot; alt=&quot;Kartezyen - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Silindirik Robot Kolu&lt;/h3&gt;
&lt;p&gt;Silindirik robot kolu  geniş dönüş kabiliyetleri  sayesinde hareket etme yeteneği daha yüksektir. Diğer kollar gibi tutma ve taşıma görevini gerçekleştirmektedir. Pnömatik, hidrolik ve elektrik motor çeşitleri mevcuttur.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_silindirik-300x172.png&quot; alt=&quot;Silindirik - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 1&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Küresel Robot Kolu&lt;/h3&gt;
&lt;p&gt;Polar robot kolları olarak da isimlendirilmektedir. Küresel bir alanda çalıştığından programlanması diğer robot kollara göre daha zordur.  Hareket alanları kollarının uzunluğuna göre değişkenlik gösterir. Kollar ne kadar geniş üretilirse o kadar hareket alanı artmaktadır. Pres, kaynak, eğme gibi metal sanayisinde etkin olarak kullanılırlar.&lt;/p&gt;
&lt;h3&gt;Eklemli Robot Kolu&lt;/h3&gt;
&lt;p&gt;En az 3 eksende döner eklem hareketine sahip robot koldur. Taşıma, yerleştirme gibi alanlarda etkin kullanılır.  Bu projede de eklemli  robot kolu kullanılmıştır. Sabit bir alanda ve tutup taşıma işlemini gerçekleştireceği için tercih edilmiştir. Her eklem ayrı bir elektrik motoru ile kontrol edilir. Hareket alanı yazılan programa ve kullanılan elektrik motorlarına göre değişiklik gösterir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_eklemli.jpg&quot; alt=&quot;Eklemli - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Robotik Kol Kullanım Alanları&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Basit ve tekrar gerektiren işler&lt;/li&gt;
&lt;li&gt;Ağır ve tehlike unsuru barındıran işler&lt;/li&gt;
&lt;li&gt;Tehlikeli ortamlar (kimyasal gazların bulunduğu ortamlar)&lt;/li&gt;
&lt;li&gt;Kaynak&lt;/li&gt;
&lt;li&gt;Boyama&lt;/li&gt;
&lt;li&gt;Montaj&lt;/li&gt;
&lt;li&gt;Malzeme taşıma&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_05_robot-kol-%C3%A7al%C4%B1%C5%9Fma-min.jpg&quot; alt=&quot;Robot Kol Çalışma Min - Robotik Kol ile Ayrım Yapan Bant Sistemi Projesi - 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Robot kolun çalışma yapısı&lt;/p&gt;
</content:encoded></item><item><title>KMP (Knuth Morris Pratt) Arama Algoritması</title><link>https://fuwari.vercel.app/posts/kmp-arama-algoritmasi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/kmp-arama-algoritmasi/</guid><description>Merhabalar bu yazımızda bir arama algoritması olan KMP( Knuth Morris Pratt ) Algoritmasından bahsedeceğim. Arama algoritmaları çeşitli özelliklere sah</description><pubDate>Sun, 11 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_03_pattern_match-min.jpeg&quot;&gt;&lt;img src=&quot;/wp-images/2018_03_pattern_match-min.jpeg&quot; alt=&quot;kmp algorithm&quot; title=&quot;kmp algoritması&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda bir arama algoritması olan KMP( Knuth Morris Pratt ) Algoritmasından bahsedeceğim. Arama algoritmaları çeşitli özelliklere sahiptirler. Kimisi çok hızlı olması, kimisi hızdan ziyade doğruluk bakımından birbirlerinden farklılık göstermektedir. KMP algoritması ise dengede bir algoritmadır. Diğer arama algoritmalarının temelini oluşturur ve KMP tablosu olarak göreceğimiz tabloyu kullanmaktadır.&lt;/p&gt;
&lt;p&gt;KMP’nin hedefinde aranılacak kelimenin metinde bulunup, bulunmadığına bakılır ve bu durumlarda neler yapılacağı vardır. Klasik arama yöntemlerinde bütün ihtimaller denenir ve sonuca varılması hedeflenir ancak bu durum uzun bir süre ve bellek kaybı anlamına gelmektedir. KMP ise bu ara işlemlerin bazılarını yapmayarak süreyi kısaltarak ve bellek kaybının önüne geçerek bir arama işlemi gerçekleştirir. Bu ara işlemleri yapmama durumunu aranacak olan kelimeden yola çıkarak hesaplar.&lt;/p&gt;
&lt;h2&gt;KMP Özellikleri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;KMP algoritmasının çalışması için öncelikle ön işlem olarak bir KMP tablosu oluşturmak gerekmektedir.&lt;/li&gt;
&lt;li&gt;Arama işlemini soldan sağa doğru yapar.&lt;/li&gt;
&lt;li&gt;Ön işlem zaman karmaşıklığı yani tablo oluşturma işlemi O(m) , arama zaman karmaşıklığı ise O(m+n) olur.&lt;/li&gt;
&lt;li&gt;Genellikle DNA gibi çok fazla farklı karakter bulundurmayan metinlerde arama çok hızlı iken , doğal konuşma dili tarzındaki metinlerde ise biraz yavaş kalmaktadır.&lt;/li&gt;
&lt;li&gt;Araştırmalar sonucunda Türkçe dil yapısında İngilizce dil yapısına göre daha etkili sonuçlar verdiği hesaplanmıştır.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;KMP Çalışma Yapısı&lt;/h2&gt;
&lt;p&gt;Bu işlemleri bir örnek üzerinden değerlendirirsek daha açıklayıcı olacağını düşündüğüm için bir örnek problem üzerinden ilerleyeceğim.&lt;/p&gt;
&lt;p&gt;Öncelikle ön işlem aşamasını yapmamız gerekmektedir. Bu da tablo oluşturmamız anlamına geliyor. Bu yüzden bazı terimlere ve formüllere ihtiyacımız var.&lt;/p&gt;
&lt;h3&gt;Terimler&lt;/h3&gt;
&lt;p&gt;\(i=kelime\) \( işaretçisi\)&lt;br /&gt;
\(Shifting(kaydırma)=i-prefix[i]\)&lt;br /&gt;
\(prefix=ön\) \(ek\)&lt;br /&gt;
\(suffix=son\) \(ek\)\(pattern=\) \(aranacak\) \(kelime\)&lt;/p&gt;
&lt;h4&gt;Örnek Soru&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;“ACAACACAACABACA” metininde ACABACA kelimesini KMP algoritmasıyla bulunuz.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tablo Oluşturma İşlemi&lt;/h2&gt;
&lt;h2&gt;Adım-1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 1 :&lt;/strong&gt; A&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; Yok&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; Yok&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ: 0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 2 :&lt;/strong&gt; AC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; C&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-3&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 3 :&lt;/strong&gt; ACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A , AC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; A , CA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:1(A)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-4&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt; &lt;strong&gt;:&lt;/strong&gt; ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 4 :&lt;/strong&gt; ACAB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A , AC , ACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; B , AB , CAB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-5&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 5 :&lt;/strong&gt; ACABA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A , AC , ACA , ACAB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; A , BA , ABA , CABA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:1(A)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-6&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 6 :&lt;/strong&gt; ACABAC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A , AC , ACA , ACAB , ACABA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; C , AC , BAC , ABAC , CABAC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:2(AC)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adım-7&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kelime&lt;/strong&gt;**:** ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt; &lt;strong&gt;= 7 :&lt;/strong&gt; ACABACA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix :&lt;/strong&gt; A , AC , ACA , ACAB , ACABA , ACABCA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suffix :&lt;/strong&gt; A , CA , ACA , BACA , ABACA , CABACA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SONUÇ:3(ACA)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 42px;&quot; width=&quot;110&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;i&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;1&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;2&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;3&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;4&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;5&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;6&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;7&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Pattern[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 50px;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 204px;&quot;&amp;gt;&amp;lt;strong&amp;gt;Prefix[i]&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt; 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 47px;&quot;&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 45px;&quot;&amp;gt;2&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 50px; text-align: center;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;Artık tablomuzu oluşturduğumuza göre ön işlem kısmı bitmiş ve arama bölümüne geçebiliriz.&lt;/p&gt;
&lt;h2&gt;Arama İşlemi&lt;/h2&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 320px;&quot; width=&quot;532&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;METİN&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot;&amp;gt;&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;b&amp;gt;B&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;b&amp;gt;A&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;red&quot;&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;&amp;lt;b&amp;gt;–&amp;gt;1&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;A&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;red&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;&amp;lt;b&amp;gt;–&amp;gt;1&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: --&amp;gt;;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td bgcolor=&quot;red&quot;&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;&amp;lt;b&amp;gt;–&amp;gt;2&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;A&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;C&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;A&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;red&quot;&amp;gt;B&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 55px;&quot;&amp;gt;&amp;lt;b&amp;gt;–&amp;gt;2&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 20px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;A&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot; bgcolor=&quot;red&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;C&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;A&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 14pt;&quot;&amp;gt;B&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 21px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;C&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;A&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center; width: 22px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 55px;&quot;&amp;gt;&amp;lt;b&amp;gt;  –&amp;gt;1&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 20px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 21px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;B&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 22px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 22px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;C&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 22px;&quot; bgcolor=&quot;#7CFC00&quot;&amp;gt;&amp;lt;strong&amp;gt;A&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;Bu arama işlemini de yaptıktan sonra aradığımız kelimeyi bulmuş oluyoruz. Yeşil olanlar eşleşmenin sağlandığı karakterler kırmızı olanlar ise hatalı eşleşmeleri temsil etmektedir. Birinci sütundaki okla gösterilmiş sayılar ise kaç karakter kayacağını göstermektedir. Bu kaydırma işlemini ise yukarıdaki tablo ve formüller sayesinde yapmaktayız.&lt;/p&gt;
&lt;h3&gt;Örnek C Kodu&lt;/h3&gt;
&lt;p&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;&lt;/p&gt;
&lt;p&gt;void failure(char* pattern, int* f);
int kmp(char* t, char* p);&lt;/p&gt;
&lt;p&gt;int* init_array(int size) {
int* arr = (int*)malloc(size * sizeof(int));
int i;
for(i = 0; i &amp;lt; size; i++) {
arr[i] = 0;
}&lt;/p&gt;
&lt;p&gt;return arr;
}&lt;/p&gt;
&lt;p&gt;int main(void) {
char* pattern = &quot;abacab&quot;;
char* text = &quot;bbacbabcbabcbabbabcbabcbacbbbacbacbacbacbacbabacab&quot;;&lt;/p&gt;
&lt;p&gt;int match = kmp(text, pattern);&lt;/p&gt;
&lt;p&gt;printf(&quot;Match at: %d\n&quot;, match);&lt;/p&gt;
&lt;p&gt;return 0;
}&lt;/p&gt;
&lt;p&gt;int kmp(char* t, char* p) {
int m = strlen(p);
int n = strlen(t);&lt;/p&gt;
&lt;p&gt;int* f = init_array(m);
int i = 0;
int j = 0;&lt;/p&gt;
&lt;p&gt;while (i &amp;lt; n) {
if (t[i] == p[j]) {
if (j == m - 1) {
return i - j;
}
else {
i += 1;
j += 1;
}
}
else {
if (j &amp;gt; 0) {
j = f[j-1];
}
else {
i += 1;
}
}
}&lt;/p&gt;
&lt;p&gt;return -1;
}&lt;/p&gt;
&lt;p&gt;void failure(char* p, int* f) {
f[0] = 0;
int i = 1;
int j = 0;
int m = strlen(p);
while (i &amp;lt; m) {
if (p[i] == p[j]) {
f[i] = j + 1; // j+1 matches up to the current character.
i += 1;
j += 1;
}
else if (j &amp;gt; 0) {
j = f[j - 1];
}
else {
f[i] = 0;
i += 1;
}
}
}&lt;/p&gt;
</content:encoded></item><item><title>RSA Şifreleme Algoritması</title><link>https://fuwari.vercel.app/posts/rsa-sifreleme-algoritmasi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/rsa-sifreleme-algoritmasi/</guid><description>_📌 Güncelleme (Ağustos 2026): RSA’nın temel matematiği değişmedi; güvenli kullanım tarafında güncel anahtar boyutu ve dolgu önerileri ayrıca not edil</description><pubDate>Sat, 24 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_rsaaa.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_rsaaa.png&quot; alt=&quot;Rsaaa - RSA Şifreleme Algoritması&quot; title=&quot;RSA&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): RSA’nın temel matematiği değişmedi; güvenli kullanım tarafında güncel anahtar boyutu ve dolgu önerileri ayrıca not edilmiştir.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bu yazımızda çok popüler olan bir şifreleme algoritmasından bahsedeceğim RSA Şifreleme Algoritması.&lt;/p&gt;
&lt;p&gt;Ron &lt;strong&gt;R&lt;/strong&gt;ivest, Adi &lt;strong&gt;S&lt;/strong&gt;hamir, Leonard &lt;strong&gt;A&lt;/strong&gt;dleman kişileri tarafından bulunan bu algoritma ismini de yapan kişilerin soyadlarının baş harflerinden almaktadır. Güvenlik açısından uygulanan bu şifreleme algoritması açık anahtarlamalı bir şifreleme yöntemidir. Çözülme zorluğu bakımından tam sayıların çarpanlarına ayırmasına dayanmaktadır. Bilgisayarlar bildiğimiz üzere işlemleri çok hızlı bir seviyede yapmaktadır. Örneğin 1024×1024 sayısını çarpması çok kısa sürerken 1024 sayısını çarpanlara ayırma işlemi daha uzun sürmektedir. İşte bu algoritmada da metini şifrelerken çarpanlarına ayırma işlemini kullanır ve böylece dışarıdan bir kişinin şifreyi çözmesi için bizim anahtarımız olarak verilen değeri çarpanlarına ayırıp denemeler yapması gerektiğinden kısa bir metini çözmesi bile yıllarca sürebilecek bir işlem süreci kadardır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026 notu:&lt;/strong&gt; Aşağıdaki örnekler algoritmayı anlamak için küçük sayılarla anlatılmıştır. Gerçek sistemlerde RSA için en az 2048 bit, tercihen 3072 bit ve üzeri anahtarlar ile OAEP/PSS gibi güvenli dolgu yöntemleri kullanılmalıdır; üretim ortamında kriptografi kütüphaneleri tercih edilmelidir.&lt;/p&gt;
&lt;p&gt;n&lt;/p&gt;
&lt;h1&gt;Açık Anahtarlı Şifreleme&lt;/h1&gt;
&lt;p&gt;Bu şifreleme yöntemi en çok kullanılan yöntemlerin başında gelir. Yapısı, şifreleme ve şifre çözmek için farklı anahtarların kullanıldığı bir yöntemdir. Bu yöntemde gizli anahtar (private key) ve açık anahtar ( public key) olmak üzere iki adet anahtar vardır. Bu anahtarlar sayısal değerlerle hesaplanıp metinlerimizi şifrelememize olanak sağlar. Gizli anahtarlar yalnızca bir kullanıcıya aittir. Açık anahtarlarla şifrelenmiş metinin deşifre edilmesini ancak gizli anahtarı kullanarak yani gizli kişinin bilgilerini doğrulamasıyla metini açıp okuma işlemi gerçekleştirebilir.&lt;/p&gt;
&lt;h2&gt;Dezavantajları&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Her kullanıcı kendine ait bir şifre tutmasıyla bütün gizlenmiş metinleri tek anahtarla çözme imkanına sahiptir. Bu da anahtarın kaybolması durumunda veya başka birinin ele geçirmesi durumunda büyük sıkıntılara yol açmaktadır.&lt;/li&gt;
&lt;li&gt;Anahtarların değiş tokuş edilmesi gerektiğinden dolayı anahtarı karşı tarafa iletmek için bir ağ kullanmak zorundalığı vardır. Bu da ağda ekstra güvenlik önlemi almayı gerektirmektedir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Örneğin \(n\) tane kullanıcı olması durumunda \(n-1\) adet şifre oluşturmak gerekli ve bu sistemde tutulmalıdır. Bu da ekstra bellek alanı tutacağından bu da bir dezavantaj olarak görülebilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_public_key_encripto-min.png&quot; alt=&quot;RSA Algoritması&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;RSA Şifreleme ve De-şifreleme Adımları&lt;/h1&gt;
&lt;p&gt;RSA algoritması 3 adımdan oluşmaktadır. Anahtar oluşturma, şifreleme ve şifre çözme.&lt;/p&gt;
&lt;h2&gt;Anahtar Oluşturma&lt;/h2&gt;
&lt;p&gt;Bu algoritmada iki adet anahtarımız olmak zorundadır. Açık anahtar ve Gizli anahtar. Açık anahtar herkes tarafından bilinir ve göndereceğimiz mesajın şifrelenmesi için kullanılırken, gizli anahtar ise tam tersi şekilde sadece 1 kişi tarafından bilinir ve mesajın çözülmesi için kullanılır.&lt;/p&gt;
&lt;h3&gt;Anahtar Şöyle Oluşturulur;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;İki adet birbirleriyle asal olan ve birbirlerinden farklı olan iki sayı seçilir. Bunlar \(p\) ve \(q\) diyelim. Bu sayılar güvenlik sebebiyle rastgele, birbilerine yakın olmalı ve büyük seçilmelidir.&lt;/li&gt;
&lt;li&gt;\(n=pq\) bu işlemin gerçekleştirilmesinin amacı bir sonraki adımlarda n değerini mod alma işlemi için kullanacağız.&lt;/li&gt;
&lt;li&gt;Bu sayıların totient fonksiyonunu alırız. \(T(n)=(p-1)(q-1)\)&lt;/li&gt;
&lt;li&gt;\(1&amp;lt;e&amp;lt;T(n)\) aralığında bir tam sayı üretilir.  Bu ürettiğimiz \(e\) sayısı ile \(T(n)\) aralarında asal olmak zorundadır.  Burada kullanacağımız \(e\) bizim açık anahtarımız olacaktır.&lt;/li&gt;
&lt;li&gt;\(deequiv 1 \) \(mod(T(n))\) olacak şekilde bir \(d\) sayısı buluruz.  Buradan gelecek \(d\) değeri bizim gizli anahtarımız olacaktır.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sonuç olarak ortak anahtarımız \((n,e)\) den oluşurken gizli anahtarımız \((n,d)\) den oluşur. Buna ek olarak ilk başta belirlediğimiz \(p , q \) ve \( T(n) \) değerleri de gizli kalmalıdır. Bu değerler \(e\) ve \(d\) değerlerini bulmamızda kullandığımızdan dolayı gizli kalmalıdır.&lt;/p&gt;
&lt;h1&gt;Örnek Şifreleme&lt;/h1&gt;
&lt;p&gt;Örnek olarak “Hello” kelimesini şifreli bir şekilde karşı tarafa göndermemiz gerekirse bunu yukarıda bahsettiğim adımlarla yapmak mümkündür.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Öncelikle iki adet asal sayı seçelim \(p=11 \)  \(q=17 \)&lt;/li&gt;
&lt;li&gt; \(n=p*q=11*17 Longrightarrow n= 187 \)&lt;/li&gt;
&lt;li&gt;\(T(n)=(p-1)(q-1) = 10*16 Longrightarrow T(n)=160 \)&lt;/li&gt;
&lt;li&gt;\(1&amp;lt;e&amp;lt;T(n)Longrightarrow e=3  \)&lt;/li&gt;
&lt;li&gt;\(deequiv 1 \) \(mod(T(n))\) \( d=107 Longrightarrow de=321equiv 1 mod(Tn(n)) \)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sonuç olarak public keyimiz \(Longrightarrow n=187\) \( e=3\)&lt;/p&gt;
&lt;p&gt;Şimdi kelimemizi şifreleyip gönderme zamanı  ancak çok kısa bir metin olduğun tek tek harf olarak şifreleyip göndermemiz gerekmektedir.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“H” harfinin ASCII karşılığı olan 72’yi alıyoruz ve \(m=72\)&lt;/li&gt;
&lt;li&gt;\(m^e=72^3equiv183\)\(mod(187)\)\(Longrightarrow c=183\)&lt;/li&gt;
&lt;li&gt;Şifrelenmiş “H” harfinin karşılığı 183 olduğundan dolayı saldırganın görebileceği tek şey 183 tür ve 183 ASCII’nin karşılığı ise \(À\) harfidir. Bu da hatalıdır.&lt;/li&gt;
&lt;li&gt;Şimdi şifrelenmiş karakterimizi de şifre işlemine geçelim.&lt;/li&gt;
&lt;li&gt;\(c^d=183^{107}equiv72\)\(mod(187)\)\(Longrightarrow m=72\)&lt;/li&gt;
&lt;li&gt; Alıcımız 72 ASCII kodunu görüyor ve bu da H harfine denk geldiğinden dolayı şifreli karakteri çözmüş oluyor. Bu işlemi metinin tamamına yaptığımız zaman karşı tarafa güvenli bir şekilde ulaştırmış oluruz.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt; &lt;img src=&quot;/wp-images/2018_02_RSA2-min.png&quot; alt=&quot;RSA Algoritması&quot; /&gt;&lt;img src=&quot;/wp-images/2018_02_RSA1-min.png&quot; alt=&quot;RSA Algoritması&quot; /&gt;Örnek C Kodu&lt;/h1&gt;
&lt;p&gt;// C programlama dili ile yazılmış RSA algoritması
#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;math.h&amp;gt;&lt;/p&gt;
&lt;p&gt;int gcd(int a, int h)
{
int temp;
while (1)
{
temp = a%h;
if (temp == 0)
return h;
a = h;
h = temp;
}
}&lt;/p&gt;
&lt;p&gt;int main()
{
// Two random prime numbers
double p = 3;
double q = 7;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//Public Keyler 
double n = p\*q;


double e = 2;
double phi = (p-1)\*(q-1); // Totient fonksiyonou
while (e &amp;lt; phi)
{
 
    if (gcd(e, phi)==1)
        break;
    else
        e++;
}


int k = 2; 
double d = (1 + (k\*phi))/e;


double msg = 20;

printf(&quot;Message data = %lf&quot;, msg);

//Şifreleme
double c = pow(msg, e);
c = fmod(c, n);
printf(&quot;nEncrypted data = %lf&quot;, c);

// Deşifreleme  
m = fmod(m, n);
printf(&quot;nOriginal Message Sent = %lf&quot;, m);

return 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;//blog.berkarat.com&lt;/p&gt;
</content:encoded></item><item><title>Weka Kurulum ve Weka-R Bağlantısı</title><link>https://fuwari.vercel.app/posts/weka-kurulum-ve-r-baglantisi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/weka-kurulum-ve-r-baglantisi/</guid><description>Weka Waikato Üniversitesinde makine öğrenmesi test etme ve geliştirme amacıyla kurulmuş “Waikato Environment for Knowledge Analysis” kelimelerinin baş</description><pubDate>Sat, 17 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_2089b1_363fa40599b04c5090c38d8632a553db_mv2.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_2089b1_363fa40599b04c5090c38d8632a553db_mv2.png&quot; alt=&quot;weka logosu&quot; title=&quot;weka logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Weka Waikato Üniversitesinde makine öğrenmesi test etme ve geliştirme amacıyla kurulmuş “Waikato Environment for Knowledge Analysis” kelimelerinin baş harflerinden oluşmuş açık kaynak kodlu bir yazılımdır.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cs.waikato.ac.nz/ml/weka/downloading.html&quot;&gt;Weka download&lt;/a&gt; sitesinden indirilebilir olarak iki adet seçenek mevcuttur. Bunlardan birisi standart uygulaması bir de console application vardır. Geliştiriciler açısından console olanı öneririm. Bir hata olduğu zaman nerede hata yaptım diye aramaya gerek kalmadan console ekranında çıktı verecektir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_Weka-1-min.png&quot; alt=&quot;Weka ana görünüm&quot; /&gt;&lt;img src=&quot;/wp-images/2018_02_Weka-2-min.png&quot; alt=&quot;Weka&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Weka .rff uzantılı dosyalar içerisinde eğitim verilerini saklar. .csv,json, veri tabanı vb. aracılığı ile aktarılmış eğitim verisini explorer ekranında save butonuna basıldığında rff olarak dönüştürür ve kaydeder. Bir .rff dosyasının içeriğine bakıldığında relation parametresi dosya adini, attribute parametresi eğitim berisindeki öz niteliklerin adını ( sütun adı), ve devamında öz niteliğin numeric, nominal gibi belirtilir.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Not:&lt;/strong&gt;&lt;/em&gt; Supervised learning için eğitim verisi hazırlanmış ise son attribute classları gösterir ve küme işareti içerisinde classlar yazılır.&lt;/p&gt;
&lt;p&gt;Data parametresinden sonra ise birbirinden virgüllerle ayrılmış tüm attributelere ait değerler satırlar halinde yer alır.&lt;/p&gt;
&lt;p&gt;Veri tabanlarında Weka’ya veri aktarabilmek için JDBC driveri yüklenmelidir. Eğitim verisi Wekaya aktarıldıktan sonra,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classify sınıflandırma problemlerinin çözümü için cluster kümeleme işlemleri gerçekleştirilir.&lt;/li&gt;
&lt;li&gt;Associate birliktelik analizleri için&lt;/li&gt;
&lt;li&gt;Preprocess eğitim verisinde ön işlemler için kullanılır.&lt;/li&gt;
&lt;li&gt;Visualize ise verileri ve analiz sonuçlarını görselleştirmek için kullanılır.&lt;/li&gt;
&lt;li&gt;Generate deneme yapabilmemiz için örnek eğitim verisi oluşturur.&lt;/li&gt;
&lt;li&gt;Preprocess bölümünde filter alanında choose komutu ile eğitim verisi üzerinde indirgeme ön kontrol vb işlemler otomatik yapılabilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Weka’da Model Üzerinde Test Yapma&lt;/h1&gt;
&lt;p&gt;Model oluşturma yöntem ve kurallarına göre bir model elde edildikten sonra sınıfının model tarafından tahmin edilmesini istediğimiz verileri aşağıdaki adımları izleyerek test edebiliriz.&lt;/p&gt;
&lt;p&gt;Öncelikle test verilerinin eğitim verisi formatında hazırlanması gerekir. Kolaylık olarak eğitim verisinin tanımlayıcı başlık kısımları olduğu gibi kopyalanabilir. (relations attribute class gibi). Daha sonra @data ibaresinden itibaren modele sorulacak öz nitelik bilgilerini içeren satırlar yazılır.&lt;/p&gt;
&lt;p&gt;Satır sonuna class isimleri silinerek “?” konulabilir veya olduğu gibi bırakılabilir. Eğer “?” konulursa model gerçek değeri bilemediği için performans değerlendirmesi yapamaz. Test verileri zaten eğitim verilerinin içerisinde varsa model %100 başarı gösterir ancak gerçekçi sonuçlar vermez.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Test verilerini içeren arff dosya hazırlandıktan sonra Weka-explorer ekranına gelinir ancak Weka herhangi bir veri seti açılmadan classify sekmesini aktif etmez, bu yüzden amaç eğitim olmasa da classify sekmesine geçmek için generate butonu ile bir veri seti açılır ve classify sekmesine geçilir.( Bu durum da Weka’nın olumsuz yönüdür.)&lt;/li&gt;
&lt;li&gt;Supplied Test Set işaretlenir ve set butonuna basılır.&lt;/li&gt;
&lt;li&gt;Test verisi seçilir. Result list bölümüne sağ tıklanır load model ile seçilen model dosyası yüklenir.&lt;/li&gt;
&lt;li&gt;More options output predictions chose butonuna basılıp plain text seçilir.&lt;/li&gt;
&lt;li&gt;Result Listte çıkan model verisine sağ tıklanır “re-evaluate model on current test set “ seçilir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yukarıdaki işlemler yapıldıktan sonra model tahminini classifier output ekranına döker.&lt;/p&gt;
&lt;h2&gt;Wekada Classify Bölümü&lt;/h2&gt;
&lt;p&gt;Bu bölüm wekaya aktarılan eğitim verisinin hangi algoritma tarafında, hangi oranlarda test ve eğitim verisi olarak kullanılacağının belirlendiği , analiz sonuçlarının görüntülendiği bölümdür.&lt;/p&gt;
&lt;p&gt;Model oluşturulduktan sonra dış veriyle test etmek için Suplied test set kullanılır. Choose bölümünde ana başlıklarına göre tüm öğrenme algoritmaları listelenmiştir.&lt;/p&gt;
&lt;p&gt;Eğitim ve test verileri oranları seçildikten sonra, start butonu ile model oluşturma başlatılır. Modelin değerlendirilmesine yarayacak performans ve hata göstergeleri classifier output ile gösterilir.&lt;/p&gt;
&lt;p&gt;Modelin değerlendirme kriterlerine göre kabul edilebilir olduğu anlaşılırsa daha başarılı sonuçlar verecek yeni algoritmaların olduğu düşünülerek diğer algoritmalar da denendikten sonra en iyi performans veren belirlenir. Result List bölümünden algoritma adı sağ tık ile save model komutuyla model kaydedilir. Hiçbir algoritmada istenilen başarı elde edilememişse eğer,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eğitim verisi miktarını arttırma-azaltma&lt;/li&gt;
&lt;li&gt;Öz nitelik sayısını artırma veya azaltma&lt;/li&gt;
&lt;li&gt;Eğitim verisi içerisinde gurultu arama&lt;/li&gt;
&lt;li&gt;Farklı öğrenme teknikleri deneme yoluna gidilir.&lt;/li&gt;
&lt;li&gt;Eğitim ve test verisi ayırma yöntemine değişme yoluna gidilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Weka ve R Bağlantısı&lt;/h2&gt;
&lt;p&gt;Wekada görselleştirme yapmak için R eklentisi eklemek gereklidir. Bu ekletiyi &lt;a href=&quot;https://cran.r-project.org/bin/windows/base/&quot;&gt;https://cran.r-project.org/bin/windows/base/&lt;/a&gt; sitesinden indirmek mümkündür.Bu sayede görsel bir şekilde sonuçlarımızı değerlendirmek mümkündür.&lt;/p&gt;
&lt;p&gt;Bağlantı adımları şöyle yapılır.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weka ve R project yükle&lt;/li&gt;
&lt;li&gt;R konsoluna install.packages(“rJava”) yaz eklentiyi kur.&lt;/li&gt;
&lt;li&gt;Bilgisayarınızın “ortam değişkenleri” bölümünü aç&lt;/li&gt;
&lt;li&gt;Yeniyi tıkladıktan sonra üstteki kutuya “R_Home”, alttaki kutuya ise dosya yolu ( c://Program FilesRR-3.4-3 )&lt;/li&gt;
&lt;li&gt;Yeni dedikten sonra üstteki kutuya “R_LIBS_USER” alt kutuya ise c:Users….rwin-library&lt;/li&gt;
&lt;li&gt;Windows 7’de yeni yukarıya Path asagiya R.exeyi yazan klasör. windows 8/10 düzenle veya yeniden Path yaz asagiya R exeyi yaz&lt;/li&gt;
&lt;li&gt;Weka gui chooser ekranında tools ekranında package managera girilir. RPlugin yüklenir weka kapatılıp açılır. bağlantı yapılmış olur.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Model Performans Değerlendirme Ölçütleri-2</title><link>https://fuwari.vercel.app/posts/model-performans-degerlendirme-olcutleri-2/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/model-performans-degerlendirme-olcutleri-2/</guid><description>Merhabalar bu yazımızda önceki yazı olan [model performans değerlendirme ölçütleri](https://blog.berkarat.com/performans-degerlendirme/)nin devamı ola</description><pubDate>Fri, 16 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_Makine-%C3%B6%C4%9Frenmesi.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_Makine-%C3%B6%C4%9Frenmesi-696x696.png&quot; alt=&quot;Makine öğrenmesi&quot; title=&quot;Makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda önceki yazı olan &lt;a href=&quot;https://blog.berkarat.com/performans-degerlendirme/&quot;&gt;model performans değerlendirme ölçütleri&lt;/a&gt;nin devamı olarak kalan ölçütlerden bahsedeceğim.&lt;/p&gt;
&lt;h2&gt;ROC Eğrisi(Receiver Operating Characteristic Curves)&lt;/h2&gt;
&lt;p&gt;Roc eğrisinin gelişimine tarihi açısından bakarsak İkinci Dünya Savaşı sırasında dost ve düşman uçakların sinyallerini doğru tanımlayıp belirlemek, yorumlamak icin geliştirilmiş bir yöntemdir. Roc eğrisine bakılarak model performansı hakkında genel bir değerlendirme yapılabilir X ekseni sahte pozitif oranını gösterirken Y ekseni gerçek pozitif oranını gösterir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_ROC.svg&quot; alt=&quot;Roc Curve&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Roc eğrisi monoton olarak yukarı giden artan fonksiyondur.&lt;/li&gt;
&lt;li&gt;Sol alt köşe yüksek eşiğe karşılık gelir. Sağ üst köşe ise düşük esiğe karşılık gelir.&lt;/li&gt;
&lt;li&gt;Yüksek eşik demek sadece gerçek pozitiflerin yakalandığını (TP) fakat çok fazla pozitif durumun gözden kaçırıldığı anlamına gelir.&lt;/li&gt;
&lt;li&gt;Düşük eşik demek neredeyse tüm durumları pozitif olarak etiketlemektir. Dolayısıyla anma yüksektir. Fakat bununla birlikte çok sayıda negatif durum da yanlışlıkla yakalanıyor demektir.&lt;/li&gt;
&lt;li&gt;ROC grafiğinde (0,0) noktası hiçbir zaman pozitif bir sınıflandırmanın yapılamayacağını, (1,1) noktası mutlak pozitif sınıflandırmanın elde edileceğini, (0,1) noktası ise mükemmel sınıflandırmayı gösterir.&lt;/li&gt;
&lt;li&gt;İyi bir sınıflandırıcının eğrisi grafiğin sol üst kösesine yakın olması ile elde edildiği söylenebilir.&lt;/li&gt;
&lt;li&gt;Hedef değişkeninin nominal veri tipi olduğu durumlarda tahminler ROC uzayında tek bir noktaya karşılık gelir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PRC EĞRİSİ (Precision-Recall Curves)&lt;/h2&gt;
&lt;p&gt;Eşik değişimine göre PRC eğrisini gösterir.&lt;/p&gt;
&lt;h3&gt;Özellikleri :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PRC eğrisi monoton aşağı gider.&lt;/li&gt;
&lt;li&gt;Sol üst köşe yüksek eşige karşılık gelirken, sağ alt köşe düşük eşiğe karşılık gelir.&lt;/li&gt;
&lt;li&gt;Yüksek eşik seçildiğinde gercek pozitifleri yakalıyoruz fakat fazla pozitif durum yakalanmıyor demektir.&lt;/li&gt;
&lt;li&gt;Düşük eşik demek anma yüksek fakat yanlışlıkla çok fazla negatif durum yakalanıyor demektir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_PRC.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_PRC.svg&quot; alt=&quot;Precision recall curves&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;AUC EĞRİSİ(Area Under Curves)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Genel performans için kullanılır.&lt;/li&gt;
&lt;li&gt;Bir sınıflandırma çözümünün genel performansını karakterize etmek için AUC ölçeği kullanılır.&lt;/li&gt;
&lt;li&gt;AUC TP ve TN yakalama oranını gösterir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eğrinin altında kalan alanın 1 e yaklaşması istenir.&lt;a href=&quot;/wp-images/2018_02_auc.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_auc.svg&quot; alt=&quot;Auc curves&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Modelin Hata Ölçekleri&lt;/h1&gt;
&lt;p&gt;Model  tahmini ile gerçek değer arasındaki farka &lt;strong&gt;&lt;em&gt;hata&lt;/em&gt;&lt;/strong&gt; denir.&lt;/p&gt;
&lt;p&gt;Model tahminlerinin ortalama hatasına &lt;strong&gt;&lt;em&gt;maliyet&lt;/em&gt;&lt;/strong&gt; denir.&lt;/p&gt;
&lt;h2&gt;Ortalama Karesel Hata(Root Mean Square Error)&lt;/h2&gt;
&lt;p&gt;Ortalama karesel hata tahmin ile gerçek değer çizgisinin arasındaki uzaklıkların karelerinin ortalamasını alarak birbirlerine olan yakınlığını hata hesabıyla göstermeye çalışır.&lt;/p&gt;
&lt;p&gt;Ortalama karesel hata ne kadar küçükse tahminle gerçek değer arasındaki uyum o kadar iyidir. Regresyon modellerinin tahmin edebilme ölçeği olarak da kullanılabilir. Modelin RMSE’sinin varyansı denir.&lt;/p&gt;
&lt;h2&gt;Korelasyon Katsayısı&lt;/h2&gt;
&lt;p&gt;Modelin tahminleriyle gerçek değerler arasında doğru orantılı bir ilişki olup olmadığı hakkında bilgi verir. \(r^2\) ile gösterilir.&lt;/p&gt;
&lt;p&gt;Korelasyon katsayısı \(r^2\) -1/ ile +1 arasında değişir. Eğer -1’e eşitse tahmin edilen ile gerçeklerim uyuşmadığını, 0’a eşit ise tahminlerin gerçek değerlerle alakasız olduğunu, +1 e eşit ise tahminlerin gerçek değerlerle birebir uyuştuğunu gösterir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_korelasyon.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_korelasyon.svg&quot; alt=&quot;korelasyon katsayısı&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Root Mean Squared Error( ortalama karesel hatanın karekökü). RMSE Ortalama karesel hatanın karekökü alınarak elde edilir. RMSE hassasiyet ölçüsüdür. Parametrik güven aralıklarının elde edilmesinde yaklaşık dağılım özelliklerinin bilinmesini sağlar. Bir sistemden diğer bir sisteme dönüşümün doğruluğunu belirlemek için de kullanılır.&lt;/p&gt;
&lt;h2&gt;Kappa Katsayısı&lt;/h2&gt;
&lt;p&gt;İki veya daha fazla gözlem arasındaki uyuşmayi etkileşimi ölçmek için kappa istatistiği sık kullanılan bir yöntemdir. Kappa gözlemler arasındaki uyuşmasın büyüklüğü nicel olarak tanımlanmadı icin vardır. -1/+1 arasında değişen ölçüdür. Bu değer +1 ise gözlemler arasında mükemmel bir uyuşma vardır.&lt;/p&gt;
&lt;p&gt;&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Dereceler&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Düşük&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Zayıf&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Makul&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Orta&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Önemli&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;Mükemmel&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Kappa Katsayısı&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.00&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.20&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.40&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.60&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.80&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;1.00&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Kappa Katsayısı&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;strong&amp;gt;Kabul Edilebilirlik Seviyesi&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;= 0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Kabul edilebilir değil.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.01-0.20&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Yeterli değil.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.21-0.40&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Makul seviyede kabul edilebilir.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.41-0.60&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Orta düzeyde yeterli.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.61-0.80&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Önemli ölçüde kabul edilebilir.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;text-align: center;&quot;&amp;gt;0.81-0.99&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;text-align: left;&quot;&amp;gt;Mükemmel seviyede uyuşma&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Model Performans Değerlendirme Ölçütleri-1</title><link>https://fuwari.vercel.app/posts/performans-degerlendirme/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/performans-degerlendirme/</guid><description>Merhabalar daha önceki yazılarımızda bahsettiğimiz yöntemlerle önce taslak model oluşturmuş daha sonrasında ise bu taslak modele uygun algoritmaları k</description><pubDate>Thu, 15 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_Makine-%C3%B6%C4%9Frenmesi.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_Makine-%C3%B6%C4%9Frenmesi-696x696.png&quot; alt=&quot;Makine öğrenmesi&quot; title=&quot;Makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar daha önceki yazılarımızda bahsettiğimiz yöntemlerle önce taslak model oluşturmuş daha sonrasında ise bu taslak modele uygun algoritmaları kullanarak modelimizi oluşturmuştuk. Bu uygun algoritmaları neye göre uygun olup olmadığından bahsetmemiştik. Bu yazının başlığından da anlaşılacağı gibi modelimizin performansını değerlendirip hangisinin uygun olup olmadığını belirlememize yarayacak bazı ölçütlerden bahsedeceğim.&lt;/p&gt;
&lt;h2&gt;Confusion Matrix( Hata Matrixi)&lt;/h2&gt;
&lt;p&gt;Makine öğrenmesinde hedef verisi önceden belli olan veri setlerinden elde edilen ( &lt;a href=&quot;https://blog.berkarat.com/model-performans-degerlendirme-yontemleri/&quot;&gt;model performans değerlendirme yöntemleri&lt;/a&gt; yani bahsettiğimiz 8 yöntemden birisiyle ) modellerin performansını değerlendirmek üzere en sık kullanılan yöntem confisuon matrix’dir. ( karışıklık matrisi) Modelin pozitif ve negatif örnekleri içerisinde barındıran test veri setini ne ölçüde sınıflandırdığımı gösteren matrix’e confusion matrix denir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_confusion.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_confusion.svg&quot; alt=&quot;confusion matrix&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TP (True Positive ):&lt;/strong&gt; Test verisindeki değer ile modelin değer ettiği sınıf aynıdır. Doğru sınıflandırma yapmıştır.&lt;/li&gt;
&lt;li&gt;**FN (False Negative ):**Test verisindeki değer ile modelin ürettiği sınıf farklı. Pozitif ilken negatif sınıflandırılmış. Hatalı sınıflandırma yapmıştır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FP (False Positive ) :&lt;/strong&gt; Gerçek değer negatif iken pozitif sınıflandırılmış. Hatalı sınıflandırma yapmıştır.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TN (True Negative ):&lt;/strong&gt; Gerçek değer negatif iken negatif sınıflandırılmıştır. Doğru sınıflandırma yapmıştır.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;table class=&quot; aligncenter&quot; style=&quot;border-color: #000000;&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 502.049px;&quot; colspan=&quot;3&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 18pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;GERÇEK DEĞERLER&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot; rowspan=&quot;3&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 18pt;&quot;&amp;gt;&amp;lt;strong&amp;gt;TAHMİN EDİLEN DEĞERLER&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;POZİTİF&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 155.382px;&quot;&amp;gt;NEGATİF&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;POZİTİF&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;Gerçek Pozitif&amp;lt;p&amp;gt;True Positive – TP&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 155.382px;&quot;&amp;gt;Sahte Pozitif&amp;lt;p&amp;gt;False Positive – FP&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;NEGATİF&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 154.271px;&quot;&amp;gt;Sahte Negatif&amp;lt;p&amp;gt;False Negative – FN&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 155.382px;&quot;&amp;gt;Gerçek Negatif&amp;lt;p&amp;gt;True Negative – TN&amp;lt;/p&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;Örnek bir problem üzerinde değerlendirirsek bazı öz niteliklerle bir hasta üzerinde X rahatsızlığı var ya da rahatsızlığı yok sonucuna varmak istiyoruz. Eğer ki;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hasta olmayan kişilere X rahatsızlığı var teşhisi koyarsan &lt;strong&gt;FP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Hasta olmayanlara X rahatsızlığı yok dediysek &lt;strong&gt;TN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Hasta olanlara X teşhisi var dediysek &lt;strong&gt;TP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Hasta olanlara X teşhisi yok dediysek &lt;strong&gt;FN&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;DUYARLILIK ( Sensivity-Precision)&lt;/h2&gt;
&lt;p&gt;Modelin girdilerden pozitif sınıf etiketini tahmin etmekteki etkililiğini gösterir. Doğru sınıflandırılan pozitif örneklerin toplam pozitif örnek sayısına oranıdır ( FN ayni zamanda doğrudur) sadece pozitif için geçerli.&lt;/p&gt;
&lt;p&gt;\(Duyarlılık=frac{TP}{TP+FN}\)&lt;/p&gt;
&lt;p&gt;Modelin girdilerden pozitif sınıf etiketini tahmin etmekteki etkililiğini gösterir. Doğru sınıflandırılan pozitif örneklerin toplam pozitif örnek sayısına oranıdır ( FN aynı zamanda doğrudur) sadece pozitif için geçerli.&lt;/p&gt;
&lt;h2&gt;BELİRLEYİCİLİK (Specifity)&lt;/h2&gt;
&lt;p&gt;\(Specifity=frac{TN}{TN+FP}\)&lt;/p&gt;
&lt;p&gt;Modelin girdilerdeki negatif sınıf etiketini tahmin etmedeki becerisidir. Doğru sınıflandırılan negatif örneklerin toplam negatif örnek sayısına oranı ile hesaplanır. (FP aynı zamanda negatifidir)&lt;/p&gt;
&lt;h2&gt;KESİNLİK( Pozitif Öngörü- Recall)&lt;/h2&gt;
&lt;p&gt;\(Recall=frac{TP}{TP+FP}\)&lt;/p&gt;
&lt;p&gt;Doğru sınıflandırılan pozitif örneklerin toplam pozitif tahmin edilen örneklere oranıdır.&lt;/p&gt;
&lt;h2&gt;F-ÖLÇÜTÜ&lt;/h2&gt;
&lt;p&gt;Kesinlik ve duyarlık performans değerlendirme ölçütlerinin harmonik ortalamasıdır. Her iki ölçütü birlikte değerlendirme imkanı verir.&lt;/p&gt;
&lt;p&gt;\(F-Ölçütü=frac {2*Precision*Recall}{Precision+Recall}\)&lt;/p&gt;
&lt;p&gt;Sınıflandırıcının eşik değeri belirlenirken F değeri göz önünde bulundurulur.&lt;/p&gt;
&lt;h2&gt;Doğruluk&lt;/h2&gt;
&lt;p&gt;Modelin gerçekte doğru sınıflandırdığı örneklerin sayısıdır.&lt;/p&gt;
&lt;p&gt;​\(Doğruluk=TP+TN\)&lt;/p&gt;
&lt;p&gt;Doğruluk modelin genel olarak doğru olup olmadığını karakterize eder.&lt;/p&gt;
</content:encoded></item><item><title>Makine Öğrenmesi Model Performans Değerlendirme Yöntemleri</title><link>https://fuwari.vercel.app/posts/model-performans-degerlendirme-yontemleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/model-performans-degerlendirme-yontemleri/</guid><description>Merhabalar bu yazımızda da makine öğrenmesi kurallarına devam ediyoruz. Daha önce belirttiğim [Makine Öğrenmesi Model Oluşturma](https://blog.berkarat</description><pubDate>Mon, 12 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_1-11.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_1-11.png&quot; alt=&quot;Makine öğrenmesi&quot; title=&quot;Makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazımızda da makine öğrenmesi kurallarına devam ediyoruz. Daha önce belirttiğim &lt;a href=&quot;https://blog.berkarat.com/makine-ogrenmesi-oznitelikler/&quot;&gt;Makine Öğrenmesi Model Oluşturma&lt;/a&gt; yazısında modelimizi taslak model olarak oluşturmuştum. Ancak bu adı üzerinde olduğu gibi taslak model bizim bunu belli yöntemler ve algoritmalarla düzenlememiz ve en uygun sonucu alana kadar denememiz gerektiğini yazmıştım. Şimdi bu yöntemlerin neler olduğundan bahsedeceğim.&lt;/p&gt;
&lt;p&gt;Bir modelin performansı kullanılan öğrenme algoritmasının yanı sıra sınıf dağılımı hatalı sınıflandırma ya da eğitim ve test kümelerinin büyüklüğüne bağlı olabilir. Model performans değerlendirme yöntemleri mevcut veri setinde örneklemenin nasıl yapılacağını gösterir. Hatırlatma olarak Model Performans Değerlendirme yöntemleri nelerdi,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hold Out&lt;/li&gt;
&lt;li&gt;Tekrarlı Hold Out&lt;/li&gt;
&lt;li&gt;Tabakalı Örnekleme&lt;/li&gt;
&lt;li&gt;Üçlü Ayırma&lt;/li&gt;
&lt;li&gt;Çapraz geçerleme-doğrulama&lt;/li&gt;
&lt;li&gt;Rastgele Örnekleme Yöntemi&lt;/li&gt;
&lt;li&gt;Bootstrap Örnekleme Yöntemi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Makine öğrenmesi alanında en çok kullanılan yöntemlerin bazılarını aşağıda başlıklar ve örneklerle açıklayacağım.&lt;/p&gt;
&lt;h2&gt;1.Holdout (Dışarıda Tutma)&lt;/h2&gt;
&lt;p&gt;Veri setinin eğitim ve test olmak üzere iki parçaya ayrıldığı yöntemdir. Test setinde kullanılan veri eğitim setinin dışındaki verilerden oluştuğu için bu yönteme holdout ismi verilmiştir. Eğitim veri setiyle öğrenme sağlanmakta yani model kurulmaktadır, test veri setiyle de öğrenmenin ne kadar gerçekleştiği kontrol edilmekte ve model performansı elde edilmektedir.&lt;/p&gt;
&lt;p&gt;Bu yöntemin iki dezavantajı vardır.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Veri setindeki gözlem sayısının az olması durumunda ayrımın yeterince uygun yapılamaması.&lt;/li&gt;
&lt;li&gt;Veri setinin eğitim ve test olmak üzere bir defaya mahsus ayrılması, verilerin tamamının modelde kullanılamaması. ( test veri seti içinde modele iyileştirici katkı sunacak veriler bulunabilir.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_holdout-1.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_holdout-1.svg&quot; alt=&quot;Tekrarlı Holdout Yöntemi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2.Tekrarlı Holdout (Tekrarlı Dışarıda Tutma)&lt;/h2&gt;
&lt;p&gt;Kısaca holdout yönteminin birkaç defa tekrarlanmasıdır. Bu yöntemde seçim işlemi her ne kadar rastgele yapılsa da farklı test veri setleri üst üste binebileceğinden elverişli görülmemektedir. Çok yaygın bir şekilde kullanılmamaktadır.&lt;/p&gt;
&lt;h2&gt;3.Tabakalı Öğrenme&lt;/h2&gt;
&lt;p&gt;Hedef niteliğin kategorik veri tipinde olduğu veri setlerinde hedef niteliğin bazı kategorilerine ait örnekler az sayıda ya da hiç olmayabilir. Bu gibi durumlarda veri seti eğitim ve test olarak ayrılırken hedef niteliğin kategorilerine ait oranların korunması istenebilir. Bu gibi durumlarda tabakalı örnekleme tercih edilir. Hedef niteliğin numeric olduğunda bu yöntemden faydalanmaz. Sadece kategorik özelliklerdeki veri setlerinde kullanılması uygundur.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;/wp-images/2018_02_Tabakal%C4%B1-son.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_Tabakal%C4%B1-son.svg&quot; alt=&quot;Tabakalı Öğrenme&quot; /&gt;4.Üçlü Ayırma&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Model seçimi ve performans tahmininin aynı anda gerçekleştirildiği yöntemdir. Veri setimizi eğitim, doğrulama ve test olmak üzere 3’e ayırırız. Ardından doğrulama veri setindeki örnekler ile kullanılan algoritmaya ait parametrelerin ince ayarı yapılır. Doğrulama veri setindeki çıktıları veren algoritma ve ona uygun parametre tespit edilinceye kadar denemeler yapılır. Bu yöntemde uygun algoritma en uygun parametresiyle birlikte verilir. Ardından test veri setiyle modelin nihai performansı denenir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_%C3%9C%C3%A7l%C3%BC-Ay%C4%B1rma.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_%C3%9C%C3%A7l%C3%BC-Ay%C4%B1rma.svg&quot; alt=&quot;Üçlü Ayırma&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Örnek vermek gerekirse, kabul ve red olarak 2 adet sonucumuz olduğunu varsayalım. Bizim doğrulama verilerimiz bizim belirlediğimiz değerler olsun. 7 Kabul ve 3 Red olarak tanımlayalım. Eğer algoritmamız bu sonucu vermez ise parametrelerde değişiklik yapılır bu da eğer istediğimiz sonucu vermez ise yeni bir algoritma seçilir. Yukarıdaki resimde farklı renklerde algoritmalar seçilmiştir. Kesin sonucu verene kadar eğitim süreci devam ettirilir. Hassasiyeti çok yüksek durumlarda kullanılmak için tasarlanmış bir yöntemdir.&lt;/p&gt;
&lt;h2&gt;5.Rastgele Örnekleme Yöntemi&lt;/h2&gt;
&lt;p&gt;Monte Carlo çapraz doğrulama(Monte Carlo Cross Validation) olarak da bilinen rastgele örnekleme yönteminde veri seti k defa kullanıcının belirlediği oranlarda eğitim ve test veri seti olarak bölünür. Elde edilen performans sonuçlarının ortalamasına göre nihai başarı elde edilir. Çapraz doğrulamadan farkı k adet rastgele ancak belirli oranlarda bölümlemelerin veri setinde aynı noktalara kısmen veya tamamen tekabül edebilmesidir. Bu durum aynı noktalara kısmen tekrar denk gelmesi aynı zamanda dezavantajdır. Bu örnek için düşünürsek veri setimizi 3 kere böldük ve en uygun sonuç veren algoritmayı seçmemiz gerekmektedir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_Rastgele-%C3%96rnekleme.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_Rastgele-%C3%96rnekleme.svg&quot; alt=&quot;cross validation&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;6.Bootstrap örnekleme&lt;/h2&gt;
&lt;p&gt;Bootsrap örnekleme yönteminde elimizde “n” adet örnekten oluşan bir veri seti olsun bootstrap yöntemi veri setinden eğitim veri seti için “n” defa rastgele örnek seçmektedir. Ancak seçilen örnek veri setinden çıkarılmadan seçim işlemi sürdürülür. Bu nedenle eğitim veri setinde bir örnek birden fazla tekrar edebilmektedir. Eğitim veri seti oluşturulduktan sonra eğitim veri setine alınmayan bütün örnekler test veri setine aktarılmaktadır. Test veri setindeki her örnek yalnızca 1 defa tekrar edilebilir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_Bootsrap-%C3%96rnekleme.svg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_Bootsrap-%C3%96rnekleme.svg&quot; alt=&quot;Bootsrap &quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Makine Öğrenmesi-Model Oluşturma</title><link>https://fuwari.vercel.app/posts/makine-ogrenmesi-model-olusturma/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/makine-ogrenmesi-model-olusturma/</guid><description>Merhaba bu yazımız [Makine Öğrenmesi Öğrenme Süreci](https://blog.berkarat.com/ogrenme-ve-lineer-regresyon/) yazımızın devamı niteliği taşımaktadır. B</description><pubDate>Sun, 11 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_machine-learning.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_machine-learning-696x461.png&quot; alt=&quot;machine-learning&quot; title=&quot;makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımız &lt;a href=&quot;https://blog.berkarat.com/ogrenme-ve-lineer-regresyon/&quot;&gt;Makine Öğrenmesi Öğrenme Süreci&lt;/a&gt; yazımızın devamı niteliği taşımaktadır. Bu makaleyi anlamak için öncelikle bu konuyu okumanız gerekmektedir. Bu sefer makine öğrenmesinde model kavramını açıklayacağız ve nasıl oluşturulduğunu nelere dikkat etmemiz gerektiğiniz açıklayacağım. İlk olarak model oluşturma ile başlayacağım ve örnek problem üzerinden anlatacağım.&lt;/p&gt;
&lt;h1&gt;Model Oluşturma&lt;/h1&gt;
&lt;p&gt;Bir problemi makine öğrenmesi yöntemleriyle çözmek için özniteliklerin doğru seçilmesi ve doğru şekilde temsil edilmesi çok önemlidir. Bunu birçok yerde belirtmiştim şimdi neden böyle belirttiğimi yazının sonunda daha iyi anlamış olacağız.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_model-min-1024x862.png&quot; alt=&quot;Makine öğrenmesi model&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Örnek&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Bir banka düşünelim ve kredi başvurusu yapan müşterilerin kredi risk durumlarının kontrolünü makine öğrenmesi yöntemiyle yapmak istiyor. Kısaca kredi vermeden önce müşterisinin kredi riskini belirlemek istiyor. Bunun için bizden uygun bir model oluşturmamız bekleniyor.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Çözüm&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Öncelikle temel açıklayıcı nitelikler, faktörler veya değişkenler belirlenmelidir. Bunun için bir kredi uzmanından destek alınmalı ve önemli faktörlerin neler olduğu hakkında bilgiler alınmalıdır.( Aylık geliri, yaşadığı şehir gibi öznitelikler) Makine öğrenmesi yöntemleriyle ortaya çıkacak modelin sığım uzayı (kapsamı) bu özniteliklerinin çeşidini arttırılarak genişletilebilir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kredi riskini etkileyen özniteliklerin tipleri belirlenir.&lt;/li&gt;
&lt;li&gt;Örneğin müşterinin ikamet ettiği il —&amp;gt; kategoriktir.&lt;/li&gt;
&lt;li&gt;Müşterinin geliri —&amp;gt; sayısal&lt;/li&gt;
&lt;li&gt;Müşterinin ödeme performansı —&amp;gt; binary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Modelin üretmesi beklenen çıktıları sayısı ve tipi belirlenir. ​Modelin çıktısı binary (kredi almaya uygun veya uygun değil gibi) olabilir. Numeric seçilmesi hassasiyet oranını arttırır, binary seçilmesi sınıf sayısını azaltırken hassasiyeti düşürebilir. Bu yüzden sonuç sınıfını belirlerken istenilen durum göz önünde bulundurulmalıdır. Bazı algoritmalar sadece numeric veya kategorik olarak çalıştığından bu çıktıyı belirlerken kullanacağımız algoritmayı da göz önünde bulundurmak zorundayız. ( Örneğin müşterinin yaşadığı il string tipindeyse algoritma tarafından kabul edilmeyebilir. Bunu numerice çevirmek gerekebilir. İzmir yerine plaka kodu olan 35 yazmak gibi) Aksi takdirde bir sonuç elde edemeyiz.&lt;/p&gt;
&lt;p&gt;Veriler türlerine uygun olarak veri tabanına veya text dosyasına aktarılır. Örneğin Müşterinin geliri sürekli bir değişkendir. Bu durum kredi riskine oransal olarak etki etmeyebilir. Yani sistem maaşı 1000₺ olan müşteri ile 2000₺ arasındaki müşteri kıyası yaparken iki kat risk görebilir. Ancak bu durum yanlıştır. Bunu ortadan kaldırmak için müşterinin geliri düşük, orta, yüksek gibi kategorik hale getirilebilir. (düşük=0, orta=1, yüksek=2) Ancak bu sayısal katsayılar lineer model kurallarına uymayabilir bu durumu da göz önünde bulundurmak gerekmektedir. &lt;a href=&quot;https://blog.berkarat.com/ogrenme-ve-lineer-regresyon/&quot;&gt;Lineer regresyon&lt;/a&gt; yazımızda nelere dikkat edeceğimizi açıklamıştım.&lt;/p&gt;
&lt;p&gt;Bu tip işlemleri yaptıktan sonra 4 aşamada oluşturduğumuz bir taslak modeli karşımıza çıkmış bulunmaktadır. Bu 4 aşamayı &lt;a href=&quot;https://blog.berkarat.com/makine-ogrenmesi-giris/&quot;&gt;Makine Öğrenmesi Giriş&lt;/a&gt; yazımızda detaylı olarak açıklamıştım.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_tablo-min-1024x582.png&quot; alt=&quot;eğitim verisi &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Eğitim verisinin sınıfının belli olup olmamasına bu eğitim verisi kullanılarak çözülmek istenen problemin mantıksal gerekliliklerine ve beklentilere göre algoritma seçimi, öğrenme yöntemi belirlenir. Her problemde en yüksek başarıyı veren belirli bir algoritma yoktur. Bu nedenle çok sayıda algoritma, algoritmanın iç ayarlarını da değiştirerek defalarca denenmelidir. Algoritmaların ürettiği matematiksel, istatiksel değerlendirme çıktıları, geçmiş tecrübeler algoritma seçiminde temel belirleyicilerdir.&lt;/p&gt;
&lt;p&gt;Bu algoritmaların çeşitleri aşağıda verilmiştir.&lt;/p&gt;
&lt;h2&gt;Model Performans Değerlendirme Yöntemleri&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Hold Out&lt;/li&gt;
&lt;li&gt;Tekrarlı Hold Out&lt;/li&gt;
&lt;li&gt;Tabakalı Örnekleme&lt;/li&gt;
&lt;li&gt;Üçlü Ayırma&lt;/li&gt;
&lt;li&gt;Çapraz geçerleme-doğrulama&lt;/li&gt;
&lt;li&gt;Rastgele Örnekleme Yöntemi&lt;/li&gt;
&lt;li&gt;Bootstrap Örnekleme Yöntemi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bir sonraki yazımızda bu model performans değerlendirme yöntemlerini madde madde açıklayacağız.&lt;/p&gt;
</content:encoded></item><item><title>WordPress SVG Kullanımı ve Resim Optimizasyonu</title><link>https://fuwari.vercel.app/posts/wordpress-svg-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/wordpress-svg-kullanimi/</guid><description>Merhabalar wordpress kullanıcıların en temel sorularından birisi de google’da nasıl üst sıralara çıkacağıdır. Bunun için SEO(Search Engine Optimizatio</description><pubDate>Sun, 11 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_qq-min.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_qq-min-696x696.png&quot; alt=&quot;svg&quot; title=&quot;svg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar wordpress kullanıcıların en temel sorularından birisi de google’da nasıl üst sıralara çıkacağıdır. Bunun için SEO(Search Engine Optimization) yöntemleri bulunmaktadır. Ancak buna ek olarak site hızımız da önemli bir yer tutmaktadır. Site hızımızı yavaşlatan şeylerden birisi de resimlerdir. Resimleri nasıl yüklemeli, nelere dikkat etmeli ön sıralarda yer almak için bir kaç ipucu hakkında bahsedeceğim. SVG’nin ne olduğundan ve svg olarak sitemize nasıl resim yükleyebileceğimizden bahsedeceğim.&lt;/p&gt;
&lt;h1&gt;Normal Resim Yükleme&lt;/h1&gt;
&lt;p&gt;Öncelikle yeni bir yazı eklemek için yeni yazı ekleme kısmına gidiyoruz ve içerik eklemek istiyoruz. Bunun için Ortam Ekle-&amp;gt;Dosya Yükle-&amp;gt; Dosya Seçin -&amp;gt; İstenilenResim -&amp;gt;Yazıya ekle. En basit olarak yazımıza sayfamıza veya logomuza resim yüklemeleri böyle yapıyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_2-1-1024x418.png&quot; alt=&quot;wordpress Resim yükleme&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ancak bu kadar basit olmasının da bir bedeli olacak. Nedir bu bedel? Çok yer kaplaması. Bizim yüklediğimiz resmi bir sıkıştırma işleminden geçirmeden doğrudan yükledik. Bunun bize zararları en başta sunucuda ekstradan yer kaplayacak ve sayfanın yüklenmesini geciktirecek. Peki bunu nasıl sıkıştırabilirim?&lt;/p&gt;
&lt;h1&gt;Resim Sıkıştırma&lt;/h1&gt;
&lt;p&gt;Resimlerin boyutlarını sıkıştırma işlemine optimizasyon diyoruz. Bu sayede hem seo alanında ön plana çıkmamıza hem de sitemizin performasına olumlu yönde etkileri bulunmuş oluruz. Ben kendi sitemde &lt;a href=&quot;http://compressjpeg.com&quot;&gt;http://compressjpeg.com&lt;/a&gt; sitesini kullanarak resimleri buradan sıkıştırıp optimize ettikten sonra siteme yüklüyorum. Bu sayede sunucumda yerden de tasarruf etmiş bulunuyorum&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_3-1-1024x546.png&quot; alt=&quot;Resim Sıkıştırma&quot; /&gt;&lt;img src=&quot;/wp-images/2018_02_4-1-1024x546.png&quot; alt=&quot;Resim Sıkıştırma&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;SVG(Scalable Vector Graphics) ile Resim Yükleme&lt;/h1&gt;
&lt;p&gt;SVG( Ölçeklendirilebilir Vektör Grefikleri) yapısı XML tabanlı iki boyutta grafiklerde tanımlama yapabilmek için W3C tarafından çıkarılmış bir vektör dilidir. Daha çok butonlarda ve logolarda kullanılan bu dil tamamen xml tabanlı olduğundan dolayı kapladığı alan çok çok küçüktür. Bu sebeple grafik çizimleri, tablolar gibi vektörel çizimlerde kullanmak büyük bir avantaj sağlamaktadır.&lt;/p&gt;
&lt;p&gt;WordPress SVG ile resim yüklemeyi güvenlik sebepleriyle desteklememektedir. Ancak bunu yapmanın birden fazla yolu vardır. İlk ve en güvenilir yol &lt;a href=&quot;https://tr.wordpress.org/plugins/svg-support/&quot;&gt;SVG Support&lt;/a&gt; eklentisini kurarak svg formatındaki resimlerimizi yüklemek mümkündür. Bu eklentiyi kurduktan sonra etkinleştiriyoruz ve yukarıda bahsettiğim şekilde resim yükleme yapabiliriz. Bu  formatta olan resimleri ekstra bir optimizasyon işlemine tabii tutmaya gerek yoktur. Zaten metin tabanlı olduğundan dolayı bu işlemi yapmak pek mümkün değildir.&lt;/p&gt;
&lt;p&gt;SVG dosyalarımızı yüklemenin başka bir yolu metin yazarken kod bloğu olarak yazımızın içeriğine eklemektir.&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE svg PUBLIC &quot;-//W3C//DTD SVG 1.1//EN&quot; &quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&quot;&amp;gt;
&amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; width=&quot;121px&quot; height=&quot;61px&quot; version=&quot;1.1&quot; content=&quot;&amp;lt;mxfile userAgent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36&quot; version=&quot;8.0.9&quot; editor=&quot;www.draw.io&quot; type=&quot;device&quot;&amp;gt;&amp;lt;diagram id=&quot;c438b003-446f-c312-e4c8-7f790d17b349&quot; name=&quot;Page-1&quot;&amp;gt;rZTBjpswEIafxsdKgCOSPW5ositV7aGRtmcHT8BaY1PHKaRP3wHGIYTsqlWXQ2J/M/bY8//AeFa1T07U5VcrQbMkki3jn1mSrJYJ/nbgPIBFtBpA4ZQcUDyCnfoNBCOiJyXhOEn01mqv6inMrTGQ+wkTztlmmnawelq1FgXMwC4Xek5/KOlLonH6MAaeQRUllV4lyyGwF/lr4ezJUD2W8EP/DOFKhL3oosdSSNtcIb5hPHPW+mFUtRnorrWhbcO67RvRy7kdGP83C0inX0KfIJy4P5c/h170t4EuP2J83ZTKw64WeRdtUHxkpa80zmIcHr2zr5BZbV2/mkfRFp9LJHSzyz0orUOmsQY3XBdOSIVHv8EHa/xWVEp3dnoBJ4URhMk7K5pOKncPcqFVYZDluDFgcE13BuehfbNv8UUNNDnYCrw7Ywot4JwEJIPHC5o3V3YJIpdXTkmJCXJocdl6VAkHJNR90fgd0VLtqQUT9dKfJxsCn459rx4xIV7W7RjEUUH//S77AHYvT5jMMs4e0u/fNl9CAh5wf7sI2VA94BsbYa/9e14JUs9NMdOvU07hy/pIgUpJ2ZW5a86pff/PSR9hnOWNcdK5cRZ3fJP8u29wOn5I+tjVx5pv/gA=&amp;lt;/diagram&amp;gt;&amp;lt;/mxfile&amp;gt;&quot; style=&quot;background-color: rgb(255, 255, 255);&quot;&amp;gt;&amp;lt;defs/&amp;gt;&amp;lt;g transform=&quot;translate(0.5,0.5)&quot;&amp;gt;&amp;lt;rect x=&quot;0&quot; y=&quot;0&quot; width=&quot;120&quot; height=&quot;60&quot; fill=&quot;none&quot; stroke=&quot;#00ffff&quot; pointer-events=&quot;none&quot;/&amp;gt;&amp;lt;g transform=&quot;translate(25.5,10.5)&quot;&amp;gt;&amp;lt;switch&amp;gt;&amp;lt;foreignObject style=&quot;overflow:visible;&quot; pointer-events=&quot;all&quot; width=&quot;68&quot; height=&quot;38&quot; requiredFeatures=&quot;http://www.w3.org/TR/SVG11/feature#Extensibility&quot;&amp;gt;&amp;lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display: inline-block; font-size: 8px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 68px; white-space: normal; word-wrap: normal; text-align: center;&quot;&amp;gt;&amp;lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;display:inline-block;text-align:inherit;text-decoration:inherit;&quot;&amp;gt;&amp;lt;font style=&quot;font-size: 17px&quot;&amp;gt;&amp;lt;b&amp;gt;SVG ÖRNEK&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/foreignObject&amp;gt;&amp;lt;text x=&quot;34&quot; y=&quot;23&quot; fill=&quot;#000000&quot; text-anchor=&quot;middle&quot; font-size=&quot;8px&quot; font-family=&quot;Verdana&quot;&amp;gt;[Not supported by viewer]&amp;lt;/text&amp;gt;&amp;lt;/switch&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&lt;/p&gt;
&lt;p&gt;Bu Html örneğini bir text editörde HTML olarak kaydettiğimizde karşımızda şu ekran gelecektir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_svg.jpg&quot; alt=&quot;svg Örnek&quot; /&gt;&lt;/p&gt;
&lt;p&gt;İlk bakışta çok fazla metin resimle aynı yer kapladığı düşünülebilir ama durum böyle değildir. Text tabanlı olan bu html kodunun boyutu çok daha küçüktür.&lt;/p&gt;
&lt;p&gt;Bu konuyla ile ilgili örnek uygulamalara W3School tutorial sitesinde ulaşmak mümkündür. Belli animasyonlar yapmak da mümkündür. https://www.w3schools.com/graphics/svg_intro.asp&lt;/p&gt;
&lt;p&gt;Sonuç olarak bu gibi yöntemleri kullanarak en iyi şekilde SEO ayarlarını ve site hızlandırma işlemlerinden bazılarını yapmak mümkündür. Ne kadar küçük dosya demek o kadar hızlı yükleme anlamına gelmektedir.&lt;/p&gt;
</content:encoded></item><item><title>Makine Öğrenmesi – Öznitelikler ve Seçimi</title><link>https://fuwari.vercel.app/posts/makine-ogrenmesi-oznitelikler/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/makine-ogrenmesi-oznitelikler/</guid><description>Merhaba bu yazımı [makine öğrenmesi öğrenme süreci](https://blog.berkarat.com/ogrenme-ve-lineer-regresyon/) konusunun devamı olacak şekilde anlatacağı</description><pubDate>Sat, 10 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_makine-%C3%B6%C4%9F.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_makine-%C3%B6%C4%9F-696x492.jpg&quot; alt=&quot;makine öğrenmesi&quot; title=&quot;makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımı &lt;a href=&quot;https://blog.berkarat.com/ogrenme-ve-lineer-regresyon/&quot;&gt;makine öğrenmesi öğrenme süreci&lt;/a&gt; konusunun devamı olacak şekilde anlatacağım. Bu seferki konumuzda makine öğrenmesi içerisinde özniteliklerin seçimi, tipleri ve nerelerde kullanıldığı gibi temel konulara değineceğim.&lt;/p&gt;
&lt;h1&gt;Öznitelikler ve Seçimi&lt;/h1&gt;
&lt;p&gt;Makine öğrenmesi için en kritik süreçlerden birisi de öznitelik seçimidir. Bir durumun ya da olgunun ölçülebilen ve anlamlandırılmış bir özelliğine &lt;em&gt;&lt;strong&gt;öznitelik&lt;/strong&gt;&lt;/em&gt; denir. Matematik olarak ise lineer modeldeki Y değişkenine sonuç Xm değişkenine ise &lt;em&gt;&lt;strong&gt;öznitelik&lt;/strong&gt;&lt;/em&gt; denir. Modelin başarısı için çok önemlidir. Seçilen nitelikler tahmin edilmek istenen durumu temsil ederken bazıları etmez. Hiçbir etkisi olmayabilir veya bozucu etkisi bile olabilir.  X1 , X2,…Xn öznitelikler serisi veya öznitelik vektörü tahmin edilmeye çalışan durumu tahminize eder ve bu seri Y’nin ( sonucun) tahmininde kullanılır. Öznitelikler temel, birleşik, ortak etki eden ve tekrarlanan öznitelikler olarak 4 tanedir.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temel öznitelikler&lt;/li&gt;
&lt;li&gt;Birleşik öznitelikler&lt;/li&gt;
&lt;li&gt;Ortak etki eden öznitelikler&lt;/li&gt;
&lt;li&gt;Tekrarlanan öznitelikler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_Makine-%C3%B6%C4%9Frenmesi-300x200.jpg&quot; alt=&quot;Makine öğrenmesi&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;1-Temel Öznitelikler&lt;/h2&gt;
&lt;p&gt;Sonucu veya problemi karakterize eden orijinal özellikler temel öznitelik kümesini oluşturur. Örneğin, yarınki hava durumunu tahmin etmek istiyorsak bugünkü hava durumunu ve nem ölçüm değerlerini almamız gerekir. Bu tipteki öznitelikler temel özniteliklerdir. Temel özniteliklerin seçiminde uzman desteği alınması gerekir. Aynı zamanda problemi de tanımlar. Temel özniteliklerin problemin doğası ile doğrudan alakalı olduğu varsayılır.&lt;/p&gt;
&lt;p&gt;Temel öznitelikler 3 kategoride olabilir.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kategorik (kötü/orta/iyi)&lt;/li&gt;
&lt;li&gt;Sayısal(2000tl maaş gibi)&lt;/li&gt;
&lt;li&gt;Binary ( true/false veya 1/0 gibi)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Temel öznitelikler sonuç ya da durumla alakalı olmalıdır. Tekrarlanabilir şekilde veri sağlamalıdır.&lt;/p&gt;
&lt;h2&gt;2-Birleşik Öznitelikler&lt;/h2&gt;
&lt;p&gt;Temel öznitelikler bir çok durumda dar bir model sağlar. ( Yarının hava sıcaklığı tahmini için nem ve basıncın bilinmesi gibi ) Bu durum problemin sonucunun tahmin edilmesini olumsuz etkiler. Temel öznitelik vektörüne temel özniteliklerle lineer olmayan ancak fonksiyonel şekilde bağlı olan birleşik öznitelikler adını verdiğimiz parametreler eklenebilir.&lt;/p&gt;
&lt;h2&gt;3-Ortak Etki Eden Öznitelikler&lt;/h2&gt;
&lt;p&gt;İki ya da daha çok faktör beraber çalışır ve sonucu farklı şekilde etkileyebilirler. Örneğin kredi başvurusu yapan bir kişinin yaşadığı yer ve gelir durumu sonuca ortak etki eder ancak farklı şekilde etkileyebilirler.&lt;/p&gt;
&lt;h2&gt;4-Tekrarlanan  Öznitelikler&lt;/h2&gt;
&lt;p&gt;Bazı öznitelikler ortaya çıkan durum ve sonuca aynı etkiyi yaptıkları halde öznitelik vektöründe bulunabilirler. Örneğin yaş ve doğum tarihi bilgisinin ikisinin birden öznitelik vektöründe bulunması tekrarlanan etki öznitelikleri olarak tanımlanır sonuca aynı derecede etki eder. Ancak ikisinin toplamı değil bir tanesinin etkisi dikkate alınır. Ancak aynı etkiyi yapmayan fakat birbirine çok yakın olan yani sonuca etkileri arasında çok az bir fark bulunan öznitelikler bulunduğunda model sonucu en iyi kategorize eden özniteliği seçer. Diğer özniteliğe düşük katsayı değeri atayarak devre dışı bırakır.&lt;/p&gt;
&lt;h1&gt;Öz Niteliklerin Normalizasyonu&lt;/h1&gt;
&lt;p&gt;Bu işlemin ana fikri tüm özniteliklerin benzer olmasını sağlamaktır. Sayısal büyüklük açısından farklılık gösteren öznitelikler sonucun elde edilmesine olumsuz etki yapabilir.  Öznitelikler içerisindeki aşırı dalgalanmalar, aykırılıklar matematiksel işlemlerle giderilmeye çalışılır. Örneğin sıcaklık ve basınç değerleri büyüklük açısından farklılık gösterir. Özniteliklerin normalleşmesinde sayısal değerlerde bölme işlemi yapılabilir. Öznitelik değerlerinden ortalama değerleri çıkarmak ve standart sapmasına bölmek sık kullanılan ikinci bir yöntemdir. Veri karmaşıklığını engeller. Normalizasyon yöntemlerini kullanarak yapılan işlemler sonucunda lineer model bu durumdan etkilenmez.&lt;/p&gt;
</content:encoded></item><item><title>Makine Öğrenmesi Öğrenme ve Lineer Regresyon</title><link>https://fuwari.vercel.app/posts/ogrenme-ve-lineer-regresyon/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/ogrenme-ve-lineer-regresyon/</guid><description>Merhabalar bu yazıda  [Makine Öğrenmesi Giriş](https://blog.berkarat.com/makine-ogrenmesi-giris/) isimli sayfada bahsettiğimiz konuların devamı niteli</description><pubDate>Fri, 09 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_machine_learning-min.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_machine_learning-min-696x492.jpg&quot; alt=&quot;machine learning&quot; title=&quot;makine öğrenmesi&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar bu yazıda  &lt;a href=&quot;https://blog.berkarat.com/makine-ogrenmesi-giris/&quot;&gt;Makine Öğrenmesi Giriş&lt;/a&gt; isimli sayfada bahsettiğimiz konuların devamı niteliğinde bir yazıyla devam edeceğim. Lineer regresyon ve öğrenme yöntemlerinin neler olduğuna değinip avantaj ve dezavantajlarından bahsedeceğim.&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Makine Öğrenmesi Öğrenme Süreci&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Tanım-1 Verileri ve algoritmaları kullanarak karar modeli oluşturma sürecine &lt;strong&gt;eğitim&lt;/strong&gt;, sistemin istenilen başarıyı verecek hale getirilmesi durumuna da &lt;strong&gt;öğrenme&lt;/strong&gt; denir.&lt;/p&gt;
&lt;p&gt;Tanım-2: Eğitim verileri ve algoritmaları kullanılarak gerçekleştirilen işlemlere &lt;strong&gt;eğitim&lt;/strong&gt;, modelin ortaya çıkmasıyla sonuçlanan duruma &lt;strong&gt;öğrenme&lt;/strong&gt; denir.&lt;/p&gt;
&lt;p&gt;Karar modeli oluşturmak için genel olarak iki öğrenme yöntemi vardır.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Denetimli öğrenme   (Supervised learning)&lt;/li&gt;
&lt;li&gt;Denetimsiz öğrenme (Unsupervised learning)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Denetimli Öğrenme (Supervised Learning)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Bir durumu etkileyen parametrelerin ve bu duruma bağlı olarak durumun nasıl sonuçlandığı bilgisini öğrenen sisteme aktarıp karar modeli oluşturmasını sağlamak bu yöntemin temel felsefesidir. Sınıflar önceden belirlenmiştir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_denetimli-%C3%B6%C4%9Frenme-min-1024x354.png&quot; alt=&quot;denetimli öğrenme&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Denetimli Öğrenmenin Özellikleri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;En yaygın uygulanan öğrenme yöntemidir.&lt;/li&gt;
&lt;li&gt;Olayların,parametrelerin çıktıları eğitim verisinde bulunur.&lt;/li&gt;
&lt;li&gt;Var olan olayların örnekleri kullanılarak makine öğrenmesi sistemi tarafından en genel karar modeli kurulmaya çalışılır. Tüm sürüm uzayı temsil eder.&lt;/li&gt;
&lt;li&gt;Bu öğrenme yönteminde temel amaç girdileri ve çıktıları belli olan geçmiş olay örneklerini kullanarak gelecek durumlar için sonucu tahmin etmektir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Denetimsiz Öğrenme (Unsupervised Learning)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Olayların,durumların örnekler önceden bilinir ama onlara karşılık gelen sonuçlar yani sınıflar önceden bilinmez.&lt;/p&gt;
&lt;p&gt;Denetimsiz öğrenmede temel amaç eldeki verilerden ortaya bir model veya örüntü( pattern) çıkarmak için sistemi algoritmalarla eğitmektir.&lt;/p&gt;
&lt;p&gt;Eldeki verinin yapısını belirlemek üzere sınıflara ayırma işlemine &lt;strong&gt;kümeleme(clustering)&lt;/strong&gt;, ortaya çıkan sınıflara &lt;strong&gt;küme&lt;/strong&gt; denir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_k%C3%BCmeleme-300x201.png&quot; alt=&quot;kümeleme&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kümeleme verilerin yakınlık uzaklık benzerlik gibi ölçütlere göre analiz edilerek sınıflara ayrılması işlemidir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_denetimsiz-%C3%B6%C4%9Frenme-min.png&quot; alt=&quot;denetimsiz öğrenme&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Denetimsiz öğrenmenin özellikleri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Var olan girdilere karşı çıktılar yoktur ( sınıflar önceden belli değildir. )&lt;/li&gt;
&lt;li&gt;Algoritmaların verilerde var olan örüntüyü bulması beklenir.&lt;/li&gt;
&lt;li&gt;Verilerin kümeleme yöntemiyle analizi sık yapılır.&lt;/li&gt;
&lt;li&gt;Burada amaç veri kaç gruba ayrılabilir, hangi parametre belirleyicidir vb. gibi sorulara cevap bulmaktır.&lt;/li&gt;
&lt;li&gt;Örneğin bir marketin kaç çeşit müşteri grubu olduğunu öğrenmek istemesi problemi bu yöntemle çözülebilir. Bu sayede günlük indirimler yapılabilir. Pazar günleri sabahları kahvaltı yapan insan sayısı daha çoktur ve süt ürünlerinde indirime gidilmesi gibi örnekler çoğaltılabilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;strong&gt;Lineer Regresyon(Linear Regression)&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Regresyon&lt;/strong&gt;: iki veya daha fazla değişken arasındaki ilişkiye denir. Bu ilişkinin düzeyini, kapsamını ölçme işine de regresyon analizi denir.&lt;/p&gt;
&lt;p&gt;Parametreler arasındaki ilişkiyi fonksiyon olarak elde etmek gerekir. Parametreler birbirinden bağımlı veya bağımsız olabilir.Lineer regresyonun anacı parametreler arasındaki ilişki fonksiyonunu elde etmektir. En basit makine öğrenme modelidir. Temel felsefe neden ve sonuç arasında lineer ilişki olup olmadığını belirlemektir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_qq-min-300x198.jpg&quot; alt=&quot;lineer regresyon&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Öğrenme sürecinde uygun modelin oluşturulması demek eğitim kümesini kullanarak hipotez fonksiyona en uygun parametrelerin seçilmesi demektir. Önceden var olan veriler hipotezdeki uygun parametreleri seçmemizi ve gelecekte farklı X girdilerine karşılık tahmin yapabilmemizi sağlayacaktır. Hipotez fonksiyonu bir ya da birden fazla parametreye bağlı olabilir.&lt;/p&gt;
&lt;p&gt;Lineer modeller ilişkisel yeni neden sonuç modellerdir. Belirli neden parametrelerinin listesi(x1,x2…) için bir sonuç yanı Y tahmin edilmeye çalışılır. Aralarında lineer ilişki bulunan durumları analiz etmek bu modelle mümkündür.&lt;/p&gt;
&lt;h2&gt;Lineer Modelin Avantajları&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Teorisi çok iyi geliştirilmiştir, özellikleri ve davranışları iyi bilinir.&lt;/li&gt;
&lt;li&gt;Parametrelerin tahmini ve problemlere göre geliştirilmesi kolaydır.&lt;/li&gt;
&lt;li&gt;Çok geniş ve çeşitli ilişkiler ifade edilebilir.&lt;/li&gt;
&lt;li&gt;Spesifik veriler için tahmin problemi büyük olasılıkla çözümlenebilir.&lt;/li&gt;
&lt;li&gt;Yüz binlerce parametre ve faktör içeren lineer modeller bilgisayar ile kurmak mümkündür.&lt;/li&gt;
&lt;li&gt;Lineer olmayan parametreler geçici değişkenler tanımlanarak standart bir şekile dönüştürülür.&lt;/li&gt;
&lt;li&gt;Genişletilmiş veri kümesinde ilişki tespiti için lineer model kullanılabilir.&lt;/li&gt;
&lt;li&gt;Modelde lineer olmayan parametreler varsa bu parametreler değişkenlerden hesaplanıp veri kümesine eklenmelidir.&lt;/li&gt;
&lt;li&gt;Lineer modelinde sınıflandırma probleminde doğrusal bir sınıf sınırı oluşturulur.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Github Proje Yükleme</title><link>https://fuwari.vercel.app/posts/github-proje-yukleme/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/github-proje-yukleme/</guid><description>_📌 Güncelleme (Ağustos 2026): GitHub Desktop ve GitHub arayüzü değişmiş olsa da repository oluşturma, commit ve push mantığı aynı kaldığı için adımla</description><pubDate>Mon, 05 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_gt.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_gt-696x365.png&quot; alt=&quot;github dpsya yükleme&quot; title=&quot;github&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;📌 Güncelleme (Ağustos 2026): GitHub Desktop ve GitHub arayüzü değişmiş olsa da repository oluşturma, commit ve push mantığı aynı kaldığı için adımlar güncel notlarla korunmuştur.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Merhabalar Github yazılım alanıyla ilgilenenler için olmazsa olmaz bir platformdur. Bu platformda bir çok program örnekleri depolamamızı ve paylaşılanlara ulaşmamızı sağlar. Githuba dosya yükleme işlemini resimli ve adım adım işleyerek anlatacağım. Bu yöntem şu ana kadar kullandığım ve en basit yöntemdir. Ancak kendinizi geliştirmeniz için diğer yükleme yöntemlerini de denemenizi öneririm.&lt;/p&gt;
&lt;h2&gt;1.Adım&lt;/h2&gt;
&lt;p&gt;Aşağıdaki linkten gitHub masaüstü programını indiriyoruz. Kurulumunu yapıyoruz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://desktop.github.com&quot;&gt;GitHub masaüstü uygulaması&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2. Adım&lt;/h2&gt;
&lt;p&gt;Desktop uygulmasını açıyoruz ve File&amp;gt;Options kısmına tıklıyoruz. Güncel GitHub Desktop sürümlerinde giriş işlemi kullanıcı adı/şifre ekranı yerine tarayıcı üzerinden GitHub hesabını yetkilendirme şeklinde yapılmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-1.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Giriş yaptığımıza göre artık dosya yüklemeye geçebiliriz.&lt;/p&gt;
&lt;h2&gt;3.Adım&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/login&quot;&gt;https://github.com/login&lt;/a&gt; sitesine girip buraya da giriş işlemini yapıyoruz.&lt;img src=&quot;/wp-images/2018_02_1-2.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4.Adım&lt;/h2&gt;
&lt;p&gt;Sağ üstten profil resmimizin yanıdaki ok işaretine tıklayıp Your Profile seçeneğini seçiyoruz.&lt;/p&gt;
&lt;p&gt;Gelen ekranda yukarıdaki menüde Repositories kısmını tıklıyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-3.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 3&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;5.Adım&lt;/h2&gt;
&lt;p&gt;Gelen ekranda Repository Name kısmına depolama alanı olarak adlandırıyor ve istediğmiz bir ismi vereceğiz. Ben deneme adını vereceğim. Description açıklama kısmıdır ve isteğe bağlı olarak boş bırakılabilir.&lt;/p&gt;
&lt;p&gt;Public seçeneği seçili ancak private seçeneği de mevcut. Güncel GitHub hesaplarında private repository oluşturmak ücretsiz olarak mümkündür; ekip, kurumsal yönetim ve gelişmiş güvenlik gibi özellikler için ücretli planlar gerekebilir. Biz public olarak devam edeceğiz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-4.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Initialize this repository with a README  kısmını ise işaretlemek zorunda değiliz. Ancak önerilen bizim o kısmı işaretlememiz. Genelde readme kısmı olan projeler daha saygınlık görür ve programın kullanımını kim tarafından yapıldığı gibi açıklama kısımları eklenir.&lt;/p&gt;
&lt;p&gt;Add .gitignore kısmını ise yazdığımız proje hangi dilde ise o dili seçme imkanı sunuyor (C,Java,Php vb.) Ancak none olarak da bırakabilirsiniz. Add a licence kısmı da aynı şekilde linsans belirtmek için bir seçim kısmı bunu da none olarak işaretleyip devam ediyoruz.&lt;/p&gt;
&lt;p&gt;Son olarak Create Repository seçeneğini seçiyoruz.&lt;/p&gt;
&lt;h2&gt;6.Adım&lt;/h2&gt;
&lt;p&gt;Karşımıza deneme adıyla oluşturduğumuz depolama sayfası geldi sağda bulunan Clone or download seçeneğini ardından gelen uyarı çubuğunda da open in desktop seçeneğini seçiyoruz ardından yukarıdan gelen kısımda uygulamayı aç diyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-5.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 5&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;7.Adım&lt;/h2&gt;
&lt;p&gt;Uygulamayı aç dedikten sonra masaüstü programımızda ekran belirecek ve  Clone seçeneğini seçiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-6.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 6&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;8.Adım&lt;/h2&gt;
&lt;p&gt;Artık en kolay kısma gelmiş bulunuyoruz&lt;/p&gt;
&lt;p&gt;Tek yapmamız gereken C:BelgelerGitHub dizinine gittiğimizde deneme adında bir klasörümüzün oluştuğunu göreceksiniz. Buraya yüklemek istediğiniz projenin kodlarını veya herhangi bir şeyi yükleme yapabilirsiniz. Ben deneme olduğundan deneme.h biçiminde bir C++ program dosyası yollayacağım. Sizler istediğiniz şeyi yükleyebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-7.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 7&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;9.Adım&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-10.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 8&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Artık masaüstü uygulamamıza döndüğümüz zaman bu ekranla karşılaşıyoruz. Summary kısmına konu başlığı description kısmına da açıklama yazıyoruz. Tabii bu isteğe bağlı boş da bırakılabilir. Ardından Commit to master/main seçeneğini seçiyoruz. Son olarak GitHub Desktop üzerinde görünen Push origin veya Publish branch seçeneğiyle değişiklikleri GitHub’a gönderiyoruz; eski ekranlarda Fetch origin yazısı da görülebilir. Ve yükleme işlemi tamamlanmış oluyor.&lt;/p&gt;
&lt;p&gt;Resimde görüldüğü gibi artık projemizi GitHub hesabına yüklemiş bulunuyoruz. Böylece projelerinizi internette depolama ve paylaşma imkanı buluyoruz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_1-9.png&quot; alt=&quot;Github Proje Yükleme ekran görüntüsü 9&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Makine Öğrenmesine Giriş</title><link>https://fuwari.vercel.app/posts/makine-ogrenmesi-giris/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/makine-ogrenmesi-giris/</guid><description>Bilgisayarların örnek verileri veya deneyimleri kullanarak belli şartlara göre başarılı sonuçlar verecek şekilde programlanmasına makine öğrenmesi(mac</description><pubDate>Sun, 04 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_machine_learning.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_machine_learning-696x492.jpg&quot; alt=&quot;makine öğrenmesine giriş&quot; title=&quot;machine learning&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Makine öğrenmesi nedir? Makine öğrenmesine neden ihtiyaç duyarız?&lt;/h1&gt;
&lt;p&gt;Bilgisayarların örnek verileri veya deneyimleri kullanarak belli şartlara göre başarılı sonuçlar verecek şekilde programlanmasına makine öğrenmesi(machine learning) diyoruz.&lt;/p&gt;
&lt;p&gt;İnsan beyninin ilk bakışta göremediği büyük hacimli veri kümeleri ( big data) arasındaki ilişkileri belirli algoritmalar yardımıyla analiz ederek ve öğrenerek ortaya çıkarması için öğrenen makinelere ihtiyaç duyarız.&lt;/p&gt;
&lt;h2&gt;Avantajları ve Yetenekleri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Uzmanların yetersiz olduğu noktalarda karar organlarına yardımcı olabilir.&lt;/li&gt;
&lt;li&gt;Sürekli çalışır halde ve hızlıdırlar.&lt;/li&gt;
&lt;li&gt;Yeni eğitim verileriyle kendini güncelleyebilir.&lt;/li&gt;
&lt;li&gt;Daha önce karşılaşmadığı durumlar icin sonuç üretebilirler.Modeli değiştirebilirler.&lt;/li&gt;
&lt;li&gt;Karmaşık veriler arasındaki ilişkileri bulabilir veya iç içe geçmiş verileri kümeleyebilir.&lt;/li&gt;
&lt;li&gt;İstatiksel sonuçlar dışında öngörülemeyen sonuçlar bulurlar.&lt;/li&gt;
&lt;li&gt;Matematiksel veya başka yöntemlerle modellenemeyen yöntemleri istatistik kullanarak inceleme ve çözümleme yoluyla modelleyebilirler.&lt;/li&gt;
&lt;li&gt;Görüntü, ses vb. verilerle çalışabilir ( plaka tanıma, duygu analizi vb.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Eksik veya Zayıf yönleri&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Modeller sonuçlar üretse de kesinlik yoktur. Tahmin vardır. Bu yüzden sonuçların değerlendirilmesi işleme alınıp alınmaması veya model güncellenmesi icin insana ihtiyaç vardır.&lt;/li&gt;
&lt;li&gt;Veri miktarı çok olsa da ortaya bir model çıkmayabilir. Yanlış eğitim verileri hatalı öğrenmeye neden olabilir.&lt;/li&gt;
&lt;li&gt;Modeli kurulan durumun değişmesi halinde tekrar eğitime ihtiyaç duyar.&lt;/li&gt;
&lt;li&gt;Çok büyük verilerle çalısması gerektiğinde işlemci,ram,hard disk vb. donanım yetersizliği sorunu yaşanabilir.&lt;/li&gt;
&lt;li&gt;Bazı yapay zeka teknikleri eksik verilerle çalışabilirken (yapay sinir ağları), bazıları bunu yapamayabilir.&lt;/li&gt;
&lt;li&gt;Performansı optimum seviyede olan modeli elde etmek için çok sayıda algoritma, işlemsel süreç denemek gerekebilir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_DQqcaCXUMAALPH0.jpg&quot; alt=&quot;makine öğrenmesi &quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Makine öğrenmesi işlem süreci :&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Veri koleksiyonu oluşturma&lt;/li&gt;
&lt;li&gt;Veri temizleme ve düzenleme&lt;/li&gt;
&lt;li&gt;Makine öğrenmesi araçlarının kullanımı&lt;/li&gt;
&lt;li&gt;Sonuçların değerlendirilmesi&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1.Veri koleksiyonu oluşturma&lt;/h2&gt;
&lt;p&gt;Bu konu veri madenciliği biliminin kapsamına girer. Veriler dijital bir dosya olabileceği gibi ( .csv( virgülle ayrılmış değerler) .txt .xsl .raw vb. ), fiziksel ortamlarda da bulunabilir.&lt;/p&gt;
&lt;p&gt;Dijital veri depolama ortamlarındaki kapasite artışı veri üreten, saklayan yazılım ve donanımların sayısındaki artış elektronik aygıtların maliyetlerindeki düşüş ve buna bağlı olarak yaygınlaşması büyük veriyi ( big data) ortaya çıkarmıştır.&lt;/p&gt;
&lt;p&gt;Büyük verinin işlenerek kullanılabilir haldeki veri koleksiyonuna dönüştürülmesi veri madenciliği biliminin konusudur.&lt;/p&gt;
&lt;h2&gt;2.Veri temizleme ve düzenleme&lt;/h2&gt;
&lt;p&gt;Bu aşama da veri madenciliği disiplini ile ilgilidir.Verilerdeki tutarsızlıklar, hatalar vb. ortaya çıkacak makine öğrenmesi sonucunu olumsuz etkileyen her türlü durumun giderilmesi bu aşamada gerçekleştirilir. Bu işlemler günümüzde insan kontrollü yapıldığı gibi yazılımlar aracılığıyla da yapılmaktadır.&lt;/p&gt;
&lt;h2&gt;3.Makine öğrenmesi araçlarının kullanımı&lt;/h2&gt;
&lt;p&gt;Makine öğrenmesi bilimi istatistik, matematik,bilgisayar mühendisliği bilimleriyle derin bir işbirliği içerisindedir. Bu bilim dallarının sahip olduğu yetenekler bir araya getirilerek veri koleksiyonları içerisindeki kuralları araştıran fonksiyon elde etmeyi amaçlayan kısacası uzmanların sahip olduğu değerlendirme ve karar verme yeteneklerini ortaya çıkaran her türlü yazılım araçlarıdır.&lt;/p&gt;
&lt;h2&gt;4.Sonuçların değerlendirilmesi&lt;/h2&gt;
&lt;p&gt;Bu aşamada ortaya çıkan makine öğrenmesi temelli modelin istenilen başarıyı verip vermediği kullanılabilirliği gerçek dünyaya uygulanabilirliği vb. yeterlilikleri değerlendirilir ve tartışılır. Makine öğrenmesi modelinin değerlendirilmesinde istatiksel veriler temel alınır. Bu sonuçlara göre sistemin eğitimine devam edilebilir( yeni veriler eklenerek ) veya önceki adımlara geri dönülebilir, eğitimine devam edilir.&lt;/p&gt;
</content:encoded></item><item><title>Yazılım Dünyasına Giriş ve Bazı Temel Kavramlar</title><link>https://fuwari.vercel.app/posts/yazilima-giris/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/yazilima-giris/</guid><description>Merhaba bu yazımızda genel olarak yazılım ve programlama dünyasına yeni adım atmış kişilerin karşılaşacağı temel kavramlar ve yanlış öğrenilmiş hatala</description><pubDate>Sat, 03 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_diller.png&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_diller-696x402.png&quot; alt=&quot;Programlama dilleri&quot; title=&quot;Yazılım dilleri&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba bu yazımızda genel olarak yazılım ve programlama dünyasına yeni adım atmış kişilerin karşılaşacağı temel kavramlar ve yanlış öğrenilmiş hataları düzeltmek amacıyla bir kaç noktaya değinmek istiyorum&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Program Nedir ?&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Bilgisayar için düşünürsek belli başlı işleri yaptırmak için yazdığımız komutların toplamına program denir. Program olarak çok büyük programları düşünmemize gerek yok aslında. En basit olarak bilgisayarımızı belli bir süre sonra kapatmanması için cmd kısmından yazılıp bu komut satırının bir exe olarak kaydedilmesiyle en basit bir programı hazırlamış olduk. Bu komutlar da belli programlama dilleri ile yapılmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_2018-02-03_16-04-44.png&quot; alt=&quot;shutdown cmd&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;IDE ve Derleyici Arasındaki Fark Nedir?&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Genellikle en çok karıştırılan bu iki kavram aslında birbirinden farklı şeylerdir. Yazdığımız kod parçacığı genellikle latin harfleri ve belli kalıplara (syntax) uygun şekilde yazılır. Ancak bilgisayar ve bütün elektronik cihazlar bizim yazdığımız dili yorumlama kabiliyeti yoktur. Bütün elektronik cihazlar makine dili dediğimiz 1 ve 0 ile çalışır. Bu yüzden bu yazdığımız kod parçacığının makine diline çevrilmesi gerekmektedir. Bu çevirme olayı için derleme kavramını kullanıyoruz. Sadece yazdığımız kodu makine diline çeviren programlara derleyici diyoruz. IDE (Integrated Development Environment) ise içerisinde derleyici programı da bulunduran aynı zamanda ekstra kod yazmayı kolaylaştırıcı otomatik tamamlama veya hata bulma gibi işlemleri de yapabilen kullanıcının rahat etmesi için oluşturulmuş programlardır. Örneğin Microsoft Visual Studio bir IDE’dir.&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Algoritma Nedir ?&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Algoritma en basit tanımıyla yapılacakların sıralama listesidir. Nasıl ki bir kek yapımında belli tarifler var ve sırayla yapılması gerekiyorsa aynı mantık programlamada da geçerlidir. Algoritma kavramı 750-830 yılları arasında Bağdat’da yaşamış matematikçi Harezmî tarafından ortaya atılmıştır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_algor-292x300.png&quot; alt=&quot;algoritma tek çift&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Algoritma bir sorunun nasıl çözüleceğine adım adım yaklaşmak için bir bilgisayar programcısının mutlaka bilmesi gereken bir kavramdır. Algoritma kurmadan programlama yapmak yanlıştır. Bu sayede oluşturduğu programı belli algoritmalar ile oluşturur. Eğer belli bir sıralama ile yapılmazsa bu kod anlaşılırlığını yitirir ve ilerde güncelleme yapmak istenildiği zaman karmaşıklığa yol açar, bir sorunla karşılaştığında bu sorunu çözmesi çok zaman alacaktır.&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Hangi Dili Öğrenmeliyim ?&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Yazılım dünyasına giriş yapanların en çok merak ettiği soruların başında gelir. Hangi dili öğrenirsem işime yarar. Buna benim vereceğim cevap ise dil öğrenme algoritma ve programlama yapısını öğren olacaktır. Eskiden sadece 1-2 tane programlama dili vardı ve onlara göre programlar yazılıyordu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_diller-300x173.png&quot; alt=&quot;programlama dilleri&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ancak geçtiğimiz 10 yıl içerisinde bir çok dil ortaya çıktı ve halen de çıkmaya devam etmektedir. Bu sebeple özel bir dil seçip o dilde kendini geliştirmek kişiyi geliştirici bir durum değildir. Bir dil öğrenmek yerine “öğrenmeyi öğrenmek” kavramıyla yaklaşırsa öğrenemeyeceği bir programlama dili yoktur. Bugün bir çok büyük internet siteleri, işletim sistemleri( linux,mac vs.) tek bir dil üzerinden değil her dilin kendi avantajlarını uygun duruma adapte ederek birbirleriyle uyumlu bir şekilde düzenleyerek kullanmaktadır.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hep duyduğum bir diğer konu ise web alanında mı, masaüstü uygulamalar mı yoksa mobil  uygulama mı öğrenmeliyim ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu sorunun cevabını aslında verecek olan insanın ilgi alanıdır. Önce hangi alan ilgisini çekiyorsa onda uzmanlaşması gerektiğine inanıyorum. Bu alanları nasıl anlayacağını da yukarıda bahsettiğim gibi tek bir dil yerine farklı dilleri öğrenerek farklı alanlarda projeler geliştirerek karar vermeli.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_vs-300x217.png&quot; alt=&quot;masaüstü uygulama mı mobil uygulama mı &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Günümüzde mobil teknolojisi çok revaçta ancak bu demek değil ki diğer alanlar yok olacak. Basit bir mantıkla düşünürsek mobil uygulama ile web uygulamasını kullanıyor. Facebook uygulamasını telefondan facebook.com sitesine giriş için kullanıyoruz veya akıllı ev sistemlerinde mobil teknoloji aracılığı ile gömülü sistemleri kontrol ediyoruz. Aslında hepsi birbirleriyle bağlantılı tek sorun hangisi ilgini çekecek ve araştırmaktan geliştirmekten zevk alacaksın.&lt;/p&gt;
</content:encoded></item><item><title>Youtube Go Kurulumu ve Çevrimdışı Video İzleme</title><link>https://fuwari.vercel.app/posts/youtube-go-kurulumu/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/youtube-go-kurulumu/</guid><description>Merhaba arkadaşlar bu yazımızda Youtube şirketinin yeni çıkarttığı bir uygulama olan Youtube Go’dan bahsedeceğiz.</description><pubDate>Fri, 02 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Merhaba arkadaşlar bu yazımızda Youtube şirketinin yeni çıkarttığı bir uygulama olan Youtube Go’dan bahsedeceğiz.&lt;/p&gt;
&lt;p&gt;Google şirketinin Youtube’u satın almasından sonra Youtube bir çok konuda kendini geliştirdi. Ancak kullanıcıların en çok şikayet ettiği şeylerden birisi videoları indirememek ve çevrimdışı izleyememekti. Kullanıcılar videoları indirmek için ek bir uygulama yükleyerek 3.parti yazılımlarla indirmekteydi.&lt;/p&gt;
&lt;p&gt;Bu sorunu gören google yetkilileri bir süre önce beta sürüm olarak Youtube Go uygulamasını çıkarmıştı. Şimdi ise tam sürüm olanı piyasaya sürdü. Ancak şu an için sadece Android cihazlarda çalışan uygulama Google Play Store üzerinden ulaşmak mümkün. Yakın zamanda da ios cihazlarda da kullanıma çıkacaktır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_ytb-300x142.jpg&quot; alt=&quot;Youtube go&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Uygulamanın boyutu sadece 9.4 MB büyüklüğe sahip ve düşük rame sahip cihazlarda sorunsuz bir şekilde çalışmakta. Uygulama Türkiye ile birlikte 130 ülkede erişilebilir durumda.&lt;/p&gt;
&lt;p&gt;Uygulama bize videoları indirme seçeneği sunmanın yanı sıra videoların hangi kalitede indirileceğini de sorarak hafıza doluluk sorununa da bir nebze de olsa yardımcı olmuş. Ancak her videoyu indirmek mümkün değil bunun için video sahibinin videonun indirilebilir olmasına izin vermesi gerekmektedir.&lt;/p&gt;
&lt;h1&gt;Youtube Go’nun avantajları nelerdir?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;İstenilen videoyu indirme imkanı&lt;/li&gt;
&lt;li&gt;İndireceğimiz videonun boyutunu ve görüntü kalitesini seçme imkanı sunmaktadır.&lt;/li&gt;
&lt;li&gt;İndirdiğimiz videoları sd karta atarak çevrimdışı bir şekilde izleme imkanı sunmaktadır.&lt;/li&gt;
&lt;li&gt;Çevrenizdeki insanlara o videoyu paylaşma imkanı ( Bluetooth üzerinden)&lt;/li&gt;
&lt;li&gt;Android 4.1 sürümünden sonraki sürümlerde çalışır.&lt;/li&gt;
&lt;li&gt;Videoları ön belleğe almaya ihtiyaç duymadan anında çalıştırır.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Youtube Go Kurulumu- Play Store Üzerinden&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Play store hesabına giriş yapıyoruz ve arama kısmından Youtube Go uygulamasını bulup indir seçeneğini tıklıyoruz.&lt;img src=&quot;/wp-images/2018_02_1-169x300.png&quot; alt=&quot;Youtube go&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Uygulama indikten sonra açtığımızda karşımıza ilk çıkan ekran şöyle olacaktır.&lt;img src=&quot;/wp-images/2018_02_2-169x300.png&quot; alt=&quot;Youtube go&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Sonraki dedikten sonra karşımıza dil ekranı çıkıyor dil seçeneğini seçtikten sonra devam diyoruz.&lt;img src=&quot;/wp-images/2018_02_4-169x300.png&quot; alt=&quot;Youtube go kurulum&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Cep telefonu numaramızı giriyoruz ve tamam seçeneğini seçiyoruz. Bundan sonra telefonumuza  Google tarafından bir onay kodu gelecek. Bu onay kodunu giriyoruz.&lt;img src=&quot;/wp-images/2018_02_Screenshot_2018-02-02-15-58-02-169x300.png&quot; alt=&quot;Youtube go kurulum&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Bundan sonra uygulamamız kullanıma hazır.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Youtube Go apk ile kurulumu&lt;/h1&gt;
&lt;p&gt;İlk olarak bilgisayarımıza &lt;a href=&quot;http://tr.fobito.com/android/youtube-go&quot;&gt;Youtube-Go apk&lt;/a&gt; linkinden Youtube-go.apk dosyasını indiriyoruz. (Eğer zip dosyası halinde ise dışarıya çıkarmamız gereklidir.)&lt;/p&gt;
&lt;p&gt;Sonraki adım olarak Ayarlar&amp;gt;Güvenlik kısmından bilinmeyen kaynaklar seçeneğini işaretleyin bu sayede dışarıdan yüklenen .apk dosyasına izin vermiş olacağız.&lt;/p&gt;
&lt;p&gt;Ardından android telefonunu bilgisayarımıza bağlıyoruz ve apk dosyasını sd kart içine kopyalıyoruz.&lt;/p&gt;
&lt;p&gt;Not: apk dosyaları yüklemek için ekstra akpinstaller tipi uygulamalar da kullanabilirsiniz.&lt;/p&gt;
&lt;p&gt;Ardından telefonumuzda apk dosyasını yükle diyoruz ve program yüklenmiş oluyor. Geriye kalan adımlar yukarıda bahsettiğim adımların aynısını&lt;/p&gt;
&lt;h1&gt;Youtube Go Video İndirme&lt;/h1&gt;
&lt;p&gt;Hangi videoyu indireceğimizi seçtikten sonra video üzerine tıkladığımızda karşımıza indirme ekranı gelecek bu ekranda Temel kalite, Standart kalite ve Yüksek kalite seçenekleri çıkacak buradan indir diyoruz ve videomuz inmeye başlıyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_Screenshot_2018-02-02-16-00-36-169x300.png&quot; alt=&quot;Youtube go kurulum&quot; /&gt; &lt;img src=&quot;/wp-images/2018_02_Screenshot_2018-02-02-16-00-53-169x300.png&quot; alt=&quot;Youtube go kurulum android&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Videomuza uygulama ana ekranında aşağıda bulunan indirilenler bölümünden ulaşabiliriz.&lt;/p&gt;
</content:encoded></item><item><title>L298-N Motor Sürücü Kullanımı</title><link>https://fuwari.vercel.app/posts/l298-n-motor-surucu-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/l298-n-motor-surucu-kullanimi/</guid><description>Merhaba, bu yazımda sizlere bir çok projede kullanılan L298-N motor sürücü kartını, çalışma şeklini ve arduino kartı ile bağlantısının nasıl yapılacağ</description><pubDate>Thu, 01 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/wp-images/2018_02_l298n.jpg&quot;&gt;&lt;img src=&quot;/wp-images/2018_02_l298n-696x696.jpg&quot; alt=&quot;L298-N motor sürücü&quot; title=&quot;L298-N&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merhaba, bu yazımda sizlere bir çok projede kullanılan L298-N motor sürücü kartını, çalışma şeklini ve arduino kartı ile bağlantısının nasıl yapılacağı hakkında bilgi vereceğim. Kullanılan örnek projelerdeki öneminden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;L298 N entegresi ile başta Dc motorlar olmak üzere bir çok Arduino projelerinde kullanılan bir motor sürücü entegresidir. İki adet çıkışı vardır. Ve her çıkış maksimum olmak üzere 2 ampere kadar akım vermektedir. Çıkışlar 6 ile 15 volt arası gerilim verebilmektedir.&lt;/p&gt;
&lt;p&gt;Besleme geriliminde ise 2 tip besleme girişi mevcuttur. +5v besleme ve 12v besleme girişleri&lt;/p&gt;
&lt;p&gt;Bu girişlerden +5v besleme gerilimi arduinomuzun +5v pininden beslenmektedir. Ancak bu besleme tipi pek önerilmemektedir. &lt;a href=&quot;https://blog.berkarat.com/arduino-ve-cesitleri/&quot;&gt;Arduino ve Çeşitleri&lt;/a&gt; yazımızda belirttiğimiz gibi arduinonun çalışma gerilimi 5 volttur ancak verebileceği  akım değeri az olduğundan dolayı güçlü bir cihazın fazla akım çekmesinden kaynaklı Arduino kartımız zarar görmesi muhtemeldir.&lt;/p&gt;
&lt;p&gt;Diğer besleme yöndemi ise +12V besleme gerilimidir. L298N datasheeti incelendiğinde üzerindeki entegrenin çalışma gerilimi 6-32 v aralığında gösterilmektedir. Bu sebeple maksimum 32 voltluk bir dc güç kaynağıyla beslemek mümkündür. Genel yaygın kullanım olarak beslemelerde 9V’luk piller kullanılmaktadır. Fakat motorların çektiği akım göz önüne alındığında bu pilin yetersiz kaldığı ve güç düşmesinin de yaptığınız projenin stabil olmasını engellediğini göreceksiniz. Ben kendi projelerimde polimer pil veya 18650 serisi pilleri kullanmaktayım. Böylece şarj etme imkanı sunarak ve yüksek kapasiteleri sebebiyle diğer 9Vluk pillere göre daha kullanışlıdır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_l298-config-300x225.jpg&quot; alt=&quot;L298-N Devre Şeması&quot; /&gt;&lt;/p&gt;
&lt;p&gt;L298N sürücü entegremizin üzerinde ilk bakışta 4 adet giriş pini bulunmaktadır. Bu pinler in1,in2,in3,in4 pinleridir. In1 ve in2 pinler sol çıkışa bağlı olan motorları kontrol etmektedir. Bu pinler sayesinde arduinomuzdan gönderdiğimiz sinyallere göre ileri geri hareket ettirmek mümkündür. Veya başka tarzda bir projede kullanımı yine aynı mantıkla çalışmaktadır.&lt;/p&gt;
&lt;p&gt;Yukarıdaki pinlerin yanında üzerleri kapalı olarak görünen sol ve sağda olmak üzere iki adet enable pini mevcuttur. Bu pinler sayesinden 0-256 değerleri arasında analog voltaj gerilimi vererek motorumuzun hız ayarını yapmak mümkündür. 0 değeri low yani hiç voltaj gerilimi yok anlamına gelir bu sayede motorumuza enerji gitmez ve durur. 256 değerini verdiğimizde ise motor tam gücüyle çalışarak maksimum hıza ulaşır.&lt;/p&gt;
&lt;p&gt;#define MotorR1  5
#define MotorR2  6
#define MotorRE  2
#define MotorL1  9
#define MotorL2  10
#define MotorLE  3&lt;/p&gt;
&lt;p&gt;void setup() {
pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);
pinMode(MotorLE, OUTPUT);         //Motorlarımızı çıkış olarak tanımlıyoruz.
pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);
pinMode(MotorRE, OUTPUT);
}&lt;/p&gt;
&lt;p&gt;Yukarıdaki Arduino kodunda da görüleceği üzere 4 adet giriş pini bulunmaktadır bu sayede sensörler veya arduinodan direkt gelen sinyaller ile süreceğimiz elemanın ne yapması gerektiğine, ne kadar voltaj gerilmesini ayarlayabilmekteyiz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_Untitled-Sketch-2_bb-300x185.png&quot; alt=&quot;L298-N bağlantı şeması&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Peki motor sürücüsü olmadan projelerimizi yapamaz mıyız ?&lt;/h1&gt;
&lt;p&gt;Aslında yukarıdaki yazıda da bahsettiğim gibi arduino kartımızın verebileceği akım değerlerinin altındaki elemanlarla yapabileceğimiz bir projede mümkün. Ancak birden fazla sensörlü orta seviye bir proje yapmaya kalkıştığımız zaman yetersiz güç hem arduinomuza zarar verecektir. Zarar vermese dahi sensörlerin veya motorların güçten düşmesine yol açacaktır bu da bizi hataya sürükleyecektir. Bu hataların en başında gelen ise sensörler çalışıyor olarak gözükür ancak göstediği değerler arasında farklılıklar olacağı için projemizi doğrudan etkileyecektir. Bu sebeple ya kendi motor sürücü kartımızı yapacağız ya da aliexpress gibi Çin menşeili sitelerden çok daha ucuza sipariş edebileceğimiz hazır sürücü kartlarını kullanmamız gereklidir.&lt;/p&gt;
&lt;p&gt;Bu linkten L298-N  sürücü kartı hakkında daha detaylı bilgilere ulaşmak mümkündür&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.pdf&quot;&gt;Motor sürücü datasheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/berkarat/Arduino-L298-N_Motor_Surucu&quot;&gt;Motor sürücü kodları&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>TCS3200 Kullanımı</title><link>https://fuwari.vercel.app/posts/tcs3200-kullanimi/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/tcs3200-kullanimi/</guid><description>TCS3200 en genel renk uzayı olan RGB ( red, green, blue) renk uzayını kullanarak yansıyan yüzeyin rengini bize çıktı olarak veren sensördür. Bu RGB re</description><pubDate>Thu, 01 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TCS3200 en genel renk uzayı olan RGB ( red, green, blue) renk uzayını kullanarak yansıyan yüzeyin rengini bize çıktı olarak veren sensördür. Bu RGB renk skalasındaki renkleri bize ayrı ayrı vermesinden yola çıkarak doğada bulunan tüm renkleri bulmak mümkündür. Bu ana renklerin birbiriyle oranlanmasıyla farklı renkleri ortaya çıkarabiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_tcs3200-300x186.jpg&quot; alt=&quot;TCS3200&quot; /&gt;&lt;/p&gt;
&lt;p&gt;TCS3200 en çok kullanılan renk sensör kartıdır. Yuvalı ve yuvasız olmak üzere iki çeşidi mevucuttur. Yuvalı olmasının avantajı dış ortamdan gelen ışıklardan minimum seviyede etkilenir ve böylece hassasiyet artmış olur. Bu sayede daha keskin renk algılama işlemi yapabilmektedir. Tamamen mekanik bir durumdur. Sensörün çalışmasıyla veya programlanması ile ilgili değildir.&lt;/p&gt;
&lt;p&gt;TCS3200 kartının üzerinde 4 adet led vardır. Bu ledlerin amacı yüzeyi aydınlatmaktır. Bu sayede yüzey renginin algılanması kolaylaştırılması amaçlanmıştır. Ledlerin tam merkezinde bir adet çip bulunur. Çipin içerisinde 4 adet fotodiyot vardır. Bu sayede renklerin algılanması sağlanır.&lt;/p&gt;
&lt;p&gt;Kartın üzerinde 4 adet giriş 1 adet de çıkış pini mevcuttur. S1 S2 S3 ve S4 pinleri giriş Out pini ise çıkış pini olarak tanımlıdır.&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 197px;&quot; width=&quot;602&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;S2&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;S3&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;RENK&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt; RED&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;BLUE&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt; HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;WHİTE&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt; HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;GREEN&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;table style=&quot;height: 197px;&quot; width=&quot;602&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;S0&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;S1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;ÇIKIŞ FREKANSI&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;0&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;%2&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt; HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;LOW&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;%20&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt; HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 201px; text-align: center;&quot;&amp;gt;HIGH&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 230px; text-align: center;&quot;&amp;gt;%100&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;S1 ve S2 pinlerinden dijital olarak LOW ve HIGH sinyallerini , S3 ve S4 pinlerinden ise 0-255 arasında frekans değerlerini alarak renkleri ayırt edilebilmesi mümkündür.&lt;/p&gt;
&lt;p&gt;&amp;lt;table style=&quot;width: 694px;&quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;&amp;lt;b&amp;gt;GİRİŞ ADI&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;&amp;lt;strong&amp;gt;INPUT/OUTPUT&amp;lt;/strong&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;&amp;lt;b&amp;gt;AÇIKLAMASI&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;GND&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;–&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;Toprak bağlantısının yapıldığı bacaktır&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;OE&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;INPUT&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;Sensörü aktif hale getirmek için kullanılan enable bacağıdır.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;OUT&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;OUTPUT&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;Çıkış frekansını aldığımız bacaktır.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;S0,S1&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;INPUT&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;Frekans değerinde renk bilgilerinin işlendiği bacaklardır.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;S2,S3&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;INPUT&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;Fotodiyotların renk bilgilerini seçtiği bacaklardır.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td style=&quot;width: 93px;&quot;&amp;gt;VCC&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 123px;&quot;&amp;gt;–&amp;lt;/td&amp;gt;&amp;lt;td style=&quot;width: 416px;&quot;&amp;gt;5v besleme gerilimi&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;Yukarıdaki tabloda TCS3200 sensör kartının bağlantı pinlerinin nereye bağlanacağı ve hangi işlevi yaptıklarının açıklaması vardır.&lt;/p&gt;
&lt;p&gt;Bu sensör kartının bağlantısında ise arduino idesinde örnek olarak aşağıdaki kod bloğu ile setup yani bacakların tanımlaması yapılmıştır.&lt;/p&gt;
&lt;p&gt;void setup() {
pinMode(S3, OUTPUT);           //TCS3200 sensör giriş pini
pinMode(S2, OUTPUT);           //TCS3200 sensör giriş pini
pinMode(outpin, INPUT);       // TCS3200 sensör giriş pini
}&lt;/p&gt;
&lt;h1&gt;Örnek Renk Algılama Kodu&lt;/h1&gt;
&lt;p&gt;digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
r = pulseIn(outpin, LOW);
r = plusewidth / 400. - 1;
r = (255 - r);&lt;/p&gt;
&lt;p&gt;Bu kod parçacığında r değişkeninin değeri 0 ile 255 arasında bir değer olacak ve bize kırmızı rengi verecektir. Benzer şekilde diğer ana renkleri(RGB) de bulmak mümkündür.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_02_rgb-300x150.png&quot; alt=&quot;renk kodları&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Peki bu üç ana rengi bulduktan sonra aldığımız değerlere göre hangi rengin ne olduğunu bulmak için basit bir kod bloğu ile artık o rengin ne olduğunu ekranda görebiliriz.&lt;/p&gt;
&lt;p&gt;if ( r &amp;lt; g &amp;amp;&amp;amp; r &amp;lt; b &amp;amp;&amp;amp; r &amp;gt; w &amp;amp;&amp;amp; g &amp;gt; b &amp;amp;&amp;amp; g &amp;gt; w &amp;amp;&amp;amp; b &amp;gt; w &amp;amp;&amp;amp; r &amp;lt; 550) {
Serial.println(&quot;*! RED *!&quot;);
}&lt;/p&gt;
&lt;p&gt;Bu kod bloğunda sensörden gelen bilgilere göre birbirleri ile kıyaslayarak istediğimiz rengi bulabiliriz.&lt;/p&gt;
&lt;p&gt;Böylece bu sensörü kullanarak bir çok alanda çalışmalarımıza ek veya temel olarak kullanmak mümkündür. Örneğin bir renk ayırma projesi yapmak istersek bu sensörü kullanmak zorundayız. Diyelim ki kırmızı renkleri sağ tarafa, yeşil renkleri sol tarafa, mavi renkleri ise orta tarafa koymak istiyoruz. İşte burada TCS3200 sensör kartı sayesinde renkleri algılayıp eğer gelen ürün seçilen renkle eşleşiyorsa uygun komutlarla yönlendirip sınıflandırma yapmak mümkündür.&lt;/p&gt;
</content:encoded></item><item><title>Arduino ve Çeşitleri</title><link>https://fuwari.vercel.app/posts/arduino-ve-cesitleri/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/arduino-ve-cesitleri/</guid><description>Arduino temel anlamda en basit tanımı elektronikle yazılımı bir araya getiren ve bir çok kontrol kabiliyeti sağlayan bir mikroişlemcisi olan, açık kay</description><pubDate>Wed, 31 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Arduino temel anlamda en basit tanımı elektronikle yazılımı bir araya getiren ve bir çok kontrol kabiliyeti sağlayan bir mikroişlemcisi olan, açık kaynak kodu sayesinde geliştirilebilir, ekleme çıkarma yapılabilen bir platformdur.&lt;/p&gt;
&lt;p&gt;Bu sayede en basitinden led yakıp söndürmeden, motor kontrol edebilme, elektronik aletlerin uzaktan bluetooth veya wifi ile kontrolüne hatta internet üzerinden bilgileri çekip bu bilgileri uygun durumlarda işlenmesine kadar bir çok işlem yaptırılabilir. Bu işlemler kişinin programlama kabiliyetine bağlıdır.&lt;/p&gt;
&lt;p&gt;Arduino boardlarının bir çok çeşidi vardır boyutlarına göre. Ancak hepsi aynı temel mantıkla kontrol edilir. Üzerinde bulundurduğu  Atmega328 miktodenetleyicisi ( Uno için geçerli olan mikrodenetleyici ) bu kartın kalbidir. Bu işlemcinin programlanması sayesinde kart hayat bulur ve işlem yapmaya başlar.&lt;/p&gt;
&lt;p&gt;Bu kartların hedef kitlesi çok geniştir. Elektronik ve yazılım alanlarında giriş seviyesinden uzman seviyesine kadar her kişiye hitap eder. Yukarıda bahsettiğimiz gibi bu kişinin programlama yeteneğine bağlıdır.&lt;/p&gt;
&lt;h1&gt;Arduino Programlama&lt;/h1&gt;
&lt;p&gt;Arduino’ya program yüklemek için kendi ürettikleri bir IDE( Integrated development environment) yani tümleşik geliştirme ortamı vardır. Bu ideye yazacağımız kodlar sayesinde kontrol edeceğimiz elektronik aleti yazılımla birleştirmiş oluruz. Ancak bu yazılım kısmını yapabilmek için temel seviyede C/C++ veya Java dillerine hakim olmak gereklidir. Arduino da Java tabanlı bir yazılım sayesinde kodlanır.&lt;/p&gt;
&lt;p&gt;Aynı zamanda Web Editör sayesinde de online olarak kodlama yapılabilinmektedir.&lt;/p&gt;
&lt;p&gt;Açık kaynak kodu olması ve bir çok kütüphane barındırması sayesinde öğrenmesi kolay ve yazılan kodun somut bir şekilde görülmesi sayesinde klasik programlama (web, masaüstü, mobil vs.) dillerine göre daha eğlencelidir.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.arduino.cc/en/main/software&quot;&gt;IDE’ye bu linkten erişilebilir&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;void setup() {&lt;/p&gt;
&lt;p&gt;pinMode(LED_BUILTIN, OUTPUT); // çıkış pini tanımlandı
}&lt;/p&gt;
&lt;p&gt;void loop() {
digitalWrite(LED_BUILTIN, HIGH);   // Led yanar
delay(1000);                       // 1 saniye bekler
digitalWrite(LED_BUILTIN, LOW);    // Led söner
delay(1000);                       // 1 saniye bekler
}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_blink-274x300.jpg&quot; alt=&quot;Blink - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Arduino’yu neden seçmeliyim?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Açık kaynak kodlu olması ve bir çok kütüphane barındırması sebebi birinci önceliktir. Bu sayede geliştirilebilir ve uygun durumlara göre şekillendirilebilir.&lt;/li&gt;
&lt;li&gt;Maliyet açısından günümüzde 10 tlden başlayan  fiyatlara bulunabilir olması sebebiyle tercih edilebilir.&lt;/li&gt;
&lt;li&gt;Windows, Macintosh, Linux gibi işletim sistemlerinde uyum sorunu olmadan çalıştırılabilir.(Bunun sebebi ise Java tabanlı olmasından kaynaklıdır. Java dili de platform bağımsız çalışan bir dildir. )&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Çeşitleri&lt;/h1&gt;
&lt;h2&gt;Arduino Uno&lt;/h2&gt;
&lt;p&gt;Üzerinde atmega 328 mikrodenetleyici barındıran, usb port sayesinde bilgisayar üzerinden programlanabilen ve seri haberleşme yapabilen kartlar arasında en popüler olanı ve tercih edilenidir. Üzerinde 14 tane dijital giriş çıkış ve 5 adet de analog giriş çıkış vardır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_uno-300x190.jpg&quot; alt=&quot;Uno - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Arduino Mega&lt;/h2&gt;
&lt;p&gt;Aslında bakılırsa teknik özellikler bakımından Uno ile aynıdır ancak üzerinde 54 adet dijital giriş çıkış ve 16 adet analog giriş çıkış bulundurması ayırt edici özelliktir. Avantaj olarak çoklu sensör kullanımlarında büyük bir katkı sağlar. Üzerinden yine atmega serisinin 2560 modelini bulundurur. Ancak kendi deneyimlerinden yola çıkarak arduino meganın besleme voltajı ve frekans değerleri unoya göre biraz farklılık gösterebilmektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_mega-300x197.jpg&quot; alt=&quot;Mega - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Arduino Lilypad&lt;/h2&gt;
&lt;p&gt;Arduinonun geliştirlen bu kartı ( her ne kadar kart olmasa da ) kıyafetler için tasarlanmıştır. Günümüzde giyilebilir teknoloji olarak adlandırılan kıyafetlere uyumlu olarak tasarlandığından dolayı daha esnek ve küçük yapıdadır. Örneğin kalp nabız atım hızına göre bize uyarı veren bir projede rahatlıkla kullanılabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_lili-300x225.jpg&quot; alt=&quot;Lili - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Arduino Nano&lt;/h2&gt;
&lt;p&gt;Bu kart serilerinin arasında en çok kullanılan ikinci kartıdır. Genellikle boyutu açısından ve hafifliğinden dolayı tercih edilir. Günümüzde artık klonları çıktığından dolayı fiyatları Uno serisiyle hemen hemen aynıdır. Tek veya iki sensörlü projelerde veya yerden tasarruf etmek amacıyla geliştirilen projelerde tercih edilir&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_nano-300x210.jpg&quot; alt=&quot;Nano - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Arduino Bluetooth&lt;/h2&gt;
&lt;p&gt;Bu kartların bluetooth üzerinden haberleşme yapması için üzerinde iletişimi sağlayan bluetooth modülü tümleşik olarak bulunur. Bu sayede ekstra bir bluetooth modülü kullanmaya gerek kalmaz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_blue-300x199.jpg&quot; alt=&quot;Blue - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Arduino Ethernet&lt;/h2&gt;
&lt;p&gt;İnternet bağlantısı yapmak için üzerinde ethernet portu ve çipi bulunur. İnternetten kontrol tabanlı projeler için tercih edilir. Ekstradan bir ethernet modülüne ihtiyaç duymaz. Diğerlerinden farklı olarak üzerinde sd kart girişi bulunur bu kartlar arasında tek depolama alanı olan serisidir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_ethernet-300x225.jpg&quot; alt=&quot;Ethernet - Arduino ve Çeşitleri&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Arduino projeleri hakkında bilgi almak için aşağıdaki linkler yararlı olacaktır.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://create.arduino.cc/projecthub&quot;&gt;Örnek Projeler&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.arduino.cc/en/Reference/Libraries&quot;&gt;Kütüphaneleri&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Kiva Robots vs Quicktron Robots</title><link>https://fuwari.vercel.app/posts/kiva-robots-vs-quicktron-robots/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/kiva-robots-vs-quicktron-robots/</guid><description>Amazon şirketi 2012 yılında kargolama alanında çığır açan bir teknolojiye geçiş yaptı. Otonom robotlar üreten Kiva Systems’i 775 milyon dolar karşılığ</description><pubDate>Mon, 29 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Amazon şirketi 2012 yılında kargolama alanında çığır açan bir teknolojiye geçiş yaptı. Otonom robotlar üreten Kiva Systems’i 775 milyon dolar karşılığında satın aldı. Bu sisteme geçişle birlikte Amazon şirketi rakiplerinin bir hayli önüne geçmiş oldu.&lt;br /&gt;
Kiva robots şirketi sayesinde insan iş gücünü bir hayli olarak azaltan Amazon şirketi yatırımlarını Kiva robotlarına yaparak bünyesinde 35.000 robot barındırıyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_kiva.jpg&quot; alt=&quot;amazon robot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Kiva robotları her seferde 350kg’a kadar yük taşıyabilmektedir.  Bu sayede taşıma işlemleri hızlandı ve teslimatların paketlenmesinde otomatik bir sisteme geçiş yapılmış oldu.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h1&gt;Amazon’un Kiva Robotlarına Yeni Rakip : Quictron Robots&lt;/h1&gt;
&lt;/blockquote&gt;
&lt;p&gt;Amazonun kiva systems’i satın almasının ardından dünyanın ikinci en büyük e ticaret şirketi olan Alibaba bu hamleye karşılıksız kalamazdı. Quicktron isimli robotlarıyla piyasaya yeni bir rekabet getirdi. &lt;img src=&quot;/wp-images/2018_01_qu%C4%B1c-1.jpg&quot; alt=&quot;amazon robot &quot; /&gt;Çalışma mantığı aynı olan sistemle birlikte Amazon şirketine karşı yarışta kalmayı sağladı ve dünyanın en iyi e ticaret şirketleri arasındaki yerini korumuş oldu.&lt;/p&gt;
</content:encoded></item><item><title>Microsoft’un Yapay Zeka Tabanlı Chatbotu : Ruuh</title><link>https://fuwari.vercel.app/posts/microsoftun-yapay-zeka-tabanli-chatbotu-ruuh/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/microsoftun-yapay-zeka-tabanli-chatbotu-ruuh/</guid><description>Microsoft 2005 yılının başlarında Spleak isimli MSN’den sohbet edebileceğin bir chat robotu oluşturmuştu. Ancak bu robotun ilk deneyimler olmasından d</description><pubDate>Mon, 29 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Microsoft 2005 yılının başlarında Spleak isimli MSN’den sohbet edebileceğin bir chat robotu oluşturmuştu. Ancak bu robotun ilk deneyimler olmasından dolayı çok fazla eksikleri vardı ve sürekli aynı cevaplar vererek bir süre sonra sıkıcı bir hale gelmişti.&lt;/p&gt;
&lt;p&gt;Son zamanlarda Microsoft’un geliştirdiği bir başka chatbotu olan Zo isimli yapay zeka programını piyasaya sürdü. Ancak bundan da beklenen verim alınamadıktan sonra 15 Mart 2017 yılında Ruuh isimli son sürüm olan chatbotunu piyasaya sürdü.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zo bağlantı adresi aşağıdaki linktedir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zo.ai&quot;&gt;https://www.zo.ai&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Ruuh nedir ?&lt;/h1&gt;
&lt;p&gt;Microsoftun 18-25 yaş arası genç kitlelerin nelere ilgi duyduklarını, neler istediklerini belirlemek için ortaya çıkardığı bu chatbotu kısa süre içerisinde gençler arasında büyük bir popülerliğe ulaştı. Ruuh 16 yaşında olan ve Sydney’de yaşayan bir genç kız olarak karşımıza çıkıyor. İlgi alanları arasında seyahat etmek, müzik dinlemek, spor yapmak gibi daha çok gençlerin ilgi odağı olan konularda geliştirilmiş ve tıpkı insan gibi duyguları olan bir chatbotudur. Aynı zamanda İngilizce pratik yapmak isteyen kullanıcılar için de pratik yapma aracı olarak da görülmektedir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-images/2018_01_rr-300x300.jpg&quot; alt=&quot;Microsoft Ruuh&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Çalışma yapısı&lt;/h1&gt;
&lt;p&gt;Metinleri işleyerek konuşma yapabilen bir bilgisayar programdır. Öğrenebilme yeteneğine sahip bu program konuştuğu kişilerden gelen bilgileri kendi veri tabanındaki kelimelerle işleyerek en uygun olabilecek cevapları vermektedir. Bu sayede tıpkı bir arkadaşmış gibi davranışlar sergiliyor.&lt;/p&gt;
&lt;p&gt;Ruuh’la nasıl iletişime geçileceği ise çok basit. Aşağıdaki linke tıkladıktan sonra browser üzerinden Facebook’un messenger uygulamasına giriş yapıyoruz ardından Ruuh isimli kullanıcı ile sohbete başlıyoruz işte bu kadar. Şimdilik göze çarpan dezavantaj olarak dil desteği olmamasından dolayı sohbetimizi İngilizce dilinde yapmak zorundayız.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.messenger.com/t/Ruuh&quot;&gt;https://www.messenger.com/t/Ruuh&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Yapay ZekanÄ±n Resimlerle Ä°mtihanÄ±</title><link>https://fuwari.vercel.app/posts/yapay-zekanin-resimlerle-imtihani/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/yapay-zekanin-resimlerle-imtihani/</guid><description>TÃ¼rkiyenin ve DÃ¼nyanÄ±n uzun sÃ¼redir gÃ¼ndemini meÅŸgul eden ve baÅŸta ekonomi olmak Ã¼zere, saÄŸlÄ±k ve turizm sektÃ¶rlerine de kan aÄŸlatan lanet</description><pubDate>Sun, 28 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;TÃ¼rkiyenin ve DÃ¼nyanÄ±n uzun sÃ¼redir gÃ¼ndemini meÅŸgul eden ve baÅŸta ekonomi olmak Ã¼zere, saÄŸlÄ±k ve turizm sektÃ¶rlerine de kan aÄŸlatan lanet olasÄ± covid-19 pandemisi nedeniyle artÄ±k halk isyanlarda. Herkes eski hayatÄ±nÄ± ve neÅŸeli gÃ¼nlerini Ã¶zler oldu. Zengin daha fazla zengin ve fakir daha fazla fakir olmaya devam ediyor. Tam kapanma ile yavaÅŸ yavaÅŸ eskiye dÃ¶nmeye baÅŸladÄ±k. Uzun sÃ¼redir evlerinden Ã§Ä±kmayan beyefendiler seks ‘e hasret oldu. AynÄ± zamanda sÃ¼rekli olarak Ã§alÄ±ÅŸmaya alÄ±ÅŸmÄ±ÅŸ escort modellerde ( paralÄ± gÃ¶rÃ¼ÅŸen bayanlar ) evlerinden Ã§Ä±kamadÄ±klarÄ± iÃ§in bir sÃ¼redir isyanlarda.. Turizm sezonunun kalbi olarak anÄ±lan ve tÃ¼rkiye’nin en bÃ¼yÃ¼k turizm cenneti olan bodrum ise &lt;strong&gt;rus escort bayanlar&lt;/strong&gt; baÅŸta olmak Ã¼zere en Ã§ok yabancÄ± escort ‘a ev sahipliÄŸi yapan iller arasÄ±nda gelmektedir. Pandemi ‘den dolayÄ± turizm sektÃ¶rÃ¼ olarakta, Seks iÅŸÃ§iliÄŸi sektÃ¶rÃ¼ olarakta en Ã§ok etkilenen ilimiz oldu. &lt;a href=&quot;http://www.plfy.net&quot;&gt;&lt;strong&gt;bodrum escort&lt;/strong&gt;&lt;/a&gt; arayÄ±ÅŸlarÄ±nÄ±za 7/24 kesintisiz cevap veren siteler kepenk kapattÄ± ve 4 gÃ¶zle normalleÅŸmeyi beklemektedir. Ã–zellikle bodrum ‘a baÄŸlÄ± olan ilÃ§e ve semtlerde durum daha da vahim. Herkes evlerinde ve varsa bahÃ§elerinde vakit geÃ§iriyor. Avm’ye gitmeye, Sahil de tur atmaya hasret oldu insanlar. Ã–zellikle &lt;a href=&quot;http://www.plfy.net/escortsemti/bodrum-escort/bitez-escort/&quot;&gt;&lt;strong&gt;bitez escort&lt;/strong&gt;&lt;/a&gt; bayanlarÄ± normalleÅŸme haberlerini duyar duymaz sokaÄŸa dÃ¶kÃ¼ldÃ¼ ve meÅŸale eÅŸliÄŸinde kutlamalara baÅŸladÄ±. UmarÄ±z ki tekrar bÃ¶yle kÃ¶tÃ¼ ve uzun sÃ¼recek bir kapanma ile karÅŸÄ± karÅŸÄ±ya kalmayÄ±z. GerÃ§ekten Ã§ok zor gÃ¼nler geÃ§irdik ve geÃ§irmeye devam ediyoruz. Tabii ki bu sÃ¼reÃ§te tek etkilenen ilimiz bodrum olmadÄ±! En az bodrum kadar etkilenen ve ekonomisi Ã§Ã¶kÃ¼ÅŸe geÃ§en, Memur kenti olarak bilinen baÅŸkentimiz de bu yasaklardan nasibini aldÄ±. &lt;strong&gt;Escort bayan&lt;/strong&gt; sektÃ¶rÃ¼ tamamiyle bitik hale geldi diyebiliriz. Gece hayatÄ± ve PavyonlarÄ± ile meÅŸhur olan nacizane iller arasÄ±nda yer alan ankara da pandemi maÄŸduru konuma geldi. Ã–zellikle &lt;strong&gt;18 + yaÅŸ escort&lt;/strong&gt; bayanlara ve birbirinden farklÄ± uyrukta profesyonel anma hizmeti veren &lt;strong&gt;paralÄ± gÃ¶rÃ¼ÅŸen bayanlar&lt;/strong&gt; &lt;a href=&quot;http://www.tpolice.com&quot;&gt;&lt;strong&gt;ankara escort&lt;/strong&gt;&lt;/a&gt; olarak tekrardan Ã§alÄ±ÅŸacaÄŸÄ± ve Ankara bebelerine hizmet verecekleri o gÃ¼zel gÃ¼nleri beklemektedirler. Sizlerde ankara ‘lÄ±lar gibi azgÄ±n ve &lt;strong&gt;kudurmuÅŸ escort&lt;/strong&gt; bayan arÄ±yorsanÄ±z yolunuz ankaraya kesinlikle dÃ¼ÅŸmeli. TÃ¼rkiyenin en bÃ¼yÃ¼k &lt;strong&gt;escort bayan&lt;/strong&gt; piyasasÄ±na sahip olarak anÄ±lan &lt;strong&gt;ankara escort&lt;/strong&gt; piyasasÄ±, 18 + ve 40 yaÅŸ – bayanlarÄ± ile meÅŸhurdur. 7/24 kesintisiz olarak hizmet vermeyi amaÃ§layan ve %100 gerÃ§ek resimli ankara bayan escortlarÄ± bir telefon kadar uzaÄŸÄ±nÄ±zda. Hepsi pandemi sÃ¼recini evlerinde geÃ§irerek halk saÄŸlÄ±ÄŸÄ±na bÃ¼yÃ¼k Ã¶lÃ§Ã¼de katkÄ± saÄŸlamÄ±ÅŸ ve bu nedenle de seks yapmaya hasret kalmÄ±ÅŸ durumdadÄ±rlar. Siz de &lt;strong&gt;azgÄ±n escort bayan&lt;/strong&gt;larla gÃ¶rÃ¼ÅŸmek ve hiÃ§ yaÅŸamadÄ±ÄŸÄ±nÄ±z tadlarÄ± almak istiyorsanÄ±z &lt;a href=&quot;http://www.tpolice.com/escortsemti/cankaya-escort/&quot;&gt;&lt;strong&gt;Ã§ankaya escort&lt;/strong&gt;&lt;/a&gt; bayanlarÄ± ile iletiÅŸime geÃ§menizi ÅŸiddetle tavsiye ederiz. Birbirinden gÃ¼zel ve &lt;strong&gt;sarÄ±ÅŸÄ±n escort&lt;/strong&gt; , &lt;strong&gt;ucuz escort&lt;/strong&gt; , &lt;strong&gt;kaliteli escort&lt;/strong&gt; bayanlarÄ± ile meÅŸhur olan Ã§ankaya ilÃ§esinde aradÄ±ÄŸÄ±nÄ±z fizik Ã¶lÃ§Ã¼lerinde ve yaÅŸ aralÄ±ÄŸÄ±nda paralÄ± gÃ¶rÃ¼ÅŸen bayan bulmanÄ±z mÃ¼mkÃ¼ndÃ¼r.&lt;/p&gt;
</content:encoded></item></channel></rss>