</> Dijital El Kitabı

Dijital dünyaya sade bir giriş

Web'i ezberleme.
Nasıl çalıştığını gör.

HTML'den yapay zekâya, internette duyduğun kavramları düz Türkçeyle öğren. Her konuyu oku, canlı örneğine dokun ve sonucu anında gör.

33 bölümTemelden ileri kavramlara
Canlı örneklerOku, dokun, sonucu gör
Tek sayfaAradığın her şey elinin altında
7 başlık · 33 kısa bölüm
Kendi hızında ilerle

Baştan sona oku veya aşağıdan yalnızca merak ettiğin konuya geç.

Her şeyi kurcala

“Bu ne?” modunu aç; canlı örnekte dokunduğun parçanın görevini öğren.

Bu adla bir konu bulamadım. Başka bir kelime dene.
Bölüm 1 · İskelet

HTML nedir? Element · tag · attribute

Bir web sayfasını binaya benzetirsek HTML, binanın iskeletidir. Sayfada ne olduğunu söyler: "Burada bir başlık var, altında bir yazı, yanında bir resim, en altta bir buton." Hepsi bu. Rengi, güzelliği söylemez (o CSS'in işi), tıklanınca ne olacağını da söylemez (o JavaScript'in işi). Sadece ne var, ne yok, onu söyler.

HTML'in yapı taşına element denir. Bir elementi yazmak için adını köşeli parantezlerin içine yazarsın; buna tag (etiket) denir. Çoğu element bir açılış ve bir kapanış tag'inden oluşur, ikisinin arasına da içerik girer. Elemente ekstra bilgi vermek istersen açılış tag'inin içine attribute (özellik) yazarsın. Kulağa karışık geliyor ama tek satırda hepsi görünüyor:

<button id="kaydet">Kaydet</button>

<button>      → açılış tag'i: "burada bir buton başlıyor"
id="kaydet"   → attribute: butona ekstra bilgi (adı "kaydet" olsun)
Kaydet        → içerik: butonun üzerinde yazacak yazı
</button>     → kapanış tag'i: "buton burada bitti" (baştaki / işaretine dikkat)

Bu dört parçanın toplamına, açılışı, özellikleri, içeriği ve kapanışıyla, element denir. Bir HTML sayfası, iç içe geçmiş yüzlerce elementten oluşur; tıpkı iç içe kutular gibi. Bu kitabın bundan sonraki her "İskelet" bölümü, işine en çok yarayacak element türlerini tek tek tanıtıyor.

HTML = sayfada NE olduğu. Element = yapı taşı. Tag = taşın adının yazıldığı parantezler. Attribute = taşa iliştirilen ekstra bilgi. Prompt yazarken "sayfaya bir bölüm ekle" gibi istekler hep HTML isteğidir.
Bölüm 2 · İskelet

Div ve span Görünmez kutular

İşte web'in en çok kullanılan ama en az anlaşılan elementi: div. Sırrı şu: div, görünmez bir kutudur. Kendisi hiçbir şey göstermez; tek görevi başka elementleri bir arada tutmaktır. Neden gerekli? Çünkü "şu üç şeyi yan yana koy", "bu kartı sağa yasla", "şurayı komple gizle" diyebilmek için o şeylerin tek bir pakette olması gerekir. O paket div'dir.

span ise div'in minicik kardeşi: koca bir kutu değil, cümlenin içindeki birkaç kelimeyi paketlemek için kullanılır, mesela tek bir kelimeyi kırmızı yapmak istediğinde. Ezberi kolay: div = koli, span = etiket bandı.

Aşağıdaki örnekte gerçekten iç içe kutular var ama görünmüyorlar, çünkü div böyle bir şey. Butona bas, kenarlarını boyayayım, o zaman gör:

Ben dış div'in içindeki birinci div'im. İçimde bir de span saklı.
Ben ikinci div'im. Dıştaki büyük div, ikimizi tek paket yapıyor.
Bu örneğin kodunu gör
<div>                                  ← dış koli (mavi)
  <div>İçimde bir <span>span</span> saklı</div>   ← iç kutu (pembe) + span (sarı)
  <div>Ben ikinci div'im</div>
</div>
Bir sayfada neredeyse her şey div'lerin içindedir. Prompt'ta şöyle kullan: "ürün kartı div'ine bir fiyat etiketi ekle", "o iki butonu aynı div'e koy, yan yana dursunlar".
Bölüm 3 · İskelet

Başlıklar, paragraflar, linkler H1–h6 · p · a · strong

Bir sayfadaki yazıların da türleri vardır ve her türün kendi elementi var. h1'den h6'ya kadar olanlar başlıktır: h1 en büyüğü ve en önemlisidir, sayfanın ana başlığı. Rakam büyüdükçe başlık küçülür. Önemli bir kural: her sayfada tek bir h1 olmalı, çünkü Google sayfanın ne anlattığını önce h1'den anlar (SEO dediğimiz şeyin ilk taşı).

Normal yazılar p (paragraf) elementine girer. Bir yazının içinde bir kısmı kalınlaştırmak istersen strong kullanılır. Başka bir sayfaya götüren tıklanabilir yazılar ise a elementidir (İngilizce "anchor", çapa), nereye gideceğini href attribute'u söyler. Hepsi bir arada, canlı:

Bu bir h1, sayfanın ana başlığı

Bu bir h3 · ara başlık

Bu bir h6, en küçük başlık

Bu bir p paragrafı. İçinde strong ile kalınlaştırılmış bir kısım ve a elementiyle yapılmış bir link var. Linke tıklarsan Bölüm 1'e gider, çünkü href öyle diyor.

Bu örneğin kodunu gör
<h1>Ana başlık</h1>
<p>Yazı, <strong>kalın kısım</strong> ve
   <a href="https://garamsi.com">bir link</a>.</p>
"Üstteki büyük yazıyı değiştir" yerine "h1'i değiştir" de. "Tıklanınca mağazaya gitsin" yerine "href'i garamsi.com olan bir link ekle" de. Fark: LLM tahmin etmez, bilir.
Bölüm 4 · İskelet

Listeler Ul · ol · li

Alt alta maddeler göstereceksen liste elementleri kullanılır ve mantığı çok basittir: listenin kendisi için bir kap, her madde için bir satır. Kap iki çeşit: ul maddelerin önüne nokta koyar (sırasız liste), ol ise 1, 2, 3 diye numaralar (sıralı liste). Her iki kabın içindeki her bir madde de li'dir (list item = liste elemanı).

ul, noktalı:
  • süt
  • domates
  • deri cilası
ol, numaralı:
  1. ürünü kazı
  2. fiyatı eşleştir
  3. yayınla
Bu örneğin kodunu gör
<ul>                     <ol>
  <li>süt</li>             <li>ürünü kazı</li>
  <li>domates</li>         <li>fiyatı eşleştir</li>
</ul>                     </ol>
Sıra önemliyse (tarif, adımlar) ol; önemli değilse (alışveriş listesi, özellikler) ul. Prompt'ta: "bu maddeleri ul/li listesine çevir."
Bölüm 5 · İskelet

Tablolar Table · tr · td · th

Elindeki bilgi satır ve sütunlardan oluşuyorsa, fiyat listesi, puan cetveli, stok dökümü, tablo kullanılır. Adları İngilizce kısaltmalardan gelir ve bir kez çözünce bir daha unutmazsın: table tablonun kendisi. tr = table row, yani bir satır. td = table data, yani satırın içindeki bir hücre. th = table header, yani kalın görünen başlık hücresi.

Yani kurulum hep aynıdır: table'ın içine satır satır tr, her tr'nin içine hücre hücre td dizersin. "Tabloya satır ekle" demek = "yeni bir tr ekle" demek. Butonla dene, JavaScript gerçekten yeni bir tr ekleyecek:

ÜrünFiyat
Deri Cüzdan$45
Masa Matı$89
Bu örneğin kodunu gör
<table>
  <tr> <th>Ürün</th>   <th>Fiyat</th> </tr>   ← başlık satırı
  <tr> <td>Cüzdan</td> <td>$45</td>   </tr>   ← veri satırı
</table>
table = tablo, tr = satır, td = hücre, th = başlık hücresi. Prompt'ta: "tabloya bir sütun daha ekle: stok adedi", LLM her tr'ye bir td ekleyeceğini anlar.
Bölüm 6 · İskelet

Formlar Form · input · label · textarea · select · button

Kullanıcıdan bilgi almak istediğin her yer bir formdur: giriş ekranı, arama kutusu, sipariş sayfası. Parçaları şunlar ve her birinin görevi nettir:

form, parçaların hepsini saran kaptır, "bunlar birlikte gönderilecek" demektir. input tek satırlık giriş kutusudur ve type attribute'uyla kılıktan kılığa girer: type="text" yazı kutusu, type="number" sayı kutusu, type="checkbox" işaret kutusu, type="password" yıldızlı şifre kutusu, type="date" tarih seçici. textarea çok satırlı büyük yazı alanıdır (yorum, not). select açılır menüdür, seçenekleri option'dur. label kutunun yanındaki açıklama yazısıdır ve güzel bir huyu vardır: label'a tıklamak, bağlı olduğu kutuyu seçer, telefonda küçücük kutuyu tutturmaya çalışmaktan kurtarır. button da düğmedir; formun içindeyse formu gönderir.

Aşağıdaki form gerçekten çalışıyor, doldur, gönder. Ama dikkat: bilgiler hiçbir sunucuya gitmiyor, JavaScript yakalayıp sana geri gösteriyor:

Bu örneğin kodunu gör
<form>
  <label for="ad">Adın:</label>
  <input type="text" id="ad">
  <select><option>Cüzdan</option></select>
  <textarea></textarea>
  <button type="submit">Gönder</button>
</form>
Prompt'ta kutu tiplerini adıyla iste: "e-posta için input, mesaj için textarea, konu seçimi için select olan bir iletişim formu yap; her kutunun label'ı olsun."
Bölüm 7 · İskelet

Resim, video, ses Img · src · alt · video · audio

Sayfaya görsel ve ses koymanın elementleri bunlar. En önemlisi img (image = resim). İki attribute'u ezbere bil: src (source = kaynak) resim dosyasının nerede olduğunu söyler, bir dosya adı ya da internet adresi olabilir. alt (alternative = yedek) ise resim yüklenemezse yerine gösterilecek yedek yazıdır; ayrıca görme engellilerin ekran okuyucusu bu yazıyı sesli okur ve Google resmin ne olduğunu buradan anlar. Yani alt hem nezaket hem SEO'dur.

Aşağıda ikisini de canlı görüyorsun: soldaki resmin src'si doğru, sağdakinin src'sini bilerek bozdum, bak, yerine alt yazısı çıktı:

Web El Kitabı'nın logosu

src doğru → resim geldi

(Bu resim yüklenemedi, ben alt yazısıyım!)

src bozuk → alt devrede

video ve audio da aynı mantık: src ile dosyayı gösterirsin. Tek fark, controls attribute'unu eklersen oynat/durdur düğmeleri gelir. Aşağıdakiler gerçek dosyalar, oynat:

video elementi (controls açık)

audio elementi, 1,5 saniyelik "bip"

Bu örneğin kodunu gör
<img src="logo.png" alt="Mağazanın logosu" width="96">
<video src="tanitim.mp4" controls></video>
<audio src="zil.mp3" controls></audio>
src = dosya nerede, alt = yüklenemezse ne yazsın (ve Google ne anlasın). Bir de format tüyosu: web'de görselleri WebP formatında kullan, aynı görüntü, PNG'nin onda biri boyut, site uçar gibi açılır.
Bölüm 8 · Görünüş

Id ve class Elemente isim takmak

CSS'e geçmeden önce şunu çözmemiz lazım: sayfada yüzlerce element varken, "şunu kırmızı yap" derken hangisini kastettiğimizi nasıl anlatacağız? Cevap: elementlere isim takarak. Bunun iki yolu var ve aralarındaki fark çok önemli:

id, bir elementin kimlik numarasıdır, TC kimlik gibi. Sayfada aynı id'den yalnızca bir tane olabilir. "id'si kaptan olan kutu" dediğinde tek bir kutudan bahsediyorsundur. class ise bir takım formasıdır, aynı formayı istediğin kadar elemente giydirebilirsin. "class'ı takim olan herkes" dediğinde, o formayı giyen kaç element varsa hepsinden bahsediyorsundur.

Aşağıda dört kutu var. Dördü de "takim" formasını giyiyor; ama üçüncüsünün ayrıca bir kimliği var: id="kaptan". Butonlarla farkı canlı gör:

.takim
.takim
#kaptan
.takim
Bu örneğin kodunu gör
HTML:  <div class="takim" id="kaptan">...</div>

CSS'te seçerken:   .takim  { ... }   ← baştaki NOKTA class demek
                   #kaptan { ... }   ← baştaki KARE (#) id demek

JS'te seçerken:    document.querySelectorAll('.takim')   ← hepsi
                   document.getElementById('kaptan')     ← tek
id = kimlik (sayfada tek), class = forma (kaç tane istersen). Toplu görünüş işleri class ile, tek bir elementi hedefleme işleri id ile yapılır.
Bölüm 9 · Görünüş

CSS Sayfanın makyajı

HTML iskeletse, CSS her şeyin nasıl görüneceğidir: renkler, yazı tipleri, boşluklar, kenarlar, gölgeler, hizalamalar. CSS'in cümle yapısı hep aynıdır: önce kimi boyayacağını söylersin (az önce öğrendiğin class/id ile), sonra süslü parantez içinde özellik: değer çiftleri sıralarsın. Örneğin .kart { background: white; } demek, "kart formasını giyen herkesin arka planı beyaz olsun" demektir.

CSS'in gücünü görmenin en iyi yolu, aynı HTML'i farklı makyajlarla görmek. Aşağıdaki kart hep aynı kart, içeriği hiç değişmiyor. Sadece CSS değişiyor:

Deri Cüzdan, $45
El yapımı, full-grain deri.
/* makyajsız, tarayıcının çıplak hali */

"Şık CSS"e basınca altta beliren üç özelliğin adını bil, yeter: border-radius köşeleri yuvarlatır, box-shadow gölge verir, gradient iki rengi birbirine akıtır. Modern görünümün dörtte üçü bu üçlüdür.

CSS'in bir süper gücü daha var: animation. JavaScript'e hiç bulaşmadan, sadece CSS ile elementleri hareket ettirebilirsin. Şu ikisi saf CSS animasyonu, kalp scale (büyüt-küçült) ile atıyor, top translateY (yukarı-aşağı taşı) ile zıplıyor:

💗 🏀
@keyframes zipla { 50% { transform: translateY(-16px); } }  /* yolun yarısında havada */
.top { animation: zipla 0.9s infinite; }                    /* 0,9 saniyede bir, sonsuza dek */

Bu sayfada gördüğün bütün hareketler de böyle: bölümlerin süzülerek belirmesi, diyagramlarda gezinen ışıklar… hepsi @keyframes + animation.

CSS = KİM (class/id) + NE (özellik: değer). Görünüş isteklerini CSS diliyle ver: "kartlara border-radius ve hafif box-shadow ekle." Hareket istersen adıyla iste: "butona hover'da büyüme animasyonu koy."
Bölüm 10 · Görünüş

Responsive Her ekrana uyum

Aynı sayfa kocaman bilgisayar ekranında da, daracık telefon ekranında da düzgün görünmek zorunda. Buna responsive tasarım denir: ekran daralınca yan yana duran kutuların alt alta geçmesi, yazıların küçülmesi, menünün hamburger simgesine dönüşmesi… Sayfa, ekrana "cevap verir" (respond).

Bunu kendi gözünle görmenin en kolay yolu aşağıda. Kaydırıcı, sanki telefon ekranıymış gibi alanı daraltıyor, üç kartın kendini nasıl yeniden dizdiğine bak:

Kart 1
Kart 2
Kart 3

Perde arkasında iki CSS aracı çalışır: flexbox ("bu kutuları esnek diz, sığmazsa alta at") ve media query ("ekran 680 pikselden darsa şu kuralları uygula"). Adlarını bilmen yeter, gerisini kod yazan halleder. Bu okuduğun site de responsive: telefonda açarsan aynı içerik bambaşka dizilir.

Prompt'un sonuna alışkanlık olarak şunu ekle: "mobil uyumlu (responsive) olsun." Müşterilerinin çoğu telefondan bakıyor, garamsi'de bunu ilk elden biliyorsun.
Bölüm 11 · Davranış

JavaScript Sayfanın kasları

İskelet (HTML) ve makyaj (CSS) tamam; ama sayfa hâlâ hareketsiz. Butona basınca bir şeyin OLMASI için JavaScript (kısaca JS) gerekir. JS, tarayıcının içinde çalışan gerçek bir programlama dilidir: tıklamayı duyar, hesap yapar, sayfayı anında değiştirir. Bu kitaptaki bütün canlı örnekler JS ile çalışıyor.

İki küçük ama gerçek örnek: sayaç, her basışında bir sayı artırıyor; saat ise her saniye kendini yeniliyor. İkisi de şu an senin telefonunda/bilgisayarında çalışıyor, sunucuda değil:

Canlı saat: --:--:--

Sayacın gerçek kodunu gör
let sayi = 0;                           // bir hafıza kutusu aç, 0 koy
function sayacArtir() {                 // "sayacArtir" adında bir komut tanımla
  sayi = sayi + 1;                      // kutudaki sayıyı 1 artır
  document.getElementById('sayac')      // sayfada id'si "sayac" olan yeri bul
          .textContent = sayi;          // içine yeni sayıyı yaz
}
// butonun HTML'i: <button onclick="sayacArtir()">
// yani: "tıklanınca sayacArtir komutunu çalıştır"
"Tıklayınca / yazarken / seçince ŞU OLSUN" cümlelerinin tamamı JS isteğidir. Prompt'ta aynen böyle söyle: "Hesapla butonuna tıklayınca sonuç, sayfa yenilenmeden altta görünsün."
Bölüm 12 · Davranış

DOM Sayfanın canlı hali

Şimdi işin mutfağından bir sır: senin yazdığın HTML aslında ölü bir metin dosyasıdır. Tarayıcı onu okuyunca kafasında canlı bir ağaç kurar, her element bir dal, iç içe elementler dalın dalları. İşte bu ağacın adı DOM (Document Object Model). JavaScript sayfayı değiştirirken aslında HTML dosyasına dokunmaz; bu canlı ağaca dal ekler, dal koparır, dalları boyar.

Aşağıda solda ağacın şeması, sağda o ağacın sayfadaki görünümü var. Butona bas: JS, DOM'a gerçekten yeni bir dal (li elementi) ekleyecek ve iki taraf birden değişecek:

Ağacın şeması:
<ul>
├─ <li> süt
└─ <li> domates
Sayfadaki görünümü:
  • süt
  • domates

Sepete ürün eklenince sayfanın yenilenmeden güncellenmesi, yazarken arama sonuçlarının belirmesi, hepsi JS'in DOM'u değiştirmesidir. Sağ üstteki 🔍 İncele modu da DOM ağacını okuyarak çalışıyor: tıkladığın dalın adına bakıp sana söylüyor.

HTML = yazdığın metin; DOM = tarayıcının ondan kurduğu canlı ağaç. "Sayfa yenilenmeden değişsin" istediğin her şey DOM işidir.
Bölüm 13 · Veri

JSON Programların ortak dili

Buradan itibaren konu görünüşten çıkıp veriye giriyor. İki programın birbirine bilgi yollaması gerektiğinde, senin Migros kazıyıcın fiyatları çekerken, n8n Telegram'a mesaj atarken, bilgiyi ortak bir zarfa koyarlar. O zarfın adı JSON. Kuralı tek cümle: her bilgi bir "anahtar": değer çiftidir. "ad" anahtarının değeri "Mustafa", "yas" anahtarının değeri 30… hepsi süslü parantez içinde.

En iyi öğrenme yolu: kendin yazıp zarfın oluşmasını izlemek. Aşağıya yaz, JSON sağda canlı kurulsun:


  

Renklere dikkat et, çünkü kurallar orada saklı: anahtarlar hep tırnaklı, "yazı değerleri" tırnaklı, sayılar tırnaksız, doğru/yanlış değerleri de çıplak true / false olarak yazılır. Bu dört kuralı bilirsen dünyadaki her JSON'u okuyabilirsin.

JSON = programlar arası zarf: "anahtar": değer. API'lerin cevabı, n8n'in içi, config dosyaları, hepsi JSON. Bir sonraki bölümde bu zarfın postalanışını göreceksin.
Bölüm 14 · Veri

API ve REST GET · POST · istek · yanıt

İki programın konuşabilmesi için bir kapı gerekir; o kapının adı API. Sen (daha doğrusu senin programın) kapıya bir istek (request) bırakırsın, karşı taraf bir yanıt (response) döndürür, yanıt da genellikle az önce öğrendiğin JSON zarfıdır. REST ise bu konuşmanın görgü kurallarıdır. En çok iki fiili duyacaksın: GET = "bana şunu ver" (okuma), POST = "al bunu kaydet" (yazma).

Lafta kolay; canlısı daha iyi. Aşağıdaki buton, bu sunucudaki gerçek bir dosyaya (api-demo.json) gerçek bir GET isteği atar. Yanıtın gelişini, durum kodunu ve süresini izle:

İsteğin gerçek kodunu gör
const cevap = await fetch('api-demo.json');  // GET isteği at, cevabı bekle
const veri  = await cevap.json();            // JSON zarfını aç
// Artık veri.urunler bir liste, sayfaya işleyebilirsin.
// Migros kazıyıcın da aynen bunu yapıyor, adres farklı sadece:
// fetch('migros.com.tr/rest/search/...')
API = programların kapısı. GET = oku, POST = yaz. Yanıt = JSON. Prompt'ta: "şu API'den veriyi GET ile çek, tabloya doldur."
Bölüm 15 · Veri

Webhook Ters yönde API

API'de soran hep sensin. Peki karşı tarafta bir şey OLDUĞUNDA senin haberin nasıl olacak, her saniye sorup duracak mısın? Hayır. Bunun için webhook var: karşı tarafa kendi adresini bırakırsın, "bir şey olursa buraya haber at" dersin. Olay olduğunda O SANA istek atar. Kapıcıya her sabah "kargom geldi mi?" diye sormak API'dir; kapıcının kargo gelince seni araması webhook'tur.

API, soran sensin: Sen Sunucu "sipariş var mı?" (GET) yanıt: JSON Webhook, haber veren o: Senin n8n'in Telegram "yeni mesaj geldi!" (POST) sen hiç sormadın, olay olunca haber kapına geldi
API = sen sorarsın. Webhook = olay olunca o haber verir. Telegram botların ve POA Kontrol workflow'un tam olarak webhook'la yaşıyor.
Bölüm 16 · Veri

SQL ve SQLite Veritabanı

Kalıcı veri, siparişler, fiyat geçmişi, üye listesi, bir veritabanında durur. Veritabanı dediğin şey aslında disiplinli tablolardan ibarettir: satırlar kayıtlar, sütunlar alanlar. SQLite, bu işin cep boyu hali: kurulum istemez, koca veritabanı tek bir dosyada yaşar (tracker'larındaki data.db dosyaları birer SQLite'tır). Büyük projelerde ise PostgreSQL, MySQL gibi ağabeyler kullanılır, mantık aynıdır.

Veritabanıyla konuşmanın dili de SQL'dir ve neredeyse İngilizce cümle gibidir. Dört kelimeyi bilirsen günlük işin görülür: SELECT = seç/getir, FROM = şu tablodan, WHERE = şu şarta uyanları, ORDER BY = şuna göre sırala. Butonlarla üç gerçek sorgu dene, tabloya etkisini gör:

SELECT * FROM meyveler;

SQLite = tek dosyalık veritabanı, küçük projelerin standart tercihi. SQL okunuşu: SELECT (getir) FROM (şuradan) WHERE (şartla) ORDER BY (sırala). Bu demo JS taklidiydi; gerçeğinde sorguyu Flask, data.db'ye sorar.
Bölüm 17 · Veri

LocalStorage Tarayıcının cebi

Peki veri saklamak için illa sunucu ve veritabanı mı gerekir? Küçük şeyler için hayır. Her tarayıcının, her site için ayrılmış küçük bir cebi vardır: localStorage. Oraya koyduğun şey, sayfa kapansa da, bilgisayar yeniden başlasa da durur. Ama iki sınırı aklında tut: sadece o cihazda ve o tarayıcıda durur (telefonundan göremezsin) ve küçük veriler içindir.

Dene: bir not yaz, kaydet, sonra sayfayı yenile. Not yerinde olacak, sunucuya tek bayt gitmeden:

Gerçek kodunu gör, üç komut, hepsi bu
localStorage.setItem('notum', 'deri sipariş et');  // cebe koy
localStorage.getItem('notum');                     // cepten oku
localStorage.removeItem('notum');                  // cepten at
Tema tercihi, son arama, yarım kalmış form gibi tek cihazlık küçük şeyler → localStorage. Her cihazdan erişilecek gerçek veri → sunucu + SQLite. İkisini karıştırma.
Bölüm 18 · Büyük Resim

Frontend ve Backend Vitrin ve mutfak

Artık parçaları birleştirebiliriz. Bir web uygulamasının iki yakası vardır. Frontend = vitrin: kullanıcının tarayıcısında çalışan her şey, yani HTML + CSS + JavaScript üçlüsü. Backend = mutfak: sunucuda çalışan, veriyi saklayan, hesabı yapan, kimseye görünmeyen program, senin projelerinde bu rolü Flask oynuyor. İki yaka birbiriyle API üzerinden, JSON zarflarıyla konuşur:

FRONTEND HTML + CSS + JS 📱 tarayıcında BACKEND Flask / FastAPI 🖥 sunucuda SQLite 💾 veri API SQL Sebzemeyve Tracker'ın birebir bu üçlü: sayfa + Flask + SQLite

Şimdi büyük sırrı söyleyeyim: bu okuduğun sitenin backend'i yok. Veri saklamıyor, hesap yapmıyor; bütün marifeti frontend'de. Sunucu sadece dosyaları postalıyor. "Sunucu gerektirmeyen site" diye sana anlattığım şeyin canlı kanıtındasın.

Frontend = tarayıcıda görünen; backend = sunucuda dönen. Prompt'ta ayır: "frontend'de canlı doğrulama olsun, backend Flask'ta da ayrıca kontrol etsin."
Bölüm 19 · Büyük Resim

URL, HTTP ve HTTPS İnternetin adres sistemi

Her gün onlarca kez baktığın adres çubuğunun da bir anatomisi var ve parçalarının adını bilmek, hata ararken çok işine yarar. Gerçek bir adresi parçalayalım:

https://sebzemeyve.herthing.duckdns.org/urun?ad=domates#fiyat

  • https://, protokol: konuşmanın kuralı. HTTP düz konuşma, sonundaki S şifreli demek (kilit simgesi).
  • sebzemeyve.herthing…, alan adı (domain): hangi sunucuya gidileceği. Baştaki "sebzemeyve" kısmı subdomain.
  • /urun, yol (path): o sunucudaki hangi sayfa.
  • ?ad=domates, parametre (query): sayfaya iliştirilen not; ? ile başlar, anahtar=değer gider.
  • #fiyat, çapa (anchor): sayfanın İÇİNDE bir yer. Bu kitabın fihrist çipleri böyle çalışıyor.

Bir de sunucunun cevap notları vardır, durum kodları. Dört tanesini bil, yeter: 200 = tamam, geldi. 301 = adres değişmiş, seni yönlendirdim. 404 = öyle bir sayfa yok. 500 = sunucu içinde bir şey patladı. ("404 Not Found" esprilerinin kaynağı bu.)

Hata ayıklarken önce koda bak: 404 ise adres/yol yanlış, 500 ise backend'de hata var, 301 ise adres taşınmış. Bu tek cümle sana saatler kazandıracak.
Bölüm 20 · Büyük Resim

Deploy, port, DNS Siteyi canlıya almak

Kodu yazdın; peki insanlar ona nasıl ulaşıyor? Yayına alma işine deploy denir. Şu an bu sayfayı okurken, isteğin şu yolculuğu yaptı, bu şema süs değil, senin sunucunun GERÇEK düzeni:

📱 Tarayıcın adresi yazdın 🌍 DNS (DuckDNS) "o isim = 129.213.155.31" dedi 🚪 Reverse proxy (:443 🔒) HTTPS kilidini açıp içeri yönlendirdi 📁 Port 8506 → bu dosyalar hcc 8502'de, sebzemeyve 8505'te, bu kitap 8506'da oturuyor

Üç terimi açalım: DNS, isimleri numaraya çeviren rehberdir, insanlar isim ezberler, bilgisayarlar IP numarası ister. Port, aynı sunucudaki programları ayıran kapı numarasıdır; bir binada çok daire olması gibi, senin sunucunda da her uygulama kendi portunda oturur. Reverse proxy ise binanın kapıcısıdır: dışarıdan gelen herkesi tek kapıdan karşılar, doğru daireye yönlendirir ve HTTPS kilidini o yönetir.

Deploy = canlıya alma. DNS = isim→numara rehberi. Port = daire kapısı. Reverse proxy = kapıcı. Yeni app'lerinde hep aynı tarif: "8507'de çalıştır, proxy'ye bağla, subdomain ver."
Bölüm 21 · Büyük Resim ⭐

PWA · siteyi app'e çevirmek Manifest · service worker · çevrimdışı

PWA (Progressive Web App), normal bir web sitesinin telefona uygulama gibi kurulabilen halidir. App Store yok, Google Play yok, onay bekleme yok, "uygulamayı indirin" diye yalvarma yok. Sitene üç parça eklersin; ziyaretçi isterse siteni ana ekranına kurar. Kurulunca kendi ikonuyla açılır, tarayıcı çubuğu görünmez, tam ekran çalışır, kullanıcı için normal bir uygulamadan farksızdır.

Bir PWA'yı PWA yapan üç parça:

1 · HTTPS

Site şifreli bağlantıda olmalı (adres çubuğundaki kilit). Tarayıcı, güvensiz siteye kurulum izni vermez. Bu site HTTPS'te, şart tamam.

2 · manifest.json

Uygulamanın kimlik kartı: adı ne, ikonu hangi dosya, açılış rengi ne, tam ekran mı açılsın. Tek küçük JSON dosyası.

3 · Service worker

Sayfa ile internet arasına yerleşen görevli: dosyaları cihaza önbellekler. İnternet gidince siteyi önbellekten açar, çevrimdışı çalışmanın sırrı budur.

Canlı durum, bu sayfanın PWA organları şu an ne halde:

Nasıl açık?kontrol ediliyor…
HTTPSkontrol ediliyor…
Service workerkontrol ediliyor…
Önbellekkontrol ediliyor…

Nasıl kurulur?

Android, Chrome/Brave:
  1. Bu siteyi aç (açtın bile).
  2. Sağ üstteki ⋮ menüye dokun.
  3. "Ana ekrana ekle" ya da "Uygulamayı yükle"ye dokun. Bitti, ikon ana ekranında.
iPhone, Safari:
  1. Bu siteyi Safari'de aç (Chrome değil, illa Safari).
  2. Alttaki paylaş düğmesine dokun (kare + yukarı ok).
  3. "Ana Ekrana Ekle"yi seç, sağ üstten Ekle'ye dokun.

Kurduktan sonra asıl numarayı dene: telefonu uçak moduna al ve uygulamayı aç. Site yine açılacak, çünkü service worker her şeyi cihazına önbelleklemişti. İnternetsiz çalışan web sitesi; işte PWA'nın sihri bu.

Peki hangisini seçmeli? Üç yolun dürüst karşılaştırması:

Mobil uyumlu sitePWAGerçek app (React Native)
Kurulumyok, tarayıcıdanana ekrana, mağazasızApp Store / Google Play
Çevrimdışı çalışma
Bildirim gönderme✓ (iPhone'da kısıtlı)✓ tam
Mağaza onayı/komisyonuyokyokvar (onay + %15-30)
Yapım maliyeti/emeğien düşükdüşük (site + 3 parça)yüksek (ayrı proje)
Ne zaman mantıklı?çoğu iş için yeter"app hissi" istenincekamera/bluetooth gibi derin donanım gerekince
PWA = site + HTTPS + manifest.json + service worker. Prompt'ta tek cümle yeter: "bu siteye PWA desteği ekle: manifest ve service worker olsun, telefona kurulabilsin, çevrimdışı açılsın."
Bölüm 22 · Büyük Resim

Araç çantası Framework'ler ve kütüphaneler

Bu kitapta öğrendiğin her şey el emeğiyle yazılabilir; ama dünya, sık yapılan işler için hazır alet setleri üretmiş. Bunlara framework (çatı) ve kütüphane denir. Hepsi aynı üç temelin, HTML, CSS, JS, üstüne kuruludur. Prompt'ta adını doğru anarsan, LLM tam olarak ne istediğini anlar:

Flask

Python ile küçük web uygulaması yazmanın en pratik yolu. Tek dosyada site + API + veritabanı bağlantısı.

Sende: HCC Calculator ve tüm tracker'lar Flask.

FastAPI

Flask'in API'ye odaklanmış modern kardeşi. Daha hızlı, dokümanı kendiliğinden oluşur.

Ne zaman: sayfa yok, sadece API yazılacaksa.

React

Büyük ve karmaşık arayüzlerin en popüler JS kütüphanesi. Arayüzü yeniden kullanılabilir bileşenlere böler.

Dikkat: basit iş için ağırdır, önce basiti dene.

Next.js

React'in "her şey dahil" paketi: sayfa yönlendirme, SEO, sunucu tarafı, kutudan çıkar.

Yayınlanacak ciddi React sitesi = Next.js.

Tailwind CSS

Hazır mini CSS sınıflarıyla hızlı ve modern tasarım. LLM'lerle arası çok iyidir.

Prompt'a "Tailwind kullan" yaz, şık çıkar.

Bootstrap

Hazır bileşen seti (buton, menü, kart). Hızlıdır ama her Bootstrap sitesi birbirine benzer.

Eski usta; yeni işlerde Tailwind öne geçti.

Node.js & npm

JS'i tarayıcı dışında (sunucuda) çalıştıran ortam + JS dünyasının paket mağazası.

Sende: n8n ve Telegram botun Node üstünde koşuyor.

Vue & Svelte

React'in iki rakibi: Vue öğrenmesi daha kolay, Svelte daha hafif ve hızlı.

LLM'ler React'te daha isabetli, varsayılan o olsun.
Basit araç → framework'süz (saf HTML/CSS/JS). Veri saklayan küçük app → Flask + SQLite. Büyük çok ekranlı arayüz → React/Next.js. Şık görünüm → Tailwind.
Bölüm 23 · Büyük Resim

DevTools ve CDP Tarayıcının kaputu

Son bölüm, işin dedektiflik tarafı. Her tarayıcıda gizli bir mühendis paneli vardır: DevTools. Bilgisayarda F12'ye bas (ya da sayfaya sağ tıkla → "İncele"), açılır. İçinde üç sekme senin için altın değerinde: Elements DOM ağacını canlı gösterir, Network sayfanın attığı bütün API isteklerini listeler (kazıma işlerinde gizli API'leri burada buluyoruz), Console ise JS hatalarını gösterir. Bu kitaptaki 🔍 İncele modu, DevTools'un "element seç" okunun sana özel, Türkçe konuşan minik halidir.

CDP (Chrome DevTools Protocol) ise aynı panelin uzaktan kumandasıdır: bir program, tarayıcıya dışarıdan bağlanıp onu insan gibi kullanabilir, sayfa açar, tıklar, okur, ekran görüntüsü alır. Senin TripAdvisor kazıyıcın tam olarak böyle çalışıyor: Brave'e CDP kapısından (port 9223) bağlanıyor, otel puanlarını gerçek tarayıcının gözünden okuyor. DataDome gibi bot korumaları gerçek tarayıcı gördüğü için alarm çalmıyor.

İnsan   → klavye + fare      → Brave → tripadvisor.com
Program → CDP (port 9223)    → Brave → tripadvisor.com   ← aynı tarayıcı, uzaktan kumandayla
Bir sitede "bu veri nereden geliyor?" diye merak edersen: F12 → Network → sayfayı yenile → listede JSON dönen isteği ara. Kazımacılığın birinci kuralı budur.
Bölüm 24 · Bilgisayar & Ağ

Donanım: CPU, RAM, disk, GPU Makinenin organları

Yazılım dünyasından bir katman aşağı inelim: bütün bu kodlar fiziksel bir makinede çalışıyor. Dört organını tanı, gerisi teferruat. CPU (işlemci) makinenin beynidir: her komutu sırayla o işler. İçindeki her çekirdek (core) ayrı bir işçidir, 4 çekirdek, aynı anda 4 iş demektir. RAM çalışma masasıdır: o an açık olan her şey (tarayıcı sekmeleri, çalışan programlar) masada durur; makine kapanınca masa boşalır. Disk (SSD) arşiv dolabıdır: dosyaların kalıcı evi, kapansa da silinmez. GPU (ekran kartı) ise bin işçilik atölyedir: tek tek zeki değil ama aynı anda binlerce küçük hesabı birden yapar. Oyunların ve yapay zekânın GPU istemesinin sebebi bu, Bölüm 29'da bağlantıyı göreceksin.

Kuru laf olmasın, JavaScript, üzerinde çalıştığı cihaza bazı şeyleri sorabiliyor. İşte ŞU AN bu sayfayı okuduğun cihazın kimliği:

,
CPU çekirdeği
,
RAM (yaklaşık)
,
ekran çözünürlüğü
,
piksel yoğunluğu

Bu sayıları JS, navigator ve screen nesnelerinden okudu. (Tarayıcı, gizlilik için RAM'i yuvarlar ya da hiç söylemez, "gizli" görürsen sebebi bu.)

CPU = beyin (çekirdek = işçi), RAM = çalışma masası (geçici), disk = arşiv dolabı (kalıcı), GPU = bin işçilik atölye. "Sunucu yavaş" dediğinde ilk soru: masa mı doldu (RAM), beyin mi yoruldu (CPU), dolap mı taştı (disk)?
Bölüm 25 · Bilgisayar & Ağ

IP adresi İnternetin numara sistemi

Bölüm 19'da alan adlarını görmüştün; şimdi perdenin arkası. İnternete bağlı her cihazın bir numarası vardır: telefonun, bilgisayarın, sunucun, hatta akıllı televizyonun. Bu numaraya IP adresi denir ve klasik hali nokta ile ayrılmış dört sayıdır: 129.213.155.31, bu, senin sunucunun gerçek IP'si. İnternette veri, ev adresine gelen kargo gibi IP'den IP'ye taşınır; alan adları ise sadece bu numaraların akılda kalır takma adlarıdır (çeviriyi DNS yapar, hatırla: Bölüm 20).

Bir de herkesin bildiği özel bir numara var: 127.0.0.1, takma adıyla localhost. Anlamı "bu cihazın kendisi"dir, kendi kendinin adresi. Bir uygulamayı yayına almadan önce localhost:8506 gibi adreslerde denememizin sebebi bu: dış dünyaya çıkmadan, cihazın içinde test.

Peki senin şu anki IP'n ne? Butona bas, sayfa, ipify adında ücretsiz bir API'ye soracak (bak, Bölüm 14'teki GET isteği gerçek hayatta yine karşımızda):

IP (bina adresi) + port (daire kapısı) ikilisini birleştirince tam adres çıkar: 129.213.155.31:8506 = "şu binadaki şu daire" = bu kitabın oturduğu yer.

IP = cihazın internetteki numarası. Alan adı = numaranın takma adı. 127.0.0.1 (localhost) = cihazın kendisi. IP:port = bina + daire.
Bölüm 26 · Bilgisayar & Ağ

Proxy ve reverse proxy Araya giren aracılar

Proxy, Türkçesiyle vekil: iki taraf arasına bilerek konan aracı. Hangi tarafın vekili olduğuna göre adı değişir ve ikisini ayırt etmek, sunucu işlerinin yarısını anlamak demektir.

Forward proxy = senin vekilin. Sen siteye doğrudan gitmezsin; isteğin önce vekile gider, siteye vekil ulaşır. Site seni değil vekili görür. VPN'in yaptığı iş özünde budur, "IP'mi gizle, beni Almanya'dan çıkıyormuş gibi göster."

Reverse proxy = sunucunun vekili, yani apartman kapıcısı. Dışarıdan gelen herkes tek kapıya (443 numaralı HTTPS kapısına) gelir; kapıcı hangi daireye (porta) gideceklerini söyler. Senin sunucundaki kapıcının adı NPM (Nginx Proxy Manager): hcc'ye gelen 8502'ye, sebzemeyveye gelen 8505'e, bu kitaba gelen 8506'ya, hepsini o dağıtır ve HTTPS kilidini de o yönetir. Işıkların akışını izle:

Forward proxy, senin vekilin (VPN mantığı): Sen Vekil Site site yalnızca vekili görür, sen görünmezsin Reverse proxy, kapıcı (senin NPM'in): Ziyaretçi NPM:443 🔒 hcc :8502 kitap :8506 sebze :8505 tek kapıdan girilir, kapıcı doğru daireye yönlendirir
Forward proxy = senin vekilin (VPN). Reverse proxy = sunucunun kapıcısı (NPM). Yeni bir app'i yayına alırken hep aynı cümle: "portunda çalıştır, NPM'e bağla, subdomain ver."
Bölüm 27 · Bilgisayar & Ağ

Sunucu dünyası Linux · terminal · SSH · Docker · systemd · cron

Sunucu dediğimiz şey aslında sıradan bir bilgisayardır; farkı, hiç kapanmaması ve başında kimsenin oturmamasıdır. Ekranı yoktur, faresi yoktur, her şey yazıyla, uzaktan yönetilir. Bu dünyanın altı demirbaş aletini tanırsan, sunucu muhabbetlerinin tamamını takip edebilirsin. Altısı da senin sunucunda şu an fiilen çalışıyor:

Linux

Sunucuların işletim sistemidir (Windows'un sunuculardaki rakibi). Ücretsiz, sağlam, dünyadaki sunucuların ezici çoğunluğu bununla döner.

Senin sunucun: Ubuntu (bir Linux türü).

Terminal

Fare yerine yazıyla komut verilen siyah ekran. "ls" yaz dosyaları listeler, "mv" yaz taşır. Korkutucu görünür, alfabesi 20 komuttur.

Claude Code da benimle bu terminalde çalışıyor.

SSH

Uzaktaki makinenin terminaline şifreli bağlanma yolu. Evdeki bilgisayarından sunucunun içine ışınlanmak gibi.

Sunucuna telefonundan bile SSH ile girebilirsin.

Docker

Uygulamayı bütün eşyasıyla taşınabilir bir konteynere koyar. "Bende çalışıyordu, sende niye çalışmıyor?" derdini bitirir: konteyner her yerde aynı çalışır.

n8n'in, NPM'in ve webtop Brave'in Docker konteynerlerinde.

systemd

Uygulamaları ayakta tutan bekçi. Sunucu açılınca uygulamayı başlatır, çökerse yeniden diriltir. "7/24 çalışsın" işinin sırrı budur.

Tracker'ların ve bu kitabın hepsi birer systemd servisi.

cron

Zamanlanmış görev saati: "her sabah 10:00'da şu komutu çalıştır." Kurarsın, unutursun, o hiç unutmaz.

Sebzemeyve fiyatları her sabah 10:00'da cron'la çekiliyor.
Sunucu = başında kimse olmayan, hiç kapanmayan bilgisayar. Linux üstünde, terminalden (SSH ile) yönetilir; uygulamaları systemd ayakta tutar, tekrarlı işleri cron zamanlar, taşınabilirliği Docker sağlar.
Bölüm 28 · Bilgisayar & Ağ

Git ve GitHub Kodun zaman makinesi

Git, kod için bir zaman makinesidir. Çalışmanın her anlamlı noktasında bir kayıt alırsın, buna commit denir. Her commit, projenin o anki fotoğrafıdır; bir şey bozulursa herhangi bir eski fotoğrafa geri dönebilirsin. "Belge-son-SON-yeni2.docx" karmaşasının mühendisçe çözülmüş hali.

GitHub ise bu kayıtların buluttaki evidir: commit'lerini oraya push edersin (itersin), başka makineden pull edersin (çekersin). Bulut yedeği + başkalarıyla ortak çalışma + dünyaya vitrin, üçü bir arada. Projenin GitHub'daki klasörüne de repo (repository = depo) denir:

Senin makinen, commit zinciri (her nokta bir fotoğraf): "ilk hali" "menü eklendi" "hata düzeldi" bugün GitHub buluttaki repo push ↗
Git = zaman makinesi (commit = kayıt noktası). GitHub = kayıtların buluttaki deposu (push = gönder, pull = çek, repo = proje klasörü). Senin sunucu yedeklerin de canszz/serverBackup reposunda duruyor.
Bölüm 29 · Yapay Zeka

LLM ve model Büyük dil modeli

Ve geldik benim mahalleme. ChatGPT, Claude, DeepSeek… bunların hepsinin motoru bir LLM'dir: Large Language Model, yani büyük dil modeli. Peki bu şey ne yapıyor? Özü, tek cümle: "buraya kadarki metne bakıp, sıradaki parçayı tahmin et." Hepsi bu. Ama bu tahmin, internetin neredeyse tamamı okunarak öğrenildiği için, tahminleri şaşırtıcı derecede isabetli, plan kurar, kod yazar, seninle dertleşir.

Model, bu tahmin makinesinin kendisidir: milyarlarca sayısal ayar düğmesinden oluşan dev bir matematik yumağı. O düğmelere parametre denir. Modelin hayatında iki dönem vardır: eğitim (okuma dönemi, aylar sürer, binlerce GPU çalışır, işte Bölüm 24'teki bağlantı) ve inference (kullanım dönemi, senin soru sorduğun her an).

Şu meşhur "harf harf yazma" olayı da buradan geliyor: model cevabı parça parça tahmin ettiği için, cevap sana da parça parça akıtılır. Adı streaming. Butona bas, aynısını canlı yaşa:

LLM = "sıradaki parçayı tahmin et" makinesi. Model = makinenin kendisi, parametre = ayar düğmeleri. Eğitim = okuma dönemi, inference = kullanım. Harf harf yazması = streaming.
Bölüm 30 · Yapay Zeka

Token Yapay zekânın lokması

Az önce hep "parça" dedim, kelime demedim. Çünkü model, metni ne harf harf ne kelime kelime okur; kendi lokma boyutunda parçalara böler. O lokmanın adı token'dır. Kabaca: kısa ve sık kullanılan kelimeler tek token olur, uzun kelimeler birkaç token'a bölünür. İngilizcede 1 token ≈ 4 harf; Türkçe ekli bir dil olduğu için biraz daha çok token yakar.

Token'ı bilmek neden para eder? Çünkü yapay zekâ dünyasında her şey token'la ölçülür: API'lerin fiyatı "1 milyon token = şu kadar dolar"dır, modellerin hafıza sınırı token cinsindendir (bir sonraki bölüm), hız "saniyede token" ile ölçülür. Aşağıya bir şey yaz, modelin senin cümleni nasıl lokmalara böldüğünü izle:

0 token. (Bu gösterim eğitim amaçlı bir taklit, gerçek bölme modelden modele değişir ama mantık birebir bu.)

İsim karışıklığı uyarısı: birazdan Bölüm 32'de bambaşka anlamda bir "token" göreceksin (güvenlik bileti). İkisinin birbiriyle HİÇ ilgisi yok, bilişimciler isim bulmakta tembeldir.

Token = modelin lokması (≈ 4 harf). AI'da fiyat, hafıza ve hız hep token'la ölçülür. "Prompt'um kaç token?" sorusu = "bu iş bana kaça mal olur?" sorusudur.
Bölüm 31 · Yapay Zeka

Prompt ve context window Talimat ve çalışma masası

Prompt, modele verdiğin talimatın tamamıdır, bu kitabın da varlık sebebi: iyi prompt, iyi sonuç. Ama senin yazdığın mesaj, modelin gördüğünün sadece bir parçasıdır. Perde arkasında modele ayrıca bir system prompt verilir ("sen yardımsever bir asistansın, şu kurallara uy…"), sohbetin tüm geçmişi eklenir, varsa yüklediğin dosyalar eklenir. Hepsinin toplamı, modelin çalışma masasına serilir.

O masanın bir boyu vardır: context window (bağlam penceresi), token cinsinden ölçülür. Her şey masaya sığmak zorundadır, sığmazsa en eskiler masadan düşer. Uzun sohbetlerde modelin başta konuşulanları "unutması" bundandır: hafızası silinmedi, masadan düştü:

Modelin çalışma masası (context window) şu an böyle dolu olabilir:

system
sohbet geçmişi
dosyalar
mesajın
boş yer

Masa dolmaya yaklaştıkça model özetlemeye, atlamaya başlar. "Uzun sohbette saçmalamaya başladı" şikâyetinin teknik adı budur.

İyi prompt'un formülünü artık bu kitabın diliyle söyleyebilirsin: ne + teknoloji + görünüm + veri + nerede çalışacak. "Bana site yap" değil; "Flask + SQLite ile, mobil uyumlu, 8507 portunda çalışacak bir stok takip sayfası yap", aradaki fark, bu kitaptaki 33 bölümün ta kendisi.

Prompt = talimatın tamamı (system + geçmiş + dosyalar + mesajın). Context window = token cinsinden masa boyu; dolunca eskiler düşer. Uzun işlerde önemli bilgiyi ara ara tekrar hatırlat.
Bölüm 32 · Yapay Zeka

API key, OAuth, MCP Programlar birbirine nasıl güvenir?

Bölüm 14'te API kapısını görmüştün. Ama o kapılar herkese açık değildir, kapıdan içeri girerken kimliğini göstermen gerekir. Üç kimlik yöntemi, bir de yepyeni bir kapı standardı öğreneceksin; bu dörtlü, "bağlanma" muhabbetlerinin tamamını kapsar.

API key

Programlar için üretilmiş çok uzun bir şifre: sk-a7f3… gibi. Her istekle birlikte gönderilir; sunucu ona bakıp "tamam, bu Mustafa'nın programı" der ve faturayı ona yazar.

DeepSeek key'in her gece AI özetinin faturasını senin bakiyene yazdırıyor.

Token (oturum bileti)

Şifreyle giriş yapınca sunucunun eline tutuşturduğu geçici bilet. Süresi dolunca çöp olur, çalınsa bile hasar sınırlı kalır. Bölüm 30'daki LLM token'ıyla SADECE adı ortak.

Bankanın "oturumunuz sona erdi" demesi = biletin süresi doldu.

OAuth

"Google ile giriş yap" düğmesinin arkasındaki sistem. Şifreni siteye VERMEDEN, Google'a "şu siteye şu kadar yetki ver" dersin. Şifre tek yerde kalır, yetki sınırlı verilir.

Shopify ve Gmail bağlantıların OAuth ile kuruldu.

MCP

Model Context Protocol: yapay zekânın alet çantası standardı. LLM'in bir araca (mağazana, takvimine, veritabanına) bağlanması için ortak fiş, "yapay zekânın USB-C'si" deniyor.

Ben Shopify mağazana ve n8n'ine MCP fişiyle bağlanıyorum.

MCP'yi bir de şemayla gör, solda model (ben), ortada fişler, sağda senin gerçek aletlerin:

Claude LLM MCP Shopify mağazan n8n workflow'ların Gmail · Takvim tarayıcı (Chrome)

Altın güvenlik kuralı: API key'ler backend'de saklanır, ASLA frontend'e yazılmaz, Bölüm 18'i hatırla: frontend'e koyduğun her şeyi herkes görebilir ("sayfa kaynağını görüntüle" yeter).

API key = programın şifresi (faturayı kime yazacağını belirler). Token = geçici oturum bileti. OAuth = şifresiz, sınırlı yetki verme. MCP = LLM'in aletlere bağlanma standardı.
Bölüm 33 · Yapay Zeka

AI sözlüğü Muhabbette geçen diğer terimler

Kapanışı, yapay zekâ haberlerinde ve sohbetlerinde en sık geçen sekiz terimle yapalım. Her biri tek nefeste:

Agent (ajan)

Sadece cevap yazan değil, ARAÇ KULLANAN yapay zekâ: dosya açar, komut çalıştırır, siteye bakar, sonuca kadar kendi kendine adım atar.

Şu an seninle konuşan şey bir agent, bu siteyi öyle kurdum.

Halüsinasyon

Modelin, bilmediği şeyi bilir gibi UYDURMASI. Kötü niyet değil, tahmin makinesinin doğası: en olası görüneni söyler, doğruluğunu bilmez.

Panzehiri: "emin değilsen emin değilim de" + kaynak istemek.

RAG

Cevaptan önce modelin senin belgelerinde arama yapıp bulduklarını masaya koyması. Ezberden değil, senin verinden konuşur, halüsinasyonu azaltır.

"PDF'lerime göre cevapla" diyen her sistem RAG'dir.

Embedding

Metni anlamını koruyarak sayı dizisine çevirme. Sayıya çevrilince "anlamca yakın mı?" hesaplanabilir olur, RAG'in arama motoru budur.

"Benzer ürünleri bul" özelliklerinin arkasında da bu var.

Fine-tuning

Hazır bir modeli kendi örneklerinle bir tur daha eğitip uzmanlaştırmak. Genel doktoru alıp kendi hastanende staj yaptırmak gibi.

Çoğu iş için gereksiz, önce iyi prompt + RAG dene.

Inference

Eğitimi bitmiş modelin ÇALIŞTIRILMASI, yani senin her soru sorduğun an. API faturası ve GPU kirası hep inference'a ödenir.

"Inference ucuzladı" haberi = "AI kullanmak ucuzladı" demek.

Temperature

Modelin cesaret ayarı: düşükse hep en güvenli tahmini seçer (tutarlı ama sıkıcı), yüksekse riskli tahminlere de şans verir (yaratıcı ama savruk).

Kod için düşük, beyin fırtınası için yüksek iyidir.

Open source model

Ağırlıkları (parametreleri) herkese açık model: indirir, kendi makinende çalıştırırsın. Kapalı modelin (Claude, GPT) tersine, veri dışarı çıkmaz.

DeepSeek açık ağırlıklı, ucuzluğunun bir sebebi bu.
Agent = araç kullanan AI. Halüsinasyon = bilmediğini uydurma. RAG = önce senin verinde ara. Embedding = anlamı sayıya çevir. Fine-tuning = modele staj. Inference = kullanım anı. Temperature = cesaret ayarı.