<?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[İnteraktif Web &amp; Mobile Tribe - Medium]]></title>
        <description><![CDATA[İnteraktif Web &amp; Mobile Tribe Blogu, takım üyelerinin ve paydaşlarının farklı konulardaki güncel yazılarını içeren bir yayındır. - Medium]]></description>
        <link>https://medium.com/ltunes?source=rss----a5bfd5993534---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>İnteraktif Web &amp;amp; Mobile Tribe - Medium</title>
            <link>https://medium.com/ltunes?source=rss----a5bfd5993534---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 19:16:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/ltunes" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Recommender System]]></title>
            <link>https://medium.com/ltunes/recommender-system-b21cb132e362?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/b21cb132e362</guid>
            <category><![CDATA[recommender-systems]]></category>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Thu, 26 Jan 2023 07:24:50 GMT</pubDate>
            <atom:updated>2023-01-26T07:24:40.875Z</atom:updated>
            <content:encoded><![CDATA[<p>Nedir bu recommender system?</p><p>Şirketimiz içerisinde arge ekibimizin belirlediği teknik yazı konularımız ile birlikte süreçte farklı teknolojiler hakkında bilgilere de sahip olmaktayız . Yeni konumuzun başlığı Recommender system o zaman hadi birlikte bakalım neymiş bu teknoloji🚀</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/789/0*53R30hIp-QC33FNA.jpeg" /></figure><p><strong>Recommendation engines</strong>, öneri motorları olarak da adlandırılır, bir kullanıcının daha önce oluşturduğu tercih ve davranış verilerini kullanarak, kullanıcının ilgi alanlarına uygun ürünler, içerikler, hizmetler veya diğer öğeleri önerirler. Bu öneriler, genellikle bir web sitesi veya uygulamanın öneri bölümünde gösterilir ve kullanıcının dikkatini çeker ve daha fazla içeriği keşfetmesine yardımcı olur.</p><p>Recommendation engines, çeşitli alanlarda kullanılabilir ve birçok farklı amaç için tasarımlanabilir. Örneğin:</p><p><strong>E-ticaret: </strong>Bir e-ticaret mağazasında, ürünleri önermeyi hedefleyen bir öneri motoru, bir kullanıcının alışveriş geçmişi ve beğenilerine dayanarak, kullanıcının ilgi duyabileceği ürünleri önerebilir.</p><p>Müzik ve filmler: Bir müzik veya film önerme uygulamasında, bir kullanıcının daha önce dinlediği veya izlediği müzikler ve filmleri kullanarak, kullanıcının ilgi duyabileceği diğer müzikler ve filmleri önerebilir.</p><p><strong>Haberler ve içerik:</strong> Bir haber sitesi veya içerik platformunda, bir kullanıcının daha önce okuduğu haberler ve içerikleri kullanarak, kullanıcının ilgi duyabileceği diğer haberler ve içerikleri önerebilir.</p><p><strong>Reklamlar: </strong>Bir reklam platformunda, bir kullanıcının daha önce tıkladığı reklamlar ve ilgi alanlarına dayanarak, kullanıcının ilgi duyabileceği diğer reklamları önerebilir.</p><p>Recommendation engineler, bir kullanıcının ilgi alanlarını tahmin etmek ve onlara benzer ürünler, içerik ve hizmetler önermek için kullanılan yazılımlardır. Bu tür sistemler, genellikle çeşitli teknikler ve algoritmalar kullanırlar. Aşağıda, recommendation enginelerde sıklıkla kullanılan bazı teknikler ve algoritmaların bir listesi verilmiştir:</p><p><strong>Collaborative Filtering:</strong> Bu yöntem, mevcut kullanıcıların ilgi alanlarını ve tercihlerini kullanarak, benzer ilgi alanlarına sahip diğer kullanıcıların tercihlerine dayanarak öneriler yapar. Öneri yapılacak kullanıcının tercihlerine benzer olan diğer kullanıcıların tercihlerine bakılarak, o kullanıcı için uygun öneriler belirlenir.</p><p><strong>Content-Based Filtering:</strong> Bu yöntem, önerilecek ürünlerin özelliklerine dayanarak öneriler yapar. Örneğin, bir kullanıcının tercih ettiği ürünlerin özellikleri incelenir ve benzer özelliklere sahip diğer ürünler önerilir.</p><p><strong>Hybrid Filtering:</strong> Bu yöntem, collaborative filtering ve content-based filtering yöntemlerinin bir kombinasyonunu kullanır. Öneriler, kullanıcının tercihlerine benzer olan diğer kullanıcıların tercihleri ve önerilecek ürünlerin özelliklerine dayanarak yapılır.</p><p><strong>Matrix Factorization:</strong> Bu algoritma, kullanıcıların ürünleri değerlendirme verilerini içeren bir değerlendirme matrisine dayanarak, kullanıcıların ve ürünlerin latent (gizli) özelliklerini tahmin eder. Bu latent özellikler kullanılarak, kullanıcıların ürünler hakkındaki değerlendirmeleri tahmin edilerek, öneriler yapılır.</p><p>Bu listede yer alan teknikler ve algoritmalar, recommendation enginelerin sıklıkla kullandığı yöntemlerdir. Ancak, bu yöntemlerin yanı sıra, recommendation enginelerde diğer yöntemler de kullanılmaktadır.</p><p>Bu yöntemlere örnekler verilecek olunursa, popülarite tabanlı algoritmalar ve öğrenme tabanlı algoritmalardır.</p><p><strong>Popülarite tabanlı algoritmalar</strong>, önerilen ürünlerin popülarite derecesine göre öneriler yapan recommendation enginelerinin kullandığı algoritmalardır. Bu algoritmalar, önerilen ürünlerin ne kadar popüler olduğunu ölçerek, daha popüler olan ürünleri önerirler. Örneğin, bir mağazada satılan ürünlerin satış sayısına göre sıralanması gibi.</p><p>Popülarite tabanlı algoritmaların <strong>avantajları</strong> şunlardır:</p><p>· Basit ve hızlı çalışmaları: Popülarite tabanlı algoritmalar, önerilen ürünlerin popülarite derecesine göre öneriler yapar ve bu nedenle daha basit ve hızlı çalışırlar.</p><p>· Özel öneriler sunmamaları: Popülarite tabanlı algoritmalar, önerilen ürünlerin popülarite derecesine göre öneriler yapar ve bu nedenle daha özel öneriler sunmazlar. Bu, kullanıcıların ilgi alanlarına göre öneriler sunmazlar.</p><p>Popülarite tabanlı algoritmaların <strong>dezavantajları</strong> şunlardır:</p><p>· Özel öneriler sunmamaları, popülarite tabanlı algoritmalar, önerilen ürünlerin popülarite derecesine göre öneriler yapar ve bu nedenle daha özel öneriler sunmazlar. Bu, kullanıcıların ilgi alanlarına göre öneriler sunmazlar.</p><p>· Daha az yönlendirici olmaları, popülarite tabanlı algoritmalar, önerilen ürünlerin popülarite derecesine göre öneriler yapar ve bu nedenle daha az yönlendirici olabilirler. Örneğin, önerilen ürünlerin özellikleri hakkında bilgi vermeyebilirler.</p><p>· Daha az kişiselleştirilmiş olma, popülarite tabanlı algoritmaların kullanıcıların geçmiş alışverişleri, ilgi alanları ve tercihlerine göre öneriler sunmamaları anlamına gelir. Bu, kullanıcıların geçmiş alışverişlerinden yola çıkarak onların ilgi alanlarına göre öneriler sunulmaması demektir. Bu durum, kullanıcıların memnuniyetini azaltabilir ve onların geri dönüş oranını azaltabilir.</p><p>Bu nedenle, recommendation enginelerinin daha özel öneriler sunarak kullanıcıların ilgi alanlarına göre öneriler yapmaları önemlidir. Bu sayede, kullanıcıların memnuniyeti artar ve geri dönüş oranları da artar. Bu, işletmeler için daha fazla satış anlamına gelebilir ve işletmelerin karlılığını artırabilir.</p><p><strong>Öğrenme tabanlı algoritmalar</strong>, recommendation enginelerinin önerilen ürünleri öğrendikleri verilere göre sıralayan algoritmalardır. Bu algoritmalar, kullanıcıların geçmiş alışverişleri, beğenileri ve tercihleri gibi verileri öğrendikleri verilere göre öneriler yaparlar. Öğrenme tabanlı algoritmalar, önerilen ürünlerin kullanıcıların ilgi alanlarına uygun olma olasılığını arttırır.</p><p>Öğrenme tabanlı algoritmaların <strong>avantajları</strong> şunlardır:</p><p>Özel öneriler sunmaları, öğrenme tabanlı algoritmalar, kullanıcıların geçmiş alışverişleri, beğenileri ve tercihleri gibi verilere göre öneriler yapar ve bu nedenle daha özel öneriler sunarlar. Bu, kullanıcıların ilgi alanlarına göre öneriler sunar. Daha yönlendirici olmaları, öğrenme tabanlı algoritmalar, önerilen ürünlerin özellikleri hakkında bilgi verirler ve bu nedenle daha yönlendirici olurlar. Daha kişiselleştirilmiş olmaları, öğrenme tabanlı algoritmalar, kullanıcıların geçmiş alışverişleri, beğenileri ve tercihleri gibi verilere göre öneriler yapar ve bu nedenle daha kişiselleştirilmiş olurlar. Bu, kullanıcıların memnuniyetini artırır ve geri dönüş oranlarını arttırır. Öğrenme tabanlı algoritmalar, önerilen ürünlerin kullanıcıların ilgi alanlarına uygun olma olasılığını arttırır. Bu, kullanıcıların memnuniyetini artırır ve geri dönüş oranlarını arttırır. Öğrenme tabanlı algoritmalar, önerilen ürünlerin popülarite derecesine göre değil, kullanıcıların geçmiş alışverişleri, beğenileri ve tercihleri gibi verilere göre öneriler yapar. Bu sayede, önerilen ürünlerin kullanıcıların ilgi alanlarına uygun olma olasılığı arttırılır. Bu, kullanıcıların memnuniyetini artırır ve geri dönüş oranlarını arttırır. Öğrenme tabanlı algoritmalar, popülarite tabanlı algoritmalara göre daha özel öneriler sunar ve daha yönlendirici olurlar. Öğrenme tabanlı algoritmalar, birçok farklı veri türünü kullanarak öğrenebilirler. Bu veriler arasında, kullanıcıların geçmiş alışverişleri, beğenileri, tercihleri, arama terimleri, tıklama verileri ve sosyal medya paylaşımları gibi veriler bulunur. Öğrenme tabanlı algoritmalar, bu verileri kullanarak kullanıcıların ilgi alanlarını öğrenirler ve bu bilgiye dayanarak öneriler yaparlar. Bu sayede, önerilen ürünlerin kullanıcıların ilgi alanlarına uygun olma olasılığı arttırılır.</p><p>Öğrenme tabanlı algoritmaların <strong>dezavantajları</strong> şunlardır:</p><p>Veri gereksinimleri, öğrenme tabanlı algoritmalar, öğrendikleri verilere göre öneriler yapar. Bu nedenle, öğrenme tabanlı algoritmalar için yeterli veriye ihtiyaç vardır. Öğrenme tabanlı algoritmalar, yeterli veriye sahip olmadıklarında daha az etkili olabilirler. Eğitim süresi, öğrenme tabanlı algoritmalar, öğrendikleri verilere göre öneriler yapar. Bu nedenle, öğrenme tabanlı algoritmaların eğitim süresi, popülarite tabanlı algoritmalara göre daha uzun olabilir. Yapay sinir ağları gerektirme, öğrenme tabanlı algoritmalar, genellikle yapay sinir ağlarını kullanırlar. Bu nedenle, öğrenme tabanlı algoritmaların uygulanması yapay sinir ağlarının anlaşılması ve uygulanması gerektirir.Performansının azalma riski, öğrenme tabanlı algoritmalar, öğrendikleri verilere göre öneriler yapar. Bu nedenle, öğrenme tabanlı algoritmaların öğrendiği verilerin doğruluğu önemlidir. Eğer veriler yanlış veya eksik ise, öğrenme tabanlı algoritmaların performansı azalabilir. Öğrenme tabanlı algoritmalar, popülarite tabanlı algoritmalara göre daha yüksek maliyetli olabilir. Bu nedenle, işletmelerin öğrenme tabanlı algoritmaları uygulamaları için daha fazla kaynak ayırmaları gerekebilir.</p><p>Recommendation engineler, bir kullanıcının ilgi alanlarını tahmin etmek ve onlara benzer ürünler, içerik ve hizmetler önermek için kullanılan yazılımlardır. Bu tür sistemler, <strong>şirketler ve web sitelerine</strong> çeşitli yararlar sağlamaktadır.</p><p><strong>1.Kullanıcı deneyimini iyileştirir:</strong> Recommendation engineler, kullanıcıların ilgi alanlarına uygun öneriler yaparak, onların web sitelerini daha keyifli hale getirir. Bu, kullanıcıların web sitelerine daha sık ziyaret etmelerine ve daha uzun süre orada kalmalarına neden olur.</p><p><strong>2.Satışları arttırır</strong>: Recommendation engineler, önerdikleri ürünlerin satışını arttırır. Önerilen ürünler, kullanıcıların ilgi alanlarına uygun olduğu için, kullanıcılar daha yüksek olasılıkla satın almayı düşünürler. Bu, şirketlerin satışlarını arttırır ve kârını artırır.</p><p><strong>3.Reklam harcamalarını azaltır:</strong> Recommendation engineler, reklam harcamalarını azaltır. Önerilen ürünler, kullanıcıların ilgi alanlarına uygun olduğu için, reklamların daha az gösterilmesine gerek kalır. Bu da reklam harcamalarını azaltır.</p><p><strong>4.Müşteri sadakatini arttırır:</strong> Recommendation engineler, kullanıcıların web sitelerine daha sık ziyaret etmelerine neden olur. Bu, müşteri sadakatini arttırır ve daha fazla satış sağlar.</p><p><strong>5.Müşteri verilerini işlemeyi kolaylaştırır:</strong> Recommendation engineler, müşteri verilerini toplamaya ve işlemeye yardımcı olur. Bu veriler, daha iyi öneriler yapmak ve müşteri tercihlerini daha iyi anlamak için kullanılır.</p><p><strong>6.Müşteri memnuniyetini arttırır:</strong> Recommendation engineler, kullanıcıların ilgi alanlarına uygun öneriler yaparak, müşteri memnuniyetini arttırır.</p><p><strong>Yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarını ölçeklendirebilme</strong>k için aşağıdaki yöntemlerden biri ya da birkaçı kullanılabilmektedir.</p><p>· <strong>Ölçeklenebilir yapı kullanımı:</strong> Ölçeklenebilir yapılar, veri miktarı ve trafik yoğunluğuna göre otomatik olarak ölçeklenebilen yapılardır. Bu yapılar, recommendation engine algoritmalarının performansını arttırmak için kullanılabilir. Örneğin, ölçeklenebilir veritabanı yapıları kullanılarak, veri miktarı arttıkça performansın düşmemesi sağlanabilir.</p><p>· <strong>Dağıtık sistemler kullanımı:</strong> Dağıtık sistemler, veri ve işlemleri birden fazla cihazda paylaşarak, performansı arttırmak için kullanılabilir. Bu şekilde, yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarının performansı dağıtık bir şekilde yönetilebilir ve ölçeklenebilir.</p><p>· <strong>Önbellekleme kullanımı:</strong> Önbellekleme, sıklıkla kullanılan verileri ve işlemleri önceden bellekte saklayarak, performansı arttırmak için kullanılabilir. Örneğin, recommendation engine algoritmaları tarafından sıklıkla kullanılan veriler önbellekte saklanarak, bu verilere erişim hızı arttırılabilir.</p><p>· <strong>Ölçeklenebilir veri yapıları kullanımı:</strong> Ölçeklenebilir veri yapıları, veri miktarı ve trafik yoğunluğuna göre otomatik olarak ölçeklenebilen veri yapılarıdır. Örneğin, NoSQL veri tabanları kullanılarak, veri miktarı arttıkça performansın düşmemesi sağlanabilir.</p><p>Bu listede yer alan yöntemler, yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarını ölçeklendirebilmek için kullanılabilecek yöntemlerdir.</p><p><strong>Yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarını ölçeklendirebilmesinin</strong> bazı <strong>avantajları</strong> da bulunmaktadır.</p><p><strong>Performans artışı:</strong> Ölçeklendirme, recommendation engine algoritmalarının performansını arttırarak, web sitelerinin daha hızlı çalışmasını sağlar. Bu sayede, kullanıcılar daha iyi bir kullanıcı deneyimi yaşar ve web sitelerine daha sık ziyaret etme olasılığı artar.</p><p><strong>Kullanıcı sayısı artışı:</strong> Ölçeklendirme, web sitelerinin daha fazla kullanıcıya açık olmasını sağlar. Bu sayede, web sitelerine daha fazla ziyaretçi çekebilir ve daha fazla satış yapabilir.</p><p><strong>İşlem hızı artışı:</strong> Ölçeklendirme, recommendation engine algoritmalarının işlem hızını arttırarak, kullanıcılara daha hızlı öneriler yapılmasını sağlar. Bu sayede, kullanıcılar web sitelerinde daha fazla zaman geçirir ve daha fazla satın alma yapma olasılığı artar.</p><p><strong>Verimliliğin artışı:</strong> Ölçeklendirme, recommendation engine algoritmalarının verimliliğini arttırarak, web sitelerine daha fazla kâr sağlar. Örneğin, daha hızlı çalışan recommendation engine algoritmaları sayesinde, daha fazla öneri yapılır ve daha fazla satış yapılır.</p><p><strong>Müşteri memnuniyetinin artışı:</strong> Ölçeklendirme, recommendation engine algoritmalarının müşteri memnuniyetini arttırarak, web sitelerine daha fazla ziyaretçi çekebilir ve daha fazla satış yapabilir. Örneğin, daha hızlı çalışan recommendation engine algoritmaları sayesinde, kullanıcılar daha hızlı öneriler alır ve daha fazla satın alma yapma olasılığı artar.</p><p>Yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarını ölçeklendirebilmesinin bazı avantajları olduğu kadar <strong>dezavantajları</strong> da bulunmaktadır.</p><p><strong>Maliyet artışı:</strong> Ölçeklendirme, web sitelerine ekstra donanım ve yazılım gerektirir. Bu sayede, maliyetler artar ve web siteleri için daha fazla yatırım gerekir.</p><p><strong>Yapılandırma zorluğu: </strong>Ölçeklendirme, web sitelerinin yapılandırmasını değiştirir. Bu sayede, web sitelerinin yapılandırılması daha zor hale gelir ve daha fazla zaman ve çaba gerektirir.</p><p><strong>Öğrenme eğrisinin yükselmesi:</strong> Ölçeklendirme, web sitelerinin öğrenme eğrisini yükseltir. Örneğin, web sitelerinin yapılandırılması değiştiğinde, yöneticiler ve geliştiriciler kendi aralarında yeniden öğrenmelidir.</p><p><strong>İşletme riskinin artışı:</strong> Ölçeklendirme, web sitelerinin işletme riskini arttırır. Örneğin, web sitelerinin yapılandırılması değiştiğinde, işletme riski artar ve web sitelerinin işletilmesi daha zor hale gelmektedir.</p><p><strong>Öğrenme maliyetinin artışı:</strong> Ölçeklendirme, web sitelerinin öğrenme maliyetini arttırır. Örneğin, web sitelerinin yapılandırılması değiştiğinde, yöneticiler ve geliştiriciler kendi aralarında yeniden öğrenmelidir. Bu sayede, öğrenme maliyeti artar ve web siteleri için daha fazla yatırım gerekmektedir.</p><p>Yukarıda belirtilen dezavantajlar, yüksek trafikli web sitelerinde kullanılan recommendation engine algoritmalarını ölçeklendirebilmesi sırasında karşılaşılabilecek dezavantajlardır. Ancak, ölçeklendirme, web sitelerine çeşitli yararlar sağladığı için süreçte bu kısımlar göz ardı edilebilmektedir.</p><p><strong>Recommendation enginelerin sıklıkla karşılaştığı problemleri</strong> sıralandırılacak olunursa aşağıdaki şekilde belirtebiliriz.</p><p>· <strong>Kötü öneriler:</strong> Kullanıcıların ilgi alanlarına uygun olmayan öneriler yapılması, recommendation enginelerinin verimliliğini azaltır ve kullanıcıların memnuniyetini düşürür. Bu problem, önerilen ürünlerin kalitesinin düşük olmasına ya da recommendation enginelerinin yeterli veri toplamamasına neden olabilir. Bu problemi çözmek için, önerilen ürünlerin kalitesinin yükseltilmesi ve recommendation enginelerinin veri toplamaya odaklanması gerekir.</p><p>· <strong>Önerilemeyen ürünler:</strong> Bazı ürünler, recommendation enginelerinin veri toplamaya odaklandığı ilgi alanlarına uymayabilir. Bu ürünler, recommendation enginelerinin önerilemez hale gelir ve bu da recommendation enginelerinin verimliliğini azaltır. Bu problemi çözmek için, recommendation enginelerine önerilemeyen ürünleri de eklemek gerekir. Bu sayede, recommendation enginelerinin önerdiği ürünlerin çeşitliliği arttırılır ve verimliliği artar.</p><p>· <strong>Veri eksikliği:</strong> Recommendation enginelerinin veri toplamaya odaklanması, veri eksikliğine neden olabilir. Örneğin, recommendation enginelerinin veri toplama algoritmaları hatalı çalışabilir ya da kullanıcıların veri paylaşımının az olması nedeniyle veri eksikliği oluşabilir. Bu problemi çözmek için, veri toplama algoritmalarının güncellenmesi ve kullanıcıların veri paylaşımının teşvik edilmesi gerekir.</p><p>· <strong>Önerilerin personalize olmaması:</strong> Recommendation enginelerinin kullanıcılara özel olarak hazırladığı öneriler olmamasıdır. Örneğin, tüm kullanıcıların aynı ürünleri önerilmesi, önerilerin personalize olmamasını gösterir. Bu durum, kullanıcıların memnuniyetini azaltır ve recommendation enginelerinin verimliliğini düşürür. Önerilerin personalize olmamasının nedenleri arasında, recommendation enginelerinin yeterli veri toplamaması ya da veri toplama algoritmalarının hatalı çalışması sayılabilir. Bu problemi çözmek için, recommendation enginelerinin veri toplamaya odaklanması ve veri toplama algoritmalarının güncellenmesi gerekir.</p><p><strong>Recommendation enginelerin sunduğu önerilerin açıklanabilir olması, sisteme çeşitli</strong> katkılar sağlamaktadır. Kullanıcı memnuniyetinin artışı, açıklanabilir öneriler, kullanıcıların önerilen ürünlerin nedenlerini anlamalarına yardımcı olur. Bu sayede, kullanıcılar önerilen ürünlerin daha anlamlı olduğunu düşünür ve memnuniyetleri artar. Verimliliğin artışı, açıklanabilir öneriler, recommendation enginelerinin verimliliğini arttırır. Örneğin, kullanıcılar önerilen ürünlerin nedenlerini anladıklarında, daha fazla satın alma yapma olasılığı artar. Bu sayede, recommendation enginelerinin verimliliği de artar. Açıklanabilir önerilerde işletme riskinin azalması, recommendation enginelerinin yanlış öneriler yapma olasılığının azalmasıdır. Örneğin, kullanıcılar önerilen ürünlerin nedenlerini anladıklarında, recommendation enginelerinin yanlış öneriler yapma olasılığı azalır. Bu sayede, işletme riski de azalır ve recommendation enginelerinin işletilmesi daha güvenli hale gelir. Bu durum, recommendation enginelerinin verimliliğini arttırır ve kullanıcıların memnuniyetini artırır. Açıklanabilir önerilerin işletme riskini azaltması, recommendation enginelerinin sürdürülebilirliğini de arttırır.</p><p><strong>Recommendation enginelerin sunduğu önerilerin açıklanabilir olmasının kullanıcıya katkıları</strong> bulunmaktadır. Kullanıcı memnuniyetinin artışı, açıklanabilir öneriler, kullanıcıların önerilen ürünlerin nedenlerini anlamalarına yardımcı olur. Bu sayede, kullanıcılar önerilen ürünlerin daha anlamlı olduğunu düşünür ve memnuniyetleri artar. Öğrenme sürecinin hızının artışı, açıklanabilir öneriler, kullanıcıların önerilen ürünler hakkında daha fazla bilgi edinmelerine yardımcı olur. Bu sayede, kullanıcılar öğrenme sürecinin hızını arttırır ve daha çabuk öğrenirler. Karar verme sürecinin hızının artışı, kullanıcıların önerilen ürünler hakkında daha hızlı karar vermeleridir. Örneğin, kullanıcılar önerilen ürünlerin nedenlerini anladıklarında, daha hızlı karar verirler ve daha az zaman harcarlar. Bu durum, kullanıcıların daha verimli olmalarına yardımcı olur ve onların işlerini daha hızlı yapmalarına yardımcı olur. Karar verme sürecinin hızının artışı, recommendation enginelerinin verimliliğini de arttırır ve kullanıcıların memnuniyetini artırır.</p><p><strong>Açıklanabilir öneri</strong>, recommendation enginelerinin kullanıcılara önerdiği ürünlerin nedenlerini açıkladığı önerilerdir. Örneğin, recommendation enginelerinin “Bu ürünü size önerebilirim çünkü benzer ürünleri satın aldınız ve bunları beğendiniz” gibi bir cümle kullanarak önerisini açıkladığı önerilere açıklanabilir öneri denir. Açıklanabilir öneriler, kullanıcıların önerilen ürünlerin nedenlerini anlamalarına yardımcı olur ve bu sayede kullanıcıların memnuniyetini artırır. Açıklanabilir öneriler ayrıca, recommendation enginelerinin verimliliğini arttırır ve işletme riskini azaltır.</p><p>Açıklanabilir öneriye örnekler verilecek olursa açıklama da belirtildiği şekliyle örnekler verilebilir.</p><p>“Bu ürünü size önerebilirim çünkü benzer ürünleri satın aldınız ve bunları beğendiniz.”</p><p>“Bu ürünü size önerebilirim çünkü diğer kullanıcılar tarafından yüksek puan almıştır.”</p><p>“Bu ürünü size önerebilirim çünkü sizin ilgi alanınıza uygun bir üründür.”</p><p>“Bu ürünü size önerebilirim çünkü diğer kullanıcılar tarafından benzer ürünlerle birlikte satın alındığı için uyumlu olma olasılığı yüksektir.”</p><p><strong>Recommendation enginelerin performansı</strong>, kullanılan algoritmaya göre farklılaşabilir. Örneğin, popülarite tabanlı algoritmalar yukarıda belirtilen şekilde genellikle daha basit ve hızlı çalışırlar ancak daha az özel öneriler sunabilirler. Öte yandan, öğrenme tabanlı algoritmalar daha karmaşık ve yavaş çalışabilirler ancak daha özel öneriler sunabilirler. Bu nedenle, recommendation enginelerinin performansını değerlendirirken, kullanılan algoritmanın özelliklerine de dikkat edilmesi gerekir. Recommendation enginelerinin performansını değerlendirirken aşağıdaki gibi ölçütler kullanılabilmektedir:</p><p>· <strong>Önerilen ürünlerin satın alınma oranı:</strong> Önerilen ürünlerin kaç tanesinin satın alındığını ölçen bir ölçüttür.</p><p>· <strong>Önerilen ürünlerin memnuniyet oranı:</strong> Önerilen ürünlerin kaç tanesinin memnun edici olduğunu ölçen bir ölçüttür.</p><p>· <strong>Önerilen ürünlerin reklam etkisi:</strong> Önerilen ürünlerin kaç tanesinin başka ürünleri satın almayı etkilediğini ölçen bir ölçüttür.</p><p>· <strong>Kullanıcı davranışları:</strong> Kullanıcıların recommendation enginelerine nasıl tepki verdiklerini ölçen bir ölçüttür.</p><p>· <strong>Önerilen ürünlerin doğruluk oranı:</strong> Önerilen ürünlerin kaç tanesinin doğru olduğunu ölçen bir ölçüttür.</p><p>Bir sonraki yazımda görüşmek üzere, sevgiyle kalın.🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b21cb132e362" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/recommender-system-b21cb132e362">Recommender System</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Clean Code: Bölüm 1]]></title>
            <link>https://medium.com/ltunes/clean-code-b%C3%B6l%C3%BCm-1-e52e5a0d8ae3?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/e52e5a0d8ae3</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Muhammed Unal]]></dc:creator>
            <pubDate>Sat, 21 Jan 2023 15:15:07 GMT</pubDate>
            <atom:updated>2023-01-21T15:15:07.735Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>Writing clean code is what you must do in order to call yourself a professional.There is no reasonable excuse for doing anything less than your best.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nGxtVoxNxC2fNqLL" /><figcaption>Photo by <a href="https://unsplash.com/@jstrippa?utm_source=medium&amp;utm_medium=referral">James Harrison</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Her yazılımcının mutlaka okuması ve benimsemesi gereken kitaplardan biri de <em>Robert C. Martin</em>’in yazdığı <em>“Clean Code: A Handbook of Agile Software Craftsmanship”</em> kitabıdır. Bu yazımda kitabın ilk bölümü olan “Clean Code” kısmına yer vermek istedim.</p><blockquote>“You are reading this book for two reasons. First, you are a programmer. Second, you want to be a better programmer. Good. We need better programmers.”</blockquote><p>Bu bölümde “Clean Code” kavramının ne olduğunu ve ne olmadığını, neden önemli olduğunu anlatır. Kitabın okuyan yazılımcıya neler katmayı amaçladığını anlatan bu bölümde ayrıca usta isimlerin, tabiri caizse bu işin kitabını yazmış isimlerin, Clean Code hakkında ki görüşlerine de yer verilmiştir.</p><p>Şimdi bu kısmı biraz daha detaylı inceleyelim.</p><blockquote>They are hoping that one day we will discover a way to create machines that can do what we want rather than what we say. These machines will have to be able to understand us so well that they can translate vaguely specified needs into perfectly executing programs that precisely meet those needs.<br>This will never happen. Not even humans, with all their intuition and creativity,have been able to create successful systems from the vague feelings of their customers.</blockquote><p>Son zamanlarda ChatGPT ile gündeme gelen, makinaların yani yapay zekaların insanların işini elinden alabilir mi sorusuna, en azından biz yazılımcılar için açıklık getirmiş ve yukarıda ki alıntıda da gördüğünüz gibi oldukça mantıklı argümanlar öne sürmüştür.</p><blockquote>LeBlanc’s law: Later equals never.</blockquote><p>İşi zamanında yetiştirebilmek için daha sonra düzeltirim diyerek birçok kez temiz kod kavramına aykırı, bazı prensipleri ihlal eden kodlar yazmışızdır ve büyük bir kısmına tekrar bakma fırsatı bulamamışızdır. <em>Robert C. Martin </em>ise bu konuyla ilgili nasıl ürün sahipleri/müşteriler takvime uygun ilerlemeyi savunuyorsa, bizim de aynı tutkuyla kodu savunmamız gerektiğini belirtiyor.</p><blockquote>Writing clean code requires the disciplined use of a myriad little techniques applied through a painstakingly acquired sense of “cleanliness.”This “code-sense” is the key.</blockquote><blockquote>Bad code tries to do too much, it has muddled intent and ambiguity of purpose. Clean code is focused.</blockquote><p>Kötü kodu tanımlarken, çok fazla şey yapmaya çalıştığını ve tek bir amaca hizmet etmediği için “amaç belirsizliği” taşıdığını belirtmiş. Temiz kodun ise çok sayıda küçük tekniğin disiplinli bir şekilde kullanılması ile sağlanacağını dile getirmiş. SOLID prensiplerinin önemini de bir kez daha anlamış olduk. <br>Burada üzerine düşünmemiz gereken bir başka kavram ise “code-sense”. Bu algının bazılarımızda doğuştan olduğunu, bazılarımızda ise sonradan çalışarak elde edebileceğimiz bir özellik olduğunu söylemiş ve bu özellik sayesinde bir kodun iyi ya da kötü olduğunu anlamayı sağlayacağını, hatta kötü kodu nasıl iyi bir koda dönüştürüleceği konusunda da yol gösterebileceğini belirtmiştir. “</p><p>Temiz kod yazan bir yazılımcı, zarif bir şekilde kodlanmış bir sistem olana kadar boş bir ekranı bir dizi dönüşümden geçirebilen bir sanatçıdır açıklaması ile de temiz kod yazan yazılımcının gözündeki değerini göstermiştir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/421/1*6wQ59Aha35NkBk6JbRjr8Q.png" /><figcaption>“Clean Code: A Handbook of Agile Software Craftsmanship”</figcaption></figure><p>Başlangıçta temiz olarak yazılmayan projelerde, verimlilik zamanla sıfıra kadar düşeceğini, bir çıkmaza girileceğini belirtmiştir. Bunun ayrıca hem projeye sonradan dahil olan yazılımcılar için, hem de projenin başından itibaren bulunan yazılımcılar için, hata çözümünde veya yeni bir özellik geliştirme aşamasında çok fazla yavaşlatacağını ve bunun gibi birçok dezavantaja sebep olacağını da eklemiştir. Kitapta da belirttiği gibi, eğer 2–3 yıllık bir tecrübeye sahipseniz çok büyük bir ihtimalle bununla karşılaşmışsınızdır. Tabi bunlara ek olarak, projede çıkılmaz bir noktaya gelinebileceğini, bununla beraber yeniden yazmak için ek kaynak ihtiyacı, var olan projenin bakımı için yine kaynak ihtiyacı ve uzun bir süre gerektireceğini de belirtmiş ki bunlar bildiğiniz gibi oldukça maliyetli işlerdir.</p><p>“Clean Code” kavramı hakkında çok iyi bilinen ve çok deneyimli programcıların ne düşündüklerine de kitapta yer verilmiştir. Bunlardan birkaçını da yorum katmadan olduğu gibi ekliyorum ve yorumlamayı size bırakıyorum.</p><blockquote><strong>Bjarne Stroustrup, <br>inventor of C++ and author of The C++ Programming Language</strong><br>I like my code to be elegant and efficient. The logic should be straightforward to make it hard for bugs to hide, the dependencies minimal to ease maintenance, error handling complete according to an articulated strategy, and performance close to optimal so as not to tempt people to make the code messy with unprincipled optimizations. Clean code does one thing well.</blockquote><blockquote><strong>Grady Booch, <br>author of Object Oriented Analysis and Design with Applications.</strong><br>Clean code is simple and direct. Clean code reads like well-written prose. Clean code never obscures the designer’s intent but rather is full of crisp abstractions and straightforward lines of control.</blockquote><blockquote><strong>Michael Feathers, <br>author of Working Effectively with Legacy Code.</strong><br>I could list all of the qualities that I notice in clean code, but there is one overarching quality that leads to all of them. Clean code always looks like it was written by someone who cares. There is nothing obvious that you can do to make it better. All of those things were thought about by the code’s author, and if you try to imagine improvements, you’re led back to where you are, sitting in appreciation of the code someone left for you — code left by someone who cares deeply about the craft.</blockquote><blockquote><strong>Ron Jeffries,<br>author of Extreme Programming Installed and Extreme Programming Adventures in C#</strong><br>In recent years I begin, and nearly end, with Beck’s rules of simple code. In priority order, simple code:<br>• Runs all the tests;<br>• Contains no duplication;<br>• Expresses all the design ideas that are in the system;<br>• Minimizes the number of entities such as classes, methods, functions, and the like.<br>…</blockquote><p>Son olarak Bob amcanın Clean Code’u nasıl açıkladığına da bakalım;</p><blockquote><strong>Robert C. Martin</strong><br>What about me (Uncle Bob)? What do I think clean code is? This book will tell you, in hideous detail, what I and my compatriots think about clean code. We will tell you what we think makes a clean variable name, a clean function, a clean class, etc. We will present these opinions as absolutes, and we will not apologize for our stridence. To us, at this point in our careers, they are absolutes. They are our school of thought about clean code.</blockquote><p>Tabii ki açıklaması bu kadar kısa değil, kalan kısmına kitaptan bakmanızı tavsiye ederim :). Bu yazımda ilk bölümden altını çizdiğim, kendime not olarak aldığım kısımları sizinle de paylaşmak istedim.</p><p>Bu makaleyi sadece ilk bölüme ayırmak istedim çünkü bir şeylerin nasıl yapıldığını bilmek kadar, bildiğimizi ne kadar uyguladığımız da çok önemlidir. Yani demek istediğim temiz kod yazmayı bilmek yetmez, bunu benimsemek, olabildiğince taviz vermemek de gerekir. Bir insan gömleğinin düğmelerini yanlış iliklediğinde nasıl onu düzeltmeden dışarı çıkmıyorsa, biz yazılımcılar da kodumuza Clean Code disiplinlerini uygulamadan işimizi bitirmemeye özen göstermeliyiz. Tabii bu hemen kazanılabilecek bir alışkanlık değil, bunun için Bob amcanın deyimiyle savaşmamız gerekecek.</p><p>Okuduğunuz için teşekkür ederim, sonraki yazımda görüşmek üzere :)</p><p>Sağlıcakla kalın…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Z_oA6OWJdjMc9Y-q" /><figcaption>Photo by <a href="https://unsplash.com/@hannynaibaho?utm_source=medium&amp;utm_medium=referral">Hanny Naibaho</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e52e5a0d8ae3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/clean-code-b%C3%B6l%C3%BCm-1-e52e5a0d8ae3">Clean Code: Bölüm 1</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Jest Kullanarak React.Js Unit Test Yazmak]]></title>
            <link>https://medium.com/ltunes/jest-kullanarak-react-js-unit-test-yazmak-6193bb1ca875?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/6193bb1ca875</guid>
            <category><![CDATA[unittest]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[jest]]></category>
            <dc:creator><![CDATA[Birkan Özcan]]></dc:creator>
            <pubDate>Thu, 12 Jan 2023 07:15:51 GMT</pubDate>
            <atom:updated>2023-01-12T07:15:51.563Z</atom:updated>
            <content:encoded><![CDATA[<p>Anlatacaklarıma başlamadan önce biraz Jest’e değinmek istiyorum.</p><p>Jest facebook firmasının geliştirmiş olduğu bir Javascript test kütüphanesidir. React kodunu test etmek için kullanılmasının yanında herhangi bir Javascript kodunu test etmek içinde kullanılabilir.</p><p>Jest kullanarak fonksiyonlarımızı nasıl test edebiliriz?</p><p>Boş bir react projesi oluşturduğumuzda proje içerisinde bu test kodları aslında kurulu şekilde gelmektedir. Aşağıya package.json örneğini ekledim. Terminal içerisine ‘npm run test’ dediğimizde test uzantılı kodlarımız test edilmeye hazır olacaktır. Proje içerisinde ‘App.Test.js’ hazır geliyor; biz sadece bu test uzantılı kodları çoğaltıp kendi kodlarımızı ekleyeceğiz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DKZX-o8l0LVv_KCvHmiq1Q.png" /></figure><p>Testimizi yazmaya başlayalım şimdi fonksiyonumuzu test edeceğiz. Ana dizine <strong>new.js</strong> adında bir sayfa oluşturalım içerisine aşağıdaki kodları ekleyelim. Bu testte amacımız string ifademizi büyütülmüş olarak geriye döndermeyi amaçlıyoruz.</p><pre>const new=(param)=&gt;{<br>    return param.toUpperCase()<br>}<br>module.exports={new}</pre><p>sonra bir sayfa daha oluşturalım ve bu sefer uzantısını değiştirelim. <strong>new.test.js</strong> içerisine aşağıdaki kodları ekleyelim.</p><pre>const {new}=require(&#39;./new&#39;)<br><br><br>test(&#39;merhaba = MERHABA&#39;,()=&gt;{<br>    expect(new(&#39;merhaba&#39;)).toBe(&#39;MERHABA&#39;)<br>})</pre><p>bu kodu açıklayacak olursak test callback function içerine “<strong>expect</strong>” yani gerçekleşmesini beklediğimiz durum, “<strong>toBe</strong>” ise sonuç yani <strong>merhaba</strong> durumunun <strong>MERHABA</strong>’ya dönüşmesini bekliyoruz diyebiliriz.</p><p>Şimdi gelelim yazdığımız testin sonucuna. Eğer testimiz başarılı ise terminalde Yeşil renk düzeninde “passed” uyarısını alacağız. Yazdığımız testte bir hata var ise “failed” uyarı kodunu alacağız.</p><pre>const {new}=require(&#39;./new&#39;)<br><br>test(&#39;merhaba = MERHABA&#39;,()=&gt;{<br>    expect(new(&#39;merhaba&#39;)).toBe(&#39;MERHABA&#39;)<br>})</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C1favEvuTvqdu-okcR4AOg.png" /></figure><p>sonuç başarılı çünkü string ifademiz büyütülmüş şekilde geriye döndü.</p><pre>const {new}=require(&#39;./new&#39;)<br><br>test(&#39;merhaba = MERHABA&#39;,()=&gt;{<br>    expect(new(&#39;merhaba&#39;)).toBe(&#39;mERHABA&#39;)<br>})</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*q-kBGFKnZK9_aZYa0K_GZA.png" /></figure><p>sonuç hatalı toBe içerisinde mERHABA şeklinde yazdıldığı için hata aldı.</p><p>Unit test yazılarıma devam edeceğim umarım faydalı olur benim ve okuyacak olanlar için :)</p><p>Jest hakkında daha detaylı bilgi almak isteyenler için <a href="https://jestjs.io/"><strong>https://jestjs.io/</strong></a><strong> </strong>linki buraya bırakıyorum.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6193bb1ca875" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/jest-kullanarak-react-js-unit-test-yazmak-6193bb1ca875">Jest Kullanarak React.Js Unit Test Yazmak</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Release Information Mailing]]></title>
            <link>https://medium.com/ltunes/release-information-mailing-9de1b04bea02?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/9de1b04bea02</guid>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[mailing]]></category>
            <category><![CDATA[azure-devops]]></category>
            <category><![CDATA[azure]]></category>
            <dc:creator><![CDATA[lTunes]]></dc:creator>
            <pubDate>Tue, 03 Jan 2023 21:40:35 GMT</pubDate>
            <atom:updated>2023-01-04T06:04:44.914Z</atom:updated>
            <content:encoded><![CDATA[<p>lTunes DevOps Chapter mailing süreçleri …</p><p>Her gün gelişip büyüyen teknoloji dünyasında biz de ekip olarak gelişmeyi ve yeni şeyler deneyimlemeyi sevmekteyiz. ❤ lTunes DevOps Chapteri olarak deneyimleyip, öğrenip çokça faydasını gördüğümüz bir başlığı paylaşmak isteriz,<strong>Release Information Mailing</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2SjwM8KYLip4235N.jpg" /></figure><p><strong>DevOps </strong>genel olara nedir diye bakacak olursak;</p><ul><li>“<strong>DEV</strong>” genelde yazılım geliştiriciler için kullanılan bir terimdir. Developer kısaltması olarak kullanılmaktadır. Ancak gerçek dünyada “dev” yazılım geliştirme için çalışan herkesi kapsamaktadır.</li><li>“<strong>OPS</strong>”, “DEV”e göre daha geniş bir kapsam olarak, sistem mühendisleri, sistem yöneticileri, veri tabanı yöneticileri, network mühendisleri, güvenlik uzmanları ve daha birçok değişik alt disiplinler için kullanılmaktadır.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*ku8BCzYh7IY_bwot.png" /><figcaption>DevOps Yaşam Döngüsü</figcaption></figure><p>Genel bir tanım olarak aslında <strong>DevOps</strong>, IT bölümlerinin kendi içerisinde etkili iletişim üzerinden birbiri ile çalışmasıdır.Kültürel bir yaklaşım olmak ile beraber, yazılımcıların sistemlerinin çalışması için kullandığı tekniklerin , sistem ekipleri tarafından da kullanılmasıdır.Teknikler, kaynak kodu kontrolünden , Agile geliştirme süreçlerine kadar uzanmaktadır.</p><p>lTunes DevOps Chapteri olarak uygulamalarımızın DevOps metrikleri ile yönetip, kurgulamaktayız. Bu süreçlerde Doğuş Teknoloji içerisindeki ilgili ekipler ile koordineli bir şekilde çalışmalarımızı yürütmekteyiz. Yürüttüğümüz süreçlerin en önemlilerinden <strong>CI/CD</strong> sürecinin <strong>Continuous Deployment</strong> adımı.</p><p>Uygulamaların geliştirme adımlarını tamamladıktan sonra ortamlara sürekli teslimatını sağladığımız deployment adımlarında standart olması ve sağlıklı bir şekilde süreçlerin ilerletilmesini sağlamak önemli rollerimizden birisidir.</p><p>Gelin birlikte lTunes DevOps Chapter olarak bu standartlar içerisine yeni eklediğimiz Release Information Mailing’den bahsedelim.</p><p>Continuous Deployment adımı kritikliği sebebiyle Doğuş Teknoloji içerisinde birçok ekibi ilgilendiren bir adım. Bu süreçte bu adımların başlatıldığı ve tamamlandığı bilgisini Azure Devops bir mailing sistemi üzerinden sağlıyor fakat bu özellik kişiselleştirme imkanı sunmadığı ve isterlerimizi karşılamadığı için alternatif çözümler aramak için çalışmalar yapılmıştır. Özverili çalışma ve araştırmalar sonucunda istediğimiz sonuç için ilerlenecek adımlar bulunmaktadır.</p><p>Aslında bu adımın yapılması için bir çok farklı alternatif bulunmaktadır. Google veya Outlook üzerinden istenilen mailing işlemleri sağlanılabilmekte olup, DevOps Chapter olarak aldığımız karar ile birlikte ilgili süreci agent üzerinden PowerShell scripti ile smtp server erişilerek ilerletilmiştir.</p><p>Smtp server erişim süreçleri tamamlandıktan sonra, release adımında mail gönderimi sağlanabilmesi için standart layout uygulması adına bir variable group oluşturulmuştur. Süreçte standart olması ve bir standart ile ilerlenmesi süreçte bize fayda sağlamaktadır.</p><p>Oluşturulan variable group’da aşağıdaki bilgiler yer almaktadır;<br>* Gönderici adresi<br>* Gönderilecek mail adresleri (TO, CC, BCC)<br>* Konusu<br>* HTML Body<br>* SMTP Server<br>* Mail Önem Derecesi (HIGH, NORMAL, LOW)</p><p><strong>NOT</strong> : BCC kullanımı uygulama özelinde değişkenlik gösterebilmektedir.</p><p>Gönderilecek mail adresleri standardı, süreçten haberdar olmasını istediğimiz kişilere gönderilecek şekilde düzenlenmesi gerekmektedir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1008/1*JMvriFHiN0u2z2gUN8Mqbg.png" /><figcaption>Variable Group Oluşturulması</figcaption></figure><p>Variable group oluşturulduktan sonra, mail gönderimi sağlamak istediğimiz uygulamamızın Release adımına geçilmektedir.<br>Örnek mail template şablonu aşağıdaki gibidir;</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html lang=&quot;en&quot; xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:o=&quot;urn:schemas-microsoft-com:office:office&quot;&gt;<br>&lt;head&gt;<br>&lt;meta charset=&quot;UTF-8&quot;&gt;<br>&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&gt;<br>&lt;meta name=&quot;x-apple-disable-message-reformatting&quot;&gt;     <br>&lt;/head&gt;<br>&lt;body&gt;<br>&lt;h1&gt;##domain##&lt;/h1&gt;<br>&lt;p&gt;Merhaba&lt;/p&gt;<br>&lt;p&gt;&lt;strong&gt;##domain##&lt;/strong&gt; uygulamamızda versiyon geçişi &lt;strong&gt;##startTime##&lt;/strong&gt;&amp;#39;de başlatılacaktır&lt;/p&gt;<br>&lt;p&gt;&lt;strong&gt;##endTime##&lt;/strong&gt;&amp;#39;e kadar gelebilecek alarmlar dikkate alınmayabilir&lt;/p&gt;<br>&lt;p&gt;Bilgilerinize sunarız&lt;/p&gt;<br>&lt;p&gt;İyi çalışmalar&lt;/p&gt;<br>&lt;p&gt;L-Tunes DevOps&lt;br/&gt;Doğuş Teknoloji&lt;/p&gt;                                        <br>&lt;/body&gt;<br>&lt;/html&gt;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*4uir1unazrkGaYa0A0BucA.png" /><figcaption>Release</figcaption></figure><p>Variables sekmesi altından erişilen Variable Groups alanından mail gönderiminde kullanılacak olan uygulamamızın daha önce oluşturulmuş olan layout kullanımını gerçekleştirebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/974/1*ZTRpC1XCfXIxNrreJmw70g.png" /><figcaption>Variable Group Ekleme</figcaption></figure><p>Smtp server’a firewall erişim izni olan agentımıza scripti, powershell task ile ekleyebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wu_dARkYZgFkk1A0CWQsFg.png" /></figure><p>Release aşamasında Agent Job kısmından PowerShell eklenerek ilerlenebilmektedir. Aşağıdaki görselde belirtilen şekilde script eklenecektir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qanvqSkRJi8nWrqefLflNg.png" /><figcaption>PowerShell Script</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t6Y5ZKPDULC4hHcrw0ecwQ.png" /><figcaption>Script Eklenilmesi Gereken Alan</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pnIZGVCSFlfmZ0HLWIaU9w.png" /><figcaption>Send Information Mail</figcaption></figure><p>İlgili alana script eklenmiştir.Olası bir şekilde mail gönderiminde sorun yaşanması durumunda Continue on error aktif edilerek, release akışının bloklanması engellenerek devamlılığı sağlanmıştır.</p><p><strong>NOT: </strong>Kodlardaki domain variable’ı, pipeline variables alanında yer alan variable değişkeninden alınmaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*J9Si7QkF260_deh-LoNGtw.png" /><figcaption>Pipeline Variables Domain Tanımı</figcaption></figure><p>İlkleri birlikte yapıp öğrenmeyi hiç bırakmadan, yeni bir yazımızda görüşmek dileğiyle, keyifli okumalar dileriz.</p><p>lTunes DevOps’dan sevgilerle … ❤</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9de1b04bea02" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/release-information-mailing-9de1b04bea02">Release Information Mailing</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Serüvenim — Babel Js]]></title>
            <link>https://medium.com/ltunes/react-ser%C3%BCvenim-babel-js-2100f2e26af0?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/2100f2e26af0</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[babeljs]]></category>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Tue, 27 Dec 2022 09:03:29 GMT</pubDate>
            <atom:updated>2022-12-27T09:01:10.696Z</atom:updated>
            <content:encoded><![CDATA[<h3>React Serüvenim — Babel Js</h3><p>bizimkisi bir babel hikayesi …</p><p>React dünyasına giriş sağladıktan sonra bize hangi aşamalarda neler kolaylık sağlar diye başladığımız serüvende karşımıza Babel Js çıktı …</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*YUr14ZhINDroYv22" /></figure><p><strong>Peki nedir bu Babel JS ?</strong></p><blockquote>Babel, çoğunlukla ECMAScript 2015+ kodunu eski JavaScript motorları tarafından çalıştırılabilen geriye dönük uyumlu JavaScript koduna dönüştürmek için kullanılan ücretsiz ve açık kaynaklı bir JavaScript dönüştürücüsüdür. Web geliştiricilerinin dilin en yeni özelliklerinden yararlanmasına olanak tanır.</blockquote><p>babeljs.io web sitesi üzerinden yeni özelliklerine ve dokümanlarına erişim sağlayabilmekteyiz.</p><p>Template içeriğini oluşturmak ve tüm JS yeni özelliklerini anlayıp yorumlayabilmesi için çevrilmesi noktasında destek sağlayan babel, tüm tarayıcılarda çalışmasına olanak sağlamaktadır. Type script ve yeni JS için de kullanılmaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wdmMqyUfbwx4ZcOiyFRWQQ.png" /><figcaption>babeljs.io</figcaption></figure><p>Presets olarak hangisini kullanacaksak ona göre kurulum yapmamız gerekmektedir. İlk öncelikli adım olarak setup kısmından kurulumunu gerçekleşmemiz gerekmektedir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TqCHsvuHt2DNQfxW7NErpQ.png" /><figcaption>web sitesi — setup</figcaption></figure><p>Terminal üzerinden;</p><blockquote>npm init — yes</blockquote><p>denilerek package.json dosyamız oluşturulur ve hangi paketlerin kullanılacağını bu kısımdan görebiliriz.</p><blockquote>npm install — save-dev @babel/core @babel/cli</blockquote><p>ile yüklememizi gerçekleştirip ilgili kısımları package.json dosyamızdan da teyit edebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cx_apYJZlMA02mm27a5-2A.png" /></figure><p>Presets için kurulumları da hangi framework için yükleme sağlayacaksak seçimimiz bulunmaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OPtxdCwk1aUYoyg9q9KOnQ.png" /></figure><p>React için ilgili komutlarımız;</p><blockquote>npm install — save-dev @babel/preset-env<br>npm install — save-dev @babel/preset-react</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LxExMPDbkBuwi1t1zSWjgA.png" /><figcaption>babel/preset-react</figcaption></figure><p>Projemiz altında .babelrc uzantılı bir dosya oluşturarak, projemiz altında hangi presetsleri kullandığını belirtebilmekteyiz.</p><pre>{<br>   &quot;presets&quot; : [&quot;@babel/preset-env&quot;, &quot;@babel/preset-react&quot; ]<br>}</pre><p>Aynı zamanda ilgili komut için sürekli çalıştırmamıza gerek kalmadan package.json için de de tanımlayabiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hqs_6F-SOzZP0_9IDfIUNA.png" /><figcaption>package.json</figcaption></figure><p>Sonraki yazımda görüşmek dileğiyle, sevgiler. 🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2100f2e26af0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/react-ser%C3%BCvenim-babel-js-2100f2e26af0">React Serüvenim — Babel Js</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Azure Board State]]></title>
            <link>https://medium.com/ltunes/azure-board-state-9570d9357398?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/9570d9357398</guid>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[board]]></category>
            <category><![CDATA[azure-devops]]></category>
            <category><![CDATA[agile-methodology]]></category>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Tue, 20 Dec 2022 20:58:56 GMT</pubDate>
            <atom:updated>2022-12-20T21:03:02.815Z</atom:updated>
            <content:encoded><![CDATA[<p>şeffaflık ve görselleştirme en önemli kriterlerimiz …</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/930/0*CmzfjMKehJHFnxCp" /></figure><p>Agile çalışma prensibi ve özellikle de Kanban Methodolojisi ile ilerliyorsanız, “<strong>Görselleştirme</strong>” en önemli kısımlardan birisi.</p><p>Board süreçlerimizi özelleştirmek için kaleme aldığım yazı linkine bakmak isterseniz , ekliyorum.🚀</p><p><a href="https://medium.com/ltunes/azure-boardda-work-item-type-%C3%B6zelle%C5%9Ftirebilir-miyiz-6695a99b4d81">Azure Board’da Work Item Type Özelleştirebilir Miyiz?</a></p><p>Özelleştirdiğimiz ve ekibimize göre süreçlerini ve tiplerini belirlediğimiz kısımlar ile birlikte her bir sürecimizin kolaylaştırılması ve manuel olmaktan çıkıp otomatize hale getirmek her daim hedefimiz olmuştur.</p><p>Bununla birlikte board süreçlerinde bu kadar imkan varken, bazı statelerin otomatik güncellenmesini sağlayabilir miyiz dedik ve araştırmaya koyulduk.</p><p>Cevap veriyoruz: <strong>EVET</strong>.</p><p>Azure üzerinden process kısmında kendi processimizde gerekli güncellemeleri yapıp yeni alanlar eklediğimiz ve özelleştirdiğimiz kısımlardan tamda bu ihtiyacımızı karşılamanın mümkün olduğunu gördük.</p><p>Process kısmından var olan madde tiplerimizden hangisinin geçişinin sağlandığında bu özelliği eklemek istiyorsak eğer, o madde tiplerinde states kısmına gelmemiz yeterli olacaktır.</p><p>Buradaki en önemli kısımlardan biri ihtiyacımız olan şey; madde development aşaması geçtikten sonra pull request çıktığımızda ilgili maddemiz seçilmişse o madde bir sonraki statüye otomatik olarak geçmesini sağlamaktı.</p><p>Pull request çıktığımızda complete kısmında da ilgili kısmın seçili olmasını atlamamız gerekmektedir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/565/1*6BEaZ_0SCQAnLmZySC2TsQ.jpeg" /></figure><p>Çok basit ancak uzun uğraşlar sayesinde eldiğimiz bilgi ile birlikte bunu sadece stateslerde resolved kısmında ilk state almamız yeterli oldu.</p><p>Şöyle ki; biz maddemizi development statüsünden test statüsüne geçirmek istemekteydi. Tam da bu aşamada resolved kısmına ilk sıraya TEST eklememiz yeterli oldu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2bETVYaBKO1ZO3M8MiBP5Q.png" /><figcaption>States</figcaption></figure><p>Uzun soluklu bir araştırma ancak etkili bir çözüm, bu yolda birlikte emek harcadığımız <a href="https://medium.com/u/3bbb811eac8">Hanifi Tayfur</a> emeklerine de sonsuz teşekkürler 🙏😊</p><p>Sonraki yazımda görüşmek dileğiyle, sevgiler. 🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9570d9357398" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/azure-board-state-9570d9357398">Azure Board State</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Serüvenim — Hello React]]></title>
            <link>https://medium.com/ltunes/react-ser%C3%BCvenim-hello-react-f0bf41e0ff20?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/f0bf41e0ff20</guid>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Mon, 19 Dec 2022 07:47:32 GMT</pubDate>
            <atom:updated>2022-12-18T16:00:26.575Z</atom:updated>
            <content:encoded><![CDATA[<h3>React Serüvenim — Hello React</h3><p>Yeni bir dünyaya merhaba demek …</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a4noNAZRnJ1rXh93" /></figure><p>React serüvenimizde ilk girişleri kurulumlarımızı tamamladıktan sonra hızlıca kollarımızı sıvayabiliriz :) Her uygulama kodlama öğrendiğimizde başladığımızda ilk adım hello world yazdırmaktır rutinleri bozmadan biz de hızlıca bir hello react diyelim 🌸</p><p>Kurulumlar kısmında bir proje açarak bu proje üzerinde kısa yollarla html kod blokları ve bloklar ile ilerleme kısmına kadar gelmiştik. Bu adımda o bloklarda react entegre edip ilerleme adımına bakacağız.</p><p><a href="http://reactjs.org/">Reactjs.org</a> sayfası üzerinden react ile ilgili tüm bilgilere erişebilmekteyiz. İlk adımda açmış olduğumuz ve hali hazırda çalıştığımız sayfamızda reactjs.org sayfasında olan aşağıda belirtilen kod bloğunu almaktayız.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WvTr1srFYBSPiQ3Xx38X0g.png" /><figcaption>Dokümanlar</figcaption></figure><p>JS ile hızlıca hello word yazdırmak için;</p><pre><br>var root = document.getElementById(&#39;root&#39;);<br>var template = &lt;h1&gt;Helllo React &lt;/h1&gt;;</pre><p>React ;</p><pre>var root = document.getElementById(&#39;root&#39;);<br>var template = React.createElement{<br>&#39;h1&#39;,<br>null,<br>&#39;Hello World&#39;<br>};<br><br>ReactDOM.render{template,root};</pre><p>React bize sanal dom yapısı oluşturmaktaydı, bu sebeple ilgili kısımda h1 etiketleri için tırnak kullanmamıza gerek kalmamaktadır.</p><p>İlgili kod blokları ile ilgili kısım aşağıdaki gibidir;</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1ry8NX0-CuFGyZB0CqDXdA.png" /><figcaption>Hello World</figcaption></figure><p>Bu yazımızda merhaba dedikten sonra bir sonraki yazımızda babel kullanımı ve dokümanlarından bahsederek sonraki aşamada da koşullu ifadelere geçiş sağlayabiliriz.</p><p>Sonraki yazımda görüşmek dileğiyle, sevgiler. 🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f0bf41e0ff20" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/react-ser%C3%BCvenim-hello-react-f0bf41e0ff20">React Serüvenim — Hello React</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Do-Veloper: kocaman bir yetenek hikayesi]]></title>
            <link>https://medium.com/ltunes/do-veloper-83829f6ae37f?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/83829f6ae37f</guid>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Tue, 13 Dec 2022 07:36:22 GMT</pubDate>
            <atom:updated>2022-12-13T11:13:11.615Z</atom:updated>
            <content:encoded><![CDATA[<p>Kocaman bir ekiple bir yetenek hikayesi …</p><p>Doğuş teknoloji lTunes Tribe olarak büyük ve geniş bir ekip olarak ilerlemekteyiz. Bu büyük ve geniş ekibin içerisinde 50+ genç yeteneğimiz de bulunmaktadır. Projelerin her bir süreçlerini deneyimlemeleri ve tecrübe edinmeleri adına birlikte bir yolculuğa başladık.</p><p><strong>Yolculuğumuzun adı:</strong> Do-veloper ❤</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/297/1*5bSpx35L3HtgZaDARFaNYA.png" /></figure><p>Tüm aşamaları isimlendirmesi, tasarımı ve birçok sürecinde her bir genç yeteneğimizin emeği bulunmakta… Peki bu proje neye hizmet ediyor ?</p><p>Ekibimiz büyük ve geniş şu an 120+ kişilik bir ekipte yer almaktayız. Her birimiz birden fazla yeteneğe sahip ve farklı yetenekler için kendimizi geliştirmek isteyen kişileriz. Yeteneklerimizin ve hobilerimizin yer aldığı bir platform olsa, hem web , hem mobil üzerinden erişim sağlasak nasıl olur diye düşündük ve oldu ❤</p><p>Yetenekler ve deneyimler, bu deneyimler ile gelişmek en önemli. Bu bakış açısıyla yeni bir yetkinlik, yeni bir dil öğrenmek isteyen biri ya da aynı yetenek bazında ilerleyen kişilerin gruplandırmasını sağlayarak ilerlemek ve birbirimize minik dokunuşlarda bulunmamıza imkan sağlamaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/243/1*RFFPiKAeKcuwD-wRbY_o9w.png" /><figcaption>Giriş Ekranımız</figcaption></figure><p>Her standart uygulamada olduğu gibi uygulamamız içerisinde de giriş, kayıt ol, şifremi unuttum ekranlarımız bulunmaktadır. Bu ekranlardan giriş yaptıktan sonra bizleri ana sayfa ve profil sayfalarımız karşılamaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/244/1*I65CRiXctD0bL2X62Hk_2A.png" /><figcaption>Profil Ekranımız</figcaption></figure><p>Yetkinliklerimizi eklerken, ekip yetkinlik oranlarımızı chart üzerinden görme imkanı da bulabilmekteyiz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/328/1*wxrlTFE5UDqN27MXJP7K1w.png" /><figcaption>Yetkinlik Ekranımız</figcaption></figure><p>Bununla birlikte yeteneklerimizi ekleyip, güncelleyip yeni yetenekler ekleyip ilgili yetenekler ile ilgili hangi seviyede olduğumuz gibi kısımları da ekleyebilmekteyiz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/316/1*l8KE33j82Ij6DvZBXgaWoA.png" /><figcaption>Yetkinlik Seviye Ekranımız</figcaption></figure><p>Bu adımlar yapılırken PO’larımız süreç yönetimi, proje yönetimi, ortam kurulumları ve deadline kısmını tecrübe ederken, yazılımcılarımız tasarım, kodlama, mimari , bug fix gibi süreçlerde kendilerini geliştirme imkanı buldular.</p><p>Her birinin emeğine sağlık, uygulamamız ilk önce intranette kendi ekibimiz içerisinde kullanılacak olup, sonra belki farklı süreçlerde kullanıcılarına açılma fırsatı bulur kim bilir ❤</p><p>Bir sonraki serüvenimizde görüşmek üzere, keyifli okumalar dilerim.🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=83829f6ae37f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/do-veloper-83829f6ae37f">Do-Veloper: kocaman bir yetenek hikayesi</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Serüvenim — Kurulumlar]]></title>
            <link>https://medium.com/ltunes/react-ser%C3%BCvenim-kurulumlar-41de2661c02e?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/41de2661c02e</guid>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Kübra Balaban]]></dc:creator>
            <pubDate>Tue, 29 Nov 2022 06:49:46 GMT</pubDate>
            <atom:updated>2022-11-22T19:42:00.174Z</atom:updated>
            <content:encoded><![CDATA[<h3>React Serüvenim — Kurulumlar</h3><p>minik bir dokunuşla tüm adımlar …</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*WWvpUj0XkBjZmNaW.jpg" /></figure><p>React Serüvenim başlığı ile çıktığım bu yolda ilk yazımda react nedir ve nerelerde kullanılır başlıklarına yer vermiştim. Bu yazımızda kurulumlar nasıl yapılır neler nasıl kullanılır gibi başlıklar ile ilerleyeceğiz.</p><p>O zaman beklemeden haydi <strong>başlayalım</strong> !</p><p>Kurulum aşamasında ilk olarak node paketlerini yükleyerek başlayabiliriz.Node paketleri için <strong>nodejs.org </strong>web sitesinden kendi işletim sistemimize uygun olan kısmı indirip kurmamız yeterli olacaktır. Kurulum öncesinde <strong>Node kurulumundaki amac</strong>a değinecek olursak; client paketlerini projede kullanılması ve paketlerin npm paketleri aracılığılıyla komut satırıyla bilgisayarımıza indirmemize fayda sağlamaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I4dImuPYAZvCqt5lFWINlA.png" /><figcaption>nodejs.org</figcaption></figure><p>İlgili web site üzerinden ya <strong>önerilen</strong> ve çoğu kullanıcının kullandığı versiyon veya <strong>son versiyonu</strong> işletim sistemimize uygun olarak seçerek indirme ve kurulumu gerçekleştirmekteyiz.</p><p><strong>Peki kurulum sonrası versiyonu nasıl kontrol ederim?</strong></p><p>Mac cihamızda terminal, windows cihazlarımızda cmd veya powershell aracılığı ile komut çalıştırma ekranına ulaşmaktayız.</p><p>Yüklenen node paketlerimizin versiyon bilgisi için;</p><blockquote>node -v</blockquote><p>Yüklenen npm paketlerimizin versiyon bilgisine ulaşmak için de</p><blockquote>npm -v</blockquote><p>komutlarını komut satırında çalıştırmamız yeterli olacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/992/1*UNjkJC4FOTIOi8LjB1H5Qw.png" /><figcaption>örnek çalıştırılan komutların çıktıları</figcaption></figure><p>Kurulumlar noktasında geliştirme ortamımız olarak Visual Studio Code üzerinden ilerleyeceğim.</p><p><a href="https://visualstudio.microsoft.com/downloads/">https://visualstudio.microsoft.com/downloads/</a> adresi üzerinden ilgili program seçilerek kurulum gerçekleştirilmektedir.</p><p>Kurulumlarımızı gerçekleştirildikten sonra, visual studio code da react için Extension — React/Redux/GraphQL/React-Native olan extension yüklememiz süreçlerimizde fayda sağlayacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GKTQN_J5k-t5iNuahzHEHQ.png" /><figcaption>Visual Studio Code Extensions</figcaption></figure><p>Kurulumlarımızı tamamladıktan sonra, desktop veya belirlediğimiz bir alanda klasör açabiliriz. Bu açılan klasör hello-react isimli bir klasör açıp bunu VS Code içinde açabiliriz.</p><p>Klasör altına hemen public bir klasör ve altına da index.html dosya oluşturmamız ilk adımımızda yeterli olacaktır.</p><p>Kısayollarımız aracılığı ile <strong>! ve TAB</strong> tuşuna basmamızla html kodlarımız otomatik olarak oluşturulacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-KkgnkEPpF3niggu_iCUjw.png" /><figcaption>Örnek kısayollarla oluşturan kod parçacığı</figcaption></figure><p>Kurulumlarımızla birlikte uygulamamızın her seferinde tekrar tekrar ayağa kalkmasını değişikliklerin yansımasını beklemek yerine live server kurarak ilgili değişikliklerin yansıması sağlanmaktadır.</p><p>Global’de hangi paketlerimizin kurulu olduğunu görebilmek adına mac makinemizde terminal üzerinden, windows kullanıyorsak cmd veya powershell üzerinden;</p><blockquote>npm list -g — depth 0</blockquote><p>komutunu çalıştırmamız globalde yüklü olan paketlerimizin görülmesine imkan sağlamaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oFv_r582GQ0fMBHcmfcclQ.png" /><figcaption>örnek komut sonuçları</figcaption></figure><p>Globalimizde corepack ve npm paketlerinin yüklü olduğunu sonucumuzla görmekteyiz. Live server kurulumumuz için tekrar terminal üzerinden</p><blockquote>npm install -g live-server</blockquote><p>komutumuzla kurulumumuz gerçekleştirilmektedir. Eğer mac cihaz üzerinden ilerliyorsak burada bir detay bulunmaktadır. Mac cihazlarımızda erişim noktasında izin verilmediği için ilgili komut başına sudo eklenmesi gerekmektedir. Son şekli;</p><blockquote>sudo npm install -g live-server</blockquote><p>şeklindedir. Global paketlerimizin içerisinde live server görebilmek adına tekrar terminalimiz üzerinden npm list -g — depth 0 komutunu çalıştırarak yüklendiğini görüntüleyebiliriz.</p><p>Live server paketimizi <strong>aktif</strong> etmek için <strong>live-server public</strong> komutunu çalıştırmamız, eğer <strong>durdurulmasını</strong> istiyorsak da command + C ile durdurulmasını sağlayabilmekteyiz.</p><p>React dünyamız için artık kollarımızı sıvayabilir durumdayız, bir sonraki yazımızda birlikte Hello React diyebiliriz. 💃🏻 🕺🏻</p><p>Sonraki yazımda görüşmek dileğiyle, sevgiler. 🌸</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=41de2661c02e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/react-ser%C3%BCvenim-kurulumlar-41de2661c02e">React Serüvenim — Kurulumlar</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[System.Threading.Tasks]]></title>
            <link>https://medium.com/ltunes/system-threading-tasks-aa03bbdbe72e?source=rss----a5bfd5993534---4</link>
            <guid isPermaLink="false">https://medium.com/p/aa03bbdbe72e</guid>
            <category><![CDATA[tasks]]></category>
            <category><![CDATA[threads]]></category>
            <category><![CDATA[asynchronous]]></category>
            <category><![CDATA[asyncawait]]></category>
            <category><![CDATA[cancellationtoken]]></category>
            <dc:creator><![CDATA[Cihat Solak]]></dc:creator>
            <pubDate>Mon, 21 Nov 2022 10:30:58 GMT</pubDate>
            <atom:updated>2023-01-22T15:15:40.279Z</atom:updated>
            <content:encoded><![CDATA[<h4>Task sınıfı, bir değer döndürmeyen ve genellikle eş zamansız olarak yürütülen tek bir işlemi temsil eder.</h4><p><a href="https://medium.com/dogustech/asenkron-multithread-programlama-e5b716819a96"><strong>Asenkron &amp; Multithread Programlama</strong></a><strong> </strong>içeriğimizden sonra asenkron işlemleri temsil eden Task sınıfının metotlarını inceleyeceğiz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3NUVy2KfQGw20Ixi7yKAaA.jpeg" /></figure><h4>Task.ContinueWith</h4><p>Task içerisindeki işlem tamamlandıktan sonra çalışacak kodları (callback mekanizması gibi) burada yer alır. Daha önceleri bir asenkron metot kodlamasında, asenkron metot bittiği zaman çalışacak bir metot tanımlanırdı. Haliyle asenkron metot çalıştıktan sonra tanımlanan callback metot otomatik olarak devreye girerdi. Bu eski senaryonun yerine Task.ContinueWith dediğimizde ilgili task işlemi bittikten sonra ContinueWith içerisinde bulunan kodlar işletilir.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f75d20282bf444cf7d28d1b1544e81ee/href">https://medium.com/media/f75d20282bf444cf7d28d1b1544e81ee/href</a></iframe><p>ContinueWith, parametre olarak action delegate’si almaktadır. Net Framework içerisinde action delegate’leri ön tanımlı olup, genellikle parametre alan fakat geriye hiç birşey dönmeyen metotları işaret etmektedir. Günümüzde ise ContinueWith metotu yerine async/await ikilisini kullanarak kodun okunabilirliğini arttırabiliriz. Ama illa Async/Await kulanmak istemiyorsak bir metot oluşturup bu metotu ContinueWith’e parametre olarak tanımlamak daha efektif olabilir.</p><h4>Task.WhenAll</h4><p>Bu metot parametre olarak Task Array’i alır <strong>(params Task[] tasks) </strong>ve parametre olarak aldığı task’lar tamamlanana kadar bekler. Kritik nokta Task’ların bir tanesinin tamamlanması değil, tümünün tamamlanması gerekmektedir. Örneğin 3–5 adet asenkron metot başlattınız (await ile taahhüt etmediğinizi varsayıyorum) ve kodun bir belli bir yerinde başlattığınız tüm asenkron çağrıların bittiğinden emin olup, sonuçlarını elde etmek istiyorsunuz. Bu durum da Task.WhenAll metotu hayat kurtaracaktır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/89c167ce3d88b31c930a39be2eba6808/href">https://medium.com/media/89c167ce3d88b31c930a39be2eba6808/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/856/1*nixblILsjo8KNpkp2d0dQA.png" /><figcaption>WhenAll — Result</figcaption></figure><p>Yukarıdaki örneğin incelediğimizde GetContentAsync metotunun farklı thread’ler üzerinde çalıştığını console çıktısından görebiliyoruz. Daha önceki içeriklerde de belirttiğim üzere <strong>asenkron metot 1 thread üzerinde çalışabilir de çalışmayabilir de</strong>. Bizim şu anda önemsediğimiz konu main thread’in bloklanmamasıdır.</p><h4>Task.WhenAny</h4><p>Bu metot parametre olacak Task Array’i alır <strong>(params Task[] tasks) </strong>ve parametre olarak aldığı task’larden ilk biten task’ı bize döner. Yani parametre olaran 10 task verdiysek bunlar arasında işi ilk biten task’i geri döner.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/577185292e3c5191a8e35608a67a1e46/href">https://medium.com/media/577185292e3c5191a8e35608a67a1e46/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FBeOyzewUBMQVLT3YTYKLQ.png" /></figure><h4>Task.WaitAll</h4><p>Task.WhenAll gibi parametre olarak TaskArray almakta olup ilgili task’lar tamamlanana kadar beklemektedir. Kritik Nokta -&gt; Task.WhenAll metotu main thread’i bloklamıyorken WaitAll metotu main thread’i bloklamaktadır. Bir windows form gibi ara yüze sahip uygulama hayal edersek, Task.WaitAll içerisindeki işlemler tamamlanana kadar pencere donar, farklı işlem yapamayız. Bu nedenle kullanımı tavsiye edilen yöntem değildir. Senkron kodlamaya ihtiyacınız olduğu yerde kullanabilirsiniz.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/465adbb4bbaaca2511f48e26f585fcfd/href">https://medium.com/media/465adbb4bbaaca2511f48e26f585fcfd/href</a></iframe><p>Aralarındaki farkdan bahsetmek gerekirse, WaitAll metotu parametre olarak milisaniye cinsinden değer alıyor. Örneğin parametre olarak 5000 milisaniye geçtiğimizde WaitAll metotu geriye true/false değeri dönmektedir. Anlaşılacağı üzere vermiş olduğumuz süre zarfında task işlemleri gerçekleşirse true, aksi halde false değeri geri döner. Eğer milisaniye cinsinden parametre geçmezse geri dönüş tipi void olacaktır.</p><h4>Task.WaitAny</h4><p>WaitAll metotu gibi main thread’i bloklamaktadır. Örneğin UI Thread üzerinde çalışıyorsanız UI Thread’i bloklayacağından dolayı ekran donacaktır. Parametre olarak Task[] array’i alır. Parametre olarak aldığı task’lardan herhangi biri tamamlandığı zaman geriye tamamlanan task’ın index numarasını döner. Bu index numarası üzerinden tamamlanan task’ı alabiliriz. Milisaniye alan overload metotu da bulunmaktadır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8354e47d9e444d6e960f5e26f3405300/href">https://medium.com/media/8354e47d9e444d6e960f5e26f3405300/href</a></iframe><p>Çağrıldığı yerde main/primary/ui thread’i bloklar.</p><h4>Task.Delay</h4><p>Asenkron gecikme sağlar, bu gecikmeyi gerçekleştirirken main thread’i bloklamaz. Thread.Sleep() main/ui/primary thread’i bloklarken task delay metotu bloklama gerçekleştirmez.</p><blockquote><strong>Thread.Sleep()</strong>, main/ui/primary thread’i milisaniye cinsinden bloklama gerçekleştirerek gecikmeyi sağlar. Senkron mantığında çalışır.</blockquote><blockquote><strong>Task.Delay()</strong> ise main thread’i bloklamadan gecikme sağlar. Asenkron mantığında çalışır.</blockquote><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/634de06d365e487ec421585e78889fe8/href">https://medium.com/media/634de06d365e487ec421585e78889fe8/href</a></iframe><p>Örneğin yukarıdaki senaryoda GetContentAsync metotunu 3 kere çağırdığımızda toplamda 3 x 5 = 15 saniye <strong>BEKLEMEYİZ</strong>. Asenkron kodlama yaptığımız için ilk thread metota girdiğinde sadece ilgili thread 5 saniye bloklanacaktır. 3 istekde ortalama aynı anda metotu tetikleyeceğini düşünürsek bu işlemin tümü 5 saniye kadar sürecektir. Senkron olsaydı ilk çağrı 5 saniye, ikincisi 5 saniye, üçüncüsü 5 saniye saniye beklerdi ve o zaman toplamda 15 saniye beklemiş olurduk.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/1*eqM54WPjvEifWrkQXzEl3A.png" /></figure><h4>Task.Run</h4><p>Asenkron metotlar farklı thread üzerinde çalışmak <strong>zorunda değildir</strong>. Duruma göre değişkenlik gösterir. Hatırlayalım, asenkron kodlamamızdaki en temel amaçlarımızdan biri çağrı anında main/primary/ui thread’i bloklamamaktı.</p><p>Peki, biz yapacağımız bir işin farklı thread üzerinde çalışmasını istiyorsak ne yapacağız? Task.Run metotunu kullanacağız. Task.Run metotu işleteceği kodları tamamen ayrı bir thread üzerinde çalıştırır. Bizzat yapılacak işlemi ayrı bir thread üzerinde çalıştır kardeşim diye direktif vermiş oluruz. Biraz tehlikeli görünüyor, dikkat etmekte fayda var.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/557abe45ac3496b380189d6a4736aba0/href">https://medium.com/media/557abe45ac3496b380189d6a4736aba0/href</a></iframe><p>Best practices açısından işlemciyi hırpalayacak metotları ayrı bir thread üzerinde çalıştırmak uygun olandır. Örneğin yapacağınız işlem içerisinde ciddi algoritma/matematik gerektiren işlemler yoğun şekilde mevcutsa, bu gibi işlemleri tamamen ayrı bir thread üzerinde çalıştırmak uygun görülebilir. Bunun dışında dosya okuma/yazma, veri tabanına okuma/yazma veya bir web sitesine istek yaparken ayrı bir thread kullanılması <strong>uygun değildir</strong>. Çünkü bu gibi yapacağınız işlemlerde belki de farklı bir thread kullanımına o anda ihtiyaç olmayacak. Böyle bir senaryoda Task.Run kullanırsanız ihtiyaç olmadığı halde thread kullanımına sebebiyet vermiş olacaksınız. Bu da <strong>best practices açısından kötü bir yöntemdir</strong>. Çözüm olarak performans ve kaynakları verimli kullanarak thread’leri bloklamamak adına asenkron metot kullanımı uygundur.</p><h4>Task.Factory.StartNew()</h4><p>Genel itibariyle Task.Run metoduyla aynı işleve sahiptir. Bu metotda içerisine yazmış olduğumuz kodları farklı bir thread üzerinde çalıştırdığı için dikkat edilmesi gerekmektedir. Task.Rın metotundan farkı ise şudur: Run metotuna task oluştururken bir nesne (obje) veremiyorken StartNew() metotuna bir nesne (obje) verebiliyoruz. Task işlemi tamamlandıktan sonra vermiş olduğumuz nesneyi kullanabiliyoruz. Buradaki obje referans tip ya da değer tip olabilir.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c5f941f5c0f1a5a7343284dd2f296d8b/href">https://medium.com/media/c5f941f5c0f1a5a7343284dd2f296d8b/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H7elkKivJ5XpNtr5ATrzpA.png" /></figure><h4>Task.FromResult</h4><p>Parametre olarak generic tip alıp geriye verilen tipe göre Task&lt;TResult&gt; dönmektedir. Örneğin bir metotdan daha önce almış olduğunuz static veriyi dönmek istiyorsak, kullanım için bir seçenek olabilir.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62b6a564f672242d70f8756b7012c03a/href">https://medium.com/media/62b6a564f672242d70f8756b7012c03a/href</a></iframe><h4>CancelationToken</h4><p>Bir asenkron metot başlattığımızda birçok sebepten ötürü başlattığımız işlemi iptal etmek isteyebiliriz. Örneğin dosya okuma işlemi yapıyoruz ve 10–15 dakika sürecek bir iş. Bu işlemi 3.üncü dakika veya herhangi bir T anında yapmaktan vazgeçtiğimizde iptal etmek isteriz. Bu gibi durumda cancelationtoken kullanırız. Nasıl? Asenkron operasyon başlatırken bir token veriyoruz ve bu token ile başlatmış olduğumuz asenkron operasyonu iptal etmiş oluyoruz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/716/1*NnNENgSbNE__Zs35tEJb3g.png" /></figure><p>Asenkron metotun cancelationtoken alabilmesi için mutlaka kurucusunda (constructor) overload metotu olması gereklidir. Bundan ötürü her asenkron metot cancelationtoken alabilir diye koşul koyamayız.</p><p>Örneğin Web MVC uygulamamızda kullanıcı excel export yapmak istedi ve gerekli action’a isteğini gerçekleştirdi. 1–2 dakika sonra ihtiyacının kalmadığını düşündüğünde isteği iptal etmek isteyebilir. Uygun senaryo şu şekilde.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ab0b839235e4941adbfd25cf5fa6b1ed/href">https://medium.com/media/ab0b839235e4941adbfd25cf5fa6b1ed/href</a></iframe><h4>Task.Result</h4><p>Senkron bir metot içerisinde asenkron bir çağrım yaptığımızda Result property’si ile sonucu elde edebiliriz fakat Result dediğimiz anda o anki thread hangisi ise o thread bloklanır. Şöyle düşünelim. Result’ı kullanmak ara yüze sahip bir uygulamada işlem süresine bağlı olarak ara yüzü kilitleyecektir. Kullanıcı result property’sinden dönen değeri elde edene kadar geçen sürede ekranda farklı hiçbir şey yapamayacaktır. Çünkü thread result property’sini elde etmekle meşguldür.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b60c06a24a4c9c3fd79a70e95963b9ed/href">https://medium.com/media/b60c06a24a4c9c3fd79a70e95963b9ed/href</a></iframe><h4>Task Instance Properties</h4><p>Task sınıfının IsCanceled, IsCompleted, IsCompletedSuccesfully, IsFaulted gibi önem arz eden property’leri bulunmaktadır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Lm3i0zli6HF74FOYjXpthA.png" /></figure><ul><li><strong>IsCanceled:</strong> İşlemde olan task’ın iptal edildi mi?</li><li><strong>IsCompleted:</strong> İşlemin tamamlandı mı? (başarı göz ardı edilir.)</li><li><strong>IsCompletedSuccesfully:</strong> İşlem başarıyla tamamlandı mı?</li><li><strong>IsFaulted:</strong> İşlem hata aldı mı?</li></ul><p>Wir Sehen Uns 😎</p><ul><li><a href="https://www.buraksenyurt.com/post/Task-Wait-WaitAll-WaitAny">Task Wait,WaitAll,WaitAny</a></li><li><a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task?view=net-6.0">Task Class (System.Threading.Tasks)</a></li><li><a href="https://nelsonparente.medium.com/task-whenall-in-a-nutshell-1379428a1a53">Task.WhenAll in a Nutshell</a></li><li><a href="https://medium.com/devopsturkiye/cancellation-token-kullan%C4%B1m%C4%B1-a033ff19e118">Cancellation Token Kullanımı</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aa03bbdbe72e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ltunes/system-threading-tasks-aa03bbdbe72e">System.Threading.Tasks</a> was originally published in <a href="https://medium.com/ltunes">İnteraktif Web &amp; Mobile Tribe</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>