Geliştiricilerin Dikkat Etmesi Gereken Tuzaklar
(qouteall.fun)- 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-widthvarsayılan olarakautomin-width: auto, içerik boyutuna göre belirlenir veflex-shrink,overflow: hidden,width: 0,max-width: 100%ayarlarına göre önceliklidir- Öneri:
min-width: 0açıkça belirtin
-
CSS'te yatay ve dikey farkı
width: autoüst öğenin alanını doldurmaya çalışır,height: autoise içeriğe uyum sağlar- inline, inline-block, float öğelerinde
width: autogenişlemez margin: 0 autoyatay ortalama sağlar,margin: auto 0ise dikey ortalama yapmaz (ancakflex-direction: columndurumunda dikey ortalama mümkündür)- Margin collapsing yalnızca dikey yönde olur
writing-mode: vertical-rlgibi yerleşim yönü değişirse davranış da tersine döner
-
Block Formatting Context (BFC)
display: flow-rootile BFC oluşturulur (overflow: hidden/auto/scroll,display: tablevb. 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
borderya dapaddingvarsa margin collapsing oluşmaz
-
Stacking Context
- Yeni bir stacking context oluşturan koşullar
transform,filter,perspective,mask,opacitygibi render özellikleriposition: fixedveyastickyz-indexbelirtilmiş olması +absolute/relativekonumlandırmaz-indexbelirtilmiş olması + flexbox/grid içindeki öğeisolation: isolate
- Özellikleri
z-indexyalnızca stacking context içinde geçerlidirposition: absolute/fixedkoordinatları en yakın positioned ata öğeye göre belirlenirsticky, stacking context'i aşarak çalışmazoverflow: visibleolsa bile stacking context nedeniyle kırpılabilirbackground-attachment: fixed, stacking context'e göre yerleştirilir
- Yeni bir stacking context oluşturan koşullar
-
Viewport birimleri
- Mobil tarayıcıda adres çubuğu/navigasyon çubuğu kaydırma sırasında ekrandan kaybolursa
100vhdeğeri değişir - Güncel çözüm:
100dvhkullanın
- Mobil tarayıcıda adres çubuğu/navigasyon çubuğu kaydırma sırasında ekrandan kaybolursa
-
Absolute Position referansı
position: absolute, ebeveyne değil, en yakınrelative/absoluteya da stacking context ata öğeye göre konumlanır
-
Blur davranışı
backdrop-filter: blur, çevredeki öğeleri dikkate almaz
-
Float'ın etkisiz kalması
- Üst öğe
flexveyagridise çocuk öğeninfloatözelliği etkisizdir
- Üst öğe
-
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-bottomdeğ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
<pre>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
<a>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%+paddingayarlandığında üst öğenin alanı aşılabilir- Çözüm:
box-sizing: border-box
- Varsayılan değer
-
Cumulative Layout Shift
<img>içinwidthveheightö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
<script>console.log('</script>')</script>gibi bir durumda ilk</script>kapanış etiketi olarak algılanır- Referans: Safe JSON in script tags
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::stringiç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
- Rust: Dahili string yapısı UTF-8 kullanır,
-
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\nkullanı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 == NaNher zaman false olur) NaN != NaNher zaman true olur- NaN içeren işlemlerin sonucu çoğunlukla NaN olarak yayılır
- NaN, kendisi dahil hiçbir değerle eşit değildir (
-
Ö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'inulla dönüştürür - Python
json.dumps(...), NaN ve Infinity'yi olduğu gibi yazar (standart ihlali)allow_nan=Falseseçeneğinde NaN/Inf varsaValueErroroluşur
- Golang
json.Marshal, NaN/Inf varsa hata döndürür
- JS
- JSON standardı NaN ve Inf'e izin vermez
-
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
BigIntkullanılması önerilir - JSON'da güvenli aralığı aşan tamsayılar varsa,
JSON.parsesonucu elde edilen değer hatalı olabilir - Milisaniye tabanlı zaman damgaları 287.396 yıla kadar güvenlidir, nanosaniye tabanlı olanlarda sorun çıkar
- Güvenli tamsayı aralığı
- Kayan noktalı sayıları doğrudan karşılaştırmak başarısız olabilir →
-
İş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.equalskullanmak gerekirequalsvehashcodeoverride 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<T>döndüren metotlar duruma göre mutableArrayListveya immutableCollections.emptyList()döndürebilir; ikincisini değiştirmeye çalışıncaUnsupportedOperationExceptionoluşurOptional<T>döndüren metotlarınnulldöndürdüğü durumlar vardır (önerilmez)finallybloğunda return yapılırsa,tryveyacatchiçinde oluşan exception yok sayılır vefinallydö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ülemezscheduleAtFixedRateiş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ıntoString()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 yazabilirdefer, blok scope'u bittiğinde değil, fonksiyon return ettiğinde çalışırdefer, mutable değişkenleri capture edernilile 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
nilile 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::stringgeç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::removegerçekte silme yapmaz, öğeleri yeniden düzenler; silmek içinerasegerekir- 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,memcpyile 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
memcpyveyastd::bit_castönerilir
- istisnalar: 1) kalıtım ilişkisine sahip türler 2)
- 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 nullkullanı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 distinctiçinde Null'un nasıl işlendiği veritabanına göre değişircount(x)vecount(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ı
utf8mb4değ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
strictdeğ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
mysqldumpiçinde--single-transactionseçeneği yoksa tüm tablo için read lock alınır- PostgreSQL'de
create unique indexveyaalter table ... add foreign key, tüm tablo için read lock oluşturur- kaçınma yöntemi:
create unique index concurrentlykullanın - foreign key için
... not validardındanvalidate constraintyöntemi kullanılır
- kaçınma yöntemi:
-
Range sorguları
- Çakışmayan aralıklar:
- basit koşul
p >= start and p <= endverimsizdir (bileşik indeks olsa bile) - verimli yöntem:
(yalnızca start sütunu indeksi gerekir)select * from (select ... from ranges where start <= p order by start desc limit 1) where end >= p
- basit koşul
- Çakışabilen aralıklar:
- normal B-tree indeksiyle verimsizdir
- MySQL için spatial index, PostgreSQL için GiST önerilir
- Çakışmayan aralıklar:
Concurrency and Parallelism
-
volatile
volatile, lock'un yerini tutamaz ve atomicity sağlamaz- lock ile korunan veride
volatilegerekmez (lock, memory order garantisi verir) - C/C++:
volatileyalnızca bazı optimizasyonları engeller, memory barrier eklemez - Java:
volatileerişimi sequentially-consistent ordering sağlar (gerekirse JVM memory barrier ekler) - C#:
volatileerişimi release-acquire ordering sağlar (gerekirse CLR memory barrier ekler) - bellek okuma/yazma yeniden sıralamasıyla ilgili hatalı optimizasyonları önleyebilir
-
TOCTOU (Time-of-check to time-of-use) problemi
-
SQL veritabanlarında uygulama katmanı kısıt işleme
- basit bir unique index ile ifade edilemeyen kısıtlar (ör. iki tablo arasında benzersizlik, koşullu benzersizlik, belirli bir süre içinde benzersizlik) uygulamada zorlanıyorsa:
- MySQL(InnoDB): repeatable read seviyesinde
select ... for updatesonrası insert ve unique sütunda indeks varsa gap lock sayesinde geçerlidir (ancak gap lock yüksek yük altında deadlock'a neden olabilir → deadlock detection ve retry gerekir) - PostgreSQL: repeatable read seviyesinde aynı mantık eşzamanlılık durumlarında yetersizdir (write skew problemi)
- çözüm yolları:
- serializable isolation level kullanın
- uygulama yerine veritabanı kısıtlarını kullanın
- koşullu benzersizlik → partial unique index
- iki tablo arasında benzersizlik → ayrı bir tabloya yinelenen veriyi ekleyip unique index kullanın
- zaman aralığı dışlayıcılığı → range type + exclude constraint
- çözüm yolları:
- MySQL(InnoDB): repeatable read seviyesinde
- basit bir unique index ile ifade edilemeyen kısıtlar (ör. iki tablo arasında benzersizlik, koşullu benzersizlik, belirli bir süre içinde benzersizlik) uygulamada zorlanıyorsa:
-
Atomic reference counting
Arc,shared_ptrgibi yapılarda çok sayıda thread aynı sayacı sık sık değiştirirse performans düşer
-
Read-write lock
- bazı uygulamalar read lock'tan write lock'a yükseltmeyi desteklemez
- read lock tutulurken write lock denenirse deadlock oluşabilir
Birçok dilde ortak
- Null/None/nil kontrolünün atlanması yaygın bir hata nedenidir
- Döngü sırasında konteyner değiştirilirse tek iş parçacıklı veri yarışı oluşabilir
- Değiştirilebilir veri paylaşımı hatası: Örn.) Python'da
[[0] * 10] * 10doğru bir 2D dizi oluşturmaz (low + high) / 2taşmaya neden olabilir → güvenli yöntemlow + (high - low) / 2- Kısa devre değerlendirmesi (short circuit):
a() || b()ifadesinde a true ise b çalışmaz,a() && b()ifadesinde a false ise b çalışmaz - Profiler varsayılan olarak yalnızca CPU time içerir → DB beklemesi gibi durumlar flamegraph'ta görünmez ve yanlış yorumlara yol açabilir
- Regular expression dialect dillere göre farklıdır → JS'de çalışan bir regex Java'da çalışmayabilir
Linux and bash
- Dizin değiştirildikten sonra
pwdözgün yolu gösterir, gerçek yol içinpwd -Pkullanılır cmd > 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 (
getcapile kontrol edilebilir) - Unset değişken riski:
DIRunset iserm -rf $DIR/→rm -rf /çalıştırma riski doğurur →set -uile önlenebilir - Ortamı uygulama: Bir script'i mevcut shell'e uygulamak için
source script.shkullanılır → kalıcı uygulamak için~/.bashrciçine ekleyin - Bash'te komut önbellekleme vardır:
$PATHiçindeki dosya taşınırsaENOENToluşabilir →hash -rile ö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
useEffectdependency array'inde gerekli değerleri eksik bırakmakuseEffectiçinde clean up kodunu atlamak- Closure trap: Eski state'in yakalanması nedeniyle bug oluşması
- Veriyi yanlış yerde değiştirmek → impure component
useCallbackkullanmamak → 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
--rebasekullanılmalı --force-with-leasebazı 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_StoremacOS tarafından otomatik oluşturulur →.gitignoreiçine**/.DS_Storeeklenmesi ö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ı
traceroutesonuçları çok güvenilir değildir → bazı durumlardatcptraceroutedaha kullanışlı olabilir- TCP slow start gecikme artışının nedeni olabilir →
tcp_slow_start_after_idledevre dışı bırakılarak çözülebilir - TCP sticky packet sorunu: Nagle algoritması paket gönderimini geciktirir →
TCP_NODELAYetkinleş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
Hostheader'ı 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-Originheader'ı 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ır →
key:valuehatalıdır,key: valuedoğrudur NOülke kodu tırnaksız yazılırsafalseolarak yorumlanabilir- Git commit hash'i tırnaksız yazılırsa sayıya dönüştürülebilir
- YAML boşluğa duyarlıdır →
-
Excel CSV sorunu
- Excel CSV açarken otomatik dönüştürme uygular
- Tarih dönüşümü:
1/2,1-2→2-Jan - Büyük sayıların hatalı dönüşümü:
12345678901234567890→12345678901234500000
- Tarih dönüşümü:
- 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
- Excel CSV açarken otomatik dönüştürme uygular
Henüz yorum yok.