<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[.anilatalay]]></title><description><![CDATA[Software Developer]]></description><link>http://anilatalay.com/</link><image><url>http://anilatalay.com/favicon.png</url><title>.anilatalay</title><link>http://anilatalay.com/</link></image><generator>Ghost 4.33</generator><lastBuildDate>Thu, 16 Apr 2026 08:27:10 GMT</lastBuildDate><atom:link href="http://anilatalay.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Faydalı Araçlar #1]]></title><description><![CDATA[<p>Bu blog serisinde, benim &#xE7;al&#x131;&#x15F;malar&#x131;mda kulland&#x131;&#x11F;&#x131;m, gezerken ke&#x15F;fetti&#x11F;im ve faydal&#x131; buldu&#x11F;um baz&#x131; ara&#xE7;lar&#x131; ve paketleri payla&#x15F;aca&#x11F;&#x131;m. Umar&#x131;m sizin i&#xE7;in de</p>]]></description><link>http://anilatalay.com/faydali-araclar-1/</link><guid isPermaLink="false">64a26ff0b2507b571f8de3a0</guid><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Tue, 04 Jul 2023 11:54:45 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1660508344047-d535438fc3fa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGNob3clMjB8ZW58MHx8fHwxNjg4NDc0NzM4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1660508344047-d535438fc3fa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fGNob3clMjB8ZW58MHx8fHwxNjg4NDc0NzM4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Faydal&#x131; Ara&#xE7;lar #1"><p>Bu blog serisinde, benim &#xE7;al&#x131;&#x15F;malar&#x131;mda kulland&#x131;&#x11F;&#x131;m, gezerken ke&#x15F;fetti&#x11F;im ve faydal&#x131; buldu&#x11F;um baz&#x131; ara&#xE7;lar&#x131; ve paketleri payla&#x15F;aca&#x11F;&#x131;m. Umar&#x131;m sizin i&#xE7;in de yararl&#x131; olurlar.</p><p><strong>directus.io</strong></p><p>Kullan&#x131;c&#x131;lar&#x131;n &#xF6;zelle&#x15F;tirilebilir ve API-odakl&#x131; bir i&#xE7;erik y&#xF6;netim sistemi (CMS) olu&#x15F;turarak veri taban&#x131; yap&#x131;lar&#x131;n&#x131; kolayca y&#xF6;netmelerini sa&#x11F;layan bir platformdur.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://directus.io/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Directus: The Modern Data Stack, Democratized</div><div class="kg-bookmark-description">Directus is the world&#x2019;s first Open Data Platform for instantly turning any SQL database into an API and beautiful no-code app.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://directus.io/assets/apple-touch-icon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></div><div class="kg-bookmark-thumbnail"><img src="https://directus.io/assets/og-image.png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>railway.app</strong></p><p>Geli&#x15F;tiricilere kolay bir &#x15F;ekilde uygulama da&#x11F;&#x131;t&#x131;m&#x131; ve y&#xF6;netimi sa&#x11F;layan bir platformdur. &#xDC;cretsiz &#x15F;ekilde bir uygulama yay&#x131;nlayabiliyorsunuz.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://railway.app/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Railway</div><div class="kg-bookmark-description">Railway is an infrastructure platform where you can provision infrastructure, develop with that infrastructure locally, and then deploy to the cloud.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://railway.app/apple-touch-icon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">Railway</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://railway.app/og.png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p>clerk.com</p><p>Kullan&#x131;c&#x131; yetkilendirme ve kimlik do&#x11F;rulama i&#x15F;levlerini sunan bir hizmettir. Clerk, geli&#x15F;tiricilere kullan&#x131;c&#x131; y&#xF6;netimi, oturum a&#xE7;ma, kaydolma, parola s&#x131;f&#x131;rlama gibi kullan&#x131;c&#x131; kimlik do&#x11F;rulama s&#xFC;re&#xE7;lerini h&#x131;zl&#x131; ve g&#xFC;venli bir &#x15F;ekilde uygulama geli&#x15F;tirmelerini sa&#x11F;lar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://clerk.com/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Clerk | Authentication and User Management</div><div class="kg-bookmark-description">The easiest way to add authentication and user management to your application. Purpose-built for React, Next.js, Remix, and &#x201C;The Modern Web&#x201D;.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://clerk.com/favicon/apple-touch-icon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">Clerk</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.sanity.io/images/e1ql88v4/production/2c9fa07f8f2c4f1fa5ba6fb5196ba45b31a694e1-2400x1260.png?fit=max&amp;auto=format&amp;w=1200&amp;h=630&amp;fm=png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p>postmarkapp</p><p>Geli&#x15F;tiricilere e-posta ileti&#x15F;imi i&#xE7;in bir hizmet sunan bir platformdur. Postmark, uygulamalar&#x131;n g&#xFC;venli ve g&#xFC;venilir bir &#x15F;ekilde e-posta g&#xF6;nderme ve almay&#x131; y&#xF6;netmelerine yard&#x131;mc&#x131; olur.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://postmarkapp.com/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Postmark: Fast, Reliable Email Delivery Service | SMTP | API</div><div class="kg-bookmark-description">Send transactional and marketing emails and get them to the inbox on time, every time. Postmark is a fast and reliable email delivery service for developers.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://postmarkapp.com/images/apple-touch-icon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">Postmark Log In</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://postmarkapp.com/images/logo-stamp-social.png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>ipregistry.co</strong></p><p>IP adreslerini &#xE7;&#xF6;z&#xFC;mlemek, co&#x11F;rafi konum verilerini elde etmek ve IP tabanl&#x131; hizmetleri optimize etmek i&#xE7;in kullan&#x131;lan bir IP veritaban&#x131; ve API sa&#x11F;lay&#x131;c&#x131;s&#x131;d&#x131;r.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://ipregistry.co/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The Trusted Source for IP Address Data (geolocation and threat) - Ipregistry</div><div class="kg-bookmark-description">Build location-aware apps and protect your business from bad actors with Ipregistry, the most reliable IP Geolocation service trusted by 5,000+ businesses.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.ipregistry.co/icons/android-icon-192x192.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">Ipregistry</span><span class="kg-bookmark-publisher">Ipregistry</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://ipregistry.co/assets/ipregistry.svg" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>taxonomy</strong></p><p>Next.js 13&apos;teki b&#xFC;t&#xFC;n &#xF6;zellikler kullan&#x131;larak olu&#x15F;turulmu&#x15F; a&#xE7;&#x131;k kaynakl&#x131; bir uygulama.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/shadcn/taxonomy"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - shadcn/taxonomy: An open source application built using the new router, server components and everything new in Next.js 13.</div><div class="kg-bookmark-description">An open source application built using the new router, server components and everything new in Next.js 13. - GitHub - shadcn/taxonomy: An open source application built using the new router, server ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">shadcn</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/553759919/50f106ee-4f24-46f2-ae48-70c9105bb06e" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>skateshop</strong></p><p>Next.js 13&apos;teki b&#xFC;t&#xFC;n &#xF6;zellikler kullan&#x131;larak olu&#x15F;turulmu&#x15F; a&#xE7;&#x131;k kaynakl&#x131; di&#x11F;er uygulama.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/sadmann7/skateshop"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - sadmann7/skateshop: An open source e-commerce skateshop build with everything new in Next.js 13.</div><div class="kg-bookmark-description">An open source e-commerce skateshop build with everything new in Next.js 13. - GitHub - sadmann7/skateshop: An open source e-commerce skateshop build with everything new in Next.js 13.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">sadmann7</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/9db59f7a9f59f47da9497f17cf9a47522994e81419d2f41024b7134e565e870c/sadmann7/skateshop" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>swiper</strong></p><p>Web sitelerinde ve mobil uygulamalarda etkileyici kayd&#x131;rma efektleri olu&#x15F;turman&#x131;z&#x131; sa&#x11F;layan kullan&#x131;c&#x131; dostu bir JavaScript kayd&#x131;rma k&#xFC;t&#xFC;phanesidir.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/nolimits4web/swiper"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - nolimits4web/swiper: Most modern mobile touch slider with hardware accelerated transitions</div><div class="kg-bookmark-description">Most modern mobile touch slider with hardware accelerated transitions - GitHub - nolimits4web/swiper: Most modern mobile touch slider with hardware accelerated transitions</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">nolimits4web</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/a72c2f069ba4f816dbf8249814b0f492d16a114e9b55261dbf5cb91a0cec8eef/nolimits4web/swiper" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>luxon</strong></p><p>Di&#x11F;er tarih ve saat i&#x15F;leme k&#xFC;t&#xFC;phanelerinden farkl&#x131; olarak daha hafif, zaman dilimlerini destekleyen, basit bir API&apos;ye sahip ve de&#x11F;i&#x15F;mez veri yap&#x131;s&#x131;yla &#xE7;al&#x131;&#x15F;an bir JavaScript k&#xFC;t&#xFC;phanesidir.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/moment/luxon"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - moment/luxon: &#x23F1; A library for working with dates and times in JS</div><div class="kg-bookmark-description">&#x23F1; A library for working with dates and times in JS - GitHub - moment/luxon: &#x23F1; A library for working with dates and times in JS</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">moment</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/5e1462fd09c292451c28bf6df23d0c8d17a19ded44fdd2e2f6a27ec045e63311/moment/luxon" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>reading-time</strong></p><p>Bir metin veya i&#xE7;erik par&#xE7;as&#x131;n&#x131;n okunma s&#xFC;resini tahmin etmek i&#xE7;in kullan&#x131;lan bir JavaScript paketidir. Bu paket, kullan&#x131;c&#x131;lar&#x131;n bir yaz&#x131;y&#x131; okumak i&#xE7;in harcayacaklar&#x131; s&#xFC;reyi yakla&#x15F;&#x131;k olarak hesaplar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/ngryman/reading-time"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - ngryman/reading-time: :books: Medium&#x2019;s like reading time estimation.</div><div class="kg-bookmark-description">:books: Medium&#x2019;s like reading time estimation. Contribute to ngryman/reading-time development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">ngryman</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/ff7fb67e802a71f3d47863c1b7c7b1b16ff8f9e17a3938143b3e537fa30e7f9a/ngryman/reading-time" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>lucide.dev</strong></p><p>SVG ikonlar&#x131; olu&#x15F;turmak ve y&#xF6;netmek i&#xE7;in kullan&#x131;lan bir JavaScript k&#xFC;t&#xFC;phanesidir. Bu k&#xFC;t&#xFC;phane, web projelerinde &#xF6;zelle&#x15F;tirilebilir ve animasyonlu ikonlar olu&#x15F;turman&#x131;z&#x131; sa&#x11F;lar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://lucide.dev/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Lucide Icons</div><div class="kg-bookmark-description">Beautiful &amp; consistent icon toolkit made by the community.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://lucide.dev/favicon.ico" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">Lucide</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://lucide.dev/og.png" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p><strong>tremor</strong></p><p>H&#x131;zl&#x131; &#x15F;ekilde panolar olu&#x15F;turman&#x131;z&#x131; sa&#x11F;layan react paketidir.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/tremorlabs/tremor"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - tremorlabs/tremor: The React library to build dashboards fast.</div><div class="kg-bookmark-description">The React library to build dashboards fast. Contribute to tremorlabs/tremor development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="Faydal&#x131; Ara&#xE7;lar #1"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">tremorlabs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://repository-images.githubusercontent.com/483406511/428d6ee7-0996-4e3a-b479-38d30a1fc02d" alt="Faydal&#x131; Ara&#xE7;lar #1"></div></a></figure><p>Bir sonraki blog yaz&#x131;s&#x131;nda tekrar g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere. . &#x130;yi g&#xFC;nler dilerim.</p>]]></content:encoded></item><item><title><![CDATA[macOS harici klavye ayarlarını sıfırlama]]></title><description><![CDATA[<p>Mac&apos;e harici bir klavye takt&#x131;&#x11F;&#x131;m&#x131;zda sistem otomatik olarak &quot;Keyboard Setup Assistant&quot; uygulamas&#x131;n&#x131; &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;r ve bu &#x15F;ekilde kurulum i&#x15F;lemini ger&#xE7;ekle&#x15F;tilebiliriz. Maalesef klavyemiz i&</p>]]></description><link>http://anilatalay.com/keyboard-setup-assistant/</link><guid isPermaLink="false">62a99fb6ee289503b103b699</guid><category><![CDATA[Macos]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Wed, 15 Jun 2022 09:49:44 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1584727151652-d09b17ebf23f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMzfHxrZXlib2FyZHxlbnwwfHx8fDE2NTUyODg1Mzg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1584727151652-d09b17ebf23f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDMzfHxrZXlib2FyZHxlbnwwfHx8fDE2NTUyODg1Mzg&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=2000" alt="macOS harici klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlama"><p>Mac&apos;e harici bir klavye takt&#x131;&#x11F;&#x131;m&#x131;zda sistem otomatik olarak &quot;Keyboard Setup Assistant&quot; uygulamas&#x131;n&#x131; &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;r ve bu &#x15F;ekilde kurulum i&#x15F;lemini ger&#xE7;ekle&#x15F;tilebiliriz. Maalesef klavyemiz i&#xE7;in bu kurulum i&#x15F;lemini bir kez yapt&#x131;ktan sonra klavye ayar b&#xF6;l&#xFC;m&#xFC;nden ilgili se&#xE7;enek kalk&#x131;yor veya ula&#x15F;&#x131;lmaz oluyor.</p><figure class="kg-card kg-image-card kg-width-full"><img src="http://anilatalay.com/content/images/2022/06/macos-keyboard.png" class="kg-image" alt="macOS harici klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlama" loading="lazy" width="1560" height="1416" srcset="http://anilatalay.com/content/images/size/w600/2022/06/macos-keyboard.png 600w, http://anilatalay.com/content/images/size/w1000/2022/06/macos-keyboard.png 1000w, http://anilatalay.com/content/images/2022/06/macos-keyboard.png 1560w"></figure><p>Klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlamak istedi&#x11F;imizde klavye b&#xF6;l&#xFC;m&#xFC;nde bulunan ilgili ayar&#x131; veya direk &quot;Keyboard Setup Assistant&quot; uygulamas&#x131;n&#x131; a&#xE7;am&#x131;yoruz.</p><p>&quot;Keyboard Setup Assistant&quot; uygulamas&#x131;n&#x131;n dizini;</p><!--kg-card-begin: markdown--><pre><code>/System/Library/CoreServices/KeyboardSetupAssistant.app
</code></pre>
<!--kg-card-end: markdown--><p>Klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlamak i&#xE7;in &quot;Library/Preferences&quot; alt&#x131;nda bulunan &quot;com.apple.keyboardtype.plist&quot; dosyas&#x131;n&#x131; silmemiz gerekiyor. Terminal &#xFC;zerinde a&#x15F;a&#x11F;&#x131;da bulunan komut ile silme i&#x15F;lemini ger&#xE7;ekle&#x15F;tirebilirsiniz.</p><!--kg-card-begin: markdown--><pre><code>sudo rm -rf /Library/Preferences/com.apple.keyboardtype.plist
</code></pre>
<!--kg-card-end: markdown--><p>Komutu &#xE7;al&#x131;&#x15F;t&#x131;rd&#x131;ktan sonra bilgisayar&#x131; yeniden ba&#x15F;latt&#x131;&#x11F;&#x131;n&#x131;zda &quot;Keyboard Setup Assistant&quot; uygulamas&#x131; otomatik olarak ba&#x15F;lat&#x131;lacakt&#x131;r.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2022/06/keyboard-setup-assistant-2.png" class="kg-image" alt="macOS harici klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlama" loading="lazy" width="1824" height="1480" srcset="http://anilatalay.com/content/images/size/w600/2022/06/keyboard-setup-assistant-2.png 600w, http://anilatalay.com/content/images/size/w1000/2022/06/keyboard-setup-assistant-2.png 1000w, http://anilatalay.com/content/images/size/w1600/2022/06/keyboard-setup-assistant-2.png 1600w, http://anilatalay.com/content/images/2022/06/keyboard-setup-assistant-2.png 1824w" sizes="(min-width: 720px) 720px"></figure><p>&quot;Keyboard Setup Assistant&quot; uygulamas&#x131; otomatik olarak ba&#x15F;lamazsa klavye ayarlar&#x131; b&#xF6;l&#xFC;m&#xFC;nden manuel olarak ba&#x15F;latabilirsiniz.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="http://anilatalay.com/content/images/2022/06/keyboard-setup-assistant-1-1.png" class="kg-image" alt="macOS harici klavye ayarlar&#x131;n&#x131; s&#x131;f&#x131;rlama" loading="lazy" width="1824" height="1480" srcset="http://anilatalay.com/content/images/size/w600/2022/06/keyboard-setup-assistant-1-1.png 600w, http://anilatalay.com/content/images/size/w1000/2022/06/keyboard-setup-assistant-1-1.png 1000w, http://anilatalay.com/content/images/size/w1600/2022/06/keyboard-setup-assistant-1-1.png 1600w, http://anilatalay.com/content/images/2022/06/keyboard-setup-assistant-1-1.png 1824w" sizes="(min-width: 1200px) 1200px"></figure><p>Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[ASP.NET Core: Distributed Caching (Redis)]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core uygulamalar&#x131; i&#xE7;in redis&#x2019;de temel okuma-yazma-silme i&#x15F;lemlerini nas&#x131;l ger&#xE7;ekle&#x15F;tirebilece&#x11F;inizi a&#xE7;&#x131;klamaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><p>Hemen bir ASP.NET Core Web API projesi olu&#x15F;</p>]]></description><link>http://anilatalay.com/asp-net-core-distributed-caching-redis/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8ed</guid><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Fri, 11 Dec 2020 12:15:55 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core uygulamalar&#x131; i&#xE7;in redis&#x2019;de temel okuma-yazma-silme i&#x15F;lemlerini nas&#x131;l ger&#xE7;ekle&#x15F;tirebilece&#x11F;inizi a&#xE7;&#x131;klamaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><p>Hemen bir ASP.NET Core Web API projesi olu&#x15F;tural&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>dotnet new webapi --name &quot;Example&quot;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*yA0QEz4nzxs5q06lkuErOg.png"><!--kg-card-end: html--><p>Projemiz de redis&#x2019;in temel &#xF6;zelliklerini kullanmak i&#xE7;in gerekli nuget paketini projeye dahil ediyoruz.</p><p><strong><strong>Not:</strong></strong> Daha geni&#x15F; kapsam da redis API&#x2019;sini kullanmam&#x131;za olanak sa&#x11F;layan paketler bulunuyor. &#x130;kinci b&#xF6;l&#xFC;mde detayl&#x131; olarak yer verece&#x11F;im.</p><!--kg-card-begin: markdown--><pre><code>dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis --version 3.1.10
</code></pre>
<!--kg-card-end: markdown--><p>&#x130;lgili paketi projeye ekledikten sonra &#x201C;Startup.cs&#x201D; dosyas&#x131;nda bulunan servis tan&#x131;mlar&#x131;ndan &#x201C;DistributedCache&#x201D; servisini aktif hale getiriyoruz. Tan&#x131;mlama yaparken yap&#x131;land&#x131;rma ayarlar&#x131; b&#xF6;l&#xFC;m&#xFC;nde kullanaca&#x11F;am&#x131;z redis&#x2019;e ait host ve port bilgilerini yaz&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>services.AddStackExchangeRedisCache(option =&gt;
{
  option.Configuration = &quot;localhost:6379&quot;;
});
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Host, port, connection string veya benzer bilgileri code i&#xE7;erisinde kullanmamaya &#xF6;zen g&#xF6;sterelim.</p><!--kg-card-begin: markdown--><pre><code>// appsettings.json
{
  &quot;Redis&quot;: {
    &quot;Host&quot;: &quot;localhost&quot;,
    &quot;Port&quot;: &quot;6379&quot;
  }
}
</code></pre>
<!--kg-card-end: markdown--><p>Ba&#x11F;&#x131;ml&#x131;l&#x131;k enjeksiyonu (Dependency Injection) yard&#x131;m&#x131;yla IConfiguration aray&#xFC;z&#xFC; (interface) ile gelen methodlar&#x131; kullanarak redis bilgilerini art&#x131;k &#x201C;appsettings.json&#x201D; dosyas&#x131;ndan okuyoruz.</p><!--kg-card-begin: markdown--><pre><code>services.AddStackExchangeRedisCache(option =&gt;
{
  option.Configuration = $&#x201D;{Configuration[&#x201C;Redis:Host&#x201D;]}:{Configuration[&#x201C;Redis:Port&#x201D;]}&#x201D;;
});
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><code>using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace ProjectRedis
{
	public class Startup
	{
		public Startup(IConfiguration configuration)
		{
			Configuration = configuration;
		}

		public IConfiguration Configuration { get; }

		public void ConfigureServices(IServiceCollection services)
		{
			services.AddStackExchangeRedisCache(option =&gt;
			{
				option.Configuration = $&quot;{Configuration[&quot;Redis:Host&quot;]}:{Configuration[&quot;Redis:Port&quot;]}&quot;;
			});

			Console.WriteLine($&quot;{Configuration[&quot;Redis:Host&quot;]}:{Configuration[&quot;Redis:Port&quot;]}&quot;);

			services.AddControllers();
		}

		public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
		{
			if (env.IsDevelopment())
			{
				app.UseDeveloperExceptionPage();
			}

			app.UseHttpsRedirection();

			app.UseRouting();

			app.UseAuthorization();

			app.UseEndpoints(endpoints =&gt;
			{
				endpoints.MapControllers();
			});
		}
	}
}
</code>
<br>
    <!--kg-card-end: html--><p>Redis &#xFC;zerinde &#xF6;rnek i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirmek ad&#x131;na user endpoint&#x2019;lerini tan&#x131;ml&#x131;yoruz. &#x130;lgili class&#x2019;&#x131;n constructor&#x2019;&#x131;n da IDistributedCache aray&#xFC;z&#xFC;n&#xFC; (interface) ba&#x11F;&#x131;ml&#x131;l&#x131;k enjeksiyonu (Dependency Injection) yard&#x131;m&#x131;yla ge&#xE7;iyoruz.</p><!--kg-card-begin: html--><code>using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;

namespace Example.Controllers
{
	[ApiController]
	[Route(&quot;[controller]&quot;)]
	public class UsersController : ControllerBase
	{
		private readonly IDistributedCache _distributedCache;

		public UsersController(IDistributedCache distributedCache)
		{
			_distributedCache = distributedCache;
		}

		[HttpGet]
		public IActionResult Get()
		{
			return Ok();
		}

		[HttpPost]
		public IActionResult Post()
		{
			return Ok();
		}

		[HttpDelete]
		public IActionResult Delete()
		{
			return Ok();
		}
	}
}
</code>
<br><!--kg-card-end: html--><p>IDistributedCache aray&#xFC;z&#xFC; ile gelen temel redis methodlar&#x131; &#x15F;u an i&#xE7;in ihtiyac&#x131;m&#x131;z&#x131; kar&#x15F;&#x131;l&#x131;yor. Eklemi&#x15F; oldu&#x11F;umuz nuget paketi Microsoft taraf&#x131;ndan redis&#x2019;in temel &#xF6;zelliklerini kullanmam&#x131;z i&#xE7;in geli&#x15F;tirilmi&#x15F; olup ileri seviye &#xF6;zellikler i&#xE7;in kullan&#x131;lmamaktad&#x131;r.</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*AB5YYxG0XSUdMzwW06I8Wg.png"><!--kg-card-end: html--><p>Evet art&#x131;k yazma-okuma gibi i&#x15F;lemleri yapabiliriz. &#x201C;SetString&#x201D; method&#x2019;unu kullanarak o an ki tarih-saat bilgisini string olarak redis&#x2019;e yaz&#x131;yoruz. Kullan&#x131;lan method&#x2019;lar&#x131;n async versiyonlar&#x131; da bulunuyor.</p><!--kg-card-begin: markdown--><pre><code>_distributedCache.SetString(&#x201C;DATE_NOW&#x201D;, DateTime.Now.ToString());

await _distributedCache.SetStringAsync(&#x201C;DATE_NOW&#x201D;, DateTime.Now.ToString());
</code></pre>
<!--kg-card-end: markdown--><p>Redis de bulunan &#x201C;DATE_NOW&#x201D; key&#x2019;e ait de&#x11F;eri &#x201C;GetString&#x201D; medhod&#x2019;unu kullanarak okuyoruz.</p><!--kg-card-begin: markdown--><pre><code>var DATE_NOW = _distributedCache.GetString(&#x201C;DATE_NOW&#x201D;);
</code></pre>
<!--kg-card-end: markdown--><p>&#x201C;DATE_NOW&#x201D; key&#x2019;ini siliyoruz.</p><!--kg-card-begin: markdown--><pre><code>_distributedCache.Remove(&quot;DATE_NOW&quot;);
</code></pre>
<!--kg-card-end: markdown--><p>Veri olu&#x15F;turulduktan sonra verilen s&#xFC;re sonunda otomatik olarak redis&#x2019;den silinir.</p><!--kg-card-begin: markdown--><pre><code>var options = new DistributedCacheEntryOptions
{
  AbsoluteExpiration = DateTime.Now.AddSeconds(10)
};

_distributedCache.SetString(&quot;DATE_NOW&quot;, DateTime.Now.ToString(), options);
</code></pre>
<!--kg-card-end: markdown--><p>Bir complex type&#x2019;&#x131; redis&#x2019;e yazmak i&#xE7;in &#x201C;Json&#x201D; veya &#x201C;Binary&#x201D; serialize i&#x15F;lemlerininden birini tercih edebilirsiniz. Fakat genelde &#x201C;Json&#x201D; serialize y&#xF6;ntemi kullan&#x131;l&#x131;r. &#x201C;Binary&#x201D; serialize genelde dosyalarla ilgili i&#x15F;lemler de tercih edilir.</p><p>Hemen bir user model class&#x2019;&#x131; ekliyoruz.</p><!--kg-card-begin: markdown--><pre><code>// User.cs
public class User
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}
</code></pre>
<!--kg-card-end: markdown--><p>Class&#x2019;&#x131;m&#x131;zdan bir nesne &#xF6;rne&#x11F;i al&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>var user = new User {
  Id = 1,
  FirstName = &quot;An&#x131;l&quot;,
  LastName = &quot;Atalay&quot;
};
</code></pre>
<!--kg-card-end: markdown--><p>User model class&#x2019;&#x131;m&#x131;z&#x131; json serialize i&#x15F;lemi yapmak i&#xE7;in projemize bir nuget paketi ekliyoruz. &#x130;lgili paket Asp.Net Core API projelerinde varsay&#x131;lan olarak gelmiyor!</p><!--kg-card-begin: markdown--><pre><code>dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 3.1.10
</code></pre>
<!--kg-card-end: markdown--><p>Json serialize i&#x15F;lemini ger&#xE7;ekle&#x15F;tiriyoruz.</p><!--kg-card-begin: markdown--><pre><code>var userData = JsonConvert.SerializeObject(user);
</code></pre>
<!--kg-card-end: markdown--><p>Art&#x131;k elimizde bulunan string user datas&#x131;n&#x131; redis&#x2019;e yazabiliriz. Birden fazla user yaz&#x131;labilir d&#xFC;&#x15F;&#xFC;ncesi ile benzersiz bir key olu&#x15F;turuyoruz.</p><!--kg-card-begin: markdown--><pre><code>await _distributedCache.SetStringAsync($&#x201D;USER_{user.Id}&#x201D;, userData);
</code></pre>
<!--kg-card-end: markdown--><p>Redis&#x2019;e yam&#x131;&#x15F; oldu&#x11F;umuz user nesnesini okuyal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>var userData = await _distributedCache.GetStringAsync(&quot;USER_1&quot;);
</code></pre>
<!--kg-card-end: markdown--><p>Gelen user string datas&#x131;n&#x131; User class&#x2019;&#x131;na deserialize i&#x15F;lemi ger&#xE7;ekle&#x15F;tirece&#x11F;iz.</p><!--kg-card-begin: markdown--><pre><code>var user = JsonConvert.DeserializeObject&lt;User&gt;(userData);
</code></pre>
<!--kg-card-end: markdown--><p>Benzer i&#x15F;lemleri binary i&#xE7;inde yapal&#x131;m. User nesnemizin json string halini byte dizisine &#xE7;eviriyoruz ve &#x201C;SetAsync&#x201D; method&#x2019;unu kullanarak redis&#x2019;e yaz&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>var user = new User
{
  Id = 1,
  FirstName = &quot;An&#x131;l&quot;,
  LastName = &quot;Atalay&quot;
};

var userData = JsonConvert.SerializeObject(user);

var userByte = Encoding.UTF8.GetBytes(userData);

await _distributedCache.SetAsync($&quot;USER_{user.Id}&quot;, userByte);
</code></pre>
<!--kg-card-end: markdown--><p>Redis&#x2019;den okurken ise, yazarken yapt&#x131;&#x11F;&#x131;m&#x131;z i&#x15F;lemlerin tersini yap&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>var userByte = await _distributedCache.GetAsync(&quot;USER_1&quot;);

var userData = Encoding.UTF8.GetString(userByte);

var user = JsonConvert.DeserializeObject&lt;User&gt;(userData);
</code></pre>
<!--kg-card-end: markdown--><p>Redis &#xFC;zerinde temel i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirdik. Art&#x131;k olu&#x15F;turmu&#x15F; oldu&#x11F;umuz projeye devam edelim. En son user endpoint&#x2019;lerini eklemi&#x15F;tik. GET, POST ve DELETE i&#x15F;lemlerine ba&#x15F;layal&#x131;m.</p><!--kg-card-begin: html--><code>using System.Threading.Tasks;
using Example.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;

namespace Example.Controllers
{
	[ApiController]
	[Route(&quot;[controller]&quot;)]
	public class UsersController : ControllerBase
	{
		private readonly IDistributedCache _distributedCache;

		public UsersController(IDistributedCache distributedCache)
		{
			_distributedCache = distributedCache;
		}


		[HttpGet(&quot;{id}&quot;)]
		public async Task<iactionresult> Get([FromRoute] int id)
		{
			if (id == default)
				return NotFound();

			var userData = await _distributedCache.GetStringAsync($&quot;USER_{id}&quot;);
			if (userData == null)
				return NotFound(&quot;User not found.&quot;);

			var user = JsonConvert.DeserializeObject<user>(userData);

			return Ok(user);
		}

		[HttpPost]
		public async Task<iactionresult> Post([FromBody] User user)
		{
			if (user == null)
				return BadRequest();

			var userKey = $&quot;USER_{user.Id}&quot;;

			var userData = JsonConvert.SerializeObject(user);

			await _distributedCache.SetStringAsync(userKey, userData);

			return Ok(user);
		}

		[HttpDelete(&quot;{id}&quot;)]
		public async Task<iactionresult> Delete([FromRoute] int id)
		{
			if (id == default)
				return NotFound();

			await _distributedCache.RemoveAsync($&quot;USER_{id}&quot;);

			return Ok(id);
		}
	}
}
</iactionresult></iactionresult></user></iactionresult></code>
<br><!--kg-card-end: html--><p>Evet art&#x131;k user endpoint&#x2019;leri &#xFC;zerinden redis&#x2019;e veri yazabiliyoruz. Ger&#xE7;ek d&#xFC;nya da bu i&#x15F;lemler veritaban&#x131; ile ger&#xE7;ekle&#x15F;tirilir. Uygulamam&#x131;z&#x131;n yap&#x131;s&#x131;na ba&#x11F;l&#x131; olarak s&#xFC;re&#xE7; de&#x11F;i&#x15F;ebilir. &#x130;lk iste&#x11F;i veritaban&#x131; &#xFC;zerinden &#xE7;ekip d&#xF6;nebilir, daha sonra veriyi redis&#x2019;e yaz&#x131;p di&#x11F;er isteklere redis&#x2019;de ki veriler ile cevap verilebilir.</p><p>&#xD6;&#x11F;renilecek &#xE7;ok &#x15F;ey, gezilecek &#xE7;ok yer var. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[ASP.NET Core: Cache’lemek (In Memory Caching)]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core uygulamalar&#x131;nda bellek (memory) &#xFC;zerinde okuma-yazma gibi i&#x15F;lemleri nas&#x131;l ger&#xE7;ekle&#x15F;tirebilece&#x11F;inizi a&#xE7;&#x131;klamaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><p>Cache&#x2019;lemek (&#xF6;nbelle&#x11F;e alma) dedi&#x11F;imiz</p>]]></description><link>http://anilatalay.com/asp-net-core-cachelemek-in-memory-caching/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8ec</guid><category><![CDATA[ASP.NET Core]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Mon, 07 Dec 2020 19:21:00 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core uygulamalar&#x131;nda bellek (memory) &#xFC;zerinde okuma-yazma gibi i&#x15F;lemleri nas&#x131;l ger&#xE7;ekle&#x15F;tirebilece&#x11F;inizi a&#xE7;&#x131;klamaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><p>Cache&#x2019;lemek (&#xF6;nbelle&#x11F;e alma) dedi&#x11F;imiz i&#x15F;lem, s&#x131;k kullan&#x131;lan veya nadiren de&#x11F;i&#x15F;en datalar&#x131;n ge&#xE7;ici bir depolama alan&#x131;n&#x131;n da saklamas&#x131;d&#x131;r. &#xD6;nbelle&#x11F;e alma, performans&#x131; ve &#xF6;l&#xE7;eklenebilirli&#x11F;i art&#x131;r&#x131;r. Verileri &#xF6;nbelle&#x11F;e ald&#x131;&#x11F;&#x131;m&#x131;z da, verilerin kopyas&#x131; ge&#xE7;ici depolama alan&#x131;nda saklan&#x131;r. B&#xF6;ylelikle bir daha ki sefere ayn&#x131; veriler talep edildi&#x11F;inde ge&#xE7;ici depolama alan&#x131;ndan al&#x131;n&#x131;r ve ana veri kayna&#x11F;&#x131;ndan &#xE7;ok daha h&#x131;zl&#x131; y&#xFC;klenir.</p><p>ASP.NET Core uygulamalar&#x131;nda bellek (memory) &#xFC;zerinde i&#x15F;lemler ger&#xE7;ekle&#x15F;tirebilmek i&#xE7;in built-in olarak gelen MemoryCache servisini aktif hale getirmemiz gerekiyor. Ba&#x11F;&#x131;ml&#x131;l&#x131;k enjeksiyonu (Dependency Injection) yard&#x131;m&#x131;yla IMemoryCache aray&#xFC;z&#xFC; (interface) ile gelen methodlar&#x131; kullanarak bellek (memory) &#xFC;zerinde okuma-yazma i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirilir.</p><p>Hemen bir ASP.NET Core Web API projesi olu&#x15F;tural&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>dotnet new webapi --name &quot;Example&quot;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*EtEeq1Yl_ffDMdspODpqFA.png"><!--kg-card-end: html--><p>Projeyi &#xE7;al&#x131;&#x15F;t&#x131;ral&#x131;m. &#x201C;<a href="https://localhost:5001/WeatherForecast" rel="noopener nofollow">https://localhost:5001/WeatherForecast</a>&#x201D;</p><!--kg-card-begin: markdown--><pre><code>dotnet run
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/2000/1*iTWyqMjmv0WH_lqxzGKyyA.png"><!--kg-card-end: html--><p>&#x201C;Startup.cs&#x201D; dosyas&#x131;nda ihtiya&#xE7; duydu&#x11F;umuz servis tan&#x131;m&#x131;n&#x131; ve yap&#x131;land&#x131;rma ayarlar&#x131;n&#x131; ekliyoruz.</p><!--kg-card-begin: markdown--><pre><code>// Startup.cs
services.AddMemoryCache();
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><code>using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Example
{
	public class Startup
	{
		public Startup(IConfiguration configuration)
		{
			Configuration = configuration;
		}

		public IConfiguration Configuration { get; }

		public void ConfigureServices(IServiceCollection services)
		{
			services.AddMemoryCache();

			services.AddControllers();
		}

		public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
		{
			if (env.IsDevelopment())
			{
				app.UseDeveloperExceptionPage();
			}

			app.UseHttpsRedirection();

			app.UseRouting();

			app.UseAuthorization();

			app.UseEndpoints(endpoints =&gt;
			{
				endpoints.MapControllers();
			});
		}
	}
}
</code><!--kg-card-end: html--><p>Bellek (memory) &#xFC;zerinde &#xF6;rnek i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirmek ad&#x131;na user endpoint&#x2019;lerini tan&#x131;ml&#x131;yoruz.</p><!--kg-card-begin: html--><code>using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;

namespace Example.Controllers
{
	[ApiController]
	[Route(&quot;[controller]&quot;)]
	public class UserController : ControllerBase
	{
		private IMemoryCache _memoryCache;

		public UserController(IMemoryCache memoryCache)
		{
			_memoryCache = memoryCache;
		}

		[HttpGet]
		public IActionResult Get()
		{
			return Ok();
		}

		[HttpPost]
		public IActionResult Post()
		{
			return Ok();
		}
	}
}
</code><!--kg-card-end: html--><p><strong><strong>&#x130;pucu:</strong></strong> Bellek (memory) &#xFC;zerinde veriler key-value &#x15F;eklinde tutulur. Key benzersiz olmal&#x131;d&#x131;r. Aksi takdir de varolan key&#x2019;in de&#x11F;eri g&#xFC;ncellenir.</p><p>&#x201C;DATE_NOW&#x201D; key&#x2019;ine o an ki tarih ve saat bilgisini string olarak belle&#x11F;e yaz&#x131;yoruz.</p><p><strong><strong>&#x130;pucu:</strong></strong> Mehodlar generic oldu&#x11F;u i&#xE7;in her tipte veri kaydedebilirsiniz. Serialization i&#x15F;lemini IMemoryCache kendisi ger&#xE7;ekle&#x15F;tiriyor.</p><!--kg-card-begin: markdown--><pre><code>_memoryCache.Set&lt;string&gt;(&quot;DATE_NOW&quot;, DateTime.Now.ToString());
</code></pre>
<!--kg-card-end: markdown--><p>Bellekten &#x201C;DATE_NOW&#x201D; key&#x2019;ine ait de&#x11F;eri &#xE7;ekiyoruz.</p><!--kg-card-begin: markdown--><pre><code>var value = _memoryCache.Get&lt;string&gt;(&quot;DATE_NOW&quot;);
</code></pre>
<!--kg-card-end: markdown--><p>Bellekten &#x201C;DATE_NOW&#x201D; key&#x2019;ini siliyoruz.</p><!--kg-card-begin: markdown--><pre><code>_memoryCache.Remove(&#x201C;DATE_NOW&#x201D;);
</code></pre>
<!--kg-card-end: markdown--><p>Bir key&#x2019;in bellekte var olup olmad&#x131;&#x11F;&#x131;n&#x131; kontrol etmek i&#xE7;in &#x201C;TryGetValue&#x201D; methodu kullan&#x131;l&#x131;r. Key bellekte var ise method &#x201C;true&#x201D; d&#xF6;ner ve value de&#x11F;i&#x15F;kenine de&#x11F;erini atar. Aksi durumda &#x201C;false&#x201D; d&#xF6;ner.</p><!--kg-card-begin: markdown--><pre><code>if (_memoryCache.TryGetValue&lt;string&gt;(&quot;DATE_NOW&quot;, out string value))
{
  ...
}
</code></pre>
<!--kg-card-end: markdown--><p>Verilerin bellekte tutulmas&#x131;yla ilgili &#xE7;e&#x15F;itli yap&#x131;land&#x131;rma ayarlar&#x131; bulunuyor. Veri olu&#x15F;turulduktan sonra verilen s&#xFC;re sonunda otomatik olarak bellekten silinir.</p><!--kg-card-begin: markdown--><pre><code>var options = new MemoryCacheEntryOptions
{
  AbsoluteExpiration = DateTime.Now.AddSeconds(10)
};
_memoryCache.Set&lt;string&gt;(&quot;DATE_NOW&quot;, DateTime.Now.ToString(), options);
</code></pre>
<!--kg-card-end: markdown--><p>Veri olu&#x15F;turulduktan sonra verilen s&#xFC;re boyunca veriye eri&#x15F;im olmaz ise, otomatik olarak bellekten silinir.</p><!--kg-card-begin: markdown--><pre><code>var options = new MemoryCacheEntryOptions
{
  SlidingExpiration = TimeSpan.FromSeconds(10)
};
_memoryCache.Set&lt;string&gt;(&quot;DATE_NOW&quot;, DateTime.Now.ToString(), options);
</code></pre>
<!--kg-card-end: markdown--><p>Bellek doldu&#x11F;u anda yeni eklenecek olan verilere yer a&#xE7;mak ad&#x131;na hangi verilerin &#xF6;nce silinece&#x11F;ini belirlemek i&#xE7;in &#x201C;Priority&#x201D; property&#x2019;si kullan&#x131;l&#x131;r. &#xD6;nem s&#x131;ras&#x131;na g&#xF6;re tan&#x131;mlamalar yapabilirsiniz.</p><!--kg-card-begin: markdown--><pre><code>// CacheItemPriority.Low
// CacheItemPriority.Normal
// CacheItemPriority.High
// CacheItemPriority.NeverRemove
var options = new MemoryCacheEntryOptions
{
  Priority = CacheItemPriority.Low
};
_memoryCache.Set&lt;string&gt;(&quot;DATE_NOW&quot;, DateTime.Now.ToString(), options);
</code></pre>
<!--kg-card-end: markdown--><p>Bellekten bir veri silindi&#x11F;i zaman bir event olu&#x15F;turulur ve &#x201C;RegisterPostEvictionCallback&#x201D; method&#x2019;unda ki delege tetiklenir. B&#xF6;ylelikle silinen verinin neden silindi&#x11F;i gibi bilgilere sahip olabilir veya ba&#x15F;ka bir tak&#x131;m i&#x15F;lemler ger&#xE7;ekle&#x15F;tirebiliriz.</p><!--kg-card-begin: markdown--><pre><code>var options = new MemoryCacheEntryOptions();
options.RegisterPostEvictionCallback((key, value, reason, state) =&gt;
{
  ...
});
_memoryCache.Set&lt;string&gt;(&quot;DATE_NOW&quot;, DateTime.Now.ToString(), options);
</code></pre>
<!--kg-card-end: markdown--><p>Bir complex type&#x2019;&#x131; belle&#x11F;e yazmak i&#xE7;in get-set method&#x2019;lar&#x131;n&#x131;n generic yap&#x131;s&#x131; kullan&#x131;l&#x131;r.</p><!--kg-card-begin: markdown--><pre><code>// User.cs
public class User
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}
</code></pre>
<!--kg-card-end: markdown--><p>User s&#x131;n&#x131;f&#x131;ndan bir nesne t&#xFC;retip belle&#x11F;e yaz&#x131;yoruz. Birden fazla user yaz&#x131;labilir d&#xFC;&#x15F;&#xFC;ncesi ile benzersiz bir key olu&#x15F;turuyoruz.</p><!--kg-card-begin: markdown--><pre><code>var user = new User
{
  Id = 1,
  FirstName = &quot;An&#x131;l&quot;,
  LastName = &quot;Atalay&quot;
};
_memoryCache.Set&lt;User&gt;($&quot;USER_{user.Id}&quot;, user);
</code></pre>
<!--kg-card-end: markdown--><p>User&#x2019;a ait bellekte ki veriyi okurken get generic method&#x2019;unu kullan&#x131;p bir user nesnesi elde ediyoruz.</p><!--kg-card-begin: markdown--><pre><code>User user = _memoryCache.Get&lt;User&gt;(&quot;USER_1&quot;);
</code></pre>
<!--kg-card-end: markdown--><p>Bellek &#xFC;zerinde temel i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirdik. Art&#x131;k olu&#x15F;turmu&#x15F; oldu&#x11F;umuz projeye devam edelim. En son user endpoint&#x2019;lerini eklemi&#x15F;tik. GET, POST ve DELETE i&#x15F;lemlerine ba&#x15F;layal&#x131;m.</p><!--kg-card-begin: html--><code>using System;
using Example.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;

namespace Example.Controllers
{
	[ApiController]
	[Route(&quot;[controller]&quot;)]
	public class UserController : ControllerBase
	{
		private IMemoryCache _memoryCache;

		public UserController(IMemoryCache memoryCache)
		{
			_memoryCache = memoryCache;
		}

		[HttpGet(&quot;{id}&quot;)]
		public IActionResult Get([FromRoute] int id)
		{
			if (id == default)
				return NotFound();

			var user = _memoryCache.Get<user>($&quot;USER_{id}&quot;);
			if (user == null)
				return NotFound(&quot;User not found.&quot;);

			return Ok(user);
		}

		[HttpPost]
		public IActionResult Post([FromBody] User user)
		{
			if (user == null)
				return BadRequest();

			var userKey = $&quot;USER_{user.Id}&quot;;

			if (!_memoryCache.TryGetValue<user>(userKey, out _))
			{
				var options = new MemoryCacheEntryOptions
				{
					Priority = CacheItemPriority.Low
				};

				_memoryCache.Set<user>(userKey, user, options);
			}

			return Ok(user);
		}

		[HttpDelete(&quot;{id}&quot;)]
		public IActionResult Delete([FromRoute] int id)
		{
			if (id == default)
				return NotFound();

			_memoryCache.Remove($&quot;USER_{id}&quot;);

			return Ok(id);
		}
	}
}
</user></user></user></code><!--kg-card-end: html--><hr><p>Evet art&#x131;k user endpoint&#x2019;leri &#xFC;zerinden belle&#x11F;e veri yazabiliyoruz. Ger&#xE7;ek d&#xFC;nya da bu i&#x15F;lemler veritaban&#x131; ile ger&#xE7;ekle&#x15F;tirilir. Uygulamam&#x131;z&#x131;n yap&#x131;s&#x131;na ba&#x11F;l&#x131; olarak s&#xFC;re&#xE7; de&#x11F;i&#x15F;ebilir. &#x130;lk iste&#x11F;i veritaban&#x131; &#xFC;zerinden &#xE7;ekip d&#xF6;nebilir, daha sonra veriyi belle&#x11F;e yaz&#x131;p di&#x11F;er isteklere bellekte ki veriler ile cevap verilebilir.</p><p>&#xD6;&#x11F;renilecek &#xE7;ok &#x15F;ey, gezilecek &#xE7;ok yer var. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[Docker: ASP.NET Core Uygulamalarını Dockerize Etmek]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core&#x2019;da yaz&#x131;lm&#x131;&#x15F; bir uygulama i&#xE7;in nas&#x131;l docker image&#x2019;&#x131; olu&#x15F;turabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;aca&#x11F;&#x131;m. Bir &#xF6;nce ki yaz&#x131;m da <a href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak">Docker: Dockerfile ile</a></p>]]></description><link>http://anilatalay.com/docker-asp-net-core-uygulamalarini-dockerize-etmek/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8eb</guid><category><![CDATA[Docker]]></category><category><![CDATA[ASP.NET Core]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Mon, 07 Dec 2020 19:07:43 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>ASP.NET Core&#x2019;da yaz&#x131;lm&#x131;&#x15F; bir uygulama i&#xE7;in nas&#x131;l docker image&#x2019;&#x131; olu&#x15F;turabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;aca&#x11F;&#x131;m. Bir &#xF6;nce ki yaz&#x131;m da <a href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak">Docker: Dockerfile ile Image Olu&#x15F;turmak</a><em><em>&#x2019;&#x131;</em> <em>payla&#x15F;m&#x131;&#x15F;t&#x131;m. </em></em>Keyifli okumalar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Docker: Dockerfile ile Image Olu&#x15F;turmak</div><div class="kg-bookmark-description">Merhaba sevgili okur,Docker image&#x2019;lar&#x131; olu&#x15F;turmak i&#xE7;in Dockerfile y&#xF6;nergelerini nas&#x131;lkullanabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. Dockerfile i&#xE7;in giri&#x15F; veya geli&#x15F;meyaz&#x131;s&#x131; olarak d&#xFC;&#x15F;&#xFC;nebilirsiniz. Bir &#xF6;nce ki yaz&#x131;m da Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;inkullanabilece&#x11F;iniz (docker cli) temel komut listesini[/docker&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="http://anilatalay.com/favicon.ico" alt><span class="kg-bookmark-author">.anilatalay</span><span class="kg-bookmark-publisher">An&#x131;l Atalay</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://anilatalay.com/favicon.ico" alt></div></a></figure><p>Hemen ba&#x15F;layal&#x131;m; &#x201C;dotnet cli&#x201D;y&#x131; kullanarak bir web api projesi olu&#x15F;tural&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>dotnet new webapi --name &quot;MyApp&quot;
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1296/1*VKnUhQB2waisYKpRyor_-g.png"><!--kg-card-end: html--><h2 id="uygulamay-al-t-ral-m">Uygulamay&#x131; &#xE7;al&#x131;&#x15F;t&#x131;ral&#x131;m</h2><p>Uygulamay&#x131; test ama&#xE7;l&#x131; &#xE7;al&#x131;&#x15F;t&#x131;ral&#x131;m ve devam edelim.</p><!--kg-card-begin: markdown--><pre><code>dotnet run
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Dockerfile</strong></strong></p><p>Uygulamam&#x131;z&#x131;n ana dizinine Dockerfile dosyas&#x131;n&#x131; ekleyelim. Temel (base) image tan&#x131;m&#x131;m&#x131;z&#x131; yapaca&#x11F;&#x131;z.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Microsoft resmi image&#x2019;lar&#x131;n&#x131; Dockerhub &#xFC;zerinden payla&#x15F;t&#x131;&#x11F;&#x131; gibi ayn&#x131; zaman da kendi container registry&#x2019;si &#xFC;zerinden de payla&#x15F;&#x131;yor.</p><p><strong><strong>Not:</strong></strong> Temel (base) image&#x2019;m&#x131;za dikkatli bakt&#x131;&#x11F;&#x131;m&#x131;zda bir ASP.NET Core SDK&#x2019;s&#x131; oldu&#x11F;u anla&#x15F;&#x131;l&#x131;yor. Fakat bizim uygulamam&#x131;z&#x131;n &#xE7;al&#x131;&#x15F;mas&#x131; i&#xE7;in ASP.NET Core Runtime&#x2019;&#x131; yeterli iken neden SDK image&#x2019;&#x131;n&#x131; kullan&#x131;yoruz. <strong><strong>Asl&#x131;nda yerine de&#x11F;il, birlikte</strong></strong>. SDK image&#x2019;&#x131;n&#x131; uygulamay&#x131; derlemek i&#xE7;in, Runtime image&#x2019;&#x131;n&#x131; ise uygulamay&#x131; &#xE7;al&#x131;&#x15F;t&#x131;rmak i&#xE7;in kullanaca&#x11F;&#x131;z. Detayl&#x131; bilgi i&#xE7;in <a href="https://docs.docker.com/develop/develop-images/multistage-build" rel="noopener nofollow">dok&#xFC;mantasyon</a> sayfas&#x131;na g&#xF6;z atabilirsiniz. (keyword: <a href="https://docs.docker.com/develop/develop-images/multistage-build" rel="noopener nofollow">multi-stage</a>)</p><p><strong><strong>Not:</strong></strong> Uygulaman&#x131;z&#x131; kendi bilgisayar&#x131;n&#x131;zda belirli i&#x15F;letim sistemleri i&#xE7;in ki&#x15F;ile&#x15F;tirilmi&#x15F; ayarlar ile derleyebilir ve bu &#xE7;&#x131;kt&#x131;lar &#xFC;zerinden de image olu&#x15F;turabilirsiniz. Fakat bu y&#xF6;ntem <strong><strong>tavsiye edilmiyor!</strong></strong></p><p><strong><strong>Not:</strong></strong> ASP.NET Core uygulamalar&#x131;n&#x131; Runtime&#x2019;&#x131; ile birlikte paketlemek ve yay&#x131;nlamak m&#xFC;mk&#xFC;nd&#xFC;r. Fakat dosya boyutunu ciddi oranda art&#x131;racakt&#x131;r.</p><p>Konteyner&#x2019;da ki &#xE7;al&#x131;&#x15F;ma dizinini &#x201C;<strong><strong>/source</strong></strong>&#x201D; olarak ayarlayal&#x131;m. &#x130;simlendirme tamamen sizin insiyatifinize kalm&#x131;&#x15F;. Bu dizini uygulama kaynak kodlar&#x131;n&#x131; kopyalamak i&#xE7;in kullanaca&#x11F;&#x131;z.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
</code></pre>
<!--kg-card-end: markdown--><p>Uygulama kaynak kodlar&#x131;n&#x131; &#x201C;<strong><strong>/source&#x201D;</strong></strong> dizinine kopyalayal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Geli&#x15F;tirme (development) ortam&#x131;nda kopyalama i&#x15F;lemi yapaca&#x11F;&#x131;m&#x131;z i&#xE7;in, uygulama dizini i&#xE7;erisinde &#xE7;al&#x131;&#x15F;ma zaman&#x131;ndan kalan dosyalar, geli&#x15F;tirme (development) ortam&#x131;na ait ayar dosyalar&#x131; veya code edit&#xF6;r&#xFC;ne ait istenmeyen dosyalar olabilir. Bunlara benzer istenmeyen veya ihtiya&#xE7; olmayan dosyalar&#x131; konteyner i&#xE7;ine kopyalamak istemeyebilirsiniz. Problemi &#xE7;&#xF6;zmek ad&#x131;na uygulamam&#x131;z&#x131;n ana dizinine &#x201C;<strong><strong>.dockerignore</strong></strong>&#x201D; dosyas&#x131;n&#x131; ekleyelim ve konteyner&#x2019;a aktarmak istemedi&#x11F;imiz dosyalar&#x131; belirleyelim.</p><!--kg-card-begin: markdown--><pre><code># .dockerignore
.git
.gitignore
.vscode
Dockerfile
README.md
**/.DS_Store
</code></pre>
<!--kg-card-end: markdown--><p>Image&#x2019;&#x131;n temelini olu&#x15F;turan i&#x15F;letim sistemi (minimal) &#xFC;zerinde bulunan paketleri g&#xFC;ncelleyelim. Bu ad&#x131;m uygulamalar&#x131;n ihtiya&#xE7; duyabilece&#x11F;i paketlerin y&#xFC;klenebilmesi veya g&#xFC;ncellenmesi i&#xE7;in &#xF6;rnek olarak eklenmi&#x15F;tir.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
</code></pre>
<!--kg-card-end: markdown--><p>Kaynak kodlar&#x131;m&#x131;z art&#x131;k konteyner i&#xE7;inde oldu&#x11F;una g&#xF6;re derleme a&#x15F;amas&#x131;na ge&#xE7;ebiliriz. Konteyner&#x2019;da ki &#xE7;al&#x131;&#x15F;ma dizinini &#x201C;<strong><strong>/source/MyApp</strong></strong>&#x201D; olarak de&#x11F;i&#x15F;tirelim. Burada ki dizin sizin uygulam&#x131;z&#x131;n ana dizinidir.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
</code></pre>
<!--kg-card-end: markdown--><p>Uygulamam&#x131;z&#x131; restore edelim.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
</code></pre>
<!--kg-card-end: markdown--><p>Uygulamay&#x131; &#x201C;/app&#x201D; dizini alt&#x131;na publish alal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
RUN dotnet publish MyApp.csproj --output /app/ --configuration Release
</code></pre>
<!--kg-card-end: markdown--><p>Evet uygulamam&#x131;z art&#x131;k yay&#x131;nlamaya haz&#x131;r hale geldi. &#x15E;imdi as&#x131;l image&#x2019;&#x131; olu&#x15F;turacak dockerfile talimatlar&#x131;na ge&#xE7;elim. Temel (base) image tan&#x131;m&#x131;m&#x131;z&#x131; yapal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
RUN dotnet publish MyApp.csproj --output /app/ --configuration Release
# ------------------------------------------------------------
# Runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
</code></pre>
<!--kg-card-end: markdown--><p>Konteyner&#x2019;da ki &#xE7;al&#x131;&#x15F;ma dizinini &#x201C;<strong><strong>/app</strong></strong>&#x201D; olarak ayarlayal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
RUN dotnet publish MyApp.csproj --output /app/ --configuration Release
# ------------------------------------------------------------
# Runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
</code></pre>
<!--kg-card-end: markdown--><p>&#xD6;nceki katmanlar da publish i&#x15F;lemini halletmi&#x15F;tik. &#x15E;imdi bu i&#x15F;lemlerin sonucunda olu&#x15F;an derlenmi&#x15F; uygulamam&#x131;z&#x131; &#x201C;<strong><strong>/app&#x201D;</strong></strong> dizinine kopyalayal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
RUN dotnet publish MyApp.csproj --output /app/ --configuration Release
# ------------------------------------------------------------
# Runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=builder /app .
</code></pre>
<!--kg-card-end: markdown--><p>Konteyner ba&#x15F;lat&#x131;l&#x131;rken &#xE7;al&#x131;&#x15F;acak olan komutlar&#x131; ekliyoruz.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
# Builder
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS builder
WORKDIR /source
COPY src/ .
RUN apt update
WORKDIR /source/MyApp
RUN dotnet restore MyApp.csproj
RUN dotnet publish MyApp.csproj --output /app/ --configuration Release
# ------------------------------------------------------------
# Runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=builder /app .

</code></pre>
<!--kg-card-end: markdown--><h2 id="dockerize-edelim">Dockerize Edelim</h2><p>Dockerfile&#x2019;m&#x131;z haz&#x131;r oldu&#x11F;una g&#xF6;re art&#x131;k dockerize etme k&#x131;sm&#x131;na ge&#xE7;ebiliriz. &#x201C;docker build&#x201D; komutunu &#xE7;al&#x131;&#x15F;t&#x131;rarak image olu&#x15F;turmakla ba&#x15F;layal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>docker build -t anilatalay/my_dotnetcore_app:1.0.1 .
</code></pre>
<!--kg-card-end: markdown--><p>Art&#x131;k uygulamam&#x131;z&#x131;n bir image&#x2019;&#x131; mevcut, bu image&#x2019;&#x131; kullanarak bir konteyner olu&#x15F;tuyoruz.</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*KnlKNrgaUBlu0W2Yl2xBVA.png"><!--kg-card-end: html--><!--kg-card-begin: markdown--><pre><code>docker run --rm -p 8080:80 anilatalay/my_dotnetcore_app:1.0.1
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*pPVW63dZohAKFhz0B2Wcrg.png"><!--kg-card-end: html--><p>Uygulama konteyner i&#xE7;inde &#x201C;8080&#x201D; portunu kullan&#x131;rken d&#x131;&#x15F;ar&#x131;ya &#x201C;80&#x201D; portu &#xFC;zerinden yay&#x131;nlan&#x131;yor. (<a href="http://localhost:8080/WeatherForecast" rel="noopener nofollow">http://localhost:8080/WeatherForecast</a>)</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*iCx3cS46in5UfUGVtALkew.png"><!--kg-card-end: html--><h2 id="uygulama-image-n-payla-al-m">Uygulama Image&#x2019;n&#x131; Payla&#x15F;al&#x131;m</h2><p>Docker cli &#xFC;zerinden dockerhub&#x2019;a giri&#x15F; yap&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>docker login
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*fz7iIIF5a_S5609i2S9-Fw.png"><!--kg-card-end: html--><p>Dockerhub&#x2019;a image&#x2019;m&#x131;z&#x131; g&#xF6;nderiyoruz.</p><!--kg-card-begin: markdown--><pre><code>docker push anilatalay/my_dotnetcore_app
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*LMQBGzspeEUiwqur6CPGbA.png"><!--kg-card-end: html--><p>Hay&#x131;rl&#x131; olsun. Dockerhub &#xFC;zerinde nur topu gibi image&#x2019;m&#x131;z var. (hub.docker.com) Art&#x131;k isteyen herkes image&#x2019;m&#x131;z&#x131; &#xE7;ekebilir :)</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*Do5ilf7JVaMjmXOCdWQnrQ.png"><!--kg-card-end: html--><p>&#xD6;&#x11F;renilecek &#xE7;ok &#x15F;ey, gezilecek &#xE7;ok yer var. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[Docker: Node.js Uygulamalarını Dockerize Etmek]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>Node.js&#x2019;de yaz&#x131;lm&#x131;&#x15F; bir uygulama i&#xE7;in nas&#x131;l docker image&#x2019;&#x131; olu&#x15F;turabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;aca&#x11F;&#x131;m. Bir &#xF6;nce ki yaz&#x131;m da <a href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak">Docker: Dockerfile ile Image</a></p>]]></description><link>http://anilatalay.com/docker-node-js-uygulamalarini-dockerize-etmek/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8ea</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Mon, 07 Dec 2020 17:23:57 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>Node.js&#x2019;de yaz&#x131;lm&#x131;&#x15F; bir uygulama i&#xE7;in nas&#x131;l docker image&#x2019;&#x131; olu&#x15F;turabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;aca&#x11F;&#x131;m. Bir &#xF6;nce ki yaz&#x131;m da <a href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak">Docker: Dockerfile ile Image Olu&#x15F;turmak</a><em><em>&#x2019;&#x131;</em> <em>payla&#x15F;m&#x131;&#x15F;t&#x131;m. </em></em>Keyifli okumalar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="http://anilatalay.com/docker-dockerfile-ile-image-olusturmak/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Docker: Dockerfile ile Image Olu&#x15F;turmak</div><div class="kg-bookmark-description">Merhaba sevgili okur,Docker image&#x2019;lar&#x131; olu&#x15F;turmak i&#xE7;in Dockerfile y&#xF6;nergelerini nas&#x131;lkullanabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. Dockerfile i&#xE7;in giri&#x15F; veya geli&#x15F;meyaz&#x131;s&#x131; olarak d&#xFC;&#x15F;&#xFC;nebilirsiniz. Bir &#xF6;nce ki yaz&#x131;m da Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;inkullanabilece&#x11F;iniz (docker cli) temel komut listesini[/docker&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="http://anilatalay.com/favicon.ico" alt><span class="kg-bookmark-author">.anilatalay</span><span class="kg-bookmark-publisher">An&#x131;l Atalay</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://anilatalay.com/favicon.ico" alt></div></a></figure><p>Temel amac&#x131;m&#x131;z bir Node.js uygulamas&#x131;n&#x131; dockerize etmek oldu&#x11F;u i&#xE7;in uygulaman&#x131;n seviyesinin bizim senaryomuz i&#xE7;in yeterli oldu&#x11F;u kanaatindeyim. &#x201C;package.json&#x201D; dosyas&#x131; olu&#x15F;turduktan sonra ihtiyac&#x131;m&#x131;z olan paketleri y&#xFC;kl&#xFC;yoruz.</p><!--kg-card-begin: markdown--><pre><code>npm init -y
npm install
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><code>{
  &quot;name&quot;: &quot;app&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;server.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node server.js&quot;
  },
  &quot;keywords&quot;: [],
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;dependencies&quot;: {
    &quot;express&quot;: &quot;^4.17.1&quot;
  }
}
</code><!--kg-card-end: html--><hr><p>&#x201C;server.js&#x201D; dosyas&#x131;n&#x131; olu&#x15F;turup hayat&#x131;m&#x131;za devam ediyoruz.</p><!--kg-card-begin: html--><code>const express = require(&quot;express&quot;);

const PORT = 2323;
const HOST = &quot;0.0.0.0&quot;;

const app = express();
app.get(&quot;/&quot;, (req, res) =&gt; {
  res.send(&quot;Hello World&quot;);
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
</code><!--kg-card-end: html--><hr><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*Z_UXIjQEBsmaLFqwPlmefg.png"><!--kg-card-end: html--><p>Sonu&#xE7; olarak; ekrana &#x201C;Hello World&#x201D; yazan bir servisimiz mevcut. :)</p><h2 id="uygulamay-al-t-ral-m">Uygulamay&#x131; &#xE7;al&#x131;&#x15F;t&#x131;ral&#x131;m</h2><!--kg-card-begin: markdown--><pre><code>npm run start
</code></pre>
<!--kg-card-end: markdown--><h2 id="dockerfile">Dockerfile</h2><p>Uygulamam&#x131;z&#x131;n ana dizinine Dockerfile dosyas&#x131;n&#x131; ekleyelim. Dockerhub &#xFC;zerinden bulunan <a href="https://hub.docker.com/_/node" rel="noopener nofollow">resmi Node.js image</a>&#x2019;n&#x131; kullanaca&#x11F;&#x131;z.</p><p><strong><strong>Not:</strong></strong> Node.js kullan&#x131;labilecek farkl&#x131; sistem ve versiyonlara ait image&#x2019;lar bulunuyor. Uygulaman&#x131;z&#x131;n ihtiya&#xE7; duydu&#x11F;u versiyon ve sisteme ait etikete sahip image&#x2019;&#x131; temel (base) image olarak tan&#x131;mayabilirsiniz.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Bir temel (base) image kullan&#x131;rken versiyon numaras&#x131; vermeye &#xF6;zen g&#xF6;sterin. Aksi durumda &#x201C;node&#x201D; image&#x2019;&#x131;n&#x131;n &#x201C;latest&#x201D; versiyonu &#xE7;ekecektir. Uygulaman&#x131;z&#x131;n eski versiyona ba&#x11F;&#x131;ml&#x131;l&#x131;&#x11F;&#x131; var ise baz&#x131; problemlere sebebiyet verebilir ve uygulaman&#x131;z d&#xFC;zg&#xFC;n &#xE7;al&#x131;&#x15F;mayabilir.</p><p>Konteyner&#x2019;da ki &#xE7;al&#x131;&#x15F;ma dizinini &#x201C;<strong><strong>/app</strong></strong>&#x201D; olarak ayarlayal&#x131;m. &#x130;simlendirme tamamen sizin insiyatifinize kalm&#x131;&#x15F;. Bu dizini uygulama dosyalar&#x131; ile i&#x15F;lemleri ger&#xE7;ekle&#x15F;tirmek i&#xE7;in kullanaca&#x11F;&#x131;z.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
WORKDIR /app
</code></pre>
<!--kg-card-end: markdown--><p>Uygulama dosyalar&#x131;n&#x131; &#x201C;<strong><strong>/app&#x201D;</strong></strong> dizinine kopyalayal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Geli&#x15F;tirme (development) ortam&#x131;nda kopyalama i&#x15F;lemi yapaca&#x11F;&#x131;m&#x131;z i&#xE7;in, uygulama dizini i&#xE7;erisinde &#xE7;al&#x131;&#x15F;ma zaman&#x131;ndan kalan dosyalar, geli&#x15F;tirme (development) ortam&#x131;na ait ayar dosyalar&#x131; veya code edit&#xF6;r&#xFC;ne ait istenmeyen dosyalar olabilir. Bunlara benzer istenmeyen veya ihtiya&#xE7; olmayan dosyalar&#x131; konteyner i&#xE7;ine kopyalamak istemeyebilirsiniz. Problemi &#xE7;&#xF6;zmek ad&#x131;na uygulamam&#x131;z&#x131;n ana dizinine &#x201C;<strong><strong>.dockerignore</strong></strong>&#x201D; dosyas&#x131;n&#x131; ekleyelim ve konteyner&#x2019;a aktarmak istemedi&#x11F;imiz dosyalar&#x131; belirleyelim.</p><!--kg-card-begin: markdown--><pre><code># .dockerignore
*/node_modules
npm-debug.log
.idea
.vscode
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Uygulama dosyalar&#x131;n&#x131; kopyalama i&#x15F;lemi ADD talimat&#x131; kullan&#x131;larak bir source-code repository &#xFC;zerinden &#xE7;ekilebilir.</p><p>Uygulama dosyalar&#x131;m&#x131;z konteyner i&#xE7;inde oldu&#x11F;una g&#xF6;re art&#x131;k ba&#x11F;&#x131;ml&#x131;l&#x131;klar&#x131; y&#xFC;kleyebiliriz. &#x201C;package.json&#x201D; dosyas&#x131;nda tan&#x131;mlanm&#x131;&#x15F; olan paketleri y&#xFC;klemeye ba&#x15F;layal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Uygulaman&#x131;z&#x131;n ihtiya&#xE7; duydu&#x11F;u de&#x11F;i&#x15F;iklik, y&#xFC;kleme vb i&#x15F;lemleri ekleyebilirsiniz.</p><p>Hissediyorum sona yakla&#x15F;t&#x131;k. Konteyner ba&#x15F;lat&#x131;l&#x131;rken &#xE7;al&#x131;&#x15F;acak olan komutlar&#x131; ekliyoruz.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install
CMD yarn run start
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Bir &#x201C;sh&#x201D; benzeri kurulum veya &#xE7;al&#x131;&#x15F;t&#x131;rma dosyas&#x131; olu&#x15F;turup onu da ba&#x15F;lang&#x131;&#xE7; komutu olarak tan&#x131;mlayabilirsiniz.</p><p>Son olarak; uygulamam&#x131;z bir web application oldu&#x11F;u i&#xE7;in hangi port (2323) &#xFC;zerinden yay&#x131;n yapaca&#x11F;&#x131;m&#x131;z&#x131;da belirtmemiz gerekiyor. Aksi takdir de uygulamaya konteyner&#x2019;&#x131;n d&#x131;&#x15F;&#x131;ndan kimse eri&#x15F;mez.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM node:15
WORKDIR /app
COPY /src .
RUN yarn install
CMD yarn run start
EXPOSE 2323
</code></pre>
<!--kg-card-end: markdown--><h2 id="dockerize-edelim">Dockerize Edelim</h2><p>Dockerfile&#x2019;m&#x131;z haz&#x131;r oldu&#x11F;una g&#xF6;re art&#x131;k dockerize etme k&#x131;sm&#x131;na ge&#xE7;ebiliriz. &#x201C;docker build&#x201D; komutunu &#xE7;al&#x131;&#x15F;t&#x131;rarak image olu&#x15F;turmakla ba&#x15F;layal&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>docker build -t anilatalay/my_node_app:1.0.1 .
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*YgSPMOmnnV5t9DKoNXkYQg.png"><!--kg-card-end: html--><p>Art&#x131;k uygulamam&#x131;z&#x131;n bir image&#x2019;&#x131; mevcut, bu image&#x2019;&#x131; kullanarak bir konteyner olu&#x15F;tuyoruz.</p><!--kg-card-begin: markdown--><pre><code>docker run --rm -p 80:2323 anilatalay/my_node_app:1.0.1
</code></pre>
<!--kg-card-end: markdown--><p>Uygulama konteyner i&#xE7;inde &#x201C;2323&quot; portunu kullan&#x131;rken d&#x131;&#x15F;ar&#x131;ya &#x201C;80&#x201D; portu &#xFC;zerinden yay&#x131;nlan&#x131;yor.</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*yMbkEs9sv8fxWF8YyVCwMg.png"><!--kg-card-end: html--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*xtzYKYiM9AcSPTqSBi0WYw.png"><!--kg-card-end: html--><h2 id="uygulama-image-n-payla-al-m">Uygulama Image&#x2019;n&#x131; Payla&#x15F;al&#x131;m</h2><p>Docker cli &#xFC;zerinden dockerhub&#x2019;a giri&#x15F; yap&#x131;yoruz.</p><!--kg-card-begin: markdown--><pre><code>docker login
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*F26rXwA-bqlJRsEvePCfsg.png"><!--kg-card-end: html--><p>Dockerhub&#x2019;a image&#x2019;m&#x131;z&#x131; g&#xF6;nderiyoruz.</p><!--kg-card-begin: markdown--><pre><code>docker push anilatalay/my_node_app
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*QRXXqd4BsJbs5DmzpyiYJg.png"><!--kg-card-end: html--><p>Hay&#x131;rl&#x131; olsun. Dockerhub &#xFC;zerinde nur topu gibi image&#x2019;m&#x131;z var. (<a href="https://hub.docker.com/" rel="noopener nofollow">hub.docker.com</a>) Art&#x131;k isteyen herkes image&#x2019;m&#x131;z&#x131; &#xE7;ekebilir :)</p><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*4scU8j-IrOjXLbigCfC_tA.png"><!--kg-card-end: html--><p>&#xD6;&#x11F;renilecek &#xE7;ok &#x15F;ey, gezilecek &#xE7;ok yer var. Her bir yaz&#x131;m da ger&#xE7;ek d&#xFC;nyaya bir ad&#x131;m daha yakla&#x15F;aca&#x11F;&#x131;z. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[Docker: Dockerfile ile Image Oluşturmak]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>Docker image&#x2019;lar&#x131; olu&#x15F;turmak i&#xE7;in Dockerfile y&#xF6;nergelerini nas&#x131;l kullanabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. Dockerfile i&#xE7;in giri&#x15F; veya geli&#x15F;me yaz&#x131;s&#x131; olarak d&#xFC;&#x15F;</p>]]></description><link>http://anilatalay.com/docker-dockerfile-ile-image-olusturmak/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8e9</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Mon, 07 Dec 2020 13:39:39 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>Docker image&#x2019;lar&#x131; olu&#x15F;turmak i&#xE7;in Dockerfile y&#xF6;nergelerini nas&#x131;l kullanabilece&#x11F;inizi anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. Dockerfile i&#xE7;in giri&#x15F; veya geli&#x15F;me yaz&#x131;s&#x131; olarak d&#xFC;&#x15F;&#xFC;nebilirsiniz. Bir &#xF6;nce ki yaz&#x131;m da <a href="http://anilatalay.com/docker-konteyner-ucar-sen-komutu-hatirla/">Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;in kullanabilece&#x11F;iniz (docker cli) temel komut listesini</a><em><em> payla&#x15F;m&#x131;&#x15F;t&#x131;m. </em></em>Keyifli okumalar.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="http://anilatalay.com/docker-konteyner-ucar-sen-komutu-hatirla/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Docker: Konteyner u&#xE7;ar sen komutu hat&#x131;rla!</div><div class="kg-bookmark-description">Merhaba sevgili okur,Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;in kullanabilece&#x11F;iniz (docker cli) temel komut listesini&#xF6;rnekler &#xFC;zerinden anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. docker ps &#xC7;al&#x131;&#x15F;an konteyner&#x2019;lar&#x131; listeler. docker ps -a &#xC7;al&#x131;&#x15F;an &#xE7;al&#x131;&#x15F;mayan t&#xFC;m konteyner&#x2019;lar&#x131; listeler. docker images &#x130;ndirilmi&#x15F; image&#x2019;lar&#x131; listeler. do&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="http://anilatalay.com/favicon.ico" alt><span class="kg-bookmark-author">.anilatalay</span><span class="kg-bookmark-publisher">An&#x131;l Atalay</span></div></div><div class="kg-bookmark-thumbnail"><img src="http://anilatalay.com/content/images/2020/12/1_dP3wo4XAADSzpZnX8hrT9g.gif" alt></div></a></figure><p>Docker, Dockerfile&#x2019;daki talimatlar&#x131; okuyarak image&#x2019;lar&#x131; otomatik olarak olu&#x15F;turur.</p><p>Dockerfile ba&#x15F;ka bir dizinde ise -f arg&#xFC;man&#x131; ile dosya yolu verilebilir.</p><!--kg-card-begin: markdown--><pre><code>docker build -f files/Dockerfile .
</code></pre>
<!--kg-card-end: markdown--><p>Image etiketlemek i&#xE7;in -t arg&#xFC;man&#x131; kullan&#x131;labilir.</p><!--kg-card-begin: markdown--><pre><code>docker build -t anilatalay/example:1.0.1 .
</code></pre>
<!--kg-card-end: markdown--><p>Etiket arg&#xFC;man&#x131; birden fazla kez kullan&#x131;labilir.</p><!--kg-card-begin: markdown--><pre><code>docker build -t anilatalay/example:1.0.1 -t anilatalay/example:latest .
</code></pre>
<!--kg-card-end: markdown--><p><strong><strong>Not:</strong></strong> Docker daemon, Dockerfile&#x2019;daki talimatlar&#x131; &#xE7;al&#x131;&#x15F;t&#x131;rmadan &#xF6;nce Dockerfile i&#xE7;in bir &#xF6;n do&#x11F;rulama ger&#xE7;ekle&#x15F;tirir ve s&#xF6;zdizimi yanl&#x131;&#x15F;sa bir hata d&#xF6;nd&#xFC;r&#xFC;r.</p><p><strong><strong>Not:</strong></strong> Dockerfile&#x2019;daki talimatlar s&#x131;rayla ve tek tek &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;l&#x131;r. (Deneysel baz&#x131; &#xE7;al&#x131;&#x15F;malar bulunuyor paralel &#xE7;al&#x131;&#x15F;t&#x131;rmak gibi..)</p><p>Docker, derleme s&#xFC;recini &#xF6;nemli &#xF6;l&#xE7;&#xFC;de h&#x131;zland&#x131;rmak i&#xE7;in de&#x11F;i&#x15F;iklik yok ise ara ad&#x131;mlar&#x131; (&#xF6;nbellek) yeniden kullan&#x131;r.</p><p><strong><strong>#</strong></strong> ile ba&#x15F;layan sat&#x131;rlar&#x131; yorum olarak de&#x11F;erlendirilir.</p><p><strong><strong>\ </strong></strong>kodun alt sat&#x131;rdan devam etti&#x11F;i anlam&#x131;na gelir.</p><!--kg-card-begin: markdown--><pre><code>RUN echo hello \
world
</code></pre>
<!--kg-card-end: markdown--><h2 id="from">FROM</h2><p>DockerHub&#x2019;da daha &#xF6;nce haz&#x131;rlanm&#x131;&#x15F; olan temel(base) image&#x2019;lar &#xFC;zerine bir &#x15F;eyler ekleyip-&#xE7;&#x131;kartarak kendi nihai image&#x2019;z&#x131;m&#x131;z&#x131; olu&#x15F;tuyoruz.<br><strong><strong>Not:</strong></strong> Dockerfile bir FROM talimat&#x131; ile ba&#x15F;lamal&#x131;d&#x131;r.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
</code></pre>
<!--kg-card-end: markdown--><p>Docker build i&#x15F;lemi yapt&#x131;&#x11F;&#x131;m&#x131;zda bir ubuntu image&#x2019;&#x131; olu&#x15F;acak. Bu image zaten var olan &#x201C;ubuntu&#x201D; image ile bire bir ayn&#x131;d&#x131;r, &#xE7;&#xFC;nk&#xFC; image &#xFC;zerinde hi&#xE7;bir de&#x11F;i&#x15F;iklik yapmad&#x131;k.</p><h2 id="run">RUN</h2><p>Temel image&#x2019;&#x131;n &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;laca&#x11F;&#x131; i&#x15F;letim sistemi (en minimal hali) &#xFC;st&#xFC;nde komutlar &#xE7;al&#x131;&#x15F;t&#x131;rmam&#x131;z&#x131; sa&#x11F;lar.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
</code></pre>
<!--kg-card-end: markdown--><p>Bir ubuntu haz&#x131;rlan&#x131;yor ve i&#xE7;inde komutlar &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;l&#x131;yor. Varolan paketler g&#xFC;ncelleniyor ve sistem &#xFC;zerine &#x201C;telnet&#x201D; kuruluyor.</p><p><strong><strong>Not:</strong></strong> Debian temelli Linux da&#x11F;&#x131;t&#x131;mlar&#x131;n da &#x201C;apt-get&#x201D; paket y&#xF6;neticisidir.<br><strong><strong>Not:</strong></strong> Komutlar&#x131;n&#x131;z&#x131; farkl&#x131; RUN talimatlar&#x131; ile kullanabilece&#x11F;iniz gibi tek RUN talimat&#x131; i&#xE7;inde de tan&#x131;mlayabilirsiniz.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update &amp;&amp; apt-get install -y telnet
</code></pre>
<!--kg-card-end: markdown--><h2 id="env">ENV</h2><p>Temel image i&#xE7;inde bulunan i&#x15F;letim sistemi (en minimal hali) i&#xE7;inde ortam de&#x11F;i&#x15F;kenleri eklemizi sa&#x11F;lar.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
</code></pre>
<!--kg-card-end: markdown--><p>Bu Image kullan&#x131;larak bir konteyner olu&#x15F;tu&#x11F;unda ortam de&#x11F;i&#x15F;kenlerinde APP_URL g&#xF6;rebilirsiniz.</p><h2 id="copy">COPY</h2><p>Yolu belirtilen dosyalar&#x131;, konteyner&#x2019;in dosya sisteminin belirtilen dizinine kopyalar.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
COPY app/ my_app/
</code></pre>
<!--kg-card-end: markdown--><p>&#x201C;app&#x201D; dizini alt&#x131;nda bulunan dosyalar&#x131;, konteyner&#x2019;a &#x201C;my_app&#x201D; dizini alt&#x131;na kopyalar.</p><h2 id="workdir">WORKDIR</h2><p>Dockerfile&#x2019;da onu izleyen herhangi bir RUN, CMD, ENTRYPOINT, COPY ve ADD talimatlar&#x131; i&#xE7;in &#xE7;al&#x131;&#x15F;ma dizinini ayarlar.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
</code></pre>
<!--kg-card-end: markdown--><p>WORKDIR komutunda sonra &#xE7;al&#x131;&#x15F;acak olan komutlar&#x131;n hepsi &#x201C;my_workplace&#x201D; dizini alt&#x131;nda &#xE7;al&#x131;&#x15F;acaklar. &#x201C;my_app&#x201D; dizini &#x201C;my_workplace&#x201D; alt&#x131;nda olu&#x15F;acakt&#x131;r.</p><h2 id="add">ADD</h2><p>COPY ve ADD, benzer ama&#xE7;lara hizmet eden Dockerfile talimatlar&#x131;d&#x131;r. COPY yaln&#x131;zca ana bilgisayar&#x131;n&#x131;zdan konteyner dizinine kopyalaman&#x131;za izin verir. ADD talimat&#x131; ile bunu yapabilece&#x11F;iniz gibi bir URL &#xFC;zerinden de dosya kopyalama yapabilirsiniz.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
</code></pre>
<!--kg-card-end: markdown--><p>Belirtilen URL&#x2019;den jpg format&#x131;nda ki dosyay&#x131; images dizini alt&#x131;na kopyalar.</p><h2 id="arg">ARG</h2><p>Docker build komutuyla derleme zaman&#x131;nda konteyner&#x2019;a iletebilecekleri bir de&#x11F;i&#x15F;keni tan&#x131;mlar.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
ARG MY_CONNECTION_STRING
ENV CONNECTION_STRING=$MY_CONNECTION_STRING
</code></pre>
<!--kg-card-end: markdown--><p>&#x201C;build-arg&#x201D; arg&#xFC;man&#x131;n&#x131; kullanarak &#x201C;MY_CONNECTION_STRING=blabla&#x201D; build a&#x15F;amas&#x131;nda de&#x11F;erleri ge&#xE7;iyoruz. Daha sonra ENV talimat&#x131; ile ortam de&#x11F;i&#x15F;keni olarak ekliyoruz.</p><!--kg-card-begin: markdown--><pre><code>docker build -t anilatalay/example:1.0.1 --build-arg MY_CONNECTION_STRING=blabla .
</code></pre>
<!--kg-card-end: markdown--><h2 id="volume">VOLUME</h2><p>VOLUME komutu, belirtilen adda bir ba&#x11F;lama noktas&#x131; olu&#x15F;turur ve bunu yerel ana bilgisayardan veya di&#x11F;er kapsay&#x131;c&#x131;lardan harici olarak monte edilmi&#x15F; birimleri tutuyor olarak i&#x15F;aretler.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
ARG MY_CONNECTION_STRING
ENV CONNECTION_STRING=$MY_CONNECTION_STRING
VOLUME /images
</code></pre>
<!--kg-card-end: markdown--><h2 id="expose">EXPOSE</h2><p>Docker&#x2019;a, konteynerin &#xE7;al&#x131;&#x15F;ma zaman&#x131;nda belirtilen portu (a&#x11F; ba&#x11F;lant&#x131; noktalar&#x131;) dinledi&#x11F;ini bildirir.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
ARG MY_CONNECTION_STRING
ENV CONNECTION_STRING=$MY_CONNECTION_STRING
VOLUME /images
EXPOSE 80
</code></pre>
<!--kg-card-end: markdown--><p>Bu senaryo i&#xE7;in &#xE7;ok anlaml&#x131; olmasada kullan&#x131;m&#x131;n&#x131; g&#xF6;stermek istedim.</p><h2 id="cmd">CMD</h2><p>Konteyner &#xE7;al&#x131;&#x15F;t&#x131;&#x11F;&#x131; anda CMD komutu ile belirtilen varsay&#x131;lan komutu &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;r.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
ARG MY_CONNECTION_STRING
ENV CONNECTION_STRING=$MY_CONNECTION_STRING
VOLUME /images
EXPOSE 80
CMD [ &quot;ls&quot; ]
</code></pre>
<!--kg-card-end: markdown--><p>CMD talimat&#x131; verilen &#x201C;ls&#x201D; komutu ile konteyner &#xE7;al&#x131;&#x15F;t&#x131;&#x11F;&#x131; anda WORKDIR talimat&#x131;n da belirtilen dizinin i&#xE7;indeki dosya ve klas&#xF6;rleri listeyecek.</p><!--kg-card-begin: markdown--><pre><code>docker run --rm anilatalay/example:1.0.1
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*tArq-ovr9eBi-CgffyoGCA.png"><!--kg-card-end: html--><p><strong><strong>Not:</strong></strong> &#xC7;al&#x131;&#x15F;t&#x131;r komutuna bir arg&#xFC;man ge&#xE7;erseniz, CMD talimat&#x131; ge&#xE7;ersiz say&#x131;l&#x131;r. &#xC7;&#x131;kt&#x131; olarak &#x201C;ls&#x201D; yerine &#x201C;echo merhaba&#x201D; komutu &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;lacak.</p><!--kg-card-begin: markdown--><pre><code>docker run --rm anilatalay/example:1.0.1 echo merhaba
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><img src="https://miro.medium.com/max/1400/1*a1cxdAPhUDVoLUAucs4zYQ.png"><!--kg-card-end: html--><h2 id="entrypoint">ENTRYPOINT</h2><p>Konteyner&#x2019;&#x131;n nas&#x131;l &#xE7;al&#x131;&#x15F;aca&#x11F;&#x131;n&#x131; yap&#x131;land&#x131;rmak i&#xE7;in kullan&#x131;lan di&#x11F;er talimatt&#x131;r. CMD&#x2019;de oldu&#x11F;u gibi, bir komut ve parametreler belirlemeniz gerekir.</p><!--kg-card-begin: markdown--><pre><code># Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y telnet
ENV APP_URL=https://medium.com/@anilatalay
WORKDIR /my_workplace
COPY app/ my_app/
ADD https://cdn.pixabay.com/photo/2020/05/12/13/38/common-blue-butterfly-5163066_1280.jpg images/
ARG MY_CONNECTION_STRING
ENV CONNECTION_STRING=$MY_CONNECTION_STRING
VOLUME /images
EXPOSE 80
ENTRYPOINT [ &quot;echo&quot;, &quot;anilatalay&quot; ]
</code></pre>
<!--kg-card-end: markdown--><p>ENTRYPOINT talimat&#x131; verilen &#x201C;echo anilatalay&#x201D; komutu ile konteyner &#xE7;al&#x131;&#x15F;t&#x131;&#x11F;&#x131; anda ekrana &#xE7;&#x131;kt&#x131; olarak &#x201C;anilatalay&#x201D; yazacakt&#x131;r.</p><p><strong><strong>Not:</strong></strong> Kullan&#x131;lan komutlar&#x131;n baz&#x131;lar&#x131; windows konteyner&#x2019;lar da sorun &#xE7;&#x131;kartabilir. Detayl&#x131; bilgi i&#xE7;in <a href="https://docs.docker.com/engine/reference/builder" rel="noopener nofollow">dok&#xFC;mantasyon</a> sayfas&#x131;na g&#xF6;z atabilirsiniz.</p><p>&#xD6;&#x11F;renilecek &#xE7;ok &#x15F;ey, gezilecek &#xE7;ok yer var. Her bir yaz&#x131;mda ger&#xE7;ek d&#xFC;nyaya bir ad&#x131;m daha yakla&#x15F;aca&#x11F;&#x131;z. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[Docker: Konteyner uçar sen komutu hatırla!]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;in kullanabilece&#x11F;iniz (docker cli) temel komut listesini &#xF6;rnekler &#xFC;zerinden anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>docker ps
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;&#x15F;an konteyner&#x2019;lar&#x131; listeler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_dP3wo4XAADSzpZnX8hrT9g.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker ps -a
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;</p>]]></description><link>http://anilatalay.com/docker-konteyner-ucar-sen-komutu-hatirla/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8e8</guid><category><![CDATA[Docker]]></category><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Fri, 04 Dec 2020 08:20:47 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>Docker&#x2019;&#x131; y&#xF6;netmek i&#xE7;in kullanabilece&#x11F;iniz (docker cli) temel komut listesini &#xF6;rnekler &#xFC;zerinden anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m.</p><!--kg-card-begin: markdown--><pre><code>docker ps
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;&#x15F;an konteyner&#x2019;lar&#x131; listeler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_dP3wo4XAADSzpZnX8hrT9g.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker ps -a
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;&#x15F;an &#xE7;al&#x131;&#x15F;mayan t&#xFC;m konteyner&#x2019;lar&#x131; listeler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1__-y6Ye9Ly3b40nIU21x6-Q.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker images
</code></pre>
<!--kg-card-end: markdown--><p>&#x130;ndirilmi&#x15F; image&#x2019;lar&#x131; listeler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_yv43McO2oZGKCqaq4jlOzg.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker pull alpine
</code></pre>
<!--kg-card-end: markdown--><p>Docker repository (hub.docker.com) den ad&#x131; verilen (alpine) image&#x2019;&#x131; &#xE7;eker.</p><p><strong><strong>Not:</strong></strong> &#x201C;alpine&#x201D; k&#xFC;&#xE7;&#xFC;k bir Linux da&#x11F;&#x131;t&#x131;m&#x131;d&#x131;r.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_L_od0qVCoVVaOGIErzmp8w.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker run alpine
</code></pre>
<!--kg-card-end: markdown--><p>Ad&#x131; verilen image&#x2019;dan bir konteyner olu&#x15F;turur ve image&#x2019;a eklemi&#x15F; ba&#x15F;lang&#x131;&#xE7; kodunu &#xE7;al&#x131;&#x15F;t&#x131;r&#x131;r. Bu ba&#x15F;lang&#x131;&#xE7; kodu dockerfile k&#x131;sm&#x131;nda ayr&#x131;nt&#x131;l&#x131; a&#xE7;&#x131;klayaca&#x11F;&#x131;m. Bu kod sonlad&#x131;ktan sonra konteyner kapal&#x131; duruma ge&#xE7;er.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_syoBVVyN66IxymmMXQRxYQ.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker run -d jpetazzo/clock
</code></pre>
<!--kg-card-end: markdown--><p>Ad&#x131; verilen image&#x2019;dan bir konteyner olu&#x15F;turur ve arka planda &#xE7;al&#x131;&#x15F;maya devam eder.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_fhTpTiUZtTb-ASZCQJ0hqQ.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker run --rm hello-world
</code></pre>
<!--kg-card-end: markdown--><p>Ad&#x131; verilen image&#x2019;dan bir konteyner olu&#x15F;turur ve konteyner&#x2019;&#x131;n ba&#x15F;lang&#x131;&#xE7; kodu &#xE7;al&#x131;&#x15F;t&#x131;ktan sonra konteyner otomatik olarak silinir.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_wZ1BOQE-xFs-gDljLBsBmQ.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker run -it alpine
</code></pre>
<!--kg-card-end: markdown--><p>Ad&#x131;verilen image&#x2019;dan bir konteyner olu&#x15F;turur ve konteyner&#x2019;e terminal ba&#x11F;lant&#x131;s&#x131; sa&#x11F;lar.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_YLpceVYFrmyY1KsXh8fTFQ.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker stop 09f8b2a5d25b
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;&#x15F;an konteyner&#x2019;a k&#x131;sa bir s&#xFC;re (10sn) sonra kapanaca&#x11F;&#x131;n&#x131; belirten bir sinyal g&#xF6;nderir ve s&#xFC;re tamamland&#x131;&#x11F;&#x131;nda konteyner&#x2019;&#x131; sonlad&#x131;r&#x131;l&#x131;r.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_fsWRCfgYoKhqllkLOY8liQ.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker kill 09f8b2a5d25b
</code></pre>
<!--kg-card-end: markdown--><p>Id&#x2019;si verilen &#xE7;al&#x131;&#x15F;an konteyner&#x2019;&#x131; sonlad&#x131;r&#x131;r.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_Y6rJGl4B7kTtgWcjnS2wGw.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker rm 99ae02566af7
</code></pre>
<!--kg-card-end: markdown--><p>Id&#x2019;si verilen konteyner&#x2019;i siler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_ETPVvVF_0Ikil3QzsL1ffQ.gif" class="kg-image" alt loading="lazy"></figure><p><strong><strong>Not:</strong></strong> Id kullan&#x131;lan komutlar da id&#x2019;nin benzersiz 3&#x2013;4 karakterini de kullanabilirsiniz. (&#xD6;rnek: 99ae02566af7 -&gt; 99a)</p><!--kg-card-begin: markdown--><pre><code>docker rmi 321d39ea3f0f
</code></pre>
<!--kg-card-end: markdown--><p>Id&#x2019;si verilen image&#x2019;&#x131; siler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_V-kmhEiVlxE21yzm8Agqog.gif" class="kg-image" alt loading="lazy"></figure><p><strong><strong>Not:</strong></strong> Image&#x2019;&#x131; kullanan konteyner&#x2019;lar bulunuyorsa silme i&#x15F;lemi ger&#xE7;ekle&#x15F;mez.</p><!--kg-card-begin: markdown--><pre><code>docker exec -it 321d39ea3f0f sh
</code></pre>
<!--kg-card-end: markdown--><p>&#xC7;al&#x131;&#x15F;an konteyner&#x2019;a eri&#x15F;mek ve i&#xE7;inde komut &#xE7;al&#x131;&#x15F;t&#x131;rabilmek i&#xE7;in kullan&#x131;l&#x131;r.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_KcSM2yYa4B2tJWOeQ2aBEw.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker run -p 8080:80 nginx
</code></pre>
<!--kg-card-end: markdown--><p>Ad&#x131; verilen image&#x2019;dan bir konteyner olu&#x15F;turur ve 8080 portuna gelen istekleri konteyner i&#xE7;erisindeki 80 portuna y&#xF6;nlendirir.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_uCbbuRl6NEAG4OmzD1hVtQ-1.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker logs 321d39ea3f0f
</code></pre>
<!--kg-card-end: markdown--><p>Id&#x2019;si verilen konteyner&#x2019;&#x131;n olu&#x15F;turmu&#x15F; oldu&#x11F;u log&#x2019;lar&#x131; g&#xF6;r&#xFC;nt&#xFC;ler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_oCQpZSKzgOaQoHw_hfkqiA.gif" class="kg-image" alt loading="lazy"></figure><!--kg-card-begin: markdown--><pre><code>docker logs -f 321d39ea3f0f
</code></pre>
<!--kg-card-end: markdown--><p>Id&#x2019;si verilen konteyner&#x2019;&#x131;n olu&#x15F;turmu&#x15F; oldu&#x11F;u canl&#x131; log&#x2019;lar&#x131; g&#xF6;r&#xFC;nt&#xFC;ler.</p><figure class="kg-card kg-image-card"><img src="http://anilatalay.com/content/images/2020/12/1_K63ZWqrp0voG6OdWeLufjg.gif" class="kg-image" alt loading="lazy"></figure><p>Development ortam&#x131;n&#x131;z da burada ki komutlar (docker cli) ile Docker&#x2019;&#x131; y&#xF6;netebilirsiniz. Fakat ger&#xE7;ek d&#xFC;nya da i&#x15F;ler tabi ki b&#xF6;yle y&#xFC;r&#xFC;m&#xFC;yor :( Her bir yaz&#x131;mda ger&#xE7;ek d&#xFC;nyaya bir ad&#x131;m daha yakla&#x15F;aca&#x11F;&#x131;z. Bir sonraki postumda g&#xF6;r&#xFC;&#x15F;mek &#xFC;zere.</p>]]></content:encoded></item><item><title><![CDATA[Regex — Konuşuyorum ama yazamıyorum]]></title><description><![CDATA[<p>Merhaba sevgili okur,<br>D&#xFC;zenli ifadeler, temel olarak metin i&#xE7;erisinde belirli kurallara g&#xF6;re e&#x15F;le&#x15F;tirme yapmak i&#xE7;in kullan&#x131;l&#x131;r. Burada bilinmesi gereken en &#xF6;nemli &#x15F;ey <strong><strong>her &#x15F;eyin bir karakter</strong></strong> oldu&#x11F;udur. &#x130;htiyac&</p>]]></description><link>http://anilatalay.com/regex-konusuyorum-ama-yazamiyorum/</link><guid isPermaLink="false">61ec13edcaf9ab03ac6ae8e7</guid><dc:creator><![CDATA[Anıl Atalay]]></dc:creator><pubDate>Thu, 03 Dec 2020 11:55:12 GMT</pubDate><content:encoded><![CDATA[<p>Merhaba sevgili okur,<br>D&#xFC;zenli ifadeler, temel olarak metin i&#xE7;erisinde belirli kurallara g&#xF6;re e&#x15F;le&#x15F;tirme yapmak i&#xE7;in kullan&#x131;l&#x131;r. Burada bilinmesi gereken en &#xF6;nemli &#x15F;ey <strong><strong>her &#x15F;eyin bir karakter</strong></strong> oldu&#x11F;udur. &#x130;htiyac&#x131;m&#x131;z oldu&#x11F;unda bizim yerimize regex ifadeyi olu&#x15F;turan haz&#x131;r ara&#xE7;lar olmas&#x131;na kar&#x15F;&#x131;n, olu&#x15F;turulan ifadenin ne anlama geldi&#x11F;ini anlamak ad&#x131;na kendimce notlar ald&#x131;m, umar&#x131;m sizde faydalan&#x131;rs&#x131;n&#x131;z.</p><h2 id="karakter">Karakter</h2><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /y/<br>
terc&#xFC;me: &apos;y&apos; karakteri olmal&#x131;.</p>
<p>sonu&#xE7;: merhaba d&#xFC;n<strong>y</strong>a.<br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="karakter-dizisi">Karakter dizisi</h2><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
metin: /d&#xFC;ny/<br>
terc&#xFC;me: &apos;d&#xFC;ny&apos; karakter dizisi olmal&#x131;.</p>
<p>sonu&#xE7;: merhaba <strong>d&#xFC;ny</strong>a.<br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="say-lar">Say&#x131;lar</h2><!--kg-card-begin: markdown--><p>metin: 11111 22222 33333 44444<br>
metin: /44444/<br>
terc&#xFC;me: 5 adet &apos;4&apos; karakteri yan yana olmal&#x131;.</p>
<p>sonu&#xE7;: 11111 22222 33333 <strong>44444</strong><br>
index: 18</p>
<!--kg-card-end: markdown--><h2 id="herhangi-bir-karakter-nokta-">Herhangi bir karakter &#x201C;.&#x201D; (nokta)</h2><p>&#x201D; . &#x201D; (nokta) herhangi bir karakterle (harf, rakam, bo&#x15F;luk, her &#x15F;ey) e&#x15F;le&#x15F;ebilir. Desene karakter say&#x131;s&#x131; kadar &#x201D; . &#x201D; (nokta) eklenebilir.<br><strong><strong>Not:</strong></strong> Bu durum ger&#xE7;ek nokta karakterinin e&#x15F;le&#x15F;mesini ge&#xE7;ersiz k&#x131;ld&#x131;&#x11F;&#x131; i&#xE7;in ters e&#x11F;ik &#xE7;izgi &#x201D; \. &#x201D; ile ger&#xE7;ek nokta karakteri e&#x15F;le&#x15F;mesi sa&#x11F;lan&#x131;r.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /r..b/<br>
not: &quot;..&quot; yerine nokta say&#x131;s&#x131; kadar herhangi bir karakter gelebilir demektir.<br>
terc&#xFC;me: &apos;r&apos; karakteri ile ba&#x15F;lamal&#x131;, herhangi iki karakter ile devam etmeli ve son karakteri &apos;b&apos; olmal&#x131;.</p>
<p>sonu&#xE7;: me<strong>rhab</strong>a d&#xFC;nya.<br>
index: 2</p>
<!--kg-card-end: markdown--><h2 id="herhangi-bir-rakam-d-">Herhangi bir rakam &#x201C;\d&#x201D;</h2><p>Metin i&#xE7;erisinde &#x201D; \d &#x201D; herhangi bir rakamla e&#x15F;le&#x15F;ebilir. Desene rakam say&#x131;s&#x131; kadar &#x201D; \d &#x201D; eklenebilir.</p><!--kg-card-begin: markdown--><p>metin: abc123xyz<br>
regex: /\d\dx/<br>
not: &quot;\d\d&quot; yerine \d say&#x131;s&#x131; kadar herhangi bir rakam gelebilir demektir.<br>
terc&#xFC;me: herhangi iki rakam yan yana gelmeli ve &apos;x&apos; karakteri ile devam etmeli.</p>
<p>sonu&#xE7;: abc1<strong>23x</strong>yz<br>
index: 4</p>
<!--kg-card-end: markdown--><h2 id="belirli-karakterler-veya-">Belirli karakterler &#x201D; [ ] &#x201D; (veya)</h2><p>Karakterleri k&#xF6;&#x15F;eli parantez i&#xE7;inde tan&#x131;mlayarak i&#xE7;lerinden biri ile e&#x15F;le&#x15F;mesini sa&#x11F;layabilirsiniz.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /[xyz]a/<br>
terc&#xFC;me: &apos;x&apos;, &apos;y&apos; veya &apos;z&apos; karakterlerinden biri ile ba&#x15F;lamal&#x131; ve &apos;a&apos; ile devam etmeli.</p>
<p>sonu&#xE7;: merhaba d&#xFC;n<strong>ya.</strong><br>
index: 11</p>
<!--kg-card-end: markdown--><h2 id="belirli-karakterler-hari-">Belirli karakterler hari&#xE7;</h2><p>Karakterleri k&#xF6;&#x15F;eli parantez ve ^ (&#x15F;apka) i&#xE7;inde tan&#x131;mlayarak belirli karakterleri d&#x131;&#x15F;layan bir desen e&#x15F;le&#x15F;mesini sa&#x11F;layabilirsiniz.</p><!--kg-card-begin: markdown--><p>metin: merhaba b&#xFC;nya c&#xFC;nya d&#xFC;nya.<br>
regex: /[^bc]&#xFC;nya/<br>
terc&#xFC;me: &apos;b&apos; ve &apos;c&apos; d&#x131;&#x15F;&#x131;nda herhangi bir karakter ile ba&#x15F;lamal&#x131;, &apos;&#xFC;nya&apos; ile devam etmeli.</p>
<p>sonu&#xE7;: merhaba b&#xFC;nya c&#xFC;nya <strong>d&#xFC;nya.</strong><br>
index: 20</p>
<!--kg-card-end: markdown--><h2 id="karakter-aral-klar-">Karakter aral&#x131;klar&#x131;</h2><p>Belirli karakterlerle e&#x15F;le&#x15F;en veya baz&#x131; karakterleri d&#x131;&#x15F;layan bir desenin nas&#x131;l olu&#x15F;turuldu&#x11F;unu anlatmaya &#xE7;al&#x131;&#x15F;t&#x131;m. S&#x131;ral&#x131; karakterleri teker teker tan&#x131;mlamak yerine karakter aral&#x131;&#x11F;&#x131; verebiliyoruz. &#xD6;rne&#x11F;in, [0&#x2013;6] deseni yaln&#x131;zca s&#x131;f&#x131;rdan alt&#x131;ya kadar olan herhangi bir tek haneli karakterle e&#x15F;le&#x15F;ir. Ayn&#x131; &#x15F;ekilde [^n-p] n&#x2019;den p&#x2019;ye kadar olan harfler hari&#xE7;, yaln&#x131;zca herhangi bir karakterle e&#x15F;le&#x15F;ir.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /[A-Za-z]&#xFC;n[^cd]a/<br>
terc&#xFC;me: B&#xFC;y&#xFC;k &apos;A&apos; ile &apos;Z&apos; aras&#x131;nda bulunan karakterlerden herhangi biri veya k&#xFC;&#xE7;&#xFC;k &apos;a&apos; ile &apos;z&apos; aras&#x131;nda bulunan karakterlerden herhangi biri ile ba&#x15F;lamal&#x131;, &apos;&#xFC;n&apos; ile devam etmeli, &apos;c&apos; ve &apos;d&apos; karakterleri d&#x131;&#x15F;&#x131;nda herhangi bir karakter ile devam etmeli ve son karakteri &apos;a&apos; olmal&#x131;.</p>
<p>sonu&#xE7;: merhaba <strong>d&#xFC;nya.</strong><br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="tekrar-karakterler-karakter-say-s-">Tekrar karakterler&#x201D; { karakter say&#x131;s&#x131; } &#x201C;</h2><p>Tekrar eden karakterleri teker teker tan&#x131;mlamak yerine s&#xFC;sl&#xFC; parantezler i&#xE7;inde tekrarl&#x131; karakter say&#x131;s&#x131;n&#x131; belirtebiliriz.</p><!--kg-card-begin: markdown--><p>metin: merhaba ddd&#xFC;nya.<br>
regex: /d{3}&#xFC;nya/<br>
terc&#xFC;me: Yan yana 3 adet &apos;d&apos; karakteri ile ba&#x15F;lamal&#x131;, &apos;&#xFC;nya&apos; karakter dizisi ile devam etmeli.</p>
<p>sonu&#xE7;: merhaba <strong>ddd&#xFC;nya.</strong><br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="limitsiz-tekrar-karakterler-">Limitsiz tekrar karakterler &#x201D; * &#x201C;</h2><p>Tekrar eden karakter say&#x131;s&#x131;n&#x131; bilmedi&#x11F;imiz durumlarda kullan&#x131;labilir. Dikkat edilmesi gereken nokta ise tekrar eden karakterin hi&#xE7; olmad&#x131;&#x11F;&#x131; senaryolar i&#xE7;inde e&#x15F;le&#x15F;me sa&#x11F;l&#x131;yor olu&#x15F;udur. &#xD6;rne&#x11F;in, &#x201C;aacccc&#x201D; metni i&#xE7;in a*c* desenini yazabilece&#x11F;imiz gibi, a*b*c* desenide do&#x11F;ru bir e&#x15F;le&#x15F;me sa&#x11F;layacakt&#x131;r. &#x2018;b&#x2019; karakteri yokken de, n tane varken de ayn&#x131; &#x15F;eyi ifade etmektedir.</p><!--kg-card-begin: markdown--><p>metin: merhaba ddd&#xFC;nnnnya.<br>
regex: /d<em>&#xFC;n</em>y/<br>
terc&#xFC;me: &apos;d&apos; karakteri 0 veya n tane yan yana ba&#x15F;lamal&#x131;, &apos;&#xFC;&apos; karakteri ile devam etmeli, &apos;n&apos; karakteri 0 veya n tane yan yana devam etmeli ve &apos;y&apos; karakteri ile bitmeli.</p>
<p>sonu&#xE7;: merhaba <strong>ddd&#xFC;nnnny</strong>a.<br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="limitsiz-tekrar-karakterler--1">Limitsiz tekrar karakterler &#x201D; + &#x201C;</h2><p>Tekrar eden karakter say&#x131;s&#x131;n&#x131; bilmedi&#x11F;imiz durumlarda kullan&#x131;labilir. &#x201D; * &#x201D; dan fark&#x131; ise tekrar eden karakterden en az bir tane olma zorunlulu&#x11F;udur.</p><!--kg-card-begin: markdown--><p>metin: merhaba ddd&#xFC;nnnnya.<br>
regex: /d+&#xFC;n+y/<br>
terc&#xFC;me: &apos;d&apos; karakteri 1 veya n tane yan yana ba&#x15F;lamal&#x131;, &apos;&#xFC;&apos; karakteri ile devam etmeli, &apos;n&apos; karakteri 1 veya n tane yan yana devam etmeli ve &apos;y&apos; karakteri ile bitmeli.</p>
<p>sonu&#xE7;: merhaba <strong>ddd&#xFC;nnnny</strong>a.<br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="-ste-e-ba-l-karakter-">&#x130;ste&#x11F;e ba&#x11F;l&#x131; karakter &#x201D; ? &#x201C;</h2><p>Bir karakterin &#x201D; ? &#x201D; ile kullan&#x131;lmas&#x131; o karakterin opsiyonel oldu&#x11F;u anlam&#x131;na gelir. Karakterin metin de bulunup bulunmas&#x131; g&#xF6;z ard&#x131; edilir.<br><strong><strong>Not:</strong></strong> Bu durum ger&#xE7;ek soru i&#x15F;areti karakterinin e&#x15F;le&#x15F;mesini ge&#xE7;ersiz k&#x131;ld&#x131;&#x11F;&#x131; i&#xE7;in ters e&#x11F;ik &#xE7;izgi &#x201D; \? &#x201D; ile ger&#xE7;ek soru i&#x15F;areti karakteri e&#x15F;le&#x15F;mesi sa&#x11F;lan&#x131;r.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /d&#xFC;ns?y/<br>
terc&#xFC;me: &apos;d&#xFC;n&apos; karakter dizisi ile ba&#x15F;lamal&#x131;, &apos;s&apos; karakteri ile devam etmeli veya &apos;s&apos; karakteri hi&#xE7; olmamal&#x131;, &apos;y&apos; karakteri ile bitmeli.</p>
<p>sonu&#xE7;: merhaba <strong>d&#xFC;ny</strong>a.<br>
index: 8</p>
<!--kg-card-end: markdown--><h2 id="bo-luk-karakteri-s-">Bo&#x15F;luk karakteri &#x201D; \s &#x201C;</h2><p>Bo&#x15F;luk karakterini e&#x15F;le&#x15F;tirmek i&#xE7;in kullan&#x131;l&#x131;r.<br><strong><strong>Not:</strong></strong> Bo&#x15F;luk d&#x131;&#x15F;&#x131;nda herhangi bir karakter demek i&#xE7;in &#x201D; \S &#x201D; kullan&#x131;l&#x131;r.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /\sd&#xFC;n/<br>
terc&#xFC;me: &apos; &apos; (bo&#x15F;luk) karakteri ile ba&#x15F;lamal&#x131;, &apos;d&#xFC;n&apos; karakter dizisi ile bitmeli.</p>
<p>sonu&#xE7;: merhaba <strong>d&#xFC;n</strong>ya.<br>
index: 7</p>
<!--kg-card-end: markdown--><h2 id="ba-lang-ve-biti-">Ba&#x15F;lang&#x131;&#xE7; ve biti&#x15F;</h2><p>Metnin ba&#x15F;lang&#x131;c&#x131;nda ve biti&#x15F;inde e&#x15F;le&#x15F;tirme yapabilmek i&#xE7;in &#x201D; ^ &#x201D; ve &#x201D; $ &#x201D; kullan&#x131;l&#x131;r.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /^merhaba\sd&#xFC;nya.$/<br>
terc&#xFC;me: metnin (i&#xE7;inde de&#x11F;il!) ba&#x15F;lang&#x131;c&#x131; kesinlike &apos;m&apos; karakteri ile ba&#x15F;lamal&#x131;, &apos;erhaba&apos; karakter dizisi ile devam etmeli, &apos;\s&apos; bir bo&#x15F;luk karakteri ile devam etmeli, &apos;d&#xFC;nya&apos; karakter dizisi ile devam etmeli, metin (i&#xE7;inde de&#x11F;il!) sonu kesinlikle &apos;.&apos; karakteri ile bitmeli.</p>
<p>sonu&#xE7;: <strong>merhaba d&#xFC;nya.</strong><br>
index: 0</p>
<!--kg-card-end: markdown--><h2 id="gruplar">Gruplar</h2><p>Desen i&#xE7;erisinde karakter veya karakter dizilerini gruplamak i&#xE7;in parantez &#x201D; ( ) &#x201D; kullan&#x131;l&#x131;r. E&#x15F;le&#x15F;me sonu&#xE7;lar&#x131;n&#x131; <strong><strong>ayr&#x131; ayr&#x131;</strong></strong> g&#xF6;rebiliriz.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya.<br>
regex: /(.+)\s(.+)/<br>
terc&#xFC;me: herhangi bir karakter ile ba&#x15F;lamal&#x131;, herhangi bir karakter dizisi ile devam etmeli, bo&#x15F;luk karakteri ile devam etmeli, herhangi bir karakter dizisi ile bitmeli.</p>
<p>sonu&#xE7;: <strong>merhaba d&#xFC;nya.</strong><br>
sonu&#xE7;: <strong>merhaba</strong><br>
sonu&#xE7;: <strong>d&#xFC;nya</strong><br>
index: 0</p>
<!--kg-card-end: markdown--><h2 id="-i-e-gruplar">&#x130;&#xE7; i&#xE7;e gruplar</h2><p>Desen i&#xE7;erisinde i&#xE7; i&#xE7;e ge&#xE7;mi&#x15F; karakter veya karakter dizilerini gruplamak i&#xE7;in parantez &#x201D; ( ) &#x201D; kullan&#x131;l&#x131;r. E&#x15F;le&#x15F;me sonu&#xE7;lar&#x131;n&#x131; <strong><strong>ayr&#x131; ayr&#x131;</strong></strong> g&#xF6;rebiliriz.</p><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya. 123<br>
regex: /(.<em>\s.</em>\s(\d\d\d))/<br>
terc&#xFC;me: herhangi bir karakter ile ba&#x15F;lamal&#x131;, herhangi bir karakter dizisi ile devam etmeli, bo&#x15F;luk karakteri ile devam etmeli, herhangi bir karakter dizisi ile devam etmeli, bo&#x15F;luk karakteri ile devam etmeli, yan yana 3 adet rakam ile bitmeli.</p>
<p>sonu&#xE7;: <strong>merhaba d&#xFC;nya. 123</strong><br>
sonu&#xE7;: <strong>merhaba d&#xFC;nya. 123</strong><br>
sonu&#xE7;: <strong>123</strong><br>
index: 0</p>
<!--kg-card-end: markdown--><h2 id="veya-">Veya &#x201D; | &#x201C;</h2><!--kg-card-begin: markdown--><p>metin: merhaba d&#xFC;nya. 123<br>
regex: /.*(222|123)/<br>
terc&#xFC;me: herhangi bir karakter ile ba&#x15F;lamal&#x131;, herhangi bir karakter dizisi ile devam etmeli, &apos;222&apos; veya &apos;123&apos; ile bitmeli.</p>
<p>sonu&#xE7;: <strong>merhaba d&#xFC;nya. 123</strong><br>
sonu&#xE7;: <strong>123</strong><br>
index: 0</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://anilatalay.medium.com/regex-konu%C5%9Fuyorum-ama-yazam%C4%B1yorum-c807c8097f96"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Regex&#x200A;&#x2014;&#x200A;Konu&#x15F;uyorum ama yazam&#x131;yorum</div><div class="kg-bookmark-description">Merhaba sevgili okur,D&#xFC;zenli ifadeler, temel olarak metin i&#xE7;erisinde belirli kurallara g&#xF6;re e&#x15F;le&#x15F;tirme yapmak i&#xE7;in kullan&#x131;l&#x131;r. Burada bilinmesi gereken en &#xF6;nemli &#x15F;ey her &#x15F;eyin bir karakter&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://miro.medium.com/fit/c/152/152/1*sHhtYhaCe2Uc3IU0IgKwIQ.png" alt><span class="kg-bookmark-author">Medium</span><span class="kg-bookmark-publisher">An&#x131;l Atalay</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://miro.medium.com/max/1200/0*jkEz69uJUc41DGY8" alt></div></a></figure><h2 id="son-s-z">Son S&#xF6;z</h2><p>Okudu&#x11F;unuz i&#xE7;in te&#x15F;ekk&#xFC;r ederim, bir ba&#x15F;ka post&#x2019;ta g&#xF6;r&#xFC;&#x15F;mek dile&#x11F;iyle.</p>]]></content:encoded></item></channel></rss>