<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:georss="http://www.georss.org/georss" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Murat Demirci</title>
	<atom:link href="https://muratdemirci.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://muratdemirci.wordpress.com</link>
	<description>Full Stack AI Software Developer</description>
	<lastBuildDate>Thu, 15 Jan 2026 15:41:21 +0000</lastBuildDate>
	<language>tr-TR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<site xmlns="com-wordpress:feed-additions:1">11167402</site><cloud domain="muratdemirci.wordpress.com" path="/?rsscloud=notify" port="80" protocol="http-post" registerProcedure=""/>
<image>
		<url>https://secure.gravatar.com/blavatar/f7e593a8fb146513dfdc25f1543cab6cd24452aa7e10d5c930cd8ae11648e4e6?s=96&amp;d=https%3A%2F%2Fs2.wp.com%2Fi%2Fwebclip.png</url>
		<title>Murat Demirci</title>
		<link>https://muratdemirci.wordpress.com</link>
	</image>
	<atom:link href="https://muratdemirci.wordpress.com/osd.xml" rel="search" title="Murat Demirci" type="application/opensearchdescription+xml"/>
	<atom:link href="https://muratdemirci.wordpress.com/?pushpress=hub" rel="hub"/>
	<item>
		<title>Python’da yerelleştirmeyi nasıl yaparım?</title>
		<link>https://muratdemirci.wordpress.com/2025/01/12/pythonda-yerellestirmeyi-nasil-yaparim/</link>
					<comments>https://muratdemirci.wordpress.com/2025/01/12/pythonda-yerellestirmeyi-nasil-yaparim/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Sun, 12 Jan 2025 17:41:10 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/?p=3472</guid>

					<description><![CDATA[Merhaba değerli takipçilerim, Microsoft&#8217;un CEO&#8217;su açıkladı: Artık SaaS uygulama backendleri yerine yapay zeka ajanlarından oluşan backendler hazırlamalıyız. Yapay zeka ajanlarınızı Microsoft AutoGen, CrewAI ve LangChain gibi kütüphanelerle hazırlayabilirsiniz. Backend&#8217;inizde AutoGen kullanıyorsanız yapay zeka ajanınızı .NET veya Python ile hazırlayabilirsiniz. CrewAI kullanıyorsanız Python ile; eğer LangChain kullanıyorsanız backendinizi NodeJS veya Python ile hazırlayabilirsiniz. Yerli sanal asistan [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim,</p>



<p class="wp-block-paragraph">Microsoft&#8217;un CEO&#8217;su açıkladı: Artık SaaS uygulama backendleri yerine yapay zeka ajanlarından oluşan backendler hazırlamalıyız. Yapay zeka ajanlarınızı Microsoft AutoGen, CrewAI ve LangChain gibi kütüphanelerle hazırlayabilirsiniz.</p>



<p class="wp-block-paragraph">Backend&#8217;inizde AutoGen kullanıyorsanız yapay zeka ajanınızı<strong> .NET</strong> veya <strong>Python</strong> ile hazırlayabilirsiniz. CrewAI kullanıyorsanız <strong>Python</strong> ile; eğer LangChain kullanıyorsanız backendinizi <strong>NodeJS</strong> veya <strong>Python</strong> ile hazırlayabilirsiniz.</p>



<p class="wp-block-paragraph">Yerli sanal asistan olan enGrehber projesinde yapay zeka ajanlarımızı Python ile hazırladık/hazırlıyoruz. LangChain kütüphanesinden yararlanarak bir OpenAI Ajanı bir de Gemini Ajanı hazırladık. İşte tam bu aşamada Türkçe ve İngilizce dil seçenekleri üzerinde çalışırken yerelleştirme (localization) yapmamız gerekti.</p>



<figure class="wp-block-image size-large"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg"><img width="1024" height="658" data-attachment-id="3480" data-permalink="https://muratdemirci.wordpress.com/2025/01/12/pythonda-yerellestirmeyi-nasil-yaparim/world-map-with-global-network/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg" data-orig-size="7000,4500" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;World map with global technology or social connection network with nodes and links vector illustration&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;World map with global network&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="World map with global network" data-image-description="" data-image-caption="&lt;p&gt;World map with global technology or social connection network with nodes and links vector illustration&lt;/p&gt;
" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=1024" alt="" class="wp-image-3480" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=1024 1024w, https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=2048 2048w, https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=300 300w, https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=768 768w, https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=1440 1440w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Python&#8217;da Yerelleştirme</h2>



<p class="wp-block-paragraph">Python&#8217;da yerelleştirme nasıl yapılır diye araştırırken karşıma &#8220;locale&#8221; kütüphanesi çıktı. Locale kütüphanesini öğrenmek için şu makaleyi okumanızı tavsiye ediyorum:<br><br><a href="https://phrase.com/blog/posts/beginners-guide-to-locale-in-python/">https://phrase.com/blog/posts/beginners-guide-to-locale-in-python/</a></p>



<p class="wp-block-paragraph">Ancak bu ve bunun gibi makaleler yeterli sayılmaz. Locale kütüphanesine ek olarak &#8220;gettext&#8221; kütüphanesini de kullanmanız gerekiyor. </p>



<p class="wp-block-paragraph">Python&#8217;daki <code>gettext</code> kütüphanesi, uygulamanızı yerelleştirmek için uluslararasılaştırma (i18n) işlemlerinde kullanılır. Bu kütüphanenin temel amacı, belirli bir dil ve bölgeye uygun metin çevirileri sağlamak ve kullanıcıya sunmaktır. Aşağıda, bu metodun nasıl kullanılacağını ve sağladığı temel özellikleri görebilirsiniz:</p>



<h3 class="wp-block-heading">Temel Kullanım</h3>



<p class="wp-block-paragraph"><code>gettext</code> metodu, bir metni çevirmek için kullanılır. Bu metot, bir çeviri dosyasındaki uygun metni alır ve onu geri döner.</p>



<h3 class="wp-block-heading">Adımlar</h3>



<ol start="1" class="wp-block-list">
<li><strong>Çeviri Dosyaları (mo veya po) Oluşturma</strong>: İlk adımda, çevirileri içeren <code>.mo</code> veya <code>.po</code> dosyalarını oluşturmanız gerekir. Örneğin, <code>messages.po</code> dosyasını aşağıdaki gibi oluşturabilirsiniz:</li>
</ol>



<p class="wp-block-paragraph"><strong>messages.po:</strong></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
msgid "Hello, World!"
msgstr "Merhaba, Dünya!"

</pre></div>


<ol start="2" class="wp-block-list">
<li><strong>Çeviri Dosyalarını Yükleme ve gettext Kullanımı</strong>: Daha sonra, çeviri dosyalarını yükleyerek ve <code>gettext</code> metodunu kullanarak metin çevirilerini alabilirsiniz.</li>
</ol>



<h3 class="wp-block-heading">Örnek Kod</h3>



<pre class="wp-block-code"><code>import locale
import gettext

# Yerelleştirme dosyalarının bulunduğu dizin
localedir = './locale'

# Hedef dili ve kodlamayı belirle
locale.setlocale(locale.LC_ALL, 'tr_TR.UTF-8')

# Çeviri dosyasını yükleme
gettext.bindtextdomain('messages', localedir)
gettext.textdomain('messages')
_ = gettext.gettext

# Metinleri çevirme
translated_text = _("Hello, World!")
print(translated_text)  # Çıktı: Merhaba, Dünya!
</code></pre>



<h3 class="wp-block-heading">Açıklama:</h3>



<ol start="1" class="wp-block-list">
<li><strong>Yerelleştirme Dosyaları</strong>: <code>gettext</code> ile kullanılacak çeviri dosyalarını belirtin. <code>locale</code> dizini, çevirilerin bulunduğu dizin olarak tanımlanır.</li>



<li><strong>locale Ayarları</strong>: <code>locale.setlocale</code> ile hedef dili ve kodlamayı belirleyin.</li>



<li><strong>gettext Bağlama ve Kullanma</strong>: <code>gettext.bindtextdomain</code> ile çeviri dosyasının yerini belirtin, <code>gettext.textdomain</code> ile kullanılacak dosyayı seçin ve <code>gettext</code> metodunu <code>_</code> kısayolu ile kullanın.</li>



<li><strong>Metin Çevirisi</strong>: <code>_</code> kısayolu ile çeviri metinlerini alın ve kullanın.</li>
</ol>



<p class="wp-block-paragraph">Bu şekilde, uygulamanızı çok dilli hale getirebilir ve farklı dillerde kullanıcı deneyimi sunabilirsiniz.</p>



<h2 class="wp-block-heading">Unsupported Locale Hatası</h2>



<p class="wp-block-paragraph">Her şey çok güzel de, kodu sunucuda çalıştırdığımızda Unsupported Locale hatası alırsak ne yapacağız? Bununla ilgili StackOverflow sayfasını aşağıda paylaşıyorum:<br><a href="https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting">https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting</a></p>



<h2 class="wp-block-heading">Sonuç</h2>



<p class="wp-block-paragraph">.NET, NodeJS veya Python ile hazırladığınız yapay zeka ajanlarınızı hazırlarken backendlerimizde LLM&#8217;lerden yararlanıyoruz. Böylece sanal asistan backendleri ya da yapay zeka ile güçlendirilmiş diğer backendler hazırlamamız mümkün hale geliyor. LangChain, CrewAI ve AutoGen kütüphaneleri yapay zeka ajanları hazırlama sürecini oldukça kolaylaştırıyor.</p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2025/01/12/pythonda-yerellestirmeyi-nasil-yaparim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3472</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2025/01/i18n.jpg?w=1024"/>
	</item>
		<item>
		<title>Web İçeriği Erişilebilirlik Yönergeleri (WCAG 2.2)</title>
		<link>https://muratdemirci.wordpress.com/2024/12/06/web-icerigi-erisilebilirlik-yonergeleri-wcag-2-2/</link>
					<comments>https://muratdemirci.wordpress.com/2024/12/06/web-icerigi-erisilebilirlik-yonergeleri-wcag-2-2/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Thu, 05 Dec 2024 22:07:02 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/2024/12/06/web-icerigi-erisilebilirlik-yonergeleri-wcag-2-2/</guid>

					<description><![CDATA[Merhaba değerli takipçilerim, Web ve mobil uygulamalarında erişilebilirlik standartlarına uyma zorunluluğu ülkemizde de yürürlüğe girmek üzere. Artık web ve mobil uygulamaları hazırlarken W3C ve ISO standartlarına uygun hazırlamakla kalmayıp, test araçlarıyla erişilebilirlik kriterine uygunluğu test etmelisiniz. Ayrıca VoiceOver ve TalkBack gibi uygulamaları ve Braille klavyeyi kullanarak görme engelliler için uygunluğu da ayrıca test etmelisiniz. Bu [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim,</p>



<p class="wp-block-paragraph">Web ve mobil uygulamalarında erişilebilirlik standartlarına uyma zorunluluğu ülkemizde de yürürlüğe girmek üzere. Artık web ve mobil uygulamaları hazırlarken W3C ve ISO standartlarına uygun hazırlamakla kalmayıp, test araçlarıyla erişilebilirlik kriterine uygunluğu test etmelisiniz. Ayrıca VoiceOver ve TalkBack gibi uygulamaları ve Braille klavyeyi kullanarak görme engelliler için uygunluğu da ayrıca test etmelisiniz.</p>



<p class="wp-block-paragraph">Bu makalenin kalan kısmında WCAG 2.2 standardının madde madde özetini paylaşıyor olacağım. Bu erişilebilirlik standartının tam içeriğine W3C’nin sitesinden erişebilirsiniz. Ayrıca Cumhurbaşkanlığı da bir erişilebilirlik genelgesi yayınlamak üzere. WCAG 2.2’nin Türkçe özeti aşağıdadır:</p>



<figure class="wp-block-image size-large"><img width="1024" height="585" data-attachment-id="3465" data-permalink="https://muratdemirci.wordpress.com/img_8091/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg" data-orig-size="1792,1024" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="img_8091" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=1024" class="wp-image-3465" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=1024 1024w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=300 300w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=768 768w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=1440 1440w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading gmail-western">Web İçeriği Erişilebilirlik Yönergeleri (WCAG) 2.2</h2>



<p class="wp-block-paragraph">WCAG (Web Content Accessibility Guidelines) 2.2, erişilebilirlik ilkelerini ve başarı ölçütlerini dört ana başlık altında toplar: Algılanabilirlik, İşletilebilirlik, Anlaşılabilirlik ve Sağlamlık. WCAG 2.2&#8217;nin getirdiği ek kuralları içerecek şekilde tüm ilkeleri ve kuralları madde madde şu şekilde sıralayabilirim:</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h3 class="wp-block-heading gmail-western"><strong>1. Algılanabilirlik</strong></h3>



<p class="wp-block-paragraph">Web içeriği, herkes tarafından algılanabilir olmalıdır.</p>



<h4 class="wp-block-heading gmail-western"><strong>1.1 Metin Alternatifleri</strong></h4>



<ul class="wp-block-list">
<li><strong>1.1.1</strong> Metin Alternatifi: Görsel içerikler için metin alternatifleri sağlanmalıdır.*</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>1.2 Zamanla Kontrol Edilen Medya</strong></h4>



<ul class="wp-block-list">
<li><strong>1.2.1</strong> Yalnızca Ses veya Görüntü (Ön Kayıtlı): Alternatif metin veya medya açıklamaları sağlanmalı.</li>



<li><strong>1.2.2</strong> Altyazılar (Ön Kayıtlı): Videolarda altyazı kullanılmalı.</li>



<li><strong>1.2.3</strong> Ses Açıklamaları veya Alternatifler (Ön Kayıtlı): Ses açıklaması veya alternatif bir medya sağlanmalı.</li>



<li><strong>1.2.4</strong> Altyazılar (Canlı): Canlı videolar için altyazılar sağlanmalı.</li>



<li><strong>1.2.5</strong> Ses Açıklamaları (Ön Kayıtlı): Ses açıklamaları eklenmeli.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>1.3 İçerik Uyumlu</strong></h4>



<ul class="wp-block-list">
<li><strong>1.3.1</strong> Bilgi ve İlişkiler: Yapısal bilgi, erişilebilir yollarla sunulmalıdır.</li>



<li><strong>1.3.2</strong> Anlamlı Sıra: Okuma sırası anlamlı olmalı.</li>



<li><strong>1.3.3</strong> Duyusal Özellikler: İçeriği anlamak için yalnızca duyusal unsurlara güvenilmemeli.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>1.4 Ayrım ve Okunabilirlik</strong></h4>



<ul class="wp-block-list">
<li><strong>1.4.1</strong> Renk Kullanımı: Bilgi sadece renk ile aktarılmamalı.</li>



<li><strong>1.4.2</strong> Ses Kontrolü: Otomatik oynatılan ses kontrol edilebilir olmalı.</li>



<li><strong>1.4.3</strong> Kontrast (Minimum): Metin ve arka plan kontrastı yeterli olmalı.</li>



<li><strong>1.4.4</strong> Metin Boyutu Yeniden Boyutlandırma: İçerik işlevselliğini kaybetmeden büyütülebilmeli.*</li>



<li><strong>1.4.5</strong> Görsellerde Metin: Görsellerde metin kullanımından kaçınılmalı.</li>



<li><strong>1.4.10</strong> Yeniden Akış: İçerik, ekran boyutlarına uyumlu olmalı.</li>



<li><strong>1.4.11</strong> Kullanıcı Arayüzü Bileşenleri Kontrastı: Arayüz öğeleri kontrastlı olmalı.</li>



<li><strong>1.4.12</strong> Metin Aralıkları: Metin aralıkları düzenlenebilir olmalı.*</li>



<li><strong>1.4.13</strong> İçerik Üzerine Fare veya Klavye: Etkileşimli içerikler net olmalı.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h3 class="wp-block-heading gmail-western"><strong>2. İşletilebilirlik</strong></h3>



<p class="wp-block-paragraph">İçerik ve arayüz, her kullanıcı tarafından işletilebilir olmalıdır.</p>



<h4 class="wp-block-heading gmail-western"><strong>2.1 Klavye Erişilebilirliği</strong></h4>



<ul class="wp-block-list">
<li><strong>2.1.1</strong> Klavye: Tüm işlevler klavye ile kullanılabilir olmalı.</li>



<li><strong>2.1.2</strong> Klavye Kapatılabilirliği: Klavye tuşları bir tuşa sıkışmaz.</li>



<li><strong>2.1.4</strong> Kısayollar: Tek tuşlu kısayollar devre dışı bırakılabilir.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>2.2 Zaman Sınırları</strong></h4>



<ul class="wp-block-list">
<li><strong>2.2.1</strong> Ayarlanabilir Zaman: Kullanıcılar zaman sınırlamalarını ayarlayabilmeli.</li>



<li><strong>2.2.2</strong> Duraklat, Dur veya Gizle: Otomatik olarak başlayan içerik durdurulabilir.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>2.3 Nöbetler ve Fiziksel Tepkiler</strong></h4>



<ul class="wp-block-list">
<li><strong>2.3.1</strong> Üç Flaş veya Daha Az: Flaş içerikleri sınırlanmalı.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>2.4 Navigasyon</strong></h4>



<ul class="wp-block-list">
<li><strong>2.4.1</strong> Atlama Bağlantıları: İçeriğe hızlı erişim sağlanmalı.*</li>



<li><strong>2.4.2</strong> Sayfa Başlıkları: Anlamlı başlıklar kullanılmalı.</li>



<li><strong>2.4.3</strong> Odak Sırası: Mantıklı bir odak sırası olmalı.</li>



<li><strong>2.4.4</strong> Bağlantılar Amaç: Bağlantı amacı açık olmalı.</li>



<li><strong>2.4.7</strong> Odak Görünürlüğü: Odaklanan öğeler net görünür olmalı.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>Yeni Başarı Ölçütleri</strong></h4>



<ul class="wp-block-list">
<li><strong>2.4.11</strong> Odak Görünürlüğü (2.2 ile gelen): Klavye odak göstergesi görünür olmalı.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h3 class="wp-block-heading gmail-western"><strong>3. Anlaşılabilirlik</strong></h3>



<p class="wp-block-paragraph">Bilgi ve arayüzler, kullanıcıların anlaması için net olmalıdır.</p>



<h4 class="wp-block-heading gmail-western"><strong>3.1 Okunabilirlik</strong></h4>



<ul class="wp-block-list">
<li><strong>3.1.1</strong> Dil Tanımlama: Sayfa dili belirtilmeli.*</li>



<li><strong>3.1.2</strong> Kısmi Dil Tanımlama: İçerikteki dil değişiklikleri belirtilmeli.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>3.2 Tahmin Edilebilirlik</strong></h4>



<ul class="wp-block-list">
<li><strong>3.2.1</strong> Odaklandığında: Bileşenler odaklanınca beklenmeyen şeyler olmamalı.</li>



<li><strong>3.2.2</strong> Girdi Yapıldığında: Girdi yapmak beklenmeyen değişikliklere yol açmamalı.</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>3.3 Girdi Yardımı</strong></h4>



<ul class="wp-block-list">
<li><strong>3.3.1</strong> Hata Belirleme: Hatalar kullanıcıya belirtilmeli.*</li>



<li><strong>3.3.3</strong> Hata Önerisi: Kullanıcı hataları için öneriler sunulmalı.</li>



<li><strong>3.3.7</strong> Kullanıcı Yardımı (2.2 ile gelen): Girdi alanları için yardım sağlanmalı.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h3 class="wp-block-heading gmail-western"><strong>4. Sağlamlık</strong></h3>



<p class="wp-block-paragraph">İçerik, farklı teknolojiler ve cihazlarla uyumlu olmalıdır.</p>



<h4 class="wp-block-heading gmail-western"><strong>4.1 Uyumlu İşaretleme</strong></h4>



<ul class="wp-block-list">
<li><strong>4.1.1</strong> Ayrıştırma: Kod hataları giderilmeli.</li>



<li><strong>4.1.2</strong> İsim, Rol, Değer: Tüm öğeler için etiket ve değerler doğru atanmalı.*</li>
</ul>



<h4 class="wp-block-heading gmail-western"><strong>Yeni Başarı Ölçütleri</strong></h4>



<ul class="wp-block-list">
<li><strong>4.1.3</strong> Yardımcı Teknoloji Uyumluluğu (2.2 ile gelen): Yeni teknolojiler için uyum testleri yapılmalı.</li>
</ul>



<p class="wp-block-paragraph">Bu konuyu daha iyi öğrenmek isteyenler W3C ve ISO’nun ilgili belgelerini okumalıdırlar. İyi görmeyenler için siyah zemin üzerinde beyaz yazı (koyu tema / dark mode) kullanın. İyi görmeyenlerin sayfaları zoom yaptıklarını yani yakınlaştırma yaptıklarını unutmayın. Zoom yapıldığında siteniz ya de uygulamanızın buna uyum sağlaması gerekir.</p>



<p class="wp-block-paragraph">Görme engelliler üye olurken ve oturum açarken görenlere göre daha fazla zorlandıkları için bu işlemleri mümkün olduğunca basitleştirin. Uygulamanızı mutlaka ekran okuyucu programlarla test edin. İşitme engelliler için altyazılar ve işaret dilinden yararlanın. Ayrıca uygulamanızı bilişsel olarak da erişilebilir yapın. Son olarak gerektiği yerlerde “aria” özniteliklerini de kullanmanızı hatırlatırız.</p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/12/06/web-icerigi-erisilebilirlik-yonergeleri-wcag-2-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3466</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/12/img_8091.jpg?w=1024"/>
	</item>
		<item>
		<title>Yapay Zeka Projemi Nasıl Ücretsiz Yayınlarım?</title>
		<link>https://muratdemirci.wordpress.com/2024/09/28/yapay-zeka-projemi-nasil-ucretsiz-yayinlarim/</link>
					<comments>https://muratdemirci.wordpress.com/2024/09/28/yapay-zeka-projemi-nasil-ucretsiz-yayinlarim/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Sat, 28 Sep 2024 12:41:59 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/2024/09/28/yapay-zeka-projemi-nasil-ucretsiz-yayinlarim/</guid>

					<description><![CDATA[Merhaba değerli takipçilerim, Biliyorsunuz ben 5 yıldan fazladır enGrehber adında bir yapay zeka projesi üzerinde çalışmaktayım. Bu projeyi önce .NET ve Azure ile yaptık, Web API, .NET Identity ve Azure SQL kullandık; ancak Azure’un çok yavaş ve çok pahalı olduğunu deneyimledik. Ayrıca .NET’in yapay zeka projeleri için çok ta uygun olmadığını gördük. Yurtdışında yapay zeka [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim,</p>



<p class="wp-block-paragraph">Biliyorsunuz ben 5 yıldan fazladır enGrehber adında bir yapay zeka projesi üzerinde çalışmaktayım.</p>



<p class="wp-block-paragraph">Bu projeyi önce .NET ve Azure ile yaptık, Web API, .NET Identity ve Azure SQL kullandık; ancak Azure’un çok yavaş ve çok pahalı olduğunu deneyimledik.</p>



<p class="wp-block-paragraph">Ayrıca .NET’in yapay zeka projeleri için çok ta uygun olmadığını gördük. Yurtdışında yapay zeka projeleri için Python tercih ediliyor ve gelecekte Rust’a geçileceği konuşuluyordu. Azure’daki buglar nedeniyle Python projemizi Azure’da yayınlayamadık.</p>



<p class="wp-block-paragraph">Frontendi yayınlamak için Firebase kullandık ve Firebase’den çok memnun kaldık.</p>



<figure class="wp-block-image size-large"><img width="738" height="415" data-attachment-id="3463" data-permalink="https://muratdemirci.wordpress.com/img_7625-1/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg" data-orig-size="738,415" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="img_7625-1" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg?w=738" alt="" class="wp-image-3463" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg 738w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg?w=300 300w" sizes="(max-width: 738px) 100vw, 738px" /></figure>



<h2 class="wp-block-heading">Python Projelerimiz için İdeal Hosting</h2>



<p class="wp-block-paragraph">Python projesinin arkasında Google var. Bu nedenle Python için Google Bulutundaki App Engine’ı denedik ve Python FastAPI projemizi App Engine ile başarıyla host edebildik, üstelik ücretsiz. Eğer App Engine size yeterli gelmezse Cloud Run’da da çalışabilirsiniz.</p>



<h2 class="wp-block-heading">Çözüm: Firebase ve Google Cloud</h2>



<p class="wp-block-paragraph">Python, Go, Rust backendleriniz; Angular ve React frontendleriniz için Google bulutu ve Firebase ücretsiz hosting, ücretsiz üyelik sistemi, bildirim sistemi, ücretsiz veritabanı desteği ve daha fazlasını sağlıyor.</p>



<p class="wp-block-paragraph">Eğer limitleri aşar ve ücretliye geçerseniz ayda 1 dolar ila 20 dolara yakın maliyet çıkabilir. Bu maliyet kullanım arttıkça artabilir, ama KOBİ’ler için ayda 1 dolar civarı temel maliyet çıkacaktır. Bir sanal asistan backendi için performansın da iyi olduğunu gözlemledik.</p>



<p class="wp-block-paragraph">Kurulumları panellerden ve yüklemeleri ise bilgisayarınıza yükleyeceğiniz Firebase araçları GCloud SDK’sı ile yapabilirsiniz.</p>



<p class="wp-block-paragraph">Özetle KOBİ’lerin WordPress websiteleri için Godaddy, Python backendleri için Google Cloud App Engine ya da Cloud Run; frontendler için Firebase kullanmanızı öneriyorum. Tüm eğitim kurumlarına ve okullara tavsiye ederim.</p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/09/28/yapay-zeka-projemi-nasil-ucretsiz-yayinlarim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3464</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7625-1.jpg?w=738"/>
	</item>
		<item>
		<title>Ermenistan’da Geliştirilen Robot Robin</title>
		<link>https://muratdemirci.wordpress.com/2024/09/01/ermenistanda-gelistirilen-robot-robin/</link>
					<comments>https://muratdemirci.wordpress.com/2024/09/01/ermenistanda-gelistirilen-robot-robin/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Sun, 01 Sep 2024 14:21:27 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/2024/09/01/ermenistanda-gelistirilen-robot-robin/</guid>

					<description><![CDATA[Robot Robini: Geleceğin Hizmet Robotu Teknolojinin hızla ilerlemesiyle birlikte, günlük yaşamımızı kolaylaştıran yenilikçi çözümler hayatımıza girmeye devam ediyor. Bu çözümlerden biri de Robot Robini. Adını duyurmaya başlayan bu akıllı robot, geleceğin hizmet robotları arasında önemli bir yer edinmeye aday. İşte Robot Robini’nin öne çıkan özellikleri ve onunla ilgili bilmeniz gerekenler. Robot Robini Nedir? Robot Robini, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" width="670" height="450" data-attachment-id="3461" data-permalink="https://muratdemirci.wordpress.com/img_7106-1/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg" data-orig-size="670,450" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}" data-image-title="img_7106-1" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg?w=670" class="wp-image-3461" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg 670w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg?w=300 300w" sizes="(max-width: 670px) 100vw, 670px" /></figure>



<p class="wp-block-paragraph"><strong>Robot Robini: Geleceğin Hizmet Robotu</strong></p>



<p class="wp-block-paragraph">Teknolojinin hızla ilerlemesiyle birlikte, günlük yaşamımızı kolaylaştıran yenilikçi çözümler hayatımıza girmeye devam ediyor. Bu çözümlerden biri de Robot Robini. Adını duyurmaya başlayan bu akıllı robot, geleceğin hizmet robotları arasında önemli bir yer edinmeye aday. İşte Robot Robini’nin öne çıkan özellikleri ve onunla ilgili bilmeniz gerekenler.</p>



<h3 class="wp-block-heading">Robot Robini Nedir?</h3>



<p class="wp-block-paragraph">Robot Robini, evlerde, ofislerde ve diğer yaşam alanlarında insanlara yardımcı olmak için tasarlanmış, son teknoloji bir hizmet robotudur. Sahip olduğu yapay zeka sayesinde, kullanıcısının ihtiyaçlarını anlayabilen ve ona göre hareket edebilen Robini, aynı zamanda öğrenme yeteneğine de sahiptir. Yani, zamanla kullanıcısının tercihlerini ve alışkanlıklarını öğrenerek, daha kişiselleştirilmiş bir deneyim sunar.</p>



<h3 class="wp-block-heading">Temel Özellikler</h3>



<ul class="wp-block-list">
<li><strong>Yapay Zeka ve Öğrenme Yeteneği:</strong> Robini, yapay zeka algoritmaları sayesinde çevresindeki olayları analiz edebilir ve duruma göre hareket edebilir. Ayrıca, kullanıcıların komutlarını zamanla daha iyi anlar ve onlara uygun çözümler üretir.</li>



<li><strong>Çok Yönlülük:</strong> Robini, birden fazla görevi yerine getirebilecek şekilde tasarlanmıştır. Evinizi temizlemekten tutun da, yiyecek-içecek servisine kadar pek çok farklı görevi başarıyla yerine getirebilir. Ayrıca, güvenlik sistemlerine entegre edilerek evinizi izleyebilir ve güvenlik tehditlerine karşı alarm verebilir.</li>



<li><strong>Sesli ve Görsel İletişim:</strong> Kullanıcılarıyla etkili bir şekilde iletişim kurabilen Robini, hem sesli hem de görsel komutları algılayabilir. Gelişmiş mikrofonları ve kameraları sayesinde çevresindeki sesleri ve görüntüleri analiz edebilir.</li>



<li><strong>Mobilite:</strong> Robot Robini, hareket kabiliyeti açısından da oldukça gelişmiştir. Dar alanlarda manevra yapabilme yeteneğine sahip olan bu robot, merdiven çıkma, engellerden kaçınma gibi becerileri ile dikkat çeker.</li>
</ul>



<h3 class="wp-block-heading">Kullanım Alanları</h3>



<p class="wp-block-paragraph">Robot Robini, çok geniş bir yelpazede kullanım alanı bulmaktadır. Evlerde günlük işlerinizi kolaylaştırırken, ofislerde de çeşitli görevleri üstlenebilir. Ayrıca, otellerde müşteri hizmetlerini geliştirmek için kullanılabilir. Gelişmiş sensörleri ve yapay zeka özellikleri sayesinde, hastanelerde hasta bakımı gibi daha özel görevlerde de yer alabilir.</p>



<h3 class="wp-block-heading">Geleceğin Hizmet Robotu</h3>



<p class="wp-block-paragraph">Robot Robini, teknoloji dünyasında hızla ilerleyen yapay zeka ve robotik alanlarının bir meyvesi olarak karşımıza çıkıyor. Onunla birlikte, gelecekte robotların hayatımızın vazgeçilmez bir parçası haline geleceğini söylemek yanlış olmaz. Robot Robini, sadece bir başlangıç ve önümüzdeki yıllarda bu tür robotların sayısında ve işlevselliğinde büyük bir artış bekleniyor.</p>



<p class="wp-block-paragraph">Sonuç olarak, Robot Robini, hayatımızı kolaylaştırma potansiyeli yüksek olan, yenilikçi bir hizmet robotu olarak dikkat çekiyor. İleri teknolojiye sahip bu robot, özellikle yoğun yaşam temposuna sahip bireyler ve işletmeler için ideal bir çözüm sunuyor. Gelecekte, Robot Robini’nin sunduğu imkanlar sayesinde, gündelik işlerimize daha az zaman ayırıp, sevdiklerimize ve hobilerimize daha fazla vakit ayırabileceğiz.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="jetpack-video-wrapper"><div class="embed-youtube"><iframe loading="lazy" title="Robin the Robot visits FOX 11" width="616" height="347" src="https://www.youtube.com/embed/S7Y5uPJja6M?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div></div>
</div></figure>



<p class="wp-block-paragraph">Mutluluklar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/09/01/ermenistanda-gelistirilen-robot-robin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3462</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/09/img_7106-1.jpg?w=670"/>
	</item>
		<item>
		<title>OpenAI’nin Strawberry Projesi ve Google’ın Million-Uzman LLM’i</title>
		<link>https://muratdemirci.wordpress.com/2024/07/26/openainin-strawberry-projesi-ve-googlein-million-uzman-llmi/</link>
					<comments>https://muratdemirci.wordpress.com/2024/07/26/openainin-strawberry-projesi-ve-googlein-million-uzman-llmi/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 14:16:06 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/?p=3457</guid>

					<description><![CDATA[OpenAI ve Google yakın zamanda büyük dil modellerinin (LLM) verimliliğini ve performansını artırmak için yenilikçi yaklaşımlar ortaya koydu. OpenAI&#8217;nin Project Strawberry&#8217;si ve Google&#8217;ın Million-Expert LLM&#8217;i, yapay zeka alanında özellikle hesaplama verimliliği ve muhakeme yetenekleri açısından önemli ilerlemeleri temsil ediyor. OpenAI&#8217;nin Strawberry Projesi OpenAI&#8217;nin Project Strawberry&#8217;si, AI modellerinin muhakeme yeteneklerini geliştirmeye odaklanıyor. Sızdırılan dahili belgelere göre, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">OpenAI ve Google yakın zamanda büyük dil modellerinin (LLM) verimliliğini ve performansını artırmak için yenilikçi yaklaşımlar ortaya koydu. OpenAI&#8217;nin Project Strawberry&#8217;si ve Google&#8217;ın Million-Expert LLM&#8217;i, yapay zeka alanında özellikle hesaplama verimliliği ve muhakeme yetenekleri açısından önemli ilerlemeleri temsil ediyor.</p>



<figure class="wp-block-image size-large"><img data-attachment-id="3459" data-permalink="https://muratdemirci.wordpress.com/2024/07/26/openainin-strawberry-projesi-ve-googlein-million-uzman-llmi/image-14/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/image.png" data-orig-size="2048,741" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/image.png?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/image.png" alt="" class="wp-image-3459" /></figure>



<h2 class="wp-block-heading">OpenAI&#8217;nin Strawberry Projesi</h2>



<p class="wp-block-paragraph">OpenAI&#8217;nin Project Strawberry&#8217;si, AI modellerinin muhakeme yeteneklerini geliştirmeye odaklanıyor. Sızdırılan dahili belgelere göre, bu proje karmaşık muhakeme görevlerini yüksek doğrulukla gerçekleştirebilen modeller oluşturmayı amaçlıyor. Project Strawberry kapsamında geliştirilen yeni model türü, matematiksel görevlerde olağanüstü performans göstererek, mevcut LLM&#8217;lerin şans seviyelerinde performans gösterdiği kıyaslamalarda %90 doğruluk elde etti.</p>



<p class="wp-block-paragraph">Project Strawberry&#8217;nin temel yeniliği, daha büyük modellerin düşüncelerini doğrulamak veya onaylamak için gerçek zamanlı olarak daha küçük modeller kullanmayı içerir. Bu yaklaşım, AI&#8217;nın çözümleri daha etkili bir şekilde aramasını sağlar ve AI&#8217;daki gerçek hendek olabilecek şeyin ne olduğuna dair net bir görüş sağlar: muhakeme. Bu gelişme, mevcut LLM&#8217;lerin meta haline gelmesini ele aldığı ve muhakeme yeteneklerinde önemli bir sıçrama sunmayı hedeflediği için OpenAI için çok önemlidir.</p>



<h2 class="wp-block-heading">Google&#8217;ın Milyon Uzman LLM&#8217;i</h2>



<p class="wp-block-paragraph">Öte yandan, Google&#8217;ın Milyon Uzman LLM&#8217;i, Parametre Verimli Uzman Alma (PEER) adı verilen yeni bir yöntem sunar. Bu yöntem, LLM&#8217;i her biri girdi verilerinin farklı yönlerinde uzmanlaşmış bir milyon uzmana böler. Model, girdi ve uzmanlar arasında bir alma yöntemi olarak çapraz dikkat kullanır ve bu da verilen herhangi bir girdi için en yetenekli uzmanları seçmesine olanak tanır.<br>.<br>PEER katmanı, hesaplama yükünü azaltarak ve çıktının kalitesini iyileştirerek modelin verimliliğini önemli ölçüde artırır. En ilgili uzmanlardan bilgi alarak ve gömerek, model daha doğru ve bağlamsal olarak uygun yanıtlar sağlayabilir. Bu yaklaşım yalnızca hesaplama performansını iyileştirmekle kalmaz, aynı zamanda model kalitesini değerlendirmek için önemli bir ölçüt olan şaşkınlığı da azaltır.</p>



<h2 class="wp-block-heading">Verimlilik ve Performans Kazanımları</h2>



<p class="wp-block-paragraph">Hem OpenAI&#8217;nin Project Strawberry&#8217;si hem de Google&#8217;ın Million-Expert LLM&#8217;i önemli verimlilik kazanımları sunar. Project Strawberry&#8217;nin muhakeme ve doğrulamaya odaklanması, yüksek düzeyde bilişsel işleme gerektiren görevler için çok önemli olan daha doğru ve güvenilir AI çıktıları sağlar. Bu arada, Google&#8217;ın PEER yöntemi, geniş bir uzman uzman ağından yararlanarak LLM&#8217;lerin ölçeklenebilirliğini ve verimliliğini artırır ve daha düşük hesaplama maliyetiyle daha iyi performansa yol açar.<br><br>Bu gelişmeler, AI araştırmalarında daha verimli ve yetenekli modellere doğru önemli bir kaymayı vurgular. Mevcut LLM&#8217;lerin sınırlamalarını ele alarak ve muhakeme ve uzman geri çağırma için yenilikçi yöntemler sunarak, OpenAI ve Google yapay zeka alanında yeni ölçütler belirliyor.</p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/07/26/openainin-strawberry-projesi-ve-googlein-million-uzman-llmi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3457</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/image.png"/>
	</item>
		<item>
		<title>Ulusal Yapay Zeka Stratejisi</title>
		<link>https://muratdemirci.wordpress.com/2024/07/24/ulusal-yapay-zeka-stratejisi/</link>
					<comments>https://muratdemirci.wordpress.com/2024/07/24/ulusal-yapay-zeka-stratejisi/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Wed, 24 Jul 2024 15:21:34 +0000</pubDate>
				<guid isPermaLink="false">http://muratdemirci.me/?p=3448</guid>

					<description><![CDATA[Sizler için Cumhurbaşkanlığının yayınlandığı Ulusal Yapay Zeka Stratejisi dokümanını hızlıca okudum. Kısa bir özetini yayınlamak istiyorum. Birinci hedef anonim ve gizli veri kümeleri oluşturmaktır deniliyor. Şahsen bu işle uğraştığım için yakından biliyorum: Bazı alanlarda Türkçe &#8220;corpus&#8221; bulmak gerçekten zor. Tüm mevzuatın kaliteli ve güncellenen bir veri kümesine dönüştürülmesi gibi önümüzde hayli önemli bir iş var. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure data-carousel-extra='{&quot;blog_id&quot;:11167402,&quot;permalink&quot;:&quot;https://muratdemirci.wordpress.com/2024/07/24/ulusal-yapay-zeka-stratejisi/&quot;}'  class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg"><img loading="lazy" width="800" height="450" data-attachment-id="3449" data-permalink="https://muratdemirci.wordpress.com/2024/07/24/ulusal-yapay-zeka-stratejisi/ai/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg" data-orig-size="800,450" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ai" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=616" data-id="3449" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=800" alt="" class="wp-image-3449" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg 800w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=300 300w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=768 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></figure>
</figure>



<p class="wp-block-paragraph">Sizler için Cumhurbaşkanlığının yayınlandığı Ulusal Yapay Zeka Stratejisi dokümanını hızlıca okudum. Kısa bir özetini yayınlamak istiyorum.</p>



<p class="wp-block-paragraph">Birinci hedef anonim ve gizli veri kümeleri oluşturmaktır deniliyor. Şahsen bu işle uğraştığım için yakından biliyorum: Bazı alanlarda Türkçe &#8220;corpus&#8221; bulmak gerçekten zor. Tüm mevzuatın kaliteli ve güncellenen bir veri kümesine dönüştürülmesi gibi önümüzde hayli önemli bir iş var. Bizim web sitelerimizden içerik çekmek ve arama yapmak Wikipedia gibi sitelerle karşılaştırıldığında bir hayli zor.</p>



<p class="wp-block-paragraph">Ayrıca basın-yayın, kitaplar, ansiklopediler, tüm sektörler ve tarihimiz için de güncellenen veri kümeleri üretmemiz gerekiyor. Şu an bir yapay zeka geliştirseniz mecburen Vikipedi gibi yurtdışı projelerine başvurmak zorunda kalıyorsunuz.</p>



<p class="wp-block-paragraph">Türkiye ve dünya web arşivinin (kapanan sitelerdeki içerikler dahil) de bir veri kümesine dönüştürülmesi güzel olur.</p>



<p class="wp-block-paragraph">Aslında ben bu dokümana şöyle bir ekleme yapmak isterdim. Türkiye&#8217;de popüler bir sosyal medya sitemiz olmadığı için mevcut Twitter, Instagram, LinkedIn, Facebook, Youtube vb. sitelerle anlaşmalar yaparak geçmiş ve güncel sosyal medya içeriğine erişim sağlamalıyız ki Grok benzeri sosyal medya beslemeli yapay zeka üretebilelim.</p>



<p class="wp-block-paragraph">Aksi taktirde ürettiğimiz hiçbir yapay zeka sosyal medya beslemeli olamayacak ve bu konuda yurtdışına bağımlı kalacağız demektir. Bu sorun diğer ülkelerde de var, bu yüzden mevcut popüler sosyal medya siteleriyle anlaşmalar yapmanın denenmesi lazım kanaatindeyim.</p>



<p class="wp-block-paragraph">Yapay zeka konusunda Türkçe, Osmanlıca vb. dil bilgisi ve çeviri alanlarında uzmanlaşmış açık kaynak kodlu kütüphanelere de ihtiyaç var. Türkçe İşaret Dili de dahil olmak üzere bu alandaki kullanıma hazır kütüphanelerin kaynak kodlarıyla birlikte geliştiricilere sunulması gerekiyor.</p>



<p class="wp-block-paragraph">Türkiye&#8217;deki geliştiricilerin ek iş olarak yerli open source projelere katılımının teşvik edilmesi güzel olur. Yani iş dünyası iş görüşmelerinde bunu bir artı olarak değerlendirirse geliştiriciler de avantajlı olduğu için bu alana yöneleceklerdir.</p>



<p class="wp-block-paragraph"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/tr-ulusalyzstratejisi2021-2025.pdf">Ulusal Yapay Zeka Stratejisi Dokümanını buradan indirebilirsiniz.</a></p>



<p class="wp-block-paragraph"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ulusalyapayzekastratejisi2024-2025eylemplani.pdf">Ulusal Yapay Zeka Stratejisi 2024-2025 Eylem Planı</a></p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/07/24/ulusal-yapay-zeka-stratejisi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3448</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/07/ai.jpg?w=800"/>
	<enclosure length="5737927" type="application/pdf" url="https://muratdemirci.me/wp-content/uploads/2024/07/tr-ulusalyzstratejisi2021-2025.pdf"/></item>
		<item>
		<title>Yapay Zeka Eğitimi Müfredatı (2024)</title>
		<link>https://muratdemirci.wordpress.com/2024/05/23/yapay-zeka-egitimi-mufredati-2024/</link>
					<comments>https://muratdemirci.wordpress.com/2024/05/23/yapay-zeka-egitimi-mufredati-2024/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Thu, 23 May 2024 13:24:07 +0000</pubDate>
				<category><![CDATA[Yapay Zeka]]></category>
		<guid isPermaLink="false">http://muratdemirci.me/?p=3434</guid>

					<description><![CDATA[Merhaba değerli takipçilerim, 2024 yılında Yapay Zeka eğitimi verenlerin eğitime nereden başlamaları, neleri öğretmeleri ve nasıl devam etmeleri gerektiği üzerine bir makale yazmaya karar verdim. Bu makalede önce kod-sonra teori yaklaşımı uygulanmaktadır. Özel ve gizli gizli öğrenim yerine halka açık öğrenmenizi tavsiye ediyorum. Yani blogunuzda makaleler yazarak öğrenin, insanlarla konuşarak öğrenin, Discord topluluklarına sorular sorarak [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim,</p>



<p class="wp-block-paragraph">2024 yılında Yapay Zeka eğitimi verenlerin eğitime nereden başlamaları, neleri öğretmeleri ve nasıl devam etmeleri gerektiği üzerine bir makale yazmaya karar verdim. Bu makalede <strong>önce kod-sonra teori</strong> yaklaşımı uygulanmaktadır.</p>



<p class="wp-block-paragraph">Özel ve gizli gizli öğrenim yerine halka açık öğrenmenizi tavsiye ediyorum. Yani blogunuzda makaleler yazarak öğrenin, insanlarla konuşarak öğrenin, Discord topluluklarına sorular sorarak öğrenin, herkese açık bir proje yazarak öğrenin, tweet atarak öğrenin.</p>



<figure class="wp-block-image size-large"><img src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/05/d5c37-0r55j9k9ivtcxqbhf.webp" alt="" /></figure>



<h2 class="wp-block-heading">Müfredat</h2>



<ol class="wp-block-list">
<li>Matematik</li>



<li>Araçlar
<ul class="wp-block-list">
<li>Python</li>



<li>Pytorch</li>
</ul>
</li>



<li>Makine Öğrenmesi
<ul class="wp-block-list">
<li>Sıfırdan Yaz</li>



<li>Rekabet</li>



<li>Yan Projeler Yap</li>



<li>Onları Yayınla</li>



<li>Tamamlayıcı</li>
</ul>
</li>



<li>Derin Öğrenme
<ul class="wp-block-list">
<li>Fast.ai</li>



<li>Rekabette Daha Fazlasını Yap</li>



<li>Sayfaları Uygula</li>



<li>Bilgisayar Görmesi (Computer Vision)</li>



<li>Doğal Dil İşleme (NLP)</li>
</ul>
</li>



<li>Geniş Dil Modelleri (LLM)
<ul class="wp-block-list">
<li>Sinir Ağlarını İzle</li>



<li>Ücretsiz LLM Eğitim Kampı</li>



<li>LLM&#8217;lerle Yapın</li>



<li>Hackathon&#8217;lara Katılın</li>



<li>Sayfaları Okuyun</li>



<li>Sıfırdan Transformatörler Yazın</li>



<li>Bazı İyi Blog&#8217;lar</li>



<li>Umar Jamil&#8217;i İzleyin</li>



<li>Açık Kaynaklı Modelleri Çalıştırmayı Öğrenin</li>



<li>Prompt Mühendisliği</li>



<li>LLM&#8217;leri Fine-tune Edin</li>



<li>RAG</li>
</ul>
</li>



<li>Nasıl Güncel Kalınır?</li>
</ol>



<p class="wp-block-paragraph">Bu makalenin orjinal İngilizce sürümünde müfredat başlıklarının içeriği hakkında daha ayrıntılı bilgi bulunmaktadır. Orjinal makale için: <a href="https://medium.com/bitgrit-data-science-publication/a-roadmap-to-learn-ai-in-2024-cc30c6aa6e16">https://medium.com/bitgrit-data-science-publication/a-roadmap-to-learn-ai-in-2024-cc30c6aa6e16</a></p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/05/23/yapay-zeka-egitimi-mufredati-2024/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3434</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/05/d5c37-0r55j9k9ivtcxqbhf.webp"/>
	</item>
		<item>
		<title>Yazılım Geliştirme Prensipleri</title>
		<link>https://muratdemirci.wordpress.com/2024/05/07/yazilim-gelistirme-prensipleri/</link>
					<comments>https://muratdemirci.wordpress.com/2024/05/07/yazilim-gelistirme-prensipleri/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Tue, 07 May 2024 08:25:01 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<guid isPermaLink="false">http://muratdemirci.me/?p=3420</guid>

					<description><![CDATA[Sonuç Bu makalede yazılım geliştirme ilkelerinin listesi özetlenerek sizlere sunulmuştur. Özgün makaleyi okumak isteyenler aşağıdaki bağlantıya tıklayabilirler ki özgün makalede konu detaylarıyla birlikte anlatılmaktadır:https://medium.com/gitconnected/the-20-essential-principles-of-software-development-lod-soc-solid-and-beyond-7a39a98b685d]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/05/a25b5-1zkj9v43ewt1pybhnicbtpg.webp" alt="" /></figure>



<ol class="wp-block-list">
<li><strong>Abstraction </strong>/ Soyutlama</li>



<li><strong>Encapsulation </strong>/ Kapsülleme</li>



<li><strong>DRY </strong>(Don&#8217;t repeat yourself, aka DIE: duplication is evil)</li>



<li><strong>KISS</strong> (Keep it simple, stupid)</li>



<li><strong>YAGNI</strong> (You aren’t gonna need it)</li>



<li><strong>LoD </strong>(Law of Demeter)</li>



<li><strong>SoC </strong>(Separation of Concerns)<br></li>



<li><strong>SOLID</strong>
<ul class="wp-block-list">
<li><strong>Single Responsibility</strong> (“A class should have one, and only one, reason to change.”)</li>



<li><strong>Open-closed principle</strong> (“Software entities should be open for extension but closed for modification.”)</li>



<li><strong>Liskov substitution</strong> (“Derived classes must be substitutable for their base classes.”)</li>



<li><strong>Interface segregation</strong> (“Make fine-grained interfaces that are client-specific.”)</li>



<li><strong>Dependency inversion</strong> (“Depend on abstractions, not on concretions.”)<br></li>
</ul>
</li>



<li><strong>GRASP </strong>(General Responsibility Assignment Principles)
<ul class="wp-block-list">
<li><strong>High cohesion</strong> (“Keep related functionalities and responsibilities together.”)</li>



<li><strong>Low coupling</strong> (“Reduce relations between unstable elements.”)</li>



<li><strong>Information expert</strong> (“Place responsibilities with data.”)</li>



<li><strong>Creator</strong> (“Assign the responsibility for object creation to a closely related class.”)</li>



<li><strong>Controller </strong>(“Assing the responsibility for handling system messages to a specific class.”)</li>



<li><strong>Indirection </strong>(“To support a low coupling, assign the responsibility to an intermediate class.”)</li>



<li><strong>Polymorphism </strong>(“When related alternative behaviors vary by type, use polymorphism to assign responsibility to the types for which the behavior varies.”)</li>



<li><strong>Pure fabrication</strong> (“To support a high cohesion, assign the responsibility to the convenient class.”)</li>



<li><strong>Protected variations</strong> (“Protect predicted variations by introducing a stable contract.”)</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><br>Sonuç</h2>



<p class="wp-block-paragraph">Bu makalede yazılım geliştirme ilkelerinin listesi özetlenerek sizlere sunulmuştur. Özgün makaleyi okumak isteyenler aşağıdaki bağlantıya tıklayabilirler ki özgün makalede konu detaylarıyla birlikte anlatılmaktadır:<br><a href="https://medium.com/gitconnected/the-20-essential-principles-of-software-development-lod-soc-solid-and-beyond-7a39a98b685d">https://medium.com/gitconnected/the-20-essential-principles-of-software-development-lod-soc-solid-and-beyond-7a39a98b685d</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/05/07/yazilim-gelistirme-prensipleri/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3420</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/05/a25b5-1zkj9v43ewt1pybhnicbtpg.webp"/>
	</item>
		<item>
		<title>NodeJS ile gRPC</title>
		<link>https://muratdemirci.wordpress.com/2024/04/04/nodejs-ile-grpc/</link>
					<comments>https://muratdemirci.wordpress.com/2024/04/04/nodejs-ile-grpc/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Thu, 04 Apr 2024 12:25:39 +0000</pubDate>
				<category><![CDATA[Node]]></category>
		<category><![CDATA[grpc]]></category>
		<guid isPermaLink="false">http://muratdemirci.me/?p=3379</guid>

					<description><![CDATA[Merhaba değerli takipçilerim; Makalemizde aşağıdakilerin nasıl yapıldığını öğreneceksiniz: gRPC&#8217;ye Giriş Bu bölüm sizleri gRPC ve Protokol Arabellekleri (protocol buffers) hakkında bilgilendirecektir. gRPC, protokol arabelleklerini hem Arayüz Tanımı Dili (Interface Definition Language &#8211; IDL) ve hem de temel mesaj değişim formatı olarak kullanabilir. Genel Bakış gRPC içinde, bir istemci uygulaması, farklı bir makinedeki sunucu uygulaması üzerindeki [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim;</p>



<p class="wp-block-paragraph">Makalemizde aşağıdakilerin nasıl yapıldığını öğreneceksiniz:</p>



<ul class="wp-block-list">
<li>.proto dosyasında bir servis tanımlamak</li>



<li>Servisimiz için Node.js gRPC API kullanarak basit bir istemci ve sunucu yazmak</li>
</ul>



<h2 class="wp-block-heading">gRPC&#8217;ye Giriş</h2>



<p class="wp-block-paragraph">Bu bölüm sizleri gRPC ve Protokol Arabellekleri (protocol buffers) hakkında bilgilendirecektir. gRPC, protokol arabelleklerini hem Arayüz Tanımı Dili (Interface Definition Language &#8211; IDL) ve hem de temel mesaj değişim formatı olarak kullanabilir.</p>



<h2 class="wp-block-heading">Genel Bakış</h2>



<p class="wp-block-paragraph">gRPC içinde, bir istemci uygulaması, farklı bir makinedeki sunucu uygulaması üzerindeki bir metodu yerel bir nesnede olduğu gibi doğrudan çağırabilir, ki böylece dağıtık uygulama ve hizmetleri oluşturmayı kolaylaştırır. Çoğu RPC sistemlerinde olduğu gibi, gRPC, servisi tanımlama, uzaktan çağrılabilecek metotları ve dönüş tiplerini belirtme üzerine temellenmiştir. Sunucu tarafında, sunucu, arayüzü implemente eder ve istemci taleplerini yönetmek için bir gRPC sunucusu çalıştırır. İstemci tarafında ise, istemcinin bir stub&#8217;ı (istemcide hangi programlama dilini kullanıyorsanız o dilde) vardır ki sunucudakinin aynı metotlarını sağlar.</p>



<figure class="wp-block-image size-large"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png"><img loading="lazy" width="552" height="327" data-attachment-id="3383" data-permalink="https://muratdemirci.wordpress.com/2024/04/04/nodejs-ile-grpc/image-13/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png" data-orig-size="552,327" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png?w=552" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png?w=552" alt="" class="wp-image-3383" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png 552w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png?w=300 300w" sizes="(max-width: 552px) 100vw, 552px" /></a></figure>



<p class="wp-block-paragraph">gPRC istemcileri ve sunucuları birbirleriyle farklı ortamlarda konuşabilir ve çalışabilirler ve gRPC&#8217;yi destekleyen dillerle yazılabilirler.</p>



<h2 class="wp-block-heading">Protokol Arabellekleri ile Çalışmak</h2>



<p class="wp-block-paragraph">Varsayılan olarak, gRPC, Protokol Arabelleklerini kullanır. Protokol Arabellekleri, yapılandırılmış veriyi serileştirmek için Google&#8217;ın açık kaynak kodlu mekanizmasıdır. Aşağıda nasıl çalıştığıyla ilgili küçük bir örnek bulacaksınız.</p>



<p class="wp-block-paragraph">Protokol Arabellekleri ile çalışırken ilk adım bir <em>proto </em>dosyasında verinin yapısını tanımlamaktır. Proto dosyası .proto uzantılı sıradan bir metin dosyasıdır. Protokol arabelleği verisi, mesajlar olarak yapılandırılmıştır ve her bir mesaj &#8220;alanlar&#8221; denilen ad-değer çiftleri serisini içeren küçük mantıksal kayıt bilgileridir. İşte küçük bir örnek:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}
</pre></div>


<p class="wp-block-paragraph">Veri yapılarını tanımladıktan sonra protokol arabelleği derleyicisi olan &#8220;protoc&#8221; ile tercih ettiğiniz dilde proto tanımınızdan veri erişim sınıflarını üretirsiniz. Böylece her bir alan için basit erişim metotları elde edersiniz, örneğin name() ve set_name() gibi; ve aynı zamanda tüm yapıyı salt baytlara serileştirmek/parse etmek ve salt baytlardan nesnelere çevirmek için gerekli metotları elde edersiniz. Böylece örneğin seçtiğiniz dil Node.js ise, derleyiciyi çalıştırdığınızda &#8220;Person&#8221; denilen bir sınıf üretirsiniz. Bu sınıfı uygulamanızda içini doldurmak, serileştirmek ve &#8220;Person&#8221; protokol arayüz mesajları almak için kullanabilirsiniz.</p>



<p class="wp-block-paragraph">Mesajları gördük. gRPC servislerini ise sıradan proto dosyalarında RPC metot parametreleri ve dönüş tipleri ile tanımlarsınız.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
</pre></div>


<p class="wp-block-paragraph">gRPC, protokol dosyanızdan kod oluşturmak için özel bir gRPC eklentisiyle <strong><em>protoc</em></strong> kullanır: oluşturulan gRPC istemci ve sunucu kodunun yanı sıra mesaj türlerinizi doldurmak, serileştirmek ve almak için normal protokol arabellek kodunu alırsınız.</p>



<h2 class="wp-block-heading">Niçin gPRC Kullanıyoruz?</h2>



<p class="wp-block-paragraph">Örneğimiz, istemcilerin rotalarındaki özellikler hakkında bilgi almasına, rotalarının bir özetini oluşturmasına ve sunucu ve diğer istemcilerle trafik güncellemeleri gibi rota bilgileri alışverişinde bulunmasına olanak tanıyan basit bir rota haritalama uygulamasıdır.</p>



<p class="wp-block-paragraph">GRPC ile hizmetimizi bir kez bir .proto dosyasında tanımlayabilir ve gRPC&#8217;nin desteklediği dillerden herhangi birinde istemciler ve sunucular oluşturabiliriz; bunlar da büyük bir veri merkezi içindeki sunuculardan kendi tabletinize kadar çeşitli ortamlarda çalıştırılabilir &#8211; tüm karmaşıklık Farklı diller ve ortamlar arasındaki iletişim sizin için gRPC tarafından gerçekleştirilir. Ayrıca verimli serileştirme, basit bir IDL ve kolay arayüz güncellemesi de dahil olmak üzere protokol arabellekleriyle çalışmanın tüm avantajlarından yararlanıyoruz.</p>



<h2 class="wp-block-heading">Örnek Kod ve Kurulum</h2>



<p class="wp-block-paragraph">Eğitimimizin örnek kodu <a href="https://github.com/grpc/grpc-node/tree/@grpc/grpc-js@1.9.0/examples/routeguide/dynamic_codegen">grpc/grpc-node/examples/routeguide/dynamic_codegen</a> konumundadır. Depoya baktığınızda göreceğiniz gibi, <a href="https://github.com/grpc/grpc-node/tree/@grpc/grpc-js@1.9.0/examples/routeguide/static_codegen">grpc/grpc-node/examples/routeguide/static_codegen</a>&#8216;de de çok benzer görünen bir örnek var. RouteGuide örneğimizin iki versiyonu var çünkü Node.js&#8217;de protokol arabellekleriyle çalışmak için gereken kodu oluşturmanın iki yolu var; bir yaklaşım, çalışma zamanında kodu dinamik olarak oluşturmak için Protobuf.js&#8217;yi kullanıyor, diğeri ise  statik olarak oluşturulan kodu kullanıyor. Örnekler aynı şekilde davranır ve her iki sunucu da her iki istemciyle de kullanılabilir. Dizin adından da anlaşılacağı gibi, bu belgede dinamik olarak oluşturulmuş kod içeren sürümü kullanacağız, ancak statik kod örneğine de bakmaktan çekinmeyin.</p>



<p class="wp-block-paragraph">Örneği indirmek için aşağıdaki komutu çalıştırarak grpc deposunu kopyalayın:</p>



<pre class="wp-block-code"><code><span style="background-color: initial;color: inherit;, monospace;font-size: 14px">$ git clone -b @grpc/grpc-js@1.9.0 --depth </span><span style="background-color: initial;, monospace;font-size: 14px;color: rgb(255, 102, 0)">1</span><span style="background-color: initial;color: inherit;, monospace;font-size: 14px"> --shallow-submodules https://github.com/grpc/grpc-node</span>
<span style="background-color: initial;color: inherit;, monospace;font-size: 14px">$ </span><span style="background-color: initial;, monospace;font-size: 14px;color: rgb(51, 102, 102)">cd</span><span style="background-color: initial;color: inherit;, monospace;font-size: 14px"> grpc</span></code></pre>



<p class="wp-block-paragraph">Ve şu anki dizini <em>examples </em>olarak değiştirin:</p>



<pre class="wp-block-code"><code>$ cd examples</code></pre>



<h2 class="wp-block-heading">Proto Dosyası</h2>



<p class="wp-block-paragraph">İlk adımımız protokol arabelleklerini kullanarak gRPC servisini ve metot isteği ve yanıt türlerini, ve mesajları tanımlamaktır. .proto dosyasının tamamını <a href="https://github.com/grpc/grpc-node//blob/@grpc/grpc-js@1.9.0/examples/protos/route_guide.proto">example/protos/route_guide.proto</a>&#8216;da görebilirsiniz.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
syntax = "proto3";

package routeguide;

// Interface exported by the server.
service RouteGuide {
  // A simple RPC.
  //
  // Obtains the feature at a given position.
  //
  // A feature with an empty name is returned if there's no feature at the given
  // position.
  rpc GetFeature(Point) returns (Feature) {}

  // A server-to-client streaming RPC.
  //
  // Obtains the Features available within the given Rectangle.  Results are
  // streamed rather than returned at once (e.g. in a response message with a
  // repeated field), as the rectangle may cover a large area and contain a
  // huge number of features.
  rpc ListFeatures(Rectangle) returns (stream Feature) {}

  // A client-to-server streaming RPC.
  //
  // Accepts a stream of Points on a route being traversed, returning a
  // RouteSummary when traversal is completed.
  rpc RecordRoute(stream Point) returns (RouteSummary) {}

  // A Bidirectional streaming RPC.
  //
  // Accepts a stream of RouteNotes sent while a route is being traversed,
  // while receiving other RouteNotes (e.g. from other users).
  rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}
}

// Points are represented as latitude-longitude pairs in the E7 representation
// (degrees multiplied by 10**7 and rounded to the nearest integer).
// Latitudes should be in the range +/- 90 degrees and longitude should be in
// the range +/- 180 degrees (inclusive).
message Point {
  int32 latitude = 1;
  int32 longitude = 2;
}

// A latitude-longitude rectangle, represented as two diagonally opposite
// points "lo" and "hi".
message Rectangle {
  // One corner of the rectangle.
  Point lo = 1;

  // The other corner of the rectangle.
  Point hi = 2;
}

// A feature names something at a given point.
//
// If a feature could not be named, the name is empty.
message Feature {
  // The name of the feature.
  string name = 1;

  // The point where the feature is detected.
  Point location = 2;
}

// A RouteNote is a message sent while at a given point.
message RouteNote {
  // The location from which the message is sent.
  Point location = 1;

  // The message to be sent.
  string message = 2;
}

// A RouteSummary is received in response to a RecordRoute rpc.
//
// It contains the number of individual points received, the number of
// detected features, and the total distance covered as the cumulative sum of
// the distance between each point.
message RouteSummary {
  // The number of points received.
  int32 point_count = 1;

  // The number of known features passed while traversing the route.
  int32 feature_count = 2;

  // The distance covered in metres.
  int32 distance = 3;

  // The duration of the traversal in seconds.
  int32 elapsed_time = 4;
}
</pre></div>


<h2 class="wp-block-heading">Servis tanımlayıcılarını protokol dosyalarından yükleme</h2>



<p class="wp-block-paragraph">Node.js kitaplığı, çalışma zamanında yüklenen .proto dosyalarından hizmet tanımlayıcılarını ve istemci stub (saplama) tanımlarını dinamik olarak oluşturur.</p>



<p class="wp-block-paragraph">Bir .proto dosyasını yüklemek için, gRPC protokol yükleyici kitaplığına ihtiyaç duymanız ve bunun loadSync() yöntemini kullanmanız, ardından çıktıyı gRPC kitaplığının loadPackageDefinition yöntemine aktarmanız yeterlidir:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var PROTO_PATH = __dirname + '/../../protos/route_guide.proto';
var grpc = require('@grpc/grpc-js');
var protoLoader = require('@grpc/proto-loader');
// Suggested options for similarity to existing grpc.load behavior
var packageDefinition = protoLoader.loadSync(
    PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });
var protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
// The protoDescriptor object has the full package hierarchy
var routeguide = protoDescriptor.routeguide;
</pre></div>


<p class="wp-block-paragraph">Bunu yaptıktan sonra, stub yapıcısı routeguide ad alanındadır (protoDescriptor.routeguide.RouteGuide) ve hizmet tanımlayıcısı (sunucu oluşturmak için kullanılır) stub&#8217;ın bir özelliğidir (protoDescriptor.routeguide.RouteGuide.service).</p>



<h2 class="wp-block-heading">Sunucuyu oluşturma</h2>



<p class="wp-block-paragraph">Öncelikle RouteGuide sunucusunu nasıl oluşturduğumuza bakalım. Yalnızca gRPC istemcileri oluşturmakla ilgileniyorsanız, bu bölümü atlayabilir ve doğrudan İstemci oluşturma bölümüne gidebilirsiniz (yine de bunu ilginç bulabilirsiniz!).</p>



<p class="wp-block-paragraph">RouteGuide hizmetimizin işini yapmasını sağlamanın iki bölümü vardır:</p>



<p class="wp-block-paragraph">Hizmet tanımımızdan oluşturulan hizmet arayüzünü uygulamak: hizmetimizin asıl &#8220;işini&#8221; yapmak.<br>İstemcilerden gelen istekleri dinlemek ve hizmet yanıtlarını döndürmek için bir gRPC sunucusu çalıştırma.<br>Örnek RouteGuide sunucumuzu <a href="https://github.com/grpc/grpc-node/blob/@grpc/grpc-js@1.9.0/examples/routeguide/dynamic_codegen/route_guide_server.js">example/routeguide/dynamic_codegen/route_guide_server.js</a> adresinde bulabilirsiniz. Nasıl çalıştığına daha yakından bakalım.</p>



<h2 class="wp-block-heading">RouteGuide&#8217;ı Uygulama</h2>



<p class="wp-block-paragraph">Gördüğünüz gibi sunucumuz RouteGuide.service tanımlayıcı nesnesinden oluşturulmuş bir <em>server </em>yapıcısına sahiptir.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var Server = new grpc.Server();
</pre></div>


<p class="wp-block-paragraph">Bu durumda, varsayılan gRPC sunucu davranışımızı sağlayan RouteGuide&#8217;ın asenkron sürümünü uyguluyoruz.</p>



<p class="wp-block-paragraph">Route_guide_server.js&#8217;deki işlevler tüm hizmet yöntemlerimizi uygular. Önce en basit tür olan getFeature&#8217;a bakalım; bu, istemciden yalnızca bir Point alır ve karşılık gelen özellik bilgisini veritabanından bir Feature içinde döndürür.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
function checkFeature(point) {
  var feature;
  // Check if there is already a feature object for the given point
  for (var i = 0; i &lt; feature_list.length; i++) {
    feature = feature_list&#91;i];
    if (feature.location.latitude === point.latitude &amp;&amp;
        feature.location.longitude === point.longitude) {
      return feature;
    }
  }
  var name = &#039;&#039;;
  feature = {
    name: name,
    location: point
  };
  return feature;
}
function getFeature(call, callback) {
  callback(null, checkFeature(call.request));
}
</pre></div>


<p class="wp-block-paragraph">Yöntem, RPC için özellik olarak Point parametresine sahip olan bir çağrı nesnesine ve döndürülen Feature&#8217;ımızı iletebileceğimiz bir geri çağrıya iletilir. Yöntem gövdesinde, verilen noktaya karşılık gelen bir Feature&#8217;ı doldururuz ve onu, hiçbir hata olmadığını belirtmek için boş bir ilk parametreyle geri çağırmaya geçiririz.</p>



<p class="wp-block-paragraph">Şimdi biraz daha karmaşık bir şeye bakalım: akışlı bir RPC. listFeatures, sunucu tarafı akışlı bir RPC&#8217;dir, bu nedenle istemcimize birden fazla Feature göndermemiz gerekir.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
function listFeatures(call) {
  var lo = call.request.lo;
  var hi = call.request.hi;
  var left = _.min(&#91;lo.longitude, hi.longitude]);
  var right = _.max(&#91;lo.longitude, hi.longitude]);
  var top = _.max(&#91;lo.latitude, hi.latitude]);
  var bottom = _.min(&#91;lo.latitude, hi.latitude]);
  // For each feature, check if it is in the given bounding box
  _.each(feature_list, function(feature) {
    if (feature.name === &#039;&#039;) {
      return;
    }
    if (feature.location.longitude &gt;= left &amp;&amp;
        feature.location.longitude &lt;= right &amp;&amp;
        feature.location.latitude &gt;= bottom &amp;&amp;
        feature.location.latitude &lt;= top) {
      call.write(feature);
    }
  });
  call.end();
}
</pre></div>


<p class="wp-block-paragraph">Gördüğünüz gibi metod parametrelerimizde call nesnesini ve callback&#8217;i almak yerine bu sefer Writable arayüzü uygulayan bir call nesnesi alıyoruz. Yöntemde, döndürmemiz gereken sayıda Feature nesnesi oluştururuz ve bunları write() yöntemini kullanarak call&#8217;a yazarız. Son olarak tüm mesajları gönderdiğimizi belirtmek için call.end() metodunu çağırıyoruz.</p>



<p class="wp-block-paragraph">İstemci tarafı akış yöntemi RecordRoute&#8217;a bakarsanız, bunun tekli call&#8217;a oldukça benzer olduğunu görürsünüz, ancak bu sefer call parametresi <em>Reader </em>arayüzünü uygular. Call&#8217;un &#8216;data&#8217; olayı her yeni veri olduğunda tetiklenir ve &#8216;end&#8217; olayı tüm veriler okunduğunda tetiklenir. Tekli durumda olduğu gibi, callback&#8217;i çağırarak yanıt veririz.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
call.on('data', function(point) {
  // Process user data
});
call.on('end', function() {
  callback(null, result);
});
</pre></div>


<p class="wp-block-paragraph">Son olarak çift yönlü akış RPC RouteChat()&#8217;a bakalım:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
function routeChat(call) {
  call.on('data', function(note) {
    var key = pointKey(note.location);
    /* For each note sent, respond with all previous notes that correspond to
     * the same point */
    if (route_notes.hasOwnProperty(key)) {
      _.each(route_notes&#91;key], function(note) {
        call.write(note);
      });
    } else {
      route_notes&#91;key] = &#91;];
    }
    // Then add the new note to the list
    route_notes&#91;key].push(JSON.parse(JSON.stringify(note)));
  });
  call.on('end', function() {
    call.end();
  });
}
</pre></div>


<p class="wp-block-paragraph">Bu sefer mesajları okumak ve yazmak için kullanılabilecek Duplex&#8217;i uygulayan bir çağrı alıyoruz. Buradaki okuma ve yazma sözdizimi, istemci akışı ve sunucu akışı yöntemlerimizle tamamen aynıdır. Her ne kadar her iki taraf da diğerinin mesajlarını her zaman yazıldığı sıraya göre alsa da, hem istemci hem de sunucu herhangi bir sırayla okuyabilir ve yazabilir; akışlar tamamen bağımsız olarak çalışır.</p>



<h2 class="wp-block-heading">Sunucuyu başlatma</h2>



<p class="wp-block-paragraph">Tüm yöntemlerimizi uyguladıktan sonra, müşterilerin hizmetimizi gerçekten kullanabilmesi için bir gRPC sunucusu da başlatmamız gerekiyor. Aşağıdaki kod parçası RouteGuide hizmetimiz için bunu nasıl yaptığımızı göstermektedir:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
function getServer() {
  var server = new grpc.Server();
  server.addService(routeguide.RouteGuide.service, {
    getFeature: getFeature,
    listFeatures: listFeatures,
    recordRoute: recordRoute,
    routeChat: routeChat
  });
  return server;
}
var routeServer = getServer();
routeServer.bindAsync(&#039;0.0.0.0:50051&#039;, grpc.ServerCredentials.createInsecure(), () =&gt; {
  routeServer.start();
});
</pre></div>


<p class="wp-block-paragraph">Gördüğünüz gibi aşağıdaki adımlarla sunucumuzu kurup başlatıyoruz:</p>



<ul class="wp-block-list">
<li>RouteGuide hizmet tanımlayıcısından bir Sunucu yapıcısı oluşturun.</li>



<li>Servis yöntemlerini uygulayın.</li>



<li>Yöntem uygulamalarıyla Sunucu yapıcısını çağırarak sunucunun bir örneğini oluşturun.</li>



<li>Örneğin bind() yöntemini kullanarak istemci isteklerini dinlemek için kullanmak istediğimiz adresi ve bağlantı noktasını belirtin.</li>



<li>RPC sunucusunu başlatmak için örnekte start() öğesini çağırın.</li>
</ul>



<h2 class="wp-block-heading">İstemciyi oluşturma</h2>



<p class="wp-block-paragraph">Bu bölümde RouteGuide hizmetimiz için Node.js istemcisi oluşturmaya bakacağız. Örnek istemci kodumuzun tamamını <a href="https://github.com/grpc/grpc-node/blob/@grpc/grpc-js@1.9.0/examples/routeguide/dynamic_codegen/route_guide_client.js">example/routeguide/dynamic_codegen/route_guide_client.js</a> adresinde görebilirsiniz.</p>



<h2 class="wp-block-heading">Stub oluşturma</h2>



<p class="wp-block-paragraph">Servis yöntemlerini çağırmak için öncelikle bir stub oluşturmamız gerekiyor. Bunu yapmak için, sunucu adresini ve bağlantı noktasını belirterek RouteGuide stub yapıcısını çağırmamız yeterlidir.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
new routeguide.RouteGuide('localhost:50051', grpc.credentials.createInsecure());
</pre></div>


<h2 class="wp-block-heading">Servis yöntemlerinin çağrılması</h2>



<p class="wp-block-paragraph">Şimdi hizmet yöntemlerimizi nasıl adlandırdığımıza bakalım. Bu yöntemlerin hepsinin asenkron olduğunu unutmayın: sonuçları almak için olayları veya callback&#8217;leri kullanırlar.</p>



<h2 class="wp-block-heading">Basit RPC</h2>



<p class="wp-block-paragraph">Basit RPC GetFeature&#8217;ı çağırmak neredeyse yerel asenkron (eşzamansız) bir yöntemi çağırmak kadar basittir.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var point = {latitude: 409146138, longitude: -746188906};
stub.getFeature(point, function(err, feature) {
  if (err) {
    // process error
  } else {
    // process feature
  }
});
</pre></div>


<p class="wp-block-paragraph">Gördüğünüz gibi bir request nesnesi oluşturup dolduruyoruz. Son olarak, stub&#8217;taki yöntemi çağırırız, ona request ve callback&#8217;i iletiriz. Eğer hata yoksa sunucudan gelen yanıt bilgisini yanıt nesnemizden okuyabiliriz.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
console.log('Found feature called "' + feature.name + '" at ' +
    feature.location.latitude/COORD_FACTOR + ', ' +
    feature.location.longitude/COORD_FACTOR);
</pre></div>


<h2 class="wp-block-heading">Akış RPC&#8217;leri</h2>



<p class="wp-block-paragraph">Şimdi akış yöntemlerimize bakalım. Sunucu oluşturma konusunu daha önce okuduysanız bunlardan bazıları çok tanıdık gelebilir; akışlı RPC&#8217;ler her iki tarafta da benzer şekilde uygulanır. Coğrafi Feature&#8217;ların akışını döndüren sunucu tarafı akış yöntemini ListFeatures olarak adlandırdığımız yer burasıdır:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var call = client.listFeatures(rectangle);
  call.on('data', function(feature) {
      console.log('Found feature called "' + feature.name + '" at ' +
          feature.location.latitude/COORD_FACTOR + ', ' +
          feature.location.longitude/COORD_FACTOR);
  });
  call.on('end', function() {
    // The server has finished sending
  });
  call.on('error', function(e) {
    // An error has occurred and the stream has been closed.
  });
  call.on('status', function(status) {
    // process status
  });
</pre></div>


<p class="wp-block-paragraph">Metoda bir request ve callback iletmek yerine, ona bir request iletiriz ve Okunabilir bir akış nesnesini geri alırız. İstemci, sunucunun yanıtlarını okumak için Okunabilir&#8217;in &#8216;data&#8217; olayını kullanabilir. Bu olay, daha fazla mesaj kalmayıncaya kadar her Feature mesajı nesnesiyle birlikte tetiklenir. &#8216;data&#8217; callback&#8217;indeki hatalar akışın kapatılmasına neden olmaz. &#8216;error&#8217; olayı bir hatanın oluştuğunu ve akışın kapatıldığını gösterir. &#8216;end&#8217; olayı, sunucunun gönderimi tamamladığını ve herhangi bir hata oluşmadığını gösterir. &#8216;error&#8217; veya &#8216;end&#8217;ten yalnızca biri yayınlanacaktır. Son olarak, sunucu durumu gönderdiğinde &#8216;status&#8217; olayı tetiklenir.</p>



<p class="wp-block-paragraph">İstemci tarafı akış metodu RecordRoute benzerdir; tek fark, metoda bir callback iletmemiz ve bir Yazılabilir&#8217;i geri almamızdır.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var call = client.recordRoute(function(error, stats) {
  if (error) {
    callback(error);
  }
  console.log(&#039;Finished trip with&#039;, stats.point_count, &#039;points&#039;);
  console.log(&#039;Passed&#039;, stats.feature_count, &#039;features&#039;);
  console.log(&#039;Travelled&#039;, stats.distance, &#039;meters&#039;);
  console.log(&#039;It took&#039;, stats.elapsed_time, &#039;seconds&#039;);
});
function pointSender(lat, lng) {
  return function(callback) {
    console.log(&#039;Visiting point &#039; + lat/COORD_FACTOR + &#039;, &#039; +
        lng/COORD_FACTOR);
    call.write({
      latitude: lat,
      longitude: lng
    });
    _.delay(callback, _.random(500, 1500));
  };
}
var point_senders = &#91;];
for (var i = 0; i &lt; num_points; i++) {
  var rand_point = feature_list&#91;_.random(0, feature_list.length - 1)];
  point_senders&#91;i] = pointSender(rand_point.location.latitude,
                                 rand_point.location.longitude);
}
async.series(point_senders, function() {
  call.end();
});
</pre></div>


<p class="wp-block-paragraph">Write() kullanarak müşterimizin isteklerini akışa yazmayı bitirdikten sonra, gRPC&#8217;ye yazmayı bitirdiğimizi bildirmek için akışta end() öğesini çağırmamız gerekir. Durum iyiyse stats nesnesi sunucunun yanıtıyla doldurulacaktır.</p>



<p class="wp-block-paragraph">Son olarak çift yönlü akış RPC RouteChat()&#8217;a bakalım. Bu durumda, metoda yalnızca bir bağlam aktarırız ve mesajları hem yazmak hem de okumak için kullanabileceğimiz bir Duplex akış nesnesini geri alırız.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
var call = client.routeChat();
</pre></div>


<p class="wp-block-paragraph">Buradaki okuma ve yazma sözdizimi, istemci akışı ve sunucu akışı yöntemlerimizle tamamen aynıdır. Her iki taraf da diğerinin mesajlarını her zaman yazıldığı sıraya göre alsa da, hem istemci hem de sunucu herhangi bir sırayla okuyabilir ve yazabilir; akışlar tamamen bağımsız olarak çalışır.</p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/04/04/nodejs-ile-grpc/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3379</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/04/image.png?w=552"/>
	</item>
		<item>
		<title>PoS Algoritmalı BlockChain Geliştirelim</title>
		<link>https://muratdemirci.wordpress.com/2024/03/27/pos-algoritmali-blockchain-gelistirelim/</link>
					<comments>https://muratdemirci.wordpress.com/2024/03/27/pos-algoritmali-blockchain-gelistirelim/#respond</comments>
		
		<dc:creator><![CDATA[Murat Demirci]]></dc:creator>
		<pubDate>Wed, 27 Mar 2024 08:33:21 +0000</pubDate>
				<category><![CDATA[Blockchain]]></category>
		<category><![CDATA[Rust]]></category>
		<category><![CDATA[pos]]></category>
		<guid isPermaLink="false">http://muratdemirci.me/?p=3361</guid>

					<description><![CDATA[Merhaba değerli takipçilerim, Uzun bir aradan sonra Medium makalelerini takip ettikçe yazılımın geleceği üzerine daha iyi bir görüş kazandığıma inanıyorum. Buna göre C ve C++&#8217;tan kurtulamamış programlama dilleri Siber Güvenlik kriterlerini karşılamada oldukça zor durumdalar. Python komple C ile yazılmış durumda, her ne kadar popüler de olsa bellek güvenliği konusunda hiç iyi durumda değil. Java [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Merhaba değerli takipçilerim,</p>



<p class="wp-block-paragraph">Uzun bir aradan sonra Medium makalelerini takip ettikçe yazılımın geleceği üzerine daha iyi bir görüş kazandığıma inanıyorum.</p>



<p class="wp-block-paragraph">Buna göre C ve C++&#8217;tan kurtulamamış programlama dilleri Siber Güvenlik kriterlerini karşılamada oldukça zor durumdalar. Python komple C ile yazılmış durumda, her ne kadar popüler de olsa bellek güvenliği konusunda hiç iyi durumda değil. Java ve .NET dillerinin OpenJDK ve .NET Runtime&#8217;larının kaynak kodlarını incelediğimizde büyük oranda C ve C++ kodları içerdiğini görmekteyiz. O yüzden bu diller de bellek güvenliği konusunda geride kalmış durumdalar, ancak Microsoft bellek güvenliği konusunda çalışma yapacaklarını açıkladı.</p>



<p class="wp-block-paragraph">Bellek güvenliği ve performansta en önde ve en iyi olan diller Rust ve Go dilleridir. Ancak bunlar da halen C Runtime&#8217;ına bağımlıdırlar, buna karşın bu dillerin her ikisi de C&#8217;den bağımsız hale getirilebiliyorlar. Kaynak kodları zaten C ve C++&#8217;tan arındırılmıştır ve runtime&#8217;da da tamamen arındırıp saf Rust ve saf Go çıktısı alınabiliyor.</p>



<p class="wp-block-paragraph">Öte taraftan Devin AI ile farkettik ki Web 2.0 yazılımlarını artık WordPress&#8217;e benzeyen araçlarla hazır temalı arayüzlerle bir kaç dakikada hazırlayabiliyoruz. O yüzden artık Web 2.0 yazılımları hazırlamak kolay ve ucuz bir iş haline dönüşmeye başlıyor.</p>



<p class="wp-block-paragraph">Ancak buna karşın BlockChain yazılımları hazırlamak halen çok zor kabul ediliyor. Rusya&#8217;nın Ethereum&#8217;u Go&#8217;yu ve Solidity&#8217;i tercih etmiş durumda. Elon Musk ve Mark Zuckerberg ise BlockChain ve Yapay Zeka&#8217;da Rust&#8217;ı tercih etmiş durumdalar. NodeJS ise performansta oldukça geride kalmış bir teknoloji olduğu için ben tavsiye etmiyorum, eğer EVM (Ethereum Virtual Machine) yerine NodeJS tercih edilirse görüşüm değişebilir.</p>



<figure class="wp-block-image size-large"><a href="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp"><img loading="lazy" width="1011" height="543" data-attachment-id="3374" data-permalink="https://muratdemirci.wordpress.com/2024/03/27/pos-algoritmali-blockchain-gelistirelim/rust-go/" data-orig-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp" data-orig-size="1011,543" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="rust-go" data-image-description="" data-image-caption="" data-large-file="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=616" src="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=1011" alt="" class="wp-image-3374" srcset="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp 1011w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=150 150w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=300 300w, https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=768 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></a><figcaption class="wp-element-caption">Referanstaki makaleden alıntıdır.</figcaption></figure>



<p class="wp-block-paragraph">O yüzden yazılımcıların aşağıdaki teknolojileri öğrenmelerini tavsiye ediyorum:</p>



<ol class="wp-block-list">
<li><strong>Rust</strong>: bellek güvenliği ve performansta en iyisidir ve C&#8217;den tamamen bağımsız hale getirilebiliyor.</li>



<li><strong>Go</strong>: bellek güvenliği ve performansta oldukça iyidir ve C&#8217;den tamamen bağımsız hale getirilebiliyor.</li>



<li><strong>AI</strong></li>



<li><strong>BlockChain</strong></li>
</ol>



<p class="wp-block-paragraph">Şimdi bu makalede PoS algoritmasını kullanarak Rust ile bir blockchain geliştirelim&#8230;</p>



<h2 class="wp-block-heading">Genel Rehber</h2>



<p class="wp-block-paragraph">Rust ile bir PoS (Proof of Stake) blockchain ağı oluşturmak oldukça ilginç bir projedir. İşte bu projeyi gerçekleştirmek için genel bir rehber:</p>



<ol class="wp-block-list">
<li><strong>Gerekli Araçların Kurulumu</strong>:
<ul class="wp-block-list">
<li>Rust programlama dili ve Cargo paket yöneticisi gibi geliştirme araçlarını kurmanız gerekecek. Rust&#8217;un resmi web sitesinden indirip kurabilirsiniz.</li>
</ul>
</li>



<li><strong>Proje Yapısının Oluşturulması</strong>:
<ul class="wp-block-list">
<li>Boş bir proje dizini oluşturun ve içine giriş noktası olan <code>main.rs</code> dosyasını ekleyin.</li>



<li>Projeyi başlatmak için bir <code>Cargo.toml</code> dosyası oluşturun. Bu dosyada proje bağımlılıklarını ve diğer yapılandırma ayarlarını tanımlayabilirsiniz.</li>
</ul>
</li>



<li><strong>Blockchain Temel Yapısının Oluşturulması</strong>:
<ul class="wp-block-list">
<li>Blok, zincir ve diğer temel yapıları temsil etmek için Rust&#8217;ta bir dizi veri yapısı tanımlayın. Örneğin, <code>Block</code> ve <code>Blockchain</code> yapılarını tanımlayabilirsiniz.</li>



<li>Blokların içeriğini, önceki bloğun hash&#8217;ini, kendi hash&#8217;ini ve diğer gerekli bilgileri içerecek şekilde tanımlayın.</li>
</ul>
</li>



<li><strong>PoS Algoritmasının Uygulanması</strong>:
<ul class="wp-block-list">
<li>PoS algoritmasını uygulamak için, her bir katılımcının sahip olduğu jeton sayısına dayalı olarak yeni blokları doğrulama yetkisine sahip olacağı bir sistem oluşturmanız gerekir. Bu, kullanıcıların jetonlarını stake etmeleri ve buna göre blokları doğrulamaları gerektiği anlamına gelir.</li>



<li>Blok oluşturma işlemlerini, PoS algoritmasına göre gerçekleştiren bir mekanizma ekleyin. Bu, mevcut jeton sahiplerinden rastgele birini blok oluşturucu olarak seçmek ve bloğun onayını almak için belirli bir hesaplama süreci gerçekleştirmek olabilir.</li>
</ul>
</li>



<li><strong>Konsensüs Mekanizmasının Uygulanması</strong>:
<ul class="wp-block-list">
<li>Bloklar arasındaki konsensüsü sağlamak için gerekli mekanizmaları uygulayın. PoS&#8217;de genellikle oybirliği veya en uzun zincir kuralı gibi mekanizmalar kullanılır.</li>
</ul>
</li>



<li><strong>Ağ İletişiminin ve Eşler Arası İletişiminin İmplementasyonu</strong>:
<ul class="wp-block-list">
<li>Blokların eşler arasında iletilmesi ve yeni blokların ağa yayılması için iletişim protokollerini ve ağ katmanını uygulayın. Bu, blok senkronizasyonu, yeni blok ekleme ve işlem iletişimi gibi işlevleri içerir.</li>
</ul>
</li>



<li><strong>Güvenlik ve Performans İyileştirmeleri</strong>:
<ul class="wp-block-list">
<li>Güvenlik açıklarını önlemek için gerekli kontrolleri ekleyin. Ayrıca, performansı artırmak için çeşitli optimizasyonları düşünebilirsiniz.</li>
</ul>
</li>



<li><strong>Testlerin Eklenmesi ve Kodun Denenmesi</strong>:
<ul class="wp-block-list">
<li>Kodunuzu test etmek ve doğrulamak için kapsamlı bir test süiti oluşturun. Bu, yazılımınızın doğru çalıştığını ve beklenen sonuçları ürettiğini doğrulamanıza yardımcı olacaktır.</li>
</ul>
</li>



<li><strong>Belgelendirme ve Topluluk İletişimi</strong>:
<ul class="wp-block-list">
<li>Projenizi belgeleyin ve açıklayıcı dökümantasyonlar ekleyin. Ayrıca, topluluğunuzu bilgilendirmek ve geri bildirim almak için forumlar, tartışma grupları veya diğer iletişim kanallarını kullanın.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">Bu adımları takip ederek, Rust ile PoS algoritmasını kullanan bir blockchain ağı oluşturabilirsiniz. Ancak unutmayın ki gerçek bir blockchain ağı geliştirmek ciddi bir zorluk ve zaman gerektirir. Bu nedenle sabırlı olun ve projenizi adım adım ilerletin.</p>



<h2 class="wp-block-heading">PoS Algoritmalı BlockChain Kodu</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
use std::time::{Instant, Duration};
use ring::digest;

// Blok yapısı
#&#91;derive(Debug, Clone)]
struct Block {
    index: usize,
    timestamp: u64,
    data: String,
    previous_hash: Vec&lt;u8&gt;,
    hash: Vec&lt;u8&gt;,
    validator: String,
}

impl Block {
    fn new(index: usize, timestamp: u64, data: String, previous_hash: Vec&lt;u8&gt;, validator: String) -&gt; Self {
        let hash = Block::calculate_hash(index, timestamp, data.as_str(), &amp;previous_hash);
        Block { index, timestamp, data, previous_hash, hash, validator }
    }

    fn calculate_hash(index: usize, timestamp: u64, data: &amp;str, previous_hash: &amp;&#91;u8]) -&gt; Vec&lt;u8&gt; {
        let input = format!("{}{}{}{}", index, timestamp, data, previous_hash);
        digest::digest(&amp;digest::SHA256, input.as_bytes()).as_ref().to_vec()
    }
}

// Blockchain yapısı
struct Blockchain {
    blocks: Vec&lt;Block&gt;,
}

impl Blockchain {
    fn new() -&gt; Self {
        let genesis_block = Block::new(0, Instant::now().elapsed().as_secs(), String::from("Genesis Block"), vec!&#91;], String::from("Genesis Validator"));
        Blockchain { blocks: vec!&#91;genesis_block] }
    }

    fn add_block(&amp;mut self, data: String, validator: String) {
        let previous_block = self.blocks.last().unwrap();
        let new_index = previous_block.index + 1;
        let new_timestamp = Instant::now().elapsed().as_secs();
        let new_hash = Block::calculate_hash(new_index, new_timestamp, data.as_str(), &amp;previous_block.hash);
        let new_block = Block { index: new_index, timestamp: new_timestamp, data, previous_hash: previous_block.hash.clone(), hash: new_hash, validator };
        self.blocks.push(new_block);
    }

    fn is_valid(&amp;self) -&gt; bool {
        for (i, block) in self.blocks.iter().enumerate() {
            if i == 0 {
                continue; // Genesis block always valid
            }
            let previous_block = &amp;self.blocks&#91;i - 1];
            if block.index != previous_block.index + 1 {
                return false;
            }
            if block.previous_hash != previous_block.hash {
                return false;
            }
            if block.hash != Block::calculate_hash(block.index, block.timestamp, block.data.as_str(), &amp;block.previous_hash) {
                return false;
            }
        }
        true
    }

    fn get_validator(&amp;self, index: usize) -&gt; Option&lt;&amp;str&gt; {
        if index &lt; self.blocks.len() {
            Some(&amp;self.blocks&#91;index].validator)
        } else {
            None
        }
    }
}

// PoS Algoritması
struct ProofOfStake {
    validators: Vec&lt;String&gt;,
}

impl ProofOfStake {
    fn new(validators: Vec&lt;String&gt;) -&gt; Self {
        ProofOfStake { validators }
    }

    fn select_validator(&amp;self, block_index: usize) -&gt; String {
        let validator_index = block_index % self.validators.len();
        self.validators&#91;validator_index].clone()
    }
}

// Konsensüs Mekanizması
struct Consensus {
    blockchain: Blockchain,
    pos: ProofOfStake,
}

impl Consensus {
    fn new(validators: Vec&lt;String&gt;) -&gt; Self {
        let pos = ProofOfStake::new(validators);
        let blockchain = Blockchain::new();
        Consensus { blockchain, pos }
    }

    fn add_block(&amp;mut self, data: String) {
        let last_block_index = self.blockchain.blocks.len() - 1;
        let validator = self.pos.select_validator(last_block_index);
        self.blockchain.add_block(data, validator);
    }

    fn is_valid(&amp;self) -&gt; bool {
        self.blockchain.is_valid()
    }

    fn get_validator(&amp;self, block_index: usize) -&gt; Option&lt;&amp;str&gt; {
        self.blockchain.get_validator(block_index)
    }
}

fn main() {
    let validators = vec!&#91;
        String::from("Validator 1"),
        String::from("Validator 2"),
        String::from("Validator 3"),
    ];
    let mut consensus = Consensus::new(validators.clone());

    consensus.add_block(String::from("Block 1 Data"));
    consensus.add_block(String::from("Block 2 Data"));

    println!("Blockchain is valid: {}", consensus.is_valid());

    for (i, validator) in validators.iter().enumerate() {
        if let Some(block_validator) = consensus.get_validator(i) {
            println!("Block {} is validated by {}", i+1, block_validator);
            assert_eq!(validator, block_validator);
        }
    }
}
</pre></div>


<h2 class="wp-block-heading">Ağ İletişimi</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
use std::thread;

// Basit bir mesaj tipi
#&#91;derive(Debug)]
enum Message {
    NewBlock(String),
}

// Blok zinciri eşler arası iletişim işlevleri
struct PeerToPeer {
    peers: Vec&lt;String&gt;,
}

impl PeerToPeer {
    fn new(peers: Vec&lt;String&gt;) -&gt; Self {
        PeerToPeer { peers }
    }

    // Bir bloğu ağdaki diğer eşlere yayma
    fn broadcast(&amp;self, block_data: String) {
        for peer in &amp;self.peers {
            if let Ok(mut stream) = TcpStream::connect(peer) {
                let message = Message::NewBlock(block_data.clone());
                let serialized_message = serde_json::to_string(&amp;message).unwrap();
                stream.write_all(serialized_message.as_bytes()).unwrap();
            }
        }
    }

    // Diğer eşlerden gelen mesajları dinleme
    fn listen(&amp;self, listener: TcpListener) {
        for stream in listener.incoming() {
            match stream {
                Ok(mut stream) =&gt; {
                    let mut buffer = &#91;0; 1024];
                    match stream.read(&amp;mut buffer) {
                        Ok(_) =&gt; {
                            let message: Message = serde_json::from_slice(&amp;buffer).unwrap();
                            println!("Received message: {:?}", message);
                        }
                        Err(e) =&gt; {
                            println!("Error reading from stream: {:?}", e);
                        }
                    }
                }
                Err(e) =&gt; {
                    println!("Error accepting connection: {:?}", e);
                }
            }
        }
    }
}

fn main() {
    let peers = vec!&#91;
        String::from("127.0.0.1:8081"),
        String::from("127.0.0.1:8082"),
        String::from("127.0.0.1:8083"),
    ];

    // Eşler arası iletişim yöneticisi oluşturma
    let p2p = PeerToPeer::new(peers.clone());

    // Diğer eşlerle iletişim için dinleyici başlatma
    for peer in &amp;peers {
        let listener = TcpListener::bind(peer).unwrap();
        let p2p_clone = p2p.clone();
        thread::spawn(move || {
            p2p_clone.listen(listener);
        });
    }

    // Örnek bir blok oluşturma ve ağdaki diğer eşlere yayma
    let block_data = String::from("Sample Block Data");
    p2p.broadcast(block_data);
}
</pre></div>


<p class="wp-block-paragraph">Rust dilini öğrenmek isteyenler aşağıdaki Medium makalesini okuyabilirler:</p>



<p class="wp-block-paragraph"><a href="https://medium.com/@jerryjohnthomas/learning-rust-2024-crash-course-d81babf37696">Rust&#8217;ı Öğrenmek &#8211; 2024</a></p>



<p class="wp-block-paragraph">Mutlu kodlamalar <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://muratdemirci.wordpress.com/2024/03/27/pos-algoritmali-blockchain-gelistirelim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3361</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/4cf6c80ae4c9738774268f95efaa47f173bf888cbf4161da6a9dba9c98e031fa?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">neoffer</media:title>
		</media:content>

		<media:content medium="image" url="https://muratdemirci.wordpress.com/wp-content/uploads/2024/03/rust-go.webp?w=1011"/>
	</item>
	</channel>
</rss>