<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Eyup Mert 🔅 on Medium]]></title>
        <description><![CDATA[Stories by Eyup Mert 🔅 on Medium]]></description>
        <link>https://medium.com/@eupmrt?source=rss-2f52e58fe8d0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*EDcN_ZQ1tzaQlZtX1iKcaA.png</url>
            <title>Stories by Eyup Mert 🔅 on Medium</title>
            <link>https://medium.com/@eupmrt?source=rss-2f52e58fe8d0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Mon, 03 Aug 2026 10:43:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@eupmrt/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[EMPaywallManager: Yani tak-çıkar ödeme sayfası]]></title>
            <link>https://eupmrt.medium.com/empaywallmanager-yani-tak-%C3%A7%C4%B1kar-%C3%B6deme-sayfas%C4%B1-0e6884bedfe8?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/0e6884bedfe8</guid>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 22 May 2025 10:21:33 GMT</pubDate>
            <atom:updated>2025-05-22T10:21:33.253Z</atom:updated>
            <content:encoded><![CDATA[<p>İsim konusuna çalışacağım şimdilik idare edin, coding conventions işte 🤓</p><p>2025’in başlarında, hepimizin ayrı ayrı tekrar ettiği bir dansın farkında vardım. Bu dansın adı <strong>abonelik ekranlarıydı</strong>.</p><p>Tabi benden önce de bunun farkına varanlar olmuştu. Ama bana ne. Ben de vardım işte 😬</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4mbLZHuyLSpZCtAtOCK2Ag.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p>Her projede farklı bir tasarım, farklı buton yapıları, farklı arka planlar… Ve her biri sıfırdan yazılıyor. Kimi zaman bir view içine gömülü, kimi zaman bir modal olarak açılan güzel güzel şeyler.</p><p>Özetle: çoğu zaman <strong>tekrar eden, test edilemeyen, sürdürülemez</strong> şeylerdi bunlar.</p><p>Bir noktada dedim ki:</p><blockquote><em>“Ben bu olayı modülerleştireyim dedim. Hem kendi projelerimde hem başkalarının projelerinde kullanabilir. Bir işe yarar yani”</em></blockquote><p>İyi de demişim. Böylece <strong>EMPaywallManager üretme ihtiyacı hasıl oldu 🎁</strong></p><p>Ben ne anlattığınla ilgilenmiyorum, projeye bi bakıp gidicem diyenleri de <a href="http://github.com/merteyup/EMPaywallManager">şöyle hızlandırabiliriz.</a> 😄</p><h3>Neyi Amaçladım?</h3><p>SwiftUI ile yazılmış, Combine uyumlu, basit entegrasyona sahip, test edilebilir bir sistem.</p><p>Bir de tabi <strong>esnek</strong> bir sistem.</p><p>İsteyen biri sadece bir satırla hazır bir tasarımı kullanabilmeli. Daha ileri seviye kullanıcılar ise başlıkları, arka planları, ikonları, butonları değiştirebilmeliydi. Aslında SwiftUI’dan ilham aldım birazcık da 🤓</p><h3>İlk Versiyon ve Hatalar</h3><p>İlk versiyonları yazarken çok kez “bu protokol fazla oldu”, “bu view çok şişti”, “bu init karmaşık” gibi şeylerle boğuştum.</p><p>Ama her değişiklik beni <strong>sadeleşmeye biraz daha yaklaştırdı. Hata yaptıkça sadeleşti yani proje. İlginç geliyor bu bana şimdi </strong>🧐</p><p>Mesela başta sadece bir buton desteği vardı. Ama sonra anladım ki “Restore”, “Subscribe”, “Terms” gibi ayrı ayrı alanlar olmalı.</p><p>Ve her detayın opsiyonel olması gerektiğini fark ettim. Zorunlu olursa esnekliği kaybediyorduk.</p><h3>En Zorlandığım Kısım</h3><p>Dürüst olmak gerekirse en çok <strong>tasarımlar arası geçişte zorlandım 😔</strong><br>classic, modern, minimalist, bold... Bunlar hem farklı görünüyor hem farklı davranıyordu. Ama içerdikleri bilgi aynı: bir başlık, birkaç özellik, bir fiyat ve bir eylem.</p><p>Burada çözüm olarak ViewModel bazlı bir yapı kurmak tüm dengeyi sağladı.<br>Her varyant kendi ViewModel’ini kullanıyor, belirli bir protokole uyuyor, aynı PaywallModel’i okuyordu.</p><p><strong>Modülerliğin doğum sancılarıydı yani, zorlanmalarım.</strong></p><h3>Kazanımlar</h3><p>Şu an EMPaywallManager sayesinde:</p><ul><li>Yeni bir projeye <strong>2 dakikada birden çok ödeme sayfası ekleyebiliyorum.</strong></li><li>Bu ödeme sayfalarının <strong>performansını birbirleri arasında kıyaslayabiliyorum. Ki bu bence çok önemli, ilerleyen dönemlerde en önemli özellik olacağı kesin.</strong></li><li>Aynı modelle farklı tasarımları anında geçebiliyorum.</li><li>Gerçek kullanıcı verileriyle test edilebilir ViewModel’ler kullanıyorum.</li><li>Legal metinlerden arka planlara kadar her şeyi dışarıdan konfigüre edebiliyorum.</li></ul><h3>README ve İki Dilli Olması</h3><p>Bu paketi GitHub’a koyarken, sadece İngilizce değil <strong>Türkçe dökümantasyon</strong> da hazırlamak istedim.</p><p>Çünkü biliyorum, Türkiye’de SwiftUI ile uğraşan, ama İngilizce dökümantasyona boğulan pek çok geliştirici var.</p><p><strong>Öncelikle İngiliççeyi okuyun, deneyin. Olmazsa diye şeyettim.</strong></p><p><strong>👉 Öncelik İngiliççe 👈</strong></p><h3>Bundan Sonrası</h3><p>Yapmak istediğim birkaç şey daha var:</p><ul><li>Daha şekil şukul görsel varyantlar, tam ekran animasyonlu yapılar falan.</li><li>Çoklu ürün eklenebilecek daha fazla tasarım alternatifi.</li><li>Daha sonrasına da daha sonra bakacağım.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><h3>Sonuç olarak</h3><ul><li>Bu benim <strong>tasarımla, modülerlikle, sadelikle olan ilişkimi geliştirdiğim</strong> verimli bir süreç oldu. 😏</li><li>Hem kendim, hem de başkalarının kullanabileceği <strong>açık kaynak bir proje üretmenin heyecanını yaşadım.</strong></li><li>Hiç karşılaşmadığım problemleri, daha kapsamlı ve geleceği düşünerek çözebilme yeteneğimi de geliştirdim. 👊</li><li>Bir de bu proje <strong>birilerine faydalı olursa</strong>, tadından yenmez 💊</li><li>Projeyi keşfetmek isterseniz: 🔗 <a href="https://github.com/merteyup/EMPaywallManager">github.com/merteyup/EMPaywallManager</a></li><li>Bana ulaşmak isterseniz de 🔗 <a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></li></ul><p>Sevgiyle</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e6884bedfe8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 adımda OpenAI Destekli Mobil Uygulama Geliştirmek]]></title>
            <link>https://eupmrt.medium.com/6-ad%C4%B1mda-openai-destekli-mobil-uygulama-geli%C5%9Ftirmek-11a1ec1f55a8?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/11a1ec1f55a8</guid>
            <category><![CDATA[yapay-zeka]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[mobil-uygulama]]></category>
            <category><![CDATA[combine]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 08 May 2025 08:29:53 GMT</pubDate>
            <atom:updated>2025-05-08T08:29:53.787Z</atom:updated>
            <content:encoded><![CDATA[<p>Yapay zeka yardımıyla yapay zeka uygulaması geliştirmek de diyebiliriz…</p><p>Herkese selam, <strong>ama herkese</strong> 👋</p><p>Geçen günlerde, içine OpenAI entegre edilmiş bir projeye başlama isteğim <strong>önlenemez hale geldi.</strong> <strong>Öyle böyle değil yani.</strong></p><p>Ama</p><blockquote>Bununla bir uygulama yapmalıyız abi. Sonra köşeyi döneriz. Dolarları sayar, kalan zamanımızda da dijital göçebe falan oluruz. Zaten Portekiz vize veriyor…</blockquote><p>diye devam eden şekilde değil 😅</p><p>Soğukkanlılıkla, sağlıklı düşünerek ve bence daha büyük bir amaç olan <strong>öğrenmeyi hedefleyerek.</strong></p><p>Bu noktada, bu fikri tek başına hayata geçirebileceğimden emin değildim. Buna rağmen <strong>ilk komutu gönderdim.</strong></p><blockquote>Anyway whatever I do, I’d like to integrate an AI tool like ChatGPT to my app. Let’s break it down and talk about it.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tm--9IDKhlWCBiuw6s9u5Q.png" /><figcaption>Swift ve OpenAI ile Mobil Uygulama Geliştirmek</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p>Sonrasını madde madde detaylandırarak anlatıyorum.</p><h4><strong>1. Amaç Belirleme:</strong></h4><p>İlk olarak nereye gitmek istediğimizi belirlememiz gerekiyor. Amaç gelişebilir, değişebilir. <strong>Ancak en az bir tane mevcut olmalı.</strong> Yoksa harekete geçmeyiz.</p><p>Benim amacım şuydu: YZ ile konuşabilen, SwiftUI ile geliştirilmiş ve Firebase Functions kullanan bir mobil uygulama geliştirmek.</p><h4><strong>2. Proje Yapılandırmaları:</strong></h4><p>Burada <strong>0 (sıfır) tecrübem olan bir alana da giriş yaptığım</strong> için öncelikle geliştirme ortamımı buna göre hazırlamam gerekiyordu.</p><p>Dolayısıyla Firebase Functions kurulumunu gerçekleştirdim ve yaygınlığı sebebiyle JavaScript dilini tercih ettim. Sizlerin de eğer yoksa bir FirebaseConsole ve OpenAI hesabı oluşturmanız gerekir. Ayrıca ödeme araçlarını bağlamanız, çalışır bir hizmet satın alabilecek noktaya gelmeniz önemli.</p><p>SwiftUI tarafında ise tek bir buton, biraz da networking kodu. Hepsi bu.</p><p><strong>Butona tıkla. Firebase’e git. 🤏</strong></p><h4><strong>3. İlk JavaScript Fonksiyonunun Yazılması:</strong></h4><p>Daha sonra YZ’ye verdim komutu. Biraz da gaz veriyorum tabi 😏</p><p>Sağolsun. Kırmadı beni. İlk index.js fonksiyonumu yazdı. Burada kodları paylaşmaya gerek yok. Zaten isterseniz size de bir tane yazar 📑</p><h4><strong>4. Fonksiyonun Deploy Edilmesi ve Bu Süreçte Yaşanan Problemlerin Çözülmesi:</strong></h4><p>E tabi ben JavaScript bilmiyorum 😂 Dolayısıyla YZ iyi mi yazdı kötü mü yazdı başta anlamadım. Bu yüzden birkaç hata ile karşılaştım. Sonra bu hataları anlamaya ve çözmeye çalıştım.</p><ul><li>functions.config() Firebase v2&#39;de kullanımdan kaldırılmış.</li><li>text-davinci-003 modeli kullanımdan kaldırılmış.</li><li>Ve API key’i doğru iletememişim 😬</li></ul><h4><strong>5. Fonksiyonun Test Edilmesi:</strong></h4><p>YZ ile karşılıklı olarak hatalarımızı düzelttik ve yola devam ettik 🤝 Sonra da fonksiyonumuzu test ettik. Sonuç başarılı oldu.</p><p>Ama ben şakasına gülmedim 💩</p><pre>curl -X POST https://us-central1-YOUR_PROJECT.cloudfunctions.net/getOpenAIResponse \<br>  -H &quot;Content-Type: application/json&quot; \<br>  -d &#39;{&quot;prompt&quot;: &quot;Tell me a joke.&quot;}&#39;<br><br>Cevap: {&quot;text&quot;:&quot;Sure! Here&#39;s one for you:<br>        \n\nWhy couldn&#39;t the bicycle stand up by itself?<br>        \n\nBecause it was two-tired!&quot;}%   </pre><p>Buna rağmen çalışan bir yapı ortaya çıkarttığım için gülümsüyordum 😊</p><h4><strong>6. Sıradaki Adımlar:</strong></h4><p>Bu projeyi yayına girecek bir mobil uygulama olana kadar geliştireceğim. Bu yüzden sırada aşağıdaki adımlar var.</p><ul><li>SwiftUI ile MVVM kullanarak modüler bir uygulama geliştirmek</li><li>Uygulamayı yayına almak.</li><li>Eş zamanlı olarak uygulama için görsel ve işitsel içerik üretmek</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><h3><strong>Sonuç Olarak:</strong></h3><ul><li><strong>Firebase Functions üzerinde çalışan ve OpenAI API’siyle entegre olan bir sistem geliştirmenin adımları hakkında konuştuk.</strong></li><li>Bu sistem, kullanıcıdan gelen girdilere yanıt üretebiliyor ve bu yanıtları kullanıcıya sunabiliyor. Tüm bunları çok kısa bir süre (yaklaşık 4–5 saat) içinde tamamladım.</li><li>Bunun <strong>bitmiş bir ürün olmadığının farkındayım.</strong> Yine de işimi görüyor. Üzerine inşa ederek devam etmek gerektiğini biliyorum. Doğru olan da böylesi zaten. ✊</li></ul><p>Özetle siz de <a href="https://x.com/detskaza/status/745532661997834240?lang=en">kendisine yapay zekadan bahsedilmiş bir uygulama</a> yapmak isterseniz yapabilirsiniz 😂</p><p>Yardıma ihtiyacınız olursa yapay zeka yardım edecektir.</p><p><a href="https://www.linkedin.com/in/eyupmert/">Bana da çekinmeden yazabilirsiniz.</a></p><p>Sonraki yazıda görüşmek üzere.</p><p>Sevgiler.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11a1ec1f55a8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Yorumlar]]></title>
            <link>https://eupmrt.medium.com/yorumlar-f1b45cf55132?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1b45cf55132</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[ios-development]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 30 Jan 2025 10:05:53 GMT</pubDate>
            <atom:updated>2025-01-30T10:05:53.424Z</atom:updated>
            <content:encoded><![CDATA[<p>Yani yeterince temiz, açık ve anlaşılır kod yazamadım. Gel otur şurada anlatayım 🥲</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TR-7-q-XHdPUjQcc_w5clQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p>Yazılım kariyerime başladığım ilk günlerde karşılaştığım kaynakların pek çoğundaki bilgileri Sünger Bob gibi emmeye çalışıyordum. Bu da faydalı-faydasız ayrımını yapamadan pek çok bilgiyi, pratiğe dönüştürmem anlamına geliyordu. E sonuçta <strong>acemi olmak böyle bir şey.</strong> 🤦</p><p>Bir süre yorumlarla süslenmiş kodlar yazdıkça ve zaman ilerleyip tecrübe kazandıkça sorgulamak kolaylaştı. Ve çok geçmeden içime sinen pratikleri bulup, mümkün olduğunca az yorum ile kod yazmaya başladım. <a href="https://www.google.com/search?q=clean+code&amp;oq=clean+code&amp;gs_lcrp=EgZjaHJvbWUqBggAEEUYOzIGCAAQRRg7MgYIARBFGDwyBggCEEUYPDIGCAMQRRg9MgYIBBAuGEDSAQgxNzc3ajBqNKgCALACAA&amp;sourceid=chrome&amp;ie=UTF-8#wptab=si:ACC90nxuVQO9WBG-fCGFSorfPFXlsdsYzZbT2twEQQRkUWVRNG_6J7rvxXIi8o29ymwWMhsng0eimWbR0fWqT5Bnrk0oFCz2ZAKrIfwv1F3BMu-erQNmnww%3D">Clean Code</a>, bu anlayışı geliştirmedeki ve bu yazıdaki en büyük kaynağım oldu.</p><p>Sonuç olarak ben de iki ucunu deneyimlediğim bu pratikten biraz bahsedeyim dedim. Umarım zaman ve enerji tasarrufu yapmanıza yardımcı olur 🙌</p><p>Hızlıca başlayalım.</p><p>Temelde yorumlarla ilgili argümanlar <strong>ilk bakışta ikna edici,</strong> özetle:</p><ul><li>Bir gün sonra kendi yazdığın kodu hatırlamayabilirsin.</li><li>Takım arkadaşın senin yazdığın kodu anlamakta zorlanabilir.</li><li>Bu proje satılırsa sıfırdan başlayan bir geliştiriciye ipuçları bırakmalısın.</li></ul><p>Ancak bu argümanların tamamı aslında bir temele dayanıyor. Sıkı durun, üzülmeyin ve derin bir nefes alın…</p><blockquote>Yeterince temiz, açık ve anlaşılır kod yazamadım.</blockquote><p>Yani A2 seviyesinde İngilizce bilen herhangi birinin, okurken anlayacağı basitlikte bir yazım olmamış. 🥲</p><p>Evet maalesef <strong>gerçek bu kadar basit. Biraz da acı 🌶️</strong></p><p>Mesela bunu şöyle kanıtlayabiliriz.</p><p>Genellikle <strong>ne iş yaptığı açık olan kodlara yorum yazmak çok saçma görünür.</strong> Hatta bu yorumu yazarken kendimiz böyle hissederiz. En azından benim için öyle.</p><p>Örneğin:</p><pre>// This function returns the sum of two integers.<br>func sum(x: Int, y: Int) -&gt; Int {<br>    return x + y<br>}</pre><p>Yani yuh. Görünen göze kılavuz mu batardı neydi aslkfmals.</p><p>Neyse 🤭, biraz daha gerçekçi bir örneğe bakalım:</p><pre><br>func makeOTP() {}<br><br>func sendOTP(to phoneNumber: String, otp: String) {}<br><br>func verifyOTP(userInput: String, generatedOTP: String) -&gt; Bool {<br>    return userInput == generatedOTP<br>}<br><br>func handleOTPProcess(isVerified: Bool) {<br>    if isVerified {<br>        smsDidVerified()<br>    } else {<br>        smsVerificationDidFail()<br>    }<br>}<br><br>func smsDidVerified() {}<br><br>func smsVerificationDidFail() {}</pre><p>Konumuzun dışında kaldığı için fonksiyonların içini doldurmadım. Ama bu kod bloğunun ne zaman, kimin tarafından yazıldığının <strong>bir önemi yok.</strong> Herkes tarafından <strong>kolayca okunabilir ve anlaşılabilir.</strong> İşte yoruma ihtiyaç duymayan kod yazabilmekten kastım böyle bir şey. Kod bu minvalde olunca yorumlar gereksiz, <strong>hatta zararlı bir hale geliyor. 🤦</strong></p><p>Çünkü yorumlar genellikle:</p><ul><li>Eskir ve geçersiz olur. Dolayısıyla yanlış bilgi içerir.</li><li>Bakımı ihmal edilir.</li><li>Okumayı yorucu ve anlamayı güç hale getirir.</li></ul><p>Tamam dezavantajlarından bahsedip durmaya gerek yok. Anladık.</p><p><strong>Peki ne yapalım?</strong> Güzel soru 🧐</p><ol><li>O an kullandığımız <strong>yazılım dilinin, stilini özümseyelim ve uygulayalım.</strong> Swift için <a href="https://google.github.io/swift/">kaynak bir</a> ve <a href="https://github.com/kodecocodes/swift-style-guide">kaynak iki</a> yardımcı olacaktır.</li><li>Değişkenlerden başlayarak (yani en küçük elemanımızdan) fonksiyon, sınıf, yapı vs <strong>her şeyi iyi isimlendirelim.</strong></li><li>Belirli bir düzen içinde kod yazmayı alışkanlık haline getirelim. <br>Örneğin her yerde makeXXX, removeXXX, getXXX, didXXX, isXXX, willXXX gibi <strong>kullandığımız dile özgü kalıpları kullanarak işimizi kolaylaştıralım.</strong></li></ol><p>Son olarak da yorumların faydalı ve hatta gerekli olduğu yerlerin de farkında olalım. Çünkü bu başlıklar altına giren yorumlar <strong>enerji ve zaman tasarrufu yapmaya yönelik kullanıldığında</strong> faydalı faydalı olacaktır.</p><ul><li>Yasal bilgilendirmeler.</li><li>TODO’lar. (Favorim 🫠)</li><li>Dokümantasyon yorumları.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><h3>Sonuç:</h3><p>Bu yazının sonucunda kod yazma sürecinin bir parçası olan yorumlarla ilgili iki uçta yer alan fikirleri kendimce yorumladım ve tecrübelerimi sizlerle paylaştım.</p><ul><li>Tek bir cümleyle özetleyecek olursak, <strong>en iyi yorum kodun kendisidir.</strong></li></ul><p>Anlamadığınız ya da katılmadığınız bir nokta varsa <strong>çekinmeden</strong> bağlantı kurabilir, irtibata geçebilirsiz. 👇</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p>Bir sonraki yazıda görüşmek üzere 👋</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1b45cf55132" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2024’te Kullanmaktan En Çok Keyif Aldığım iOS Uygulamaları]]></title>
            <link>https://eupmrt.medium.com/2024te-kullanmaktan-en-%C3%A7ok-keyif-ald%C4%B1%C4%9F%C4%B1m-ios-uygulamalar%C4%B1-02cc80d483be?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/02cc80d483be</guid>
            <category><![CDATA[mobile-apps]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[mobile-app-testing]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 19 Dec 2024 08:08:00 GMT</pubDate>
            <atom:updated>2024-12-19T08:08:00.493Z</atom:updated>
            <content:encoded><![CDATA[<p>Bildiğiniz üzere biz bu işin ihracatını, ithalatını yeri geliyor imalatını yapıyoruz. <a href="https://www.youtube.com/watch?v=7HjeFhOAFMQ">🔗</a> Tabi tüketimini de yapıyoruz, yalan yok.</p><p>2024 başlarında kafayı <strong>‘Ben bu telefonu akıllı kullanacağım’</strong> fikriyle bozmuştum. Bu yüzden de telefonumdaki uygulama sayısını genellikle minimum seviyede tutuyorum. Bir iki sosyal medya, çeşitli banka uygulamaları artık olmazsa olmaz gibi biliyorsunuz. Ama ben bu yazımda <strong>mecburi uygulamaları çıkarınca geriye kalan, sevdiğim uygulamalardan</strong> bahsetmek istiyorum.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4KoEI8rcTeoOnZbuR5AdFQ.png" /></figure><p>Bana göre bir mobil uygulama <strong>üretkenliği arttırıyor ya da bir şekilde hayatımı kolaylaştırıyor olmalı.</strong> Yani uygulamaları zaman öldürmek için değil, zaman yaratmak için kullanıyorum diyebilirim. Eğer iki kriterimi birden karşılıyorsa genellikle bir süre kullandıktan sonra <a href="https://www.youtube.com/watch?v=kpw92vH0wdc">shut up and take my money</a> diyorum zaten.</p><p>Gelelim uygulamalara. Reklam değil. İşbirliği de değil. Ama övüyorum yani. Hatta para alsam ancak bu kadar överdim 😅</p><p><a href="https://apps.apple.com/us/app/habit-tracker/id1438388363"><strong>Habit Tracker: </strong></a>Bu<strong> </strong>uygulamayı yeni alışkanlıklar edinmek, var olanları takip edebilmek için kullanıyorum. Günlük koşuşturmaca içinde önceden planladığınız aktiviteleri takip etmek için oldukça faydalı. Birden fazla alışkanlığı takip etmeye de oldukça uygun.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2MnX9rYXn5dipbGk0tSxyQ.png" /></figure><ol><li>Ücretsiz versiyonu fazlasıyla yeterli.</li><li>Basit ve anlaşılır.</li><li>Bildirimlerle ruhunuzu ele geçirmeye çalışmıyor.</li><li>Ufak değişiklikler yaparak kişiselleştirmek mümkün.</li><li>Premium almak isterseniz lifetime ödeme seçeneği mevcut.</li></ol><p><a href="https://apps.apple.com/us/app/chordify-songs-chords-tuner/id1073624757"><strong>Chordify:</strong></a><strong> </strong>İlk keşfettiğimde <strong>aklımı başımdan almıştı.</strong> Bu uygulama, eğer benim gibi hobi olarak ortamlarda gitar çalıyorsanız hayatınızı kolaylaştırmanın da ötesine geçiyor. <strong>Youtube’da yer alan şarkıların akorlarını, şarkıyı dinlerken eşzamanlı olarak görebiliyorsunuz.</strong></p><p>Yav biz bu teknolojinin hastasıyız hastası 🫠</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D0YjR660KDUYfDudbD-OQQ.png" /></figure><ol><li>Ücretsiz versiyonu fazlasıyla yeterli.</li><li>Masaüstü ve tablet deneyimi de oldukça iyi.</li><li>Basit ve anlaşılır.</li><li>Bildirimlerle ruhunuzu ele geçirmeye çalışmıyor.</li><li>İçinde gitar tuner, metronom, ukulele ve piano seçenekleri de var.</li><li>Premium fiyatları genellikle uygun.</li></ol><p><a href="https://apps.apple.com/us/app/stoic-journal-mental-health/id1312926037"><strong>stoic:</strong></a> Gelelim gönüllerin birincisine. Akıl sağlığınızı birazcık önemsiyorsanız yazmanın ve durmanın önemini göz ardı etmeyin. Benim bu bağlamda bulduğum en temiz uygulama stoic. Felsefesine sadık, <strong>söylediği ile yaptığı bir</strong> (En azından şimdilik).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L_YE45mFJ093YipF3l4mbw.png" /></figure><ol><li>Sade ve en sevdiğim tarafı bu.</li><li>Ücretsiz versiyonu fazlasıyla yeterli.</li><li>Bildirimleri ve ön plana çıkarmak istediğiniz özellikleri kişiselleştirmek mümkün.</li><li>Tüm Apple ekosisteminde hizmet veriyor.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/0*e8scPh2vn7nwdf6X.png" /></figure><h3>Sonuç:</h3><p>Yani sonuç gayet açık, <strong>sevdiğim üç uygulamayı sizlerle paylaştım. 🤓 </strong>İlginizi çektiyse bi’ şans verebilirsiniz. Ya da sizin <strong>bildiğiniz benzer uygulamalar varsa</strong> buraya yorum olarak ya da <a href="https://www.linkedin.com/in/eyupmert/">Linkedin’e</a> paslayın. 2025&#39;de güzelleşsin. 🥳</p><p>Bir sonraki yazıda görüşmek üzere 👋</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=02cc80d483be" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Predictive Code Completion Nedir?]]></title>
            <link>https://eupmrt.medium.com/predictive-code-completion-nedir-43f980e986c0?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/43f980e986c0</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[predictivecodecompletion]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 31 Oct 2024 09:21:20 GMT</pubDate>
            <atom:updated>2024-10-31T09:21:20.799Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>Yapay zeka işimizi elimizden aldı, alıyor, alacak auuuuvv</strong> 🫨 diye isyan edenler, hadi toplaşıp bi’ bakalım bakalım, ayağımızın dibine kadar gelen bu <strong>Tahmini Kod Tamamlama özelliği neymiş, ne değilmiş.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nEYgxWHavAoQlqXdJPTRYw.png" /></figure><p>Yine tanımla başlayalım. Sonra bol bol örnek göreceğiz. En son da sonuç olarak bu meret işimizi elimizden alır mı almaz mı ona karar vereceğiz. Belki çiğ köfteci açarız 🤦</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p><a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes">Xcode 16 Release Notes sayfası</a>, şöyle bir bilgi içeriyor.</p><blockquote>Xcode 16, Swift ve Apple SDK’leri için özel olarak eğitilmiş bir makine öğrenme modeli tarafından desteklenen tahmini kod tamamlama özelliğini içeriyor. Tahmini kod tamamlama, macOS 15 çalıştıran Apple silicon’a sahip bir Mac gerektirir.</blockquote><p>Buradan itibaren Predictive Code Completion kavramını <strong>Tahmini Kod Tamamlama</strong> olarak Türkçe olarak kullanmaya çalışacağım. TKT de olabilir. Ona bakarız.</p><p>Öncelikle bu özelliğin <strong>Xcode 16</strong> ile birlikte hayatımıza girdiğini tekrar etmekte fayda var. Yani daha <strong>eski versiyonlarda bu özelliği kullanmak mümkün değil.</strong> Xcode’u güncelleyip tekrar açtığınızda otomatik olarak bu özelliği içeren bir indirme süreci başlıyor. Sonrasında kullanmaya hazırsınız. ⚡️</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OpVKePAEjpIFQtFD09b6Nw.gif" /><figcaption>Predictive Code Completion</figcaption></figure><p>E akla ilk gelen örneğimizle kurcalamaya başlayalım. İlk örnekte func anahtar kelimesini yazıyorum ve bekliyorum. Bana printHello() fonksiyonu öneriliyor. <strong>TAB tuşuna basarak</strong> bu öneriyi kabul ediyorum ve fonksiyon gövdesi otomatik olarak oluşturuluyor.</p><p>Hemen ardından da bu fonksiyonun yapabileceği işlev, otomatik olarak fonksiyonun gövdesinde öneriliyor. Basit ama etkili. Sevdim. 🎖️</p><p>Şimdi bir adım daha ileri taşıyalım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V-6USZfU4eMtYLuRZuc-YA.gif" /></figure><p>İngilizce sum yani toplama ifadesini func anahtar kelimesinden sonra yazıp bekliyorum. Bir toplama işlemi uygulamak için 2 Int değer alan ve 1 Int değer geri döndüren bir fonksiyon benim için hazırlanıyor. <strong>Anladık, çalışıyor 🤨</strong></p><p>Bu basit örneklerden sonra gerçekçi bir deneme yapıyorum.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iiCVUT-MWBQyJ_UkZvncZw.gif" /></figure><p>User isimli bir dosya oluşturdum ve bu dosyada aynı isimle bir struct oluşturuyorum. İlk özelliğim otomatik olarak name şeklinde tahmin ediliyor. Çoğu senaryo için <strong>yerinde bir tahmin.</strong> Bu tahminler işime yaradığı sürece TAB tuşuna basarak devam ediyorum.</p><p>age, isActive, isAdmin benim için yerinde tahminler. Bunları kabul ederek devam ediyorum. isSuperAdmin yerine başka bir öneri istiyorum. Bu yüzden silerek tekrar deniyorum <strong>ancak aynı öneriyi vermeye devam ediyor. </strong>Bu noktada bir çeşit geri bildirim iletebilmek isterdim. Bunu istemiyorum, başka bir şey öner gibisinden.</p><p>Bir alt satıra geçtiğimde de bana CodingKeys önerisinde bulunuyor. Backend’den gelecek verilerin anahtarlarında herhangi bir harf hassasiyeti ya da ‘_’ işareti bulunmadığı için şimdilik bunları da onaylıyorum. Başarılı.</p><p>İşi biraz daha <strong>karmaşıklaştırmak istiyorum.</strong> Yeni bir Movie dosyası içinde aynı isimle bir obje oluşturalım bakalım neler olacak.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NSl2WJBBEYENKWn0FKwQuA.gif" /></figure><p>Öncelikle Movie objesini public olarak öneriyor, istemediğim için siliyor ve kendim yazmaya başlıyorum. Codable ve Identifiable protokollerini öneriyor. Ben sadece Codable istiyorum ve sonrasında da mümkün olduğunca öneri görebilmek için tüm özellikleri onaylıyorum.</p><p>Sonlara doğru <strong>bağlamdan uzaklaşıyor</strong> ve daha çok suggestion ile ilgili öneriler vermeye başlıyor. Bu noktada suggestion‘ı <strong>yeni bir obje olarak önermesi</strong> daha mantıklı olabilirdi diye düşünüyorum. 🤔</p><p>Ancak bu beklentimi poster yazdığımda karşılıyor ve bunun yeni bir obje olmasını öneriyor. Ben bu öneriyi şimdilik kabul etmiyorum.</p><p>Burada bir önemli adım daha atıyor ve computed property olarak oluşturmak istediğim posterURL özelliğini mantıklı bir link ile, posterPath özelliğimi de kullanarak oluşturuyor. ✅</p><p>Şimdi de basit bir servis yazdıralım bakalım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gp3TYQKwNCpqSdY5lC-ODA.gif" /></figure><p>İnternetten movie objelerinden oluşan bir array çekebileceğimiz basit bir fonksiyonu oluşturabiliyor. İlk tercihi completion temelli protokol oluşturmaya dayalı bir yaklaşım. Ben asenkron bir fonksiyon istediğim için biraz yönlendiriyorum.</p><p>Verdiği fonksiyon ilk başta compile edilmiyordu. Fonksiyon sonunda ufak bir değişiklik yaparak data.0 yaptığım yeri öğrendi ve bir sonraki fonksiyonda uyguladı. <strong>Burası bence önemli. Müdahale ederek gelecekteki olası hataların önüne geçebiliyoruz.</strong></p><p>Şimdi de bu servisi adım adım daha ileri taşımak istersek neler yapabiliyoruz görelim. ⚒️</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YuB4btd63m3CTxFHKQCAaQ.gif" /></figure><p>Artık direkt olarak asenkron fonksiyonlar öneriyor. Bunu da öğrendi kerata. 🦴</p><p>fetchMovie isimli fonksiyonu id ile tek film, fetchMovies fonksiyonunu ise array return edecek şekilde hazırladı. <strong>Okuduğunu da anlıyor maşallah. 🧿</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yXoTK9KTmHtxzFL9RhOcUg.gif" /></figure><p>Ve bence en keyifli tarafı. <strong>TKT’yi yorumlarla yönetmek mümkün. 🥳</strong></p><p>Bir fonksiyon istiyorum, sadece 1999 yılında çekilmiş filmleri bana getiren bir fonksiyon olsun diye de önceden yorum şeklinde beklentimi iletiyorum. Ve bu doğrultuda bir fonksiyon elde ediyorum. <strong>Yani TKT yorumlarımızı okuyor ve dikkate alıyor.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bFZ3cztDv_r-yfDANxzCdA.gif" /></figure><p>Peki bakalım TKT, <strong>Türkçe biliyor mu</strong> 🧐</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aj0Qs1eEDZp-2m7_2CBE8w.gif" /></figure><p>Görünüşe göre biliyor, ama biraz daha gelişmesi gerek. Özellikle de <strong>yapacağımız işlemi detaylandırmaya başladığımızda</strong> ortaya çıkan sonuç tatmin edici olmayabiliyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><h3>Sonuç:</h3><p>Bu yazımın sonucunda güncel teknolojilerden birini daha iyi anlama şansı elde ettik. TKT’nin <strong>bana göre artı ve eksilerini</strong> sıralayarak konuyu kapatalım.</p><ul><li>Oldukça <strong>hızlı</strong> çalışıyor. ✅</li><li><strong>Türkçe biliyor.</strong> ✅</li><li><strong>Yorumlarla</strong> <strong>yönlendilirebiliyor</strong>. ✅</li><li>Kullanıldığı bağlamda <strong>yapılan işlemleri öğreniyor</strong> ve bir sonraki benzer uygulamada aynı yoldan ilerliyor. ✅</li><li>Çalışıp çalışmadığını anlayamıyoruz, ama <strong>çok bekletmiyor</strong>. 🟡</li><li>Öneri alternatifleri olmamasından şikayetçiyim. 🔴</li><li>Geri bildirimde bulunamamaktan şikayetçiyim. 🔴</li><li>Detaylı işlemlerde tatmin edici sonuçlar vermiyor. 🔴</li><li><strong>Compile edilmesi mümkün olmayan kodlar</strong> da önerebiliyor. 🔴</li></ul><p>Bir sonraki yazıda görüşmek üzere 👋</p><p>Anlamadığınız, açık olmadığını düşündüğünüz ya da gözden kaçırdığıma inandığınız yerlerle ilgili benimle <strong>çekinmeden</strong> bağlantı kurabilir, irtibata geçebilirsiz. 👇</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p><strong>Kaynaklar:</strong></p><p><a href="https://www.youtube.com/watch?v=FU9wl3-yJ-8">https://www.youtube.com/watch?v=FU9wl3-yJ-8</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=43f980e986c0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gerçek Problemler, Hızlı Çözümler]]></title>
            <link>https://eupmrt.medium.com/ger%C3%A7ek-problemler-h%C4%B1zl%C4%B1-%C3%A7%C3%B6z%C3%BCmler-2db77383e6b5?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/2db77383e6b5</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[combine]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 12 Sep 2024 08:24:25 GMT</pubDate>
            <atom:updated>2024-09-12T08:24:25.126Z</atom:updated>
            <content:encoded><![CDATA[<p>Kısa bir aranın ardından tekrar birlikteyiz. Bu sefer mini bir proje geliştirirken <strong>karşılaştığım problemler ve bunlara uygun bulduğum çözümlerden </strong>bahsedeceğim. ⚒️</p><p>Hem teknik hem de teknik olmayan konuları bir arada bulabileceğiniz bir rehber olacak. Böylelikle de <strong>benzer problemlerle karşılaştığınızda</strong> <strong>size zaman kazandıracak.</strong> E tecrübe de böyle bir şey zaten 🤓 O zaman hazır olup olmamanızla ilgilenmiyor ve başlıyorum. Yazının sonunda da sürpriz falan yok. Öylece bitecek, baştan söyleyeyim 🥳</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8PPxQYABtkTvJhc3vyp7OQ.png" /></figure><h4>Amaç: Bir şeyler geliştirmek istiyorum, tecrübemi arttırmak, pratik yapmak, öğrendiğim ya da üzerinde çalıştığım yeni teknolojileri hayata geçirmek istiyorum.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><h4><strong>Ana Problem-1</strong></h4><p>Ama ne şekilde? Milyonlarca to-do uygulaması var. Bir tane daha yapabilirim ve <strong>bunda hiçbir sorun yok.</strong> Ama bazen de farklı bir şey yapmak istiyor olabilirim. O zaman ne yapacağım? 😶‍🌫️</p><h4>Uyguladığım çözüm:</h4><p><a href="http://rapidapi.com">rapidapi.com</a> içerisinde gezinmeye başladım. Burasını API Sepeti gibi düşünebilirsiniz. Ücretsiz kullanıma da açık olan, <a href="https://rapidapi.com/traveltables/api/cost-of-living-and-prices">8000&#39;den fazla şehirde yaşam masraflarını kategorize ederek yerel para birimi cinsinden bizimle paylaşan bir API </a>buldum. <em>Aaa dedim ne güzel, gezmeyi de seven biriyim. Öyle şehirlere de bakarım neler kaç paraymış</em> diyerek uygulamaya koyuldum ✅</p><ul><li><strong>Alt Problem-1</strong></li></ul><p>API’ın aylık 1000 request limiti olsa da, <strong>saat başı sadece 10 istek</strong> gönderebiliyor olmak bir süre sonra canıma tak etti 🔴</p><ul><li><strong>Uyguladığım Çözüm</strong>:</li></ul><p>Projeye hesapta olmayan bir Core Data eklenmesi. Attığım istekten gelen verileri database’e kaydediyor ve test ederken Core Data’da yer alan verileri kullanıyorum. Böylelikle hem Core Data üzerindeki bilgi birikimimi arttırıyor hem de işimi hızlandırıyorum. ✅</p><ul><li><strong>Alt Problem-2</strong></li></ul><p>Core Data’ya rağmen hala limit aşımını yaşayabiliyorum ve veri gelmediği durumda sebepten kendim haberdar olmak istiyorum. E bu gerçek bir uygulama olsa, eğer mümkünse kullanıcıya da gerçek bir hata mesajı göstermek gerekecekti. 🔴</p><ul><li><strong>Uyguladığım Çözüm</strong>:</li></ul><p>Öyle de yapıyorum ve <strong>apiLimitExceeded</strong> senaryosuna karşı en basit çözümü uygulayarak bu hatayı kullanıcı ile (yani ben 😅) paylaşıyorum. Oh. ✅</p><ul><li><strong>Alt Problem-3</strong></li></ul><p>API tarafından gelen fiyat bilgileri en azından Türkiye için pek de güncel görünmüyor. E bu uygulamanın tek işi fiyat bilgilerini göstermek. En azından yaklaşık bir şeyler olması gerekiyor. 🔴</p><ul><li><strong>Uyguladığım Çözüm</strong>:</li></ul><p>Global bir enflasyon değişkeni 🤭 Biliyorum, en ideal çözüm bu değil. API tarafındaki verilerin güncellenmesi gerekiyor. Ancak şu anda böyle bir yetkim ya da amacım yok. Ben en azından tek merkezden, kendim kontrol edebileceğim bir yapı kurmaya karar veriyorum. Mevcut fiyatlara enflasyon ekliyor ya da azaltıyorum. 🥶 ✅</p><h4>Ana Problem-2</h4><p>Tasarım yok. Bir proje geliştirirken karşılaşacağımız ilk temel problemlerden birisi zaten bu. Kaçışı yok yani. 🔴</p><h4>Uyguladığım çözüm:</h4><p>Peki tasarıma gerek var mı? Yok.</p><p>Zaman ve enerji ayırsam gözlere ve gönüllere hitap edecek bir UI/UX ortaya çıkarabilirim, biliyorum. Ama mesele de o ya. Bu zaten bildiğim bir şey. Ve benim <strong>amacım bilmediğim bir şeyler öğrenmek.</strong> Bildiklerimi tekrar etmek değil. Tasarımı es geçiyorum. <strong>Basıyorum dümdüz bir tableview.</strong> Şıkır şıkır. ✅</p><ul><li><strong>Alt Problem-1</strong></li></ul><p>Ana liste sayfası için problem yok, ama detay sayfasında öyle ya da böyle bir tasarıma ihtiyaç duyuyorum. En azından başlık ve içeriklerin birbirinden ayrışması gerekiyor. 🔴</p><p>Yapabileceğim en basit çözümü uygulamaktan çekinmiyorum 🤭. İyi okunan, kolay anlaşılan, karmaşık olmayan bir tasarım iş görür. <strong>Simple is the best</strong> diyorum. ✅</p><h4>Ana Problem-3</h4><p>Modüler yapılar hakkında tecrübe sahibi olmak istiyorum. Özellikle network katmanını ayırmak istiyorum. 🔴</p><h4>Uyguladığım çözüm:</h4><p>Örnek bir proje bulup adım adım takip ediyorum. Ayıp değil günah değil. Proje çalışır hale geldiğinde de onu <a href="https://medium.com/@eupmrt/combine-nedir-b46674abe262">Combine</a> ile uyumlu çalışacak hale getirene kadar <a href="https://eupmrt.medium.com/refactoring-kod-d%C3%BCzenleme-nedir-8fdecce732e1">refactor</a> ediyorum. Bundan sonraki seferlerde de kendi networking katmanımı geliştirmeye devam edip tekrar kullanabileceğim güvenilir bir yapıya sahip olacağımı biliyorum. ✅</p><h4>Ana Problem-4</h4><p>Sıkıldım ve projeyi bitirmek istemiyorum. Motivasyonumu korumakta güçlük çekiyorum. Zaten bu projeden para da kazanmıyorum diye düşünüyorum. Daha önceden yaptığım bazı şeyleri tekrar ederken kendimi buluyor ve bunları zaten biliyorum yanılgısına kapılıyorum. 🔴</p><h4>Uyguladığım çözüm:</h4><p>Karşıma çıkan küçük küçük yeni problemleri çözdükçe veya hiç karşılaşmadığım daha iyi çözümler keşfettikçe kendime hemen çimdik atıyor ve hatırlatıyorum. Her şeyi bilemezsin. <strong>Sus ve yazmaya devam et.</strong></p><p>Tabi bu süreci basit bir to-do list ile de takip ediyorum. Karmaşıklaştırmadan. Gerektikçe eklemeler yapıyorum ve şov yapmıyorum. İşte gerçek örneği.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X0lh-dq6Q1LThBbk4SqrWA.png" /></figure><p>Evet, bu Apple’ın sağladığı not alma uygulaması. Zaten her şeyi tek başıma yapıyorum. O yüzden işimi görüyor ve üzerinde zaman kaybetmeden devam ediyorum. ✅</p><h4>Ana Problem-5</h4><p>Feedback’e ihtiyaç duyuyorum. 🔴</p><h4>Uyguladığım çözüm:</h4><p>Bu noktada benden daha tecrübeli ve bana yardım etme konusunda istekli bir abimden destek alıyorum. Sağolsun, kırmıyor hiçbir zaman beni. Karşılıklı olarak birbirimizi geliştirdiğimizin farkındayız. Keyfimiz yerinde. ✅</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W3KZlNp38DVgUyC5cJjnJw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><p><strong>Sonuç:</strong></p><ul><li>Zaman kaybetmeden başlamanın önemini ele aldık. Tabi ki genel bir çerçevenin baştan çizilmesi önemli, ama <strong>odak kaybolmadan işe koyulmak gerek.</strong> 🎯</li><li>Tasarımı beklemeden de bir proje hayata geçirebileceğimizi görmüş olduk ✅</li><li>Bazen en büyük rakibimiz kendimiz oluyoruz ya, işte <strong>kendimizi nasıl sustururuz sorusunu cevapladık. 🫡</strong></li><li>En önemlisi de problemlerin ürün geliştirme sürecinin kaçınılmaz bir parçası olduğunu kabul ettik. Yolumuza <strong>problemlere rağmen değil, problemleri kucaklayarak devam ettik. 🏔️</strong></li></ul><p>Eğer bu yazı öğrenme sürecinize faydalı olduysa, biraz motivasyon ya da bilgi edinmenize katkıda bulunduysa ne mutlu bana. Yeni yazılarımdan haberdar olmak veya soru sormak için LinkedIn ya da buradan takibe alabilirsiniz ✌️</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2db77383e6b5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ekran Koruyucu — Swift]]></title>
            <link>https://eupmrt.medium.com/ekran-koruyucu-swift-3227b6e6237b?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/3227b6e6237b</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift-programming]]></category>
            <category><![CDATA[remote-working]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Fri, 07 Jun 2024 07:47:50 GMT</pubDate>
            <atom:updated>2024-06-07T07:47:50.081Z</atom:updated>
            <content:encoded><![CDATA[<h3>Ekran Koruyucu — Swift</h3><p>Biraz da işin şov kısmı 🥳</p><p>Herkese merhaba, umarım <strong>bugün haftanızın en güzel günüdür </strong>✌️ Eğer öyle değilse de, bunu şimdi değiştirin. <strong>Çünkü neden olmasın</strong> 😎</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*77L-1JKN8d4AZDh66RONYg.png" /></figure><p>Bazılarınızın (kesinlikle, ben değil 🤭) dünyanın güzel yerlerinde çalışırken bilgisayar ekranınızı paylaştığınızı biliyorum. Ve yine bazılarınız <strong>bunun güvenlik sorunlarına yol açabileceğinin farkında.</strong> Çünkü bilgisayar ekranı genellikle gizli kod veya en azından özel bir şey demektir, değil mi?</p><p>Bu yüzden ‘Neden basit bir mock proje yapıp gerektiğinde onunla fotoğraf çekmeyelim ki?’ diye düşündüm. Düşünmekle de kalmadım, <strong>aksiyona geçtim.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zIzzALpO2-Wrw2wIXPtM2w.png" /></figure><p><strong>Sonuç:</strong></p><p><a href="https://github.com/merteyup/Mock-remote-work-screen">GitHub - merteyup/Mock-remote-work-screen: This project has been created just for fun :]</a></p><p>Peki bu projeyi yaparak <strong>ne elde ettim?</strong></p><ul><li>Birazcık SwiftUI kodu yazmış oldum. Çok az, ama olsun 🤏</li><li>Ve sizlere iş güvenliği ve gizlilik hakkında <strong>çaktırmadan ufak bir ders vermiş oldum</strong> 🔐</li></ul><p>Bence yeterli 🎯</p><p>Ek olarak, bunun birden fazla dilde olmasının harika olacağını düşünüyorum. Hem de öğrenme aşamasındaki birilerine <strong>faydalı bir alıştırma olacağına eminim.</strong></p><p>Bu yüzden eğer Swift hariç bir dil biliyor ya da öğreniyorsanız repoyu klonlayıp ya da forklayıp <strong>kendi dilinizde yazabilirsiniz.</strong> Eğer katkıda bulunmak ya da fikir beyan etmek isterseniz de bana ulaşın, şuradan👇</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p>Ve bir sonraki yazımda görüşmek üzere, <strong>kendinize iyi bakın</strong> ✌️</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3227b6e6237b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Combine Nedir?]]></title>
            <link>https://eupmrt.medium.com/combine-nedir-b46674abe262?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/b46674abe262</guid>
            <category><![CDATA[combine]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[combine-framework]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Wed, 29 May 2024 08:57:18 GMT</pubDate>
            <atom:updated>2024-05-29T08:57:18.389Z</atom:updated>
            <content:encoded><![CDATA[<p>Ben Combine ile beklenmedik bir şekilde, biraz da geç tanıştım. Sizin için de öyle olmasın. Eğer bilmiyorsanız, <strong>bu yazı iyi bir fikir sahibi olmanızı sağlayacaktır.</strong> Bir nevi geleceğe yatırım tavsiyesi yani.</p><p>Bir de kedilerle ilgili ilginç bilgiler öğreneceğiz. Çünkü neden olmasın 🥳</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ehGfVTguQrHydXpkrp4MDQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p>Hızlıca tanımımızı ele alalım. Sonra da <strong>tanımımızı tekrar ele alalım.</strong> Ben tek seferde anlayamadığım için mecbur siz de tekrar ele alacaksınız 😁</p><blockquote>Combine framework’ü, zamanla değişen değerleri işlemek için deklaratif bir Swift API’si sağlar. Bu değerler, birçok türde asenkron olayı temsil edebilir. Combine, zamanla değişebilen değerleri göstermek için yayıncıları (publishers) ve bu değerleri yayıncılardan almak için aboneleri (subscribers) tanımlar. <a href="https://developer.apple.com/documentation/combine">🔗</a></blockquote><p>Şimdi gelelim Türkçe mealine 😅</p><p>Combine, Apple tarafından geliştirilen bir <strong>reaktif programalama frameworküdür.</strong></p><ul><li>Asenkron olayları yönetme</li><li>Değer dizilerini işleme</li><li>Birden fazla işlemi zincirleyebilme</li></ul><p>gibi özellikleriyle ön plana çıkar diyebiliriz.</p><p>Peki reaktif programlama nedir, ya da bu bizim tam olarak nasıl işimize yarayacak diye soruyorsanız, <a href="https://eupmrt.medium.com/reaktif-programlama-nedir-swift-c7eb6a6c4037">buradan önceki yazımı</a> okuyarak ön hazırlığı tamamlayıp geri gelirsiniz 📌</p><h4>Combine’da Temel Kavramlar:</h4><p>Temel olarak combine, <strong>bir yayıncı ve bir abone arasında gerçekleşen iletişimden sorumludur.</strong> Dolayısıyla tüm temel kavramlar da bu ikili etrafında şekillenir.</p><ul><li><strong>Yayıncı (publisher):</strong> Yayıncılar, zamanla bir veya daha fazla aboneye değerler gönderir. Yayıncılara birkaç örnek vermek gerekirse Just, Future, PassthroughSubject ve CurrentValueSubject‘ten bahsetmek mümkündür.</li><li><strong>Abone (subscriber):</strong> Aboneler, yayıncılardan gelen değerleri alır. Subscriber, protocolüne uymak zorundadır. Bunun yanı sıra gelen değerleri, tamamlanma (completion) ve hataları nasıl işleyeceklerini tanımlamalıdırlar.</li><li><strong>Operatörler (operator): </strong>Bu kavramlar, yayıncıların yayımladığı değerleri işlemek veya dönüştürmek için Combine tarafından sağlanmaktadır. map, filter, flatMap, debounce ve mergebunlardan bazılarıdır.</li><li><strong>Abonelik (subscription): </strong>Bir yayıncı ile abone arasındaki bağlantı bir abonelik tarafından yönetilir. Abonelikler, değer almayı durdurmak için iptal edilebilirler (cancellable).</li></ul><p>Bu kadar laf salatası yeter, hadi bize kod göster diyenlerin susuzluğunu dindirelim. Parmakları çıtlatın bakalım, geliyor basit, anlaşılır ve temiz örneklerimiz 🤟</p><h4><strong>Temel Örnek:</strong></h4><pre>import Combine<br><br>let publisher = Just(&quot;Hello, Combine!&quot;)</pre><p>Öncelikle Combine frameworkünü import etmemiz gerekiyor. Sonrasında da Just türünden bir publisher oluşturuyoruz. Just, <strong>sadece tek bir değer yayınlayan</strong> ve sonra da tamamlanan basit bir publisher türü.</p><pre>import Combine<br><br>final class StringSubscriber: Subscriber {<br>    typealias Input = String<br>    typealias Failure = Never<br>    <br>/// Abone yayıncıya bağlandığında çağrılır <br>/// Abone sınırsız veri talep eder.<br>    func receive(subscription: Subscription) {<br>        subscription.request(.unlimited)<br>    }<br>    <br>/// Yayıncıdan her yeni değer geldiğinde çağrılır, bu değeri işler.<br>    func receive(_ input: String) -&gt; Subscribers.Demand {<br>        print(&quot;Received value: \(input)&quot;)<br>        return .none<br>    }<br>    <br>/// Yayıncının tamamlandığını veya hata olduğunu bildirir.<br>    func receive(completion: Subscribers.Completion&lt;Never&gt;) {<br>        print(&quot;Received completion: \(completion)&quot;)<br>    }<br>}<br><br>/// StringSubscriber nesnesini belirtilen yayıncıya abone eder.<br>let subscriber = StringSubscriber()<br>publisher.subscribe(subscriber)</pre><p>İkinci adımımızda bir abone tanımlayalım ve bir yayıncıya nasıl abone olunacağını görelim. StringSubscriber adında bir sınıf tanımlayalım. Bu sınıf, Subscriber protokolüne uysun. Input türü, abonenin alacağı değerin türünü belirtir (burada String). Failure türü ise abonenin karşılaşabileceği hata türünü belirtir (burada Never, yani hata olmayacak diyoruz).</p><h4>Operatörler Örneği:</h4><p>Aşağıdaki örneğimiz, Combine framework’ünde yayıncıların ve abonelerin nasıl kullanılacağını, operatörlerin nasıl uygulanacağını ve asenkron veri işleme sürecini göstermektedir. filter operatörü ile veriler filtrelenir ve sink metodu ile bu verilere abone olunur, böylece değerler ve tamamlanma durumu işlenir. ⚒️</p><p><strong>Yani özetle</strong>:</p><ul><li>Bize bir değer, ya da tamamlanma (completion) gelir.</li><li>Değer gelirse, bunu operatör (burada filter) yardımıyla kolayca işleyebiliriz.</li><li>Completion gelirse de sen sağ ben selamet 🤚</li></ul><pre>import Combine<br><br>let numbers = [1, 2, 3, 4, 5]<br>/// Bu diziyi Combine framework&#39;ünde bir yayıncıya dönüştürür. <br>/// Böylece dizi elemanları, abonelere yayınlanabilir.<br>let publisher = numbers.publisher<br><br>publisher<br>/// filter, buradaki kullanımda sadece çift sayıları geçiren bir filtredir. <br>    .filter { $0 % 2 == 0 }<br>/// sink metodu, bir abone oluşturur ve iki closure alır:<br>    .sink(receiveCompletion: { print(&quot;Completed with: \($0)&quot;) },<br>          receiveValue: { print(&quot;Printed received value: \($0)&quot;) })<br><br>/// receiveCompletion: Yayın tamamlandığında veya bir hata oluştuğunda çağrılır. <br>/// receiveValue: Yayıncıdan her yeni değer geldiğinde çağrılır.<br>/// Yukarıdaki kodun çıktısı aşağıdaki şekildedir.<br><br>// Printed received value: 2<br>// Printed received value: 4<br>// Completed with: finished</pre><h4>Back Pressure Örneği:</h4><pre>import Combine<br><br>let subject = PassthroughSubject&lt;Int, Never&gt;()<br><br>// Back Pressure ile bir subscriber oluşturulur<br>class IntSubscriber: Subscriber {<br>    typealias Input = Int<br>    typealias Failure = Never<br><br>    func receive(subscription: Subscription) {<br>        subscription.request(.max(1)) // Her seferinde tek bir değer istenir<br>    }<br><br>    func receive(_ input: Int) -&gt; Subscribers.Demand {<br>        print(&quot;Received value: \(input)&quot;)<br>        // İşlem bittiğinde yeni bir değer talep edilir<br>        return .max(1)<br>    }<br><br>    func receive(completion: Subscribers.Completion&lt;Never&gt;) {<br>        print(&quot;Received completion&quot;)<br>    }<br>}<br><br>let subscriber = IntSubscriber()<br>subject.subscribe(subscriber)<br><br>subject.send(1)<br>subject.send(2)<br>subject.send(3)<br>subject.send(4)<br>subject.send(5)<br><br>/// Kod Çıktısı:<br><br>// Received value: 1<br>// Received value: 2<br>// Received value: 3<br>// Received value: 4<br>// Received value: 5</pre><h4>Geri Basınç (Back Pressure) Nedir?</h4><p>Geri basınç, bir veri üreten (publisher) ile veri tüketen (subscriber) arasındaki veri akışını kontrol etmek için kullanılan bir mekanizmadır. Amaç, <strong>veri üretenin, veri tüketen daha fazla veriyi işleyemeden onu veriyle boğmasını engellemektir.</strong> Bu sayede olası <strong>performans problemleri önlenir.</strong></p><h4>Özetle:</h4><ol><li>PassthroughSubject&lt;Int, Never&gt;() oluşturulur. Bu subject integer değerler yayımlayabilir ve hata oluşturmaz (Never).</li><li>Özel bir subscriber olan IntSubscriber oluşturulur. Bu subscriber her seferinde bir değer isteyip işledikten sonra bir sonraki değeri ister.</li><li>Subscriber, subject’e abone olur.</li><li>send(_:) metodu kullanılarak subject&#39;e değerler yayımlanır (1, 2, 3, 4, 5). Her send(_:) çağrısı, subscriber&#39;ın receive(_:) metodunu çağırarak yayımlanan değeri iletir.</li></ol><h4>Uygulamalı Örnek:</h4><pre>import Combine<br>import Foundation<br><br>struct CatFact: Codable {<br>    let text: String<br>}<br><br>let url = URL(string: &quot;https://cat-fact.herokuapp.com/facts&quot;)!<br><br>/// AnyCancellable, herhangi bir yayıncıdan elde edilen iptal edilebilir bir aboneliktir.<br>var cancellable: AnyCancellable?<br><br>/// cancellable, Combine yayıncılarından abonelikleri iptal etmek için kullanılır.<br>cancellable = URLSession.shared.dataTaskPublisher(for: url)<br>/// Yayıncıdan gelen veriyi (data) çıkarır. <br>/// dataTaskPublisher bir tuple (data ve response) döner, burada sadece data kısmı ile ilgileniyoruz.<br>    .map { $0.data }<br>    .decode(type: [CatFact].self, decoder: JSONDecoder())<br>/// Yayıncının tamamlanma durumunu işler. <br>/// Eğer yayın başarıyla tamamlanmışsa (.finished), &quot;Finished&quot; yazdırılır. <br>/// Eğer bir hata oluşmuşsa (.failure(let error)), hata mesajı yazdırılır.<br>    .sink(receiveCompletion: { completion in<br>        switch completion {<br>        case .finished:<br>            print(&quot;Finished&quot;)<br>        case .failure(let error):<br>            print(&quot;Failed with error: \(error)&quot;)<br>        }<br>/// Yayıncıdan gelen [CatFact] dizisini alır. <br>/// Bu dizideki her bir CatFact için text alanı yazdırılır.<br>    }, receiveValue: { facts in<br>        for fact in facts {<br>            print(&quot;Text: \(fact.text)&quot;)<br>        }<br>    })<br><br><br>/// Kod Çıktısı:<br><br>// Text: Owning a cat can reduce the risk of stroke and heart attack by a third.<br>// Text: Most cats are lactose intolerant, and milk can cause painful stomach cramps and diarrhea. It&#39;s best to forego the milk and just give your cat the standard: clean, cool drinking water.<br>// Text: Domestic cats spend about 70 percent of the day sleeping and 15 percent of the day grooming.<br>// Text: The frequency of a domestic cat&#39;s purr is the same at which muscles and bones repair themselves.<br>// Text: Cats are the most popular pet in the United States: There are 88 million pet cats and 74 million dogs.<br>// Finished</pre><p>Sizler için beleş bir API buldum. Hem de kedili, <strong>bence dev hizmet</strong> 🐈</p><p>Şimdi birlikte bu kodun ne yaptığına bakalım. Ama eğer kod gözünüze karışık geldiyse, <strong>bir projeye kopyalayın ve yorum satırlarını silin.</strong> Ne kadar basit ve temiz olduğunu anlayacaksınız. Ben sizlere açıklayabilmek adına yorum satırlarını kullanıyorum. <strong>Normalde bu kod, yoruma ihtiyaç duymayacaktır.</strong></p><p><strong>Özetle</strong>:</p><p>Bu kod parçası, Combine kullanarak bir HTTP isteği yapar, JSON verisini decode eder ve sonuçları ekrana yazdırır. Hepsi bu.</p><ol><li>URL için bir dataTaskPublisher oluşturulur.</li><li>Gelen veri çözümlenir ve [CatFact] dizisine dönüştürülür.</li><li>Çözümlenen veriler ve yayıncının tamamlanma durumu işlenir.</li><li>Her bir kedi gerçeğinin text alanı ekrana yazdırılır.</li></ol><p>Böylelikle Combine’ın asenkron veri işleme yeteneklerini ve bazı Combine operatörlerinin nasıl kullanılacağını görmüş olduk.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><p>Güldük eğlendik ve umarım öğrendik. Bir yazının daha sonuna geldik.</p><p><strong>Sonuç:</strong></p><ul><li>Combine nedir, özellikleri nelerdir ve ne işe yarar gibi önemli sorulara cevap verdik ✅</li><li>Combine’da yer publisher,subscriber ve sink gibi temel kavramları öğrendik. Basitten karmaşığa doğru örneklerle ilerledik. 🏔️</li><li>Operatörlere de göz attık ve kedilerle ilgili değişik bilgiler edindik 🥳</li></ul><p>Benim için son derece öğretici bir yazı oldu. Artık özellikle bir önce reaktif programlama yazımdan sonra bunu ortaya çıkartmak, bu konudaki çekincelerimi giderdi. Umarım <strong>size de faydalı olmuştur. </strong>✌️</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p><strong>Kaynaklar:</strong></p><p><a href="https://developer.apple.com/documentation/combine">Combine | Apple Developer Documentation</a></p><p><a href="https://www.youtube.com/watch?v=xCjOXupS-bM">https://www.youtube.com/watch?v=xCjOXupS-bM</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b46674abe262" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reaktif Programlama Nedir? — Swift]]></title>
            <link>https://eupmrt.medium.com/reaktif-programlama-nedir-swift-c7eb6a6c4037?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7eb6a6c4037</guid>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[reactive-programming]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[reaktif-programlama]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Fri, 17 May 2024 07:10:18 GMT</pubDate>
            <atom:updated>2024-05-17T07:10:18.975Z</atom:updated>
            <content:encoded><![CDATA[<h3>Reaktif Programlama Nedir? — Swift</h3><p>Bu sorunun cevabı bizi uzun bir yolculuğa çıkartacak. Metrobüs gibi.</p><p>Herkese selamlar ✌️ Öğrenme olayı hiç bitmiyor yahu, dolayısıyla yine bir aradayız 🥳</p><p>Özellikle son dönemde öneminin arttığını gözlemlediğim reaktif programlama konusunda derinleşmeyi ve bu konu ile ilgili bir şeyler yazmayı daha fazla ertelemek istemedim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I0ib2yDivE3j3MlpGNNJtQ.png" /><figcaption>Reaktif programlama nedir?</figcaption></figure><p>Bu yazıda birkaç soruya biriktirdiğim cevapları sizinle paylaşacağım. Bu sayede <strong>önemli bir programlama konseptine aşina olacak</strong>, çantaya yeni bir alet ekleme yolunda önemli bir adım atmış olacaksınız 🛠️</p><p>Kod ile uygulamayı bir sonraki yazıya bıraktım. Combine ve RXSwift’ten bahsedeceğiz. Ama öncelikle <strong>konsepti anlamamız gerek.</strong> Kafa karıştırmak yok. Hadi başlayalım.</p><ul><li>Reaktif programlama nedir?</li><li>Reaktif programlamanın özellikleri nelerdir?</li><li>Reaktif programalama ne işe yarar?</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><p>Her zamanki gibi temelinden ve basit bir yaklaşımla tanımları ele alalım. Sonra da <strong>anlayacağımız bir dile çevirelim</strong> 😅</p><blockquote>Reaktif programlama, asenkron veri akışlarına (data streams) dayalı ve gerçek zamanlı olay (event) bazlı bir yazılım paradigmasıdır. <a href="https://medium.com/deliveryherotechhub/reactive-programlama-nedir-server-side-reactive-programlama-f485d9179df9">🔗</a></blockquote><blockquote>Tıpkı prosedürel programlama, fonksiyonel programlama ve nesneye yönelik programlama gibi, reaktif programlama da başka bir programlama stilidir. Gelecekte herhangi bir zamanda ortaya çıkabilecek farklı türdeki olaylara/verilere eş zamanlı olmayan şekilde tepki vermekle ilgilenir. Bu kadar. Reaktif programlama bundan başka bir şey değil. <a href="https://levelup.gitconnected.com/okay-but-what-exactly-is-reactive-programming-64ca2aabd1aa">🔗</a></blockquote><p>Tanımlar her zamanki gibi 🤯🤬😤😭🥲 Ama biz yılmazlarız, devam edelim 🤿</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*yjV76uB3K41DpKwCnuQhbA.png" /></figure><p>Buna göre sistem, <strong>veri akışlarında yaşanan değişikliklere (olaylara) anlık olarak tepki gösterir.</strong> Bu da uygulamalarımıza yalnızca gerçek zamanlı yanıt verme olanağı sağlamakla kalmaz, aynı zamanda <strong>asenkron veri akışlarının işlenmesini basitleştirerek</strong> kodumuzun daha temiz ve daha anlaşılır olmasını sağlar. 🧹</p><p>Şimdi benim gibi, günlük hayatla bağ kurunca daha iyi anlayanlar için de bir örnek geliyor.🤭</p><p>Örneğimizde bir <strong>metrobüs hattı, durağı ve bu durakta bekleyen</strong> insanlar var diyelim. Her metrobüs yaklaşması, bir olaydır ve yolcular da bu olay gerçekleştiğinde reaksiyon gösterir, yani metrobüse binerler. 🚍</p><p>Reaktif programlama da benzer bir şekilde çalışır. Veri akışıyla (metrobüs sefer saatleri) ve değişimin ortaya çıkmasıyla (yeni bir metrobüs gelişi) ilgilenir ve uygulamaların bu <strong>olaylara gerçek zamanlı olarak yanıt vermesini sağlar.</strong> Tıpkı yolcuların metrobüse binme reaksiyonunu göstermesi gib️i. ️🏃‍♂️️️️️🏃‍♂️🏃‍♂️</p><p>Metrobüs hattı bir kaza (error) meydana gelmediği sürece açıktır. Ve planlı bir sonlanma gerçekleşeceğine karar verilirse (completion) kapatılacağı <strong>önceden bize bildirilecektir.</strong></p><h4>Peki reaktif programlamanın özellikleri nelerdir?</h4><p><a href="https://www.reactivemanifesto.org/tr">Reaktif Manifesto</a>’ya göre;</p><ul><li><strong>Duyarlıdır: </strong><a href="https://www.reactivemanifesto.org/glossary#System">Sistem</a> eğer mümkünse anlamlı bir sürede yanıt verir. Duyarlılık, kullanılabilirlik ve işe yararlığın temel taşlarından biridir ama bundan daha önemlisi arızaların daha hızlı tespit edilip etkin şekilde ele alınması anlamına da gelir. Duyarlı sistemler hızlı ve istikrarlı yanıt zamanına odaklanır, güvenilir üst sınırlar içerisinde istikrarlı hizmet kalitesi sunarlar.</li><li><strong>Dirençlidir: </strong>Sistem <a href="https://www.reactivemanifesto.org/glossary#Failure">arıza</a> anında duyarlı kalır. Bu, yalnızca yüksek erişilebilir, kritik sistemlere has değildir. Dirençli olmayan her sistem arıza durumunda duyarsız kalacaktır. Dirençlilik <a href="https://www.reactivemanifesto.org/glossary#Replication">replikasyon</a>, kapsama, <a href="https://www.reactivemanifesto.org/glossary#Isolation">izolasyon</a> ve <a href="https://www.reactivemanifesto.org/glossary#Delegation">delegasyon</a> ile sağlanır.</li><li><strong>Esnektir: </strong>Sistem değişken iş yükü altında duyarlı kalır. Reaktif Sistemler, gerektiğinde girdilere hizmet veren <a href="https://www.reactivemanifesto.org/glossary#Resource">kaynak</a>ları artırarak ya da azaltarak girdi seviyelerindeki değişikliklere tepki verebilirler.</li><li><strong>Mesaj Güdümlüdür: </strong>Reaktif Sistemler gevşek bağlılık, izolasyon ve <a href="https://www.reactivemanifesto.org/glossary#Location-Transparency">konum şeffaflığını</a> sağlayacak ve <a href="https://www.reactivemanifesto.org/glossary#Failure">hataları</a> mesaj olarak delege etmeyi mümkün kılacak şekilde bileşenleri arasında bir sınır çizmek için <a href="https://www.reactivemanifesto.org/glossary#Asynchronous">asenkron</a> <a href="https://www.reactivemanifesto.org/glossary#Message-Driven">mesaj iletimini</a> kullanır. Belirtik mesaj iletimi kullanmak sistemdeki mesaj kuyruklarını şekillendirip izleyerek ve gerektiğinde <a href="https://www.reactivemanifesto.org/glossary#Back-Pressure">geri-basınç</a> uygulayarak yük yönetimini, esnekliği ve akış kontrolünü sağlar.</li></ul><p>Eee çok havalı ve işlevsel görünüyor. O zaman ‘her şeyi reaktif programlama ile yapalım bitsin gitsin 😅 ’ demek istiyor olabilirsiniz. Ancak bildiğimiz üzere <strong>bir taşla bütün kuşları vurmayı başaramayız.</strong></p><p>O zaman gerçekte reaktif programlamanın <strong>ne işe yaradığına odaklanalım.</strong> Çünkü aslında reaktif programlama ile çözülecek her şeyi başka yaklaşımlar kullanarak da çözmek mümkündür.</p><h4>Reaktif programalama ne işe yarar?</h4><ul><li><strong>Asenkron işlemleri gerçekleştirmek, daha okunabilir hale getirmek</strong> için oldukça önemli bir araçtır.</li><li>Geri-basınç (backpressure) reaktif programlamanın en önemli özelliklerinden biridir. Bu özellik sayesinde <strong>uygulama, karşılayabileceği veri miktarını bildirerek sunucudan yavaşlamasını ya da hızlanmasını talep edebilir.</strong> Bu sayede olası problemlerin kolaylıkla önüne geçilmiş olur.</li><li><strong>Sistem kaynaklarının daha iyi kullanımını sunar.</strong> Bu sayede uygulama daha az kaynak kullanarak daha verimli çalışabilecektir.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><p>Güldük eğlendik ve umarım öğrendik. Bir yazının daha sonuna geldik.</p><p><strong>Sonuç:</strong></p><ul><li>Reaktif programlama nedir, özellikleri nelerdir ve ne işe yarar gibi önemli sorulara cevap verdik 😎</li><li>Alet çantamıza güncel teknolojilerden bir araç eklemek için ilk adımı attık ✅</li><li>Günlük hayattan örneklendirerek bilgilerimizin kalıcı ve anlamlı olmasına imkan tanıdık 🎯</li></ul><p>Bu konu ile ilgili öğrenmeye devam ettikçe bilgilerimi paylaşacağım. Siz de öğrenme sürecinize faydalı olduğunu düşündüyseniz <strong>bir beğeni olur, alkış olur, yorum da olur yapın bir şeyler. </strong>Yeni yazılarımdan haberdar olmak veya soru sormak için de mutlaka LinkedIn ya da buradan takibe alın ✌️</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p><strong>Kaynaklar:</strong></p><p><a href="https://www.freecodecamp.org/news/reactive-programming-beginner-guide/">https://www.freecodecamp.org/news/reactive-programming-beginner-guide/</a></p><p><a href="https://medium.com/digitalfrontiers/reactive-programming-in-a-nutshell-28bd8cb13266">https://medium.com/digitalfrontiers/reactive-programming-in-a-nutshell-28bd8cb13266</a></p><p><a href="https://www.gencayyildiz.com/blog/reactive-programming-nedir/">https://www.gencayyildiz.com/blog/reactive-programming-nedir/</a></p><ul><li><a href="https://mertcangokgoz.com/reactive-programlama-nedir-neden-ihtiyacimiz-var/">Reactive Programlama Nedir? Neden İhtiyacımız var?</a></li><li><a href="https://www.reactivemanifesto.org/tr">Reaktif Manifesto</a></li><li><a href="https://medium.com/deliveryherotechhub/reactive-programlama-nedir-server-side-reactive-programlama-f485d9179df9">Reactive Programlama Nedir? Server-side Reactive Programlama</a></li><li><a href="https://levelup.gitconnected.com/okay-but-what-exactly-is-reactive-programming-64ca2aabd1aa">Okay…but what exactly is Reactive Programming?</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7eb6a6c4037" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Swift Location Simulation — Google Maps SDK]]></title>
            <link>https://eupmrt.medium.com/swift-location-simulation-google-maps-sdk-199a56fb103c?source=rss-2f52e58fe8d0------2</link>
            <guid isPermaLink="false">https://medium.com/p/199a56fb103c</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[google-maps]]></category>
            <category><![CDATA[ios-development]]></category>
            <category><![CDATA[location-services]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Eyup Mert ]]></dc:creator>
            <pubDate>Thu, 09 May 2024 07:17:03 GMT</pubDate>
            <atom:updated>2024-05-09T07:17:03.973Z</atom:updated>
            <content:encoded><![CDATA[<h3>Swift Location Simulation — Google Maps SDK</h3><p>Hello everyone, ️I hope you’re all doing well ✌</p><p>I have encountered some problems while working on a location feature-based application. Luckily I found a solution and <strong>wanted to share this with you too.</strong> Because I could find useful some guidance like that, I believe this will help someone 🤓</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N-6vq1kB2k5YsaqpoNIWdw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L5E6r3hKCAtt9lLx_2ccvg.png" /></figure><h4><strong>What was the problem:</strong></h4><p>Simulating iOS Application location while using Google Maps SDK 😥</p><p>Because it’s easy and simple to simulate location on your iOS app if you use MapKit. But <strong>when it comes to Google Maps SDK it becomes tricky.</strong> You simply can’t simulate the location of your device without an extra effort.</p><p>My team had problems with that while we were developing a transportation app. And this issue become a bottleneck for us 🙅‍♂️</p><p>Even though we enjoy making real user tests on the field (which is not scalable), for some small actions <strong>we had to find a way to simulate the location 🤔</strong></p><p>So I have gathered the solution I found together and made a simple guide for it. <strong>This has only 3 steps</strong> <strong>if you have a properly working Google Maps SDK on your application.</strong></p><p>Let’s get started 💪</p><ul><li>Generate and download .gpx file with the proper set of coordinates and speed value. You can use <a href="https://www.gpxgenerator.com/?source=post_page-----e2be20fbd7f4--------------------------------">this</a>, or your preferred website for this purpose.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tu1UOovtI1HIflnKZFQDiA.png" /></figure><ul><li>Add this file to the project via <strong>Debug &gt; Simulate Location &gt; Add GPS Exchange</strong> to Project</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kta9AnlrLvohk4mWjRyMhg.png" /></figure><ul><li>Then simulate your location <strong>Debug &gt; Simulate Location &gt; GeneratedGPXFileName</strong></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wPYa-44vYMGR1_60mnxifg.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*7kjmxtsy1T2M9oLK2mglEQ.png" /></figure><p><strong>Results:</strong></p><ul><li>Detected a bottleneck for our team 👀</li><li>Found a suitable solution which covers most cases ✅</li><li>Improved our skills on Google Maps SDK 🛠️</li></ul><p>I’m highly encouraging you to give any feedback about this article. Positive or negative doesn’t matter. I’m just trying to <strong>improve my skills and share my journey with like-minded people</strong>👇</p><p><a href="https://www.linkedin.com/in/eyupmert/">https://www.linkedin.com/in/eyupmert/</a></p><p><strong>And if you find this somehow useful, let’s do the thing. Give a clap, share, and care 🤓 </strong>Also take care of yourself too 🫶</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=199a56fb103c" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>