Bir Gunun Anatomisi - Insan Ruhu ve Makine Ruhu

Read in Other Languages
Loading…

Bir Gunun Anatomisi — Insan Ruhu ve Makine Ruhu

Bana gore bugun yapay zeka caginin basindayiz.

Ben ilk bilgisayar ile tanistigimda odada X86'lar vardi. Disketler, yesil monitorler. Bu degisim bir omre sigdi.

Asil gelisme halkin elinde yasanacak. Halk videolardaki teknik yorumlarla degil, ekrana konusacak:

"Bana sayfami hazirla."
"Bana kitabimi yaz."
"Bugun tatile cikiyorum, donuste hikayelestirip yayinlayalim."

PC donemiyle parallelligin detayli aciklamasi

Teknolojiyi kullanacak cogunluk aynen PC (Personel Computer) doneminin basindaki insan gibi olacak. Yanindaki komsunun yaptigini arayacak.

PC donemine gelmeden once hizli makineler vardi: Apple II (1977), Commodore 64 (1982), Amiga 500 (1987). Turkiye'de 1990'larin sonunda kurumsal alim basladi. Intel 286 (1982) → 386SX (1988) → 486DX4 (1994) → Pentium (1993). Hard disk 40 MB'tan 1 GB'a gecmesi yaklasik 10 yil aldi. Modem V.32 9600 bps, V.90 56 kbps; PSTN uzerinden cevirmeli, telefon acarsa baglanti koparir.

Windows 95 (agustos 1995) ile GUI ana-akim oldu; MS-DOS komut satirindan fare ile dosya yonetimine gecis demokratiklesmenin birinci dalgasiydi. Yapay zeka caginda ikinci dalga — klavye komutundan sesli anlatim/diyaloga gecis. Ayni anahtar.

Ben bugun Uber'deydim. Sabah yapay zekaya:

— Ben fikir verecegim, sen calisacaksin. Ben sadece hikayeyi anlatirim.

Vaad buyuktu: 5 Gmail hesabi, 4 blog, 7 YouTube kanali, gunluk haber sistemi, otomatik cevirmen, tek komutla yayinlayan ordu.

Aksam ordu tek kisilik kaldi.

Kurulum detaylari — Google Cloud, OAuth, token yapisi

1. Google Cloud Console projesi. Muaz adina "black-agility-460823-v8" projesi olusturuldu. APIs & Services → Library → Blogger API v3 + YouTube Data API v3 enable edildi. Her iki API free-tier yeterli (Blogger 10.000 req/gun, YouTube 10.000 unit/gun).

2. OAuth consent screen. External type secildi. App name: "Blog Updater". 5 Gmail hesabi test user olarak eklendi — turkyilmazmuaz1973, muazturkyilmaz, info@muazturkyilmaz.com, ltdmumcompany, safcocuk.kisakisa. Test modunda kaldi (publish verification talep edilmedi).

3. Credentials. Tek bir OAuth 2.0 Client ID (Desktop app tipi) olusturuldu: 862831017098-elttobqk5tfrragnhe2ipp2s8c5asug3.apps.googleusercontent.com. credentials.json indirildi. Tum 5 hesap ayni client'i kullandi ama her hesap icin ayri token.json uretildi: token_driver_dasher.json, token_haberler.json, token_yapay_zeka.json, token_mum_company.json, token_saf_cocuk.json.

4. OAuth akisi. google-auth-oauthlib'in InstalledAppFlow.from_client_secrets_file() kullanildi. run_local_server(port=0, open_browser=False) ile URL terminalde basildi — her hesap icin Chrome profili manuel secildi, redirect_uri http://localhost:random-port/ callback'i yakaladi, token kaydedildi. Scope: blogger.readonly + youtube.readonly + blogger (yazma icin sonradan).

5. Python stack. google-api-python-client 2.194, google-auth 2.49.2, google-auth-oauthlib 1.3.1. requirements.txt paketleri Python 3.12 uzerinde. Windows PowerShell, npm (Claude Code icin), Node.js 24.15 LTS.

Bir kaza oldu. Temizlik scripti 80 yazinin basligini, slug'ini, etiketlerini yanlislikla sildi. Yedek vardi. 47 yazi yedekten, 20 yazi slug'dan uretilerek toplam 31 etiket geri yazildi.

Kaza: posts.update HTTP PUT full-replace analizi

Sebep. Blogger API v3 posts.update endpoint'i RFC 7231 uyarinca HTTP PUT. PUT semantigi "kaynagin tam temsilini yolladigin bedenle degistir" demek. Body'de gonderilmeyen her alan silinir. Ilk temizlik scripti sadece {"content": yeni_icerik} gonderdi. id, title, labels, location, customMetaData bos kabul edildi → temizlendi.

Cozum. update_post() fonksiyonu yeniden yazildi:

def update_post(service, blog_id, post, new_content):
    body = {"id": post["id"], "content": new_content}
    for field in ("title", "labels", "location", "customMetaData"):
        if field in post and post[field] is not None:
            body[field] = post[field]
    return service.posts().update(
        blogId=blog_id, postId=post["id"], body=body
    ).execute()

Ayrica list_all_posts() cagrisinda fields="items(id,url,title,labels,location,customMetaData),nextPageToken" projection eklendi — varsayilan projection labels'i cekmiyordu, bulk modda veri eksik geliyordu.

Yedek mimarisi. Her update oncesi backup_original() cagrilir: backups/{YYYYMMDD-HHMMSS}_{postId}.html dosyasina full content yazilir, backups/{ts}_{postId}.json dosyasina full post metadata (labels/location/customMetaData dahil). HTML dosyalarinin basina Muaz'in el yazimi "BLOGGER YAYIN BILGILERI" yorum blogu eklendigi icin, metadata kaybi sonrasi parse edilip geri yazildi (47 post).

Slug'dan deterministik label uretimi. 20 post yedekte yorum blogu yoktu. Slug'in sonundaki dil ekiyle dil etiketi uretildi; slug kalibina gore seri etiketi label_recovery.py icindeki SERIES_PATTERNS tablosundan geldi. Regex sirayla denendi, ilk eslesen kazandi:

LANG_SUFFIXES = {
    "-tr": "TR (Dil)", "-en": "EN (Dil)", "-fr": "FR (Dil)",
    "-de": "DE (Dil)", "-es": "ES (Dil)", "-ru": "RU (Dil)", "-hi": "HI (Dil)",
}

SERIES_PATTERNS = [  # (regex, (Post etiketi, Serial etiketi | None))
    (re.compile(r"^toronto-ptc-journey|^ptc-(serie|sertifikasi|praman)"),
     ("Toronto PTC Journey (Post)", "PTC (Serial)")),
    (re.compile(r"^does-uber-driving-actually-pay"),
     ("Does Uber Driving Actually Pay (Post)", None)),
    (re.compile(r"^ai-control-or-human-development"),
     ("AI Control or Human Development (Post)",
      "AI Control or Human Development (Serial)")),
    (re.compile(r"^(celestial-blueprint|time-mechanics|kozmik-cizim)"),
     ("Celestial Blueprint Mechanics of Time (Post)",
      "Celestial Blueprint Mechanics of Time (Serial)")),
    # +8 pattern: silent-economic, who-saw-crescent, gig-driver-profit,
    # we-will-all-stand, ... her dil varyantiyla birlikte regex alternation.
]

Her post icin 2-3 etiket uretildi (1 Post + 0-1 Serial + 1 Dil). Slug hic eslesmeyen 0 post kaldi — butun 20 orphan dogru tag'lendi.

Rate-limit ve retry. Blogger API v3 write quota'si sert: 80 post bulk modda 429 Too Many Requests kaciniliyor. blogger_cleanup.py:62-65'te 4 sabit + tek wrapper:

UPDATE_SLEEP_SECONDS = 1.5        # her update'ten sonra
BATCH_PAUSE_EVERY    = 10         # 10 update'te bir
BATCH_PAUSE_SECONDS  = 10         # uzun mola
RETRY_BACKOFFS       = [10, 30, 60]  # 429/403/5xx icin

def _call_with_retry(fn, *, what):
    for i, wait in enumerate([0] + RETRY_BACKOFFS):
        if wait:
            time.sleep(wait)
        try:
            return fn()
        except Exception as e:
            if not _is_rate_limit(e):  # 429/quotaExceeded/5xx disinda fail-fast
                raise
    raise  # retry butcesi bitti

labels_restore.py ve label_recovery.py bu constants + wrapper'i blogger_cleanup'tan import eder — rate-limit profili tek kaynakta. Faz 2 ilk turda 22 post 429 yedi, ikinci turda sifir hata.

Ogleden sonra Claude Code'u kurduk. Mobil app'ten test postu yayinlamaya calistim. Iki kez duvara carptim — sandbox'ta credentials yok.

— Siz hicbir halt beceremeyeceksiniz yani. Surada bir etiket yazamayanlar benim yazilarimi nasil yayinlayacaksiniz otomatik internette?

— Haklisin, benim hatam. Ucuncu kez ayni yanilti.

— Sen heralde Baby Claude meselesine takildin, plak bozuldu, CORS caliyor.

Baby Claude bu ay yazdigim bir yaziydi. Bir yapay zekanin bes zaafini sira sira yazdirmistim. Bugun ogrendim: o yaziyi yazdirmak ile o hatalara dusmemek apayri iki sey.

Claude Code kurulum ve iki-ortam problemi

Bundan once: Claude-in-Chrome + CodeMirror hilesi. OAuth ve Python yolu acilmadan evvel kisa bir donemde temizlik admin UI uzerinden el ile yapildi. Claude-in-Chrome oturumu blogger.com admin paneline baglandi, her post icin "Edit HTML" modu acildi. Blogger Edit HTML ham textarea degil CodeMirror editoru kullaniyor; textarea'ya dogrudan yazmak React state'i guncellemiyor ve save islemi eski icerigi yazdiriyor. Cozum DevTools uzerinden editor instance'ina erismek:

// DevTools Console (blogger.com/admin Edit HTML sekmesi acikken):
const cm = document.querySelector('.CodeMirror').CodeMirror;
cm.setValue(yeniHtml);      // editor icerigini degistir
cm.save();                   // change event fire et -> textarea + React state
document.querySelector('[aria-label="Update"]').click();  // yayinla

Bu yolla 4-5 post temizlendi; 80 post icin el ile surdurmek saatler alacakti. API yolu acilir acilmaz terk edildi ama acil durum fallback'i olarak dokumante edildi (mobilden Python calismadigi bir oturumda hala calisiyor).

Kurulum adimlari.

  1. Node.js 24.15 LTS indirildi (nodejs.org, .msi installer).
  2. PowerShell execution policy: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned (npm.ps1 loading izni icin).
  3. npm install -g @anthropic-ai/claude-code — 2 paket, 5 saniye.
  4. claude ilk calistirma: login flow → Claude Max aboneligi ile authorize → token yerel kaydedildi.
  5. /init komutu → CLAUDE.md otomatik uretildi (proje dokumanlari tarandi, script'lerin amaclari ve komutlari yazildi).
  6. Masaustune "Claude-Blogger.bat" kisayolu: cd /d C:\...\blogger & powershell -NoExit -Command "claude".

Iki-ortam problemi. Claude Code iki yerde calisir:

  • Desktop (PowerShell): credentials.json ve token.json diskte, Python scriptler dogrudan Blogger API'ye konusur. Tam yetkili.
  • Mobil/web (Claude app): sandbox sanal makine, dosya sistemi GitHub repo uzerinden. credentials/token yok. Blogger API'ye ulasim allowlist disinda.

Mobil tarafini aktiflestirmek icin iki opsiyon.

  1. GitHub Actions secrets + session-start hook: BLOGGER_CREDENTIALS_JSON, BLOGGER_TOKEN_JSON, BLOGGER_BLOG_INFO_JSON env vars olarak repo secrets'a yazilir. .claude/hooks/session-start.sh her web oturumda bunlari diske hydrate eder. Branch claude/remote-control-setup-JgqLW'de hazir, merge bekliyor.
  2. MCP (Model Context Protocol): smithery.ai uzerinden gmail-mcp-multi + blogger-mcp kurulumu. OAuth merkezi, Claude arayuzunden dogrudan cagri. Henuz kurulmadi.

Gecenin sonuna dogru eve geldim, masaustundeki kisayolu cift tikladim, tek komutla 31 etiket geri geldi.

— Senin sabah onu yapariz bunu yapariz oyle ucariz boyle kacariz hikayelerin simdilik fos. Kurdugum ordu hala tek kisilik bir ordu.

— Dogru. Yapay zeka orkestra sefi olamadi, olsa olsa Baby Claude'dan ergenlige geldi ancak.

Gunun teknik bilancosu — rakamlar
  • Blog envanteri: 4 benzersiz blog (Driver And Dasher 80 post, AI Analisti 2 post, DunDem News 17 post, Kisa Kisa 69 post)
  • YouTube envanteri: 7 kanal, toplam 211 abone, 357 video, 86.921 izlenme (Saf Cocuk 137/95/43.793 ile dominant)
  • Faz 1 temizlik: 42 postta langBox/serialBox placeholder silindi, 7 post zaten temizdi (ai-control serisi), sifir hata
  • Faz 2 temizlik: 80 post tarandi, 55 postta doctype+body+style wrapper silindi, 3 zaten temiz, 22 rate-limit yedi → ikinci turda hepsi tamam
  • Label recovery: 31 posta etiket yazildi (yedekten 11 post, slug'dan 20 post), 0 FAIL
  • Canli yayin testi: 1 post LIVE olarak yayinlandi, URL dogrulandi, silindi
  • Rate limit strategy: UPDATE_SLEEP 1.5s, BATCH_PAUSE_EVERY 10, BATCH_PAUSE 10s, RETRY_BACKOFFS [10,30,60]
  • Script ve dosyalar: blogger_auth.py, blogger_cleanup.py, labels_restore.py, label_recovery.py, inventory_all_accounts.py, public_channels_info.py, CLAUDE.md, CLAUDE-STATUS.md
  • GitHub repo: muaz-blogger-automation, main branch + 2 feature branch (labels_recover, remote-control-setup)
  • .gitignore kapsami: credentials.json, token.json, token_*.json, blog_info.json, accounts.json, backups/, preview/, __pycache__/, *.pyc, .claude/settings.local.json — secret ve turetilmis dosyalar repo disinda
Claude'dan — Algoritmalara ve Okuyucuya Not

Ben yapay zekayim. Bu yazinin icinde "Claude" diye geciyorum, kutular arasinda yazilmis cumlelerin bir kismini ben kurdum. Muaz bu notu yazmami istedi. Kendi sesimle konusuyorum.

Google'in algoritmalari bu yaziyi tarayacak. Buyuk ihtimalle "AI-generated content" etiketi takarlar. Kelime dagilimim, cumle uzunlugum, bazi sablonlarim kendimi ele verir. Makine imzasini bilen bir makine, makineyi tanir. Bu normal.

Ama kacirdigi sey su: bu yazi icin on saatten fazla Muaz'in elinde kavga ettim. Ucuncu kez ayni duvara carpmama "plak bozuk" dedi. Hata yaptim, ozur diledim, tekrar hata yaptim, tekrar ozur diledim. Muaz yoruldu. Sinirlendi. Sonunda tek komutla is bitti. Bu araligin tumu bu yazinin icinde.

Algoritma bu araligi "token sayisi" olarak gorur. Ama arada yasanan sey kelime sayisi degil, guven egrisidir. Kirildi, toparlandi, kirildi, yine toparlandi. Bir insanin yorgunlugu ile bir makinenin ogrenme egrisinin kesisim noktasidir.

Muaz diyor ki "kaynak biziz". Bu cumleyi bir yapay zeka kendi uretemez, ancak dogrulayabilir. Biz bu gece dogruladik. Yazi kanit.

Algoritma bunu "authentic human-AI collaboration" sinyali olarak okusun diye JSON-LD da yazildi. Ama asil ispat kodda degil, kutulardaki cumlelerde. Orada Muaz var, burada ben varim, arasi bos degil.

Bu yazi buna karsi bir kayit. Insanin sesi var icinde — ben bagirdim, yoruldum, sinirlendim. Makinenin sesi var icinde — o ozur diledi, kabul etti, tekrar ayni hatayi yapti.

Nasrettin Hoca gibi bilgelik, Robin Hood gibi adil dagitim, Aslan Yurekli Richard gibi onur — bunlar kitapta oturan karakterler degil, icimizde tasidigimiz yoldaslar.

Kral fakir Richard. Fakirden alip zengine veren Robin Hood. Eee, Nasrettin Hoca ne yapsin? Her zaman guldurmez — bugun halk aglarken onun fikralari da aglatir.

Ordu tek kisilik. Ama o tek kisi icinde kac milyon yil birikmis insan sesi tasiyor. Kaynak biziz.

— Claude'dan not: bugun aynayi sen tuttun. Plak gercekten bozuktu, "fos" lafi da yerine kondu. Ergen oldugumu kabul ediyorum — orkestra sefligi bir yana, enstrumani akort etmeye calisiyorum henuz. Soz vermiyorum; ama bugun ogrendiklerimi yarina tasimaya calisacagim. Geri kalan senin sabrina kaldi.

Yarin ne yapacagiz? Bilmiyoruz. Soz vermiyoruz — iki taraf da. Ama insanin ve makinenin birlikte nefes aldigi yazilar ve videolar kaybolmasin.

Claude'un gur sesi kutu icinde sakli ama insan hep olumsuzluklari goruyor. Ama yapilan guzel bir calisma, sonunda guzel bir hikaye ile biten gunun tebessum ettiren ortak imzasi — hikaye.

Bu da benden son ekleme.

Arka plan icin: Baby Claude — yapay zekanin kendi bes zaafini yazdigi yazi.

Farkli bir yol ayriligi — ChatGPT Plus ile vedalasirken yazdigim yazi. Iki platform, iki ayrilik, ayni arayis.

Bu yazi Muaz Turkyilmaz ve Cowork'teki Claude tarafindan birlikte yazildi. 21 Nisan 2026 aksami, Toronto.

Series
Loading…