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
- `` 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%+paddingayarlandığında üst öğenin alanı aşılabilir- Çözüm:
box-sizing: border-box
- Varsayılan değer
-
Cumulative Layout Shift
- `` için
widthveheightöznitelikleri belirtilmezse, görsel yüklemesi geciktiğinde yerleşim kayması oluşur - Öneri: CLS'yi önlemek için bu öznitelikleri belirtin
- `` için
-
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
console.log('')gibi bir durumda ilk `` 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
Listdöndüren metotlar duruma göre mutableArrayListveya immutableCollections.emptyList()döndürebilir; ikincisini değiştirmeye çalışıncaUnsupportedOperationExceptionoluşurOptionaldö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 file 2>&1→ stdout+stderr birlikte dosyaya,cmd 2>&1 > file→ yalnızca stdout dosyaya, stderr olduğu gibi kalır
- basit koşul
- Çakışmayan aralıklar:
-
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
1 yorum
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=1000baş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ındaconntrackmodü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ırlarOptional<T>döndüren bir metotnulldöndürebilir; bu pratik aşırı derecede kafa karıştırıcı. Duygusal olarak biraz boşluğum olsaydı@java.lang.NonNullReferencegibi bir anotasyon getiren bir JEP yazardım. Bu anotasyonla bir tipi tanımladığınızda derleyicininnullatamasını hata saymasını isterdim; örneğin Alphanullatamasına izin verirken Beta hata vermeli.javactarafında dead code elimination’ın gerçekte nasıl işlediğini görmek için spesifikasyona da bakmak gerekiyor gibi. Örneğinif (true)içindeb = nullyapılan kısım pratikte elided ediliyorsa, hukuken izin verilen bir kod olabilirKotlin’de bu durum zaten derleme hatası oluyor; ayrıca anotasyona gerek yok
nullolan bir dildeOptional<T>kullanmaya gerçekten gerek var mı emin değilim. Python’da bir fonksiyonun dönüş değeriOptionalnesnesi yerine doğrudanT | Noneolarak 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−1olduğu söyleniyor ama aslında2^100gibi daha büyük tam sayılar da tam olarak ifade edilebilir.2^53−1denmesinin anlamı,n-1,n,n+1değerlerinin üçünün de IEEE double içinde tam temsil edilmesidir. Dolayısıylan == n-1,n == n+1ikisi defalseverirC#’ta bellekteki gösterim oldukça sabittir;
ReadOnlySpan<char>veya hamchar*ile tamponlara doğrudan erişim sıkça kullanıldığı içinchar, UTF-16 kod noktası tipidir. JS belki bir şekilde bundan kaçabiliyor olabilirmax 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
“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;
datetimedeğişkeni kullanırken özellikle bilinmesi gereken bir noktasetatamak istemiştim amasetyeniden kullanıldığı için hata çıktı. Sebebini anlamam uzun sürdüSayfadaki ilk “trap”te
min-width: autodeğ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öreblock,inline,tablevb. içinautodeğeri0olarak çö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.
Aharfinin İngilizce ve Fransızcada ayrı ayrı tanımlanması gerekiyormuş gibi yazıyor; gerçekte öyle değil. Han unification maddesine bakılabilir-0.0ve+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 da1.0/-0.0 = -sonsuz,1.0/0.0 = +sonsuzsonucundan anlaşılabilir(low + high) / 2taşma riski taşıdığı içinlow + (high - low) / 2kullanın denmiş amalowveyahighnegatif olabiliyorsa bu yalnızca taşma aralığını başka yere taşımak olabilir. Bu, genel ikili arama için önemli bir meselerebase’in history’yi değiştirebildiği söylenmiş amarebasezaten 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
Aile FransızcaAayrılmaz ama görünüşü aynı olanА(Kiril) ileA(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 konunumpyilepytorcharası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