27 AVG 2026MAHSULOTENGLISH

Tadam: ilovasiz va bazasiz to'y albomi

O'zbek to'yida uch yuz mehmon va uch yuzta telefon bo'ladi. Kechaning oxiriga borib, o'sha kechaning haqiqiy suratlari — stollar, raqs, kadr tashqarisidagi nimagadir kulib turgan buvi — faqat o'sha telefonlarda qoladi. Kelin-kuyov ulardan yigirmatachasini ko'radi: guruhga tashlangan, siqilib tanib bo'lmas holga kelgan. Tadam — shuni stoldagi QR kod bilan tuzatishga urinishim.

tadam.uz 2026-yil 27-avgustda ishga tushdi. Quyida u qanday ishlashi va ko'ringanidan qiyinroq chiqqan hamma narsa.

Jarayon

Kelin-kuyov albom yaratadi — nomi va sanasi, boshqa hech narsa, akkaunt ham yo'q. Javobiga uchta havola oladi: mehmon havolasi, boshqaruv havolasi va chop etiladigan QR varaqasi. QR varaqasi stollarga qo'yiladi.

Mehmon uni skanerlaydi, galereyasi ochiladi, suratlarni tanlaydi, yuklaydi. Ilova yo'q, ro'yxatdan o'tish yo'q, parol yo'q. Keyin kelin-kuyov boshqaruv sahifasini ochib, hammasini bitta ZIP qilib yuklab oladi.

Tadam bosh sahifasi, to'rt qadamli jarayon
Bosh sahifa. Butun jarayon skroll qilmasdan tushuntirilgan — chunki kelganlarning ko'pi Telegram havolasidan tushadi va o'qib o'tirmaydi.

Birinchi ekranni belgilagan shart shu edi: odam to'y guruhida havolani ko'rib qoladi. Uning qiziqishi taxminan to'rt soniya. Agar sayt nima ekanini o'ylab topishi kerak bo'lsa, chiqib ketadi. Shuning uchun to'rt qadam darrov ko'rinadi, rasm bilan, oldida marketing muqaddimasisiz.

Ilova ham yo'q, ma'lumotlar bazasi ham yo'q

Ilovasizlik qarori ko'z oldingizga keltirsangiz o'z-o'zidan tushunarli: to'yda, qo'lida likopcha ushlab turgan odam hech qachon ilova o'rnatmaydi. Birinchi bosishdayoq ochiladigan veb-sahifa bo'lishi shart.

Ma'lumotlar bazasisizlik qarori kamroq ko'rinib turardi va men undan hali ham mamnunman. Hammasi Cloudflare Worker sifatida ishlaydi, R2 esa yagona ma'lumot ombori. SQL yo'q, KV yo'q, Durable Object yo'q. Albom ma'lumotlari R2 obyekt metadatasida turadi; surat ro'yxati — R2 prefiks ro'yxati. To'y albomi bir marta yoziladi, bir necha marta o'qiladi va keyin umuman tegilmaydi — bunga baza kerak emas, qo'shmagan har bir baza esa shanba kuni kechqurun 11 da ishdan chiqolmaydigan bitta narsa demakdir.

Nom

Birinchi uch kun u Chaqnoq deb atalgan. Keyin uni ovoz chiqarib aytdim va odam menga qaytarib yoza olmaganini ko'rdim. To'y mahsuloti haqida yozishmaydi — gapirishadi, bir odam stolda ikkinchisiga aytadi. "Chaqnoq" dagi undoshlar to'plami na og'zaki nutqda, na yomon telefon dinamigida omon qoladi.

Tadam — sehrgar fokusi chiqqanda chiqaradigan tovush. Ikki bo'g'in, o'zbekcha ham, ruscha ham, inglizcha ham qanday eshitilsa shunday yoziladi va uchalasida bir xil ma'no beradi.

Ishlab turgan kod bazasining nomini o'zgartirish — brend nomi necha joyga yashiringanini bilib olish joyi. Men kontekstni tushunadigan qayta nomlash skripti yozdim: u ko'rinadigan matndagi brendni, CSS klassidagi brendni va o'zgarmasligi shart bo'lgan API yo'lidagi qatorni bir-biridan ajratardi, ustiga hech narsaga tegmasdan oldin har bir moslikni chop etadigan majburiy dry-run bor edi. Ko'r-ko'rona qidir-almashtir allaqachon yaratilgan har bir albomning havolasini jimgina buzib qo'yardi.

QR kod — taxmin qilinmadi, o'lchandi

QR varaqasi — jismoniy mahsulot. Agar u o'tirgan mehmonning qo'li yetadigan masofadan, to'yning xira yorug'ida, ustiga kimningdir palovi tomgan varaqadan skanerlanmasa, qolgan hamma narsaning ahamiyati yo'q.

Tadam albomi uchun QR varaqasi
Chop etiladigan QR varaqasi: A5 da 64 mm kod, Q darajali xato tuzatish, pastida qo'lda yozish uchun havola.

Shuning uchun umid qilish o'rniga o'lchadim. QR'ni telefon kamerasi turli masofadan qanday piksel o'lchamda ko'rsa, o'shanday chiqarib, har biriga dekoder yurgizdim. U taxminan 15 sm dan 85 sm gacha ishonchli o'qiladi — varaqaga qo'li yetadigan hammani qamraydi. Kod Q darajasida yasaladi, bu esa standart bo'yicha kodning chorak qismi shikastlanganda ham ma'lumotni tiklaydi. Dog'ga chidamlilik shundan keladi.

Keyin ostidagi havola. Ba'zi mehmonlar skanerlamaydi — ko'zini qisib, qo'lda yozadi. Havola tadam.uz/e/?i=4se48ya9r edi — 23 belgi, ichida savol belgisi va teng belgisi bor, ikkalasi ham telefon klaviaturasida azob. Endi u tadam.uz/4se48ya9r, 18 belgi, faqat kichik harf va raqam. Bitta bo'lakdan iborat manzil haqiqiy albom havolasiga 301 bilan yo'naltiriladi, ustiga band nomlar ro'yxati bor — kelajakdagi /about yoki /qr hech qachon albom ID'si deb o'qilmaydi.

Mendan ID'ning o'zini to'qqiz belgidan yettitaga tushirish mumkinmi deb so'rashdi, men yo'q dedim. Bu mahsulotning maxfiylik modeli shundan iborat: havolaning o'zi — parol. Uni ushlagan odam suratlarni ko'radi. Ikkita belgini olib tashlash kalit maydonini taxminan ming barobar kichraytiradi. Beshta tejalgan bosish begona odamlarning to'y suratlari uchun ming barobar zaif himoyaga arzimaydi.

Rostdan qiyin bo'lgan joylar

Yuklamaga umuman ishonmaslik. Faylning kengaytmasi ham, Content-Type sarlavhasi ham — mijoz aytgan da'vo, xolos. Har bir yuklama sehrli baytlar bo'yicha tekshiriladi: JPEG, PNG, WebP, GIF va HEIC. Oxirgisi ISO-BMFF ftyp blokining ichiga kirishni talab qiladi, chunki bu yerda asosiy kamera — iPhone. Haqiqiy rasm bo'lmagan hamma narsa rad etiladi, hajm esa tana o'qilgandan keyin emas, Content-Length dan oldin rad qilinadi.

Foydalanuvchi kontentini xavfsiz uzatish. Suratlar default-src 'none'; sandbox ostida beriladi. Kimdir bajariladigan narsa saqlash yo'lini topsa ham, brauzerda uni ishga tushirishga, tarmoqqa chiqishga yoki ota-sahifaga tegishga ruxsat yo'q. Saytning o'zida HSTS, nosniff, referrer va permissions siyosatlari bor.

Rostdan bir tekis tasodifiy ID. Tasodifiy belgi tanlashning ko'zga ko'rinadigan yo'li — tasodifiy_bayt % alifbo_uzunligi. Alifbo 256 ga butun bo'linmasa, bu qiyshiq chiqadi: boshidagi belgilar oxiridagilardan ko'proq tushadi. Ikki million namunada o'lchadim: 12,65% qiyshiqlik. O'rniga rad etish namunasi (rejection sampling) qo'yildi — diapazondan tashqaridagi tortishlar tashlanadi va qayta tortiladi.

Akkauntsiz o'chirish. Har bir suratga albom va suratdan SHA-256 orqali chiqariladigan o'chirish kaliti beriladi. Shu tufayli mehmon endigina yuklab pushaymon bo'lgan suratini o'chira oladi, kelin-kuyov esa istaganini. Kalitlar solishtiruvi doimiy vaqtda bajariladi — vaqt sizdiradigan solishtiruv kalitni bir baytdan topib olish imkonini berardi.

Progress-barli ZIP. Worker'dan ZIP oqim bilan uzatilsa, Content-Length bo'lmaydi. Natijada brauzer noaniq spinner ko'rsatadi va kelin-kuyov 400 ta suratlik yuklama 10% dami yoki 90% dami — bilmaydi. Oqim bilan uzatiladigan Worker javobiga haqiqiy uzunlik qo'yishning yagona yo'li — FixedLengthStream. Uzunlikni oldindan hisoblash esa ZIP'ni yasashdan oldin uning aniq bayt hajmini chiqarishni talab qildi.

Tadam mehmon albomi ko'rinishi
Namuna albom. Bular sinov albomiga yuklangan Wikimedia Commons to'y suratlari — hech kimning haqiqiy albomini skrinshot qilmadim, chunki ular shaxsiy.

Kimdir ishlatganini bilish

Haqiqiy odam albom yaratgan lahzada bilishni istadim — lekin o'zimga uning suratlariga mo'ralash yo'lini bermasdan. Shuning uchun albomlar ro'yxatini ko'rsatadigan egalik sahifasi bor: nomlar, sanalar, surat soni va havolalar. U shifrlangan maxfiy kalit ortida, kalit sozlanmagan bo'lsa 403 emas, 404 qaytaradi — ya'ni mavjudligini oshkor qilmaydi. Albom yaratilganda Telegram bot menga xabar yozadi.

Tadam albomni boshqarish sahifasi
Kelin-kuyovga tegadigan boshqaruv ko'rinishi: ulashish havolalari, QR varaqasi, ZIP yuklash va har bir suratni o'chirish.

O'sha sahifa haqiqiy hajmdagi ma'lumot bilan birinchi uchrashuvda osilib qoldi. Ikki yuzga yaqin albomda u R2 chaqiruvlarini ketma-ket qilardi va shunchalik cho'zildiki, men uni ishdan chiqqan deb o'yladim. O'n ikkita parallel oqimli hovuz uni 0,7 soniya ga tushirdi, surat soni esa faqat eng yangi qirqta albom uchun hisoblanadi.

Vaqt sarflaganimdan xursand bo'lgan tafsilotlar

Nima demayman

Bosh sahifaga "O'zbekistonda birinchi va yagona shunday xizmat" deb yozish ko'nglimga kelgan edi. Yozmadim, chunki mamlakatdagi har bir raqobatchini tekshirmaganman va buni isbotlay olmayman. Ehtimol, u yaxshiroq konversiya berardi. Shu bilan birga, kimdir raqobatchini topgan birinchi kuniyoq himoya qilishim kerak bo'lgan da'vo bo'lardi — o'z nomim ostida narsa qurishning butun ma'nosi esa ulardagi hamma gap tekshiruvga bardosh berishida.

Halol holat shunday: tadam.uz jonli, himoyalangan, tez — va hali birorta ham haqiqiy to'yda ishlatilmagan. Keyingi tuzatiladigan narsa shu, va u kod muammosi emas.

← BARCHA YOZUVLAR · RSS · © 2026 Maqsudjon Polatov