डेवलपर्स को किन जालों से सावधान रहना चाहिए
(qouteall.fun)- डेवलपर्स के लिए आम लेकिन सहज रूप से स्पष्ट न होने वाले जालों को संकलित किया गया है, और ऐसे बग्स के कारण बताए गए हैं जो आसानी से पैदा हो सकते हैं
- HTML, CSS, Unicode/टेक्स्ट एन्कोडिंग, floating-point, समय आदि विभिन्न तकनीकों में अक्सर आने वाली समस्याओं को शामिल किया गया है
- यह ज़ोर दिया गया है कि अलग-अलग भाषाओं और frameworks में syntax और behavior के सूक्ष्म अंतर गलतफहमी या त्रुटियाँ पैदा कर सकते हैं
- concurrency, networking, database जैसे backend के मुख्य क्षेत्रों में, वास्तविक production environment में आने वाले जालों को उदाहरणों के साथ समझाया गया है
- विभिन्न उदाहरणों और संदर्भ लिंक के ज़रिए समस्या की स्थिति, समाधान, और अप्रत्याशित behavior को बेहतर करने के तरीकों का मार्गदर्शन दिया गया है
HTML और CSS
-
Flexbox/Grid में
min-widthका डिफ़ॉल्ट मानmin-widthका डिफ़ॉल्ट मानautoहोता हैmin-width: autoकंटेंट के आकार से तय होता है, औरflex-shrink,overflow: hidden,width: 0,max-width: 100%से पहले लागू होता है- सिफारिश:
min-width: 0को स्पष्ट रूप से सेट करें
-
CSS में क्षैतिज और ऊर्ध्वाधर का अंतर
width: autoparent की जगह भरने की कोशिश करता है, जबकिheight: autoकंटेंट के अनुसार तय होता है- inline, inline-block, float elements में
width: autoफैलता नहीं है margin: 0 autoक्षैतिज center alignment देता है,margin: auto 0ऊर्ध्वाधर center alignment नहीं देता (हालाँकिflex-direction: columnमें ऊर्ध्वाधर center संभव है)- margin collapsing केवल ऊर्ध्वाधर दिशा में होता है
writing-mode: vertical-rlजैसी layout direction बदलने पर behavior भी उलट सकता है
-
Block Formatting Context (BFC)
display: flow-rootसे BFC बनाया जा सकता है (overflow: hidden/auto/scroll,display: tableआदि से भी संभव है, लेकिन side effects हो सकते हैं)- ऊर्ध्वाधर रूप से लगे sibling margins का आपस में मिलना, या child margin का parent के बाहर निकल जाना, BFC से रोका जा सकता है
- अगर parent में केवल float children हों तो उसकी height 0 तक गिर सकती है → BFC से ठीक किया जा सकता है
borderयाpaddingहोने पर margin collapsing नहीं होता
-
Stacking Context
- नया stacking context बनने की शर्तें
transform,filter,perspective,mask,opacityजैसी rendering propertiesposition: fixedयाstickyz-indexसेट किया गया हो +absolute/relativepositioningz-indexसेट किया गया हो + flexbox/grid के भीतर का elementisolation: isolate
- विशेषताएँ
z-indexकेवल stacking context के अंदर ही लागू होता हैposition: absolute/fixedके coordinates सबसे नज़दीकी positioned ancestor के आधार पर तय होते हैंstickystacking context को पार करके काम नहीं करताoverflow: visibleभी stacking context के कारण कट सकता हैbackground-attachment: fixedstacking context के आधार पर रखा जाता है
- नया stacking context बनने की शर्तें
-
Viewport units
- mobile browser में address bar/navigation bar स्क्रोल पर स्क्रीन से गायब होने पर
100vhका मान बदल सकता है - नया समाधान:
100dvhका उपयोग
- mobile browser में address bar/navigation bar स्क्रोल पर स्क्रीन से गायब होने पर
-
Absolute Position का आधार
position: absoluteparent नहीं, बल्कि सबसे नज़दीकीrelative/absoluteया stacking context ancestor को आधार मानता है
-
Blur behavior
backdrop-filter: blurआसपास के elements को ध्यान में नहीं रखता
-
Float का निष्क्रिय होना
- अगर parent
flexयाgridहै, तो child काfloatप्रभावी नहीं होता
- अगर parent
-
प्रतिशत आधारित
width/height- अगर parent का आकार पहले से तय नहीं है, तो यह काम नहीं करता (circular reference से बचने के लिए)
-
Inline element की विशेषताएँ
display: inlineमेंwidth,height,margin-top,margin-bottomअनदेखा किए जाते हैं
-
Whitespace handling
- डिफ़ॉल्ट रूप से HTML में line breaks को whitespace माना जाता है, और लगातार आने वाले spaces एक space में समेट दिए जाते हैं
<pre>space collapsing को रोकता है, लेकिन शुरुआत/अंत में इसका behavior अलग हो सकता है- अधिकतर कंटेंट के शुरुआत/अंत के spaces अनदेखे किए जाते हैं, लेकिन
<a>एक अपवाद है inline-blockके बीच के spaces/line breaks वास्तविक gap के रूप में दिखते हैं (flex/grid में ऐसा नहीं होता)
-
text-align- यह text और inline elements के alignment पर लागू होता है, लेकिन block elements के alignment पर नहीं
-
box-sizing- डिफ़ॉल्ट मान
content-boxहै → इसमें padding/border शामिल नहीं होते width: 100%+paddingसेट करने पर parent area से बाहर निकलने की संभावना होती है- समाधान:
box-sizing: border-box
- डिफ़ॉल्ट मान
-
Cumulative Layout Shift
<img>मेंwidthऔरheightattributes न देने पर image loading delay के कारण layout हिल सकता है- सिफारिश: CLS रोकने के लिए attributes सेट करें
-
Chrome में file download network requests
- DevTools के network panel में नहीं दिखतीं (उन्हें दूसरे tab में संभाला जाता है)
- विश्लेषण की ज़रूरत हो तो
chrome://net-export/का उपयोग करें
-
HTML में JavaScript parsing समस्या
<script>console.log('</script>')</script>जैसे मामले में पहला</script>closing tag माना जाता है- संदर्भ: Safe JSON in script tags
Unicode और टेक्स्ट एन्कोडिंग
-
Code point और grapheme cluster
- grapheme cluster GUI में दिखाई देने वाली "character unit" है
- दिखने वाला ASCII character आमतौर पर 1 code point = 1 grapheme cluster होता है
- emoji कई code points से मिलकर बना एक grapheme cluster हो सकता है
- UTF-8 में code point 1~4 bytes का होता है, और bytes की संख्या code points की संख्या के बराबर नहीं होती
- UTF-16 में code point 2 bytes या 4 bytes (surrogate pair) का हो सकता है
- standard cluster के भीतर code points की संख्या पर सीमा नहीं लगाता, लेकिन implementations performance कारणों से सीमाएँ रख सकती हैं
-
भाषा के अनुसार string behavior का अंतर
- Rust: internal string UTF-8 का उपयोग करती है,
len()bytes की संख्या देता है, direct indexing संभव नहीं,chars().count()code points की संख्या देता है, UTF-8 validity की सख्ती से जाँच होती है - Golang: string व्यवहारतः byte array है, length और indexing byte units पर आधारित हैं, सामान्यतः UTF-8 उपयोग होता है
- Java, C#, JS: UTF-16 आधारित, length 2-byte units में मापी जाती है, indexing भी 2-byte units पर होती है, surrogate pairs मौजूद होते हैं
- Python:
len()code points की संख्या लौटाता है, indexing एक code point वाला string लौटाती है - C++:
std::stringपर encoding की कोई बाध्यता नहीं, यह byte vector की तरह व्यवहार करता है, length/indexing byte units पर आधारित हैं - बताए गए भाषाओं में से कोई भी भाषा grapheme cluster unit पर length/indexing नहीं करती
- Rust: internal string UTF-8 का उपयोग करती है,
-
BOM (Byte Order Mark)
- कुछ text files में BOM होता है, उदाहरण: EF BB BF → UTF-8 encoding का संकेत
- इसका उपयोग मुख्य रूप से Windows में होता है, और non-Windows software BOM को सही से संभाल नहीं सकता
-
अन्य सावधानियां
- binary data को string में बदलते समय, गलत हिस्सों को � (U+FFFD) से बदल दिया जाता है
- Confusable characters मौजूद होते हैं (ऐसे अक्षर जो एक-दूसरे जैसे दिखते हैं)
- Normalization: उदाहरण: é को U+00E9 (एक single code point) या U+0065+U+0301 (दो code points) के रूप में दर्शाया जा सकता है
- Zero-width characters और Invisible characters मौजूद होते हैं
- लाइन ब्रेक का अंतर: Windows में CRLF
\r\n, Linux/MacOS में LF\n - Han unification: अलग-अलग भाषाओं में आकार में थोड़ा अलग दिखने वाले अक्षर एक ही code point का उपयोग करते हैं
- फ़ॉन्ट भाषा-विशिष्ट variants शामिल करके सही render करते हैं
- internationalization के समय सही font variant चुनना ज़रूरी है
Floating point
-
NaN की विशेषताएं
- NaN, खुद अपने सहित, किसी भी value के बराबर नहीं होता (
NaN == NaNहमेशा false है) NaN != NaNहमेशा true है- NaN शामिल होने पर अधिकांश operations का result NaN के रूप में propagate होता है
- NaN, खुद अपने सहित, किसी भी value के बराबर नहीं होता (
-
विशेष values
- +Inf और -Inf मौजूद हैं, और ये NaN से अलग हैं
- -0.0 एक ऐसी value है जो +0.0 से अलग मानी जाती है
- comparison operations में दोनों समान हैं, लेकिन कुछ calculations में अलग तरह से behave करती है
- उदाहरण:
1.0 / +0.0 == +Inf,1.0 / -0.0 == -Inf
-
JSON के साथ compatibility
- JSON standard NaN और Inf की अनुमति नहीं देता
- JS
JSON.stringify, NaN और Inf कोnullमें बदल देता है - Python
json.dumps(...), NaN और Infinity को वैसे ही output करता है (standard violation)allow_nan=Falseoption देने पर NaN/Inf होने परValueErrorआता है
- Golang
json.Marshal, NaN/Inf मौजूद होने पर error return करता है
- JS
- JSON standard NaN और Inf की अनुमति नहीं देता
-
precision की समस्या
- floating point की direct comparison fail हो सकती है →
abs(a - b) < εवाला रूप recommended है - JS सभी numbers को floating point के रूप में handle करता है
- safe integer range
-(2^53 - 1)~2^53 - 1है - इस range से बाहर integer representation सटीक नहीं रहती
- बड़े integers के लिए
BigIntका उपयोग recommended है - अगर JSON में safe range से बड़े integers हों, तो
JSON.parseका result inaccurate हो सकता है - millisecond-स्तर के timestamps 287,396 वर्षों तक safe हैं, nanosecond-स्तर पर समस्या आती है
- safe integer range
- floating point की direct comparison fail हो सकती है →
-
गणितीय नियम लागू न होना
- operation order के अनुसार precision loss होने से associativity और distributivity सख्ती से लागू नहीं होते
- parallel operations (matrix multiplication, sum आदि) nondeterministic results दे सकते हैं
-
performance
- division, multiplication की तुलना में काफी धीमा है
- एक ही संख्या से कई बार divide करना हो तो पहले उसका reciprocal निकालकर multiply करना optimization हो सकता है
-
hardware के अनुसार अंतर
- FMA(Fused Multiply-Add) support: कुछ hardware intermediate calculation को ज्यादा precision से करते हैं
- Subnormal range handling: modern hardware इसे support करता है, लेकिन कुछ पुराने systems इसे 0 की तरह treat करते हैं
- rounding mode में अंतर
- RNTE (निकटतम even की ओर round), RTZ (0 की ओर truncate) आदि मौजूद हैं
- x86/ARM में इन्हें thread-local mutable state के रूप में set किया जा सकता है
- GPU में rounding mode instruction स्तर पर अलग हो सकता है
- trigonometric functions, log आदि mathematical functions के behavior में अंतर
- x86 में legacy 80-bit FPU और per-core rounding mode होता है → इसका उपयोग recommended नहीं है
- इनके अलावा भी कई कारणों से hardware के अनुसार floating point results अलग हो सकते हैं
-
precision बढ़ाने के तरीके
- calculation graph को shallow रखें (लगातार multiplication वाली structure कम करें)
- ऐसे cases से बचें जहाँ intermediate values बहुत बड़ी या बहुत छोटी हों
- FMA जैसे hardware operations का उपयोग करें
समय (Time)
-
leap second
- Unix timestamp leap second को ignore करता है
- leap second होने पर आसपास के interval में समय बढ़ाया या घटाया जाता है (Leap smear)
-
time zone
- UTC और Unix timestamp पूरी दुनिया में समान होते हैं
- मनुष्यों के पढ़ने योग्य समय क्षेत्रीय time zone पर निर्भर करता है
- DB में timestamp store करके UI में convert करने का तरीका recommended है
-
daylight saving time (DST)
- कुछ क्षेत्रों में गर्मियों के दौरान घड़ी को 1 घंटा आगे-पीछे किया जाता है
-
NTP synchronization
- synchronization के दौरान समय के "पीछे जाने" जैसी स्थिति हो सकती है
-
server time zone setting
- server को UTC पर set करना recommended है
- distributed systems में अलग-अलग nodes के time zone अलग हों तो समस्या हो सकती है
- system time zone बदलने के बाद DB को फिर से configure या restart करना पड़ सकता है
-
hardware clock vs system clock
- hardware clock में time zone की अवधारणा नहीं होती
- Linux: hardware clock को UTC के रूप में treat करता है
- Windows: hardware clock को local time के रूप में treat करता है
Java
==object reference की तुलना करता है, object content की तुलना के लिए.equalsका उपयोग करना चाहिए- अगर
equalsऔरhashcodeको override नहीं किया गया, तो map/set में object identity को reference के आधार पर माना जाता है - अगर map की key object या set के element object की content बदल दी जाए, तो container का behavior टूट सकता है
List<T>return करने वाले methods, स्थिति के अनुसार mutableArrayListया immutableCollections.emptyList()return कर सकते हैं; दूसरे वाले को modify करने परUnsupportedOperationExceptionहोता हैOptional<T>return करने वाला method कभी-कभीnullreturn कर सकता है (यह recommended नहीं है)finallyblock में return करने पर,tryयाcatchमें हुई exception ignore हो जाती है औरfinallyकी return value लागू होती है- कुछ libraries interrupt को ignore करती हैं, और IO सहित class initialization process interrupt से टूट सकती है
- thread pool में
.submit()से दिए गए task की exception default रूप से log में नहीं छपती और सिर्फ future के जरिए देखी जा सकती है; future को ignore करने पर exception पता नहीं चलतीscheduleAtFixedRatejobs exception आने पर चुपचाप बंद हो जाती हैं
- अगर numeric literal 0 से शुरू हो, तो उसे octal माना जाता है (
0123→ 83) - debugger local variables की
.toString()को call करता है; कुछ classes मेंtoString()के side effects होते हैं, इसलिए debugging के दौरान code का behavior बदल सकता है (इसे IDE में disable किया जा सकता है)
Golang
append()में capacity बची हो तो memory reuse होती है; subslice पर append करने से parent memory भी overwrite हो सकती हैdeferfunction return होने पर चलता है, block scope खत्म होने पर नहींdefermutable variables को capture करता हैnilसे संबंधित- nil slice और empty slice अलग होते हैं
- string nil नहीं हो सकती, केवल empty string होती है
- nil map में read किया जा सकता है, लेकिन write नहीं
- interface nil का विशेष behavior: अगर data pointer null हो लेकिन type info null न हो, तो वह
nilके बराबर नहीं होता
- Dead wait: Go में वास्तविक concurrency bug के मामले मौजूद हैं
- Timeout के कई प्रकार हैं, net/http में इन्हें विस्तार से लिया गया है
C/C++
std::vectorके elements के pointer को store करने के बाद अगर vector grow होता है, तो reallocation होती है और pointer invalid हो जाता है- string literal से बना
std::stringएक temporary object हो सकता है, इसलिएc_str()कॉल करना जोखिमभरा हो सकता है - iteration के दौरान container को modify करने पर iterator invalidation होता है
std::removeवास्तव में delete नहीं करता, बल्कि elements को rearrange करता है; delete के लिएeraseचाहिए- अगर numeric literal
0से शुरू हो, तो उसे octal माना जाता है (0123→ 83) - Undefined behavior (UB): optimization के दौरान UB को compiler मनचाहे तरीके से बदल सकता है, इसलिए इस पर निर्भर रहना खतरनाक है
- uninitialized memory access UB है
char*को struct pointer में बदलने पर object lifetime शुरू होने से पहले access करना UB है; initialization के लिएmemcpyrecommended है- invalid memory access (जैसे null pointer) UB है
- integer overflow/underflow UB है (unsigned में 0 से नीचे underflow हो सकता है)
- Aliasing: अलग-अलग type के pointers अगर एक ही memory को reference करें, तो strict aliasing rule के कारण UB हो सकता है
- exceptions: 1) inheritance relation वाले types 2)
char*,unsigned char*,std::byte*में conversion (reverse conversion पर यह लागू नहीं होता) - forceful conversion के लिए
memcpyयाstd::bit_castrecommended है
- exceptions: 1) inheritance relation वाले types 2)
- unaligned memory access UB है
- Memory Alignment
- 64-bit integer का address 8 से divisible होना चाहिए
- ARM पर unaligned access crash करा सकता है
- byte buffer को सीधे struct की तरह interpret करने पर alignment problem हो सकती है
- alignment की वजह से struct padding बन सकती है, जिससे memory waste होती है
- कुछ SIMD instructions (जैसे AVX) सिर्फ aligned data पर काम कर पाती हैं; आम तौर पर 32-byte alignment चाहिए
Python
- function के default arguments हर call पर नए नहीं बनते, बल्कि शुरुआती value ही stored रहती है
SQL Databases
-
Null handling
x = nullकाम नहीं करता;x is nullइस्तेमाल करना चाहिए- Null अपने आप के बराबर भी नहीं होता (NaN जैसा)
- Unique index Null के duplicate values को allow करता है (लेकिन Microsoft SQL Server इसमें exception है)
select distinctमें Null handling का तरीका DB के हिसाब से अलग हो सकता हैcount(x)औरcount(distinct x)Null value वाली rows को ignore करते हैं
-
General behavior
- date का implicit conversion timezone-dependent हो सकता है
- complex join + distinct, nested query से धीमा हो सकता है
- MySQL(InnoDB) में अगर string field
utf8mb4नहीं है, तो 4-byte UTF-8 character insert करने पर error आ सकता है - MySQL(InnoDB) by default case-sensitive नहीं होता
- MySQL(InnoDB) implicit conversion allow करता है:
select '123abc' + 1;→ 124 - MySQL(InnoDB) gap lock deadlock करा सकता है
- MySQL(InnoDB) में group by और select columns match न करें, तो non-deterministic result मिल सकता है
- SQLite में
strictन हो, तो field type का बहुत मतलब नहीं होता - Foreign key implicit lock पैदा कर सकती है, जिससे deadlock हो सकता है
- Locking, DB के हिसाब से repeatable read isolation को तोड़ सकती है
- distributed SQL DBs locking support न करें या उनका behavior अलग हो सकता है (DB पर निर्भर)
-
Performance/Operations
- N+1 query problem slow query log में नहीं दिखती, क्योंकि हर query अपने-आप में तेज होती है
- long-running transactions lock जैसी problems पैदा कर सकती हैं → transaction को जल्दी खत्म करना recommended है
- full table lock के cases
- MySQL 8.0+ में unique index/foreign key add करते समय ज्यादातर concurrent processing संभव है
- पुराने MySQL versions में full table lock हो सकता है
mysqldumpमें--single-transactionoption न हो, तो full table read lock लगता है- PostgreSQL में
create unique indexयाalter table ... add foreign keyfull table read lock करा सकता है- बचाव:
create unique index concurrentlyइस्तेमाल करें - foreign key के लिए
... not validके बादvalidate constraintवाला तरीका इस्तेमाल करें
- बचाव:
-
Range queries
- non-overlapping ranges:
- simple condition
p >= start and p <= endinefficient है (composite index होने पर भी) - efficient तरीका:
(सिर्फ start column index चाहिए)select * from (select ... from ranges where start <= p order by start desc limit 1) where end >= p
- simple condition
- overlapping ranges:
- सामान्य B-tree index से यह inefficient है
- MySQL में spatial index, PostgreSQL में GiST recommended है
- non-overlapping ranges:
Concurrency and Parallelism
-
volatile
volatile, lock का replacement नहीं है और atomicity नहीं देता- lock से protected data के लिए
volatileकी जरूरत नहीं होती (lock memory order guarantee करता है) - C/C++:
volatileसिर्फ कुछ optimizations को रोकता है, memory barrier add नहीं करता - Java:
volatileaccess sequentially-consistent ordering देता है (जरूरत पड़ने पर JVM memory barrier insert करता है) - C#:
volatileaccess release-acquire ordering देता है (जरूरत पड़ने पर CLR memory barrier insert करता है) - memory read/write reordering से जुड़ी गलत optimizations को रोकने में मदद मिल सकती है
-
TOCTOU (Time-of-check to time-of-use) problem
-
SQL DB में application layer constraints handle करना
- ऐसे constraints जिन्हें simple unique index से express नहीं किया जा सकता (जैसे दो tables के बीच unique, conditional unique, किसी समयावधि के भीतर unique), अगर application enforce करे:
- MySQL(InnoDB): repeatable read level पर
select ... for updateके बाद insert करें, और अगर unique column पर index है तो gap lock की वजह से यह valid है (लेकिन gap lock high load पर deadlock करा सकता है → deadlock detection और retry चाहिए) - PostgreSQL: repeatable read level पर यही logic concurrency में पर्याप्त नहीं है (write skew problem)
- समाधान:
- serializable isolation level इस्तेमाल करें
- application की बजाय DB constraints इस्तेमाल करें
- conditional unique → partial unique index
- दो tables के बीच unique → duplicate data को अलग table में insert करके unique index लगाएँ
- अवधि-आधारित exclusivity → range type + exclude constraint
- समाधान:
- MySQL(InnoDB): repeatable read level पर
- ऐसे constraints जिन्हें simple unique index से express नहीं किया जा सकता (जैसे दो tables के बीच unique, conditional unique, किसी समयावधि के भीतर unique), अगर application enforce करे:
-
Atomic reference counting
Arc,shared_ptrकी तरह अगर कई threads एक ही counter को बार-बार बदलें, तो performance गिरती है
-
Read-write lock
- कुछ implementations read lock से write lock में upgrade support नहीं करतीं
- read lock hold करते हुए write lock लेने की कोशिश करने पर deadlock हो सकता है
Common in many languages
- Null/None/nil चेक छूट जाना त्रुटियों का एक आम कारण है
- लूप के दौरान container को modify करने पर single-thread data race हो सकता है
- mutable data share करने में गलती: उदाहरण) Python में
[[0] * 10] * 10सही 2D array नहीं बनाता (low + high) / 2में overflow हो सकता है → सुरक्षित तरीका हैlow + (high - low) / 2- short circuit evaluation:
a() || b()में अगर a true है तो b execute नहीं होगा,a() && b()में अगर a false है तो b execute नहीं होगा - profiler का default अक्सर सिर्फ CPU time शामिल करता है → DB wait जैसी चीज़ें flamegraph में नहीं दिखतीं, जिससे गलतफहमी हो सकती है
- regular expression dialect हर भाषा में अलग होता है → जो regex JS में चलता है, वह Java में ज़रूरी नहीं कि चले
Linux and bash
- directory बदलने के बाद
pwdoriginal path दिखा सकता है, actual path के लिएpwd -P cmd > file 2>&1→ stdout+stderr दोनों file में,cmd 2>&1 > file→ सिर्फ stdout file में, stderr वैसा ही रहता है- file name case-sensitive होते हैं (Windows से अलग)
- executable files के लिए capability system होता है (
getcapसे जांचें) - unset variable का खतरा: अगर
DIRunset है, तोrm -rf $DIR/→rm -rf /चलने का जोखिम →set -uसे बचाव संभव - environment apply करना: script को current shell में लागू करने के लिए
source script.shइस्तेमाल करें → permanent apply के लिए~/.bashrcमें जोड़ें - Bash में command caching होती है:
$PATHके अंदर file move होने परENOENTआ सकता है →hash -rसे cache refresh करें - variable को बिना quote के इस्तेमाल करने पर newline को space की तरह treat किया जाता है
set -e: script error पर तुरंत exit करता है, लेकिन conditional blocks (||,&&,if) के अंदर काम नहीं करता- K8s livenessProbe और debugger conflict: breakpoint debugger पूरे app को रोक देता है, जिससे health check fail हो सकता है → Pod terminate हो सकता है
React
- rendering code में state को सीधे modify करना
- Hook को if/loop के अंदर इस्तेमाल करना → rule violation
useEffectdependency array में ज़रूरी values छोड़ देनाuseEffectमें clean up code छोड़ देना- Closure trap: पुराने state capture होने से bug पैदा होता है
- गलत जगह data बदलना → impure component
useCallbackका उपयोग न करना → अनावश्यक re-rendering- memoized component को non-memoized value pass करना → memo optimization बेअसर हो जाती है
Git
-
Rebase history को rewrite करता है
- rebase के बाद सामान्य push में conflict होगा → force push ज़रूरी है
- remote branch history बदलने पर pull भी
--rebaseके साथ करें --force-with-leaseकुछ मामलों में दूसरे developers के commits overwrite होने से बचा सकता है, लेकिन सिर्फ fetch करके pull न करने पर यह सुरक्षा नहीं देता
-
Merge revert समस्या
- merge revert का असर अधूरा होता है → उसी branch को दोबारा merge करने पर कोई बदलाव नहीं दिखता
- समाधान: revert का revert करें या साफ तरीका अपनाएँ (backup → reset → cherry-pick → force push)
-
GitHub से जुड़ी सावधानियाँ
- API key जैसे secret को commit करने के बाद force push से overwrite कर दें, तब भी GitHub पर उसका रिकॉर्ड रह जाता है
- private repo A को fork करके बना B private हो, तब भी अगर A public हो जाए तो B की सामग्री भी public हो जाती है (delete के बाद भी access संभव)
-
git stash pop: conflict होने पर stash drop नहीं होता -
.DS_StoremacOS अपने-आप बनाता है →.gitignoreमें**/.DS_Storeजोड़ना बेहतर है
Networking
- कुछ routers और firewalls idle TCP connections को चुपचाप काट देते हैं → HTTP client और DB client के connection pool invalidate हो सकते हैं → समाधान: TCP keepalive configure करें
tracerouteका result पूरी तरह भरोसेमंद नहीं होता → कुछ मामलों मेंtcptracerouteज़्यादा उपयोगी होता है- TCP slow start latency बढ़ा सकता है →
tcp_slow_start_after_idledisable करके हल संभव - TCP sticky packet समस्या: Nagle algorithm packet transmission delay करता है →
TCP_NODELAYenable करके हल संभव - Nginx के पीछे backend रखने पर connection reuse setting ज़रूरी है → इसे न करने पर high-load environment में internal port exhaustion से connection fail हो सकते हैं
- Nginx default रूप से packet buffering करता है → SSE(EventSource) में delay हो सकता है
- HTTP standard GET और DELETE request body को मना नहीं करता → कुछ लोग body इस्तेमाल करते हैं, लेकिन कई libraries और servers इसे support नहीं करते
- एक ही IP पर कई websites host की जा सकती हैं → फर्क HTTP
Hostheader और TLS के SNI से किया जाता है → कुछ sites सिर्फ IP से direct access पर नहीं खुलतीं - CORS: दूसरे origin से request पर browser response access को block कर देता है → server पर
Access-Control-Allow-Originheader set करना ज़रूरी है- cookie भेजनी हो तो अतिरिक्त configuration चाहिए
- अगर frontend और backend same domain और port पर हों, तो CORS समस्या नहीं होती
Other
-
YAML सावधानियाँ
- YAML whitespace-sensitive है →
key:valueगलत है,key: valueसही है - country code
NOको बिना quotes लिखने पर वहfalseके रूप में parse हो सकता है - Git commit hash को बिना quotes लिखने पर वह number में convert हो सकता है
- YAML whitespace-sensitive है →
-
Excel CSV समस्याएँ
- Excel CSV खोलते समय automatic conversion करता है
- date conversion:
1/2,1-2→2-Jan - बड़े numbers का गलत conversion:
12345678901234567890→12345678901234500000
- date conversion:
- वजह यह है कि Excel internally numbers को floating point के रूप में handle करता है
- इसी समस्या के कारण gene name SEPT1 के गलत बदल जाने का मामला भी सामने आ चुका है
- Excel CSV खोलते समय automatic conversion करता है
अभी कोई टिप्पणी नहीं है.