66 puan yazan GN⁺ 2025-08-18 | 1 yorum | WhatsApp'ta paylaş
  • Geliştiricilerin sıkça düştüğü sezgisel olmayan tuzaklar derlenerek, ortaya çıkması kolay hataların nedenleri tanıtılıyor
  • HTML, CSS, Unicode/metin kodlaması, kayan nokta, zaman gibi çeşitli teknolojilerde sık yaşanan sorunlar ele alınıyor
  • Her dil ve framework'te sözdizimi ve davranıştaki ince farklar nedeniyle yanlış anlama veya hataların oluşabileceği vurgulanıyor
  • Eşzamanlılık, ağ iletişimi, veritabanı gibi backend'in temel alanlarında gerçek üretim ortamında ortaya çıkabilecek tuzaklar örneklerle açıklanıyor
  • Çeşitli örnekler ve referans bağlantılarıyla sorun durumları, çözüm yolları ve beklenmedik davranışların nasıl iyileştirilebileceği anlatılıyor

HTML ve CSS

  • Flexbox/Grid'de varsayılan min-width değeri

    • min-width varsayılan olarak auto
    • min-width: auto, içerik boyutuna göre belirlenir ve flex-shrink, overflow: hidden, width: 0, max-width: 100% ayarlarına göre önceliklidir
    • Öneri: min-width: 0 açıkça belirtin
  • CSS'te yatay ve dikey farkı

    • width: auto üst öğenin alanını doldurmaya çalışır, height: auto ise içeriğe uyum sağlar
    • inline, inline-block, float öğelerinde width: auto genişlemez
    • margin: 0 auto yatay ortalama sağlar, margin: auto 0 ise dikey ortalama yapmaz (ancak flex-direction: column durumunda dikey ortalama mümkündür)
    • Margin collapsing yalnızca dikey yönde olur
    • writing-mode: vertical-rl gibi yerleşim yönü değişirse davranış da tersine döner
  • Block Formatting Context (BFC)

    • display: flow-root ile BFC oluşturulur (overflow: hidden/auto/scroll, display: table vb. ile de mümkündür ancak yan etkileri vardır)
    • Dikey bitişik kardeş öğelerin margin'lerinin çakışması veya çocuk öğe margin'lerinin üst öğe dışına taşması BFC ile önlenebilir
    • Üst öğe yalnızca float çocuklar içeriyorsa yüksekliği 0'a çöker → BFC ile düzeltilebilir
    • border ya da padding varsa margin collapsing oluşmaz
  • Stacking Context

    • Yeni bir stacking context oluşturan koşullar
      • transform, filter, perspective, mask, opacity gibi render özellikleri
      • position: fixed veya sticky
      • z-index belirtilmiş olması + absolute/relative konumlandırma
      • z-index belirtilmiş olması + flexbox/grid içindeki öğe
      • isolation: isolate
    • Özellikleri
      • z-index yalnızca stacking context içinde geçerlidir
      • position: absolute/fixed koordinatları en yakın positioned ata öğeye göre belirlenir
      • sticky, stacking context'i aşarak çalışmaz
      • overflow: visible olsa bile stacking context nedeniyle kırpılabilir
      • background-attachment: fixed, stacking context'e göre yerleştirilir
  • Viewport birimleri

    • Mobil tarayıcıda adres çubuğu/navigasyon çubuğu kaydırma sırasında ekrandan kaybolursa 100vh değeri değişir
    • Güncel çözüm: 100dvh kullanın
  • Absolute Position referansı

    • position: absolute, ebeveyne değil, en yakın relative/absolute ya da stacking context ata öğeye göre konumlanır
  • Blur davranışı

    • backdrop-filter: blur, çevredeki öğeleri dikkate almaz
  • Float'ın etkisiz kalması

    • Üst öğe flex veya grid ise çocuk öğenin float özelliği etkisizdir
  • Yüzdelik width/height birimleri

    • Üst öğenin boyutu önceden belirlenmemişse çalışmaz (döngüsel referansı önlemek için)
  • Inline öğe özellikleri

    • display: inline, width, height, margin-top, margin-bottom değerlerini yok sayar
  • Whitespace işleme

    • HTML'de satır sonları varsayılan olarak boşluk kabul edilir, art arda gelen boşluklar teke indirilir
    • `` boşluk daraltmayı engeller ancak başlangıç/bitiş kısmındaki davranışı özeldir
    • Çoğu içeriğin başındaki/sonundaki boşluk yok sayılır ama `` istisnadır
    • inline-block öğeler arasındaki boşluk/satır sonu gerçek aralık olarak gösterilir (flex/grid'de bu olmaz)
  • text-align

    • Metin ve inline öğelerin hizalanmasında uygulanır, ancak block öğeleri hizalamaz
  • box-sizing

    • Varsayılan değer content-box → padding/border dahil edilmez
    • width: 100% + padding ayarlandığında üst öğenin alanı aşılabilir
    • Çözüm: box-sizing: border-box
  • Cumulative Layout Shift

    • `` için width ve height öznitelikleri belirtilmezse, görsel yüklemesi geciktiğinde yerleşim kayması oluşur
    • Öneri: CLS'yi önlemek için bu öznitelikleri belirtin
  • Chrome'da dosya indirme ağ isteği

    • DevTools ağ panelinde görünmez (ayrı bir sekmede işlenir)
    • Analiz gerekiyorsa chrome://net-export/ kullanın
  • HTML içinde JavaScript ayrıştırma sorunu

Unicode ve metin kodlaması

  • Kod noktaları ve grapheme cluster'lar

    • Grapheme cluster, GUI'deki "karakter birimi"dir
    • Görünür ASCII karakterlerinde 1 kod noktası = 1 grapheme cluster
    • Emoji, birden fazla kod noktasından oluşan tek bir grapheme cluster olabilir
    • UTF-8'de kod noktası 1~4 bayttır; bayt sayısıyla kod noktası sayısı aynı değildir
    • UTF-16'da kod noktası 2 bayt veya 4 bayt olabilir (surrogate pair)
    • Standart, cluster içindeki kod noktası sayısına sınır koymaz; ancak implementasyonlarda performans nedeniyle sınırlar bulunabilir
  • Dillere göre string davranışı farkları

    • Rust: Dahili string yapısı UTF-8 kullanır, len() bayt sayısını verir, doğrudan indeksleme yapılamaz, chars().count() kod noktası sayısını verir, UTF-8 geçerliliği sıkı biçimde doğrulanır
    • Golang: String fiilen bir bayt dizisidir; uzunluk ve indeksleme bayt düzeyindedir, çoğunlukla UTF-8 kullanılır
    • Java, C#, JS: UTF-16 tabanlıdır, uzunluk 2 bayt birimleriyle ölçülür, indeksleme de 2 bayt birimleriyle yapılır, surrogate pair vardır
    • Python: len() kod noktası sayısını döndürür, indeksleme ise tek bir kod noktasını içeren string döndürür
    • C++: std::string için kodlama kısıtı yoktur, bir bayt vektörü gibi davranır, uzunluk/indeksleme bayt düzeyindedir
    • Bahsedilen diller arasında grapheme cluster düzeyinde uzunluk/indeksleme yapan bir dil yoktur
  • BOM (Byte Order Mark)

    • Bazı metin dosyalarında BOM bulunur; örneğin EF BB BF → UTF-8 kodlamasını gösterir
    • Daha çok Windows'ta kullanılır; Windows dışı yazılımlar BOM'u işleyemeyebilir
  • Diğer dikkat edilmesi gerekenler

    • İkili veri dizeye dönüştürülürken, hatalı kısımlar � (U+FFFD) ile değiştirilir
    • Confusable characters vardır (birbirine benzer görünen karakterler)
    • Normalleştirme (Normalization): Örn. é, U+00E9 (tek kod noktası) veya U+0065+U+0301 (iki kod noktası) olarak ifade edilebilir
    • Zero-width characters ve Invisible characters vardır
    • Satır sonu farkı: Windows CRLF \r\n, Linux/MacOS ise LF \n kullanır
    • Han unification: Dillere göre şekli biraz farklı olan karakterler aynı kod noktasını kullanır
      • Yazı tipi, dile özgü varyantları içererek uygun şekilde render eder
      • Uluslararasılaştırmada doğru yazı tipi varyantını seçmek gerekir

Kayan nokta (Floating point)

  • NaN özellikleri

    • NaN, kendisi dahil hiçbir değerle eşit değildir (NaN == NaN her zaman false olur)
    • NaN != NaN her zaman true olur
    • NaN içeren işlemlerin sonucu çoğunlukla NaN olarak yayılır
  • Özel değerler

    • +Inf ve -Inf vardır, NaN'den farklıdır
    • -0.0, +0.0'dan ayrı bir değerdir
      • Karşılaştırma işlemlerinde aynı kabul edilir, ancak bazı hesaplamalarda farklı davranır
      • Örn: 1.0 / +0.0 == +Inf, 1.0 / -0.0 == -Inf
  • JSON ile uyumluluk

    • JSON standardı NaN ve Inf'e izin vermez
      • JS JSON.stringify, NaN ve Inf'i nulla dönüştürür
      • Python json.dumps(...), NaN ve Infinity'yi olduğu gibi yazar (standart ihlali)
        • allow_nan=False seçeneğinde NaN/Inf varsa ValueError oluşur
      • Golang json.Marshal, NaN/Inf varsa hata döndürür
  • Hassasiyet sorunları

    • Kayan noktalı sayıları doğrudan karşılaştırmak başarısız olabilir → abs(a - b) < ε biçimi önerilir
    • JS tüm sayıları kayan noktalı sayı olarak işler
      • Güvenli tamsayı aralığı -(2^53 - 1) ~ 2^53 - 1
      • Bu aralığın dışına çıkıldığında tamsayı gösterimi hatalı olur
      • Büyük tamsayılar için BigInt kullanılması önerilir
      • JSON'da güvenli aralığı aşan tamsayılar varsa, JSON.parse sonucu elde edilen değer hatalı olabilir
      • Milisaniye tabanlı zaman damgaları 287.396 yıla kadar güvenlidir, nanosaniye tabanlı olanlarda sorun çıkar
  • İşlem kurallarının geçerli olmaması

    • İşlem sırasına bağlı hassasiyet kaybı nedeniyle birleşme ve dağılım özellikleri tam anlamıyla geçerli olmaz
    • Paralel işlemler (matris çarpımı, toplam vb.) deterministik olmayan sonuçlar üretebilir
  • Performans

    • Bölme, çarpmadan çok daha yavaştır
    • Aynı sayıya birden çok kez bölünüyorsa, önce tersi alınıp çarpma yapılarak optimizasyon sağlanabilir
  • Donanıma bağlı farklar

    • FMA (Fused Multiply-Add) desteği: Bazı donanımlar ara hesapları daha yüksek hassasiyetle yapar
    • Subnormal range işleme: Modern donanımlar destekler, ancak bazı eski sistemler bunu 0 olarak işler
    • Yuvarlama modu farkları
      • RNTE (en yakın çift sayıya yuvarlama), RTZ (0'a doğru kesme) gibi modlar vardır
      • x86/ARM'de thread-local mutable durum olarak ayarlanabilir
      • GPU'larda yuvarlama modu komut düzeyinde farklıdır
    • Trigonometrik fonksiyonlar, logaritma gibi matematiksel fonksiyonların davranışı farklı olabilir
    • x86'da eski 80 bit FPU ve per-core rounding mode bulunur → kullanılması önerilmez
    • Bunlar dışında da çeşitli etkenler nedeniyle donanıma göre kayan nokta sonuçları değişebilir
  • Hassasiyeti artırma yöntemleri

    • Hesaplama grafiğini sığ tutun (ardışık çarpma yapısını azaltın)
    • Ara değerlerin aşırı büyük veya aşırı küçük olmasından kaçının
    • FMA gibi donanımsal işlemlerden yararlanın

Zaman (Time)

  • Artık saniye (Leap second)

    • Unix zaman damgası artık saniyeleri yok sayar
    • Artık saniye olduğunda, çevresindeki aralıkta zaman uzatılır veya kısaltılır (Leap smear)
  • Saat dilimi (Time zone)

    • UTC ve Unix zaman damgası dünya genelinde ortaktır
    • İnsanın okuduğu saat bilgisi bölgesel saat dilimine bağlıdır
    • Veritabanında zaman damgası saklayıp UI katmanında dönüştürmek önerilir
  • Yaz saati uygulaması (DST)

    • Bazı bölgelerde yaz aylarında saatler 1 saat ayarlanır
  • NTP senkronizasyonu

    • Senkronizasyon sırasında zamanın "geri gitmesi" durumu yaşanabilir
  • Sunucu saat dilimi ayarı

    • Sunucunun UTC olarak ayarlanması önerilir
    • Dağıtık sistemlerde düğümlerin saat dilimleri farklıysa sorun çıkar
    • Sistem saat dilimi değiştirildikten sonra veritabanının yeniden yapılandırılması veya yeniden başlatılması gerekir
  • Donanım saati vs sistem saati

    • Donanım saatinde saat dilimi kavramı yoktur
    • Linux: donanım saatini UTC olarak ele alır
    • Windows: donanım saatini yerel saat olarak ele alır

Java

  • == nesne referanslarını karşılaştırır; nesne içeriğini karşılaştırmak için .equals kullanmak gerekir
  • equals ve hashcode override edilmezse, map/set içinde nesne eşdeğerliği referans temelli değerlendirilir
  • Bir map'in key nesnesinin veya bir set öğesi nesnesinin içeriği değiştirilirse konteyner davranışı bozulur
  • List döndüren metotlar duruma göre mutable ArrayList veya immutable Collections.emptyList() döndürebilir; ikincisini değiştirmeye çalışınca UnsupportedOperationException oluşur
  • Optional döndüren metotların null döndürdüğü durumlar vardır (önerilmez)
  • finally bloğunda return yapılırsa, try veya catch içinde oluşan exception yok sayılır ve finally dönüş değeri uygulanır
  • interrupt'ı yok sayan kütüphaneler vardır; IO içeren sınıf başlatma süreci interrupt nedeniyle bozulabilir
  • Thread pool'da .submit() ile verilen task'lerin exception'ları varsayılan olarak log'a yazılmaz, yalnızca future üzerinden görülebilir; future yok sayılırsa exception da görülemez
    • scheduleAtFixedRate işleri exception oluştuğunda sessizce durur
  • Sayı literal'i 0 ile başlıyorsa sekizlik sayı olarak işlenir (0123 → 83)
  • Debugger, yerel değişkenlerin .toString() metodunu çağırır; bazı sınıfların toString() metodunda yan etki bulunduğundan debug sırasında kod davranışı değişebilir (IDE'de devre dışı bırakılabilir)

Golang

  • append(), capacity uygunsa belleği yeniden kullanır; subslice'a append yapmak üst dilimin belleğinin de üzerine yazabilir
  • defer, blok scope'u bittiğinde değil, fonksiyon return ettiğinde çalışır
  • defer, mutable değişkenleri capture eder
  • nil ile ilgili
    • nil slice ile empty slice farklıdır
    • string nil olamaz, yalnızca boş dize olabilir
    • nil map'ten okuma yapılabilir ama yazma yapılamaz
    • interface nil davranışının bir tuhaflığı vardır: data pointer null olsa bile type info null değilse nil ile eşit değildir
  • Dead wait: Go'da gerçek eşzamanlılık hatası örnekleri vardır
  • Timeout türleri çeşitlidir; net/http içinde ayrıntılı biçimde ele alınır

C/C++

  • std::vector öğe işaretçilerini sakladıktan sonra vector büyürse yeniden tahsis gerçekleşir, işaretçiler geçersiz hale gelir
  • literal string ile oluşturulan std::string geçici bir nesne olabilir; c_str() çağrıldığında risklidir
  • yineleme sırasında container değiştirilirse iterator geçersiz hale gelir
  • std::remove gerçekte silme yapmaz, öğeleri yeniden düzenler; silmek için erase gerekir
  • sayısal literal 0 ile başlıyorsa sekizlik sayı olarak işlenir (0123 → 83)
  • Undefined behavior (UB): optimizasyon sürecinde UB serbestçe değiştirilebilir, bu yüzden buna bağımlı olmak tehlikelidir
    • başlatılmamış belleğe erişim UB'dir
    • char*'ı struct işaretçisine dönüştürürken nesne ömrü başlamadan önce erişim UB'dir, memcpy ile başlatma önerilir
    • hatalı bellek erişimi (null işaretçi vb.) UB'dir
    • tamsayı overflow/underflow UB'dir (unsigned türlerde 0'ın altına underflow olabilir)
    • Aliasing: farklı türde işaretçiler aynı belleği gösterirse strict aliasing rule nedeniyle UB oluşur
      • istisnalar: 1) kalıtım ilişkisine sahip türler 2) char*, unsigned char*, std::byte* dönüşümü (ters dönüşüm için geçerli değildir)
      • zorunlu dönüşüm için memcpy veya std::bit_cast önerilir
    • hizasız bellek erişimi UB'dir
  • Bellek hizalaması
    • 64 bit tamsayıların adresi 8'e tam bölünebilmelidir
    • ARM üzerinde hizasız erişim crash'e neden olabilir
    • bir byte buffer'ını doğrudan struct olarak yorumlamak hizalama sorunlarına yol açar
    • hizalama, struct padding oluşturarak bellek israfına neden olabilir
    • bazı SIMD komutları (AVX vb.) yalnızca hizalanmış veriyi işleyebilir; genellikle 32 byte hizalama gerekir

Python

  • fonksiyon varsayılan argümanları her çağrıda yeniden oluşturulmaz; ilk değer olduğu gibi saklanır

SQL Databases

  • Null işleme

    • x = null çalışmaz, x is null kullanılmalıdır
    • Null kendisine eşit değildir (NaN'e benzer)
    • Unique index, Null tekrarına izin verir (ancak Microsoft SQL Server istisnadır)
    • select distinct içinde Null'un nasıl işlendiği veritabanına göre değişir
    • count(x) ve count(distinct x), Null değeri olan satırları yok sayar
  • Genel davranış

    • tarihin örtük dönüşümü timezone'a bağlı olabilir
    • karmaşık join + distinct, iç içe sorgulardan daha yavaş olabilir
    • MySQL(InnoDB)'de string alanı utf8mb4 değilse 4 byte UTF-8 karakter eklenirken hata oluşur
    • MySQL(InnoDB) varsayılan olarak büyük/küçük harf duyarsızdır
    • MySQL(InnoDB) örtük dönüşüme izin verir: select '123abc' + 1; → 124
    • MySQL(InnoDB) gap lock, deadlock'a neden olabilir
    • MySQL(InnoDB)'de group by ile select sütunları uyuşmazsa deterministik olmayan sonuç döner
    • SQLite'ta strict değilse alan türünün pek anlamı yoktur
    • Foreign key, örtük lock oluşturarak deadlock'a neden olabilir
    • Locking, veritabanına bağlı olarak repeatable read isolation'ı bozabilir
    • dağıtık SQL veritabanları locking'i desteklemeyebilir veya alışılmadık davranış gösterebilir (veritabanına göre değişir)
  • Performans/operasyon

    • N+1 query sorunu, her sorgu hızlı olduğu için slow query log'da görünmez
    • uzun süre çalışan transaction'lar lock sorunları vb. yaratır → transaction'ların hızlı bitirilmesi önerilir
    • tüm tabloyu lock'lama örnekleri
      • MySQL 8.0+'da unique index/foreign key eklerken çoğu durumda eşzamanlı işlem mümkündür
      • eski MySQL sürümlerinde tüm tablo lock'u oluşabilir
      • mysqldump içinde --single-transaction seçeneği yoksa tüm tablo için read lock alınır
      • PostgreSQL'de create unique index veya alter table ... add foreign key, tüm tablo için read lock oluşturur
        • kaçınma yöntemi: create unique index concurrently kullanın
        • foreign key için ... not valid ardından validate constraint yöntemi kullanılır
  • Range sorguları

    • Çakışmayan aralıklar:
      • basit koşul p >= start and p file 2>&1 → stdout+stderr birlikte dosyaya, cmd 2>&1 > file → yalnızca stdout dosyaya, stderr olduğu gibi kalır
  • Dosya adları büyük/küçük harfe duyarlıdır (Windows'tan farklı olarak)

  • Çalıştırılabilir dosyalar için bir capability sistemi vardır (getcap ile kontrol edilebilir)

  • Unset değişken riski: DIR unset ise rm -rf $DIR/rm -rf / çalıştırma riski doğurur → set -u ile önlenebilir

  • Ortamı uygulama: Bir script'i mevcut shell'e uygulamak için source script.sh kullanılır → kalıcı uygulamak için ~/.bashrc içine ekleyin

  • Bash'te komut önbellekleme vardır: $PATH içindeki dosya taşınırsa ENOENT oluşabilir → hash -r ile önbelleği yenileyin

  • Değişkenler tırnaksız kullanıldığında satır sonları boşluk olarak işlenir

  • set -e: Script hata verdiğinde hemen çıkar, ancak koşul ifadelerinin içinde (||, &&, if) çalışmaz

  • K8s livenessProbe ile debugger çakışması: Breakpoint debugger tüm uygulamayı durdurur ve health check yanıtı başarısız olur → Pod sonlandırılabilir

React

  • Render kodunda state'i doğrudan değiştirmek
  • Hook'ları if/loop içinde kullanmak → kural ihlali
  • useEffect dependency array'inde gerekli değerleri eksik bırakmak
  • useEffect içinde clean up kodunu atlamak
  • Closure trap: Eski state'in yakalanması nedeniyle bug oluşması
  • Veriyi yanlış yerde değiştirmek → impure component
  • useCallback kullanmamak → gereksiz yeniden render tetiklenmesi
  • Memo'lanmış bir componente memo'lanmamış değer vermek memo optimizasyonunu etkisiz kılar

Git

  • Rebase, geçmişi yeniden yazar

    • rebase sonrası normal push çakışır → mutlaka force push gerekir
    • remote branch geçmişi değiştiğinde pull için de --rebase kullanılmalı
    • --force-with-lease bazı durumlarda başka geliştiricilerin commit'lerinin üzerine yazılmasını önleyebilir, ancak yalnızca fetch yapıp pull yapmazsanız bu koruma çalışmaz
  • Merge revert sorunu

    • Merge revert etkisi tam değildir → aynı branch tekrar merge edilirse hiçbir değişiklik olmaz
    • Çözüm: revert'ün revert'ünü yapmak veya daha temiz bir yöntem kullanmak (backup → reset → cherry-pick → force push)
  • GitHub ile ilgili dikkat edilmesi gerekenler

    • API anahtarı gibi bir secret commit edildikten sonra force push ile üzerine yazılsa bile GitHub'da kaydı kalır
    • private repo A'dan fork'lanan B private olsa bile, A public olursa B'nin içeriği de açığa çıkar (silindikten sonra bile erişilebilir)
  • git stash pop: conflict oluşursa stash drop edilmez

  • .DS_Store macOS tarafından otomatik oluşturulur → .gitignore içine **/.DS_Store eklenmesi önerilir

Networking

  • Bazı router ve firewall'lar boşta kalan TCP bağlantılarını sessizce keser → HTTP istemcisi ve DB istemcisinin connection pool'u geçersiz hale gelebilir → çözüm: TCP keepalive ayarı
  • traceroute sonuçları çok güvenilir değildir → bazı durumlarda tcptraceroute daha kullanışlı olabilir
  • TCP slow start gecikme artışının nedeni olabilir → tcp_slow_start_after_idle devre dışı bırakılarak çözülebilir
  • TCP sticky packet sorunu: Nagle algoritması paket gönderimini geciktirir → TCP_NODELAY etkinleştirilerek çözülebilir
  • Backend'i Nginx arkasına yerleştirirken connection reuse ayarı gerekir → ayarlanmazsa yüksek yük altında iç portların tükenmesi nedeniyle bağlantı hatası oluşabilir
  • Nginx varsayılan olarak paket buffering yapar → SSE(EventSource) gecikmesine yol açar
  • HTTP standardı GET ve DELETE isteklerinde body'yi yasaklamaz → bazıları body kullanır, ancak birçok kütüphane ve sunucu bunu desteklemez
  • Tek bir IP üzerinde birden fazla web sitesi barındırılabilir → ayrımı HTTP Host header'ı ile TLS'nin SNI özelliği yapar → yalnızca IP ile erişilemeyen siteler olabilir
  • CORS: Farklı bir origin'e istek gönderildiğinde tarayıcı yanıt erişimini engeller → sunucuda Access-Control-Allow-Origin header'ı ayarlanmalıdır
    • Cookie iletimini de içeriyorsa ek ayarlar gerekir
    • Frontend ve backend aynı domain ve portu kullanıyorsa CORS sorunu olmaz

Other

  • YAML dikkat noktaları

    • YAML boşluğa duyarlıdırkey:value hatalıdır, key: value doğrudur
    • NO ülke kodu tırnaksız yazılırsa false olarak yorumlanabilir
    • Git commit hash'i tırnaksız yazılırsa sayıya dönüştürülebilir
  • Excel CSV sorunu

    • Excel CSV açarken otomatik dönüştürme uygular
      • Tarih dönüşümü: 1/2, 1-22-Jan
      • Büyük sayıların hatalı dönüşümü: 1234567890123456789012345678901234500000
    • Bunun nedeni Excel'in sayıları dahili olarak floating point biçiminde işlemesidir
    • Bu sorun nedeniyle gen adı SEPT1'in yanlış değiştirilmiş olduğu vakalar vardır

1 yorum

 
GN⁺ 2025-08-18
Hacker News görüşü
  • Bazı router ve güvenlik duvarları, uygulamaya hiçbir sinyal vermeden boşta duran TCP bağlantılarını sessizce kesebiliyor; HTTP istemci kütüphaneleri veya veritabanı istemcileri gibi TCP bağlantı havuzu tutan kodlar bu yüzden hiçbir uyarı olmadan geçersiz hale gelen bağlantılarla karşılaşabiliyor. Bunu çözmek için sistem TCP keepalive ayarlanabilir ya da HTTP tarafında Connection: keep-alive, Keep-Alive: timeout=30, max=1000 başlıkları kullanılabilir. Bir TCP bağlantısı kurulduktan sonra aradaki router üzerinde durum tutulmaz; asıl sorun güvenlik duvarı veya NAT oturum zaman aşımıdır. Bu durumda RST paketi de gelmez. K8s ortamında conntrack modülü ayarlarının fazla düşük olduğu bir sorun yaşamıştım. HTTP Keep-Alive kullansanız bile bu yalnızca bağlantının yeniden kullanılmasına yardımcı olur, ağ üzerindeki bağlantıyı canlı tutmaz(açıklama bağlantısı). HTTP Keep-Alive fiilen paket üretmez, yalnızca kapanışı erteler. Buna karşılık TCP Keep-Alive periyodik olarak paket üretip zamanlayıcıyı sıfırlar

    • TCP Keep-Alive mobil cihazlarda iyi çalışmayabilir; mobil işletim sistemleri uygulama düzeyinde üretilen keep-alive paketlerini ayrı ayrı izleyip yönetebilir. Ancak TCP Keep-Alive uygulama seviyesinin altında çalıştığı için bazı durumlarda devre dışı bırakılabilir ve bu sırada uygulama hâlâ erişilebilir olabilir
  • Optional<T> döndüren bir metot null döndürebilir; bu pratik aşırı derecede kafa karıştırıcı. Duygusal olarak biraz boşluğum olsaydı @java.lang.NonNullReference gibi bir anotasyon getiren bir JEP yazardım. Bu anotasyonla bir tipi tanımladığınızda derleyicinin null atamasını hata saymasını isterdim; örneğin Alpha null atamasına izin verirken Beta hata vermeli. javac tarafında dead code elimination’ın gerçekte nasıl işlediğini görmek için spesifikasyona da bakmak gerekiyor gibi. Örneğin if (true) içinde b = null yapılan kısım pratikte elided ediliyorsa, hukuken izin verilen bir kod olabilir

    • Kotlin’de bu durum zaten derleme hatası oluyor; ayrıca anotasyona gerek yok

    • null olan bir dilde Optional<T> kullanmaya gerçekten gerek var mı emin değilim. Python’da bir fonksiyonun dönüş değeri Optional nesnesi yerine doğrudan T | None olarak yazıldığı gibi kontrol yine yapılacaksa, çerçevenin farkı belirsizleşiyor. Özel bir monad tarzı kullanılmıyorsa sonuçta kontrol aynı

  • Java, C#, JS’nin bellekteki string’leri UTF-16 benzeri bir biçimde kodladığı söylenmiş ama Java için bu yanlış; C# ve JS için de aynı durum geçerli olabilir. Herhangi bir dilde string tipi yeterince opaksa, bellekteki gösterim biçimi bir implementasyon detayıdır. Java’da bu, 9. sürümden sonra daha da netleşti(ilgili JEP bağlantısı). FFI varsa implementasyon detayını değiştirmenin zor olmasının nedenlerinden biri de bu. Ayrıca JS sayıları için en büyük accurate integer’ın 2^53−1 olduğu söyleniyor ama aslında 2^100 gibi daha büyük tam sayılar da tam olarak ifade edilebilir. 2^53−1 denmesinin anlamı, n-1, n, n+1 değerlerinin üçünün de IEEE double içinde tam temsil edilmesidir. Dolayısıyla n == n-1, n == n+1 ikisi de false verir

    • C#’ta bellekteki gösterim oldukça sabittir; ReadOnlySpan<char> veya ham char* ile tamponlara doğrudan erişim sıkça kullanıldığı için char, UTF-16 kod noktası tipidir. JS belki bir şekilde bundan kaçabiliyor olabilir

    • max accurate integer yerine max safe integer demeyi tercih ederim

    • (base64 kodlamasıyla ilgili) Java, C#, JS’nin bellekteki string’lerinin UTF-16 benzeri olmaması teknik olarak doğru olabilir ama UTF-8 tabanlı bir dilde string’i base64 kodlayıp Java’da decode ettiğinizde Java’nın UTF-16 gösterimi yüzünden sorun yaşanan örnekler var

  • Kılavuz biçimindeki ipuçları veya bilgiler sanki sadece zaten bildiğiniz ya da neredeyse bildiğiniz şeyleri daha hızlı kavramanızı sağlıyor. Çoğu kılavuz, öğrenmenin kendisinden çok düzenleme ve tekrar için etkili; tamamen bilmeyen kişilere öğretmekte ise verimsiz

    • Kılavuzun özü, hafızaya bel bağlamadan kayıt bırakmak içindir. Unix kılavuzlarının çoğu da böyledir. Bir yazılımın ne yaptığını zaten bilirsiniz ama tam kullanım şeklini unutunca kılavuza bakarsınız. Öte yandan tamamen yeni başlayan birinin kavramları öğrenmesi için tutorial veya guide gerekir. Kılavuz, daha iyi soru sormaya hazırlanmak gibi bir iş görür
  • “Traceroute Isn’t Real” başlıklı yazıyı gerçekten çok ilginç buldum. Şimdiye kadar traceroute verisinin çok hatalı ya da anlamsız göründüğünü hissediyordum; nedenini anlamam açısından faydalı oldu(orijinal bağlantı). Daha güncel bilgi varsa paylaşılırsa iyi olur

  • Bu yazı gerçek tuzaklar veya trap’lerden çok, yazarın deneyimle öğrendiği küçük ipuçlarının toplandığı bir liste gibi. İçeriğin çoğu bazen yalnızca çok dar bir bağlamda geçerli oluyor ama bağlam açık değil; bazıları da yanlış bilgi gibi görünüyor. Bu yüzden yazının tamamını fazla harfi harfine almamak, daha çok bir düşünce akışı ya da notlar gibi görmek daha iyi olabilir

  • Python’da varsayılan argüman değerlerinin her çağrıda yeniden oluşturulan değerler değil, saklanan değerler olduğu konusu; datetime değişkeni kullanırken özellikle bilinmesi gereken bir nokta

    • Python’u sürekli kullanan bir geliştirici değildim ama bu hafta varsayılan argüman değerinin saklanıyor olması yüzünden epey zorlandım. Parametre verilmezse boş bir set atamak istemiştim ama set yeniden kullanıldığı için hata çıktı. Sebebini anlamam uzun sürdü
  • Sayfadaki ilk “trap”te min-width: auto değerinin minimum genişliği içeriğe göre belirlediği yazılmış ama flex/grid olmayan durumda bu doğru değil. MDN’ye göre block, inline, table vb. için auto değeri 0 olarak çözülür(resmî doküman bağlantısı)

    • Gerçek ilk trap şu: “Herhangi bir CSS özelliğini izole şekilde okuyamazsınız.” Özelliğin adındaki cascading mantığında olduğu gibi varsayılan değerler ve çeşitli kuralların sonuçları bir yerlerde birleşir; bu yüzden tüm belge bağlamı önemlidir

    • CSS metin özelliklerindeki cascade(miras alma) yine bir ölçüde anlaşılabiliyor. Ama CSS layout, sayfa tasarımcısı, implementasyoncu ya da kullanıcı açısından fark etmeksizin anlaması fazlasıyla zor. Bunun kimin için tasarlandığına empati kuramıyorum

  • Genel olarak fena olmayan bir liste yazısı; birkaç görüşüm var.

    • Unicode birleştirmesi konusunda, farklı dillerde aynı anlamdaki karakterlerin aynı kod noktasını kullanıp yazı tipine göre farklı görünmesi bir trap değil. Verilen örnekteki han karakterleri Çincede ve Japoncada neredeyse aynı şekilde kullanılıyor ve iki dilin kullanıcıları da diğer varyantları aynı kavramın karakteri olarak tanır. Yazar, sanki A harfinin İngilizce ve Fransızcada ayrı ayrı tanımlanması gerekiyormuş gibi yazıyor; gerçekte öyle değil. Han unification maddesine bakılabilir
    • -0.0 ve +0.0 (negatif sıfır, pozitif sıfır) floating point karşılaştırmalarında eşit kabul edilir ama ayırt etmenin yolları vardır; örneğin bit desenlerinden ya da 1.0/-0.0 = -sonsuz, 1.0/0.0 = +sonsuz sonucundan anlaşılabilir
    • Sunucu zaman dilimini UTC yapma tavsiyesine kesinlikle katılıyorum. Sunucular, loglar, fotoğraf depolama gibi kalıcı değeri olan ya da doğru zaman damgası gerektiren her yerde UTC kullanırım; local time’ı yalnızca sohbet için kullanırım
    • Tamsayılarda (low + high) / 2 taşma riski taşıdığı için low + (high - low) / 2 kullanın denmiş ama low veya high negatif olabiliyorsa bu yalnızca taşma aralığını başka yere taşımak olabilir. Bu, genel ikili arama için önemli bir mesele
    • C/C++’ta integer tipleri ve işlemlerini doğru kullanmak da büyük bir trap’tir, ilgili rehber bağlantısı
    • rebase’in history’yi değiştirebildiği söylenmiş ama rebase zaten doğası gereği history rewrite eden bir command’dır
    • İki dilin kullanıcıları kavramsal olarak aynı karakteri tanısa da bunu sadece “font varyasyonu” diye küçümsememek gerekir. Unicode kod noktası aynı diye karakterlerin güvenle birbirinin yerine geçeceği varsayılamaz. Japon kullanıcı açısından böyle bir değiştirme, ürünü kullanmayı reddetme nedeni bile olabilir

    • Aslında İngilizce A ile Fransızca A ayrılmaz ama görünüşü aynı olan А (Kiril) ile A (Latin) gibi gerçekte farklı kod noktaları da vardır. Han birleştirmesi de görünüşü oldukça farklı karakterleri tek bir grupta toplayabiliyor; bu yüzden Japonca ya da Çince öğrenenler gerçekten kafa karışıklığı yaşayabilir. Örneğin '喝' (drink) karakteri bağlantıdaki gibi gösterime göre oldukça farklı görünebilir. Kopyaladığınızda bile biçimin anında değişmesi, işleme mantığının ne kadar karmaşık olduğunu gösteriyor. Han unification pratikte oldukça can sıkıcı bir konu

  • numpy ile pytorch arasında ince farklar olduğu söylenmiş ama somut örnek verilmeden bu pek faydalı değil; bilgi de eksik kaldığı için gerçekçi bir trap gibi hissettirmiyor