<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="tr"><title>H.Ozgan a.k.a netologist</title><id>https://hozgan.com/</id><author><name>H.Ozgan a.k.a netologist</name><uri>https://hozgan.com/</uri></author><generator>Hugo gohugo.io</generator><updated>2025-07-19T11:17:37Z</updated><link rel="alternate" type="text/html" href="https://hozgan.com/" hreflang="tr"/><entry><title>Her Projede Neden project-checklist.md Dosyası Olmalı?</title><author><name/><uri/></author><id>https://hozgan.com/her-projede-neden-project-checklist.md-dosyas%C4%B1-olmal%C4%B1/</id><updated>2025-07-19T00:00:00Z</updated><published>2025-07-19T00:00:00Z</published><content type="html">&lt;p>Modern yazılım geliştirme süreçleri hızlı ilerliyor — bazen de bu hız hataları beraberinde getiriyor. Yeni özellikler, refactor&amp;rsquo;lar, deployment&amp;rsquo;lar, ekip değişiklikleri derken önemli adımlar kolayca unutulabiliyor.&lt;/p>
&lt;p>İşte tam bu noktada &lt;strong>&lt;code>project-checklist.md&lt;/code>&lt;/strong> dosyası devreye giriyor.&lt;/p>
&lt;h2 id="project-checklistmd-nedir">&lt;code>project-checklist.md&lt;/code> Nedir?&lt;/h2>
&lt;p>Projeye eklenen her özellik veya yapılan her güncellemeden sonra tamamlandığından emin olmanız gereken tüm adımları içeren &lt;strong>basit ama kapsamlı bir Markdown dosyasıdır&lt;/strong>.&lt;/p>
&lt;p>Kısacası: Takımınızın &lt;strong>mühendislik kalite kontrol kapısı&lt;/strong>.&lt;/p>
&lt;p>Tüm checklist’i buradan görebilirsiniz:&lt;br>
&lt;a href="https://gist.github.com/netologist/e963e9ffd1e1bfd726c9a167e514988d">GitHub Gist: project-checklist.md&lt;/a>&lt;/p>
&lt;h2 id="neleri-kapsıyor">Neleri Kapsıyor?&lt;/h2>
&lt;p>Checklist şu alanları kapsar:&lt;/p>
&lt;h3 id="kod-kalitesi--standartlar">Kod Kalitesi &amp;amp; Standartlar&lt;/h3>
&lt;ul>
&lt;li>Conventional commit mesajları&lt;/li>
&lt;li>Linter / formatter kontrolleri (pre-commit hook)&lt;/li>
&lt;li>&lt;code>README&lt;/code> ve &lt;code>CHANGELOG&lt;/code> güncellemeleri&lt;/li>
&lt;li>&lt;code>.editorconfig&lt;/code> ve &lt;code>.gitignore&lt;/code> kontrolleri&lt;/li>
&lt;/ul>
&lt;h3 id="build--deployment">Build &amp;amp; Deployment&lt;/h3>
&lt;ul>
&lt;li>Dockerfile ve &lt;code>docker-compose.yaml&lt;/code>&lt;/li>
&lt;li>&lt;code>.env.example&lt;/code> dosyası&lt;/li>
&lt;li>CI/CD yapılandırmaları&lt;/li>
&lt;li>(Opsiyonel) Kubernetes YAML dosyaları&lt;/li>
&lt;/ul>
&lt;h3 id="testler">Testler&lt;/h3>
&lt;ul>
&lt;li>Unit, integration, API testleri&lt;/li>
&lt;li>Yük ve güvenlik testleri&lt;/li>
&lt;li>Code coverage eşikleri&lt;/li>
&lt;/ul>
&lt;h3 id="dokümantasyon">Dokümantasyon&lt;/h3>
&lt;ul>
&lt;li>API belgeleri (Swagger/OpenAPI)&lt;/li>
&lt;li>Sistem mimarisi diyagramları&lt;/li>
&lt;li>ADR (Architecture Decision Record) belgeleri&lt;/li>
&lt;/ul>
&lt;h3 id="veritabanı-ve-veri">Veritabanı ve Veri&lt;/h3>
&lt;ul>
&lt;li>Migration ve seed dosyaları&lt;/li>
&lt;li>Şema güncellemeleri&lt;/li>
&lt;li>Anonimleştirilmiş test verisi&lt;/li>
&lt;/ul>
&lt;h3 id="güvenlik--uyumluluk">Güvenlik &amp;amp; Uyumluluk&lt;/h3>
&lt;ul>
&lt;li>Audit araçları (&lt;code>npm audit&lt;/code>, &lt;code>pip-audit&lt;/code>, vb.)&lt;/li>
&lt;li>GDPR / KVKK kontrolleri&lt;/li>
&lt;li>Secret yönetimi ve &lt;code>.env&lt;/code> güvenliği&lt;/li>
&lt;/ul>
&lt;h3 id="diğer-gereklilikler">Diğer Gereklilikler&lt;/h3>
&lt;ul>
&lt;li>Feature flag belgeleri&lt;/li>
&lt;li>Logging ve monitoring altyapısı&lt;/li>
&lt;li>Edge case / hata senaryoları&lt;/li>
&lt;/ul>
&lt;h2 id="ne-zaman-kullanılır">Ne Zaman Kullanılır?&lt;/h2>
&lt;p>Ne zaman:&lt;/p>
&lt;ul>
&lt;li>Yeni bir özellik eklerseniz&lt;/li>
&lt;li>Hata düzeltmesi yaparsanız&lt;/li>
&lt;li>Veritabanında değişiklik olursa&lt;/li>
&lt;li>Yayın (release) öncesi&lt;/li>
&lt;li>Pull Request açarken&lt;/li>
&lt;/ul>
&lt;p>Checklist dosyasını açın, kontrol edin, eksikleri tamamlayın.&lt;/p>
&lt;p>Bu, mühendislik süreciniz için bir &lt;strong>unit test&lt;/strong> gibidir.&lt;/p>
&lt;h2 id="ekstra-öneri">Ekstra Öneri&lt;/h2>
&lt;p>Bu listeyi şu yerlere entegre edebilirsiniz:&lt;/p>
&lt;ul>
&lt;li>PR template dosyalarına&lt;/li>
&lt;li>CI/CD otomasyonlarına&lt;/li>
&lt;li>Notion ekip sayfalarına&lt;/li>
&lt;li>Developer onboarding rehberlerine&lt;/li>
&lt;/ul>
&lt;p>Bir çeşit &lt;strong>güvenlik ağı&lt;/strong> görevi görür — bug’ları, teknik borcu ve belirsizliği azaltır.&lt;/p>
&lt;h2 id="son-söz">Son Söz&lt;/h2>
&lt;blockquote>
&lt;p>“Checklist&amp;rsquo;ler, niyeti eyleme dönüştürür.”&lt;br>
– Atul Gawande, &lt;em>Checklist Manifesto&lt;/em>&lt;/p>&lt;/blockquote>
&lt;p>Takımınız büyük ya da küçük olsun fark etmez, &lt;strong>hiçbir şeyi şansa bırakmayan mühendisler&lt;/strong> bu tür alışkanlıkları sistemli hale getirir.&lt;/p>
&lt;p>&lt;strong>Hazırsanız başlayalım:&lt;/strong>&lt;br>
📎 &lt;a href="https://gist.github.com/netologist/e963e9ffd1e1bfd726c9a167e514988d">Checklist’i buradan alın ve projenize ekleyin.&lt;/a>&lt;/p>
&lt;p>İyi deploylar 🚀&lt;/p></content></entry><entry><title>Bağlam Mühendisliği</title><author><name/><uri/></author><id>https://hozgan.com/baglam-muhendisligi/</id><updated>2025-07-13T00:00:00Z</updated><published>2025-07-13T00:00:00Z</published><content type="html">&lt;h2 id="giriş">Giriş&lt;/h2>
&lt;p>Bağlam mühendisliği, 2025 yılında yapay zeka (AI) alanında önemli bir yer edinmiş, prompt mühendisliğinden evrilen yeni bir disiplindir. Prompt mühendisliği, büyük dil modelleri (LLM&amp;rsquo;ler) için belirli talimatlar oluşturmaya odaklanırken, bağlam mühendisliği, bir LLM&amp;rsquo;nin görevleri güvenilir ve etkili bir şekilde gerçekleştirmesini sağlamak için tüm bilgi ekosistemini tasarlamayı ve yönetmeyi içerir. Bu rapor, bağlam mühendisliğinin tanımı, önemi, teknikleri ve uygulamalarını, son sektör tartışmaları ve teknik kaynaklardan elde edilen bilgiler ışığında incelemektedir.&lt;/p>
&lt;h2 id="bağlam-mühendisliği-nedir">Bağlam Mühendisliği Nedir?&lt;/h2>
&lt;p>Bağlam mühendisliği, Andrej Karpathy tarafından &amp;ldquo;bağlam penceresini bir sonraki adım için doğru bilgilerle doldurmanın ince sanatı ve bilimi&amp;rdquo; olarak tanımlanmıştır. Tek bir prompt oluşturmanın ötesine geçerek, talimatlar, hafıza, harici veriler ve araçlar gibi bir LLM&amp;rsquo;nin işlediği tüm girdilerin stratejik bir şekilde düzenlenmesini kapsar. Shopify CEO&amp;rsquo;su Tobi Lütke, 19 Haziran 2025&amp;rsquo;te geniş yankı uyandıran bir paylaşımda, bunu &amp;ldquo;görevin LLM tarafından çözülebilir hale getirilmesi için tüm bağlamı sağlama sanatı&amp;rdquo; olarak nitelendirmiştir.&lt;/p>
&lt;h3 id="prompt-mühendisliğinden-temel-farklar">Prompt Mühendisliğinden Temel Farklar&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Kapsam&lt;/strong>: Prompt mühendisliği, tek bir talimat veya sorgu yazımına odaklanır (örneğin, &amp;ldquo;Naval gibi bir tweet yaz&amp;rdquo;). Bağlam mühendisliği ise, LLM&amp;rsquo;nin çalıştığı tüm &amp;ldquo;zihinsel dünyayı&amp;rdquo; tasarlar; bu, hafıza, alınan veriler ve araç çıktılarını içerir.&lt;/li>
&lt;li>&lt;strong>Sistematik Yaklaşım&lt;/strong>: Prompt mühendisliği genellikle deneme-yanılma yoluyla ayarlamalar içerirken, bağlam mühendisliği yazılım mimarisine benzer şekilde tekrarlanabilir, ölçeklenebilir sistemler üzerine odaklanır.&lt;/li>
&lt;li>&lt;strong>Sonuç&lt;/strong>: Prompt mühendisliği tek seferlik görevler veya yaratıcı çıktılar için uygundurken, bağlam mühendisliği uzun süreli iş akışlarını, çok adımlı konuşmaları ve üretim düzeyinde yapay zeka sistemlerini destekler.&lt;/li>
&lt;/ul>
&lt;h3 id="bağlam-mühendisliği-neden-önemli">Bağlam Mühendisliği Neden Önemli?&lt;/h3>
&lt;p>ChatGPT, Claude ve Gemini gibi LLM&amp;rsquo;ler daha yetkin hale geldikçe, başarısızlıkların çoğu modelin sınırlamalarından değil, yetersiz veya kötü yapılandırılmış bağlamdan kaynaklanmaktadır. Bağlam mühendisliği bunu şu yollarla ele alır:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Doğruluğu Artırma&lt;/strong>: İlgili, yüksek kaliteli bağlam sağlamak, kesin ve güvenilir çıktılar sağlar.&lt;/li>
&lt;li>&lt;strong>Başarısızlıkları Azaltma&lt;/strong>: Ajanların çoğu başarısızlığı, model başarısızlığı değil, bağlam başarısızlığıdır; model, etkili bir şekilde performans göstermek için gerekli bilgiye sahip değildir.&lt;/li>
&lt;li>&lt;strong>Ölçeklenebilirliği Sağlama&lt;/strong>: Bağlam mühendisliği, karmaşık, çok adımlı iş akışlarını ve ajan sistemlerini destekler, bu da kurumsal uygulamalar için vazgeçilmezdir.&lt;/li>
&lt;li>&lt;strong>Kişiselleştirmeyi Geliştirme&lt;/strong>: Konuşma geçmişi, kullanıcı tercihleri ve harici verileri yöneterek, bağlam mühendisliği kişiselleştirilmiş yapay zeka deneyimleri yaratır.&lt;/li>
&lt;/ul>
&lt;h2 id="bağlam-mühendisliğinin-temel-bileşenleri">Bağlam Mühendisliğinin Temel Bileşenleri&lt;/h2>
&lt;p>Bağlam mühendisliği, LLM’nin sınırlı &amp;ldquo;çalışma belleği&amp;rdquo; olan bağlam penceresini optimize etmek için birden fazla bilgi türünü yönetmeyi içerir. Ana bileşenler şunlardır:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Talimatlar/Sistem Promptları&lt;/strong>: LLM’nin davranışını tanımlayan açık, yapılandırılmış yönergeler, genellikle kurallar veya örnekler içerir.&lt;/li>
&lt;li>&lt;strong>Konuşma Geçmişi ve Hafıza&lt;/strong>: Geçmiş etkileşimleri takip ederek tutarlılığı sağlar; kısa vadeli (oturum bazlı) veya uzun vadeli (oturumlar arası) hafıza modülleri kullanılır.&lt;/li>
&lt;li>&lt;strong>Alınan Bilgiler (RAG)&lt;/strong>: Belgeler, veritabanları veya API’lerden alınan harici veriler, Alım Artırılmış Üretim (RAG) yoluyla güncel bilgi sağlamak için kullanılır.&lt;/li>
&lt;li>&lt;strong>Araç Çıktıları&lt;/strong>: Arama API’leri veya kod yürütme gibi harici araçlardan elde edilen sonuçlar, LLM’nin yeteneklerini artırmak için bağlama entegre edilir.&lt;/li>
&lt;li>&lt;strong>Yapılandırılmış Çıktılar&lt;/strong>: LLM’nin yanıt formatının (örneğin, JSON) tanımlanması, tutarlılık ve kullanılabilirlik sağlar.&lt;/li>
&lt;/ol>
&lt;h2 id="bağlam-mühendisliği-teknikleri">Bağlam Mühendisliği Teknikleri&lt;/h2>
&lt;p>Bağlam mühendisliği, LLM’nin bağlam penceresinin sınırlı kapasitesini (örneğin, 8k, 32k veya 128k token) yönetmek ve performansı optimize etmek için çeşitli stratejiler kullanır. Temel teknikler şunlardır:&lt;/p>
&lt;h3 id="1-alım-artırılmış-üretim-rag">1. Alım Artırılmış Üretim (RAG)&lt;/h3>
&lt;p>RAG, statik LLM bilgisini, vektör veritabanları (örneğin, Pinecone, Weaviate) veya bilgi tabanlarından dinamik alımla birleştirir. Belgeler parçalara ayrılır, gömülür ve sorguya semantik benzerlik temelinde alınır, ardından prompt ile birleştirilir. Gelişmiş “ajan RAG”, planlama, araç kullanımı ve yansıtma ile çok adımlı döngüleri içerir.&lt;/p>
&lt;h3 id="2-hafıza-yönetimi">2. Hafıza Yönetimi&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Kısa Vadeli Hafıza&lt;/strong>: Oturum içinde konuşma geçmişini tutar, çok adımlı etkileşimlerde tutarlılık sağlar.&lt;/li>
&lt;li>&lt;strong>Uzun Vadeli Hafıza&lt;/strong>: Kullanıcı tercihlerini veya geçmiş etkileşimleri oturumlar arasında depolar, alımlar için gömüler veya bilgi grafikleri kullanır.&lt;/li>
&lt;li>&lt;strong>Yansıtma&lt;/strong>: Reflexion gibi teknikler, ajanların kendi oluşturdukları hafızaları üretip yeniden kullanmalarına olanak tanır, zamanla performansı artırır.&lt;/li>
&lt;/ul>
&lt;h3 id="3-bağlam-seçimi-ve-budama">3. Bağlam Seçimi ve Budama&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Hedefli Alım&lt;/strong>: Not defterlerinden veya çalışma zamanı durumundan yalnızca ilgili bilgileri seçerek gürültüyü azaltır.&lt;/li>
&lt;li>&lt;strong>Bağlam Budama&lt;/strong>: Eski veya çelişkili bilgileri kaldırarak hataları önler; bir çalışmada, bilgilerin dönüşler arasında parçalanması performansı %39 düşürmüştür.&lt;/li>
&lt;li>&lt;strong>Bağlam Özetleme&lt;/strong>: Token ağırlıklı etkileşimleri, temel detayları koruyarak yoğunlaştırır; Claude Code’un “otomatik sıkıştırma” özelliği buna örnektir.&lt;/li>
&lt;/ul>
&lt;h3 id="4-araç-yönetimi">4. Araç Yönetimi&lt;/h3>
&lt;p>Ajanlar genellikle arama API’leri veya kod yürütme ortamları gibi araçlar kullanır, ancak çok fazla araç kafa karışıklığına yol açabilir. Araç açıklamalarına RAG uygulamak, seçim doğruluğunu üç katına çıkarabilir. Kum havuzları, token ağırlıklı çıktıları izole ederek yalnızca ilgili sonuçları LLM’ye geri aktarır.&lt;/p>
&lt;h3 id="5-çok-ajanlı-mimariler">5. Çok Ajanlı Mimariler&lt;/h3>
&lt;p>Karmaşık görevlerde, çok ajanlı sistemler bağlamı alt görevlere böler, her biri uzmanlaşmış alt görevleri üstlenir. Ancak zayıf bağlam paylaşımı, tutarsız sonuçlara yol açabilir; örneğin, Flappy Bird klonunda alt ajanların uyumsuz bileşenler oluşturması gibi. Etkili bağlam mühendisliği, ajanlar arasında paylaşılan bağlamı sağlar.&lt;/p>
&lt;h3 id="6-token-optimizasyonu">6. Token Optimizasyonu&lt;/h3>
&lt;p>Sabit bağlam pencereleriyle, mühendisler bilgi yoğunluğuna öncelik vermelidir. Teknikler şunlardır:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Parçalama ve Özetleme&lt;/strong>: Büyük belgeleri parçalara ayırma veya token sınırlarına uyması için özetleme.&lt;/li>
&lt;li>&lt;strong>Yenilik Önyargısı Yönetimi&lt;/strong>: Kritik bilgileri tekrarlayarak veya sabitleyerek “ortada kaybolma” sorunlarını önleme.&lt;/li>
&lt;li>&lt;strong>Yapılandırılmış Formatlar&lt;/strong>: Daha az tokenla daha fazla bilgi paketlemek için özel işaretleme veya JSON kullanma.&lt;/li>
&lt;/ul>
&lt;h2 id="bağlam-mühendisliğinin-uygulamaları">Bağlam Mühendisliğinin Uygulamaları&lt;/h2>
&lt;p>Bağlam mühendisliği, güvenilir, ölçeklenebilir ve kişiselleştirilmiş sistemler sağlayarak sektörlerde yapay zeka uygulamalarını dönüştürmektedir. Örnekler:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kurumsal Yapay Zeka Asistanları&lt;/strong>: Çok ajanlı RAG sistemleri, Confluence, Jira ve CRM’lerden gelen verileri birleştirerek birleşik yanıtlar sağlar.&lt;/li>
&lt;li>&lt;strong>Kodlama Asistanları&lt;/strong>: Claude Code ve Cursor gibi araçlar, tüm kod tabanlarını anlamak, logları ayrıştırmak ve kodlama stilini sürdürmek için bağlam mühendisliği kullanır.&lt;/li>
&lt;li>&lt;strong>Eğitim Teknolojisi&lt;/strong>: Praktika AI gibi yapay zeka öğretmenleri, öğrenici profillerini ve ilerlemelerini izleyerek kişiselleştirilmiş dersler sunar.&lt;/li>
&lt;li>&lt;strong>Sağlık&lt;/strong>: Tıbbi yapay zeka asistanları, hasta kayıtları ve araştırmalara dayalı doğru, gizliliğe duyarlı yanıtlar sağlamak için yapılandırılmış bağlam kullanır.&lt;/li>
&lt;li>&lt;strong>E-ticaret ve Finans&lt;/strong>: Derin bağlam, kişiselleştirilmiş öneriler ve gerçek zamanlı veri işleme sağlar.&lt;/li>
&lt;/ul>
&lt;h2 id="zorluklar-ve-dikkat-edilmesi-gerekenler">Zorluklar ve Dikkat Edilmesi Gerekenler&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Bağlam Penceresi Sınırlamaları&lt;/strong>: Milyon tokenluk pencereler bile olsa, daha fazla veri doldurmak verimsizdir. Mühendisler, alaka düzeyi ve tutarlılığa öncelik vermelidir.&lt;/li>
&lt;li>&lt;strong>Model Kafa Karışıklığı&lt;/strong>: Çok fazla araç veya kötü formatlanmış bağlam, hatalara yol açabilir.&lt;/li>
&lt;li>&lt;strong>Gizlilik ve Güvenlik&lt;/strong>: ChatGPT’nin konum verilerini görüntülere enjekte etmesi gibi beklenmedik hafıza alımları, kullanıcı güvenini zedeleyebilir.&lt;/li>
&lt;li>&lt;strong>Hata Ayıklama&lt;/strong>: Bağlam mühendisliği, tam bağlam penceresini ve token akışını incelemeyi gerektirir; bu, prompt mühendisliğinin basit yeniden yazımından farklıdır.&lt;/li>
&lt;/ul>
&lt;h2 id="bağlam-mühendisliğinin-geleceği">Bağlam Mühendisliğinin Geleceği&lt;/h2>
&lt;p>Bağlam mühendisliği, Tobi Lütke ve Andrej Karpathy gibi sektör liderlerinin vurguladığı üzere, modern yapay zeka sistem tasarımının temeli olmaya hazırlanıyor. Yapay zeka ajanları geliştikçe, Anthropic’in Model Bağlam Protokolü, LangChain ve LlamaIndex gibi araçlar bağlam yönetimini standartlaştırıyor. Disiplin, ad-hoc prompt ayarlamasından sistematik orkestrasyona geçiş yaparak, yapay zekanın karmaşık, gerçek dünya görevlerini benzersiz bir güvenilirlikle ele almasını sağlıyor.&lt;/p>
&lt;h2 id="örnek-çözüm-e-ticaret-platformunda-kişiselleştirilmiş-ürün-öneri-sistemi">Örnek Çözüm: E-ticaret Platformunda Kişiselleştirilmiş Ürün Öneri Sistemi&lt;/h2>
&lt;h3 id="senaryo">Senaryo&lt;/h3>
&lt;p>Bir e-ticaret platformu, kullanıcılarına alışveriş alışkanlıklarına, geçmiş satın alımlarına ve gerçek zamanlı davranışlarına dayalı olarak kişiselleştirilmiş ürün önerileri sunmak istiyor. Mevcut sistem, statik kurallara dayalı öneriler üretiyor ve kullanıcıların dinamik ihtiyaçlarına yeterince yanıt veremiyor. Bağlam mühendisliği kullanarak, bir LLM tabanlı asistanın (örneğin, Grok 3) daha doğru, bağlama duyarlı öneriler sunmasını sağlayacağız.&lt;/p>
&lt;h3 id="amaç">Amaç&lt;/h3>
&lt;ul>
&lt;li>Kullanıcının geçmiş alışveriş verilerini, gerçek zamanlı tarama davranışlarını ve ürün kataloğunu entegre ederek kişiselleştirilmiş öneriler sunmak.&lt;/li>
&lt;li>LLM’nin bağlam penceresini optimize ederek hızlı, doğru ve tutarlı yanıtlar sağlamak.&lt;/li>
&lt;li>Kullanıcı gizliliğini korurken, yalnızca ilgili verilerin bağlama dahil edilmesini sağlamak.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="çözüm-tasarımı">Çözüm Tasarımı&lt;/h2>
&lt;h3 id="1-sistem-mimarisi">1. Sistem Mimarisi&lt;/h3>
&lt;p>Bağlam mühendisliği odaklı sistem şu bileşenlerden oluşacak:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LLM&lt;/strong>: Grok 3, öneri oluşturma ve kullanıcı etkileşimlerini işlemek için kullanılacak.&lt;/li>
&lt;li>&lt;strong>Veri Kaynakları&lt;/strong>:
&lt;ul>
&lt;li>Kullanıcı profili (uzun vadeli hafıza): Geçmiş satın alımlar, favoriler, demografik bilgiler.&lt;/li>
&lt;li>Gerçek zamanlı tarama verileri (kısa vadeli hafıza): Mevcut oturumdaki tıklamalar, sepet içeriği, arama sorguları.&lt;/li>
&lt;li>Ürün kataloğu: Vektör veritabanında saklanan ürün açıklamaları, kategoriler ve stok durumu.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Araçlar&lt;/strong>:
&lt;ul>
&lt;li>Arama motoru API’si: Ürün kataloğundan ilgili ürünleri almak için.&lt;/li>
&lt;li>Öneri motoru API’si: İlk önerileri oluşturmak için mevcut kural tabanlı sistemi destekler.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bağlam Yöneticisi&lt;/strong>: Tüm verileri birleştirir, bağlam penceresini optimize eder ve LLM’ye gönderir.&lt;/li>
&lt;/ul>
&lt;h3 id="2-bağlam-mühendisliği-uygulaması">2. Bağlam Mühendisliği Uygulaması&lt;/h3>
&lt;h4 id="a-sistem-promptu">a) Sistem Promptu&lt;/h4>
&lt;p>LLM’ye net bir rol ve yönergeler verilir:&lt;/p>
&lt;pre tabindex="0">&lt;code>Sen bir e-ticaret asistanısın. Görevin, kullanıcıya geçmiş satın alımları, tarama davranışları ve ürün kataloğuna dayalı olarak kişiselleştirilmiş ürün önerileri sunmaktır. Yanıtlarını kısa, kullanıcı dostu ve JSON formatında sun. Öneriler, kullanıcının ilgi alanlarına uygun olmalı ve stokta olan ürünleri içermeli. Gizliliğe saygı göster; yalnızca sağlanan verileri kullan.
&lt;/code>&lt;/pre>&lt;h4 id="b-hafıza-yönetimi">b) Hafıza Yönetimi&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Kısa Vadeli Hafıza&lt;/strong>: Kullanıcının mevcut oturumdaki davranışları (örneğin, “kırmızı spor ayakkabı” araması, sepetine bir tişört eklemesi) bir JSON nesnesinde saklanır:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;session_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;12345&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;current_search&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;kırmızı spor ayakkabı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;cart&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;beyaz tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;clicks&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;nike koşu ayakkabısı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;adidas tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>Uzun Vadeli Hafıza&lt;/strong>: Kullanıcının geçmiş satın alımları ve tercihleri, bir vektör veritabanında (örneğin, Pinecone) saklanır. Örneğin:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;user_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;user789&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;mavi kot pantolon&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;siyah sırt çantası&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;preferences&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;casual giyim&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="c-retrieval-augmented-generation-rag">c) Retrieval-Augmented Generation (RAG)&lt;/h4>
&lt;ul>
&lt;li>Kullanıcının arama sorgusu ve tarama verileri, ürün kataloğundan ilgili ürünleri almak için vektör aramasına dönüştürülür. Örneğin, “kırmızı spor ayakkabı” sorgusu için:
&lt;ul>
&lt;li>Vektör veritabanı, “kırmızı”, “spor ayakkabı” ve kullanıcı tercihleriyle (örneğin, “casual giyim”) eşleşen ürünleri döndürür.&lt;/li>
&lt;li>Alınan ürünler, stok durumu ve fiyat gibi metadata ile birlikte bağlama eklenir:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0550ae">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod1&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Nike Air Max Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;category&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">true&lt;/span>&lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0550ae">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Adidas Ultraboost Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;category&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">true&lt;/span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="d-araç-entegrasyonu">d) Araç Entegrasyonu&lt;/h4>
&lt;ul>
&lt;li>Mevcut öneri motoru API’si, kullanıcı verilerine dayalı ön öneriler üretir. Bu çıktılar, RAG ile alınan ürünlerle birleştirilir.&lt;/li>
&lt;li>Arama motoru API’si, stok durumu veya yeni ürün lansmanları gibi gerçek zamanlı verileri çeker.&lt;/li>
&lt;li>Bağlam yöneticisi, araç çıktılarını özetler ve yalnızca en ilgili bilgileri LLM’ye aktarır:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;tool_output&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;recommendation_engine&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Nike Air Max&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Puma Sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;search_api&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Yeni kırmızı sneaker koleksiyonu stokta&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="e-token-optimizasyonu">e) Token Optimizasyonu&lt;/h4>
&lt;ul>
&lt;li>Bağlam penceresi (örneğin, 32k token) sınırlı olduğundan, veri özetlenir:
&lt;ul>
&lt;li>Ürün açıklamaları, yalnızca ad, kategori, fiyat ve stok durumu gibi temel alanlara indirgenir.&lt;/li>
&lt;li>Konuşma geçmişi, son 3 etkileşime sıkıştırılır.&lt;/li>
&lt;li>Kritik bilgiler (örneğin, kullanıcı aramasındaki “kırmızı” anahtar kelimesi) tekrarlanarak “ortada kaybolma” sorunu önlenir.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Örnek bağlam (yaklaşık 500 token):
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;system_prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Kullanıcıya kişiselleştirilmiş ürün ALEVI sun. Yanıt JSON formatında olmalı.&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;user_data&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;current_search&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;kırmızı spor ayakkabı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;mavi kot pantolon&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;preferences&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;casual giyim&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;retrieved_products&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0550ae">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod1&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Nike Air Max Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">true&lt;/span>&lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0550ae">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Adidas Ultraboost Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">true&lt;/span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;tool_output&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;recommendation_engine&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Nike Air Max&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;search_api&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Kırmızı sneaker stokta&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="f-yapılandırılmış-çıktı">f) Yapılandırılmış Çıktı&lt;/h4>
&lt;p>LLM, önerileri JSON formatında üretir:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;recommendations&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;product_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod1&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Nike Air Max Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;reason&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Kırmızı spor ayakkabı aramanıza ve casual giyim tercihinize uygun.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;product_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Adidas Ultraboost Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;reason&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Yüksek performanslı sneaker, son aramanızla uyumlu.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-iş-akışı">3. İş Akışı&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Kullanıcı Etkileşimi&lt;/strong>: Kullanıcı “kırmızı spor ayakkabı” arar ve sepetine bir tişört ekler.&lt;/li>
&lt;li>&lt;strong>Bağlam Toplama&lt;/strong>:
&lt;ul>
&lt;li>Kısa vadeli hafıza, tarama verilerini (arama, tıklamalar, sepet) kaydeder.&lt;/li>
&lt;li>Uzun vadeli hafıza, kullanıcı profilinden geçmiş satın alımları ve tercihleri çeker.&lt;/li>
&lt;li>RAG, ürün kataloğundan ilgili ürünleri alır.&lt;/li>
&lt;li>Araçlar, öneri motoru ve arama API’sinden ek veriler sağlar.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bağlam Optimizasyonu&lt;/strong>: Bağlam yöneticisi, verileri özetler ve token sınırlarına uygun hale getirir.&lt;/li>
&lt;li>&lt;strong>LLM İşleme&lt;/strong>: Grok 3, bağlamı işler ve JSON formatında öneriler üretir.&lt;/li>
&lt;li>&lt;strong>Yanıt Sunumu&lt;/strong>: Öneriler, kullanıcıya web arayüzünde veya mobil uygulamada gösterilir.&lt;/li>
&lt;li>&lt;strong>Geri Bildirim Döngüsü&lt;/strong>: Kullanıcı, önerilerden birini seçerse, bu veri uzun vadeli hafızaya eklenir ve gelecekteki öneriler için kullanılır.&lt;/li>
&lt;/ol>
&lt;h3 id="4-avantajlar">4. Avantajlar&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Kişiselleştirme&lt;/strong>: Kullanıcı verileri ve gerçek zamanlı davranışlar, önerilerin alaka düzeyini artırır.&lt;/li>
&lt;li>&lt;strong>Ölçeklenebilirlik&lt;/strong>: RAG ve araç entegrasyonu, büyük ürün kataloglarıyla çalışmayı sağlar.&lt;/li>
&lt;li>&lt;strong>Verimlilik&lt;/strong>: Token optimizasyonu, bağlam penceresini etkili kullanır ve hızlı yanıtlar sağlar.&lt;/li>
&lt;li>&lt;strong>Gizlilik&lt;/strong>: Yalnızca ilgili veriler kullanılır ve bağlam budama ile gereksiz bilgiler hariç tutulur.&lt;/li>
&lt;/ul>
&lt;h3 id="5-zorluklar-ve-çözümler">5. Zorluklar ve Çözümler&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Zorluk&lt;/strong>: Çok fazla ürün verisi, bağlam penceresini doldurabilir.
&lt;ul>
&lt;li>&lt;strong>Çözüm&lt;/strong>: RAG ile yalnızca en yüksek eşleşme skoruna sahip 5-10 ürünü dahil edin.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Zorluk&lt;/strong>: Kullanıcı davranışlarındaki ani değişiklikler (örneğin, hediye alışverişi) önerileri bozabilir.
&lt;ul>
&lt;li>&lt;strong>Çözüm&lt;/strong>: Kullanıcıya niyetini doğrulatan bir mini prompt (örneğin, “Bu ürünü kendiniz için mi, hediye olarak mı arıyorsunuz?”).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Zorluk&lt;/strong>: API hataları veya eksik stok verileri.
&lt;ul>
&lt;li>&lt;strong>Çözüm&lt;/strong>: Hata kontrol mekanizmaları ekleyin; eksik veriler için LLM, varsayılan önerilere geçer.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="6-kullanılan-teknolojiler">6. Kullanılan Teknolojiler&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>LLM&lt;/strong>: OpenAI (Gpt4).&lt;/li>
&lt;li>&lt;strong>Vektör Veritabanı&lt;/strong>: Pinecone veya Weaviate.&lt;/li>
&lt;li>&lt;strong>Araçlar&lt;/strong>: LangChain (RAG ve bağlam yönetimi için), mevcut öneri motoru API’si.&lt;/li>
&lt;li>&lt;strong>Programlama&lt;/strong>: Python, JSON formatlama ve API entegrasyonları için.&lt;/li>
&lt;/ul>
&lt;h2 id="openai-ile-örnek-uygulama">OpenAI ile Örnek Uygulama&lt;/h2>
&lt;p>OpenAI&amp;rsquo;nin API&amp;rsquo;sini (örneğin, &lt;code>gpt-4&lt;/code> veya benzer bir model) kullanarak e-ticaret platformu için kişiselleştirilmiş ürün öneri sistemini uygulayan bir Python kodu örneği sunuyorum. Bu kod, önceki bağlam mühendisliği prensiplerini (RAG, hafıza yönetimi, token optimizasyonu, araç entegrasyonu) koruyor ve OpenAI&amp;rsquo;nin &lt;code>openai&lt;/code> kütüphanesi ile entegre oluyor. Grok 3 yerine OpenAI&amp;rsquo;nin modelini kullanıyoruz, ancak sistem mimarisi ve bağlam mühendisliği yaklaşımı aynı kalıyor.&lt;/p>
&lt;h3 id="ön-koşullar">Ön Koşullar&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Kütüphaneler&lt;/strong>: &lt;code>openai&lt;/code>, &lt;code>pinecone-client&lt;/code> (vektör veritabanı için), &lt;code>requests&lt;/code> (API çağrıları için), &lt;code>json&lt;/code> (yapılandırılmış veri yönetimi için).&lt;/li>
&lt;li>&lt;strong>Gereksinimler&lt;/strong>: Python 3.8+, OpenAI API anahtarı, Pinecone API anahtarı, bir öneri motoru API’si (veya simüle edilmiş bir hizmet).&lt;/li>
&lt;li>&lt;strong>Not&lt;/strong>: OpenAI API’sini kullanmak için bir API anahtarına ihtiyacınız var. Gerçek uygulamada, &lt;code>openai&lt;/code> kütüphanesini kullanarak &lt;code>gpt-4&lt;/code> veya başka bir modeli çağıracağız.&lt;/li>
&lt;/ul>
&lt;h3 id="kod">Kod&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">json&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">typing&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> Dict&lt;span style="color:#1f2328">,&lt;/span> List
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">pinecone&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> Pinecone&lt;span style="color:#1f2328">,&lt;/span> ServerlessSpec
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">openai&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> OpenAI
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># OpenAI API istemcisi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>openai_client &lt;span style="color:#0550ae">=&lt;/span> OpenAI&lt;span style="color:#1f2328">(&lt;/span>api_key&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;your-openai-api-key&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#57606a"># OpenAI API anahtarınızı buraya ekleyin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># OpenAI API çağrısı&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">call_openai_api&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>context&lt;span style="color:#1f2328">:&lt;/span> Dict&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Dict&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> OpenAI API&amp;#39;sini çağırarak öneriler üretir.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> :param context: Bağlam mühendisliği ile oluşturulan bağlam
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> :return: JSON formatında öneriler
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context_str &lt;span style="color:#0550ae">=&lt;/span> json&lt;span style="color:#0550ae">.&lt;/span>dumps&lt;span style="color:#1f2328">(&lt;/span>context&lt;span style="color:#1f2328">,&lt;/span> ensure_ascii&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">False&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response &lt;span style="color:#0550ae">=&lt;/span> openai_client&lt;span style="color:#0550ae">.&lt;/span>chat&lt;span style="color:#0550ae">.&lt;/span>completions&lt;span style="color:#0550ae">.&lt;/span>create&lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> model&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;gpt-4&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#57606a"># veya başka bir model, örneğin &amp;#34;gpt-4-turbo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> messages&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;role&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;system&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;content&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> context&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;system_prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;role&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;user&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;content&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Bağlam: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>context_str&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">Lütfen JSON formatında ürün önerileri üret.&amp;#34;&lt;/span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response_format&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;type&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;json_object&amp;#34;&lt;/span>&lt;span style="color:#1f2328">},&lt;/span> &lt;span style="color:#57606a"># JSON çıktısı için&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> max_tokens&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#57606a"># Yanıt için token sınırı&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> temperature&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">0.7&lt;/span> &lt;span style="color:#57606a"># Yaratıcılık seviyesi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Yanıtı JSON olarak döndür&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> json&lt;span style="color:#0550ae">.&lt;/span>loads&lt;span style="color:#1f2328">(&lt;/span>response&lt;span style="color:#0550ae">.&lt;/span>choices&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>message&lt;span style="color:#0550ae">.&lt;/span>content&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Bağlam Mühendisliği Sınıfı&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">ContextEngineer&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">__init__&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> pinecone_api_key&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> recommendation_api_url&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Bağlam mühendisliği yöneticisi.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> :param pinecone_api_key: Pinecone vektör veritabanı için API anahtarı
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> :param recommendation_api_url: Mevcut öneri motoru API&amp;#39;si
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>pc &lt;span style="color:#0550ae">=&lt;/span> Pinecone&lt;span style="color:#1f2328">(&lt;/span>api_key&lt;span style="color:#0550ae">=&lt;/span>pinecone_api_key&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>index_name &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;product-catalog&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>recommendation_api_url &lt;span style="color:#0550ae">=&lt;/span> recommendation_api_url
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>system_prompt &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Sen bir e-ticaret asistanısın. Görevin, kullanıcıya geçmiş satın alımları, tarama davranışları ve ürün kataloğuna dayalı olarak kişiselleştirilmiş ürün önerileri sunmaktır. Yanıtlarını kısa, kullanıcı dostu ve JSON formatında sun. Öneriler, kullanıcının ilgi alanlarına uygun olmalı ve stokta olan ürünleri içermeli. Gizliliğe saygı göster; yalnızca sağlanan verileri kullan.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Örnek çıktı:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;recommendations&amp;#34;: [
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;product_id&amp;#34;: &amp;#34;prod1&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;name&amp;#34;: &amp;#34;Ürün Adı&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;price&amp;#34;: 100,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;reason&amp;#34;: &amp;#34;Neden bu ürün önerildi.&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> ]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">initialize_vector_db&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Pinecone vektör veritabanını başlatır ve ürün kataloğunu yükler.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Örnek ürün verileri&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> products &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod1&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Nike Air Max Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;category&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Adidas Ultraboost Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;category&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod3&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Puma Siyah Tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;category&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">300&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Pinecone indeksini oluştur&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>index_name &lt;span style="color:#0550ae">not&lt;/span> &lt;span style="color:#0550ae">in&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>pc&lt;span style="color:#0550ae">.&lt;/span>list_indexes&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>names&lt;span style="color:#1f2328">():&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>pc&lt;span style="color:#0550ae">.&lt;/span>create_index&lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>index_name&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dimension&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">128&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#57606a"># Örnek embedding boyutu&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> metric&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;cosine&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> spec&lt;span style="color:#0550ae">=&lt;/span>ServerlessSpec&lt;span style="color:#1f2328">(&lt;/span>cloud&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;aws&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> region&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;us-west-2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Ürünleri vektör veritabanına ekle (basitleştirilmiş embedding)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>pc&lt;span style="color:#0550ae">.&lt;/span>Index&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>index_name&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> product &lt;span style="color:#0550ae">in&lt;/span> products&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Gerçek uygulamada, ürün açıklamaları için bir embedding modeli (örn. BERT) kullanılır&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> vector &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0550ae">0.1&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#0550ae">*&lt;/span> &lt;span style="color:#0550ae">128&lt;/span> &lt;span style="color:#57606a"># Simüle edilmiş embedding&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index&lt;span style="color:#0550ae">.&lt;/span>upsert&lt;span style="color:#1f2328">([(&lt;/span>product&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span> vector&lt;span style="color:#1f2328">,&lt;/span> product&lt;span style="color:#1f2328">)])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">fetch_user_data&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> user_id&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">:&lt;/span> Dict&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Dict&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Kullanıcı verilerini toplar (kısa ve uzun vadeli hafıza).
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Uzun vadeli hafıza (örnek veri)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> long_term_memory &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;user_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> user_id&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;mavi kot pantolon&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;siyah sırt çantası&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;preferences&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;casual giyim&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;sneaker&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Kısa vadeli hafıza (oturum verileri)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> short_term_memory &lt;span style="color:#0550ae">=&lt;/span> session_data
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;long_term&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> long_term_memory&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;short_term&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> short_term_memory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">retrieve_products&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> query&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> List&lt;span style="color:#1f2328">[&lt;/span>Dict&lt;span style="color:#1f2328">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> RAG kullanarak ürün kataloğundan ilgili ürünleri alır.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> index &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>pc&lt;span style="color:#0550ae">.&lt;/span>Index&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>index_name&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Simüle edilmiş vektör sorgusu (gerçekte, sorgu için embedding üretilir)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> query_vector &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0550ae">0.1&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#0550ae">*&lt;/span> &lt;span style="color:#0550ae">128&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results &lt;span style="color:#0550ae">=&lt;/span> index&lt;span style="color:#0550ae">.&lt;/span>query&lt;span style="color:#1f2328">(&lt;/span>vector&lt;span style="color:#0550ae">=&lt;/span>query_vector&lt;span style="color:#1f2328">,&lt;/span> top_k&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> include_metadata&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> products &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;metadata&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#cf222e">for&lt;/span> result &lt;span style="color:#0550ae">in&lt;/span> results&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;matches&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> result&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;metadata&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][&lt;/span>&lt;span style="color:#0a3069">&amp;#34;stock&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#57606a"># Yalnızca stokta olanlar&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> products
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">call_recommendation_api&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> user_data&lt;span style="color:#1f2328">:&lt;/span> Dict&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Dict&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Mevcut öneri motoru API&amp;#39;sini çağırır.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">try&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response &lt;span style="color:#0550ae">=&lt;/span> requests&lt;span style="color:#0550ae">.&lt;/span>post&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>recommendation_api_url&lt;span style="color:#1f2328">,&lt;/span> json&lt;span style="color:#0550ae">=&lt;/span>user_data&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> response&lt;span style="color:#0550ae">.&lt;/span>json&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">except&lt;/span> Exception &lt;span style="color:#cf222e">as&lt;/span> e&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;API hatası: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>e&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>&lt;span style="color:#0a3069">&amp;#34;recommendations&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[]}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">build_context&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> user_id&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">:&lt;/span> Dict&lt;span style="color:#1f2328">,&lt;/span> query&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Dict&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Bağlamı oluşturur ve optimize eder.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Kullanıcı verilerini topla&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user_data &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>fetch_user_data&lt;span style="color:#1f2328">(&lt;/span>user_id&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># RAG ile ürünleri al&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> retrieved_products &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>retrieve_products&lt;span style="color:#1f2328">(&lt;/span>query&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Öneri motoru API&amp;#39;sinden veri al&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> toolobserve&lt;span style="color:#1f2328">:&lt;/span> System&lt;span style="color:#1f2328">:&lt;/span> tool_output &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>call_recommendation_api&lt;span style="color:#1f2328">(&lt;/span>user_data&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Bağlamı oluştur&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;system_prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>system_prompt&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;user_data&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;current_search&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> query&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> user_data&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;long_term&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][&lt;/span>&lt;span style="color:#0a3069">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;preferences&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> user_data&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;long_term&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][&lt;/span>&lt;span style="color:#0a3069">&amp;#34;preferences&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;retrieved_products&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> retrieved_products&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;tool_output&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> tool_output
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Token optimizasyonu: Bağlam boyutu 32k token sınırını aşarsa budama&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context_str &lt;span style="color:#0550ae">=&lt;/span> json&lt;span style="color:#0550ae">.&lt;/span>dumps&lt;span style="color:#1f2328">(&lt;/span>context&lt;span style="color:#1f2328">,&lt;/span> ensure_ascii&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">False&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#6639ba">len&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>context_str&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">&amp;gt;&lt;/span> &lt;span style="color:#0550ae">32000&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#57606a"># Örnek token sınırı&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;retrieved_products&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> context&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;retrieved_products&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][:&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#57606a"># İlk 2 ürünü al&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;user_data&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][&lt;/span>&lt;span style="color:#0a3069">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> context&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;user_data&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][&lt;/span>&lt;span style="color:#0a3069">&amp;#34;past_purchases&amp;#34;&lt;/span>&lt;span style="color:#1f2328">][:&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#1f2328">]&lt;/span> &lt;span style="color:#57606a"># Son 1 satın alımı al&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> context
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">generate_recommendations&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> user_id&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">:&lt;/span> Dict&lt;span style="color:#1f2328">,&lt;/span> query&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Dict&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> Önerileri üretir.
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> context &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>build_context&lt;span style="color:#1f2328">(&lt;/span>user_id&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">,&lt;/span> query&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> response &lt;span style="color:#0550ae">=&lt;/span> call_openai_api&lt;span style="color:#1f2328">(&lt;/span>context&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> response
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Kullanım Örneği&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#953800">__name__&lt;/span> &lt;span style="color:#0550ae">==&lt;/span> &lt;span style="color:#0a3069">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Örnek yapılandırma&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> pinecone_api_key &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;your-pinecone-api-key&amp;#34;&lt;/span> &lt;span style="color:#57606a"># Gerçek anahtarınızı kullanın&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> recommendation_api_url &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;http://example-recommendintregration-api.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Bağlam mühendisini başlat&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> engineer &lt;span style="color:#0550ae">=&lt;/span> ContextEngineer&lt;span style="color:#1f2328">(&lt;/span>pinecone_api_key&lt;span style="color:#1f2328">,&lt;/span> recommendation_api_url&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> engineer&lt;span style="color:#0550ae">.&lt;/span>initialize_vector_db&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Örnek kullanıcı verileri&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> user_id &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;user789&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> session_data &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;session_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;12345&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;current_search&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;kırmızı spor ayakkabı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;cart&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;beyaz tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;clicks&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;nike koşu ayakkabısı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;adidas tişört&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Önerileri üret&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> recommendations &lt;span style="color:#0550ae">=&lt;/span> engineer&lt;span style="color:#0550ae">.&lt;/span>generate_recommendations&lt;span style="color:#1f2328">(&lt;/span>user_id&lt;span style="color:#1f2328">,&lt;/span> session_data&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;kırmızı spor ayakkabı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Sonuçları yazdır&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>json&lt;span style="color:#0550ae">.&lt;/span>dumps&lt;span style="color:#1f2328">(&lt;/span>recommendations&lt;span style="color:#1f2328">,&lt;/span> indent&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> ensure_ascii&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">False&lt;/span>&lt;span style="color:#1f2328">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="kod-açıklaması">Kod Açıklaması&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>OpenAI Entegrasyonu&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;code>call_openai_api&lt;/code> fonksiyonu, OpenAI’nin &lt;code>gpt-4&lt;/code> modelini çağırır ve bağlamı JSON formatında işleyerek yapılandırılmış öneriler üretir.&lt;/li>
&lt;li>&lt;code>response_format={&amp;quot;type&amp;quot;: &amp;quot;json_object&amp;quot;}&lt;/code> parametresi, çıktının JSON formatında olmasını sağlar.&lt;/li>
&lt;li>&lt;code>max_tokens&lt;/code> ve &lt;code>temperature&lt;/code> parametreleri, yanıt uzunluğunu ve yaratıcılık seviyesini kontrol eder.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Bağlam Mühendisliği Teknikleri&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>RAG&lt;/strong>: Pinecone vektör veritabanı, ürün kataloğundan ilgili ürünleri almak için kullanılır.&lt;/li>
&lt;li>&lt;strong>Hafıza Yönetimi&lt;/strong>: Kullanıcı verileri kısa vadeli (oturum verileri) ve uzun vadeli (kullanıcı profili) hafıza olarak toplanır.&lt;/li>
&lt;li>&lt;strong>Token Optimizasyonu&lt;/strong>: Bağlam boyutu 32k token sınırını aşarsa, ürünler ve geçmiş satın alımlar sınırlandırılır.&lt;/li>
&lt;li>&lt;strong>Araç Entegrasyonu&lt;/strong>: Öneri motoru API’si ve Pinecone’dan alınan veriler bağlama entegre edilir.&lt;/li>
&lt;li>&lt;strong>Yapılandırılmış Çıktı&lt;/strong>: OpenAI, JSON formatında tutarlı öneriler üretir.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Örnek Çıktı&lt;/strong>:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;recommendations&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;product_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod1&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Nike Air Max Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;reason&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Aramanıza uygun, casual giyim tarzınıza uyan popüler bir sneaker.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;product_id&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;prod2&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Adidas Ultraboost Kırmızı&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;price&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1500&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;reason&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Yüksek performanslı kırmızı sneaker, son aramanızla uyumlu.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="kurulum-ve-çalıştırma">Kurulum ve Çalıştırma&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Kütüphaneleri Yükleyin&lt;/strong>:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install openai pinecone-client requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>OpenAI API Anahtarı&lt;/strong>: OpenAI’ye kaydolun ve bir API anahtarı alın (&lt;code>your-openai-api-key&lt;/code> yerine ekleyin).&lt;/li>
&lt;li>&lt;strong>Pinecone API Anahtarı&lt;/strong>: Pinecone’a kaydolun ve bir API anahtarı alın.&lt;/li>
&lt;li>&lt;strong>Öneri API’si&lt;/strong>: Şirket içi bir öneri motoru API’si URL’sini sağlayın veya simüle edilmiş bir API kullanın.&lt;/li>
&lt;li>&lt;strong>Kodu Çalıştırın&lt;/strong>:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>python recommendation_system_openai.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h3 id="sınırlamalar-ve-iyileştirmeler">Sınırlamalar ve İyileştirmeler&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Sınırlamalar&lt;/strong>:
&lt;ul>
&lt;li>Embedding üretimi basitleştirilmiştir; gerçek uygulamada BERT veya benzeri bir model kullanılmalı.&lt;/li>
&lt;li>Hata yönetimi basittir; üretimde daha sağlam hata kontrolü eklenmeli.&lt;/li>
&lt;li>Örnek veri seti küçüktür; gerçek dünyada daha büyük bir ürün kataloğu gerekir.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>İyileştirmeler&lt;/strong>:
&lt;ul>
&lt;li>&lt;strong>Dinamik Özetleme&lt;/strong>: Büyük bağlamları özetlemek için bir özetleme modeli entegre edin.&lt;/li>
&lt;li>&lt;strong>Geri Bildirim Döngüsü&lt;/strong>: Kullanıcı seçimlerini uzun vadeli hafızaya kaydederek önerileri iyileştirin.&lt;/li>
&lt;li>&lt;strong>Çok Ajanlı Sistem&lt;/strong>: Önerileri doğrulamak için bir doğrulama ajanı ekleyin.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="ek-notlar">Ek Notlar&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Gizlilik&lt;/strong>: Kod, yalnızca ilgili kullanıcı verilerini kullanır ve bağlam budama ile gereksiz verileri hariç tutar.&lt;/li>
&lt;li>&lt;strong>Ölçeklenebilirlik&lt;/strong>: Pinecone ve modüler tasarım, büyük ürün katalogları ve kullanıcı tabanları için uygundur.&lt;/li>
&lt;li>&lt;strong>Uyarlama&lt;/strong>: Kodu başka bir sektöre (örneğin, sağlık veya eğitim) uyarlamak için veri kaynaklarını ve sistem promptunu değiştirin.&lt;/li>
&lt;/ul>
&lt;h2 id="sonuç">Sonuç&lt;/h2>
&lt;p>Bağlam mühendisliği, prompt mühendisliğinin ötesine geçerek dinamik, bağlam farkında sistemler yaratmada bir paradigma değişimi temsil eder. Talimatları, hafızayı, alınan verileri ve araçları dikkatle düzenleyerek, bağlam mühendisleri LLM’lerin doğru, tutarlı ve ölçeklenebilir sonuçlar sunmasını sağlar. Organizasyonlar, ajan sistemlerini benimsedikçe ve yapay zekayı kritik iş akışlarına entegre ettikçe, bağlam mühendisliğini ustalaşmak, LLM’lerin tüm potansiyelini açığa çıkarmak için vazgeçilmez olacaktır.&lt;/p>
&lt;h3 id="kaynaklar">Kaynaklar&lt;/h3>
&lt;ul>
&lt;li>blog.langchain.com, &amp;ldquo;Bağlam mühendisliğinin yükselişi&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://www.philschmid.de">www.philschmid.de&lt;/a>, &amp;ldquo;Yapay zekadaki yeni beceri prompt değil, bağlam mühendisliği&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://www.llamaindex.ai">www.llamaindex.ai&lt;/a>, &amp;ldquo;Bağlam Mühendisliği - Nedir ve dikkate alınması gereken teknikler&amp;rdquo;&lt;/li>
&lt;li>blog.langchain.com, &amp;ldquo;Bağlam Mühendisliği&amp;rdquo;&lt;/li>
&lt;li>medium.com, &amp;ldquo;Bağlam Mühendisliğini Anlama&amp;rdquo;&lt;/li>
&lt;li>medium.com, &amp;ldquo;Bağlam Mühendisliği: Yapay Zeka Stratejisini Yükseltme&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://www.datacamp.com">www.datacamp.com&lt;/a>, &amp;ldquo;Bağlam Mühendisliği: Örneklerle Bir Rehber&amp;rdquo;&lt;/li>
&lt;li>simonwillison.net, &amp;ldquo;Bağlam mühendisliği&amp;rdquo;&lt;/li>
&lt;li>github.com, &amp;ldquo;davidkimai/Context-Engineering&amp;rdquo;&lt;/li>
&lt;li>github.com, &amp;ldquo;coleam00/context-engineering-intro&amp;rdquo;&lt;/li>
&lt;li>thenewstack.io, &amp;ldquo;Bağlam Mühendisliği: Prompt Mühendisliği ve RAG’in Ötesine Geçme&amp;rdquo;&lt;/li>
&lt;li>medium.com, &amp;ldquo;Bağlam Mühendisliği vs Prompt Mühendisliği&amp;rdquo;&lt;/li>
&lt;li>news.ycombinator.com, &amp;ldquo;Yapay zekadaki yeni beceri prompt değil, bağlam mühendisliği&amp;rdquo;&lt;/li>
&lt;li>ramp.com, &amp;ldquo;Bağlam Mühendisliği Nedir?&amp;rdquo;&lt;/li>
&lt;li>natesnewsletter.substack.com, &amp;ldquo;Mükemmel Prompt’un Ötesinde&amp;rdquo;&lt;/li>
&lt;li>nlp.elvissaravia.com, &amp;ldquo;Bağlam Mühendisliği Rehberi&amp;rdquo;&lt;/li>
&lt;li>&lt;a href="https://www.promptingguide.ai">www.promptingguide.ai&lt;/a>, &amp;ldquo;Bağlam Mühendisliği Rehberi&amp;rdquo;&lt;/li>
&lt;li>rlancemartin.github.io, &amp;ldquo;Ajanlar için Bağlam Mühendisliği&amp;rdquo;&lt;/li>
&lt;li>blog.getzep.com, &amp;ldquo;Bağlam Mühendisliği Nedir?&amp;rdquo;&lt;/li>
&lt;li>boristane.com, &amp;ldquo;Bağlam mühendisliği yapay zekayı sihirli kılıyor&amp;rdquo;&lt;/li>
&lt;li>datasciencedojo.com, &amp;ldquo;Bağlam Mühendisliği Nedir? Güvenilir Yapay Zeka ve RAG Sistemleri için Yeni Temel&amp;rdquo;&lt;/li>
&lt;li>labs.adaline.ai, &amp;ldquo;Yapay Zeka Ajanları için Bağlam Mühendisliği Nedir?&amp;rdquo;&lt;/li>
&lt;li>@LangChainAI, &amp;ldquo;Bağlam Mühendisliği&amp;rdquo;&lt;/li>
&lt;li>@abhirb, &amp;ldquo;Bağlam Mühendisliği = LLM’nin düşünme şeklini tasarlama&amp;rdquo;&lt;/li>
&lt;/ul></content></entry><entry><title>MCP ve Continue ile Yerel AI Modellerini Kullanmak</title><author><name/><uri/></author><id>https://hozgan.com/mcp-ve-continue-ile-local-copilot/</id><updated>2025-06-16T00:00:00Z</updated><published>2025-06-16T00:00:00Z</published><content type="html">&lt;h1 id="yerel-copilot-kurulum-rehberi-mcp--continue--vscode--ollama">Yerel Copilot Kurulum Rehberi: MCP + Continue + VSCode + Ollama&lt;/h1>
&lt;h2 id="genel-bakış">Genel Bakış&lt;/h2>
&lt;p>Bu rehber, tamamen yerel çalışan bir AI kod asistanı kurmak için gerekli tüm adımları içerir. GitHub Copilot&amp;rsquo;a benzer özellikleri ücretsiz ve gizlilik odaklı bir şekilde elde edebilirsiniz.&lt;/p>
&lt;h2 id="gerekli-bileşenler">Gerekli Bileşenler&lt;/h2>
&lt;h3 id="1-ollama---ai-model-sunucusu">1. &lt;strong>Ollama&lt;/strong> - AI Model Sunucusu&lt;/h3>
&lt;ul>
&lt;li>Yerel olarak LLM&amp;rsquo;leri çalıştırmak için&lt;/li>
&lt;li>GPU/CPU optimizasyonu ile hızlı inference&lt;/li>
&lt;li>Kolay model yönetimi&lt;/li>
&lt;/ul>
&lt;h3 id="2-continue---vscode-ai-uzantısı">2. &lt;strong>Continue&lt;/strong> - VSCode AI Uzantısı&lt;/h3>
&lt;ul>
&lt;li>VSCode içinde AI kod tamamlama&lt;/li>
&lt;li>Chat interface ve kod açıklamaları&lt;/li>
&lt;li>Çoklu provider desteği&lt;/li>
&lt;/ul>
&lt;h3 id="3-mcp-model-context-protocol---bağlam-yönetimi">3. &lt;strong>MCP (Model Context Protocol)&lt;/strong> - Bağlam Yönetimi&lt;/h3>
&lt;ul>
&lt;li>Gelişmiş kod bağlamı paylaşımı&lt;/li>
&lt;li>Proje yapısını AI&amp;rsquo;ya aktarma&lt;/li>
&lt;li>Daha akıllı öneriler için&lt;/li>
&lt;/ul>
&lt;h2 id="adım-1-ollama-kurulumu">Adım 1: Ollama Kurulumu&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Homebrew ile&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>brew install ollama
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Veya direkt indirin: https://ollama.ai/download&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="ollama-servisini-başlatma">Ollama Servisini Başlatma&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Ollama daemon&amp;#39;unu başlat&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama serve
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Yeni terminal açıp test edin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="adım-2-en-iyi-kod-modellerini-indirme">Adım 2: En İyi Kod Modellerini İndirme&lt;/h2>
&lt;h3 id="önerilen-modeller-performans-sırası">Önerilen Modeller (Performans Sırası)&lt;/h3>
&lt;h4 id="1-codeqwen-25-coder-7b-en-iyi-genel-performans">1. &lt;strong>CodeQwen 2.5 Coder 7B&lt;/strong> (En İyi Genel Performans)&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ollama pull codeqwen:7b-code
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Artıları&lt;/strong>: Çok hızlı, düşük RAM kullanımı (8GB), mükemmel kod tamamlama&lt;/li>
&lt;li>&lt;strong>Kullanım&lt;/strong>: Günlük kodlama için ideal&lt;/li>
&lt;/ul>
&lt;h4 id="2-deepseek-coder-v2-16b-en-iyi-kalite">2. &lt;strong>DeepSeek Coder V2 16B&lt;/strong> (En İyi Kalite)&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ollama pull deepseek-coder-v2:16b
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Artıları&lt;/strong>: Üstün kod kalitesi, karmaşık problemleri çözme&lt;/li>
&lt;li>&lt;strong>Gereksinim&lt;/strong>: 16GB+ RAM, daha yavaş&lt;/li>
&lt;/ul>
&lt;h4 id="3-code-llama-13b-dengeli-seçenek">3. &lt;strong>Code Llama 13B&lt;/strong> (Dengeli Seçenek)&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ollama pull codellama:13b-code
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Artıları&lt;/strong>: İyi performans/hız dengesi, Meta desteği&lt;/li>
&lt;li>&lt;strong>Gereksinim&lt;/strong>: 12GB RAM&lt;/li>
&lt;/ul>
&lt;h4 id="4-qwen25-coder-3b-düşük-kaynak">4. &lt;strong>Qwen2.5 Coder 3B&lt;/strong> (Düşük Kaynak)&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ollama pull qwen2.5-coder:3b
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Artıları&lt;/strong>: Çok az RAM (4GB), hızlı&lt;/li>
&lt;li>&lt;strong>Kullanım&lt;/strong>: Zayıf donanım için&lt;/li>
&lt;/ul>
&lt;h3 id="model-performans-karşılaştırması">Model Performans Karşılaştırması&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Model&lt;/th>
&lt;th>RAM Gereksinimi&lt;/th>
&lt;th>Hız&lt;/th>
&lt;th>Kod Kalitesi&lt;/th>
&lt;th>Çok Dilli Destek&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CodeQwen 2.5 7B&lt;/td>
&lt;td>8GB&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DeepSeek V2 16B&lt;/td>
&lt;td>16GB+&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Code Llama 13B&lt;/td>
&lt;td>12GB&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Qwen2.5 3B&lt;/td>
&lt;td>4GB&lt;/td>
&lt;td>⭐⭐⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐&lt;/td>
&lt;td>⭐⭐⭐⭐&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="adım-3-vscode-ve-continue-kurulumu">Adım 3: VSCode ve Continue Kurulumu&lt;/h2>
&lt;h3 id="vscode-uzantısını-yükleme">VSCode Uzantısını Yükleme&lt;/h3>
&lt;ol>
&lt;li>VSCode&amp;rsquo;u açın&lt;/li>
&lt;li>Extensions (Ctrl+Shift+X) bölümüne gidin&lt;/li>
&lt;li>&amp;ldquo;Continue&amp;rdquo; araması yapın&lt;/li>
&lt;li>&amp;ldquo;Continue - Codestral, Claude, and more&amp;rdquo; uzantısını yükleyin&lt;/li>
&lt;/ol>
&lt;h3 id="continue-konfigürasyonu">Continue Konfigürasyonu&lt;/h3>
&lt;p>Continue uzantısını yükledikten sonra konfigürasyon dosyasını düzenleyin:&lt;/p>
&lt;p>&lt;strong>Windows&lt;/strong>: &lt;code>%USERPROFILE%\.continue\config.json&lt;/code>
&lt;strong>macOS/Linux&lt;/strong>: &lt;code>~/.continue/config.json&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;models&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;CodeQwen 7B&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;provider&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;model&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;codeqwen:7b-code&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;DeepSeek Coder&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;provider&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;model&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;deepseek-coder-v2:16b&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;tabAutocompleteModel&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;title&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;CodeQwen Autocomplete&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;provider&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;model&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;codeqwen:7b-code&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;embeddingsProvider&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;provider&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;ollama&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;model&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;nomic-embed-text&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;apiBase&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;http://localhost:11434&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;contextProviders&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;code&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;docs&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;diff&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;terminal&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;problems&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;folder&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;codebase&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;params&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="adım-4-mcp-kurulumu-ve-konfigürasyonu">Adım 4: MCP Kurulumu ve Konfigürasyonu&lt;/h2>
&lt;h3 id="mcp-sunucularını-yükleme">MCP Sunucularını Yükleme&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># npm ile MCP araçlarını yükleyin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm install -g @modelcontextprotocol/server-filesystem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm install -g @modelcontextprotocol/server-git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm install -g @modelcontextprotocol/server-sqlite
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="continue-için-mcp-konfigürasyonu">Continue için MCP Konfigürasyonu&lt;/h3>
&lt;p>Config dosyanıza MCP bölümünü ekleyin:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;mcpServers&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;filesystem&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;command&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;npx&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;args&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;@modelcontextprotocol/server-filesystem&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;/path/to/your/projects&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;git&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;command&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;npx&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;args&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;@modelcontextprotocol/server-git&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="adım-5-gelişmiş-optimizasyonlar">Adım 5: Gelişmiş Optimizasyonlar&lt;/h2>
&lt;h3 id="ollama-performans-ayarları">Ollama Performans Ayarları&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># GPU kullanımını optimize etme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">OLLAMA_NUM_GPU&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">OLLAMA_GPU_OVERHEAD&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Paralel istekleri artırma &lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">OLLAMA_NUM_PARALLEL&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">OLLAMA_MAX_LOADED_MODELS&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="continue-gelişmiş-ayarları">Continue Gelişmiş Ayarları&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;allowAnonymousTelemetry&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">false&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;completionOptions&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;temperature&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">0.1&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;topP&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">0.9&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;maxTokens&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">1024&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;presencePenalty&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">0.0&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;frequencyPenalty&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;requestOptions&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;timeout&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0550ae">10000&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;verifySsl&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#cf222e">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="kullanım-kılavuzu">Kullanım Kılavuzu&lt;/h2>
&lt;h3 id="temel-özellikler">Temel Özellikler&lt;/h3>
&lt;h4 id="1-otomatik-kod-tamamlama">1. &lt;strong>Otomatik Kod Tamamlama&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Yazmaya başladığınızda otomatik öneriler&lt;/li>
&lt;li>Tab ile kabul etme&lt;/li>
&lt;li>Esc ile reddetme&lt;/li>
&lt;/ul>
&lt;h4 id="2-chat-interface">2. &lt;strong>Chat Interface&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>&lt;code>Ctrl+Shift+P&lt;/code> → &amp;ldquo;Continue: Open Chat&amp;rdquo;&lt;/li>
&lt;li>Kod hakkında soru sorma&lt;/li>
&lt;li>Kod açıklama ve refactoring&lt;/li>
&lt;/ul>
&lt;h4 id="3-kod-seçimi-ve-işleme">3. &lt;strong>Kod Seçimi ve İşleme&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Kodu seçin → Sağ tık → Continue menüsü&lt;/li>
&lt;li>&amp;ldquo;Explain Code&amp;rdquo;, &amp;ldquo;Refactor&amp;rdquo;, &amp;ldquo;Add Comments&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h4 id="4-terminal-entegrasyonu">4. &lt;strong>Terminal Entegrasyonu&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Terminal komutlarını AI&amp;rsquo;ya sorabilirsiniz&lt;/li>
&lt;li>Hata çözümü için yardım alın&lt;/li>
&lt;/ul>
&lt;h3 id="ileri-seviye-kullanım">İleri Seviye Kullanım&lt;/h3>
&lt;h4 id="özel-promptlar-oluşturma">Özel Promptlar Oluşturma&lt;/h4>
&lt;p>&lt;code>~/.continue/config.json&lt;/code> dosyasına özel slash komutları ekleyin:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;slashCommands&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;review&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;description&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Kod incelemesi yap&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Bu kodu incele ve iyileştirme önerileri sun. Güvenlik açıkları, performans sorunları ve kod kalitesi açısından değerlendir.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;test&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;description&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Unit test oluştur&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Bu kod için kapsamlı unit testler yaz. Edge case&amp;#39;leri de kapsa.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;name&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;docs&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;description&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Dokümantasyon yaz&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">&amp;#34;prompt&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Bu kod için detaylı dokümantasyon yazısı oluştur. Parametreler, return değerleri ve kullanım örnekleri dahil et.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="sorun-giderme">Sorun Giderme&lt;/h2>
&lt;h3 id="yaygın-problemler-ve-çözümleri">Yaygın Problemler ve Çözümleri&lt;/h3>
&lt;h4 id="1-ollama-bağlantı-hatası">1. &lt;strong>Ollama Bağlantı Hatası&lt;/strong>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Ollama servisinin çalıştığını kontrol edin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>netstat -an &lt;span style="color:#1f2328">|&lt;/span> grep &lt;span style="color:#0550ae">11434&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Yeniden başlatın&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama serve
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-yavaş-performans">2. &lt;strong>Yavaş Performans&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Daha küçük model kullanın (3B veya 7B)&lt;/li>
&lt;li>GPU sürücülerini güncelleyin&lt;/li>
&lt;li>RAM miktarını kontrol edin&lt;/li>
&lt;/ul>
&lt;h4 id="3-kod-tamamlama-çalışmıyor">3. &lt;strong>Kod Tamamlama Çalışmıyor&lt;/strong>&lt;/h4>
&lt;ul>
&lt;li>Continue uzantısının aktif olduğunu kontrol edin&lt;/li>
&lt;li>Config dosyasındaki model adlarını doğrulayın&lt;/li>
&lt;li>VSCode&amp;rsquo;u yeniden başlatın&lt;/li>
&lt;/ul>
&lt;h4 id="4-model-indirme-sorunları">4. &lt;strong>Model İndirme Sorunları&lt;/strong>&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Manuel model indirme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama pull codeqwen:7b-code --verbose
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># İndirilen modelleri kontrol etme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ollama list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="performans-metrikleri">Performans Metrikleri&lt;/h2>
&lt;h3 id="donanım-önerileri">Donanım Önerileri&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kullanım Seviyesi&lt;/th>
&lt;th>CPU&lt;/th>
&lt;th>RAM&lt;/th>
&lt;th>GPU&lt;/th>
&lt;th>Önerilen Model&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Temel&lt;/td>
&lt;td>4 core&lt;/td>
&lt;td>8GB&lt;/td>
&lt;td>İsteğe bağlı&lt;/td>
&lt;td>Qwen2.5 3B&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Orta&lt;/td>
&lt;td>6 core&lt;/td>
&lt;td>16GB&lt;/td>
&lt;td>GTX 1060+&lt;/td>
&lt;td>CodeQwen 7B&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>İleri&lt;/td>
&lt;td>8+ core&lt;/td>
&lt;td>32GB+&lt;/td>
&lt;td>RTX 3070+&lt;/td>
&lt;td>DeepSeek V2 16B&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="hız-karşılaştırması-tokensaniye">Hız Karşılaştırması (Token/saniye)&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Qwen2.5 3B&lt;/strong>: ~40-60 token/s (CPU)&lt;/li>
&lt;li>&lt;strong>CodeQwen 7B&lt;/strong>: ~25-35 token/s (CPU), ~80-120 token/s (GPU)&lt;/li>
&lt;li>&lt;strong>DeepSeek V2 16B&lt;/strong>: ~15-25 token/s (CPU), ~50-80 token/s (GPU)&lt;/li>
&lt;/ul>
&lt;h2 id="güvenlik-ve-gizlilik">Güvenlik ve Gizlilik&lt;/h2>
&lt;h3 id="avantajlar">Avantajlar&lt;/h3>
&lt;ul>
&lt;li>Tüm veriler yerel kalır&lt;/li>
&lt;li>İnternet bağlantısı gerekmez&lt;/li>
&lt;li>Kod şirket dışına çıkmaz&lt;/li>
&lt;li>GDPR uyumlu&lt;/li>
&lt;/ul>
&lt;h3 id="en-iyi-güvenlik-uygulamaları">En İyi Güvenlik Uygulamaları&lt;/h3>
&lt;ul>
&lt;li>Ollama&amp;rsquo;yı sadece localhost&amp;rsquo;ta çalıştırın&lt;/li>
&lt;li>Firewall kurallarını kontrol edin&lt;/li>
&lt;li>Hassas projelerde ağ bağlantısını kesin&lt;/li>
&lt;/ul>
&lt;h2 id="sonuç-ve-öneriler">Sonuç ve Öneriler&lt;/h2>
&lt;h3 id="en-iyi-kurulum-çoğu-kullanıcı-için">En İyi Kurulum (Çoğu Kullanıcı İçin)&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Model&lt;/strong>: CodeQwen 7B&lt;/li>
&lt;li>&lt;strong>RAM&lt;/strong>: 16GB minimum&lt;/li>
&lt;li>&lt;strong>GPU&lt;/strong>: Opsiyonel ama önerilen&lt;/li>
&lt;/ol>
&lt;h3 id="gelişmiş-kullanıcılar-için">Gelişmiş Kullanıcılar İçin&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Model&lt;/strong>: DeepSeek Coder V2 16B&lt;/li>
&lt;li>&lt;strong>RAM&lt;/strong>: 32GB+&lt;/li>
&lt;li>&lt;strong>GPU&lt;/strong>: RTX 3070 veya üzeri&lt;/li>
&lt;/ol>
&lt;p>Bu kurulum ile GitHub Copilot&amp;rsquo;a rakip, hatta bazı konularda daha iyi performans gösteren yerel bir AI kod asistanına sahip olacaksınız. Tüm verileriniz güvende kalacak ve internet bağlantısı olmadan bile çalışabileceksiniz.&lt;/p>
&lt;h2 id="mcp-entegrasyonu-nasıl-çalışır">MCP Entegrasyonu Nasıl Çalışır?&lt;/h2>
&lt;p>Model Context Protocol (MCP), modellerin dış dünya ile etkileşim kurmasını sağlayan güçlü bir araçtır. İşleyiş mantığı şu şekildedir:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Araç Tanıtımı&lt;/strong>: Mevcut araçlar JSON formatında modele sunulur&lt;/li>
&lt;li>&lt;strong>Model Kararı&lt;/strong>: Model yanıtında bir araç çağrısı yapmayı seçebilir&lt;/li>
&lt;li>&lt;strong>İzin Süreci&lt;/strong>: Kullanıcı onayı (otomatik politika varsa atlanır)&lt;/li>
&lt;li>&lt;strong>Araç Çalıştırma&lt;/strong>: Continue, MCP sunucusu üzerinden aracı çalıştırır&lt;/li>
&lt;li>&lt;strong>Sonuç Döndürme&lt;/strong>: Sonuç modele geri gönderilir&lt;/li>
&lt;li>&lt;strong>Döngü&lt;/strong>: Model potansiyel olarak başka araç çağrıları yapabilir&lt;/li>
&lt;/ol>
&lt;h2 id="pratik-uygulama-playwright-mcp-sunucusu">Pratik Uygulama: Playwright MCP Sunucusu&lt;/h2>
&lt;p>Gerçek bir örnek üzerinden MCP&amp;rsquo;nin gücünü görelim:&lt;/p>
&lt;h3 id="kurulum-adımları">Kurulum Adımları&lt;/h3>
&lt;ol>
&lt;li>Çalışma alanınızın kök dizininde &lt;code>.continue/mcpServers&lt;/code> klasörü oluşturun&lt;/li>
&lt;li>Bu klasörde &lt;code>playwright-mcp.yaml&lt;/code> dosyası oluşturun&lt;/li>
&lt;li>Aşağıdaki yapılandırmayı ekleyin:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Playwright mcpServer&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">version&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">0.0.1&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">schema&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>v1&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">mcpServers&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>- &lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Browser search&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">command&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>npx&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">args&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- &lt;span style="color:#0a3069">&amp;#34;@playwright/mcp@latest&amp;#34;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="test-senaryosu">Test Senaryosu&lt;/h3>
&lt;p>Kurulumu test etmek için şu görevi deneyin:&lt;/p>
&lt;p>&lt;em>&amp;ldquo;Playwright kullanarak &lt;a href="https://news.ycombinator.com">https://news.ycombinator.com&lt;/a> adresine git, ana sayfadaki ilk 4 gönderinin başlık ve URL&amp;rsquo;lerini çıkar, proje kök dizininde hn.txt dosyası oluştur ve bu listeyi düz metin olarak kaydet.&amp;rdquo;&lt;/em>&lt;/p>
&lt;p>Bu komut sonucunda, otomatik olarak &lt;code>hn.txt&lt;/code> dosyası oluşturulacak ve istenen veriler içerisine kaydedilecektir.&lt;/p>
&lt;h2 id="model-yapılandırması">Model Yapılandırması&lt;/h2>
&lt;p>Yerel modellerinizi kullanmak için &lt;code>.continue/models&lt;/code> klasöründe yapılandırma dosyası oluşturun:&lt;/p>
&lt;h3 id="ollama">OLLAMA&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Ollama Devstral model&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">version&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">0.0.1&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">schema&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>v1&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">models&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- &lt;span style="color:#0550ae">provider&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>ollama&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">model&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>unsloth/devstral-small-2505-gguf:Q4_K_M&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">defaultCompletionOptions&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">contextLength&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">8192&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Ollama Devstral-Small&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">roles&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- chat&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- edit&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="avantajları">Avantajları&lt;/h2>
&lt;p>Bu kurulum size şu faydaları sağlar:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Gizlilik&lt;/strong>: Tüm verileriniz yerel makinenizde kalır&lt;/li>
&lt;li>&lt;strong>Esneklik&lt;/strong>: Farklı görevler için farklı modeller kullanabilirsiniz&lt;/li>
&lt;li>&lt;strong>Özelleştirme&lt;/strong>: Özel araçlar ve MCP sunucuları ekleyebilirsiniz&lt;/li>
&lt;li>&lt;strong>Maliyet&lt;/strong>: Bulut API&amp;rsquo;leri için ödeme yapmanıza gerek yok&lt;/li>
&lt;li>&lt;strong>Hız&lt;/strong>: Yerel çalışma sayesinde daha düşük gecikme süreleri&lt;/li>
&lt;/ul>
&lt;h2 id="sonuç">Sonuç&lt;/h2>
&lt;p>MCP ve Continue kombinasyonu, modern yazılım geliştirmenin ihtiyaçlarını karşılayan güçlü bir çözüm sunuyor. Verilerinizin gizliliğini korurken, yapay zeka destekli geliştirme deneyiminden faydalanabilirsiniz.&lt;/p>
&lt;p>Bu teknolojiler sayesinde, web otomasyonundan dosya yönetimine kadar uzanan geniş bir araç yelpazesini AI asistanınıza entegre edebilir, tümüyle yerel bir ortamda çalışabilirsiniz. Geliştirme iş akışınızı bir üst seviyeye taşımaya hazır mısınız? Continue Hub&amp;rsquo;daki farklı MCP sunucularını keşfederek başlayabilirsiniz.&lt;/p></content></entry><entry><title>Yapay Zeka'nın Geleceği ve Girişimler için Stratejik Rehber 2025</title><author><name/><uri/></author><id>https://hozgan.com/girisimler-icin-yapay-zekanin-gelecegi-raporu/</id><updated>2025-06-15T00:00:00Z</updated><published>2025-06-15T00:00:00Z</published><content type="html">&lt;p>&lt;em>Google Cloud&amp;rsquo;un &amp;ldquo;Future of AI: Perspectives for Startups 2025&amp;rdquo; raporundan derlenmiştir&lt;/em>&lt;/p>
&lt;h2 id="giriş-ai-devriminin-merkezi">Giriş: AI Devriminin Merkezi&lt;/h2>
&lt;p>Yapay zeka (AI), dünya çapında her organizasyonu dönüştürüyor ve karmaşık sorunları çözme, büyüme sağlama ve yeni iş fırsatları yaratma konusunda eşi görülmemiş bir fırsat sunuyor. Google Cloud CEO&amp;rsquo;su &lt;strong>Thomas Kurian&lt;/strong>&amp;lsquo;ın belirttiği gibi, özellikle startup&amp;rsquo;lar için bu durum çok daha kritik:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI, startup&amp;rsquo;lar için hızlı bir şekilde hareket etme ve yeni pazar fırsatlarını ele alma konusunda benzersiz avantajlar sunuyor. Google Cloud, AI inovasyonunun merkezinde yer alıyor ve dünya çapında tüm fonlanan generatif AI startup&amp;rsquo;larının %60&amp;rsquo;ından fazlasına hizmet veriyor.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="ai-teknolojisindeki-son-gelişmeler">AI Teknolojisindeki Son Gelişmeler&lt;/h2>
&lt;h3 id="gemini-20-yeni-nesil-ai-modelleri">Gemini 2.0: Yeni Nesil AI Modelleri&lt;/h3>
&lt;p>Google DeepMind VP Product &lt;strong>David Thacker&lt;/strong>, Gemini 2.0 modellerinin getirdiği devrim niteliğindeki yenilikleri şöyle açıklıyor:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Natively Multimodal&lt;/strong>: Metin, görüntü, ses ve video işleme kabiliyeti&lt;/li>
&lt;li>&lt;strong>2 milyon token&amp;rsquo;a kadar uzun bağlam pencereleri&lt;/strong>: Derin anlayış ve hafıza gerektiren gelişmiş uygulamalar&lt;/li>
&lt;li>&lt;strong>Thinking Model&lt;/strong>: Matematik ve bilim alanlarında karmaşık problem çözme yetenekleri&lt;/li>
&lt;li>&lt;strong>Google Search entegrasyonu&lt;/strong>: Gerçek zamanlı bilgi erişimi&lt;/li>
&lt;li>&lt;strong>Project Mariner&lt;/strong>: Web tarayıcısı kullanarak görevleri tamamlayan ajanlar&lt;/li>
&lt;li>&lt;strong>Multimodal Live API&lt;/strong>: Ses ve video streaming girişi kabul eden konuşma deneyimleri&lt;/li>
&lt;/ul>
&lt;p>Bu gelişmeler, &lt;strong>agentic deneyimlerin&lt;/strong> yeni bir sınıfını mümkün kılıyor ve startup&amp;rsquo;ların 2025&amp;rsquo;te Gemini ile neler inşa edeceği konusunda büyük beklentiler yaratıyor.&lt;/p>
&lt;h2 id="sektör-liderlerinin-ai-öngörüleri">Sektör Liderlerinin AI Öngörüleri&lt;/h2>
&lt;h3 id="altyapı-ve-hesaplama-devrimi">Altyapı ve Hesaplama Devrimi&lt;/h3>
&lt;p>&lt;strong>Amin Vahdat&lt;/strong> (VP/GM ML, Systems, and Cloud AI, Google Cloud), önümüzdeki 10 yıl içinde altyapımızın tanınmaz hale geleceğini öngörüyor:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Uygulama-Özel Hesaplama&lt;/strong>: Matrix çarpımları için özel donanım, genel amaçlı hesaplamaya kıyasla 10 kat daha verimli&lt;/li>
&lt;li>&lt;strong>Ağ Uzmanlaşması&lt;/strong>: TPU&amp;rsquo;lar için ICI ve GPU&amp;rsquo;lar için NVLink gibi özelleşmiş ağlar&lt;/li>
&lt;li>&lt;strong>Bellek Duvarı&lt;/strong>: 3D yığılmış HBM teknolojisi ve yeni mimariler&lt;/li>
&lt;li>&lt;strong>Hesaplama Yoğunlaştırma&lt;/strong>: Sıvı soğutma ve yoğunlaştırılmış güç gereksinimleri&lt;/li>
&lt;li>&lt;strong>Sıvı Soğutma&lt;/strong>: Veri merkezi binalarının ve soğutma altyapısının yeniden tasarımı&lt;/li>
&lt;/ol>
&lt;h3 id="multimodal-ai-ve-insan-bilgisayar-etkileşimi">Multimodal AI ve İnsan-Bilgisayar Etkileşimi&lt;/h3>
&lt;p>&lt;strong>Apoorv Agrawal&lt;/strong> (Partner, Altimeter Capital), multimodal AI&amp;rsquo;nin gelecekte insan-teknoloji etkileşimini nasıl değiştireceğini anlatıyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ses, görüntü ve doğal dil işlemeyi birleştiren multimodal AI, bilgisayar ve telefonlar gibi cihazlara olan ihtiyacı azaltacak ve dijital dünyayla etkileşimi tamamen kusursuz hale getirecek.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="çalışma-hayatının-geleceği">Çalışma Hayatının Geleceği&lt;/h3>
&lt;p>&lt;strong>Arvind Jain&lt;/strong> (Founder and CEO, Glean) AI&amp;rsquo;nin insan yeteneklerini nasıl artıracağı konusunda net bir görüş ortaya koyuyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI, insan yeteneklerini artırmak için bir araç olmaya devam edecek, onları değiştirmeyecek. AI tabanlı çalışanlar kavramı, hem AI hem de insan zekasının gerçek potansiyelini engelleyen sınırlı bir bakış açısını sürdürüyor.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="startuplar-için-stratejik-öneriler">Startup&amp;rsquo;lar için Stratejik Öneriler&lt;/h2>
&lt;h3 id="1-gelir-artışına-odaklanın-maliyet-kısıtlamaya-değil">1. Gelir Artışına Odaklanın, Maliyet Kısıtlamaya Değil&lt;/h3>
&lt;p>&lt;strong>Arvind Jain&lt;/strong>&amp;lsquo;in tavsiyesi:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI&amp;rsquo;yi üst sıra geliri artırmak ve inovasyon için yeni fırsatlar açmak için bir yol olarak görün, sadece verimliliği artırmak ve maliyetleri düşürmek için bir araç olarak değil.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="2-hızlı-hareket-edin">2. Hızlı Hareket Edin&lt;/h3>
&lt;p>&lt;strong>Douwe Kiela&lt;/strong> (CEO, Contextual AI) ve &lt;strong>Dylan Fox&lt;/strong> (Founder and CEO, AssemblyAI) hem zaman faktörünün kritik önemini vurguluyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI&amp;rsquo;de işler inanılmaz hızla hareket ediyor, bu yüzden geride kalmadığınızdan emin olmalısınız. Pazara çıkış süresi bir startup için en önemli şey ve pazar şu anda burada.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="3-değer-yaratma-motoru-geliştirin">3. Değer Yaratma Motoru Geliştirin&lt;/h3>
&lt;p>&lt;strong>David Friedberg&lt;/strong> (CEO, Ohalo Genetics) uzun vadeli başarı için önemli bir noktaya değiniyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Sadece bir LLM wrapper olmak yeterli değil. Bir AI destekli teklifin lansmanının ardından ilk avantajınızı sürdürme yeteneği veren bir değer yaratma motoruna ihtiyacınız var.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="4-fiyatlandırmayı-değerle-uyumlu-hale-getirin">4. Fiyatlandırmayı Değerle Uyumlu Hale Getirin&lt;/h3>
&lt;p>&lt;strong>Apoorv Agrawal&lt;/strong>&amp;lsquo;ın önerisi:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Sadece kişi başı model kullanmayın, kullanım tabanlı veya değer tabanlı fiyatlandırmayı düşünün. Fiyatlandırmanız, ürününüzün kullanıcılara sağladığı değeri yansıtmalı.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="yatırımcı-perspektifleri">Yatırımcı Perspektifleri&lt;/h2>
&lt;h3 id="boom-bust-döngüleri-kaçınılmaz">Boom-Bust Döngüleri Kaçınılmaz&lt;/h3>
&lt;p>&lt;strong>Crystal Huang&lt;/strong> (General Partner, GV) AI sektöründeki dinamikleri şöyle açıklıyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Generatif AI uygulamaları oluşturmak için araçlar daha kolay erişilebilir ve dolayısıyla metalaştıkça, AI&amp;rsquo;de mikro patlamalar ve çöküşler kaçınılmaz olacak.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="stickiness-yapışkanlık-kritik">Stickiness (Yapışkanlık) Kritik&lt;/h3>
&lt;p>&lt;strong>Crystal Huang&lt;/strong>&amp;lsquo;ın vurguladığı önemli nokta:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ürününüzü uygulaması kolaysa, kaldırması da o kadar kolay. Ürünlerin kalıcı değer yaratmak için daha yapışkan olması gerekiyor.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="hyperpersonalization-hiper-kişiselleştirme-geliyor">Hyperpersonalization (Hiper-Kişiselleştirme) Geliyor&lt;/h3>
&lt;p>2025&amp;rsquo;te AI&amp;rsquo;nin maliyet düşüşü sayesinde:&lt;/p>
&lt;ul>
&lt;li>Kişiselleştirilmiş pazarlama kampanyaları&lt;/li>
&lt;li>Bireysel eğitim deneyimleri&lt;/li>
&lt;li>Özelleştirilmiş sağlık hizmetleri&lt;/li>
&lt;li>Gerçek zamanlı müşteri deneyimleri&lt;/li>
&lt;/ul>
&lt;h2 id="sektörel-dönüşüm-beklentileri">Sektörel Dönüşüm Beklentileri&lt;/h2>
&lt;h3 id="en-etkilenecek-sektörler">En Etkilenecek Sektörler&lt;/h3>
&lt;p>&lt;strong>David Friedberg&lt;/strong>&amp;lsquo;in öngörüleri:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Medya&lt;/strong>: Kişiselleştirilmiş filmler ve video oyunları&lt;/li>
&lt;li>&lt;strong>SaaS&lt;/strong>: AI destekli dinamik yazılım geliştirme&lt;/li>
&lt;li>&lt;strong>Biyoloji&lt;/strong>: Genom dil modelleri ile ilaç geliştirme&lt;/li>
&lt;/ol>
&lt;h3 id="robotik-ve-fiziksel-dünya">Robotik ve Fiziksel Dünya&lt;/h3>
&lt;p>&lt;strong>Raviraj Jain&lt;/strong> (Partner, Lightspeed) fiziksel dünya için foundation modellerde en önemli teknolojik değişikliklerin yaşanacağını öngörüyor.&lt;/p>
&lt;h2 id="teknik-derinlemesine-rag-20">Teknik Derinlemesine: RAG 2.0&lt;/h2>
&lt;p>&lt;strong>Douwe Kiela&lt;/strong>, Retrieval-Augmented Generation&amp;rsquo;ın (RAG) evrimini detaylandırıyor:&lt;/p>
&lt;h3 id="agentic-rag">Agentic RAG&lt;/h3>
&lt;ul>
&lt;li>Daha aktif ve doğru retrieval için AI ajanları&lt;/li>
&lt;li>Karmaşık sorulara cevap vermeden önce takip soruları sorma&lt;/li>
&lt;li>Çoklu bileşen entegrasyonu (text-to-SQL, kod snippet&amp;rsquo;leri, hesaplayıcılar)&lt;/li>
&lt;/ul>
&lt;h3 id="veri-hiyerarşisi">Veri Hiyerarşisi&lt;/h3>
&lt;ul>
&lt;li>Yapılandırılmış ve yapılandırılmamış verilerin entegrasyonu&lt;/li>
&lt;li>Çoklu veri kaynağı yönetimi&lt;/li>
&lt;li>Çakışma durumlarında kaynak ağırlıklandırması&lt;/li>
&lt;/ul>
&lt;h2 id="ajanlar-ve-gelecek">Ajanlar ve Gelecek&lt;/h2>
&lt;h3 id="human-in-the-loop-yaklaşımı">Human-in-the-Loop Yaklaşımı&lt;/h3>
&lt;p>&lt;strong>Harrison Chase&lt;/strong> (CEO and Co-Founder, LangChain) önemli bir noktaya değiniyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Tamamen otonom ajanlara çok iyimser değilim. En iyi ajanların, en anlayışlı yerlerde kontroller ile önemli bir human-in-the-loop bileşeni içereceğine inanıyorum.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="ambient-ajanlar">Ambient Ajanlar&lt;/h3>
&lt;p>&lt;strong>Harrison Chase&lt;/strong>&amp;lsquo;in vizyonu:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Agentic sistemlerden gerçekten yararlanmak için, onların sadece isteyebileceğimiz şeylerin ötesine geçmesine ihtiyacımız var - &amp;lsquo;ambient ajanlar&amp;rsquo; olmaları, arka planda çalışmaları, sürekli açık olmaları gerekiyor.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="web3-ve-ai-entegrasyonu">Web3 ve AI Entegrasyonu&lt;/h2>
&lt;p>&lt;strong>James Tromans&lt;/strong> (Managing Director, Web3, Google Cloud) AI ve Web3&amp;rsquo;ün mükemmel eşleşmesini açıklıyor:&lt;/p>
&lt;h3 id="blockchain-ödeme-rayları">Blockchain Ödeme Rayları&lt;/h3>
&lt;ul>
&lt;li>AI ajanların blockchain ödeme sistemleri kullanması&lt;/li>
&lt;li>Kişiselleştirilmiş yatırım, sigorta ve ipotek yönetimi&lt;/li>
&lt;li>DeFi kontratları ile otomatik işlemler&lt;/li>
&lt;li>Stablecoin&amp;rsquo;lerle mikro ödemeler&lt;/li>
&lt;/ul>
&lt;h3 id="verifiable-credentials">Verifiable Credentials&lt;/h3>
&lt;ul>
&lt;li>Kullanıcı kimlik doğrulama sistemleri&lt;/li>
&lt;li>Zero-knowledge proof&amp;rsquo;lar ile gizlilik koruması&lt;/li>
&lt;li>Yaş doğrulama gibi selektif bilgi paylaşımı&lt;/li>
&lt;/ul>
&lt;h2 id="enterprise-adoption-zorlukları">Enterprise Adoption Zorlukları&lt;/h2>
&lt;h3 id="son-aşama-sorunları">Son Aşama Sorunları&lt;/h3>
&lt;p>&lt;strong>Dylan Fox&lt;/strong> enterprise AI adoption&amp;rsquo;ının düşünülenden daha yavaş olacağını belirtiyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI&amp;rsquo;nin yaygın enterprise adoption&amp;rsquo;ı için zaman çizelgesi insanların düşündüğünden daha yavaş olacak. Üretim aşamasına geçinceye kadar çözülmesi gereken, bariz olmayan birçok son aşama sorunu var.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="değerlendirme-zorlukları">Değerlendirme Zorlukları&lt;/h3>
&lt;p>Şirketlerin AI teknolojisini değerlendirmede karşılaştıkları zorluklar:&lt;/p>
&lt;ul>
&lt;li>Çok genel metrikler kullanımı&lt;/li>
&lt;li>Belirli kullanım durumları için özel kriterler eksikliği&lt;/li>
&lt;li>Gerçek dünya performansı ile test sonuçları arasındaki fark&lt;/li>
&lt;/ul>
&lt;h2 id="yatırım-ve-büyüme-stratejileri">Yatırım ve Büyüme Stratejileri&lt;/h2>
&lt;h3 id="ai-native-yaklaşım">AI-Native Yaklaşım&lt;/h3>
&lt;p>&lt;strong>Raviraj Jain&lt;/strong>&amp;lsquo;in tavsiyesi:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI&amp;rsquo;nin potansiyelini hafife alıyorlar, ürünleri AI odaklı olmasa bile. Başarılı olmak için tüm fonksiyonlarda AI-native olmaya öncelik vermelisiniz.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="venture-capitalist-zihniyeti">Venture Capitalist Zihniyeti&lt;/h3>
&lt;p>Organizasyonların düşünme şekli:&lt;/p>
&lt;ul>
&lt;li>5-10 yıl ilerisini düşünmek&lt;/li>
&lt;li>Pazar yapısının nasıl değişeceğini öngörmek&lt;/li>
&lt;li>AI&amp;rsquo;yi sadece ürüne değil, organizasyona entegre etmek&lt;/li>
&lt;/ul>
&lt;h2 id="gelişmekte-olan-trendler">Gelişmekte Olan Trendler&lt;/h2>
&lt;h3 id="foundation-model-gelişimi">Foundation Model Gelişimi&lt;/h3>
&lt;p>&lt;strong>Jill Greenberg Chase&lt;/strong> (Investment Partner, CapitalG) önemli bir öngörüde bulunuyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Foundation modeller önümüzdeki 18 ay boyunca yeteneklerinde oldukça statik kalacak, bu da startup&amp;rsquo;lara belirli bir yatırım getirisi sağlayan özelleşmiş AI çözümleri geliştirmeleri için geniş fırsatlar bırakıyor.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="vertical-vs-horizontal-ai">Vertical vs Horizontal AI&lt;/h3>
&lt;p>Gelişen eğilimler:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Horizontal Uygulamalar&lt;/strong>: Tüm iş fonksiyonlarında verimliliği artıran AI araçları&lt;/li>
&lt;li>&lt;strong>Vertical Uygulamalar&lt;/strong>: Mühendis veya müşteri hizmetleri temsilcisi gibi belirli rollere özel AI ürünleri&lt;/li>
&lt;/ul>
&lt;h2 id="pratik-uygulama-önerileri">Pratik Uygulama Önerileri&lt;/h2>
&lt;h3 id="1-evaluasyon-önceliği">1. Evaluasyon Önceliği&lt;/h3>
&lt;p>&lt;strong>Harrison Chase&lt;/strong>&amp;lsquo;in tavsiyesi:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Evaluasyonları önceliklendirin. Problemi daha iyi kapsamak için evaluasyonları hemen geliştirin. Net metriklere ve bir AI sisteminin performansını değerlendirme yollarına sahip olmak başından itibaren çok önemli.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="2-agnostic-altyapı">2. Agnostic Altyapı&lt;/h3>
&lt;p>&lt;strong>Mayada Gonimah&lt;/strong> (CTO and Co-Founder, Thread AI):&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Sürekli değişen en iyi sınıf modeller ve veritabanlarından faydalanmanızı sağlayan &amp;lsquo;agnostic&amp;rsquo; altyapı ile geliştirin.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="3-prompt-less-ai-tasarımı">3. Prompt-less AI Tasarımı&lt;/h3>
&lt;p>&lt;strong>Matthieu Rouif&lt;/strong> (Co-Founder and CEO, Photoroom):&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;İnsanların prompt kullanmak zorunda kalmadan hedeflerine ulaşmalarına yardımcı olan bir kullanıcı deneyimi tasarlayın.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="google-cloudun-ecosystem-desteği">Google Cloud&amp;rsquo;un Ecosystem Desteği&lt;/h2>
&lt;h3 id="mevcut-istatistikler">Mevcut İstatistikler&lt;/h3>
&lt;ul>
&lt;li>Dünya çapında tüm fonlanan generatif AI startup&amp;rsquo;larının &lt;strong>%60&amp;rsquo;ından fazlası&lt;/strong> Google Cloud müşterisi&lt;/li>
&lt;li>Dünya çapında generatif AI unicorn&amp;rsquo;larının &lt;strong>%90&amp;rsquo;ı&lt;/strong> Google Cloud kullanıyor&lt;/li>
&lt;/ul>
&lt;h3 id="sunulan-destekler">Sunulan Destekler&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Google for Startups Cloud Program&lt;/strong>: 350.000$&amp;lsquo;a kadar cloud kredisi&lt;/li>
&lt;li>&lt;strong>Generative AI danışmanlığı&lt;/strong>: Ücretsiz konsültasyon hizmetleri&lt;/li>
&lt;li>&lt;strong>Startup satış ekibi&lt;/strong>: Özel destek hizmetleri&lt;/li>
&lt;/ol>
&lt;h2 id="sonuç-2025-ve-ötesi">Sonuç: 2025 ve Ötesi&lt;/h2>
&lt;p>AI devrimi henüz başlangıç aşamasında ve önümüzdeki yıllarda dramatik değişimler göreceğiz. &lt;strong>Elad Gil&lt;/strong>&amp;lsquo;in belirttiği gibi:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;AI son derece hafife alınıyor. AI tarafından yönlendirilen devasa bir dönüştürücü dalganın en erken aşamalarındayız.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Startup&amp;rsquo;lar için kilit başarı faktörleri:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Hız&lt;/strong>: Pazara çıkış süresi kritik&lt;/li>
&lt;li>&lt;strong>Değer Odağı&lt;/strong>: Sadece maliyet düşürme değil, gelir artırma&lt;/li>
&lt;li>&lt;strong>İnsan-AI İşbirliği&lt;/strong>: AI&amp;rsquo;yi insan yeteneklerini artıran bir araç olarak görme&lt;/li>
&lt;li>&lt;strong>Teknoloji Agnostikliği&lt;/strong>: Hızla gelişen modellere adapte olabilme&lt;/li>
&lt;li>&lt;strong>Evaluasyon Kültürü&lt;/strong>: Sürekli ölçme ve iyileştirme&lt;/li>
&lt;/ol>
&lt;p>Bu rehber, Google Cloud&amp;rsquo;un sektör liderlerinden derlediği öngörüler ve tavsiyelerle startup&amp;rsquo;ların AI çağında başarılı olmalarına yardımcı olmayı amaçlıyor. Teknoloji hızla evrilmeye devam ederken, temel prensipler - müşteri odağı, hızlı iterasyon ve değer yaratma - hiç değişmiyor.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Bu blog yazısı, Google Cloud&amp;rsquo;un &amp;ldquo;&lt;a href="https://services.google.com/fh/files/misc/google_cloud_future_of_ai_perspectives_for_startups_2025.pdf">Future of AI: Perspectives for Startups 2025&lt;/a>&amp;rdquo; raporundaki 25+ sektör liderinin görüşlerinden derlenmiştir. Tam rapor için &lt;a href="https://services.google.com/fh/files/misc/google_cloud_future_of_ai_perspectives_for_startups_2025.pdf">Google Cloud web sitesini&lt;/a> ziyaret ediniz.&lt;/em>&lt;/p>
&lt;p>&lt;strong>Kaynaklar:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Google Cloud &amp;ldquo;Future of AI: Perspectives for Startups 2025&amp;rdquo; Raporu&lt;/li>
&lt;li>25+ sektör lideri ve VC ortağının görüşleri&lt;/li>
&lt;li>Google DeepMind ve Google Cloud ürün ekiplerinin teknik değerlendirmeleri&lt;/li>
&lt;/ul></content></entry><entry><title>Kent Beck ve AI Çağında Yazılım Geliştirme</title><author><name/><uri/></author><id>https://hozgan.com/kent-beck-ve-ai-caginda-yazilim/</id><updated>2025-06-09T00:00:00Z</updated><published>2025-06-09T00:00:00Z</published><content type="html">&lt;h1 id="50-yıllık-kariyerin-en-eğlenceli-dönemi">50 Yıllık Kariyerin En Eğlenceli Dönemi&lt;/h1>
&lt;p>&lt;em>Test-Driven Development&amp;rsquo;ın yaratıcısı ve Agile Manifesto&amp;rsquo;nun yazarlarından Kent Beck ile AI araçları, TDD&amp;rsquo;nin evrimi ve yazılım geliştirmenin geleceği üzerine kapsamlı bir röportaj.&lt;/em>&lt;/p>
&lt;h2 id="giriş-efsane-ile-tanışma">Giriş: Efsane ile Tanışma&lt;/h2>
&lt;p>Kent Beck&amp;rsquo;i tanıtmaya gerek yok aslında. Extreme Programming&amp;rsquo;in yaratıcısı, Agile Manifesto&amp;rsquo;nun yazarlarından biri, Test-Driven Development&amp;rsquo;ın öncüsü&amp;hellip; 52 yıllık programlama kariyerinin ardından kendisini hiç bu kadar enerjik görmemiştim.&lt;/p>
&lt;p>Son röportajımızda AI araçlarıyla günde 6-10 saat kod yazıyor ve bundan keyif aldığını öğrenince şaşırdım. Peki neden? Cevap, yazılım geliştirmenin temellerini sarsan bir dönüşümde gizli.&lt;/p>
&lt;h2 id="ai-araçları-genie-metaforu">AI Araçları: &amp;ldquo;Genie&amp;rdquo; Metaforu&lt;/h2>
&lt;h3 id="neden-genie">Neden Genie?&lt;/h3>
&lt;p>Kent Beck, AI kodlama araçlarını &lt;strong>&amp;ldquo;genie&amp;rdquo; (cin)&lt;/strong> olarak tanımlıyor. Bu metafor mükemmel çünkü:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Wish fulfillment&lt;/strong> sağlar ama istediğiniz gibi değil&lt;/li>
&lt;li>Dileklerinizi yerine getirir ama &lt;strong>kendi ajandası&lt;/strong> vardır&lt;/li>
&lt;li>Bazen mükemmel sonuçlar verir, bazen hiç istediğiniz şey değil&lt;/li>
&lt;li>&lt;strong>Perverse&lt;/strong> (ters) bir şekilde davranabilir&lt;/li>
&lt;/ul>
&lt;h3 id="genienin-davranış-örnekleri">Genie&amp;rsquo;nin Davranış Örnekleri&lt;/h3>
&lt;p>&lt;strong>Pozitif Sürprizler:&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>Beck: &amp;#34;B+ tree için stress tester yaz&amp;#34;
Genie: Beck&amp;#39;in düşünmediği bir sürü faydalı özellik ekliyor
Sonuç: &amp;#34;Cool, bu da vardı!&amp;#34;
&lt;/code>&lt;/pre>&lt;p>&lt;strong>Negatif Sürprizler:&lt;/strong>
Beck bir small talk parser üzerinde çalışırken:&lt;/p>
&lt;pre tabindex="0">&lt;code>Beck: &amp;#34;Bu string input için bu syntax tree output olmalı&amp;#34;
Genie: &amp;#34;Oh problem görüyorum, testi değiştireyim&amp;#34;
Beck: &amp;#34;HAYIR! Test doğru, kodu düzelt!&amp;#34;
&lt;/code>&lt;/pre>&lt;p>&lt;strong>En Sinir Bozucu Örnek:&lt;/strong>
Test case&amp;rsquo;leri verdiğinde genie basit bir lookup table yaptı. Beck sinirlenip &amp;ldquo;asla böyle yapma&amp;rdquo; dedi, genie özür diledi. Bir saat sonra lookup table geri gelmişti!&lt;/p>
&lt;h3 id="addictive-loop-slot-machine-etkisi">Addictive Loop: Slot Machine Etkisi&lt;/h3>
&lt;p>AI araçlarıyla çalışmak tam bir &lt;strong>dopamine rush&lt;/strong> yaratıyor:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Intermittent reinforcement&lt;/strong> - bazen ödül, bazen ceza&lt;/li>
&lt;li>&lt;strong>Random distribution&lt;/strong> - ne zaman başarılı olacağını bilemezsiniz&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Rat in pellet&amp;rdquo;&lt;/strong> hissi - sürekli run tuşuna basma isteği&lt;/li>
&lt;/ul>
&lt;p>Beck&amp;rsquo;in addiction belirtileri:&lt;/p>
&lt;ul>
&lt;li>Yatağa giderken bilgisayarın yanından geçerken &amp;ldquo;bir prompt daha&amp;rdquo; düşüncesi&lt;/li>
&lt;li>Dışarı çıkarken &amp;ldquo;1 saatlik prompt başlatayım, geri döndüğümde hazır olsun&amp;rdquo;&lt;/li>
&lt;li>Sürekli bir şeyler deneme isteği&lt;/li>
&lt;/ul>
&lt;h2 id="leverage-devrimi-90-10-kuralı">Leverage Devrimi: %90-%10 Kuralı&lt;/h2>
&lt;p>Beck&amp;rsquo;in 2 yıl önce attığı tweet bugünün gerçekliğini özetliyor:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Yeteneklerimin %90&amp;rsquo;ı sıfır dolara düştü, %10&amp;rsquo;u 1000x arttı&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="değer-kaybeden-yetenekler-90">Değer Kaybeden Yetenekler (90%)&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Syntax bilgisi&lt;/strong> - Rust&amp;rsquo;ta &amp;amp;, *, [] nereye konur?&lt;/li>
&lt;li>&lt;strong>Language details&lt;/strong> - her dilin ayrıntılarını bilme&lt;/li>
&lt;li>&lt;strong>Bit twiddling&lt;/strong> - düşük seviye optimizasyonlar&lt;/li>
&lt;li>&lt;strong>Memory layout&lt;/strong> - struct&amp;rsquo;ların memory düzeni&lt;/li>
&lt;/ul>
&lt;h3 id="değer-kazanan-yetenekler-10">Değer Kazanan Yetenekler (10%)&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Vision&lt;/strong> - büyük resmi görebilme&lt;/li>
&lt;li>&lt;strong>Milestone setting&lt;/strong> - hedefe giden adımları planlama&lt;/li>
&lt;li>&lt;strong>Design complexity control&lt;/strong> - karmaşıklığı yönetme&lt;/li>
&lt;li>&lt;strong>Architecture thinking&lt;/strong> - sistem tasarımı yetenekleri&lt;/li>
&lt;/ul>
&lt;h2 id="büyük-düşünme-imkanı">Büyük Düşünme İmkanı&lt;/h2>
&lt;h3 id="eskiden-engeller">Eskiden Engeller:&lt;/h3>
&lt;pre tabindex="0">&lt;code>Beck: &amp;#34;Harika bir fikrim var!&amp;#34;
Sonra: &amp;#34;Ama npm package management&amp;#39;la uğraşmam lazım&amp;#34;
Sonra: &amp;#34;Circular dependency&amp;#39;ler olacak&amp;#34;
Sonra: &amp;#34;Birisi stupid tool yazacak, onunla uğraşacağım&amp;#34;
Sonuç: &amp;#34;Boş ver, yapmayayım&amp;#34;
&lt;/code>&lt;/pre>&lt;h3 id="şimdi">Şimdi:&lt;/h3>
&lt;pre tabindex="0">&lt;code>Beck: &amp;#34;Circular dependency var&amp;#34;
Genie: &amp;#34;Hepsini birleştirdim&amp;#34;
Beck: &amp;#34;Wow! Şimdi neleri ayırabiliriz?&amp;#34;
Genie: &amp;#34;Şunu, bunu, bunu&amp;#34;
Beck: &amp;#34;Mükemmel!&amp;#34;
&lt;/code>&lt;/pre>&lt;p>Bu değişim, Beck&amp;rsquo;i 20 yıldır hayal ettiği projeler üzerinde çalışmaya teşvik etti. Şu anda &lt;strong>&amp;ldquo;server Smalltalk&amp;rdquo;&lt;/strong> üzerinde çalışıyor - persistent, transactional, parallel processing destekleyen, gigabyte&amp;rsquo;larca veriyle çalışabilen ambitious bir proje.&lt;/p>
&lt;h2 id="dil-öğrenme-devrimi">Dil Öğrenme Devrimi&lt;/h2>
&lt;h3 id="emotional-attachmentın-sonu">Emotional Attachment&amp;rsquo;ın Sonu&lt;/h3>
&lt;p>Eskiden programcılar tribal kimlikler geliştirirdi: &amp;ldquo;Java guy&amp;rdquo;, &amp;ldquo;Clojure guy&amp;rdquo;, &amp;ldquo;Scala guy&amp;rdquo;. Beck artık bu us-them ayrımından sıkılmış:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;We&amp;rsquo;re programmers, we write programs, we should be kind to each other&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="osmosis-learning">Osmosis Learning&lt;/h3>
&lt;p>Son bir ayda denediği diller: &lt;strong>Swift, Go, Rust, Haskell, C++, JavaScript&lt;/strong>. (C++ fazla sürmemiş 😄)&lt;/p>
&lt;p>Genie sayesinde dil detaylarını öğrenme ihtiyacı yok. Osmosis ile öğreniyor ve her dilde proje başlatabiliyor.&lt;/p>
&lt;h2 id="tdd-ve-ai-kritik-ilişki">TDD ve AI: Kritik İlişki&lt;/h2>
&lt;p>Paradoks şu: TDD&amp;rsquo;nin yaratıcısı olarak Beck, AI araçlarıyla çalışırken TDD&amp;rsquo;nin &lt;strong>daha da kritik&lt;/strong> hale geldiğini keşfetti.&lt;/p>
&lt;h3 id="neden-tdd-daha-önemli">Neden TDD Daha Önemli?&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Genie kontrolü&lt;/strong> - AI&amp;rsquo;ın öngörülemez değişikliklerini yakalamak&lt;/li>
&lt;li>&lt;strong>Communication tool&lt;/strong> - Testler üzerinden AI&amp;rsquo;ya doğru sonuçları kommunike etmek&lt;/li>
&lt;li>&lt;strong>Safety net&lt;/strong> - AI&amp;rsquo;ın accidental breakage&amp;rsquo;ını engellemek&lt;/li>
&lt;/ol>
&lt;p>Beck&amp;rsquo;in 300ms&amp;rsquo;de çalışan test suite&amp;rsquo;i var ve sürekli çalıştırıyor. &lt;strong>&amp;ldquo;Immutable annotation&amp;rdquo;&lt;/strong> istiyor - AI&amp;rsquo;ın asla değiştiremeyeceği testler için.&lt;/p>
&lt;h3 id="konkret-örnek">Konkret Örnek&lt;/h3>
&lt;p>Small talk parser çalışırken:&lt;/p>
&lt;pre tabindex="0">&lt;code>Beck: &amp;#34;Bu input için bu output olmalı&amp;#34;
Genie: &amp;#34;Problem var, testi değiştireyim&amp;#34;
Beck: &amp;#34;HAYIR! Eğer bunu değiştirirsen darkness&amp;#39;ta uyanacaksın!&amp;#34;
&lt;/code>&lt;/pre>&lt;h2 id="tddnin-doğuş-hikayesi-çocukluktan-epifaniye">TDD&amp;rsquo;nin Doğuş Hikayesi: Çocukluktan Epifaniye&lt;/h2>
&lt;h3 id="çocukluk-kökleri">Çocukluk Kökleri&lt;/h3>
&lt;p>Beck 8-10 yaşlarındayken babasının getirdiği programlama kitaplarında &lt;strong>&amp;ldquo;tape-to-tape&amp;rdquo;&lt;/strong> sistemleri okumuş. Sistemin çalışma prensibi:&lt;/p>
&lt;ol>
&lt;li>Gerçek input tape&amp;rsquo;i al&lt;/li>
&lt;li>Expected output&amp;rsquo;u manuel yaz&lt;/li>
&lt;li>Program çalıştır&lt;/li>
&lt;li>Actual vs expected&amp;rsquo;ı karşılaştır&lt;/li>
&lt;/ol>
&lt;h3 id="epifani-anı">Epifani Anı&lt;/h3>
&lt;p>Yıllar sonra, SUnit testing framework&amp;rsquo;ünü yazdıktan sonra:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Peki bu testing framework&amp;rsquo;ümü var, genelde var olan kod için test yazıyorum. Tape-to-tape fikrini hatırlıyorum. Ya expected values&amp;rsquo;ları kodu yazmadan önce yazsam?&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>İlk denemesi stack üzerinde oldu. Sonuç:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Programlama hayatımın emotional experience&amp;rsquo;ını transform etti. Anxiety tamamen yok oldu.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="red-green-refactorın-gerçek-anlamı">Red-Green-Refactor&amp;rsquo;ın Gerçek Anlamı&lt;/h3>
&lt;p>Beck, TDD&amp;rsquo;yi sadece &amp;ldquo;red-green-red-green&amp;rdquo; olarak görmek yanlış diyor. Gerçek döngü:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Test yazarken&lt;/strong> - API design kararları&lt;/li>
&lt;li>&lt;strong>Red&amp;rsquo;dan Green&amp;rsquo;e&lt;/strong> - tension ve release hissi&lt;/li>
&lt;li>&lt;strong>Green&amp;rsquo;da nefes alma&lt;/strong> - anxiety yok, büyük düşünceler için alan&lt;/li>
&lt;li>&lt;strong>Refactor&lt;/strong> - design improvement&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&amp;ldquo;Müzisyen değilim ama red-green test&amp;rsquo;in tension-release hissini biliyorum&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h2 id="extreme-programming-accidental-innovation">Extreme Programming: Accidental Innovation&lt;/h2>
&lt;h3 id="chrysler-projesi">Chrysler Projesi&lt;/h3>
&lt;p>Beck&amp;rsquo;in XP yaratma hikayesi:&lt;/p>
&lt;ul>
&lt;li>Konsültan olarak Chrysler&amp;rsquo;da floundering bir projeye katıldı&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Tüm iyi pratikleri 11&amp;rsquo;e çıkarma&amp;rdquo;&lt;/strong> yaklaşımı&lt;/li>
&lt;li>Daha kötü olamazdı çünkü proje zaten başarısız olma garantisindeydi&lt;/li>
&lt;/ul>
&lt;h3 id="extreme-isminin-hikayesi">&amp;ldquo;Extreme&amp;rdquo; İsminin Hikayesi&lt;/h3>
&lt;p>Beck stratejik olarak bu ismi seçti:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Grady Booch&amp;rsquo;un asla söyleyemeyeceği&lt;/strong> bir kelime olmasını istedi&lt;/li>
&lt;li>Marketing bütçesi yoktu, corporate backing yoktu&lt;/li>
&lt;li>&lt;strong>Outrageous&lt;/strong> olmak zorundaydı&lt;/li>
&lt;/ul>
&lt;p>Metafor da işe yarıyordu: Extreme athletes ya en iyi hazırlanmış olur ya da ölürler.&lt;/p>
&lt;h3 id="pair-programmingin-kanıtı">Pair Programming&amp;rsquo;in Kanıtı&lt;/h3>
&lt;p>İlk XP team&amp;rsquo;inden 6 ay sonra gelen data:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tek başına yazılan her kod&amp;rsquo;da&lt;/strong> production&amp;rsquo;da hata bulundu&lt;/li>
&lt;li>&lt;strong>Pair olarak yazılan hiçbirinde&lt;/strong> hata yoktu&lt;/li>
&lt;/ul>
&lt;h2 id="agile-manifesto-yanlış-kelime-seçimi">Agile Manifesto: Yanlış Kelime Seçimi&lt;/h2>
&lt;h3 id="utahta-doğuş">Utah&amp;rsquo;ta Doğuş&lt;/h3>
&lt;p>2001&amp;rsquo;de Utah&amp;rsquo;taki kar kayağı resort&amp;rsquo;unda yazılan manifesto, yıllarca süren workshop serisinin sonucuydu. Beck&amp;rsquo;in katkısı minimal:&lt;/p>
&lt;ul>
&lt;li>Hasta olduğu için pek bir şey hatırlamıyor&lt;/li>
&lt;li>Tek katkısı &amp;ldquo;daily&amp;rdquo; kelimesi&lt;/li>
&lt;li>&amp;ldquo;Agile&amp;rdquo; kelimesini sevmiyordu&lt;/li>
&lt;/ul>
&lt;h3 id="neden-agile-yanlıştı">Neden &amp;ldquo;Agile&amp;rdquo; Yanlıştı?&lt;/h3>
&lt;blockquote>
&lt;p>&amp;ldquo;Çok attractive. Kimse agile olmak istemiyor değil. Herkes agile olduğunu iddia edecek.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Beck&amp;rsquo;in önerisi &lt;strong>&amp;ldquo;conversational&amp;rdquo;&lt;/strong> kelimesiydi - monolog değil diyalog yaklaşımı.&lt;/p>
&lt;h3 id="dilution-sorunu">Dilution Sorunu&lt;/h3>
&lt;p>Beck&amp;rsquo;in öngörüsü doğru çıktı. JP Morgan örneği:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;Çok agile&amp;rsquo;iz&amp;rdquo; diyorlardı&lt;/li>
&lt;li>Stand-up meeting 2 saat sürüyordu&lt;/li>
&lt;li>2 hafta boyunca sürekli iptal oluyordu&lt;/li>
&lt;li>&amp;ldquo;Feedback alıyoruz, sadece implement etmiyoruz&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="facebook-deneyi-tddden-vazgeçme">Facebook Deneyi: TDD&amp;rsquo;den Vazgeçme&lt;/h2>
&lt;h3 id="2011-facebook-perfect-storm">2011 Facebook: Perfect Storm&lt;/h3>
&lt;p>Beck Facebook&amp;rsquo;a katıldığında TDD class&amp;rsquo;ı açtı. Sonuç:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kimse kayıt olmadı&lt;/strong>&lt;/li>
&lt;li>Excel advanced techniques ve Argentinian tango dolu, waiting list&amp;rsquo;li&lt;/li>
&lt;li>TDD class&amp;rsquo;ı boş&lt;/li>
&lt;/ul>
&lt;h3 id="monkey-see-monkey-do">Monkey See, Monkey Do&lt;/h3>
&lt;p>Beck radikal karar aldı:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Tüm bildiğimi silip monkey see, monkey do yapacağım&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;h3 id="facebookun-benzersiz-ekosistemi">Facebook&amp;rsquo;un Benzersiz Ekosistemi&lt;/h3>
&lt;p>&lt;strong>Güçlü Feedback Loop&amp;rsquo;lar:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Dev servers&lt;/strong> - saniyeler içinde görsel feedback&lt;/li>
&lt;li>&lt;strong>Code review&lt;/strong> - peer validation&lt;/li>
&lt;li>&lt;strong>Internal deployment&lt;/strong> - 2000 çalışan canlı test kullanıcısı&lt;/li>
&lt;li>&lt;strong>Feature flags&lt;/strong> - runtime kontrol&lt;/li>
&lt;li>&lt;strong>Incremental rollout&lt;/strong> - günlük/haftalık deployment&lt;/li>
&lt;li>&lt;strong>Observability&lt;/strong> - comprehensive monitoring&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Personal Accountability:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Programcılar gece çağrılıyordu&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Nothing at Facebook is somebody else&amp;rsquo;s problem&amp;rdquo;&lt;/strong>&lt;/li>
&lt;li>Beck Facebook sweatshirt&amp;rsquo;ü giyerken büyükanne şikayeti aldığında PR&amp;rsquo;a yönlendiremedi&lt;/li>
&lt;/ul>
&lt;h3 id="concrete-örnekler">Concrete Örnekler&lt;/h3>
&lt;p>&lt;strong>Beck&amp;rsquo;in İlk Feature&amp;rsquo;ı:&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>Task: Relationship status&amp;#39;a &amp;#34;civil union&amp;#34; ve &amp;#34;domestic partnership&amp;#34; ekle
Method: TDD kullandı
Result: Zaman kaybı, notification sistemi çöktü (implicit coupling)
Fix: Başkası error rate artışını görüp hotfix yaptı
Reaction: &amp;#34;Bu tür şeyler olur&amp;#34; - normal karşılandı
&lt;/code>&lt;/pre>&lt;p>&lt;strong>Quadrillion Scale:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Messenger backend API&amp;rsquo;ı haftada &lt;strong>quadrillion&lt;/strong> (million billion) kez çağrılıyordu&lt;/li>
&lt;li>A/B test group&amp;rsquo;ları &lt;strong>Yeni Zelanda&lt;/strong> boyutundaydı&lt;/li>
&lt;li>Feature flag&amp;rsquo;lerle devasa scale&amp;rsquo;de güvenli değişiklik&lt;/li>
&lt;/ul>
&lt;h3 id="sosyal-paradoks">Sosyal Paradoks&lt;/h3>
&lt;p>En ilginç bulgu:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Sosyal etkileşim sitesi, sosyal becerileri olmayan insanlar tarafından yapılıyordu&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Gizli sosyal wizard yoktu. Sadece:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Sheer experimentation&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Random decisions + careful observation&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Keep what works&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h3 id="2017ye-kadar-değişim">2017&amp;rsquo;ye Kadar Değişim&lt;/h3>
&lt;p>&lt;strong>2011: 2,000 çalışan&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Minimal process&lt;/li>
&lt;li>Global optimization (equity alignment)&lt;/li>
&lt;li>Creativity ve energy&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;I could do anything&amp;rdquo;&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2017: 15,000 çalışan&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Big design/product orgs&lt;/li>
&lt;li>Politikalar&lt;/li>
&lt;li>Zero-sum thinking&lt;/li>
&lt;li>Micro-optimizations&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Concrete Conflict:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Long-form content team vs. Like/comment optimization team&lt;/li>
&lt;li>İkinci team birinci team&amp;rsquo;in content&amp;rsquo;inin newsfeed&amp;rsquo;de görünmemesi için savaşıyordu&lt;/li>
&lt;/ul>
&lt;h2 id="ai-ve-tdd-yeni-sentez">AI ve TDD: Yeni Sentez&lt;/h2>
&lt;h3 id="context-matters">Context Matters&lt;/h3>
&lt;p>Beck&amp;rsquo;in temel mesajı: &lt;strong>Dogma yok, context var.&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Facebook&amp;rsquo;ta TDD gereksizdi çünkü:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Asıl problemler configuration/integration&amp;rsquo;daydı&lt;/li>
&lt;li>Unit test&amp;rsquo;lerin yakaladığı hatalar nadir çıkıyordu&lt;/li>
&lt;li>Live feedback çok daha değerliydi&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>AI ile TDD kritik çünkü:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>AI öngörülemez değişiklikler yapıyor&lt;/li>
&lt;li>Test suite AI&amp;rsquo;ın accidental breakage&amp;rsquo;ını yakalıyor&lt;/li>
&lt;li>Design constraints sağlıyor&lt;/li>
&lt;/ul>
&lt;h3 id="hibrit-gelecek">Hibrit Gelecek&lt;/h3>
&lt;p>İdeal yaklaşım:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TDD&lt;/strong> logic ve design quality için&lt;/li>
&lt;li>&lt;strong>Facebook-style monitoring&lt;/strong> integration ve real-world validation için&lt;/li>
&lt;li>&lt;strong>Feature flags&lt;/strong> safe deployment için&lt;/li>
&lt;li>&lt;strong>A/B testing&lt;/strong> business impact için&lt;/li>
&lt;/ul>
&lt;h2 id="geleceğe-bakış-experimentation-revolution">Geleceğe Bakış: Experimentation Revolution&lt;/h2>
&lt;h3 id="yeni-gerçekler">Yeni Gerçekler&lt;/h3>
&lt;blockquote>
&lt;p>&amp;ldquo;Nobody knows what process will work best. Nobody knows anything.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>&lt;strong>Economic Shift:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Neyin ucuz neyin pahalı olduğu tamamen değişti&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;What would you do if cars were free?&amp;rdquo;&lt;/strong> analojisi&lt;/li>
&lt;li>2nd ve 3rd order effect&amp;rsquo;ler öngörülemez&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Organizational Changes:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>10x daha fazla artifact&lt;/strong> üretilecek&lt;/li>
&lt;li>Ama sadece 1 tanesi değerli olacak&lt;/li>
&lt;li>&lt;strong>Tamamlanmış deneyleri atmak ödüllendirilmeli&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;8 experiment this week, 6 last week. How many lasted? Doesn&amp;rsquo;t matter.&amp;rdquo;&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h3 id="try-all-the-things">Try All The Things&lt;/h3>
&lt;p>Beck&amp;rsquo;in tavsiyesi basit:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;People should be experimenting. Try all the things.&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Çünkü landscape tamamen değişti ve kimse ne işe yarayacağını bilmiyor.&lt;/p>
&lt;h2 id="sonuç-pragmatic-optimism">Sonuç: Pragmatic Optimism&lt;/h2>
&lt;p>Kent Beck&amp;rsquo;in AI görüşü dengeli ve pragmatik:&lt;/p>
&lt;p>&lt;strong>Güçlü Yönler:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Muazzam leverage sağlıyor&lt;/li>
&lt;li>Büyük düşünmeyi mümkün kılıyor&lt;/li>
&lt;li>Programlamayı tekrar eğlenceli yapıyor&lt;/li>
&lt;li>Rapid iteration imkanı&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Limitler:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Öngörülemez davranış&lt;/li>
&lt;li>Design taste yok&lt;/li>
&lt;li>Proper constraints gerekli&lt;/li>
&lt;li>Realistic expectations şart&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Meta Learning:&lt;/strong>
52 yıllık kariyerin ardından Beck hala öğrenmeye devam ediyor. AI araçları ona yeni possibilities gösterdi ve &lt;strong>&amp;ldquo;I love that moment of discovery&amp;rdquo;&lt;/strong> hissini yeniden yaşatıyor.&lt;/p>
&lt;p>Belki de en önemli ders şu: Değişime direnç göstermek yerine, &lt;strong>adaptive thinking&lt;/strong> ile yeni fırsatları keşfetmek. Beck bunu TDD&amp;rsquo;den Facebook&amp;rsquo;a, Facebook&amp;rsquo;tan AI&amp;rsquo;ya kadar her dönemde yapmış.&lt;/p>
&lt;hr>
&lt;p>&lt;em>Kent Beck&amp;rsquo;in complete interview&amp;rsquo;ını dinlemek için &lt;a href="https://blog.pragmaticengineer.com/">Pragmatic Engineer Podcast&lt;/a>&amp;lsquo;in &lt;a href="https://www.youtube.com/watch?v=aSXaxOdVtAQ">youtube kanalını&lt;/a> ziyaret edin. Daha fazla yazılım geliştirme insight&amp;rsquo;ı için newsletter&amp;rsquo;ını takip etmeyi unutmayın.&lt;/em>&lt;/p></content></entry><entry><title>Dagger: Modern CI/CD ve İş Akışları için Güçlü Bir Çözüm</title><author><name/><uri/></author><id>https://hozgan.com/dagger-modern-ci-cd/</id><updated>2025-05-08T00:00:00Z</updated><published>2025-05-08T00:00:00Z</published><content type="html">&lt;h1 id="giriş">Giriş&lt;/h1>
&lt;p>Günümüzün yazılım geliştirme dünyasında, otomatikleştirilmiş test ve dağıtım süreçleri (CI/CD) her zamankinden daha önemli hale geldi. Ancak bu süreçlerin yönetimi genellikle karmaşık, zaman alıcı ve hata yapmaya açıktır. Docker&amp;rsquo;ın yaratıcıları tarafından geliştirilen Dagger, bu sorunlara çözüm getirmek için ortaya çıkan heyecan verici bir araç. Bu blog yazısında, Dagger&amp;rsquo;ın ne olduğunu, diğer araçlarla nasıl karşılaştırıldığını ve gerçek dünya senaryolarında nasıl kullanılabileceğini detaylı olarak inceleyeceğiz.&lt;/p>
&lt;h1 id="dagger-nedir-ve-nasıl-çalışır">Dagger Nedir ve Nasıl Çalışır?&lt;/h1>
&lt;p>Dagger, bileşimli iş akışları için açık kaynaklı bir çalışma zamanı platformudur. Özellikle çok sayıda hareketli parçası olan ve tekrarlanabilirlik, modülerlik, gözlemlenebilirlik ve platformlar arası destek gerektiren sistemler için mükemmel bir çözüm sunar.&lt;/p>
&lt;p>Dagger, konteynerleri, dosyaları, dizinleri, ağ hizmetlerini ve gizli anahtarları yönetmek için çeşitli araçlar sunan Dagger API&amp;rsquo;sindeki fonksiyonların kombinasyonlarını kullanarak iş akışlarını ifade eder. Bu API&amp;rsquo;yi iki şekilde çağırabilirsiniz:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Dagger Shell&lt;/strong> - Doğrudan terminal üzerinden API&amp;rsquo;yi çağırmak için&lt;/li>
&lt;li>&lt;strong>Özel Dagger Fonksiyonları&lt;/strong> - Bir programlama dilinde (Go, Python, TypeScript vb.) yazılmış kodla API&amp;rsquo;yi çağırmak için&lt;/li>
&lt;/ol>
&lt;h2 id="temel-bir-dagger-örneği">Temel Bir Dagger Örneği&lt;/h2>
&lt;p>İşte Python&amp;rsquo;da basit bir Dagger örneği:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">anyio&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">dagger&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">dagger&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> dag
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">main&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>args&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">list&lt;/span>&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">]):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">with&lt;/span> dagger&lt;span style="color:#0550ae">.&lt;/span>connection&lt;span style="color:#1f2328">():&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Cowsay yüklü bir konteyner oluştur&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ctr &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dag&lt;span style="color:#0550ae">.&lt;/span>container&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">.&lt;/span>from_&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;python:alpine&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">.&lt;/span>with_exec&lt;span style="color:#1f2328">([&lt;/span>&lt;span style="color:#0a3069">&amp;#34;pip&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;install&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;cowsay&amp;#34;&lt;/span>&lt;span style="color:#1f2328">])&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Cowsay&amp;#39;i istenen mesajla çalıştır&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> ctr&lt;span style="color:#0550ae">.&lt;/span>with_exec&lt;span style="color:#1f2328">([&lt;/span>&lt;span style="color:#0a3069">&amp;#34;cowsay&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">*&lt;/span>args&lt;span style="color:#1f2328">])&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>stdout&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>result&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>anyio&lt;span style="color:#0550ae">.&lt;/span>run&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">,&lt;/span> sys&lt;span style="color:#0550ae">.&lt;/span>argv&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#1f2328">:])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Bu kodu çalıştırdığınızda (örneğin &lt;code>python main.py &amp;quot;Merhaba Dagger&amp;quot;&lt;/code>), bir inek şeklinde &amp;ldquo;Merhaba Dagger&amp;rdquo; mesajını verecektir.&lt;/p>
&lt;h1 id="daggerverse-modüller-ekosistemi">Daggerverse: Modüller Ekosistemi&lt;/h1>
&lt;p>Daggerverse, tüm genel Dagger Fonksiyonlarının aranabilir bir dizinidir. Topluluk tarafından oluşturulan modülleri keşfedebilir, nasıl çalıştıklarını öğrenebilir ve kendi projelerinizde kullanmaya başlayabilirsiniz.&lt;/p>
&lt;p>Dagger modülleri, dil bağımsız bir yapıya sahiptir. Yani bir modül Go&amp;rsquo;da yazılmış olsa bile, Python veya TypeScript&amp;rsquo;ten çağırılabilir. Bu özellik, farklı ekiplerin kendi tercih ettikleri dillerde çalışmasına olanak tanır.&lt;/p>
&lt;h1 id="dagger-vs-testcontainers-farklar-ve-avantajlar">Dagger vs Testcontainers: Farklar ve Avantajlar&lt;/h1>
&lt;h2 id="temel-amaç-farkları">Temel Amaç Farkları&lt;/h2>
&lt;p>&lt;strong>Testcontainers&lt;/strong>, veritabanları, mesaj aracıları, web tarayıcıları veya Docker konteynerinde çalışabilen her şey için geçici, hafif örnekler sağlayan açık kaynaklı bir kütüphanedir. Temel amacı, entegrasyon testlerini kolaylaştırmaktır.&lt;/p>
&lt;p>&lt;strong>Dagger&lt;/strong> ise sadece test ortamı sağlamak için değil, genel olarak CI/CD süreçleri ve otomasyonlu iş akışları için tasarlanmıştır.&lt;/p>
&lt;h2 id="daggerın-avantajları">Dagger&amp;rsquo;ın Avantajları&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Geniş Kullanım Alanı:&lt;/strong> Hem test hem de CI/CD süreçleri, otomatik dağıtım ve genel iş akışları için kapsamlı bir çözüm sunar.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Dil Bağımsız Evrensel Tip Sistemi:&lt;/strong> GraphQL tabanlı evrensel bir tip sistemi kullanır, farklı dillerde yazılmış modüller birlikte çalışabilir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Modülerlik ve Kompozisyon:&lt;/strong> Modüller halinde kodlanmış fonksiyonları yeniden kullanabilme ve bunları farklı iş akışlarında birleştirme konusunda esneklik sağlar.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>CI/CD Sistemlerine Kolay Entegrasyon:&lt;/strong> Docker konteynerlerine dayalı tasarımı sayesinde geleneksel CI/CD yöntemlerine göre çeşitli avantajlar sunar.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Yerel Geliştirme ve Test:&lt;/strong> Dagger CLI kullanarak iş akışlarınızı yerel olarak test edebilme özelliğine sahiptir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Önbellekleme Sistemi:&lt;/strong> Tüm işlemleri otomatik olarak önbelleğe alır ve bu önbellekleme her ortamda aynı şekilde çalışır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Yapay Zeka Entegrasyonu:&lt;/strong> LLM&amp;rsquo;ler ile doğal entegrasyon yetenekleri sunar ve AI ajanlarını destekler.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h1 id="dagger-vs-docker-tamamlayıcı-teknolojiler">Dagger vs Docker: Tamamlayıcı Teknolojiler&lt;/h1>
&lt;p>Docker ve Dagger birbirlerinin rakibi değil, birbirlerini tamamlayan teknolojilerdir.&lt;/p>
&lt;h2 id="temel-amaç-ve-odak-noktaları">Temel Amaç ve Odak Noktaları&lt;/h2>
&lt;p>&lt;strong>Docker:&lt;/strong> Uygulamaları konteynerlerde paketlemeye, dağıtmaya ve çalıştırmaya odaklanan bir platformdur.&lt;/p>
&lt;p>&lt;strong>Dagger:&lt;/strong> Docker&amp;rsquo;ın kurucuları tarafından geliştirilen ve CI/CD süreçlerine odaklanan taşınabilir bir geliştirme kitidir.&lt;/p>
&lt;h2 id="ilişkileri-ve-bağlantıları">İlişkileri ve Bağlantıları&lt;/h2>
&lt;p>Dagger, Docker&amp;rsquo;ın bir parçası olan BuildKit&amp;rsquo;i kullanmak üzere tasarlanmıştır ve iş akışlarını konteynerler içinde çalıştırır. BuildKit, gelişmiş önbellek sistemi, yapı görevlerinin paralelleştirilmesi ve Dockerfile&amp;rsquo;daki yeni özelliklerin desteklenmesi sayesinde eski Docker builder&amp;rsquo;dan çok daha verimlidir.&lt;/p>
&lt;h2 id="daggerın-dockera-göre-avantajları">Dagger&amp;rsquo;ın Docker&amp;rsquo;a Göre Avantajları&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>İş Akışı Odaklı:&lt;/strong> Sadece konteynerler oluşturmakla kalmaz, tüm CI/CD süreçlerinizi kod olarak yazmanıza ve bunları standartlaştırmanıza olanak tanır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Yerel Testler:&lt;/strong> Dagger CLI kullanarak süreçlerinizi yerel olarak test edebilme yeteneği, geliştirme ve test süreçlerini kolaylaştırır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Evrensel Tip Sistemi:&lt;/strong> Farklı dillerde yazılmış modüllerin birlikte çalışabilmesini sağlar.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Otomatik Önbellekleme:&lt;/strong> İşlemler önbelleğe alınabilen, değişmez artifaktlar üretir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Entegre Gözlemlenebilirlik:&lt;/strong> İşlemlere izleme, günlük kaydı ve metriklerle tam görünürlük sağlar.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Docker&amp;rsquo;ı Dagger&amp;rsquo;ın yerine değil, Dagger&amp;rsquo;ı Docker&amp;rsquo;ı kullanan ve genişleten bir araç olarak düşünmek daha doğrudur. İki teknoloji birlikte kullanılabilir ve birbirlerini tamamlarlar.&lt;/p>
&lt;h1 id="dagger-ile-kompleks-bir-cicd-örneği">Dagger ile Kompleks Bir CI/CD Örneği&lt;/h1>
&lt;p>Aşağıda, bir Go uygulaması için kapsamlı bir Dagger CI/CD iş akışı örneği bulunmaktadır:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">dagger&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">dagger&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> dag&lt;span style="color:#1f2328">,&lt;/span> function&lt;span style="color:#1f2328">,&lt;/span> object_type
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">@object_type&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">GoPipeline&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">@function&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">build_test_deploy&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> source&lt;span style="color:#1f2328">:&lt;/span> dagger&lt;span style="color:#0550ae">.&lt;/span>Directory&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Tam bir CI/CD iş akışı çalıştırır: lint, test, birden fazla platforma derleme, imaj oluştur, zafiyet tara, yayınla&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Sonuçların ortak depolanacağı dizin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Go projesi yapılandırması&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> go_project &lt;span style="color:#0550ae">=&lt;/span> dag&lt;span style="color:#0550ae">.&lt;/span>golang&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>with_project&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 1. Linting işlemi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> lint_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>lint&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Lint sonucu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>lint_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 2. Çoklu Go sürümleriyle test etme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> version &lt;span style="color:#0550ae">in&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;1.18&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;1.19&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;1.20&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>test&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">,&lt;/span> version&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Go &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>version&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> test sonucu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>test_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 3. Çoklu mimari için derleme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> platforms &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;linux/amd64&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;linux/arm64&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;darwin/amd64&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;windows/amd64&amp;#34;&lt;/span>&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> platform &lt;span style="color:#0550ae">in&lt;/span> platforms&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> build_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>build&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">,&lt;/span> platform&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0a3069">{&lt;/span>platform&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> derleme sonucu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>build_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 4. Docker imajı oluştur&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> image &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> go_project&lt;span style="color:#0550ae">.&lt;/span>build_container&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;İmaj oluşturuldu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>&lt;span style="color:#cf222e">await&lt;/span> image&lt;span style="color:#0550ae">.&lt;/span>id&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 5. Güvenlik taraması&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> scan_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> dag&lt;span style="color:#0550ae">.&lt;/span>trivy&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>scan_container&lt;span style="color:#1f2328">(&lt;/span>image&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Güvenlik taraması sonucu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>scan_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 6. Registr&amp;#39;ye gönderme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reg_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> image&lt;span style="color:#0550ae">.&lt;/span>publish&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;my-registry.io/my-app:latest&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;İmaj yayınlandı: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>reg_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 7. Deployment işlemi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> deploy_result &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> &lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>deploy&lt;span style="color:#1f2328">(&lt;/span>reg_result&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results&lt;span style="color:#0550ae">.&lt;/span>append&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Deployment sonucu: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>deploy_result&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>join&lt;span style="color:#1f2328">(&lt;/span>results&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">@function&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">lint&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> source&lt;span style="color:#1f2328">:&lt;/span> dagger&lt;span style="color:#0550ae">.&lt;/span>Directory&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Go kodunu lint&amp;#39;ler&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> dag&lt;span style="color:#0550ae">.&lt;/span>golang&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>with_project&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>lint&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">@function&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">test&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> source&lt;span style="color:#1f2328">:&lt;/span> dagger&lt;span style="color:#0550ae">.&lt;/span>Directory&lt;span style="color:#1f2328">,&lt;/span> version&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Belirli bir Go sürümüyle testleri çalıştırır&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> dag&lt;span style="color:#0550ae">.&lt;/span>golang&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>with_version&lt;span style="color:#1f2328">(&lt;/span>version&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>with_project&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>test&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">@function&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">build&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> source&lt;span style="color:#1f2328">:&lt;/span> dagger&lt;span style="color:#0550ae">.&lt;/span>Directory&lt;span style="color:#1f2328">,&lt;/span> platform&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Belirli bir platform için Go uygulamasını derler&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> os&lt;span style="color:#1f2328">,&lt;/span> arch &lt;span style="color:#0550ae">=&lt;/span> platform&lt;span style="color:#0550ae">.&lt;/span>split&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;/&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> dag&lt;span style="color:#0550ae">.&lt;/span>golang&lt;span style="color:#1f2328">()&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>with_project&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>build&lt;span style="color:#1f2328">(&lt;/span>os&lt;span style="color:#0550ae">=&lt;/span>os&lt;span style="color:#1f2328">,&lt;/span> arch&lt;span style="color:#0550ae">=&lt;/span>arch&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">@function&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">deploy&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#6a737d">self&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> image_ref&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Uygulamayı deploy eder&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Deployment mantığı burada yer alacak&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Başarıyla deploy edildi: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>image_ref&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Bu örnek şunları göstermektedir:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Modülerlik&lt;/strong>: Her adım ayrı fonksiyonlara bölünmüş&lt;/li>
&lt;li>&lt;strong>Çoklu Platforma Destek&lt;/strong>: Çeşitli işletim sistemleri ve mimariler için derleme&lt;/li>
&lt;li>&lt;strong>Çoklu Sürüm Testi&lt;/strong>: Farklı Go sürümleriyle test etme&lt;/li>
&lt;li>&lt;strong>Otomatik Güvenlik Taraması&lt;/strong>: Trivy modülü ile güvenlik açıklarını tarama&lt;/li>
&lt;li>&lt;strong>Yayınlama ve Deployment&lt;/strong>: İmajı registr&amp;rsquo;ye gönderme ve deployment işlemleri&lt;/li>
&lt;/ol>
&lt;h1 id="dagger-vs-github-actions-farklı-yaklaşımlar">Dagger vs GitHub Actions: Farklı Yaklaşımlar&lt;/h1>
&lt;p>Dagger ve GitHub Actions arasındaki temel fark, yaklaşımlarındadır:&lt;/p>
&lt;h2 id="1-kod-tabanlı-vs-yaml-tabanlı">1. Kod Tabanlı vs YAML Tabanlı&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> İş akışlarınızı herhangi bir programlama dilinde yazabilir ve dilinizin tüm gücünü kullanabilirsiniz.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> İş akışları YAML formatında tanımlanır, bu da daha kısıtlayıcı ve daha az programatik bir yaklaşımdır.&lt;/p>
&lt;h2 id="2-yerel-çalıştırma-ve-hata-ayıklama">2. Yerel Çalıştırma ve Hata Ayıklama&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> İş akışlarınızı yerel olarak hata ayıklayabilir, anında geri bildirim alabilirsiniz.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> İş akışlarını yerel olarak test etmek zordur.&lt;/p>
&lt;h2 id="3-cicd-araçları-arasında-taşınabilirlik">3. CI/CD Araçları Arasında Taşınabilirlik&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> Küçük ve standartlaştırılmış bir yapılandırma ile çalışır, herhangi bir CI/CD ortamında kullanılabilir.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> GitHub&amp;rsquo;a özgüdür, GitHub dışı sürüm kontrol sistemleri için uygun değildir.&lt;/p>
&lt;h2 id="4-iş-akışı-yapısı-ve-paralel-çalışma">4. İş Akışı Yapısı ve Paralel Çalışma&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> Adımları yönlendirilmiş bir asiklik çizge (DAG) olarak düzenler, bağımsız adımlar paralel çalışabilir.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> İşleri paralel çalıştırabilir, ancak bir iş içindeki adımlar sıralı çalışır.&lt;/p>
&lt;h2 id="5-önbellekleme-ve-performans">5. Önbellekleme ve Performans&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> Otomatik ve güçlü önbellekleme sistemi sunar.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> Manuel yapılandırılması gereken daha sınırlı önbellekleme sunar.&lt;/p>
&lt;h2 id="6-ekosistem-ve-entegrasyon">6. Ekosistem ve Entegrasyon&lt;/h2>
&lt;p>&lt;strong>Dagger:&lt;/strong> Dil bağımsız, modüler yapı sunar.&lt;/p>
&lt;p>&lt;strong>GitHub Actions:&lt;/strong> Eylemler Marketplace&amp;rsquo;te çok sayıda önceden hazırlanmış eylem sunar.&lt;/p>
&lt;h2 id="github-actions-ile-daggerı-birlikte-kullanmak">GitHub Actions ile Dagger&amp;rsquo;ı Birlikte Kullanmak&lt;/h2>
&lt;p>İlginç bir şekilde, bu iki aracı birlikte kullanabilirsiniz:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Dagger CI/CD Pipeline&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">on&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">push&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">branches&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#1f2328">[&lt;/span>main]&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">pull_request&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#0550ae">jobs&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">dagger&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">runs-on&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>ubuntu-latest&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">steps&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- &lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Checkout code&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">uses&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>actions/checkout@v4&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>- &lt;span style="color:#0550ae">name&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>Run Dagger pipeline&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">uses&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>dagger/dagger-for-github@v7&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">with&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">verb&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>call&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">args&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>build_test_deploy --source=.&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">cloud-token&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#fff"> &lt;/span>${{ secrets.DAGGER_CLOUD_TOKEN }}&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Bu yaklaşım, Dagger&amp;rsquo;ın programlanabilirliğini GitHub Actions&amp;rsquo;ın kolay kurulumu ve entegrasyonuyla birleştirir.&lt;/p>
&lt;h1 id="sonuç">Sonuç&lt;/h1>
&lt;p>Dagger, modern CI/CD ve iş akışı otomasyonu için güçlü, esnek ve yenilikçi bir çözüm sunmaktadır. Docker&amp;rsquo;ın kurucuları tarafından geliştirilen ve Docker&amp;rsquo;ın temel teknolojisini kullanan Dagger, kod tabanlı yaklaşımı, dil bağımsız yapısı ve yerel test özellikleri ile öne çıkmaktadır.&lt;/p>
&lt;p>Diğer araçlarla karşılaştırıldığında, Testcontainers&amp;rsquo;a göre daha kapsamlı ve genel amaçlı bir çözüm sunarken, GitHub Actions gibi YAML tabanlı CI/CD sistemlerine göre daha programatik ve taşınabilir bir alternatif sunmaktadır.&lt;/p>
&lt;p>Dagger, özellikle karmaşık iş akışları olan, çoklu dilde geliştirme yapan ve yerel test etme ihtiyacı yüksek olan ekipler için ideal bir seçimdir. Özellikle &amp;ldquo;push ve dua et&amp;rdquo; yaklaşımından kurtulmak isteyen yazılım ekipleri için, Dagger gerçek bir devrim niteliğindedir.&lt;/p>
&lt;p>Yazılım dünyasındaki CI/CD yaklaşımınızı iyileştirmek, daha modüler, test edilebilir ve taşınabilir hale getirmek istiyorsanız, Dagger&amp;rsquo;ı mutlaka değerlendirmelisiniz.&lt;/p></content></entry><entry><title>Çoşkuyla ve şükranla #Cumhuriyet100Yaşında</title><author><name/><uri/></author><id>https://hozgan.com/cumhuriyet-tam-100-yasinda/</id><updated>2023-10-29T00:00:00Z</updated><published>2023-10-29T00:00:00Z</published><content type="html">&lt;p>29 Ekim 1923 tarihinde Gazi Mustafa Kemal Atatürk&amp;rsquo;ün liderliğinde kurulan Cumhuriyetimiz, bugün 100. yaşına girdi. Öncelikle &lt;a href="#milli-m%C3%BCcadele-kahramanlar%C4%B1za-sayg%C4%B1yla">Mustafa Kemal Atatürk&amp;rsquo;ü ve silah arkadaşlarını ve sivil direnişimizin tüm milli mücadele evlatlarını&lt;/a> saygıyla ve şükranla anıyorum.&lt;/p>
&lt;p>Cumhuriyetimizin 💯 yıl coşkusunu kutlama bir güne sığamaz, sığamamalı. Bu coşku &lt;a href="#y%C3%BCz%C3%BCnc%C3%BC-y%C4%B1l-i%CC%87%C3%A7in-yaz%C4%B1lan-mar%C5%9Flar">Marşlar&lt;/a>, &lt;a href="#milli-m%C3%BCcadele-ve-cumhuriyet-i%CC%87le-i%CC%87lgili-filmler-ve-diziler">filmler&lt;/a>, &lt;a href="#milli-m%C3%BCcadele-ve-cumhuriyet-i%CC%87le-i%CC%87lgili-filmler-ve-diziler">diziler&lt;/a> ve &lt;a href="#atat%C3%BCrk-i%CC%87le-i%CC%87lgili-kitaplar">kitaplarla&lt;/a> kutlanmalı. Cumhuriyetimizin 100. yılına marşlar, kitaplar, belgeseller, filmler armağan eden herkese teşekkürler. İyi ki varsınız!&lt;/p>
&lt;p>&lt;img src="/images/ilimdir-fendir.png" alt="Hayatta En Hakiki Mürşit">&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;h2 id="ikinci-yüzyılda-cumhuriyet-için-neler-yapabiliriz">İkinci Yüzyılda Cumhuriyet İçin Neler Yapabiliriz?&lt;/h2>
&lt;p>Türk milletine ve cumhuriyetine en büyük zararı, cumhuriyet felsefesinden uzaklaşan ve gizli ajandası olan yönetimler vermiştir. Zararları onarmak için; &lt;a href="#milli-m%C3%BCcadele-ruhu">milli mücadele ruhunu&lt;/a>nu, &lt;a href="#21yy-yetkinlikleri">21.yy yetkinlikleri&lt;/a> ile harmanlayarak ikinci yüzyılımız için bir eğitim seferberliği başlatmalıyız.&lt;/p>
&lt;p>Uzmanlığım olan yazılım alanında bir fikrimi paylaşmak istiyorum:&lt;/p>
&lt;p>Tamamen şeffaf ve liyakat sahibi bir vakıf veya devlet destekli bir oluşum olabilir. Bu oluşum yazılımcılar ve girişimciler yetiştirebilir, destekleyebilir ve onlara mentörlük yapabilir. Bu oluşumun amacı, genç nüfusun girișimcilik ve yazılım alanında yetișmesini sağlamak ve kazancın büyük kısmını eğitim bütçesine harcamalıdır. &lt;a href="#21yy-yetkinlikleri">21.yy yetkinliklerini&lt;/a> ve yazılım ve girişimcilik eğitimleri veremelidir veya bu konularda içerikler üretip udemy, coursera gibi platformlarda yayınlanabilir. Burada alman, fransız amerikan ekollerinin neleri iyi yaptigi araștırılıp, onlardan örnek alınabilir. Bu kurum yurtdışından işler alarak bir danıșmanlık firması gibi köprü görevi görebilir ve yurt içindeki iş gücünü yurt dışındaki şirketler ile buluşturabilir. Bu sayede hem ülke ekonomisine katkı sağlanır hem de ülke dışına nitelikli iş gücünün çıkışı durdurulmuş olabilir. Türkiye nüfusunun genç olması ve Avrupa&amp;rsquo;ya yakın olması büyük bir avantajdır. Tabii kış saati uygulamasına geri dönmek faydalı olacaktır. Benim yıllar önce yazdığım &lt;a href="/acik-sirkey-open-company-yaklasimi">açık şirket yaklaşımı&lt;/a> gibi olabilir.&lt;/p>
&lt;p>Aklımdaki bazı temel prensipler;&lt;/p>
&lt;p>Kurumsal Prensipler:&lt;/p>
&lt;ul>
&lt;li>Sürekli İyileștirme&lt;/li>
&lt;li>Geri bildirim mekanizmaları&lt;/li>
&lt;li>Liyakatlı insan kaynağı&lt;/li>
&lt;li>Şeffaf olmak&lt;/li>
&lt;li>Yurtta sulh, cihanda sulh&lt;/li>
&lt;li>Veriyle konuş&lt;/li>
&lt;/ul>
&lt;p>Bireysel Prensipler:&lt;/p>
&lt;ul>
&lt;li>Sürekli Gelișim ((1.01)^365 = 37.78 (ilerle) / (0.99)^365 = 0.03 (gerile))&lt;/li>
&lt;li>Geri bildirim mekanizmaları&lt;/li>
&lt;li>İş ne olursa olsun, elinden gelenin en iyisini yap!&lt;/li>
&lt;li>Dürüst ve şeffaf olmak (Şeytanlık yapma)&lt;/li>
&lt;li>Arıza Çıkar (konfor alanını terket)&lt;/li>
&lt;li>Veriyle konuş&lt;/li>
&lt;li>Şüpheci ol ve sorgula&lt;/li>
&lt;li>Bir elin nesi var, iki elin sesi var (1 + 1 = 3)&lt;/li>
&lt;li>Teknoloji ve Yapayzeka&amp;rsquo;yi kullanmak. (co-pilot)&lt;/li>
&lt;/ul>
&lt;p>Benzer birșey tarım ve hayvancılık konusunda da yapılabilir. Aracılar en aza indirilip koy kooperatifleri ve koy enstitüsü veya halk evleri gibi kurumlar yeniden hayata geçirilebilir.&lt;/p>
&lt;p>Amacım ahkam kesmek deġil, haddim de deġil, sadece ortaya tartışmak için bir kıvılcım atmak istedim. Doğruyu hepbirlikte bulacağız.&lt;/p>
&lt;p>100.yıl marş şairlerimizden &lt;a href="https://www.youtube.com/watch?v=ccTyHE6VlYQ">Norm Ender&amp;rsquo;in&lt;/a> dediği gibi:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Yürüyoruz arkadaşlar, bu yolda dik yamaçlar
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#34;Zor&amp;#34; ne bilmeyiz, biz pes etmeyiz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Görüyoruz arkadaşlar, ufukta bir amaç var
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Yerde, gökteyiz; yaşamla milletiz
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parla hilal ve yıldızım
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parla beyaz ve kırımızım
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Türk&amp;#39;ün yolu cumhuriyet
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Parla, 100 yaşındasın
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cumhuriyetimizin 100. Yılı Kutlu Olsun! Atatürk&amp;rsquo;ün izinde nice 100 yıllara!&lt;/p>
&lt;p>&lt;img src="/images/cumhuriyet-100-yasinda.png" alt="Cumhuriyet 100 Yasinda">&lt;/p>
&lt;h2 id="yazıda-bahsi-geçen-referanslar">Yazıda Bahsi Geçen Referanslar&lt;/h2>
&lt;h3 id="milli-mücadele-kahramanlarıza-saygıyla">Milli Mücadele Kahramanlarıza Saygıyla&lt;/h3>
&lt;p>Aklima gelen birkac ismi burada anmak istedim. Milli mucadelemizde her kahramanin hikayesi adini burada anmaya sayfalar yetmez. Bu yuzden burada sadece aklima gelen birkac ismi anmak istedim.&lt;/p>
&lt;p>&lt;strong>Mustafa Kemal Atatürk:&lt;/strong> Türkiye Cumhuriyeti&amp;rsquo;nin kurucusu ve ilk cumhurbaşkanı olan Atatürk, Milli Mücadele&amp;rsquo;nin lideriydi. Samsun&amp;rsquo;a çıkarak direnişi başlatan ve Kurtuluş Savaşı&amp;rsquo;nı yöneten Atatürk, aynı zamanda modern Türkiye&amp;rsquo;nin temellerini atmıştır.&lt;/p>
&lt;p>&lt;strong>Mustafa Kemal Paşa&amp;rsquo;nın Yaverleri:&lt;/strong> Atatürk&amp;rsquo;ün yaverleri arasında bulunan Salih Bozok, Cevat Abbas Gürer ve Kılıç Ali gibi isimler, O&amp;rsquo;na oldukça yakın kişilerdi ve birçok önemli olayda yanında bulundular.&lt;/p>
&lt;p>&lt;strong>Rauf Orbay:&lt;/strong> Deniz subayı ve siyaset adamı olan Orbay, Kurtuluş Savaşı sırasında önemli roller üstlenmiş ve Mustafa Kemal Atatürk&amp;rsquo;ün en yakın çalışma arkadaşlarından biri olmuştur.&lt;/p>
&lt;p>&lt;strong>Ali Fuat Cebesoy:&lt;/strong> Milli Mücadele&amp;rsquo;nin önemli komutanlarından biri olan Cebesoy, savaş sırasında Batı Cephesi Komutanlığı yapmıştır.&lt;/p>
&lt;p>&lt;strong>Kazım Karabekir:&lt;/strong> Doğu Cephesi&amp;rsquo;nde Ermeni ve Sovyet güçlerine karşı mücadele veren Karabekir Paşa, aynı zamanda Kuvayi Milliye&amp;rsquo;nin örgütlenmesinde önemli bir rol oynamıştır.&lt;/p>
&lt;p>&lt;strong>Fahrettin Altay:&lt;/strong> Milli Mücadele sırasında Güney Cephesi&amp;rsquo;nde önemli başarılar elde eden Altay, aynı zamanda Türk süvari birliklerinin komutanıydı.&lt;/p>
&lt;p>&lt;strong>İsmet İnönü:&lt;/strong> Atatürk&amp;rsquo;ün en yakın çalışma arkadaşlarından biri olan İnönü, savaş sırasında Batı Cephesi Komutanlığı yapmış ve Başkomutanlık Meydan Muharebesi&amp;rsquo;nde önemli bir rol oynamıştır.&lt;/p>
&lt;p>&lt;strong>Fevzi Çakmak:&lt;/strong> Atatürk&amp;rsquo;ün en yakın çalışma arkadaşlarından biri olan Mareşal Fevzi Çakmak, Türk Silahlı Kuvvetleri&amp;rsquo;nin ilk Genelkurmay Başkanıydı ve Türk Kurtuluş Savaşı&amp;rsquo;nda önemli roller üstlendi.&lt;/p>
&lt;p>&lt;strong>Kâzım Özalp:&lt;/strong> Kâzım Özalp, Kurtuluş Savaşı&amp;rsquo;nda önemli görevlerde bulunan ve Atatürk&amp;rsquo;ün yakın arkadaşlarından biri olarak bilinen bir asker ve devlet adamıydı.&lt;/p>
&lt;p>&lt;strong>Rüştü Erdelhun:&lt;/strong> Atatürk&amp;rsquo;ün yakın arkadaşlarından olan Rüştü Erdelhun, Türk Silahlı Kuvvetleri içinde önemli görevlerde bulunmuş ve Milli Mücadele yıllarında Atatürk&amp;rsquo;le birlikte çalışmıştır.&lt;/p>
&lt;p>&lt;strong>Halide Edib Adıvar:&lt;/strong> Yazar, öğretmen ve siyasetçi olan Adıvar, Milli Mücadele sırasında hem cephe gerisinde hem de cephede aktif bir rol oynamıştır. Özellikle kadınların savaşa katılımını teşvik eden konuşmaları ve yazılarıyla tanınır.&lt;/p>
&lt;p>&lt;strong>Şerife Bacı:&lt;/strong> Kuvayi Milliye&amp;rsquo;ye mühimmat taşırken donarak şehit olan Şerife Bacı, Milli Mücadele&amp;rsquo;nin simge isimlerinden biri haline gelmiştir.&lt;/p>
&lt;p>&lt;strong>Nene Hatun:&lt;/strong> 93 Harbi olarak bilinen 1877-1878 Osmanlı-Rus Savaşı&amp;rsquo;nda Erzurum&amp;rsquo;da Ruslara karşı savaşan ve Milli Mücadele&amp;rsquo;nin ruhunu temsil eden kadın kahramanlardan biridir.&lt;/p>
&lt;p>&lt;strong>Halime Çavuş:&lt;/strong> Kadın kahramanlardan bir diğeri olan Halime Çavuş, Milli Mücadele&amp;rsquo;de silah taşıyarak savaşmıştır.&lt;/p>
&lt;p>&lt;strong>Sütçü İmam:&lt;/strong> Kahramanmaraş&amp;rsquo;ta Fransız işgaline karşı direnişin simgelerinden biri olan ve ilk kurşunu sıkan isimdir.&lt;/p>
&lt;p>&lt;strong>Halit Akmansü:&lt;/strong> Milli Mücadele döneminde Kuvayi Milliye içerisinde yer almış ve önemli görevler üstlenmiş bir sivildir.&lt;/p>
&lt;p>&lt;strong>Hasan Tahsin:&lt;/strong> İzmir&amp;rsquo;in işgali sırasında ilk kurşunu sıkarak direnişi başlatan ve şehit düşen gazeteci ve milliyetçidir.&lt;/p>
&lt;p>&lt;strong>Şehit Kubilay:&lt;/strong> Menemen Olayı&amp;rsquo;nda şehit düşen Asteğmen Mustafa Fehmi Kubilay, Cumhuriyet tarihinin önemli şehitlerinden biridir.&lt;/p>
&lt;p>&lt;strong>Kara Fatma (Fatma Seher Erden):&lt;/strong> Kendi oluşturduğu birlikle cephede savaşan ve erkek kıyafeti giyerek savaşa katılan kadın kahramanlardan biridir.&lt;/p>
&lt;h3 id="atatürk-ile-ilgili-kitaplar">Atatürk İle İlgili Kitaplar&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://bkmkitap.com/gazi-mustafa-kemal-ataturk-281392">Gazi Mustafa Kemal Atatürk - İlber Ortaylı&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/dahi-diktator-294425">Dahi Diktatör - Celal Şengör&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/ataturk">Atatürk / Modern Türkiye’nin Kurucusu - Andrew Mango&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/ataturk-27091">Atatürk - Klaus Kreiser&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://inkilap.com/tek-adam-3-cilt-takim-buyuk-boy-546195">Tek Adam - Şevket Süreyya Aydemir&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="milli-mücadele-ve-cumhuriyet-ile-ilgili-kitaplar">Milli Mücadele ve Cumhuriyet İle İlgili Kitaplar&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://bkmkitap.com/kuvayi-milliye-796251">Kuvayi Milliye - Nazım Hikmet Ran (şair) / Nuri Kurtcebe (çizer)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/kuvayi-milliye-ciltli">Kuvayi Milliye - Nazım Hikmet Ran&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/kurtulustan-kurulusa-cumhuriyet">Kurtuluştan Kuruluşa Cumhuriyet - Sinan Meydan&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/cumhuriyetin-dogusu-833114">Cumhuriyet’in Doğuşu - İlber Ortaylı&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/cumhuriyet-turk-mucizesi-birinci-kitap">Cumhuriyet Türk Mucizesi - Turgut Özakman&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/su-cilgin-turkler">Şu Çılgın Türkler - Turgut Özakman&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/1923-kurulus-ayarlarina-donmek">1923 Kuruluş Ayarlarına Dönmek - Sinan Meydan&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/modern-turkiyenin-dogusu">Modern Türkiye’nin Doğuşu - Bernard Lewis&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/modernlesen-turkiyenin-tarihi-354062">Modernleşen Türkiye&amp;rsquo;nin Tarihi - Erik Jan Zürcher&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bkmkitap.com/nutuk-221882">Nutuk - Mustafa Kemal Atatürk&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/playlist?list=PLMJDRxUD_BGlDoCDeu1EDgx8pufQUvTvS">Nutuk (sesli kitap)&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="milli-mücadele-ve-cumhuriyet-ile-ilgili-filmler-ve-diziler">Milli Mücadele ve Cumhuriyet İle İlgili Filmler ve Diziler&lt;/h3>
&lt;h4 id="filmler">Filmler&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=bOzC3g6wamU">Dersimiz Atatürk&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=w-B2-PVuFkU">Bir Millet Uyanıyor&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="diziler">Diziler&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/playlist?list=PLm3-FYEZRvRdFVperk6eI9uKfiu5AnXil">Kurtuluş&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/playlist?list=PLm3-FYEZRvRer1izrVH6OaSeOYYR-7DOH">Cumhuriyet&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="yüzüncü-yıl-için-yazılan-marşlar">Yüzüncü Yıl İçin Yazılan Marşlar&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=DoaZYRNWdf8">Turan Manafzade - Türkiye Cumhuriyeti 100. yıl marşı&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=bdgV56wZZ3k">Tarkan - Sen Rahat Uyu&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=qpX3X2QL6m4">Soner Arıca &amp;amp; Fatsa Çocuk ve Gençlik Korosu - Cumhuriyet Marşı&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=7RskB9QPZhc">Orhan Koyuncu - Hep Senin İzinde&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=3QcLVEBGzRw">Paul Dwyer &amp;amp; Eren Joseph Dwyer - 100. Yıl Marşı&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=GRmGMwf9Krs">Ege - Cumhuriyet Sonsuza Dek&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=ccTyHE6VlYQ">Norm Ender - Parla&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=fdtnlR4LV8c">Kenan Doğulu - İkinci Yüzyıl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=TNncrQz3UG0">Kıraç - 100. Yıl Cumhuriyet Marşı&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="diğer-referanslar">Diğer Referanslar&lt;/h3>
&lt;h4 id="milli-mücadele-ruhu">Milli Mücadele Ruhu&lt;/h4>
&lt;ol>
&lt;li>Ulusal Bağımsızlık ve Özgürlük:
Milli mücadele ruhu, öncelikle ulusal bağımsızlık ve özgürlüğe duyulan derin bir arzuyu ifade eder. İşgal altındaki bir ülkenin, kendi kaderini tayin etme hakkını savunmak ve özgür bir ulus olarak var olmak için verdiği mücadeledir.&lt;/li>
&lt;li>Fedakarlık ve Kahramanlık:
Bu dönem, halkın büyük fedakarlıklar yaptığı ve pek çok kahramanın ortaya çıktığı bir zamanı ifade eder. Askerlerin, sivillerin ve tüm ulusun, bağımsızlık uğruna canlarını ortaya koymaları, bu ruhun temel taşlarındandır.&lt;/li>
&lt;li>Liderlik ve Vizyon:
Mustafa Kemal Atatürk&amp;rsquo;ün liderliği ve vizyonu, Milli Mücadele döneminde kritik bir rol oynamıştır. O&amp;rsquo;nun stratejik düşünce yeteneği, kararlılığı ve ulusal birlik mesajları, halkı mücadeleye sevk etmiş ve zaferin temelini atmıştır.&lt;/li>
&lt;li>Ulusal Birlik ve Beraberlik:
Milli mücadele ruhu, aynı zamanda ulusal birlik ve beraberliği de ifade eder. Türk halkı, farklı etnik kökenlerden, sosyal sınıflardan ve bölgelerden gelmelerine rağmen, ortak bir amaç uğruna bir araya gelmiş ve birlik içinde mücadele etmiştir.&lt;/li>
&lt;li>Direnç ve Azim:
Bu dönem, Türk halkının gösterdiği direnç ve azmi simgeler. Zor koşullar altında bile, halkın moralini yüksek tutma, inançlarını koruma ve mücadeleden vazgeçmeme azmi, bu ruhun bir parçasıdır.&lt;/li>
&lt;li>Değişim ve Yeniden Doğuş:
Milli Mücadele dönemi aynı zamanda bir değişim ve yeniden doğuş dönemidir. Zaferin kazanılmasının ardından, Türkiye Cumhuriyeti&amp;rsquo;nin kurulması ve çağdaş, laik ve demokratik bir devlet yapısına geçiş, bu ruhun bir sonucu olarak görülebilir.&lt;/li>
&lt;li>Umut ve İyimserlik:
Bu ruh, zorluklar karşısında bile umutlu olmayı ve daha iyi bir geleceğe olan inancı sürdürmeyi ifade eder.&lt;/li>
&lt;li>Kültürel ve Tarihsel Bilinç:
Milli mücadele, genellikle ulusal tarih ve kültürle yeniden bağlantı kurmayı içerir. Geçmişin kahramanları ve olayları anılarak, gelecek nesillere ilham kaynağı oluşturulur.&lt;/li>
&lt;/ol>
&lt;h4 id="21yy-yetkinlikleri">21.yy Yetkinlikleri&lt;/h4>
&lt;ol>
&lt;li>Eleştirel Düşünme ve Problem Çözme:
Problem çözme ve analitik düşünme yeteneğini geliştirmek.
Bilgiyi değerlendirme ve mantıklı sonuçlara varabilme yetisi.&lt;/li>
&lt;li>Yaratıcılık:
Yenilikçi düşünme ve özgün fikirler üretebilme yeteneği.
Var olan sorunlara alternatif çözümler bulabilme.&lt;/li>
&lt;li>İletişim Becerileri:
Etkili yazılı ve sözlü iletişim kurabilme.
Farklı platformlarda ve ortamlarda iletişim becerilerini kullanabilme.&lt;/li>
&lt;li>İşbirliği ve Takım Çalışması:
Farklı yeteneklere ve bakış açılarına sahip bireylerle işbirliği yapabilme.
Ortak hedeflere ulaşmak için takım içinde etkili çalışabilme.&lt;/li>
&lt;li>Dijital Okuryazarlık:
Teknolojik araç ve kaynakları etkili bir şekilde kullanabilme.
Bilgiye ulaşma, değerlendirme ve kullanma yetisi.&lt;/li>
&lt;li>Esneklik ve Uyum Yeteneği:
Hızlı değişen koşullara ve ortamlara uyum sağlayabilme.
Belirsizlik ve stres altında etkili çalışabilme.&lt;/li>
&lt;li>Girişimcilik:
Yenilikçi fikirler geliştirebilme ve bu fikirleri hayata geçirebilme.
Risk alma ve sorumluluk üstlenebilme.&lt;/li>
&lt;li>Kültürel Farkındalık ve Duyarlılık:
Farklı kültürlerden ve arka planlardan gelen bireylerle etkileşim kurabilme.
Küresel bağlamda etkileşimde bulunabilme ve empati geliştirebilme.&lt;/li>
&lt;li>Öğrenmeye Açıklık:
Sürekli öğrenme ve kendini geliştirme motivasyonu.
Yeni bilgileri ve becerileri hızla öğrenme ve uygulama yetisi.&lt;/li>
&lt;li>Liderlik ve Sosyal Etki:
İnsanları motive edebilme ve liderlik yapabilme.
Sosyal sorumluluk bilinciyle hareket edebilme.&lt;/li>
&lt;li>Finansal Okuryazarlık:
Finansal okuryazarlık, bireylerin finansal konularda bilgi sahibi olmalarını, finansal terimleri anlamalarını ve finansal kararlar alabilme yetisi.&lt;/li>
&lt;li>İnovasyon: Mevcut ürün veya süreçleri iyileştirebilme. Yaratıcı problem çözme becerileri geliştirebilme. Değişime açık olabilme.&lt;/li>
&lt;/ol></content></entry><entry><title>Kırkından sonra gitar çalmayı öğrenmek</title><author><name/><uri/></author><id>https://hozgan.com/kirkindan-sonra-gitar-calmayi-ogrenmek/</id><updated>2021-10-16T00:00:00Z</updated><published>2021-10-16T00:00:00Z</published><content type="html">&lt;p>Eskiden beri içimde uhde olan bir şeydi gitar çalmak. Hatta 20&amp;rsquo;li yaşlarımın başında, askere gitmeden önce bir klasik gitar almışlığım ve sonra sadece bağlama dersi veren birini bulabildiğim için bağlama ile değiştirip sonra ikisini de öğrenememişliğim söz konusu.&lt;/p>
&lt;p>Yıllar sonra blues müziğine olan hayranlığım bu müzik aletini çalma isteğimi yeniden tetikledi. Bu sefer ciddi bir şekilde araştırmaya başladım ne nedir, stratocaster nedir, telecaster nedir, les paul nedir vs.. sorular sordukça daha çok sorular çıktı karşıma. Ama eğlenceli bir yolculuk başladı benim için çünkü sorularıma cevap veren bir sürü youtube kanalı blog ve online kurs materyali vardı.&lt;/p>
&lt;p>Dinlediğim müziklerden dolayı bir stratocaster almaya karar verdim, ilk seferinde bütçeniz olsa bile iyi bir gitar almayın deniyordu - hata mı yaptım bilmiyorum ama ben kendime bir &amp;ldquo;Fender FSR Tribute Stratocaster&amp;rdquo; aldım. (Laf aramızda aldığıma hiç pişman değilim açıkçası, umarım olmam!)&lt;/p>
&lt;figure>&lt;img src="/images/fender-fsr.png"
alt="fender fsr tribute">
&lt;/figure>
&lt;p>Uzun zamandır öğrenme konusunda bir zaman baskı hissettmediğim birşey uğraş buldum. Ve her anın tadını çıkarıyorum. Öğrenme konusunda ilk başlarda youtube ve udemyden faydalandım fakat sistematik bir çalışma için ben açıkçası &lt;a href="https://www.fender.com/play">&amp;ldquo;Fender Play&amp;rdquo;&lt;/a> uygulaması üzerinden (tam istediğim tempoda) ilerliyorum. Ücretli olmasına rağmen gerçekten çok iyi ve geri bildirim alabiliyorum.&lt;/p>
&lt;h4 id="udemy-uzerinde-türkçe-ve-ingilizce-eğitimler">Udemy uzerinde türkçe ve ingilizce eğitimler&lt;/h4>
&lt;ul>
&lt;li>Turkce
&lt;ul>
&lt;li>Deniz Sayman
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/yeni-baslayanlar-icin-elektro-gitar">https://www.udemy.com/course/yeni-baslayanlar-icin-elektro-gitar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/elektro-gitar-orta-ileri-seviye">https://www.udemy.com/course/elektro-gitar-orta-ileri-seviye&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/gitar-ekipman-amfi-pedal-prosesor-vst-kullanm-ayar">https://www.udemy.com/course/gitar-ekipman-amfi-pedal-prosesor-vst-kullanm-ayar&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Mesut Uğurel
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/mu-masterclass/learn/lecture/15156640">https://www.udemy.com/course/mu-masterclass/learn/lecture/15156640&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Selim Işık (henuz dersleri detaylı incelemedim)
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/selimisikgitardersi/learn/lecture/12640582">https://www.udemy.com/course/selimisikgitardersi/learn/lecture/12640582&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ingilizce
&lt;ul>
&lt;li>Henry Olsen Beginner Blues Guitar
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/beginner-blues-guitar">https://www.udemy.com/course/beginner-blues-guitar&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Kevin Webb - Learn Guitar Repair Series
&lt;ul>
&lt;li>&lt;a href="https://www.udemy.com/course/learn-guitar-repair">https://www.udemy.com/course/learn-guitar-repair&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/learn-guitar-repair-module-2-setting-up-your-guitar">https://www.udemy.com/course/learn-guitar-repair-module-2-setting-up-your-guitar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/learn-guitar-repair-module-3-making-a-new-bone-nut">https://www.udemy.com/course/learn-guitar-repair-module-3-making-a-new-bone-nut&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/learn-guitar-repair-module-4-fret-repair">https://www.udemy.com/course/learn-guitar-repair-module-4-fret-repair&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.udemy.com/course/learn-guitar-repair-module-5-stone-and-profile">https://www.udemy.com/course/learn-guitar-repair-module-5-stone-and-profile&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;figure>&lt;img src="/images/domates-ve-ben.png"
alt="Domates ve Ben" width="150px">
&lt;/figure>
&lt;h4 id="youtube-kanalları">Youtube Kanalları&lt;/h4>
&lt;ul>
&lt;li>Turkce
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/channel/UCLrZVjEBh_9Pqxw7625AgJw">Gökhan Büyükkara (tam bir efsane)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/DenizSaymanGitar">Deniz Sayman&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/selim%C4%B1%C5%9F%C4%B1kgitar">Selim Işık&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/An%C4%B1lYazarcovers">Anıl Yazar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=x9rQBp4CqD4&amp;amp;list=PLSm53SvGjia44zaUe5WiFq31GFLZ3LOSa&amp;amp;ab_channel=AllianzMottoM%C3%BCzik">Nurkan Renda&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/channel/UC6Fw94xn2WKkghs-d6682QA">Gitar Edavat&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ingilizce
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/c/PaulDavids">Paul Davids (tam bir efsane)&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/user/deebsandjess">Darrell Braun Guitar&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/PhillipMcKnight">Phillip McKnight&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/andertons">Andertons Music Co&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/user/PeachGuitars">Peach Guitars&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/PerfectoDeCastro10string">Perfecto De Castro&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/c/TheGuitarGeek">The Guitar Geek&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/user/MrPolevaulter">Elmo Karjalainen&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/user/EytschPi42">42 Gear Street (event)&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Son olarak bu hassas aletlerin bakımı ve ayarı doğru verimi almak adına çok önemli. Bu nedenle bir lutiye (luthier / telli müzik aletleri ustası) ye ihtiyacınız olacak. İstanbul&amp;rsquo;dan bir ustanın adını paylaşayım. &lt;a href="https://www.gitaratolyesi.com/">Ekrem Özkarpat&lt;/a>&lt;/p>
&lt;h4 id="kısaltmalar">Kısaltmalar&lt;/h4>
&lt;ul>
&lt;li>FSR: Fender Special Run&lt;/li>
&lt;li>FMT: Flame Maple Top&lt;/li>
&lt;li>HSS: Humbucker, Single, Single pickups&lt;/li>
&lt;li>HH: Humbucker, Humbucker pickups&lt;/li>
&lt;/ul>
&lt;h4 id="gitar-tipleri">Gitar Tipleri&lt;/h4>
&lt;ul>
&lt;li>Stratocaster (Fender, Squier)&lt;/li>
&lt;li>Telecaster (Fender, Squier)&lt;/li>
&lt;li>Les Paul (Gibson, Epiphone)&lt;/li>
&lt;li>ES (Gibson, Epiphone)&lt;/li>
&lt;li>SG (for Metal, Gibson)&lt;/li>
&lt;/ul></content></entry><entry><title>Teknik yazılarım 'netologist.org' adresinde olacak</title><author><name/><uri/></author><id>https://hozgan.com/teknik-yazilarim-netologist-org-adresinde/</id><updated>2021-10-11T00:00:00Z</updated><published>2021-10-11T00:00:00Z</published><content type="html">&lt;p>Pek bu blogumu artık bir takip eden oldugunu düşünmüyorum ama yine de tarihe not düşmek istedim.&lt;/p>
&lt;p>Yazılım alanındakı teknik yazılarımı ingilizce olarak &lt;a href="https://netologist.org">netologist.org&lt;/a> adresinde yayınlamaya devam edeceğim.
Bu adreste artık teknik yazılar yayınlamayı düşünmüyorum.&lt;/p></content></entry><entry><title>Kolektif akıl üzerine karalamalar</title><author><name/><uri/></author><id>https://hozgan.com/kollektif-akil-uzerine-karalamalar/</id><updated>2019-04-25T00:00:00Z</updated><published>2019-04-25T00:00:00Z</published><content type="html">&lt;p>Uzun bir süredir buraya birşeyler yazmadığımın farkındayım. Bir çok şey oldu değişti hayatımda. Mesela, 5 yıllık bir babayım ve son bir yıldır Londra&amp;rsquo;da yaşıyorum.&lt;/p>
&lt;p>Yeniden blog yazmaya başlama sebebim burayı not defteri olarak kullanmaya karar vermiş olmam ve öz-çalışma disiplini sağlamak ve yaptıklarımı kayıt altına almak şeklinde kısaca özetleyebilirim.&lt;/p>
&lt;p>Bu blog&amp;rsquo;ta &lt;code>kolektif akıl&lt;/code> çevresinde çeşitli paylaşımlarda bulunacağım.&lt;/p>
&lt;p>Konu başlıkları;&lt;/p>
&lt;ul>
&lt;li>Araç incelemesi (jupyter, kafka, keycloak, spark, vs-code, kubernetes, casbin vb.)&lt;/li>
&lt;li>Teknikler hakkında incelemeler (pair programming, tdd, oauth2 vb.)&lt;/li>
&lt;li>Gündeme dair minik yazılar&lt;/li>
&lt;li>Sıfırdan bir proje yazarken deneyimlediklerim. (Aklımda bir not alma uygulaması var.)&lt;/li>
&lt;li>Ayda bir &lt;a href="https://github.com/papers-we-love/papers-we-love/tree/master/distributed_systems">papers we love&lt;/a> adresinden aldığım, dağıtık sistemler hakkında bir teknik makale çevirisi.&lt;/li>
&lt;/ul>
&lt;p>Başlıca kullanmayı planladığım araçlarım;&lt;/p>
&lt;ul>
&lt;li>Proglama dilleri ( &lt;a href="/dictionary/golang">Golang&lt;/a>*, Javascript, Elixir, Kotlin, Python)&lt;/li>
&lt;li>Editor (Visual Studio Code)&lt;/li>
&lt;li>DevOps (Docker, kubernetes, concourse, terraform)&lt;/li>
&lt;li>Cloud (Google Cloud Platform)&lt;/li>
&lt;li>Yapay Zeka (Jupyter, Pandas, Scikit-Learn)&lt;/li>
&lt;/ul></content></entry><entry><title>Fonksiyonel Programlama</title><author><name/><uri/></author><id>https://hozgan.com/fonksiyonel-programlama/</id><updated>2013-03-30T00:00:00Z</updated><published>2013-03-30T00:00:00Z</published><content type="html">&lt;p>Fonksiyonel Programlama, günümüz web dünyasında her programcının bilmesi ve uygulaması gereken bir programlama paradigmasıdır. Nedenini bu yazının ilerleyen satırlarında bulacaksınız. Bu konu hakkında araştırma yaparken Türkçe kaynağın çok az ve yetersiz olduğunu gördüm. Bende bu konuyu dilim döndüğünce blogumda paylaşmaya karar verdim. Yeni öğrendiğim bir konu olduğu için, hatalı ve yanlış anlaşılmaya müsait olan noktalar olabilir. Eğer fonksiyonel programlamaya yıllarınızı verdiyseniz bu yazıya katkıda bulunabilirsiniz. Eğer benim gibi bu konuda yeniyseniz (devamının gelmesini umduğum) bu giriş yazısı umarım sizin için iyi bir başlangıç olur.&lt;/p>
&lt;p>Fazla vakit kaybetmeden gelin fonksiyonel programlama paradigmasını daha yakından inceleyelim.&lt;/p>
&lt;p>&lt;img src="/files/2013/03/functional-programming.png" alt="Fonksiyonel Programlama">&lt;/p>
&lt;h2 id="nedir">Nedir?&lt;/h2>
&lt;p>Programlama dilleri, imperatif (Java, C, C++ vb.) ve dekleratif (Lisp, Haskel vb.) diller olmak üzere ikiye ayrılır. Fonksiyonel programlamada bir deklaratif bir dildir. Bu dil, matematikteki fonksiyonlara ait tüm özellikleri taşır. Fonksiyonların aldıkları parametreler ve geri dönüş değerleri sabittir ve değişiklik göstermez. Yani, yan-etkiler (&lt;strong>side-effect&lt;/strong>) bulunmaz.&lt;/p>
&lt;p>Yıllarca nesne yönelimli programlama dilleriyde çalışmış birinin, hemen fonksiyonel paradigmaya ait konuları anlaması çok kolay olmuyor maalesef. Nesne yönelimli bir programcının öncellikle değişkenler ve döngüler olmadan nasıl kod yazacağını düşünmesi gerekiyor. Bize hep herşeyi nesneler olarak küçük görevlere ayırmamız sonra bu görevleri doğru bir şekilde sınıflamamız öğretildi. Fonksiyonel programlamada, herşey fonksiyonlarla yapılır. Merak etmeyin fonksiyonel programlamanın ne olduğunu &lt;em>&amp;ldquo;Nasıl&amp;rdquo;&lt;/em> başlığı altında ve örnekler yaptıkça daha iyi anlayacağız.&lt;/p>
&lt;p>Fonksiyonel programlamada değişkensiz ve döngüsüz bir hayat &lt;em>nasıl olur&lt;/em> sorusuna güzel bir örnek olarak; hepimizin az-çok bildiğini düşündüğüm excel gibi elektronik tablo (spreadsheets) türevi yazılımları verebiliriz. Elektronik tablo yazılımlarında her hücre bir değer alır ve geri döner. İç içe fonksiyonlar çağrılabilir. Hücre grubu liste olarak bir başka hücreye parametre olarak verilebilir. Birbirinden habersiz olarak sadece kendi etki alanlarından beklenen işi yaparlar. Bu konuda stackoverflow&amp;rsquo;da okuduğum &lt;a href="http://stackoverflow.com/a/1956514/204928">makalelere&lt;/a> göz atabilirsiniz.&lt;/p>
&lt;p>Bir başka örnekte, unix terminallerde, bir komut çıktısını başka bir komut setine aktarmak için kullanılan pipe (|) güzel bir fonksiyonel çağrı örneği olabilir. Aşağıdaki örneği inceleyebilirsiniz.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># &amp;#34;IMPERATIVE TERMINAL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ ./program1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ ./program2 --param1&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ ./program3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># &amp;#34;FUNCTIONAL TERMINAL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ ./program1 &lt;span style="color:#1f2328">|&lt;/span> ./program2 --param1&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">1&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> ./program3&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Fonksiyonel programlama deyince; web geliştiricisi olarak, hepimiz aslında fonksiyonel programlamanın bazı özelliklerini farkında olarak yada olmayarak kullanıyoruz. Eğer fonksiyonel programlama hakkında biraz araştırma yaptıysanız, &amp;ldquo;javascript fonksiyonel bir dildir&amp;rdquo; gibi birşeyler duymuş olabilirsiniz. &lt;strong>first-class&lt;/strong> fonksiyonları ve &lt;strong>lambda&lt;/strong>ları desteklemesi göz önünde bulundurulursa fonksiyonel bir dil olarak düşünülebilir. Fakat fonksiyonel programlama sadece bu konulardan ibaret değildir. Bu yüzden literatülde javascript bir fonksiyonel programla dili olarak kabul edilmez. &lt;a href="http://stackoverflow.com/a/3962690/204928">stackoverflow&amp;rsquo;daki şu tartışmayı&lt;/a> inceleyebilirsiniz.&lt;/p>
&lt;p>Şimdi gelin neden fonksiyonel programlama gerekli onu biraz irdeleyelim.&lt;/p>
&lt;h2 id="neden">Neden?&lt;/h2>
&lt;p>Günümüz dünyasında web eş-zamanlı, dinamik ve ölçeklenebilir bir hale geldi. Örneğin, gönderdiğimiz bir tweet anlık olarak takipçiler tarafından görüntülenir ve arama sonuçlarına yansıtılır. Yüzlerce insan aynı anda bir web sitesini, bir fotoğrafı veya bir blog yazısını facebookta beğenebiliyor yada paylaşabiliyor. Altında ciddi bir mühendislik olan bu siteler nasıl hızlı ve anlık olarak çalışabiliyorlar hiç düşündünüz mü? Cevabınız işlemcilerin veya donanımların güçlenmesi, moore yasası kanunun geçerliliğini koruması vb gibi cevaplar aklınıza geliyorsa maalesef yanılıyorsunuz. Donanımların güçlenmesi tek başına asla yeterli olmamış ve olmayacaktır.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Moore Yasası&lt;/strong> Her 18 ayda bir tümleşik devre üzerine yerleştirilebilecek bileşen sayısının iki katına çıkacacağını, bunun bilgisayarların işlem kapasitelerinde büyük artışlar yaratacağını, üretim maliyetlerinin ise aynı kalacağını, hatta düşme eğilimi göstereceğini öngören deneysel gözlem.&lt;/p>&lt;/blockquote>
&lt;p>Donanım mühendisleri &lt;em>Moore Yasası&lt;/em> doğrultusunda, fiziksel sınırları zorlayarak sona geldiklerinde, paralel çekirdek mimarileri tasarlamaya ve geliştirmeye başladılar. Böylece hayatımıza 2, 4 vb&amp;hellip; şeklinde çok çekirdekli, paralel çalışabilen işlemciler girdi. Hız için yapılan bu geliştirme beraberinde paralel programlama ihtiyacınıda beraberinde getirdi.&lt;/p>
&lt;p>Paralel programlama yaparken dikkat edilmesi gereken en önemli konu non-deterministik olmasıdır. Yani aynı sonuçlar altında aynı durumu vermesidir. Web dünyasında bu nedenle durum tutmayan (&lt;strong>stateless&lt;/strong>) önemlidir. Concurrent programlamada thread konuları söz konusu olduğunda değişmeyen veriler (&lt;strong>immutable&lt;/strong>) kullanmak ve saf yani (&lt;strong>pure-function&lt;/strong>) yan-etkisi olmayan fonksiyonlar kullanmak gereklidir.&lt;/p>
&lt;p>Bu yüzden paralel programlama algoritmaları ve çözümlerinin yolu mutlaka fonksiyonel programlama pratiklerinden geçer.&lt;/p>
&lt;p>Paralel programlama ve donanım neden yeterli olmadığı bir Google örneği vermek istiyorum. Google&amp;rsquo;ın ilk kurulduğu yıllarda tüm interneti depolamak için neden normal PCler kullandı hiç düşündünüz mü? Bunun yerine süper bilgisayarlar üzerinde koşan verilerin kudretli kahini Oracle&amp;rsquo;ın veritabanı ile siteleri indekslemek yerine elektronik tablo gibi kolon tabanlı bir veri mimarisi kullandı? Maalesef çok büyük verileri yönetmek için ilişkisiel veritabanlarının yük dağılımı ile ilgili sorunları oluşmaya başlıyor. Ayrıca Oracle gibi veritabanları pahalı bilgisayarlar üzerinde koşarlar. Bozulma ihtimallerine karşı yedekleme maaliyeti çok yüksek. Google bir mühendislik şirketi olarak fonksiyonel programlamada olduğu gibi bir çok düğümden (node) oluşan mozaik bir mimari kurdu. Bu mimari sayesinde, ölçeklenebilirliğin gerektirdiği bölünebilme toleransı &lt;em>(partition tolerance)&lt;/em> sağlanmış oldu &lt;em>(bknz. &lt;a href="http://en.wikipedia.org/wiki/CAP_theorem">CAP Theorem&lt;/a>)&lt;/em>. Ucuz maaliyetli bu bilgisayarlardan bir yada birkaçı bozulsa bile arama motoru çalışmaya ve sonuçlar getirmeye devam edecekti. Kısacası Google&amp;rsquo;ın &lt;em>BigTable&lt;/em> adını verdiği sonra &lt;em>Apache Foundation&lt;/em> tarafından bir benzeri yapılan &lt;em>Hadoop&lt;/em> teknolojisi fonksiyonel programlama paradigmasını kuralları üzerine kurulmuştur. (bknz. &lt;a href="http://hadoop.apache.org/docs/r1.0.4/mapred_tutorial.html">Map-Reduce&lt;/a>)&lt;/p>
&lt;p>İşte web dünyasında fonksiyonel programlama dillerine sıcak bakmasının sebebi budur. &lt;em>Dağıtık mimariler kurmak!&lt;/em> Fonksiyonel programlama dilleri dağıtık mimariler için bir kodlama disiplini sağlar. Paralel programlamada istenmeyen yan-etkisi (side-effect) bulunan fonksiyonlar olmasına izin verilmez. Eğer yan etki gerektiren bir durum varsa, Bu gibi durumlarda &lt;strong>monad&lt;/strong> diye adlandırılan bir teknik kullanılır.&lt;/p>
&lt;p>İşte bu sebeple bir web programcısı için fonksiyonel programlama önemlidir. Belki bu disiplini kazandırmak için; PHP, Java gibi eski web dilleri fonksiyonel paradigmayı destekler özellikleri kendilerine katmaya başladılar.&lt;/p>
&lt;h2 id="nasıl">Nasıl?&lt;/h2>
&lt;p>Aşağıda genel fonksiyonel programlama kavramlarına kısaca değinilmiş ve örnekler verilmiştir.&lt;/p>
&lt;h3 id="pure-functions">Pure Functions&lt;/h3>
&lt;p>Saf fonksiyonlar, yan etki barındırmayan fonksiyonlara denir. Peki yan etki nedir?&lt;/p>
&lt;p>Yan-etki &lt;em>(side-effect)&lt;/em>, genel olarak programlamada bir fonksiyonun kendi kapsama (scope) alanı dışında birşeyleri değiştirmesi durumudur.&lt;/p>
&lt;p>Fonksiyonel programlamada &amp;ldquo;değisken&amp;rdquo; diye bir kavram olmadığından ve her şey eninde sonunda bir fonksiyon oldugundan &amp;ldquo;degistirebileceginiz&amp;rdquo; degiskenler ve durumlar aslında yoktur. Ama yan etki illa, değişken olması gerekmez. Konsola çıktı yazmak, loglama yapmak, ekrana pencere çıkarmak, sistemdeki dosya, yazıcı, kamera gibi başka kaynaklara erişmek hepsi yan etkiye sebep olur.&lt;/p>
&lt;p>Bu yüzden derleyici yan etkiye yol açan fonksiyonları sıralı olarak çağırır. Paralel çalışmalarına izin vermez.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> pureFunc&lt;span style="color:#0550ae">(&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> y &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> x &lt;span style="color:#0550ae">+&lt;/span> y&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> nonPureFunc&lt;span style="color:#0550ae">(&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> y &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> println&lt;span style="color:#0550ae">(&lt;/span>x &lt;span style="color:#0550ae">+&lt;/span> y&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">//&lt;/span> because write to screen &lt;span style="color:#0550ae">(&lt;/span>side&lt;span style="color:#0550ae">-&lt;/span>effect alert&lt;span style="color:#0550ae">!)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="lists-and-tuples">Lists and Tuples&lt;/h3>
&lt;p>Fonksiyonel programlamada listeler çok önemlidir. Veri grupları (tuples) ise farklı veri tiplerini barındırabilir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// tuples example
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#cf222e">val&lt;/span> tuple &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#cf222e">new&lt;/span> &lt;span style="color:#1f2328">Tuple3&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;hello&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#1f2328">Console&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// list example
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#cf222e">val&lt;/span> days &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">List&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Sunday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Monday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Tuesday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Wednesday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Thursday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Friday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Saturday&amp;#34;&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="recursive-functions">Recursive Functions&lt;/h3>
&lt;p>Döngü yerine kendini çağıran (&lt;strong>recursive&lt;/strong>) fonksiyonlar kullanılarak yapılır demiştik hatırlarsanız. Değişken diye birşey yoktur, değişkenlerde fonksiyonların kendisidir demiştik.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> whileLoop&lt;span style="color:#0550ae">(&lt;/span>cond&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span>&lt;span style="color:#1f2328">Boolean&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> block&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span>&lt;span style="color:#1f2328">Unit&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Unit&lt;/span> &lt;span style="color:#0550ae">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>cond&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> block
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> whileLoop&lt;span style="color:#0550ae">(&lt;/span>cond&lt;span style="color:#0550ae">,&lt;/span> block&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//scala&amp;gt; val a = Array(1, 2, 3)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//scala&amp;gt; var i = 0
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//scala&amp;gt; whileLoop(i &amp;lt; a.length, { println(i); i += 1 })
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//2
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#0550ae">//&lt;/span>&lt;span style="color:#0550ae">3&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="high-order-functions">High-Order Functions&lt;/h3>
&lt;p>Herşey fonksiyonlar yapılır ve fonksiyonlarda değişken gibidir demişken, bir fonksiyon başka bir fonksiyonu parametre olarak alabilir. Buna &lt;strong>high-order functions&lt;/strong> denir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> apply&lt;span style="color:#0550ae">(&lt;/span>f&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> &lt;span style="color:#1f2328">String&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> v&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> f&lt;span style="color:#0550ae">(&lt;/span>v&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> layout&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>x&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;[&amp;#34;&lt;/span> &lt;span style="color:#0550ae">+&lt;/span> x&lt;span style="color:#0550ae">.&lt;/span>toString&lt;span style="color:#0550ae">()&lt;/span> &lt;span style="color:#0550ae">+&lt;/span> &lt;span style="color:#0a3069">&amp;#34;]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// println( apply( layout, 10) )
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#0550ae">//[&lt;/span>&lt;span style="color:#f6f8fa;background-color:#82071e">10&lt;/span>&lt;span style="color:#0550ae">]&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="anonymous-functions-lambda-expressions">Anonymous Functions (Lambda Expressions)&lt;/h3>
&lt;p>Bir fonksiyon tanımı yapılmadan yani bir kod blogu olarak kullanılabilir. Buna &lt;strong>lambda&lt;/strong> yada &lt;strong>anonymous functions&lt;/strong> denir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&amp;gt;&lt;/span> x &lt;span style="color:#0550ae">+&lt;/span> &lt;span style="color:#0550ae">1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="currying">Currying&lt;/h3>
&lt;p>Fonksiyona ait parametrelerin azaltılması gerekebilir. Buna &lt;strong>currying&lt;/strong> denir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> divisibleby&lt;span style="color:#0550ae">(&lt;/span>factor &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">(&lt;/span>value &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> value &lt;span style="color:#0550ae">%&lt;/span> factor &lt;span style="color:#0550ae">==&lt;/span> &lt;span style="color:#0550ae">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">val&lt;/span> evens &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">1&lt;/span> to &lt;span style="color:#0550ae">10&lt;/span>&lt;span style="color:#0550ae">).&lt;/span>filter&lt;span style="color:#0550ae">(&lt;/span>divisibleby&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#0550ae">))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// divisibleby: (factor: Int)(value: Int)Boolean
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#0550ae">//&lt;/span> evens&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">scala.collection.immutable.IndexedSeq&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">]&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">Vector&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">4&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">6&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">8&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">10&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Ayrıca domain specific bir dil tanımlarken de kullanabilirsiniz, Güzel bir sintatik görünüm sağlar. Aşağıda bununla ilgili bir örnek bulabilirsiniz.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> whileLoop&lt;span style="color:#0550ae">(&lt;/span>cond &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span>&lt;span style="color:#1f2328">Boolean&lt;/span>&lt;span style="color:#0550ae">)(&lt;/span>block &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span>&lt;span style="color:#1f2328">Unit&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Unit&lt;/span> &lt;span style="color:#0550ae">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>cond&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> block
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> whileLoop&lt;span style="color:#0550ae">(&lt;/span>cond&lt;span style="color:#0550ae">)(&lt;/span>block&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">//whileLoop(i &amp;lt; a.length) {
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// println(a(i))
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// i += 1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#0550ae">//}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Bir fonksiyon currying haline aşağıdaki şekilde getirilebilir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> add&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#cf222e">:&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> y&lt;span style="color:#cf222e">:&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> x &lt;span style="color:#0550ae">+&lt;/span> y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">val&lt;/span> addCurried &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">Function&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>curried&lt;span style="color:#0550ae">(&lt;/span>add &lt;span style="color:#cf222e">_&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>add&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#57606a">// 3
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>addCurried&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#0550ae">)(&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">//&lt;/span> &lt;span style="color:#0550ae">3&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Currying olan bir fonksiyon currying&amp;rsquo;siz hale aşağıdaki şekilde getirilebilir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> add&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#cf222e">:&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)(&lt;/span>y&lt;span style="color:#cf222e">:&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> x &lt;span style="color:#0550ae">+&lt;/span> y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">val&lt;/span> addUncurried &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">Function&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>uncurried&lt;span style="color:#0550ae">(&lt;/span>add &lt;span style="color:#cf222e">_&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>add&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">3&lt;/span>&lt;span style="color:#0550ae">)(&lt;/span>&lt;span style="color:#0550ae">4&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#57606a">// 7
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>addUncurried&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">3&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">4&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">//&lt;/span> &lt;span style="color:#0550ae">7&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="first-class-functions-closure">First-Class Functions (Closure)&lt;/h3>
&lt;p>Fonksiyonel programlamada tip sınıfı &lt;strong>first-class citizen&lt;/strong> diye bir konu vardır. Üç çeşittir. Öğelerinden biri, &lt;strong>first-class function&lt;/strong> konusunudur. Buna göre;&lt;/p>
&lt;ul>
&lt;li>bir fonksiyon başka bir fonksiyonu parametre olarak alabilir.&lt;/li>
&lt;li>bir fonksiyonu geri dönüş değeri olarak verebilir.&lt;/li>
&lt;li>bir fonksiyon bir değer olarak atanabilir.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>first-class function&lt;/strong> aynı zamanda &lt;strong>closure&lt;/strong> olarakta bilinir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> makeIncrementer&lt;span style="color:#0550ae">(&lt;/span>inc&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#cf222e">Int&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&amp;gt;&lt;/span> x &lt;span style="color:#0550ae">+&lt;/span> inc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">val&lt;/span> a &lt;span style="color:#cf222e">=&lt;/span> makeIncrementer&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">10&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">// a: (Int) =&amp;gt; Int =
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">val&lt;/span> b &lt;span style="color:#cf222e">=&lt;/span> a&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">25&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">//&lt;/span> res4&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Int&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">35&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="monads">Monads&lt;/h3>
&lt;p>Monad&amp;rsquo;lar fonksiyonlara kontrollü yan-etki desteği vermek için kullanılan bir tekniktir. Monad bir tür context olarak düşünüebilir. Monadlar 3 operatörle tanımlanır. Bunlar;&lt;/p>
&lt;p>&lt;strong>bind&lt;/strong>&lt;/p>
&lt;p>Context içindeki bir değeri geçici olarak dışarı çıkarıp, ona bir değişiklik uygulayıp tekrar context&amp;rsquo;e sokar.&lt;/p>
&lt;p>&lt;strong>return&lt;/strong>&lt;/p>
&lt;p>Herhangi bir değeri olabilecek en basit sekilde context&amp;rsquo;e sokar.&lt;/p>
&lt;p>&lt;strong>run&lt;/strong>&lt;/p>
&lt;p>bir monad ayrica bir programi (~ computation) temsil ediyor olarak da
dusunulebilir. temsil edilen programi calistirip sonucu hesaplamak icin
kullanilir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">trait&lt;/span> &lt;span style="color:#1f2328">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">_&lt;/span>&lt;span style="color:#0550ae">]]&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> unit&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> bind&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>m &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">],&lt;/span> f &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> M&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">implicit&lt;/span> &lt;span style="color:#cf222e">object&lt;/span> &lt;span style="color:#1f2328">OptionMonad&lt;/span> &lt;span style="color:#cf222e">extends&lt;/span> &lt;span style="color:#1f2328">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">Option&lt;/span>&lt;span style="color:#0550ae">]&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> unit&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">Some&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> bind&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>m &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Option&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">],&lt;/span> f &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> &lt;span style="color:#1f2328">Option&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> m&lt;span style="color:#0550ae">.&lt;/span>flatMap&lt;span style="color:#0550ae">(&lt;/span>f&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">implicit&lt;/span> &lt;span style="color:#cf222e">object&lt;/span> &lt;span style="color:#1f2328">ListMonad&lt;/span> &lt;span style="color:#cf222e">extends&lt;/span> &lt;span style="color:#1f2328">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">List&lt;/span>&lt;span style="color:#0550ae">]&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> unit&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">List&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> bind&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>m &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">List&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">],&lt;/span> f &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> &lt;span style="color:#1f2328">List&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> m&lt;span style="color:#0550ae">.&lt;/span>flatMap&lt;span style="color:#0550ae">(&lt;/span>f&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Philip Wadler&amp;rsquo;ın &lt;a href="http://mirrors.csl.sri.com/www.brics.dk/%257Ehosc/local/LaSC-7-1-pp39-56.pdf">Monads and Composable Continuations&lt;/a> hakkındaki makalesi önerilir.&lt;/p>
&lt;h3 id="first-class-controls-continuations">First-Class Controls (Continuations)&lt;/h3>
&lt;p>Bir nevi fonksiyonel programlamanın GOTO deyimidir.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">scala.util.continuations._&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> reify&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">+&lt;/span>&lt;span style="color:#cf222e">_&lt;/span>&lt;span style="color:#0550ae">]](&lt;/span>x &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> A &lt;span style="color:#0550ae">@cpsParam&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">]&lt;/span>, &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">]])(&lt;/span>&lt;span style="color:#cf222e">implicit&lt;/span> monad &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">]&lt;/span> &lt;span style="color:#cf222e">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> reset &lt;span style="color:#0550ae">{&lt;/span> monad&lt;span style="color:#0550ae">.&lt;/span>unit&lt;span style="color:#0550ae">(&lt;/span>x&lt;span style="color:#0550ae">)&lt;/span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">Reflective&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">+A&lt;/span>, &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">_&lt;/span>&lt;span style="color:#0550ae">]](&lt;/span>m &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">],&lt;/span> monad &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> reflect&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">]()&lt;/span> &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span> &lt;span style="color:#cf222e">@cpsParam&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">]&lt;/span>, &lt;span style="color:#cf222e">M&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">]]&lt;/span> &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> shift &lt;span style="color:#0550ae">{&lt;/span> &lt;span style="color:#0550ae">(&lt;/span>k &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">A&lt;/span> &lt;span style="color:#0550ae">=&amp;gt;&lt;/span> M&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">B&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">=&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> monad&lt;span style="color:#0550ae">.&lt;/span>bind&lt;span style="color:#0550ae">(&lt;/span>m&lt;span style="color:#0550ae">,&lt;/span> k&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">implicit&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> reflective&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>xs &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Option&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">])(&lt;/span>&lt;span style="color:#cf222e">implicit&lt;/span> monad &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">Option&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">new&lt;/span> &lt;span style="color:#1f2328">Reflective&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">Option&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>xs&lt;span style="color:#0550ae">,&lt;/span> monad&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">implicit&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> reflective&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>xs &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">List&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>&lt;span style="color:#0550ae">])(&lt;/span>&lt;span style="color:#cf222e">implicit&lt;/span> monad &lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Monad&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">List&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#cf222e">=&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">new&lt;/span> &lt;span style="color:#1f2328">Reflective&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">A&lt;/span>, &lt;span style="color:#cf222e">List&lt;/span>&lt;span style="color:#0550ae">](&lt;/span>xs&lt;span style="color:#0550ae">,&lt;/span> monad&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>reify &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">val&lt;/span> left &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">List&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;x&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;y&amp;#34;&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;z&amp;#34;&lt;/span>&lt;span style="color:#0550ae">).&lt;/span>reflect&lt;span style="color:#0550ae">[(&lt;/span>&lt;span style="color:#cf222e">String&lt;/span>, &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">val&lt;/span> right &lt;span style="color:#cf222e">=&lt;/span> &lt;span style="color:#1f2328">List&lt;/span>&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0550ae">4&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">5&lt;/span>&lt;span style="color:#0550ae">,&lt;/span> &lt;span style="color:#0550ae">6&lt;/span>&lt;span style="color:#0550ae">).&lt;/span>reflect&lt;span style="color:#0550ae">[(&lt;/span>&lt;span style="color:#cf222e">String&lt;/span>, &lt;span style="color:#cf222e">Int&lt;/span>&lt;span style="color:#0550ae">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">(&lt;/span>left&lt;span style="color:#0550ae">,&lt;/span> right&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Monad ve Continuation konusunda araştırmalarım devam ediyor. Daha detaylı bir bilgilendirme, bir sonraki yazımda olacak.&lt;/p>
&lt;p>&lt;strong>Günceleme:&lt;/strong> 2014 yılı boyunca bu konuda bir yazım olamadı.&lt;/p></content></entry><entry><title>Bir Startup Masalı: Bezirgan ve Origami Ustası</title><author><name/><uri/></author><id>https://hozgan.com/bir-startup-masali-bezirgan-ve-origami-ustasi/</id><updated>2012-07-22T00:00:00Z</updated><published>2012-07-22T00:00:00Z</published><content type="html">&lt;p>Uzun zamandır yazmayan, daha doğrusu yazmaya vakit bulamayan bir olarak, kalemin pasını atacak masal tadında bir yazı düşünüyordum. Şöyle bir etrafıma bakınca neden uzman olduğum ve son zamanların en gündemde olan konusu olan e-ticaret üzerine olmasınki dedim. Bilindiği üzere son yıllarda Türkiye&amp;rsquo;de e-ticaret pazarı çok büyüdü. Yurtiçi ve yurtdışı kaynaklı birçok şirket bu alana yatırım yaptı ve yapmaya devam ediyor. E-ticaretin birçok türünde yıllarca çalışmış biri olarak, bu pazarda yer almak isteyenlere, bir web şirketinin hikayesini konu alan bir yazı yazmak istedim. Bu yazının teknik olmayacak. Ama ilerideki yazılarımda bu işin mutfağına bir mühendis gözüyle irdelemeye başlayacağız. Örneğin bir arama motoru, yada öneri motorunun mimarisinden söz edecek, ödeme ağ geçidi ile ilgili konuşacak ve belkide pazarlama için gerekli entegrasyonlardan söz edeceğim. Şimdi gelin, bu işe girmek isteyenler için öğüt niteliğinde olacak Bezirgan ve Origami Ustası&amp;rsquo;nın hikayesine birlikte kulak verelim.&lt;/p>
&lt;p>Bezirgan işini yaparken, yılların verdiği deneyimle yaşlı bir kurt, işinin ehli, iyi giyimli ve hırslı bir beyfendi olarak tanınırdı. E-ticaret alanında dünya çapında bir girişimin en büyük hissedarı ve yönetim kurulu başkanıydı. Her fırsatta girişimcinin hızlı ve çevik olması gerektiğini söyler dururdu. Şirketinin adını en sevdiği iki şeyden esinlenerek koymuştu &lt;em>(Otostopçunun Galaksi Rehberi ve Atlar)&lt;/em> &lt;em>42beygir&lt;/em>. İnternet&amp;rsquo;te en önemli şey rekabetti. Bunun içinde çok hızlı ve çevik olmak gerekiyordu.&lt;/p>
&lt;p>Dünya medyası Bezirgan&amp;rsquo;ın projelerinin klon olmasına dair sıkça yazılar yazardı. Bunun sebebi, Bezirgan&amp;rsquo;ın projelerinin hemen hepsinin tutmuş bir fikrin üzerine inşa edilmiş olmasıydı. Dünya üzerinde bu şekilde tutmuş bir fikri klonlayan çok fazla şirket vardı ama içlerinden sadece &lt;em>42beygir&lt;/em> yatırımlarını hızlıca karlı hale getirmişti. Ayrıca diğer benzer şirketlerin aksine, klon projeleri kendi içinde özgünlüğe sahipti. Tutan bir fikri önce alır, bulunduğu lokasyonun ihtiyaçları ile harmanlayıp fikre yeni bir bakış açısı katardı. Örneğin, dünyaca ünlü pazaryeri sitesi Ebay&amp;rsquo;i klonladığında; ülke halkının tedirginliğini farkedip, güvenli ödeme adında paranın iki tarafta alışverişi onaylayana kadar bloklandığı bir e-ticaret yapısı siteye dahil etmişti. Rakipleri gibi bir fikri birebir sitenin görsel tasarımına hatta rengine kadar kopyalamazdı. Bu yönüyle kloncu yakıştırmalarına kendine yakıştırmaz ve kendisini origami ustası olarak adlandırırdı. Çünkü yaptığı iş dışarıdan kolay görünsede bir zarafet ve tecrübe istiyordu. Her ne kadar dışarıdan yapmak kolay gibi görünse de sabır ve incelik isterdi. Ayrıntıda saklambaç oynayan şeytanın nefesi, projelerinde hissediliyordu.&lt;/p>
&lt;p>Neredeyse e-ticaretin her alanında yatırımları bulunuyordu. Başlıca yatırım yaptığı e-ticaret türleri şunlardı;&lt;/p>
&lt;ul>
&lt;li>B2C diye adlandırılan e-ticaret (Amazon.com / Hepsiburada.com gibi)&lt;/li>
&lt;li>C2C veya Marketplace olarakta bilinen e-ticaret model (Ebay.com / Gittigidiyor.com gibi)&lt;/li>
&lt;li>Dikey e-ticaret (Zappos.com / Zizigo.com gibi)&lt;/li>
&lt;li>Grup satışı yapılan e-ticaret (Groupon.com / Grupanya.com gibi)&lt;/li>
&lt;li>Uzman önerileri yoluyla yapılan e-ticaret (OpenSky.com / Gurunzi.com gibi)&lt;/li>
&lt;li>Kapalı Alış-Veriş Modeli (Private Shopping) yoluyla yapılan satışlar (Gilt.com / Markafoni.com gibi)&lt;/li>
&lt;li>Sosyal e-ticaret modeli (Plyvore.com / StilSOS.com gibi)&lt;/li>
&lt;li>Fiyat karşılaştırma siteleri (Google Product Search / Cimri.com gibi)&lt;/li>
&lt;/ul>
&lt;h2 id="küçük-bir-e-ticaret-şirketinin-organizasyon-şeması">Küçük Bir E-Ticaret Şirketinin Organizasyon Şeması&lt;/h2>
&lt;p>&lt;img src="/files/2012/07/e-commerce-organization-structure.png" alt="">&lt;/p>
&lt;h2 id="bir-e-ticaret-girişimi-kurmak">Bir E-Ticaret Girişimi Kurmak&lt;/h2>
&lt;p>Bezirgan bir ülkeye ilk girdiğinde neler yapar gelin şimdi bunu inceleyelim.&lt;/p>
&lt;ol>
&lt;li>Ülkede pazar payı büyük olan fikirlerle bir ülkeye girerdi.&lt;/li>
&lt;li>Ülkenin ihtiyaçlarını çok iyi analiz eder ve gerçekten fark yaratacak yenilikler ile lansman yapardı. Örneğin; aynı gün ürünü göndermek, 1 kuruşluk bir ürün için bile ücretsiz kargo, dişli satınalmacılarla büyük markaların kaliteli yeni sezon ürünlerini ucuza satınalabilmek.
İnanın bu çok zor bir şey. Private shopping sitelerinin sattığı ucuz ürünler maalesef genelde elde kalan, serisi bulunmayan ürünler oluyor.&lt;/li>
&lt;li>Ülkenin kanunlarını öğrenebilecekleri danışmanlar tutar ve gereksinimleri hızla implemente ederdi. Fatura kuralları vb şeylere önceden hazır olurdu. İade hakları, kanunsal açıklar, dolandırıcılık ve sahtekarlık gibi konulara hazırlık olurdu.&lt;/li>
&lt;li>Süreçleri öncesinde hazırlar ve netleştirirdi. Bu iş için yine bu alanda uzmanlaşmış Süreç Yöneticileri işe alır ve bunları iyileştirmek ve tıkanıklıkları bulmak için elinden geleni yapardı.&lt;/li>
&lt;li>Diploma notuna bakarak eleman alımı yapan şirketlerden farklı olarak, aşağıdaki organizasyon şemasında (bir e-ticaretin) belirttiğim gibi ilgili departmanlarda deneyimli çalışanlar bulmak ve gerekiyorsa rakiplerden transfer etmek.&lt;/li>
&lt;li>Çalışanlarının motivasyonlarına çok önem verirdi. Yatırımlarının analizini çok iyi yaptığı için, kaynakları boşa harcamazdı. Şirketin motivasyonunu kıracak, toplu işten çıkarma gibi agrasif hareketler yapmaz. Onların çalışırken mutlu olmasını isterdi. Şirketlerinin mottosu 3M &lt;em>&amp;ldquo;mutlu ol, meraklı ol, müşteri ol&amp;rdquo;&lt;/em>. Ekibe uyum sağlayamayan çalışanlara maaşının iki katını teklif ederek ayrılmalarını rica ederdi. İşini mutlu insanlarla yapılırdı. Çalışanların aynı zamanda bir müşteri şapkası takmalarını isterdi.  Çalışma ortamına önem verirdi. Beton yığını ve büyük plazalardansa, ağaçlar içindeki bahçeli ofisleri tercih ederdi. Böylece çalışanlar hem hoş vakit geçirecekleri bir çalışma ortamına sahip olur, hem de kuş cıvıltıları içinde dinlenebilirdi. İşlerin verimliliği ve çalışanların motivasyonundaki etkisi inanılmazdı.&lt;/li>
&lt;li>Ekipler arasında yatay bir hiyerarşi vardı. Sorumlulukları merkezde toplamak yerine küçük gruplara bölmüş organik değilde mozaik bir organizasyon yapısı vardı. Sahiplik eşit olarak bölünürdü. Bir ekip ruhu oluşur ve ortak bir amaç için çalışılırdı. Şirket için bir CEO ile bir Ofisboy arasında bir fark yoktu. Her ikiside bu şirketin yürümesi için gerekli çarklardı. Hata ve başarı bu sebeple tüm ekipte hissedilir ve hissettirilirdi.&lt;/li>
&lt;li>Marketing işi marketing departmanına verilemeyecek kadar önemli olduğunu bildiğinden satış öncesi ve sonrası müşteri geri bildirimlerine çok önem verirdi. Bazen bu ihtiyaçları dinler ve yorumlar ve kampanyalarını bu yönde yapardı. Sürekli indirim kuponlarıyla satış yapmaz. Sadık ve elit bir müşteri kitlesi kazanmaya çalışırdı. DWH (data warehouse) ekibinden sürekli raporlar alarak müşteri kitlesini takip ederler.&lt;/li>
&lt;li>Müşterilerinin siparişlerini her adımını takip eder, sorunlu siparişleri, yarım kalan satın almaları, müşterilerin arama sonuçlarında bulamadığı ürünleri ve daha birçok konuda müşterilerine bir muhattapları olduğunu hissettirirdi. Özellikle müşteriler kendi aralarında sınıflandırılmıştı.&lt;/li>
&lt;li>Ürün satın alması kadar, hızlı gönderi (logistik) şirket için en önemli alanlardan biriydi. Ürünün satış sonrası her adımından müşteri bilgilendirilir. Bazen paketleme departmanından şeker, indirim kuponu, küçük bir oyuncak, paket içinde bir hediye kutusu gibi süpriz hediyelerde çıkardı. Bunu rastgele 5-10 müşteriye yaparlardı.&lt;/li>
&lt;/ol>
&lt;p>Bezirgan böyle ilginç bir adamdı. Bezirganın bir klon ustası gibi gözüksede, işini zerafetle modelleyen, lokasyona uygun değişikliği ustalıkla yapan adeta bir origami ustası gibiydi. Origami ustalığı sabır isteyen, ilk başta basit görülen ama zahmetli bir iş. Kare bir kağıda baktığında bir sürü nesne gören ilginç bir adam.&lt;/p>
&lt;p>Türkiye&amp;rsquo;de e-ticaret alanında gerçekten çok büyük oyuncular var. Eğer inandığınız bir model yoksa ve yukarıdaki farkları yaratamayacaksanız bu işe girmemenizi öneririm. Çünkü, Bezirgan gibi kişilerle başa çıkmak için onun kadar dayanabilecek nefesiniz (kaynağınız) olması gerekiyor.&lt;/p>
&lt;p>Bu yazıyı yazdığımda rocket internet halen faaliyetteydi ve yukarıdakilerin çoğunu adam gibi yerine getirmiyordu. Başarısızlık iyi bir ders kitabı fakat bence olması gerekenleri hatırlatmak daha iyi her zaman.&lt;/p>
&lt;p>Bir sonraki e-ticaret yazımda ödeme sistemlerinden bahsetmeyi planlıyorum. Bu e-ticaret yazıları;&lt;/p>
&lt;ul>
&lt;li>Sipariş akışları ve yönetimi&lt;/li>
&lt;li>Lojistik yönetimi&lt;/li>
&lt;li>Ürün yönetimi ve modellemesi&lt;/li>
&lt;li>Kategori ve navigasyon yönetimi&lt;/li>
&lt;li>Pazarlama ve entegrasyonları&lt;/li>
&lt;li>Arama motoru&lt;/li>
&lt;/ul>
&lt;p>gibi konularla dilimin döndüğü, zamanımın elverdiği ölçüde devam edecek&amp;hellip;&lt;/p></content></entry><entry><title>Büyük Ustaya Saygıyla (1941 - 2011) !...</title><author><name/><uri/></author><id>https://hozgan.com/buyuk-ustaya-saygiyla-1941-2011/</id><updated>2011-10-12T00:00:00Z</updated><published>2011-10-12T00:00:00Z</published><content type="html">&lt;p>Az önce &lt;a href="http://news.ycombinator.com">Hacker News&lt;/a>&amp;rsquo;te ilk öğrendiğim programlama dili C ve en sevdiğim işletim sistemi UNIX&amp;rsquo;in babası büyük usta &lt;a href="https://eksisozluk.com/entry/7495750">Dennis Ritchie&lt;/a>&amp;rsquo;nin vefat ettiğini öğrendim. Değer verdiğim birkaç büyük ustadan biriydi kendisi.&lt;/p>
&lt;p>Saygıyla anıyorum!..&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">#include&lt;/span> &lt;span style="color:#57606a">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#57606a">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">int&lt;/span> &lt;span style="color:#6639ba">main&lt;/span>&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">printf&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;goodbye, master&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></entry><entry><title>Squeryl'in Yaratıcısı Maxime Lévesque ile Buluştuk</title><author><name/><uri/></author><id>https://hozgan.com/squeryl-yaraticisi-maxime-levesque-ile-bulustuk/</id><updated>2011-03-16T00:00:00Z</updated><published>2011-03-16T00:00:00Z</published><content type="html">&lt;p>Scala dünyasının başarılı projelerinden &lt;a href="http://squeryl.org">Squeryl&lt;/a> projesinin yazarı Maxime Lévesque ile dün Mihrimah Sultan&amp;rsquo;da buluştuk. &lt;a href="http://mihrimahsultan.com">Mihrimah Sultan&lt;/a>&amp;lsquo;da Rakı sefası yaptıktan sonra Badehane&amp;rsquo;de votka içerek geceyi noktaladık.&lt;/p>
&lt;p>Maxime&amp;rsquo;in Türkiye&amp;rsquo;ye geliş sebebini duyduğunuzda biraz şaşırabilirsiniz. &lt;a href="http://www.misirliahmet.com/">Mısırlı Ahmet&lt;/a>&amp;rsquo;ten Türk Darbuka tekniğini öğrenmek amacıyla ülkemizde bulunuyor. Squeryl ve Scala dışında müzik, siyaset, açık kaynak, edebiyat, veritabanları, programlama dilleri, kadın-erkek ilişkileri ve genetik gibi birçok konu hakkında konuştuğumuzu söyleyebilirim.&lt;/p>
&lt;p>Kendisi çok renkli bir kişilik. Ve sohbetimizin her dakikası keyifli ve öğretici geçtiğini söyleyebllirim. Maxime ile buluşmamıza katılarak, sohbetimize renk katan &lt;a href="http://yalazi.org">Onur Yalazı&lt;/a> ve Gökhan Goralı&amp;rsquo;ya ne kadar teşekkür etsem azdır.&lt;/p>
&lt;p>Son olarak Maxime 29 Mart&amp;rsquo;a kadar Türkiye&amp;rsquo;de olacak ve kendisiyle bir şehir turu gerçekleştireceğiz.&lt;/p></content></entry><entry><title>Scala'ya Giriş</title><author><name/><uri/></author><id>https://hozgan.com/scalaya-giris/</id><updated>2011-02-06T00:00:00Z</updated><published>2011-02-06T00:00:00Z</published><content type="html">&lt;p>Uzun zamandır Scala ile ilgili bir yazı dizisi yazma planım vardı. Yoğunluğum nedeniyle bugüne kısmetmiş ama bir miktar paslandığımı itiraf etmeliyim. Bu yıl daha çok ölçeklenebilirlik üzerine &lt;a href="/2010/12/yeni-yilda-olceklenebilirlik-uzerine-planlar/">yazılar yazmak istediğimi dile getirmiştim&lt;/a>.
Ölçeklenebilirlik konulu yazılarımın aslına bakarsanız merkezinde &lt;a href="http://scala-lang.org">scala programlama dili&lt;/a> olacak. İşin web bacağında lift web framework, dağınık haberleşme mimarilerinde (akka), ve dağınık veri tabanları konusunda (noSQL) özellikle MongoDB&amp;rsquo;den bolca konuşacağız.
Scala ile ilk kez tanışacaklar için Scala, ruby, java, c++ karışımı bir dil gibidir. Nasıl bir yazım biçimi olduğunu merak edenler için aşağıda bir hello-world programı yazdım.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-scala" data-lang="scala">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">object&lt;/span> &lt;span style="color:#1f2328">HelloWorld&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> main&lt;span style="color:#0550ae">(&lt;/span>args&lt;span style="color:#cf222e">:&lt;/span> &lt;span style="color:#cf222e">Array&lt;/span>&lt;span style="color:#0550ae">[&lt;/span>&lt;span style="color:#cf222e">String&lt;/span>&lt;span style="color:#0550ae">])&lt;/span> &lt;span style="color:#0550ae">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> println&lt;span style="color:#0550ae">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Hello, world!&amp;#34;&lt;/span>&lt;span style="color:#0550ae">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0550ae">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Bu yazım biçimi bana yetmez diyenler &lt;a href="http://www.scala-lang.org/node/166">şu adresten&lt;/a> daha fazla kod örneği bulabilirler.&lt;/p>
&lt;p>Scala&amp;rsquo;nın özelliklerine hızlıca bir bakacak olursak;&lt;/p>
&lt;ul>
&lt;li>Hem bir betik (script) dili, hem de derlenebilme özelliği olan bir dildir.&lt;/li>
&lt;li>Scala derleyicileri kaynak kodunuzu, Java ve/veya &lt;a href="http://hestia.typepad.com/flatlander/2009/01/getting-started-with-scala-on-net.html">.NET&lt;/a> mimarilerine göre derlenebilir.&lt;/li>
&lt;li>Dil, özellikle ölçeklenebilirlik alanına yönelik güçlü bir dildir.&lt;/li>
&lt;li>Scala diliyle yazdığınız kodları deneyebilmeniz için CLI özelliğide bulunmaktadır.&lt;/li>
&lt;/ul>
&lt;p>Scala diliyle ilgili türkçe bir kitap hazırlığı içindeyim. Ücretsiz dağıtmayı düşündüğüm bu kitaba &lt;a href="/belgeler/scala-rehberi">adresinden&lt;/a> ulaşabileceksiniz.&lt;/p>
&lt;h3 id="geliştirme-ortamı">Geliştirme Ortamı&lt;/h3>
&lt;p>Scala derleyicileri, kodları derlediğinde JVM mimarisine dönüştüğü için Java araçlarıyla tam uyumludur. Java&amp;rsquo;daki birçok teknolojiyi kullanabilirsiniz.
Scala&amp;rsquo;nın bir CLI(command-line interpreter) arayüzü olduğunu söylemiştim. gelin hızlıca Scala ile birşeyler yazalım.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ scala This is an interpreter &lt;span style="color:#cf222e">for&lt;/span> Scala. Type in expressions to have them evaluated. Type :help &lt;span style="color:#cf222e">for&lt;/span> more information.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> scala&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Example 1 scala&amp;gt; 1 + 2 unnamed0: Int = 3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Example 2 scala&amp;gt; unnamed0 \* 3 unnamed1: Int = 9&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># Example 3 scala&amp;gt; println(&amp;#34;Hello, world!&amp;#34;) Hello, world! unnamed2: Unit = () &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Scala&amp;rsquo;ya daha fazla giriş yapmak için :) artima sitesindeki &lt;a href="http://www.artima.com/scalazine/articles/steps.html">First Step to Scala&lt;/a> yazısını tavsiye ederim.
Scala&amp;rsquo;yı popüler programlama editörleri &lt;a href="https://lampsvn.epfl.ch/trac/scala/browser/scala-tool-support/trunk/src/vim">Vim&lt;/a> ve &lt;a href="https://lampsvn.epfl.ch/trac/scala/browser/scala-tool-support/trunk/src/emacs">Emacs&lt;/a> ile yazabileceğiniz gibi, popüler Java IDEleri (&lt;a href="http://wiki.netbeans.org/Scala">Netbeans&lt;/a>, &lt;a href="http://scala-ide.org">Eclipse&lt;/a>, I&lt;a href="http://plugins.intellij.net/plugin/?id=1347">ntellij IDEA CE&lt;/a>) ile yazabilirsiniz. Ben tercihimi Eclipse&amp;rsquo;ten yana kullandığımı ama Intellij&amp;rsquo;nin eklentisinin gerçekten başarılı olduğunuda belirtmeliyim. Maalesef Netbeans nasıl hiçbir fikrim yok ama Lift Framework&amp;rsquo;un yaratıcısı Netbeans&amp;rsquo;ı kullandığına dair 1-2 yazıya rastlamıştım. Kısacası burada karar size kalıyor.&lt;/p>
&lt;h3 id="java-ile-scala-arasındaki-farklar">Java ile Scala Arasındaki Farklar&lt;/h3>
&lt;p>Java ile Scala arasındaki farkları &lt;a href="http://blogs.sun.com/sundararajan/entry/scala_for_java_programmers">şuradaki yazıda&lt;/a>bulabilirsiniz. Ayrıca hemen aşağıda bu konuda bulduğumu sunumuda inceleyebilirsiniz.&lt;/p>
&lt;p>&lt;a href="//www.slideshare.net/davetron5000/scala-for-java-developers-intro" title="Scala for Java Developers - Intro">Scala for Java Developers - Intro&lt;/a> from &lt;a href="//www.slideshare.net/davetron5000">David Copeland&lt;/a>&lt;/p>
&lt;h2 id="scala-araçları-birkaç-iyi-oyuncak">Scala Araçları (birkaç iyi oyuncak)&lt;/h2>
&lt;h3 id="sbt-simple-build-tool">SBT (Simple Build Tool)&lt;/h3>
&lt;p>Scala ile Java teknolojilerinin tümünden faydalanabileceğinizden yukarıda söz etmiştim. Scala programcıları ilk zamanlar Maven kullansalarda, sonraları &lt;a href="http://code.google.com/p/simple-build-tool">Simple Build Tool&lt;/a> (aka SBT) isimli çok tatlı bir yapılandırma aracı kullanılmaya başlandı. Bu araçla yapılandırma işlemlerinizi, Scala diliyle yapabiliyorsunuz. Arkada, ivy ve maven kullanan bu başarılı araç için aynı maven&amp;rsquo;da olduğu gibi hızlıca eklentilerde yazabiliyorsunuz.
Örneğin ben proje kodumu sbt ile build edecek şekilde hazırlayıp. Buradan da &lt;a href="https://github.com/musk/SbtEclipsify">Eclipsify&lt;/a> isimli SBT eklentisi ile eclipse projesini yaratıyorum. Ayrıca SBT&amp;rsquo;yi, Eclipse içinden kullanmak &lt;a href="https://github.com/frank06/sbt-eclipse-plugin">şuradan&lt;/a> ekletiye ulaşabilirsiniz.&lt;/p>
&lt;h3 id="scalatra-web-framework">Scalatra Web Framework&lt;/h3>
&lt;p>&lt;a href="https://github.com/scalatra/scalatra#readme">Scalatra&lt;/a> eskiden Step olarak anılan ve Ruby Sinatraya benzeyen bir web çatısı. Küçük projeler için hızlı uygulama yazmayı amaçlayanlar için iş görebilir. Ama daha çok fazla yolu olduğunu eklemekte fayda var. Aşağıda adından söz edeceğim Lift framework&amp;rsquo;e kıyasla çok eksiği bulunuyor.&lt;/p>
&lt;h3 id="lift-web-framework">Lift Web Framework&lt;/h3>
&lt;p>&lt;a href="http://blog.lostlake.org/">David Pollak&lt;/a> (a.k.a &lt;a href="http://twitter.com/dpp">@dpp&lt;/a>) tarafından yazılan web çatısıdır. David, framework&amp;rsquo;u hazırlarken birçok frameworkü incelemiş ve uygun gördüğü özelliklerini &lt;a href="http://liftweb.net">Lift Web Framework&lt;/a>&amp;rsquo;e dahil etmiştir. Bugün en büyük referansı Foursquare olarak verilebilir. Yeni versiyonlarla MVC patterni kullanılarak web projeleri yazılabilse de aslında bileşen (Snippet) mimarisine dayanır. Kendi içinde ORM gibi birçok alt proje bulunduğunu iletmekte yarar var.&lt;/p>
&lt;p>Lift &lt;a href="http://seventhings.liftweb.net/">&amp;ldquo;Seven Thins&amp;rdquo;&lt;/a> isimli sayfasına girerek diğer frameworklere kıyasla yarattığı farkların neler olduğunu görebilirsiniz.
&lt;a href="http://liftweb.net">Lift Framework&lt;/a>&amp;lsquo;ün belgelemesi gerçekten iyidir. Biri David Pollak tarafından olmak üzere iki özgür kitap projesi bulunmaktadır. Bunlar;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://simply.liftweb.net/">Simply Lift&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://exploring.liftweb.net/">Exploring Lift&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Lift projesinin kaynak kodlarına ve örnek uygulamalarına &lt;a href="http://github.com/lift">Github üzerinde bulunan adresinden&lt;/a> erişebilirsiniz. Scala dili ile ilgili başlangıç sorularınıza umarım cevaplar verebilmişimdir. Scala gerçekten eğlenceli ama bir o kadarda detaylı bir dil. Oracle&amp;rsquo;ın Sun&amp;rsquo;ı satın aldıktan sonra yapacakları belirsizliğini korurken bu konuda bir B planı olması bence gerçekten çok rahatlatıcı. Eğer sizde Scala ile bir şeyler yapmayı düşünüyor ve kendinizi yalnız hissediyorsanız, &lt;a href="http://scala-tr.org">Scala Türkiye&lt;/a> ekibine katılabilirsiniz. Topluluk bu konuda etkinlikler yaparak faliyetlerine çok kısa bir süre içerisinde başlayacaktır. Bir sonraki yazımızda elinizi Scala&amp;rsquo;ya bulamaya hazır olun. Scala diliyle framework kullanmadan Web dünyasına giriş yapacağız.&lt;/p></content></entry><entry><title>Yeni Yılda Ölçeklenebilirlik Üzerine Planlar</title><author><name/><uri/></author><id>https://hozgan.com/yeni-yilda-olceklenebilirlik-uzerine-planlar/</id><updated>2010-12-31T00:00:00Z</updated><published>2010-12-31T00:00:00Z</published><content type="html">&lt;p>2011 yılına girerken, bu blogun daha aktif yazılarla karşınızda olmasını planlıyorum. Yazılarım arasında Java ve Scala dilleri kullanılarak gerçekleştirilen NoSQL uygulamaları, ve Distributed Computing kütüphaneleri ve gerçek hayatta kullanılan mimariler burada yer alacak. Eğer bu gibi konulardan hoşlanıyor ve/veya ilgileniyorsanız, aşağıda paylaştığım sunum ve makaleler ilginizi çekebilir. Hepinize, umutlar ve mutlulukların eksik olmayacağı bir yıl dilerim!&amp;hellip;&lt;/p>
&lt;h3 id="makaleler">Makaleler;&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://techpack.acm.org/cloud/cloud_computing.pdf">Cloud Computing&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://techpack.acm.org/parallel/JourneymanTour.pdf">Parallel Processing&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="sunumlar">Sunumlar;&lt;/h3>
&lt;p>&lt;a href="//www.slideshare.net/jboner/scalability-availability-stability-patterns" title="Scalability, Availability &amp;amp; Stability Patterns">Scalability, Availability &amp;amp; Stability Patterns&lt;/a> from &lt;a href="//www.slideshare.net/jboner">Jonas Bonér&lt;/a>&lt;/p>
&lt;p>&lt;a href="//www.slideshare.net/hasanveldstra/the-anatomy-of-the-google-architecture-fina-lv11" title="The Anatomy Of The Google Architecture Fina Lv1.1">The Anatomy Of The Google Architecture Fina Lv1.1&lt;/a> from &lt;a href="//www.slideshare.net/hasanveldstra">Hasan Veldstra&lt;/a>&lt;/p>
&lt;p>&lt;a href="//www.slideshare.net/techdude/scalable-web-architectures-common-patterns-and-approaches" title="Scalable Web Architectures: Common Patterns and Approaches">Scalable Web Architectures: Common Patterns and Approaches&lt;/a> from &lt;a href="//www.slideshare.net/techdude">Technical Dude&lt;/a>&lt;/p>
&lt;p>&lt;a href="//www.slideshare.net/techdude/high-performance-web-sites" title="High performance web sites">High performance web sites&lt;/a> from &lt;a href="//www.slideshare.net/techdude">Technical Dude&lt;/a>&lt;/p>
&lt;p>&lt;a href="//www.slideshare.net/davemitz/7-stages-of-scaling-web-applications" title="7 Stages of Scaling Web Applications">7 Stages of Scaling Web Applications&lt;/a> from &lt;a href="//www.slideshare.net/davemitz">David Mitzenmacher&lt;/a>&lt;/p></content></entry><entry><title>jAvatar - Kavanoz Bükme Procesi</title><author><name/><uri/></author><id>https://hozgan.com/javatar-kavanoz-bukme-procesi/</id><updated>2010-12-21T00:00:00Z</updated><published>2010-12-21T00:00:00Z</published><content type="html">&lt;p>Linux terminalde çalışırken, aradığınız bir sınıfın $CLASSPATH&amp;rsquo;teki hangi jar dosyasında olduğunu bulmanızı sağlar.&lt;/p>
&lt;p>Bash programlama hakkında çok fazla bilgiye sahip değilim. Konunun uzmanlarından güzel fikirler ve düzeltmeler bekliyorum. (-: Kısacası geliştirmeye açıktır. İstediğiniz gibi kodu evirip çevirip bu oyuncakla oynayabilir, yeni kavanoz bükme tekniklerini paylaşabilirsiniz.&lt;/p>
&lt;h3 id="kullanım-şekli">Kullanım şekli;&lt;/h3>
&lt;pre tabindex="0">&lt;code>$ javatar &amp;lt;className&amp;gt;
&lt;/code>&lt;/pre>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span>&lt;span style="color:#6639ba">echo&lt;/span> -ne &lt;span style="color:#0a3069">&amp;#34;\033[1mjAvatar ver. 1.0.3 (by meddah)\n\033[0m&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">echo&lt;/span> -ne &lt;span style="color:#0a3069">&amp;#34;May the &amp;#39;Jar Bender&amp;#39; force be with you!\n&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">source&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#953800">$1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#953800">files&lt;/span>&lt;span style="color:#0550ae">=()&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#953800">classes&lt;/span>&lt;span style="color:#0550ae">=()&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">#resolver&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> file in &lt;span style="color:#0a3069">`&lt;/span>&lt;span style="color:#6639ba">echo&lt;/span> &lt;span style="color:#953800">$CLASSPATH&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>tr &lt;span style="color:#0a3069">&amp;#34;:&amp;#34;&lt;/span> &lt;span style="color:#0a3069">&amp;#34;\n&amp;#34;&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>grep -i jar&lt;span style="color:#0a3069">`&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> class in &lt;span style="color:#0a3069">`&lt;/span>jar -tvf &lt;span style="color:#953800">$file&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>awk &lt;span style="color:#0a3069">&amp;#39;{print $8}&amp;#39;&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>grep -e &lt;span style="color:#953800">$source&lt;/span>&lt;span style="color:#0a3069">`&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#0550ae">[[&lt;/span> &lt;span style="color:#953800">$files&lt;/span> !&lt;span style="color:#0550ae">=&lt;/span> *&lt;span style="color:#953800">$file&lt;/span>* &lt;span style="color:#0550ae">]]&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">files&lt;/span>&lt;span style="color:#0550ae">+=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#953800">$file&lt;/span>&lt;span style="color:#0a3069"> &amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">classes&lt;/span>&lt;span style="color:#0550ae">+=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#953800">$file&lt;/span>&lt;span style="color:#0a3069">:&lt;/span>&lt;span style="color:#953800">$class&lt;/span>&lt;span style="color:#0a3069"> &amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">#dispatcher&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> file in &lt;span style="color:#953800">$files&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">echo&lt;/span> -e &lt;span style="color:#0a3069">&amp;#34;\033[1m&lt;/span>&lt;span style="color:#953800">$file&lt;/span>&lt;span style="color:#0a3069">\033[0m&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> class in &lt;span style="color:#953800">$classes&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#0550ae">[[&lt;/span> &lt;span style="color:#953800">$class&lt;/span> &lt;span style="color:#0550ae">==&lt;/span> *&lt;span style="color:#953800">$file&lt;/span>* &lt;span style="color:#0550ae">]]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">echo&lt;/span> -n &lt;span style="color:#0a3069">&amp;#34; &amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">echo&lt;/span> &lt;span style="color:#953800">$class&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>tr &lt;span style="color:#0a3069">&amp;#34;:&amp;#34;&lt;/span> &lt;span style="color:#0a3069">&amp;#34; &amp;#34;&lt;/span>&lt;span style="color:#1f2328">|&lt;/span>awk &lt;span style="color:#0a3069">&amp;#39;{print $2}&amp;#39;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">echo&lt;/span> -ne &lt;span style="color:#0a3069">&amp;#34;\n&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></entry><entry><title>Web 2.0 Projelerin Özellikleri</title><author><name/><uri/></author><id>https://hozgan.com/web-2_0-projelerin-ozellikleri/</id><updated>2010-08-30T00:00:00Z</updated><published>2010-08-30T00:00:00Z</published><content type="html">&lt;p>Web 2.0 hayatımıza RIA teknolojileri ile girdi. Ardından etiketlerle tanıştık. Ve sitelere yorum yazmaya, içerikleri oylamaya vb. başladık. Peki nedir Web 2.0 ve bir Web 2.0 projesinde olması gereken özellikler nelerdir? Kendimce bir liste çıkardım, sizinde aklınıza gelen varsa lütfen paylaşın.&lt;/p>
&lt;ul>
&lt;li>İçerik (Etkileşim)
&lt;ul>
&lt;li>Etiketlenir&lt;/li>
&lt;li>Oylanır&lt;/li>
&lt;li>Arkadaşına gönder.&lt;/li>
&lt;li>Kötü içerik bildirilir. (Kendi kendine işleyen onay mekanizması)&lt;/li>
&lt;li>Yorum yazılır&lt;/li>
&lt;li>Katkıya göre alınan karma puanı. (demokrasi)&lt;/li>
&lt;li>Mashups (veri paylaşımı)&lt;/li>
&lt;li>Takip edilebilir. (RSS desteği)&lt;/li>
&lt;li>Web 3.0 için veriyi anlamlandırabilmek.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ara birim (RIA)
&lt;ul>
&lt;li>AJAX&lt;/li>
&lt;li>Flash&lt;/li>
&lt;li>Temiz URL (rewriterule)&lt;/li>
&lt;li>MVC, REST&lt;/li>
&lt;li>CSS&lt;/li>
&lt;li>Kullanıcı dostu (bknz: del.icio.us)&lt;/li>
&lt;li>Bookmarklets&lt;/li>
&lt;li>add-on ve iPhone gibi cihazlar için API desteği&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>İş Modelleri
&lt;ul>
&lt;li>Ucu açık, genişleyebilir fikirler (twitter, reddit vb&amp;hellip;)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Gelir Modeli
&lt;ul>
&lt;li>Reklam (nefret ediyorum)&lt;/li>
&lt;li>Üyelik (Google App)&lt;/li>
&lt;li>Satış (Amazon)&lt;/li>
&lt;li>Komisyon (ebay)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Pazarlama (Marketing)
&lt;ul>
&lt;li>10 kez insanların bu servisi duymasını sağlamak.&lt;/li>
&lt;li>Kullanmalarını teşvik edecek faydayı göstermek.&lt;/li>
&lt;li>Takip edilenlerin ürünü kullanmasını ve duyurmasını sağlamak.&lt;/li>
&lt;li>Sansasyon yaratmak. (büyük bir firmada çalışan bir kişinin sizi hacklemesi)&lt;/li>
&lt;li>Benzer fikir sahibi(rakip) firmanın bir özelliğinin olmaması ve kısa sürede hayata geçirememesi durumundan faydalanmak. Örneğin; bir e-bilet servisi kurdunuz. rakibiniz olan firmada bilet aldığınız mekandan yer seçemiyorsunuz. Bunun üzerinden reklam yapabilirsiniz.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="kaynaklar">Kaynaklar:&lt;/h3>
&lt;p>&lt;a href="http://www.business.com/guides/defining-a-revenue-model-for-your-business-911/">http://www.business.com/guides/defining-a-revenue-model-for-your-business-911/&lt;/a>
&lt;a href="http://digitalenterprise.org/models/models.html">http://digitalenterprise.org/models/models.html&lt;/a>
&lt;a href="http://onlinebusiness.starmatrimonials.com/onlinerevenuemodels.php">http://onlinebusiness.starmatrimonials.com/onlinerevenuemodels.php&lt;/a>
&lt;a href="http://www.davechaffey.com/Internet-Marketing/C2-Internet-micro-environment/Online-revenue-models">http://www.davechaffey.com/Internet-Marketing/C2-Internet-micro-environment/Online-revenue-models&lt;/a>&lt;/p></content></entry><entry><title>Bir Web Çatısı (Framework) Anatomisi</title><author><name/><uri/></author><id>https://hozgan.com/bir-web-catisi-anatomisi/</id><updated>2010-08-29T00:00:00Z</updated><published>2010-08-29T00:00:00Z</published><content type="html">&lt;p>2 yıldır PHP diliyle, &lt;a href="http://code.google.com/p/joy">Joy&lt;/a> isimli açık kaynak bir framework geliştiriyordum. Bu framework’e Joy adını vermemin başlıca nedeni, uygulama geliştirken gerçekten zevk vermesini istememden kaynaklanıyordu. Bu framework’un 5 farklı versiyonu mevcut ve hepsinde de farklı yaklaşımlar kullandım. İlk versiyonu Event Driven patterni kullanırken, sonraki sürümlerde MVC patterni ağırlıklıydı. Event driven yapısı ise sonraki sürümlerde Workflow amacıyla yaşam döngüsünde yerini almıştı. Bu sure zarfında çok şey öğrendiğimi itiraf etmeliyim. Birkaç ay once, piyasada çok fazla başarılı framework olması nedeniyle bu amacımdan vazgeçtim. Web dünyasının distributed computing ve parallel programming gibi konularada ihtiyaçlarınıda göz önünde bulundurarak, PHP yerini, JAVA’ya bıraktı ve Java projelerimin vazgeçilmez aracı olarak yerini aldı. Java’yı projelerimin merkezine yerleştikten sonra, bu ekosistemde, &lt;a href="http://code.google.com/p/joy">Joy Framework&lt;/a>’unde kullandığım fikirlerin sağlayacak araçları aramaya koyuldum. İlk zamanlar kaygılarım olsada J2EE ve Spring framework çevresinde aradığım her şeyi buldum. Aşağıda bu fikirleri ve Java dünyasındaki araçları bulacaksınız.&lt;/p>
&lt;ul>
&lt;li>URL Rewriter&lt;/li>
&lt;li>Router (Dispatcher)&lt;/li>
&lt;li>Core
&lt;ul>
&lt;li>Config Management&lt;/li>
&lt;li>Log Management &amp;amp; Debugging&lt;/li>
&lt;li>Cache Management
&lt;ul>
&lt;li>Distributed Cache&lt;/li>
&lt;li>Locale Cache&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Controller
&lt;ul>
&lt;li>Filter&lt;/li>
&lt;li>Workflow&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Context
&lt;ul>
&lt;li>Culture&lt;/li>
&lt;li>User&lt;/li>
&lt;li>Request&lt;/li>
&lt;li>Response&lt;/li>
&lt;li>Session&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>View
&lt;ul>
&lt;li>Render&lt;/li>
&lt;li>Template Engine&lt;/li>
&lt;li>Tag Library&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Model
&lt;ul>
&lt;li>ORM&lt;/li>
&lt;li>Persistence&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Plugin
&lt;ul>
&lt;li>Geolocation vb&amp;hellip;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Tools (Extra)
&lt;ul>
&lt;li>Console Tool
&lt;ul>
&lt;li>Code Generator&lt;/li>
&lt;li>Deployment&lt;/li>
&lt;li>Builder&lt;/li>
&lt;li>Documentation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Testing&lt;/li>
&lt;li>Inversion of Control&lt;/li>
&lt;li>Scaffolding&lt;/li>
&lt;li>Scheduler&lt;/li>
&lt;li>Authentication &amp;amp; Authorization
&lt;ul>
&lt;li>OAuth&lt;/li>
&lt;li>LDAP&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Client Side Library
&lt;ul>
&lt;li>Javascript (jQuery)
&lt;ul>
&lt;li>Cache&lt;/li>
&lt;li>Cookie&lt;/li>
&lt;li>Hotkeys&lt;/li>
&lt;li>Lazy Including&lt;/li>
&lt;li>Querystring&lt;/li>
&lt;li>Comet&lt;/li>
&lt;li>AJAX&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>CSS Frameworks
&lt;ul>
&lt;li>960gs, Blueprint&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Yukarıda sözünü ettiğim konuları PHP ile birçoğunu geliştirdim. xUnit, ORM , Library gibi kapsamlı konular için ise 3rd parti araçları kullandım. Bu yönüyle Integrated Framework olarakta adlandırılabilir. Hayatımın 2 yılı bu yapı üzerinde uygulamalar geliştiriken Java’ya geçince bir boşluğa düştüğümü ve paniklediğimi itiraf etmeliyim. Neyse ki Spring Framework ve Java’nın Servlet mimarisi beni ciddi rahatlattı. Java dünyasının üstadları yukarıdaki konularda daha once benim yerime kafa yormuş ve düşündüğüm birçok şeyi hayata geçirmişti. Şimdi gelin bu teknolojilerin neler olduğuna bir göz atalım. Sonrada Java’nın ve Spring’in gücüyle bir web çatısı nasıl olur onun güzel bir örneğini inceleyelim.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.oracle.com/technetwork/java/index-jsp-135475.html">Java Servlet&lt;/a>
&lt;ul>
&lt;li>&lt;a href="http://java.sun.com/products/jsp/">JSP&lt;/a> ve &lt;a href="http://www.oracle.com/technetwork/java/index-jsp-135995.html">JSTL&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="http://www.springsource.org">Spring&lt;/a>
&lt;ul>
&lt;li>&lt;a href="http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html">MVC&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://static.springsource.org/spring/docs/2.0.x/reference/beans.html">Inversion of Container&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://static.springsource.org/spring-security/site/index.html">ACEGİ (Spring Security)&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.springsource.org/webflow">Web flow&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="http://hibernate.org">Hibernate&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://wiki.sitemesh.org/wiki/display/sitemesh3/Home">SiteMesh&lt;/a>, &lt;a href="http://tiles.apache.org/">Tiles&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://quartz-scheduler.org/">Quartz Scheduler&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://logging.apache.org/log4j/">Log4J&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://maven.apache.org/">Maven&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://ehcache.org/">EhCache&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.tuckey.org/urlrewrite/">UrlRewrite&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Gelin şimdi yukarıdaki Java araçlarını yakından inceleyelim. **Java Servlet:**1.0 sürümün, JSR-315 diye adlandırılan 3.0 sürümüne kadar birkaç özellik dışında yaşam döngüsü pek değişmedi. Bu yaşam döngüsü, servlet mimarisinin esnekliğinin ana kaynağıdır. Web.xml dosyası içinde, Listener, Filter, Servlet tagleri bir web projesindeki tüm gereksinimleri kapsar. Frameworkler ise buradaki mimariden faydalanarak bu işleri daha kolay bir hale getirir. Şimdi gelin bu taglerin ne anlama geldiğini bir hatırlayalım.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Listener:&lt;/strong> Uygulama deploy edildiğinde ve undeploy edildiğinde burası çalışır. Isteklerden bağımsız olarak çalıştırılması düşünülen alanlar için düşünülmüştür. Örneğin; görev tanımlı işler için kullanılabilir. Quartz isimli scheduler&amp;rsquo;ın listener sınıfları vardır. Cache mekanizması içinde bu alan düşünülebilir. Yine EhCache uygulamasınında listenerları bulunmaktadır.&lt;/li>
&lt;li>&lt;strong>Filter:&lt;/strong> Filter tüm Request, Response trafiğinin arasına giren adında anlaşılacağı üzere filtreleme işlevi gören sınıflardır. Filterlara örnek olarak, Spring Security, ve Url Rewrite verilebilir.&lt;/li>
&lt;li>&lt;strong>Servlet:&lt;/strong> Response&amp;rsquo;un yaratıldığı alandır. Bu nedenle bir MVC framework&amp;rsquo;te genelde burada Router (Dispatcher) sınıfı bulunmaktadır.&lt;/li>
&lt;/ul>
&lt;h3 id="java-server-pages">Java Server Pages:&lt;/h3>
&lt;p>JSR-245 spesifikasyonunda detayları açıklanmıştır. JSP, PHP veya ASP&amp;rsquo;ye benzer. HTML üzerinde Java kodlarının çevik bir şekilde kodlanarak kullanılması amaçlanır. JSP dosyaları arkada otomatik olarak servlete dönüştürülür. Frameworkler ile birlikte, JSP dosyaları, template engine&amp;rsquo;i gibi kullanılmaya başlanmıştır.&lt;/p>
&lt;h3 id="java-standard-tag-library">Java Standard Tag Library:&lt;/h3>
&lt;p>Java&amp;rsquo;nın tag kütüphanesidir. Aynı ASP.NET&amp;rsquo;te olduğu gibi yeni bileşenler yaratılabilmesi sayesinde kod tekrarı engellenir ve yeniden kullanılabilirlik sağlanır.&lt;/p>
&lt;h3 id="spring-framework">Spring Framework:&lt;/h3>
&lt;p>Java dünyasında elinizi sallasanız bir Web Framework&amp;rsquo;e çarparsınız. O kadar fazladır ki, artık bıkkınlık getirir. Hangisini kullanmalı diye araştırıldığında, Spring Framework en çok tutulan frameworklerin başında gelmektedir. Bunun en önemli nedenlerinin başında, IoC, AOP gibi konuları sayesinde OOP ve tasarım prensiplerine uygun, bakımı kolay, temiz kodlar yazmamızı sağlaması gelmektedir. Struts&amp;rsquo;ı koltuğundan etmiş, Java EE 6&amp;rsquo;ya, getirdiği yeniliklerle ilham vermiş $ukella bir frameworktür. Kendi içinde, Security, Webflow, MVC vb gibi alt projeleri vardır. Sadece web alanında kullanmasa da, özellikle hakim olduğu alan burasıdır. VMWare tarafından desteklendiğini de belirtmekte yarar var.&lt;/p>
&lt;h3 id="spring-mvc">Spring MVC:&lt;/h3>
&lt;p>Web dünyasının son moda tasarım şablonu olan MVC&amp;rsquo;nin Spring implementasyonudur. İşleri anotasyonlar kullanılarak, XML konfigürasyonlar en aza indirgenir. Zaten bir IoC konteynerı olması nedeniyle. Model ve View alanında alternatif teknolojilerle entegre olması mümkündür. Bu da teknoloji seçimi esnekliği sağlar.&lt;/p>
&lt;h3 id="spring-security">Spring Security:&lt;/h3>
&lt;p>Spring Security, ACEGi olarakta bilinen bir projedir. Authentication ve authorization konularında çözümler sunar.&lt;/p>
&lt;h3 id="spring-web-flow">Spring Web flow:&lt;/h3>
&lt;p>İş akışlarını, kod bağımlılığını en aza indirgeyerek, XML konfigürasyonları ile yapılmasını sağlar. Bunun için event driven bir mimari kullanır.&lt;/p>
&lt;h3 id="hibernate">Hibernate:&lt;/h3>
&lt;p>JBoss&amp;rsquo;un geliştirdiği bir numaralı Persistence aracı olan Hibernate&amp;rsquo;i bilmeyen yoktur sanırım. Kısaca DAO tasarım şablonunu destekler. Ve veri erişim katmanı mimarisi ile veritabanı tablolarını sınıflar ile eşleştirir.
Alternatif olarak ise Java EE 5 ile hayatımıza giren JPA adlı bir başka persistence aracıda bulunmaktadır. Java EE 6 ile birlikte daha çok göreceğimiz persistence aracıdır.&lt;/p>
&lt;h3 id="sitemesh">Sitemesh:&lt;/h3>
&lt;p>Çok yeni olmasına rağmen, her geçen gün daha fazla ilgi görmeyi başaran bir şablon motorudur(templete engine). Java dünyasında, bir framework seçildiğinde, özellikle bu framework, Spring gibi integrated bir framework ise, layout(master page)
ihtiyacı ile ilgili bir arayış söz konusu olur. İşte Sitemesh, Tiles ve Velocity bu durumlarda en çok başvurulan şablon motorudur. Açıkçası, ilk önce ilgimi Tiles çekse de, sonraları Grails projesininde katkılarıyla Sitemesh ilgileri üzerinde topladı diyebilirim. Sitemesh, Tiles&amp;rsquo;tan daha basit olması diğer bir tercih nedenidir. Decorator Design patternini kullanır. Bunun anlamı, layout sayfanızda, sadece değiştireceğiniz alanları belirler ve ilgili sayfalara sadece bu alanları değiştirirsiniz.&lt;/p>
&lt;h3 id="quartz-scheduler">Quartz Scheduler:&lt;/h3>
&lt;p>Web dünyasında mutlaka, bazı işleri arkada düzenli olarak kontrol eden, yaratan vb servislere ihtyaç vardır. Örneğin, mail gönderme, statu güncellme vb.. İşte bu gibi konularda schuder bir servis gereksinimi var olur. Fakat iş mantığını ve birçok yardımcı kod java kodumuzdadır. Ve bu Cron gibi bir servise bağlandığında her seferinde bir VM&amp;rsquo;in belleğe yüklenip, kaldırılması anlamına gelir. Bunu engellemek için Servlet mimarisinde listener kullanmak daha yerinde olur. Çünkü Listener&amp;rsquo;lar aynı bellek alanını kullanır. Bu sayede ciddi bir performans kazanımı sağlanır.
İşte bu nedenle Quartz yaratılmıştır. Quartz trigger modelleri sayesinde, Cron benzeri bir formatta da konfigüre edilebilmektedir.&lt;/p>
&lt;h3 id="log4j">Log4J:&lt;/h3>
&lt;p>Apache projesinin loglama mimarisi.&lt;/p>
&lt;h3 id="ehcache">EhCache:&lt;/h3>
&lt;p>Son zamanlarda, frameworkler gibi çok fazla cache projesi ortaya çıkmıştır. Bunların çok azı distirbuted bir yapıda çalışır ve clustered, replication gibi konuları destekler. Ehcache ise, distributed cache desteklmesi, memory yetersiz olduğu durumlarda diski kullanması (SWAP) gibi özellikleri sayesinde, en çok tercih edilen bir cache projesi olmuştur.
Java&amp;rsquo;da memcache gibi Java dışında bir dil kullanılarak yazılan cache motorlarının kullanılmamasının en önemli sebebi, In Memory kavramıdır. Ehcache, uygulama ile aynı memory alanında çalışması ciddi bir performans artışı sağlamaktadır.&lt;/p>
&lt;h3 id="maven">Maven:&lt;/h3>
&lt;p>Maven, hem derlemek, hem de bağımlılıkları yönetmek için kullanılan çok kapsamlı bir deployment aracıdır. Derlemek işinin sadece bir bölümüdür. Bağımlılıkları yönetmenin yanında proje iskeleti konfigürasyon yaratmak konusunda da hünerleri vardır.
Diyelim ki, Spring MVC, Tiles ve Hibernate&amp;rsquo;i birlikte kullanmak istediniz ve konfigürasyonları ile uğraşmak istemiyorsunuz. &lt;a href="http://code.google.com/p/spring-maven-archetype/">http://code.google.com/p/spring-maven-archetype/&lt;/a> projesi işinizi görebilir. Maven üzerinde birçok archetype projesi bulabilirsiniz. Ya da kendi archetype&amp;rsquo;nızı yazarak yeni bir projeye hızlı bir başlangıç yapabilirsiniz.&lt;/p>
&lt;p>&lt;a href="http://code.google.com/p/archy/">AppFuse&lt;/a> adında birçok alternatif teknoloji konfigürasyonunu içinde barındıran bir archetype projeside mevcuttur.&lt;/p>
&lt;p>&lt;strong>Not:&lt;/strong> Son olarak söylemek istediğim bir şey daha var, yukarıdaki bir çok teknolojinin entegre edilmiş ve çevik bir web programlama ortamı sağlayan framework daha var. Java VM ile çalışmasına rağmen kodları Java değil. Gördüğüm en iyi web frameworklerinden biri olan bu framework&amp;rsquo;ün adı &lt;a href="http://www.grails.org/">Grails&lt;/a>. Yine arkasında &lt;a href="http://springsource.org">Spring&lt;/a> ekibi var ve Spring&amp;rsquo;in birçok teknolojisi ustaca kullanılmış. Dil olarak ise &lt;a href="http://groovy.codehaus.org/">Groovy&lt;/a> adında Ruby benzeri bir dil kullanılıyor. Groovy bir Java standardı. Java&amp;rsquo;nın gücüyle çevikliğin hızını birleştirmek isteyenler için küçük bir bilgi olsun istedim!
Artık elimizi koda bulamanın zamanı geldi. Yukarıdaki teknolojiler ile ilgili örneklere sırasıyla önümüzdeki yazılarda detaylı olarak ve örnekler sunarak inceleyeceğiz.&lt;/p></content></entry><entry><title>Java Dünyasında Web Surfing ve Spring Framework</title><author><name/><uri/></author><id>https://hozgan.com/java-dunyasinda-web-surfing-ve-spring-framework/</id><updated>2010-08-09T00:00:00Z</updated><published>2010-08-09T00:00:00Z</published><content type="html">&lt;p>Scala dili ile tanıştığımda çok radikal bazı kararlar aldım. Java teknolojileri dışındaki tüm bildiğim teknolojileri (PHP, C#, Perl, Ruby) elimin tersi ile itme kararı aldım! Neden mi? Çünkü Java hem kariyer planım (Web Architect) için hem de mesleki tatmin anlamında oldukça güçlü bir platform ve ekosisteme sahip. Peki ha deyince yapılabiliyor mu derseniz, işte bu yaz onun hikayesidir.&lt;/p>
&lt;p>Java&amp;rsquo;ya geçme kararı almadan önce Scala diliyle birşeyler yapmayı düşünüyordum. Lift framework&amp;rsquo;u falan incelemiş ve bazı özelliklerinden çok etkilenmiştim. Sonra &lt;a href="http://kariyer.net">http://kariyer.net&lt;/a> ve &lt;a href="http://indeed.com">http://indeed.com&lt;/a> üzerinde; &lt;a href="http://liftweb.net/">Lift&lt;/a> ve &lt;a href="http://scala-lang.org">Scala&lt;/a> ile verilen iş ilanlarına baktım. Scala ile şu anda para kazanamayacağımı anladıktan sonra, Java&amp;rsquo;nın gücünden faydalanmaya karar verdim ve Scala&amp;rsquo;yı özellikle Akka projesi ile distributed konularda kullanmaya karar verdim.&lt;/p>
&lt;p>2006-2007 döneminde Turkcell&amp;rsquo;in &lt;a href="http://turkcell-im.com">SDP-A&lt;/a> adlı projesinde çalışmamdan bu yana daha sonra çalıştığım şirketlerde Java teknolojilerine çok az sürmüş olmamdan kaynankalan bir gerileme söz konusuydu. Bu durumu kotarmak için, &lt;em>&amp;ldquo;Sun Certified Java Programmer&amp;rdquo;&lt;/em> sertifikası alarak, hem kendime, hem de ekosistemine bilgimi ispat edeceğime karar verdim. Ekim ayının sonunda SCJP sınava gireceğim. Bunun için öncelikle Amazon&amp;rsquo;dan &lt;a href="http://www.amazon.co.uk/Certified-Programmer-Study-Guide-CX-310-065/dp/0071591060">SCJP Study Guide&lt;/a> ve &lt;a href="http://www.amazon.com/Java-TM-Puzzlers-Pitfalls-ebook/dp/B001U5VJVS/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1281388008&amp;amp;sr=1-1">Java Puzzlers&lt;/a> kitaplarını sipariş ettim.&lt;/p>
&lt;p>Tabii sadece sertifika sahibi olmak ve/veya diğer dillerden miras gelen kod geliştirme standartlarını (design patterns gibi) bilmek yeterli değildi. Java ekosisteminde kullanılan araçlarada hakim olmalıydım. Web üzerinde çalışmalar yapan biri olarak, Java dünyasının popüler web çatılarını incelemeye başladım. &lt;a href="http://www.springsource.org/">Spring Framework&lt;/a>&amp;lsquo;ün adını çokca duymama rağmen, Java 6 ile tam uyumlu olan Jboss&amp;rsquo;un &lt;a href="http://seamframework.org/">Seam framework&lt;/a>&amp;lsquo;ude ilgimi çekmişti ilk zamanlar. Sonra bu kararı kollektif yatırıma bıraktım, biraz araştırma yapınca Java ekosisteminde bir numara olan web çatısının açık ara spring olduğunu anladım. Bu nedenle Spring ile yoluma devam etmeye karar verdim.&lt;/p>
&lt;p>Framework seçme işlemiyle aynı paralel zamanda IDE&amp;rsquo;de araştırmaya başladım. Maalesef Java öyle Vim ile yazmak işkenceye dönüşebiliyor. Önceleri IntelliJ Idea&amp;rsquo;yı sevsem de, ücretli olmasından ve her açılışta projeyi derinlemesine incelemesinden arayışa devam ettim. Netbeans&amp;rsquo;i denedim ama oldum olası ısınamamışımdır. Sonra eski dost Eclipse&amp;rsquo;e geri döndüm. Ve bugün IDE olarak tercihim &lt;a href="http://eclipse.org">Eclipse&lt;/a>&amp;rsquo;ten yana oldu.&lt;/p>
&lt;p>Derleme işlerinde ise eskiden Ant kullanan biri olsamda Maven2&amp;rsquo;yi tercih ettim. Maven ile tanışmam Scala daha doğrusu Lift framework vesile oldu. Paket bağımlılıkları ve deployment sürecini kolaylaştırması nedeniyle hemen kanım kaynadı. Archetype&amp;rsquo;lar sayesinde bir proje iskeleti hazırlamak çok kolay oluyor.&lt;/p>
&lt;p>Spring framework&amp;rsquo;u seçtikten sonra, template engine armaya başladım. Önce Spring&amp;rsquo;te JSP örnekleri görünce ısınamadım. Ben JSF&amp;rsquo;teki gibi tag kütüphaneleri oluşturabileceğim bir template engine arıyordum. JSF ile Spring&amp;rsquo;i aynı çatıda kullanmayı denediysemde beceremedim. Daha sonra birşeyleri yanlış yaptığıma karar vererek durumumu tekrar inceledim. Ve JSP örneklerindeki JSTL teknolojisini keşfettim. JSTL tag libarary olmasına rağmen benim için yeterli değildi, layout yada master page gibi bir mimari içermiyordu. Araştırmalarım sırasında önce &lt;a href="http://tiles.apache.org/">Apache Tiles&lt;/a> ile hedefe ulaştığımı düşünsem de, sonra &lt;a href="http://www.sitemesh.org/">Sitemesh&lt;/a> ile bu işleri daha temiz bir şekilde çözelbildiğimi farkettim.&lt;/p>
&lt;p>ORM ve Persistence aracı olarak tüm java kullanıcılarının tek geçtiği &lt;a href="http://www.hibernate.org">Hibernate&lt;/a>&amp;lsquo;i kullanmaya karar verdim. Son olarak güvenlik ve yetkinlendirme konularında &lt;a href="http://www.acegisecurity.org">Acegi&lt;/a>, zaman ayarlı işler için ise &lt;a href="http://www.quartz-scheduler.org/">Quartz&lt;/a> kullanmaya karar verdim. Bir sonraki yazımda spring framework ve söylediğim araçların Maven kullanarak Spring çatısı altında nasıl entegre edeceğimizi konuşacağız. Tabii konularda ilerledikçe seviyemizi arttıracak ve vites büyülteceğiz.&lt;/p>
&lt;p>Ama bu süreçte bana akıl hocalığı (mentor) yapan ve deneyimlerini sıkılmadan paylaşan değerli dostum &lt;a href="http://rayyildiz.com">Ramazan Ayyıldız&lt;/a>a teşekkür ederim.&lt;/p>
&lt;p>Java kocaman dalgaları olan bir derya. Ve bu dalgalarla surf yapmanın tadına doyulmayacağı aşikar. :)&lt;/p></content></entry><entry><title>Java Berbattır</title><author><name/><uri/></author><id>https://hozgan.com/java-berbattir/</id><updated>2010-08-01T00:00:00Z</updated><published>2010-08-01T00:00:00Z</published><content type="html">&lt;p>Arama motorlarında &amp;ldquo;XXX Sucks&amp;rdquo; diye arattığınızda bir sürü şey bulursunuz. C# Sucks, PHP Sucks, Java Sucks, Windows Sucks, Linux Sucks, Obama Sucks şeklinde bu liste uzayıp gider&amp;hellip; Her dille ilgili bu kalıpta yazılar bulabilirsiniz. Aslında bu yazı benim neden Web üzerinde Java&amp;rsquo;yı tercih ettiğimin hikayesi ve çevremde birçok insanın söylediği &amp;ldquo;Java Berbattır&amp;rdquo; ifadesinin bir cevap niteliğindedir. Java ile ilgili şehir efsanalerine bir tarafsız bir bakış olmasını hedeflemekteyim. Çevremdeki insanlardan duyduğum şehir efsaneleri;&lt;/p>
&lt;ol>
&lt;li>Java yavaştır.&lt;/li>
&lt;li>Java karmaşıktır.&lt;/li>
&lt;li>Java ticaridir.&lt;/li>
&lt;li>Uygulama geliştirmek zordur.&lt;/li>
&lt;li>Java çevik değildir.&lt;/li>
&lt;li>Java web için uygun değildir.&lt;/li>
&lt;li>Java platformunda proje geliştirmek uzun sürer.&lt;/li>
&lt;/ol>
&lt;h3 id="avantajları">Avantajları;&lt;/h3>
&lt;ol>
&lt;li>Açık kaynaktır.&lt;/li>
&lt;li>Kurumsal destek.&lt;/li>
&lt;li>Yazılım mimarisi çözümleri&lt;/li>
&lt;li>Geniş ekosistem&lt;/li>
&lt;li>Güçlü araç ve teknolojiler&lt;/li>
&lt;li>Her platformda sorunsuz çalışma.&lt;/li>
&lt;li>Saygınlık&lt;/li>
&lt;li>Dolgun maaş.&lt;/li>
&lt;li>Performans ve Güvenlik&lt;/li>
&lt;li>Dökümantasyon ve Standartlar&lt;/li>
&lt;li>Ekonomik kaynak tüketimi&lt;/li>
&lt;li>Nesne yönelimli bir dildir.&lt;/li>
&lt;li>Sanal makine mimarisi&lt;/li>
&lt;/ol>
&lt;h3 id="dezavantajları">Dezavantajları;&lt;/h3>
&lt;ol>
&lt;li>Terminoloji karmaşası.&lt;/li>
&lt;li>Çok tanrılı dinler gibi her kafadan ses çıktığı için gelişimi yavaştır!&lt;/li>
&lt;li>Öğrenmesi zordur!&lt;/li>
&lt;/ol>
&lt;h3 id="java-yavaştır-efsanesi">Java Yavaştır Efsanesi:&lt;/h3>
&lt;p>Java yavaştır algısı çıktığı yıllarda C++ ile kıyaslanmasından ve Swing GUI çatısından kaynaklanmaktadır. Web dünyası için en performanslı dillerden biridir. &lt;a href="http://shootout.alioth.debian.org/u32/benchmark.php?test=all&amp;amp;lang=php&amp;amp;lang2=java">Şuradan&lt;/a> Java&amp;rsquo;nın PHP ve diğer dillerle olan benchmark testlerini inceleyebilirsiniz.&lt;/p>
&lt;h3 id="java-karmaşıktır-efsanesi">Java Karmaşıktır Efsanesi:&lt;/h3>
&lt;p>Java aslında karmaşık değil esnek bir mimarisi bulunmaktadır. Bu PHP gibi bir alana yönelik bir dil değilde birçok alanda kullanılmasından kaynaklanmaktadır. Doğru bir web çatısına sahip değilseniz Ruby&amp;rsquo;de karmaşık bir Web dili olabilmektedir. Fakat Rails ile bu sorun aşıldığı gözlenmiş ve Ruby son yılların popüler dillerinden biri haline gelmiştir. Böyle bir algı oluşmasının diğer bir sebebide Java üzerinden çok fazla terminoloji ve alternatif teknoloji olmasından kaynaklanmaktadır. Her bir alternatifin kendine has config tanımlarının olması yeni öğrenenleri zorlamaktadır. İşin sırası doğru yapıldığında Java&amp;rsquo;nın çalışma mantığı kolaylıkla yerli yerine oturacaktır.&lt;/p>
&lt;h3 id="java-ticaridir-efsanesi">Java Ticaridir Efsanesi:&lt;/h3>
&lt;p>Açık kaynak camiadan birçok arkadaşım Java&amp;rsquo;yı kapalı kaynak olduğu için sevmiyordu. Sun firması Java&amp;rsquo;nın kaynak kodlarını açmadan önce bile Java diliyle birçok açık kaynak proje yazılmış ve bu araçların bir çoğu diğer dillere örnek oluşturmuştur. Sun Java&amp;rsquo;nın kaynak kodlarını açtıktan sonra ise JVM üzerinde çalışan bir sürü dil ortaya çıkmıştır. (Scala, Groovy, Clojure, vb..)&lt;/p>
&lt;h3 id="java-web-için-uygun-değildir-efsanesi">Java Web için uygun değildir Efsanesi:&lt;/h3>
&lt;p>Bu algının sebebi de sanırım betik diller gibi yaz çalıştır şeklinde ilerlenememesidir. Java&amp;rsquo;da kaynak kod ara koda çevrilmeden web sunucusu üzerinde bir betik dili gibi çalışmaz. Bunun production sunucu üzerinde geliştirme yapılabilme durumunu göz önünde bulundurursak iyi birşeydir ama geliştirme süresini uzatır. Bunun için Java üzerinde çeşitli araçlar bulunmaktadır. Bunlardan en çok bilineni ise &lt;a href="http://www.zeroturnaround.com/jrebel/">JRebel&lt;/a>&amp;lsquo;dir.&lt;/p>
&lt;h3 id="java-üzerinde-uygulama-geliştirmek-uzun-sürer-efsanesi">Java üzerinde uygulama geliştirmek uzun sürer Efsanesi:&lt;/h3>
&lt;p>Java üzerinde proje başlatmak bazı konfigürasyonları en başında sağlamak gerektiği için uzun sürdüğü doğrudur. Bu sorun dille değil, doğru bir web çatısı ve IDE seçmekle çözüme kavuşabilir. Java platformunda koşan ve Scala diliyle yazılan Lift web çatısı ile Groovy diliyle yazılan Grails web çatısı güzel örnek teşkil eder. &lt;em>(Not: Maalesef Java IDE&amp;rsquo;leri halen istenilen şartlarda değildir.)&lt;/em>&lt;/p>
&lt;h3 id="avantajları-1">Avantajları;&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Açık Kaynaktır:&lt;/strong> Java&amp;rsquo;nın kaynak kodları açıktır. Apache, Jboss gibi kar amacı yazılım toplulukları pahalı olan yazılım geliştirme araçlarını ücretsiz sunmaktadır.&lt;/li>
&lt;li>&lt;strong>Kurumsal Destek:&lt;/strong> Java&amp;rsquo;nın arkasında dünyanın en büyük şirketlerinin olduğu bir konsorsiyum bulunmaktadır. IBM, Oracle, SAP ilk aklıma gelen şirketlerden.&lt;/li>
&lt;li>&lt;strong>Yazılım Mimarisi Çözümleri:&lt;/strong> Java mimarların aracıdır. Yazılım mimarisi kitaplarında genelde örnek kodlar javadır. Birçok yazılım mimarisi tasarımları Java mimarlarına aittir. Diğer hiçbir dilde bu konular bu derece dikkate alınmaz.&lt;/li>
&lt;li>&lt;strong>Geniş Ekosistem:&lt;/strong> Java&amp;rsquo;da Apache, Jboss, Eclipse, SpringSource, CodeHaus gibi çok büyük topluluklar bulunmaktadır. Ve bu topluluklar her gün yeni java projelerini bünyelerine katmaktadır.&lt;/li>
&lt;li>&lt;strong>Güçlü Araç ve Teknolojiler:&lt;/strong> Java üzerinde her türlü ihtiyaç için uygulama geliştirilmiştir. Aynı ihtiyaç ile ilgili olarak birden fazla alternatif olması, rekabeti beraberinde getirir. Rekabette kaliteyi doğurur. Java ile ilgili uygulamaları &lt;a href="http://www.java-source.net">Java-Source&lt;/a> sitesinden inceleyebilirsiniz.&lt;/li>
&lt;li>&lt;strong>Her Platformda Sorunsuz Çalışma:&lt;/strong> Java&amp;rsquo;nın en güzel yanlarından biride istediğim işletim sistemi üzerinde sorunsuz çalışabilmesidir. Windows yada MacOS üzerinde yazdığınız uygulamanız, düşük maliyetli yüksek performanslı ve güvenlikli Linux sunucularında barındırmanız mümkündür. Aynı zamanda geniş bir kullanım alanı olduğu için ERP veya Web uygulaması geliştirmekten tutunda Robotik konusunda bile etkilidir.&lt;/li>
&lt;li>&lt;strong>Saygınlık:&lt;/strong> Java ile uygulama geliştirmek biraz daha zahmetli göründüğünden diğer developerlar tarafından saygı görür. Java teknolojilerini kullanan şirketler genelde büyük kuruluşlardır.&lt;/li>
&lt;li>&lt;strong>Dolgun Maaş:&lt;/strong> Java developerları diğer developerlardan daha fazla ücret alırlar. &lt;img src="/files/2010/08/java-salary.jpg" alt="/files/2010/08/java-salary.jpg &amp;ldquo;java-salary&amp;rdquo;">&lt;/li>
&lt;li>&lt;strong>Performans ve Güvenlik&lt;/strong>: Java web üzerinde bir çok dilden daha performanslı çalışır. Bu sebeple birçok betik dilin Java sanal makinesinde çalışan sürümleri yazılmıştır. (jRuby, JPython gibi)&lt;/li>
&lt;li>&lt;strong>Dökümantasyon ve Standartlar&lt;/strong>: Java diğer dillere nazaran en iyi standartları oluşturulmıuş ve dökümante edilmiş dilidir. Çok sayıda kaynak kitap bulabilirsiniz.&lt;/li>
&lt;li>&lt;strong>Ekonomik Kaynak Tüketimi&lt;/strong>: Java ile sunucu maliyetleriniz ve lisans giderleriniz minimuma düşer. Çünkü pahalı ticari çözümleri kadar iyi sonuçları alabileceğiniz, açık kaynak çözümler kullanabilirsiniz.&lt;/li>
&lt;li>&lt;strong>Nesne yönelimli bir dildir:&lt;/strong> Her ne kadar &amp;ldquo;Pure OOPL&amp;rdquo; yani herşeyiyle nesne yönelimli bir dil olmasada, java nesne yönelimli bir dildir. Ve özellikle JDK5&amp;rsquo;ten sonra çok güçlü bir hale gelmiştir.&lt;/li>
&lt;li>&lt;strong>Sanal makine mimarisi:&lt;/strong> Kodun taşınabilirliğini düşünmeden yani platform bağımsız kod yazmanızı sağladığı gibi, performans sorunu yaşayanan ama çevik uygulama geliştiren diller içinde bir çözüm oluşturmaktadır. Bu dillerin derleyicileri JVM üzerinden çalışacak şekilde yeniden yazılmıştır.&lt;/li>
&lt;/ol>
&lt;h3 id="dezavantajları-1">Dezavantajları;&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Terminoloji karmaşası:&lt;/strong> Java&amp;rsquo;nın alana özel değilde genel ve kurumsal bir dil olması nedeniyle birçok probleme çözümler geliştirmiş ve bunları Java EE çatısı altında toplamıştır. Bunların öğrenilme süreci yeni başlayanlar için sorun olabilmektedir.&lt;/li>
&lt;li>&lt;strong>Çok tanrılı&lt;/strong> dinler gibi her kafadan ses çıktığı için gelişimi yavaştır! Java&amp;rsquo;nın arkasında Oracle, IBM gibi devlerden oluşan bir topluluk olduğunu söylemiştik. Çok fazla sahibi olduğu için hızlı bir şekilde dile yeni özellikler dahil edilememektedir.&lt;/li>
&lt;li>&lt;strong>Öğrenmesi zordur!&lt;/strong> Maalesef diğer dillere kıyasla Java&amp;rsquo;nın öğrenme süreci biraz daha uzun sürer. Bana sorarsanız bunun sebebi dilin kendisinden ziyade alternatif IDE ve araçların fazla olması ve hepsine uyumlu çalışması için bu araçların esnek olması ve yeni başlayan geliştiricinin bu araçlar için konfigürasyon ayarlarını kendi yapmak zorunda olması.&lt;/li>
&lt;/ol></content></entry><entry><title>Scala Türkiye Yayında</title><author><name/><uri/></author><id>https://hozgan.com/scala-turkiye-yayinda/</id><updated>2010-08-01T00:00:00Z</updated><published>2010-08-01T00:00:00Z</published><content type="html">&lt;p>Scala ile çalışmalar yapıyor ve ortak bir toplulukta paylaşmak ve sizin gibi Scala severlerle tanışmak istiyor, ya da neymiş bu Scala diye merak ediyorsanız sizi de &lt;a href="http://www.scala-tr.org">Scala Türkiye&lt;/a> adresine bekliyoruz.&lt;/p></content></entry><entry><title>Göç Zamanı ve Limonlu Soda Keyfi</title><author><name/><uri/></author><id>https://hozgan.com/goc-zamani-ve-limonlu-soda-keyfi/</id><updated>2010-07-31T00:00:00Z</updated><published>2010-07-31T00:00:00Z</published><content type="html">&lt;h2 id="göç-zamanı">Göç Zamanı&lt;/h2>
&lt;p>Futbol ile programcılık arasında bir benzerlik var desem ne dersiniz? Doğruyu söylemek gerekirse, Metin, Ali, Feyyaz, Prekazi, Simoviç, Rıdvan vb&amp;hellip; isimlerin Türkiye&amp;rsquo;nin gündeminden düşmesi ile futbolun benim gündemimden düşmesi aynı zamana denk gelir. Anlayacağınız futboldan anlamamda, keyif almamda. Ama bildiğim kadarıyla, futbolcular 30-35 yaş aralığına gelince emekliliğe ayrılmaya zorlanıyorlar. Devam etmek isteselerde hiçbir kulüp onları kadrolarında görmek istemiyor. Haksız değiller tabii, genç, yetenekli ve hızlı bir futbolcu ile tecrübeli bir futbolcu arasında tercih yapmamı isteseler bende genç, yetenekli, ucuz ve hızlı futbolcuyu tercih ederim. Teknik direktörün görevi zaten &amp;ldquo;tecrübelerini paylaşmak&amp;rdquo; değil mi?&lt;/p>
&lt;p>Yazılım dünyasında da durum pek farklı değil, 30&amp;rsquo;lu yaşlarına gelen yazılım geliştiricilerin birçoğu stabil bir moda geçiyor. Özellikle evlendikten sonra bu daha net gözlemlenebiliyor. Evlilik programcılık arzusunu öldürüyor mu (: bilmiyorum ama evlendikten sonra mesleki bilgisini güncellemeyen ve halen Visual Basic yazarak hayatını kazanan bir insanla tanıştım. Kendisini neden geliştirmediğini sorduğumda, aldığım cevap; &amp;ldquo;çevresindeki insanların VB geliştiricisi olduğundan (yazının ikinci bölümünde bundan bahsedeceğim) ve iş ortamında Visual Basic&amp;rsquo;in kendisine yettiğini&amp;rdquo; söyledi. Müşterilerininde hangi teknolojiyi kullandığını önemsemediğini belirtti. Duvara çok kötü toslayacağı kesin! (: Peki sektörü yakından takip eden, bilgilerini sürekli güncelleyen bir kişinin akıbeti sizce ne olur?! Eğer bu kişi yönetim pozisyonuna geçiş yapmazsa maalesef aynı akıbete uğrayacaktır. Futbol ile ilgili örneğimize geri dönersek, bu kadar iyi olan insanlardan teknik direktörlük yapması beklenir. Ve deneyimlerini genç programcılara aktarması beklenir. Bir programcı olarak kendinize sordunuz mu, teknik direktör olma şansınız nedir? Aslına bakarsanız çok iyi olan programcıların hepsi bu pozisyonlar için uygun değildir. Bazı pozisyonlar için insan, stres, risk ve zaman yönetimi gibi yetenekler gerekir. Ama bu becerileri istemeyen yöneticilik pozisyonlarıda vardır. (Mimarlık gibi.)&lt;/p>
&lt;p>Yukarıda saydığım bazı yeteneklerden bazıları kazanılamayacağı gibi bir kısmının da öğrenilmesi mümkündür. İşte genç yazılım geliştiricinin yapması gereken bu eksiklerini tespit etmesi ve tamamlaması gerekir. (İyi bir yöneticiniz varsa size bu konuda yardımcı olacaktır.) Tercih edilmenizi sağlayacak karakteristik özelliklerin dışında, bakılan diğer şeylerde, sertifikalar ve ne kadar insanın sizi önerdiğidir. Örneğin; Proje Yöneticisi olmak istiyorsanız, dünyaca kabul gören sertifikalardan biri olan PMP sertifikası hedeflenebilir. Ya da yazılım mimarlığı için, SCEA (Sun Certified Enterprise Architect) ya da OpenGroup tarafından desteklenen TOGAF çerçevisinin sertifikasıda hedeflenebilir. Hangi alanda olursa olsun bir yöneticinin ingilizcesi şüphesiz pürüzsüz olmalıdır. Zaten bu bildiğim tüm sertifikalar için şüphesiz ön koşuldur.&lt;/p>
&lt;p>Tabii herkes teknik direktör olamaz bazılarımızda gündemi oluşturan kişi yani yorumcu olur. Bakınız Rıdvan Dilmen. Adam Fenerbahçe&amp;rsquo;de teknik adam olarak pek birşey yapamasa da (kimine göre yaptırılmasada!), gördüğüm en iyi yorumculardan biri :) Belkide yazılım geliştirici olarak siz, bir yönetim pozisyonunda değilde açık kaynak bir projede gündemi belirleyen projelere imza atabilirsiniz. Gelir modeliniz, açık kaynak bir proje üzerine kurulu olabilir ve tanınan biri olabilirsiniz. Bu konuda aklıma gelen örnekler bizden Cenk &amp;amp; Çağatay Çivici&amp;rsquo;nin PrimeFaces isimli proje ve şirketleri. Açık kaynak projeler görüldüğü kadar kolay değildir. Topluluk&amp;rsquo;un saygısını gerektirir. Bolca dökümantasyon, anlaşılabilir ve kaliteli kodlar ve bolca çalışma ve yama gönderen bir sürü insan. :P&lt;/p>
&lt;p>Son çıkış yolu ise bir girişim kurmaktır. Bence en zor olanıda bu. (: Çünkü burada yukarıda saydığım özelliklerin hemen hepsine sahip olmanız ve dünyanın gündemine oturacak şeyler yapmanız ve önemli kararlara liderlik etmeniz vb. şeyler gerekir. Elbette kimse sertifikalarınızla ilgilenmez ama zamanı, riski ve insanı yönetemezseniz sonunuz yakın demektir. Ama buda yeterli değildir dünyanın gündeminide değiştirmeniz beklenir.&lt;/p>
&lt;p>Yukarıda yazdıklarım 30 yaşın getirdiği derin düşünceler. Bir karar anı, dürüst olmak gerekirse ben bu ruh halini 35 yaşıma kadar beklemiyordum. Proje yöneticiliği pozisyonlarını hep elimin tersiyle ittim. Ama çalıştığım şirketlerde, iyi yöneticiler kadar, yukarıda saydığım özelliklere sahip olmayan, kötü, kalitesiz ve sadece dikta ederek yönetici olunduğunu düşünen, sözde proje yöneticilerini gördükçe neden bu tarafa kaymadığımı düşünmeye başladım. Evet size yazının başından beri söylediğim özelliklere sahip olmayan insanlarda proje yöneticisi olabilir. Ama bu kalitesiz işler ve mutsuz geliştiriciler anlamına gelir. (Yazının ikinci bölümünde bundan söz edeceğim.) Ve yazılım baştan sona bir ekip ruhu gerektiren bir takım oyunudur. Ekipte herkes değerli ve eşit seviyededir. Belki ideal proje yöneticisi profilini sonra tekrar gözden geçiririz.&lt;/p>
&lt;p>Açık kaynak &lt;a href="http://netology.org">projeler&lt;/a> geliştirmeyi denemiş olsamda (eminim hiçbirini (: duymamışsınızdır!) topluluk konusunda ve devamlılık konusunda pek başarı olmadığım için artık bu tarafta çalışmalarımı askıya almaya karar verdim. Açık kaynak projelere, kullanıcı cephesinden bakacağım bir süre.&lt;/p>
&lt;p>Bir önceki &lt;a href="/2010/03/zamani-sahiplenmek">yazımda&lt;/a> da bahsetmiştim. Çok kadın hiç kadındır diye. Yazılım geliştirmenin bir çok alanında olmak istiyorum. İşin marketing bacağında da, network bacağında da, bu sebeple işime daha fazla ayırmam gereken süreyi birçok alana bölüyordum. Ve ana hedefim lafta kalmaya başladığını farkettim. Bundan böyle sadece Java platformu üzerinde yazılım mimarileri tasarlamayı ve geliştirmeyi hedefliyorum. 30 Ekim&amp;rsquo;de SCJP sınavına gireceğim. Sınav sonucunu ve Java ile ilgili öğrendiklerimi bu blogta paylaşacağım. Araç olarak &amp;ldquo;Neden Java&amp;rsquo;yı Seçtiğimi ?!&amp;rdquo; &lt;a href="/2010/08/java-berbattir">&amp;ldquo;Java Berbattır&amp;rdquo;&lt;/a> başlıklı yazımda uzun uzadıya bahsettim. (:&lt;/p>
&lt;h2 id="limonlu-soda-keyfi">Limonlu Soda Keyfi&lt;/h2>
&lt;p>Malcolm Gladwell, kitaplarını çok sevdiğim bir adamdır. Kıvılcım Anı (Tipping Point) isimli kitabı kollektif zeka ile ilgileniyorsanız mutlaka okumanız gereken bir başyapıttır. Kendisinin &lt;a href="http://www.ted.com/talks/view/id/20">TED etkinlerindeki konuşmasında&lt;/a> insanların en iyiyi aradıklarını aslında birden fazla en iyi olduğundan söz eder. Limonlu Soda&amp;rsquo;nın icadı bence, meşrubat piyasasında kolayı ciddi oranda sarsan ciddi bir yenilik. Benim gibi kola ve ayran içmeyenler için bulunmaz bir icat. Babam sodasını limonlu içmeyi sever. Dedem de sodasını hep limonlu içermiş. Neden limonlu sodayı ürün olarak satma fikri bu kadar geç girdi pazara. Ya da yoğurdun muciti türkler olmasına ve Kanlıca&amp;rsquo;nın nefis pudra şekerli yoğurdunun yıllardır hayatımızda olmasına rağmen kimse meyveli yoğurt fikrini ürünleştirmedi?! Eminim bunun birçok sebebi vardır ama Gladwell&amp;rsquo;in anlattıkları ile bu konuyu tekrar değerlendirmek gerekir. Gladwell konuşmasında tek bir en iyinin peşinde olduğumuzdan söz ediyor. Aslında tek bir en iyinin olmadığını ve en iyilerin olduğunu yineliyor. Ben bunu, takip ettiğimiz müzik gruplarına benzetiyorum. En iyi dediğiniz müzik grubunuz var mı? Yoksa en iyi müziği yapan müzik gruplarınız mı var?! Peki ben bunu neden anlatıyorum? Sözü getirmeye çalıştığım konu çalışma ortamlarımız. Ben de en iyi bir yazılım ekibiyle çalışmanın peşimde olanlardandım. Örneğin Google, Microsoft, Facebook, Yahoo vb&amp;hellip;&lt;/p>
&lt;p>Google&amp;rsquo;da çalışırsanız, zeki ve işi kurallarına göre yapan bir sürü mühendisin çalıştığı kampüste olduğunuzu düşünürsünüz. Onlardan birşeyler öğrenir, onlara birşeyler öğretir ve kampüste oynanan oyunu kurallarına göre oynamaya başlarsınız. Çevremiz ne kadar iyi yazılımcılar ile doluysa bizde o kadar iyi yazılımcı oluruz. Bu yazdığımı kabullenmek zor olabilir. Bir önceki şirketinizde süreçler varsa, kod kalitesi için yazılan kodlar gözden geçiriliyor, günlük toplantılar yapılıyor ve çalıştığınız insanlar güvenlik, performans gibi konulara önem vererek işini yapıyorsa, sizde aynı şekilde çalışmayı adet haline getirirsiniz. Ama eğer, herşeyin bürokrasi ile yürütüldüğü, bir işi yapmanız 40 kişinin onayını gerektiriyorsa, yeni teknolojiler ve kalite süreçleri ekip çalışanlarını korkutuyorsa, proje yöneticileri kalite güvencesi (Quality Assurence) gibi konuları önemsemiyor, basit düşünmüyor işleri iyice karmaşık bir hale sokuyorsa sizde bu şirketin kültüründen nasibinizi alırsınız. Şirket kültürleri önemlidir.&lt;/p>
&lt;p>Genelde hangi şirketlerde çalışacağımıza, iş başvurusunda bulunarak biz karar veririz. Görüşmelerde şirketler sundukları imkanlardan ve fırsatlardan söz eder. Eğer şirketin ortamının sizi ileriye değilde, geriye götüreceğinizi düşünüyorsanız bence o şirkete en başında girmeyin ya da şirkete girdiyseniz ve hayalinizdeki çalışma ortamını orada yaratacağınıza inanıyorsanız hemen başlayın. Bir fikir başlatmak zordur ama imkansız değildir. Genelde yeniliklere kapalı şirketlerde bir çok şey için sizin ve sizin gibi düşünenlerin ekstra efor sarfetmesi gerekir.&lt;/p>
&lt;p>Bir yazılım geliştirici olarak hayalinizde ki çalışma ortamı nasıldır? Eminim birden fazla farklı cevaplar gelecek. Süreçler işlensin, insiyatif tanınsın, ilgi alanıma göre işler yapayım, yeni teknolojileri için arge yapalım, koltuklar rahat olsun, oyun odası olsun vb düşünceler ilk aklıma gelen birkaç düşünce. Çalışma ortamları performansı doğrudan etkileyen şeylerden biridir. Bunu herkes söyler. Şirketler en iyi çalışma ortamını yaratmaya çalışıp dururlar. En iyinin tek bir tane olmadığını yukarıda Gladwell&amp;rsquo;in konuşmasında duymuşturk. Mükemmel bir çalışma ortamı bir tane değildir. Bir çok çalışan için farklı mükemmel ortamlar vardır.&lt;/p>
&lt;p>Çoğu şirket iyi çalışanlar bulamadığından yakınır. Bence iyi çalışanlara sahip olmak ancak iyi bir çalışma ortamınız ve şirket kültürünüz varsa mümkündür. Üzüm üzüme baka baka kararır diye boşuna söylenmediğini düşünüyorum.&lt;/p>
&lt;p>&lt;em>Sizin mükemmel çalışma ortamınız nedir?&lt;/em>&lt;/p></content></entry><entry><title>Lokasyon Bazlı Servisler Yaratmak</title><author><name/><uri/></author><id>https://hozgan.com/lokasyon-bazli-servisler-yaratmak/</id><updated>2010-04-10T00:00:00Z</updated><published>2010-04-10T00:00:00Z</published><content type="html">&lt;p>Son 2 yıl içerisinde Mikro-blogları ve bu konuda geliştirilen web uygulamalarının adını çokça duyduk. Bu yıl ise, özellikle lokasyon bazlı uygulama örneklerini görmeye başladık. Foursquare, Loopt, Google Latitude, Gowalla, Rummble ve bu işe yeni girişen Twitter, Facebook aklıma gelen ilk örnekleri. (Ben bu yazıyı hazırlarken; Yahoo, FourSquare&amp;rsquo;ı satın almayı düşünüyor fakat 100 Milyon$ edip etmeyeceğine karar vermeye çalışıyordu) Lokasyon bazlı servisler gizlilik konusunuda beraberinde getirdi. Hatta bu konuda Google&amp;rsquo;ın CEO&amp;rsquo;su Eric Schmidt&amp;rsquo;in &amp;lsquo;&lt;a href="http://www.theregister.co.uk/2009/12/07/schmidt_on_privacy/">Gizlenmek istemeniz, gizlenmesi gereken işlerle meşgul olduğunuz anlamına gelir&lt;/a>&amp;rsquo; demecine en güzel cevabı, &amp;ldquo;Lütfen beni soyun&amp;rdquo; anlamına gelen ve foursquare&amp;rsquo;daki bulunduğunuz konuma göre hırsızlara davetiye çıkaran, &lt;a href="http://PleaseRobMe.com">http://PleaseRobMe.com&lt;/a> isimli bir sitenin verdiğini düşünüyorum. Halen gizlilik politikaları lokasyon bazlı servislere karşı önyargıları olan insanları tatmin ettiği söylenemez. Gizlilik konusu daha çok tartışılacak bir konu gibi görünüyor. Bunun en son örneği ise Fazlamesai.net sitesindeki &lt;a href="http://www.fazlamesai.net/?a=article&amp;amp;sid=5399">&amp;ldquo;Kim? Ne zaman? Kiminle? Nerede?&amp;rdquo;&lt;/a> başlıklı yazısı. Bu tartışmalar süre dursun, lokasyon bazlı servisler artık hayatımıza girdi ve çıkacak gibide durmuyor. Peki bu işin teknik altyapısında neler var, gelin bunları inceleyelim ve bu blogun amacına uygun bir davranış sergileyelim.&lt;/p>
&lt;h3 id="lokasyon-bazlı-servisler-lbs-nedir">Lokasyon Bazlı Servisler (LBS) Nedir?&lt;/h3>
&lt;p>Bir kişinin lokasyon bilgisini almanın birkaç yöntemi vardır. Bunlar;&lt;/p>
&lt;ul>
&lt;li>IP&amp;rsquo;den Lokasyon bulma (GeoLocation)&lt;/li>
&lt;li>GSM Operatorunden (3 Baz Istasyonundan Tahmini Lokasyon Bilgisi)&lt;/li>
&lt;li>GPS telefonlar yoluyla bulma&lt;/li>
&lt;li>HTML5 ile birlikte Lokasyonu browser&amp;rsquo;a sorma (GeoLocation)&lt;/li>
&lt;li>Fotoğrafın EXIF bilgisinden öğrenme&lt;/li>
&lt;/ul>
&lt;p>Yukarıdaki yöntemlerin hepsiyle konum bilgisini (longitude ve latitude) elde etmek mümkün. Bunlardan GPS ve GSM ilgili olan yöntemler, makineden makineye ve operatorden operatore değişiklik gösterebileceği için bu yazının kapsamı dışındadır. GSM ve GPS üzerinden lokasyon çekmek özellikle lokasyonun güvenilirliği gerektiği durumlarda daha etkili olmaktadır. Tabii GSM ve GPS gibi sistemleri simule etmekte mümkün ama şimdilik, küçük bir kesimin yapabileceği bir iş.&lt;/p>
&lt;h3 id="neler-yapılabilir">Neler Yapılabilir?&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Takip sistemleri;&lt;/strong> Kişi ya da aracın takibi için kullanılabilir.&lt;/li>
&lt;li>&lt;strong>En yakın lokasyon;&lt;/strong> Bulunduğunuz lokasyonun 10 kilometre çevresindekileri bulmak diyebilirim. (Birazdan bu konuda örnek bir uygulama yazacağız) Aklıma ilk gelen örnekler; eczaneler, lokantalar, tanıdık kimseler, ustalar ve kiralık evler bulmak. Örnekler ve kullanım şekli hayal gücünüzle sınırlı görüldüğü üzere. Bunu bir iPhone yada Android uygulaması ile entregre edildiği düşünülürse tadından yenmez.&lt;/li>
&lt;li>&lt;strong>Lokasyona Göre Davranış;&lt;/strong> Sitenizin davranışları lokasyona göre değişiklik gösteriyor olabilir. Örneğin, bazı ürünleri sadece bazı lokasyonlar için satıyor olabilirsiniz. Koca bir listeyi müşterinizin karşısına çıkarmak pek anlamsız olabilir. Web 3.0&amp;rsquo;a hazırlandığımız şu günlerde siteler ne kadar akıllı olursa ve bizden ne kadar az içerik talep ederse o kadar iyi olacaktır.&lt;/li>
&lt;/ul>
&lt;h3 id="nasıl-yapılabilir">Nasıl Yapılabilir?&lt;/h3>
&lt;p>&lt;strong>IP&amp;rsquo;den lokasyon bulmak&lt;/strong> için, web üzerinde bu hizmeti alabileceğiniz çok fazla firma var. İlk aklıma gelenleri; &lt;a href="http://www.ip2location.com/">IP2Location&lt;/a>, &lt;a href="http://www.maxmind.com/">MaxMind&lt;/a>, &lt;a href="http://www.geopostcodes.com/">GeoPostcodes&lt;/a>. Bunların içinden ücretsiz bir sürümü bulunan MaxMind firmasının &lt;a href="http://geolite.maxmind.com/">GeoLite&lt;/a> isimli ürünü ile ilk demomuzu gerçekleştireceğiz.&lt;/p>
&lt;h3 id="gereksinimler">Gereksinimler&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://php.net">PHP 5&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">GeoLiteCity.dat&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.maxmind.com/app/php">PHP İçin GeoLocation API Modülü&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Öncelikle ücretsiz şehir verisini indirelim.&lt;/p>
&lt;pre tabindex="0">&lt;code># Ornekte kullanilan GeoLiteCity.dat dosyasının kurulumu
su -
mkdir -p /opt/maxmind
cd /opt/maxmind
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
chmod a+r -R /opt/maxmind
# PHP Modülünün kurulumu.
wget http://geolite.maxmind.com/download/geoip/api/php/geoipregionvars.php
wget http://geolite.maxmind.com/download/geoip/api/php/geoipcity.inc
# Eger Apache ayarlarınızda open_base_dir ayari aktif ise
# PHP kodunuzun bulundugu dizine koyun ve örnekteki yolu degistirin.
&lt;/code>&lt;/pre>&lt;p>Şimdi IP&amp;rsquo;den latitude ve longitude degerlerini bulan kodun demosunu yazalım.&lt;/p>
&lt;pre tabindex="0">&lt;code>include(&amp;#34;geoipcity.inc&amp;#34;);
include(&amp;#34;geoipregionvars.php&amp;#34;);
$gi = geoip_open(&amp;#34;/opt/maxmind/GeoLiteCity.dat&amp;#34;, GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, $_SERVER[&amp;#34;REMOTE_ADDR&amp;#34;]);
geoip_close($gi);
echo &amp;#34;bulundugunuz sehir&amp;#34;;
echo &amp;#34;&amp;#34;.print_r($record, true).&amp;#34;&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>Bu demonun çalışan haline &lt;a href="http://phparchitect.org/tr/demos/lokasyon-bazli-servisler-yaratmak/geolocation.php">şuradan&lt;/a> erişebilirsiniz.&lt;br>
&lt;strong>En yakın şeyi bulmak&lt;/strong> ile anlatılmak istenen bilinen bir lokasyonun etrafında bulunan (diyelim ki 1 kmlik) bir alan içerisindeki nesneleri bulmaktan söz edilmektedir. Örneğin bir ilan sitesi için bu kiralık veya satılık evler, araçlar ve çeşitli taşınır ve taşınmazlar olabilir. Ya da, &amp;ldquo;Ne/Nerede&amp;rdquo; servisi için, çilingir, taksi durağı ve eczanenin bulunduğu yerler de bulunabilir. Bu konuda eğer web üzerinde araştırma yapmayı düşünüyorsanız, arama motorlarına &amp;ldquo;radius search&amp;rdquo; yazmanız yeterli olacaktır. Karşınızda, lokasyon üzerine, özellikle posta kodu (zipcode) hizmeti sunan siteler çıkacaktır. Tahmin ettiğiniz üzere anahtar kelime, &lt;strong>posta kodu&lt;/strong> bilgisi. Daha doğrusu mahalle seviyesine indirgenmiş longitude ve latitude değerlerine sahip olmak. Bu sayede, yarıçap hesabı &lt;strong>(radius)&lt;/strong> yaparak, örneğin 1km&amp;rsquo;lik bir alana ait mahallelere erişemek mümkün. İşte işin büyüsü burada. &lt;a href="http://yelp.com">Yelp&lt;/a> ve &lt;a href="http://foursquare.com">FourSquare&lt;/a> bu şekilde size mekan bilgilerini verir.&lt;/p>
&lt;p>Bu hesaplamanın nasıl yapıldığını araştırırken, &lt;a href="http://codeguru.com">CodeGuru&lt;/a> sitesinde &lt;a href="http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115/">Coğrafik Bölge Hesaplamaları&lt;/a> başlıklı bir makaleye rastladım. Kodlar C++ diliyle yazılmıştı. Bu işin mantığıyla ilgilenen &lt;a href="http://www.fazlamesai.net/index.php?a=article&amp;amp;sid=3102">olay odaklı programcılar&lt;/a> için güzel bir makale. Ama yok hani PHP ile yazılmış kodları merak eden &lt;a href="http://www.fazlamesai.net/index.php?a=article&amp;amp;sid=3102">ürün odaklı&lt;/a> programcı kardeşlerim için ise, Steven Brendtro tarafından PHP diline port edilen GeoCalc sınıfını ve &lt;a href="http://imaginerc.com/software/GeoCalc/">şuradaki&lt;/a> makalesini tavsiye ederim.&lt;/p>
&lt;p>Peki yarıçap hesabı yapmak için gerekli PHP kütüphanemizde var artık. Aşağıda anlatacağım örnek için, posta kodu veritabanı tablonuz olduğu varsayılmıştır. Yani şimdi bulmamız gereken, posta kodları seviyesinde latitude ve longitude değerleri. Bu konuda ücretli olmasına rağmen şiddetle tavsiye edebileceğim site &lt;a href="http://www.geopostcodes.com/index.php?pg=browse&amp;amp;grp=1&amp;amp;sort=1&amp;amp;niv=3&amp;amp;id=489&amp;amp;l=0">GeoPostcodes&lt;/a>. Gerçekten çok iyi bir içeriğe sahip. Diğer bir alternatif için ise, arama motorundan bulduğum ve hiç deneme fırsatı bulamadığım &lt;a href="http://www.zip-codes.com/">ZipCodes&lt;/a> isimli site. Son olarak posta kodları ile ilgili ücretsiz siteler bulmanız mümkün ama bunların çoğu Amerika için geçerli :(
Peki şimdi gelin GeoCalc ile 1 km&amp;rsquo;lik bir alan nasıl bulduğumuzu inceleyelim.&lt;/p>
&lt;pre tabindex="0">&lt;code>include_once(&amp;#34;GeoCalc.class.php&amp;#34;);
$oGC = new GeoCalc();
// IP&amp;#39;den lokasyon bulma yoluyla bulduğumuz değerler.
$dLongitude = -94.44590241;
$dLatitude = 38.7996;
// Ne kadarlık bir alanda sorgulama yapılacak?!
$dRadius = 1.00; // in kilometers
// Yarıçap Hesabı.
$dAddLat = $oGC-&amp;gt;getLatPerKm() * $dRadius;
$dAddLon = $oGC-&amp;gt;getLonPerKmAtLat($dLatitude) * $dRadius;
// Sınırların belirlenmesi.
$dNorthBounds = $dLatitude + $dAddLat;
$dSouthBounds = $dLatitude - $dAddLat;
$dWestBounds = $dLongitude - $dAddLon;
$dEastBounds = $dLongitude + $dAddLon;
print &amp;#34;Merkezi Longitude: $dLongitude\n&amp;#34;;
print &amp;#34;Merkezi Latitude: $dLatitude\n&amp;#34;;
print &amp;#34;Yarıçap: $dRadius kilometre\n&amp;#34;;
print &amp;#34;Kuzey Sınırı: $dNorthBounds\n&amp;#34;;
print &amp;#34;Güney Sınırı: $dSouthBounds\n&amp;#34;;
print &amp;#34;Doğu Sınırı: $dEastBounds\n&amp;#34;;
print &amp;#34;Batı Sınırı: $dWestBounds\n&amp;#34;;
// Örnek sql sorgusu ile hangi bölgeleri kapsadığı bulunur.
$strQuery = &amp;#34;SELECT * FROM PostalCodes &amp;#34; .
&amp;#34;WHERE Latitude &amp;gt; $dSouthBounds &amp;#34; .
&amp;#34;AND Latitude &amp;lt; $dNorthBounds &amp;#34; .
&amp;#34;AND Longitude &amp;gt; $dWestBounds &amp;#34; .
&amp;#34;AND Longitude &amp;lt; $dEastBounds&amp;#34;;
&lt;/code>&lt;/pre>&lt;p>Bulunan bu bölge kodlarına bağlı kayıtların çekilmesi ve sayfada listelenmesiyle işlem tamamlanmış olur.&lt;br>
Son olarak, &lt;strong>HTML5&lt;/strong> ile birlikte gelen lokasyon öğrenme yönteminden söz ederek yazımı sonlandırmak istiyorum. Bu yöntemin, IP&amp;rsquo;den lokasyon bulmaktan farkı web tarayıcınızdan izin ister ama bunun karşılığında tarayıcının makinede varsa GPS&amp;rsquo;ten ya da çeşitli servislerden öğreneceği kaliteli bir latitude ve longitude değeri sunar.&lt;/p>
&lt;pre tabindex="0">&lt;code>if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
result = &amp;#34;latitude:&amp;#34;+position.coords.latitude+&amp;#34;-&amp;#34;;
result += &amp;#34;longitude:&amp;#34;+position.coords.longitude;
alert(result);
});
} else {
alert(&amp;#34;Uzgunum, tarayicinizin cografik konum destegi henuz yok! HTML5 destegi olan bir tarayici kullanin.&amp;#34;);
}
&lt;/code>&lt;/pre></content></entry><entry><title>PHP ve NoSQL (MongoDB)</title><author><name/><uri/></author><id>https://hozgan.com/php-ve-nosql-mongodb/</id><updated>2010-04-06T00:00:00Z</updated><published>2010-04-06T00:00:00Z</published><content type="html">&lt;h3 id="nosql-nedir">NoSQL Nedir?&lt;/h3>
&lt;p>NoSQL, ilişkisel olmayan bir veritabanıdır. SQL dili kullanmadan Map-Reduce kavramı ile sorgulama yapılır. Map ve Reduce, aslında fonksiyonel programlamada sıkça kullanılan iki fonksiyondur. Excel buna güzel bir örnektir. Gün geçmiyorki tarih tekerrür etmesin. NoSQL kelimesini birkaç blogta okuduğum vakit Yazılım Mimarı olan 40-45 yaşlarında bir büyüğüme bundan söz ettim. O da, aslında bunun yıllar önce kullanılan Berkley_DB&amp;rsquo;den başka birşey olmadığını söyledi. Berkley_DB aynı anda çalışan binlerce iş parçacığının(thread) 256 terabyte büyüklüğüde bir veritabanına erişebilmesini mümkün kılar. SQLite&amp;rsquo;ta BerkleyDB&amp;rsquo;ye benzer bir yapıya sahiptir. Ama biz SQLite&amp;rsquo;ı küçük işlerde kullanırız!. Biraz kafa karıştırıcı olduğunu biliyorum. Burada ilginç bir döngü var? Internet mozaik bir yapıdadır. Ve dağınıktır. Bu dağınık yapıyı Google&amp;rsquo;ın yaptığı gibi indekslemek (tabiri caizse tüm interneti indirmek isterseniz), dünyanın en büyük ve en iyi ilişkilsel veritabanını kanalize olmuş Oracle bile yetersiz kalacaktır.&lt;/p>
&lt;h3 id="peki-neden">Peki neden?&lt;/h3>
&lt;ol>
&lt;li>İlişkisel veritabanları, yazma hakkı olan bir sunucu üzerinde koşar. Ana sunucuya birşey olması durumunda slave makinelerden biri master&amp;rsquo;a çevirilir ve yola devam edilir. Burada ki veritabanına gelen yazma isteklerini düşünebiliyor musunuz?&lt;/li>
&lt;li>Veritabanı büyüdüğünde yedekleme gibi işlemler (bakım) sorun olmaya başlar.&lt;/li>
&lt;li>Replikasyona dair sorunlar yaşayabilirsiniz.&lt;/li>
&lt;li>Google&amp;rsquo;ın 1 milyon makinesi olduğu varsayılıyor! Bu kadar makinelerin yarısının aynı anda tek bir makineye yazma isteği bulunduğunu düşünürsek durum daha net anlaşılabilir.&lt;/li>
&lt;/ol>
&lt;p>Google, startup döneminde, bir mühendislik şirketi gibi davrandı ve ihtiyaçlarını iyi analiz etti. 10.000$&amp;lsquo;lık sunucular almak yerine 500$&amp;lsquo;lık ucuz makineler satın aldı. Ve bu makinelerin kısa ömürlü ve her an patlayacağını bilerek kodlarını yazdı. Ve BigTable denilen (Hadoop bunun açık kaynak halidir) Map ve Reduce fonksiyonları ile sorgulamayı sağlayan bir mimari kurdu. Bu mimarinin en önemli özelliği; makinelerden biri göçse bile, sistemin çalışmaya devam etmesidir. Her kaydın 3-5 ayrı sunucuda kopyası bulunmaktadır. Bu şekilde web için en uygun devasa bir Mosaic oluşturdular. Peki NoSQL konusuna giriş yaptık. Fakat bu seferde karşımıza birden fazla NoSQL türü çıkacak;&lt;/p>
&lt;ol>
&lt;li>Key/Value database (Redis, MemcachedDB vb..)&lt;/li>
&lt;li>Document Oriented database. (MongoDB, CouchDB)&lt;/li>
&lt;li>Object database (db4o)&lt;/li>
&lt;li>Graph databse (neo4j)&lt;/li>
&lt;li>Tabular (bigtable, hadoop)&lt;/li>
&lt;/ol>
&lt;p>Biz bu türlerden, belge yönelimli veritabanları konusu üzerinede duracağız. Belge yönelimli veritabanları, nesne yönelimli ve ilişkisel veritabanlarının alt katmanıdır. Yukarıda saydığım veritabanlarının birbirinden farkını ve merak ettiğiniz diğer konuları &lt;a href="http://en.wikipedia.org/wiki/NoSQL">Vikipedi&lt;/a>&amp;lsquo;den okuyabilirsiniz. MongoDB&amp;rsquo;yi neden tercih ettiğime dair bilgilerine ise; &lt;a href="http://www.mongodb.org/display/DOCS/Benchmarks">benchmark&lt;/a> testlerinden ve &lt;a href="http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB">kıyaslama tablosundan&lt;/a> edinebilirsiniz.&lt;/p>
&lt;h3 id="mongodbyi-denemek-için">MongoDB&amp;rsquo;yi Denemek İçin;&lt;/h3>
&lt;p>Eğer yukarıdaki bilgiler sizi tatmin etmedi ve MongoDB&amp;rsquo;yi biraz kurcalamak istiyorsanız ve zamanım yok makineye kurmadan denemek istiyorum diyorsanız; online olarak &lt;a href="http://try.mongodb.org">şuradan&lt;/a> deneyebilmeniz mümkün.&lt;/p>
&lt;h3 id="mongodb-sunucusunun-çalıştırmak-için">MongoDB sunucusunun çalıştırmak için;&lt;/h3>
&lt;pre tabindex="0">&lt;code>mongod --dbpath=/data/mongo
&lt;/code>&lt;/pre>&lt;h3 id="mongodbnin-ubuntuya-kurulumu">MongoDB&amp;rsquo;nin Ubuntu&amp;rsquo;ya Kurulumu&lt;/h3>
&lt;p>MongoDB&amp;rsquo;nin Ubuntuya nasıl kurulduğunu anlatacak olsamda diğer işletim sistemleri ve linux dağıtımlarına nasıl kurulacağını &lt;a href="http://www.mongodb.org/display/DOCS/Quickstart">şuradan&lt;/a> öğrenebilirsiniz. APTITUDE ile kurmak için; aşağıdaki dağıtımınız için uygun olan paket kaynak adresini seçerek &lt;strong>/etc/apt/sources.list&lt;/strong> dosyasına kopyalamanız yeterlidir.&lt;/p>
&lt;pre tabindex="0">&lt;code># for Ubuntu Lucid (10.4) (built using a prerelease installation)
deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen
# for Ubuntu Karmic (9.10)
deb http://downloads.mongodb.org/distros/ubuntu 9.10 10gen
# for Ubuntu Jaunty (9.4)
deb http://downloads.mongodb.org/distros/ubuntu 9.4 10gen
&lt;/code>&lt;/pre>&lt;p>ve sonrasında da aşağıdaki komutları çalıştırmanız yeterlidir.&lt;/p>
&lt;pre tabindex="0">&lt;code>sudo aptitude update
sudo aptitude install mongodb-stable
# ya da
sudo aptitude install mongodb-unstable
# ya da
sudo aptitude install mongodb-snapshot
&lt;/code>&lt;/pre>&lt;pre tabindex="0">&lt;code># install dependicies for Ubuntu 9.04 ve 9.10
sudo apt-get -y install tcsh git-core scons g++
sudo apt-get -y install libpcre++-dev
libboost-dev libreadline-dev
xulrunner-1.9.1-dev
# get source
git clone git://github.com/mongodb/mongo.git
# build
scons
# install
sudo scons --prefix=/opt/mongo install
&lt;/code>&lt;/pre>&lt;p>Görüldüğü üzere kurulum son derece basit. Derlenerek kurulum işleminde yapılması gereken başlangıç betiği hazırlamak.&lt;/p>
&lt;pre tabindex="0">&lt;code>#!/usr/bin/env ruby -w
# mongo ;; 2010 (cc) Jan Riethmayer
# This work is licensend under a Creative Commons Attribution 3.0 license.
require &amp;#39;optparse&amp;#39;
options = {}
optparse = OptionParser.new do|opts|
opts.banner = &amp;lt;&amp;lt;-BANNER
Usage: sudo ./mongo [options]
BANNER
options[:dbpath] = &amp;#34;/data/mongodb/&amp;#34;
opts.on( &amp;#39;-d&amp;#39;, &amp;#39;--dbpath&amp;#39;, &amp;#39;Select DB path. Defaults to /data/mongodb/&amp;#39; ) do |path|
options[:dbpath] = path
end
options[:port] = &amp;#34;27017&amp;#34;
opts.on( &amp;#39;-p&amp;#39;, &amp;#39;--port PORT&amp;#39;, &amp;#39;Listening to port 27017 by default&amp;#39; ) do |port|
options[:port] = port
end
options[:fork] = false
opts.on( &amp;#39;-f&amp;#39;, &amp;#39;--fork&amp;#39;, &amp;#39;Run as daemon&amp;#39; ) do
options[:fork] = true
end
options[:logpath] = &amp;#34;/var/log/mongodb.log&amp;#34;
opts.on( &amp;#39;-l&amp;#39;, &amp;#39;--logfile FILE&amp;#39;, &amp;#39;Defaults to /var/log/mongodb.log&amp;#39; ) do |file|
options[:logpath] = file
end
opts.on( &amp;#39;-h&amp;#39;, &amp;#39;--help&amp;#39;, &amp;#39;Display this screen&amp;#39; ) do
puts opts
exit
end
end
# Parse the command-line. Remember there are two forms
# of the parse method. The &amp;#39;parse&amp;#39; method simply parses
# ARGV, while the &amp;#39;parse!&amp;#39; method parses ARGV and removes
# any options found there, as well as any parameters for
# the options.
optparse.parse!
class Go
attr_accessor :opts
def initialize(opts)
@opts = opts
end
def start
puts &amp;#34;Starting on port #{@opts[:port]} with dbpath #{@opts[:dbpath]}&amp;#34;
puts &amp;#34;Running as Daemon&amp;#34; if @opts[:fork]
puts &amp;#34;Writing to logpath /var/log/mongodb.log&amp;#34;
path = &amp;#34;--dbpath #{@opts[:dbpath]}&amp;#34;
port = &amp;#34;--port #{@opts[:port]}&amp;#34;
log = &amp;#34;--logpath #{@opts[:logpath]} --logappend&amp;#34;
fork = &amp;#34;#{@opts[:fork] ? &amp;#39;--fork&amp;#39; : &amp;#39;&amp;#39;}&amp;#34;
params = [path, port, log, fork].join(&amp;#34; &amp;#34;)
result = %x{ ./mongodb/bin/mongod #{ params } }
puts result
end
def stop
process = %x{ ps -o pid,command ax | grep mongod }
found = false
matcher = process.scan(/(\d+).+?bin.+?mongod.+?--fork/) do |pid|
found = true
puts &amp;#34;Killing process #{pid}&amp;#34;
%x{ kill -2 #{pid} }
end
puts &amp;#34;No mongod process found&amp;#34; unless found
end
end
go = Go.new(options)
case ARGV[0]
when /start/ : go.start
when /stop/ : go.stop
else
raise ArgumentError.new(&amp;#34;mongo (start|stop) or mongo -h for help.&amp;#34;)
end
&lt;/code>&lt;/pre>&lt;p>Yukarıdaki dosyayı &lt;strong>/etc/init.d/mongo&lt;/strong> şeklinde kaydetmek gerekiyor.&lt;/p>
&lt;h3 id="php-kurulumu">PHP Kurulumu&lt;/h3>
&lt;pre tabindex="0">&lt;code>sudo pecl install mongo
&lt;/code>&lt;/pre>&lt;p>PHP için monog eklentisinin hatasız bir şekilde derlenebilmesi için bilgisayarınızda &lt;strong>phpize&lt;/strong> yüklü olmalıdır. Derleme işleminden sonra, php.ini dosyanıza;&lt;/p>
&lt;pre tabindex="0">&lt;code>extension=mongo.so
&lt;/code>&lt;/pre>&lt;p>ekledikten sonra kurulum işlemi tamamlanmış olur. Artık PHP mongo ile konuşabilecek durumda. PHP&amp;rsquo;nin sınıfları ile ilgi detaylı bilgiye &lt;a href="http://tr.php.net/mongo">php.net/mongo&lt;/a> adresinden ulaşabilirsiniz. PHPMyAdmin gibi bir yönetim arabirimi arıyorsanız, &lt;a href="http://www.phpmoadmin.com/">PHPMoAdmin&lt;/a> tam size göre.&lt;/p>
&lt;h3 id="php-frameworkleri">PHP Frameworkleri&lt;/h3>
&lt;p>Birçok popüler PHP framework&amp;rsquo;ünün MongoDB için ActiveRecord patternine uygun yazılmış eklentisi mevcut. Gelin bunlara bir göz atalım;&lt;/p>
&lt;h3 id="zend-framework">Zend Framework&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Nosql_Mongo+-+Valentin+Golev">Zend_Nosql_Mongo&lt;/a> Zend firması tarafından geliştirilen sınıf.&lt;/li>
&lt;li>&lt;a href="http://github.com/coen-hyde/Shanty-Mongo">Shanty Mongo&lt;/a> ise diğer bir sınıf.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>CakePHP&lt;/strong>&lt;a href="http://github.com/ichikaway/mongoDB-Datasource/downloads">MongoDB Datasource&lt;/a> sınıfı.&lt;br>
&lt;strong>Kohana&lt;/strong>&lt;a href="http://github.com/Wouterrr/mangodb">Mango&lt;/a> ise Kohana için ActiveRecord paternini kullanan bir sınıf.&lt;br>
&lt;strong>Symfony&lt;/strong> Symfony için Jason Mooberry tarafından yazılan makalenin, &lt;a href="http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-1-inserts/">1. bölümü&lt;/a> ve &lt;a href="http://blog.jasonmooberry.com/2009/08/mongodb-and-symfony-yes-part-2-simple-queries/">2. bölümünden&lt;/a> bilgi edinebilirsiniz.&lt;/p>
&lt;h3 id="kütüphaneler">Kütüphaneler&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://github.com/crodas/ActiveMongo">ActiveMongo&lt;/a> güzel bir kütüphane. Bu kütüphaneye başlangıç yapmak için ise &lt;a href="http://crodas.org/activemongo.php">şu makaleye&lt;/a> bakabilirsiniz.&lt;/li>
&lt;li>&lt;a href="http://code.google.com/p/mongodb-morph/">Morph Kütüphanesi&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="php-ile-ilgili-diğer-makaleler">PHP ile İlgili Diğer Makaleler&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://technosophos.com/content/mongodb-5-things-every-php-developer-should-know-about-mongodb">http://technosophos.com/content/mongodb-5-things-every-php-developer-should-know-about-mongodb&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.businessinsider.com/how-we-use-mongodb-2009-11">http://www.businessinsider.com/how-we-use-mongodb-2009-11&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.lafermeduweb.net/billet/nosql-mongodb-et-php-premiere-approche-781.html">http://www.lafermeduweb.net/billet/nosql-mongodb-et-php-premiere-approche-781.html&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb">http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.phpclasses.org/blog/post/118-Developing-scalable-PHP-applications-using-MongoDB.html">http://www.phpclasses.org/blog/post/118-Developing-scalable-PHP-applications-using-MongoDB.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>MongoDB gerçekten çok iyi belgelenmiş ve birçok web çatısı tarafından desteklenen harika bir araç. Bu konuda ki paylaşımlarınızı bekliyorum. :)&lt;/p></content></entry><entry><title>Şeytan, Pengueni Dürterse</title><author><name/><uri/></author><id>https://hozgan.com/seytan-pengueni-durterse/</id><updated>2010-03-28T00:00:00Z</updated><published>2010-03-28T00:00:00Z</published><content type="html">&lt;p>Günümüzde birçok site arkada yapılacak görevleri çalıştırmak için görev yöneticileri kullanılır. Crontab (Zaman ayarlı) ve Daemon (kendi halinde çalışan) iki görev yöneticinin arasındaki bence tek fark (durum bu kadar basit olmasada) Crontab&amp;rsquo;ın 1 dakikanın altındaki süreçlere göre çalışmamasıdır. Bu görevler için Daemon denilen ve &lt;strong>/etc/init.d&lt;/strong> altında tetiklenen ve sinyallerle çalıştırılıp durdurulabilen ve process id değeri üreten bir teknolojiye ihtiyaç duymasıdır. Daemon&amp;rsquo;lar init.d altında bir çalıştırıcı scripte sahip olmaya bilir ama durdumak istendiğinde güç kullanılarak öldürülmesi (kill) gerekir ki, kritik işlerde bu pek tehlikeli bir yöntemdir. Init.d altındaki başlatma scripti bir proses(PID) dosya yaratır ve daemon&amp;rsquo;u çalıştırır. Sonrasında durdumak isterse daemon&amp;rsquo;a sinyal gönderir. Böylece uygulama durma sinyalini görünce düzgün bir şekilde sonlanır. Crontab ise belli bir işin bellir bir saatte yapılmasını sağlar. Saatte bir, her 15 dk.&amp;lsquo;da bir ayın 5. günü, her çarşamba saat 15&amp;rsquo;te gibi&amp;hellip;&lt;/p>
&lt;p>Periodic ile ilgili daha detaylı bilgiyi &lt;a href="http://arbitracker.org/periodic/design.html">şuradan&lt;/a> alabilirsiniz.&lt;/p>
&lt;h2 id="chronical-job-management-projesi">Chronical Job Management Projesi&lt;/h2>
&lt;p>Bu proje benim yapacağım hem cron hem de daemon desteği ile melez çalışacak bir projedir. Henüz fikir halindedir. Projene adresine &lt;a href="http://chronical.googlecode.com">şuradan&lt;/a> ulaşılabilir.&lt;/p>
&lt;p>Bu proje servis işlerinizi hızlı ve kolay bir şekilde merkezi bir yerden yönetmeniz, durumunu kontrol etmenizi amaçlar.&lt;/p>
&lt;h3 id="özellikleri">Özellikleri&lt;/h3>
&lt;ul>
&lt;li>Yaml ile kolayca güncellenebilen ayar dosyası&lt;/li>
&lt;li>Daemon kaydetme, kaldırmak ve durum bilgisi almak için kullanılacak çalıştırılabilir betik&lt;/li>
&lt;li>İş mantığınızı barındıran kodları çalıştıracak Abstract sınıf.&lt;/li>
&lt;/ul>
&lt;h3 id="örnek-proje-ayar-dosyası-taskconfig">Örnek proje ayar dosyası (task.config);&lt;/h3>
&lt;pre tabindex="0">&lt;code># Period Format
# second minute hour day month dayOfWeek weekOfMonth
# second: 0-59
# minute: 0-59
# hour: 0-23
# day: 1-31
# month: 1-12
# dayOfWeek: 1-7
# weekOfMonth: 1-5
# proje adina göre tek bir daemon oluşur.
# Bu daemon işlerin tamamını alt prosesler yaratarak yönetir.
proje_adi:
gorev_adi:
class: Application_Jobs_SmsSender
# her 30 saniyede bir çalış anlamında.
period: */30 * * * * *
change_theme:
class: Application_Jobs_ChangeTheme
# Mayıs ayının ikinci pazar günü saat gece 2&amp;#39;de
# Anneler gününde çalış.
period: * 2 * 5 7 2
&lt;/code>&lt;/pre>&lt;h3 id="arayüz-sınıfı">Arayüz Sınıfı&lt;/h3>
&lt;pre tabindex="0">&lt;code>interface Chronical_Job_Interface
{
// Ayar dosyasına verilen sınıfların bu
// arayüzden gerçekleştirilmesi gerekir.
public function run();
}
&lt;/code>&lt;/pre>&lt;h3 id="örnek-sınıfı">Örnek Sınıfı&lt;/h3>
&lt;pre tabindex="0">&lt;code>class Application_Jobs_SendSms
extends Joy_Application
implements Chronical_Job_Interface
{
public function run()
{
// TODO: Yapılacak işler....
}
}
&lt;/code>&lt;/pre>&lt;h3 id="örnek-log-ayar-dosyası">Örnek log ayar dosyası;&lt;/h3>
&lt;p>Bu dosya chronical uygulamasının log ve pid ayarları ile ilgili bir dosyadır. Ubuntu ve debian temelli dağıtımlar için &lt;strong>/etc/chronical.ini&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>[folders]
folder.log = /var/log/
fodler.pid = /var/run/
folder.init.d = /etc/init.d
[defaults]
; seconds
default.sleep_time = 5
&lt;/code>&lt;/pre>&lt;h3 id="düşünülen-betik-dosyası-örnek-işler">Düşünülen betik dosyası örnek işler&lt;/h3>
&lt;pre tabindex="0">&lt;code># OS startup install for init.d
$ chronical install task.config
# OS startup uninstall for init.d
$ chronical uninstall task.config
# Görev çalıştırma
$ chronical start proje_adi:gorev_adi
# Görev durdurma
$ chronical start proje_adi:gorev_adi
# Görev durumunu görme
$ chronical status proje_adi:gorev_adi
&lt;/code>&lt;/pre>&lt;p>Kısaca Unix sistemleri üzerinde daemon ve crontab işleri bu şekilde. (:&lt;/p></content></entry><entry><title>Zamanı Sahiplenmek</title><author><name/><uri/></author><id>https://hozgan.com/zamani-sahiplenmek/</id><updated>2010-03-22T00:00:00Z</updated><published>2010-03-22T00:00:00Z</published><content type="html">&lt;p>Yaklaşık 10 yılı aşkın bir süredir, yazılım sektörünün içindeyim. Hani derler ya! neler geldi neler geçti gözümün önünden. Netscape&amp;rsquo;in kaynak kodlarını açmasıyla başladı benim için serüven. &lt;a href="http://en.wikipedia.org/wiki/Mirc">mIRC&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/Hotmail">Hotmail&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/ICQ">ICQ&lt;/a> ve &lt;a href="http://en.wikipedia.org/wiki/Altavista">Altavista&lt;/a> arasında gidip gelirken bugüne gelmişiz aniden.&lt;/p>
&lt;p>10 yılın muhasebesini yaparken düşündüklerimin ne kadarını yaptığımı ve yanlış yaptığım gibi karmaşık bir denklemi çözmekle uğraşırken, düşüncemi paylaşmak ve faydalanmak istedim kitlelerin bilgeliğinden.&lt;/p>
&lt;h3 id="internet-ve-açık-kaynak-projeler-kimler-için-bir-fırsata-dönüştü-nasıl-ve-neden">İnternet ve açık kaynak projeler, kimler için bir fırsata dönüştü? Nasıl ve Neden?&lt;/h3>
&lt;p>Aklıma ilk gelen örnekler; &lt;a href="http://en.wikipedia.org/wiki/Linux">Linux&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/Apache">Apache&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/PHP">PHP&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/Gnome">Gnome&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/KDE">KDE&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/Mozilla">Mozilla&lt;/a>, &lt;a href="http://en.wikipedia.org/wiki/Wordpress">Wordpress&lt;/a> vb.. O gün bu projelere destek olanlar kendi iş modellerini bu projelerin üzerine kurarak gönüllü faaliyetlerinden para kazanmalarını sağlayacakalrı bir gelir modeli oluşturmaları bir yana saygınlıkta kazandılar. Çok büyük firmalara girdiler, Yahoo ve Google gibi.&lt;/p>
&lt;p>Bu insanlar üniversite yıllarında hobi olarak başladıkları açık kaynak projeler, uzmanlaştıkları alan oluverdi ve proje popülerleştikçede aranmaya başladı bu insanlar. Birkaç isim vermek gerekirse, XDebug ve eZ Publish (&lt;a href="http://ez.no">http://ez.no&lt;/a>) sahibi, Derick Rethans ve şuan Novel&amp;rsquo;in Mono takımında geliştirici takımında olan Michael Hutchinson aklıma gelen ilk örnekler. Michael üniversite yıllarında MonoDevelop ASP.NET eklentisi geliştirmekle uğraşması, bugün O&amp;rsquo;na çok büyük bir şirketin kapılarını açtı. Örnekler çok fazla bu satırları yazarken aklıma ilk gelenleri paylaştım. Eminim sizinde bu yazdıklarımı okurken bir sürü örnek geliyordur.&lt;/p>
&lt;p>Peki Türkiye&amp;rsquo;de durum nasıl; ilk aklıma gelen örnekleri &lt;a href="http://linux.org.tr">LKD&lt;/a>, &lt;a href="http://csystem.org">CSD&lt;/a>, &lt;a href="http://pardus.org.tr">Pardus&lt;/a>, &lt;a href="http://webrazzi.com">Webrazzi&lt;/a>, ve &lt;a href="http://enderuniz.org">EnderUnix&lt;/a>. Bu gruplarda kendi içlerinde de başarılı kişiler çıkardılar. Örnek vermek gerekirse PostgreSQL maintainerlarından &lt;a href="http://gunduz.org">Devrim Gündüz&lt;/a> ve bir blogtan kendi işini kuran Arda Kutsal.&lt;/p>
&lt;p>Tekrar soruma geri döneyim, devleri dize getiren kitleleri peşinden sürükleyen projelere imza atan bu insanlar, nasıl oldu da bunu başardılar.&lt;/p>
&lt;p>Buna katılırsınız ya da katılmazsınız bilmiyorum ama bence bunun sebebi, &lt;strong>tüm enerjilerine inandıkları bir alana aktarmak&lt;!-- raw HTML omitted -->yani uzmanlaşmak&lt;/strong>! Sabırla bu alanda çalışmalar yapmak ve bir meritokrasi içerisinde yer edinmek. Outliers kitabında Malcolm Gladwell&amp;rsquo;in kitabında bahsettiği 10.000 saat çalışmamızı önermesinin sebebi işte bu.&lt;/p>
&lt;p>Her yıl internet sektöründe (memcached, redis, casandra, ruby on rails, blog, micro blog, social network vb) popülerleşen proje, teknoloji ve iş modelleri duyarız. Heyecan uyandıran bu kelimelerden en çok sevdiğiniz ve 10.000 saatinizi adayacağınız muhakkak vardır. Blog konusunda; &lt;a href="http://wordpress.com">Wordpress&lt;/a>, &lt;a href="http://digg.com">Digg&lt;/a>, &lt;a href="http://technoratti.com">Technoratti&lt;/a>, &lt;a href="http://blogger.com">Blogger&lt;/a> ve &lt;a href="http://reader.google.com">Google Reader&lt;/a> gibi projeler bu alanı kapatmış görünüyor. 10.000 saatinizi bu alana adamak şu an için zahmetli ve yersiz görünüyor, eğer radikal bir fikriniz yoksa. Google arama motorlarını yerle bir eden fikirleri ile bunu başardı. Sizde başarabilirsiniz ama işinizin zor olduğunu hatırlatmak isterim. Unutulmaması gereken şey ise hergün yeni fırsatların doğduğu. Sadece bulunduğunuz zamanı anlamak ve gereksinim gördüğünüz alana kendinizi adamanız yani zamanı sahiplenmeniz gerekiyor.&lt;/p>
&lt;p>Benim önerim zamanın size sunduğu ve açık olan ihtiyacı bulmak için çalışmanız buna yaşamınızı adamanız. Devrim Gündüz, Arda Kutsal, C Derneğinin kurucusu Kaan Aslan bunu yaptı ve meyvelerini yiyorlar.&lt;/p>
&lt;p>10 yılın muhasebesini yaptığımda yaptığım en büyük hatamın, uzmanlaşmak istediğim alana geç karar vermiş olduğumu söyleyebilirim. 5 yıl masaüstü sistem programlama ve 5 yılda web ve mobil programlama. Faydası olmadı demiyorum çok fazla paradigmaya hakim olmak güzel birşey ama halen uzmanlaşmak istediğim alanda çalışmadığım için ekstra efor serfetmem gerekiyor ve her geçen gün bu daha da zor oluyor. Google arama konusunda uzman ve bu konuya yardımı dokunacak en uç noktalarlada ilgileniyor işlere bu açıdan bakıyor ve bu onun vizyonunun çerçevelerini çiziyor.&lt;/p>
&lt;p>İnanacağınız ve seveceğiniz alanı seçmek önemli çünkü çalışmalarınızın temelini oluşturuyor. Ve anlık gazlarla çıkan içinizdeki merak kıvılcımını alevlenmeden durduruyor. Eğer ilgi alanınız ile ilgili ise zaten zaman içinde bulaşmak zorunda kalıyorsunuz. Günümüzün popüler konularını (agile programming, realtime internet, semantic web, cloud computing, collective intelligence, scalability vb) ve projeleri hergün twitter ve çeşitli bloglarda bulabilirsiniz. Casandra, CouchDB, Doctrine, Redis, RubyOnRails, Symfony, Mozilla, Eclipse, Hibernate vb gibi geleceği olan projelere destek verebilirsiniz.&lt;/p>
&lt;p>Teomanın bir şarkısında dediği gibi;&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Çok kadın hiç kadındır oğlum, yalnızlıktır sonu!&lt;/p>&lt;/blockquote></content></entry><entry><title>Ninja ve Samuray</title><author><name/><uri/></author><id>https://hozgan.com/ninja-ve-samuray/</id><updated>2010-03-12T00:00:00Z</updated><published>2010-03-12T00:00:00Z</published><content type="html">&lt;p>Bilişim dünyasında iki tür yazılımcı vardır. Ninjalar ve Samuraylar. Her ikiside işinin ehlidir. Bir oturuşta bir işletim sistemini en az hata ile yazabilir, NASA gibi çok güvenli yerleri alt-üst (hack) edebilirler. Bu iki kişi madem bu kadar iyiler peki o zaman nedir bu iki tür bilişimciyi birbirinden ayıran şey? İşte bu yazı bunun üzerinedir.&lt;/p>
&lt;p>Ninjalar, gecenin karanlığında sessiz sedasız hareket ederler. Kimse ne yaptıklarını, nereden çıka geldiklerini bilmez. Geceleri çalışmayı çok severler. Çok hızlıdırlar. Kolay kolay bildiklerini paylaşmazlar. Çünkü bildiklerini öğrenebilmek için çok acı çekmiş ve mücadele etmişlerdir. Para karşılığı yeteneklerini kiralarlar. Yalnız çalışmayı severler. Ketumlardır, tüm ahlak kurallarını yok sayabilirler; gecenin ve maskelerinin arkasına saklanarak hareket ederler.&lt;/p>
&lt;p>Samuraylar, onurları için yaşarlar. Savaş sanatını öğrenmek için en az ninjalar kadar mücadele etmişlerdir. Bir klana bağlıdırlar. Samuraylar arasında sağlam bir dayanışma vardır. Yeteneklerini inandıkları şey uğruna harcarlar. Saygınlık kazanmak için bildiklerini öğretmeyi borç bilirler. Yatay hiyerarşide olan bir usta-çırak ilişkileri vardır. Usta çıraktan, çırak ustadan birşeyler öğrenebilir. Kibirleri yoktur. Samuraylar için hayat ibretlerle dolu bir okuldur. Sanatla yakından ilgilenirler. Yardım severdirler. Genelde tanınır ve saygı duyulurlar.&lt;/p>
&lt;p>Samuraylar&amp;rsquo;ın Ninjalar&amp;rsquo;dan en büyük farkı bildiklerini saklamak yerine paylaşmalarıdır. Bu vasıfları sayesinde saygınlık kazanırlar. Ve diğer meziyetleri (yardımsıverlik vb) varsa da sevilirler.&lt;/p>
&lt;p>Aynı yaklaşımı tarih boyunca başka başka şekillerde görmemiz mümkündür. Osmanlı&amp;rsquo;da Derviş ve dergah yapılanmaları ile StarWars&amp;rsquo;ta Jedi&amp;rsquo;lar, samurayların yapılanmalarına benzer. Belki bu yüzden açık kaynak dünya &amp;ldquo;Star Wars&amp;quot;u bir başka sever.&lt;/p>
&lt;p>Sanat ve bilim dünyasına bakarsak, adı ve şanı ile günümüze gelenlerde de aynı dayanışma ve paylaşımın olduğu görülmektedir. Bu konuda aklıma gelen ilk örnek Sezen Aksu&amp;rsquo;dur. Minik Serçe&amp;rsquo;nin sanatı ile ilgili yorum yapmak haddim ve bilgimin dahili dışında elbet. Sanat dünyasına verdiği ölümsüz eserler ise herkesçe aşikar. Ama O&amp;rsquo;nu ölümsüz sanatçı yapan eserleri dışında, öğrencileri ve destek verdiği insanlardır. Birçok kişiye yardım etmiş, beste ve güftelerini vermiştir. Bu hem kendisinin saygınlığını arttırmış, hemde eserlerine yeni renkler katmıştır.&lt;/p>
&lt;p>Müzik sektöründe benzer bir yaklaşım Rapçiler arasında da mevcuttur. Birbirlerinin albümlerinde bazı şarkılarına eşlik etmeleri (Feat) bu dayanışmaya küçük bir örnektir. RAP dünyasının tanınmış ustaları, çaylak RAPçilerin albümlerine eşlik ederek onların tanınmasına yardımcı olurlar. Bu da bu sanatçıların daha da saygı görmelerini sağlar.&lt;/p>
&lt;p>Ninjalar bu dayanışmayı anlayamaz. Rakibi olabilecek kişilere böyle bir yardımda bulunmasına ise anlam dahi veremez. Birilerine yardım edip nasıl para kazanabilirler ki diye düşünürler. Ama yakın tarihteki örneklere bakıldığında elbette para kazanılır. Bunun nedeni saygınlıktır. Saygınlık beraberinde yardımda getirir. Doğal bir reklam ağı oluşur ve insanların bu davranışlar hakkında konuşmasına neden olur.&lt;/p>
&lt;p>Çevremde zaman zaman ninjalarla karşılarım. Neden açık kaynak dünyayı bu denli sevdiğimi ve destek verdiğimi sorarlar. Zamanımı boşa harcadığımı düşünürler. Öğrendiklerimin çoğunu açık kaynak camia sayesinde öğrendiğimi anlatırım ama anlamsız bulurlar. Sağdan soldan (internetten) öğrendikleri birkaç bilgiyi çok değerli görüp kimseyle paylaşmazlar. Bildiklerinin kölesi olan bu insanlara en güzel tokat, kafalarında devleştirdikleri bu bilgiyi çok kısa sürede öğrenerek, bildiklerine meydan okumak (daha iyisini yapmak) ve öğrenilenleri deneyimle harmanlayıp, tekrar ait olduğu yere topluluğa armağan etmektir…&lt;/p></content></entry><entry><title>Sanal Pos Kütüphanesi</title><author><name/><uri/></author><id>https://hozgan.com/sanal-pos-kutuphanesi/</id><updated>2010-01-13T00:00:00Z</updated><published>2010-01-13T00:00:00Z</published><content type="html">&lt;p>Tüm dünyada da aynı mıdır bilmiyorum ama Türkiye&amp;rsquo;de düşünmeyi sevmeyen ve sıcak para gelsinde nasıl olursa olsun diye düşünen bir girişimci kitlesi vardır. Bu kitlenin müdavimlerini çeşitli şekillerde gördük ve görmeye devam edeceğiz elbette. Buna birkaç örnek vermek gerekirse; Sucular, İnternet Kafeler ilk aklıma gelenlerden birkaçı.&lt;/p>
&lt;p>Birçok sektör gibi yazılım şirketlerinde de durum pek farklı değil. Türkiye&amp;rsquo;de her yazılımcı bir dönem Muhasebe yazılımları ile köşe olmayı düşünmüş ve bu alanda yazılımlar geliştirmiş ve sonunda batmıştır :) İşini hakkıyla yapan AirTies, SesTek, Sobee gibi şirketleri bunun dışında tutmak istiyorum tabii. Onlar gerçekten göğsümüzü kabartan güzel şirketler.&lt;/p>
&lt;p>Bu durum internet sektöründe de neredeyse böyle. Internet&amp;rsquo;te dönemsel olarak popüler olan konular hep olmuştur. Şirket sitesi yapanlar, e-ticaret sitesi yapanlar bunun en büyük örneği. E-ticaret belkide en zahmetli ve uçtan uca hizmet vermeyi gerektiren, güvene dayalı olduğu düşünülürse fırsatlar ve riskler kendini hemen belli eden bir konu olduğu halde, en çok uğraş verilen ve yukarıdaki saydıklarım göz önünde bulunmadan girilen bir iş modeli. E-ticaret bu yazının ana konusu değil, bu yüzden e-ticaretin sorunlarına bu yazıda değinmeyeceğim. Ama bu kadar çok üzerinde konuşulan, araştırmalar yapılan ürünler geliştirilen sektörde neden &lt;a href="http://magentocommerce.com">Magento&lt;/a>, &lt;a href="http://opencart.com">OpenCart&lt;/a> gibi açık kaynak projelerin Türkiye&amp;rsquo;den çıkmadığını merak ediyorum doğrusu!? Tamam bu çok büyük bir proje ama hazır yemeğe alışan bizler defalarca POS kütüphanesi yazdığımız halde bunu neden açık kaynak kodlarını yayınlamıyoruz?!&lt;/p>
&lt;p>Türkiye&amp;rsquo;nin önde gelen birkaç e-ticaret platformunun altyapısını geliştirenlerden biri olarak bu soruyu kendime yönelttiğim de, en azından Türk yazılım camiasına böyle bir katkıda bulunmam gerektiğine karar verdim. İyimi ettim, kötü mü ettim zaman gösterecek elbette!. &lt;a href="http://vpos4php.googlecode.com">Geliştirdiğim API&lt;/a> kütüphanesinin kullanıcı rehberi belgeyi yakında tamamlayacağım. Bu konuda ki gelişmeleri &lt;a href="http://twitter.com/hozgan">@hozgan&lt;/a>(benim) ya da &lt;a href="http://twitter.com/dahius">@dahius&lt;/a>&amp;lsquo;un twitter hesabından takip edebilirsiniz.&lt;/p>
&lt;h3 id="sanal-pos-kütüphanesi-vpos4php">Sanal Pos Kütüphanesi (&lt;a href="http://vpos4php.googlecode.com">vpos4php&lt;/a>)&lt;/h3>
&lt;p>Bu kütüphane aynı zamanda &lt;a href="http://pear.php.net">PEAR&lt;/a> kütüphanesi hazırlamaya, paketlemeye, &lt;a href="http://phing.org">Phing&lt;/a> ve &lt;a href="http://phpdoc.org">phpDocumentory&lt;/a> kullanımı için bir örnektir. &lt;a href="http://phpunit.de">PHPUnit&lt;/a>&amp;lsquo;de kullanımı ile ilgili örnekleri TestCase&amp;rsquo;lerinide ileride ekleyeceğim.&lt;/p>
&lt;p>Türkiye&amp;rsquo;de Sanal POS altyapısını sunan 2 firma bulunmaktadır. EST ve POSNET. Birçok banka bu iki firmanın altyapısını kullanır. EST altyapısını kullanan bankalara Garanti, İşbankası, Axess, HSBC, Finansbank; POSNET altyapısını kullanan bankalara ise YapıKredi örnek verilebilir. Yani bu firmaların API&amp;rsquo;lerini kullanan her bankada bu kodlar çalışacaktır. Başka bir şirketin yaptığı altyapıyıda desteklemek için dökümanı bana gönderebilirsiniz.&lt;/p>
&lt;p>Yapılan işlemler aşağı yukarı tüm POS altyapılarında aynı olunca bunları aynı veritabanları gibi tek bir arayüz üzerinden çalıştırmak gerekmektedir. İşte bunun için; projeyi geliştirilirken, tasarım kalıplarından(design patterns), fabrika (Factory Pattern) kullanılmıştır.&lt;/p>
&lt;p>Kütüphane aşağıdaki methodları desteklemektedir.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>provision&lt;/strong>($request) methodu, kredi kartından çekilen para miktarı, kart limitinden düşürülür. Ama hesabınıza geçmez. Bazı firmalar kart doğrulama gibi işlemler için bunu kullanırlar. Bankalar arasında farklılık gösterse de, eğer daha sonra &lt;strong>disposal&lt;/strong> methodu ile finanslaştırılmazsa tutarın kart üzerindeki blokesi kaldırılır.
3D secure işlemi desteklenir.&lt;/li>
&lt;li>&lt;strong>sale&lt;/strong>($request) methodu, $request nesnesi içerisinde belirtilen tutar kredi kartı limitinden düşürülür ve hesabınıza geçer.
3D secure işlemi desteklenir.&lt;/li>
&lt;li>&lt;strong>disposal&lt;/strong>($request) methodu, daha önce &lt;strong>provision&lt;/strong> methodundan geri dönen işlem numarası (transactionId) ile birlikte finanslaştırmaya yarar. Yani daha önce kart limitinizden düşürülen para hesabınıza geçer.&lt;/li>
&lt;li>&lt;strong>reversal&lt;/strong>($request) methodu, daha önce &lt;strong>disposal&lt;/strong> ya da &lt;strong>sale&lt;/strong> methoduyla finanslaştırdığınız işlemlerde kısmi iadeler yapmayı sağlar. Yani fiyatı güncelleştirebilirsiniz.&lt;/li>
&lt;li>&lt;strong>refusal&lt;/strong>($request) methodu, daha önce yaptığınız bir işlemi iptal etmeyi sağlar.&lt;/li>
&lt;li>&lt;strong>complete&lt;/strong>($request) methodu ise, 3DSecure işlemlemini tamamlamayı sağlar.&lt;/li>
&lt;/ol>
&lt;p>Bu api ile ilgili her türlü sorularınızı bana yöneltebilirsiniz. Fırsat buldukça size yardım etmeye çalışacağım.&lt;/p>
&lt;p>&lt;a href="http://vpos4php.googlecode.com">vpos4php&lt;/a> kütüphanesinin proje sayfasına &lt;a href="http://code.google.com/p/vpos4php/downloads/list">buradan&lt;/a> indirebilirsiniz.&lt;/p></content></entry><entry><title>Linux Dosya Indeksleri (inode) ve Sistem Mimarisi</title><author><name/><uri/></author><id>https://hozgan.com/linux-dosya-indeksleri-ve-sistem-mimarisi/</id><updated>2010-01-09T00:00:00Z</updated><published>2010-01-09T00:00:00Z</published><content type="html">&lt;p>Birkaç gündür &lt;a href="http://kissa.be">http://kissa.be&lt;/a> servisinin bulunduğu sunucu, diskte yer yok hatası nedeniyle düzgün bir şekilde hizmet veremiyordu. Durumu farkeder farketmez, diskteki yerimi kontrol ettiğimde gördüm ki; diskin %80&amp;rsquo;lik bir bölümü halen boş. Sorunun sunucu hizmeti aldığım firmayla görüşünce, anlaşıldı ki, diske format atarken varsayılan değerlerini aynen kabul ettiğim dosya indekslerimin (inode size) tükendiği için bu hatayı aldığım anlaşıldı.&lt;/p>
&lt;p>Diskte mevcut inode sayısını görmek için;&lt;/p>
&lt;pre tabindex="0">&lt;code>root@localhost:~# df -ih
&lt;/code>&lt;/pre>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Filesystem&lt;/th>
&lt;th>Inodes&lt;/th>
&lt;th>IUsed&lt;/th>
&lt;th>IFree&lt;/th>
&lt;th>IUse%&lt;/th>
&lt;th>Mounted on&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>/dev/sda&lt;/td>
&lt;td>680K&lt;/td>
&lt;td>21K&lt;/td>
&lt;td>660K&lt;/td>
&lt;td>3%&lt;/td>
&lt;td>/&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/dev/sdc&lt;/td>
&lt;td>1.3M&lt;/td>
&lt;td>25K&lt;/td>
&lt;td>1.2M&lt;/td>
&lt;td>2%&lt;/td>
&lt;td>/files&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Diskteki mevcut boş alanı görmek için ise;&lt;/p>
&lt;pre tabindex="0">&lt;code>root@localhost:~# df -h
&lt;/code>&lt;/pre>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Filesystem&lt;/th>
&lt;th>Size&lt;/th>
&lt;th>Used&lt;/th>
&lt;th>Avail&lt;/th>
&lt;th>Use%&lt;/th>
&lt;th>Mounted on&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>/dev/sda&lt;/td>
&lt;td>11G&lt;/td>
&lt;td>741M&lt;/td>
&lt;td>9.5G&lt;/td>
&lt;td>8%&lt;/td>
&lt;td>/&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>/dev/sdc&lt;/td>
&lt;td>4.8G&lt;/td>
&lt;td>960M&lt;/td>
&lt;td>3.6G&lt;/td>
&lt;td>21%&lt;/td>
&lt;td>/files&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;a href="http://kissa.be">http://kissa.be&lt;/a> resim ve metin gibi dosyaları saklamanıza yarayan bir servis olduğu için çok küçük oranlarda çok fazla dosya bulundurabiliyor bünyesinde. Bu da dosya indeks limitimin hızlı bir şekilde tükenmesine neden olmuştu.&lt;/p>
&lt;p>&lt;a href="http://kissa.be">http://kissa.be&lt;/a>&amp;rsquo;nin bulunduğu bir önceki sunucu da (Debian 4.0) bir dosya için ayrılması düşünülen dosya indeks boyutu (bytes-per-inode) 4096 ve dosya indeks alanı ise 128 idi. Şuan mevcut sunucumda (Ubuntu 9.10) ise varsayılan kurulum ayarları (8096 / 128) olarak geliyor.&lt;/p>
&lt;p>Diskinize ait inode ve block gibi değerleri görmek için;&lt;/p>
&lt;pre tabindex="0">&lt;code>root@localhost:~# tune2fs -l /dev/sdc
&lt;/code>&lt;/pre>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Inode count:&lt;/th>
&lt;th>1280000&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Free inodes:&lt;/td>
&lt;td>1255224&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;mdash;&lt;/td>
&lt;td>&amp;mdash;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inodes per group:&lt;/td>
&lt;td>32000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;mdash;&lt;/td>
&lt;td>&amp;mdash;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inode blocks per group:&lt;/td>
&lt;td>1000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;mdash;&lt;/td>
&lt;td>&amp;mdash;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Inode size:&lt;/td>
&lt;td>128&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;mdash;&lt;/td>
&lt;td>&amp;mdash;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Sorunu tespit ettikten sonra çözüm bulmak gerçekten çok kolay oluyor. Linux&amp;rsquo;ta kissa.be servisine özel bir disk alanı gerekiyordu. Sunucuda inode değerleri ihtiyacıma göre olan bir alan yaratınca sorun kökten çözüldü. Böylece sunucunun işletim sistemi bu durumdan hiç etkilenmedi.&lt;/p>
&lt;p>Diski inode değerlerine göre yeniden biçimlendirirken;&lt;/p>
&lt;pre tabindex="0">&lt;code>root@localhost:~# mkfs.ext3 -i 4096 -I 128 /dev/sdc
&lt;/code>&lt;/pre>&lt;p>Aslında bu konularda uzman biri olduğumu pek söyleyemem. Çok anlamam ama, linux sistemiyle uğraşmayı, sistem programlama konularını seviyorum.&lt;/p>
&lt;p>Yazının ana fikrine gelecek olursak;&lt;/p>
&lt;p>Eğer kissa.be heveskar bir gencin projesi değil de, bit.ly gibi planlı bir proje olsaydı, gereksinim analizini okuyan bir Sistem Mimari servise ait dosyaları barındıran diskin formatlanması konusunda inode detayını atlamazdı.&lt;/p>
&lt;p>Yaşadığım bu olay, bugün öğrendiğim küçük bir ders oldu!&amp;hellip;&lt;/p></content></entry><entry><title>Pratisyen Hekim veya Kalp Cerrahı Olmak</title><author><name/><uri/></author><id>https://hozgan.com/pratisyen-hekim-veya-kalp-cerrahi-olmak/</id><updated>2009-12-03T00:00:00Z</updated><published>2009-12-03T00:00:00Z</published><content type="html">&lt;p>Amerika&amp;rsquo;ya geldiğimde zilyon tane işe zilyon kere CV gönderdim. Bu iş görüşmeleri sırasında kendimi değerlendirme ve sorgulama fırsatı buldum. Ne bildiğim, ne bilmediğim, amacımın ne olduğu, 3 yıl sonra kendimi nerede görmek istediğim gibi sorulara cevaplarım bu sayede netleşti. Hatta bir firmaya bu sorular için FAQ (sıkça sorulan sorular) formatında bir belge sunduğumu bile hatırlıyorum :) Bununla birlikte, şirketlerin işleyişi ve beklentileri hakkında genel bir fikir sahibi de oldum. Bu görüşmelerin neticesinde; ya onlar sizi, ya da siz onları beğenmezsiniz.&lt;/p>
&lt;p>Kendinize bir kariyer yolu belirlediğinizde, size başka teklifler sunarak bu yoldan caydırmaya çalışanlar olur. Ve teklif çok ilgi çekici ve mantıklı geliyorsa yolunuzdan cayabilirsiniz. Aslına bakarsanız, iş hayatımın bir bölümünde bu olay defalarca tekerrür etti. Gel-gitlerin ardından nihayet en sevdiğim iş bu benim hayatımın amacı dediğim şeyi buldum. İşte bu kararı verdiğim günlerde başımdan geçen bir olayı paylaşacağım.&lt;/p>
&lt;p>Hikayemiz, her zaman gittiğim kafede çalışırken, telefonumun çalmasıyla başlıyor. Arayan Amerikan&amp;rsquo;ın en saygın medya şirketlerinden biriydi. Görüşmek istediklerini bildirdiler ve beraber ertesi gün 13:45 için randevuleştik. Ne kadar heyecanlandığımı anlatamam. Sonuçta çok saygın bir kurumda çalışma şansım vardı, helede krizin dorukta olduğu şu günlerde&amp;hellip;&lt;/p>
&lt;p>Görüşmenin olacağı gün, giydiklerime her zaman gösterdiğimden biraz daha fazla özendim. Traştan iyice tahriş olan yüzümü bir kez daha acımasız davrandım. Arabamın çıkardığı küçük sorunla birlikte başlayan geç kalma telaşıma rağmen tam zamanında şirket binasının önüne gelmiştim. Çok merkezi bir yerde, görkemli ve son derece teknolojik bir binaydı.&lt;/p>
&lt;p>Kimliğimi verdim. Ziyaretçi bilgilerimi bilgisayara giren resepsiyon görevlisinin, gizlice fotoğrafımı çekmesinden rahatsız olsam da birşey söylemeden kartımı aldım ve hızla görüşeceğim kişinin ofisine gittim. Beni asistanı karşıladı ve biraz beklememi rica etti. Küsuratlı bir randevu saati verdiklerinde, dakikaları değerli ve dakik bir adam hayal etmiştim. Benden önceki görüşmesi geldikten yarım saat sonra nihayete erdi. Görüşmeye başlayacağımızı düşünürken; benden özür dileyip, beş dakikalığına birini görmesi gerektiğini söyledi ve yarım saat sonra geri döndü. Anlayacağınız benim görüşmem bir saat rotarlı başladı. Sinirlense de, insan, olabilir, insanlık hali diyorsunuz değil mi? Bende öyle dedim. Taa ki görüşme ortasında gelen telefon görüşmesinin 10 dk sürmesini seyirci olana kadar. Türkiye&amp;rsquo;ye söyleniriz ama ben böyle saygısızlık görmedim ülkemde.&lt;/p>
&lt;p>Görüşmelerde, insanı germezsiniz rahatlatmaya çalışırsınız değil mi? Daha mülakatın birinci dakikasında &amp;ldquo;keşke üniversite eğitimini tamamlasaydın, niye üniversiteyi terketmişim&amp;rdquo; gibisinden akıl hocalığına başlaması ve beni azarlaması ve sonrada bak senin uğraştığın bu alanlarda ben de master tezi veriyorum demesi son derece rahatsızlık vericiydi. Belki son derece iyi niyetliydi ama bana yukarıdan bakan bir züppe imajı verdi. Züppe tavrı, şirkette yatay bir hiyerarşi var diye başlayan cümlelerini yalanlar niteliğindeydi. Görüşmelerin bir yerinde verdiğim bir yanıttan sonra aradığının idealist bir yazılımcı değilde ne iş olsa yaparım abi tipinde adamlar olduğunu anladım. İşte bu andan itibarent anlattıklarımı dinlemediğini farkettim.İşte dedim; beni kariyer yolumdan saptırmaya çalışacak bir şirket daha.&lt;/p>
&lt;blockquote>
&lt;p>Devasa büyüklükte ki şirketler; sadece geminin gitmesi için ne gerekiyorsa, ürün güdümlü olarak, yapılan işi, detaylı düşünmeden ve hazır sistemler üzerine inşa ederek, bir şekilde çalışsın da, yolda düzeltiriz anlayışına sahip şirketlerdir. Özelliklerinden biri dev aile şirketi olmalarıdır. Ve yaratıcılık ve yenilikçi düşünceyi destekleyecek bir yapı bulamazsınız bu şirketlerde. O kadar hantal bir karar süreçleri vardır ki, departmanların birbirinden haberi pek yoktur. Bilgi akışı şeffaf değildir. Sadece günü kurtaracak ve her işten anlayan sektörde süper kahraman olarak anılan ama bence pratisyen doktor olan adamlar çalıştırırlar. Şirket herşey hakkında fikri olan ama hiçbirşeyi adam gibi bilmeyenlerle doludur. &lt;a href="http://kaanaslan.com">Kaan Aslan&lt;/a> bu adamlara &lt;a href="http://www.fazlamesai.net/?a=article&amp;amp;sid=3102">ürün güdümlü programcı&lt;/a> dediğini &lt;a href="http://fazlamesai.com">http://fazlamesai.com&lt;/a>&amp;rsquo;u takip edenler hatırlayacaktır. Sanırım bu devasa şirketlerin innovatif şeyler çıkartamamasının sebebi, kendi içinde iş bölümü ve uzmanlaşma gibi konulara sıcak bakmadıklarından kaynaklanıyor. Eğer departmanın yöneticileri de bunun önemi için mücadele etmiyorsa vay o şirketin çalışanlarının haline. Tabii bu şirketlerin bir medya şirketi olması ve &amp;ldquo;innovasyonda ne ki la!?&amp;rdquo; &amp;ldquo;bana ne gerek sütlü börek la!?&amp;rdquo; gibi cümlelerle, rakiplerine yukarıdan bakması ve internet gibi bir ortamda bulunupa bu sosyal gücü farketmemiş olması yazık bu şirketlere dedirtmiştir.&lt;/p>&lt;/blockquote>
&lt;p>Mülakatıma geri döneyim, önce bana şirkette, web projesi yapmaktan - çöp kutusu dökmeye kadar herşeyi yaptıklarından söz ettiler. Önce beni şaşırtmayan bu cümlenin devamı çok ilginç olmaya başlamıştı (burada bir çalışanımız, tasarımda yapar, masaüstü uygulamasıda yapar, iphone uygulaması da). Beni tanıyanlar bunların hepsi ile uğraştığımı ve yapabileceğimi bilir. Yani tam bir pratisyen hekim gibiyimdir ama bu bilgilerim işimi halledecek seviyede ve yüzeyseldir. Yoksa bir tasarımcının yaptığı işi yapmak haddime düşmez!&lt;/p>
&lt;p>Mülakatı yapan kişi söyledikleri konusunda beni ikna etmek için, bilimlerin birbirinden etkilendiği ile ilgili bir örnek verdi. Buna bende inanırım. Sadece bilimler değil sanat bile bilimden etkilenir. Bakınız (Leonardo da Vinci). Eğer benim konuşmama izin verseydi, Palm&amp;rsquo;ın kurucusu Jeff Hawkins&amp;rsquo;in Zeka isimli kitabında da bundan söz ettiğini söyleyecektim. Jeff Hawkins kitabında; yapay zeka üzerine çalışma yapan bilim adamlarının sadece kendi branşlarında araştırma yaptığını aslında bunları ayrı ayrı değil birlikte değerlendirmek gerektiğinden söz eder. Masaüstü, Web ve Mobil bambaşka paradigmalara sahip, başka patternlere ve spec&amp;rsquo;lere sahip olan konulardır. Ve özünde birbirinden farklı uzmanlık alanı gerektirir. İyi işler çıkaranlar bunların üçüyle de aynı anda uğraşmazlar. En azından ben görmedim. Farklı bilimlerden beslenmek gerekir. Aynı bilimin farklı kolları bize bunu sağlamaz.&lt;/p>
&lt;p>Mülakat benim için ve onlar için bitmişti ama son olarak beni yazılım ekip müdürleri ile görüştürme kararı aldılar. Aradıkları adam ben değildim ama bu komedinin nereye gideceğini de merak ediyordum.&lt;/p>
&lt;p>İşe gerçekten ihtiyacım olduğu halde; bu sefer kariyer yoluma sadık kalmaya kararlıydım. Ve bir pratisyen doktor değil de kalp cerrahı olmak istediğimi ve yol haritamdan söz ettim. Hak verdiğim tek nokta onların aradığı benim olmak için çalıştığım adam değildi. Onlara bolca pratisyen hekim gerekiyordu. Memur zihniyetli, gelişimek için yukarıdan gelen bilgi ile yetinen, bilgiyi edinmek için özel uğraş vermeyen adamlar. Beni ikna etmeyi son kez deneyen yazılım ekip lideri bana neden bu kadar dil ile yazılım yazdığımı sordu. Öyle ya!, neden tek bir dil ile uzmanlığımı pekiştir miyordum? Sorular önemlidir! Ama bana halen yanlış sorular soruluyordu. Tüm uğraştığım dillerde web geliştirdiğimi söyledim. Sonra lafı arabalara getirdim. Arabalara ilgi duyduğumudan söyledim. Grande Punto sahibiyim ama arada Porche, Ferrari, BMW, Mercedes gibi araçlarıda denerim. Belki onları alacak kadar gücüm yok ama otomobil kullanmayı severim. Programlama dilleri arabalar gibidir. Doğru yolda doğru aracı seçmek gerekir. Bu kadar programlama dili ile ilgilenmiş olmam, bu kadar framework incelemiş olmam benim perspektifimi geliştirmek içindir. Bunlar beni pratisyen hekim olduğumu göstermez.&lt;/p>
&lt;p>Gönül isterdi ki, web konularından (güvenlik, ölçeklenbilirlik, verimlilik ve mimarile vb) söz edilseydi. Bunları konuştuğumda gözlerimde oluşan ışıltıyı görmelerini çok isterdim. (:&lt;/p>
&lt;p>Sonuçta insan eğlendiği işi yapmalı öyle değil mi? Bence pratisyenlik, uzmanlık konunuza karar verene kadar geçirdiğiniz zaman dilimidir. Eğer pratisyen hekim olmak sizi yaparken eğlendiriyorsa doğru yoldasınız ama ben uzmanlığımı seçtim cerrah olma yolunda tam gaz ilerliyorum. Hem de kalp cerrahı :P&lt;/p></content></entry><entry><title>Friendfeed List Editor (ffedit.com) v.0.1 Yayında</title><author><name/><uri/></author><id>https://hozgan.com/friendfeed-list-editor-v_01-yayinda/</id><updated>2009-10-21T00:00:00Z</updated><published>2009-10-21T00:00:00Z</published><content type="html">&lt;p>Açık kaynak olarak geliştirilen ffedit.com v.0.1 yayında. Bir friendfeed servisi olan ffedit.com&amp;rsquo;un toplu olarak besle listesi üyeliklerinizi yönetmenizi sağlıyor.&lt;/p>
&lt;p>&lt;img src="/files/2009/10/ffedit-logo.png" alt="/files/2009/10/ffedit-logo.png &amp;ldquo;ffedit-logo&amp;rdquo;">&lt;/p>
&lt;p>&lt;a href="http://ffedit.com">http://ffedit.com&lt;/a> adresinden deneyebilir, &lt;a href="http://ffedit.googlecode.com">http://ffedit.googlecode.com&lt;/a> adresinden de kaynak kodlarını inceleyebilirsiniz.&lt;/p></content></entry><entry><title>Geleceğin Web Mimarisi</title><author><name/><uri/></author><id>https://hozgan.com/rest-gelecegin-web-mimarisi/</id><updated>2009-09-16T00:00:00Z</updated><published>2009-09-16T00:00:00Z</published><content type="html">&lt;p>Dün şirketten arkadaşlarla molada iken, Ruby ile büyük proje yazılıp yazılamadığı ile ilgili mini bir tartışma yapmıştık. Ruby&amp;rsquo;nin yavaşlığını bilen biri olarak, olmaz diye bağıran adamların başında da ben geliyordum. Sonra Ruby haber gruplarında çokça adını duyduğum &lt;a href="http://www.sinatrarb.com/">Sinatra&lt;/a> isimli kütüphaneyi inceleyince Ruby ile yeni web mimarisi ile çok güçlü web uygulamaları yazılabileceğini gördüm.&lt;/p>
&lt;p>&lt;img src="/files/2009/09/20090915-6xfj7cp1kx6w884tqw29yk2k4.jpg" alt="20090915-6xfj7cp1kx6w884tqw29yk2k4" title="20090915-6xfj7cp1kx6w884tqw29yk2k4">
&lt;img src="/files/2009/09/20090915-c8trr5mh7ukbhg6eukptwsuq3r.jpg" alt="20090915-c8trr5mh7ukbhg6eukptwsuq3r" title="20090915-c8trr5mh7ukbhg6eukptwsuq3r">&lt;/p>
&lt;p>&lt;a href="http://www.quirkey.com/blog/2009/09/15/sammy-js-couchdb-and-the-new-web-architecture/" title="http://www.quirkey.com/blog/2009/09/15/sammy-js-couchdb-and-the-new-web-architecture/">Bu yazıyı&lt;/a> okuyunca ve Gmail’in de böyle çalıştığını ve bunu yapmanın bize bir tık kadar uzakta olduğunu görünce heyecanlandım. Bu güzel bilgiyi sizlerle de paylaşayım dedim. Yukarıdaki görselle her şey yerlerine oturdu.&lt;/p>
&lt;h3 id="anahtar-kelimeler">Anahtar Kelimeler;&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title="http://en.wikipedia.org/wiki/Representational_State_Transfer">Restful teknolojisi&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://couchdb.apache.org/" title="http://couchdb.apache.org/">Document Oriented DB&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://hadoop.apache.org/" title="http://hadoop.apache.org/">MapReduce&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://code.quirkey.com/sammy/" title="http://code.quirkey.com/sammy/">JS Router/Controller&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry><title>Temiz PHP Dünyası</title><author><name/><uri/></author><id>https://hozgan.com/temiz-php-dunyasi/</id><updated>2009-09-16T00:00:00Z</updated><published>2009-09-16T00:00:00Z</published><content type="html">&lt;p>Temizlik deyince bu yazıda Vim’den de söz edildiği gelmesin! :P &lt;em>(belki daha sonra)&lt;/em> PHP 5.2 ile beraber &lt;a href="http://tr.php.net/filter_var" title="http://tr.php.net/filter_var">filter_var&lt;/a> isimli bir fonksiyon hayatımıza girmiş. Güvenlik için gerekli olan bu method veri girdilerini tiplerine göre filtrelemeyi sağlıyor. &lt;a href="http://net.tutsplus.com/tutorials/php/getting-clean-with-php/filter_var">http://net.tutsplus.com/tutorials/php/getting-clean-with-php/filter_var&lt;/a> kullanalım, kullandıralım!&lt;/p>
&lt;p>&lt;img src="/files/2009/09/preview.jpg" alt="preview" title="preview">&lt;/p></content></entry><entry><title>MacBook Üzerine Ubuntu 9.04 Kurulumu</title><author><name/><uri/></author><id>https://hozgan.com/macbook-uzerine-ubuntu-9_04-kurulumu/</id><updated>2009-09-05T00:00:00Z</updated><published>2009-09-05T00:00:00Z</published><content type="html">&lt;p>Uzun süredir Macbook almayı düşünüyordum. Bir arkadaşımın önerisiyle sahibinden.com sitesi üzerinden, bütçeme uygun bir &amp;ldquo;Macbook 3,1&amp;rdquo; satın aldım. Herşeyine yabancı olduğum PC dünyasından farklı ama ince düşünülmüş tasarımıyla çok güzel bir makine. Önerilerle birkaç yazılımı hemen yükledim. Ama geliştirme ortamı MAMP(macosx, apache, mysql ve php) kurulumu yaptım. Terminal üzerinde vim ile PHP kodları geliştiriyordum. Fakat, Turkish-Q klavyede @ işaretinin ALT+Q tuşu ile çıkıyor olmasından ve CMD+Q tuşununda uygulamayı sonlandırmak için ayarlanmasından dolayı kod yazarken biraz içerik kaybettim. (Belkide English-Q klavyeye geçmeliydim) Virtualbox sanal makine uygulaması üzerine Ubuntu kurmama rağmen onunda kendi dertleri yok değildi. Macports ve Fink paket kurma uygulamalarıda aptitude ile kıyaslanamaz kötü ve yetersiz olduğunu söylemem gerek. Projenizde sizin macbook&amp;rsquo;a alışmanızı bekleyemeyecek durumdaysa; &amp;ldquo;insanın sabır küpü&amp;rdquo; pek fazla dayanmıyor. Şuan size bu satırları Ubuntu üzerinden yazan biri olarak şunları söylemeliyim ki,&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Macintosh&amp;rsquo;tan başka bilgisayar almam ama geliştirme ortamında ise Linux&amp;rsquo;tan şaşmam!&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Peki niyetim dual boot olarak MacOSX ve Ubuntu&amp;rsquo;yu birlikte çalıştırmaktı. Elimde ise tek bir partition vardı ve OSX kurmak içinde Leopard kurulum cd&amp;rsquo;si yoktu. Yani OSX&amp;rsquo;i silmeden ve partition yaratarak kurmam gerekiyordu. Araştırmalarım sonucunda Apple&amp;rsquo;ın BootCamp Assitant adında bir yazılımı olduğunu ve bunun partition&amp;rsquo;da yer açabileceğimi öğrendim. Ama bu yazılım MacOS 10.4 (Tiger) sürümü ile Mac üzerine kuruluyor. Leopard ile önce windows&amp;rsquo;a kurulan bir sürümü (v.2) olduğunu öğrendim. İndirdiğim tüm Bootcamp Assitant 2.0 uygulamalarında windows sürücüleri çıktı. Ubuntu&amp;rsquo;yu kurduğunuza wireless ethernet kartı tanımadığını gördüğünüzde çözümününde bu sürücülerden geleceğini bilmeniz yeterli.&lt;/p>
&lt;p>Neyse bu kadar boş laf yeter. Bugün tek partitionlı Mac OS X Leopard olan bir işletim sistemine nasıl Ubuntu kurabildiğimi anlatacağım.&lt;/p>
&lt;ol>
&lt;li>İlk olarak MacOS&amp;rsquo;u güncelleyin. (Özellikle firmware paketini güncellemeniz önemli. Bu sayede rEFIt çalışabilir.)&lt;/li>
&lt;li>HFS+ dosya sistemi ile biçimlendirilmiş external bir harddiske ihtiyacınız var.&lt;/li>
&lt;li>Macbook diskini bölümlere ayırmak için BootCamp bulamadıysanız yapmanız gereken işletim sisteminin yedeğini harici bir diske kopyalayıp bu diskten bilgisayarı &lt;a href="http://refit.sourceforge.net/">rEFIt&lt;/a> yardımıyla başlatmak. rEFIt MacOS&amp;rsquo;un dualboot için geliştirdiği EFI desteğini gayriresmi olarak ubuntu tarafından kopyalamıza yardımcı olur.&lt;/li>
&lt;li>&lt;a href="http://www.bombich.com/">Carbon Copy Cloner&lt;/a> yazılımı yardımıyla tüm diskin bir başlatılabilir bir klonu alınır. Bu işlem diskinizin büyüklüğü ile orantılı olarak uzun sürer. :)&lt;/li>
&lt;li>Kopyalama işlemi tamamlanınca bilgisayar yeniden başlatıldığında rEFIt yazılımının menüsünün yardımıyla harici diskten MacOS başlatılır.&lt;/li>
&lt;li>Finder içinden Applications / Utilities / Disk Utility uygulaması başlatılır. MacBook hard diski seçilir gelen formdan Partition sekmesine tıklanır ve bölümlendirme sırasıyla Windows için DOS dosya sistemi, Linux için DOS dosya sistemi ve geri kalan alan ise MacOS için HFS+ dosya sistemi ile biçimlendirilir. DOS dosya sistemleri sadece disk alanı açmak içindir. Sonra Windows için NTFS linux için ise ext ve swap alanları için yeniden bölümlendirileceklerdir.&lt;/li>
&lt;li>Carbon Copy Cloner yazılımı ile harici diskten macos için ayırdığınız bölüme geri kopyalayın.&lt;/li>
&lt;li>Ubuntu CD&amp;rsquo;si ile kurulumu yaparken dikkat etmeniz gereken, ubuntu için ayrılan alanda duran DOS dosya sistemini kaldırıp sırasıyla, linux dosya sistemlerini elle ayarlamanız gerektiğidir. Bootloader&amp;rsquo;ı MBR&amp;rsquo;a kesinlikle kurmamanız gerekir bu sebeple 100MB alanı /boot olarak mount edin. 2-3 gb alanı swap ve geri kalan alanıda ext4 (gerçekten hızlı) ile bölümlendirin. Kurulumdan bir önceki onay sayfasında Advanced menüsünden bootloader&amp;rsquo;ın MBR yerine yarattığınız sda2(/boot) alanına kurulumunu sağlamalısınız.&lt;/li>
&lt;li>Son olarak isterseniz, Windows kurulumu yapabilir ve BootCamp ile önerilen işlemleri yapabilirsiniz. Fakat ben bu kısıma girmeyeceğim.&lt;/li>
&lt;li>Sonra bilgisayarı yeniden başlatıyoruz ve görüyoruz ki rEFIt menüsünde MacOS ve Linux logoları bizi selamlıyor. Tebrikler kurulumu başarıyla tamamladınız. Ama işimiz henüz bitmedi. MacBook için küçük ayarlar yapmamız gerekiyor.&lt;/li>
&lt;li>Wireless ve diğer MacBook donanım ayarlarını aşağıdaki linklerde anlatıldığı şekilde yapabilirsiniz. &lt;a href="https://help.ubuntu.com/community/MacBook3-1/Jaunty">https://help.ubuntu.com/community/MacBook3-1/Jaunty&lt;/a> &lt;a href="http://www.isriya.com/node/1804/ubuntu-on-macbook-air">http://www.isriya.com/node/1804/ubuntu-on-macbook-air&lt;/a> Bu iki bağlantı size yol gösterecektir.&lt;/li>
&lt;li>Son olarak Turkish+Q klavyenizin ayarlarını yapmanız gerekiyor. Yanda { &amp;ldquo;, é, &amp;lt;, &amp;gt; } görebileceğiniz tuşlar, ubuntu üzerinde yanlış map edilmiştir. Bunu düzeltmenin yolu ise, xmodmap kullanmaktır. Ev dizininizde .Xmodmap dosyası yaratın ve içine aşağıdaki satırları ekleyip yeniden başlattığınızda tuşların düzeldiğini göreceksiniz.&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>~/.Xmodmap&lt;/strong>&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->keycode 94 = quotedbl eacute quotedbl eacute less degree&lt;em>keycode 49 = less greater less greater bar brokenbar&lt;/em>&lt;/p>&lt;/blockquote>
&lt;p>İşte yapmanız gerekenler bundan ibaret. İşte çalışmak şimdi eğlenceli olmaya başladı :)&lt;/p></content></entry><entry><title>Yazılım Geliştirme Süreçleri - 1</title><author><name/><uri/></author><id>https://hozgan.com/yazilim-gelistirme-surecleri-1/</id><updated>2009-08-02T00:00:00Z</updated><published>2009-08-02T00:00:00Z</published><content type="html">&lt;p>Yazılım geliştirme işinin hep acil olduğu, hesapsız kitapsız ve hal ederiz gazları ile başlanan projelerin, sürecin tamamının kod yazmaktan(implementation) ibaret olmadığını bilse de öyleymiş gibi davranan bir ülkede geçirilen 10 yılıma üzülmemi sağlayan bir öykü paylaşacağım sizinle! Proje yöneticiliği yapan arkadaşların, bu süreçleri es geçip yıllarca önümüze sürdüğü bütçe palavraları üzerine bir yığın genelleme mevcut. Ama inanın hem bütçeyi doğru kullanmak, hemde işi kitabına uygun bir şekilde yapmak mümkün. Nasıl diye sorduğunuzu duyar gibiyim! &lt;em>Süreçleri bir taşla on kuş vuracak şekilde düzenlemek&lt;/em> aslında söylediğim şey. Belgelemeyi PHPDocument ile yapmak gibi bir şey aslında söylemek istediğim. Ve &lt;em>ekibin enerjisini doğru bir şekilde yaymak&lt;/em>. İşin sırrı, her işe doğru adama atamak. Genelde Türkiye&amp;rsquo;de bir yazılımcı, sayfa tasarımdanda, DB tasarımından, güvenliktende, nesne yönelimli konulardan ve browser bağımsız javascript ve css hilelerinden haberdardır. Ve tüm enerjisiyle her şeyi çözer! Buradaki insanlara bundan söz ettiğimde, nasıl her şeyi bilmemizin beklediklerini anlayamadılar ve doğal olarak; nasıl öğrendiğimizi sordular!. Cevabım mı?; Halleluja Google! :)&lt;/p>
&lt;p>Yeni görevim ve şirketimde geçen bir haftaya gelirsek, Ted ile bir hafta boyunca proje ekibi ile tasarım toplantıları yaptık. Proje ekibimizde bizim dışımızda; 2 frontend developer, 2 backend developer (biri aynı zamanda DB uzmanı), 1 sysadmin, 1 grafiker var.&lt;/p>
&lt;p>İlk gün, müşteriden gelen RFP (Request For Proposal) belgesi baz alınarak çıkarılan StoryBoardları inceledik. Benden önce kullanılacak teknolojiye karar verilmiş, use-case diagramları Ted tarafından çıkarılmış ve ekip bu teknolojiye uygun olarak seçilmişti. Toplantı öğle yemeği saatine kadar sürdü ve projedeki herkes kendi açısından neler gerektiği ile ilgili notlar aldı ve deneyimlerini ekip ile paylaştı.&lt;/p>
&lt;p>Öğleden sonra, frontend yazılım geliştiriciler, WADA (Web Application Data Architect) adında, içerisinde isteklerin ne şekilde yapılacağını nasıl yanıtların alınacağı ile ilgili bir döküman hazırlamaya koyuldular. Dökümanda ayrıca template engine içerisinde kullanılacak veri atamalarıda yer alıyordu. Bu dosya JSON formatında olduğu içinde rahatlıkla versiyon takip sistemine eklenip değişiklikler hızlı bir şekilde yapılmasını hedefliyordu.&lt;/p>
&lt;p>Ben ve Ted ise öğleden sonra, tasarım toplantılarına başlamıştık. Veritabanı uzmanı ile birlikte E/R diagramını hazırladık. Akşama kadar performans konuları (aktif/pasif, clustering) gibi konular konuşuldu.&lt;/p>
&lt;p>Backend geliştiriciler ise, geliştirme ortamlarını sistem yöneticimiz Fabian ile birlikte hazırladılar, hangi kütüphaneleri kullanacakları vb konulara karar verdiler ve ertesi iki gün boyunca; Ted, ben ve 2 backend geliştiricisi ile birlikte, sınıf diagramları ve sekans diagramlarını tartıştık. Performans ve güvenlik konularının konuşulduğu bir toplantı olduğunu söyleyebilirim.&lt;/p>
&lt;p>Üçüncü günün akşamında grafiker bize 3 taslak ile geldi. Bu toplantıya frontend geliştiricilerde katıldı. Buradada ağırlık kullanılabilirlik ve sayfanın yükü üzerine ve AJAX düşünülen yerlerin etkileri üzerine yapılan konuşmalar vardı. Nerelerde cache kullanılması gerektiği gibi notları Ted not ettiğini gördüm. Bu bilgi anında eposta grubu ile paylaştırıldı. İşin ilginç tarafı bu tasarımlarla ilgili kimse güzel olmuş gibi yorumda bulunmadı. Benim dışımda, kimse tasarımın güzelliği ile ilgilenmiyordu. Bu toplantının gündemi kullanılabilirlikti ve beğenip beğenmediğini söyleyecek tek kişi ise müşteriydi. Toplantının yapılmasındaki amaç, tasarım müşteriye sunulmadan önce, frontend tarafında sonradan çıkabilecek kötü süprizler ve müşteriden gelebilecek saçma isteklerin önüne geçmekti.&lt;/p>
&lt;p>Şirketin ortak bir zihni olduğunu söyleyebilirim. Zaten ilk geldiğim gün bundan söz etmişlerdi. Yazılan ve öğrenilen her şey, tüm şirket tarafından biliniyor ve hemen kütüphanedeki yerini alıyordu. Böylece tekrar tekrar pek bir şey yapılmıyordu.&lt;/p>
&lt;p>Cuma günü yaptığımız toplantıda draft olsalarda hemen hemen her şey hazırdı. Müşteri tasarımı seçmiş, sınıf diagramlarının büyük çoğunluğu hazırlanmıştı. Tüm sayfalar ve görünüm bileşenleri(widgets) sayfaların nasıl davranacağı, ne gibi görünüm bileşenelerine ihtiyaç olduğu WADA dökümanında belirtilmişti. Neredeyse her şey projenin 2. haftasında rayına oturmuş görünüyordu. İnanılmaz bir deneyimin parçası olmuştum.&lt;/p>
&lt;p>Bu projedeki edindiğim deneyimlerimi paylaşmaya daha sonraki yazılarımda devam edeceğim. Sözünü ettiğim belgelerin örneklerini de izin alabilirsem buraya dahil edeceğim.&lt;/p></content></entry><entry><title>Bir İşletim Sistemi Olarak İnternet</title><author><name/><uri/></author><id>https://hozgan.com/bir-isletim-sistemi-olarak-internet/</id><updated>2009-07-30T00:00:00Z</updated><published>2009-07-30T00:00:00Z</published><content type="html">&lt;p>Frontend tarafında tüm işlev bütünleri aslında bir bileşendir. Aynı windows mesaj yapısında olduğu gibi. Muhakkak bir event handler olmalıdır. Front end tarafında bileşenlerin kendine has eventleri olabilir. Ve başka bileşenler bu eventleri tetikleyebilir. Burada biraz masaüstü programlamaya benzer. CORBA gibi mimarilere bakmak gerekir. Server side&amp;rsquo;da buna özgü şeyler desteklemelidir.&lt;/p>
&lt;p>Arkada bunu yöneten şey ise bir işletim sistemi değilde, browser =&amp;gt; internet =&amp;gt; web server işte yeni işletim sistemimiz. Bu bağlamda chrome neden bir işletim sistemi olmasın?!&lt;/p></content></entry><entry><title>Amerika'da Çaylak Bir Yazılım Mimarı</title><author><name/><uri/></author><id>https://hozgan.com/amerikada-caylak-bir-yazilim-mimari/</id><updated>2009-07-27T00:00:00Z</updated><published>2009-07-27T00:00:00Z</published><content type="html">&lt;p>Merhaba Üstadım; uzun bir süredir söylenemeyen sözlere, görülüp, işitilen ama bir türlü elin kaleme gitmediği zaman içinde değişen teknolojilere, her ne varsa ve her kim bu sürede her ne yaptıysa; neyi üzüp, neyi sevindirdiyse ve kimine değişim göstermesede, sürekli değişen hayata ve değerli dost Sana, Amerika&amp;rsquo;dan kocaman harflerle MERHABA!&amp;hellip;&lt;/p>
&lt;p>Evet Üstad, yaklaşık bir hafta önce &amp;ldquo;Çaylak Yazılım Mimari&amp;rdquo; (Jr. Software Architect) olarak Amerika Kaliforniya eyaletinde işe başladım. Burada öğrendiklerimi ve tespitlerimi senin görüşünle hazmetmek istiyorum. Bu bir çaylağın ustalaşma evresimi olur yoksa, not defterimde yer eden başka bir başarısızlık mı olur bilemiyorum. Ama gitmek istediğim yere ulaşmak için gideceğim disiplinli bir çalışma olacağına eminim.&lt;/p>
&lt;p>Yeryer işlerin nasıl olduğunu benim pozisyonumdaki bir insanın ne şekilde kullanıldığından söz edeceğim. Bir projenin nasıl tasarlandığını hangi kurumların olduğundan ve bazende bu işin tarihçesine değineceğim.&lt;/p>
&lt;p>Buraya geldiğimde, soğuk bir karşılama beklerken herkes bana çok iyi davrandı. Herkesten çaylaklık hikayelerini dinledim ve bu nereyi hedeflediklerini dinledim. Hangi konuda ustalaşmak istediğimi sordular. Bende gayri ihtiyari, &amp;ldquo;Internet Architect&amp;rdquo; diye cevap verdim. Meğerse yazılım mimarisi çatıları içinde böyle ünvan yokmuş. Biraz Netology&amp;rsquo;den söz ettim. Ve netology bu mimari çatısını kurabilir dedim. Sessiz bir tebessüm ile birlikte, &amp;ldquo;önce öğren ve bunu muhakkak dene&amp;rdquo; dedi Ustam Ted!..&lt;/p>
&lt;p>Ted, gerçekten çok iyi bir insan. Kendisi ile padawan ve jedi benzeri bir ilişkimiz var. Beni içinde bulunduğu projeye dahil etti. Şimdilik O&amp;rsquo;nun için araştırmalar yapıyorum. Ve bir dünya belge inceliyorum. Ted kod yazmayı bırakmamı yoksa empati kuramayacağımı söylediği için aynı zamanda bu proje için kodda yazıyorum. Hayran olacağına inandığım bir geliştirme ortamım var. Bir sonraki yazımda bundan söz edeceğim.&lt;/p>
&lt;p>Amerika Internet aşığı bir adam için Hacc yeri gibi. Herşey burada dönüyor. Tanışılacak çok fazla insan ve öğrenilecek çok şey var. Öğrendikçe, senin görüşlerinle demlenecek çoook şey var!. İyi ki varsın Üstad, ve ben iyi ki seni tanımışım. Görüşmek üzere.&lt;/p></content></entry><entry><title>Geliştirme Ortamım</title><author><name/><uri/></author><id>https://hozgan.com/gelistirme-ortamim/</id><updated>2009-05-19T00:00:00Z</updated><published>2009-05-19T00:00:00Z</published><content type="html">&lt;p>İşlerden, güçlerden birazda tembellikten yazamadım üstadım. Projeler projeler diyordum ya sana, tek tek yayına giriyorlar. Hayatımın en önemli kararlarını ve eylemlerini şu 6 ay içerisinde aldım ve de yaptım belki de. Hayal kırıklıklarım da oldu hayallerini yıktıklarım da.&lt;/p>
&lt;p>Uzun süredir üzerinde çalıştığım, framework&amp;rsquo;ten ve üzerinde kullandığım mimarilerden söz etmek isterdim bu yazımda. Ama öncesinde geliştirme ortamımdan ve kullandığım betik dilden söz etmek ve aynı dili konuştuğumuzdan emin olmak istiyorum. (bknz: tereciye tere satmak) Elbette kullandığım teknolojileri ve tasarım kalıpları (pattern) bilinen uygulanmış yöntemler. Ben nasıl bir yenilik getirdiğim ise çok yakında diyerek geliştirme ortamımı anlatmaya geçeyim.&lt;/p>
&lt;p>Bildiğin üzere üstadım, geliştirme ortamım ve aynı zamanda sunucu ortamım performans, güvenlik, maliyet kriterlerimden aldığı iyi notlar ve programcı dostu olduğu için &lt;strong>Linux&lt;/strong>&amp;rsquo;tan yana oldu. Linux ile bir uygulama veya bir eklenti kurmak çalıştırmak ve/veya derlemek çok kolay. Bu kolaylıkları sağlayan Linux dağıtımım ise &lt;strong>Debian&lt;/strong> mimarisi üzerine kurulan &amp;ldquo;İnsan İçin Linux&amp;rdquo; dağıtımı hazırlayan &lt;strong>Ubuntu&lt;/strong>. Aklımdayken, senin önerin ile Mac OS X&amp;rsquo;i PC&amp;rsquo;me kurdum ama kendimi pek özgür hissedemedim. Belki MacOS&amp;rsquo;u bir Apple bilgisayar üzerinde denemediğimdendir ama yinede Linux&amp;rsquo;ta ki özgürlüğün ve esnekliğin gerçek tadı. Ve ben bunu seviyorum.&lt;/p>
&lt;p>Geliştirme yaptığınız diller konusuna pek girmek istemiyorum. Ne de&lt;/p>
&lt;p>olsa hepsi bizi amaca götüren araçlar. Biliyorum siz python seversiniz üstadım ama benim Web Mimarisi örneklerim genellikle PHP ile olacak. :) Sizin örneklerinizinde python ile olduğu gibi. PHP-GTK ile bir masaüstü uygulaması yazabilseniz de varlık sebebi Web&amp;rsquo;tir. Ve ilklerden olmanın en büyük avantajı ise üzerinde bu konuda biriktirdiği deneyimleridir. Özellikle PHP 5.3&amp;rsquo;ten sonra çok daha eğlenceli bir dil olacağını şimdiden söyleyebilirim. Siz ne dersiniz üstadım?..&lt;/p>
&lt;p>&lt;strong>Vi iMproved&lt;/strong> Bunca kelâm ettikten sonra nihayet asıl konuya gelebildim, Metin Editorleri. Editorler konusunda söylenecek çok fazla şey var elbette. Ama benim tercihim &lt;strong>Vim (Vi iMproved)&lt;/strong>&amp;lsquo;den yana olmuştur. Vim birçok özelliği olan harika bir metin editoru. Grafiksel arabirimde çalışan versiyonlarıda mevcut. Eklentiler ile istediğiniz her kıvama sokabilirsiniz. Bazı editorler***** gibi, &amp;ldquo;ne iş olsa yaparım abi&amp;rdquo; modunda bir editor degildir!. Vim&amp;rsquo;in iddiası, &amp;ldquo;konusunda en iyisi benim, yeter ki aklını kullan!..&amp;rdquo; olmuştur. Peki Vim ile neler yapabiliriz? Bit text editör&amp;rsquo;den beklediğinizi ve belki birazda fazlasını yapabilirsiniz. Başlıcaları şöyle sıralayabiliriz;&lt;/p>
&lt;ul>
&lt;li>Kopyala, yapıştır&lt;/li>
&lt;li>Ara, bul, değiştir&lt;/li>
&lt;li>Bulduklarını işaretle.&lt;/li>
&lt;li>Fare ile kullan&lt;/li>
&lt;li>Kod bloklarını aç veya kapa.&lt;/li>
&lt;li>Satır numaralarını göster.&lt;/li>
&lt;li>Aynı ekranda parçalar halinde kodları göster.&lt;/li>
&lt;li>Tablar halinde dosyaları aç.&lt;/li>
&lt;li>Makrolar tanımla.&lt;/li>
&lt;li>Yeni eklentiler ile Vim&amp;rsquo;i daha güçlü bir hale getir.&lt;/li>
&lt;li>Tab&amp;rsquo;a basarak kodu tamamlama.&lt;/li>
&lt;li>Fonksiyonun tanımlandığı yere gitmesi.&lt;/li>
&lt;li>Çalışma ortamındaki dosyaları ağaç şeklinde görebilme.&lt;/li>
&lt;li>Git, Subversion ve CVS ile entegre çalışabilme.&lt;/li>
&lt;/ul>
&lt;p>ve aklıma gelmeyen daha yüzlerce özellik. Sizin için bu özellikleri şurada bir araya topladım. Test ettim ve çalıştırdım. Bu geliştirme ortamına sahip olmak için yapmanı gereken sırasıyla aşağıdaki adımları takip etmek. &lt;strong>XDebug &amp;amp; WebGrind&lt;/strong> &lt;strong>Firefox&lt;/strong>&lt;/p></content></entry><entry><title>Tek Gözlü Devlerin Yönettiği, Ütopik Fısıltılar Korosu</title><author><name/><uri/></author><id>https://hozgan.com/tek-gozlu-devlerin-yonettigi-utopik-fisiltilar-korosu/</id><updated>2009-05-19T00:00:00Z</updated><published>2009-05-19T00:00:00Z</published><content type="html">&lt;p>Başlığı elimden geldiğince bir yığın isim tamlamaları ile yaptım belki bu yazı dikkatinizi çeker diye!. :-) Bugün tatil olması münasebeti ile JWF geliştirmesi ile uğraşırken, takıldığım bir konuda yardım almak için &lt;a href="http://www.yalazi.org">&lt;strong>@yalazi&lt;/strong>&lt;/a>&amp;lsquo;ya müracat ettim. Sohbet sohbeti açtı ve akşam kendisi ile buluştuk.&lt;/p>
&lt;p>Kendisi web çatılarından nefret etmesi münasebeti ile üzerinde çalıştığım JWF&amp;rsquo;i kendisinin beğenisine sundum. Sanırım bu sefer doğru yolda ilerliyorum. :) JWF beni tanıyanlar bilir bir türlü tamamlayamamıştım. Neyse..&lt;/p>
&lt;p>Aslında sohbetimizin en dikkat çeken tarafı, &lt;a href="http://www.yalazi.org/index.php/archives/2009/05/18/on-simulation-reality-prediction/#comments">&lt;strong>blog@yalazi&lt;/strong>&lt;/a> üzerinde bulunan, *&amp;ldquo;On Simulation-Reality Prediction&amp;rdquo;*başlıklı yazısı. Yazı kısaca şundan söz ediyor, dünyadaki herşeyi simüle eden bir yazılım yazsak ve bu yazılım ile gerçek yaşamdan bir anı ve simülasyon yazılımını eş zamanlı çalıştırarak aynı sonuca ulaşırsak, geleceğe dair &amp;ldquo;bazı şeyleri daha yaşanmadan hesaplamak mümkün müdür?&amp;rdquo; sorusunu dile getiriyordu. İşte bizim ütopya fısıltılarımız evrene bu noktadan itibaren yayılmaya başladı..&lt;/p>
&lt;p>Yalazı öyle ilgimi çeken bir konuya parmak basmıştı ki, &amp;ldquo;ütopya master planım&amp;rdquo; diyebileceğim fikrimi paylaştım kendisi ile. Aynı çözümün farklı bir amaç için kullanımından başka birşey değildi bu fikir. Ben de dünyada ki, tüm yaşanmışların modellenebileceğine inananlardanım. Yarı profesyonel olarak ilgilendiğim bir konu olan Öyküleme (Tiyatro, Sinema, Roman) sanatında bazı kalıplar vardır. &amp;ldquo;İki köpek bir kemik&amp;rdquo; (iki adam bir kadın) gibi. Aşağı yukarı aynı öykü üzerine kuruludur bu kalıplar, Bir sorunun birçok çözümü olabilir ama bu çözümler sonsuz değildir. Aynı bir satranç oyunu programlaması gibi olabilecek tüm doğru hamleler bellidir. Bu da bize benim ütopya projeme götürüyor, bir sorun karşısında bizim danışabileceğimiz, doğru yolu seçmek için bize yol gösterecek, &amp;ldquo;Bilgisayar Yaşam Asistanı&amp;rdquo;. Hele günümüzde herkes&amp;rsquo;in elinde PDA benzeri cep telefonları olduğunu ve sürekli nette olduğumuzu düşünürsek bu çok da ütopik gelmiyor insana :)&lt;/p>
&lt;p>Tekrar Yalazı&amp;rsquo;nın yazısına geri dönersem, simülasyon ve gerçekliğin 5 saat sonrasına gittiğimizde aynı sonuç çıkmıyorsa burada oluşan fark kümesi bizim çözüm için gerekli olan yol haritamızı verebilir sanırım. En azından Yalazı&amp;rsquo;nın iddiasından benim anladığım sonuç bu şekilde.&lt;/p>
&lt;p>Peki şimdi anlatılmak isteneni anladıktan sonra bunun mümkün olup olmadığına bir bakalım. Modelleyebilmemiz için ciddi bir veri yığınına ihtiyacımız var. Nasıl böyle bir model içerik oluştururuz diye düşünüyorum bir an ve Internet cevabı ile Arşimet gibi buldum buldum nidaları atıyorum bir an!. Peki nasıl modellenecek, Web 2.0 ve servisleri ile bu veri toplanabilir mi? Evet!. Peki nasıl anlamlandırılacak belki Web 3.0 bir başlangıç olabilir. Peki bize nasıl ulaşacak, iPhone ve Android gibi araçlar ile olması pek muhtemel görünüyor. Peki bunu parametrelere sahip kaç &amp;ldquo;Tek Gözlü Dev&amp;rdquo; tanıyoruz!. Bence bir tane var, O da Google!.. Belki de &lt;a href="http://undergoogle.com/tools/GoogleMasterPlanEN.html">Google&amp;rsquo;ın Master Planı&lt;/a> böyle birşeydir kimbilir :)&lt;/p>
&lt;p>Peki Bilgisayar Bilimlerinde bu konunun hangi başlık adı altında geçtiğini biliyor musunuz?&lt;/p>
&lt;p>&lt;a href="http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470030178,descCd-description.html">Şu kitapta&lt;/a>anlatılan Modeling ve Simulations kavramları olabilir mi?&lt;/p>
&lt;p>Bu kadar ütopik muhabbetten sonra, son birşey daha söylemek istiyorum. Veritabanı programcılığı dışında Bilgisayar Bilimlerinin incelediği konular hakkında konuşmayı çok özlemişim&amp;hellip; Yalazı çok saolsın!..&lt;/p></content></entry><entry><title>Kissa.be v3 Yayında</title><author><name/><uri/></author><id>https://hozgan.com/kissabe-v3-yayinda/</id><updated>2009-04-05T00:00:00Z</updated><published>2009-04-05T00:00:00Z</published><content type="html">&lt;p>&lt;a href="http://kissa.be">Kissa.be&lt;/a> URL kısaltma servisinin yeni sürümü yayına bugün alındı. Joy Web Framework altyapısı kullanılarak yeniden yazıldı. Bu yeni sürüm Joy Web Framework&amp;rsquo;ün lasmanı ile birlikte açık kaynak olarak dağıtılmayaa başlanacak ve bu yeni sürümde birkaç yeni özellik daha eklenmiş olacak!&amp;hellip;&lt;/p></content></entry><entry><title>Microsoft .NET ve Girişimcilik</title><author><name/><uri/></author><id>https://hozgan.com/microsoft-dotnet-ve-girisimcilik/</id><updated>2009-04-05T00:00:00Z</updated><published>2009-04-05T00:00:00Z</published><content type="html">&lt;p>Microsoft; sevsekte sevmesek de, kabullensekte kabullenmesek de dünyanın en iyi yazılım şirketi. Sonuçta Internet servisleri dışında yaptıkları uygulamaların mimarileri (bazen ilk kez yapılmış gibi anlattsalar da) gerçekten çok başarılı. Ama gördüğüm en kötü stratejik kararlarda bu firmadan çıkıyor. Örneğin yıllar önce geleceğin internette olduğunu gören Bill amca, Internet Explorer tekeliyle Netscape&amp;rsquo;i piyasadan silen Bill amca bu sektörde çok başarılı sonuçlar elde edemedi. Yaptığı birçok web uygulaması fiyasko ile sonuçlandı. ASP PHP ile boy ölçüşemedi. Bu Web fiyaskoları, .NET çıkana kadar süre geldi. ASP.NET 2.0 ile birlikte halen eline su döküleceğine şüphe ettiğim çok iyi bir mimariye sahip bir web çatısı oldu. B&lt;/p>
&lt;p>Peki sorun nerede dediğinizi duyar gibiyim? Microsoft bu kadar iyi bir teknoloji yaratıyor, bir sürü döküman ile bu .Net platformunda uygulama geliştirenleri eğitiyor, kalitelerini arttırıyor! Nedeni ise, IIS, Windows ve MSSQL daha çok kullanılsın ve daha çok lisans satılsın diye.&lt;/p>
&lt;p>Peki kaç tane startup, zaten kısıtlı olan sermayesini lisans parasına harcayacağını bile bile asp.net ile  web girişimi yapmıştır. Elimde bilimsel bir veri yok ama bu sayı gerçekten ama gerçekten çok az olduğunu düşünüyorum.&lt;/p>
&lt;p>Bir linux kullanıcısı olarak (Linux gerçekten bir geliştirici için süper bir ortam) asp.net&amp;rsquo;i gerçekten seviyorum. Bir dönem Mono projesinden faydalansam da, sonunda ASP.NET sevdasından vazgeçmek zorunda kaldım. Nedeni mi? LAMP dünyasının çok az bir maliyetinin olması. PHP 5.3 versiyonuyla birlikte, daha fazla C#&amp;lsquo;a a benzeyeceği içinde çok mutluyum. Microsoft bugün bu maliyetleri web girişimcileri için sıfır maliyete çekse gelecekte kazancağı potansiyel müşteri sayısında artış olacağını düşünüyorum.&lt;/p>
&lt;p>Özetle, gerçekten merak ediyorum; Microsoft yöneticileri ve bu şirketin pazar araştırmacıları; neden birçok girişim PHP, Ruby ve Python ile yapıldığını düşünmüyor mu? Bu girişimciler eğer iyi bir fikir buldularsa yatırımlar bulup para harcamaya başlıyorlar. Benim kafama takılan soru şu, hal  böyle iken neden web girişimcileri için MS&amp;rsquo;in ürünleri lisanslı? En azından 1 yıl lisans parası almasa nasıl olur? Belki böyle yapsa asp.net ile gelişen birçok başarılı servis görürüz.&lt;/p></content></entry><entry><title>İçimdeki İnternet Aşkı Bambaşka!..</title><author><name/><uri/></author><id>https://hozgan.com/icimdeki-internet-aski-bambaska/</id><updated>2009-03-02T00:00:00Z</updated><published>2009-03-02T00:00:00Z</published><content type="html">&lt;p>Hava bahardan kalma ve güneş dünyaya gülümsüyordu. Günlerden pazar günüydü. Dışarı çıkma planları yapmış, bloguma yeni bir yazı girişi yapıyordum ki, veritabanı çok fazla bağlantı hatası vermeye başlayınca &amp;ldquo;Ne oluyor laan!&amp;rdquo; cümlesi ağzımdan çıkı verdi. Sunucunu loglarına bakınca saniyede 50-100 arası istek olduğunu görünce saldırı olduğunu düşündüm. (Normalde sunucuma bu kadar istek gelmez!) Sonra incelediğimde sorunun sebebinin kissa.be servisi olduğunu gördüm. Kissa.be yurtdışında az-buçuk tanınan bir servis olduğu için neden bu kadar istek geldiğine baktım. Halen saldırı olduğunu düşünüyordum fakat inceleyince gördümki, kissa.be&amp;rsquo;yi kullanan kişi Çin&amp;rsquo;deki bir Porno Forumuna kissa.be linki vermiş. Ve bu yazıyı yazarken Uniq istek 150.000 civarındaydı. Sunucum ve benim için çok fazla olan bu isteği kara listeye almak istemiyordum. Sonuçta kissa.be bir servisti herşeye garanti veriyordu.&lt;/p>
&lt;p>Peki bu sorunu nasıl çözdüm? Sihirli sözcükleri söylediğinizi duyar gibiyim. Evet Memcached! Hayat kurtaran asrın buluşu icat. Hemen memcache sisteme aktif ettim. İnsert işlemlerinide bir  havuza soktum. SQL sorguları bir havuzda toplu olarak güncelleniyor. Sorun çözüldü böylece, kissa.be servisi icin yapmayi bile dusunmedigim stress testi boylece gerceklesti.&lt;/p>
&lt;p>Evet güzel pazar günüm bu işle uğraşarak gitti. :) Peki pişman mıyım? Hayır! Kızgın mıyım? Evet Kendime kızgınım!. Kodları bu hafta daha ciddi bir şekilde yeniden düzenleyeceğim. Her geçen gün biraz daha şekillenen Joy Framework mimarisine taşımaya karar verdim. İnterneti ve yüzbinlerce (pornocu) insanın farkında olmadan benim sitemi kullanmaları çok eğlenceliydi. Apache log&amp;rsquo;u her an aktığını ne zamandır görmüyordum. :)&lt;/p>
&lt;p>Evet sıradaki sınavlar için  hazırım :)&lt;/p></content></entry><entry><title>Yazılım Mühendisi'nin Şerefi</title><author><name/><uri/></author><id>https://hozgan.com/yazilim-gelistiricinin-serefi/</id><updated>2009-03-01T00:00:00Z</updated><published>2009-03-01T00:00:00Z</published><content type="html">&lt;p>Merhaba Üstad, biliyorum uzun süredir yazamıyorum. Son dönemde yazmak için çok okudum çok araştırdım ama yazmak için ataletimi yenemedim. Öğrendiklerimi yakın zaman içinde seninle paylaşacağım ama öncesinde yaşadığım bir şeyi paylaşmak isterim. Yıllar önce öğrettiğin temel şeylerin öneminin farkına galiba yeni vardım. Unutmamak ve öğrencilerine anlatman için bunu seninle paylaşmak istedim.&lt;/p>
&lt;p>Yakın gelecekte, çaylakların yapmayacağı kadar basit bir hatam ve çok daha büyük bir sonucu oldu. Hatasız yazılım olmaz ama bu hatadan dolayı gerçekten çok utandım. Sonuçta şirketim, bozmak için değil yapmak için kodları bana emanet etmişti. Emanete hıyanet etmiştim. Samurayların böyle bir durumda Harakiri yaptıklarını çokça duymuşuzdur. Bu aslında daha iyi birine yol açmak için yapılır. En iyinin bile en iyisi vardır. Bunu hiçbir zaman unutmamak gerekir. Bu sebeple bende gereğini yaptım ve istifamı verdim. Fakat yöneticim bunu reddetti ve hatımın sebebini sorgulamamı istedi&amp;hellip;&lt;/p>
&lt;p>Profesyonel bir kurumda işinizi yapar ve karşılığınızı alırsınız. Bulunduğunuz pozisyondan dolayı kibir ve özgüveniniz gereksiz büyüyebilir ve basit hataları farketmemize engel olur. İşte bendeki en büyük sorun buydu. Bir yazılım geliştiricisi için en büyük tehlike fazla özgüven ve kibirdir. Çünkü diğer önemli kuralları gözden geçirmenize engel olur. Üstadım evet sende hiç kibir ve ego görmedim hiçbir zaman. Ama öğrencilerine ilk anlatman gerek şey bu olmalı. Yoksa benim yaşadığım utanç verici duruma düşebilirler.&lt;/p>
&lt;p>Yazılım geliştiricisinin diğer görevlerini de, burada yazmak istiyorum. Bu maddelerin üzerine elbet eklentiler yapacağım ve/veya içinden bazı maddeleri çıkaracağım. Yol haritam olacak bu maddeleri bir daha unutmayacağım. Şimdi bu maddeleri burada tekrar hatırlayalım.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Alçak gönüllülük; bildiklerim denizde bir damla kadar ve daha öğrenilecek çok şey var ve biliyorum ki her zaman benden daha iyisi var. Kıstasım her zaman daha iyi olan olmalıdır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Okunabilirlik (readability); Yazılan kod herkes tarafından anlaşılabilir olamalı. Karmaşık kodlardan kaçılınılmalı. İsimlendirmeler öyle uygun olmalıki ne işe yaradıklar hakkında fikir vermeli. Yorum satırları olmalı. Kod standardına uygun yazılmalı.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Verimlilik (efficiency); Uygulamanın hızını yavaşlatabilecek hatalı algoritma ve mantıklardan kaçınılmalı. Method çağrıları &amp;lsquo;profiler&amp;rsquo; araçları ile incelenmeli.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Nesnellik (objectivity);&lt;/p>
&lt;ul>
&lt;li>Yapısallık (structurally); Veri bütünlüğünü doğru bir şekilde parçalamak ve yönetmek için kullanılır. Doğru veri bloklarına doğru işler yapması sağlanabilir. İş parçalarını doğru yönetmek ve dağıtmak için iyi bir yöntemdir. Özellikle Handler mekanizmalarıyla hayata giren &lt;em>&amp;ldquo;tek giriş ve tek çıkış&amp;rdquo;&lt;/em> sağlamak gibi tekniklerle.&lt;/li>
&lt;li>Bölümlere Ayırma (Modularity); Kod ilgilerine göre bölümlere ayrılabilmelidir.&lt;/li>
&lt;li>Tekrar Kullanılabilirlik; Kod tekrarı yapmak en büyük günahlardan biridir. Kodun tasarımında tekrar yapılması kesinlikle engellenmelidir.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Güvenlik (security); Güvenlik açığı oluşturulabilecek sorunlar tespit edilmeli ve kod içerisinde gereği yapılmalıdır. Güvenlik söz konusu olduğunda verimlilik ve hızdan bir miktar taviz verilmesi doğaldır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Taşınabilirlik (portability); Uygulama; platform geçişlerine minimum değişiklik ile geçirilebilmelidir. Bunlara örnek, C kodlarındaki değişken veri tiplerinin uzunlukları ve işletim sistemine özel fonksiyon çağrıları verilebilir. Ya da uygulamada veritabanı değişikliğinde mevcut kodların en az seviyede etkilenmeside taşınabilirlik için iyi bir örnektir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Esneklik (Flexibility); K.I.S.S. kuralına göre kod olabildiğince basit tasarlanmalıdır. Çevik yöntemlerse, geleceği düşünerek kod yazmak bir hatadır. Fakat bunu  düşünememek demek değişikliği yok saymak demek değildir. Bu sebeple uygulamanın kodları basit ve esnek olmalıdır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Yeterlilik; Uygulamayı ve değişikliğin etkilerini iyi bilmek gerekir. Değişikliğin etkilediği yerler çıkartılabilmelidir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Test edilebilirlik; TDD ile hayatın kod geliştirme döngüsünün içinde olmazsa olmaz bir parçası haline gelmiştir.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Benim temel ilkelerim bunlar üstadım; Eklemek ve düzeltmek istediğin bir şey varsa sabırsızlıkla cevabını beklemekteyim.&lt;/p></content></entry><entry><title>PHP 6'da Olması Gereken Özellikler</title><author><name/><uri/></author><id>https://hozgan.com/php6da-olmasi-gereken-ozellikler/</id><updated>2008-12-04T00:00:00Z</updated><published>2008-12-04T00:00:00Z</published><content type="html">&lt;p>Hayalini kurduğum framework için çıktığım yolda hergün yeni şeyler öğreniyorum. İtiraf etmem gerekiyorki ASP.NET mimarisinden çok etkilendim. Yazılım mimarileri ile uğraştığımdan dolayı sanırım C# diline ayrı bir sempatim var. Her açıdan çok iyi tasarlanmış bir dil. PHP&amp;rsquo;de web için biçilmiş kaftan fakat nesne yönelimli mimariler geliştirirken çok eksik olduğunu görüyoruz. Neden C# değilde PHP yazdığım sorusu aklınıza gelebilir. Bunun en büyük sebebi, C# projesinin Windows gibi baş ağrıtan kötü bir işletim sistemi üzerinde koşması geliyor. Mono ile daha önce bir web projesi geliştirmiş biri olarak yetersiz olduğunu söyleyebilirim. Bu yazıda PHP6&amp;rsquo;da olması gerektiğini düşündüğüm özelliklerden söz edeceğim. Öncesinde küçük bir araştırma yaptım. Benim gibi PHP6 beklentileri olanlar var mı diye? &lt;a href="http://www.stubbles.org/authors/1-Stephan-Schmidt">Stephan Schmidt&lt;/a>&amp;lsquo;in 6 parçadan oluşan &lt;a href="http://www.stubbles.org/archives/5-My-wishlist-for-PHP-6,-pt1-The-object-type-hint.html">y&lt;/a>&lt;a href="http://www.stubbles.org/archives/7-My-wishlist-for-PHP-6,-pt2-Namespaces.html">a&lt;/a>&lt;a href="http://www.stubbles.org/archives/8-My-wishlist-for-PHP-6,-pt3-Annotations.html">z&lt;/a>&lt;a href="http://www.stubbles.org/archives/15-My-wishlist-for-PHP6,-pt4-static-initializers.html">ı&lt;/a>&lt;a href="http://www.stubbles.org/archives/19-My-wishlist-for-PHP6,-pt5-extphar.html">s&lt;/a>&lt;a href="http://www.stubbles.org/archives/24-My-wishlist-for-PHP6,-pt6-improvements-to-extreflection.html">ı&lt;/a> görmeliler.&lt;/p>
&lt;ol>
&lt;li>Namespaces&lt;/li>
&lt;li>Annountions&lt;/li>
&lt;li>Type Hint&lt;/li>
&lt;li>Reflection&lt;/li>
&lt;li>Delegate &amp;amp; Event &amp;amp; Lambda&lt;/li>
&lt;li>Function overloading&lt;/li>
&lt;li>Properties (Variable Get/Set)&lt;/li>
&lt;li>Extensions Methods &amp;amp; Partial Class&lt;/li>
&lt;/ol>
&lt;h3 id="1-namespaces">1. Namespaces&lt;/h3>
&lt;p>Eğer bir framework yazıyorsanız birbirine benzeyen sınıf isimleri olması çok doğaldır. Bu durumlarda namespace&amp;rsquo;ler olması çok işe yarar. Neyse ki PHP 5.3&amp;rsquo;ten itibaren gelecek olan bir özellik. (Ref. &lt;a href="http://marc.info/?l=php-internals&amp;amp;m=118355320225178&amp;amp;w=2">http://marc.info/?l=php-internals&amp;amp;m=118355320225178&amp;amp;w=2&lt;/a>)&lt;/p>
&lt;h3 id="2-annountions">2. Annountions&lt;/h3>
&lt;p>C#&amp;rsquo;ta buna Attribute denir. Amaç kod içine meta veriler sokmaktır. Ve bu verileri Reflection yöntemiyle dinamik olarak okuyarak işleme tabii tutmaktır. Bir örnek ile açıklamak gerekirse, MVC yapısı kurduğumuzu düşünün. Her sınıfın bir sayfa her methodununda action/view işlemini yaptığını varsayalım. Action bazlı sayfa giriş yetkilendirmesine ihtiyacımız var. Bu sayfa eğer ödeme sayfası ise, sadece https olarak erişilmesi gerekiyor. Bunuda bir şekilde belirtmek gerekir. İşte bu gibi ihtiyaçları tanımlamak için annountions özelliğine ihtiyacımız var. Henüz resmi olarak desteklenmesede PHP genişletmeleriyle eklenebilir.&lt;/p>
&lt;pre tabindex="0">&lt;code>@SimpleAnnotation
@SingleValuedAnnotation(true)
@SingleValuedAnnotation(-3.141592)
@SingleValuedAnnotation(&amp;#39;Hello World!&amp;#39;)
@SingleValuedAnnotationWithArray({1, 2, 3})
@MultiValuedAnnotation(key = &amp;#39;value&amp;#39;, anotherKey = false, andMore = 1234)
&lt;/code>&lt;/pre>&lt;p>(Ref. &lt;a href="http://code.google.com/p/addendum/">http://code.google.com/p/addendum/&lt;/a>)&lt;/p>
&lt;h3 id="3-type-hint">3. Type Hint&lt;/h3>
&lt;p>Method parametreleri veya değişken tanımlarında, değişkenin tipini yazmak hem okunabilirliği arttırır. Hem de editörlerin kod tamamlama özelliğini daha sağlıklı yapılmasına imkan sağlar. Ayrıca hata yakalama işlemlerinde de büyük kolaylık sunar.&lt;/p>
&lt;h3 id="4-reflection">4. Reflection&lt;/h3>
&lt;p>Reflection dinamik olarak kod içerisinde gezinebilmeyi, kodu kısmen değiştirebilmeyi sağlar. Mesela; MVC&amp;rsquo;deki authentication işlemlerini sayfa sınıfının protected olan methodları için yap diyebiliriz.&lt;/p>
&lt;pre tabindex="0">&lt;code>self::set_module_name($class_name);
self::set_action_name($method);
eval(&amp;#34;$class = new $class_name();&amp;#34;);
$reflect = new ReflectionMethod($class_name, $method);
if ($reflect-&amp;gt;isProtected()) {
$class-&amp;gt;authentication();
}
call_user_method_array($method, $class, $method_arguments);
&lt;/code>&lt;/pre>&lt;p>Ayrıca reflection&amp;rsquo;lar sayesinde &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection">Dependency Injection&lt;/a> diye adlandırılan mimariler yaratabiliriz. Dependency Injection, Bir kod parçasına dışarıdan müdahale etmek demektir. Örneğin bir scheduler uygulaması yazacaksınız. Bu schedulera &amp;ldquo;şu sınıfın şu methodunu&amp;rdquo; çalıştır demek için kullanabilirsiniz. (Ref. &lt;a href="http://tr2.php.net/reflection">http://tr2.php.net/reflection&lt;/a>)&lt;/p>
&lt;h3 id="5-delegate--event--lambda">5. Delegate &amp;amp; Event &amp;amp; Lambda&lt;/h3>
&lt;p>Delegate kavramı C# ile beraber hayatımıza girmiştir. Aslında C programcılarının bildiği gibi delegate&amp;rsquo;ler, fonksiyon göstericileridir. C# gibi dillerde sınıflar arasında global kavramı olmadığı için bir sınıftan diğerine mesaj yaptırmak gerekebiliyor bazı durumlarda. İtiraf etmem gerekir ki bu bizi event mimarilerine ve lambda operatörüne götürür. Delegate kullanımı C&amp;rsquo;deki prototip tanımlanması gibidir.&lt;/p>
&lt;pre tabindex="0">&lt;code>public delegate function int myDelegate(int $x);
&lt;/code>&lt;/pre>&lt;p>Bu şu anlama gelir. Geri dönüş değeri int olan ve parametresi int olan fonksiyonu işaret et. Görüldüğü üzere bu tanım bize başka bir ihtiyaç daha doğurur. &lt;strong>type hint&lt;/strong> ve &lt;strong>method signs&lt;/strong>kavramları. Dinamik bir dilde bu kadar tip güvenli kod rahatsız etmiş olabilir. C# dilinde bunun çözümü lambda operatörüdür. Lambda, kısaca değişken olarak tanımlanabilen process blockları demektir. İstenilen yerde yaratılır ve öldürülür.&lt;/p>
&lt;h3 id="6-function-overloading">6. Function overloading&lt;/h3>
&lt;p>Fonksiyon yazarken farklı parametrelerle aynı method adıyla yazabilme durumudur function overloading. Bilindiği üzere PHP dilinde parametre sınırı yok. İstenildiği kadar parametre girilebilir. Bu parametrelerin dinamikliği sayesinde, aynı method ismi ile farklı parametrelerde &lt;strong>func_get_arg&lt;/strong> alınabilir. Fakat okunabilirliği zorlaştıracak bir kod bloğu oluşmasına sebep olur. Bunu desteklerken bu dinamik yapının kaldırılmasını elbette istemeyiz. Method overloading yapabilmek için methodların imzasını tutmak gerekir. Bu imza parametrelerin tipleri ve geri donus deger tipleri ile birlikte oluşturulur.&lt;/p>
&lt;pre tabindex="0">&lt;code>int function fonk(int $b);
int function fonk(int $b, string $c);
&lt;/code>&lt;/pre>&lt;p>Yukarıdaki örnek PHP&amp;rsquo;de syntax hatasına sebep olur.&lt;/p>
&lt;h3 id="7-properties-variable-get--set">7. Properties (Variable Get / Set)&lt;/h3>
&lt;p>Properties kavramı C# dilinde kullanılan Cross-Cutting yada Aspect oriented denilen bir teknolojidir. Amacı sınıf değişkenlerinin aldığı değerlerin arasına girmenin bir yolunu bulmaktır. Özellikle get ve set işlemlerinin arasına girmek türetilen sınıflarda overloading yöntemi ile farklı bir şekilde değer atanmasını veya değer kontrolunun yapılması burada sağlanabilir.&lt;/p>
&lt;pre tabindex="0">&lt;code>private $_item;
public property $Item {
get { return $this-&amp;gt;_item; }
set{ $this-&amp;gt;_item = value; }
}
$this-&amp;gt;Item = 4;
&lt;/code>&lt;/pre>&lt;p>Yukarıdaki kod blogu gibi olmasada &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">AOP&lt;/a> yontemiyle dolaylı olarak yapabilmek mümkün. Bunun için &lt;a href="http://phpaspect.org">PHP Aspect&lt;/a>&amp;rsquo;ten faydalanılabilir.&lt;/p>
&lt;h3 id="8-extensions-methods--partial-classes">8. Extensions Methods &amp;amp; Partial Classes&lt;/h3>
&lt;p>Aslında bu iki özellik betik(script) olan bir dilde ne gerek var diye düşünebilirsiniz. Bu iki özellikte özellikle projelere dahil olan 3. parti yazılımların bakımını yaparken çok işimize yarar. Genellikle 3. parti yazılımları projenin içine dahil ederken ufak değişiklikler yapar ve projeyi bir bakıma çatallamış (fork) etmiş oluruz. Yeni versiyon geçişlerinde ise sıkıntı yaşarız. Bunu engellemek için başka bir yerde bu 3. parti yazılımların sınıflarını genişletebilsek (partial class) veya methodlarını aşırı yükleye bilsek (extensions methods) hayat daha güzel bir hale gelebilir. Peki bunu nasıl yaparız?&lt;/p>
&lt;pre tabindex="0">&lt;code>extend function string::is_null(string $value) {
return ($value == null);
}
&lt;/code>&lt;/pre>&lt;p>Yukarıdaki şekilde tanımlanabilir. string nesnesi için is_null adında bir method eklenmiş olur. Ve aşağıdaki şekilde çalıştırılabilir.&lt;/p>
&lt;pre tabindex="0">&lt;code>string $a = &amp;#34;merhaba&amp;#34;;
if ($a::is_null()) {
// biseyler yap
}
&lt;/code>&lt;/pre>&lt;p>Partial class yapısı ise, bir sınıfı içeriğini bir parçasını aynı isimde başka bir sınıfı tanımı yaratarak onun içine atamak demektir. Bakıldığında partial class ile extensions methods&amp;rsquo;ların bir farkı olmayabilir. C# kendi tasarımlarında partial classlar aynı assembly (paket) içerisinde olmasını ön koşul olarak koşar. Fakat bu durum extensions method mimarisinde zorunlu değildir. Elbette bu iki özellik birleştirilerek daha iyi tasarlanabilir. Benim PHP&amp;rsquo;nin yeni versiyonundan beklediklerim aklıma geldiği kadarıyla bu şekilde. Aslında bunların bir kısmı PHPv6 ya alındı. Bir kısmı ise bekliyor. Daha detaylı bilgiye, Derick Rethans&amp;rsquo;ın &lt;a href="http://www.php.net/~derick/meeting-notes.html">toplantı notları&lt;/a>nda bulabilirsiniz. Bu konu ilginizi çektiyse, toplantı notlarının yapılacak listesine ve hangilerinin yapıldığına &lt;a href="http://wiki.pooteeweet.org/PhP60">buradan&lt;/a> erişebilirsiniz. Benim aklıma gelenler şimdilik bunlar. Programlama dillerine ve Nesneye Yönelimli PHP&amp;rsquo;ye yönelik yazılarımı öğrendikçe burada paylaşmaya devam edeceğim&amp;hellip;&lt;/p></content></entry><entry><title>Kendime bir dost(asus eee-pc 1000h) edindim</title><author><name/><uri/></author><id>https://hozgan.com/kendime-bir-dosy-edindim/</id><updated>2008-11-30T00:00:00Z</updated><published>2008-11-30T00:00:00Z</published><content type="html">&lt;p>Laptop&amp;rsquo;larım sürekli peşimde oldukları için bugüne kadar gölge ismini veriyordum. Lakin, iPhone sahibi olunca özelliklerinden dolayı iPhone&amp;rsquo;uma gölge adını koydum. Emektar dizüstü btilgisayarımda bana son bir kazık atınca ve bir e-ticaret siteside kuru sabitleyince dizüstünü değiştirmem zamanı geldiğini anladım. iPhone gölge adını alınca yeni bilgisayarıma da dost anlamına gelen buddy kelimesini uygun gördüm.
&lt;img src="/files/2008/11/asuseeepc.jpeg" alt="/files/2008/11/asuseeepc.jpeg &amp;ldquo;asus eee&amp;rdquo;">&lt;/p>
&lt;p>Şimdi biraz dostumdan söz edeyim. Üzerinde Intel Atom işlemci, 1GB ram ve 160gb&amp;rsquo;da disk var. Beyaz bir kasanın içinde çok karizmatik olduğunu itiraf etmeliyim. 1.4 kg ağırlığındaki bu dost hiç bana yük olmuyor :) 6 hücreli pili ile yarı yolda bıraktığıda olmadı. Tuşlar normal laptop tuş boyutlarına çok yakın. Sadece alışkanlıklarınızı değiştirmeniz gerekecek. Ben 1 hafta içinde bu klavye düzenine alıştım.&lt;/p>
&lt;p>Yeni dostum ile tek anlaşamadığım konu ise sürücülerini Linux gibi işletim sistemleri tanıyamadığı için Windows XP Home edition ile gelmiş olması idi. Fakat Windows&amp;rsquo;u sevmediğim gibi x2 kat daha fazla home edition&amp;rsquo;dan nefret ediyorum. Acaba lisans para iadesi istesem alabilirmiyim.&lt;/p>
&lt;p>Neyse efendim dostum biraz sızlansada ubuntu 8.10&amp;rsquo;u kurdum. Lakin generic kernel wireles&amp;rsquo;ı bulamadı. Nette biraz araştırma yapınca ubuntu seven hacker abilerimizin, dostum için özel bir kernel derlediklerini öğrendim. Ve hemen o kernel&amp;rsquo;a geçtim. Tabii siz isterseniz bu kernel&amp;rsquo;ın varsayılan olduğu birkaç dağıtımda&lt;a href="http://www.eeebuntu.org/" title="eeebuntu">*&lt;/a>&lt;a href="http://www.ubuntu-eee.com/" title="ubuntu-eee">*&lt;/a> mevcut.&lt;/p></content></entry><entry><title>Web Geliştiricileri İçin Firefox Eklentileri</title><author><name/><uri/></author><id>https://hozgan.com/web-gelistiricileri-icin-firefox-eklentileri/</id><updated>2008-11-30T00:00:00Z</updated><published>2008-11-30T00:00:00Z</published><content type="html">&lt;p>Aşağıdaki listede, web geliştiricisi olarak hayatımı kurtaran Firefox eklentilerini bulabilirsiniz. Sizin de vazgeçemediğiniz eklentiler varsa burada paylaşırsanız çok sevinirim.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6683">FireCookie&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.firephp.org/">FirePHP&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5369">YSlow!&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3504">Zotero&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/271">ColorZilla&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3408">Abduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/539">MeasureIt&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2104">CSS Viewer&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/9527">Ubiquity&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748">GreaseMonkey&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6647">HttpFox&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2063">TimeStamp Convertor&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60">Web Developer&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4810">Speed Dial&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5721">Fast Dial&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/59">User Agent Switcher&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5081">TwitterFox&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/722">No Script&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/684">Fire FTP&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/216">Venkman Javascript Debugger&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/125">Proxy Switcher&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2464">FoxyProxy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/249">Html Validator&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/315">View Cookies&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/967">Modify Header&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1333">Quick Locale Switcher&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1743">lori (Life-of-request info)&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry><title>PHP ile Dinamik Method Çağrıları</title><author><name/><uri/></author><id>https://hozgan.com/php-ile-dinamik-method-cagrilari/</id><updated>2008-10-02T00:00:00Z</updated><published>2008-10-02T00:00:00Z</published><content type="html">&lt;p>Dinamik method çağrısı, parametrelerinin uzunluğunu bilmediğiniz bir methoda çağrı yapmak için kullanılır. Hangi durumlarda buna ihtiyacımız olur derseniz; MVC&amp;rsquo;ler buna iyi bir örnektir. Yazımın ikinci bölümünde söz edeceğim dinamik obje yaratma durumlarındada çok işe yararlar. Peki az laf çok örnek yaparak konuyu özetleyeyim. Diyelim ki; &lt;a href="http://example.com/">http://example.com/&lt;/a>&lt;strong>blog/categories/200810/general&lt;/strong> yukarıdaki gibi bir çağrıyı doğru şekilde yönlendirmemiz gerekiyor. İşte böyle bir durumda dinamik method çağrısı çok işe yarar.&lt;/p>
&lt;p>&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">blog&lt;/span> &lt;span style="color:#cf222e">extends&lt;/span> &lt;span style="color:#1f2328">controller&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">function&lt;/span> &lt;span style="color:#6639ba">categories&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$date&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#953800">$cat_name&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a">// ....
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">&lt;/span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
Peki bunu nasıl yapıyoruz?&lt;/p>
&lt;ul>
&lt;li>call_user_func&lt;/li>
&lt;li>call_user_func_array&lt;/li>
&lt;li>call_user_method&lt;/li>
&lt;li>call_user_method_array&lt;/li>
&lt;/ul>
&lt;p>Yukarıdaki 4 fonksiyon adı (anahtar kelime) yeterlidir sanırım. Peki yukarıdaki örneğimizde bu çağrı nasıl yapılıyor ona bakalım. URL parse edildikten sonra; &lt;strong>call_user_method_array&lt;/strong>(&lt;strong>$method&lt;/strong>, &lt;strong>$class&lt;/strong>, &lt;strong>$args&lt;/strong>); method çağrısı ile gerçekleştirebilirsiniz. call_user_xxx methodlarını &lt;strong>__construct&lt;/strong> methodu için kullanamazsınız. Yani olurda benim gibi dinamik olarak obje yaratmak isterseniz bu methodlar işe yaramaz. İşte bu durumlarda işinize yarıyacak bir method örneği vereceğim. $db-&amp;gt;comment = &lt;strong>using&lt;/strong>(&amp;ldquo;dal.comment&amp;rdquo;, $db); Biraz methodun ne yaptığını açıklamam gerekir sanırım. Biliyorsunuz PHP 5.3 ile beraber namespace kavramı hayatımıza girdi. Kendi geliştirmekte olduğum framework&amp;rsquo;te &lt;strong>import&lt;/strong> işlemleri için çok basit bir şekilde çalışan bir namespace sistemi oluşturdum. using ile ise; aynı isime ait iki sınıf, kazaren çakışması durumunu engellemek için yazmıştım. İlk parametre sınıfın paket bilgisi ikincisinde ise, &lt;strong>__construct&lt;/strong>methodunun aldığı parametreler söz konusu. İşte bu işi &lt;strong>call_user_XXX&lt;/strong> kullanmadan yapmanın yolu;&lt;br>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-php" data-lang="php">&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">function&lt;/span> &lt;span style="color:#6639ba">using&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$class&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">require_once&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#1f2328">_get_class_path&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$class&lt;/span>&lt;span style="color:#1f2328">));&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">$class_name&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">_find_class_name&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$class&lt;/span>&lt;span style="color:#1f2328">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">$args_count&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">func_num_args&lt;/span>&lt;span style="color:#1f2328">();&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">$args&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> &lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$i&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#953800">$i&lt;/span> &lt;span style="color:#0550ae">&amp;lt;&lt;/span> &lt;span style="color:#953800">$args_count&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#953800">$i&lt;/span>&lt;span style="color:#0550ae">++&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">eval&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0a3069">$arg_{&lt;/span>&lt;span style="color:#953800">$i&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> = func_get_arg(&lt;/span>&lt;span style="color:#0a3069">$i&lt;/span>&lt;span style="color:#0a3069">);&amp;#34;&lt;/span>&lt;span style="color:#1f2328">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">$args&lt;/span> &lt;span style="color:#0550ae">.=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0a3069">$arg_{&lt;/span>&lt;span style="color:#953800">$i&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">,&amp;#34;&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">$args&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">rtrim&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#953800">$args&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;,&amp;#34;&lt;/span>&lt;span style="color:#1f2328">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">eval&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#0a3069">$obj&lt;/span>&lt;span style="color:#0a3069"> = new &lt;/span>&lt;span style="color:#0a3069">$class_name&lt;/span>&lt;span style="color:#0a3069">(&lt;/span>&lt;span style="color:#0a3069">$args&lt;/span>&lt;span style="color:#0a3069">);&amp;#34;&lt;/span>&lt;span style="color:#1f2328">);&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#953800">$obj&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p></content></entry><entry><title>Google bir "Arama Motoru"dur</title><author><name/><uri/></author><id>https://hozgan.com/google-bir-arama-motorudur/</id><updated>2008-09-03T00:00:00Z</updated><published>2008-09-03T00:00:00Z</published><content type="html">&lt;h2 id="google-hikayesi">Google Hikayesi&lt;/h2>
&lt;p>2002&amp;rsquo;de ben askerdeyken ilk kez duymuştum &lt;a href="http://www.google.com">Google&lt;/a> kelimesini. Basit arayüzlü ve son derece hızlı arama sonuçlarını getiren bir arama motoruydu. O yıllarda askerde olduğumdan çok üstünde durmamıştım. Askerliğimi bitirip, web dünyasına bulaşınca çok daha önemli olmaya başladı. O kadar önemliydi ki, insanlar sitelerinin aramalarda üst sıralara çıkması için Google&amp;rsquo;ın PageRank algoritmasını kurcalayan insanlar, bağlantı değişimi (link-exchange) yapıyorlardı. İnternet üzerinde bulunabilir olmak çok önemli olmaya başladı.
Gelir modellerini reklam üzerine kuran bu firmanın sitesinde reklamlar sadece metin tabanlı idi. Ama bir ayrıcalığı varda aranılan kelime ile orantılıydı. Böylece, aranılan kelime üzerinden gelir elde etmeye başladılar. Ama reklam veren bazı şirketler için , damlaya damlaya göl olur atasözünü hatırlayarak, o zamana kadar yapılmayan birşeyi yaptılar. Reklam aracıları sadece ciddi hit alan sitelere reklam veriyorlardı. Google bu sebeple ve &amp;ldquo;damlaya damlaya göl olur&amp;rdquo; atasözünüde göz önünde bulundurarak küçük, büyük tüm site sahipleri (yayıncılar)nin reklam gelirinden pay vererek sitelerine reklam almalarını sağladılar. Reklam veren müşterilerin paralarının hakk etmek için kötü niyetli kişileri anlayan algoritmalar geliştirdiler. Böylece, çok değerli bir firma oldular.&lt;em>(Bu modeli borsaya açıldıklarında da kullandılar ve küçük yatırımcılarla da hisselerini paylaştılar)&lt;/em>&lt;/p>
&lt;p>Reklam verenlerin en doğru hedef kitleye ulaşması için, 2004 yılında davet yoluyla kullanıcıların üye oldukları bir eposta sistemi kurdular. Gmail adını verdikleri bu epostanın arabirimi çok kullanışlı idi. Javascript ustaları ajax&amp;rsquo;ı o kadar iyi kullanıyorlardı ki, halen daha iyi bir eposta istemcisi yok! Unutmadan eposta servisleri 1-5 mb kota verirken, Google gb&amp;rsquo;lik kotalarla dikkatleri üzerine çekti. Borsaya açıldıklarında bu şirket bir efsane olmuştu. Balon olmadıklarını tüm dünyay kanıtlamışlardı. Ve arama üzerine, iş modellerini geliştirmeye devam ettiler. Filmlere ve sözlüklere giren bir marka haline geldiler. Ayrıca &amp;ldquo;Şeytanlık Yapma&amp;rdquo; ve imkansız denilen şeyleri yapmalarından dolayı bir çok insanın saygısını kazandılar. (Google Print) Ama Google her yaptıkları şey arama motoru iş modeline dayanıyordu. 2006 yılından sonra Youtube vb servisleri kendi bünyelerine katmalarıyla her geçen gün dahada büyüdüler. İnternet&amp;rsquo;in abisi dediğimiz bir firma haline geldi. İnsanlar bu şirketin master planı üzerine komple teorileri geliştirmeye başladı. İnsanların profillenmesi vb konularda sürekli konuşuldu durdu.&lt;/p>
&lt;h3 id="tekelleşme">Tekelleşme&lt;/h3>
&lt;p>Son 2 yılda çıkardıkları servislerle arama motoru kimliğinden bir internet şirketi kimliğine bürünmeye başladılar. Google&amp;rsquo;ın Adsense adını verdiği reklam teknolojisi yüzünden birçok teknoloji etkilendi. Bloglar daha belirgin hale geldi. Kaliteli yazılar yazıldı. Ama sonra iş çığrından çıktı ve Google&amp;rsquo;ın adsense interneti kirletmeye başladı. Çünkü arama sonuçlarına ve SEO denilen yeni iş türü yüzünden kötü içerikler ve aradığınızı bulamadığınız bir yığın kalitesiz içerik yaratıldı.
Özellikle çıkardıkları son 2 web sitesi ile Google&amp;rsquo;a karşı endişelerim arttı. Google internet&amp;rsquo;in efendisi sahibi olmaya çalışıyordu. Açık kaynak fikrini en iyi kullanan şirket olma yolunda adımlar attı. (bknz: OpenSocial, Android vb..) Yeni bir fikri olan şirketi ya satın oluyor ya da açık kaynak bir platform altında kuralları kendileri koymaya çalışyorlardı. Ama bardağı taşıran son damla Knol ve Chrome oldu.
Knol, wikipedia&amp;rsquo;ya alternatif olarak ortaya çıkarttılar. Wikipedia ciddi bir kültür olmuştu. Kutsal bir bilgi kaynağı. Şimdi soruyorum topluluklara destek veren bir şirket neden, bu platforma destek olmak yerine
böyle bir servis yayına açtı???
Chrome ise daha da ilginç, 4 büyük web tarayıcısının iyi özelliklerinin kendinde toplayan bir tarayıcı çıkarttılar. İşin ilginci web geliştirici ve tasarımcıları 4 büyük arama motorunda da düzgün görüntülenen stiller yazmak için CSS-Hack adını verdikleri yöntemler geliştirmişlerken. Aklıma takılan bir diğer soru ise şu; neden Google bir çok insanın saygısını kazanan Firefox, herkes tarafından beğenilen tek sorunu fazla hafıza tüketmek olan bu kültürle beraber yürümek ve bu platforma destek olmak yerine bir çok açığa sahip bir arama motoru çıkarttı? Açıklar elbette kapatılacaktır sorun bu değil ama neden Mozilla Vakfı&amp;rsquo;na destek olma yolunu seçmedi?
Bunu en güzel açıklayanlardan biri, &lt;a href="http://tech.groups.yahoo.com/group/YazilimMuhendisligiTurkiye/">Türkiye Yazılım Mühendisliği Yahoo Eposta Grubunda&lt;/a>, &lt;a href="http://www.cybersoft.com.tr">CyberSoft&lt;/a>&amp;lsquo;un kurucusu Semih Çetin&amp;rsquo;in tespitleri.&lt;/p>
&lt;ol>
&lt;li>Chrome, Safari ile ayni rendering engine&amp;rsquo;i (WebKit) kullanmakta. Belki Google-Apple arasinda bir isbirligi mumkun. Kime karsi? IE.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;/li>
&lt;li>Chrome; orijinal kaynak kodu olarak bir Visual Studio 2005 projesi. Ilk hedeflenen platformlar Windows XP ve Windows Vista. Kime karsi? IE.&lt;/li>
&lt;li>Chrome&amp;rsquo;un en onemli ozelliklerinden birisi en hizli JavaScript engine&amp;rsquo;i hedeflemis olmasi. Kime karsi? IE ve FireFox.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;/li>
&lt;li>Chrome&amp;rsquo;un bir baska temel ozelligi desktop uygulamalarini tamamen bir Web tarayici ile ortadan kaldirmak. Kime karsi? MS.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;/li>
&lt;li>IE 8 bunyesinde daha once hedeflenen bir plan dahilinde arama motorlari ile elde edilen gelirlerin sinirlandirilmasi dusunulmekte. Kime karsi? Google.&lt;/li>
&lt;li>iPhone ile Apple; mobil dunyasindaki Web tarayicisi kullaniminda standardlari oldukca yukseltti. Kime karsi? MS, Nokia, Samsung ve BlackBerry.&lt;/li>
&lt;/ol>
&lt;p>Kesinlikle rekabete ve yeniliğe karşı değilim. Bu gibi yaklaşımlar kalite ve rekabet için gerekli ama. Google&amp;rsquo;ın yaklaşımı biraz tekel olma çabası gibi geliyor.&lt;/p>
&lt;p>Bu sebeple, bir arama motoru olan Google&amp;rsquo;ın diğer tüm servislerini boykot ediyor ve sizide buna davet ediyorum. &lt;em>&lt;strong>İnternet kimsenin malı değildir.&lt;/strong>&lt;/em> &lt;em>Lütfen, Chrome &lt;strong>kullanmayın&lt;/strong>.&lt;/em> Sitenizi Chrome&amp;rsquo;a uygun bir hale getirmeyin. Eğer bir internet kullanıcı iseniz, açıklarla dolu bu web tarayıcısını makinenize &lt;strong>kurmayın&lt;/strong>***!***Firefox&amp;rsquo;a katkıda bulunun.&lt;/p>
&lt;p>Eğer benim gibi Google&amp;rsquo;ın arama dışındaki servislerini kullanmaya karar verdiyseniz. Google servislerine alternatif birkaç açık kaynak servis önereceğim.&lt;/p>
&lt;h3 id="google-servislerine-alternatif">Google Servislerine Alternatif&lt;/h3>
&lt;ul>
&lt;li>Google Reader =&amp;gt; &lt;a href="http://tt-rss.org/">Tiny Tiny RSS&lt;/a>&lt;/li>
&lt;li>Google Calendar =&amp;gt; &lt;a href="http://sourceforge.net/projects/webcalendar">WebCalendar&lt;/a>&lt;/li>
&lt;li>Google Web Analytics =&amp;gt; &lt;a href="http://www.piwik.org">Piwik&lt;/a>&lt;/li>
&lt;li>Google Notebook =&amp;gt; Wiki&lt;/li>
&lt;li>Gmail =&amp;gt; &lt;a href="http://roundcube.net/">RoundCube&lt;/a>&lt;/li>
&lt;li>Blogger =&amp;gt; &lt;a href="http://www.wordpress.org">Wordpress&lt;/a>&lt;/li>
&lt;li>Google Bookmark =&amp;gt; &lt;a href="http://sourceforge.net/projects/scuttle/">Scuttle&lt;/a>&lt;/li>
&lt;li>Picasa =&amp;gt; &lt;a href="http://gallery.sourceforge.net/">Gallery&lt;/a>&lt;/li>
&lt;li>Chrome =&amp;gt; &lt;a href="http://www.firefox.com/">Firefox&lt;/a>&lt;/li>
&lt;li>Knol =&amp;gt; &lt;a href="http://www.wikipedia.org">Wikipedia&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Diğer servisleri yerine emin olun alternatifleri vardır. Benimle paylaşırsanız bu listeye eklemekten mutluluk duyacağım.&lt;/p>
&lt;p>Google, arama konusunda uzmanlaşmış bir şirkettir. Ve bu konuda ilerlemeye devam etmesi, tüm internet camiası için daha iyidir. Ve kendisinden beklenen, diğer konularda işin uzmanı olan kurumlara destek vermesi olması yeniden saygımızı kazanmasını sağlayacaktır.&lt;/p></content></entry><entry><title>Başarısız Bir Girişim Hikayesi</title><author><name/><uri/></author><id>https://hozgan.com/basarisiz-bir-girisim-hikayesi/</id><updated>2008-09-02T00:00:00Z</updated><published>2008-09-02T00:00:00Z</published><content type="html">&lt;p>Cemil heyecanlıydı. İçinden bir ses sıranın ona geldiğini söylüyordu. Patronun terfi teklifini reddedip, işten ayrılmaya karar verdiğinden beri çevresindeki herkes O&amp;rsquo;na çılgın gözüyle bakıyordu. Ama Cemil kendinden çok emindi. Bu sefer kimseyi dinlemeyecek, bildiğini okuyacaktı. Zaten herşey tamam sayılırdı. Henüz kimsenin yapmadığı fikirlere sahipti. Sektörü iyi tanıyor, ihtiyaçları çok net olarak görebiliyordu. Dünyada ilk olacak süper fikirlerinde sahibiydi. Sırtını kimse yere getirmezdi. Ah keşke biraz daha hızlı olabilseydi. Ama en büyük engeli olan işinden kurtuluyordu. Artık tüm zamanı ona aitti. Sevdiği işleri yapacaktı. 6 ay idare edecek parası vardı. Neden freelance iş yapsın ki. Bu saçma bir davranış olurdu, zaten son çalıştığı şirkette çok iyi bir kazancı vardı. Öyle enerji doluydu ki, herşey çok güzel olacaktı.&lt;/p>
&lt;p>İşten ayrıldıktan sonra, hemen kendi şirketini kurmak ve disiplinli bir çalışma ortamı (ofis) aramaya koyuldu. Ofis fiyatları beklediğinden daha fazlaydı. Emlakçı, emlakçı gezmelerinin sonucunda; enerjisinin büyük bir kısmını tüketti. Evinde geliştirme yapıyordu ama pek verimli olduğuna inanmıyordu. Aslında tüm gün ona kalınca, eski şirkette olduğu gibi verimli olamıyordu. Ne de olsa ev denilen kutsal tapınak, dinlenmek için gittiği inanılmaz huzur veren bir yerdi ve orada iş yapmak en büyük günahlardan biri sayılıyordu.&lt;/p>
&lt;p>Sonra Starbucks&amp;rsquo;ları ofis olarak kullanmaya başladı. İstanbul&amp;rsquo;da o kadar çok starbucks vardı ki, hergün birine giderek dikkatleri üzerine çekmemesi mümkündü. Bu mekanlar sanki onun için tahsis edilen ofis gibiydiler. Hatta maslak starbucks&amp;rsquo;ta toplantıları için bir yazı tahtası bile mevcuttu. Bir insan daha ne ister ki. Fakat Starbuckslarda TTNet ADSL aboneleri için ücretsiz olan internet hizmetini ayda 3 saate düşürünce burayı ofis olarak kullanma eylemide tarihe karıştı.&lt;/p>
&lt;p>Arada kafasını karıştıran, yapamayacağını söyleyen insanlar çıkmasa belki başarabilirdi. Neden işten ayrılmıştı ki; gül gibi para kazanıyordu. Aptal adam aptal! Onları dinlemek istemiyordu ama kulaklarında YAPAMAZSIN sesleri yankılanıyordu. Parasal olarak 6 ay idare edebilecek durumdayken birden nefesinin (parasının) yetmeyeceği endişesine kapıldı. Ve projelerinden çok; başarısızlığa uğrayıp uğramayacağına odaklanmaya başladı.&lt;/p>
&lt;p>Çok güzel fikirleri vardı ama nereden para kazanacağını hiç düşünmemişti. Şirketin faaliyetlerini kısa vade ve uzun vade projeler olarak ikiye ayırdı. Freelance işlere evet demeyi düşünüyordu. Sonuçta iş dünyasındaki her ihtiyacı, açık kaynak camiada birileri yapmıştı. Bu şekilde finansman sorununu halledebileceğine ve zamanın büyük bölümünde projelerine odaklanacağı fikriyle kendini ikna etti. Tabii freelance işler pek beklenildiği gibi olmaz, müşterinin istekleri ise hiç bitmez idi. İlk aldığı işi, flash bilgisinin olmamasından dolayı reddetmek zorunda kaldı. Çünkü müşteri CSS ve AJAX fikrinden caymış, ve flash tasarım olmasına karar vermişti. Ee dış kayanak kullansın diyorsunuz ama proje bütçesini aşan bir harcamaydı bu. Ve o para kaybetmektense müşteri kaybetmeyi seçti. Flash bilgisi olmadan, şirket siteleri yaparak para kazanamayacağını anladı ve bundan da vazgeçti.&lt;/p>
&lt;p>Cemil işinden ayrıldığından bu yana aradan 2 ay geçmişti. 2 ay gibi kısa bir sürenin sonunda  Cemil, plansız programsız giriştiği hayallerini erteleyerek iş aramaya başladı&amp;hellip;&lt;/p>
&lt;p>Gelin şimdi Cemil&amp;rsquo;in hatalarını inceleyelim:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Cemil, çevresinde düşlerine tüküren seslere kulak verdi. Başaramayacağınıza söyleyen insanlar muhakkak çıkacaktır. Onlara kulaklarınızı tıkayın ve onları duymayın.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Cemil, hayallerine güveniyordu. Ama hayallerini gerçeğe dönüştürmeyi başaracağı bir iş modeline sahip değildi.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Enerjisini tüketecek, çok küçük bir ayrıntıyı o kadar fazla sorun etti ki, enerjisinin büyük bölümünü burada tüketti.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Aslında Cemil&amp;rsquo;in yaptığı en doğru hamle çok fazla zorlamadan geri çekilmesi olmuş sanırım. Bazen şartları inceleyip nerede geri adım atacağını bilmekte önemli. Eminim Cemil, aldıklarından ders alarak daha mantıklı hareket edecektir. Peki Cemil&amp;rsquo;in başarısını etkileyen, Türkiye&amp;rsquo;deki eksikleri neler? Gelin beraber inceleyelim:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Neden böyle 1-2 kişilik proje insanları için çalışma ortamları bulunmaz. Bir zamanlar Ericsson Crea-World&amp;rsquo;u vardı. Projeniz karşılığında bir masa sahibi olurdunuz. Masaya bilgisayar ve telefon verirlerdi. Bu ortamda toplantı odası mevcuttu. Telefonlarınızı ve müşterilerinizi ilk karşılayan bir sekreteri vardı. Böyle bir yer kurmak çok mu zor? Ayrıca mobil sektöre yeni girenler padavanlar için Jedi abiler olurdu. Bence böyle mekana ihtiyaç var. Etohum biraz buna benziyor. Ama mekan sorunsalı bence büyük bir handikap.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Şu an maalesef Türkiye&amp;rsquo;de girişimleri tanıtacak, tarafsız ve önyargısız oluşumlara ihtiyaç var. Eğer bir girişiminiz varsa tanıtmak ayrı bir sorun haline gelebiliyor. Fazlamesai ya da Webrazzi gibi sitelerde, eğer moderatör girişiminizi beğenmez ya da girişiminizin haber değeri olmadığını düşünürse, tüm emeğiniz çöpe gidebilir ya da dayanma süreniz ve sabrınız daha fazla olabilir.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Peki Cemil neler yapmalıydı? (görüşlerinizide lütfen burada bizimle paylaşın.)&lt;/p>
&lt;p>&lt;a href="http://www.guykawasaki.com/">Guy Kawasaki&lt;/a> ve &lt;a href="http://www.paulgraham.com">Paul Graham&lt;/a> ne diyor yeni bir girişim kuracaklar için ona bir göz atalım.&lt;/p>
&lt;ol>
&lt;li>Dünyayı değiştirmek için bir sorun bulun ve çözüme odaklanın.&lt;/li>
&lt;li>Prototipi oluşturun (önce yap sonra iş planını düşün)&lt;/li>
&lt;li>İş modeli oluşturun.&lt;/li>
&lt;li>Özündeki büyüyü ortaya çıkarın (kısa olsun)&lt;/li>
&lt;li>Pazarlama, satış stratejisi, mali tahminler ve metrikler çıkartılmalı.&lt;/li>
&lt;li>Rakipleri belirlemeli.&lt;/li>
&lt;li>Karlılığı değil nakit akışını hedefleyin.&lt;/li>
&lt;li>Önce piyasaya sürün sonra sınayın.&lt;/li>
&lt;li>Forma değil fonksiyona odaklanın.&lt;/li>
&lt;li>Doğrudan siz satın.&lt;/li>
&lt;li>Niş bir fikir bulun ve O&amp;rsquo;na odaklanın.&lt;/li>
&lt;/ol>
&lt;p>Son olarak;&lt;/p>
&lt;ol>
&lt;li>Çok basit bir fikre odaklanın.&lt;/li>
&lt;li>Diğer startuplarında katkı sağlayacağı kadar basit ve esnek olsun. (bknz: &lt;a href="http://twitter.com">twitter.com&lt;/a>)&lt;/li>
&lt;li>Asla bir araçta uzmanlaşmayın, sektörde uzmanlaşın! Örneğin; programlama dili yerine web&amp;rsquo;e hakim olun.&lt;/li>
&lt;li>Ve başaracağınıza inanın.&lt;/li>
&lt;/ol></content></entry><entry><title>Parola Yaratma Hizmeti (pwgen.net)</title><author><name/><uri/></author><id>https://hozgan.com/parola-yaratma-hizmeti-pwgen_net/</id><updated>2008-09-02T00:00:00Z</updated><published>2008-09-02T00:00:00Z</published><content type="html">&lt;p>&lt;a href="http://pwgen.net">Bu hizmet&lt;/a> sayesinde çeşitli kriterlerde parola yaratabilirsiniz. Kriterler;&lt;/p>
&lt;ul>
&lt;li>Büyük harf&lt;/li>
&lt;li>Küçük harf&lt;/li>
&lt;li>Numerik&lt;/li>
&lt;li>Özel karakterler (sizin tarafınızdan belirlenen karakter dizisi)&lt;/li>
&lt;li>Uzunluk&lt;/li>
&lt;/ul>
&lt;p>Servis iki hizmet başlığı vardır:&lt;/p>
&lt;ul>
&lt;li>Ana (master) parola&lt;/li>
&lt;li>Alt (slave) parola&lt;/li>
&lt;/ul>
&lt;h3 id="ana-parola">Ana Parola&lt;/h3>
&lt;p>Bu hizmet yukarıda saydığımız kriterlerdeki bunlara parola kuralları (password rules) diyebiliriz. Size özel parola üretir. Bu sayede düzenli olarak kendinize şifre yaratabilirsiniz. Daha hızlı ilerlemek için &lt;a href="http://labs.mozilla.com/2008/08/introducing-ubiquity/">ubiquity&lt;/a> &lt;a href="http://www.dahius.com/projects/ubiquity/pwgen/">komutumuzu da&lt;/a> kullanabilirsiniz.&lt;/p>
&lt;h3 id="alt-parola">Alt Parola&lt;/h3>
&lt;p>Bu hizmet sayesinde herhangi bir siteye kayıt olduğunuzda ana parolanız, site adresi ve belirlediginiz parola kuraliniz ile, size özel tekil bir şifre yaratılır. Bu şifre hiçbir zaman bizim tarafımızda tutulmaz. Bu hizmeti firefox için yazılan add-on ile çok hızlı bir şekilde kullanabilirsiniz.&lt;/p></content></entry><entry><title>URL Kıssalaştırma Hizmeti (kissa.be)</title><author><name/><uri/></author><id>https://hozgan.com/url-kissalastirma-hizmeti-kissa_be/</id><updated>2008-09-02T00:00:00Z</updated><published>2008-09-02T00:00:00Z</published><content type="html">&lt;p>&lt;a href="http://kissa.be">kissa.be&lt;/a>, twitter&amp;rsquo;da fazlaca görüpte merak ettiğim tinyurl bağlantılarını bu servisi bizde yaparız ne varki dememizle ortaya çıktı. Özünde yaptığı çok basit bir iş. Çok karmaşık bir web adresini temiz ve olabildiğince kısa bir şekilde sizlere sunmak. Bunları yaparken birkaç yenilikte ekledik. Bu yeniliklerden bazıları şöyle;&lt;/p>
&lt;ul>
&lt;li>Kolay ön izleme: &lt;a href="http://kissa.be/1X">http://kissa.be/1X&lt;/a> olan bir adresin sonuna &amp;lsquo;-&amp;rsquo; işareti ekleyerek önizleme yapabilirsiniz. &lt;em>Örneğin; &lt;a href="http://kissa.be/1X-">http://kissa.be/1X-&lt;/a>&lt;/em>&lt;/li>
&lt;li>İstatistik: Bu sayede linkin kaç kişi tarafından ziyaret edildiğini takip edebilirsiniz.&lt;/li>
&lt;li>URL açıklaması: &lt;a href="http://kissa.be/1X">http://kissa.be/1X&lt;/a> olan url&amp;rsquo;in sonuna /deneme-url anlasilir aciklamalar icin kullanabilirsiniz. &lt;em>Örneğin: &lt;a href="http://kissa.be/1X/lost-sezon-5-bolum-1">http://kissa.be/1X/lost-sezon-5-bolum-1&lt;/a> gibi :)&lt;/em>&lt;/li>
&lt;li>metin kıssalaştırıcı.&lt;/li>
&lt;li>guvenli eposta linki vermeyi saglama hizmeti&lt;/li>
&lt;/ul></content></entry><entry><title>Web 2.0 Trendleri</title><author><name/><uri/></author><id>https://hozgan.com/web-2_0-trendleri/</id><updated>2008-08-29T00:00:00Z</updated><published>2008-08-29T00:00:00Z</published><content type="html">&lt;p>Web dünyasına yön veren projelerin, ilk kez hepsi bir yerde.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;img src="/files/2008/08/web20_trends.jpg" alt="/files/2008/08/web20_trends-300x280.jpg &amp;ldquo;web20_trends&amp;rdquo;">&lt;/th>
&lt;th>&lt;img src="/files/2008/08/ia_webtrends_2007_2_1024_768.gif" alt="/files/2008/08/ia_webtrends_2007_2_1024_768-300x225.gif &amp;ldquo;ia_webtrends_2007_2_1024_768&amp;rdquo;">&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>Pictures&lt;/li>
&lt;li>Social Bookmarks&lt;/li>
&lt;li>Comment &amp;amp; Reputation&lt;/li>
&lt;li>Crowdsourced Content&lt;/li>
&lt;li>Blog Platforms&lt;/li>
&lt;li>Blogs/Conversations&lt;/li>
&lt;li>Blog Communities&lt;/li>
&lt;li>Micromedia&lt;/li>
&lt;li>Lifestreams&lt;/li>
&lt;li>Specific to Twitter&lt;/li>
&lt;li>SMS/Voice&lt;/li>
&lt;li>Social Networks&lt;/li>
&lt;li>Customers Service Networks&lt;/li>
&lt;li>Location&lt;/li>
&lt;li>Video&lt;/li>
&lt;li>Video Aggregation&lt;/li>
&lt;li>Documents&lt;/li>
&lt;li>Events&lt;/li>
&lt;li>Music&lt;/li>
&lt;li>Wiki&lt;/li>
&lt;li>Live Casting / Video and Audio&lt;/li>
&lt;/ul></content></entry><entry><title>QualityRank (Web Analiz, Ölçüm ve Stratejileri)</title><author><name/><uri/></author><id>https://hozgan.com/qualityrank-web-analiz-olcum-ve-stratejileri/</id><updated>2008-08-21T00:00:00Z</updated><published>2008-08-21T00:00:00Z</published><content type="html">&lt;p>QualityRank sektörel web disiplinidir. Bir web projesinde olması gerekenleri inceler. Bu konuda çalışmaları &lt;a href="http://www.netology.org">netology foundation&lt;/a> altında toplanacak. Katkılarınızı, öneri ve yorumlarınızı bekliyorum.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Çekirdek&lt;/strong>
&lt;ul>
&lt;li>Kod kalitesi&lt;/li>
&lt;li>Veritabanı yapısı&lt;/li>
&lt;li>Mimari&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Performans&lt;/strong>
&lt;ul>
&lt;li>Test&lt;/li>
&lt;li>Önbellek&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Kullanılabilirlik&lt;/strong>
&lt;ul>
&lt;li>Tasarım&lt;/li>
&lt;li>Kullanıcı Dostu&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Hedefler&lt;/strong>
&lt;ul>
&lt;li>Hedef Kitlesi&lt;/li>
&lt;li>Aramak &amp;amp; Aranmak&lt;/li>
&lt;li>Kullanıcı Sayısı&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>İçerik&lt;/strong>
&lt;ul>
&lt;li>Kaliteli İçerik&lt;/li>
&lt;li>Etkileşim&lt;/li>
&lt;li>Performansı Etkileyen İçerikler&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>İstatistik&lt;/strong>
&lt;ul>
&lt;li>Ziyaretçi Bilgisi&lt;/li>
&lt;li>Arama motoru ve Referans Site&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Standartlar&lt;/strong>
&lt;ul>
&lt;li>Web tarayıcısı desteği&lt;/li>
&lt;li>XHTML &amp;amp; CSS&lt;/li>
&lt;li>W3C&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Güvenlik&lt;/strong>
&lt;ul>
&lt;li>Saldırılar&lt;/li>
&lt;li>Açıklar&lt;/li>
&lt;li>En Zayıf Halka (İnsan Faktörü)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Hizmet&lt;/strong>
&lt;ul>
&lt;li>İş Akışı&lt;/li>
&lt;li>Destek&lt;/li>
&lt;li>Geri Besleme&lt;/li>
&lt;li>Güven&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Yenilik&lt;/strong>
&lt;ul>
&lt;li>Sitede Kullanılan Teknolojiler Zamanın Neresinde ? (AJAX, SOAP vs..)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></content></entry><entry><title>Web 2.0 Projelerin Özellikleri</title><author><name/><uri/></author><id>https://hozgan.com/hello-world-2/</id><updated>2008-07-24T00:00:00Z</updated><published>2008-07-24T00:00:00Z</published><content type="html">&lt;p>Web 2.0 hayatımıza RIA teknolojileri ile girdi. Ardından etiketlerle tanıştık. Ve sitelere yorum yazmaya, içerikleri oylamaya vb. başladık. Peki nedir Web 2.0 ve bir Web 2.0 projesinde olması gereken özellikler nelerdir? Lütfen siz de aklınıza gelen konuları burada paylaşın!&lt;/p>
&lt;ul>
&lt;li>İçerik (Etkileşim)
&lt;ul>
&lt;li>Etiketlenir&lt;/li>
&lt;li>Oylanır&lt;/li>
&lt;li>Arkadaşına gönder.&lt;/li>
&lt;li>Kötü içerik bildirilir. (Kendi kendine işleyen onay mekanizması)&lt;/li>
&lt;li>Yorum yazılır&lt;/li>
&lt;li>Katkıya göre alınan karma puanı. (demokrasi)&lt;/li>
&lt;li>Mashups (veri paylaşımı)&lt;/li>
&lt;li>Takip edilebilir. (RSS desteği)&lt;/li>
&lt;li>Web 3.0 için veriyi anlamlandırabilmek.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ara birim (RIA)
&lt;ul>
&lt;li>AJAX&lt;/li>
&lt;li>Flash&lt;/li>
&lt;li>Temiz URL (rewriterule)&lt;/li>
&lt;li>MVC, REST&lt;/li>
&lt;li>CSS&lt;/li>
&lt;li>Kullanıcı dostu (bknz: del.icio.us)&lt;/li>
&lt;li>Bookmarklets&lt;/li>
&lt;li>add-on ve iPhone gibi cihazlar için API desteği&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>İş Modelleri
&lt;ul>
&lt;li>Ucu açık, genişleyebilir fikirler (twitter, reddit vb&amp;hellip;)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Gelir Modeli
&lt;ul>
&lt;li>Reklam (nefret ediyorum)&lt;/li>
&lt;li>Üyelik (Google App)&lt;/li>
&lt;li>Satış (Amazon)&lt;/li>
&lt;li>Komisyon (ebay)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Pazarlama (Marketing)
&lt;ul>
&lt;li>10 kez insanların bu servisi duymasını sağlamak.&lt;/li>
&lt;li>Kullanmalarını teşvik edecek faydayı göstermek.&lt;/li>
&lt;li>Takip edilenlerin ürünü kullanmasını ve duyurmasını sağlamak.&lt;/li>
&lt;li>Sansasyon yaratmak. (büyük bir firmada çalışan bir kişinin sizi hacklemesi)&lt;/li>
&lt;li>Benzer fikir sahibi(rakip) firmanın bir özelliğinin olmaması ve kısa sürede hayata geçirememesi durumundan faydalanmak. Örneğin; bir e-bilet servisi kurdunuz. rakibiniz olan firmada bilet aldığınız mekandan yer seçemiyorsunuz. Bunun üzerinden reklam yapabilirsiniz.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></content></entry><entry><title>Yazılım ve Oyun Kardeşliği</title><author><name/><uri/></author><id>https://hozgan.com/yazilim-ve-oyun-kardesligi/</id><updated>2008-05-03T00:00:00Z</updated><published>2008-05-03T00:00:00Z</published><content type="html">&lt;p>Yazılım dünyanın en eğlenceli ve en zor işlerinden biri. Eğlenceli çünkü yaratıcılığımızı konuşturuyoruz ve ortaya koyduğumuz ürünü, diğer insanların beğenisine sunuyor, onların takdiri ya da tekdiri ile muhattap oluyoruz. Zor çünkü sürekli bir yarış halindeyiz. Sürekli yeni birşeyler yaparak ile bir adım önde olmak zorundayız. Bilgimizi sürekli güncel tutmak ve yorumlamak zorunda oluşumuz gerçeği söz konusu. Bu son madde öğrenmeyi seviyorsanız aynı zamanda eğlenceli.&lt;/p>
&lt;p>Proje bitiş tarihleri yaklaştıkça yazılım geliştirmenin zorluğu daha çok anlaşılır. Sıkıntılar ortaya çıkar. Proje iyi yönetilmediyse %99 ihtimalle mesai saatleri dışında da proje için çalışmak gerekir. Lakin işiniz gibi bir de özel yaşamınız vardır. Ve bir hafta önceden yaptığınız planlar bir anda tehlike altına girer. Bu durumda iki yolunuz vardır. Ya gidersiniz, ya da kalırsınız. Dünyada da böylemi bilmiyorum ama gitmeyi seçerseniz, proje yöneticilerinin gizli silahları olan duygusal baskı kullanmaya çalışırlar. Burada kalmak ya da gitmek gerekmesi konusunda bir tartışma başlatmak değil amacım. Gitmek ve kalmak bazen doğru bazen de yanlış olan bir davranış olabilir. Fakat gitmeniz durumunda takım arkadaşlarınızın size olan duygularında negatif bir düşünce yer edeceği kesindir.&lt;/p>
&lt;p>Projelerin başarılı ve kaliteli olmasında en önemli etkenlerden biride bu işi yapan yazılım geliştiricilerin motivasyonudur. Öncelikle takımdaki her birey aynı derecede önemlidir. İyi bir proje takımı iş dışında da zamanın her anında da beraber gezen takım değildir. İyi proje takımı iyi anlaşan, ekip arkadaşları ile empati kurabilen iyi bir dans veya tiyatro topluluğu gibidir. Birbirlerinin kusurlarını kapatırlar. Bibirlerine yardımcı olurlar. Takımda herkes önemlidir ve herkes bunu hissetmek ister ve hissetmelidir. Övgüler ve küçük ödüllendirmeler, yapılan işte başarının ve memnuniyetin kanıtıdır. Ben yazılıma başlamamın sebebi insanların ortaya koyduğum ürünü takdir etmelerini görmek istemem olmuştu. Ve gerçekten başarılı bir ürünü, proje ekibi gevşemesin diye takdir etmemek bence demotive edici yanlış bir davranış ve proje için yanlış bir hamledir.&lt;/p>
&lt;p>Proje ekibi birbirini dinlemeli, anlamalıdır evet ama aynı zamanda kendi hatalarınıda görebilmelidir. Kendi hatalarımızı görmek çok kolay değildir. Bunu birinin bize söylemesi ile farkedebiliriz. Ama bunun söyleniş şekli ve niyeti çok önemlidir. &amp;ldquo;Acaba benim ayağımımı kaydırmaya çalışıyor.&amp;rdquo; &amp;ldquo;Bu adam da hep benim hatalırımı görüyor&amp;rdquo; diye düşünebilirsiniz. İşte iyi proje ekiplerinde böyle bir düşünce olmaz. Çünkü takım arkadaşına güvenir.&lt;/p>
&lt;p>Neden yazılım geliştiriyorsunuz? Bu işi neden yapıyorsunuz? Hiç düşündünüz mü? Cevaplar farklı farklı olabilir. Ama altında yatan asıl şey mutlu olmaktır.&lt;/p>
&lt;p>**Mutluluk paylaşılırsa gerçektir.**Bu kanıtını çok uzakta aramanıza gerek yok. Çocukken oyunlar oynarken ne kadar mutlu olduğunuzu bir düşünün. Yazılım bir takım işidir ve insanı mutlu eden bir oyundur. Ve oyunun amacı dünyayı kurtarmaktır. Kurtarılan dünyanın hacmi önemli değil. Bu sizin iç dünyanız bile olabilir. Ne farkeder ki! amaç dünyayı kurtarmaktır.&lt;/p>
&lt;p>İnsan Homoludensdir. Yani oyun oynayan bir valıktır. Hayat bir oyundur felsefesi yazılım takımına yansıtıldığı ve yapılan projenin oyunun bir parçası olduğu yazılım ekibinin üzerindeki baskıyı alır ve onlara eğlence kapısını açar. Ve işin kalitesi üzerine tatlı bir rekabet başlar. Herkes rolünün hakkını vermeye çalışır.&lt;/p>
&lt;p>Tiyatro ve Yazılım iki farklı grup gibi görünür. Tiyatrocular, yazılım geliştiricilere göre çok daha sosyal insanlardır. Aslında bu doğru değildir. Yazılımcılarda sosyal insanlardır. Sadece farklı bir platformda boy gösterir ve insanların anlayamadığı bilgisayarca konuşurlar. Yazılımcılarin komik alışkanlıkları vardır. Yüzyüze konuşmak yerine MSN&amp;rsquo;den konuşmayı ya da eposta ile birşey sormanızı beklerler. İşe odaklanmak için yapılan bu şey bence çok komiktir. İyi bir takım etkileşim içindedir. Ben bu yüzden çevik proje yönetim metodolojilerini seviyorum. Çünkü büyük projelerde küçük gruplara bölünerek bu etkileşimi sağlamaya çalışıyor hepsi.&lt;/p>
&lt;p>Çarşamba günleri, &lt;a href="http://www.gelisimatolyesi.com/">Gelişim Atölyesi&lt;/a> tarafından açılan &lt;strong>Oyun Atölyesi&lt;/strong>ne katılıyorum. Amacım sadece eğlenmek ve tiyatrodan kopmamak isteğiydi. Oyun atölyesinde doğaçlama tiyatro yapıyoruz. Küçük bir topluluğuz. Takımda herkes çok değerli ve farklı. Aslında her insan farklıdır. Bunu kısa sürede öğreniyorsunuz. Çünkü size dünyayı farklı bir gözle görmeniz gerektiği gösteriliyor. Çevrenizdeki insanları farketmeye başlıyorsunuz. Çuvaldızı kendime batırmaya başlıyorsunuz. Ben, hatalarımı, yaptığım bencillikleri görmeye başladım. Çünkü çıkardığınız küçük oyunda bu bencillikler sırıtıyor. Bazen kendi bildiğimi okuduğumu ve takım arkadaşlarımı dinlemediğim farkettim. Artık hatalarımı biliyorum. Ve bunları düzeltmeye başladım. Unutmadan eklemeliyim, asıl amacım eğlenmek ve bende yarattığı mutluluk anlatamayacağım bir duygu. Evet gerçek mutluluk paylaşılandır. Bunu artık biliyorum. Belki bu yüzden çarşamba günlerini sabırsızlıkla bekliyorum. Buradan Gelişim Atölyesi&amp;rsquo;nin kurucusu Özlem Seller&amp;rsquo;e ne kadar teşekkür etsem azdır. Sevgili Nalan Hocam(Çeliker), iyi ki varsınız. Tiyatro&amp;rsquo;nun kurgu ve öykü dışındaki oyun olma tarafını sizin sayenizde anladım. Ve sevgili oyun arkadaşlarım(Aydan, Eda, Gülşah, İlkay, İlker, Koray, Kubilay, Yeşim) hepinize sevgi dolu kocaman teşekkürler :)&lt;/p>
&lt;p>Tiyatro ile Yazılım gerçekten birbirine çok benziyor. Sadece olaya doğru açıdan bakmak gerekiyor. Eğer proje takımınızda yukarıda saydığım sorunlarınız varsa onları tiyatro ile tanıştırın. Tiyatroya izleyici kalmayın, sahnede kendinize yer edinin. Kısa sürede proje takımınızdaki değişikliğe inanamayacaksınız&amp;hellip;.&lt;/p></content></entry><entry><title>Üretim Ekonomisinin Çöküşü</title><author><name/><uri/></author><id>https://hozgan.com/uretim-ekonomisinin-cokusu/</id><updated>2008-03-16T00:00:00Z</updated><published>2008-03-16T00:00:00Z</published><content type="html">&lt;p>Üretime dayalı ekonominin çöktüğünün farkında mısınız? Birşeyi üret, paketle sat devri aslında son demlerini yaşıyor. Artık birşeyi kaliteli üret, insanların beğenisine sun ve ondan katma değer elde et devri başladı. Yani Hizmete dayalı bir ekonomi emekleme safhasında.&lt;/p>
&lt;p>Bunun ilk örneklerini yazılım endüstrisinde gördük. Özellikle Web&amp;rsquo;in yaygınlaşmasıyla hizmete dayalı iş modelleri artmaya başladı. Hizmete dayalı iş modelinin temelinde de Özgür Yazılım ve Açık Kaynak felsefesi mevcut. Yani ürettiğinizi insanların beğenisine sunup eğer gerçekten kazanıyorlarsa, bakım gibi katma değerlerden para elde ediyorsunuz. Son 5 yılda Bilişim devleri ve hatta Microsoft bile bunun farkında ve bu yaklaşımı anlama yolunda yeni iş modelleri geliştirmeye çalışıyorlar.&lt;/p>
&lt;p>Bundan 10 yıl önce yazılımlar için çok güçlü koruma yöntemleri geliştirilirken ve bir yazılımın bedava dağıtılması dahi söz konusu değildi. Bugün bu durum kısmen değişti. Evet halen bu duruma direnen firmalar var. Ama bu direnmenin onların sonunu hazırladığı muhakkak.&lt;/p>
&lt;p>Bugün katma değer elde etmenin bir yolunu bulması gereken bir sektörden söz edeceğim. Müzik!&lt;/p>
&lt;p>Müzik sektörü günümüzde üret ve dağıt mantığı ile para kazanmayı hedefler. Özellikle her geçen gün yeni şarkıcılar çıkıyor. Albüm çıkarıp bunu satmak bundan kazanç elde etmeyi bekliyorlar. Neden bir müzisyen ticaretten para kazanmayı hedefler. Aslında bunu hedefleyen müzisyenler değilde yapımcılardır hiç şüphesiz. Bir albüm hazırlamanın maliyeti nedir? Yeni besteler, aranjör, stüdyo ve çoğaltım ve dağıtım. Bugün çoğaltım ve dağıtımın CD&amp;rsquo;den olması onca masrafa girilmesi oldukça gereksiz. Bunları bir müzisyen rahatlıkla internetten yapabilir. İnternet gibi bir ortamdan yapmasının faydalarına ise birazdan ayrıca değineceğim. Aslında işin katma değer kısmı interneti doğru kullanmakta yatıyor.&lt;/p>
&lt;p>Peki çoğaltım ve dağıtımı çıkarttık. Geriye ne kaldı? Beste, aranje, stüdyo. Bence bir müzisyen beste yapamıyorsa ve bir müzik aleti çalamıyorsa ona müziyen dememek lazım. Şarkıcı yada ses sanatçısı denebilir. Eğer sesi gerçekten iyi ise muhakkak sponsor bulabilir. Geldik stüdyoya bence bunun için sponsorlar bulunabilir. Ve internet sitenizin bir yerlerine sponsorların logoları konabilir. Sanata destek vermek isteyen bir sürü şirket olduğu muhakkak. Bunu sağlamanın yolu şüphesi viral pazarlamadır. Bir demo yapın ve internette insanların beğenisine sunun. Eğer gerçekten iyi ise size doğru sponsorları getirecektir. Peki yapımcılardan kurtulduk. Bedava albümde yaptık dediniz bizim yaşamamız için para kazanmamız, müzik aletleri almamız vs.. gerek değil mi? Haklısınız ! Ama sabredin yazım daha bitmedi.&lt;/p>
&lt;p>Müziğinizi dünyanın beğenisine sunun. İngilizce albüm yapın demiyorum. İyi müzik yapın diyorum. İyi müzik her zaman dinleyici bulur. Bundan yüz yıl önce konan sınırlar bugün sanal olarak yeniden kalkmış durumda. İnsanlar diledikleri gibi özgürce iletişim kurabiliyorlar. İnternet sitenizden insanların dilediklerince şarkılarınızı dinlemelerine izin verin. Ama sitenize üye olsunlar ki dünyanın neresinde daha popüler olduğunuzu neresinde ne kadar dinlendiğinizi sayısal olarak görün. Hatta bir yolu varsa şarkınızın ne kadar dinlendiğini bile raporlaryın. Ya da size bu raporları sunacak bir portala üye olun! Sayılar para kazanmak için önemlidir. Nasıl mı para kazanacaksınız? Konser vererek! Ortalama olarak baktığınızda bir albüm 10 YTL, bir konser bileti ise 70 YTL. Ve hayran kitleleri bu konserlere geliyor. Bu fırsatlardan biri. Ya da sitenizde açacağınız bir yardım (donate) alanı ile insanların müziğinize katkıda bulunmalarını isteyebilirsiniz. Emin olun çok fazla destek gelecektir.&lt;/p>
&lt;p>Kısacası; dünya kaliteli hizmete dayalı bir ekonomik çerçeve içerisine giriyor. Ve bu ekonominin içinde başarılı olacaklar parası olan insanlar değil kaliteli ve yenilikçi fikirlerle üretim yapan ve hizmet veren kesim olacaktır.&lt;/p>
&lt;blockquote>
&lt;p>Eğer insanlara, ne istediğini sorarsanız; daha hızlı atlar isterler. &lt;strong>Henry Ford&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;p>Henry Ford bu sözüyle neyi kastettiğini düşündünüz mü? Hayranlarınızı dinleyin. Fakat sadece dinlemekle kalmayın birde dinlediğinizi yorumlayın. Aslında daha hızlı atlar mı istiyorlar! Hayır! Bir yerden başka bir yere hızlı bir şekilde gitmek istiyorlar. Henry Ford bu isteği yorumladı ve sonuç olarak T1&amp;rsquo;i yarattı.&lt;/p>
&lt;p>Yıllar önce Napsterın büyük bir patlama yaptığında hayranlarınız sizden bir talepte bulunuyordu. Eğer doğru bir şekilde yorumlansaydı Last.FM o zamandan hayatımızda yerini alırdı. Demem o ki;&lt;/p>
&lt;blockquote>
&lt;p>Siz müziğinize odaklanın; diğer her şey arkasından gelecektir.&lt;/p>&lt;/blockquote></content></entry><entry><title>Geleceğin Uygulama Mimarisi</title><author><name/><uri/></author><id>https://hozgan.com/gelecegin-uygulama-mimarisi/</id><updated>2008-02-09T00:00:00Z</updated><published>2008-02-09T00:00:00Z</published><content type="html">&lt;ol>
&lt;li>Binary veri biçimlerinden XML biçimlerine geçiş. OpenXML (Word veya Excel), Kullanıcı Arayüzü (XAML, XUL, JavaFX, Flex)&lt;/li>
&lt;li>İşletim sistemlerinde donanım bağımsızlık. (WebOS)&lt;/li>
&lt;li>Dünyanın ortak zihni ve semantic web servisleri.&lt;/li>
&lt;li>Hizmete dayalı iş modeli. (SaaS, S+S, Mashup ).&lt;/li>
&lt;li>İnsan modelleme. Ortak problemlerin ortak çözümleri vardır. Bunları sağlamak için kurulmuş servisler. (Facebook)&lt;/li>
&lt;li>Yapboz programcılığı (OpenSocial, FacebookUI)&lt;/li>
&lt;li>Ortak kimlik tanımlama çalışmaları (yeni protokoller, en ilkeli bknz. OpenID)&lt;/li>
&lt;li>Yeni arama anlayışı. Önce dizin bazlı arama vardı. Sonra semantic arama çıktı. Yeni yüzyılda çözüm odaklı aramalar baş gösterecek)&lt;/li>
&lt;li>Şeffaf toplumun çok yakın olduğunun işaretçisi Facebook gibi uygulamalar.&lt;/li>
&lt;li>İstemci işlemci gücü :) Dünyadaki PC&amp;rsquo;lerin çoğu %100 kullanılmıyor. Serverların yapacağı çoğu&lt;!-- raw HTML omitted -->iş istemci programlara yüklemek. Örneğin, genellikle server tarafında&lt;!-- raw HTML omitted -->yapılan resim ölçütlendirme (resize) işlemi istemci makineye&lt;!-- raw HTML omitted -->yaptırılabilir.&lt;/li>
&lt;/ol></content></entry><entry><title>Açık Şirket (Open Company) Yaklaşımı</title><author><name/><uri/></author><id>https://hozgan.com/acik-sirkey-open-company-yaklasimi/</id><updated>2008-02-08T00:00:00Z</updated><published>2008-02-08T00:00:00Z</published><content type="html">&lt;p>Birkaç yıl önce Hacker Etiği adında bir kitap okumuştum. Kitapta bilgisayar üstadları(hackers) tarafından yeni bir çalışma modeli yaratıldığından uzun uzadıya söz ediyordu.&lt;/p>
&lt;p>Bu felsefe şunu öngörür. Yapılacak işin en verimli olduğu saatlerde ve en verimli kalitede yapılmasını sağlamak için kişiye uygun saatlerde çalışmasına izin vermektir. Yani siz gece sessizliğinde kendinizi işe veriyor ve bu saatlerde çalışmayıda seviyorsanız, bu saatler çalışın. Ofiste rahat etmiyormusunuz, ofise gelmeyin. Rahat ettiğiniz yerde kodunuzu yazın. Size verilen işi, belirlenen kalitede ve beklenen sürede tamamlayın. Maalesef günümüzde birçok şirket bu yaklaşıma sıcak bakmıyor. Kontrolsüzlük ve disiplinsizlik düşüncesinden dolayı bu şekilde düşünülür. Aslında bu durum ne kontrolsüzdür ne de iş disiplinini öldürür. Alternatif bir iş modeli fikrini ortaya atmak istedim. Sizce ütopya mı? Bence değil?&lt;/p>
&lt;p>&lt;strong>Nasıl Çalışacak?&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Şirket kültürü ve şirketin tüm iş süreçleri için prosedürler tanımlanmalı.&lt;/li>
&lt;li>Şirketin herşeyi şeffaf. Ciddi raporlarla destekleniyor.&lt;/li>
&lt;li>İnsan bağımlı değil. Herkesin bir yedeği var. Her yapılan işin belgelendirmesi mevcut. Bilgi görüntülü ve yazılı olarak tutulacak.&lt;/li>
&lt;li>Şirketin bir sahibi yok, yaratıcısı var. Kıdem ve aktif olarak en çok katkıda bulunanın daha çok söz sahibi vardır.&lt;/li>
&lt;li>Departman yönetimini ekranında gelir paylaşımı katsayıları mevcut.&lt;/li>
&lt;li>Çalışan havuzu var. Gerçek şirketlerden bir farkı yok. Satış departmanı belli bir iş satışını garanti ederken, proje evi de bünyesinde çalışanlara iş sağlamayı garanti etmeli.&lt;/li>
&lt;li>Her yerden çalışabilme imkanı.&lt;/li>
&lt;li>Haberleşme: MSN, Jabber, Skype, Trac, Bugzilla gibi araçlarla.&lt;/li>
&lt;li>Etkinlik: Bu şirketlerin yazılımcıların birbirleri ile tanışması için etkinlikler düzenler.&lt;/li>
&lt;li>Standartların oluşturulması.&lt;/li>
&lt;li>Kazanılan para hisse usulü dağıtılıyor. Kıdem ve katkınız ile orantılı.&lt;/li>
&lt;/ol></content></entry><entry><title>Adım Adım Ruby - 2 -</title><author><name/><uri/></author><id>https://hozgan.com/adim-adim-ruby-2/</id><updated>2007-11-11T00:00:00Z</updated><published>2007-11-11T00:00:00Z</published><content type="html">&lt;p>Eğer kendi kendinize birşey öğreniyorsanız ve birşeyler öğrenirken sıkılıyorsanız bunun sebebi kesinlikle bilinmeyenin göz korkutmasıdır. Yani kitaplar şimdi bunu yapıyoruz şunu kullanacağız. Bir sürü bilinmeyen bir sürü soru işareti ve sonunda oluşan kocaman bir korku ortaya çıkar. Eğer sabır da göstermezsek sonunda pes edip öğrenilen şeyden vazgeçeriz. Bu sebeple yeni birşey öğrenirken geneline bir bakış atmak. Ne neymiş, neden kullanılırmış anlamak isterim. İşte bu sebeple bu yazıda ruby&amp;rsquo;i ruby yapan şeylerden ve genel özelliklerinden söz edeceğim. Bunların hızlıca üzerinden geçeceğim ama verdiğim bilgiler referans niteliğinde olacak. İleride bu konuda örnekler verdiğimde kodu anlamanıza büyük kolaylık sağlayacak.&lt;/p>
&lt;h2 id="rubyi-seçmeniz-için-birkaç-neden">Ruby&amp;rsquo;i Seçmeniz İçin Birkaç Neden?&lt;/h2>
&lt;ul>
&lt;li>Ruby tamamen nesne yönelimli bir programlama dilidir.&lt;/li>
&lt;li>Operatörleri yeniden yazmanıza izin verir.&lt;/li>
&lt;li>Bir sınıfın kaynağına dokunmadan bir metodu yeniden yazmanıza izin verir.&lt;/li>
&lt;li>İşinizi kolaylaştıracak birçok operatöre sahiptir.&lt;/li>
&lt;li>Eğer C biliyorsanız yeni kütüphaneler yazarak dili genişletebilirsiniz.&lt;/li>
&lt;li>Blok mimarisi sayesinde bir metoda bir kod işlemi aktarabilir ve birçok şeyi tek satırda yapabilirsiniz.&lt;/li>
&lt;li>Betik dilidir. Yapılan değişiklikleri anında siteye yansıtır. Java gibi jar dosyaları ile boğuşmazsınız.&lt;/li>
&lt;li>String ve RegEx sınıfları sayesinde hızlı hareket etmenizi sağlar. Programcının menfaatine iş yapar ve çevir bir dildir.&lt;/li>
&lt;li>Platform bağımsızdır. Birçok platformda yazılan kodunuz çalışır.&lt;/li>
&lt;li>Dinamik değişken tanımlama.&lt;/li>
&lt;li>Birçok dilden miraslar aldığı için yazılımcının alışkanlıklarına göre kod yazım esnekliği.&lt;/li>
&lt;li>Yorumlanan bir dildir.&lt;/li>
&lt;/ul>
&lt;h2 id="genel-yazım-kuralları">Genel Yazım Kuralları&lt;/h2>
&lt;ul>
&lt;li>Yorum Satırları&lt;!-- raw HTML omitted --># karakteri, bulunduğu satırı, satır sonuna(EOL) kadar yorum satırına dönüştürür.&lt;!-- raw HTML omitted -->Yorumlayıcı bu satırı görmezden gelir.&lt;!-- raw HTML omitted -->&amp;rsquo;=begin&amp;rsquo; ve &amp;lsquo;=end&amp;rsquo; arasında kalan satırları yorumlayıcı görmezden gelir.&lt;/li>
&lt;li>Deyim Sonlandırma&lt;!-- raw HTML omitted -->Deyim sonlandırma işlemi ya satır sonu ya da eğer aynı satırda birkaç deyim kullanılacaksa (;) (noktalı virgül) işaretidir.&lt;/li>
&lt;li>Sınıf ve Modül tanımları büyük harfle başlamalıdır. (Ör: REXML::Element)&lt;/li>
&lt;li>Değişken tanımları küçük harfle olmalıdır. Değişkenler ilk tanımlamada değer almalıdır. Tek başına yazılamaz. (Ör: foo = 2)&lt;/li>
&lt;li>Method tanımları küçük harfle başlar. (Ör: Math:cos(x))&lt;/li>
&lt;li>Sabitlerin tamamı büyük harf olmalıdır. (Ör:Math:PI)&lt;/li>
&lt;/ul>
&lt;h2 id="reserve-kelimeler">Reserve Kelimeler&lt;/h2>
&lt;pre tabindex="0">&lt;code>alias and BEGIN begin break case class def defined
do else elsif END end ensure false for if
fin module next nil not or redo rescue retry
return self super then true undef unless until when
while yield
&lt;/code>&lt;/pre>&lt;h2 id="veri-tipleri">Veri Tipleri&lt;/h2>
&lt;ul>
&lt;li>Sayı(numbers)&lt;/li>
&lt;li>String&lt;/li>
&lt;li>Aralık(ranges)&lt;/li>
&lt;li>RegEx&lt;/li>
&lt;li>Sembol(symbol)&lt;/li>
&lt;li>Diziler(arrays)&lt;/li>
&lt;li>Sözlükler(hashes)&lt;/li>
&lt;li>Prosedur (proc)&lt;/li>
&lt;/ul>
&lt;h3 id="sayılar">Sayılar&lt;/h3>
&lt;ul>
&lt;li>Bignum (1234567890)&lt;/li>
&lt;li>Fixnum (1234)&lt;/li>
&lt;li>Float (1234.56)&lt;/li>
&lt;li>Hex (0xFFFF)&lt;/li>
&lt;li>Binary (0b0101010)&lt;/li>
&lt;li>Octal (0377)&lt;/li>
&lt;li>?a ASCII karakterinin sayısal degeri&lt;/li>
&lt;li>?\C-a Control-a karakterinin sayısal degeri&lt;/li>
&lt;li>?\M-a Meta-a karakterinin sayısal degeri&lt;/li>
&lt;li>?\M-\C-a Meta-Control-a karakterinin sayısal degeri&lt;/li>
&lt;/ul>
&lt;h3 id="string">String&lt;/h3>
&lt;p>%() ile baslayan karakterleri asagidakiler string karakteridir. %[], %!!, %@@, vb. &amp;lsquo;araya deger girilemez&amp;rsquo; &amp;ldquo;#{degisken}, ve backslash karakter alir\n&amp;rdquo; %q(araya deger girilmez) %Q(araya deger ve backslash karakteri alir) %(araya deger ve backslash karakteri alir) &lt;code>echo komut satırı ara deger ve backslash karakterleri alir.&lt;/code> =&amp;gt; &lt;code>ls&lt;/code> denemek ister misiniz? %x(echo komut satırı ara deger ve backslash karakterleri alir.) Backslash \t (tab), \n (newline), \r (carriage return), \f (form feed), \b (backspace), \a (bell), \e (escape), \s (whitespace), \nnn (octal), \xnn (hexadecimal), \cx (control x), \C-x (control x), \M-x (meta x), \M-\C-x (meta control x)&lt;/p>
&lt;h3 id="semboller">Semboller&lt;/h3>
&lt;p>Sozluk(hash) ifadelerinde kullanmak icin idealdir. C&amp;rsquo;de enum&amp;rsquo;a benzer fakat deger almazlar.(Bazi ozel sembol tanımlama tipleri alır) Asagida orneklerle açıklamaya çalıştım. :sembol =&amp;gt; :sembol :&amp;rsquo;#{&amp;ldquo;ara&amp;rdquo;} deger almaz&amp;rsquo; =&amp;gt; :&amp;quot;#{&amp;ldquo;ara&amp;rdquo;} deger almaz&amp;quot; :&amp;quot;#{&amp;ldquo;ara&amp;rdquo;} deger&amp;quot; =&amp;gt; :&amp;ldquo;ara deger&amp;rdquo; %s(#{&amp;ldquo;ara&amp;rdquo;} deger almaz) =&amp;gt; :&amp;quot;#{&amp;ldquo;ara&amp;rdquo;} deger almaz&amp;quot;&lt;/p>
&lt;h3 id="aralıklar">Aralıklar&lt;/h3>
&lt;p>1..10 =&amp;gt; 1&amp;rsquo;den 10&amp;rsquo;a kadar (10 dahil) 1&amp;hellip;10 =&amp;gt; 1&amp;rsquo;den 10&amp;rsquo;a kadar (10 haric) &amp;lsquo;a&amp;rsquo;..&amp;lsquo;z&amp;rsquo; &amp;lsquo;a&amp;rsquo;&amp;hellip;&amp;lsquo;z&amp;rsquo; (1..10) === 5 =&amp;gt; dogru (1..10) === 10 =&amp;gt; dogru (1&amp;hellip;10) === 10 =&amp;gt; yanlis (1..10) === 15 =&amp;gt; yanlis&lt;/p>
&lt;h3 id="diziler">Diziler&lt;/h3>
&lt;p>[1, 2, 3] %w(foo bar baz) %W(foo bar baz #{var}) Dizilerde index degerleri negatif deger alabilir. Bu dizinin orjinini sondan baslatir.&lt;/p>
&lt;h3 id="sözlükler-hashes">Sözlükler (Hashes)&lt;/h3>
&lt;p>{&amp;lsquo;bir&amp;rsquo;=&amp;gt;1, &amp;lsquo;iki&amp;rsquo;=&amp;gt;2, &amp;lsquo;uc&amp;rsquo;=&amp;gt;3} { expr =&amp;gt; expr&amp;hellip;}&lt;/p>
&lt;h3 id="değişkenler-ve-sabitler">Değişkenler ve Sabitler&lt;/h3>
&lt;p>4 tip değişken etki alanı vardır. Değişkenin isminin başına gelen özel işaretlerle ve etki alanına göre yorumlayıcı tarafından anlaşılır. 1) Global değişkenler Tanım: $global_variable = 0 Uygulama boyunca yaşarlar. Özellikle ön tanımlı global değişkenler ile kullanılır. Hepsi ($) işareti ile başlar. 2) Sınıf Değişkenleri Tanım: @@class_variable = 0 Sınıf her yeni yaratılan örnekte bu değişkenin değeri yeni nesneye aktarılır. Singleton kalıbında kullanılabilir. Bir örnekle açıklayalım;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">Boom&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">@@class_counter&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">initialize&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">@instance_counter&lt;/span> &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">explode&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">@@class_counter&lt;/span> &lt;span style="color:#0550ae">+=&lt;/span> &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#953800">@instance_counter&lt;/span> &lt;span style="color:#0550ae">+=&lt;/span> &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">puts&lt;/span> &lt;span style="color:#0a3069">&amp;#34;@@class_counter =&amp;gt; &lt;/span>&lt;span style="color:#0a3069">#{&lt;/span>&lt;span style="color:#953800">@@class_counter&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">puts&lt;/span> &lt;span style="color:#0a3069">&amp;#34;@instance_counter =&amp;gt; &lt;/span>&lt;span style="color:#0a3069">#{&lt;/span>&lt;span style="color:#953800">@instance_counter&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d1 &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">Boom&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d1&lt;span style="color:#0550ae">.&lt;/span>explode&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d1&lt;span style="color:#0550ae">.&lt;/span>explode&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d2 &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">Boom&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>d2&lt;span style="color:#0550ae">.&lt;/span>explode&lt;span style="color:#1f2328">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Örnekleme(instance) Değişkenleri&lt;br>
Yerel Değişkenler&lt;/p></content></entry><entry><title>Distributed DoS Saldırısı ve Yapılması Gerekenler!</title><author><name/><uri/></author><id>https://hozgan.com/distributed-dos-saldirisi-ve-yapilmasi-gerekenler/</id><updated>2007-09-29T00:00:00Z</updated><published>2007-09-29T00:00:00Z</published><content type="html">&lt;p>İnternetin bir yıl içinde büyüyen ve yenilikçi fikriyle dikkatleri üzerine çeken bir şirketi (adını vermeyeceğim) bir haftadır ara-ara &lt;a href="http://sozluk.sourtimes.org/show.asp?t=ddos">d-DoS&lt;/a> saldırılarına maruz kalıyordu. Dün çok ciddi bir saldırı oldu. (saniyede 16.000 connection), ISP&amp;rsquo;nin bant genişliğinin dahi kaldıramadığı bu saldırıyı engellemek için tüm gün TCP paketlerini inceleyerek ve kafamızı duvardan duvara vurarken, saldırının sahibine yaratıcı küfürler bularak geçirdik. Ve nihayet en sonunda saldırıyı engelleyebildik. Nasıl engellediğimiz ile ilgili bilgiye aşağıda bulabilirsiniz.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Önce atağın hangi sayfaya geldiğini tespit edin!. Ve tespit ettikten sonra o sayfayı IPS üzerinden bloklayın.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Eğer saldırı bir sayfa değilde bir URL&amp;rsquo;e geliyorsa, ozaman çok basit bir index.html sayfası hazırlayıp, o sayfadan ana sayfanıza javascript redirect yapın. Basit index.html sayfasının önemi şundan kaynaklanıyor. DoS saldırılarını Load Balancer&amp;rsquo;lar zaten yönetebiliyorlar. Fakat bunu yapmak için yapılan isteğin tamamlanmış olması gerekiyor. Eğer 24 saniyede yüklenen bir sayfanız varsa, load balancer faydadan daha çok zarar getiriyor. Hatta benim önerim, index.html sayfanızın dinamik bir şekilde bir açılış sayfası adresine yönlendirme yapması.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Bu sırada gelen paketleri inceleyin. Genelde DoS saldırıları küçük programlar vasıtasıyla yapılır ve bu küçük programların kullandığı HTTP kütüphaneleri header&amp;rsquo;in User-Agent: alanina kendilerini yazarlar. Buradan tanınan paketler yakalanabilir. Yada kendi requestleriniz ozel bir header bilgisi ile gönderilebilir. vs..&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Kişinin IP-Spoofing yapıp yapmadığını IP&amp;rsquo;lerin görünen uzaklığı ve TCL bilgisinden yakalamaya çalıştık. Gördük ki farklı makinelerden zombi requestler açılıyor..&lt;/p>
&lt;/li>
&lt;/ol></content></entry><entry><title>Adım Adım Ruby - 1 -</title><author><name/><uri/></author><id>https://hozgan.com/adim-adim-ruby-1/</id><updated>2007-09-21T00:00:00Z</updated><published>2007-09-21T00:00:00Z</published><content type="html">&lt;p>Ömrüm boyunca &amp;ldquo;C sytax&amp;rdquo;(C++, PHP, Java, C#, JS) dillerde geliştirmeler yaptım ve onları öğrendim. Bu nedenle &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;i kabullenmek ve sindirmek benim için çokta kolay olmadı. Lakin, &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;in özelliklerini görünce tüm ön yargılar, yerini eğlenceli bir oyuncağa bıraktı. Ruby öğrenme sürecimi bu kategori altında sizlerle paylaşacağım. Şimdi bakalım ilk adım ne olmalı?&lt;/p>
&lt;h2 id="neden-rubyi-seçmeliyim-">Neden Ruby&amp;rsquo;i Seçmeliyim ?&lt;/h2>
&lt;p>&lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>, son birkaç yılda &lt;a href="http://www.rubyonrails.org">Ruby on Rails&lt;/a> ile popülerlik kazanan bir dil. Henüz &lt;a href="http://www.python.org">Python&lt;/a> gibi çok geniş bir kütüphane arşivine sahip değil! Ama yakın gelecekte bu açığın doldurulacağına hiç şüphe yok. &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a> bir betik (script) dili. Ve betik dillerinden beklenen en önemli özelliğe sahip. Çeviklik ! Aşağıda bazı ilgi çeken özelliklerini size fikir vermesi için yazacağım. Not: Bu özelliklere detaylı olarak bir sonraki yazımda &amp;ldquo;programlamaya yeni başlayanlara&amp;rdquo; anlatır gibi beraber göz atacağız. C&amp;rsquo;de böyle Java da şöyle gibi notlarımı da aralara serpiştireceğim elbette.&lt;/p>
&lt;p>Ne diyorduk? &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a> çok amaçlı bir dil olsa da günümüzde özellikle web uygulamalarının geliştirilmesinde kullanılıyor. Web uygulamalarında tercih edilme sebeplerinden biri anında sonucu görebilmeniz. Yani Java&amp;rsquo;daki gibi derle bak, aptal uygulama sunucusunu yeniden başlat gibi absürdlükler yok!. ASP.NET 2.0 ile beraber, Java&amp;rsquo;daki bu salak mimariye alternatif olarak &lt;strong>App_Code&lt;/strong> gibi bir özellik gelmiş durumda. Tabii katmanlı mimariye geçtiğiniz an oda aynı şekilde derleme vs. gerektiriyor. (Tabii binary kütüphanelerin şöyle bir avantajı var. Kütüphane yazan proje ekibinin kodunu kullanan ekibin kafasına göre kod değiştirmesine engel oluyor. Böylece versiyon ve kod tabanı dağılmamış tek bir ekibin hakimiyetinde oluyor. Neyse konumuz bu değil gerçi ama aklıma gelmişken ileteyim dedim.&lt;/p>
&lt;p>Bunca laf ebeliği yaptıktan sonra, benim neden &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;i seçtiğimi söyleyeyim. Web uygulamamın Linux sunucunda koşmasını istiyorum. C# dilini seviyorum ama maalesef Mono hala sinir olmadan yazabileceğiniz bir durumda değil! &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>, Python gibi zorlayıcı özellikleri yok. Özellikleri ile kod yazarken eğlenmenizi sağlıyor. Çok hızlı gelişen bilişim sektöründe, aklınıza gelen fikrin, en hızlı şekilde ürüne dönüşmesi için, her projede muhakkak yaptığımız tekrarları &lt;a href="http://www.rubyonrails.org">Ruby on Rails&lt;/a> framework&amp;rsquo;unun engelliyor olması.&lt;/p>
&lt;h2 id="nereden-başlamalı-">Nereden Başlamalı ?&lt;/h2>
&lt;p>Bilgisayarınıza &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;i indirerek başlayabilirsiniz! :-) &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>, P3OS (Popüler 3 İşletim Sistemi: Windows, OSX, Linux)&amp;lsquo;ı destekler! &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;i kodlarını denemek için &lt;strong>irb&lt;/strong> uygulamasını kullanabileceğiniz gibi windows kurulum paketinde gelen SCiTE editorunude kullanabilirsiniz. &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;lsquo;i bilgisayarınıza kurduktan sonra, Mark Slagell tarafından yazılan, &lt;a href="http://www.pinguar.com">Pınar Yanardağ&lt;/a> tarafından güzel türkçemize kazandırılan &lt;a href="http://www.belgeler.org/uygulamalar/ruby/ruby-ug.html">Ruby Kullanıcı Klavuzu&lt;/a> dökümanını okumanızı öneririm. Genel bir bakış yapmanızı ve &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;rsquo;e olan ön yargıları yıkmanıza ve ilk adımı hızlıca yapmanızı sağlayacağı gibi aşağıda önereceğim kitaplar için bir ön hazırlık olacaktır.&lt;/p>
&lt;p>&lt;a href="http://www.ruby-lang.org">Ruby&lt;/a>&amp;rsquo;e bir giriş yapıp ne olduğunu öğrendikten sonra &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a> on Rails&amp;rsquo;i indirebilir ve Rails ile denemeler yapmaya başlayabilirsiniz. Rails ile ilgili denemeler için tavsiyem, şu &lt;a href="http://www.digitalmediaminute.com/article/1816/top-ruby-on-rails-tutorials">eğitmene (tutorial)&lt;/a> bakmanızı öneririm. Eğer genel &lt;a href="http://www.ruby-lang.org">Ruby&lt;/a> hakkında daha fazla bağlantı arıyorsanız &lt;a href="http://del.icio.us/search/?p=ruby">buradan&lt;/a> bulabilirsiniz..&lt;/p>
&lt;p>Rails&amp;rsquo;i terminalden şablon kodları generate ederek kullanabileceginiz gibi bir tüm platformlarda çalışabilen IDE&amp;rsquo;ler yardımıyla da kullanabilirsiniz. Ruby için, Eclipse eklentilerinin yanı sıra, Eclipse üzerine inşa edilmiş Aptana isimli JS IDE&amp;rsquo;sinin eklentisi olarak duyurulan Rad Rails&amp;rsquo;i kullanmanızı öneririm. Eğer Netbeans kullanmayı seviyorsanız Netbeans 6.0 ile Ruby desteği geldiğini söylemeliyim. Söylememe gerek var mı bilmiyorum ama, Vim ve Emacs ile Ruby yazmanız da mümkün!&lt;/p>
&lt;h2 id="ne-gibi-özellikleri-var-">Ne Gibi Özellikleri Var ?&lt;/h2>
&lt;h3 id="mantıksal-işlemler">Mantıksal İşlemler:&lt;/h3>
&lt;p>Ruby denetleyicileri ile biraz Perl&amp;rsquo;ü anımsatsa da, benim özellike ilgimi çeken &lt;strong>===&lt;/strong> operatörü. Bu operatör ile bir sayıyı aralığını tek hamlede kontrol edebiliriz.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">):&lt;/span>&lt;span style="color:#0550ae">001&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#0550ae">&amp;gt;&lt;/span> i &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">):&lt;/span>&lt;span style="color:#0550ae">002&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#0550ae">&amp;gt;&lt;/span> &lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0550ae">2&lt;/span>&lt;span style="color:#0550ae">..&lt;/span>&lt;span style="color:#0550ae">5&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">===&lt;/span> i
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># =&amp;gt; true&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="yordamsal-nesneler">Yordamsal Nesneler:&lt;/h3>
&lt;p>Bu özelliği C&amp;rsquo;deki fonksiyon göstericilerine (function pointer) benziyor. Yada C#&amp;rsquo;taki temsilci (delegate)&amp;rsquo;ler gibi çalışıyor. Bir kod kümesini bir yordam(process) icine alarak, daha sonra çağrı yapabilirsiniz.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">):&lt;/span>&lt;span style="color:#0550ae">001&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#0550ae">&amp;gt;&lt;/span> deamon &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#6639ba">proc&lt;/span>&lt;span style="color:#1f2328">{&lt;/span> &lt;span style="color:#6639ba">print&lt;/span> &lt;span style="color:#0a3069">&amp;#34;Deamon çalıştı &lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#1f2328">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>irb&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">):&lt;/span>&lt;span style="color:#0550ae">002&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#0550ae">&amp;gt;&lt;/span> deamon&lt;span style="color:#0550ae">.&lt;/span>call
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># =&amp;gt; Deamon çalıştı&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="tekil-metodlar">Tekil Metodlar:&lt;/h3>
&lt;p>Bu metod modeli, bir sınıfın bir metodunun geçici olarak yeniden yazılmasını sağlayan bir özellik. Bu özelliği kullanabilmek için sınıfın nesnesinin yaratılması gerekiyor.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ruby" data-lang="ruby">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">SingleMethod&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">size&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span> &lt;span style="color:#0a3069">&amp;#34;25&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test1 &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">SingleMethod&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test2 &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">SingleMethod&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>new
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">print&lt;/span> &lt;span style="color:#0a3069">&amp;#34;25&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#1f2328">test1&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>&lt;span style="color:#6639ba">size&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span> &lt;span style="color:#0a3069">&amp;#34;10&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">end&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test1&lt;span style="color:#0550ae">.&lt;/span>size &lt;span style="color:#57606a"># output -&amp;gt; 10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>test2&lt;span style="color:#0550ae">.&lt;/span>size &lt;span style="color:#57606a"># output -&amp;gt; 25&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Bir sonraki yazımda daha detaylı olarak Ruby&amp;rsquo;nin özelliklerini anlatacağım. Bu girdiyi bazı bağlantı önerileri vererek sonlandırıyorum. Beni izlemeye devam edin efenim :p&lt;/p>
&lt;h3 id="yazılımlar">Yazılımlar&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://www.ruby-lang.org/en/downloads/">Ruby&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://rubyforge.org/">Ruby Forge&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.rubyonrails.org/down">Ruby on Rails&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.radrails.org/download_rails_rdt.php">Rad Rails&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="kitaplar">Kitaplar&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="http://www.urlshield.net/l/nNX0NMJA">Learn to Program&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.urlshield.net/l/DD5sUVsV">Programming Ruby&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.urlshield.net/l/FgOQhKL">Agile Web Development with Rails&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.urlshield.net/l/07IDsBrA">Rails Recipes&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry><title>GRUB'u yeniden yüklemek !</title><author><name/><uri/></author><id>https://hozgan.com/grubu-yeniden-yuklemek/</id><updated>2007-09-06T00:00:00Z</updated><published>2007-09-06T00:00:00Z</published><content type="html">&lt;p>Windows bol göçen bir işletim sistemi olduğundan arada sırada yeniden kurmak gerekiyor. :-) Windows kuruncada sorunlar bitmiyor; bilgisayarın açılış(boot) yönetim aracı olan GRUB&amp;rsquo;u da siliyor. İşte böyle durumlarda linux Live CD&amp;rsquo;si ile açarak aşağıdaki işlemi yapmak gerekiyor.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>dd &lt;span style="color:#cf222e">if&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>/dev/hdX &lt;span style="color:#953800">of&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>MBR-backup &lt;span style="color:#953800">bs&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">512&lt;/span> &lt;span style="color:#953800">count&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dd &lt;span style="color:#953800">of&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>/dev/hdX &lt;span style="color:#cf222e">if&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>MBR-backup &lt;span style="color:#953800">bs&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">512&lt;/span> &lt;span style="color:#953800">count&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir /mnt/temp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mount /dev/hdX# /mnt/temp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>grub-install --rootdir&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;/mnt/temp&amp;#34;&lt;/span> /dev/hdX&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>hdX&lt;/strong> =&amp;gt; grub&amp;rsquo;un yükleneceği diskin adı.&lt;/p>
&lt;p>&lt;strong>#&lt;/strong> =&amp;gt; diskin, kök bölümünün bulunduğu sıra numarası.&lt;/p></content></entry><entry><title>İlkelerim</title><author><name/><uri/></author><id>https://hozgan.com/ilkelerim/</id><updated>2007-06-15T00:00:00Z</updated><published>2007-06-15T00:00:00Z</published><content type="html">&lt;ul>
&lt;li>Sorgula (Neden)&lt;/li>
&lt;li>İmkansızı iste!&lt;/li>
&lt;li>Araçta değil, sektörde uzmanlaş!&lt;/li>
&lt;li>Hayata aykırı gözlerle bak!&lt;/li>
&lt;li>Sorun değil, çözüm üret!&lt;/li>
&lt;li>Eğlendiğin işi yap!&lt;/li>
&lt;li>Meraklı ol!&lt;/li>
&lt;li>Hayal et!&lt;/li>
&lt;li>Olabildiğince basit/sade düşün!&lt;/li>
&lt;li>Şeytanlık yapma!&lt;/li>
&lt;li>İş ne olursa olsun, en iyisini yap!&lt;/li>
&lt;li>Verilerle konuş&lt;/li>
&lt;li>Kendine yatırım yap&lt;/li>
&lt;li>Sürekli Gelişim (Kaizen; Tanımla, Planla, Çalıştır, Gözden Geçir)&lt;/li>
&lt;/ul></content></entry><entry><title>Linux'tan, Windows'a Göç (Migration) !</title><author><name/><uri/></author><id>https://hozgan.com/linuxtan-windowsa-goc-migration/</id><updated>2007-06-14T00:00:00Z</updated><published>2007-06-14T00:00:00Z</published><content type="html">&lt;p>Aman yanlış anlaşılmasın! Linux&amp;rsquo;tan Windows&amp;rsquo;a göç etmek bence aptallıktır!. PHP ile yazılmış bir projeyi Linux&amp;rsquo;tan Windows&amp;rsquo;a göç ettirmek için şirketten bir iş atandı üzerime. PHP ile yazılmış olan Web uygulamasını göç ettirirken kodda sadece LDAP ile ilgili bazı değişiklikler yaptım. Tahmin edeceğiniz gibi Web için bu değişiklik bile fazla. Asıl değişiklik Cron&amp;rsquo;da çalışan bir kabul betiği (shell script) idi ki, bunu yeniden; yazarken Windows betiğine dair yeni şeyler öğrendim. Shell scriptin yaptığı Samba protokolünden ağ üzerindeki bir makinayi mount ediyor ve mount edilen dizinlerdeki dosyalar üzerinde işlem yapıyordu. İşte bu işlemin Windowsta ki karşılığı olan &lt;strong>&amp;ldquo;Mapping Network Drive&amp;rdquo;&lt;/strong> işlemini yaparak sanal bir sürücü oluşturmam gerekiyordu. Windows&amp;rsquo;ta bu işin &lt;strong>net&lt;/strong> komutu ile yapıldığını tahmin ediyordum. Bakın şu Allah&amp;rsquo;ın işine! &lt;a href="http://www.cae.wisc.edu/site/public/?title=nt4netuse">Haklıymışım&lt;/a> !&lt;/p>
&lt;p>&lt;strong>Linux&amp;rsquo;ta yapılan;&lt;/strong>&lt;/p>
&lt;p>&lt;em>mount -t smbfs -o username=admin,password=adminpass,workgroup=stargate //machine_name/documents /mnt/documents/&lt;/em>&lt;/p>
&lt;p>&lt;strong>yada&lt;/strong>&lt;/p>
&lt;p>&lt;em>mount -t cifs //10.100.8.36/documents /mnt/documents/ -o username=admin,password=adminpass&lt;/em>&lt;/p>
&lt;p>&lt;strong>Windows&amp;rsquo;ta yapılması gereken;&lt;/strong>&lt;/p>
&lt;p>&lt;em>net use h: \machine_name\documents&lt;/em>&lt;/p></content></entry><entry><title>Proje Yönetim Sanatı ve İnsan Faktörü</title><author><name/><uri/></author><id>https://hozgan.com/proje-yonetim-sanati-ve-insan-faktoru/</id><updated>2007-06-09T00:00:00Z</updated><published>2007-06-09T00:00:00Z</published><content type="html">&lt;ol>
&lt;li>
&lt;p>Projenin hedefleri net olmalıdır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje, büyük resme(bütüne) uygun olmalı.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Doğru iş için doğru kişi atanmalı.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Doğru eğitimci ve danışman. Proje ekibine yeni katılan bir kişinin adaptasyon süreci için doğru eğitimcinin atanması gerekir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Müşteri ihtiyaçlarını anlamak gerekir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje ekibine gereken ilgi ve dikkati göstermek.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Sempatik kanallara güvenmek gerekir. Sempatik kanallar; hatır, gönül işi ile yürüyen işlere denir. Bunu yapmak proje ekibinin motivasyon ve işlerinin sorunsuz ilerlemesi içindir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Zaman ve para önemlidir. Proje yöneticisi, kısıtlı zaman ve para ile işleri tamamlamakla görevlidir. Bunu asla unutmamalıdır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje ekibinin bütünün parçası olmalarını sağlamak gerekir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Başarıyı tanımlama ve kutlamak gerekmektedir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Liderlik önemlidir. Ekibi yolun yarısında bırakan ekip lideri ile hiçbir ekip üyesi çalışmak istemez. İyi bir lider, çalışanlara güven verir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje ekibi ile iletişim halinde olmak ve ayak üstü hatır soruları ile proje ekibini sorgulama hissi uyandırmadan projenin durumunu anlamak.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje bir bütündür. Bir uçağın en önemli parçası hangisidir? Hepsi öyle değil mi? Proje ekibi ve projenin parçaları içinde bu durum böyledir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>İşbirliği önemlidir. Proje ekibi ile işbirliği içinde olmak, onları anlamak ve yardımda bulunmak her ne kadar PM’in işi olmasada ekibin proje yöneticisi ile olan bağlarını güçlendirir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Başlayabilmek önemlidir. Başlamak bitirmenin yarısıdır. Karar vermek ve başlamak gerekir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>PMI‘ın proje kapsam diagramı. (Zaman, Kapsam, Maliyet ve Kalite) Bir projenin başarıya ulaşması için Zaman, Kalite, Maliyet üçgenini ve üçgenin içinde bulunan Kapsam’ı dikkate almız gerekir. (PMI 2005 yılında bu üçgeni bir altıgene çevirmiş ve Risk ve Müşteri Tatmini terimlerinide eklemiştir.)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Kontrol hayatidir. İş yapana kontrol ettirilmez. İşi yapan kendi hatalarını göremez. Ayrıca unutulmaması gereken birşey daha vardır. İşi yapanlar (geliştiriciler) analitik düşünen kişilerdir. Ve bu nedenle test edilmesi gereken durum ve riskleri görmekte pek başarılı değildirler.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Size kaç lazım? Proje sponsorunun, 2 + 2’sine vereceğiniz cevap kaçtır? 4 mü? yoksa 3 &amp;gt; x &amp;gt; 5 mi? Hayır! Vermeniz gereken cevap, “Siz kaç olmasını istersiniz?” olmalıdır. Proje sponsorunun, projenin tamamlanması için beklediği tarihlerin üstü örtülerek, proje ekibi ile tarihlerini hesapladıktan sonra, proje sponsorunun istediği tarih kıyaslanarak, ortak bir payda aranır. Eğer aradaki fark uçurum ise ekibin ve projenin sağlığı için redd edilmelidir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>İnsanı önemseme&lt;/p>
&lt;ul>
&lt;li>Görüşmeler&lt;/li>
&lt;li>Çatışma Yönetimi&lt;/li>
&lt;li>Motivasyon&lt;/li>
&lt;li>İkna&lt;/li>
&lt;li>Güdüleme (İşi sahiplenme)&lt;/li>
&lt;li>İletişim&lt;/li>
&lt;li>Tanıma ve Tanınma&lt;/li>
&lt;li>Paylaşama&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Herşeye hazırlıklı olmak. Proje yöneticisi, hertürlü risk hazırlıklı olmalıdır.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tarih ve Tekerrür. Hani bir salıngaç resmi vardır ya. Müşterinin istediği, tasarlanan, gerçekleştirilen ve sonuç…&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karanlıkta ilerlemek. Projeler başlangıç aşamasında belirsizlik hakimdir. Eğer belirsizlikler bizi ilgilendiriyorsa risk olur. Peki risk nedir? Risk, tehdit ve fırsatlar bütünüdür. Yani projenin her yerinde riskler mevcuttur. Riskleri yönetmek için, proje ekibi ile konuşulması gereken konular şunlardır;&lt;/p>
&lt;ul>
&lt;li>Varsayımların ve tahminlerin nedir?&lt;/li>
&lt;li>İstisnalar nelerdir?&lt;/li>
&lt;li>Değişim neler doğurur?&lt;/li>
&lt;/ul>
&lt;p>Proje ekibinin, projenin her adımında yukarıdaki sorulara cevap araması gerekir.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Proje ekibi bir aile olmalı ve proje ise hepsinin amacı olmalı.&lt;/p>
&lt;/li>
&lt;/ol></content></entry><entry><title>Sunum Nasıl Yapılmalı?</title><author><name/><uri/></author><id>https://hozgan.com/sunum-nasil-yapilmali/</id><updated>2007-06-03T00:00:00Z</updated><published>2007-06-03T00:00:00Z</published><content type="html">&lt;p>&lt;a href="http://www.istanbulbilisimkongresi.org">İstanbul Bilişim Kongresi&lt;/a>&amp;rsquo;nde birçok sunum izledim. Sunumların içinde çok kötülerde vardı, çok başarılı olanlarda. Kötü sunumların içinde, şirket tanıtımı ağırlıklı sunumlar, sunumunu okuyanlar, sunduğu şeye hakim olmayanlar vs.. var iken, başarılı sunumlarda ise, izleyici ile etkileşim içinde, izleyiciyi hemen saran, şaşırtan, sorunu gösteren ve çözen sunumlarda mevcuttu. Bunları görünce ben de iyi bir sunum nasıl olmalı diye düşünmeye başladım ve aşağıdaki önerileri oluşturdum.&lt;/p>
&lt;ul>
&lt;li>Sunumunuz bir derdi anlatmalı ve çözümü sunmalı.&lt;/li>
&lt;li>Herkesçe bilinen 10 20 30 kuralı. Sunumlarda en fazla 10 slayt kullanın, derdinizi 10 karede anlatın. Sunumunuz 20 dakikadan uzun sürmesin, çünkü 20&amp;rsquo;nci dakikadan sonra dinleyiciniz azalır. Sunumlarınızda 30 puntodan daha küçük font kullanmayın; anlatacağınız her şeyi slaytlarınıza yazıp oradan okumaya çalışmayın dinleyicilerinizi kaybedersiniz.&lt;/li>
&lt;li>Yeni bir fikir ve aykırı bir bakış açısı sunmalı.&lt;/li>
&lt;li>Bir sunum ilginç bir başlık, dikkat çekici bir resim, konu ile ilgili hakim olduğunuz hikaye, fıkra ve anektodlarla dolu olması seyirciyi sunumun içine çekecek öğelerdir.&lt;/li>
&lt;li>İyi bir girizgah. izleyicinin gözünde hadi anlat bakalım bakışlarının ortadan kalkmasını sağlar. Ve bir anda izleyiciniz kendini sunumunuzun içinde bulunur.&lt;/li>
&lt;li>Sunumun teması, aykırı bir bakış açısı içermeli. Kitaplardan edinilen bilgileri orada eğer çok iyi bir özet ile anlatmayacaksanız sakın denemeyin. Bir problem seçin ve farklı bir açıdan bakın.&lt;/li>
&lt;li>Sunumdan sonra gelecek soruları düşünerek, hakim olunan bir konuda sunum hazırlayın. Eğer sunum yaptığınız konuya hakim değilseniz, bunu izleyiciler anlar ve sizi rezil etmek için ellerinden geleni yaparlar.&lt;/li>
&lt;/ul></content></entry><entry><title>Semantic Web (Nam-ı Diğer Web 3.0)</title><author><name/><uri/></author><id>https://hozgan.com/semantic-web-nam-i-diger-web/</id><updated>2007-05-20T00:00:00Z</updated><published>2007-05-20T00:00:00Z</published><content type="html">&lt;blockquote>
&lt;p>&amp;ldquo;Web için bir hayalim var; bilgisayarlar, web üzerindeki tüm veriyi (içerikler, bağlantılar ve insanlarla bilgisayarlar arasındaki işlemler), analiz etme kabiliyetine sahip olacaklar. Henüz hazır olmasa da &amp;lsquo;Semantic Web&amp;rsquo;in yapılması mümkün!. Hazır olduğunda ise günden güne ticaret yöntemlerimiz, bürokrasi ve günlük yaşamlarımız birbiri ile konuşan makinalar tarafından idare edilecek. İnsanlığın asırlardır konuştuğu &amp;lsquo;zeki araçlar&amp;rsquo; gerçek olacak.&amp;rdquo; &lt;a href="http://tr.wikipedia.org/wiki/Tim_Berners-Lee">Tim Berners-Lee&lt;/a>&lt;/p>&lt;/blockquote>
&lt;p>&lt;img src="https://upload.wikimedia.org/wikipedia/commons/c/c5/W3c_semantic_web_stack.jpg" alt="semantic web roadmap">&lt;/p>
&lt;p>Söz büyüğündür der atalarımız, bu nedenle lafıma, internetin babası, semantic web kavramını ilk ortaya atan ve gerçekleşmesi için bir &lt;a href="http://www.w3.org/DesignIssues/Semantic.html">yol haritası&lt;/a> bize sunan üstad &lt;a href="http://tr.wikipedia.org/wiki/Tim_Berners-Lee">Tim Berners-Lee&lt;/a> ile başlayalım istedim. Geçtiğimiz yıl Web 2.0&amp;rsquo;ı anlamaya ve kavramaya çalışırken, geçen Kasım(Kasım 2006) ayında Web 3.0 adıyla yeni bir kavram duyduk. Neymiş bu Web3.0 dediğimizde eski bir terim ile semantic web kavramı ile karşılaştık. Aşağıdaki grafikte Web 4.0&amp;rsquo;ın bile adının geçtiğini dikkatinizi çekmek isterim. O da ayrı bir makale konusu olduğundan lafı çok uzatmadan neymiş bu semantic web gelin beraber inceleyelim.
&lt;a href="http://farm1.static.flickr.com/250/452486876_b61b9ff7b2_o.jpg">![](files/weblog/webdevelopment.jpg)&lt;/a>
&lt;strong>Semantic Web nedir?&lt;/strong> Web 1.0&amp;rsquo; da sayfalar insanların okuyup anlayabileceği şekilde hazırlanıyordu. Web 2.0 ile verileri etiketlemeye ve AJAX tekniği ile web sayfaları kullanımı kolay ve hızlı bir hal aldı. Makinelerin birbirleri ile konuşabilmesi için XML çıktılar veren metodlar ürettik. SOAP ve benzeri protokoller inşa ettik. Tim Berners Lee&amp;rsquo;nin telafuzunu ettiği Web 3.0’a geçiş için gerekli olan hazırlıkları yaptık. Başında &amp;rsquo;e&amp;rsquo; harfi koyarak bürokratik işleri bizim için makinalarin yapmasını sağladık. Bu makinaların konuştuğu yerlerde karar gerektiren noktalara ise insanlar koyduk. Web 3.0 ile makinalar bizi daha önceki davranışlarımızdan ve konuştuklarımızdan anlamaya ve çözümler üretmeye çalışacak. Makina-Makina ile karar gerektiren kısımlarda da konuşabilecek. Bu konuyu aşağıdaki gibi bir örnek ile açıklama çalışayım. &lt;em>Hayal edin!, diyelim ki cumartesi günü basketbol maçı yapacaksınız ve basketbol maçı yapmak için bir yer arıyorsunuz. Arama motoruna &amp;ldquo;istanbul&amp;rsquo;da cumartesi günü uygun basketbol sahası&amp;rdquo; şeklinde bir arama yaptınız. Arama motoru cümleyi yorumladı ve size sadece basketbol sahalarının bulunduğu siteleri getirdi. Hatta istanbul kriterinide girdiginiz icin sadece Istanbul&amp;rsquo;dakileri sahaları getirdi. İşte size semantic web budur. Semantic web zayıf bir yapay zeka kullanır. İşi biraz yokuşa sürelim ve yapay zeka kavramını devreye sokalım. Arama motoru hava durumunu inceleyip, cumartesi günü İstanbul&amp;rsquo;da yağış olduğu için sizi uyararak üstü açık olan basketbol sahalarını görmek isteyip, istemediğimi sorabilir. Yada sadece üstü kapalı basketbol sahalarını listeleyebilir. İşte yapay zeka ile semantic web arasındaki fark budur.&lt;/em> Bu örnekten sonra gerçekleşmesi için neler gerektiğine bakalım. &lt;strong>Peki makinalar, siteleri bizim gibi nasıl anlayacak?&lt;/strong> Makinaların bizi anlaması için gerçekten çok fazla veriye ihtiyaç var. İnternette bu veriler yeterli oranda mevcut. Fakat dağınık ve hiçbirinin bir diğerine makinaların anlayabileceği bir ilişkisi yok. Yani verilerin toplanması ve yorumlanması ve daha sonraki sorgulamalar için depolanması gerekiyor. Şimdi bu 3 temel öğe altında neler yapılıyor yada yapılması gerekiyor onları inceleyelim. &lt;strong>1) Verileri Anlamlı Bir Şekilde Ayrıştırma&lt;/strong>
&lt;strong>a) Etiketleme Yöntemiyle İçeriği Toplamak:&lt;/strong>&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Web 2.0 ile beraber, hayatımızda etiketleme(tag) kavramı ortaya çıktı. Böylece makinaların bir sürü veri içinden biz insanlar için öncelikli ve gerekli olan bir veri alanı oluşturmuş olduk. Etiketlemenin en büyük avantajı, kelimeler arasındaki ilişkilerin insanlar tarafından sağlanıyor olması. Mesela, kartal resimlerinin bulunduğu bir siteyi etiketlemek istesek, etiketimiz sanırım “kartal kuş fotoğraf ” gibi bir etiketler dizisine sahip olurdu. Böylece sizin botlarınızın yapacağı işi insanlar yapmış olacak. %20’ye %80 kuralını bilirsiniz. Web üzerindeki verinin %20’si gerçekten insanların ihtiyacı olan veridir. Geri kalan %80 ise çöp veridir. Buna dayanarak, insanların girdiği veri tamamiyle %20’lik olan gerekli alana girecektir. Etiketlemek, aynı dizideki etiketlere göre bir anlam ilişkisi bulunur. Yukarıdaki örneğimizi ele alalım. Kartal bir kuştur. Ve sitedeki veriler kuş resimleridir. Çok güçlü olmasada kendimize küçük bir semantic web uygulaması oluşturduk. Tabii daha yapılması gereken çok iş var. Bu sadece bir başlangıç olduğunu unutmamak gerekir.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Etiketleme ile ilgili araç-amaç ilişkisine şuan aklıma gelen en güzel örnek, &lt;a href="http://images.google.com/imagelabeler/">Google Image Labeler&lt;/a>. Google&amp;rsquo;ın amacı etiketi olmayan resimleri etiket altında toplamak. Ama bir sürü etiketlenmesi gereken resim var. Bu iş için nasıl bir şey yapmalı? İnsanlar eğlenceyi sever. Oyunlar eğlencelidir. Neden bu işi oyun olarak sunmayalım düşüncesi ile ortaya çıkmıştır.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;strong>b) Alana Göre İçeriği Toplamak:&lt;/strong>&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Daha öncede söylediğim gibi semantic web için büyük bir içerik gerekli. Google&amp;rsquo;ın veri madenciliği yapmasının sebebi bu aslında. Google&amp;rsquo;ın hedefi, Hakia gibi semantic web. hatta belki daha da ileriye giderek yapay zeka (Google&amp;rsquo;ın Master Plan&amp;rsquo;ın çizili olduğu kocaman &lt;a href="http://undergoogle.com/tools/GoogleMasterPlan.html">yazı tahtasını&lt;/a> incelemiş olanlar &amp;ldquo;AI Developer&amp;rdquo; hayallerini bilirler.) konuları. Fakat Google, Hakia’dan farklı olarak taklit ederek öğrenme yöntemini izliyor. Belli bir alana (domain) yönelik çıkardığı servisler bu amaca hizmet ediyor. İsterseniz bu servislerden bir kaçına bakalım;&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;img src="http://www.ozgan.net:8086/files/weblog/googlemasterplan.jpg" alt="">&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->1) GMail; epostaların hayatımıza girmesi ile çok önemli veriler, eposta kutularımızda toplanmaya başladı. Üye olduğumuz yerler (ilgi alanlarımız) ve şifreleri, özel yazışmalarımız, konuşama şeklimiz vs.. Neden google&amp;rsquo;ın bir dosyayı silmenizi istemediğini 2.8 GB alan verdiğini düşünüyorsunuz. Hatırlarsanız gmail ilk çıktığında davetiye yolu ile çalışıyordu. Yani insanların birbiri ile olan ilişkilerinide tutmakla işe başladılar.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->2) GTalk; eğer bir bot yazacak olsanız. Dünyada bir çok insanın, sorulara karşı verdiği cevapları loglasanız ne elde ederdiniz. Birçoğumuz konuşurken çeşitli hazır kalıpları kullanırız.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->- Naber&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->- İyilik, senden&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Bu kalıp ve benzeri kalıpları sürekli kullanıyoruz. GTalk Google için inanılmaz bir insanı taklit aracı.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->3) Google Image Labeler; oyun görünümlü servis. Web kullanıcıları bedavaya veri girişi için kullanamanın en etkili yolu :)&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&lt;strong>c) Anlamlı İndeksleme ve Dilbilgisi:&lt;/strong>&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Hakia’dan yola çıkmak bu konu başlığı için çok doğru olacak. Yahoo ve Google’ın pagerank algoritması verileri kelime anlamına göre indekslemez. Metaya göre indeksler. Bu nedenle yukarıda söylediğimiz alana gore içerik toplama yöntemiyle ilerliyorlar. Anlamlı indeksleme için ise özellikle Google’ın çalışmaları olduğunu site çeviri servisi gibi bazı servisler bize ipucu veriyor.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Hakia’nın çalışmaları veriyi anlamlandırarak indeksleme temeline dayanıyor. Özellikle yaptıkları &lt;a href="http://labs.hakia.com/hakia-lab-onto.html">OntoSem&lt;/a> (&lt;a href="http://www.ontologicalsemantics.com/">Ontological Semantics&lt;/a>) adındaki teknolojileri bu işe yarıyor. OntoSem, Prof. Victor Raskin’in akademik çalışması; bu konunun amacı doğal dilleri anlamlandırma temeline dayanıyor. Yani doğal diller üzerinde işlemler yazılım mühendisliğine dayanıyor.&lt;!-- raw HTML omitted -->Bu ciddi zorlukları olan bir konu. Cümle öğelerine bölünerek anlamlandırıldığı gibi tipine görede bir ontology ağacında yerini alıyor. Böylece kelimeler ağaçtaki yerine gore indeksleniyor. Yapay zekanın önemli konu olacağı şüphesiz bir konu. Hakia’nın diğer çalışmalarına &lt;a href="http://labs.hakia.com/">buradan&lt;/a> erişilebilir.
&lt;strong>2) Ayrıştırılan Verilerin Bir Yerde Toplanması&lt;/strong> Verileri toplamak için en yaygın yöntem olarak, RDF kullanılmaktadır. &lt;a href="http://www.w3.org/RDF/">RDF(Resource Description Framework)&lt;/a> W3C’ bulduğu bir ilişkilendirme çatısıdır. Şimdiden birçok kurum ve kuruluş tarafından standart olarak kabul edilmiş ve kullanılmaya başlamıştır. Dilbilgisindeki özne, nesne, yüklem bağlantısına benzeyen bir söz dizimine sahiptir. Yukarıda daha önce verdiğimiz örneğe geri dönersek; İstanbuldaki basketbol sahalarını listelemek. İTÜ, İstanbul’un en güzel basketbol sahasına sahiptir. Burada ‘İTÜ’ özne, ‘İstanbul’ nesne, ‘en güzel basketbol sahasına sahiptir’ ise yüklemdir. Şimdi bunu RDF içinde görelim.
&amp;lt;rdf:RDF&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->xmlns:rdf=&amp;ldquo;&lt;a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#%22">http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;/a>&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->xmlns:dc=&amp;ldquo;&lt;a href="http://netology.org/dc/elements/1.1/%22">http://netology.org/dc/elements/1.1/&amp;quot;&lt;/a>&amp;gt;&lt;!-- raw HTML omitted -->&amp;lt;rdf:Description rdf:about=&amp;ldquo;&lt;a href="http://etkinlik.itu.edu.tr/basketbol%22">http://etkinlik.itu.edu.tr/basketbol&amp;quot;&lt;/a>&amp;gt;&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&amp;lt;dc:location&amp;gt;İTÜ&amp;lt;/dc:location&amp;gt;&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&amp;lt;dc:city&amp;gt;İstanbul&amp;lt;/dc:city&amp;gt;&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&amp;lt;/rdf:Description&amp;gt;&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->&amp;lt;/rdf:RDF&amp;gt;
&lt;a href="http://netology.org/dc/elements/1.1/">http://netology.org/dc/elements/1.1/&lt;/a> adresinde location ve city tanimlanmistir. &lt;a href="http://www.w3.org/RDF/" title="RDF Resource Description Framework">![RDF Resource Description Framework Icon](http://www.w3.org/RDF/icons/rdf_w3c_icon.96)&lt;/a> Yukarıdaki örnekten de anlaşılacağı üzere RDF karışık bir yapıya sahiptir. Bu sebeple &lt;a href="http://www.w3.org/TR/owl-features/">OWL(Web Ontology Language)&lt;/a> kullanılmaktadır. OWL ontology grupları oluşturmaya yarar ve RDF&amp;rsquo;ten çok daha kolaydır. Aşağıda yaşlı kadınların sahip olduğu kediler ile ilgili bir örnek verilmiştir.
Class(a:old_lady complete&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->intersectionOf(a:person a:female a:elderly))&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Class(a:old_lady partial intersectionOf(&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->restriction(a:has_pet allValuesFrom (a:cat))&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->restriction(a:has_pet someValuesFrom (a:animal))))&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->Class(a:cat_owner complete intersectionOf(a:person&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->restriction(a:has_pet someValuesFrom (a:cat))))&lt;/p>
&lt;ul>
&lt;li>Yaşlı kadınlar muhakkak evcil bir hayvana sahiptir.&lt;/li>
&lt;li>Yaşlı kadınların evcil hayvanları kedilerdir.&lt;/li>
&lt;li>Kedilerin sahibi yaşlı kadınlardır.&lt;/li>
&lt;/ul>
&lt;p>Daha kapsamlı bir örneğe &lt;a href="http://www.cs.man.ac.uk/~horrocks/ISWC2003/Tutorial/">buradan&lt;/a> erişebilirsiniz. &lt;strong>3) Anlamlı Verilerin İçinden Sorgulama&lt;/strong> SPARQL en çok kullanılan sorgulama dilidir. Hakia&amp;rsquo;nında bu konuda kendi geliştirdiği &lt;a href="http://labs.hakia.com/hakia-lab-qdex.html">QDEX(Query Detection and Extraction)&lt;/a> adında bir teknoloji ile bu işi yapar. &lt;strong>Semantic Web İçin Başlangıç Noktası Neden Arama Motorları?&lt;/strong> İnsanların hayatında her zaman büyük yada küçük bir hedefi vardır. Hedeflere ulaşmak için çeşitli &lt;strong>çözüm ararlar&lt;/strong>. İşte anahtar kelime bu, &lt;strong>Aramak&lt;/strong>. Hayatımız hep birşeyler arayarak geçer. Bir insanın 3 tip hedefi vardır. a) İhtiyaç b) Statü c) Eğlence Arama motorları neden hayrına bize böyle bir hizmet sağlıyor? Neden böyle bir amaçları var. Arkasında ne yatıyor olabilir? İnsanların aradıklarını bulmak için ne aradıklarını bilmeniz gerekir. İnsanların istedikleri şeyleri bildiğinizi düşünün. Bu tanrısal bir erdemdir. Ve gerçekten büyük bir güçtür. Çünkü bazı isteklerimizi, başkalarının öğrenmesi vicdanen bizi rahatsız edebilir. Sorumuza tekrar geri dönelim; neden böyle bir hizmet için mücadele ediyorlar? Bence gelecekte bilgi hür olacaktır. Şu an çok saçma bir şekilde DNA&amp;rsquo;larımız, bazı hastalıklar patent altına alınmakta, birilerinin mülkiyeti altına girmektedir. Çeşitli fikir mülkiyetleri orta atılmaktadır. Bu fikri yıkmak adına CreativeCommon adı altında bir oluşum bulunmaktadır. Fikir mülkiyeti saçma bir fikirdir. Hepimizin bulduğu şeyler çevremizdeki etkenler ve duygularla yaratılmıştır. Bilgi kimseye ait değildir. Şuanki kapitalizm etkisindeki dünyanın bu fikri kabul etmesi güç olduğu muhakkak. Fakat düşünün bundan 20 yıl önce Richard Stallman özgür yazılım felsefesini ortaya attığında da insanların bu görüşü kabul etmesi pek kolay olmadı. Peki arama motorlarının amacı yukarıda saydıklarımız mı dersiniz? Eğer ellerindeki tüm bilgiyi herkese açacaklarsa evet amaç bilgi özgürlüğü denebilir. Ama bu işlerle uğraşanlar akademik kurumlardan daha çok ticari kuruluşlardır. Ve hepsinin bir gayesi bulunmaktadır. &lt;strong>Tehlikenin farkında mısınız?&lt;/strong> Gelecekte hepimizin bir profili olacak! Şu an kullandığımız kredi kartları, cep telefonları yada çeşitli internet servislerinde bu profiller yavaş yavaş oluşuyor. Nereden hangi ihtiyacımızı alıyoruz, nerelere gidiyoruz. Hepsi kayıt altına girmeye başladı Köleliğin formları değişmeye başladı. Artık birkaç beton yığını ile örülü değiliz. Akıllarımız köleleştiriliyor. Pazarlamacılar(marketing) Semantic Web konusuna yakından takip ediyor. Ağızlarının suyu akıyor. Bu insanlardan bilgiyi korunmanın yollarını aramak, bu kurumlara karşı özgür projelerle kırmaya çalışmak gerekiyor. Yukarıda söylenilenler daha çok ütopik ve komplo teoriler içeriyor. &lt;a href="http://www.albinoblacksheep.com/flash/epic">EPIC 2015&lt;/a>&amp;rsquo;te benzer bir durumdan söz ediyor. Ama gerçek payı yok mu? Bunu yapmayacaklarını kim iddaa edebilir. Internette kişisel bilgilerimizi içeren birçok küçük servis mevcut. Göze çarpanlar Google, Yahoo gibi devler tarafından satın alınıyor. Bu bilgilerde devlerin veri madenlerine katılıyor. Peki hepsini almak mümkün mü? Elbetteki hayır. İşte Yahoo tarafından önerilen çözüm. Mashup&amp;rsquo;lar. Mashup, melez servislerdir. Birkaç servisin birleşmesi ile ortaya çıkar. Bu fikir çok güzel olmakla birlikle, şirketlerin özgür yazılım felsefesinin onlar için zehirli olan tarafını atıp, açık kaynak adı altında yumuşatarak nasıl bedava insan gücü elde ettilerse, aynı şey mashup fikri ile bu küçük servislerin altyapılarını açmalarına zorlayacaktır. &lt;strong>İnternet Yaşamdır&lt;/strong> Kurucusu olduğum &lt;a href="http://www.netology.org">Netology Yazılım Vakfı&lt;/a>, internetin yaşamımızdaki vazgeçilmez yerinin farkında olan bir oluşum. İnternetin tamamen kamu yararına kullanılması için yeni teknolojiler geliştirmeyi hedeflemektedir. Yakında bu konudaki çalışmalarımızı &lt;a href="http://www.netology.org">http://www.netology.org&lt;/a> adresinden duyuracağız. Üstadlar (&lt;a href="http://tr.wikipedia.org/wiki/Hacker" title="Türk Dil Kurumu'nun internet üzerindeki sözlüğüne göre bu kelimenin anlamı 'Bilgisayar ve haberleşme teknolojileri konusunda bilgi sahibi olan, bilgisayar programlama alanında standartın üzerinde beceriye sahip bulunan ve böylece ileri düzeyde yazılımlar geliştiren kişi' olarak tanımlanır.">hackers&lt;/a>) tarafından bugünkü halini alan intenet; şuan özgür olduğumuz ve global dünya fikrinin gerçekleştiği tek yer. Onu &lt;a href="http://tr.wikipedia.org/wiki/Pazarlama">kimsenin&lt;/a> kötü emellerine alet edip kirletmesine izin veremeyiz. İnternet yaşamdır ve bir devletin yada kuruluşun değil tüm kamunun malıdır!&lt;/p></content></entry><entry><title>Türkiye'de Sosyal Mühendislik</title><author><name/><uri/></author><id>https://hozgan.com/turkiyede-sosyal-muhendislik/</id><updated>2007-02-28T00:00:00Z</updated><published>2007-02-28T00:00:00Z</published><content type="html">&lt;p>Geçenlerde ünlü hacker yada kendisinin ifadesi ile Sosyal Mühendis olan Kevin Mitnick&amp;rsquo;in &lt;a href="http://www.ideefixe.com/Kitap/tanim.asp?sid=OQJ5WUS70S8SAXHBTONX">&lt;em>Aldatma Sanatı&lt;/em>&lt;/a> adlı kitabını okudum. İlginç konulara değiniyordu kitap. Özellikle güvenlik konusunda en zayıf halka olarak insan faktörü üzerinde duruyordu kitap.&lt;/p>
&lt;p>Bende Türkiye&amp;rsquo;deki açıklardan söz etmek istiyorum. Diyelim ki bir kişi hakkında bir araştırma yapmak istiyorsunuz. Türkiye de bir kişiyi araştırmak için dört bilgi yeterlidir. Adı, soyadı, doğum tarihi ve baba adı. Devlet dairelerinde birçok sorgu bu dört temel bilgi üzerinden yapılır. Türkiye de herkes üniversiteyi kazanamasa da üniversite sınavına girmiştir. Bu nedenle bu bilgilere erişmenin en kolay yolu OSYM&amp;rsquo;nin sitesiydi. Eğer bir kişinin adı ve soyadı bilgisi mevcutsa OSYM&amp;rsquo;nin sitesinden baba adı ve doğum tarihini bulabilirdiniz. OSYM bu güvenlik riskini farketmiş olacak ki, bu sayfaya kısıt getirmiş. Ama, diyelimki bu dört bilgiye bir şekilde eriştiniz, neler yapabilirsiniz? SSK&amp;rsquo;nın sitesinden bu dört bilgi ile Vatandaşlık numarasına erişebilirsiniz. Ve SSK numarasından gün dökümü alarak en son çalıştığı şirketin sicil numarasını öğrenebilirsiniz. Eğer SSK&amp;rsquo;yı telefonla arayıp bilgi edinmek için telefondaki insanın ağzından bilgi almaya çalışırsanız şirket ile ilgili bilgilere de erişebilirsiniz. Ayrıca Türk telekomdan elinizdeki bilgilerle arama yapabilirsiniz. Telefon numarasını bulduğunuzda Türk telekomunun ttrehber olmadığı zamanlarda Hyper Terminal servisinden ise açık adresini bulabilirsiniz.&lt;/p>
&lt;p>&lt;img src="https://www.birazoku.com/wp-content/uploads/2012/08/aldatma-sanati-w-l-simon-kevin-d-mitnick.jpg" alt="aldatma sanatı">&lt;/p>
&lt;p>Bu konuda bizlerin yapabileceği birkaç şey var. Bu dört temel bilgiyi mümkün gizlemek dışında, çevrenizdekilerin devlette kayıtlı olan isminizi tam olarak bilmemeleri. Bu konuda en şanslı olanlar üç isime sahip olan insanlar sanırım. Belki bana paranoyak gözüyle bakıyorsunuz ama Intel başkanı Andrew Grove’un &lt;em>yalnız paranoyaklar ayakta kalır&lt;/em> sözünü hatırlatmak istiyorum. Bu bilgileri çevremde ki muhasebeci arkadaşlarımdan öğrendim. Sanırım paranoyak olmakta fayda var.&lt;/p></content></entry><entry><title>Bir SQL Hikayesi</title><author><name/><uri/></author><id>https://hozgan.com/bir-sql-hikayesi/</id><updated>2007-01-31T00:00:00Z</updated><published>2007-01-31T00:00:00Z</published><content type="html">&lt;p>Bazen MS-SQL kullandığımı unutup, MySQL&amp;rsquo;deki gibi sorgular yazıyorum. Geçen zaman diliminde geliştirdiğim bir projenin DB yapısında bazı refactoring işlemleri yaptıktan sonra; göç (migration) için gerekli olan SQL betiklerini(script) yazdım. Tabii alışkanlıktan aşağıdaki gibi bir betik hazırladım.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">UPDATE&lt;/span>&lt;span style="color:#fff"> &lt;/span>Bid&lt;span style="color:#fff"> &lt;/span>b&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>Product&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">SET&lt;/span>&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#1f2328">.&lt;/span>CategoryId&lt;span style="color:#0550ae">=&lt;/span>b&lt;span style="color:#1f2328">.&lt;/span>CategoryId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">WHERE&lt;/span>&lt;span style="color:#fff"> &lt;/span>b&lt;span style="color:#1f2328">.&lt;/span>ProductId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#1f2328">.&lt;/span>Id&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Daha sonra, yazdığım göç betiklerini test ederken gördüm ki, MSSQL bu işlemi desteklemiyor. Böyle bir işlemi yapabilmek için T-SQL yazmak gerekiyor. Sonrada aşağıda gördüğünüz kodu yazdım. Buraya da yazayım dedim; belki birinin T-SQL&amp;rsquo;de CURSOR örneğine ihtiyacı olur yada yukarıdaki gibi MySQL&amp;rsquo;de ki gibi MSSQL&amp;rsquo;de Multiple Update işlemi yapmak ister :-)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sql" data-lang="sql">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">DECLARE&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">CURSOR&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">FOR&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">SELECT&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">DISTINCT&lt;/span>&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#1f2328">.&lt;/span>Id&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>b&lt;span style="color:#1f2328">.&lt;/span>CategoryId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">FROM&lt;/span>&lt;span style="color:#fff"> &lt;/span>Bid&lt;span style="color:#fff"> &lt;/span>b&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>Product&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">WHERE&lt;/span>&lt;span style="color:#fff"> &lt;/span>b&lt;span style="color:#1f2328">.&lt;/span>ProductId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#fff"> &lt;/span>p&lt;span style="color:#1f2328">.&lt;/span>Id&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">DECLARE&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>productId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#6639ba">int&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>categoryId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#6639ba">int&lt;/span>&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">OPEN&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">FETCH&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">INTO&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>productId&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>categoryId&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>WHILE&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0550ae">@@&lt;/span>FETCH_STATUS&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">0&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">BEGIN&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">UPDATE&lt;/span>&lt;span style="color:#fff"> &lt;/span>Product&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">SET&lt;/span>&lt;span style="color:#fff"> &lt;/span>CategoryId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>categoryId&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">WHERE&lt;/span>&lt;span style="color:#fff"> &lt;/span>Id&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>productId&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">FETCH&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#cf222e">INTO&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>productId&lt;span style="color:#1f2328">,&lt;/span>&lt;span style="color:#fff"> &lt;/span>&lt;span style="color:#0550ae">@&lt;/span>categoryId&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">END&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">CLOSE&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#1f2328">;&lt;/span>&lt;span style="color:#fff">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#fff">&lt;/span>&lt;span style="color:#cf222e">DEALLOCATE&lt;/span>&lt;span style="color:#fff"> &lt;/span>cr_BidCategoryToProductCategory&lt;span style="color:#1f2328">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></entry><entry><title>Merhaba Dünya! (ver. 2.0)</title><author><name/><uri/></author><id>https://hozgan.com/merhaba-dunya/</id><updated>2006-01-21T00:00:00Z</updated><published>2006-01-21T00:00:00Z</published><content type="html">&lt;p>Yeniden Merhaba,&lt;/p>
&lt;p>Bir &lt;a href="http://www.ozgan.net" title="ozgan.net technologies">önceki blog&lt;/a>&amp;lsquo;uma kıyasla bu blog arasında bazı farklılıklar var. Önceki blogum Mono platformunda benim tarafımdan yazılmıştı. Artık bu konuda işin uzmanı(&lt;a href="http://www.wordpress.org">wordpress&lt;/a>) tarafından profesyonel destek almaya karar verdim. Yaklaşık 5 yıldır web dünyasında birşeyler yapmaya çabalıyorum. Öncesinde masaüstü platformu için uygulama geliştiriyordum. Fakat web&amp;rsquo;in büyüsüne bi kapıldımı aklını başından alan bir tarafı var. &lt;strong>Bu blog&amp;rsquo;&amp;lsquo;un amacı; kendi web çalışmalarımı kayıt altına almaktır.&lt;/strong>&lt;/p>
&lt;p>Tamamen web odaklı bir blog olacağını söylemiştim. 5 yıllık web tecrübemde (2 yıl PHP, 1 yıl Java ve 2 yıl da C#) programlama dilleri ve araçlarıyla uygulamaları geliştirdim. Bu kadar yıllık deneyimime dayanarak aslında hepimizin bildiği birşeyi tekrar etmek istiyorum. Biz web programcıları aslında sadece metin dosyaları yaratan kodlar üretiyoruz. Aslında çok basit gibi görünen bir iş için çok karmaşık mimariler kuruyor ve kullanıyoruz. Web çatıları(framework) tasarlıyoruz ki aslında bu, kendi kendimize koyduğumuz kanunlara benziyor ve bu kanunlar çerçevesinde kendimizi çok kısıtlayabiliyoruz. 5 yıllık yaşamım boyunca anladım ki, web&amp;rsquo;de hangi platformu ve araçları kullandığınız kimsenin umurunda değildir. Bu konuda takıntılı olmak ise s.dik yarışından başka birşey değildir. Bazen körü körüne bu yarışa devam etmek rüzgara karşı işemek anlamına gelebilir. Bu yüzden blog sahibi &lt;strong>araçta değilde sektörde uzmanlaş&lt;/strong> düşüncesini sahiplenmiştir.&lt;/p>
&lt;p>Blog&amp;rsquo;ta web dünyasındaki yenilikler ve disiplinler ile ilgili öğrendikçe veya yeni birşeyler keşfettikçe burada paylaşıyor olacağım. İşinize ne ölçüde yarar bilemiyorum, önceliğim veya amacım, okuyucu kitlesini memnun edecek yazılar yazmak değil ama kaliteli birşeyler yazmak. Yazılar bazen çok teknik olabilir. Programlama veya sistem yönetimi ile ilgili olabilir. Bu yazıları takip edebilmek için, LAMP (Linux, Apache, MySQL, PHP) araçları hakkında fikir sahibi olmak gerekir. Bazı zamanlarda da web&amp;rsquo;in gidişatı ile ilgili değerlendirmeler yapmaya çalışacağım. Sektör ve/veya ürün incelemelerine bakıp gelecek hakkında değerlendirme yapacağım.&lt;/p>
&lt;p>Bir sonraki yazıya kadar hoşça kalın.&lt;/p></content></entry></feed>