<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
        <title>Programcıdan Programcıya</title>
        <description>Programcıdan Programcıya - Engin Polat</description>
        <link>http://polatengin.github.io</link>
        <atom:link href="http://polatengin.github.io" rel="self" type="application/rss+xml" />
        <lastBuildDate>Mon, 28 Nov 2022 18:19:57 +0000</lastBuildDate>
        <pubDate>Mon, 28 Nov 2022 18:19:57 +0000</pubDate>
        <ttl>60</ttl>


        <item>
                <title>Asp.Net Core web uygulamalarinda HTTPS adreslere yönlendirme</title>
                <description>&lt;p&gt;Bir &lt;strong&gt;Asp.Net Core&lt;/strong&gt; web uygulamasında, &lt;strong&gt;HTTP&lt;/strong&gt; adresleri engellemek ve &lt;strong&gt;HTTPS&lt;/strong&gt; adresleri kullanmak isteyebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt; methodların üzerine, &lt;strong&gt;Controller&lt;/strong&gt; sınıflarının üzerine veya &lt;strong&gt;GlobalFilters&lt;/strong&gt; listesine ekleyebildiğimiz &lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/api/Microsoft.AspNetCore.Mvc.RequireHttpsAttribute&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RequireHttpsAttribute&lt;/a&gt; sınıfı sayesinde, web uygulamamızdaki adreslerin &lt;strong&gt;HTTP&lt;/strong&gt; üzerinden erişilmesini &lt;em&gt;engelleyebiliyoruz&lt;/em&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/db8f5c184e3c555e0c3401a9bc6506fb.js?file=RequireHttpsAttribute.cs&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;well well-sm&quot;&gt;&lt;strong&gt;Uyarı&lt;/strong&gt;&lt;br /&gt;Yukarıdaki kod parçaları, &lt;strong&gt;HTTP&lt;/strong&gt; üzerinden gelecek tüm istekleri engeller. Böylece &lt;strong&gt;HTTP&lt;/strong&gt; protokolü üzerinden gelen istekler işlenmemiş olur. Aslında yapmamız gereken, &lt;strong&gt;HTTP&lt;/strong&gt; istekleri &lt;strong&gt;HTTPS&lt;/strong&gt; adreslere yönlendirmek olmalı. Yani istekler işlenmeyecek şekilde engellenmez, &lt;strong&gt;HTTPS&lt;/strong&gt; protokolünü kullanan adresler üzerinden cevaplanır&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; protokolü üzerinden gelen istekleri &lt;strong&gt;HTTPS&lt;/strong&gt; protokolü üzerinden çalışan adreslere yönlendirmek için aşağıdaki kodu kullanabiliriz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/db8f5c184e3c555e0c3401a9bc6506fb.js?file=Configure.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup#the-configure-method&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Configure()&lt;/a&gt; methodu içerisinde çağırdığımız &lt;code&gt;UseRewrite(options)&lt;/code&gt; methodu ile, &lt;strong&gt;HTTP&lt;/strong&gt; istekleri &lt;strong&gt;HTTPS&lt;/strong&gt; adreslere dönüştürebiliyoruz.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/aspnet-core-web-uygulamalarinda-https-adreslere-yonlendirme/</link>
                <guid>http://polatengin.github.io/aspnet-core-web-uygulamalarinda-https-adreslere-yonlendirme</guid>
                <pubDate>Sat, 03 Feb 2018 16:15:00 +0000</pubDate>
        </item>

        <item>
                <title>Global Game Jam 2018</title>
                <description>&lt;p&gt;&lt;strong&gt;Global Game Jam 2018&lt;/strong&gt; etkinliği &lt;em&gt;26 Ocak 2018&lt;/em&gt; - &lt;em&gt;28 Ocak 2018&lt;/em&gt; tarihleri arasında &lt;em&gt;İzmir Ekonomi Üniversitesi&lt;/em&gt;‘nde gerçekleştirildi.&lt;/p&gt;

&lt;p&gt;Ben de &lt;strong&gt;konuşmacı&lt;/strong&gt; , &lt;strong&gt;mentor&lt;/strong&gt; ve &lt;strong&gt;juri üyesi&lt;/strong&gt; sıfatları ile etkinliğe katıldım ve açıkçası çok keyifli zaman geçirdim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Global Game Jam nedir?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Global Game Jam&lt;/em&gt;, &lt;strong&gt;IGDA&lt;/strong&gt; (&lt;em&gt;International Game Developers Association&lt;/em&gt; - &lt;em&gt;Uluslararası Oyun Geliştiricileri Derneği&lt;/em&gt;) &lt;em&gt;Eğitim Odak Grubu&lt;/em&gt;‘nun yönlendirmesiyle ortaya çıkan, tüm dünyada eş zamanlı gerçekleştirilen bir oyun geliştirme etkinliğidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GGJ&lt;/strong&gt; dünyada oyun geliştirilmesi amacıyla birçok &lt;em&gt;öğrenciyi&lt;/em&gt;, &lt;em&gt;profesyoneli&lt;/em&gt; ve &lt;em&gt;akademisyeni&lt;/em&gt; bir araya getiren dünya genelindeki en büyük oyun geliştirme organizasyonudur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GGJ 2018&lt;/strong&gt; etkinliğinde, dünya genelinde &lt;strong&gt;109 ülkede&lt;/strong&gt; &lt;em&gt;804 etkinlik alanında&lt;/em&gt; &lt;strong&gt;42783 katılımcı&lt;/strong&gt; ile &lt;em&gt;9281 oynanabilir oyun&lt;/em&gt; yalnızca 48 saat içerisinde geliştirilmiştir. GGJ etkinliğine ev sahipliği yapan etkinlik merkezleri yerel oyun sektörünün gelişmesine katkı sağlarken, katılımcılara çeşitli açılardan faydalar sağlamaktadır.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2018/01/ggj2018.png&quot; /&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/global-game-jam-2018/</link>
                <guid>http://polatengin.github.io/global-game-jam-2018</guid>
                <pubDate>Mon, 29 Jan 2018 20:30:00 +0000</pubDate>
        </item>

        <item>
                <title>Asp.Net Core uygulamalarında Environment (Ortam) bilgisine göre Database ConnectionString (Veritabanı Bağlantı Cümlesi) belirlemek</title>
                <description>&lt;p&gt;Geçen yıl geliştirmeye başladığımız &lt;em&gt;birkaç bin adam/gün&lt;/em&gt; sürecek koca bir &lt;em&gt;ERP&lt;/em&gt; uygulamasında, &lt;strong&gt;Web API&lt;/strong&gt; projesinin yayınlandığı ortama göre &lt;strong&gt;Database ConnectionString&lt;/strong&gt;‘e (&lt;em&gt;Veritabanı Bağlantı Cümlesi&lt;/em&gt;) sahip olması gerekiyordu.&lt;/p&gt;

&lt;p&gt;Örneğin, &lt;strong&gt;ConnectionString&lt;/strong&gt;, &lt;em&gt;Development&lt;/em&gt; ortamında &lt;strong&gt;Development&lt;/strong&gt; veritabanını, &lt;em&gt;Test&lt;/em&gt; ortamında &lt;strong&gt;Test&lt;/strong&gt; veritabanını, &lt;em&gt;Staging&lt;/em&gt; ortamında &lt;strong&gt;Staging&lt;/strong&gt; veritabanını, &lt;em&gt;Production&lt;/em&gt; ortamında &lt;strong&gt;Production&lt;/strong&gt; veritabanını göstermeliydi.&lt;/p&gt;

&lt;p&gt;Eğer &lt;strong&gt;Asp.Net Core Web API&lt;/strong&gt; uygulamasının, çalıştığı ortama göre (&lt;em&gt;Environment&lt;/em&gt;) otomatik olarak &lt;strong&gt;ConnectionString&lt;/strong&gt; bilgisini belirlemesini sağlayabilirsem, uygulamanın çeşitli ortamlara yayılması gerektiğinde, &lt;strong&gt;ConnectionString&lt;/strong&gt;‘i güncelleme derdinden kurtulabilirdim.&lt;/p&gt;

&lt;p&gt;Hatta, her &lt;em&gt;developer&lt;/em&gt;ın bilgisayarının isminin de &lt;strong&gt;ConnectionString&lt;/strong&gt;‘te olmasını sağlayabilirsem, aynı anda geliştirme yapan birden fazla &lt;em&gt;developer&lt;/em&gt;‘ın, birbirlerinin veritabanı değişikliklerinden etkilenmesini de engelleyebilirdim.&lt;/p&gt;

&lt;p&gt;Bunu gerçekleştirmek için, öncelikle projede yeni bir &lt;em&gt;AppDataContext.cs&lt;/em&gt; dosyası oluşturdum ve &lt;a href=&quot;https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Microsoft.EntityFrameworkCore&lt;/a&gt; kütüphanesini kullanarak veritabanını ve tabloları modelledim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=AppDataContext.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;Startup.cs&lt;/em&gt; dosyasında yer alan &lt;em&gt;ConfigureServices()&lt;/em&gt; methoduna aşağıdaki kodları yazdım;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=ConfigureServices.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;code&gt;AddDbContextPool()&lt;/code&gt; methodu sayesinde, uygulamada &lt;em&gt;AppDataContext&lt;/em&gt; sınıfı her gerektiğinde (&lt;strong&gt;Dependency Injection&lt;/strong&gt; ve &lt;strong&gt;IoC&lt;/strong&gt; - &lt;strong&gt;Inversion of Control&lt;/strong&gt; yöntemleri ile) sağlanacak olan &lt;em&gt;AppDataContext&lt;/em&gt; değişkenini yapılandırdım.&lt;/p&gt;

&lt;p&gt;Burada dikkat edilmesi gereken nokta, &lt;code&gt;SqlConnectionStringBuilder&lt;/code&gt; sınıfı sayesinde, varolan &lt;em&gt;ConnectionString&lt;/em&gt; bilgisini değiştirip, yenisini oluşturabiliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Environment&lt;/em&gt; bilgilerini kullanıp, hatta &lt;code&gt;IsDevelopment()&lt;/code&gt; methodu ile gerekirse &lt;em&gt;developer&lt;/em&gt; bilgisayarının ismini de kullanıp, yeni &lt;em&gt;ConnectionString&lt;/em&gt; ürettim ve bu &lt;em&gt;ConnectionString&lt;/em&gt;‘i &lt;code&gt;UseSqlServer()&lt;/code&gt; methodu içerisinde kullandım.&lt;/p&gt;

&lt;p&gt;Böylece farklı ortamlarda (&lt;em&gt;Environment&lt;/em&gt;) &lt;strong&gt;ConnectionString&lt;/strong&gt; aşağıdakiler gibi oldu;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Database_Production&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Database_Test&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Database_Staging&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Database_Development_Ahmet&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Database_Development_Mehmet&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Database_Development_Ayse&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Son olarak, &lt;em&gt;AppConnectionString&lt;/em&gt; değişkenini, &lt;em&gt;appsettings.json&lt;/em&gt; dosyası içerisinde aşağıdaki gibi tanımladım;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=appsettings.json&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;Not : Bu makaleyi yazarken &lt;a href=&quot;https://dasmulli.blog/2018/01/18/auto-modifying-connection-strings-based-on-the-environment/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Martin Ullrich&lt;/a&gt;‘in makalesinden de faydalandım&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/aspnet-core-uygulamalarinda-environment-ortam-bilgisine-gore-database-connectionstring-veritabani-baglanti-cumlesi-belirlemek/</link>
                <guid>http://polatengin.github.io/aspnet-core-uygulamalarinda-environment-ortam-bilgisine-gore-database-connectionstring-veritabani-baglanti-cumlesi-belirlemek</guid>
                <pubDate>Sun, 21 Jan 2018 14:00:00 +0000</pubDate>
        </item>

        <item>
                <title>THY Travel Hackathon Aralık 2017</title>
                <description>&lt;p&gt;&lt;strong&gt;Türk Hava Yolları&lt;/strong&gt; &lt;em&gt;22 Aralık 2017&lt;/em&gt;, &lt;em&gt;23 Aralık 2017&lt;/em&gt; ve &lt;em&gt;24 Aralık 2017&lt;/em&gt; tarihlerinde &lt;strong&gt;THY Travel Hackathon&lt;/strong&gt; isminde bir etkinlik düzenledi.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/12/thy-travel-hackathon.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ben de &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;Xamarin&lt;/strong&gt;, &lt;strong&gt;Asp.Net Core&lt;/strong&gt; ve &lt;strong&gt;Chatbot&lt;/strong&gt; konularında katılımcılara teknik yardımlarda bulunmak için etkinlikte görev aldım.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/thy-travel-hackathon-aralik-2017/</link>
                <guid>http://polatengin.github.io/thy-travel-hackathon-aralik-2017</guid>
                <pubDate>Mon, 25 Dec 2017 14:30:00 +0000</pubDate>
        </item>

        <item>
                <title>Windows 10 UWP uygulaması içerisinde domain name uygunluk (availability) sorgulama</title>
                <description>&lt;div class=&quot;alert alert-success&quot; role=&quot;alert&quot; style=&quot;margin: 10px 0px; display: block;&quot;&gt;
Bu makalenin kodlarına &lt;strong&gt;Github&lt;/strong&gt; üzerinde &lt;a href=&quot;https://github.com/polatengin&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;polatengin&lt;/a&gt; hesabımda yer alan &lt;a href=&quot;https://github.com/polatengin/blog-codes/tree/master/windows-10-uwp-domain-name-availability-checker&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DomainAvailabilityChecker&lt;/a&gt; aracılığıyla erişebilirsiniz.
&lt;/div&gt;

&lt;p&gt;Gene mail ile aldığım bir soruyu cevaplayacağım.&lt;/p&gt;

&lt;p&gt;Bir &lt;em&gt;alan adının&lt;/em&gt; (&lt;strong&gt;domain name&lt;/strong&gt;) satın almaya müsait olup olmadığını &lt;em&gt;Windows Desktop&lt;/em&gt; uygulaması üzerinden anlamamız gerektiğinde &lt;em&gt;Windows 10&lt;/em&gt; &lt;strong&gt;UWP&lt;/strong&gt; platformunu kullanabiliriz.&lt;/p&gt;

&lt;p&gt;Öncelikle alan adının uygunluğunu sorgulayacağımız bir API servisine ihtiyacımız var.&lt;/p&gt;

&lt;p&gt;Ben bu makale için &lt;a href=&quot;http://whoapi.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WHOAPI&lt;/a&gt; tarafından ücretsiz sağlanan &lt;a href=&quot;https://freedomainapi.com/free-domain-availability-api.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DomainName Availability&lt;/a&gt; servisini kullanacağım (&lt;em&gt;Bir defaya mahsus &lt;strong&gt;9$&lt;/strong&gt; para ödemeniz gerekiyor. Böylece dakikada 1 istek yapabilirsiniz&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://whoapi.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WHOAPI&lt;/a&gt; üzerinde bir hesap oluşturduktan sonra hemen &lt;em&gt;Visual Studio 2017&lt;/em&gt; açalım ve yeni bir &lt;strong&gt;UWP&lt;/strong&gt; projesi oluşturalım;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/12/domain-name-availability-checker-0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Oluşturduğumuz projenin &lt;em&gt;MainPage.xaml&lt;/em&gt; dosyasını açalım ve ekran tasarımını aşağıdaki kodlar ile güncelleyelim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/2702dc075e2add7ff2d30fbd50fd7e16.js?file=MainPage.xaml&quot;&gt;&lt;/script&gt;

&lt;p&gt;Şimdi &lt;em&gt;MainPage.xaml.cs&lt;/em&gt; dosyasını açmalı ve aşağıdaki &lt;code&gt;Button_Click()&lt;/code&gt; methodunu yazmalıyız;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/2702dc075e2add7ff2d30fbd50fd7e16.js?file=MainPage.xaml.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Böylece, ekrandaki &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.ui.xaml.controls.textbox&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TextBox&lt;/a&gt; içerisine istediğimiz alan adını yazıp, &lt;em&gt;Getir&lt;/em&gt; &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.ui.xaml.controls.button&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Button&lt;/a&gt; nesnesine tıkladığımızda, &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.ui.xaml.controls.textblock&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TextBlock&lt;/a&gt; nesnesine &lt;em&gt;Bu alan adı müsait!&lt;/em&gt; veya &lt;em&gt;Bu alan adı müsait değil!&lt;/em&gt; yazacak;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/12/domain-name-availability-checker-1.png&quot; /&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/windows-10-uwp-uygulamasi-icerisinde-domain-name-uygunluk-availability-sorgulama/</link>
                <guid>http://polatengin.github.io/windows-10-uwp-uygulamasi-icerisinde-domain-name-uygunluk-availability-sorgulama</guid>
                <pubDate>Sun, 17 Dec 2017 12:00:00 +0000</pubDate>
        </item>

        <item>
                <title>Akdeniz Bilişim Zirvesi 2017 Etkinliği</title>
                <description>&lt;p&gt;&lt;em&gt;09 Aralık 2017&lt;/em&gt; tarihinde &lt;em&gt;Mimar Sinan Kongre Merkezi, Antalya&lt;/em&gt;‘da &lt;strong&gt;Akdeniz Bilişim Zirvesi 2017&lt;/strong&gt; etkinliği gerçekleştirildi.&lt;/p&gt;

&lt;p&gt;Ben de &lt;strong&gt;Unity3D ile Cross-Platform Oyun Geliştirme&lt;/strong&gt; konulu oturumda konuşmacı olarak yer aldım.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/12/akdeniz-bilisim-zirvesi.png&quot; width=&quot;600&quot; height=&quot;224&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Katılan tüm arkadaşlara &lt;em&gt;teşekkür ederim&lt;/em&gt;.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/akdeniz-bilisim-zirvesi-2017-etkinligi/</link>
                <guid>http://polatengin.github.io/akdeniz-bilisim-zirvesi-2017-etkinligi</guid>
                <pubDate>Sun, 10 Dec 2017 16:30:00 +0000</pubDate>
        </item>

        <item>
                <title>Haliç Üniversitesi - Bilişim Günleri Etkinliği, Kasım 2017</title>
                <description>&lt;p&gt;&lt;em&gt;24 Kasım 2017&lt;/em&gt; tarihinde &lt;strong&gt;Haliç Üniversitesi&lt;/strong&gt;‘nde sevgili arkadaşım &lt;em&gt;Uğur Umutluoğlu&lt;/em&gt; ile birlikte &lt;strong&gt;1. Bilişim Günleri&lt;/strong&gt; etkinliğine katıldık.&lt;/p&gt;

&lt;p&gt;Ben de &lt;strong&gt;Azure&lt;/strong&gt;, &lt;strong&gt;Xamarin&lt;/strong&gt;, &lt;strong&gt;Universal Windows Platform (UWP)&lt;/strong&gt; başlıklarını konuştuğum oturumda konuşmacı olarak yer aldım.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/11/halic-universitesi-bilisim-gunleri.jpg&quot; alt=&quot;Haliç Üniversitesi - Bilişim Günleri, Kasım 2017&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Etkinliği organize eden ve etkinliğe katılan tüm arkadaşlara &lt;em&gt;teşekkür ederim&lt;/em&gt;.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/halic-universitesi-bilisim-gunleri-etkinligi-kasim-2017/</link>
                <guid>http://polatengin.github.io/halic-universitesi-bilisim-gunleri-etkinligi-kasim-2017</guid>
                <pubDate>Sat, 25 Nov 2017 16:30:00 +0000</pubDate>
        </item>

        <item>
                <title>C# String.IndexOf, String.Contains, Regex.IsMatch(), Regex.IsMatch(Compiled) performans karşılaştırma</title>
                <description>&lt;div class=&quot;alert alert-success&quot; role=&quot;alert&quot; style=&quot;margin: 10px 0px; display: block;&quot;&gt;
Bu makalenin kodlarına &lt;strong&gt;Github&lt;/strong&gt; üzerinde &lt;a href=&quot;https://github.com/polatengin&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;polatengin&lt;/a&gt; hesabımda yer alan &lt;a href=&quot;https://github.com/polatengin/blog-codes/tree/master/string-performance-test-contains-indexof-regex-2017&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CSharp String Performance Comparison&lt;/a&gt; aracılığıyla erişebilirsiniz.
&lt;/div&gt;

&lt;p&gt;Ne tür bir uygulama geliştiriyor olursak olalım (&lt;em&gt;Web&lt;/em&gt;, &lt;em&gt;Mobile&lt;/em&gt;, &lt;em&gt;Cloud&lt;/em&gt;, &lt;em&gt;Game&lt;/em&gt;, &lt;em&gt;Desktop&lt;/em&gt;, etc) &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.string&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;string&lt;/a&gt; tipi üzerinde karşılaştırma mutlaka yaparız.&lt;/p&gt;

&lt;p&gt;Bu makalede, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.string&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;string&lt;/a&gt; değişkenler üzerinde yapabileceğimiz &lt;em&gt;karşılaştırma&lt;/em&gt; methodlarını &lt;strong&gt;performans&lt;/strong&gt; odaklı olarak inceleyeceğiz.&lt;/p&gt;

&lt;p&gt;Ben aşağıdaki 4 yöntemi karşılaştırmaya karar verdim, eğer sizin aklınıza başka karşılaştırma yöntemleri gelirse, aşağıdaki &lt;strong&gt;Yorumlar&lt;/strong&gt; alanına veya &lt;a href=&quot;https://github.com/polatengin/polatengin.github.io/issues/new&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Issues&lt;/a&gt; altına bir yorum bırakabilirsiniz ;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;String.IndexOf()&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;String.Contains()&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Regex.IsMatch()&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Regex.IsMatch(Compiled)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Öncelikle test ortamımızı oluşturalım, bunun için &lt;em&gt;TestScenarios&lt;/em&gt; ve &lt;em&gt;Program&lt;/em&gt; isimli birer &lt;strong&gt;class&lt;/strong&gt; oluşturuyoruz.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Program.cs&lt;/em&gt; dosyasında yeralan &lt;em&gt;Program&lt;/em&gt; &lt;strong&gt;class&lt;/strong&gt;‘ında sadece &lt;em&gt;TestScenarios&lt;/em&gt; &lt;strong&gt;class&lt;/strong&gt;‘ından yeni bir &lt;strong&gt;instance&lt;/strong&gt; oluşturup, &lt;em&gt;InvokeTest()&lt;/em&gt; methodunu çağırıyoruz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=Program.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;TestScenarios&lt;/em&gt; &lt;strong&gt;class&lt;/strong&gt;‘ı içerisinde, üzerinde testleri geçekleştireceğimiz, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.string&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;string&lt;/a&gt; bir değişkene ihtiyacımız var;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=TestString.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Ben, kendi bilgisayarımda, karşılaştırma operasyonunu &lt;em&gt;10 Milyon&lt;/em&gt; (&lt;em&gt;10_000_000&lt;/em&gt;) defa yapıp, toplam harcanan süreyi ölçtüm;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=TestIterationCount.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Karşılaştırma operasyonunu gerçekleştirip, sonucu ekrana yazdırabilmek için &lt;em&gt;TestAndPrint()&lt;/em&gt; isimli bir method geliştirdim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=TestAndPrint.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bu method içerisinde, öncelikle, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stopwatch&lt;/a&gt; tipinde bir değişken oluşturuyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GarbageCollector&lt;/a&gt; tarafından testin etkilenmemesi için, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.gc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GC&lt;/a&gt; sınıfının &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.gc.collect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Collect()&lt;/a&gt; methodunu &lt;strong&gt;Generation 2&lt;/strong&gt; için çalıştırıyorum.&lt;/p&gt;

&lt;p&gt;Sonra da, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.gc.waitforfullgccomplete&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WaitForFullGCComplete()&lt;/a&gt; methodu ile, eğer yürüyen bir &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.gc.collect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Collect()&lt;/a&gt; operasyonu varsa, tamamlanmasını bekliyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stopwatch&lt;/a&gt; değişkenini &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.restart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Restart()&lt;/a&gt; edip, sıfırlıyor, &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.action&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Action&lt;/a&gt; tipinde aldığım &lt;em&gt;Test()&lt;/em&gt; parametresini çağırıyor, geçen toplam süreyi &lt;em&gt;milisaniye&lt;/em&gt; cinsinden ekrana yazıyorum.&lt;/p&gt;

&lt;p&gt;Şimdi, tek tek, &lt;em&gt;String.IndexOf()&lt;/em&gt;, &lt;em&gt;String.Contains()&lt;/em&gt;, &lt;em&gt;Regex.IsMatch()&lt;/em&gt; ve &lt;em&gt;Regex.IsMatch(Compiled)&lt;/em&gt; test senaryolarını yazalım;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;String.IndexOf()&lt;/em&gt; testi için;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=StringIndexOf.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;String.Contains()&lt;/em&gt; testi için;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=StringContains.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;Regex.IsMatch()&lt;/em&gt; testi için;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=RegexIsMatch.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;Regex.IsMatch(Compiled)&lt;/em&gt; testi için;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=RegexIsMatchCompiled.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Şimdi, &lt;em&gt;TestScenarios&lt;/em&gt; &lt;strong&gt;class&lt;/strong&gt; içerisine &lt;em&gt;InvokeTest()&lt;/em&gt; methodu yazıyoruz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=InvokeTests.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Her testi &lt;em&gt;2&lt;/em&gt; kere çalıştırıyoruz, biri karşılaştırma sonucu &lt;em&gt;başarılı olacak&lt;/em&gt; şekilde, biri &lt;em&gt;başarılı olmayacak&lt;/em&gt; şekilde.&lt;/p&gt;

&lt;p&gt;Gelelim, en önemli kısma, karşılaştırma sonuçları :)&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/11/string-performance-comparison.png&quot; width=&quot;962&quot; height=&quot;429&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sonuçlara baktığım zaman aşağıdaki noktalar dikkatimi çekti;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tüm testlerde arama sonucu bulunmadığı zaman, arama sonucu bulunduğu zamana göre daha iyi performans göstermiş&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Regex&lt;/em&gt; karşılaştırmaları en yavaş olanlar&lt;/li&gt;
&lt;li&gt;&lt;em&gt;String.Contains()&lt;/em&gt; karşılaştırması, &lt;em&gt;String.IndexOf()&lt;/em&gt; karşılaştırmasından daha iyi performans göstermiş&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Microsoft&lt;/strong&gt;‘un &lt;strong&gt;Github&lt;/strong&gt;‘da yayınladığı &lt;a href=&quot;https://github.com/Microsoft/referencesource&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ReferenceSource&lt;/a&gt; repository’sinde &lt;a href=&quot;https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/string.cs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;String&lt;/a&gt; classının &lt;em&gt;Contains()&lt;/em&gt; methodu aşağıdaki şekilde yazılmış;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/20456c4700311bd30f3d19c865a85173.js?file=String.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Aslında &lt;em&gt;Contains()&lt;/em&gt; methodu, içeride &lt;em&gt;IndexOf()&lt;/em&gt; methodunu çağırıyor.&lt;/p&gt;

&lt;p&gt;Peki, neden bizim testlerimizde &lt;em&gt;Contains()&lt;/em&gt; ve &lt;em&gt;IndexOf()&lt;/em&gt; farklı sonuçlar üretti?&lt;/p&gt;

&lt;p&gt;Çünkü, &lt;em&gt;Contains()&lt;/em&gt; methodu içinden &lt;em&gt;IndexOf()&lt;/em&gt; methodu, &lt;code&gt;StringComparison.Ordinal&lt;/code&gt; parametresi ile çağırılıyor.&lt;/p&gt;

&lt;p&gt;Eğer kendi uygulamalarımızda &lt;em&gt;IndexOf()&lt;/em&gt; methodunu çağıracaksak, &lt;code&gt;StringComparison.Ordinal&lt;/code&gt; parametresini kullanmamız performans artışı sağlayacaktır.&lt;/p&gt;

&lt;p&gt;Daha kolayı, &lt;em&gt;Contains()&lt;/em&gt; methodunu kullanmak :)&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/csharp-string-indexof-contains-regex-ismatch-compiled-performans-karsilastirma/</link>
                <guid>http://polatengin.github.io/csharp-string-indexof-contains-regex-ismatch-compiled-performans-karsilastirma</guid>
                <pubDate>Sat, 18 Nov 2017 14:15:00 +0000</pubDate>
        </item>

        <item>
                <title>DevNot .Net Core Day Etkinliği Kasım 2017</title>
                <description>&lt;p&gt;&lt;em&gt;11 Kasım 2017&lt;/em&gt; tarihinde &lt;strong&gt;DevNot .Net Core Day 2017&lt;/strong&gt; etkinliği gerçekleştirildi.&lt;/p&gt;

&lt;p&gt;Ben de &lt;strong&gt;.Net Core ile Chatbot Geliştirme&lt;/strong&gt; konulu oturumda konuşmacı olarak yer aldım.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/11/devnot-dotnet-core-day.jpg&quot; alt=&quot;DevNot .Net Core Etkinliği, Kasım 2017&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Etkinlikte gerçekleştirdim konuşmayı aşağıdaki videodan izleyebilirsiniz;&lt;/p&gt;

&lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;&lt;iframe class=&quot;embed-responsive-item&quot; src=&quot;https://www.youtube.com/embed/YAK42FtrX8c&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;Etkinliği gerçekleştirmemizi sağlayan sevgili arkadaşım &lt;em&gt;Uğur Umutluoğlu&lt;/em&gt;‘na ve etkinliğe katılan tüm arkadaşlara &lt;em&gt;teşekkür ederim&lt;/em&gt;.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/devnot-dotnet-core-day-etkinligi-kasim-2017/</link>
                <guid>http://polatengin.github.io/devnot-dotnet-core-day-etkinligi-kasim-2017</guid>
                <pubDate>Sun, 12 Nov 2017 16:30:00 +0000</pubDate>
        </item>

        <item>
                <title>C# Binary Search Tree örneği</title>
                <description>&lt;div class=&quot;alert alert-success&quot; role=&quot;alert&quot; style=&quot;margin: 10px 0px; display: block;&quot;&gt;
Bu makalenin kodlarına &lt;strong&gt;Github&lt;/strong&gt; üzerinde &lt;a href=&quot;https://github.com/polatengin&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;polatengin&lt;/a&gt; hesabımda yer alan &lt;a href=&quot;https://github.com/polatengin/blog-codes/tree/master/csharp-bst&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CSharp Binary Search Tree&lt;/a&gt; aracılığıyla erişebilirsiniz.
&lt;/div&gt;

&lt;p&gt;Bu makale de gene &lt;em&gt;email&lt;/em&gt; üzerinden aldığım bir soruyu cevaplayacağım.&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;em&gt;Soru&lt;/em&gt;, &lt;em&gt;C#&lt;/em&gt; ile &lt;strong&gt;Binary Search Tree&lt;/strong&gt; örneği nasıl geliştirebilirim?&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Önce &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapılarını inceleyelim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapıları ile, birbirleri arasında &lt;strong&gt;Parent&lt;/strong&gt;-&lt;strong&gt;Child&lt;/strong&gt; ilişkisi bulunan veriler modellenebiliyor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin&lt;/em&gt;, bilgisayardaki &lt;em&gt;dizinler&lt;/em&gt; ve &lt;em&gt;dosyalar&lt;/em&gt;, ürün ağaçları, veya organizasyon şemaları, &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapısında saklanırlar;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/10/binary-search-tree-0.png&quot; width=&quot;334&quot; height=&quot;638&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapılarında, bir öğenin birden fazla alt öğesi olabilir&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Hatta &lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) öğe bile, gerekirse birden fazla olabilir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) veri yapılarına ilişkin tanımlamalar;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;)&lt;br /&gt;
Ağacın başlangıç node'udur
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node&lt;/strong&gt; (&lt;em&gt;Düğüm&lt;/em&gt;)&lt;br /&gt;
Ağacın her bir node'una verilen isimdir
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Child&lt;/strong&gt; (&lt;em&gt;Çocuk&lt;/em&gt;)&lt;br /&gt;
Bir node'a bağlı olan node'lara verilen isimdir
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parent&lt;/strong&gt; (&lt;em&gt;Aile&lt;/em&gt;)&lt;br /&gt;
Node'ların bağlı olduğu node'a verilen isimdir
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sibling&lt;/strong&gt; (&lt;em&gt;Kardeş&lt;/em&gt;)&lt;br /&gt;
Aynı node'a bağlı olan node'lara verilen isimdir
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Degree&lt;/strong&gt; (&lt;em&gt;Derece&lt;/em&gt;)&lt;br /&gt;
Bir node'dan başlayarak en alt node'a gidene kadar geçilen katman sayıdır
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path&lt;/strong&gt; (&lt;em&gt;Yol&lt;/em&gt;)&lt;br /&gt;
Bir node'a varabilmek için izlenmesi gereken yola verilen isimdir
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Binary Tree&lt;/strong&gt; (genellikle &lt;em&gt;İkili Ağaç&lt;/em&gt; olarak Türkçeleştirilir) yapıları ise, &lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) olarak tek bir elemana sahip olan ve her dalında en fazla &lt;em&gt;2&lt;/em&gt; öğe bulunabilen özel bir &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) veri modelidir.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/10/binary-search-tree-1.png&quot; width=&quot;492&quot; height=&quot;236&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Gelelim asıl konumuza, &lt;strong&gt;Binary Search Tree&lt;/strong&gt; &lt;em&gt;:)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binary Search Tree&lt;/strong&gt; yapıları, &lt;strong&gt;Binary Tree&lt;/strong&gt; yapılarının özelleşmiş bir halidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) olarak gene tek bir &lt;em&gt;node&lt;/em&gt;‘a sahiptir, her &lt;em&gt;node&lt;/em&gt;, kendisine bağlı en fazla 2 &lt;em&gt;node&lt;/em&gt;‘a sahip olabilir.&lt;/p&gt;

&lt;p&gt;Bu noktaya kadar &lt;strong&gt;Binary Tree&lt;/strong&gt; yapıları ile aynı özelliklere sahip, farklı olarak, &lt;em&gt;node&lt;/em&gt;‘lara bağlanan &lt;em&gt;child node&lt;/em&gt;‘ların içerdiği değerler, &lt;em&gt;parent node&lt;/em&gt;‘un kendi değerinden &lt;em&gt;küçükse&lt;/em&gt; &lt;em&gt;soldaki&lt;/em&gt;, &lt;em&gt;büyük&lt;/em&gt; veya &lt;em&gt;eşitse&lt;/em&gt; &lt;em&gt;sağdaki&lt;/em&gt; &lt;em&gt;node&lt;/em&gt;‘a kaydedilir.&lt;/p&gt;

&lt;p&gt;Böylece, &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapısı üzerinde yapılacak aramalar çok hızlı sonuçlanacaktır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapısının &lt;strong&gt;Degree&lt;/strong&gt; (&lt;em&gt;Derece&lt;/em&gt;) değeri kaç ise, o kadar adımda aranan değere ulaşılabilir.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/10/binary-search-tree-2.png&quot; width=&quot;492&quot; height=&quot;219&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Yukarıdaki örnekte, &lt;em&gt;50&lt;/em&gt; değerine &lt;em&gt;1&lt;/em&gt; adımda, &lt;em&gt;72&lt;/em&gt; değerine &lt;em&gt;2&lt;/em&gt; adımda, &lt;em&gt;23&lt;/em&gt; değerine &lt;em&gt;3&lt;/em&gt; adımda, &lt;em&gt;67&lt;/em&gt; değerine &lt;em&gt;4&lt;/em&gt; adımda ulaşılabilecektir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binary Search Tree&lt;/strong&gt; yapıları sayesinde, &lt;code&gt;int.Max&lt;/code&gt; (&lt;em&gt;2^32&lt;/em&gt; : &lt;em&gt;2.147.483.647&lt;/em&gt;) kadar farklı değere sahip olan &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapılarında bile arama işlemi &lt;em&gt;32&lt;/em&gt; adımda sonuçlanacaktır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Net Core&lt;/strong&gt; ile &lt;strong&gt;Binary Search Tree&lt;/strong&gt; örneği geliştirmek için hemen yeni bir proje oluşturalım;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=dotnet-new.cmd&quot;&gt;&lt;/script&gt;

&lt;p&gt;İlk olarak &lt;code&gt;Node&lt;/code&gt; sınıfını oluşturalım. Nispeten basit bir sınıf olacak;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=Node.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;code&gt;Value&lt;/code&gt; özelliği sayesinde &lt;code&gt;int&lt;/code&gt; tipinde değer içerebiliyor, ayrıca kendisine bağlanabilecek &lt;em&gt;2&lt;/em&gt; &lt;code&gt;Node&lt;/code&gt;‘u, &lt;code&gt;Left&lt;/code&gt; ve &lt;code&gt;Right&lt;/code&gt; isimli özelliklerde tutabiliyor.&lt;/p&gt;

&lt;p&gt;Fakat &lt;code&gt;int&lt;/code&gt; yerine &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;DateTime&lt;/code&gt; veya &lt;code&gt;Customer&lt;/code&gt; tipli &lt;code&gt;Node&lt;/code&gt;‘lar oluşturmak istersek yeni &lt;code&gt;Node&lt;/code&gt; sınıfları üretmemiz gerekir.&lt;/p&gt;

&lt;p&gt;Daha iyisi, &lt;code&gt;Node&lt;/code&gt; sınıfını &lt;strong&gt;Generic&lt;/strong&gt; hale getirmek;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=NodeOfT.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Artık &lt;code&gt;Tree&lt;/code&gt; sınıfını yazabiliriz ve onu da &lt;strong&gt;Generic&lt;/strong&gt; yapmakta fayda var;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=TreeOfT.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;code&gt;Tree&lt;/code&gt; sınıfına yazdığımız &lt;code&gt;Top&lt;/code&gt; özelliği sayesinde, &lt;strong&gt;Tree&lt;/strong&gt; (&lt;em&gt;Ağaç&lt;/em&gt;) yapısının başlangıç &lt;code&gt;Node&lt;/code&gt;‘unu tanımlamış olduk.&lt;/p&gt;

&lt;p&gt;Aslında &lt;strong&gt;Binary Search Tree&lt;/strong&gt; yapısını tamamlamış olduk. Fakat yeni &lt;code&gt;Node&lt;/code&gt; eklemek, hatta ekranda listelemek için gereken method’ları da &lt;code&gt;Tree&lt;/code&gt; sınıfına eklememiz iyi olacaktır.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Node&lt;/code&gt; eklemek için &lt;code&gt;Tree&lt;/code&gt; sınıfına &lt;code&gt;Add()&lt;/code&gt; methodu ekleyelim.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Add()&lt;/code&gt; methodu parametre olarak &lt;code&gt;T&lt;/code&gt; tipinde değer alsın ve bu değere uygun bir yer bulup ekleme işlemini gerçekleştirsin.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=AddWithT.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Hatta, &lt;code&gt;Add()&lt;/code&gt; sınıfının &lt;code&gt;T&lt;/code&gt; tipinde parametresini dizi şeklinde yapalım, böylece, istenirse aynı anda birden fazla değer ekleme işlemine tabi tutulabilir.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=AddWithTArray.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Hatta, &lt;code&gt;T[]&lt;/code&gt; tipindeki parametrenin başına &lt;code&gt;params&lt;/code&gt; anahtar kelimesini ekleyebiliriz ve böylece &lt;code&gt;Add()&lt;/code&gt; methodu çağırılırken değerler dizi şeklinde değil, virgülle ayrılmış şekilde de verilebilir.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=AddWithParamsTArray.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Binary Search Tree&lt;/strong&gt; yapısına ekleyeceğimiz &lt;code&gt;Node&lt;/code&gt;‘ları, mümkün olduğu kadar dengelememiz iyi olacaktır. Böylece, arama işlemi çok hızlı gerçekleşir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dengeli&lt;/em&gt; dağıtılan &lt;code&gt;Node&lt;/code&gt; yapısına &lt;strong&gt;Balanced Tree&lt;/strong&gt; adı verilir.&lt;/p&gt;

&lt;p&gt;Eğer &lt;em&gt;dengeli&lt;/em&gt; bir ağaç yapısı oluşturamazsak, &lt;code&gt;Node&lt;/code&gt;‘lar &lt;em&gt;sağlı-sollu&lt;/em&gt; değil, &lt;em&gt;uç-uca&lt;/em&gt; dizilecektir.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/10/binary-search-tree-3.png&quot; width=&quot;206&quot; height=&quot;210&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uç-Uca&lt;/em&gt; dizilen &lt;code&gt;Node&lt;/code&gt;‘lar üzerinde arama yapılacağı zaman &lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) &lt;code&gt;Node&lt;/code&gt;‘dan başlanıp, neredeyse tüm Node’lara uğranması gerekir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dengeli&lt;/em&gt; dizilen &lt;code&gt;Node&lt;/code&gt;‘lar üzerinde arama yapılacağı zaman ise, &lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) &lt;code&gt;Node&lt;/code&gt;‘dan başlandığında, her seferinde ya &lt;code&gt;Left Node&lt;/code&gt;, ya &lt;code&gt;Right Node&lt;/code&gt; üzerinden devam edilerek, çok daha az &lt;code&gt;Node&lt;/code&gt;‘a uğranır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binary Search Tree&lt;/strong&gt; yapısını &lt;strong&gt;Balanced&lt;/strong&gt; (&lt;em&gt;Dengeli&lt;/em&gt;) hale getirmek için, ekleyeceğimiz &lt;code&gt;Node&lt;/code&gt;‘ların tam orta noktasını &lt;strong&gt;Root&lt;/strong&gt; (&lt;em&gt;Kök&lt;/em&gt;) &lt;code&gt;Node&lt;/code&gt; olarak belirlemeliyiz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Add()&lt;/code&gt; methodunun içerisinde, parametre olarak gelen dizinin orta noktasını bulmak için, önce sıralıyor, sonra dizi uzunluğunun yarısı kadar elemanı atlıyor, karşımıza çıkan ilk elemanı seçiyoruz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=SelectMiddleItem.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Orta elemanı diziden çıkartıp, dizinin ilk elemanı olacak şekilde tekrar &lt;code&gt;Insert()&lt;/code&gt; ediyoruz.&lt;/p&gt;

&lt;p&gt;Artık dizi üzerinde bir döngü kurup, tüm &lt;code&gt;Node&lt;/code&gt;‘ları tek tek oluşturabiliriz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=ForEachLoop.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Burada dikkat edilmesi gereken noktalar,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Top&lt;/code&gt; özelliğine dizinin ilk kaydını (dizinin orta elemanı aslında) vermemiz&lt;/li&gt;
&lt;li&gt;Döngünün her &lt;em&gt;iteration&lt;/em&gt;'ında dizi elemanını &lt;code&gt;Tree&lt;/code&gt;'nin &lt;code&gt;Node&lt;/code&gt;'ları ile karşılaştırıyoruz&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Comparer&amp;lt;T&amp;gt;&lt;/code&gt; sınıfının &lt;code&gt;Default&lt;/code&gt; özelliğinde yer alan &lt;code&gt;Compare&lt;/code&gt; methodu ile karşılaştırma yapıyoruz&lt;/li&gt;
&lt;li&gt;Eğer karşılaştırma sonucunda &lt;em&gt;-1&lt;/em&gt; değerini elde ediyorsak, daha küçük, &lt;em&gt;0&lt;/em&gt; elde ediyorsak eşit, &lt;em&gt;1&lt;/em&gt; elde ediyorsak daha büyük demektir&lt;/li&gt;
&lt;li&gt;Karşılaştırma sonucuna göre ya &lt;code&gt;Left&lt;/code&gt; ya da &lt;code&gt;Right&lt;/code&gt; özelliği üzerinden ilerleyerek, &lt;code&gt;Tree&lt;/code&gt;'ye &lt;code&gt;Node&lt;/code&gt; eklemesi yapıyoruz&lt;/li&gt;
&lt;/ul&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/10279a044c0b672d5e14ea375b16422c.js?file=AddMethod.cs&quot;&gt;&lt;/script&gt;

</description>
                <link>http://polatengin.github.io/csharp-binary-search-tree-ornegi/</link>
                <guid>http://polatengin.github.io/csharp-binary-search-tree-ornegi</guid>
                <pubDate>Wed, 18 Oct 2017 12:30:00 +0000</pubDate>
        </item>

        <item>
                <title>Kocaeli Üniversitesi IT Fest Etkinliği Ekim 2017</title>
                <description>&lt;p&gt;&lt;em&gt;04 Ekim 2017&lt;/em&gt; tarihinde &lt;em&gt;Kocaeli Üniversitesi Bilişim Teknolojileri Kulübü&lt;/em&gt; tarafından organize edilen &lt;strong&gt;IT Fest 2017&lt;/strong&gt; etkinliği gerçekleştirildi.&lt;/p&gt;

&lt;p&gt;Ben ve sevgili arkadaşım &lt;em&gt;Bora Kaşmer&lt;/em&gt; de &lt;strong&gt;.Net Core ve Angular ile oluşturulan projenin Azure’da yayınlanması&lt;/strong&gt; konulu oturumda &lt;em&gt;canlı kodlama&lt;/em&gt; (&lt;strong&gt;live-coding&lt;/strong&gt;) yaptık.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/10/itfest2017.png&quot; width=&quot;600&quot; height=&quot;840&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Katılan tüm arkadaşlara &lt;em&gt;teşekkür ederim&lt;/em&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/kocaeli-universitesi-it-fest-etkinligi-ekim-2017/</link>
                <guid>http://polatengin.github.io/kocaeli-universitesi-it-fest-etkinligi-ekim-2017</guid>
                <pubDate>Thu, 05 Oct 2017 16:30:00 +0000</pubDate>
        </item>

        <item>
                <title>UWP uygulamasında kullanıcının/bilgisayarın dilini bulmak</title>
                <description>&lt;p&gt;Bir &lt;strong&gt;UWP&lt;/strong&gt; projesinde, bilgisayarın hangi dil ile kullanıldığını bulmak ve bu dile göre bir takım değişiklikler yapmak gerekebilir.&lt;/p&gt;

&lt;p&gt;Örneğin, &lt;em&gt;ondalık haneleri&lt;/em&gt; &lt;strong&gt;nokta&lt;/strong&gt; (.) veya &lt;strong&gt;virgül&lt;/strong&gt; (,) ile ayırmak, tarihi &lt;em&gt;Gün/Ay/Yıl&lt;/em&gt; şeklinde yerine &lt;em&gt;Ay/Gün/Yıl&lt;/em&gt; şeklinde göstermek, hatta ekrandaki metinlerin &lt;strong&gt;Türkçe&lt;/strong&gt; yerine &lt;strong&gt;İngilizce&lt;/strong&gt; gelmesini sağlamak, gibi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UWP&lt;/strong&gt; uygulama geliştirirken kullandığımız &lt;strong&gt;Windows SDK&lt;/strong&gt; içerisinde, bilgisayarın dilini bulabileceğimiz birkaç yol var.&lt;/p&gt;

&lt;p&gt;İlk yol, &lt;a href=&quot;https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.resources.core&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windows.ApplicationModel.Resources.Core&lt;/a&gt; &lt;em&gt;namespace&lt;/em&gt;‘inde yeralan &lt;a href=&quot;https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.resources.core.resourcecontext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ResourceContext&lt;/a&gt; sınıfının, &lt;code&gt;GetForCurrentView()&lt;/code&gt; methodu ile elde ettiğimiz nesnenin &lt;code&gt;Languages&lt;/code&gt; özelliğine başvurmak.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bu özelliğin içerisinde diller dizi şeklinde durduğu için, ilk öğeyi aldığımızda, kullanıcının tercih ettiği dile ulaşmış oluruz&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/eca20f3bfe1cd68cb5796442eebf31f7.js?file=option-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;İkinci yol ise, &lt;a href=&quot;https://docs.microsoft.com/en-us/uwp/api/windows.system.userprofile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windows.System.UserProfile&lt;/a&gt; &lt;em&gt;namespace&lt;/em&gt;‘inde yeralan &lt;a href=&quot;https://docs.microsoft.com/en-us/uwp/api/windows.system.userprofile.globalizationpreferences&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GlobalizationPreferences&lt;/a&gt; sınıfının &lt;em&gt;static&lt;/em&gt; olan &lt;code&gt;Languages&lt;/code&gt; özelliğine başvurmak.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bu özelliğin de içerisinde diller dizi şeklinde durduğu için, ilk öğeyi aldığımızda, kullanıcının tercih ettiği dile ulaşmış oluruz&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/eca20f3bfe1cd68cb5796442eebf31f7.js?file=option-2.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Hangi yöntemi tercih edersek edelim, elde ettiğimiz dil bilgisi &lt;a href=&quot;https://tools.ietf.org/html/bcp47&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BCP47&lt;/a&gt; formatında olacak (&lt;em&gt;en-US&lt;/em&gt;, &lt;em&gt;tr-TR&lt;/em&gt;, gibi)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tarih formatı&lt;/em&gt;, &lt;em&gt;Rakam formatı&lt;/em&gt; gibi değerlerine ulaşabilmek için &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.globalization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;System.Globalization&lt;/a&gt; &lt;em&gt;namespace&lt;/em&gt;‘inde bulunan &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CultureInfo&lt;/a&gt; sınıfına ihtiyacımız var.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/eca20f3bfe1cd68cb5796442eebf31f7.js?file=CultureInfo.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Böylece, uygulamamız için gereken &lt;em&gt;tarih formatı&lt;/em&gt;, &lt;em&gt;rakam formatı&lt;/em&gt; gibi bilgilere ulaşabiliriz.&lt;/p&gt;

&lt;p&gt;Ayrıca, &lt;strong&gt;.Net&lt;/strong&gt;‘in ilk yıllarından beri kullandığımız &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CultureInfo&lt;/a&gt; sınıfının &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CurrentCulture&lt;/a&gt; özelliği hala varlığını sürdürmekte.&lt;/p&gt;

&lt;p&gt;Bu özellik sayesinde bir adımda, istediğimiz &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CultureInfo&lt;/a&gt; nesnesine kavuşabiliriz.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/eca20f3bfe1cd68cb5796442eebf31f7.js?file=option-3.cs&quot;&gt;&lt;/script&gt;

</description>
                <link>http://polatengin.github.io/uwp-uygulamasinda-kullanicinin-bilgisayarin-dilini-bulmak/</link>
                <guid>http://polatengin.github.io/uwp-uygulamasinda-kullanicinin-bilgisayarin-dilini-bulmak</guid>
                <pubDate>Thu, 21 Sep 2017 16:15:00 +0000</pubDate>
        </item>

        <item>
                <title>Angular ile sayfanın en altına geldiğini anlamak (Sonsuz -infinite- scroll)</title>
                <description>&lt;p&gt;&lt;mark&gt;&lt;em&gt;Bu makaleyi okumadan önce &lt;a href=&quot;/etiketler/#angular-ref&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Angular&lt;/a&gt; etiketindeki diğer makalelerimi okumanızı tavsiye ederim.&lt;/em&gt;&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Bazı web sitelerinde sitenin en altına indiğinizde yeni verilerin otomatik olarak yüklendiğini farketmişsinizdir.&lt;/p&gt;

&lt;p&gt;Örneğin, &lt;a href=&quot;https://facebook.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;facebook&lt;/a&gt;, &lt;a href=&quot;https://twitter.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;twitter&lt;/a&gt; gibi uygulamalar sayfanın en altına gittiğinizde yeni post’ları sayfaya yükler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Angular&lt;/strong&gt; ile geliştirdiğimiz uygulamada biz de aynı şekilde sayfanın en altına geldiğimizde daha fazla veri yüklenmesini veya bir sonraki haberin sayfaya getirilmesini sağlayabiliriz.&lt;/p&gt;

&lt;p&gt;Bunun için öncelikle bir &lt;strong&gt;Angular&lt;/strong&gt; projesi oluşturmamız lazım, hemen &lt;strong&gt;Command Prompt&lt;/strong&gt; (&lt;em&gt;Windows&lt;/em&gt;) veya &lt;strong&gt;Terminal&lt;/strong&gt; (&lt;em&gt;MacOs&lt;/em&gt;, &lt;em&gt;Linux&lt;/em&gt;) penceresi açalım ve aşağıdaki komutu girelim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/313a5d84fc428046b8be6947beda9405.js?file=angular-command.ps1&quot;&gt;&lt;/script&gt;

&lt;p&gt;Sayfanın en altına kaydırıldığımızı anlayabilmek için &lt;mark&gt;javascript&lt;/mark&gt; aracılığıyla erişebileceğimiz &lt;code&gt;window&lt;/code&gt; nesnesinin &lt;code&gt;scroll&lt;/code&gt; &lt;em&gt;event&lt;/em&gt;‘ine &lt;em&gt;attach&lt;/em&gt;‘lanmamız lazım.&lt;/p&gt;

&lt;p&gt;Yapmamız gereken ilk iş, sayfanın yüksekliğini elde etmek. Bunun için, eğer &lt;code&gt;window&lt;/code&gt; nesnesinin &lt;code&gt;innerHeight&lt;/code&gt; özelliği varsa bu özelliğin değerini, yoksa, &lt;code&gt;document&lt;/code&gt; nesnesinin &lt;code&gt;documentElement&lt;/code&gt; özelliğinin &lt;code&gt;offsetHeight&lt;/code&gt; değerini okumalıyız.&lt;/p&gt;

&lt;p&gt;İkinci adımda, &lt;code&gt;document&lt;/code&gt; nesnesinin &lt;code&gt;body&lt;/code&gt; özelliğinde ve &lt;code&gt;documentElement&lt;/code&gt; özelliğinde bulunan &lt;code&gt;scrollHeight&lt;/code&gt;, &lt;code&gt;offsetHeight&lt;/code&gt;, &lt;code&gt;clientHeight&lt;/code&gt; özelliklerinden değeri en büyük olanı alıyoruz.&lt;/p&gt;

&lt;p&gt;Artık tek yapmamız gereken, o anda &lt;code&gt;scroll&lt;/code&gt;‘un bulunduğu pozisyonu, sayfanın yüksekliği ile karşılaştırmak ve sayfanın el altına gelip gelmediğimizi bu karşılaştırmadan elde etmek.&lt;/p&gt;

&lt;p&gt;Eğer bu kodları herhangi bir &lt;strong&gt;Angular Component&lt;/strong&gt; &lt;em&gt;class&lt;/em&gt;‘ının &lt;strong&gt;constructor&lt;/strong&gt;‘ına yazacak olursak ilgili sayfada &lt;em&gt;scroll&lt;/em&gt;‘un en alta geldiği anı tespit edebiliriz.&lt;/p&gt;

&lt;p&gt;Örneğin;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/313a5d84fc428046b8be6947beda9405.js?file=app.component.ts&quot;&gt;&lt;/script&gt;

</description>
                <link>http://polatengin.github.io/angular-ile-sayfanin-altina-geldigini-anlamak-sonsuz-infinite-scroll/</link>
                <guid>http://polatengin.github.io/angular-ile-sayfanin-altina-geldigini-anlamak-sonsuz-infinite-scroll</guid>
                <pubDate>Sun, 10 Sep 2017 12:00:00 +0000</pubDate>
        </item>

        <item>
                <title>Açık Akademi Yaz Okulu 2017</title>
                <description>&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/08/yazokulu-2017.jpg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Her sene üniversitelerin yaz tatiline girmesiyle &lt;em&gt;Microsoft&lt;/em&gt; tarafından bir &lt;strong&gt;Yaz Okulu&lt;/strong&gt; etkinliği gerçekleştiriliyor.&lt;/p&gt;

&lt;p&gt;Son yıllarda olduğu gibi bu yıl da &lt;strong&gt;Microsoft Yaz Okulu&lt;/strong&gt;na eğitmen olarak katıldım.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;04 Ağustos 2017&lt;/em&gt;, &lt;em&gt;08 Ağustos 2017&lt;/em&gt;, &lt;em&gt;16 Ağustos 2017&lt;/em&gt; ve &lt;em&gt;22 Ağustos 2017&lt;/em&gt; tarihlerinde &lt;strong&gt;Microsoft Türkiye&lt;/strong&gt; ofisinde gerçekleştirdiğim seanslarda &lt;strong&gt;Universal Windows Platform&lt;/strong&gt;, &lt;strong&gt;Microsoft Azure&lt;/strong&gt;, &lt;strong&gt;HTML&lt;/strong&gt;, &lt;strong&gt;Javascript&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, &lt;strong&gt;Xamarin&lt;/strong&gt; ve &lt;strong&gt;Asp.Net Core&lt;/strong&gt; konularında eğitimler verdim.&lt;/p&gt;

&lt;p&gt;Tüm &lt;em&gt;Yaz Okulu&lt;/em&gt; öğrencilerine, beni sabırla dinledikleri için &lt;em&gt;teşekkür ediyor&lt;/em&gt;, özverili katılımlarından dolayı da &lt;em&gt;tebrik&lt;/em&gt; ediyorum.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/acik-akademi-yaz-okulu-2017/</link>
                <guid>http://polatengin.github.io/acik-akademi-yaz-okulu-2017</guid>
                <pubDate>Wed, 23 Aug 2017 11:45:00 +0000</pubDate>
        </item>

        <item>
                <title>Windows 10 UWP uygulamasının kendini kapatıp tekrar başlatması (Restart)</title>
                <description>&lt;div class=&quot;alert alert-success&quot; role=&quot;alert&quot; style=&quot;margin: 10px 0px; display: block;&quot;&gt;
Bu makalenin kodlarına &lt;strong&gt;Github&lt;/strong&gt; üzerinde &lt;a href=&quot;https://github.com/polatengin&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;polatengin&lt;/a&gt; hesabımda yer alan &lt;a href=&quot;https://github.com/polatengin/blog-codes/tree/master/windows-10-uwp-restart-project&quot; class=&quot;alert-link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Windows 10 UWP Restart Project&lt;/a&gt; aracılığıyla erişebilirsiniz.
&lt;/div&gt;

&lt;p&gt;Birçok uygulama için kendini kapatıp tekrar başlatma (özellikle de değiştirilen bir ayarı veya lisansı güncelleyerek başlatma) sıklıkla ihtiyaç duyulan bir özelliktir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows 10 UWP&lt;/strong&gt; uygulamalarını kapatmak için &lt;em&gt;Windows.ApplicationModel.Core&lt;/em&gt; namespace’inde yeralan &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.applicationmodel.core.coreapplication&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CoreApplication&lt;/a&gt; sınıfının &lt;code&gt;Exit()&lt;/code&gt; methodunu çağırmamız yeterli.&lt;/p&gt;

&lt;p&gt;Fakat uygulamanın tekrar başlatılmasını kullanıcıdan beklemek zorunda kalıyoruz. Daha iyi bir kullanım deneyimi için aslında uygulamanın kendisini kapatıp tekrar başlatabilmesi lazım.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows 10 UWP&lt;/strong&gt; projelerinde, uygulamanın kendini kapatıp tekrar başlatabilmesini sağlamak, aslında çok kolay.&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;strong&gt;Önemli not :&lt;/strong&gt; Bu özelliğin çalışması için bilgisayarda &lt;em&gt;Windows 10 Build 16226&lt;/em&gt; veya sonrası kurulu olmalı&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Hemen yeni bir &lt;strong&gt;Visual Studio&lt;/strong&gt; açalım ve &lt;strong&gt;Windows 10 UWP&lt;/strong&gt; projesi oluşturalım, ben bu makalede projeme &lt;em&gt;RestartProject&lt;/em&gt; ismini verdim.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/08/restart-0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Öncelikle &lt;em&gt;MainPage.xaml&lt;/em&gt; dosyasını açalım ve aşağıdaki şekilde güncelleyelim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/757a31eaa27549023ba0713a09c040b1.js?file=MainPage.xaml&quot;&gt;&lt;/script&gt;

&lt;p&gt;Şimdi &lt;em&gt;MainPage.xaml.cs&lt;/em&gt; dosyasını açalım ve aşağıdaki kodları yazalım;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/757a31eaa27549023ba0713a09c040b1.js?file=MainPage.xaml.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;Bu seçim ile yeniden başlat&lt;/em&gt; butonuna tıklandığı zaman, &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.applicationmodel.core.coreapplication&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CoreApplication&lt;/a&gt; sınıfında yeralan &lt;code&gt;RequestRestartAsync()&lt;/code&gt; methodunu çağırıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RequestRestartAsync()&lt;/code&gt; methodu parametre alabiliyor ve bu parametreyi, uygulama baştan başlatıldığı zaman &lt;em&gt;App.xaml.cs&lt;/em&gt; dosyasında yeralan &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.ui.xaml.application&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OnActivated()&lt;/a&gt; methoduna gönderiyor.&lt;/p&gt;

&lt;p&gt;Projede yeralan &lt;em&gt;App.xaml.cs&lt;/em&gt; dosyasını açalım ve aşağıdaki kodları yazalım;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/757a31eaa27549023ba0713a09c040b1.js?file=App.xaml.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Böylece ekrandaki listeden seçili olan öğreyi uygulama kapanıp tekrar açılırken parametre olarak kullanıyoruz. Uygulama tekrar başladığı zaman seçili olan öğe seçili olarak başlatılıyor.&lt;/p&gt;

&lt;p&gt;Örnek kullanım alanları;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tema seçimi&lt;/li&gt;
&lt;li&gt;Yeni versiyon güncellemesi&lt;/li&gt;
&lt;li&gt;Ayar değişikliği&lt;/li&gt;
&lt;li&gt;vs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/08/restart-1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Bu makale &lt;a href=&quot;https://blogs.windows.com/buildingapps/2017/07/28/restart-app-programmatically/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How to Restart your App Programmatically&lt;/a&gt; makalesi baz alınarak yazılmıştır :)&lt;/small&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/windows-10-uwp-uygulamasinin-kendini-kapatip-tekrar-baslatmasi-restart/</link>
                <guid>http://polatengin.github.io/windows-10-uwp-uygulamasinin-kendini-kapatip-tekrar-baslatmasi-restart</guid>
                <pubDate>Sun, 06 Aug 2017 12:00:00 +0000</pubDate>
        </item>

        <item>
                <title>C# for ve foreach döngüsü arasındaki farklar</title>
                <description>&lt;p&gt;Bu makalede &lt;strong&gt;C#&lt;/strong&gt; ile &lt;code&gt;for&lt;/code&gt; ve &lt;code&gt;foreach&lt;/code&gt; döngüleri arasındaki farkları inceleyeceğiz.&lt;/p&gt;

&lt;p&gt;Böylece &lt;a href=&quot;https://github.com/polatengin/polatengin.github.io/issues/1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#1&lt;/a&gt; numaralı istek makaleyi yazmış olacağım :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not : &lt;a href=&quot;https://github.com/polatengin/polatengin.github.io/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Issues&lt;/a&gt; sayfasında varolan makale isteklerini görebileceğinizi, hatta &lt;a href=&quot;https://github.com/polatengin/polatengin.github.io/issues/new&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yeni makale isteğinde&lt;/a&gt; bulunabileceğinizi biliyor muydunuz?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Öncelikle &lt;strong&gt;for&lt;/strong&gt; ve &lt;strong&gt;foreach&lt;/strong&gt; döngülerini &lt;strong&gt;C#&lt;/strong&gt; programlama dilinde nasıl kullanıyoruz, nasıl yazıyoruz, hemen hatırlayalım;&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;strong&gt;for&lt;/strong&gt; döngüsünün özelliği, bir başlangıç noktasından bir bitiş noktasına doğru, istediğimiz adım aralığında ilerleyebilmesidir.&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin, Nisan ayının günlerini ekranda göstermek istersek aşağıdaki gibi 0..30 arasında sırasıyla ilerleyen bir döngü oluşturabiliriz;&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;Eğer olimpiyatların hangi tarihlerde gerçekleştirildiğini ekranda göstermemiz gerekiyorsa, aşağıdaki örnekte olduğu gibi, dizi değişkeninin başlangıç değerini ilk olimpiyatın yapıldığı 1896 yılına ayarlar, döngünün bulunduğumuz yıla kadar (bulunduğumuz yıl dahil) sürmesini sağlar, her 4. yılı elde edebiliriz;&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-2.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Hatta, istersek &lt;code&gt;for&lt;/code&gt; döngüsünün tersten çalışmasını bile sağlayabiliriz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-3.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;mark&gt;&lt;strong&gt;foreach&lt;/strong&gt; döngüsünün özelliği, bir listenin üzerinde adım adım ilerleyerek tüm öğelerini bize &lt;em&gt;sadece-okunur&lt;/em&gt; olarak sağlamasıdır.&lt;/mark&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=foreach-loop.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;foreach&lt;/strong&gt; döngüsünde unutulmaması gereken önemli nokta, döngü değişkeninin &lt;strong&gt;sadece-okunur&lt;/strong&gt; (&lt;em&gt;read-only&lt;/em&gt;) olmasıdır. Aşağıdaki örnekte olduğu gibi değişkenin değeri üzerinde &lt;strong&gt;değişiklik yapamayız&lt;/strong&gt;;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=foreach-variable-readonly.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;for&lt;/strong&gt; döngüleri &lt;em&gt;genellikle&lt;/em&gt; bir dizinin öğeleri üzerinde gezinmek için kullanılır. Örneğin;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-to-array-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bu kod örneğinde, şöyle bir problem var; döngünün ilk adımı gerçekleştikten sonra önce &lt;code&gt;iLoop&lt;/code&gt; isimli döngü değişkeninin değeri 1 arttırılacak. Sonra &lt;code&gt;iLoop&lt;/code&gt; değişkeninin değeri döngünün sonuna erişilip-erişilmediği belirlensin diye dizideki eleman adedi ile karşılaştırılacak.&lt;/p&gt;

&lt;p&gt;Bir sonraki döngü adımının sonunda gene &lt;code&gt;iLoop&lt;/code&gt; değişkenin değeri 1 arttırılacak ve döngünün sonuna gelinip-gelinmediğinin belirlenmesi için dizideki eleman adedi ile karşılaştırılacak.&lt;/p&gt;

&lt;p&gt;Hatta &lt;mark&gt;dizideki eleman adedi ile karşılaştırma her döngü adımında tekrar tekrar yapılacak.&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Çok önemli gibi gözükmese de, &lt;mark&gt;dizideki eleman adedini döngü öncesi bir değişkene alıp, döngü içerisinde hep bu değişken ile kontrol etmek, performansa olumlu katkı sağlayacaktır.&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not: döngünün başından sonuna kadar dizideki eleman adedinin değişmediğini varsayıyorum&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-to-array-2.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Hatta, madem &lt;code&gt;for&lt;/code&gt; döngüsünün ilk parçasında döngü değişkenini tanımlıyoruz, aynı anda ikinci bir değişken daha tanımlayamaz mıyız?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tanımlayabiliriz&lt;/em&gt; :)&lt;/p&gt;

&lt;p&gt;Aşağıdaki kod örneğinden de görebileceğiniz gibi, aynı anda iki değişken tanımlayıp, biri ile döngüyü ilerletmek, diğeri ile dizideki eleman adedini bir defa hesaplatmak mümkün;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=for-loop-to-array-3.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Performans karşılaştırması için aşağıdaki küçük uygulamayı geliştirdim;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/d197a257501e1d59085b2bdb25d255ba.js?file=Test-Program.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Sonuçlar, &lt;em&gt;bilgisayarın konfigürasyonuna&lt;/em&gt;, &lt;em&gt;o an çalışmakta olan uygulamalara&lt;/em&gt;, &lt;strong&gt;debug&lt;/strong&gt;-&lt;strong&gt;release&lt;/strong&gt; mode’lara, &lt;strong&gt;x86&lt;/strong&gt;-&lt;strong&gt;x64&lt;/strong&gt; mimariler arasındaki farklara, &lt;em&gt;.Net versiyonuna&lt;/em&gt;, vs göre o kadar fazla farklılık gösterebilir ki, performans konusuna çok vakit ayırmak istemedim.&lt;/p&gt;

&lt;p&gt;Eğer yorumunuz veya sorunuz varsa, lütfen aşağıya yazınız. Sizin sistemlerinizde üretilecek sonuçları da merak ediyorum.&lt;/p&gt;

&lt;p&gt;Benim kullanmakta olduğum notebook’ta sonuçlar aşağıdaki gibi;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPU:&lt;/strong&gt; &lt;em&gt;i7 7700HQ x64&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;OS:&lt;/strong&gt; &lt;em&gt;Windows 10 (16241) 64bit&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; &lt;em&gt;32GB 2666MHz&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/07/for-foreach.png&quot; alt=&quot;for ve foreach döngüleri performans karşılaştırması&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Benim ortamımda &lt;code&gt;foreach&lt;/code&gt; döngüsü, &lt;code&gt;for&lt;/code&gt; döngüsünden daha performanslı çıktı. &lt;em&gt;80.000&lt;/em&gt; elemanlı bir dizide aradaki fark &lt;em&gt;birkaç nanosaniye&lt;/em&gt; civarında olsa da, &lt;em&gt;800.000.000&lt;/em&gt; elemanlı bir dizide fark yaklaşık &lt;em&gt;700ms&lt;/em&gt; civarına çıkıyor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Çok elemanlı olmasa da sürekli üzerinde döndüğümüz diziler varsa, her seferinde kazanacağımız nanosaniyeler-milisaniyeler, toplamda büyük rakamlara ulaşabilir&lt;/em&gt; ;)&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/c-sharp-for-ve-foreach-dongusu-arasindaki-farklar/</link>
                <guid>http://polatengin.github.io/c-sharp-for-ve-foreach-dongusu-arasindaki-farklar</guid>
                <pubDate>Fri, 21 Jul 2017 22:30:00 +0000</pubDate>
        </item>

        <item>
                <title>Windows 10 UWP uygulamalarını komut satırından çalıştırma (Command Line Activation)</title>
                <description>&lt;p&gt;Eski nesil Windows uygulamaları (&lt;em&gt;Win32&lt;/em&gt;) ile yeni nesil Windows uygulamaları (&lt;em&gt;UWP&lt;/em&gt;) arasında en önemli farklardan biri komut satırından etkinleştirme eksikliği idi.&lt;/p&gt;

&lt;p&gt;Komut satırı üzerinden etkinleştirme eksikliğinden dolayı, &lt;em&gt;UWP&lt;/em&gt; uygulamalarını komut satırına &lt;em&gt;notepad.exe&lt;/em&gt; yazıp çalıştırır gibi çalıştıramıyorduk. &lt;em&gt;UWP&lt;/em&gt; uygulamaları sadece &lt;em&gt;Başlat Menüsü&lt;/em&gt; kısayolu üzerinden çalıştırılabiliyordu.&lt;/p&gt;

&lt;p&gt;Haliyle parametre alarak ve ilgili parametre üzerinden başlatılabilme yeteneğine de sahip olamıyorlardı.&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;em&gt;Windows 10 Insider 16226&lt;/em&gt; sürümünden itibaren UWP projelerine &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-extensions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;App Execution Alias Extension&lt;/a&gt; ekleyerek bir komut satırı uzantısına sahip olmaları sağlanabiliyor.&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Uygulamamıza bu özelliği katmak aslında çok kolay, hemen &lt;em&gt;Visual Studio&lt;/em&gt;‘yu açalım ve &lt;em&gt;CommandLineActivationProject&lt;/em&gt; isminde bir &lt;strong&gt;UWP&lt;/strong&gt; projesi oluşturalım;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/07/commandlineactivation-0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Yapmamız gereken iki adım var;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/uapmanifestschema/schema-root&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Package.appxmanifest&lt;/a&gt; dosyasına &lt;code&gt;appExecutionAlias&lt;/code&gt; *extension* eklenmeli&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;App.xaml.cs&lt;/mark&gt; dosyasına &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.ui.xaml.application#Windows_UI_Xaml_Application_OnActivated_Windows_ApplicationModel_Activation_IActivatedEventArgs_&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OnActivated()&lt;/a&gt; methodu eklenmeli&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sırayla bu adımları gerçekleştirelim;&lt;/p&gt;

&lt;p&gt;Öncelikle &lt;mark&gt;Package.appxmanifest&lt;/mark&gt; dosyasını açalım ve &lt;code&gt;Extension&lt;/code&gt;‘lar içerisine &lt;code&gt;AppExecutionAlias&lt;/code&gt; ekleyelim&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Burada önemli nokta, &lt;code&gt;Alias&lt;/code&gt; &lt;strong&gt;attribute&lt;/strong&gt;‘une verdiğimiz değer ile uygulamamıza komut satırından erişilecek olması&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/c1ad7854c1db74988f7b06c8345b0cf3.js?file=Package.appxmanifest&quot;&gt;&lt;/script&gt;

&lt;p&gt;Şimdi yapmamız gereken, &lt;mark&gt;App.xaml.cs&lt;/mark&gt; dosyasını açmak ve içerisine &lt;code&gt;OnActivated()&lt;/code&gt; methodunu eklemek.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/c1ad7854c1db74988f7b06c8345b0cf3.js?file=App.xaml.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;code&gt;OnActivated()&lt;/code&gt; methodunun aldığı &lt;mark&gt;args&lt;/mark&gt; parametresinin &lt;a href=&quot;https://docs.microsoft.com/uwp/api/Windows.ApplicationModel.Activation.IActivatedEventArgs#Windows_ApplicationModel_Activation_IActivatedEventArgs_Kind&quot;&gt;Kind&lt;/a&gt; özelliği eğer &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.applicationmodel.activation.commandlineactivatedeventargs&quot;&gt;ActivationKind.CommandLineLaunch&lt;/a&gt; değerine sahipse, demek ki uygulama komut satırından çalıştırılmıştır.&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;args&lt;/mark&gt; parametresini &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.applicationmodel.activation.commandlineactivatedeventargs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CommandLineActivatedEventArgs&lt;/a&gt; tipine &lt;strong&gt;unbox&lt;/strong&gt; edip, &lt;a href=&quot;https://docs.microsoft.com/uwp/api/windows.applicationmodel.activation.commandlineactivatedeventargs#Windows_ApplicationModel_Activation_CommandLineActivatedEventArgs_Operation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Operation&lt;/a&gt; özelliği aracılığı ile komut satırından çalıştırılan uygulamamıza geçilen parametreleri yakalayabiliyoruz.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/07/commandlineactivation-1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Örnek ekran görüntüsü ise aşağıdaki gibi olacaktır;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/07/commandlineactivation-2.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Bu makale &lt;a href=&quot;https://blogs.windows.com/buildingapps/2017/07/05/command-line-activation-universal-windows-apps/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Command-Line Activation of Universal Windows Apps&lt;/a&gt; makalesi baz alınarak yazılmıştır :)&lt;/small&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/windows-10-uwp-uygulamalarini-komut-satirindan-calistirma-command-line-activation/</link>
                <guid>http://polatengin.github.io/windows-10-uwp-uygulamalarini-komut-satirindan-calistirma-command-line-activation</guid>
                <pubDate>Sun, 09 Jul 2017 11:00:00 +0000</pubDate>
        </item>

        <item>
                <title>C# Multi-Dimensional Array (Dizi) ve Jagged Array (Dizi) arasındaki farklar</title>
                <description>&lt;p&gt;Birkaç hafta önce &lt;em&gt;email&lt;/em&gt; üzerinden aldığım bir soruyu cevaplamaya çalışacağım.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Soru şu;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;&lt;em&gt;C#&lt;/em&gt; &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; ve &lt;strong&gt;Jagged Array&lt;/strong&gt; arasındaki farklar nedir?&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Uzun yıllardır yazılım geliştirme yapıyorum ve deneyimlerime göre &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; (&lt;em&gt;Dizi&lt;/em&gt;), &lt;strong&gt;Jagged Array&lt;/strong&gt; (&lt;em&gt;Dizi&lt;/em&gt;)’ye göre birçok avantaja sahip.&lt;/p&gt;

&lt;p&gt;Öncelikle, &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; daha doğrusal ve basit bir hafıza yerleşimine (&lt;em&gt;memory map&lt;/em&gt;) sahip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jagged Array&lt;/strong&gt; ise, aslında &lt;em&gt;dizilerin dizisi&lt;/em&gt; gibi bir modelde olduğu için birçok hafıza içi yönlendirmelere neden oluyor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin,&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=multi-0.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;kodu işletildiğinde, &lt;strong&gt;CLR&lt;/strong&gt;, &lt;em&gt;(i x j)&lt;/em&gt; kadar (yani &lt;em&gt;10 x 30 = 300&lt;/em&gt;) öğeli bir dizi oluşturur.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;multi&lt;/em&gt; değişkeninin &lt;code&gt;Length&lt;/code&gt; özelliğine bakacak olursak, gerçekten &lt;em&gt;300&lt;/em&gt; değerini görebiliriz.&lt;/p&gt;

&lt;p&gt;Gene &lt;em&gt;multi&lt;/em&gt; değişkeninin &lt;code&gt;Rank&lt;/code&gt; özelliği, &lt;em&gt;2&lt;/em&gt; değerine sahip olacak, çünkü &lt;em&gt;multi&lt;/em&gt; değişkeni &lt;em&gt;2 boyutlu&lt;/em&gt; bir dizi. &lt;em&gt;0&lt;/em&gt; ve &lt;em&gt;1&lt;/em&gt; boyutlarında eşit uzunlukta değerler var.&lt;/p&gt;

&lt;p&gt;Hatta &lt;code&gt;GetLength()&lt;/code&gt; methodunda &lt;em&gt;0&lt;/em&gt; veya &lt;em&gt;1&lt;/em&gt; değerini verecek olursak, &lt;em&gt;i&lt;/em&gt; (veya &lt;em&gt;j&lt;/em&gt;) uzunluklarını alabiliriz.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=multi-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Doğal olarak, &lt;em&gt;multi&lt;/em&gt; değişkeninin herhangi bir öğesine erişmek, { &lt;em&gt;1.rakam&lt;/em&gt; x &lt;em&gt;i&lt;/em&gt; + &lt;em&gt;2.rakam&lt;/em&gt; } indexli elemana erişmek demek;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=multi-2.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; yapılarında veriyi hafızada tutmak, erişmek ve güncellemek, nispeten kolay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jagged Array&lt;/strong&gt; ise, doğrusal bir hafıza haritasına sahip olmadığı için, &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; yapılarının sahip olduğu birçok avantaja sahip değildir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin,&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=jagged-0.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;jagged&lt;/em&gt; değişkeninin &lt;code&gt;Rank&lt;/code&gt; özelliği her zaman &lt;em&gt;1&lt;/em&gt; değerine sahiptir.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=jagged-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bir değere erişmek için &lt;strong&gt;Jagged Array&lt;/strong&gt; değişkenler, şu şekilde davranır;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Önce, &lt;em&gt;10&lt;/em&gt; öğeli dizinin &lt;em&gt;3&lt;/em&gt; indexli elemanını bul&lt;/li&gt;
&lt;li&gt;Sonra, &lt;em&gt;30&lt;/em&gt; öğeli bir dizi olan bu elemanın &lt;em&gt;6&lt;/em&gt; indexli elemanını bul&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yani, bir elemana ulaşabilmek için, her zaman &lt;em&gt;2&lt;/em&gt; adımlı yol izlemek gerekiyor.&lt;/p&gt;

&lt;p&gt;Ayrıca, &lt;strong&gt;Jagged Array&lt;/strong&gt; yapılarında iki ardışık satırın aynı sayıda öğeli dizi olması zorunlu değil.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=jagged-2.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Yani yukarıdaki karşılaştırma &lt;code&gt;true&lt;/code&gt; değer üretmeyebilir.&lt;/p&gt;

&lt;p&gt;Benzetme yapmak gerekirse, &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt;, bir tablo yapısına benzer, sütun sayısı ve satır sayısı tanımlanır, hücrelere erişilir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin;&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=multi-3.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bu kodu, &lt;em&gt;2 x 2&lt;/em&gt; tabloya benzetebiliriz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=multi-4.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Halbuki &lt;strong&gt;Jagged Array&lt;/strong&gt; yapılarında sütun sayıları, her satırda farklı olabilir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin;&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=jagged-3.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bu kod ise, aşağıdaki yapıyı oluşturur;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=jagged-4.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Performans&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fakat &lt;strong&gt;CLR&lt;/strong&gt;‘ın gerçekleştirdiği çeşitli performans optimizasyonlarından dolayı, &lt;strong&gt;Jagged Array&lt;/strong&gt; yapıları, &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; yapılarından daha performanslı çalışıyor.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Örneğin,&lt;/em&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=performance-0.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Bu methodlardan üretilen &lt;strong&gt;IL&lt;/strong&gt; koduna bakacak olursak;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/59ea9b882738262ef40e6cdd7119902d.js?file=performance-1.cs&quot;&gt;&lt;/script&gt;

&lt;p&gt;Gördüğünüz gibi, &lt;strong&gt;Multi-Dimensional Array&lt;/strong&gt; için üretilen &lt;strong&gt;IL&lt;/strong&gt; kodu, &lt;strong&gt;Jagged Array&lt;/strong&gt; için üretilen &lt;strong&gt;IL&lt;/strong&gt; kodundan daha karmaşık ve doğal olarak çalıştırılması da daha uzun sürüyor.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;Not : Bu makaleyi geliştirirken &lt;a href=&quot;https://stackoverflow.com/questions/597720/what-are-the-differences-between-a-multidimensional-array-and-an-array-of-arrays&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Stackoverflow&lt;/a&gt;‘dan çok faydalandım&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/csharp-multi-dimensional-array-dizi-ve-jagged-array-dizi-arasindaki-farklar/</link>
                <guid>http://polatengin.github.io/csharp-multi-dimensional-array-dizi-ve-jagged-array-dizi-arasindaki-farklar</guid>
                <pubDate>Tue, 27 Jun 2017 12:15:00 +0000</pubDate>
        </item>

        <item>
                <title>Fazla Mesai Etkinliği Haziran 2017</title>
                <description>&lt;p&gt;&lt;em&gt;19 Haziran 2017&lt;/em&gt; akşamı &lt;strong&gt;Microsoft Türkiye&lt;/strong&gt; ofisinde sevgili &lt;strong&gt;Microsoft RD&lt;/strong&gt; arkadaşlarım &lt;em&gt;Daron Yöndem&lt;/em&gt;, &lt;em&gt;Hakan Uzuner&lt;/em&gt; ve &lt;em&gt;Adam Cogan&lt;/em&gt; ile bir etkinlik organize ettik.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fazla Mesai&lt;/em&gt; ismini verdiğimiz bu etkinlikte ben de &lt;strong&gt;Azure WebApps&lt;/strong&gt; ve &lt;strong&gt;Azure Storage&lt;/strong&gt; konularına değindim.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;lazy img-responsive&quot; data-src=&quot;/assets/uploads/2017/06/fazla-mesai.png&quot; alt=&quot;Fazla Mesai Etkinliği, Haziran 2017&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Etkinliğe katılan herkese &lt;strong&gt;teşekkür ederim&lt;/strong&gt;, umarım faydalı olmuştur.&lt;/p&gt;
</description>
                <link>http://polatengin.github.io/fazla-mesai-etkinligi-haziran-2017/</link>
                <guid>http://polatengin.github.io/fazla-mesai-etkinligi-haziran-2017</guid>
                <pubDate>Tue, 20 Jun 2017 12:30:00 +0000</pubDate>
        </item>

        <item>
                <title>.Net Core projelerine referans ve Nuget paketi eklemek</title>
                <description>&lt;p&gt;Bu makaleyi aslında kendime not oluşturmak için yazıyorum :)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.Net Core&lt;/code&gt; ve &lt;code&gt;Asp.Net Core&lt;/code&gt; projelerine bir &lt;strong&gt;Nuget&lt;/strong&gt; paketi eklemek için &lt;strong&gt;Visual Studio&lt;/strong&gt;‘yu açıp, &lt;em&gt;Solution Explorer&lt;/em&gt;‘da &lt;strong&gt;Dependencies&lt;/strong&gt; üzerine sağ tuşla tıklamak ve &lt;strong&gt;Manage Nuget Packages&lt;/strong&gt; menüsünü seçmek yeterli. Böylece açılan ekrandan istediğimiz paketi aratıp projemize ekleyebiliriz.&lt;/p&gt;

&lt;p&gt;Fakat sizler de benim gibi &lt;code&gt;Visual Studio&lt;/code&gt; yerine &lt;code&gt;Visual Studio Code&lt;/code&gt; kullanmayı tercih ediyorsanız, ne yazık ki &lt;strong&gt;Nuget&lt;/strong&gt; paketi eklemek için &lt;code&gt;Visual Studio&lt;/code&gt;‘yu açmak gereksiz gelecektir.&lt;/p&gt;

&lt;p&gt;Aslında komut satırı aracılığıyla (&lt;em&gt;Visual Studio Code&lt;/em&gt; içerisinde gelen &lt;em&gt;Terminal&lt;/em&gt; pencereside olur) aşağıdaki kodu çalıştırmamız yeterli;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/9cf617528741f53e55ec0c8715fc21e8.js?file=dotnet-cli-add-package.cmd&quot;&gt;&lt;/script&gt;

&lt;p&gt;Eğer projeye bir &lt;strong&gt;Nuget&lt;/strong&gt; paketi değil, &lt;em&gt;başka bir projeyi&lt;/em&gt; &lt;strong&gt;referans&lt;/strong&gt; olarak eklemek istiyorsak, aşağıdaki kodu çalıştırabiliriz;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/polatengin/9cf617528741f53e55ec0c8715fc21e8.js?file=dotnet-cli-add-reference.cmd&quot;&gt;&lt;/script&gt;

</description>
                <link>http://polatengin.github.io/dotnet-core-projelerine-referans-ve-nuget-paketi-eklemek/</link>
                <guid>http://polatengin.github.io/dotnet-core-projelerine-referans-ve-nuget-paketi-eklemek</guid>
                <pubDate>Wed, 14 Jun 2017 10:30:00 +0000</pubDate>
        </item>


</channel>
</rss>
