<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Çağrı Aldemir - Kişisel Blog]]></title><description><![CDATA[Çağrı Aldemir - Kişisel Blog]]></description><link>https://aldemir.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1712297122900/16a0cc28-31e0-4512-b3e6-b0bae8ad103a.png</url><title>Çağrı Aldemir - Kişisel Blog</title><link>https://aldemir.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 12:48:56 GMT</lastBuildDate><atom:link href="https://aldemir.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Git Stratejileri]]></title><description><![CDATA[Yazılımcılar olarak projelerimizi yönetmek ve versiyonlamak için Git gibi versiyon kontrol sistemlerini kullanmaya her zaman ihtiyaç duyarız. Ancak çoğu zaman git kullanırken bir de geliştirme stratejisine sahip olmamız gerekir. Bu strateji, bizim ge...]]></description><link>https://aldemir.dev/git-stratejileri</link><guid isPermaLink="true">https://aldemir.dev/git-stratejileri</guid><category><![CDATA[Git]]></category><category><![CDATA[vcs]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Mon, 09 Jan 2023 12:59:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1673269079052/0f6a2ce5-a7a1-4a1a-b432-7d27676dda37.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yazılımcılar olarak projelerimizi yönetmek ve versiyonlamak için <a target="_blank" href="https://git-scm.com">Git</a> gibi versiyon kontrol sistemlerini kullanmaya her zaman ihtiyaç duyarız. Ancak çoğu zaman git kullanırken bir de geliştirme stratejisine sahip olmamız gerekir. Bu strateji, bizim geliştirme sürecinden beklentilerimize göre değişmekle birlikte temelde 3'e ayrılır.</p>
<p>Bunlar;</p>
<ol>
<li><p>Gitflow</p>
</li>
<li><p>Feature Based Development</p>
</li>
<li><p>Trunk Based Development</p>
</li>
</ol>
<p>Aşağıda bu üç stratejinin detaylarını bulabilirsiniz.</p>
<h3 id="heading-gitflow"><strong>Gitflow</strong></h3>
<p>Gitflow, ilk kez 2010 yılında yayınlanan bir blog gönderisinde Vincent Driessen tarafından popüler hale getirilen bir branching stratejisidir. <strong>develop</strong> ve <strong>master</strong> olmak üzere iki ana branche sahip olma fikrine dayanmaktadır. master branch productiona hazır kodu temsil ederken, develop branchi devam eden geliştirmeler için kullanılır.</p>
<p>Gitflow, geliştirme sürecini kolaylaştırmak için birkaç ek branch sunar:</p>
<p><strong>Feature Branch:</strong> Yeni featurelar geliştirmek için kullanılır. Bir feature tamamlandığında, develop branchine merge edilir.</p>
<p><strong>Release Branch:</strong> Yeni bir release deploy etmek için kullanılır. Release hazır olduğunda, hem develop hem de master branchine merge edilir.</p>
<p><strong>Hotfix Branch:</strong> Productionda oluşan hataları hızlı bir şekilde fixlemek için kullanılır. Bu branch master branchten çıkılır ve fix tamamlandığında hem develop hem de master branchine merge edilir.</p>
<p>Gitflowun en önemli faydalarından biri, productiona hazır kod ile halen geliştirilmekte olan kod arasında açık bir ayrım sağlamasıdır. Bu, özellikle farklı featurelar üzerinde çalışan birden çok ekibin olabileceği daha büyük projelerde büyük faydalar sağlar.</p>
<h3 id="heading-feature-based-development"><strong>Feature Based Development</strong></h3>
<p>Feature based development gitflowa benzeyen ancak birkaç temel farklılığa sahip olan bir branching stratejisidir. Gitflow gibi feature based development da, her feature için ayrı branchler oluşturmayı hedefler. Ancak tamamlanmış featurelar develop branchine merge edilmez, bunun yerine doğrudan master branche merge edilirler.</p>
<p>Bu, master branchin her zaman kodun en son sürümünü, tüm featureları ve hotfixleri içerdiği anlamına gelir. Master branchin her zaman kararlı olduğundan emin olmak için, feature branchler merge edilmeden önce test edilir ve gözden geçirilir.</p>
<p>Feature based developmentin bir avantajı, feature branchlerin master branchte birleştirilmesi için resmi bir production sürecini beklemesi gerekmediğinden, daha hızlı deploymentlara olanak sağlamasıdır. Ancak productiona hazır kod ile hala geliştirilmekte olan kod arasında daha az ayrım olduğu için bu yaklaşım bazı durumlarda daha riskli de olabilir.</p>
<h3 id="heading-trunk-based-development"><strong>Trunk Based Development</strong></h3>
<p>Trunk based development, ayrı feature branchlerini tamamen ortadan kaldıran bir branching stratejisidir. Bunun yerine yapılan tüm feature geliştirmeleri düzenli olarak master branche merge edilir.</p>
<p>Bu yaklaşım, master branchinde bulunan kodların her zaman çalışır durumda olduğundan ve yapıyı bozmadıklarından emin olunması gerektiği için geliştiricilerin son derece disiplinli olmalarını gerektirir. Bunu kolaylaştırmak için, trunk based developmentta kodlar master branche merge edilmeden önce sürekli test sürecinden geçmeli ve review edilmelidir.</p>
<p>Trunk based developmentin bir diğer avantajı ise feature branchler oluşturmaya ve dolayısıyla merge etmeye ihtiyaç duyulmadığı için daha hızlı geliştirmeye imkan sağlayabilmesidir. Ayrıca tüm değişiklikler tek bir branchte yapıldığından, kod geçmişini izlemeyi de kolaylaştırır. Ancak yapılacak olan tek bir hata potansiyel olarak tüm kodu bozabileceğinden bu yaklaşım da bazı durumlarda riskli olabilir.</p>
<hr />
<p>Aslında bakıldığında tüm bu stratejiler belirli bir amaca yönelik hareket etmek üzere kurgulanmıştır ve birinin diğerinden daha iyi olduğunu söylemek bana göre pek de mümkün değil. Bu noktada hangisinin takıma ve projeye daha uygun olduğuna karar verip buna göre bir seçim yapmanın en doğrusu olacağını düşünüyorum.</p>
<p>Umarım faydalı bir içerik olmuştur, bir sonraki yazıda görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[TEZ BİTİRELİM 2 | Login Ekranı ve Ana Ekran]]></title><description><![CDATA[Herkese merhaba.Uzun süren bir aradan sonra sonunda ikinci yazıyı yazabilecek zamanı bulabildim. Her ne kadar serinin adı Tez Bitirelim olsa da ne yazık ki yeterince verimli değilim ancak yine de elimden geleni en iyi şekilde yapmaya çalışıyorum. Bu ...]]></description><link>https://aldemir.dev/tez-bitirelim-2</link><guid isPermaLink="true">https://aldemir.dev/tez-bitirelim-2</guid><category><![CDATA[Cross Platform]]></category><category><![CDATA[Mezuniyet Tezi]]></category><category><![CDATA[Flutter]]></category><category><![CDATA[Dart]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Thu, 09 Apr 2020 12:05:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672062351687/5c4c1be8-6650-446e-b354-739ebe3af5c8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese merhaba.<br />Uzun süren bir aradan sonra sonunda ikinci yazıyı yazabilecek zamanı bulabildim. Her ne kadar serinin adı <strong>Tez Bitirelim</strong> olsa da ne yazık ki yeterince verimli değilim ancak yine de elimden geleni en iyi şekilde yapmaya çalışıyorum. Bu içerikte ise <a target="_blank" href="https://cagrialdemir.com.tr/tez-bitirelim-1/">bir önceki yazımda</a> bahsettiğim projemin şu ana kadar geldiğim durumundan bahsedeceğim. Dilerseniz lafı çok uzatmadan konumuza geçelim.</p>
<p>Öncelikle oluşturduğum Sign In ve Sign Up ekranlarından bahsetmek istiyorum. Daha önce de söylediğim gibi bu ekranı <a target="_blank" href="https://github.com/huextrat/TheGorgeousLogin">açık kaynak bir UI projesinden</a> aldım ve şimdilik ufak tefek değişiklikler dışında direkt olarak kullanıyorum. Ancak burada bahsetmek istediğim şey aslında kodları incelerken fark ettiğim şeyler. Bunun için öncelikle bahsi geçen UI tasarımına bakalım isterseniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672056100943/0696fbd1-54ad-43fb-b036-e546b8f5d330.jpeg" alt class="image--center mx-auto" /></p>
<p>Yukarıdaki görselde de gördüğünüz üzere giriş ekranı iki sekmeden oluşmakta ve sağa sola sürükleme ile sekmeler arasında geçiş yapılmakta. Burada tasarımın kalitesinden ya da UX odaklı bir tasarım olup olmadığından bahsedemeyeceğim zira ben bu konuda (ne yazık ki) yetkin birisi değilim ancak kod tarafından bahsedecek olursam dikkatimi çeken bazı konular var. Öncelikle text fieldlerın kod tarafında nasıl oluşturulduğunu görelim.</p>
<pre><code class="lang-dart">TextEditingController loginEmailController = <span class="hljs-keyword">new</span> TextEditingController();
TextEditingController loginPasswordController = <span class="hljs-keyword">new</span> TextEditingController();

child: TextField(
  controller: loginEmailController,
  keyboardType: TextInputType.emailAddress,
  style: TextStyle(
    fontFamily: <span class="hljs-string">"WorkSansSemiBold"</span>,
    fontSize: <span class="hljs-number">16.0</span>,
    color: Colors.black),
  decoration: InputDecoration(
    icon: Icon(
      FontAwesomeIcons.envelope,
      color: Colors.black,
      size: <span class="hljs-number">22.0</span>,
  ),
  hintText: <span class="hljs-string">"Email Address"</span>,
  hintStyle: TextStyle(
  fontFamily: <span class="hljs-string">"WorkSansSemiBold"</span>, fontSize: <span class="hljs-number">17.0</span>),
  ),
)
</code></pre>
<p>Gördüğünüz üzere öncelikle bir <strong>TextEditingController()</strong> nesnesi oluşturuluyor ve bu nesne controller olarak text fielde veriliyor ve bu sayede <strong>two way binding</strong> sağlanıyor. Aslında bakacak olursanız burada onChanged() eventi de kullanılabilirdi ancak öyle olsaydı tek yönlü bir bind oluşmuş olurdu ve biz text field içindeki texti set etmek istediğimizde tekrardan kod yazmak zorunda kalırdık.</p>
<p>Sonraki satırlara bakacak olursak girilecek inputun tipi için keyboardType değişkenine emailAddress adında ön tanımlı bir değişken set ediyoruz ve artık o text field bir email inputu olarak kullanılabilir hale geliyor. Geri kalan tüm style kodlarını da yine yukarıdan inceleyebilir ve anlayabilirsiniz çünkü gerçekten yeterince anlaşılır. Aslında burada bunları yazarak yazıyı uzatmaya değil Flutter’ın bugüne kadar kullanılmış/kullanılan diğer UI araçlarından ne kadar farklı olduğunu göstermeye çalışıyorum (aslında biraz da yazı uzun olsun istiyorum). Çünkü diğer frameworkler ya da SDK’lar genel geçer yapılar kurup geriye kalan her şeyi bu yapıları kullanarak yapmamızı beklerken Flutter’da aklınıza gelebilecek hemen her şeyin kolay yolu düşünülmüş durumda ve bu gerçekten ciddi bir zaman tasarrufu sağlıyor (en azından ben öyle umuyorum).</p>
<p>Login ekranında yeterince bahsettiğimi düşünerek bir sonraki ekrana, yani alışkanlıkların listeleneceği ve hızlıca tamamlanıp tamamlanmadığı inputunun alınacağı ekrana geçmek istiyorum. Aşağıda bahsettiğim ana ekranın görselini bulabilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672056173608/1bbc63ee-a86e-4023-8d7d-8ac2b205305d.jpeg" alt class="image--center mx-auto" /></p>
<p>Yukarıdaki görselde de göründüğü üzere sol tarafta login olduktan sonraki ilk ekran, sağ tarafta ise sağ alttaki FAB butonuna tıkladıktan sonra yeni bir alışkanlık eklemek için kullanılacak olan popup bulunmakta. Şu anda sol taraftaki alışkanlıklar demo data olarak girilmiş durumda ve bu datalar bir model classı üzerinden sağlanmakta. Aşağıda bahsi geçen model classının içeriğini görebilirsiniz.</p>
<pre><code class="lang-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HabitItem</span> </span>{
  <span class="hljs-built_in">String</span> id;
  <span class="hljs-built_in">String</span> name;
  <span class="hljs-built_in">String</span> question;
  ColorEnum color;
  RepeatEnum repeatType;
  <span class="hljs-built_in">DateTime</span> reminderTime;
  <span class="hljs-built_in">bool</span> doneForToday;

  HabitItem(<span class="hljs-keyword">this</span>.name, <span class="hljs-keyword">this</span>.question, <span class="hljs-keyword">this</span>.color, <span class="hljs-keyword">this</span>.repeatType, <span class="hljs-keyword">this</span>.reminderTime, <span class="hljs-keyword">this</span>.doneForToday);
}
</code></pre>
<p>Fark ettiğiniz üzere yukarıdaki classta bilinen tipler dışında iki farklı tip var. Bunlar; ColorEnum ve RepeatEnum. Adlarından da anlaşılacağı üzere bu tanımlar enum olarak tanımlılar, ve içlerinde projenin bazı presetlerini barındırıyorlar. Aşağıda bu presetleri görebilirsiniz.</p>
<pre><code class="lang-dart"><span class="hljs-keyword">enum</span> ColorEnum {
  red,
  pink,
  purple,
  blue,
  cyan,
  teal,
  green,
  lime,
  amber,
  deepOrange,
  brown,
  grey
}
</code></pre>
<pre><code class="lang-dart"><span class="hljs-keyword">enum</span> RepeatEnum {
  daily,
  every2Days,
  every3Days,
  every4Days,
  every5Days,
  every6Days,
  every7Days
}
</code></pre>
<p>Bu tanımlamaları şimdilik bu şekilde oluşturdum ancak elbette daha sonra duruma göre tanımlamalar değişebilir. Genel yapıyı az buçuk kafanızda oturttuğunuzu düşünüyorum, o yüzden şimdi de sol taraftaki alışkanlık satırlarının dizaynına bakalım isterseniz.</p>
<pre><code class="lang-dart"><span class="hljs-keyword">return</span> ListTile(
  title: Text(
    item.name,
    style:
        TextStyle(color: ColorUtils.getPrimaryColor(item.color)),
  ),
  subtitle: Text(item.question,
      style: TextStyle(
          color: ColorUtils.getSecondaryColor(item.color))),
  trailing: IconButton(
    icon: Icon(
      item.doneForToday ? Icons.check : Icons.clear,
      color: item.doneForToday
          ? ColorUtils.getPrimaryColor(item.color)
          : ColorUtils.getSecondaryColor(item.color),
    ),
    onPressed: () {
      Scaffold.of(context).showSnackBar(SnackBar(
        content: Text(item.question),
      ));
    },
  ),
);
</code></pre>
<p>Burada kodları anlatmayacağım ancak bahsetmek istediğim önemli bir konu var. Yukarıda gördüğünüz dizayn yapısında hiçbir UI elementi özel bir tasarım aşamasından geçmedi. Yani diğer bir deyişle hiçbir elementi sağa yasla ortala gibi işlemlere tabi tutmadım. Bu yapının tamamı Flutter içerisinde daha önceden tanımlı bir dizayn içerisine oturtuldu ve bu hale geldi. Yani aslında neredeyse tamamen hazır bir tasarımı kullandım diyebilirim. Ve bu da bize Flutter içerisinde ne kadar kolay dizayn yapılabileceğini tekrardan göstermekte.</p>
<p>Son ekran olarak popup tarafı var ancak bu tarafta anlatılacak pek bir şey yok aslında. Zira burası zaten her tasarım dilinde kolayca dizayn edilebilen bir UI olduğu için anlatmaya değer pek bir şey olduğunu düşünmüyorum.</p>
<p>Kısacası Flutter maceram bu şekilde devam etmekte, serinin ikinci yazısında anlatacaklarım bu kadar. Bir önceki yazımın sonunda da söylediğim gibi belirsiz bir zaman sonra görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[TEZ BİTİRELİM 1 | Giriş]]></title><description><![CDATA[Herkese merhaba.
Bugün yeni bir içeriğe başlıyorum; mezuniyet tezim...Ve bu tezi kalıplaşmış şekilde yapmak yerine tez danışmanım olan Barış ATA‘nın da önerisi ile bu şekilde blog yazıları yazarak oluşturmaya ve olabildiğince şeffaf bir şekilde ilerl...]]></description><link>https://aldemir.dev/tez-bitirelim-1</link><guid isPermaLink="true">https://aldemir.dev/tez-bitirelim-1</guid><category><![CDATA[Flutter]]></category><category><![CDATA[Dart]]></category><category><![CDATA[Cross Platform]]></category><category><![CDATA[Mezuniyet Tezi]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Fri, 13 Mar 2020 13:51:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672062653085/cb737ea4-dc40-4903-83f1-cb27c92a30b3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese merhaba.</p>
<p>Bugün yeni bir içeriğe başlıyorum; mezuniyet tezim...<br />Ve bu tezi kalıplaşmış şekilde yapmak yerine tez danışmanım olan <a target="_blank" href="https://twitter.com/brsata">Barış ATA</a>‘nın da önerisi ile bu şekilde blog yazıları yazarak oluşturmaya ve olabildiğince şeffaf bir şekilde ilerleyişi herkese açmaya karar verdik. Seri ismi olarak ise <strong>TEZ BİTİRELİM</strong>‘i uygun gördüm, eğer hocam da bu isim yüzünden benimle çalışmaktan vazgeçmezse bu şekilde devam edeceğini söyleyebilirim. Umarım adı gibi olur ve tez biter… Her neyse, dilerseniz lafı hiç uzatmadan giriş yazısına geçelim.</p>
<p>Projem Google’ın geliştirdiği ve geliştirmeye devam ettiği <strong>Flutter</strong> frameworkü (daha doğru bir tabir ile SDK’sı) üzerinde yazılan ve dil olarak <strong>Dart</strong> dilini kullanan bir mobil uygulama. Uygulamanın içeriği ise son dönemlerde fazlasıyla öne çıkan alışkanlık takibi, yani daha bilindik bir ifade ile <strong>Habit Tracker</strong>.</p>
<p>Tez danışmanımla birlikte Flutter’a karar vermemizin en önemli nedenlerinden birisi çok yeni olmasına karşın inanılmaz hızlı bir şekilde ilerlemiş olması, diğer bir sebep ise açık kaynak olması ve bizim açık kaynağı çok seviyor olmamız. Veritabanı ve diğer server-side işler için ise Flutter’a ve özellikle de Dart diline dair en ufak bir fikrim olmadığı için en azından bu sefer bildiğim bir şeyi kullanayım diyerek Firebase kullanmaya karar verdim. Ve projeye dair şu ana kadar yaptığım tek şey ise projeyi oluşturup basit bir login ekranı tasarlayarak Firebase üzerinden Google ile giriş yapma özelliğini aktif etmek oldu. Şimdilerde ise sadece Flutter üzerine araştırma yapıp bir yandan eğitim videoları izlerken diğer yandan GitHub üzerindeki proje kodlarını incelemek ve neler döndüğünü anlamaya çalışmak. O yüzden ne yazık ki bu yazımda projenin durumuna dair pek bir şey paylaşamayacağım.</p>
<p>Ancak Flutter benim tez görüşmemden önce de dikkatimi çok çeken bir platform olduğu ve en az bir tane cross platform frameworkü/SDK’sı bilme ihtiyacı hissettiğimden dolayı öncesinde de hangi frameworkü seçeyim konusunda bazı araştırmalar yapmıştım ve bu bilgilere dayanarak bir diyagram çıkarmıştım. Aşağıda bu diyagramı görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672062463622/f54a93b4-fdd3-4f15-859a-fae9f495871e.png" alt class="image--center mx-auto" /></p>
<p>Bu araştırmamla birlikte aslında React Native ve Flutter finale kalmıştı ancak ikisinin de çıkış yıllarına ve bu yıllara göre GitHub starlarına baktığımda Flutter’in ciddi derece öne çıktığını ve gelecekte daha da ön planda olacağını fark ettim. O nedenle de Flutter benim için çok daha önemli bir hal aldı ve tez için kullanılacak SDK olarak da biçilmiş kaftan oldu diyebilirim.</p>
<p>Son olarak Flutter’in nasıl bir framework olduğundan bahsetmek ve neden native koda bu kadar yakın bir hızda çalıştığını anlatmak isterim. Flutter’ı diğer cross platform frameworklerinden ayıran en önemli özellik kullanılan her şeyin bir widget olarak, dolayısıyla object olarak tanımlanıyor olmasıdır. Bu nedenle iç içe bir dizayn yapısı kullanarak çok daha kolay ve hızlı dizaynlar yapmamızı sağlar. Bununla birlikte hem iOS hem de Android için hali hazırda var olan tüm UI araçlarını kendi içerisinde barındırır ve hepsi doğru dizayn edilmiş şekilde kullanılabilir haldedir. Bu sayede bizim bir UI objesini dizayn içerisine eklememizden sonra bu obje için ekstra bir dizayn uygulamasak dahi tasarım olarak harika şeyler ortaya çıkarabiliriz. Örneğin, aşağıda native Android butonunu ve Flutter Android butonunu yan yana görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672062489565/24ed6e04-65c1-4eb7-b6d3-ee3777cc5af5.jpeg" alt class="image--center mx-auto" /></p>
<p>Gördüğünüz gibi tasarımsal manada çok daha başarılı. İşte bu da ortaya çok daha başarılı bir UI çıkarabilmemizi sağlıyor.</p>
<p>Elbette yetenekleri sadece UI tarafı ile sınırlı değil. BackEnd tarafında kullanılan Dart dili de hem OOP’ye uygun, hem de bizlere script diller gibi esnek bir kullanım sunuyor ve böylece -her ne kadar ben bu durumdan hiç hoşlanmıyor olsam da- çok daha esnek bir şekilde kod yazabilmemizi sağlıyor.</p>
<p>Şimdi biraz da projenin arka tarafında kullanılacak olan Firebase hakkında konuşalım. Aslında Firebase’in ne olduğuna ve nasıl kullanıldığına dair çok fazla kaynak var ve ben onlardan daha iyi bir anlatım yapacağımı pek sanmıyorum açıkçası. O yüzden aşağıya alıntı olarak sevdiğim tanımlamalardan birisini ekliyorum.</p>
<blockquote>
<p>Google Firebase; web ve mobil uygulamalarının server tarafıyla geliştiricinin uğraşmasına gerek kalmadan kullanıcı giriş yetkilendirmeli ve verilerini gerçek zamanlı ve senkron bir şekilde tutulmasını sağlayan bir platformdur. Günümüzde ki projeler tüm markete hitap etmesi açısından iOS , Android ve web platformlarında geliştirilir fakat her platformun kendine ait yazılım dili ve bağlantı şekilleri vardır. Server-Side dediğimiz arkaplanda ki verilerin tutulması ve gerektiği zaman kullanıcıya kullanılması her platformun ortak sorunudur ve Google Firebase bu konuda geliştirilmiş ortak bir çözümdür.</p>
<p>Kaynak: <a target="_blank" href="http://medium.com/furkanpacikgoz">medium.com/furkanpacikgoz</a></p>
</blockquote>
<p>Serinin ilk yazısında anlatacaklarım bu kadar, belirsiz bir zaman sonra ikinci yazıda görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[Bash Alias Tanımlamalarım]]></title><description><![CDATA[Herkese merhaba.Bu içerikte terminali sıklıkla kullananlar için gerçekten çok işe yarayacağını düşündüğüm bilgiler paylaşacağım. Ancak baştan söylemeliyim ki bu içerik direkt olarak geliştiriciler için hazırlanmış bir içerik olacak zira terminal komu...]]></description><link>https://aldemir.dev/bash-alias-tanimlamalarim</link><guid isPermaLink="true">https://aldemir.dev/bash-alias-tanimlamalarim</guid><category><![CDATA[Bash]]></category><category><![CDATA[zshrc]]></category><category><![CDATA[terminal]]></category><category><![CDATA[shell]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Sun, 05 Jan 2020 15:40:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672069381798/b790c26e-8a3d-4a04-9145-7c7a36108284.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese merhaba.<br />Bu içerikte terminali sıklıkla kullananlar için gerçekten çok işe yarayacağını düşündüğüm bilgiler paylaşacağım. Ancak baştan söylemeliyim ki bu içerik <strong>direkt</strong> olarak geliştiriciler için hazırlanmış bir içerik olacak zira terminal komutlarını zaten bildiğinizi varsayıyor olacağım. Yani içeriği okuyup sonra bana <strong><em>“Hele hele, biz bunları nasıl anlayalım!”</em></strong> şeklinde yorumlarda bulunmayın lütfen.<br />Her neyse, hazırsanız başlayalım…</p>
<p>Öncelikle tüm komutların bash/zsh gibi Linux temelli işletim sistemleri için geçerli olduğunu söylemek isterim. Bu nedenle Windows kullanıcılarının bilgisayarında <strong>git</strong> kuruluysa (ki geliştirici olduğunuzu varsaydığım için mutlaka kurulu olmalı) git içerisindeki bash’i kullanmaya başlamalarını önerebilirim. Her ne kadar bu komutların birebir karşılıkları PowerShell için olsa da benim gibi hem Windows hem MacOS kullananlar için her tanımlamayı her seferinde iki yerde de yapmak çok uğraştırıcı olacağı için iki yerde de bash kullanmaları gayet akıl kârı olacaktır.</p>
<p>Şimdi komutlara geçmeden önce Windows kullanıcılarının nasıl bash’e geçiş yapacağını anlatmak isterim. Ancak “Ben Windows kullanmıyorum kardeşim!” diyenler <a target="_blank" href="https://cagrialdemir.com.tr/terminal-aliases/#LinuxAndMacOS"><strong>buraya</strong></a> tıklayarak ana içeriğe erişebilirler. Öncelikle aşağıdaki registiry komutlarını &lt;herhangi bir ad&gt;.reg olarak bilgisayarınızın herhangi bir klasörü içerisine kaydedin.</p>
<pre><code class="lang-bash">Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\bash]
@=<span class="hljs-string">"BASH (Administrator)"</span>
<span class="hljs-string">"Icon"</span>=<span class="hljs-string">"C:\\Program Files\\Git\\git-bash.exe"</span>

[HKEY_CLASSES_ROOT\Directory\shell\bash\<span class="hljs-built_in">command</span>]
@=<span class="hljs-string">"\"C:\\Program Files\\Git\\bin\\bash.exe\" \"--cd=%1\""</span>

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash]
@=<span class="hljs-string">"BASH (Administrator)"</span>
<span class="hljs-string">"Icon"</span>=<span class="hljs-string">"C:\\Program Files\\Git\\git-bash.exe"</span>

[HKEY_CLASSES_ROOT\Directory\Background\shell\bash\<span class="hljs-built_in">command</span>]
@=<span class="hljs-string">"\"C:\\Program Files\\Git\\bin\\bash.exe\" \"--cd=%v.\""</span>
</code></pre>
<p>Eğer git kurulumunuz standart kurulum pathi içerisinde ise herhangi bir şey yapmanıza gerek yok ancak kurulum esnasında farklı bir path seçtiyseniz yukarıda yer alan pathleri kendi kurulum pathinize göre düzenlemeniz gerekecektir. Düzenlemeniz gereken bölümde run edilecek dosya git klasörü içerisindeki bin klasörünün içerisinde bulunan bash.exe dosyası. Context menüsünde görüntülenecek olan icon için ise direkt olarak git klasörü içerisinde bulunan git-bash.exe dosyasını göstermeniz gerekli zira aksi halde default icon görünecektir ve bu benim hiç hoşuma gitmezdi.</p>
<p>Bu aşamayı da tamamladıysanız bu dosyaya çift tıklayın ve gelen uyarıya EVET deyin. Bu sayede klasörlere sağ tıkladığınızda çıkan context menüsünde <strong>BASH (Administrator)</strong> adında bir menu ögesi belirecek ve siz bu ögeye tıkladığınızda sağ tık yaptığınız klasörün içerisinde yeni bir bash terminal penceresi açılacak. Bu da eminim ki işleri çok kolaylaştıracaktır.</p>
<p>Bu aşamadan sonra bash’i her açtığınızda yönetici olarak çalışmasını istiyorsanız bash.exe dosyasının özelliklerinden <strong>Yönetici olarak çalıştır</strong> seçeneğini aktif etmeniz gerekir. Elbette bu durumda bashi kullanacağınız ideleri/editörleri de bu şekilde yönetici olarak çalıştırmalısınız çünkü aksi halde yetkileri olmadığı için integrated terminal olarak bash’i açamayacaklardır.</p>
<p>Yönetici iznini alıp alamadığınızı kontrol etmek için aşağıdaki komutu terminal içerisine yapıştırıp kontrolü sağlayabilirsiniz. Eğer yönetici izniniz varsa <strong>Administrator</strong>, yoksa <strong>kendi kullanıcı adınız</strong> print edilecektir.</p>
<pre><code class="lang-bash"><span class="hljs-keyword">if</span> [[ $(sfc 2&gt;&amp;1 | tr -d <span class="hljs-string">'\0'</span>) =~ SCANNOW ]]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> Administrator; <span class="hljs-keyword">else</span> <span class="hljs-built_in">echo</span> <span class="hljs-variable">$USERNAME</span>; <span class="hljs-keyword">fi</span>
</code></pre>
<p>Son olarak tamamı ile bir öneri, eğer siz de bash açıldığında çıkan saçma <strong>MINGW</strong> yazısından rahatsızsanız aşağıdaki path içerisinde bulunan dosyayı açıp hemen altındaki satırların başına comment (#) işareti koyarsanız bu saçma yazıdan kurtulmuş olursunuz.</p>
<pre><code class="lang-bash">...\Git\etc\profile.d\git-prompt.sh

<span class="hljs-comment"># PS1="$PS1"'\[\033[35m\]'       # change to purple</span>
<span class="hljs-comment"># PS1="$PS1"'$MSYSTEM '          # show MSYSTEM</span>
</code></pre>
<p><strong>Linux / MacOS Kullanıcıları buradan devam edebilir...</strong></p>
<p>Evet, Windows kullanıcıları için ana problemi yok ettiğimize göre artık asıl konumuza dönebiliriz. Aşağıda benim kendime göre tanımladığım kısayolları bulabilirsiniz. Bu kısayollar terminaliniz açılırken her defasında execute edilmesi gerektiği için profile dosyanız içerisine en alta yapıştırmanız gerekmekte. Bahsettiğim dosyayı MacOS ve bash kullananlar için ~/.bash_profile pathinde, MacOS ve zsh kullananlar için ~/.zshrc pathinde ve son olarak Windows kullananlar için {UserName}/.bashrc pathinde bulabilirsiniz. Linux dağıtımları kullananlar lütfen araştırsınlar çünkü ne yazık ki o konuda bilgim yok.</p>
<pre><code class="lang-bash">clear;

<span class="hljs-comment"># Defined Paths</span>
homeDir=~;
desktopPath=~/Desktop;
downloadsPath=~/Downloads;
profileFilePath=~/.zshrc;
profileHistoryFilePath=~/.zsh_history;
<span class="hljs-comment"># Defined Paths END</span>

<span class="hljs-comment"># Aliases</span>
<span class="hljs-built_in">alias</span> e=<span class="hljs-string">"exit"</span>;

<span class="hljs-built_in">alias</span> c=<span class="hljs-string">"clear"</span>;
<span class="hljs-built_in">alias</span> cls=<span class="hljs-string">"clear"</span>;
<span class="hljs-built_in">alias</span> clearHistory=<span class="hljs-string">"rm <span class="hljs-variable">$profileHistoryFilePath</span>;clear"</span>;

<span class="hljs-built_in">alias</span> hide=<span class="hljs-string">"setfile -a V"</span>;
<span class="hljs-built_in">alias</span> show=<span class="hljs-string">"setfile -a v"</span>;

<span class="hljs-built_in">alias</span> editProfile=<span class="hljs-string">"code <span class="hljs-variable">$profileFilePath</span>"</span>;
<span class="hljs-built_in">alias</span> refreshProfile=<span class="hljs-string">". <span class="hljs-variable">$profileFilePath</span>"</span>;

<span class="hljs-built_in">alias</span> ca=<span class="hljs-string">"cd <span class="hljs-variable">$homeDir</span>"</span>;
<span class="hljs-built_in">alias</span> desktop=<span class="hljs-string">"cd <span class="hljs-variable">$desktopPath</span>"</span>;
<span class="hljs-built_in">alias</span> downloads=<span class="hljs-string">"cd <span class="hljs-variable">$downloadsPath</span>"</span>;
<span class="hljs-comment"># Aliases END</span>

<span class="hljs-comment"># Functions</span>
<span class="hljs-keyword">function</span> ..(){
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> {1..<span class="hljs-variable">$1</span>}
    <span class="hljs-keyword">do</span>
        <span class="hljs-built_in">cd</span> ..;
    <span class="hljs-keyword">done</span>
}

<span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">oc</span></span>(){
    <span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> ]
    <span class="hljs-keyword">then</span>
        code .;
    <span class="hljs-keyword">else</span>
        code <span class="hljs-variable">$1</span>;
    <span class="hljs-keyword">fi</span>
}
<span class="hljs-comment"># Functions END</span>
</code></pre>
<p>Şimdi yukarıdaki komutlara sıra sıra baktığımızda, en başta <strong>clear</strong> terimini çağırıyorum çünkü ben başta gelen saçma yazıları görmek istemiyorum. Ancak sonda değil de başta çağırmamın sebebi profile dosyası execute edilirken bir hata ortaya çıkarsa onu terminal ekranında görebilmek. Diğer komutlara ise sırasıyla bakacak olursak öncelikle komutlar içerisinde kullandığım pathleri değişken olarak tanımlıyorum. Böylece kullandığım işletim sistemine göre sadece bu bölümleri değiştirmem yeterli olacak, başka bir şey yapmama gerek kalmayacak.</p>
<p>Sonrasında aliasları tanımladım, bu ailasların çoğu zaten bakarak anlaşılabilir düzeyde olan komutlar. Ancak özellikle belirtmek istediğim bazı tanımlamalar var.</p>
<ol>
<li><p><strong>clearHistory:</strong> Bu tanımlama kullandığımız shell’in geçmişini rm komutu ile siliyor. Böylece terminalde scrollu yukarı kaydırdığınızda çıkan eski komutlar yok oluyor. Tabii bunu etkili olması için terminali yeniden başlatmanız gerekiyor ancak bunu komut ile yapacak bir çözüm bulamadım ne yazık ki.</p>
</li>
<li><p><strong>hide / show:</strong> Bu iki komut, sonrasında gönderdiğimiz dosya/klasör adına göre o dosyayı/klasörü gizliyor ya da görünür kılıyor.</p>
</li>
<li><p><strong>editProfile:</strong> Bu komut şu anda düzenlediğimiz dosyayı her seferinde gidip bulup açmak yerine direkt olarak VS Code ile açıyor ve hızlıca düzenlemenizi sağlıyor.</p>
</li>
<li><p><strong>refreshProfile:</strong> Bu komut ise herhangi bir edit yaptıktan sonra profile dosyasını tekrar execute etmek için terminali yeniden başlatmanıza gerek kalmadan direkt olarak dosyayı tekrardan execute ediyor.</p>
</li>
</ol>
<p>Alias tanımlamalarından sonra ise bazı functionlar gelmekte. Bu functionlardan ilki olan <strong>..()</strong> functionu cd (change directory) komutunu kullanmadan üst klasörlere gidebilmenizi sağlıyor. Bir üste gitmek istediğinizde <strong>..</strong> belirli sayıda gitmek istediğinizde ise <strong>.. n</strong> şeklinde (arada boşluk var) kullanabilirsiniz. Böylece girdiğiniz <strong>n</strong> değeri kadar üst klasöre çıkabilirsiniz.</p>
<p>Son olarak ise <strong>oc()</strong> functionu bulunmakta. Açılımı <strong>Open Code</strong> olan bu function, terminalde herhangi bir klasör içerisinde iken sadece oc yazdığınızda bulunduğunuz klasörü VS Code içinde açıyor, parametre olarak dosya/klasör gönderdiğinizde ise o dosyayı/klasörü VS Code içinde açıyor.</p>
<p>Tüm bunların dışında bir de benim ihtiyaç duymadığım için kullanmadığım (zira Angular komutları gayet kısa ve kullanışlı) ancak uzun uzun komutlar içeren yazılım dili/frameworklerle ilgilenenler için bir yapıdan daha bahsetmek istiyorum. Hemen aşağıda bahsedeceğim bu switch/case yapısını bulabilirsiniz.</p>
<pre><code class="lang-bash"><span class="hljs-keyword">function</span> <span class="hljs-function"><span class="hljs-title">methodName</span></span>(){
    <span class="hljs-keyword">for</span> arg <span class="hljs-keyword">in</span> <span class="hljs-string">"<span class="hljs-variable">$@</span>"</span>
    <span class="hljs-keyword">do</span>
        <span class="hljs-keyword">case</span> <span class="hljs-variable">$arg</span> <span class="hljs-keyword">in</span>
            param1)
                <span class="hljs-comment">#Do something...</span>
            ;;
            param2)
                <span class="hljs-comment">#Do something...</span>
            ;;
            <span class="hljs-built_in">help</span>)
                <span class="hljs-built_in">echo</span> <span class="hljs-string">'Explain something...'</span>
            ;;
            *)
                <span class="hljs-built_in">echo</span> <span class="hljs-variable">$arg</span> <span class="hljs-string">'not found!'</span>
            ;;
        <span class="hljs-keyword">esac</span>
    <span class="hljs-keyword">done</span>
}
</code></pre>
<p>Yukarıda da gördüğünüz gibi bir method tanımlayıp bu methoda göndereceğiniz farklı parametrelere göre farklı işlemler yapabilirsiniz. Örneğin methodName param1 dediğinizde param1’in bulunduğu case içerisine girecek ve siz de buna göre işlemler yapabileceksiniz. Uzun uzun komutları olan işlemlerinizi bu şekilde kısaltmanız eminim ki çok işinize yarayacaktır. Dilerseniz param1 yerine –param1 yazarak tıpkı shell komutları gibi bir yapı da kurmanız mümkün tabii ki.</p>
<p>Son olarak daha yeni yeni tanımlamalar yaptığım için ileride bu tanımlamalar mutlaka değişecektir, o nedenle <a target="_blank" href="https://gist.github.com/CagriAldemir/1ce4bd4257c16c746a50c8caed6e7b56"><strong>buradan</strong></a> dosya içeriğini yayınladığım gist linkine giderek güncel tanımlamalarımın tamamını görebilirsiniz.</p>
<p>Umarım faydalı bir içerik olmuştur. Bir sonraki içerikte, belirsiz bir zaman sonra görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[Yeni Rom Yüklemeden Önce Eski Romun Kullanıcı Verilerini (Uygulama/Oyun vs) Yedekleme]]></title><description><![CDATA[Herkese merhaba. Bu içerikte 09.02.2014 tarihinde andronetwork.com‘da yayınladığım bir içeriği yayınlamak istedim. Her ne kadar artık kimse custom rom yüklemiyor olsa da yazılarım arasında bu içeriğe de yer vermenin doğru olacağını düşünüyorum.
Aşağı...]]></description><link>https://aldemir.dev/custom-rom-yukleme-oncesi-yapilacaklar</link><guid isPermaLink="true">https://aldemir.dev/custom-rom-yukleme-oncesi-yapilacaklar</guid><category><![CDATA[Custom Rom]]></category><category><![CDATA[Android]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Sun, 28 Apr 2019 15:34:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672068784802/35710810-94ad-4c33-a159-31c3928b47d8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese merhaba. Bu içerikte 09.02.2014 tarihinde <a target="_blank" href="http://andronetwork.com">andronetwork.com</a>‘da yayınladığım bir içeriği yayınlamak istedim. Her ne kadar artık kimse custom rom yüklemiyor olsa da yazılarım arasında bu içeriğe de yer vermenin doğru olacağını düşünüyorum.</p>
<p>Aşağıda içeriğin bahsettiğim siteden birebir kopyalanmış halini bulabilirsiniz.</p>
<hr />
<p>Evet arkadaşlar tahminimce herkes rom yüklemeden önce o romu kurduğunda, kullandığı program ya da oyunları tek tek yüklemenin uğraştırıcı olacağını düşünmüştür. Özellikle de telefonunda çok fazla program kullananlar. Neyse lafı fazla uzatmadan direk konuya giriyorum.</p>
<p>Öncelikle internet bağlantısını koparın. Hatta mümkünse telefonu uçak moduna alın. Çünkü telefonunuzdaki whatsapp gibi sosyal uygulamaların sohbet geçmişleri ya da cihazınıza gelen mesajlar önemli ise siz yedek aldıktan sonra gelecek bir mesaj boşa gidecek demektir.</p>
<p>Arama kaydı ve mesaj bölümünüzü isteğe göre temizleyebilirsiniz. Gereksiz şeyleri silmek açısından.</p>
<p>Sıra geldi mesajların, yer işaretlerinin, rehberin ve wireless şifrelerinin yedeklerini almaya:<br />Mesajlarınızın ve yer işaretlerinizin yedeklerini aşağıda linkini vereceğim Super Backup: SMS &amp; Contacts adlı programla alın. Rehberinizin yedeğini ise androidin kendi içinde sunduğu seçenekten almanızı tavsiye ederim. Çünkü Super Backup, rehber yedeklemede karışıklık yaşatıyor.<br />Rehber yedeği için “Rehber&gt;Seçenekler&gt;Kişileri Yönet (Sense arayüz kullananlar için)&gt;İçe Dışa Aktar&gt;Burada numaralarınız nerde ise orayı seçiniz ve istediğiniz yere yedekleme yapınız. Bana sorarsanız sd carda yapın. Çünkü en mantıklısı o.<br />Wireless şifrelerini yedeklemek için de aşağıda linkini vereceğim WiFi Pass Recovery &amp; Backup programını kullanabilirsiniz.</p>
<p>Şimdi ise uygulamaları yedeklemede.<br />Titanium Backup adlı programı indirip “Menü&gt;Toplu İşlemler&gt;Tüm Kullanıcı Uygulamalarını Yedekle” yolunu izledikten sonra tümünü seç butonuna tıklayıp sağ üstteki yeşil tik işaretine dokunun. Yedek alma işlemi sizin program sayınızla doğru orantılı olarak kısa ya da uzun olacaktır.</p>
<p>Ve son olarak da kullandığınız sohbet yazılımlarının varsa klasör yedeklerini alın. Ben whatsapp kullandığım için yalnızca onun yedeğini alıyorum. Rom yükleme esnasında klasör silinmiyor ancak yine de sizin için önem arzediyorsa yedeklemenizde fayda var.</p>
<p>Bu arada eğer sd cardı da formatlamayı düşünüyorsanız sd card yedeğini de almayı unutmayın. sd cardı formatladıktan sonra romu tekrar card içine atmak için cwm recovery menüsünde mount and storage bölümündeki Mount USB Storage bölümünü seçtikten sonra telefonu bilgisayara USB kablosu ile bağlarsanız cihazınız yığın depolama olarak görünecektir. Ancak ben format atmamanızı öneririm. Çünkü titanium backup, dataları sd cardda olan uygulamaların datalarını yedekleyemediği için bazı uygulamalarda sorun yaşatabilir.</p>
<p>En son ise yükleyeceğiniz romu beğenmeme seçeneğini göz önünde bulundurarak cwm’den tüm sistemin backupunu almayı unutmayın. </p>
<p>Alınabilecek bütün yedekler alındı. Artık rom yükleme işlemine geçip romunuzu yükleyebilirsiniz. Nasıl yükleneceği forum içerisinde mevcuttur.</p>
<p>Sıra geldi romu yükledikten sonra yedekleri geri yüklemeye. Bu işlem önceki işlemlere göre daha kolay. Çünkü programlar aynı ve artık bi göz aşinalığınız var.</p>
<p>Cihaz açıldıktan sonra bir karmaşa olmaması sebebiyle cihazı tekrar uçak moduna alın.</p>
<p>Titanium Backupu açıp “Menü&gt;Toplu İşlemler&gt;Tüm Uygulamaları Geri Yükle” seçeneğini izleyip Tümünü Seç ve Uygulama+Veri seçeneklerini seçerek sağ üstteki yeşil tikten geri yükleme işlemini başlatın. Ancak burada iki seçeneğiniz var. Ya yükleme yapmadan önce whatsapptaki tiki kaldırın. Daha sonra whatsappın dosyalarını tamamen silip yedeklediğiniz dosyaları aynı yere atın ve whatsappı geri yükleyip whatsappın kendi geri yüklemesini kullanın. Ya da direk Titanium Backup’tan geri yükleme yapın. Henüz ikisinde de bi sorunla karşılaşmadım. </p>
<p>Daha sonra yedekleme bölümünde gösterdiğim şekilde rehber menüsüne girip daha önce aldığınız yedeği tanıtın ya da dosya yöneticisi ile aldığınız yedeği açıp rehberin yüklenmesini bekleyin.</p>
<p>Daha sonra yine yedekleme bölümünde verdiğim Super Backup adlı programla mesaj ve yer işaretlerinizi geri yükleyin.</p>
<p>Daha sonra verilen wireless yedekleme programıyla yedeklediğiniz wireless şifrelerini geri yükleyin. </p>
<p>Artık cihazınız; kullandığınız uygulamalarınız ve yeni romunuzla birlikte kullanımınıza hazır. Yalnızca ana menü ve ses seçeneklerini kişiselleştirmeniz yeterli olacaktır.<br />Herhangi bir sorun olursa konu altında belirtin ve çözüm bulmaya çalışalım.<br />Görüşmek üzere...</p>
<p><strong>Kullanılan Uygulamalar:</strong></p>
<ul>
<li><p><a target="_blank" href="https://play.google.com/store/apps/details?id=com.idea.backup.smscontacts&amp;hl=tr%20%EF%BB%BF">Super Backup: SMS &amp; Contacts</a></p>
</li>
<li><p><a target="_blank" href="https://play.google.com/store/apps/details?id=com.ryanamaral.wifi.passwords&amp;hl=tr">WiFi Pass Recovery &amp; Backup</a></p>
</li>
<li><p><a target="_blank" href="https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup&amp;hl=tr">Titanium Backup</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Android'de PRDownloader Kullanımı]]></title><description><![CDATA[Herkese merhaba. Yaklaşık 20 günlük vize rezaletim ardından bugün bir blog yazısı yazmak istedim. İçerik olarak ise herkesin ihtiyacı olabileceğini düşündüğüm için daha önce birkaç projemde kullandığım ve açık kaynak olan bir kütüphanenin kullanımını...]]></description><link>https://aldemir.dev/androidde-pr-downloader-kullanimi</link><guid isPermaLink="true">https://aldemir.dev/androidde-pr-downloader-kullanimi</guid><category><![CDATA[File Downloader Library]]></category><category><![CDATA[Android]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Mon, 15 Apr 2019 15:51:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672069885518/227847bd-0c75-415a-b092-9683c6355244.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese merhaba. Yaklaşık 20 günlük vize rezaletim ardından bugün bir blog yazısı yazmak istedim. İçerik olarak ise herkesin ihtiyacı olabileceğini düşündüğüm için daha önce birkaç projemde kullandığım ve açık kaynak olan bir kütüphanenin kullanımını göstermeyi tercih ettim. Açıkçası bu kütüphane açık kaynak değil de ücretli olsa dahi kullanılabilecek kadar değerli bir kütüphane diyebilirim. Çünkü bir yandan eşzamanlı dosya indirme desteği sunarken diğer yandan herhangi bir sorunla karşılaşılmasıyla dosya indirme işleminin yarıda kalması durumunda ya da kullanıcı isteğiyle indirmenin duraklatılma durumunda kalınan yerden devam edebilme desteği sunuyor. Evet ben de dökümantasyonu ilk okuduğumda sizin gibi <strong><em>“Yok yaw!”</em></strong> demiştim ama sonradan alıştım açık kaynağın geldiği bu noktaya. Her neyse lafı daha fazla uzatmadan kodlara geçelim, bakalım bu kütüphane nasıl kullanılıyormuş.</p>
<p>Öncelikle aşağıdaki satırı app düzeyindeki gradle dosyamızın içine ekliyoruz ki kütüphane proje içerisine dahil olsun.</p>
<pre><code class="lang-bash">implementation <span class="hljs-string">'com.mindorks.android:prdownloader:0.5.0'</span>
</code></pre>
<p>Daha sonra indirme işlemi yapacağımızdan dolayı internet erişim iznini almak için aşağıdaki satırları manifest dosyamıza ekliyoruz.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">uses-permission</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.permission.INTERNET"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">uses-permission-sdk-23</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.permission.INTERNET"</span> /&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672069576593/640fcd62-912b-4760-b53a-bace46292f5c.png" alt class="image--center mx-auto" /></p>
<p>Sonrasında aşağıdaki activity dizaynını oluşturuyoruz. Bu dizaynı oluşturduğumuzda tasarım yukarıdaki gibi görünecektir. Görüldüğü gibi her bir indirme için bir progress bar, indirme durumunu gösterecek olan bir TextView ve kontrolleri sağlayan iki buton bulunmakta.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">ScrollView</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attr">xmlns:tools</span>=<span class="hljs-string">"http://schemas.android.com/tools"</span>
    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span>
    <span class="hljs-attr">tools:context</span>=<span class="hljs-string">".MainActivity"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
        <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
        <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
        <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"vertical"</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">RelativeLayout</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
            <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"8dp"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">ProgressBar</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/progressBarOne"</span>
                <span class="hljs-attr">style</span>=<span class="hljs-string">"@style/Widget.AppCompat.ProgressBar.Horizontal"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_alignParentTop</span>=<span class="hljs-string">"true"</span>
                <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:progressTint</span>=<span class="hljs-string">"@color/colorPrimaryDark"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_below</span>=<span class="hljs-string">"@+id/progressBarOne"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/textViewProgressOne"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"2dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>

                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/not_started_download_size"</span>
                    <span class="hljs-attr">android:textAlignment</span>=<span class="hljs-string">"center"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonCancelOne"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:enabled</span>=<span class="hljs-string">"false"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/cancel"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonOne"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/start"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">RelativeLayout</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">RelativeLayout</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
            <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"8dp"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">ProgressBar</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/progressBarTwo"</span>
                <span class="hljs-attr">style</span>=<span class="hljs-string">"@style/Widget.AppCompat.ProgressBar.Horizontal"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_alignParentTop</span>=<span class="hljs-string">"true"</span>
                <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:progressTint</span>=<span class="hljs-string">"@color/colorPrimaryDark"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_below</span>=<span class="hljs-string">"@+id/progressBarTwo"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/textViewProgressTwo"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"2dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>

                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/not_started_download_size"</span>
                    <span class="hljs-attr">android:textAlignment</span>=<span class="hljs-string">"center"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonCancelTwo"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:enabled</span>=<span class="hljs-string">"false"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/cancel"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonTwo"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/start"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">RelativeLayout</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">RelativeLayout</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
            <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"8dp"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">ProgressBar</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/progressBarThree"</span>
                <span class="hljs-attr">style</span>=<span class="hljs-string">"@style/Widget.AppCompat.ProgressBar.Horizontal"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_alignParentTop</span>=<span class="hljs-string">"true"</span>
                <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:progressTint</span>=<span class="hljs-string">"@color/colorPrimaryDark"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_below</span>=<span class="hljs-string">"@+id/progressBarThree"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/textViewProgressThree"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"2dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>

                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/not_started_download_size"</span>
                    <span class="hljs-attr">android:textAlignment</span>=<span class="hljs-string">"center"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonCancelThree"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:enabled</span>=<span class="hljs-string">"false"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/cancel"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonThree"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/start"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">RelativeLayout</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">RelativeLayout</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
            <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"8dp"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">ProgressBar</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/progressBarFour"</span>
                <span class="hljs-attr">style</span>=<span class="hljs-string">"@style/Widget.AppCompat.ProgressBar.Horizontal"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_alignParentTop</span>=<span class="hljs-string">"true"</span>
                <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:progressTint</span>=<span class="hljs-string">"@color/colorPrimaryDark"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_below</span>=<span class="hljs-string">"@+id/progressBarFour"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/textViewProgressFour"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"2dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>

                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/not_started_download_size"</span>
                    <span class="hljs-attr">android:textAlignment</span>=<span class="hljs-string">"center"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonCancelFour"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:enabled</span>=<span class="hljs-string">"false"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/cancel"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonFour"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/start"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">RelativeLayout</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">RelativeLayout</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
            <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"8dp"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">ProgressBar</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/progressBarFive"</span>
                <span class="hljs-attr">style</span>=<span class="hljs-string">"@style/Widget.AppCompat.ProgressBar.Horizontal"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_alignParentTop</span>=<span class="hljs-string">"true"</span>
                <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:layout_marginRight</span>=<span class="hljs-string">"4dp"</span>
                <span class="hljs-attr">android:progressTint</span>=<span class="hljs-string">"@color/colorPrimaryDark"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_below</span>=<span class="hljs-string">"@+id/progressBarFive"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/textViewProgressFive"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"2dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>

                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/not_started_download_size"</span>
                    <span class="hljs-attr">android:textAlignment</span>=<span class="hljs-string">"center"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonCancelFive"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:enabled</span>=<span class="hljs-string">"false"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/cancel"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">Button</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/buttonFive"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_margin</span>=<span class="hljs-string">"4dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"@string/start"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">RelativeLayout</span>&gt;</span>

    <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">ScrollView</span>&gt;</span>
</code></pre>
<p>Yukarıdaki adımları tamamladıktan sonra sıra geldi activity classımızın içerisine.<br />Aşağıda da gördüğünüz gibi dirPath adında bir değişken tanımlıyoruz, bu değişken dosyaları indireceğimiz yeri tutacak içerisinde.<br />Sonrasındaki 5 değişken ise indireceğimiz dosyaların linklerini içermekte. Ben örnek olarak github reposuna upload ettiğim zip dosyalarını kullanacağım.<br />Sonrasında ise dizayn için gereken viewlerin tanımlamalarını yapıyoruz.<br />En altta ise her bir indirmenin ID değerini tutması için 5 adet integer değer oluşturuyoruz. Bu değerler aracılığıyla indirmemizin durumunu öğrenebilecek ya da indirmeyi duraklatıp devam ettirebileceğiz. Kısacası bu değerlere flag diyebiliriz.</p>
<pre><code class="lang-java">    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String dirPath;

    <span class="hljs-keyword">final</span> String URL1 = <span class="hljs-string">"https://raw.githubusercontent.com/CagriAldemir/AndroidFileDownloaderExample/master/Downloadable_Files/File1.zip"</span>;
    <span class="hljs-keyword">final</span> String URL2 = <span class="hljs-string">"https://raw.githubusercontent.com/CagriAldemir/AndroidFileDownloaderExample/master/Downloadable_Files/File2.zip"</span>;
    <span class="hljs-keyword">final</span> String URL3 = <span class="hljs-string">"https://raw.githubusercontent.com/CagriAldemir/AndroidFileDownloaderExample/master/Downloadable_Files/File3.zip"</span>;
    <span class="hljs-keyword">final</span> String URL4 = <span class="hljs-string">"https://raw.githubusercontent.com/CagriAldemir/AndroidFileDownloaderExample/master/Downloadable_Files/File4.zip"</span>;
    <span class="hljs-keyword">final</span> String URL5 = <span class="hljs-string">"https://raw.githubusercontent.com/CagriAldemir/AndroidFileDownloaderExample/master/Downloadable_Files/File5.zip"</span>;


    Button buttonOne, buttonTwo, buttonThree, buttonFour, buttonFive;

    Button buttonCancelOne, buttonCancelTwo, buttonCancelThree, buttonCancelFour, buttonCancelFive;

    TextView textViewProgressOne, textViewProgressTwo, textViewProgressThree, textViewProgressFour, textViewProgressFive;

    ProgressBar progressBarOne, progressBarTwo, progressBarThree, progressBarFour, progressBarFive;

    <span class="hljs-keyword">int</span> downloadIdOne, downloadIdTwo, downloadIdThree, downloadIdFour, downloadIdFive;
</code></pre>
<p>Gerekli olan tüm değişkenleri ve viewleri oluşturduğumuza göre sıra geldi metodları yazmaya. Öncelikle initViews metodunu oluşturuyoruz. initViews metodu zaten sizlerin de bildiği gibi sadece yukarıda tanımladığımız viewleri activity tasarımında tanımladıklarımızla eşleştiriyor.<br />Asıl önemli olan initDownloader metodu ise kullanacağımız kütüphanenin initialize işlemlerini gerçekleştiriyor.<br />Aşağıda da gördüğünüz gibi öncelikle bahsi geçen kütüphanede bulunan PRDownloaderConfig classından bir obje oluşturuyoruz. Daha sonra indirme işleminin durdurma/devam etme durumlarını takip edebilmek için uygulamanın database özelliğini aktif ediyoruz. Sonrasında ise indirme için bağlantı ve okuma gecikmelerini set ediyoruz. Set etmezsek kütüphane kendi default değerlerini (20.000) kullanacaktır.</p>
<pre><code class="lang-java">    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initViews</span><span class="hljs-params">()</span> </span>{
        buttonOne = findViewById(R.id.buttonOne);
        buttonTwo = findViewById(R.id.buttonTwo);
        buttonThree = findViewById(R.id.buttonThree);
        buttonFour = findViewById(R.id.buttonFour);
        buttonFive = findViewById(R.id.buttonFive);

        buttonCancelOne = findViewById(R.id.buttonCancelOne);
        buttonCancelTwo = findViewById(R.id.buttonCancelTwo);
        buttonCancelThree = findViewById(R.id.buttonCancelThree);
        buttonCancelFour = findViewById(R.id.buttonCancelFour);
        buttonCancelFive = findViewById(R.id.buttonCancelFive);

        textViewProgressOne = findViewById(R.id.textViewProgressOne);
        textViewProgressTwo = findViewById(R.id.textViewProgressTwo);
        textViewProgressThree = findViewById(R.id.textViewProgressThree);
        textViewProgressFour = findViewById(R.id.textViewProgressFour);
        textViewProgressFive = findViewById(R.id.textViewProgressFive);

        progressBarOne = findViewById(R.id.progressBarOne);
        progressBarTwo = findViewById(R.id.progressBarTwo);
        progressBarThree = findViewById(R.id.progressBarThree);
        progressBarFour = findViewById(R.id.progressBarFour);
        progressBarFive = findViewById(R.id.progressBarFive);
    }


    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initDownloader</span><span class="hljs-params">()</span> </span>{
        PRDownloaderConfig mConfig = PRDownloaderConfig.newBuilder()
                .setDatabaseEnabled(<span class="hljs-keyword">true</span>) <span class="hljs-comment">//İndirme işlemi uygulama kill olduktan sonra da devam edebilsin diye database desteğini aktif ediyoruz.</span>
                .setConnectTimeout(<span class="hljs-number">30000</span>).setReadTimeout(<span class="hljs-number">30000</span>) <span class="hljs-comment">//İndirme için bağlantı ve okuma gecikmelerini set ediyoruz. Set etmezsek default değerler (20.000) kullanılacaktır.</span>
                .build();
        PRDownloader.initialize(<span class="hljs-keyword">this</span>, mConfig);
    }
</code></pre>
<p>Kütüphanenin initialize işlemini de gerçekleştirdiğimize göre sıra geldi butonların neler yapacağını yazmaya. Yukarıdaki dizaynda da gördüğünüz üzere uygulama 5 farklı indirme işlemi için tasarlanmış durumda ancak ben sadece ilki için olan bölümü açıklayacağım. Zira diğerlerinde linkler ve dosya isimleri hariç işleyiş olarak her şey aynı.</p>
<p>Metod içerisinde buttonOne isimli butonun onClickListenerini oluşturuyoruz. Bu buton yukarıdaki uygulama görselinde ilk indirme bölümünde sağdaki butonu ifade etmekte ve işlev olarak BAŞLAT ve DURAKLAT işlevlerini yerine getirmekte. Listener içerisinde öncelikle if koşulu içerisinde ilk indirmenin durumunun devam edip etmediğini kontrol ediyoruz ve eğer devam ediyorsa indirmeyi ID’si aracılığıyla duraklatıp return ile click metodundan çıkıyoruz.</p>
<p>Yok eğer indirme işlemi devam etmiyorsa önce tıkladığımız butonu pasif ediyoruz ki işlemler arasında ikinci bir tıklama ile yapı birbirine girmesin. Sonrasında progress barın indetermine durumunu aktif ediyoruz çünkü indirme işlemini henüz başlatmadığımız ya da devam ettirmediğimiz için doğru bir değer gösteremeyiz. Sonrasındaki satır sadece dizayn için yazılmış bir satır, konumuzla ilgisi olmadığı için bahsetmeyeceğim.<br />Daha sonra indirme işleminin duraklatılıp duraklatılmadığını kontrol ediyoruz ve eğer duraklatıldıysa yine ID aracılığıyla indirme işlemini devam ettiriyoruz ve return ile metod içerisinden çıkıyoruz.</p>
<p>Ancak indirme işleminin henüz hiç başlamadığı durumu hala kontrol etmedik. Kodun devamı da zaten bu bölümü içermekte. Kütüphanenin içerisindeki download metoduyla bir indirme işlemi başlatıyoruz ve bu metodu ID’ye eşitliyoruz ki sonrasında işlemi takip edebilelim. Bu metod içerisine indirilecek dosyanın adresini, indirme pathini ve indirilecek dosyanın adını alıyor. Sonrasında ise diğer listenerleri ekliyoruz. Bu listenerler sırasıyla şöyle;</p>
<ul>
<li><p>OnStartOrResumeListener</p>
</li>
<li><p>OnPauseListener</p>
</li>
<li><p>OnCancelListener</p>
</li>
<li><p>OnProgressListener</p>
</li>
<li><p>OnDownloadListener</p>
</li>
</ul>
<p>Bu listenerlerin gövdelerini tek tek anlatmayacağım çünkü bakıldığında fazlasıyla anlaşılır olduğunu görebilirsiniz zaten. Ancak yine de takıldığınız yer olursa yorum olarak bildirirseniz ayrıca yardımcı olabilirim.</p>
<p>Kod bloğunun en sonunda ise soldaki diğer butonun listenerinin set edildiğini görebilirsiniz. Bu buton sadece indirme işlemini durduruyor. cancel metoduna ID’yi gönderdiğimizde de bu işlem gerçekleşiyor. Tabii burda indirme tamamen durdurulduğu için daha önce indirilmiş olan yarım kalmış veriler de hafızadan tamamen siliniyor. O nedenle bu bölümü duraklatma ile karıştırmamakta fayda var.</p>
<pre><code class="lang-java">    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClickListenerOne</span><span class="hljs-params">()</span> </span>{
        buttonOne.setOnClickListener(<span class="hljs-keyword">new</span> View.OnClickListener() {
            <span class="hljs-meta">@Override</span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(View view)</span> </span>{

                <span class="hljs-keyword">if</span> (Status.RUNNING == PRDownloader.getStatus(downloadIdOne)) {
                    PRDownloader.pause(downloadIdOne);
                    <span class="hljs-keyword">return</span>;
                }

                buttonOne.setEnabled(<span class="hljs-keyword">false</span>);
                progressBarOne.setIndeterminate(<span class="hljs-keyword">true</span>);
                progressBarOne.getIndeterminateDrawable().setColorFilter(
                        Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

                <span class="hljs-keyword">if</span> (Status.PAUSED == PRDownloader.getStatus(downloadIdOne)) {
                    PRDownloader.resume(downloadIdOne);
                    <span class="hljs-keyword">return</span>;
                }

                downloadIdOne = PRDownloader.download(URL1, dirPath, <span class="hljs-string">"File1.zip"</span>)
                        .build()
                        .setOnStartOrResumeListener(<span class="hljs-keyword">new</span> OnStartOrResumeListener() {
                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onStartOrResume</span><span class="hljs-params">()</span> </span>{
                                progressBarOne.setIndeterminate(<span class="hljs-keyword">false</span>);
                                buttonOne.setEnabled(<span class="hljs-keyword">true</span>);
                                buttonOne.setText(R.string.pause);
                                buttonCancelOne.setEnabled(<span class="hljs-keyword">true</span>);
                            }
                        })
                        .setOnPauseListener(<span class="hljs-keyword">new</span> OnPauseListener() {
                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onPause</span><span class="hljs-params">()</span> </span>{
                                buttonOne.setText(R.string.resume);
                            }
                        })
                        .setOnCancelListener(<span class="hljs-keyword">new</span> OnCancelListener() {
                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCancel</span><span class="hljs-params">()</span> </span>{
                                buttonOne.setText(R.string.start);
                                buttonCancelOne.setEnabled(<span class="hljs-keyword">false</span>);
                                progressBarOne.setProgress(<span class="hljs-number">0</span>);
                                textViewProgressOne.setText(R.string.not_started_download_size);
                                downloadIdOne = <span class="hljs-number">0</span>;
                                progressBarOne.setIndeterminate(<span class="hljs-keyword">false</span>);
                            }
                        })
                        .setOnProgressListener(<span class="hljs-keyword">new</span> OnProgressListener() {
                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onProgress</span><span class="hljs-params">(Progress progress)</span> </span>{
                                <span class="hljs-keyword">long</span> progressPercent = progress.currentBytes * <span class="hljs-number">100</span> / progress.totalBytes;
                                progressBarOne.setProgress((<span class="hljs-keyword">int</span>) progressPercent);
                                textViewProgressOne.setText(Utils.getProgressDisplayLine(progress.currentBytes, progress.totalBytes));
                                progressBarOne.setIndeterminate(<span class="hljs-keyword">false</span>);
                            }
                        })
                        .start(<span class="hljs-keyword">new</span> OnDownloadListener() {
                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDownloadComplete</span><span class="hljs-params">()</span> </span>{
                                buttonOne.setEnabled(<span class="hljs-keyword">false</span>);
                                buttonCancelOne.setEnabled(<span class="hljs-keyword">false</span>);
                                buttonOne.setText(R.string.completed);
                            }

                            <span class="hljs-meta">@Override</span>
                            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(Error error)</span> </span>{
                                buttonOne.setText(R.string.start);
                                Toast.makeText(getApplicationContext(), getString(R.string.some_error_occurred) + <span class="hljs-string">"\n İndirme ID Numarası: "</span> + downloadIdOne, Toast.LENGTH_SHORT).show();
                                textViewProgressOne.setText(R.string.not_started_download_size);
                                progressBarOne.setProgress(<span class="hljs-number">0</span>);
                                downloadIdOne = <span class="hljs-number">0</span>;
                                buttonCancelOne.setEnabled(<span class="hljs-keyword">false</span>);
                                progressBarOne.setIndeterminate(<span class="hljs-keyword">false</span>);
                                buttonOne.setEnabled(<span class="hljs-keyword">true</span>);
                            }
                        });
            }
        });

        buttonCancelOne.setOnClickListener(<span class="hljs-keyword">new</span> View.OnClickListener() {
            <span class="hljs-meta">@Override</span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span><span class="hljs-params">(View view)</span> </span>{
                PRDownloader.cancel(downloadIdOne);
            }
        });
    }
</code></pre>
<p>Gerekli tüm metodlar da yazıldığına göre son olarak bu metodları onCreate içerisinde çağırmak kaldı demektir. Ancak ondan önce dirPath’i set ediyoruz. Ben oluşturduğum Utils classı içerisindeki metoddan dönen değerle set ediyorum bu değişkeni burada. Yine konuyla ilgili olmadığı için ayrıntı vermeyeceğim ancak aşağıdaki github linkinden kodlara bakarak rahatlıkla anlayabilirsiniz olanları. Bu projede ise dosyalar “<em>ROOT/Android/data/PACKAGE_NAME/files</em>” pathine inmekte. Bu klasör içerisinden indirilen dosyaları kontrol edebilirsiniz.<br />Bu tanımlamadan sonra ise dediğim gibi yazılan metodları geçerli olması için çağırıyoruz sadece.</p>
<pre><code class="lang-java">    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> </span>{
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dirPath = Utils.getRootDirPath(getApplicationContext());

        initViews();
        initDownloader();

        onClickListenerOne();
        onClickListenerTwo();
        onClickListenerThree();
        onClickListenerFour();
        onClickListenerFive();
    }
</code></pre>
<p>Tüm bu aşamaları eksiksiz tamamladığınızda kütüphane üzerine düşen tüm görevleri yerine getirmek için hazır demektir. Dilerseniz kütüphanenin github adresine de <a target="_blank" href="https://github.com/MindorksOpenSource/PRDownloader">buradan</a> erişebilir ve güncel sürümlerini kullanabilirsiniz.</p>
<p>Bugünlük anlatacaklarım bu kadar, umarım faydalı olmuştur.<br />Bir sonraki içerikte görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[Pozlama Nedir? Pozlamayı Etkileyen Faktörler | Fotoğrafçılık ve Sinema Terimleri Serisi]]></title><description><![CDATA[Merhaba. Serinin ikinci içeriğinde pozlama ve daha da önemlisi pozlamayı belirleyen faktörler hakkında konuşacağız. Ancak şunu baştan söylemem gerekir ki burada anlatacaklarım yetmeyecektir çünkü bu tür konularda ne kadar araştırma yaparsak yapalım n...]]></description><link>https://aldemir.dev/pozlama-nedir</link><guid isPermaLink="true">https://aldemir.dev/pozlama-nedir</guid><category><![CDATA[Diyafram Açıklığı]]></category><category><![CDATA[Pozlama]]></category><category><![CDATA[Shutter Speed]]></category><category><![CDATA[ISO]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Fri, 15 Feb 2019 17:40:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989930209/35246ab1-7d3c-4ac2-8e7a-1833866da032.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Merhaba. Serinin ikinci içeriğinde pozlama ve daha da önemlisi pozlamayı belirleyen faktörler hakkında konuşacağız. Ancak şunu baştan söylemem gerekir ki burada anlatacaklarım yetmeyecektir çünkü bu tür konularda ne kadar araştırma yaparsak yapalım ne yazık ki her zaman bir şeyler eksik kalmakta. Hatta sadece pozlama üzerine bir kitap yazılabilir desem yeridir. Bu yüzdendir ki çok fazla araştırma yapmak zorunda kaldım ve öğrendiğim her yeni bilgiden sonra "<strong><em>Oh my God, what is this!</em></strong>" şeklinde söylemlerde bulundum. Yine de bu konuda hatırı sayılabilecek düzeyde bir bilgiye hakim olmak isterseniz bu içerikte bulunanlar fazlasıyla yetecektir. O zaman "Nedir yahu bu pozlama!" diyerek başlayalım.</p>
<p>Pozlama, teknik olarak sensöre düşen ışık miktarıdır aslında. Ancak daha yüzeysel bakacak olursak fotoğrafın aydınlık veya karanlık çıkması olarak düşünebiliriz. Aşağıda aynı karenin çok pozlanmış, doğru pozlanmış ve az pozlanmış hallerini görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989490786/ee997797-eb91-4c6e-9d54-2a910316adf9.jpeg" alt class="image--center mx-auto" /></p>
<p>Pozlamayı etkileyen birçok faktör olsa da en önemli faktör elbette ki ışık. Bu noktada ise ortaya kameranın neye baktığını bilmemesi gibi bir sorun çıkıyor. Bu nedenle de kameralar her zaman pozlama kararını ortalamaya göre verirler. Bu ortalama ise %18 saf gridir.</p>
<p>Aşağıdaki görselde bu ortalamayı görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989562815/c79d3d4c-bdf5-4e4d-b98c-5f33a3e8fb3a.jpeg" alt class="image--center mx-auto" /></p>
<p>Her ne kadar pozlamayı daha kolay bir hale getirmek için Kickstarter üzerinden destek toplanan bir cihaz ortaya çıkmış olsa da ortada böyle bir cihaz olmadığı için henüz başarısı test edilebilmiş değil. İddiaya göre bu cihaz sayesinde kamera neye baktığını bilebilecek ve aynı zamanda size monitörlük de yapabilecek. Söylenilene göre cihaza verilen milyonlarca fotoğraf ile cihaz öğreniyor ve gördüğü kareye göre doğru ayarlamaları yapıyor. Ancak dediğim gibi ortada henüz böyle bir cihaz olmadığı için günümüzde bu görme eylemini kişinin kendisinin yapması gerekmekte. Çünkü beyaz tişört giymiş birisi ile siyah tişört giymiş birisi ya da karlı bir manzara ile karanlık bir oda aynı pozlama değerlerini kabul etmez ve bu nedenle de kişinin neyi çektiğini görmesi ve buna göre birtakım kararlar vermesi gerekmektedir.</p>
<p>Peki bu kadar önemli olan %18 gri nedir? Bir kameranın kaydedebileceği en siyah ve en beyaz görüntünün ortalamasından elde edilen renktir aslında %18 saf gri. Pozlama dediğimiz şey de aslında bu renklerin yerlerine karar vermektir en temelde. Yani öyle bir pozlama değeri belirlenmeli ki siyah renk gerçek siyahta, beyaz renk gerçek beyazda ve gri renk de gerçek gride görünsün. Şimdi gelelim pozlamayı etkileyen ana üç faktöre...</p>
<ol>
<li><p><strong>ISO (ASA)</strong></p>
</li>
<li><p><strong>Diyafram Açıklığı</strong></p>
</li>
<li><p><strong>Örtücü Hızı (Shutter Speed/Enstantane)</strong></p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989637872/da1beb6e-c9a3-4f2b-8932-575b21a966ca.jpeg" alt class="image--center mx-auto" /></p>
<p>Dilerseniz <strong>ISO</strong> ile başlayalım. ISO (ASA); filmli makinelerde filmin, sensörlü cihazlarda ise sensörün ışığa duyarlılığıdır. Ancak sensöre giren ışık miktarı değişmediği, sadece duyarlılık artırılabildiği için ISO değeri çok fazla artırıldığında görüntüde noiseler meydana gelir. Aşağıdaki görselde farklı ISO değerlerine göre sensörün ürettiği görüntüleri görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989681660/34c5bf06-8c5e-4f6c-ba77-6519035cf112.jpeg" alt class="image--center mx-auto" /></p>
<p>İkinci faktöre gelecek olursak <strong>diyafram</strong>, f-stop olarak ifade edilir ve kamerada ya da fotoğraf makinesinde takılı olan lensin ne kadarlık bir açıklığa sahip olduğunu belirleyen değerdir. Yani bu değere göre kameranın ne kadar geniş bir alandan ışık alacağı belirlenir. Bu tıpkı insanın gözünü ne kadar açabileceğine benzer. Değerleri bir standarda bağlıdır ve değer arttıkça açıklık azalır. Aşağıdaki sıralamada görüldüğü üzere her bir diyafram artışında lens içeri bir önceki değerin yarısı kadar ışık alır.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989714994/a3a851eb-7b5a-41a9-95f5-df0ef5f3a128.jpeg" alt class="image--center mx-auto" /></p>
<p>Pozlamayı etkileyen son faktör olan <strong>örtücü hızı</strong> (shutter speed/enstantane) ise sensörün ya da filmin ne kadar süre boyunca ışığa maruz bırakılacağını ifade eder. Tabii burada fotoğraf ve video arasındaki uçurum ortaya çıkmakta. Çünkü fotoğraf çekerken örtücü hızı istenildiği gibi ayarlanabilir, örneğin hareketsiz bir manzara varsa tripod aracılığıyla istenirse 1 saat dahi ışığa maruz bırakılabilir sensör. Ancak videoda bir saniyede belirli sayıda kare üretme zorunluluğu olduğu için örtücü hızını belirli bir sürenin üzerine çıkaramayız. Genel olarak ise saniyede üretilecek kare sayısının örtücü hızıyla oranı;</p>
<p><strong>Örtücü Hızı = 1/FPS*2</strong></p>
<p>şeklindedir. Yani saniyede 25 kare üretilecekse örtücü hızı da maksimum 1/50 olabilir. Genelde de filmlerdeki motion blurlu görsellerin elde edilebilmesi için 1/50 değeri kullanılır. Bu değerin üstüne çıkacak olursanız görüntünün ışığı artar ancak netliği azalır. Aşağı doğru indiğinizde ise netlik artar ancak bu sefer de ışıktan feragat etmek zorunda kalırsınız. Elbette bu durumda saniyede 1000 kare çekmemiz gerekiyorsa sensörün ışığa maruz kalacağı süre çok düşük bir değer olacağı için ortamdaki ışık ayarı da normale göre çok yüksek seviyede olmalıdır.</p>
<p>Aşağıda aynı karenin farklı örtücü hızlarına göre üretilmiş varyasyonları bulunmaktadır. Dilerseniz bu görsele bakarak da aradaki farkı bariz olarak görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671989787026/2b678b78-04ed-4e3c-9ca3-86696db36c44.jpeg" alt class="image--center mx-auto" /></p>
<p>Bu konuda anlatacaklarım bu kadar, umarım işe yarar değerli bilgiler sağlayabilmişimdir. Bir sonraki yazıda görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[Android’de RecyclerView ve CardView Kullanımı]]></title><description><![CDATA[Herkese Merhaba. Bu yazıda bir android projesi içerisinde RecyclerView ve CardView toollarının kullanımını anlatmaya çalışacağım.
CardView dediğimiz tool, aslında günlük hayatta kullandığımız neredeyse tüm uygulamaların içerisinde bulunan bir view. C...]]></description><link>https://aldemir.dev/recyclerview-ve-cardview-kullanimi</link><guid isPermaLink="true">https://aldemir.dev/recyclerview-ve-cardview-kullanimi</guid><category><![CDATA[RecyclerView  ]]></category><category><![CDATA[Card View]]></category><category><![CDATA[Android]]></category><category><![CDATA[Java]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Tue, 12 Feb 2019 15:17:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1672068378057/d3bbd10c-9fcd-43e2-be0e-dce2b10b1cd1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Herkese Merhaba. Bu yazıda bir android projesi içerisinde RecyclerView ve CardView toollarının kullanımını anlatmaya çalışacağım.</p>
<p>CardView dediğimiz tool, aslında günlük hayatta kullandığımız neredeyse tüm uygulamaların içerisinde bulunan bir view. CardView aracılığıyla uygulama içerisinde kart şeklinde dizaynlar oluşturup bunları listeleyebiliriz.</p>
<p>RecyclerView toolu ise oluşturduğumuz CardView’i elimizdeki veri dizaynına ve sayısına göre alt alta, yan yana ya da daha farklı şekillerde dizmemizi sağlar. Bu araçları kullanmaya başladığım ilk zamanlarda o kadar beğenmiştim ki, resmen “<strong><em>vovovovovovovov</em></strong>” demiştim diyebilirim. Ve bu nedenle de bu yazıyı yazma ihtiyacı hissettim. Hazırsak başlayalım…</p>
<p>Her şeyden önce projemizin app düzeyindeki gradle dosyasına aşağıdaki iki satırı eklemeliyiz. Çünkü bahsi geçen toolları kullanmamız için gereken kütüphaneleri projemize import etmemiz gerekiyor.</p>
<pre><code class="lang-java">implementation <span class="hljs-string">'com.android.support:recyclerview-v7:28.0.0'</span>
implementation <span class="hljs-string">'com.android.support:cardview-v7:28.0.0'</span>
</code></pre>
<p>Daha sonra, RecyclerView’i kullanacağımız activitynin layout dosyası içerisine RecyclerView viewini ekliyoruz.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">android.support.constraint.ConstraintLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
    <span class="hljs-attr">xmlns:tools</span>=<span class="hljs-string">"http://schemas.android.com/tools"</span>
    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span>
    <span class="hljs-attr">tools:context</span>=<span class="hljs-string">".MainActivity"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">android.support.v7.widget.RecyclerView</span>
        <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/example_recyler_view"</span>
        <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span>
        <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"0dp"</span>
        <span class="hljs-attr">app:layout_constraintBottom_toBottomOf</span>=<span class="hljs-string">"parent"</span>
        <span class="hljs-attr">app:layout_constraintEnd_toEndOf</span>=<span class="hljs-string">"parent"</span>
        <span class="hljs-attr">app:layout_constraintStart_toStartOf</span>=<span class="hljs-string">"parent"</span>
        <span class="hljs-attr">app:layout_constraintTop_toTopOf</span>=<span class="hljs-string">"parent"</span>
        <span class="hljs-attr">tools:listitem</span>=<span class="hljs-string">"@layout/recycler_view_list_item"</span> /&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">android.support.constraint.ConstraintLayout</span>&gt;</span>
</code></pre>
<p>Sonrasında ise CardView dizaynını oluşturuyoruz. Bu dizayn için layout klasörü içerisinde bir layout dosyası oluşturabilirsiniz. Bu layout, RecyclerView toolu içerisinde görünecek bir satırın dizaynı olduğu için isim verirken ona göre bir isim verirseniz (list_item, row vb.) işiniz kolaylaşacaktır. Aşağıda örnek dizaynı görebilirsiniz.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
    <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"vertical"</span>
    <span class="hljs-attr">android:tag</span>=<span class="hljs-string">"cards main container"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">android.support.v7.widget.CardView</span> <span class="hljs-attr">xmlns:card_view</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
        <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/example_card_view"</span>
        <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
        <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
        <span class="hljs-attr">card_view:cardBackgroundColor</span>=<span class="hljs-string">"@android:color/white"</span>
        <span class="hljs-attr">card_view:cardCornerRadius</span>=<span class="hljs-string">"10dp"</span>
        <span class="hljs-attr">card_view:cardElevation</span>=<span class="hljs-string">"5dp"</span>
        <span class="hljs-attr">card_view:cardUseCompatPadding</span>=<span class="hljs-string">"true"</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">android.support.constraint.ConstraintLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
            <span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span>
            <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span>
            <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/txtNameSurname"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0dp"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_marginStart</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:layout_marginTop</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:layout_marginEnd</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:text</span>=<span class="hljs-string">"Çağrı Aldemir"</span>
                <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#ff5c25"</span>
                <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"24sp"</span>
                <span class="hljs-attr">app:layout_constraintEnd_toStartOf</span>=<span class="hljs-string">"@+id/txtBirthTime"</span>
                <span class="hljs-attr">app:layout_constraintStart_toStartOf</span>=<span class="hljs-string">"parent"</span>
                <span class="hljs-attr">app:layout_constraintTop_toTopOf</span>=<span class="hljs-string">"parent"</span> /&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">LinearLayout</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_marginBottom</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>
                <span class="hljs-attr">app:layout_constraintBottom_toBottomOf</span>=<span class="hljs-string">"parent"</span>
                <span class="hljs-attr">app:layout_constraintStart_toStartOf</span>=<span class="hljs-string">"@+id/txtNameSurname"</span>
                <span class="hljs-attr">app:layout_constraintTop_toBottomOf</span>=<span class="hljs-string">"@+id/txtNameSurname"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"Doğum Tarihi:"</span> /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                    <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/txtDateOfBirth"</span>
                    <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                    <span class="hljs-attr">android:layout_marginLeft</span>=<span class="hljs-string">"8dp"</span>
                    <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span>
                    <span class="hljs-attr">android:text</span>=<span class="hljs-string">"31.08.1995"</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">TextView</span>
                <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/txtBirthTime"</span>
                <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span>
                <span class="hljs-attr">android:layout_marginTop</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:layout_marginEnd</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:layout_marginBottom</span>=<span class="hljs-string">"8dp"</span>
                <span class="hljs-attr">android:text</span>=<span class="hljs-string">"14:45"</span>
                <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#05dcad"</span>
                <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"36sp"</span>
                <span class="hljs-attr">app:layout_constraintBottom_toBottomOf</span>=<span class="hljs-string">"parent"</span>
                <span class="hljs-attr">app:layout_constraintEnd_toEndOf</span>=<span class="hljs-string">"parent"</span>
                <span class="hljs-attr">app:layout_constraintTop_toTopOf</span>=<span class="hljs-string">"parent"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">android.support.constraint.ConstraintLayout</span>&gt;</span>

    <span class="hljs-tag">&lt;/<span class="hljs-name">android.support.v7.widget.CardView</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">LinearLayout</span>&gt;</span>
</code></pre>
<p>Dizaynları bitirdiğimize göre artık kodlara geçebiliriz.</p>
<p>Öncelikle bir model classı oluşturalım ve içerisine değişken olarak bir string ve bir date ekleyelim. Bu değişkenler üzerinde tutacağımız örnek verileri CardView’ler içerisinde göstereceğimiz için bu kısım önemli. Ancak elbette gerçek bir projede bu tür veriler veritabanı ya da herhangi bir API tarafından sağlanacaktır.</p>
<p>Aşağıda oluşturduğum örnek model classını görebilirsiniz.</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> tr.com.cagrialdemir.recyclerviewexampleapp;

<span class="hljs-keyword">import</span> java.util.Date;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ModelExample</span> </span>{
    <span class="hljs-keyword">private</span> String nameSurname;
    <span class="hljs-keyword">private</span> Date dateOfBirth;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">ModelExample</span><span class="hljs-params">(String nameSurname, Date dateOfBirth)</span> </span>{
        <span class="hljs-keyword">this</span>.nameSurname = nameSurname;
        <span class="hljs-keyword">this</span>.dateOfBirth = dateOfBirth;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getNameSurname</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> nameSurname;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setNameSurname</span><span class="hljs-params">(String nameSurname)</span> </span>{
        <span class="hljs-keyword">this</span>.nameSurname = nameSurname;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> Date <span class="hljs-title">getDateOfBirth</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> dateOfBirth;
    }

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setDateOfBirth</span><span class="hljs-params">(Date dateOfBirth)</span> </span>{
        <span class="hljs-keyword">this</span>.dateOfBirth = dateOfBirth;
    }

}
</code></pre>
<p>Şimdi ise tüm bu işlemlerin gerçekleşeceği asıl classa geldik. Bu class RecyclerView adaptöründen extend edilmiş bir class ve haliyle override edilecek birtakım metodları var.</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> tr.com.cagrialdemir.recyclerviewexampleapp;

<span class="hljs-keyword">import</span> android.content.Context;
<span class="hljs-keyword">import</span> android.support.annotation.NonNull;
<span class="hljs-keyword">import</span> android.support.v7.widget.RecyclerView;
<span class="hljs-keyword">import</span> android.view.LayoutInflater;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.view.ViewGroup;
<span class="hljs-keyword">import</span> android.widget.TextView;

<span class="hljs-keyword">import</span> java.text.SimpleDateFormat;
<span class="hljs-keyword">import</span> java.util.ArrayList;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RecyclerViewAdapter</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">RecyclerView</span>.<span class="hljs-title">Adapter</span>&lt;<span class="hljs-title">RecyclerViewAdapter</span>.<span class="hljs-title">MyViewHolder</span>&gt; </span>{

    <span class="hljs-keyword">private</span> ArrayList&lt;ModelExample&gt; mModelExamples;
    <span class="hljs-keyword">private</span> LayoutInflater inflater;
    Context mContext;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">RecyclerViewAdapter</span><span class="hljs-params">(Context context, ArrayList&lt;ModelExample&gt; mModelExamples)</span> </span>{
        inflater = LayoutInflater.from(context);
        <span class="hljs-keyword">this</span>.mModelExamples = mModelExamples;
        <span class="hljs-keyword">this</span>.mContext = context;
    }


    <span class="hljs-meta">@NonNull</span>
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> MyViewHolder <span class="hljs-title">onCreateViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> ViewGroup parent, <span class="hljs-keyword">int</span> viewType)</span> </span>{
        View view = inflater.inflate(R.layout.recycler_view_list_item, parent, <span class="hljs-keyword">false</span>);
        MyViewHolder holder = <span class="hljs-keyword">new</span> MyViewHolder(view);
        <span class="hljs-keyword">return</span> holder;
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onBindViewHolder</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> MyViewHolder holder, <span class="hljs-keyword">int</span> position)</span> </span>{
        ModelExample selectedModelExample = mModelExamples.get(position);
        holder.setData(selectedModelExample, position);

    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getItemCount</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> mModelExamples.size();
    }


    <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyViewHolder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">RecyclerView</span>.<span class="hljs-title">ViewHolder</span> </span>{

        <span class="hljs-keyword">private</span> TextView txtNameSurname;
        <span class="hljs-keyword">private</span> TextView txtDateOfBirth;
        <span class="hljs-keyword">private</span> TextView txtBirthTime;

        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">MyViewHolder</span><span class="hljs-params">(View itemView)</span> </span>{
            <span class="hljs-keyword">super</span>(itemView);


            txtNameSurname = itemView.findViewById(R.id.txtNameSurname);
            txtDateOfBirth = itemView.findViewById(R.id.txtDateOfBirth);
            txtBirthTime = itemView.findViewById(R.id.txtBirthTime);
        }

        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setData</span><span class="hljs-params">(ModelExample selectedModelExample, <span class="hljs-keyword">int</span> position)</span> </span>{

            String nameSurname = selectedModelExample.getNameSurname();
            String dateOfBirth = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"dd.MM.yyyy"</span>).format(selectedModelExample.getDateOfBirth());
            String birthTime = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"HH:mm"</span>).format(selectedModelExample.getDateOfBirth());

            txtNameSurname.setText(nameSurname);
            txtDateOfBirth.setText(dateOfBirth);
            txtBirthTime.setText(birthTime);

        }
    }
}
</code></pre>
<p>Yukarıdaki classa baktığımızda, öncelikle model classımızın arrayini tutması için bir array list, yapının doğru çalışması için bir gereksinim olan LayoutInflater objesi ve ihtiyaç halinde kullanmak üzere (Toast mesajları göstermek vb.) bir context objesi oluşturuyoruz. Constructor bölümünde ise bu objeleri gelen parametrelerin pointerlarına eşitliyoruz.</p>
<p>onCreateViewHolder bölümünde ise RecyclerView içerisinde gösterilecek CardView dizaynını gösteriyoruz ve holderimizi return ediyoruz.</p>
<p>onBindViewHolder bölümünde her bir satır için yapılması gereken işlemleri gerçekleştiriyoruz. Bu işlemler için ise classın aşağısında yazdığımız MyViewHolder isimli subclassı kullanıyoruz.</p>
<p>getItemCount metodu ise yukarıda bahsettiğim bind metodunun kaç kez çalışması gerektiğini değer olarak döndürüyor. Elbette biz de oluşturduğumuz ArrayList’in uzunluğunu döndürüyoruz.</p>
<p>Subclass içerisine geldiğimizde ise görüldüğü gibi her şeyden önce CardView içerisinde oluşturduğumuz viewleri tanımlıyoruz ve daha sonra layout içerisindeki viewlerle match ediyoruz.</p>
<p>Son olarak setData metodunda ise CardView içerisinde yapmamız gereken işlemleri gerçekleştiriyoruz, ben bu örnekte oluşturduğum model classının içerisinde tutulan verileri viewlerin içerisine doldurdum.</p>
<p>Her şey hazır olduğuna göre artık MainActivity içerisine geçip tüm yazdıklarımızı birleştirebiliriz. Ancak ondan önce stackoverflow üzerinden bulduğum ve işime oldukça çok yarayan bir classı daha projemize eklemeliyiz. Bu class aracılığıyla herhangi bir CardView’e tıklandığında bu click triggerini yakalayabiliyoruz ve ona göre istediğimiz işlemleri gerçekleştirebiliyoruz. (Aşağıdaki classı projenize direkt olarak import edebilirsiniz.)</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> tr.com.cagrialdemir.recyclerviewexampleapp;

<span class="hljs-keyword">import</span> android.content.Context;
<span class="hljs-keyword">import</span> android.support.v7.widget.RecyclerView;
<span class="hljs-keyword">import</span> android.view.GestureDetector;
<span class="hljs-keyword">import</span> android.view.MotionEvent;
<span class="hljs-keyword">import</span> android.view.View;


<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RecyclerItemClickListener</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">RecyclerView</span>.<span class="hljs-title">OnItemTouchListener</span> </span>{
    <span class="hljs-keyword">private</span> OnItemClickListener mListener;

    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">OnItemClickListener</span> </span>{
        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onItemClick</span><span class="hljs-params">(View view, <span class="hljs-keyword">int</span> position)</span></span>;

        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLongItemClick</span><span class="hljs-params">(View view, <span class="hljs-keyword">int</span> position)</span></span>;
    }

    GestureDetector mGestureDetector;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">RecyclerItemClickListener</span><span class="hljs-params">(Context context, <span class="hljs-keyword">final</span> RecyclerView recyclerView, OnItemClickListener listener)</span> </span>{
        mListener = listener;
        mGestureDetector = <span class="hljs-keyword">new</span> GestureDetector(context, <span class="hljs-keyword">new</span> GestureDetector.SimpleOnGestureListener() {
            <span class="hljs-meta">@Override</span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onSingleTapUp</span><span class="hljs-params">(MotionEvent e)</span> </span>{
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
            }

            <span class="hljs-meta">@Override</span>
            <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLongPress</span><span class="hljs-params">(MotionEvent e)</span> </span>{
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                <span class="hljs-keyword">if</span> (child != <span class="hljs-keyword">null</span> &amp;&amp; mListener != <span class="hljs-keyword">null</span>) {
                    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
                }
            }
        });
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onInterceptTouchEvent</span><span class="hljs-params">(RecyclerView view, MotionEvent e)</span> </span>{
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        <span class="hljs-keyword">if</span> (childView != <span class="hljs-keyword">null</span> &amp;&amp; mListener != <span class="hljs-keyword">null</span> &amp;&amp; mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        }
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTouchEvent</span><span class="hljs-params">(RecyclerView view, MotionEvent motionEvent)</span> </span>{
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onRequestDisallowInterceptTouchEvent</span><span class="hljs-params">(<span class="hljs-keyword">boolean</span> disallowIntercept)</span> </span>{
    }
}
</code></pre>
<p>Sona yaklaştık, artık MainActivity içerisine bakalım isterseniz;</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> tr.com.cagrialdemir.recyclerviewexampleapp;

<span class="hljs-keyword">import</span> android.os.Bundle;
<span class="hljs-keyword">import</span> android.support.v7.app.AppCompatActivity;
<span class="hljs-keyword">import</span> android.support.v7.widget.LinearLayoutManager;
<span class="hljs-keyword">import</span> android.support.v7.widget.RecyclerView;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.widget.Toast;

<span class="hljs-keyword">import</span> java.text.SimpleDateFormat;
<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.Date;
<span class="hljs-keyword">import</span> java.util.GregorianCalendar;
<span class="hljs-keyword">import</span> java.util.Locale;
<span class="hljs-keyword">import</span> java.util.Random;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> </span>{

    <span class="hljs-keyword">private</span> RecyclerView exampleRecyclerView;
    <span class="hljs-keyword">private</span> RecyclerViewAdapter mRecyclerViewAdapter;
    <span class="hljs-keyword">private</span> ArrayList&lt;ModelExample&gt; mModelExamples;

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> </span>{
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        exampleRecyclerView = findViewById(R.id.example_recyler_view);

        mModelExamples = <span class="hljs-keyword">new</span> ArrayList&lt;&gt;();
        addExampleDatas();

        mRecyclerViewAdapter = <span class="hljs-keyword">new</span> RecyclerViewAdapter(MainActivity.<span class="hljs-keyword">this</span>, mModelExamples);

        exampleRecyclerView.setAdapter(mRecyclerViewAdapter);

        LinearLayoutManager linearLayoutManager = <span class="hljs-keyword">new</span> LinearLayoutManager(<span class="hljs-keyword">this</span>);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        exampleRecyclerView.setLayoutManager(linearLayoutManager);

        exampleRecyclerView.addOnItemTouchListener(
                <span class="hljs-keyword">new</span> RecyclerItemClickListener(<span class="hljs-keyword">this</span>, exampleRecyclerView, <span class="hljs-keyword">new</span> RecyclerItemClickListener.OnItemClickListener() {
                    <span class="hljs-meta">@Override</span>
                    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onItemClick</span><span class="hljs-params">(View view, <span class="hljs-keyword">int</span> position)</span> </span>{
                        Toast.makeText(MainActivity.<span class="hljs-keyword">this</span>, mModelExamples.get(position).getNameSurname(), Toast.LENGTH_LONG).show();
                    }

                    <span class="hljs-meta">@Override</span>
                    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLongItemClick</span><span class="hljs-params">(View view, <span class="hljs-keyword">int</span> position)</span> </span>{

                    }
                })
        );
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">addExampleDatas</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">30</span>; i++) {
            mModelExamples.add(<span class="hljs-keyword">new</span> ModelExample(getRandomNameSurname(), createRandomDate()));
        }
    }

    <span class="hljs-comment">//region Random NameSurname and DateTime Creator Methods</span>

    <span class="hljs-function"><span class="hljs-keyword">private</span> String <span class="hljs-title">getRandomNameSurname</span><span class="hljs-params">()</span> </span>{

        String[] nameList = {
                <span class="hljs-string">"Rachelle Midkiff"</span>,
                <span class="hljs-string">"Rufus Morneau"</span>,
                <span class="hljs-string">"Alaine Asay"</span>,
                <span class="hljs-string">"Brook Whitwell"</span>,
                <span class="hljs-string">"Ellamae Steen"</span>,
                <span class="hljs-string">"Phil Layfield"</span>,
                <span class="hljs-string">"Bobbi Charbonneau"</span>,
                <span class="hljs-string">"Ernest Gameros"</span>,
                <span class="hljs-string">"Lyn Lyda"</span>,
                <span class="hljs-string">"Candy Sorrell"</span>,
                <span class="hljs-string">"Kermit Moseley"</span>,
                <span class="hljs-string">"Vonnie Miles"</span>,
                <span class="hljs-string">"Ellis Kraker"</span>,
                <span class="hljs-string">"James Taing"</span>,
                <span class="hljs-string">"Shea Ancona"</span>,
                <span class="hljs-string">"Leonie Rushing"</span>,
                <span class="hljs-string">"Sharonda Corrales"</span>,
                <span class="hljs-string">"Luciana Mcmasters"</span>,
                <span class="hljs-string">"Francene Dehoyos"</span>,
                <span class="hljs-string">"Stephen Izzard"</span>,
                <span class="hljs-string">"Lesli Rohman"</span>,
                <span class="hljs-string">"Ja Edson"</span>,
                <span class="hljs-string">"Gale Stokley"</span>,
                <span class="hljs-string">"Sally Rafter"</span>,
                <span class="hljs-string">"Denis Pettigrew"</span>,
                <span class="hljs-string">"Kum Hoffman"</span>,
                <span class="hljs-string">"Maura Danforth"</span>,
                <span class="hljs-string">"Terrance Stroupe"</span>,
                <span class="hljs-string">"Nelida Frieden"</span>,
                <span class="hljs-string">"Allegra Mcgowen"</span>
        };

        <span class="hljs-keyword">return</span> nameList[<span class="hljs-keyword">new</span> Random().nextInt(nameList.length)];

    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> Date <span class="hljs-title">createRandomDate</span><span class="hljs-params">()</span> </span>{
        SimpleDateFormat dfDateTime = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"yyyy-MM-dd hh:mm:ss"</span>, Locale.getDefault());
        <span class="hljs-keyword">int</span> year = randBetween(<span class="hljs-number">1900</span>, <span class="hljs-number">2013</span>);<span class="hljs-comment">// Here you can set Range of years you need</span>
        <span class="hljs-keyword">int</span> month = randBetween(<span class="hljs-number">0</span>, <span class="hljs-number">11</span>);
        <span class="hljs-keyword">int</span> hour = randBetween(<span class="hljs-number">9</span>, <span class="hljs-number">22</span>); <span class="hljs-comment">//Hours will be displayed in between 9 to 22</span>
        <span class="hljs-keyword">int</span> min = randBetween(<span class="hljs-number">0</span>, <span class="hljs-number">59</span>);
        <span class="hljs-keyword">int</span> sec = randBetween(<span class="hljs-number">0</span>, <span class="hljs-number">59</span>);

        GregorianCalendar gc = <span class="hljs-keyword">new</span> GregorianCalendar(year, month, <span class="hljs-number">1</span>);
        <span class="hljs-keyword">int</span> day = randBetween(<span class="hljs-number">1</span>, gc.getActualMaximum(gc.DAY_OF_MONTH));
        gc.set(year, month, day, hour, min, sec);
        <span class="hljs-keyword">return</span> gc.getTime();
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">randBetween</span><span class="hljs-params">(<span class="hljs-keyword">int</span> start, <span class="hljs-keyword">int</span> end)</span> </span>{
        <span class="hljs-keyword">return</span> start + (<span class="hljs-keyword">int</span>) Math.round(Math.random() * (end - start));
    }

    <span class="hljs-comment">//endregion</span>
}
</code></pre>
<p>Activity içerisinde öncelikle bir RecyclerView objesi, bir RecyclerViewAdapter objesi (yukarıda yazdığımız class) ve dataları tutacağımız, aynı zamanda adapter içerisine pointerini göndereceğimiz ArrayList objesi oluşturuyoruz.</p>
<p>Daha sonra RecyclerView objesini ve ArrayList’i initialize ediyoruz.</p>
<p>addExampleDatas metodunda oluşturduğumuz örnek verileri ArrayList içerisine ekliyoruz. (Bu metod konuyla ilgili olmadığı için ayrıntılı olarak anlatmayacağım, zaten hazır olarak internet üzerinden bulup kendime göre düzenledim diyebilirim. Ancak kodlara bakarak yapılan işlemi kolayca anlayabilirsiniz. Ayrıca bu metod, içerisinde üç farklı metod daha kullanmakta ancak dediğim gibi bakarak anlayabileceğiniz basit yapılar olduğu için üzerinde durmuyorum.)</p>
<p>RecyclerView adapterimizi initialize ediyoruz ve parametre olarak bulunduğumuz contexti ve oluşturduğumuz ArrayList’i gönderiyoruz. Sonrasında ise RecyclerViewin adapterini oluşturduğumuz adapter olarak set ediyoruz. Bu satırlar birlikte viewi ve adapteri birbirine bağlamış olduk.</p>
<p>Sonrasında gelen 3 satırlık kod bloğu aracılığı ile de viewin layout yapısını set ediyoruz.</p>
<p>Ve son olarak da RecyclerView için click listenerlerimizi oluşturuyoruz. Bu listenerlardan birisi normal click, diğeri ise long click durumunda tetikleniyor. Ben ise normal click bölümünde tıkladığım CardView’in içerisinde bulunan nameSurname değişkenini toast mesajı olarak ekrana yazdırdım.</p>
<p>Bu noktaya kadar her şeyi eksiksiz bir şekilde yaptıysanız projenize RecyclerView yapısını import ettiniz demektir. Uygulama ise şu şekilde görünecektir.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1672067669929/0b407a0a-471a-4810-ba15-8628de70d435.png" alt class="image--center mx-auto" /></p>
<p>Ancak eğer sorunlarla karşılaştıysanız, hemen aşağıdan proje dosyalarını indirip inceleyebilirsiniz.</p>
<p>Anlatacaklarım bu kadar, umarım yeterli düzeyde anlatabilmişimdir ve işinize yarayacaktır.</p>
<p>Bir sonraki içerikte görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[Android’de Splash Screen’i Doğru Kullanmak]]></title><description><![CDATA[Merhaba.
Bugün Android’de kullanılabilecek en doğru splash screen yöntemini göreceğiz.
Biliyorum ki çoğu kişi (bu gruba ben de dahildim) splash screen tasarlarken en kolay ve bilinen bir yol olarak projesine bir de splash screen activitysi ekler ve l...]]></description><link>https://aldemir.dev/androidde-splash-screeni-dogru-kullanmak</link><guid isPermaLink="true">https://aldemir.dev/androidde-splash-screeni-dogru-kullanmak</guid><category><![CDATA[Android]]></category><category><![CDATA[Java]]></category><category><![CDATA[Splash Screens]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Sun, 10 Feb 2019 17:50:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671990543737/462c8c2d-2e9f-45a3-afa7-a2d9aeec6432.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Merhaba.</p>
<p>Bugün Android’de kullanılabilecek en doğru splash screen yöntemini göreceğiz.</p>
<p>Biliyorum ki çoğu kişi (bu gruba ben de dahildim) splash screen tasarlarken en kolay ve bilinen bir yol olarak projesine bir de splash screen activitysi ekler ve layout kısmını isteğine göre dizayn eder. Daha sonra da splash screen activitysi içerisinden bi thread başlatıp belirli bir süre sonra ana activitysini açar. Ancak bu yapı splash screen kullanımına en ters yapıdır. Çünkü splash screen kullanmanın amacı, main activity içerisinde birtakım işlemler yapılırken ön tarafta kullanıcıya logonuzu göstermek ve kullanıcıyı bu işlemler bitene kadar bekletmektir. Ancak bahsettiğimiz bu yapıda kullanıcı önce sizin logonuzu görecek, daha sonra ise Android işletim sistemi sizin activitynizin onCreate metodunu ararken -ki bu çok nadir de olsa 500 milisaniyeyi bulabiliyor- beyaz bir ekranla karşılaşacaktır ve bir de onu bekleyecektir. Halbuki doğru yol, sadece sadece acitivity bulma süresi kadar splash screenin görünmesi ve daha sonra main activity’e geçişin sağlanmasıdır. Zira eminim ki kimse bir uygulamayı açılış logosunu görmek için kullanmıyordur. Bu nedenle mümkün olan en kısa zamanda kullanıcıya uygulamaya erişim imkanı sağlamak en doğrusu olacaktır.</p>
<p>Bu teorik ve hiçbir işe yaramayan bilgilerden sonra dilerseniz kodlara geçelim.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"AppTheme.Launcher"</span>&gt;</span><span class="xml">
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowBackground"</span>&gt;</span>@drawable/launch_screen<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowNoTitle"</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowActionBar"</span>&gt;</span>false<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowFullscreen"</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowContentOverlay"</span>&gt;</span>@null<span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
</code></pre>
<p>Öncelikle projeniz içerisindeki styles.xml dosyasının içinde yukarıda göründüğü gibi base temanızdan extend edilmiş yeni bir tema oluşturmanız gerekiyor. Bu tema sayesinde herhangi bir layout ya da activitye ihtiyaç duymadan splash screen oluşturabileceğiz. Dilerseniz tema içerisindeki ayarları kendinize göre de özelleştirebilirsiniz.</p>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">layer-list</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attr">android:opacity</span>=<span class="hljs-string">"opaque"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">android:drawable</span>=<span class="hljs-string">"@android:color/white"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">item</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">bitmap</span>
            <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span>
            <span class="hljs-attr">android:src</span>=<span class="hljs-string">"@drawable/splash_logo"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">layer-list</span>&gt;</span>
</code></pre>
<p>Daha sonra splash screenin background rengini ve logonuzu eklemek için drawable klasörü içerisinde yukarıdaki gibi bir launch_screen.xml dosyası oluşturuyoruz. Arkaplan rengini <em>android:drawable</em> satırında, logoyu ise <em>android:src</em> satırında değiştirebilirsiniz. Buradaki önemli faktör logonuzun 144dp boyutunda oluşturulmuş olması. Bu değerden yukarı çıktıkça logonuz gereksiz yere büyür, aşağı indikçe ise görünemeyecek kadar küçülür. Logonuzu doğru şekilde boyutlandırmanız için <a target="_blank" href="https://romannurik.github.io/AndroidAssetStudio/icons-generic.html">buradaki</a> online araçtan yardım alabilirsiniz, gerçekten çok kullanışlı bir web sitesi.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">activity</span>
    <span class="hljs-attr">android:name</span>=<span class="hljs-string">".MainActivity"</span>
    <span class="hljs-attr">android:theme</span>=<span class="hljs-string">"@style/AppTheme.Launcher"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">intent-filter</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">action</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.intent.action.MAIN"</span> /&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">category</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.intent.category.LAUNCHER"</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">intent-filter</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">activity</span>&gt;</span>
</code></pre>
<p>Evet, temamızı ve splash ekranımızı oluşturduk. Şimdi ise yukarıdaki kodda görüldüğü gibi AndroidManifest dosyası içerisinde splash screenden hemen sonra gidilecek activity içerisine</p>
<pre><code class="lang-plaintext">android:theme="@style/AppTheme.Launcher"
</code></pre>
<p>satırını eklememiz gerekiyor ki bu sayede splash screen temamız aktif hale gelsin.</p>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> </span>{

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> </span>{
        setTheme(R.style.AppTheme);
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
</code></pre>
<p>Son olarak da splash screenden sonra gidilecek activity içerisine yukarıda da bulunan</p>
<pre><code class="lang-java">setTheme(R.style.AppTheme);
</code></pre>
<p>kod satırını eklememiz gerekiyor. Bu kod satırını onCreate metodunun superinden önce çağırmamız gerektiğini de unutmayalım. Bu satır sayesinde Android işletim sisteminin activitynizle ilgili kendine ait işlemleri bittikten hemen sonra temanız eski haline bürünecek. Bu satırı eklemediğinizde ise main activity arkaplanınız splash screeninizle aynı halde kalacaktır.</p>
<p>Aslında anlatacaklarım bu kadar. Buraya kadar olan kodları projenize eklediğinizde splash screeniniz doğru şekilde çalışmaya başlayacaktır. Ancak “Bu kadar kısa süre bana yetmez, ben logom daha uzun süre görünsün istiyorum yeaa” diyorsanız hemen aşağıdan devam edebilirsiniz.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">application</span>
    <span class="hljs-attr">android:name</span>=<span class="hljs-string">".MyApp"</span>
    <span class="hljs-attr">android:allowBackup</span>=<span class="hljs-string">"true"</span>
    <span class="hljs-attr">android:icon</span>=<span class="hljs-string">"@mipmap/ic_launcher"</span>
    <span class="hljs-attr">android:label</span>=<span class="hljs-string">"@string/app_name"</span>
    <span class="hljs-attr">android:roundIcon</span>=<span class="hljs-string">"@mipmap/ic_launcher_round"</span>
    <span class="hljs-attr">android:supportsRtl</span>=<span class="hljs-string">"true"</span>
    <span class="hljs-attr">android:theme</span>=<span class="hljs-string">"@style/AppTheme"</span>&gt;</span>
</code></pre>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> tr.com.cagrialdemir.splashcreenexample;

<span class="hljs-keyword">import</span> android.app.Application;
<span class="hljs-keyword">import</span> android.os.SystemClock;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyApp</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Application</span> </span>{

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">super</span>.onCreate();
        SystemClock.sleep(<span class="hljs-number">2500</span>);
    }
}
</code></pre>
<p>Yukarıdaki kodlarda da göründüğü gibi projeniz içerisinde MyApp isminde bir class oluşturup bu classı Application classından extend ederseniz ve hemen üstünde göründüğü üzere AndroidManifest dosyanızda &lt;application&gt; tagı içerisine</p>
<pre><code class="lang-java">android:name=<span class="hljs-string">".MyApp"</span>
</code></pre>
<p>satırını eklerseniz artık elinizde bir base classınız bulunuyor demektir. Bu classın içinde override edilmiş olan onCreate metodu içerisinde de sleep metodunu çağırarak istediğiniz süre boyunca splash screeninizin görünmesini sağlayabilirsiniz. Ancak unutmayın, burada geçen süre boyunca uygulamanız bir arpa boyu kadar bile yol almayacaktır.</p>
<p>Anlatacaklarım bu sefer gerçekten bu kadar, bu başlık hakkında neredeyse hiç Türkçe kaynak bulunmadığını gördüğüm için bu yazıyı yazma ihtiyacı duydum. Umarım faydalı olabilmiştir, görüşmek üzere.</p>
]]></content:encoded></item><item><title><![CDATA[FPS Nedir? | Fotoğrafçılık ve Sinema Terimleri Serisi]]></title><description><![CDATA[Merhaba.Uzun zamandır blog yazısı yazamadığım için yine uzun zamandır üzerinde araştırma yaptığım bir konu hakkında yazı serisi yazmak istedim ki aradan geçen zamanı anlamlı hale getireyim.
Bu serinin konusu başlıktan da anlaşılabileceği üzere sinema...]]></description><link>https://aldemir.dev/fps-nedir</link><guid isPermaLink="true">https://aldemir.dev/fps-nedir</guid><category><![CDATA[FPS]]></category><category><![CDATA[Refresh Rate]]></category><category><![CDATA[Sinema]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Mon, 04 Feb 2019 15:44:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671983317571/714403b8-abf4-44ce-8307-303c892a6762.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Merhaba.<br />Uzun zamandır blog yazısı yazamadığım için yine uzun zamandır üzerinde araştırma yaptığım bir konu hakkında yazı serisi yazmak istedim ki aradan geçen zamanı anlamlı hale getireyim.</p>
<p>Bu serinin konusu başlıktan da anlaşılabileceği üzere sinema terimleri hakkında olacak ve her bir başlığı derinlemesine anlatmaya özen göstereceğim. Zira yaptığım araştırmalarda gördüğüm kadarıyla bu tür bilgiler hep parça parça yayınlanmış ve ne yazık ki bir konu bütünlüğü yok. Her neyse lafı fazla uzatmadan başlayalım...</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671982861301/c1f0d20b-8a98-4891-bdfd-97f11f34cf7a.gif" alt class="image--center mx-auto" /></p>
<p>Öncelikle FPS’in (Frames Per Second) Türkçe karşılığı saniye başına düşen kare sayısıdır. Yani herhangi bir hareketli görüntünün saniye başına gösterdiği kare sayısı bize o videonun FPS’ini vermektedir.</p>
<p>Tarihine bakacak olursak; sinema ilk çıktığında filmlerde ses yoktu ve kas gücüyle döndürülebilen bir makine aracılığıyla art arda görüntüler oynatılıyordu. Böylece hareketli bir görüntü meydana geliyordu. Ancak sinemaya sesin eklenmesi konusu ortaya atıldıktan sonra bu sistemin aynı şekilde ilerleyemeyeceğine kanaat getirildi zira cihaz kas gücüyle çalıştırıldığı için FPS de sürekli değişiklik gösteriyordu ve bundan dolayı da seste kayma meydana gelecekti. Bunun üzerine yapılan çalışmalardan sonra ise en ideal FPS değerinin 24 olduğuna kanaat getirildi çünkü insan gözünü yormayan minimum değer buydu. Elbette daha yüksek değerler de seçilebilirdi ancak bu daha çok film harcanmasına neden olacaktı ve maliyet sorunu baş gösterecekti.</p>
<p>Sinemanın ve ideal FPS değerinin bulunuşunun tarihine de göz gezdirdikten sonra gelelim çok karıştırılan bir konu olan çekim ve gösterim hızlarının ne olduğuna. Çekim hızı dediğimiz şey video kaydı esnasında her bir saniyede çektiğimiz kare sayısıdır aslında. Gösterim hızı ise çektiğimiz bu kareleri saniyede kaçar kaçar harcayacağımızı gösterir. Yanlış bilinen bir konu üzerinden vereceğim bir örnekle bunu daha iyi anlayabiliriz. Örneğin saniyede 100 kare çektiğimizi düşünelim. Gösterim esnasında ise saniyede 25 kare göstereceğimizi varsayalım. Bu durumda çektiğimiz her bir saniye için gösterim anında 4 saniye vakit harcayacağız demektir çünkü elimizdeki 100 kareyi her saniye 25’er kare harcayarak kullandık. Bahsettiğim yanlış bilgi de buradan gelmekte aslında, çünkü telefonlarımızda bulunan yavaş çekim özelliği aslında daha hızlı çekerek görüntüyü elde etmekte ve adının da “hızlı çekim” olması gerekmekte bana kalırsa.</p>
<p>Öte yandan başka bir konuya gelecek olursak ideal görüntü için 24 kare olduğundan bahsettim ancak günümüz sinemalarında genelde bu değerin iki katı ile oynatılır filmler. Çünkü eğer 24 kare olarak gösterilseydi mekanizma kareleri art arda getirdiği için ve her iki kare arasında bir geçiş süresi bulunduğundan o anlarda siyah ekranlar (flicker) görürdük. Bunu engellemek için de her bir kare iki kez çaktırılır ve aradaki siyahlıklar engellenir.</p>
<p>Eveet, gelelim şimdi de en çok karıştırılan konuya, refresh rate ve FPS arasındaki fark nedir? Refresh rate, yani tazeleme hızı aslında ekranın bir saniye içerisinde kaç kez yeniden boyanabildiğini gösteren değerdir. Eski CRT televizyonlarda bu sistem elektronun bir köşeden fırlatılması ve hızlıca ekranı boyamasıyla yani görüntüyü çizmesiyle gerçekleştirilirdi. Günümüzde kullanılan LCD ekranlarda ise ekran içerisindeki floresan içinde bulunan gazlar aracılığıyla kontrollü ve küçük patlamalar gerçekleşiyor ve bu sayede görüntü çiziliyor. FPS ise az önce de bahsettiğim gibi saniyede çektiğimiz kare sayısıdır.<br />Bu durumda refresh rate/FPS ise bize bir kareyi kaç kez çaktırdığımızın değerini verir. Ancak her ne kadar kareleri ikişer kez çaktırsak da yapı sinemeda olduğu gibi olmadığı için görüntünün çizilmesinin sonlarına doğru başı kaybolduğundan yine siyah kıpraşmalar görüneceği için buna da şöyle bir çözüm üretilmiş. Her bir kare, yatay olarak belirli bir sayıda alana bölünüyor ve ilk çaktırmada tek sayıdaki alanlar çizilirken ikinci çaktırmada çift sayıdaki alanlar çiziliyor. Böylece herhangi bir kıpraşma oluşmadan net bir şekilde görüntü çizilebiliyor, daha doğrusu insan beyni onu öyle kabul ediyor.</p>
<p>Biraz FPS başlığının dışına çıkacağız ancak refresh rate demişken refresh rate standartlarından da bahsetmek istiyorum. Televizyonlar ilk çıktıklarında, elektrikle çalışan cihazlar oldukları için ülkelerin elektrik sistemlerine uygun olarak dizayn edilmelilerdi. Türkiye ve diğer Avrupa ülkeleri 50hz’lik elektrik standardını kullanırken Amerika ve diğer bazı ülkeler ise 60hz’lik elektrik standardını kullanmaktaydılar. Bunun sonucunda da 50hz kullanan ülkeler 25 FPS, 60hz kullanan ülkeler ise 30 FPS ile görüntü sunmak istediler.<br />–<em>Televizyon ayarlarında sürekli görüp anlam veremediğimiz PAL ve NTSC terimleri de buradan gelmektedir. Günümüzde Avrupa ülkeleri PAL (Phase Alternating Line), Amerika ve diğer bazı ülkeler ise NTSC (National Television System Committee) sistemini kullanmaktalar.</em>–<br />Tabii televizyonun çıkmasıyla birlikte ortaya çıkan bu sorun işleri tamamen karıştırdı. Çünkü ortaya 3 farklı FPS değeri çıkıyordu;</p>
<ul>
<li><p>Sinema için <strong>24 FPS</strong></p>
</li>
<li><p>50hz kullanan ülkeler için <strong>25 FPS</strong></p>
</li>
<li><p>60hz kullanan ülkeler için <strong>30 FPS</strong></p>
</li>
</ul>
<p>Bu sorunu çözmek ve sinemaya çıkan filmlerin televizyonlarda da oynatılması gerektiği için ise bu değerlerin birbirine dönüştürülebilmesi gerekliydi. Avrupa ülkeleri için bu sorun olmadı zira saniyede 24 kare çekilen filmler saniyede 25 kare gösterilerek oynatılabiliyordu. Filmde anlaşılmayacak derecede bir hızlanma oluyordu ancak bu da bir sorun teşkil etmiyordu. Asıl sorun ise 24 kare çekilen bir filmin 30 kareye uyarlanması idi.<br />Buna çözüm olarak ise 3:2 pulldown sistemi geliştirildi. Bu sistemi bir örnekle açıklayacak olursak; 24 karelik bir filmin iki kez çaktırılarak oynatıldığını ve toplamda 48 hz’lik bir görüntü oluştuğunu varsayalım. Bu sistemde her bir kare, iki kez görüntüleniyor demektir. NTSC sistemine uyarlanırken bir kare iki kez gösterilirken hemen ardından gelen diğer kare 3 kez gösteriliyor. Yani matematiksel olarak düşünecek olursak 24 karenin 12 tanesi iki kez gösteriliyor ve 24 hz’lik görüntü oradan geliyor, geri kalan 12 kare ise üçer kez gösteriliyor ve 36 hz’lik görüntü de oradan geliyor ve toplamda 60 hz’lik görüntü elde edilmiş oluyor.</p>
<p>Aşağıda da 3:2 pulldown yöntemini görsel olarak görebilirsiniz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671982940902/840870bc-5a4f-4243-964b-75e2599af5f8.jpeg" alt="3:2 pulldown yöntemi" class="image--center mx-auto" /></p>
<p>FPS hakkında öğrendiklerim ve söyleyebileceklerim bu kadar.<br />Serinin ikinci yazısında görüşmek üzere...</p>
]]></content:encoded></item><item><title><![CDATA[RFID Nedir?]]></title><description><![CDATA[Günümüzde; kullanıcılar ve tüketiciler her gün RFID ile karşılaşıyorlar. Şirketler RFID teknolojisi ile anlık bilgiler üzerinden kararlar vererek tasarruflar sağlıyor ve kar elde ediyorlar. Sistemler daha zeki ve kullanışlı bir hal alıyorlar.
RFID te...]]></description><link>https://aldemir.dev/rfid-nedir</link><guid isPermaLink="true">https://aldemir.dev/rfid-nedir</guid><category><![CDATA[RFID Reader]]></category><category><![CDATA[RFID Tag]]></category><category><![CDATA[rfid]]></category><dc:creator><![CDATA[Çağrı Aldemir]]></dc:creator><pubDate>Fri, 18 Dec 2015 16:34:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671982679329/7929cd09-ea79-4279-8c91-ca980abf7149.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Günümüzde; kullanıcılar ve tüketiciler her gün RFID ile karşılaşıyorlar. Şirketler RFID teknolojisi ile anlık bilgiler üzerinden kararlar vererek tasarruflar sağlıyor ve kar elde ediyorlar. Sistemler daha zeki ve kullanışlı bir hal alıyorlar.</p>
<p>RFID teknolojisinde temel olarak RFID etiketi ve RFID okuyucusu en kritik bileşenlerdir. Bunlara ayrıca RFID yazıcısı, RFID anteni ve sistemin kullanacağı yazılımı ekleyebiliriz.</p>
<p>Bir RFID etiketi çip, güç kaynağı ve antenden oluşmaktadır. Etiket, bu sayede RFID okuyucularıyla iletişim kurabilir ve veri aktarıp alabilir.</p>
<p>RFID, üzerinde mikroişlemci ile donanmış etiket taşıyan bir nesnenin, bu etikette taşıdığı kimlik yapısı ile hareketlerinin izlenebilmesine imkân veren radyo frekansları ile çalışan teknolojiye verilen addır. RFID kelimesinin açılımı İngilizce olarak “Radio Frequency Identification” Türkçe’de ise “Radyo Frekans Tanımlama” olarak geçmektedir.</p>
<p>Oldukça eski bir teknoloji olan RFID’nin kullanımı, İkinci Dünya Savaşı yıllarına kadar uzanmaktadır. Ancak etiketlerin maliyetlerinin yüksekliği ve kullanım zorluğu, RFID teknolojisinin uzunca bir süre şirketler tarafından kullanılamamasına neden olmuştur.</p>
<p>RFID etiketleri temel olarak 2’ye ayrılmaktadır. Bunlar aktif ve pasif etiketlerdir. İki etiket türü arasındaki farklar aşağıdaki tabloda kolaylıkla görülebilir.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671982129351/76fa2fd5-172b-49b5-983d-4889cf174f31.jpeg" alt class="image--center mx-auto" /></p>
<p>RFID sadece tek bir alan ya da sektörde kullanılır denemez. Bugün büyük alışveriş merkezlerinde, zincir marketlerde, hayvan takiplerinde, havayolları-kargo şirketlerinde kullanılan örnekleri vardır. Bu teknoloji ile şirketlerin avantajları, zamanla azalan insan gücü maliyeti, otomatikleştirilmiş stok kontrolü, ürün takibi ve anında ulaşılabilen envanter bilgisidir. Ayrıca RFID sayesinde şirketlerin iş süreçleri hızlanacak ve ihtiyaç duyulan gelişmiş raporlar hızlı ve doğruluğu yüksek bir şekilde oluşturulabilecektir.</p>
<p>RFID’nin etkileyeceği ve yerini alacağı yegâne teknoloji barkod teknolojisidir. Sadece dünyada değil, ülkemizde de çok yoğun bir şekilde kullanılan barkodun RFID’ye göre bazı dezavantajları vardır. Örneğin; görüş sahası, sadece veri okuma, kısıtlı alan ve okuma oranı gibi. Ancak barkod teknolojisinin şu anda RFID’ye göre çok güçlü bir özelliği bulunmakta. O da etiket başına maliyeti. Olaya bir de RFID yönünden bakılırsa, kolaylıkla görülebilir ki, maliyet dışında RFID teknolojisi barkoda göre oldukça avantajlı.</p>
<p>Çünkü RFID’de; görüş sahası kavramı yoktur.</p>
<p>Etiket üzerinde veri okuma/yazma işlemi yapılabilmektedir, uzun mesafe ve her okumada birden çok kalem mal okunması imkanı vardır. Bu sayede ambarınızda ya da deponuzdaki stoklarınızı haftalar – günler – saatler yerine dakikalar içinde sayabilirsiniz.</p>
<p>İnsan/operatör müdahalesine gerek yoktur. Bu sayede uzun dönem maliyetlerinizi tahmin edemeyeceğiniz kadar düşürebilirsiniz.</p>
<p>Daha fazla veri taşınabilir. Bu sayede sadece ürünün kodu değil, gerekiyorsa geldiği depo, son kullanma tarihi ya da istenen başka bilgiler etiketlere yüklenebilir.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1671982160700/d9d0f32f-4541-474a-9177-652ef014b6b6.jpeg" alt class="image--center mx-auto" /></p>
<p>RFID etiketlerinin ayırt edici bir diğer özelliği de çalıştıkları frekans aralıklarıdır. RFID etiketlerinin çalışma frekanslarını soldaki tabloda görebilirsiniz.</p>
<p>Günümüzde yaygın olarak kullanılan etiketlerin frekansları daha çok HF (High Frequency) aralığındadır. Bir etiketin maliyeti sadece aktif ya da pasif olmasına göre değil, çalıştığı frekansa göre de değişmektedir. Endüstride 13.56 MHz’lik etiket kullanılan projeler, şirketlere maliyetleri açısından da oldukça çekici gelmektedir. Ancak bazı uygulamalarda UHF frekans aralığı (800-900 MHz) kullanılması performans adına daha iyi sonuçlar vermektedir.</p>
<p>Herhangi bir projede hangi frekans aralığını kullanan etiketlere karar verilmesi, o projenin düşünülen ortamda gerçekleştirilip gerçekleştirilemeyeceği kararı gibi kritik kararlar tamamen tecrübe ve bilgi birikimi ile donatılmış uzman ekipler sayesinde olmalıdır. Aksi halde RFID projeleri, maliyetleri ve sonunda yaşanan koca bir başarısızlık ile birçok şirket ve kuruma faydadan çok zarar getirmiştir.</p>
<p>RFID etiketlerinin hafıza tiplerine gelecek olursak bunlar;</p>
<ul>
<li><p>Reserved Memory</p>
</li>
<li><p>EPC Memory</p>
</li>
<li><p>TID Memory</p>
</li>
<li><p>User Memory</p>
</li>
</ul>
<p>olarak dörde ayrılır.</p>
<p><strong>Reserved Memory</strong>; RFID’nin kendine ait olan bölümdür, RFID’yi kullanılmaz hale getirmek (destroy) için gereken şifreyi ve RFID erişim şifresini içinde tutar. Destroy şifresi etiketi kullanılmaz hale getirmek için, erişim şifresi ise etiketi sadece okunabilir ya da okunabilir/yazılabilir yapmak için kullanılır. Mümkün mertebe bu iki şifre dışında şifre içermemeli ve kullanıcılar buraya özel veri yazmamalıdırlar.</p>
<p><strong>EPC Memory</strong>; açılımı Electronic Power Control’dür ve adından da anlaşılacağı üzere EPC kodlarını veya elektronik üretim kodunu depolar. Bu bölüm minimum 96 bitlik bir yer kaplar. Aynı zamanda bazı etiketler kullanıcı hafızasından EPC hafızasına yer tahsis edebilmektedir. Ve son olarak EPC hafızası ilk yazılabilir bellektir.</p>
<p><strong>TID Bellek</strong>; sadece üretici tarafından oluşturulan eşsiz anahtarı tutan bölümdür ve sadece bunun için kullanılır. Üzerine ya da yanına herhangi bir şey yazılamaz.</p>
<p><strong>User Memory (Kullanıcı Belleği)</strong>; kullanıcının EPC bölümündeki mevcut alandan daha fazla alana ihtiyacı olduğunda kullanacağı bölümdür. Normal şartlarda maksimum 512 bitlik alandan oluşmalarına rağmen 4K ya da 8K byte sahibi olan bazı etiketler de vardır. Ve son olarak User Memory kullanıcılar için ikinci yazılabilir bellektir.</p>
<p>RFID sisteminin eksiklerine gelecek olursak bunlardan birisi RFID etiket çarpışmasıdır. Aynı anda birden fazla etiket okuyucuya sinyal gönderildiği zaman meydana gelen bu durumun çözümü için üreticiler etiketin okuyucuya tek bir anda cevap vermesi için değişik sistemler geliştirmektedirler. Bu sistemler etiketleri tekilleştiren algoritmalar içerirler ve her etiket saniyenin binde birinde okunduğu için eş zamanlı okunuyormuş gibi görünmektedirler. Bunun yanında bir çarpışma türü de okuyucu çarpışmasıdır. Bir okuyucudan gelen sinyalin diğerinden gelen sinyalle karışmasıyla meydana gelen bu durumun çözümü ise şimdilik her okuyucunun farklı zamanlarda çalıştırılmasıdır. Böylece çakışma engellenmiş ve sorun çözülmüş olur.</p>
<p>Şimdiye kadar anlattığımız RFID etiketlerinin yanında bir de “çipsiz RFID etiketleri” vardır ve data aktarımı için radyo frekanslarını kullanan fakat silikon bir mikroçipte seri numarası bulundurmayan sistemlere verilen isimdir. Bazı çipsiz etiketler silikon mikroçipler yerine plastik ya da iletken polimerler bulundururlar. Diğer çipsiz etiketler ise kendilerine yönelen radyo dalgalarının bir kısmını geri yansıtan maddeler bulundururlar. Bir bilgisayar bu geri yönlendirilen dalgaları algılar ve etiketli objeyi tanımlamak için bir parmak izi gibi kullanır. Şirketler bazı gizli dokümanların kopyalanmasını önlemek için radyo frekanslarını yansıtan fiberleri kâğıda gömme çalışmaları yapmaktadır. Bu fiberleri kullanan çipsiz etiketler tedarik zinciri kullanımlarında bir dezavantaja sahiptir. Bir anda sadece tek bir etiket okunabilir.</p>
<p>RFID’ler ile ilgili en çok sorulan sorulardan biri de bu sistemin sağlığa zararlı olup olmamasıdır. RFID cihazlarının sağlığa zararlı olup olmadığı konusu etiket ve antenler ile ilgili değil, okuyucuların ürettiği çıkış güçleri ile ilgilidir. Bu bağlamda, pasif ya da aktif herhangi bir etiketin yüklendiği zaman yaymış olduğu enerji insan sağlığı için zararlı kabul edilmemektedir. Ancak, okuyucular için dünya üzerinde bazı standartlar vardır. Ülkemizde de Telekomünikasyon Kurumu’nun regüle ettiği bazı kurallar dahilinde okuyucuların güçleri belli seviyelerde olmalıdır. Örneğin, su anda Avrupa Birliği ülkelerinde satılmakta olan ve ETSI 302-208 standartlarına uygun üretilmiş UHF okuyucuları 2W’ye kadar güç üretmektedirler. Bu sınır, Avrupalı karar vericiler için güvenlik sınırları dahilindedir.</p>
]]></content:encoded></item></channel></rss>