<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Taner Tunçer</title>
    <description>The latest articles on DEV Community by Taner Tunçer (@tankotun).</description>
    <link>https://dev.to/tankotun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F582810%2F44c50524-7005-4571-92bf-eea70e6082cf.jpg</url>
      <title>DEV Community: Taner Tunçer</title>
      <link>https://dev.to/tankotun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tankotun"/>
    <language>en</language>
    <item>
      <title>Node.js'de T.C. Kimlik No ile Vatandaşlık Sorgusu</title>
      <dc:creator>Taner Tunçer</dc:creator>
      <pubDate>Wed, 15 Nov 2023 09:53:35 +0000</pubDate>
      <link>https://dev.to/tankotun/nodejsde-tc-kimlik-no-ile-vatandaslik-sorgusu-3e2c</link>
      <guid>https://dev.to/tankotun/nodejsde-tc-kimlik-no-ile-vatandaslik-sorgusu-3e2c</guid>
      <description>&lt;p&gt;T.C. Nüfus ve Vatandaşlık İşleri Genel Müdürlüğünün halka açık servisi ile bir kişinin ad soyad, kimlik numarası ve doğum yılı bilgileriyle o kişinin Türk vatandaşı olup olmadığını sorgulanabiliyor.&lt;/p&gt;

&lt;p&gt;Node.js'de bu sorguyu kolayca yapmak için &lt;a href="https://www.npmjs.com/package/isturkish"&gt;isturkish&lt;/a&gt; paketini kullanıyoruz.&lt;/p&gt;

&lt;h1&gt;
  
  
  Kurulum ve Kullanım
&lt;/h1&gt;

&lt;p&gt;Aşağıdaki komut ile projemize paketi kuruyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i isturkish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paketimiz kurulduktan sonra paketi çağırıyor ardından kimlik bilgilerini girerek sorguyu yapıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Paketi çağırıyoruz.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isTurkish&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isturkish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Sorguyu yapıyoruz.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;isTurkish&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Zeki Müren&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;birthdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1931-12-06&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;00000000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

   &lt;span class="c1"&gt;// Kişinin bilgilerini yazdırıyoruz.&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sorgulanan kişinin bilgileri:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c1"&gt;// Cevabı yazdırıyoruz.&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;turkish&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bu kişi Türk vatandaşı!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bu kişi Türk vatandaşı değil!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Kimlik Bilgileri Parametreleri
&lt;/h1&gt;

&lt;p&gt;Kimlik bilgilerini &lt;code&gt;isTurkish&lt;/code&gt; paketine birkaç farklı şekilde gönderebilirsiniz.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;İsmi tek parça halinde göndermek yerine ayrı ayrı da gönderilebilirsiniz&lt;/li&gt;
&lt;li&gt;Doğum tarihi yerine doğrudan doğum yılını da gönderebilirsiniz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aşağıdaki örnekte gösterildiği gibi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;isTurkish&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;firstname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Falih Rıfkı&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lastname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Atay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;birthyear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1940&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;00000000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaynak: &lt;a href="https://www.npmjs.com/package/isturkish"&gt;isturkish&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>npm</category>
    </item>
    <item>
      <title>Dynamic Lookup with MongoDB Aggregation API</title>
      <dc:creator>Taner Tunçer</dc:creator>
      <pubDate>Wed, 19 Jul 2023 18:42:48 +0000</pubDate>
      <link>https://dev.to/tankotun/dynamic-lookup-with-mongodb-aggregation-api-3333</link>
      <guid>https://dev.to/tankotun/dynamic-lookup-with-mongodb-aggregation-api-3333</guid>
      <description>&lt;p&gt;In Mongoose, there's a great and useful feature called &lt;a href="https://mongoosejs.com/docs/populate.html"&gt;Population&lt;/a&gt;, which makes it possible to dynamically connect a field to another document from another collection.&lt;/p&gt;

&lt;p&gt;Let's say, in &lt;em&gt;sales&lt;/em&gt; document you have &lt;em&gt;costumer&lt;/em&gt; field. Costumer might be a &lt;em&gt;person&lt;/em&gt; or a &lt;em&gt;company&lt;/em&gt;. And you want to keep costumer in one field. No problem. You can create a schema like the one below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;costumer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ObjectId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;refPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;costumerType&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;costumerType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;people&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;companies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, when you need to get this &lt;em&gt;sales&lt;/em&gt; document, you can "populate" costumer field like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({}).&lt;/span&gt;&lt;span class="nx"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;costumer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mongoose will bring you the costumer, whether person or company.&lt;br&gt;
Very useful.&lt;/p&gt;
&lt;h2&gt;
  
  
  Switching to Aggregation API
&lt;/h2&gt;

&lt;p&gt;If you're building much bigger app, there might be a need for complex database queries. MongoDB have a great query API called Aggregation API.&lt;/p&gt;

&lt;p&gt;At the point that you're working with Aggregation API, you may encounter the limitation that aggregation doesn't directly support dynamic lookups — &lt;em&gt;lookup ($lookup) is an operator for bringing documents from other collections in same database.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nevertheless, nothing is impossible.&lt;/p&gt;

&lt;p&gt;I created a trick to make dynamic lookups possible by the following method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="c1"&gt;// Lookup for people and get result into "_temporaryPeople"&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$lookup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;people&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;localField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;costumer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;foreignField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_temporaryPeople&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}},&lt;/span&gt;
  &lt;span class="c1"&gt;// Lookup for companies and get result into "_temporaryCompanies"&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$lookup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;companies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;localField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;costumer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;foreignField&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_temporaryCompanies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}},&lt;/span&gt;
  &lt;span class="c1"&gt;// Set "costumer" field with merge of two variables.&lt;/span&gt;
  &lt;span class="c1"&gt;// This will set "costumer" the wanted document.&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;costumer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="na"&gt;$mergeObjects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$_temporaryPeople&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$_temporaryCompanies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}},&lt;/span&gt;
  &lt;span class="c1"&gt;// After we're done, we can destroy temporary fields.&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$unset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_temporaryPeople&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_temporaryCompanies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Until MongoDB adds dynamic lookup to the Aggregation API,&lt;br&gt;
I think this is the easiest way to handle this issue.&lt;/p&gt;

&lt;p&gt;Stay with MongoDB 🏄‍♂️&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>mongoose</category>
      <category>lookup</category>
      <category>aggregation</category>
    </item>
    <item>
      <title>Odağı Koru</title>
      <dc:creator>Taner Tunçer</dc:creator>
      <pubDate>Mon, 10 Apr 2023 11:32:21 +0000</pubDate>
      <link>https://dev.to/tankotun/keep-calm-and-focus-on-56a5</link>
      <guid>https://dev.to/tankotun/keep-calm-and-focus-on-56a5</guid>
      <description>&lt;p&gt;Bilgisayar başında çalışanlar olarak, internette dikkat dağıtıcı — ve ilgi çekici yığınla içeriğe bir tık uzaktayız. Özellikle stresli zamanlarda dikkat direnciniz çok kolay kırılabiliyor ve işten kolayca uzaklaşabiliyorsunuz.&lt;/p&gt;

&lt;p&gt;Kendi deneyimimden anladığım kadarıyla, adres alanına &lt;code&gt;youtube.com&lt;/code&gt; yazıp siteye erişememeniz tahmin ettiğinizden çok daha etkili bir durdurma yöntemi. Dükkanın kapalı olduğunu görmek sizi işe geri döndürmeye yetiyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tek Tıkla Limit
&lt;/h2&gt;

&lt;p&gt;Düğmeye bastığımda önceden belirlediğim sitelere erişimi kesecek uygun bir yazılım bulamadım — ücretli, ne idüğü belirsiz eklenti/uygulamaları hariç.&lt;/p&gt;

&lt;p&gt;MacOS'un Screen Time özellikleri de kurcalayıp gördüğüm kadarıyla saat bazlı ve Safari'de geçerli seçenekler. Dolayısıyla iş başa düştü.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tek Komutla Limit
&lt;/h2&gt;

&lt;p&gt;Terminalde çalıştırdığım tek komut ile önceden belirlediğim internet siteleri kapanıyor, kapalıysa açılıyor. Yapmak için 4 adım yeterli.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Adım
&lt;/h3&gt;

&lt;p&gt;Hosts dosyanızın bir kopyasını oluşturun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/hosts /etc/hosts-mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Adım
&lt;/h3&gt;

&lt;p&gt;Hosts dosyanızı düzenleyin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/hosts-mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dosyanıza engellemek istediğiniz adresleri aşağıdaki gibi ekleyelin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0.0.0.0 instagram.com
0.0.0.0 www.instagram.com
0.0.0.0 youtube.com
0.0.0.0 www.youtube.com
0.0.0.0 twitter.com
0.0.0.0 www.twitter.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından &lt;code&gt;control + o&lt;/code&gt; komutu ile kaydedip &lt;code&gt;ctrl + x&lt;/code&gt; komutu ile çıkın.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Adım
&lt;/h3&gt;

&lt;p&gt;Terminal kısayolunuzu (alias) eklemek için profil dosyanızı düzenleyin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bash kullanıcıları için&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano ~/.bash_profile

&lt;span class="c"&gt;# OhMyZsh kullanıcıları için&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dosyanıza aşağıdaki satırı ekleyin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sudo mv /etc/hosts /etc/hosts-temp; sudo mv /etc/hosts-mode /etc/hosts; sudo mv /etc/hosts-temp /etc/hosts-mode"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından &lt;code&gt;control + o&lt;/code&gt; komutu ile kaydedip &lt;code&gt;ctrl + x&lt;/code&gt; komutu ile çıkın.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Adım
&lt;/h3&gt;

&lt;p&gt;Profil dosyanızda yaptığınız değişiklikleri işletmek için arabirimi yenileyin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bash kullanıcıları için&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bash_profile

&lt;span class="c"&gt;# OhMyZsh kullanıcıları için&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tamamdır 🏄‍♂️
&lt;/h2&gt;

&lt;p&gt;Artık terminalde &lt;code&gt;mode&lt;/code&gt; komutunu çalıştırdığınızda, belirlediğiniz internet sitelerine tüm tarayıcılardan erişiminiz kesilecek, kesikse tekrar açılacak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;mode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Odağınız keskin olsun!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tooling</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Typescript, neden lazım?</title>
      <dc:creator>Taner Tunçer</dc:creator>
      <pubDate>Fri, 07 Apr 2023 11:27:44 +0000</pubDate>
      <link>https://dev.to/tankotun/typescript-neden-lazim-1cea</link>
      <guid>https://dev.to/tankotun/typescript-neden-lazim-1cea</guid>
      <description>&lt;p&gt;Javascript ile web (front-end) ve sunucu (back-end) tarafında uygulamalar geliştirirken standartlara uygun, doğru ve hatasız kod yazmaya çalışıyoruz.&lt;/p&gt;

&lt;p&gt;Uygulamamız büyümeye, çok fazla fonksiyon ve bileşen içermeye başladıkça hangi fonksiyon hangi tipte değerler alıyor, hangi tipte değerler döndürüyor hatırlamamız zorlaşıyor.&lt;/p&gt;

&lt;p&gt;Mesela bir fonksiyon, &lt;strong&gt;object&lt;/strong&gt; tipinde giren bir değere bazı işlemler uyguluyor ve sonucunda &lt;strong&gt;string&lt;/strong&gt; tipinde bir değer döndürüyor.&lt;/p&gt;

&lt;p&gt;Uygulamayı geliştirirken, &lt;strong&gt;object&lt;/strong&gt; tipinde değer girmesi gereken fonksiyona, farketmeden &lt;strong&gt;array&lt;/strong&gt; tipinde bir değer gönderebiliriz.&lt;/p&gt;

&lt;p&gt;Bu muhtemel bir hataya sebep olabilir.&lt;/p&gt;

&lt;p&gt;Can alıcı nokta, yanlış tipte değer gönderdiğimiz fonksiyonu o an çalıştırmadıysak veya test etmediyek bu hatayı farketmeyebiliyoruz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sonra
&lt;/h2&gt;

&lt;p&gt;Uygulamamızı canlıya aldık diyelim, yani internet sitemizde yayına koyduk.&lt;/p&gt;

&lt;p&gt;Bir kullanıcı bizim farketmediğimiz, yanlış tipte değer giren fonksiyonu çalıştıracak işlem yaptı. Crash!&lt;/p&gt;

&lt;p&gt;Kullanıcı, hatalı fonksiyonu çalıştıracak işlem yapınca, ekran beyaz oldu ve uygulama çöktü, yani crash oldu. Kullanıcı sayfayı yenileyip tekrar denediğinde, yine crash olacak.&lt;/p&gt;

&lt;h2&gt;
  
  
  Neden
&lt;/h2&gt;

&lt;p&gt;Fonksiyonda gelmesi gereken tipteki değere yapılan işlem, yanlış gönderilen tipteki değere yapılamıyor. Mesela, bir &lt;strong&gt;string&lt;/strong&gt;'in yani yazının uzunluğu varken, bir &lt;strong&gt;object&lt;/strong&gt;'in uzunluğu yoktur. &lt;code&gt;adSoyad.length&lt;/code&gt; dediğimizde yazının karakter uzunluğu dönerken, &lt;code&gt;birObject.length&lt;/code&gt; dediğimizde hata verir.&lt;/p&gt;

&lt;p&gt;Dolayısıyla, fonksiyon "istenen işi bu değere yapamıyorum" diyerek hata verir ve işlemi tamamlayamaz. Elbette bu hata, canlı ortamda kullanıcıya beyaz sayfa olarak görünür. Eğer biz geliştirme ortamında kullanıcını yaptığı işlemi yapmış olsaydık, hata mesajını görecek ve sorunu çözecektik.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dahası
&lt;/h2&gt;

&lt;p&gt;Yanlış tipteki değerleri yanlış işlemenin birçok yolu var elbette. Uygulama büyüdükçe, yapı kompleks hale geliyor ve hata yapma olasılığı artıyor.&lt;/p&gt;

&lt;p&gt;Başka programalama dillerinde değerlerin tiplerini baştan belirtebiliyor ve o değerlerle işlem yaparken yanlış bir şey yaparsak, daha kodu çalıştırmadan bu hatadan haberdar olabiliyoruz.&lt;/p&gt;

&lt;p&gt;Bu özellik, uygulama geliştirirken hatalı işlemler yapmamızı önlerken, fonksiyona giren-çıkan değerleri ve tipleri de auto-complete şeklinde bize sunarak konforumuzu ve hızımızı artırıyor.&lt;/p&gt;

&lt;p&gt;Ne yazık ki, Javascript'de değerlere tip tanımlayabileciğimiz bir özellik yok.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sonuç
&lt;/h2&gt;

&lt;p&gt;Biz yine de Javascript'de değerlere tip tanımlayalım.&lt;/p&gt;

&lt;p&gt;Bir de kütüphane geliştirelim. Biz kod yazarken tiplerle ilgili hatalar yaptığımızda bizi uyarsın. Böylelikle kodu çalıştırmaya bile gerek kalmadan, bir tip hatası yaptığımızda atlamayalım ve olası sorunları baştan giderelim.&lt;/p&gt;

&lt;p&gt;Uygulamayı canlıya alacağımız zaman da bir derleyici program ile yazdığımız tip tanımlamalarını sildirir, normal Javascript koduna çeviririz. Uygulamamızı, tarayıcılarda da çalışacak normal javascript olarak yayınlarız.&lt;/p&gt;

&lt;p&gt;Adında da &lt;strong&gt;Javascript&lt;/strong&gt; (.js) değil &lt;strong&gt;Typescript&lt;/strong&gt; (.ts) deriz.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>discuss</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
