Jebakan yang Perlu Diwaspadai Para Developer
(qouteall.fun)- Merangkum jebakan yang tidak intuitif dan sering dialami developer, serta memperkenalkan penyebab bug yang mudah terjadi
- Membahas masalah yang sering muncul di berbagai teknologi seperti HTML, CSS, Unicode/encoding teks, floating-point, waktu, dan lainnya
- Menekankan bahwa perbedaan halus dalam sintaks dan perilaku di setiap bahasa dan framework dapat menimbulkan salah paham atau error
- Menjelaskan dengan contoh jebakan di area inti backend seperti concurrency, networking, database yang dapat terjadi di lingkungan produksi nyata
- Melalui beragam contoh dan tautan referensi, memandu situasi masalah, solusi, serta perbaikan terhadap perilaku tak terduga
HTML dan CSS
-
Nilai default
min-widthdi Flexbox/Gridmin-widthsecara default adalahautomin-width: autoditentukan oleh ukuran konten, dan diterapkan lebih dulu daripadaflex-shrink,overflow: hidden,width: 0,max-width: 100%- Rekomendasi: nyatakan
min-width: 0
-
Perbedaan horizontal dan vertikal di CSS
width: autoberusaha mengisi ruang parent, sedangkanheight: automenyesuaikan kontenwidth: autopada elemen inline, inline-block, dan float tidak melebarmargin: 0 automemusatkan secara horizontal,margin: auto 0tidak bisa memusatkan secara vertikal (namun padaflex-direction: column, pemusatan vertikal dimungkinkan)- Margin collapsing hanya terjadi secara vertikal
- Jika arah layout berubah seperti
writing-mode: vertical-rl, perilakunya juga terbalik
-
Block Formatting Context (BFC)
- Buat BFC dengan
display: flow-root(selain ituoverflow: hidden/auto/scroll,display: table, dll. juga bisa, tetapi ada efek samping) - Margin sibling vertikal yang saling berdekatan bertumpuk, atau margin child yang bocor ke luar parent, dapat dicegah dengan BFC
- Jika parent hanya berisi child float, tingginya akan kolaps menjadi 0 → bisa diperbaiki dengan BFC
- Jika ada
borderataupadding, margin collapsing tidak terjadi
- Buat BFC dengan
-
Stacking Context
- Kondisi yang membuat stacking context baru
- Properti rendering seperti
transform,filter,perspective,mask,opacity position: fixedataustickyz-indexditentukan + posisiabsolute/relativez-indexditentukan + elemen di dalam flexbox/gridisolation: isolate
- Properti rendering seperti
- Karakteristik
z-indexhanya berlaku di dalam stacking context tersebut- Koordinat
position: absolute/fixeddidasarkan pada ancestor terdekat yang positioned stickytidak bekerja melampaui stacking contextoverflow: visiblepun tetap terpotong oleh stacking contextbackground-attachment: fixeddiposisikan berdasarkan stacking context
- Kondisi yang membuat stacking context baru
-
Satuan viewport
- Di browser mobile, saat address bar/navigation bar hilang dari layar ketika discroll, nilai
100vhikut berubah - Solusi terbaru: gunakan
100dvh
- Di browser mobile, saat address bar/navigation bar hilang dari layar ketika discroll, nilai
-
Acuan posisi Absolute
position: absolutetidak mengacu ke parent, melainkan ke ancestorrelative/absoluteatau stacking context terdekat
-
Perilaku Blur
backdrop-filter: blurtidak mempertimbangkan elemen di sekitarnya
-
Float dinonaktifkan
- Jika parent adalah
flexataugrid,floatpada child tidak berpengaruh
- Jika parent adalah
-
Satuan persen untuk width/height
- Tidak berfungsi jika ukuran parent belum ditentukan sebelumnya (untuk menghindari referensi siklik)
-
Karakteristik elemen inline
display: inlinemengabaikanwidth,height,margin-top,margin-bottom
-
Penanganan whitespace
- Secara default, line break di HTML diperlakukan sebagai spasi, dan spasi berurutan dipadatkan menjadi satu
<pre>mencegah pemadatan spasi, tetapi perilaku awal/akhirnya khas- Pada kebanyakan konten, spasi di awal/akhir diabaikan, tetapi
<a>adalah pengecualian - Spasi/line break di antara
inline-blockditampilkan sebagai jarak nyata (tidak terjadi pada flex/grid)
-
text-align
- Berlaku untuk perataan teks dan elemen inline, tetapi tidak untuk perataan elemen block
-
box-sizing
- Nilai default adalah
content-box→ tidak termasuk padding/border - Saat
width: 100%+paddingditetapkan, elemen bisa melampaui area parent - Solusi:
box-sizing: border-box
- Nilai default adalah
-
Cumulative Layout Shift
- Jika atribut
widthdanheighttidak ditentukan pada<img>, keterlambatan loading gambar dapat menyebabkan layout bergeser - Rekomendasi: tentukan atribut tersebut untuk mencegah CLS
- Jika atribut
-
Permintaan jaringan untuk download file di Chrome
- Tidak ditampilkan di panel Network DevTools (diproses di tab lain)
- Jika perlu analisis, gunakan
chrome://net-export/
-
Masalah parsing JavaScript di dalam HTML
- Dalam kasus seperti
<script>console.log('</script>')</script>,</script>pertama dikenali sebagai tag penutup - Referensi: Safe JSON in script tags
- Dalam kasus seperti
Unicode dan Encoding Teks
-
Code point dan grapheme cluster
- Grapheme cluster adalah “unit karakter” pada GUI
- Karakter ASCII yang terlihat terdiri dari 1 code point = 1 grapheme cluster
- Emoji bisa menjadi satu grapheme cluster yang tersusun dari beberapa code point
- Di UTF-8, code point berukuran 1~4 byte, dan jumlah byte tidak sama dengan jumlah code point
- Di UTF-16, code point berukuran 2 byte atau 4 byte (surrogate pair)
- Standar tidak membatasi jumlah code point dalam cluster, tetapi implementasi sering memberi batas demi performa
-
Perbedaan perilaku string antarbahasa
- Rust: string internal menggunakan UTF-8,
len()adalah jumlah byte, indexing langsung tidak bisa,chars().count()adalah jumlah code point, validitas UTF-8 diverifikasi ketat - Golang: string pada dasarnya adalah array byte, panjang dan indexing berbasis byte, umumnya menggunakan UTF-8
- Java, C#, JS: berbasis UTF-16, panjang diukur per 2 byte, indexing juga per 2 byte, ada surrogate pair
- Python:
len()mengembalikan jumlah code point, indexing mengembalikan string yang berisi satu code point - C++:
std::stringtidak memiliki batasan encoding, berperilaku seperti vektor byte, panjang/indexing berbasis byte - Dari bahasa-bahasa yang disebutkan, tidak ada yang menghitung panjang/indexing berdasarkan grapheme cluster
- Rust: string internal menggunakan UTF-8,
-
BOM (Byte Order Mark)
- Beberapa file teks memiliki BOM, misalnya EF BB BF → penanda encoding UTF-8
- Umumnya digunakan di Windows, dan software non-Windows mungkin tidak dapat menangani BOM
-
Hal lain yang perlu diperhatikan
- Saat data biner diubah menjadi string, bagian yang tidak valid akan diganti dengan � (U+FFFD)
- Ada confusable characters (karakter yang terlihat mirip satu sama lain)
- Normalisasi (Normalization): misalnya, é dapat direpresentasikan sebagai U+00E9 (satu code point) atau U+0065+U+0301 (dua code point)
- Ada zero-width characters dan invisible characters
- Perbedaan line break: Windows menggunakan CRLF
\r\n, Linux/MacOS menggunakan LF\n - Han unification: karakter yang bentuknya sedikit berbeda di tiap bahasa memakai code point yang sama
- Font merender dengan tepat dengan menyertakan variasi per bahasa
- Dalam internasionalisasi, perlu memilih variasi font yang benar
Floating point
-
Karakteristik NaN
- NaN tidak sama dengan nilai apa pun, termasuk dirinya sendiri (
NaN == NaNselalu false) NaN != NaNselalu true- Hasil operasi yang melibatkan NaN umumnya akan tetap menjadi NaN
- NaN tidak sama dengan nilai apa pun, termasuk dirinya sendiri (
-
Nilai khusus
- Ada +Inf dan -Inf, berbeda dari NaN
- -0.0 adalah nilai yang dibedakan dari +0.0
- Dalam operasi perbandingan keduanya sama, tetapi pada beberapa perhitungan berperilaku berbeda
- Contoh:
1.0 / +0.0 == +Inf,1.0 / -0.0 == -Inf
-
Kompatibilitas dengan JSON
- Standar JSON tidak mengizinkan NaN dan Inf
- JS
JSON.stringifymengubah NaN dan Inf menjadinull - Python
json.dumps(...)mencetak NaN dan Infinity apa adanya (melanggar standar)- Jika opsi
allow_nan=Falsedigunakan, keberadaan NaN/Inf akan memunculkanValueError
- Jika opsi
- Golang
json.Marshalmengembalikan error jika ada NaN/Inf
- JS
- Standar JSON tidak mengizinkan NaN dan Inf
-
Masalah presisi
- Perbandingan langsung floating point bisa gagal → bentuk
abs(a - b) < εdisarankan - JS memperlakukan semua angka sebagai floating point
- Rentang integer aman adalah
-(2^53 - 1)~2^53 - 1 - Di luar rentang ini, representasi integer menjadi tidak akurat
- Untuk integer besar, disarankan menggunakan
BigInt - Jika JSON berisi integer di luar rentang aman, nilai hasil
JSON.parsebisa tidak akurat - Timestamp dalam milidetik aman hingga 287.396 tahun, sedangkan dalam nanodetik akan menimbulkan masalah
- Rentang integer aman adalah
- Perbandingan langsung floating point bisa gagal → bentuk
-
Hukum operasi tidak selalu berlaku
- Bergantung pada urutan operasi, kehilangan presisi dapat membuat hukum asosiatif dan distributif tidak berlaku secara ketat
- Operasi paralel (perkalian matriks, penjumlahan, dll.) dapat menghasilkan hasil nondeterministik
-
Performa
- Pembagian jauh lebih lambat daripada perkalian
- Jika membagi berkali-kali dengan angka yang sama, bisa dioptimalkan dengan menghitung kebalikannya terlebih dahulu lalu mengalikan
-
Perbedaan menurut hardware
- Dukungan FMA (Fused Multiply-Add): beberapa hardware melakukan perhitungan antara dengan presisi lebih tinggi
- Penanganan subnormal range: hardware modern mendukungnya, tetapi beberapa hardware lama memperlakukannya sebagai 0
- Perbedaan mode pembulatan
- Ada RNTE (round to nearest ties to even), RTZ (round toward zero), dan lainnya
- x86/ARM dapat mengaturnya sebagai status mutable thread-local
- GPU memiliki mode pembulatan yang berbeda per instruksi
- Perbedaan perilaku fungsi matematika seperti trigonometri dan logaritma
- x86 memiliki FPU 80-bit legacy dan per-core rounding mode → tidak disarankan digunakan
- Selain itu, berbagai faktor lain juga dapat membuat hasil floating point berbeda antar-hardware
-
Cara meningkatkan presisi
- Susun graph perhitungan lebih dangkal (kurangi struktur perkalian berantai)
- Hindari kasus ketika nilai antara menjadi sangat besar atau sangat kecil
- Manfaatkan operasi hardware seperti FMA
Waktu (Time)
-
Leap second
- Timestamp Unix mengabaikan leap second
- Saat leap second terjadi, waktu di sekitar interval tersebut bisa memanjang atau memendek (leap smear)
-
Zona waktu (Time zone)
- UTC dan timestamp Unix bersifat sama di seluruh dunia
- Waktu yang dibaca manusia bergantung pada zona waktu tiap wilayah
- Disarankan menyimpan timestamp di DB lalu mengonversinya di UI
-
Daylight saving time (DST)
- Di beberapa wilayah, jam disesuaikan 1 jam selama musim panas
-
Sinkronisasi NTP
- Selama proses sinkronisasi, waktu bisa berada dalam situasi "mundur"
-
Pengaturan zona waktu server
- Server disarankan diatur ke UTC
- Dalam sistem terdistribusi, perbedaan zona waktu antar-node dapat menimbulkan masalah
- Setelah mengubah zona waktu sistem, DB perlu dikonfigurasi ulang atau direstart
-
Jam hardware vs jam sistem
- Jam hardware tidak memiliki konsep zona waktu
- Linux: memperlakukan jam hardware sebagai UTC
- Windows: memperlakukan jam hardware sebagai waktu lokal
Java
==membandingkan referensi objek, untuk membandingkan isi objek perlu memakai.equals- Jika
equalsdanhashcodetidak dioverride, map/set akan menilai identitas objek berdasarkan referensi - Jika isi objek key pada map atau elemen objek pada set diubah, perilaku container akan rusak
- Metode yang mengembalikan
List<T>dalam beberapa kasus dapat mengembalikanArrayListyang mutable atauCollections.emptyList()yang immutable; jika yang kedua dimodifikasi akan munculUnsupportedOperationException - Ada metode yang mengembalikan
Optional<T>tetapi justru me-returnnull(tidak disarankan) - Jika melakukan return di blok
finally, exception yang terjadi ditryataucatchakan diabaikan dan nilai return darifinallyyang akan dipakai - Ada library yang mengabaikan interrupt, dan proses inisialisasi class termasuk I/O bisa rusak karena interrupt
- Exception pada task yang dikirim ke thread pool dengan
.submit()pada dasarnya tidak dicetak ke log dan hanya bisa diperiksa lewat future; jika future diabaikan, exception tidak bisa diketahui- Pekerjaan
scheduleAtFixedRateakan berhenti diam-diam saat exception terjadi
- Pekerjaan
- Literal angka yang diawali 0 diperlakukan sebagai oktal (
0123→ 83) - Debugger memanggil
.toString()dari variabel lokal, dan pada beberapa classtoString()memiliki efek samping sehingga perilaku kode bisa berubah saat debugging (dapat dinonaktifkan di IDE)
Golang
append()menggunakan kembali memori jika capacity masih tersedia; append pada subslice dapat menimpa memori induknya jugadeferdijalankan saat fungsi return, bukan saat scope blok berakhirdefermenangkap variabel mutable- Terkait
nil- nil slice dan empty slice berbeda
- string tidak bisa nil, hanya ada string kosong
- nil map bisa dibaca tetapi tidak bisa ditulis
- Ada perilaku khusus pada interface nil: jika data pointer null tetapi type info tidak null, nil tersebut tidak dianggap sama dengan
nil
- Dead wait: ada kasus bug konkurensi nyata di Go
- Ada berbagai jenis timeout, dibahas lebih rinci di net/http
C/C++
- Jika menyimpan pointer ke elemen
std::vectorlalu vector membesar, akan terjadi realokasi dan pointer menjadi tidak valid std::stringyang dibuat dari string literal bisa jadi merupakan objek sementara, sehingga memanggilc_str()berisiko- Jika container dimodifikasi saat iterasi, iterator bisa menjadi tidak valid
std::removetidak benar-benar menghapus, melainkan hanya menyusun ulang elemen; untuk menghapus tetap perluerase- Jika literal angka diawali 0, angka itu diperlakukan sebagai oktal (
0123→ 83) - Undefined behavior (UB): selama proses optimisasi, UB bisa diubah secara bebas sehingga berbahaya jika dijadikan sandaran
- Mengakses memori yang belum diinisialisasi adalah UB
- Mengubah
char*menjadi pointer struct lalu mengaksesnya sebelum masa hidup objek dimulai adalah UB; disarankan inisialisasi denganmemcpy - Akses memori yang tidak valid (seperti pointer null) adalah UB
- Overflow/underflow integer adalah UB (untuk unsigned, underflow ke bawah 0 bisa terjadi)
- Aliasing: jika pointer dari tipe berbeda mereferensikan memori yang sama, strict aliasing rule dapat menyebabkan UB
- Pengecualian: 1) tipe dengan hubungan pewarisan 2) konversi
char*,unsigned char*,std::byte*(konversi balik tidak berlaku) - Untuk konversi paksa, disarankan memakai
memcpyataustd::bit_cast
- Pengecualian: 1) tipe dengan hubungan pewarisan 2) konversi
- Akses unaligned memory adalah UB
- Alignment memori
- Integer 64-bit harus berada pada alamat yang habis dibagi 8
- Pada ARM, akses unaligned bisa menyebabkan crash
- Jika byte buffer langsung ditafsirkan sebagai struct, masalah alignment bisa muncul
- Alignment dapat menimbulkan struct padding sehingga memboroskan memori
- Beberapa instruksi SIMD (seperti AVX) hanya bisa memproses data yang ter-align; biasanya memerlukan alignment 32-byte
Python
- Argumen default fungsi tidak dibuat ulang setiap kali dipanggil, melainkan nilai awalnya tetap disimpan
SQL Databases
-
Penanganan Null
x = nulltidak berfungsi; harus menggunakanx is null- Null tidak sama dengan dirinya sendiri (mirip NaN)
- Unique index mengizinkan duplikasi Null (kecuali Microsoft SQL Server)
- Cara
select distinctmenangani Null berbeda-beda tergantung DB count(x)dancount(distinct x)mengabaikan baris yang nilai Null
-
Perilaku umum
- Konversi implisit tanggal bisa bergantung pada timezone
- Join kompleks + distinct bisa lebih lambat daripada query bersarang
- Di MySQL(InnoDB), jika field string bukan
utf8mb4, penyisipan karakter UTF-8 4-byte akan memicu error - MySQL(InnoDB) secara default tidak membedakan huruf besar/kecil
- MySQL(InnoDB) mengizinkan konversi implisit:
select '123abc' + 1;→ 124 - Gap lock di MySQL(InnoDB) dapat memicu deadlock
- Di MySQL(InnoDB), jika kolom group by dan kolom select tidak cocok, hasil yang dikembalikan bisa non-deterministik
- Di SQLite, jika bukan
strict, tipe field pada dasarnya tidak terlalu bermakna - Foreign key dapat memicu lock implisit dan menyebabkan deadlock
- Locking bisa merusak repeatable read isolation tergantung DB
- Distributed SQL DB bisa saja tidak mendukung locking atau punya perilaku khusus (berbeda-beda per DB)
-
Performa/operasional
- Masalah query N+1 tidak muncul di slow query log karena tiap query-nya cepat
- Transaksi yang berjalan lama dapat memicu masalah lock dan lain-lain → disarankan transaksi diselesaikan secepat mungkin
- Contoh kasus full table lock
- Di MySQL 8.0+, penambahan unique index/foreign key umumnya bisa diproses secara konkuren
- MySQL versi lama bisa memicu full table lock
- Jika
mysqldumptidak memakai opsi--single-transaction, akan terjadi full table read lock - Di PostgreSQL,
create unique indexataualter table ... add foreign keymemicu full table read lock- Cara menghindari: gunakan
create unique index concurrently - Untuk foreign key, gunakan pendekatan
... not validlaluvalidate constraint
- Cara menghindari: gunakan
-
Query range
- Range yang tidak tumpang tindih:
- Kondisi sederhana
p >= start and p <= endtidak efisien (bahkan jika ada indeks komposit) - Cara yang efisien:
(hanya memerlukan indeks pada kolom start)select * from (select ... from ranges where start <= p order by start desc limit 1) where end >= p
- Kondisi sederhana
- Range yang bisa tumpang tindih:
- Tidak efisien jika memakai indeks B-tree biasa
- MySQL disarankan memakai spatial index, PostgreSQL memakai GiST
- Range yang tidak tumpang tindih:
Concurrency and Parallelism
-
volatile
volatiletidak dapat menggantikan lock dan tidak menyediakan atomicity- Data yang dilindungi lock tidak memerlukan
volatile(karena lock menjamin memory order) - C/C++:
volatilehanya mencegah sebagian optimisasi, tidak menambahkan memory barrier - Java: akses
volatilemenyediakan sequentially-consistent ordering (JVM akan menyisipkan memory barrier bila perlu) - C#: akses
volatilemenyediakan release-acquire ordering (CLR akan menyisipkan memory barrier bila perlu) - Dapat mencegah optimisasi keliru terkait pengaturan ulang pembacaan/penulisan memori
-
Masalah TOCTOU (Time-of-check to time-of-use)
-
Penanganan constraint di lapisan aplikasi pada SQL DB
- Saat constraint yang tidak bisa dinyatakan dengan unique index sederhana (misalnya unik antar dua tabel, unik bersyarat, unik dalam periode tertentu) dipaksakan di aplikasi:
- MySQL(InnoDB): pada level repeatable read, lakukan
select ... for updatelalu insert; jika kolom unik memiliki indeks maka ini valid berkat gap lock (namun gap lock bisa memicu deadlock saat beban tinggi → perlu deadlock detection dan retry) - PostgreSQL: pada level repeatable read, logika yang sama tidak cukup dalam situasi konkuren (masalah write skew)
- Solusi:
- Gunakan isolation level serializable
- Gunakan constraint DB alih-alih aplikasi
- Unique bersyarat → partial unique index
- Unique antar dua tabel → sisipkan data duplikat ke tabel terpisah lalu gunakan unique index
- Eksklusivitas periode → range type + exclude constraint
- Solusi:
- MySQL(InnoDB): pada level repeatable read, lakukan
- Saat constraint yang tidak bisa dinyatakan dengan unique index sederhana (misalnya unik antar dua tabel, unik bersyarat, unik dalam periode tertentu) dipaksakan di aplikasi:
-
Atomic reference counting
- Jika banyak thread sering mengubah counter yang sama seperti pada
Arc,shared_ptr, performa bisa menurun
- Jika banyak thread sering mengubah counter yang sama seperti pada
-
Read-write lock
- Beberapa implementasi tidak mendukung upgrade dari read lock ke write lock
- Jika mencoba mengambil write lock saat masih memegang read lock, deadlock bisa terjadi
Common in many languages
- Pemeriksaan Null/None/nil yang terlewat adalah penyebab error yang umum
- Saat memodifikasi container di tengah perulangan, bisa terjadi data race thread tunggal
- Kesalahan berbagi data mutable: misalnya,
[[0] * 10] * 10di Python bukan cara yang benar untuk membuat array 2D (low + high) / 2bisa mengalami overflow → cara yang aman adalahlow + (high - low) / 2- Evaluasi singkat (short circuit):
a() || b()tidak menjalankan b jika a bernilai true,a() && b()tidak menjalankan b jika a bernilai false - Profiler secara default hanya mencakup CPU time → waktu tunggu DB dan sejenisnya tidak muncul di flamegraph sehingga bisa menimbulkan salah paham
- Dialect regular expression berbeda di tiap bahasa → regex yang berjalan di JS bisa jadi tidak berjalan di Java
Linux and bash
- Setelah berpindah direktori,
pwdmenunjukkan path asli, sedangkan path sebenarnya adalahpwd -P cmd > file 2>&1→ stdout+stderr keduanya ke file,cmd 2>&1 > file→ hanya stdout ke file, stderr tetap seperti semula- Nama file membedakan huruf besar-kecil (berbeda dengan Windows)
- File executable memiliki sistem capability (
getcapuntuk memeriksanya) - Bahaya variabel unset: jika
DIRunset makarm -rf $DIR/berisiko menjalankanrm -rf /→ bisa dicegah denganset -u - Penerapan environment: untuk menerapkan skrip ke shell saat ini gunakan
source script.sh→ untuk penerapan permanen tambahkan ke~/.bashrc - Bash melakukan caching perintah: jika file di dalam
$PATHdipindahkan bisa munculENOENT→ segarkan cache denganhash -r - Jika variabel digunakan tanpa tanda kutip, baris baru akan diperlakukan sebagai spasi
set -e: langsung keluar saat skrip error, tetapi tidak bekerja di dalam kondisi (||,&&,if)- Konflik antara livenessProbe K8s dan debugger: debugger berbasis breakpoint menghentikan seluruh aplikasi sehingga health check gagal mendapat respons → Pod bisa dihentikan
React
- Memodifikasi state secara langsung di kode rendering
- Menggunakan Hook di dalam if/loop → melanggar aturan
- Ada nilai yang diperlukan tetapi terlewat dari dependency array
useEffect - Tidak ada kode clean up di
useEffect - Jebakan closure: bug terjadi karena menangkap state lama
- Mengubah data di tempat yang salah → komponen tidak murni
- Tidak menggunakan
useCallback→ menyebabkan rerender yang tidak perlu - Saat nilai yang tidak dimemoisasi dikirim ke komponen yang dimemoisasi, optimasi memo menjadi tidak efektif
Git
-
Rebase adalah penulisan ulang histori
- Setelah rebase, push biasa akan bentrok → harus force push
- Jika histori branch remote berubah, gunakan juga
--rebasesaat pull --force-with-leasedalam beberapa kasus dapat mencegah commit developer lain tertimpa, tetapi jika hanya fetch dan tidak pull perlindungan ini tidak berlaku
-
Masalah revert merge
- Revert merge efeknya tidak sempurna → saat branch yang sama di-merge lagi tidak ada perubahan apa pun
- Solusi: lakukan revert atas revert tersebut, atau gunakan cara yang lebih bersih (backup → reset → cherry-pick → force push)
-
Hal yang perlu diperhatikan terkait GitHub
- Walau secret seperti API key ditimpa dengan force push setelah sempat di-commit, rekamannya tetap tersimpan di GitHub
- Jika B adalah fork private dari repo private A, lalu A menjadi public, isi B juga akan ikut terbuka (tetap bisa diakses bahkan setelah dihapus)
-
git stash pop: jika terjadi conflict, stash tidak akan di-drop -
.DS_Storedibuat otomatis oleh macOS → disarankan menambahkan**/.DS_Storeke.gitignore
Networking
- Beberapa router dan firewall memutus koneksi TCP idle secara diam-diam → connection pool pada klien HTTP atau DB bisa menjadi tidak valid → solusi: atur TCP keepalive
- Hasil
traceroutekurang andal → dalam beberapa kasustcptraceroutelebih berguna - TCP slow start bisa menyebabkan latensi meningkat → dapat diatasi dengan menonaktifkan
tcp_slow_start_after_idle - Masalah TCP sticky packet: algoritma Nagle menunda pengiriman paket → bisa diatasi dengan mengaktifkan
TCP_NODELAY - Saat menaruh backend di belakang Nginx, perlu mengatur reuse koneksi → jika tidak, pada beban tinggi koneksi bisa gagal karena kekurangan port internal
- Nginx secara default melakukan buffering paket → menyebabkan keterlambatan pada SSE(EventSource)
- Standar HTTP tidak melarang body pada request GET dan DELETE → sebagian memang menggunakannya, tetapi banyak library dan server tidak mendukung
- Satu IP dapat meng-host beberapa website → pembedanya adalah header HTTP
Hostdan SNI pada TLS → ada situs yang tidak bisa diakses hanya dengan IP langsung - CORS: saat meminta resource dari origin lain, browser memblokir akses ke respons → server perlu mengatur header
Access-Control-Allow-Origin- Jika termasuk pengiriman cookie, perlu pengaturan tambahan
- Jika frontend dan backend memakai domain dan port yang sama, tidak ada masalah CORS
Other
-
Hal yang perlu diperhatikan pada YAML
- YAML sensitif terhadap spasi →
key:valuesalah,key: valueyang benar - Kode negara
NOjika ditulis tanpa tanda kutip bisa ditafsirkan sebagaifalse - Git commit hash tanpa tanda kutip bisa dikonversi menjadi angka
- YAML sensitif terhadap spasi →
-
Masalah CSV di Excel
- Saat membuka CSV, Excel melakukan konversi otomatis
- Konversi tanggal:
1/2,1-2→2-Jan - Konversi tidak akurat untuk angka besar:
12345678901234567890→12345678901234500000
- Konversi tanggal:
- Penyebabnya, Excel secara internal memproses angka sebagai floating point
- Ada kasus nama gen SEPT1 berubah secara keliru akibat masalah ini
- Saat membuka CSV, Excel melakukan konversi otomatis
Belum ada komentar.