Jasur - IT Blog
104 subscribers
30 photos
1 video
35 links
- @jasurkhaitov

Bilganlarim va foydali bo'lishi mumkin bo'lgan ma'lumotlarini ulashib boraman.

- github.com/jasurkhaitov
- jasurkhaitov.uz
Download Telegram
🏠 Javascript interview savollari

5. Javascript ma'lumot turlari ?

Javascript'da 8 ta ma'lumot turi mavjud va ular qiymatiga qarab 2 turga bo'linadi Primitive va Reference

* Primitive ma'lumot turlari: string, number, boolean, bigint, symbol, null, undefined.

* Non - Primitive ma'lumot turlari: object.

1. Number ma'lumot turi !

Number qiymati butun va kasr sonlarni ko'rsatadi. Number() funksiya qiymatni number'ga o'tkazishda foydalaniladi.
Number("123");    // returns 123
Number("123abc"); // returns NaN
Number(""); // returns 0


Number ma'lumot turi 64-bitli IEEE 754 double-precision hisoblanadi, ya'ni sonlarni binary formatda ko'rsatish uchun 64 bit'dan foydalaniladi.
1 bit - musbat yo manfiy belgisi uchun
11 bit - exponent uchun (-1022 va 1023)
52 bit - kasr qismi uchun

Number ma'lumot turi -(2^53 − 1) va (2^53 − 1) orasidagi sonlar qabul qiladi

Infinity va NaN ham Number ma'lumot turiga kiradi.

2. String ma'lumot turi !

String qiymati matn ma'lumot turini ko'rsatadi va qiymat 16-bit unsigned integer (UTF-16) bilan kodlangan bo'ladi. String() funksiya string ma'lumot yaratish uchun ishlatiladi. new String() orqali String Object yaratiladi.
const str = new String("JasX");


3. Boolean ma'lumot turi !

Boolean ma'lumot turi true va false qiymat ko'rsatadi va logical operator deb ham ataladi. Boolean() funksiya boolean bo'lmagan qiymatlarni true yoki false qiymatga o'tkazish uchun ishlatiladi.
Boolean("");           // false
Boolean(null); // false
Boolean(undefined); // false
Boolean(NaN); // false

Boolean("hello"); // true
Boolean([]); // true
Boolean({}); // true


4. BigInt ma'lumot turi !

BigInt ma'lumot turi katta raqamli qiymat qabul qiladi, ya'ni Number qabul qilolmaydigan sonlarni -(2^53 − 1)'dan kichik va (2^53 − 1)'dan katta. BigInt() funksiya Number'larni BigInt'ga o'tkazadi primitive qiymat qaytaradi
let bigIntFromNumber = BigInt(9007199254740992);
console.log(bigIntFromNumber); // 9007199254740992n

let bigIntFromString = BigInt("9007199254740992");
console.log(bigIntFromString); // 9007199254740992n


5. Symbol ma'lumot turi !

Symbol antiqa va o'zgarmas primitive qiymat hisoblanadi va Object uchun unique key sifatida ham foydalanilishi mumkin. Symbol'ning asosiy vazifasi antiqa key yaratish va bu key boshqa Object key'lar bilan xar xil bo'lishi kafolatlangan. Symbol() funksiya antiqa key yaratish uchun ishlatiladi.
let sym1 = Symbol("desc");
let sym2 = Symbol("desc");

console.log(sym1 === sym2); // false


📹 youtube.com/watch?v=tmkD2VGtEqc&t=60s

6. null ma'lumot turi !

null ma'lumot turi qiymat yo'qligini bildiradi va turli holatlarda paydo bo'lishi mumkin, masalan object'ning biron bir property'sida qiymat bo'lmasa. null boolean operator'lar uchun false qiymat beradi.

7. undefined ma'lumot turi !

undefined global object'ning xosasi va global scope o'zgaruvchisi hisoblanadi. O'zgaruvchi e'lon qilinsa, lekin qiymat berilmasa undefined qiymat beriladi.
let a;
console.log(a); // undefined


8. Object ma'lumot turi !

Object bu ma'lum bir narsaning xususiyatlar to'plami, xususiyat bu name (key) va qiymat'ning birlashmasi. Xususiyatning qiymat har qanday ma'lumot turi bo'lishi mumkin.
let obj = {
key: value
};


new Object() constructor object yaratib beradi.

let obj = new Object();

obj.key = 'value';

console.log(obj.key); // {key: 'value'}


Array vs Funksiya
let arr = []
function log() {}

console.log(typeof arr); // object
console.log(typeof log); // function .


Javascript'
da Array ma'lumot turi mavjud emas. Array bu ma'lumot'larni to'plash uchun ishlatiladi va Object'ning ustiga qurilgan global object'ning bir turi hisoblanadi.

Funksiya'ni typeof qilib tekshirganda Function qaytaradi. Lekin Javascript'da function ma'lumot turi mavjud emas. Funksiya Object hisoblanadi.

🔗 developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

📹 youtube.com/watch?v=rdlMyOx6Ub8&list=PLn8TR1nMED9ZkH_zA0teP6ZEIF6oZhMSA

#javascript #interview

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥3💯1
Nega Number ma'lumot turi [-(2^53 − 1) - (2^53 − 1)]'dan tashqari sonlarni qabul qilmaydi.

Izohlarda fikringizni yozib qoldiring 👇
🔥5
Jasur - IT Blog
Nega Number ma'lumot turi [-(2^53 − 1) - (2^53 − 1)]'dan tashqari sonlarni qabul qilmaydi. Izohlarda fikringizni yozib qoldiring 👇
🏠 Nega Javascript Number ma'lumotlari cheklangan ?

Javascript Number ma'lumot turi IEEE 754 standarti orqali 64-bit'li ikkilik formatidagi (double-precision) raqamlarni ko'rsatadi.

IEEE 754 - floating-point arifmetikasi uchun Institute of Electrical and Electronics Engineers tomonidan ishlab chiqilgan texnik standart hisoblanadi.

64 bit - Javascript number ma'lumotlarni kodlash (encode qilish) uchun.

1 bit - musbat yo manfiy belgisi uchun
11 bit - butun sonning Exponent qismini ko'rsatadi
52 bit - kasr qismi uchun (mantissa)

Javascript number ma'lumotlarni bit'dan numberga o'tkazish uchun shu formuladan foydalanadi.

Number = (-1)^sign × (1 + mantissa) × 2^exponent


JavaScript floating-point representation 53-bit hisoblanadi. Ya'ni ( 1 + mantissa ), 1bit + 52 bit.

1 bit implicit leading bit, 52 bit implicit leading bit deyiladi.

Shuning uchun Javascript floating-point uchun umumiy 53 bit sarflaydi.

Bundan kelib chiqadi:
Number.MAX_SAFE_INTEGER 2^53 – 1'ga teng.
Number.MIN_SAFE_INTEGER -(2^53 - 1)'ga teng.

Agar Number bu qiymatdan ortib ketsa, maximum precision 53 bit'dan oshib ketadi. Natijada, Aniqlikda xatoliklar va Hisoblashda noaniqliklar kelib chiqadi.


🔗 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

📹 youtu.be/bqj0pQc7SNw?si=TGLIoJoYyWkt8u6h&t=382
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2🎉1
🏠 Javascript Device Detection

Web Sahifa'ga tashrif buyurilgan qurilmani aniqlash responsiv dizayn, analitika, feature o'zgartirish kabi vazifalar uchun foydali bo'ladi.


Sahifa mobil qurilmada yoki kompyuterda ko'rilayotganligini aniqlash uchun Navigator.userAgent xususiyatidan foydalaniladi.

Navigator.userAgent browser'ning user agenti (user agent of the browser) qaytaradigan string'ni o'z ichiga oladi.

Masalan:
console.log(navigator.userAgent);

// Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36


Navigator.userAgent
qaytaradigan string orqali qurilma turini aniqlash mumkin, bunga sabab qurilmalarda string farq qiladi.

Qurilma turini aniqlash uchun qo'shimcha RegExp'dan foydalanamiz, ya'ni RegExp.prototype.test().

RegExp.prototype.test()

test() metodi regular expression'ni match qilingan ma'lumot ichidan qidiradi va mavjudligiga qarab boolean ma'lumot (true, false) qaytaradi.

Masalan:
const str = 'table football';
const regex = new RegExp('foo');

console.log(regex.test(str)); // true


Mobil qurilma ekanligini aniqlash uchun /Mobile|Android|iPhone|iPad/i Regular Expression'dan foydalanamiz.

const detectDeviceType = () => /Mobile|Android|iPhone|iPad/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';

detectDeviceType();


Bu kod'da Navigator.userAgent string qaytaradi va .test() RegExp bilan stringni test qiladi. Agar string ichida berilgan experssion mavjud bo'lsa .test() true qaytaradi. Natija, qurilma mobil bo'ladi.

/Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i - Mobil qurilmani aniqlash uchun expression'ni kengaytirish mumkin.

Kelajakda browser'larda .userAgent() ishlamasligi mumkin, ya'ni browser o'zi haqida ma'lumot bermasligi mumkin.


Qurilmani tekshirish uchun: device-detecting.vercel.app

🔗 30secondsofcode.org/js/s/detect-device-type

📹 youtu.be/VKZvBf0VLXE?si=IJNQytIonhS9AuS5

#javascript #deviceDetection

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️ Javascript Logic

subtitles.vtt file'ni fetch qilib yangi o'zgaruvchi'ga saqlanadi.

Qidirilgan keyword subtitle'dan ishlatilgan vaqti olinadi (e.g., 00:00:10.500 -- 00:00:12.000).

parseTime()
orqali vaqt'ni string'dan date'ga o'tkaziladi va video.play() orqali qo'yiladi.

video.currentTime = matchedTime;
video.play();


P.s. Bekarchilkdan buyam bir eksperiment

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉6👍32
🖥 Javascript Navigator Object

Navigator dasturchilarga foydalanuvchining veb-brauzeriga kirish va u bilan o‘zaro aloqada bo‘lish imkonini beradi, bu dasturchilarga website'ni yanada yaxshilashga yordam beradi


Masalan: Navigator obyektidan foydalangan holda foydalanuvchining brauzeri versiyasi, ekran o‘lchami, til sozlamalari va internet tezligini aniqlashi mumkin. Bu ma’lumotlar yordamida saytni yanada yaxshilash mumkin.

Navigator obyekti foydalanuvchining geografik joylashuvini aniqlashda ham ishlatilinadi. Bu til tarjimalari, valyuta konvertatsiyasi va mahalliy ob-havo ma’lumotlarini taqdim etishga imkon beradi.

Navigator Global Window Object'ni bir qismi hisoblanadi.

let navigatorObject = window.navigator;


Navigator object property orqali o'zimizga kerak bo'lgan ma'lumotlarni olishimiz mumkin

⚠️ Navigator Object xususiyatlari foydalanuvchining brauzeri haqida har doim aniq ma’lumot bermasligi mumkin. Masalan, foydalanuvchilar eskirgan yoki o‘zgartirilgan brauzerlardan foydalanayotgan bo‘lishi mumkin, bu esa noto‘g‘ri ma’lumotlarga olib keladi. Bundan tashqari, barcha brauzerlar Navigator obyektining barcha funksiyalarini qo‘llab quvvatlamaydi.


navigator Object'ni console'ga chiqaradigan bo'lsak, hamma browser da ham bir xil ma'lumotni ko'rsatmaydi

Masalan: Chrome orqali deviceMemory aniqlash mumkin, lekin FireFox'da bu ma'lumot mavjud emas

Battery Charge Detecting

Navigator object orqali qurilma quvvatini (zaryadini) aniqlash uchun Battery Status API'dan foydalanamiz

navigator.getBattery() orqali Battery Status API'ga kiriladi va BatteryManager object'ni resolve qilish uchun Promise qaytaradi.

BatteryManager Object level, charging property'larni o'z ichiga oladi.

level - qurilma quvvati (0 dan 1 gacha qiymatda)
charging - boolean qiymat qaytaradi, qurilma quvvat olyaptimi yuqmi aniqlash uchun

Battery Status API ko‘plab yangilangan brauzerlarda privacy concerns sababli qo‘llab-quvvatlanmaydi. Bu API eski versiyadagi Chrome, Edge va ba’zi boshqa brauzerlarda ishlaydi, lekin Firefox yoki Safari’da ishlamasligi mumkin.


if ('getBattery' in navigator) {
navigator.getBattery().then((battery) => {
console.log(`Battery level: ${battery.level * 100}%`);
console.log(`Charging: ${battery.charging ? 'Yes' : 'No'}`);
});
} else {
console.log('Battery Status API is not supported in this browser.');
}


🔗 bito.ai/resources/navigator-object-javascript-javascript-explained

#javascript #navigator

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1
👍21🎉1
Jasur - IT Blog
Photo
Console'ga nima chiqadi ?
Anonymous Quiz
29%
[0] [1]
18%
[-2] [-2]
29%
[18] [16]
25%
[1] undefined
👍32🎉2
🖥 Storage Classses in C++

Storage class'lar C++'da lifespan, scope va o'zgaruvchilarning xotira manzili'ni (storage location) aniqlash uchun yordam beradigan keyword'lar hisoblanadi.

Storage class'lar o'zgaruvchilar xotirada qanday saqlanishini, qancha vaqt davomida mavjud bo'lishini, va qayerda foydalanilishi mumkinligini boshqaradi.


C++'da 4 ta asosiy storage class'lar mavjud mavjud:

* auto : Bu block yoki funksiyada e'lon qilingan local o'zgaruvchilar uchun default storage classes hisoblanadi. auto storage class-ga ega o'zgaruvchilar avtomatik saqlanadi.

Masalan: Bironta block yoki funksiya bajarilishni (execute) boshlasa, ichkarida e'lon qilingan auto o'zgaruvchilar xotiraga saqlanadi, va execute process (bajarilish jarayoni) tugagandan keyin xotiradan olib tashlanadi.

Auto o'zgaruvchi e'lon qilish:
auto int a = 5; 


Yoki default holat'da :
int a = 5;


C++'da O'zgaruvchilar default holatda auto bo'lgani uchun, auto keyword kam holatda ishlatilinadi.


* register : Bu storage class compiler'ga o‘zgaruvchini protsessor'dagi (CPU) tezkor va kichik xotiraga saqlashni taklif qiladi. Ammo, hozirga compiler'lar bu so'rovni rad qilishi mumkin.

Register o'zgaruvchi e'lon qilish:
register int counter = 5;


register storage class o'zgaruvchilari ham automatic xotiraga saqlash xususiyatiga ega.


* static : Qachonki program execute bo'lishni boshlaganda static storage class ishlatilagan o'zgaruvchilar uchun xotiradan alohidan joy ajratiladi va program to'xtaguncha o'sha joyga saqlanadi.

Masalan:
#include <iostream>
using namespace std;

void example() {
// Local scope
static int x = 0;
x++;
cout << x << endl;
}

int main() {
example(); // Output: 1
example(); // Output: 2

return 0;
}


auto vs static asosiy farqlari, auto o'zgaruvchilar har block yoki funsiya ishlashni boshlaganda xotiraga saqlanib, ishlashdan to'xtaganda olib tashlanadi. static o'zgaruvchi esa to'liq program ishlaganda saqlanadi


* extern : "extern" storage class boshqa fayllarda aniqlangan o‘zgaruvchilarni e’lon qilish uchun ishlatiladi. Bu o‘zgaruvchining butun dastur davomida ishlatish imkonini beradi. "extern" o‘zgaruvchilar global scopega ega bo‘ladi va odatda bir nechta fayllar orasida o‘zgaruvchilarni ulashish uchun ishlatiladi.

Masalan: file1.cpp
#include <iostream>
using namespace std;

extern int counter;

void increment() {
counter++;
cout << "Counter: " << counter << endl;
}


file2.cpp
#include <iostream>
using namespace std;

extern int counter;
extern void increment();

int counter = 0;

int main() {
cout << "Initial counter: " << counter << endl;
increment();
cout << "After increment: " << counter << endl;

return 0;
}


🔗 javatpoint.com/cpp-storage-classes

📹 youtube.com/watch?v=QVTaiRmYxzk&t=17s

#cpp #storageClass

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🎉1😇1
⚙️ React v19

React 19 foydalanishga tayyor (stable) bo'libdi!


🔗 react.dev/blog/2024/12/05/react-19

Bundan oldin Aprel oyida beta versiyasi taqdim qilingan edi.

Asosiy o'zgarishlar haqida:

vercel.com/blog/whats-new-in-react-19

admiral-studios.com/blog/react-19-2024-update-will-next-js-lose-its-relevance-what-do-experts-say

#react

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥2😇1
🏠 Copy/Paste/Cut to Clipboard

Biz ko'p foydalanadigan matn'ni nusxalash tugmasi (button) qanday qilinadi ?

Hozirgi yangi browser'larda matn'ni nusxalash uchun Asynchronous Clipboard API'dan foydalanish osonroq

Eski brauzerlarga ham qo'llab-quvvatlash kerak bo'lsa, boshqa yo'llardan foydalangan yaxshiroq, ammo u yo'l biroz murakkab


Asynchronous Clipboard API - clipboard buyruqlariga javob berish imkonini beradi. Masalan: matn'ni qirqib olish, nusqalash va matn'ni joylashtirish (cut, copy vs paste)

*Copy

Nusxalashdan oldin, browser Clipboard API'ni qo'llab-quvvatlaydimi yo'qmi tekshirish kerak
 if (navigator && navigator.clipboard && navigator.clipboard.writeText) return 'true'


Matn'ni nusxalash uchun
navigator.clipboard.writeText("Selected Text");


To'liq kod:
const copyToClipboard = str => {
if (navigator && navigator.clipboard)
return navigator.clipboard.writeText(str);
return Promise.reject('API is not available.');
};


str - nusxalash kerak bo'lgan matn

*Paste

Matn'ni paste qilish uchun .readText() funksiyadan foydalanamiz
navigator.clipboard.readText()


Matn'ni joylashtirish uchun, joylashtirmoqchi bo'lgan input yoki textarea'ga navigator.clipboard.readText() Promise qaytargandan keyin .value qilib joylaymiz.

Masalan:
navigator.clipboard
.readText()
.then(text=>{document.getElementById('outputText').value = text})


*Cut

Matn'ni qirqish uchun .writeText() funksiya'dan foydalanamiz
navigator.clipboard
.writeText(textToCut)
.then(() => { inputField.value = '' })


textToCut - matn

Tekshirish uchun: clipboard-operations.vercel.app

🔗 30secondsofcode.org/js/s/copy-text-to-clipboard/#the-asynchronous-clipboard-api

#javascript #clipboard

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥64👍3
🗂 404 - Not Found Page

Qachonki web sahifa (page) yangilanganda, 404 NOT FOUND error qaytaradi. Bu holat deployment'dan ( Vercel, Netlify va h.k ) keyin sodir bo'ladi.

Menimcha ko'pchilik bu muommo'ga duch kelgan !


Bu error saytingiz React asosida ishlab chiqilgan SPA (Single Page Application) bo'lgani uchun sodir bo'ladi.

Agar saytga root (asosiy) / orqali tashrif buyurilsa, avtomatik ravishda index.html yuklanadi. Keyinchalik boshqa sahifalarga o'zgarganda, index.html sahifasi o'zgarmaydi (faqat tashqi ko‘rinishda sahifa almashadi).

Ammo, agar siz to'g'ridan-to'g'ri shu root sahifalardan birini ochsangiz yoki shu sahifada bo'lganingizda "refresh" qilsangiz (qayta yuklasangiz), web-serverdan ushbu faylni taqdim etishni so'raydi… ammo bu fayl aslida mavjud emas. Shuning uchun siz 404 xatosini olasiz.

* Vercel Deployment

Bu muommoni hal qilish uchun vercel.json yaratib rule configuration yozish kerak
{
"rewrites": [
{"source": "/(.*)", "destination": "/"}
]
}


Bu kod Vercel serveriga har qanday kiruvchi URL manzilini asosiy root yo‘nalishga qayta yozishni buyuradi.

Agar ichki sahifaga o‘tish amalga oshirilsa, Vercel bu so‘rovni root manzilga yo‘naltiradi va xatolikni oldini oladi.

"rewrites" - Bu Vercelda so‘rovlarni qayta yozish qoidalari ro‘yxati
"source": "/(.*) - Bu qism har qanday URL yo‘nalishini anglatadi
"destination": "/" - Har qanday URL so‘rovi asosiy root (index.html) ga yo‘naltiriladi.

* Netlify Deployment

Bu muommoni Netlify deployment'da hal qilish uchun _redirects file yaratib rule configuration yozish kerak
/*    /index.html   200 


* / - barcha URL-larni bildiradi (masalan, /recipeDetails/... yoki boshqa ichki sahifalar).
* Har qanday so‘rov /index.html ga yo‘naltiriladi.
* 200 kodi brauzerga so‘rov muvaffaqiyatli qayta ishlanganini bildiradi.

🔗 dev.to/stanlisberg/resolving-the-vercel-404-page-not-found-error-after-page-refresh-9b9

🔗 answers.netlify.com/t/support-guide-i-ve-deployed-my-site-but-i-still-see-page-not-found/125?utm_source=404page&utm_campaign=community_tracking

🔗 docs.netlify.com/routing/redirects

#react #spa #notFound

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54💯21
Yaxshi dam olinglar

try {
// Some error message
} catch (e) {
window.open(`https://stackoverflow.com/search?q=[js]+${e}`, '_blank');
}


Rasm

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7🔥1👏1
🔥31🤝1
Jasur - IT Blog
Photo
Console'ga nima chiqadi ?
Anonymous Quiz
20%
4
22%
3
39%
0
20%
undefined
🔥5😁21
🗂 Linked List (1- qism)

Linked List - bir-biriga bog‘langan node'lardan iborat chiziqli ma'lumot tuzilmasi (Data Structure) hisoblanadi.

node - bu Linked List'ning qismlari, ya'ni elementlari.

Linked List insertion (yangi element qo'shish) yoki deletion (mavjud elementni olib tashlash) uchun Array'ga nisbatan osonroq va samaraliroq hisoblanadi

Linked List element'lari 2 ta qismga bo'linadi: data vs address

data qismi haqiqiy ma’lumotlarni saqlaydi, address qismi esa keyingi ulangan node'ni manzilini saqlaydi.

Node - bu Linked List'ning asosiy tuzilmasi. U ma'lumotlar'ni va keyingi node manzilini saqlaydi. Node kamida bitta address'ga ega bo‘lishi kerak. Oxirgi node'ning manzil qismida null qiymati bo‘ladi, bu ro‘yxatning tugashini bildiradi.

*Xotiradagi O'zgaruvchi

Butun 15 sonini myNumber o‘zgaruvchiga saqlamoqchimiz va bu son ikki bayt (16 bit) ko‘rinishida saqlanadi. myNumber xotirasidagi manzil 0x7F30 deb faraz qilaylik.

0x7F30 aslida myNumber butun son qiymati saqlanadigan xotiraning ikkita baytining birinchisining manzilidir. Kompyuter butun sonli qiymatni o‘qish uchun 0x7F30 manzil'ga borganida, u birinchi baytni ham, ikkinchi baytni ham o‘qiydi.

⚠️ Kompyuter o'zining arxitekturasiga va o'zgaruvchini e'lon qilgan dastur tiliga qarab, qoidalar va bit'lar o'zgarishi mumkin.


*Xotiradagi massivlar

Array'dagi elementlar xotirada ketma-ket saqlanadi. Shuning uchun, har bir element oldingi elementdan keyin saqlanadi.

myArray = [3,5,13,2] array'ni xotiraga saqlaymiz. myNumber xotiradagi manzil 0x7F28 deb faraz qilaylik.

Kompyuter'da faqat myArray ning birinchi baytining manzili bor, shuning uchun myArray[2] kodi bilan 3-elementga kirish uchun birinchi ikkita butun sondan sakrab o‘tadi. Butun son ikki baytda saqlanadi, shuning uchun u 0x7F28 dan 2x2 bayt oldinga o‘tadi va 0x7F32 manzilidan boshlab 13 qiymatni o‘qiydi.

Address Value
-----------------------
0x7F28 - 3
0x7F29
0x7F30 - 5
0x7F31
0x7F32 - 13
0x7F33

Massivdagi elementlarni olib tashlash yoki qo‘shishda, undan keyin keladigan har bir elementni yangi element uchun joy ochish uchun yuqoriga siljitish yoki olib tashlangan elementning o‘rnini egallash uchun pastga siljitish kerak. Bunday siljish operatsiyalari ko‘p vaqt talab qiladi.

⚠️ Bu real vaqt tizimlarida muammolarni keltirib chiqarishi mumkin.


*Xotiradagi Linked List

Linked List'lardan foydalanishning afzalligi shundaki, node'lar xotirada har qanday bo‘sh joyda saqlanadi, elementlar massivlarda saqlangani kabi node'lar bir-birining ortidan ketma-ket saqlanishi shart emas. node'larni qo‘shish yoki olib tashlashda ro‘yxatdagi qolgan node'larni siljitish shart emas.

Har bir node 4 baytni egallaydi. Butun sonli qiymatni saqlash uchun 2 bayt, ro‘yxatning keyingi node manzilini saqlash uchun esa 2 bayt ishlatiladi.

Linked List'ni birinchi elementi Head, oxirgi elementi Tail deb ataladi.

Linked List'ni yomon taraflari shundaki, biz array'dan foydalanganimizdek, myArray[5] deb yozish orqali node ga to‘g‘ridan-to‘g‘ri kira olmaymiz. Linked List dagi 5-th node ga o‘tish uchun biz head deb nomlangan birinchi node dan boshlashimiz, keyingi node ga o‘tish uchun o‘sha node ning pointer idan foydalanishimiz kerak.

Linked List'ning asosiy 3 ta turi mavjud
*Singly Linked Lists:
Bu eng keng tarqalgan. Har bir node'da ma’lumotlar va keyingi node manzili mavjud.
*Doubly Linked Lists:
Har bir node'ga oldingi node manzilini qo'shamiz. Shunday qilib, biz istalgan yo‘nalishda: oldinga yoki orqaga yurishimiz mumkin.
*Circular Linked Lists:
Bu oxirgi element birinchi element bilan bog‘langan bo'ladi.

Linked List Array'ga nisbatan 2 marta ko'proq xotira egallaydi. Chunki, Linked List har bir node uchun qo‘shimcha pointer (yoki reference) saqlaydi, bu esa qo‘shimcha xotira talab qiladi.


🔗 w3schools.com/dsa/dsa_theory_linkedlists_memory.php

📹 youtu.be/N6dOwBde7-M?si=jEpM9F6RUZjMhs0L

📹 youtube.com/watch?v=WqrbIUggEXQ&t=6155s

#algorithm #linkedList

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥21
🗂 Linked List in Javascript (2- qism)

Yuqorida ta’kidlanganidek, ListNode ikkita elementni o‘z ichiga oladi: ma’lumotlar va keyingi node'ning manzili.

* Node Class & Constructor

LinkedList class yaratishdan oldin, ListNode yaratishimiz kerak. LinkedList'ni tashkil etuvchi node'larni yaratish uchun class Node ishlatiladi.

Har bir node data xossasiga va next xossaga ega bo‘ladi. data xususiyati node'da saqlanadigan ma’lumotlarni saqlaydi. next xususiyat LinkedList'ning keyingi node'ga ishora qiladi.

JavaScriptda ListNode'ni quyidagicha amalga oshirishimiz mumkin:
class Node {
constructor(data) {
this.data = data
this.next = null
}
}


this.data = data - Node class'ga uzatilgan ma’lumotlar joriy obyektning data xususiyatiga saqlanadi.
this.next = null node'ning next xossasiga null'ga o‘rnatadi.

* Linked List Class & Constructor


Endi Node Class'ga ega bo‘lganimiz sababli, biz LinkedList class'ni yaratishimiz mumkin. LinkedList Class head va tail xususiyatlariga ega.

Head - LinkedList'dagi birinchi node'ga ishora qiladi.
Tail - LinkedList'dagi oxirgi node'ga ishora qiladi.

Agar LinkedList bo'sh bo'lsa ya'ni bironta node mavjud bo'lmasa head va tail qiymati null'ga teng bo'ladi

class LinkedList {
constructor() {
this.head = null;
this.tail = null;
}
}


* Yangi node qo'shish

add() method LinkedList'ning oxiriga yangi node qo'shadi. Agar List'ning birinchi elementi (head) null qiymatga ega bo'lsa, yangi node head'ga biriktiriladi. Agar head qiymatga ega bo'lsa, yangi node tail'ga biriktiriladi.

Ushbu usulning time complexity'si O (1) ga teng, chunki u yangi node'ni qo‘shish uchun LinkedList orqali loop o‘tishi shart emas.

add(data) {
const node = new Node(data);

if (this.head === null) {
this.head = node;
} else {
this.tail.next = node;
}

this.tail = node;


* Linked List Loop


PrintAll usuli head node'dan boshlanadi va har bir node orqali tail node'ga yetguncha takrorlanadi.

  printAll() {
let current = this.head;

while (current !== null) {
console.log(current.data);
current = current.next;
}
}


Endi biz buni yangi LinkedList yaratish va unga ba’zi node'larni qo‘shish orqali sinab ko‘rishimiz mumkin.

const list = new LinkedList();

list.add(1);
list.add(2);
list.add(3);
list.add(4);

list.printAll();


* Ma'lum bir index'dagi node'ni olish

get usuli node'ning ma’lumotlarini ko‘rsatilgan indeks'da qaytaradi. U indeks qiymatini qabul qiladi va ko‘rsatilgan indeksdagi node'ga yetib borguncha LinkedList orqali takrorlanadi. Keyin o‘sha node'ning ma’lumotlarini qaytaradi.

Ushbu usulning time complexity'si O(n) ga teng, chunki u ko‘rsatilgan indeksdagi node'ni topish uchun LinkedList orqali o‘tishi kerak.

Massivlar buning uchun yaxshiroq variant, chunki ular istalgan vaqt kirish imkoniyatiga ega. Massivdagi elementga murojaat qilishning time complexity'gi O(1) ga teng.

 get(index) {
let current = this.head;
let i = 0;

while (i < index) {
current = current.next;
i++;
}

return current.data;
}


👨‍💻 github.com/bradtraversy/traversy-js-challenges/blob/main/07-stacks-queues-linked-lists/10-linked-list-implementation/readme.md

📹 youtu.be/ZBdE8DElQQU?si=S2P__kh9HkIO61MT

🔗 freecodecamp.org/news/implementing-a-linked-list-in-javascript

#algorithm #linkedList #js

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83🎉3👍1😁1😇1
🔋 Lazy loading

Lazy loading - bu veb-sahifaning ma’lum qismlarini foydalanuvchi yoki brauzerga kerak bo'lmaguncha yuklamasdan kutib turish (render qilish jarayonini to'xtatib turish)


Hammasini birdaniga yuklash (eager loading) o‘rniga, brauzer ba’zi resurslarni faqat foydalanuvchiga kerak sahifa bilan o‘zaro aloqaga kirishgandan keyin so‘raydi.

Agar Lazy loading to‘g‘ri amalga oshirilsa, sahifaning yuklanish tezligini oshirishga yordam beradi.

Bu turdagi yuklash 'dangasa' (lazy) deb ataladi, chunki u brauzerni ishini kechiktirishga undaydi.

Masalan, blog postda sahifaning yuqori qismida rasm, pastki qismida diagramma bor deb faraz qilaylik. Blog postini o‘qiyotgan foydalanuvchi bir necha daqiqa davomida matnning pastki qismiga yetib bormasligi mumkin, shuning uchun brauzer foydalanuvchi o‘sha bo‘limga o‘tmaguncha diagrammani yuklashni kutadi. Shunday qilib, sahifa dastlab tezroq yuklanadi, chunki brauzer ikkita rasm o‘rniga bitta rasm yuklamoqda.

Veb-sahifa yuklanganda, foydalanuvchi ko‘rayotgan qismi 'yuqori qism' (above the fold) deb ataladi, foydalanuvchi hali ko‘rmayotgan qismi esa 'quyi qism' (below the fold) deb ataladi.

"above the fold" va "below the fold" gazeta maketlaridan kelib chiqqan. Gazetalar, odatda, gorizontal bo‘yicha ikkiga buklangan, oldingi yarmi esa buklangan joydan yuqorida joylashgan bo‘ladi.


* Rasmlar uchun lazy loading amalga oshirish

Lazy loading-ni amalga oshirishning bir usuli — bu img tegida loading atributidan foydalanish. Quyidagi misolda ko‘rsatilganidek, loading="lazy" qo‘shish brauzerga foydalanuvchi rasmga yaqinlashguncha uni yuklamaslikni buyuradi

<img src="example.com/image" loading="lazy">


* Eager loading nima ?


Eager loading — bu barcha veb-sahifa resurslarini bir vaqtning o‘zida yuklash jarayoni. Murakkab va kodi ko‘p bo‘lgan veb-ilovalar, masalan, onlayn o‘yinlar, ko‘pincha eager loading'dan foydalanishni afzal ko‘radi.

<img src="example.com/image" loading="eager">


loading="eager" atributidan foydalanildi, bu esa rasmni darhol yuklashni ta'minlaydigan standart hisoblanadi. Bu, darhol ko'rilishi kerak bo'lgan muhim rasmlar uchun ishlatilinadi.

image tag'da default holatda loading attribute qiymati eager bo'ladi

🔗 cloudflare.com/learning/performance/what-is-lazy-loading

⚙️ React Lazy Loading

React'da component dinamik tarzda yuklanish uchun, React.lazy funksiyasi ishlatilinadi

Odatda, Lazy loading React ilovalarida ko'p ishlatilmaydi, chunki React ko'pincha bitta sahifali ilovalar (SPA) yaratish uchun ishlatiladi. React odatda butun ilovani bitta faylga birlashtiradi (bundle qiladi).

Misol: Lazy Loading Component
import React, { Suspense } from "react";

const LazyComponent = React.lazy(() => import("./LazyComponent"));

function App() {
return (
<div>
<h1>Welcome to My App</h1>
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
</div>
);
}

export default App;


React.lazy faqat LazyComponent render qilinganda dinamik ravishda import qiladi.

Suspense fallback komponent yuklanayotgan paytda zaxira UI taqdim etadi (loader).

📹 youtu.be/KcbPpVeDqKA?si=2_eFmDXsVeC3--AR

⚙️ Angular Lazy Loading

Default holatda, NgModul'lar tezda yuklanadi. Bu shuni anglatadiki, ilova yuklanganda, barcha NgModul'lar darhol yuklanadi, ular hozirgi vaqtda zarur yoki yo'qligiga qaramay.

Lazy loading dastlabki paket (bundle) o'lchamlarini kichikroq saqlashga yordam beradi, bu esa yuklash vaqtlarini qisqartirishga yordam beradi.

Angular modullarini lazy loading qilish uchun AppRoutingModule routing konfiguratsiyasida component o'rniga loadChildren'dan foydalaniladi

const routes: Routes = [
{
path: 'items',
loadChildren: () => import('./items.module').then(m => m.ItemsModule)
}
];


🔗 v17.angular.io/guide/lazy-loading-ngmodules

📹 youtu.be/NFJbXP6Ci98?si=tutzScmyavxQbYim

#lazyLoading #react #angular

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍32
⚙️ Kichik Experiment

React component'ni Angular project'da ishlatib ko'rdim.


React kutubxonani o'rnatib olamiz
npm install react react-dom


* package.json
{
.....
"react": "^19.1.0",
"react-dom": "^19.1.0",
.....
}


TypeScript bilan ishlash uchun kerakli @type kutubxonalarni ham o‘rnatamiz
npm install --save-dev @types/react @types/react-dom


* tsconfig.json
{
"compilerOptions": {
"jsx": "react"
}
}


React component yaratamiz (e.g. src/react/HelloReact.tsx)

import React from 'react';

const HelloReact = () => {
return <div>Hello from React!</div>;
};

export default HelloReact;


Yaratilgan React component'ni DOM'ga joylashtirish (render qilish) uchun ReactWrapper funksiya yozamiz.

import React from 'react';
import ReactDOM from 'react-dom/client';
import HelloReact from './HelloReact';

export function renderReactComponent(container: HTMLElement) {
const root = ReactDOM.createRoot(container);
root.render(<HelloReact />);
}


Bu funksiyada ReactDOM.createRoot() orqali React komponentini render qilamiz. React o‘zining virtual DOM mexanizmi yordamida HelloReact komponentini HTML elementga aylantiradi.

@Component({
selector: 'app-react-wrapper',
template: `<div id="react-root"></div>`,
standalone: true,
})

export class ReactWrapperComponent implements AfterViewInit {
constructor(private elRef: ElementRef) {}

ngAfterViewInit() {
const container = this.elRef.nativeElement.querySelector('#react-root');
renderReactComponent(container);
}
}


ReactWrapperComponent vazifasi, Render qiling React component'ni Angular componentda ochilgan <div id="react-root"></div>'ga joylash.

AfterViewInit — bu Angular lifecycle metodi hisoblanadi. Uning vazifasi - ngAfterViewInit funksiyasi ichidagi kodlarni komponentning barcha view elementlari to‘liq render qilingandan keyin ishga tushirishdir.

AfterViewInit - angular.dev/api/core/AfterViewInit

Hosil bo'lgan Angular component'ni istalgan joy'da foydalana olamiz
<app-react-wrapper></app-react-wrapper>


🔗 medium.com/@zacky_14189/embedding-react-components-in-angular-the-easy-way-60f796b68aef

#react #angular

💠 @jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍32😁1
🗂 Cache Busting in React / Vite

React projectda frontend’ga yangi feature (xususiyat) qo‘shdim va saytni deploy qildim. Lekin ayrim brauzerlarda eski versiya chiqib qolmoqda. Bu holat caching muammosi bilan bog‘liq

Frontend loyihalar (masalan, React) yangilanganda, foydalanuvchilarning brauzeri ko‘pincha eski fayllarni keshlangan (cache) holatda saqlab qoladi.


Brauzer har doim har bir faylni qayta yuklab olish o‘rniga, uni bir marta yuklab olgach, keyingi marta site'ga kirilganda aynan o‘sha faylni cache’dan olib foydalanadi.

Muammo shundaki, loyiha build qilinganda fayllar yangilansa ham, ularning nomi (main.js kabi) o‘zgarmasligi mumkin. Natijada foydalanuvchi sayt'ga kirganda, brauzer fayl nomi bir xil bo‘lgani uchun uni eski versiyadan – ya’ni cache’dan olib ishlatadi. Shuning uchun yangi o‘zgarishlar ko‘rinmaydi.

"Cache Busting" — bu yangi fayllarni avtomatik ravishda yangi nom bilan yaratish usuli. Har safar build qilinganda fayl nomiga hash qo‘shiladi, hash bu raqam va harflar'dan tashkil topgan birikma. Project har build qilinganda, o'zgarish kiritilgan file'da hash o'zgaradi

Masalan:
main.js → main.a3f5s3.js


Shunda brauzer bu faylni yangi fayl deb biladi va cache o‘rniga yangisini yuklaydi.

React (Vite) loyihada, vite.config.ts fayl'dagi build'ga rollupOptions qo'shish orqali Cache Busting qilish mumkin:

export default defineConfig({
build: {
outDir: 'dist',
assetsDir: 'assets',
rollupOptions: {
output: {
entryFileNames: 'assets/[name].[hash].js',
chunkFileNames: 'assets/[name].[hash].js',
assetFileNames: 'assets/[name].[hash].[ext]',
},
},
},
})


Bu konfiguratsiya har bir faylni hash bilan nomlaydi, shunda brauzer eskisini emas, yangisini yuklaydi.

🔗 keycdn.com/support/what-is-cache-busting

🔗 maxtsh.medium.com/the-ultimate-guide-to-cache-busting-for-react-production-applications-d583e4248f02

#reactjs #vite #cache #busting

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥421
⚙️ Angular Modules vs Standalone Components

Angular'da komponentlar ikkita asosiy usul bilan ishlatiladi:
* Module'lar orqali
* Standalone component'lar orqali

Angular Modules (Modullar)


Modul
- bu bir nechta komponent yoki servise'larni bir joyga jamlaydigan konteyner.

@NgModule({
declarations: [MyComponent],
exports: [MyComponent]
})
export class MyModule {}


* Har bir komponent avval modulga declarations orqali qo‘shiladi.
* Qo'shilgan component'dan boshqa joyda foydalanish uchun imports orqali chaqiriladi.

Agar komponent declarations'ga qo‘shilgan bo‘lsa, uni faqat o‘sha modul ichida ishlatish mumkin. Uni boshqa modul'da ishlatish uchun, export qilingan bo‘lishi va modul import qilingan bo‘lishi kerak.


Standalone Components ( Mustaqil komponentlar )

Standalone component'lar Angular 14 versiyada qo'shilgan bo'lib, standalone komponent o‘zini o‘zi boshqaroladi - unga modul kerak emas.

Istagan boshqa komponentni React komponent'lariga o‘xshab to‘g‘ridan-to‘g‘ri imports qilib ishlatsa bo‘ladi.

@Component({
standalone: true,
selector: 'app-hello',
template: '<p>Hello!</p>',
imports: [CommonModule]
})
export class HelloComponent {}


React:
import Card from './Card'


Angular:
imports: [CardComponent]


React component'lar ham standalone component hisoblanadi


Qulay tarafi: Tezroq ishlaydi, kod kamroq, soddaroq
Kamchiligi: Katta loyihalarda boshqaruv biroz murakkab bo‘lishi mumkin

🔗 medium.com/@ausaf.cs/angular-modules-vs-standalone-components-a-detailed-comparison-7b28c803cdd2

🔗 lynkz.com.au/blog/2024-angular-standalone-vs-modules

#angular #standalone #module

@jasurkh_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3🔥3