Temel Mikrohizmet Mimarisi


Merhaba değerli takipçilerim,

Mikrohizmet mimarisi ile uygulamaları hazırlamak zorunluluk olmasada hem yükü dağıtmak hem de güvenlik için izolasyon sağlamak adına en az 4 katmanlı bir mikrohizmet mimarisi kurmak zorundayız.

  1. Üyelik mikrohizmeti
  2. Backend mikrohizmeti
  3. Frontend mikrohizmeti
  4. Günlük mikrohizmeti

Uygulama mikrohizmetini de Ödeme, Muhasebe, CRM, Yönetim Paneli, Arama gibi mikrohizmetlere bölebilirsiniz. Bu sizin tercihinize kalmış.

Yukarıdaki Frontend hariç üç farklı mikrohizmetin kendi immutable veritabanlarını kullanmasını tavsiye ederim. Hepsinde DLP etkin olmalıdır.

Günlük mikrohizmeti SIEM katmanıdır. ELK Stack kullanılması önerilir. Bu katmanın bulundurulması KVKK açısından yasal zorunluluktur.

Frontend haricindeki üç mikrohizmetin asenkron iletişimi için Apache Kafka kullanılması önerilir. Dört farklı mikrohizmetin önünde daha fazla yük kaldırabilmesi için her birinin önünde load balancer kullanılabilir.

API Gateway kullanılırsa bu da 5. mikrohizmet olarak deploy edilir. Kullanılmazsa her mikrohizmetin kendi apisi kullanılır.

API Gateway kullansanız da kullanmasanız da frontend ile iletişim için GRPC-Web kullanmanız önerilir. Biz buradaki örneğimizde API Gateway kullanmadık:

Mutlu kodlamalar 🙂

Reklam

Immutable Veritabanları Kullanın


Immutable veritabanları, verilerin değiştirilemezliği ve tutarlılığı sağladığı için modern yazılım geliştirmede giderek daha popüler hale gelmektedir. İmmutable veritabanlarının birçok faydası vardır:

  1. Güvenilirlik: Immutable veritabanları, verilerin hiçbir zaman değiştirilmediği veya silinmediği için, veri kaybı veya veri bütünlüğü sorunlarından kaçınmaya yardımcı olur. Bu, özellikle finansal işlemler veya kritik sistemlerde önemlidir.
  2. Kolay Bakım: Immutable veritabanları, bir kez yazıldıktan sonra verilerin asla değiştirilemeyeceği için, bakım gereksinimleri daha düşüktür. Bu, veritabanı yöneticilerinin daha az zaman harcamasını ve daha az hata yapmasını sağlar.
  3. Veri Tutarlılığı: İmmutable veritabanları, verilerin değiştirilemez olduğu için, verilerin tutarlılığından emin olmanın daha kolay ve güvenilir bir yolunu sağlar. Bu, özellikle dağıtık sistemlerde önemlidir.
  4. Güvenlik: Immutable veritabanları, verilerin hiçbir zaman değiştirilemediği için, veri hırsızlığına veya kötü niyetli saldırılara karşı daha güvenli bir seçenek sağlar.
  5. Performans: Immutable veritabanları, verilerin değiştirilemez olduğu için, verilerin daha hızlı ve daha verimli bir şekilde depolanmasına ve işlenmesine olanak tanır. Bu, özellikle yüksek trafiğe sahip sistemlerde performansı artırabilir.

Bu nedenlerden dolayı, birçok modern yazılım projesi, veri bütünlüğünü ve tutarlılığını sağlamak için immutable veritabanlarını tercih etmektedir. Ancak, immutable veritabanlarının dezavantajları da vardır ve projenin özelliklerine göre doğru veritabanı seçimi yapılması önemlidir.

İşte bugün kullanımda olan en popüler immutability özellikli veritabanlarından bazıları:

  1. Datomic: Datomic, veritabanındaki tüm değişikliklerin tam bir geçmişini tutarak verinin değişmez ve tutarlı bir görünümünü sağlayan bir veritabanıdır. Bir işlem günlüğü ve değer tabanlı depolama kombinasyonunu kullanarak verimli sorgulama ve veri alımı sağlar.
  2. EventStoreDB: EventStoreDB, tüm olayların güvenilir ve değişmez bir kaydını sağlayan olay akışlarını depolamak için tasarlanmış bir veritabanıdır. Bir yazma öncesi günlük ve sadece eklemeye yönelik bir veri deposu kombinasyonunu kullanarak olay verilerinin verimli depolanması ve sorgulanması sağlar.
  3. Apache Cassandra: Apache Cassandra, yüksek kullanılabilirlik ve hata toleransı için tasarlanmış bir dağıtık NoSQL veritabanıdır. Kesin olarak immutable olmasa da, Cassandra’nın veri modeli sürümleme ve zaman-aşımı (TTL) sürelerini destekler, bu da immutable veri depolama için bir form sağlar.
  4. Apache HBase: Apache HBase, büyük miktarda veri işleme için tasarlanmış bir dağıtık NoSQL veritabanıdır. Bir sütun-ailesi veri modeli kullanarak sürümleme desteği sağlar, immutable verilerin depolanmasını mümkün kılar.
  5. Amazon DynamoDB: Amazon DynamoDB, sorunsuz ölçeklenebilirlik ile hızlı ve öngörülebilir performans sağlayan bir NoSQL veritabanı hizmetidir. Kesin olarak immutable olmasa da, DynamoDB, zaman damgaları kullanarak sürümleme desteği sağlar, immutable verilerin depolanmasını mümkün kılar.

Bunlar sadece popüler immutability özellikli veritabanlarından bazı örneklerdir. Saf fonksiyonel programlama dillerinden daha geleneksel immutable özellikleri destekleyen veritabanlarına kadar pek çok başka veritabanı ve veri deposu da bulunmaktadır.

Mutlu kodlamalar 🙂

Python ile 290+ Makine Öğrenimi Projesi


Python programlama dili kullanılarak çözülmüş ve açıklanan 290+ Makine Öğrenimi projesi.

Bu makale size Python programlama dili kullanılarak çözülmüş ve açıklanan 290’dan fazla makine öğrenimi projesini tanıtacaktır.

Makine Öğrenimi Projeleri

Bir sonraki bölümdeki karmaşık projelere geçmeden önce, Makine Öğreniminde yeniyseniz bu başlangıç düzeyindeki projeleri keşfetmenizi tavsiye ederim.

  1. Kredi Puanı Sınıflandırması
  2. Hava Durumu Tahmini
  3. Yemek Teslimat Süresi Tahmini
  4. ARIMA ile Zaman Serisi Tahmini
  5. Instagram Erişim Analizi ve Tahmini
  6. Çevrimiçi Ödeme Dolandırıcılığı Tespiti
  7. Web Sitesi Trafik Tahmini
  8. Kredi Kartı Kümeleme
  9. Şifre Güç Denetleyicisi
  10. Spam Yorumları Tespiti
  11. Müzik Türlerini Kümeleme
  12. Tüketici Şikayet Sınıflandırması
  13. Garson İpuçları Analizi ve Tahmini
  14. Ukrayna vs Rusya Twitter Duygu Analizi
  15. Gelecek Satış Tahmini
  16. Garson İpuçları Analizi ve Tahmini
  17. Hisse Senedi Fiyat Tahmini
  18. Flipkart İncelemeleri Duygu Analizi
  19. Meme Kanseri Sağkalım Tahmini
  20. Covid-19 Ölüm Tahmini
  21. LSTM Sinir Ağı ile Hisse Senedi Fiyat Tahmini
  22. Önümüzdeki 30 gün için Kripto Para Fiyat Tahmini
  23. Makale Tavsiye Sistemi
  24. Netflix Hisse Senedi Fiyat Tahmini
  25. Zaman Serisi Analizi
  26. Sinir Ağları ile Sınıflandırma
  27. Stres Tespiti
  28. AlexNet Sinir Ağı Mimarisi
  29. Makine Öğrenimi Algoritmasını Görselleştirmek
  30. Bir Makine Öğrenimi Modeline Eğitim ve Girdi Verme
  31. Ürün Talebi Tahmini
  32. Elektrik Fiyat Tahmini
  33. Dil Tespiti
  34. Duygu Analizi için Veri Kümesine Etiketler Ekleme
  35. Pfizer Aşısı Duyarlılık Analizi
  36. Haber Sınıflandırması
  37. Omicron Varyant Duyarlılık Analizi
  38. İris Çiçeği Sınıflandırması
  39. Su Kalitesi Analizi
  40. Twitter Duygu Analizi
  41. Kalamar Oyunu Duygu Analizi
  42. Sınıflandırma Algoritmalarının Karşılaştırılması
  43. Tata Motors Hisse Senedi Fiyat Tahmini
  44. Sağlık Sigortası Prim Tahmini
  45. Yeni Başlayanlar için Film Derecelendirme Analizi
  46. Sipariş Tahmin Sayısı
  47. Apple Hisse Senedi Fiyat Tahmini
  48. Sigorta Tahmini
  49. Dünya Çapında Milyarderler Analizi
  50. İşsizlik Analizi
  51. Araba Fiyat Tahmin Modeli
  52. Spam Tespiti
  53. Resimdeki Nesneleri Say
  54. WhatsApp Sohbetleri Duyarlılık Analizi
  55. WhatsApp Sohbet Analizi
  56. Microsoft Hisse Senedi Fiyat Tahmini
  57. Covid-19 Aşı Analizi
  58. Video Oyunu Satış Tahmin Modeli
  59. Öğrenci Notları Tahmin Modeli
  60. Makine Öğrenimi Modelini Kaydetmek
  61. Uber Gezileri Analizi
  62. Google Arama Analizi
  63. Tesla Hisse Senedi Fiyat Tahmin Modeli
  64. Finansal Bütçe Analizi
  65. Tıklama Oranı Tahmin Modeli
  66. Etkileşimli Dil Çevirmeni
  67. Dil Tespiti
  68. Python ile bir Chatbot oluşturun
  69. En İyi Akış Hizmeti Analizi
  70. Başkan Heights’ta Veri Bilimi Projesi
  71. Doğum Oranı Analizi Veri Bilimi Projesi
  72. Zaman Serisinde Veri Bilimi Projesi
  73. Alan ve Nüfus Veri Bilimi Projesi
  74. Eksiksiz Bir Makine Öğrenimi Projesi Çözüm Yolu
  75. Metin Özeti
  76. Anahtar Kelime Çıkarma
  77. Finans Veri Bilimi Projeleri
  78. Pazarlamada Veri Bilimi Projeleri
  79. Uçtan uca Makine Öğrenimi Projeleri
  80. İkili Sınıflandırmada Makine Öğrenimi Projeleri
  81. Etki Alanlarına Dayalı Veri Bilimi Projeleri
  82. Alaycı Tespit
  83. Sosyal Medya Takipçileri Tahmini
  84. Amazon Ürün İncelemeleri Duyarlılık Analizi
  85. Nefret Konuşması Tespiti
  86. Uçtan Uca Nefret Konuşması Algılama Sistemi
  87. Uçtan Uca Sahte Haber Tespit Sistemi
  88. Uçtan Uca Spam Algılama Sistemi
  89. Otel Değerlendirmeleri Duyarlılık Analizi
  90. Gerçek Zamanlı Cinsiyet Tespit Sistemi
  91. Dogecoin Fiyat Tahmini
  92. Google Play Store Duyarlılık Analizi
  93. Amazon Alexa Duygu Analizini İnceliyor
  94. Sosyal Medya Reklamları Sınıflandırması
  95. Sahte Haber Tespiti
  96. Uçtan Uca Makine Öğrenimi Modeli
  97. Cinsiyet Tespiti
  98. Satış Tahmini
  99. Döviz Kuru Tahmini
  100. Uçtan Uca Makine Öğrenimi Projesi
  101. Kar Tahmin Modeli
  102. Otomatik Zaman Serisi Tahmini
  103. Ted-Talks Tavsiye Sistemi
  104. Gerçek Zamanlı Duyarlılık Analizi
  105. Amazon Tavsiye Sistemi
  106. Mobil Fiyat Sınıflandırması
  107. Spotify Öneri Sistemi
  108. Metin Duyguları Algılama
  109. Otel Tavsiye Sistemi
  110. İflas Tahmin Modeli
  111. Müşteri Kişilik Analizi
  112. Instagram Algoritması
  113. Elmas Fiyat Tahmin Modeli
  114. Kitap Öneri Sistemi
  115. Netflix Veri Analizi
  116. Uydu Görüntü Analizi
  117. Konu Modelleme
  118. Covid-19 Aşı Duyarlılık Analizi
  119. İnsan Aktivitesi Tanıma Modeli
  120. Kohort Analizi
  121. Uçtan uca Makine Öğrenimi Projesi
  122. Yaşam Beklentisi Analizi
  123. Bitcoin Fiyat Tahmini
  124. İnsan Kaynakları Analizi
  125. Enerji Tüketimi Tahmini
  126. LightGBM Modeli
  127. FastAI Modeli
  128. Ev Fiyat Tahmini
  129. Gerçek Zamanlı Yüz Maskesi Tespiti
  130. Netflix Öneri Sistemi
  131. Adlandırılmış Varlık Tanıma
  132. Plaka Numarası Tespiti
  133. Python ile IPL Analizi
  134. Altın Fiyat Tahmini
  135. Nesne Algılama
  136. En Yüksek Ücretli Sporcular Analizi
  137. Metin Üretimi
  138. Python ile Yazım Düzeltmesi
  139. Gelir Sınıflandırması
  140. Müşteri Kaybı Tahmini
  141. Dil Çeviri Modeli
  142. Taramaya Devam Et
  143. İşaret Dili Sınıflandırması
  144. Çevrimiçi Alışveriş Niyet Analizi
  145. Ağ Grafiği Analizi
  146. Anahtar Kelime Çıkarma
  147. Amazon En Çok Satan Kitaplar Analizi
  148. Önümüzdeki 30 Gün için Covid-19 Vaka Tahmini
  149. YouTube Trend Videoları Analizi
  150. Cinsiyet Sınıflandırması
  151. Çiçek Tanıma
  152. Zatürree Tespiti
  153. Çalışan Yıyma Tahmini
  154. El Hareketi Tanıma
  155. Yüz maskesi algılama
  156. Apriori Algoritması kullanarak Piyasa Sepeti Analizi
  157. Meme Kanseri Tespiti
  158. Deprem Tahmin Modeli
  159. Aykırı Tespit
  160. Kalp Hastalığı Tahmini
  161. Plastik Kullanıcı Analizi
  162. Dönüm Noktası Tespiti
  163. Makine Öğrenimi ile Chatbot
  164. Sonraki Kelime Tahmin Modeli
  165. Python ile Yaş ve Cinsiyet Tespiti
  166. Python ve Makine Öğrenimi ile Klavyeyi Otomatik Düzeltin.
  167. 5 satır kodda Makine Öğrenimi.
  168. Makine Öğrenimi ile Deepfake Algılama.
  169. Python ile ABD Seçimlerini Tahmin Edin.
  170. Makine Öğrenimi ile Sahte Para Birimi Tespiti.
  171. Tinder’ın Makine Öğrenimi ile Eşleşmelerini Tahmin Edin.
  172. Görüntü Segmentasyonu
  173. Python ile Başlık Oluşturucu.
  174. Python ile Google Arama Algoritması oluşturun.
  175. Yüz Yer İşaretleri Tespiti
  176. Python ile Kalem Çizimi.
  177. Makine Öğreniminde OpenAI Spor Salonu
  178. Makine Çeviri Modeli
  179. Covid 19 Analizi.
  180. Makine Öğrenimi ile TikTok Algoritmasını Oluşturun.
  181. ILP Eşleşmelerini Analiz Edin.
  182. Python ile Barkod ve QR kod Okuyucu
  183. Python ile PDF’den Metin Çıkarın.
  184. IPL Kazanan 2020’yi Tahmin Edin.
  185. Araba Fiyatlarını Tahmin Edin.
  186. Çağrı Kayıtlarını Analiz Edin.
  187. Python ile bir API oluşturun.
  188. Python ile Özel E-postalar Gönderin.
  189. Makine Öğrenimi ile Renk Tanıma.
  190. Bir 3D Video Animasyonu oluşturun.
  191. Makine Öğreniminde Grafik Algoritmaları.
  192. Görüntü Özellikleri Çıkarma.
  193. Makine Öğrenimi ile Yağış Tahmini.
  194. Milliyetleri Makine Öğrenimi ile Sınıflandırın.
  195. Makine Öğrenimi ile Dolandırıcılık Tespiti.
  196. Python ile Konu Modelleme
  197. Adlandırılmış Varlık Tanıma
  198. WhatsApp Grup Sohbet Analizi
  199. Python Kullanarak Dilleri Çevirin
  200. Ağ Güvenliği Analizi
  201. Python ile Çubuk Grafik Yarışı
  202. Python ile Anahtar Kelime Araştırması
  203. Moda Öneri Sistemi
  204. Python ile Yüz Algılama
  205. Duygu Algılama Modeli
  206. Python ile Telegram Botu
  207. El Yazısı Tanıma
  208. Python ile bir Güneş Sistemini görselleştirin.
  209. Nefret Konuşma Algılama Modeli
  210. Python ile Instagram Filtreleri Oluşturun.
  211. Makine Öğrenimi ile Temas İzleme
  212. Python ile bir Chatbot’u bir Web Uygulamasına Dağıtın
  213. Metni Makine Öğrenimi ile Özetleyin
  214. Makine Öğrenimi ile Dil Sınıflandırması.
  215. Python ile OTP Doğrulama GUI’si
  216. Python ile Sesli Kitap Oluşturun
  217. Titanik Hayatta Kalma Analizi
  218. PyTorch ile Görüntü Tanıma
  219. Cinsiyet Sınıflandırma Modeli
  220. Günlük Doğum Tahmini
  221. İkili Arama Algoritması
  222. Makine Öğrenimi ile Galaksi Sınıflandırması
  223. LSTM Modelli Zaman Serisi
  224. TensorFlow ile Görüntü Sınıflandırması
  225. Makine Öğrenimi ile Hava Durumu Tahmin Edin
  226. Python ile bir Paket Oluşturun
  227. Python ile Bilgisayarla Görme
  228. Python ile Elmas Analizi
  229. TensorFlow ile Metin Sınıflandırması
  230. Sırt ve Kement Regresyonu
  231. Yakıt Verimliliğini Tahmin Edin
  232. Python ile ABC Analizi
  233. Python ile RFM Analizi
  234. Python Kodu ile Sinir Ağı Oluşturun
  235. Python ile Genetik Algoritma
  236. Makine Öğrenimi ile Geçişi Tahmin Edin
  237. Sağlık Verilerini Analiz Edin
  238. Metin ve Açıklamalar Üzerine Veri Bilimi Projesi
  239. Veri Bilimi Projesi – El Yazısı Rakamlar
  240. Veri Bilimi Projesi – Destek Vektör Makineleri
  241. Veri Bilimi Projesi – Makine Öğrenimi ile Hisse Senedi Fiyat Tahmini
  242. Veri Bilimi Projesi – Metnin Sınıflandırılması
  243. HOG Özelliklerini Çıkarma Üzerine Veri Bilimi Projesi
  244. Veri Bilimi Projesi – Amazon Ürünleri, Makine Öğrenimi ile Duygu Analizini İnceliyor
  245. Veri Bilimi Projesi – Makine Öğrenimi ile E-posta spam Algılama
  246. Veri Bilimi Projesi – Makine Öğrenimi ile Kalp Hastalığı Tahmini
  247. Veri Bilimi Projesi — Film Öneri Sistemi
  248. Veri Bilimi Projesi – Makine Öğrenimi ile Öğrenci Performans Analizi
  249. Python ile FIFA Analizi Veri Bilimi Projesi
  250. Veri bilimi projesi – Sahte Haber Sınıflandırması
  251. Veri Bilimi Projesi – Makine Öğrenimi ile DNA Dizilemesi
  252. Veri Bilimi Projesi — Makine Öğrenimi ile Kitap Öneri Sistemi
  253. Veri Bilimi Projesi – Makine Öğrenimi ile Bitcoin Fiyat Tahmini
  254. Makine Öğrenimi Projesi — Yapay Sinir Ağları
  255. Makine Öğrenimi ve Python ile Algoritmik Ticaret Stratejisi
  256. Film İncelemeleri Duygu Analizi – Makine Öğrenimi ile Genel Sınıflandırma
  257. Veri Bilimi Projesi – Süpermarket Satış Analizi
  258. Veri Bilimi Projesi – GSYİH Analizi
  259. Veri Bilimi Projesi – Python ve Makine Öğrenimi ile Müşteri Kaybını Tahmin Edin
  260. Veri Bilimi Projesi — San Francisco Suç Analizi
  261. Makine Öğrenimi Projesi – Akıllı Telefon Verilerini Kullanarak İnsan Aktivitesi Tanıma
  262. Makine Öğrenimi ile Kredi Kartı Dolandırıcılığı Tespiti
  263. Makine Öğrenimi ile Hava Tahmini
  264. Makine Öğrenimi ile SMS Spam Algılama
  265. Makine Öğrenimi ve Yapay Zeka ile Covid-19 Tespiti
  266. Makine Öğrenimi ile Müşteri Segmentasyonu
  267. Makine Öğrenimi ile Çalışan Ciro Tahmini
  268. Makine Öğrenimi ile Diyabeti Tahmin Edin
  269. PyTorch ile Görüntü Sınıflandırması
  270. ARIMA Modeli ile Zaman Serisi Tahmini
  271. WhatsApp Sohbetlerinde Doğal Dil İşleme
  272. Sahte Haber Tespit Modeli
  273. Yapay Sinir Ağları ile Görüntü Sınıflandırması
  274. İkili Sınıflandırma Modeli
  275. Derin Öğrenme ile Veri Artırma
  276. Sonraki Kelime Tahmin Modeli.
  277. Görüntü Segmentasyonu
  278. Makine Öğreniminde XGBoost Algoritması
  279. Yüz Yer İşaretleri Tespiti
  280. Makine Öğrenimi ile Görüntü Filtreleme
  281. Ses Özelliği Çıkarma
  282. Makine Çeviri Modeli
  283. Cinsiyet Sınıflandırma Modeli
  284. Python ve Makine Öğrenimi ile bir 3D Video oluşturun.
  285. Adlandırılmış Varlık Tanıma
  286. WhatsApp Grup Sohbet Analizi
  287. Python Kullanarak Dilleri Çevirin
  288. Makine Öğrenimi ile Covid-19 Projeleri
  289. Makine Öğrenimi ile Derin Öğrenme Projeleri
  290. Makine Öğrenimi ile Öneri Sistemi Projeleri
  291. Makine Öğrenimi ile Duygu Analizi Projeleri
  292. Makine Öğrenimi Için Sınıflandırma Projeleri
  293. Makine Öğrenimi için Regresyon Projeleri
  294. Python ile Chatbot Projeleri
  295. Gelecek Tahmininde Makine Öğrenimi Projeleri
  296. Özgeçmiş için Makine Öğrenimi Projeleri
  297. Özgeçmiş için En İyi Veri Bilimi Projeleri
  298. Sosyal Medya Analizinde Makine Öğrenimi Projeleri

Umarım Python programlama dilini kullanarak çözülmüş ve açıklanmış 290’dan fazla makine öğrenimi projesi hakkındaki bu makaleyi beğenmişsinizdir.

Kaynak: https://medium.com/coders-camp/230-machine-learning-projects-with-python-5d0c7abf8265

Mutlu kodlamalar 🙂

Ethereum Özel Ağı Nasıl Oluşturulur?


IBFT 2.0 kullanarak özel bir ağ oluşturun

Özel bir ağ, test için yapılandırılabilir bir ağ sağlar. Bu özel ağ, IBFT 2.0 (yetki kanıtı) konsensüs protokolünü kullanır .

Bu öğreticideki adımlar, yalıtılmış, ancak korunmayan veya güvenli olmayan bir Ethereum özel ağı oluşturur. Özel ağı uygun şekilde yapılandırılmış bir güvenlik duvarının arkasında çalıştırmanızı öneririz.

Bu öğretici, yalnızca eğitim amaçlı olarak IBFT 2.0 kullanarak özel bir ağ yapılandırır. IBFT 2.0, Bizans hatasına dayanıklı olmak için 4 doğrulayıcı gerektirir.

Önkoşullar

Adımlar

Sayfanın sağ tarafında, dört düğümlü IBFT 2.0 kullanarak özel bir ağ oluşturma adımları listelenmiştir. Dört düğümün tümü doğrulayıcıdır.

1. Dizinler oluşturun

Her düğüm, blok zinciri verileri için bir veri dizini gerektirir.

Özel ağınız için, dört düğümün her biri için dizinler ve her düğüm için bir veri dizini oluşturun:

IBFT-Network/
├── Node-1
│   ├── data
├── Node-2
│   ├── data
├── Node-3
│   ├── data
└── Node-4
    ├── data

2. Bir yapılandırma dosyası oluşturun

Yapılandırma dosyası, IBFT 2.0 oluşum dosyasını ve üretilecek düğüm anahtar çifti sayısını tanımlar.

Yapılandırma dosyasında iç içe geçmiş iki JSON düğümü vardır. İlki, Besu’nun ortaya çıkan başlangıç ​​dosyasında otomatik olarak oluşturduğu dize genesis dışında, IBFT 2.0 oluşum dosyasını tanımlayan özelliktir. İkincisi extraData, blockchain üretilecek anahtar çifti sayısını tanımlayan özelliktir.

Aşağıdaki yapılandırma dosyası tanımını ibftConfigFile.json adlı bir dosyaya kopyalayın ve IBFT-Network dizinine kaydedin:

{
  "genesis": {
    "config": {
      "chainId": 1337,
      "berlinBlock": 0,
      "ibft2": {
        "blockperiodseconds": 2,
        "epochlength": 30000,
        "requesttimeoutseconds": 4
      }
    },
    "nonce": "0x0",
    "timestamp": "0x58ee40ba",
    "gasLimit": "0x47b760",
    "difficulty": "0x1",
    "mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "alloc": {
      "fe3b557e8fb62b89f4916b721be55ceb828dbd73": {
        "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63",
        "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
        "balance": "0xad78ebc5ac6200000"
      },
      "627306090abaB3A6e1400e9345bC60c78a8BEf57": {
        "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3",
        "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
        "balance": "90000000000000000000000"
      },
      "f17f52151EbEF6C7334FAD080c5704D77216b732": {
        "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f",
        "comment": "private key and this comment are ignored.  In a real chain, the private key should NOT be stored",
        "balance": "90000000000000000000000"
      }
    }
  },
  "blockchain": {
    "nodes": {
      "generate": true,
      "count": 4
    }
  }
}

Özel bir ağ için yapılandırma dosyası oluştururken en son kilometre taşını belirtmenizi öneririz. Bu, en güncel protokolü kullanmanızı ve en yeni işlem kodlarına erişiminizi sağlar.

Mainnet veya herhangi bir genel ağ üzerindeki genesis dosyasındaki hesapları test dışında kullanmayın. Özel anahtarlar görüntülenir, bu da hesapların güvenli olmadığı anlamına gelir.

3. Düğüm anahtarları ve bir genesis dosyası oluşturun

IBFT-Network, Dizininde düğüm anahtarını ve genesis dosyasını oluşturun:

Mac os işletim sistemi:

besu operator generate-blockchain-config --config-file=ibftConfigFile.json --to=networkFiles --private-key-file-name=key

Besu, networkFiles dizininde aşağıdakileri oluşturur:

  • genesis.json– Dört düğümü belirten extraData özelliği içeren genesis dosyası doğrulayıcılardır.
  • Düğüm adresi kullanılarak adlandırılan ve her düğüm için genel ve özel anahtarı içeren her düğüm için bir dizin.
networkFiles/
├── genesis.json
└── keys
    ├── 0x438821c42b812fecdcea7fe8235806a412712fc0
    │   ├── key
    │   └── key.pub
    ├── 0xca9c2dfa62f4589827c0dd7dcf48259aa29f22f5
    │   ├── key
    │   └── key.pub
    ├── 0xcd5629bd37155608a0c9b28c4fd19310d53b3184
    │   ├── key
    │   └── key.pub
    └── 0xe96825c5ab8d145b9eeca1aba7ea3695e034911a
        ├── key
        └── key.pub

4. genesis dosyasını IBFT-Network dizinine kopyalayın

genesis.json dosyasını IBFT-Network dizinine kopyalayın.

5. Düğüm özel anahtarlarını düğüm dizinlerine kopyalayın

Her düğüm için, anahtar dosyalarını o düğümün data dizinine kopyalayın

IBFT-Network/
├── genesis.json
├── Node-1
│   ├── data
│   │    ├── key
│   │    ├── key.pub
├── Node-2
│   ├── data
│   │    ├── key
│   │    ├── key.pub
├── Node-3
│   ├── data
│   │    ├── key
│   │    ├── key.pub
├── Node-4
│   ├── data
│   │    ├── key
│   │    ├── key.pub

6. İlk düğümü bootnode olarak başlatın

Node-1 dizininde, Düğüm-1’i başlatın:

Mac os işletim sistemi

besu --data-path=data --genesis-file=../genesis.json --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all"

Komut satırı:

  • --data-path seçeneği kullanarak Düğüm-1 için veri dizinini belirtir.
  • --rpc-http-enabled seçeneği kullanarak JSON-RPC API’sini etkinleştirir.
  • --rpc-http-api seçeneği kullanarak ETH, NET ve IBFT API’lerini etkinleştirir.
  • --host-allowlist seçeneği kullanarak HTTP JSON-RPC API’sine tüm ana bilgisayar erişimini etkinleştirir.
  • --rpc-http-cors-origins seçeneği kullanarak HTTP JSON-RPC API aracılığıyla düğüme tüm etki alanı erişimini etkinleştirir.

Düğüm başladığında kodlama URL’si görüntülenir. Aşağıdaki adımlarda Node-1’i bootnode olarak belirtmek için kodlama URL’sini kopyalayın.

Düğüm 1 Kodlama URL'si

7. Düğüm-2’yi başlatın

Başka bir terminal başlatın, Node-2 dizinine geçin ve Node-1’i bootnode olarak başlatırken kopyalanan Node-1 kodlama URL’sini belirterek Node-2’yi başlatın:

Mac os işletim sistemi:

besu --data-path=data --genesis-file=../genesis.json --bootnodes=<Node-1 Enode URL> --p2p-port=30304 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8546

Komut satırı şunları belirtir:

  • --data-path seçeneği kullanan Düğüm-2 için veri dizini.
  • --p2p-port seçeneği kullanarak P2P keşfi için Düğüm-1’e farklı bir bağlantı noktası.
  • --rpc-http-port seçeneği kullanarak HTTP JSON-RPC için Node-1’e farklı bir bağlantı noktası .
  • --bootnodes seçeneği kullanan Düğüm-1’in kodlama URL’si.
  • Düğüm-1 için diğer seçenekler.

8. Düğüm-3’ü başlatın

Başka bir terminal başlatın, Node-3 dizine geçin ve Node-1’i bootnode olarak başlatırken kopyalanan Node-1 kodlama URL’sini belirterek Node-3’ü başlatın:

Mac os işletim sistemi:

besu --data-path=data --genesis-file=../genesis.json --bootnodes=<Node-1 Enode URL> --p2p-port=30305 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8547

Komut satırı şunları belirtir:

  • --data-path seçeneği kullanan Düğüm-3 için veri dizini.
  • --p2p-port seçeneği kullanarak P2P keşfi için Node-1 ve Node-2’ye farklı bir bağlantı noktası.
  • --rpc-http-port HTTP JSON-RPC için Düğüm-1 ve Düğüm-2’ye farklı bir bağlantı noktası seçeneği kullanılarak.
  • Düğüm-2 için olduğu gibi bootnode.
  • Düğüm-1 için diğer seçenekler.

9. Düğüm-4’ü başlatın

Başka bir terminal başlatın, Node-4 dizinine geçin ve Node-1’i bootnode olarak başlatırken kopyalanan Node-1 kodlama URL’sini belirterek Node-4’ü başlatın:

Mac os işletim sistemi

besu --data-path=data --genesis-file=../genesis.json --bootnodes=<Node-1 Enode URL> --p2p-port=30306 --rpc-http-enabled --rpc-http-api=ETH,NET,IBFT --host-allowlist="*" --rpc-http-cors-origins="all" --rpc-http-port=8548

Komut satırı şunları belirtir:

  • --data-path Seçeneği kullanan Düğüm-4 için veri dizini.
  • --p2p-port seçeneği kullanarak P2P keşfi için Node-1, Node-2 ve Node-3’e farklı bir bağlantı noktası.
  • --rpc-http-port seçeneği kullanarak HTTP JSON-RPC için Node-1, Node-2 ve Node-3’e farklı bir bağlantı noktası.
  • Düğüm-2 için olduğu gibi bootnode.
  • Düğüm-1 için diğer seçenekler.

10. Özel ağın çalıştığını onaylayın

Başka bir terminal başlatın, JSON-RPC API ibft_getvalidatorsbyblocknumber yöntemini çağırmak için curl kullanın ve ağın dört doğrulayıcıya sahip olduğunu onaylayın:

curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' localhost:8545

Sonuç, dört doğrulayıcıyı görüntüler:

{
  "jsonrpc" : "2.0",
  "id" : 1,
  "result" : [ "0x1e326b6da177ede2d3eb6d7247bd9f6901d40234", "0x4aaac297fefe4466ebcb0b23ab90c5f466b11556", "0xa267ead2e91e1673e0943b925176b51d9cd4f6d2", "0xe3e680bc0ff485d1d415a384721f19e0db65fea7" ]
}

Besu’nun blok ürettiğini doğrulamak için günlüklere bakın:

2020-12-21 07:22:17.883+10:00 | EthScheduler-Workers-0 | INFO  | PersistBlockTask | Imported #1 / 0 tx / 0 om / 0 (0.0%) gas / (0xde088192f27ca376eea969cb7a4a1de445bd923fde0444194c88e630f7705584) in 0.010s. Peers: 4
2020-12-21 07:22:19.057+10:00 | pool-8-thread-1 | INFO  | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=2, Round=0}, hash=0x2ca2652fa79ae2b3b6aadcfb13d5d362ffd6207c3b5ae47971e04eb9d05deaa9
2020-12-21 07:22:21.044+10:00 | pool-8-thread-1 | INFO  | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=3, Round=0}, hash=0x5d9a06cd17127712cfae7d1c25f705f302e146f4b64a73de3c814e1b5a3f9a16
2020-12-21 07:22:23.049+10:00 | pool-8-thread-1 | INFO  | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=4, Round=0}, hash=0x843981375f4cb2bb0f33a09b647ac27da5df2c539d940d8344c907eede57829c
2020-12-21 07:22:25.060+10:00 | pool-8-thread-1 | INFO  | IbftRound | Importing block to chain. round=ConsensusRoundIdentifier{Sequence=5, Round=0}, hash=0x82b2069961d9185f7857cad1123de72d715729e122441335db486ea436834d6e

Anahtar dosyaları adım 5’te doğru dizine kopyalanmadıysa, ağ blok üretmeye başlamaz.

Her düğüm için günlükler, genel anahtarın şu dizinden yüklendiğini belirtmelidir data/key:

2020-12-21 07:16:18.360+10:00 | main | INFO  | KeyPairUtil | Loaded public key 0xe143eadaf670d49afa3327cae2e655b083f5a89dac037c9af065914a9f8e6bceebcfe7ae2258bd22a9cd18b6a6de07b9790e71de49b78afa456e401bd2fb22fc from <path to network>/IBFT-Network/Node-1/data/key

Anahtarlar doğru dizine kopyalanmadıysa, Besu başlatırken bir anahtar oluşturur:

2020-12-21 07:33:11.458+10:00 | main | INFO  | KeyPairUtil | Generated new public key 0x1a4a2ade5ebc0a85572e2492e0cdf3e96b8928c75fa55b4425de8849850cf9b3a8cad1e27d98a3d3afac326a5e8788dbe6cc40249715c92825aebb28abe3e346 and stored it to <path to network>/IBFT-Network/Node-1/data/key

Yeni bir anahtar oluşturulduysa, yapılandırmada belirtilen doğrulayıcı anahtar, oluşturulan anahtarla eşleşmez ve düğüm, blok oluşturmaya katılamaz.

Sonraki adımlar

Doğrulayıcıları kaldırmak veya eklemek için IBFT API’sini kullanın .

Düğümleri doğrulayıcı olarak eklemek veya kaldırmak için düğüm adresine ihtiyacınız vardır. Her düğüm için oluşturulan dizin, ad olarak düğüm adresine sahiptir.

Bu öğretici, yalnızca eğitim amaçlı olarak IBFT 2.0 kullanarak özel bir ağ yapılandırır. IBFT 2.0, Bizans hatasına dayanıklı olmak için dört doğrulayıcı gerektirir .

Hesapları MetaMask’a aktarın ve işlemleri Hızlı Başlangıç ​​eğitiminde açıklandığı gibi gönderin.

Besu özel anahtar yönetimini desteklemez .

Düğümleri durdur

Özel ağı kullanmayı bitirdiğinizde, her terminal penceresinde Ctrl+c kullanarak tüm düğümleri durdurun.

Not:

Gelecekte IBFT 2.0 ağını yeniden başlatmak için 6’dan başlayın. First Node’u Bootnode olarak başlatın.

Kaynak: https://besu.hyperledger.org/en/stable/private-networks/tutorials/ibft/

Java’da Spring Boot ile WebSocket Uygulaması


Bu makale, bir tarayıcı ile bir sunucu arasında ileri geri mesaj gönderen bir “Merhaba dünya” uygulaması oluşturma sürecinde size yol gösterir. WebSocket, TCP’nin üzerinde ince, hafif bir katmandır. Bu, mesajları gömmek için “alt protokoller” kullanmayı uygun hale getirir. Makalemizde etkileşimli bir web uygulaması oluşturmak için Spring ile STOMP mesajlaşmasını kullanıyoruz. STOMP, alt düzey WebSocket üzerinde çalışan bir alt protokoldür.

Ne inşa edeceğiz?

Bir kullanıcının adını taşıyan bir mesajı kabul eden bir sunucu oluşturacağız. Yanıt olarak sunucu, istemcinin abone olduğu bir kuyruğa selamlama gönderecektir.

Neye ihtiyacımız var?

Bu makale nasıl tamamlanır?

Spring’e Başlarken kılavuzlarının çoğunda olduğu gibi, sıfırdan başlayıp her adımı tamamlayabilir veya zaten aşina olduğunuz temel kurulum adımlarını atlayabilirsiniz. Her iki durumda da, sonunda çalışan bir kod elde edersiniz.

Sıfırdan başlamak için Spring Initializr ile Başlatma’ya geçin .

Temel bilgileri atlamak için aşağıdakileri yapın:

Bitirdiğinizde, sonuçlarınızı içindeki kodla karşılaştırabilirsiniz gs-messaging-stomp-websocket/complete.

Spring Initializr ile Başlamak

Önceden başlatılmış projeyi kullanabilir ve bir ZIP dosyası indirmek için Oluştur’a tıklayabilirsiniz. Bu proje, bu eğitimdeki örneklere uyacak şekilde yapılandırılmıştır.

Projeyi manuel olarak başlatmak için:

  1. https://start.spring.io adresine gidin. Bu hizmet, bir uygulama için ihtiyaç duyduğunuz tüm bağımlılıkları çeker ve kurulumun çoğunu sizin yerinize yapar.
  2. Gradle veya Maven’i ve kullanmak istediğiniz dili seçin. Bu makale Java’yı seçtiğinizi varsayar.
  3. Bağımlılıklar’a tıklayın ve Websocket’ı seçin.
  4. Oluştur’u tıklayın.
  5. Seçimlerinizle yapılandırılmış bir web uygulamasının arşivi olan ortaya çıkan ZIP dosyasını indirin.
IDE’niz Spring Initializr entegrasyonuna sahipse, bu işlemi IDE’nizden tamamlayabilirsiniz.
Ayrıca projeyi Github’dan çatallayabilir ve IDE’nizde veya başka bir düzenleyicide açabilirsiniz.

Bağımlılıklar Ekleme

Spring Initializr, bu durumda ihtiyacınız olan her şeyi sağlamaz. Maven için aşağıdaki bağımlılıkları eklemeniz gerekir:

<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>webjars-locator-core</artifactId>
</dependency>
<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>sockjs-client</artifactId>
  <version>1.0.2</version>
</dependency>
<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>stomp-websocket</artifactId>
  <version>2.3.3</version>
</dependency>
<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>bootstrap</artifactId>
  <version>3.3.7</version>
</dependency>
<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>jquery</artifactId>
  <version>3.1.1-1</version>
</dependency>

Aşağıdaki kod, tamamlanmış pom.xml dosyasını gösterir:

<?xml version="1.0" kodlama="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<ebeveyn>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.0.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>messaging-stomp-websocket-complete</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>messaging-stomp-websocket-complete</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>webjars-locator-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>sockjs-client</artifactId>
			<version>1.0.2</version>
		</dependency>
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>stomp-websocket</artifactId>
			<version>2.3.3</version>
		</dependency>
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>bootstrap</artifactId>
			<version>3.3.7</version>
		</dependency>
		<dependency>
			<groupId>org.webjars</groupId>
			<artifactId>jquery</artifactId>
			<version>3.1.1-1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

Eğer Gradle’ı kullanıyorsanız, aşağıdaki bağımlılıkları da eklemelisiniz:

implementation 'org.webjars:webjars-locator-core'
implementation 'org.webjars:sockjs-client:1.0.2'
implementation 'org.webjars:stomp-websocket:2.3.3'
implementation 'org.webjars:bootstrap:3.3.7'
implementation 'org.webjars:jquery:3.1.1-1'

Aşağıdaki kod tamamlanmış build.gradle dosyasını gösterir:

plugins {
	id 'org.springframework.boot' version '3.0.0'
	id 'io.spring.dependency-management' version '1.1.0'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-websocket'
	implementation 'org.webjars:webjars-locator-core'
	implementation 'org.webjars:sockjs-client:1.0.2'
	implementation 'org.webjars:stomp-websocket:2.3.3'
	implementation 'org.webjars:bootstrap:3.3.7'
	implementation 'org.webjars:jquery:3.1.1-1'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

Kaynak Temsili Sınıf Oluşturma

Artık projeyi kurduğunuza ve sistemi kurduğunuza göre, STOMP mesaj hizmetinizi oluşturabilirsiniz.

Hizmet etkileşimlerini düşünerek sürece başlayın.

Hizmet, gövdesi bir JSON nesnesi olan bir STOMP iletisinde ad içeren iletileri kabul edecektir. Ad Fred ise, mesaj aşağıdakine benzer:

{
    "name": "Fred"
}

Adı taşıyan mesajı modellemek için, aşağıdaki kodda gösterildiği gibi, bir name özelliği ve buna karşılık gelen bir metodu olan düz, eski bir Java nesnesi oluşturabilirsiniz:

getName() src/main/java/com/example/messagingstompwebsocket/HelloMessage.java

package com.example.messagingstompwebsocket;

public class HelloMessage {

  private String name;

  public HelloMessage() {
  }

  public HelloMessage(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Mesajı aldıktan ve adı çıkardıktan sonra hizmet, bir selamlama oluşturarak ve bu selamlamayı istemcinin abone olduğu ayrı bir kuyrukta yayınlayarak işleyecektir. Karşılama ayrıca, aşağıdaki kodda gösterildiği gibi bir JSON nesnesi olacaktır:

{
    "content": "Hello, Fred!"
}

Karşılama temsilini modellemek için, aşağıdaki kodda gösterildiği gibi, bir content özelliği ve buna karşılık gelen bir metodu olan başka bir düz eski Java nesnesi ekleyin:

getContent() src/main/java/com/example/messagingstompwebsocket/Greeting.java

package com.example.messagingstompwebsocket;

public class Greeting {

  private String content;

  public Greeting() {
  }

  public Greeting(String content) {
    this.content = content;
  }

  public String getContent() {
    return content;
  }

}

Spring, Greeting tür örneklerini otomatik olarak JSON’a sıralamak için Jackson JSON kitaplığını kullanacaktır.

Ardından, merhaba mesajını almak ve bir karşılama mesajı göndermek için bir denetleyici oluşturacaksınız.

İleti İşleme Denetleyicisi Oluşturma

Spring’in STOMP mesajlarıyla çalışma yaklaşımında, STOMP mesajları @Controller sınıflara yönlendirilebilir. Örneğin, GreetingController, aşağıdaki kodda (src/main/java/com/example/messagingstompwebsocket/GreetingController.java) gösterildiği gibi, hedefe giden mesajları işlemek için eşlenir:

package com.example.messagingstompwebsocket;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.util.HtmlUtils;

@Controller
public class GreetingController {


  @MessageMapping("/hello")
  @SendTo("/topic/greetings")
  public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
  }

}

Bu denetleyici özlü ve basit, ancak çok şey oluyor. Adım adım anlatıyorum.

@MessageMapping açıklaması, /hello hedefine bir mesaj gönderilirse greeting() metodunun çağrılmasını sağlar.

Mesajın içeriği greeting() metodunun message parametresindedir.

Dahili olarak, metodun uygulanması, iş parçacığının bir saniye uyku moduna geçmesine neden olarak bir işlem gecikmesini simüle eder. Bu, istemci bir mesaj gönderdikten sonra, sunucunun mesajı eşzamansız olarak işlemesi gerektiği sürece sürebileceğini göstermek içindir. İstemci yanıt beklemeden yapması gereken işe devam edebilir.

Bir saniyelik gecikmeden sonra, greeting()metodu bir Greeting nesnesi oluşturur ve onu döndürür. Dönen değer, açıklamada ( @SendTo(“/topic/greetings“)’te ) belirtildiği gibi tüm abonelere yayınlanır . Girdi mesajındaki adın sterilize edildiğini unutmayın, çünkü bu durumda, istemci tarafında tarayıcı DOM’unda yankılanacak ve yeniden oluşturulacaktır.

STOMP mesajlaşması için Spring’i yapılandırın

Artık hizmetin temel bileşenleri oluşturulduğundan, Spring’i WebSocket ve STOMP mesajlaşmasını etkinleştirecek şekilde yapılandırabilirsiniz.

Aşağıdaki kodda WebSocketConfig için bir Java sınıfı oluşturun (src/main/java/com/example/messagingstompwebsocket/WebSocketConfig.java):

package com.example.messagingstompwebsocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
  }

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/gs-guide-websocket").withSockJS();
  }

}

@Configuration bir Spring konfigürasyon sınıfı olduğunu belirtmek için gerekli açıklamalıdır, @EnableWebSocketMessageBroker de eklenmiştir. Adından da anlaşılacağı gibi, @EnableWebSocketMessageBroker bir mesaj aracısı tarafından desteklenen WebSocket mesaj işlemeyi etkinleştirir.

Message Broker’ı yapılandırmak için configureMessageBroker()varsayılan metodunu uygular. Basit bir bellek tabanlı mesaj komisyoncusunun karşılama mesajlarını WebSocketMessageBrokerConfigurer ön eki olan hedeflerde istemciye geri taşımasını sağlamak için çağrı yaparak başlar. Ayrıca, açıklama eklenmiş metodlara bağlanan iletilerin önekini de belirler. Bu önek, tüm mesaj eşlemelerini tanımlamak için kullanılacaktır. Örneğin, metodu işlemek için eşlendiği bitiş noktasıdır: .enableSimpleBroker()/topic/app@MessageMapping/app/helloGreetingController.greeting()

registerStompEndpoints() metodu, /gs-guide-websocketuç noktayı kaydederek SockJS geri dönüş seçeneklerini etkinleştirerek WebSocket yoksa alternatif aktarımların kullanılabilmesini sağlar. /gs-guide-websocket SockJS istemcisi, mevcut en iyi aktarıma (websocket, xhr-streaming, xhr-polling, vb.) bağlanmaya ve onu kullanmaya çalışacaktır.

Bir Tarayıcı İstemcisi Oluşturun

Sunucu tarafı parçaları yerinde olduğunda, dikkatinizi sunucu tarafına mesaj gönderecek ve sunucu tarafından mesaj alacak JavaScript istemcisine çevirebilirsiniz.

Aşağıdaki koda benzer bir dosya oluşturun (src/main/resources/static/index.html):

<!DOCTYPE html>
<html>
<head>
    <title>Hello WebSocket</title>
    <link href="/webjars/bootstrap/css/bootstrap.min.css" rel="stylesheet">
    <link href="/main.css" rel="stylesheet">
    <script src="/webjars/jquery/jquery.min.js"></script>
    <script src="/webjars/sockjs-client/sockjs.min.js"></script>
    <script src="/webjars/stomp-websocket/stomp.min.js"></script>
    <script src="/app.js"></script>
</head>
<body>
<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being
    enabled. Please enable
    Javascript and reload this page!</h2></noscript>
<div id="main-content" class="container">
    <div class="row">
        <div class="col-md-6">
            <form class="form-inline">
                <div class="form-group">
                    <label for="connect">WebSocket connection:</label>
                    <button id="connect" class="btn btn-default" type="submit">Connect</button>
                    <button id="disconnect" class="btn btn-default" type="submit" disabled="disabled">Disconnect
                    </button>
                </div>
            </form>
        </div>
        <div class="col-md-6">
            <form class="form-inline">
                <div class="form-group">
                    <label for="name">What is your name?</label>
                    <input type="text" id="name" class="form-control" placeholder="Your name here...">
                </div>
                <button id="send" class="btn btn-default" type="submit">Send</button>
            </form>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <table id="conversation" class="table table-striped">
                <thead>
                <tr>
                    <th>Greetings</th>
                </tr>
                </thead>
                <tbody id="greetings">
                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>

Bu HTML dosyası, websocket üzerinden STOMP aracılığıyla sunucumuzla iletişim kurmak için kullanılacak SockJS ve javascript kitaplıklarını içe aktarır. Ayrıca app.js client uygulamamızın mantığını içeren stomp’u import ediyoruz. Aşağıdaki kod (src/main/resources/static/app.js) bu dosyayı gösterir:

var stompClient = null;

function setConnected(connected) {
    $("#connect").prop("disabled", connected);
    $("#disconnect").prop("disabled", !connected);
    if (connected) {
        $("#conversation").show();
    }
    else {
        $("#conversation").hide();
    }
    $("#greetings").html("");
}

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

function disconnect() {
    if (stompClient !== null) {
        stompClient.disconnect();
    }
    setConnected(false);
    console.log("Disconnected");
}

function sendName() {
    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}

function showGreeting(message) {
    $("#greetings").append("<tr><td>" + message + "</td></tr>");
}

$(function () {
    $("form").on('submit', function (e) {
        e.preventDefault();
    });
    $( "#connect" ).click(function() { connect(); });
    $( "#disconnect" ).click(function() { disconnect(); });
    $( "#send" ).click(function() { sendName(); });
});

Bu JavaScript dosyasının anlaşılması gereken ana parçaları connect()ve sendName()işlevleridir.

İşlev connect(), SockJS sunucumuzun bağlantıları beklediği yerde bir bağlantı açmak için SockJS ve stomp.js’yi kullanır. Başarılı bir bağlantının ardından istemci, sunucunun karşılama mesajlarını yayınlayacağı hedefe abone olur. Bu hedefte bir karşılama alındığında, karşılama mesajını görüntülemek için DOM’a bir paragraf öğesi eklenir.

İşlev sendName(), kullanıcı tarafından girilen adı alır ve onu hedefe ( alacağı yer) göndermek için STOMP istemcisini kullanır.

İsterseniz main.css atlanabilir veya <link> çözülebilmesi için boş bir tane css dosyası oluşturabilirsiniz.

Uygulamayı Yürütülebilir Hale Getirin

Spring Boot sizin için bir uygulama sınıfı oluşturur. Bu durumda, daha fazla değişikliğe ihtiyaç duymaz. Bu uygulamayı çalıştırmak için kullanabilirsiniz. Aşağıdaki kod (src/main/java/com/example/messagingstompwebsocket/MessagingStompWebsocketApplication.java) uygulama sınıfını gösterir:

package com.example.messagingstompwebsocket;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MessagingStompWebsocketApplication {

  public static void main(String[] args) {
    SpringApplication.run(MessagingStompWebsocketApplication.class, args);
  }
}

@SpringBootApplication aşağıdakilerin tümünü ekleyen bir kolaylık ek açıklamasıdır:

  • @Configuration: Sınıfı, uygulama bağlamı için bean tanımlarının kaynağı olarak etiketler.
  • @EnableAutoConfiguration: Spring Boot’a sınıf yolu ayarlarına, diğer bean ve çeşitli özellik ayarlarına göre bean eklemeye başlamasını söyler. Örneğin, spring-webmvc sınıf yolundaysa bu ek açıklama, uygulamayı bir web uygulaması ve bir DispatcherServlet olarak işaretler.
  • @ComponentScan: Spring’e com/example paketteki diğer bileşenleri, yapılandırmaları ve hizmetleri aramasını söyleyerek denetleyicileri bulmasına izin verir.

Yöntem main(), bir uygulamayı başlatmak için Spring Boot’un SpringApplication.run() yöntemini kullanır. web.xml’de tek bir XML satırı olmadığını fark ettiniz mi? Bu web uygulaması %100 saf Java’dır ve herhangi bir altyapı yapılandırması ile uğraşmak zorunda kalmazsınız.

Yürütülebilir bir JAR oluşturun

Uygulamayı Gradle veya Maven ile komut satırından çalıştırabilirsiniz. Ayrıca gerekli tüm bağımlılıkları, sınıfları ve kaynakları içeren tek bir yürütülebilir JAR dosyası oluşturabilir ve onu çalıştırabilirsiniz. Yürütülebilir bir jar oluşturmak, hizmeti geliştirme yaşam döngüsü boyunca, farklı ortamlarda vb. bir uygulama olarak göndermeyi, sürümlendirmeyi ve dağıtmayı kolaylaştırır.

Gradle kullanıyorsanız, ./gradlew bootRun kullanarak uygulamayı çalıştırabilirsiniz.  Alternatif olarak, JAR dosyasını aşağıdaki gibi ./gradlew build kullanarak oluşturabilir ve ardından JAR dosyasını çalıştırabilirsiniz:

java -jar build/libs/gs-messaging-stomp-websocket-0.1.0.jar

Maven kullanıyorsanız, ./mvnw spring-boot:run kullanarak uygulamayı çalıştırabilirsiniz. Alternatif olarak, JAR dosyasını ./mvnw clean package ile oluşturabilir ve ardından JAR dosyasını çalıştırabilirsiniz:

java -jar hedefi/gs-messaging-stomp-websocket-0.1.0.jar
Burada açıklanan adımlar çalıştırılabilir bir JAR oluşturur. Klasik bir WAR dosyası da oluşturabilirsiniz .

Günlük çıktısı görüntülenir. Hizmet birkaç saniye içinde çalışır durumda olmalıdır.

Hizmeti test edin

Artık hizmet çalışıyor, tarayıcınızı http://localhost:8080 adresine getirin ve Bağlan düğmesini tıklayın.

Bir bağlantı açtığınızda, adınız sorulur. Adınızı girin ve Gönder’i tıklayın. Adınız sunucuya STOMP üzerinden JSON mesajı olarak gönderilir. Bir saniyelik simüle edilmiş bir gecikmenin ardından sunucu, sayfada görüntülenen bir “Merhaba” selamlaması içeren bir mesaj gönderir. Bu noktada başka bir isim gönderebilir veya bağlantıyı kesmek için Bağlantıyı Kes düğmesine tıklayabilirsiniz.

Özet

Tebrikler! Java’da Spring ile STOMP tabanlı bir mesajlaşma servisi geliştirdiniz. Bu makale .NET’deki SingalR’a alternatif olarak Java’da WebSocket çalışmasının Spring ile nasıl yapıldığını anlatmaktadır.

İstemciniz React, React Native vb. ise SockJS kütüphanesini kullanmalısınız.

Kafka Tasarım Kalıpları


Kafka tasarım kalıpları, Apache Kafka kullanarak dağıtılmış sistemler oluştururken ve sürdürürken karşılaşılan yaygın sorunlara yönelik bir dizi çözümdür. Kafka’daki temel tasarım modellerinden bazıları şunlardır:

Olay Kaynağı Oluşturma: Veri değişikliklerinin bir dizi olay olarak yakalandığı ve dayanıklı bir günlükte saklandığı, sistemlerin olayları yeniden oynayarak durumlarını yeniden oluşturmasına olanak tanıyan bir model.

Komut Sorgusu Sorumluluğu Ayrımı (CQRS): Performansı ve ölçeklenebilirliği geliştirmek için okuma ve yazma işlemlerinin sistemin farklı bölümlerine ayrıldığı bir kalıp.

Rekabet Eden Tüketiciler: Birden çok tüketicinin aynı veri için rekabet edebildiği ve yalnızca bir tüketicinin mesajı aldığı bir model.

Yayılma: Tek bir mesajın birden çok tüketiciye paralel olarak iletildiği ve işlemenin yatay olarak ölçeklenmesine izin veren bir model.

Lider Seçimi: Bir kümedeki düğümlerin operasyonları koordine etmek ve tutarlılığı sağlamak için bir lider seçtiği bir model.

Kafka Akışları: Apache Kafka tarafından sağlanan ve veri akışlarını gerçek zamanlı olarak işlemenizi sağlayan bir akış işleme kitaplığı.

Exactly-Once Processing (Tam Olarak Bir Kez İşleme): Onaylar ve işlem semantiği kullanılarak hataların varlığında bile mesajların tam olarak bir kez işlenmesini sağlayan bir model.

Bu modeller, Apache Kafka kullanarak ölçeklenebilir, güvenilir ve yüksek performanslı sistemler oluşturmak için bir başlangıç noktası sağlar.

Ek olarak her kalıba genel bir bakış sunabilir ve C# dilinde kod örnekleri bulmak için kaynaklar önerebilirim:

Olay Kaynağı Oluşturma: C#’daki örnek bir uygulama, bir nesnede yapılan değişiklikleri bir dizi olay olarak yakalamayı, bu olayları kalıcı bir günlükte serileştirmeyi (Apache Kafka gibi) ve olayları nesnenin durumunu yeniden oluşturmak için kullanmayı içerir. GitHub ve Stack Overflow gibi web sitelerinde C#’ta olay kaynağı oluşturmaya yönelik kod örnekleri ve öğreticiler bulabilirsiniz.

Komut Sorgusu Sorumluluk Ayırma (CQRS): C#’daki bir CQRS uygulaması, genellikle her biri için farklı veritabanları veya mesaj aracıları kullanarak verileri okuma ve yazma sorumluluklarını ayrı bileşenlere ayırmayı içerir. C#’ta CQRS uygulamanın yaygın bir yolu, komutları ve sorguları işlemek için merkezi bir nokta sağlayan Mediator tasarım modelini kullanmaktır.

Rekabet Eden Tüketiciler: C# dilinde rekabet eden bir tüketici modeli, birden çok tüketicinin aynı Kafka konusuna abone olmasını ve her tüketicinin benzersiz bir mesaj almasını içerir. C# dilinde Kafka tüketici API’sini kullanarak group.id özelliğini her tüketici için benzersiz bir değere ayarlayarak bu kalıbı uygulayabilirsiniz.

Yayılma: C#’daki bir yayma modeli, bir Kafka konusuna bir ileti yayınlamayı ve birden çok tüketicinin iletiyi paralel olarak alıp işlemesini içerir. C# dilinde Kafka tüketici API’sini kullanarak, birden çok tüketicinin aynı konuya abone olmasını sağlayarak ve iletileri tüketiciler arasında eşit şekilde dağıtmak için partition özelliğini kullanarak bu modeli uygulayabilirsiniz.

Lider Seçimi: C#’daki bir lider seçim modeli, hangi düğümün lider olması gerektiğini belirlemek için bir küme koordinasyonunda birden fazla düğüm içerecektir. Bu modeli C# dilinde Kafka üretici API’sini kullanarak, lider seçimine adanmış özel bir konuya yazarak ve lideri belirlemek için bir oylama algoritması kullanarak uygulayabilirsiniz.

Kafka Akışları: Kafka Akışları kitaplığı, veri akışlarını Apache Kafka kullanarak gerçek zamanlı olarak işlemek için bir yol sağlar. Verileri filtreleme, dönüştürme ve toplama gibi akış işleme mantığını uygulamak için C# dilinde Kafka Streams API’yi kullanabilirsiniz.

Tam Olarak Bir Kez İşleme: C#’daki tam olarak bir kez işleme modeli, mesajların, hataların varlığında bile, onaylar ve işlem semantiği kullanılarak yalnızca bir kez işlenmesini sağlamayı içerir. C#’ta Kafka üretici API’sini kullanarak, acks ve processal.id özelliklerini ayarlayarak ve iletilerin tam olarak bir kez işlenmesini sağlamak için işlemleri kullanarak bu kalıbı uygulayabilirsiniz.

Umarım bu açıklamalar, C# kullanarak Apache Kafka’da tasarım modellerini uygulamaya başlamanıza yardımcı olur.

Yardımcı YouTube videoları:

Diğer YouTube videosu:

Makine Öğrenmesi Algoritmalarının Listesi


Merhaba değerli takipçilerim,

Makine öğrenmesi algoritmalarının tamamının listesini ChatGPT’den edindim. İşte açıklamaları ile birlikte tüm makine öğrenmesi algoritmalarının listesi bu makalede. (bundan daha fazlası olabilir…)

  1. Lineer Regresyon: Veri noktaları arasındaki ilişkiyi doğrusal bir denklemle ifade etmeye çalışan bir yöntemdir.
  2. Lojistik Regresyon: Çıkış değişkeni sadece iki değer alabilen (örneğin, “olumlu” ve “olumsuz”) sınıflandırma problemlerinde kullanılır.
  3. Destek Vektör Makinesi: Veri noktalarını iki veya daha fazla sınıfa ayırmak için kullanılan bir yöntemdir.
  4. K-En Yakın Komşu: Veri noktalarını sınıflandırmak için kullanılan bir yöntemdir. Yakın olan komşuların etkisi daha yüksektir.
  5. Naive Bayes: Veri noktalarını sınıflandırmak için kullanılan bir yöntemdir. Veri noktalarının özellikleri arasındaki bağımlılıklar göz ardı edilir.
  6. Sinir Ağları: Öğrenme algoritmalarına dayalı, esnek ve yapay zeka uygulamaları için kullanılan yapay sinir ağlarıdır.
  7. Derin Öğrenme: Sinir ağlarının bir alt kümesi olarak kabul edilir ve çok katmanlı yapılar içerir.
  8. K-Means: Veri noktalarını k gruplara ayırmak için kullanılan bir yöntemdir. Gruplar arasındaki mesafe en küçük olmalıdır.
  9. Ağaç Bölme: Veri noktalarını sınıflandırmak için kullanılan bir yöntemdir. Ağaç yapısı kullanılır.
  10. Rastgele Orman: Ağaç bölme algoritmasının bir çeşididir. Birçok ağaç kullanılır ve sonuçların ortalaması alınır.
  11. Gradyan İniş: Optimizasyon problemlerinde kullanılan bir yöntemdir. Hedef değeri en küçük hale getirmek için kullanılır.
  12. AdaBoost: Veri noktalarını sınıflandırmak için kullanılan bir yöntemdir. Birçok karar ağacı kullanılır ve sonuçların ortalaması alınır.
  13. XGBoost: GBM (Gradient Boosting Machines) algoritmasının geliştirilmiş bir versiyonudur. Performans ve hız açısından üstün sonuçlar verir. 14. LightGBM: XGBoost’un bir alternatifi olarak kullanılır. Hız açısından daha yüksektir ve daha iyi ölçeklenebilirlik sağlar.
  14. Random Forest: Rastgele orman algoritmasının bir alternatifi olarak kullanılır. Birçok rastgele seçilmiş karar ağacı kullanılır ve sonuçların ortalaması alınır.
  15. GBM: Veri noktalarını sınıflandırmak veya tahmin etmek için kullanılan bir yöntemdir. Birçok karar ağacı kullanılır ve sonuçların ortalaması alınır.
  16. CatBoost: Kategorik değişkenler için optimize edilmiş bir GBM algoritmasıdır. Performans ve hız açısından üstün sonuçlar verir.
  17. Convolutional Neural Network (CNN): Görüntü işleme ve tanıma için kullanılan derin öğrenme yöntemlerinden biridir.
  18. Recurrent Neural Network (RNN): Zaman serisi verileri işlemek ve tahmin etmek için kullanılan derin öğrenme yöntemlerinden biridir.
  19. Long Short-Term Memory (LSTM): Uzun süreli hafıza işlemleri yapmak için kullanılan RNN türüdür.
  20. Autoencoder: Veri kodlama veya özellik ön işleme için kullanılan derin öğrenme yöntemlerinden biridir.
  21. Generative Adversarial Network (GAN): Yapay veri üretmek için kullanılan derin öğrenme yöntemlerinden biridir.
  22. Transformer: Metin işleme ve çeviri için kullanılan derin öğrenme yöntemlerinden biridir.
  23. BERT: Metin anlama ve sorgu cevaplama için kullanılan derin öğrenme yöntemlerinden biridir. Pre-trained BERT modelleri, metin içeriği için özellikler öğrenir ve bu özellikleri kullanarak metin anlama ve sorgu cevaplama gibi uygulamalarda kullanılır.
  24. OpenAI GPT: Metin üretimi veya tahmin etme için kullanılan derin öğrenme yöntemlerinden biridir. Pre-trained GPT modelleri, metin içeriği için özellikler öğrenir ve bu özellikleri kullanarak metin üretimi, dil modelleme, çeviri gibi uygulamalarda kullanılır.
  25. XLNet: Pre-trained modeller kullanarak metin anlama ve metin üretimi gibi uygulamalarda kullanılan derin öğrenme yöntemlerinden biridir. Önceki pre-trained modellerde kullanılan sıralı masklama yerine özellikle otomatik etiketleme gibi uygulamalarda kullanılan istemci-sunucu masklama yöntemini kullanır.
  26. RoBERTa: Pre-trained modeller kullanarak metin anlama ve metin üretimi gibi uygulamalarda kullanılan derin öğrenme yöntemlerinden biridir. BERT’in bir geliştirilmiş versiyonudur ve daha çok veri kullanarak eğitilir.
  27. T5: Pre-trained modeller kullanarak metin anlama ve metin üretimi gibi uygulamalarda kullanılan derin öğrenme yöntemlerinden biridir. T5, önceki pre-trained modellerdeki gibi metin içeriği için özellikler öğrenir, ancak aynı zamanda metin üretimi için de kullanılabilir.
  28. Megatron: Pre-trained modeller kullanarak metin anlama ve metin üretimi gibi uygulamalarda kullanılan derin öğrenme yöntemlerinden biridir. Önceki pre-trained modellerdeki gibi metin içeriği için özellikler öğrenir ancak aynı zamanda daha büyük veri kümelerini ve daha yüksek çözünürlüklü modelleri kullanarak eğitilir.
  29. U-Net: Medikal görüntü işleme için kullanılan derin öğrenme yöntemlerinden biridir. Özellikle segmentasyon gibi uygulamalar için kullanılır.
  30. YOLO (You Only Look Once): Nesne tanıma için kullanılan derin öğrenme yöntemlerinden biridir. Görüntü içinde birden fazla nesne tespit etmek ve sınıflandırmak için kullanılır.
  31. Mask R-CNN: Nesne tanıma ve segmentasyon için kullanılan derin öğrenme yöntemlerinden biridir. Görüntü içinde birden fazla nesne tespit etmek, sınıflandırmak ve segment etmek için kullanılır.
  32. TensorFlow: Google tarafından geliştirilen, popüler bir açık kaynak derin öğrenme kütüphanesidir. Birçok ML algoritmasının uygulanmasını kolaylaştırır ve hızlı çalışmasını sağlar.
  33. Keras: TensorFlow veya diğer kütüphanelerle birlikte kullanılabilen, kullanımı kolay bir derin öğrenme kütüphanesidir.
  34. PyTorch: Facebook tarafından geliştirilen, popüler bir açık kaynak derin öğrenme kütüphanesidir. TensorFlow’a benzer özelliklere sahiptir ve kullanımı kolaydır.
  35. Scikit-learn: Python için popüler bir ML kütüphanesidir. Birçok ML algoritmasını içerir.
  36. GRU: Güncellenmiş RNN türüdür. LSTM’e benzer özelliklere sahiptir ancak daha az parametre ihtiyacı vardır.
  37. Transformer: Metin işleme için kullanılan derin öğrenme yöntemlerinden biridir. Özellikle metin çeviri ve metin üretimi gibi uygulamalar için kullanılır.
  38. Seq2Seq: Metin üretimi veya çeviri için kullanılan derin öğrenme yöntemlerinden biridir. Girdi metninin anlamını çıktı metninde yeniden ifade etmeyi amaçlar.
  39. Attention: Metin işleme veya ses işleme için kullanılan derin öğrenme yöntemlerinden biridir. Özellikle metin çeviri ve metin üretimi gibi uygulamalarda kullanılır. Çıktı metninin hangi girdi metin parçalarına odaklandığını takip eder.

.NET 7 ile Microservices Mimarisi


Merhaba değerli takipçilerim,

Microservice (Mikro hizmet) mimarisi sanıldığı kadar basit değil. Birbirleriyle Kafka üzerinden iletişim kurabilen bağımsız ya da zayıf bağlı mikro hizmetler geliştiriyorsunuz. Her bir mikro hizmetiniz belirli bir portu kullanıyor olacak. Mikro hizmetlerin kullandığı bağımlılık enjeksiyonu için Autofac kullanabilirsiniz. Mikro hizmetlerin listelendiği konfigürasyon dosyasını gRPC-Web API Gateway (API ağ geçidi) projesi içerisinde merkezi olarak kaydedebilirsiniz, konfigürasyon dosyası Discovery Service (Keşif Hizmeti) kullanabilirsiniz. gRPC-Web API ağ geçidini .NET 7 minimal API ile hazırlayabiliyorsunuz yalnız her bir gRPC mikro hizmetiniz aynı isimde bir C# sınıfı geliştirip map etmeniz gerekiyor.

İşte bir Mikrohizmet Mimarisinde olması gereken elemanlar:

.NET 7’de Kafka ve gRPC-Web API Gateway kullanan bir mikro hizmet mimarisi genellikle aşağıdaki öğeleri içerir:

Mikro hizmetler: Bunlar, genel uygulamayı oluşturan bireysel hizmetlerdir. Her mikro hizmet, belirli bir iş etki alanından veya işlevinden sorumludur ve uzaktan yordam çağrısı (RPC) API’leri oluşturmak için yüksek performanslı, açık kaynaklı bir çerçeve olan gRPC’yi kullanarak birbirleriyle iletişim kurarlar.

gRPC-Web API Ağ Geçidi: Bu, gelen tüm istemci istekleri için giriş noktasıdır. API ağ geçidi, istekleri uygun mikro hizmete yönlendirmekten ve ayrıca kimlik doğrulama, hız sınırlama ve istek/yanıt dönüştürme gibi görevleri yerine getirmekten sorumludur.

Kafka: Bu, gerçek zamanlı veri boru hatları ve akış uygulamaları oluşturmak için kullanılan dağıtılmış bir akış platformudur. Mimarideki mikro hizmetler, mesajları yayınlamak ve bunlara abone olmak için Kafka’yı kullanabilir ve birbirleriyle gevşek bağlı, eşzamansız bir şekilde iletişim kurmalarına olanak tanır.

Cassandra: Bu, mikro hizmetler için verileri depolamak için kullanılabilen, yüksek oranda erişilebilir, dağıtılmış bir NoSQL veritabanıdır. Cassandra’nın ölçeklenebilirliği ve performansı, onu bir mikro hizmet mimarisinde kullanım için çok uygun hale getirir.

Redis: Bu, önbelleğe alma katmanı olarak veya oturum durumunu depolamak için kullanılabilen bir bellek içi veri yapısı deposudur. Redis, arka uç veritabanlarına yapılması gereken isteklerin sayısını azaltarak mikro hizmetlerin performansını artırmaya yardımcı olabilir.

Bağımlılık Enjeksiyonu (Autofac): Mimarinin farklı bileşenleri arasındaki bağımlılıkları yönetmeye izin veren bir kalıp, kodu daha test edilebilir, bakımı yapılabilir ve ölçeklenebilir hale getirir.

Konfigürasyon Yönetimi: Mikro hizmetlerin gerektirdiği farklı konfigürasyonları yönetmenin bir yolu, en yaygın uygulama bir konfigürasyon dosyası veya bir konfigürasyon sunucusu kullanmaktır, fakat aynı zamanda bellek içi de olabilir.

Hizmet Keşfi: Ağdaki mikro hizmetlerin konumunu keşfetmenin bir yolu olarak, bir mikro hizmetin farklı örneklerini bulmak ve aralarındaki yükü dengelemek yararlıdır. gRPC-Web API ağ geçidi projesinde merkezi konfigürasyon dosyası tutarsanız buna gerek yoktur.

İzleme ve günlük kaydı: Mikro hizmetlerin performansını, hatalarını ve kullanımını izlemenin ve analiz etmenin bir yolu; sorunları verimli bir şekilde tespit edip düzeltmek için sistemin iyi bir şekilde görülebilmesi önemlidir.

Tüm bu unsurlar, büyük miktarda veriyi ve yüksek düzeyde trafiği işleyebilen esnek ve ölçeklenebilir bir mikro hizmet mimarisi oluşturmak için birlikte çalışır. gRPC-Web API Ağ Geçidi, gelen tüm istemci isteklerini işleyen ve bunları uygun mikro hizmete yönlendiren merkezi bir kontrol noktası görevi görür. Kafka, mikro hizmetler arasında mesajlaşma için kullanılır ve bunların eşzamansız ve bağımsız olarak iletişim kurmasına olanak tanır. Depolama için Cassandra ve Redis, bağımlılıkları ve hizmet konumunu yönetmek için Bağımlılık ekleme ve hizmet keşfi kullanılır. Ve son olarak, sistem performansını takip etmek için izleme ve günlüğe kaydetme çok önemlidir.

Tüm bu mimaride hizmetleri Kubernetes üzerinde deploy edeceğinizi ve güncellemeleri CI/CD ile yapmanızın büyük kolaylık getireceğini söylemeyi unutmayalım.

Mutlu kodlamalar 🙂

Full Stack Web ve Mobil Yazılım Eğitimi Müfredatı


Merhaba,

Full Stack Yazılım Eğitimi Müfredatı aşağıdaki teknolojileri önereceğim:

  1. Java
  2. .NET
  3. Python
  4. NodeJS

Veritabanı için: Cassandra

Frontend için: React, Redux, React Native, Expo, NextJS

Aşağıdaki örnek müfredat C# ve TypeScript dilleri ile Web ve Mobil Yazılım Eğitimi önerisidir.

Full Stack Web ve Mobil Yazılım Eğitimi Müfredatı Önerisi (süre: 100 gün)

  • Backend Geliştirici Eğitimi
    1. IDE: Visual Studio
    2. Veritabanları: Cassandra, CQL
    3. Veri Yapıları ve Algoritma
    4. C#, OOP, Dependency Injection, Design Patterns
    5. Dosya İşlemleri, JSON, XML
    6. Hata Yönetimi ve Loglama
    7. CassandraCSharpDriver (veya EFCore.Cassandra)
    8. Yazılım Mimarileri: Mikrohizmet Mimarisi
    9. Sanallaştırma: Kubernetes, Docker, Minikube, Istio
    10. Kafka ve gRPC
    11. API Gateway: Rest, gRPC-Web, WebSocket
    12. GitHub/GitLab/Devops
    13. Bulut Bilişim: Azure
    14. CI/CD
    15. Yapay Zeka: ML.NET, Bot Framework
    16. Geleneksel JWT üyelik ve yeni SSI/DID/VC (örn: Trinsic)
    17. Yazılım Güvenliği
    18. Test
  • Frontend Geliştirici Eğitimi
    1. IDE: Visual Studio Code
    2. HTML, CSS, SCSS, JavaScript, jQuery, Bootstrap
    3. TypeScript, NPM, Yarn
    4. React/Ionic (Web ve Hibrit Mobil)
    5. Material Design
    6. Hooks
    7. Redux
    8. Expo
    9. NextJS
    10. React Native/React Native Web (Native Mobil ve Web)
    11. NX (Monorepo)
    12. Firebase Hosting, FCM
    13. CI/CD
    14. SSR
    15. Geleneksel JWT üyelik ve yeni SSI/DID/VC (örn: Trinsic)
    16. WebRTC
    17. WebXR, AR, VR, MR
    18. Test

Neden Cassandra?
SQL Server ve MongoDB veritabanlarının profesyonel sürümleri ücretlidir. MySQL ve SQLite gibi veritabanları da yüksek performans ve big data için uygun sayılmazlar. Oysa Apache Cassandra tamamen ücretsiz bir big data veritabanıdır. NoSQL veritabanı olmasına karşın SQL’e çok benzer CQL dilini kullanır ve dünyanın en büyük big data projesini dahi yapıyor olsanız Cassandra ile yapabilirsiniz, PetaByte veriyi kaldırabilecek kapasitedir. Cassandra’yı yaygın bir yöntem olmasa da Entity Framework ile de kullanabilirsiniz. Ve Cassandra Netflix gibi büyük kuruluşlar tarafından kullanılır. Ayrıca Cassandra decentralized’tır (merkezi olmayan) ve immutable’dır (değişmez), yani bir anlamda BlockChain alternatifidir, buna karşın çok hızlıdır.

Küresel Isınma ve Yazılım

Ayrıca küresel ısınma konusunda bilişim sektöründe yapabileceklerimizden de bahsetmekte fayda var: Green Yazılım, Red Yazılım konusuna değinmeliyiz. Green yazılım küresel ısınma probleminin çözümüne katkı sağlayan çevre-dostu yazılım demektir.

C# ve TypeScript az enerji tüketen green yazılım kategorisinde değerlendirilirken, Python henüz çok fazla enerji tüketen ve dolayısıyla daha fazla karbon salınımı yapmakta ve biz bu durumun düzeltilmesini beklemekteyiz.

BlockChain PoW algoritması ve madencilik çok fazla karbon salınımı yaparken, PoS ve PoA algoritmaları daha çevrecidir, gibi küresel ısınma konusunda farkındalık kazandırılabilir.

Mutlu kodlamalar 🙂

React Native Hooks


React Native Hooks, React.js kütüphanesinin mobil uygulamalar için uyarlanmış versiyonudur. Hooks, komponentlerinizi daha esnek ve verimli hale getirmek için kullanabileceğiniz fonksiyonlar sunar. Öncelikle, Hooks ile state veya diğer React özelliklerini komponentleriniz dışında da kullanabilirsiniz. Ayrıca, Hooks ile komponentler arasında veri paylaşımını veya fonksiyonların tekrar kullanımını kolaylaştırabilirsiniz.

En yaygın kullanılan Hooks arasında useState ve useEffect bulunur. useState, bir komponentin state’ini yönetmek için kullanılır ve useEffect ise komponentin mount edilmesi veya güncellenmesi sırasında çalışmasını sağlar. Örneğin, useEffect ile bir komponentin başlangıçta veri çekmesini veya bir event’e cevap vermesini sağlayabilirsiniz.

React Native Hooks kullanımı, React.js kullanmaya alışkın olanlar için oldukça kolaydır. Ayrıca, Hooks sayesinde kodunuz daha okunaklı ve anlaşılır hale gelecektir. Özellikle, projeleriniz büyüdükçe veya takım içinde geliştirilmeye başladıkça Hooks’un faydasını daha iyi göreceksiniz.

Örnek olarak, useState Hook’u kullanarak bir komponentin içinde state tanımlayabilirsiniz:

import React, { useState } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </>
  );
}

Bu örnekte, useState Hook’u kullanarak count adında bir state tanımladık ve setCount fonksiyonunu kullanarak state’i güncelledik. Ayrıca, bir düğmeye tıklama olayı eklendi ve tıklama olayına göre count state’ini arttırdık.

useEffect Hook’u da kullanarak komponentin bir etki yaratmasını sağlayabilirsiniz:

import React, { useState, useEffect } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]);

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </>
  );
}

Bu örnekte, useEffect Hook’u kullanarak sayfa başlığının count state’ine göre değişmesini sağladık.

React Native Hook’larının Listesi:

  1. useState: Komponent içinde state tanımlamak için kullanılır. Örnekteki gibi, değer ve değeri güncellemek için kullanılan bir fonksiyon döndürür.
  2. useEffect: Komponentin bir etki yaratmasını sağlar. Örnekteki gibi, componentDidMount, componentDidUpdate ve componentWillUnmount işlevlerini karşılamak için kullanılır.
  3. useContext: Context API’yı kullanmak için kullanılır. Bu Hook ile, bir context değerini ve bu değerin değiştiğinde çalışacak bir fonksiyon alabilirsiniz.
  4. useReducer: Reducer fonksiyonlarını kullanmak için kullanılır. Bu Hook ile, state’in nasıl güncelleneceğini tanımlayan bir fonksiyon ve başlangıç değeri alabilirsiniz.
  5. useCallback: Komponentin yeniden render edilme sıklığını azaltmak için kullanılır. Bu Hook ile, tekrar kullanılacak bir fonksiyon ve dependancy array oluşturabilirsiniz.
  6. useMemo: Komponentin performansını arttırmak için kullanılır. Bu Hook ile, tekrar hesaplanması gereken bir değer ve dependancy array oluşturabilirsiniz.
  7. useRef: DOM referanslarını veya komponent içi referansları almak için kullanılır.
  8. useImperativeHandle: Komponentin kontrol edilmesini sağlamak için kullanılır.
  9. useLayoutEffect: useEffect ile aynı ama layout ve paint işlemleri tamamlandıktan sonra çalışır.
  10. useDebugValue: Hook’un ne için kullanıldığını görmek için kullanılır.

Son olarak, React Native Hooks ile geliştirme yaparken aşağıdaki kurallara dikkat etmeniz gerekir:

  • Hooks, sadece React fonksiyonel komponentlerinde veya komponent fonksiyonları içinde kullanılabilir.
  • Hooks, fonksiyonel komponentlerin en üst seviyesinde veya event handler fonksiyonları içinde çağrılmalıdır.
  • Hooks, her render edildiğinde aynı sırada ve aynı değerlerle çağrılmalıdır.

Umarım, React Native Hooks hakkında bu bilgiler faydalı olmuştur ve projelerinizde kullanmaya başlamanızda size yardımcı olmuştur.

Mutlu kodlamalar 🙂

Not: Bu makale ChatGPT’den yararlanılarak hazırlanmıştır.