<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Ubaydullo Ibrohimov Blogi]]></title><description><![CDATA[O'ylar, g'oyalar va yangiliklar ...]]></description><link>https://ubaydullo.digitalpress.blog/</link><image><url>https://ubaydullo.digitalpress.blog/favicon.png</url><title>Ubaydullo Ibrohimov Blogi</title><link>https://ubaydullo.digitalpress.blog/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Mon, 11 May 2026 03:07:34 GMT</lastBuildDate><atom:link href="https://ubaydullo.digitalpress.blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Monitoring Stack Setup: Grafana, Prometheus, and Node Exporter]]></title><description><![CDATA[<p><strong>Overview</strong><br>Grafana, Prometheus, and Node Exporter are popular open-source tools for monitoring system performance. Prometheus collects and stores metrics, Node Exporter provides system-level metrics, and Grafana visualizes this data through beautiful, customizable dashboards.</p><p><strong>How They Work Together</strong></p><ol><li><strong>Node Exporter</strong> gathers metrics (CPU, memory, disk usage, etc.) from your systems.</li><li><strong>Prometheus</strong></li></ol>]]></description><link>https://ubaydullo.digitalpress.blog/setting-up-grafana-dashboards/</link><guid isPermaLink="false">66a12ab48fd4bd0001a570ec</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Wed, 06 Nov 2024 05:30:41 GMT</pubDate><content:encoded><![CDATA[<p><strong>Overview</strong><br>Grafana, Prometheus, and Node Exporter are popular open-source tools for monitoring system performance. Prometheus collects and stores metrics, Node Exporter provides system-level metrics, and Grafana visualizes this data through beautiful, customizable dashboards.</p><p><strong>How They Work Together</strong></p><ol><li><strong>Node Exporter</strong> gathers metrics (CPU, memory, disk usage, etc.) from your systems.</li><li><strong>Prometheus</strong> scrapes these metrics from Node Exporter at specified intervals and stores them.</li><li><strong>Grafana</strong> connects to Prometheus, pulling in the stored metrics to create dashboards for easy visualization.</li></ol><p><strong>Step-by-Step Setup</strong></p><h3 id="1-install-node-exporter">1. Install Node Exporter</h3><ul><li>Download Node Exporter:</li></ul><pre><code class="language-bash">wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
</code></pre><ul><li>Extract and run Node Exporter:</li></ul><pre><code class="language-bash">tar xvfz node_exporter-1.5.0.linux-amd64.tar.gz
cd node_exporter-1.5.0.linux-amd64
./node_exporter
</code></pre><ul><li>Access Node Exporter metrics at <code>http://&lt;your_server_ip&gt;:9100/metrics</code>.</li></ul><h3 id="2-install-prometheus">2. Install Prometheus</h3><ul><li>Download Prometheus:</li></ul><pre><code class="language-bash">wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
</code></pre><ul><li>Extract and configure Prometheus:</li></ul><pre><code class="language-bash">tar xvfz prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64
</code></pre><ul><li>Edit <code>prometheus.yml</code> to add your Node Exporter as a target:</li></ul><pre><code class="language-yaml">scrape_configs:
  - job_name: &apos;node_exporter&apos;
    static_configs:
      - targets: [&apos;localhost:9100&apos;]  # Replace with your Node Exporter address
</code></pre><ul><li>Start Prometheus:</li></ul><pre><code class="language-bash">./prometheus --config.file=prometheus.yml
</code></pre><ul><li>Access Prometheus at <code>http://&lt;your_server_ip&gt;:9090</code>.</li></ul><h3 id="3-install-grafana">3. Install Grafana</h3><ul><li>Download and install Grafana using your package manager:</li></ul><pre><code class="language-bash">sudo apt-get install -y grafana  # for Debian/Ubuntu
</code></pre><ul><li>Start Grafana:</li></ul><pre><code class="language-bash">sudo systemctl start grafana-server
sudo systemctl enable grafana-server
</code></pre><ul><li>Access Grafana at <code>http://&lt;your_server_ip&gt;:3000</code>.</li></ul><h3 id="4-connect-grafana-to-prometheus">4. Connect Grafana to Prometheus</h3><ul><li>Log in to Grafana (default user/password: <code>admin/admin</code>).</li><li>Go to <strong>Configuration &gt; Data Sources</strong> and select <strong>Prometheus</strong>.</li><li>Enter your Prometheus URL (e.g., <code>http://localhost:9090</code>) and save.</li></ul><h3 id="5-create-a-dashboard-in-grafana">5. Create a Dashboard in Grafana</h3><ul><li>Go to <strong>Dashboards &gt; New Dashboard</strong>.</li><li>Choose <strong>Add Query</strong> and select Prometheus as the data source.</li><li>Enter a metric (e.g., <code>node_cpu_seconds_total</code>), apply, and save the panel.</li></ul><p><strong>Conclusion</strong><br>With this setup, Prometheus will regularly collect metrics from Node Exporter, and Grafana will visualize these metrics. This setup is efficient for monitoring the health and performance of your servers.</p><hr><p></p><p> </p>]]></content:encoded></item><item><title><![CDATA[System calls in OS]]></title><description><![CDATA[<h1 id="system-calls-in-operating-system-os">System Calls in Operating System (OS)</h1><p>A system call is a way for a user program to interface with the operating system. The program requests several services, and the OS responds by invoking a series of system calls to satisfy the request. A system call can be written in assembly</p>]]></description><link>https://ubaydullo.digitalpress.blog/system-calls-in-os/</link><guid isPermaLink="false">66c82e93994ffc0001c86d19</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Fri, 23 Aug 2024 06:40:22 GMT</pubDate><content:encoded><![CDATA[<h1 id="system-calls-in-operating-system-os">System Calls in Operating System (OS)</h1><p>A system call is a way for a user program to interface with the operating system. The program requests several services, and the OS responds by invoking a series of system calls to satisfy the request. A system call can be written in assembly language or a high-level language like <strong><strong>C</strong></strong> or <strong><strong>Pascal</strong></strong>. System calls are predefined functions that the operating system may directly invoke if a high-level language is used.</p><p>In this article, you will learn about the system calls in the operating system and discuss their types and many other things.</p><h2 id="what-is-a-system-call">What is a System Call?</h2><p>A system call is a method for a computer program to request a service from the kernel of the <a href="https://www.javatpoint.com/os-tutorial">operating system</a> on which it is running. A system call is a method of interacting with the operating system via programs. A system call is a request from computer software to an operating system&apos;s kernel.</p><p>The <strong><strong>Application Program Interface (API)</strong></strong> connects the operating system&apos;s functions to user programs. It acts as a link between the operating system and a process, allowing user-level programs to request operating system services. The kernel system can only be accessed using system calls. System calls are required for any programs that use resources.</p><h2 id="how-are-system-calls-made">How are system calls made?</h2><p>When a computer software needs to access the operating system&apos;s kernel, it makes a system call. The system call uses an API to expose the operating system&apos;s services to user programs. It is the only method to access the kernel system. All programs or processes that require resources for execution must use system calls, as they serve as an interface between the operating system and user programs.</p><p>Below are some examples of how a system call varies from a user function.</p><ol><li>A system call function may create and use kernel processes to execute the asynchronous processing.</li><li>A system call has greater authority than a standard subroutine. A system call with kernel-mode privilege executes in the kernel protection domain.</li><li>System calls are not permitted to use shared libraries or any symbols that are not present in the kernel protection domain.</li><li>The code and data for system calls are stored in global kernel memory.</li></ol><p>Follow the link below to visit actual post:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.javatpoint.com/system-calls-in-operating-system"><div class="kg-bookmark-content"><div class="kg-bookmark-title">System Calls in Operating System (OS) - javatpoint</div><div class="kg-bookmark-description">System Calls in Operating System (OS) with OS Tutorial, Types of OS, Process Management Introduction, Attributes of a Process, CPU Scheduling, FCFS with overhead, FCFS Scheduling etc.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://static.javatpoint.com/images/favicon2.png" alt><span class="kg-bookmark-author">www.javatpoint.com</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://static.javatpoint.com/images/logo/jtp-logo3.png" alt></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Python dekoratorlar]]></title><description><![CDATA[<blockquote>Dekorator bu bir funksiyani olib uning asosiy logikasiga tegmasdan xususiyatlarini oshirib beradigan funksiya. </blockquote><p>Dekorator nimaligini yaxshi tushinish uchun avval funksiya nimaligin yaxshi tushunib olish kerak. Funksiya berilgan argumentlarga asoslanib qiymat qaytaradi. Bunga eng sodda misol:</p><!--kg-card-begin: html--><pre><code>
&gt;&gt;&gt; def add_one(number):
...	return number + 1
&gt;&gt;&gt; add_one(</code></pre>]]></description><link>https://ubaydullo.digitalpress.blog/python-decoratorlar/</link><guid isPermaLink="false">63d9ea4cc513ae0001d8780f</guid><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Wed, 01 Feb 2023 05:28:26 GMT</pubDate><content:encoded><![CDATA[<blockquote>Dekorator bu bir funksiyani olib uning asosiy logikasiga tegmasdan xususiyatlarini oshirib beradigan funksiya. </blockquote><p>Dekorator nimaligini yaxshi tushinish uchun avval funksiya nimaligin yaxshi tushunib olish kerak. Funksiya berilgan argumentlarga asoslanib qiymat qaytaradi. Bunga eng sodda misol:</p><!--kg-card-begin: html--><pre><code>
&gt;&gt;&gt; def add_one(number):
...	return number + 1
&gt;&gt;&gt; add_one(4)
5
</code></pre><!--kg-card-end: html--><p>Pythonda funksiyalar birinchi klass obyektlari hisoblanadi. Yani funksiyalar xuddi boshqa Python obyektlari (int, list, tuple, str va h.kz) kabi boshqa funksiyalar uchun argument sifatida berilishi, o&apos;zgaruvshiga biriktirilishi mumkin.</p><p>Funksiyalar ichma ich yozilishi ham mumkin, shu qatorda bir funksiya o&apos;zining ichidagi boshqa bir funksiyani chaqirishi ham mumkin.</p><!--kg-card-begin: html--><pre><code>
def parent():
    print(&quot;Printing from the parent() function&quot;)

    def first_child():
        print(&quot;Printing from the first_child() function&quot;)

    def second_child():
        print(&quot;Printing from the second_child() function&quot;)

    second_child()
    first_child()
</code></pre><!--kg-card-end: html--><p>Parent funksiyani chaqirganda nima bo&apos;lishiga nazar soling:</p><!--kg-card-begin: html--><pre><code>
&gt;&gt;&gt; parent()
Printing from the parent() function
Printing from the second_child() function
Printing from the first_child() function
</code></pre><!--kg-card-end: html--><p>Ko&apos;rib turganingizdek parent ichidagi funksiyalarning yozilish ketma ketligi ahamiyatga ega emas, ularni chaqirilish ketma ketligi muhimdir.</p><p>Bir funksiya boshqa funksiyani qaytarishiga misol ko&apos;ramiz.</p><!--kg-card-begin: html--><pre><code>
def parent(num):
    def first_child():
        return &quot;Hi, I am Emma&quot;

    def second_child():
        return &quot;Call me Liam&quot;

    if num == 1:
        return first_child
    else:
        return second_child
</code></pre><!--kg-card-end: html--><p>Etibor bergan bo&apos;lsangiz bu yerda funksiyalar oxirida qavs qo&apos;yilmasdan qaytarilmoqda, bu degani biz chunchaki funksiyaga havola qaytarayapmiz. Parent funksiya qabul qilayotgan num argumentga asoslanib bir ikki ichki funksiyadan biriga havola olishimiz mumkin:</p><!--kg-card-begin: html--><pre><code>
&gt;&gt;&gt; first = parent(1)
&gt;&gt;&gt; second = parent(2)

&gt;&gt;&gt; first
function parent.<locals>.first_child at 0x7f599f1e2e18&gt;

&gt;&gt;&gt; second
function parent.<locals>.second_child at 0x7f599dad5268&gt;
</locals></locals></code></pre><!--kg-card-end: html--><h2 id="eng-sodda-dekorator">Eng sodda dekorator</h2><p>Misol:</p><!--kg-card-begin: html--><pre><code>
def my_decorator(func):
    def wrapper():
        print(&quot;Something is happening before the function is called.&quot;)
        func()
        print(&quot;Something is happening after the function is called.&quot;)
    return wrapper

def say_whee():
    print(&quot;Whee!&quot;)

say_whee = my_decorator(say_whee)
</code></pre><!--kg-card-end: html--><p>Nima deb o&apos;ylaysiz say_wee() funksiyasini chaqirganda nima sodir bo&apos;ladi ? Sinab ko&apos;ramiz: </p><!--kg-card-begin: html--><pre><code>
&gt;&gt;&gt; say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.
</code></pre><!--kg-card-end: html--><p>Etibor bergan bo&apos;lsangiz bu yerda hechqanaqa yangilik yo&apos;q, yuqorida hozirgina o&apos;rgangan bilimlarimiz orqali sodda dekorator yasadik.</p><p>Shunday funksiyani dekoratorga olish ushbu qatorda sodir bo&apos;layapti:</p><!--kg-card-begin: html--><pre><code>
say_whee = my_decorator(say_whee)
</code></pre><!--kg-card-end: html--><p><code>say_wee()</code> funksiya bu yerda <code>my_decorator()</code> funksiyasiga argument sifatida berilayapti, <code>my_decorator()</code> bo&apos;lsa <code>wrapper</code> funksiyasini qavslarsi chaqirib qo&apos;yayapti, yani shu orqali biz <code>my_decorator()</code> &#xA0;ichidagi <code>wrapper()</code> funksiyasiga murojaat qilayapmiz, <code>wrapper()</code> funksiyasi esa bizning decoratorga argument sifatida berilgan funksiyamizni qaytarayapti:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; say_whee
function my_decorator.<locals>.wrapper at 0x7f3c5dfd42f0&gt;
</locals></code></pre><!--kg-card-end: html--><p>Sodda qilib aytganda: <strong>Decorator bu funksiyaning asosiy xususiyatini o&apos;zgartirmasdan uni o&apos;rab turadigan boshqa bir funksiya ekan.</strong></p><p>Davom etishdan oldin, yana bir misolga nazar solamiz. <code>wrapper()</code> funksiya ham odatiy Python funksiya bo&apos;lganligi uchun uni xususiyati ham dinamik o&apos;zgarishi mumkin. Qo&apos;shnilarni bezovta qilmaslik uchun <code>say_wee()</code> funksiyamizni faqat kunduz kun ishlaydigan qilamiz:</p><!--kg-card-begin: html--><pre><code>from datetime import datetime

def not_during_the_night(func):
    def wrapper():
        if 7 <= datetime.now().hour < 22: func() else: pass # hush, the neighbors are asleep return wrapper def say_whee(): print("whee!") say_whee="not_during_the_night(say_whee)" code></=></code></pre><!--kg-card-end: html--><p>Endi <code>say_wee()</code> funksiyasini kech soat 10 dan ertalab soat 7 gacha bo&apos;lgan vaqtda chaqirsangiz u Wee! demaydi )):</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; say_whee()
&gt;&gt;&gt;
</code></pre><!--kg-card-end: html--><p><code>say_wee()</code> funksiyasini dekoratorga olishda etirbor bergan bo&apos;lsangiz birinchidan `say_wee` deb uch marta yozishga to&apos;g&apos;ri keldi, ikkinchidan bizga bir qaraganda yozgan kodimizda dekorator qatnashganligini anglab olish qiyin sababi odatiy ikkita Python funksiya yozdik. Ishimizni osonlashtirish va dekoratorni dekorator sifatida ajratib ko&apos;rsatish uchun Pythonda @ ( odatda &quot;pie sytax&quot; deb nomlanadi) dan foydalanamiz. Ushbu misol yuqorida ko&apos;rgan misolimiz bilan bir xil ishlaydi:</p><!--kg-card-begin: html--><pre><code>def my_decorator(func):
    def wrapper():
        print(&quot;Something is happening before the function is called.&quot;)
        func()
        print(&quot;Something is happening after the function is called.&quot;)
    return wrapper

@my_decorator
def say_whee():
    print(&quot;Whee!&quot;)
</code></pre><!--kg-card-end: html--><p><code>@my_decorator</code> bu <code>say_wee = my_decorator(say_wee)</code> deb yozishning osonroq usuli.</p><h2 id="dekoratorlardan-qayta-foydalanish">Dekoratorlardan qayta foydalanish.</h2><p>Dekoratorlar ham boshqa Python funksiyalari kabi oddiy funksiya, shunday ekan undan oson foydalanish uchun bizda barcha qurollar yetarli. Dekoratorlardan qayta foydalana olish uchun <code>decorators.py</code> fayl yarating va shu fayl ichida:</p><!--kg-card-begin: html--><pre><code>def do_twice(func):
    def wrapper_do_twice():
        func()
        func()
    return wrapper_do_twice
</code></pre><!--kg-card-end: html--><p>Endi boshqa bir faylda ushbu dekoratorni import qilib ishlatishimiz mumkin:</p><!--kg-card-begin: html--><pre><code>from decorators import do_twice

@do_twice
def say_whee():
    print(&quot;Whee!&quot;)
</code></pre><!--kg-card-end: html--><p>Ushbu misolni ishga tushirganda <code>say_whee()</code> ikki marta ishga tushganini guvohi bo&apos;lishingiz mumkin:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; say_whee()
Whee!
Whee!
</code></pre><!--kg-card-end: html--><h2 id="funksiyalarga-argument-bergan-holda-dekoratorga-olish">Funksiyalarga argument bergan holda dekoratorga olish.</h2><p>Tasavvur qilaylik bizning funksiyamiz argumentlar qabul qiladi, biz uni dekoratorga ololamizmi ? Sinab ko&apos;ramiz:</p><!--kg-card-begin: html--><pre><code>from decorators import do_twice

@do_twice
def greet(name):
    print(f&quot;Hello {name}&quot;)
</code></pre><!--kg-card-end: html--><p>Afsuskiy bu kodni ishga tushirish xatolikka olib keldi:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; greet(&quot;World&quot;)
Traceback (most recent call last):
  File &quot;<stdin>&quot;, line 1, in <module>
TypeError: wrapper_do_twice() takes 0 positional arguments but 1 was given
</module></stdin></code></pre><!--kg-card-end: html--><p>Muammo shundaki dekoratorning <code>wrapper_do_twice()</code> funksiyasi argument olmaydi, demak ushbu funksiyaga bitta argument oladigan qilish yetarli. Ammo ushbu xolatda boshqa bir bir nechta argument oladigan, yoki umuman argument olaydigan funksiyalarni ushbu dekoratorga ololmay qolamiz. Shu sababli <code>*args, **kwargs</code> juftligidan foydalanamiz:</p><pre><code>def do_twice(func):
    def wrapper_do_twice(*args, **kwargs):
        func(*args, **kwargs)
        func(*args, **kwargs)
    return wrapper_do_twice</code></pre><p>Endi <code>wrapper</code> funksiya istalgancha argument ololadi, yoki umuman argument olmasligi ham mumkin, argument olgan taqdirda o&apos;zi <code>wrap</code> qilayotgan funksiyaga argumentlarni yetkazib beradi. Shu orqali yuqorida dekoratorga olingan ikki funksiyamiz ham ishlaydi:</p><pre><code>&gt;&gt;&gt; say_whee()
Whee!
Whee!

&gt;&gt;&gt; greet(&quot;World&quot;)
Hello World
Hello World</code></pre><h2 id="dekoratorga-olingan-funksiyalardan-qiymat-olish">Dekoratorga olingan funksiyalardan qiymat olish.</h2><p>Dekoratorga olingan funksiyalardan qaytayotgan qiymatlar qayerga ketadi ? Albatta buni dekorator hal qiladi. Ushbu sodda dekoratorga olinga funksiyani misol qilib ko&apos;ramiz:</p><pre><code>from decorators import do_twice

@do_twice
def return_greeting(name):
    print(&quot;Creating greeting&quot;)
    return f&quot;Hi {name}&quot;</code></pre><p>Ishlatib ko&apos;ramiz:</p><pre><code>&gt;&gt;&gt; hi_adam = return_greeting(&quot;Adam&quot;)
Creating greeting
Creating greeting
&gt;&gt;&gt; print(hi_adam)
None</code></pre><p>Afsuskiy <code>None</code> yani hechnarsa qaytmadi.</p><p>Sababi <code>wrapper_do_twice</code> hech narsa qaytarmayapti, u shunchaki o&apos;zining berilgan funksiyani chaqirib qo&apos;yayapti xolos. Buni to&apos;g&apos;rilash uchun biz <code>wrapper_do_twice</code> berilgan funksiyani qaytaradigan qilishimiz kerak:</p><pre><code>def do_twice(func):
    def wrapper_do_twice(*args, **kwargs):
        func(*args, **kwargs)
        return func(*args, **kwargs)
    return wrapper_do_twice</code></pre><p>Endi qaytariladigan qiymatda oxirgi <code>return</code> qilingan funksiyaning qiymati qaytadi:</p><pre><code>&gt;&gt;&gt; return_greeting(&quot;Adam&quot;)
Creating greeting
Creating greeting
&apos;Hi Adam</code></pre><h2 id="dekoratorga-olingan-funksiya-aslida-qaysi-funksiya">Dekoratorga olingan funksiya aslida qaysi funksiya ?</h2><p>Pythondagi eng katta qulayliklardan biri bu Python shellning mavjudligi va unda istalgan Python obyektni introspeksiya qila olishdir. Intorspeksiya bu obyektning o&apos;zining barcha attributlari haqida va runtaymi haqida malumotlarini ko&apos;rishdir. Misol uchun funksiya o&apos;zining nomi va dokumentatsiyasini o&apos;zida saqlaydi:</p><pre><code>&gt;&gt;&gt; print
&lt;built-in function print&gt;

&gt;&gt;&gt; print.__name__
&apos;print&apos;

&gt;&gt;&gt; help(print)
Help on built-in function print in module builtins:

print(...)
    &lt;full help message&gt;</code></pre><p>Introspeksiya esa siz yozgan funksiyalar uchun ham ishlaydi:</p><pre><code>&gt;&gt;&gt; say_whee
&lt;function do_twice.&lt;locals&gt;.wrapper_do_twice at 0x7f43700e52f0&gt;

&gt;&gt;&gt; say_whee.__name__
&apos;wrapper_do_twice&apos;

&gt;&gt;&gt; help(say_whee)
Help on function wrapper_do_twice in module decorators:

wrapper_do_twice()</code></pre><p>Etibor bersangiz <code>say_wee</code> funksiya dekoratorga olingandan keyin o&apos;zining kimligini unutib qo&apos;ygan ko&apos;rinadi. U o&apos;zini <code>do_twice</code> dekoratori ichidagi <code>wrapper_do_twice</code> funksiyasi deb o&apos;ylayapti, mantiqan to&apos;g&apos;ri lekin biz uchun foydali malumot emas.</p><p>Bu xolatni to&apos;g&apos;rilash uchun <code>wrapper_do_twice</code> funksiyamizni ham <code>@funktools.wraps</code> dekoratoriga olamiz, bu bizga <code>wrapper_do_twice</code> ichidagi funksiyaning o&apos;z malumotlarini o&apos;zgarmasdan saqlanib qolishini ta&apos;minlaydi.</p><pre><code>import functools

def do_twice(func):
    @functools.wraps(func)
    def wrapper_do_twice(*args, **kwargs):
        func(*args, **kwargs)
        return func(*args, **kwargs)
    return wrapper_do_twice</code></pre><p><code>say_wee</code> funksiyani o&apos;zgartirishning xojati yo&apos;q.</p><pre><code>&gt;&gt;&gt; say_whee
&lt;function say_whee at 0x7ff79a60f2f0&gt;

&gt;&gt;&gt; say_whee.__name__
&apos;say_whee&apos;

&gt;&gt;&gt; help(say_whee)
Help on function say_whee in module whee:

say_whee()</code></pre><p>:), dekoratorga olingandan keyin ham funksiya o&apos;z malumotlarini saqlab qoldi!</p><p>Kelajakdagi kodlaringiz uchun dekorator skeletoni, osh bo&apos;lsin:</p><pre><code>import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper_decorator(*args, **kwargs):
        # Do something before
        value = func(*args, **kwargs)
        # Do something after
        return value
    return wrapper_decorator</code></pre>]]></content:encoded></item><item><title><![CDATA[Python [Inheritance, Incapsulation, Polymprphism]]]></title><description><![CDATA[<p></p><h2 id="python-inheritance-pythonda-meros-olish">Python Inheritance - Pythonda &quot;meros olish&quot;</h2><p>Inheritance yani meros olish bu, biror asosiy klassdan boshqa bir maxsus klass yaratish, shu blan birga asosiy klassning barcha metod va attributlarini o&apos;zida jam qilish.</p><p>UML da inheritance ushbu ko&apos;rinishda namoyon bo&apos;ladi:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/05/image.png" class="kg-image" alt loading="lazy" width="242" height="343"></figure><p>Python-da hamma narsa obyektdir.</p>]]></description><link>https://ubaydullo.digitalpress.blog/python-inheritance-incapsulation-polymprphism/</link><guid isPermaLink="false">6278bcd7eed1090001a057c4</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Mon, 09 May 2022 07:37:58 GMT</pubDate><content:encoded><![CDATA[<p></p><h2 id="python-inheritance-pythonda-meros-olish">Python Inheritance - Pythonda &quot;meros olish&quot;</h2><p>Inheritance yani meros olish bu, biror asosiy klassdan boshqa bir maxsus klass yaratish, shu blan birga asosiy klassning barcha metod va attributlarini o&apos;zida jam qilish.</p><p>UML da inheritance ushbu ko&apos;rinishda namoyon bo&apos;ladi:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/05/image.png" class="kg-image" alt loading="lazy" width="242" height="343"></figure><p>Python-da hamma narsa obyektdir. Modullar obyekt, klasslar va funktsiyalar obyektlardir va albatta, klasslardan yaratilgan obyektlar ham obyektlardir.</p><p>Inheritance har qanday OO dasturlash tilining asosiy xususiyatidir. Python bir vaqtning o&apos;zida bir nechta inheritance amalga oshira oladigan sanoqli dasturlash tillaridan biridir.</p><p>Pythonda yangi klass yaratganimizda ham beihtiyor inheritance ni ham ishlatamiz. Keling bu nimani anglatishini ko&apos;rib chiqamiz:</p><p>Python shellni ochamiz va bitta bo&apos;sh klass yaratamiz:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; class MyClass:
...     pass
...</code></pre><!--kg-card-end: html--><p>Hech ish qilmaydigan klass yaratdik, boshqa bir klassdan inherit ham qilmadik, keling dir() funksiyasi orqali uning metodlarini sanab ko&apos;ramiz:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; c = MyClass()
&gt;&gt;&gt; dir(c)
[&apos;__class__&apos;, &apos;__delattr__&apos;, &apos;__dict__&apos;, &apos;__dir__&apos;, &apos;__doc__&apos;, &apos;__eq__&apos;,
&apos;__format__&apos;, &apos;__ge__&apos;, &apos;__getattribute__&apos;, &apos;__gt__&apos;, &apos;__hash__&apos;, &apos;__init__&apos;,
&apos;__init_subclass__&apos;, &apos;__le__&apos;, &apos;__lt__&apos;, &apos;__module__&apos;, &apos;__ne__&apos;, &apos;__new__&apos;,
&apos;__reduce__&apos;, &apos;__reduce_ex__&apos;, &apos;__repr__&apos;, &apos;__setattr__&apos;, &apos;__sizeof__&apos;,
&apos;__str__&apos;, &apos;__subclasshook__&apos;, &apos;__weakref__&apos;]</code></pre><!--kg-card-end: html--><p>dir() barcha klassga tegishli metodlarni sanab chiqdi, lekin biz birorta metod yaratmagan edik, unda shuncha metod qayerdan keldi, shell orqali barcha metodlar python object() dan kelayotganini ko&apos;rishimiz mumkin:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; o = object()
&gt;&gt;&gt; dir(o)
[&apos;__class__&apos;, &apos;__delattr__&apos;, &apos;__dir__&apos;, &apos;__doc__&apos;, &apos;__eq__&apos;, &apos;__format__&apos;,
&apos;__ge__&apos;, &apos;__getattribute__&apos;, &apos;__gt__&apos;, &apos;__hash__&apos;, &apos;__init__&apos;,
&apos;__init_subclass__&apos;, &apos;__le__&apos;, &apos;__lt__&apos;, &apos;__ne__&apos;, &apos;__new__&apos;, &apos;__reduce__&apos;,
&apos;__reduce_ex__&apos;, &apos;__repr__&apos;, &apos;__setattr__&apos;, &apos;__sizeof__&apos;, &apos;__str__&apos;,
&apos;__subclasshook__&apos;]</code></pre><!--kg-card-end: html--><p>Etibor bersangiz dir() funksiyasi ko&apos;rsatayotgan ikkita list deyarli bir xil, faqat __ dict __ va __ weakref __ metodlari myClass da qo&apos;shimcha.</p><p>Shundan bilishimiz mumkinki pythonda istalgan klass Python object dan inherit qiladi, va qonuniy ushbu ko&apos;rinishda yozish ham mumkin class myClass(object): lekin bu qo&apos;pol hamda zarur emas.</p><p>Inheritancega misol:</p><p>Polygon bu uchda yoki undan ortiq tomonga ega yopiq ikki o&apos;lchamli shakldir, shundan kelib chiqib polygon klassini yasaymiz:</p><!--kg-card-begin: html--><pre><code>class Polygon:
    def __init__(self, no_of_sides):
        self.n = no_of_sides
        self.sides = [0 for i in range(no_of_sides)]

    def inputSides(self):
        self.sides = [float(input(&quot;Enter side &quot;+str(i+1)+&quot; : &quot;)) for i in range(self.n)]

    def dispSides(self):
        for i in range(self.n):
            print(&quot;Side&quot;,i+1,&quot;is&quot;,self.sides[i])</code></pre><!--kg-card-end: html--><p>Uchburchak bu uchta tomoni bor polygondir, demak u polygonning barcha qoidalariga bo&apos;ysunadi, shunday ekan biz Polygon klassdan inherit qilgan holda Uchburchak klassni yaratsak bo&apos;ladi, shunda polygonning barcha metod va atributlari Uchburchak klassda namoyon bo&apos;ladi:</p><!--kg-card-begin: html--><pre><code>class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self,3)

    def findArea(self):
        a, b, c = self.sides
        # calculate the semi-perimeter
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print(&apos;The area of the triangle is %0.2f&apos; %area)
 </code></pre><!--kg-card-end: html--><p>Uchburchak klassimizda endi qo&apos;shimcha findArea() degan metod bor. Biz ushbu metodni ishlatib uchburchak yuzasini topishimiz mumkin:</p><pre><code>&gt;&gt;&gt; t = Triangle()

&gt;&gt;&gt; t.inputSides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4

&gt;&gt;&gt; t.dispSides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0

&gt;&gt;&gt; t.findArea()
The area of the triangle is 6.00</code></pre><p>Ko&apos;rib turganingizde biz Uchburchak klassda inputSides() yoki dispSides() metodlarini yaratmagan bo&apos;lsakda ularni ishlata oldik, aynan mana shu inheritance yani meros olish deyiladi.</p><h2 id="incapsulation-enkapsulyatsiya">Incapsulation - Enkapsulyatsiya</h2><p>Enkapsulyatsiya Pythonda malumot va metodlarni bitta yaxlit konteyner ichiga solishdir. Misol uchun biz klass yaratdik, demak biz shu vaqtning o&apos;zida enkapsulyatsiyani ishlatdik. Sababi klass o&apos;zining metod va atributlarini bitta yaxlit konteyner ichiga oladi, yani o&apos;zining ichiga. Klassdan tashqarida esa klassning metod va atributlari yashirindir.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/05/image-1.png" class="kg-image" alt loading="lazy" width="655" height="335"></figure><p>Obyektga yo&apos;naltirilgan dasturlash tillari funksiya va malumotlarning oson va samarali enkapsulyatsiyani taqdim qiladi. Natija sizfatida, bir biriga bog&apos;liq malumot va funksiyalarning atrofida mantiqan tashqi dunyodan ajratib turuvchi chiziq tortiladi. Shu chiziqdan tashqarida faqat klassning interfeysi ochiq va uning pablik metodlari va atributlari ochiq, boshqa barcha malumot va funksiyalar himoyalangan hisoblanadi. Biz bu konsepsiyaga pablik funksiyalar va yashirin atributlarni misol qilishimiz mumkin.</p><h2 id="polymorphism-polimorfizm">Polymorphism - Polimorfizm</h2><p>Polimorfizm so&apos;zi bir nechta formasi yani bir nechta turi mavjud degani. Dasturlashda, polimorfizm bitta funksiya nomi bir nechta turdagi obyektlari uchun ishlatilishi tushuniladi. </p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/05/image-2.png" class="kg-image" alt loading="lazy" width="1118" height="696"></figure>]]></content:encoded></item><item><title><![CDATA[Python Garbage Collector]]></title><description><![CDATA[<h3 id="xotira-boshqaruvi">Xotira boshqaruvi</h3><p>Dasturlash tillar malumotlar ustida operatsiya bajarish uchun obyektlardan foydalanishadi. Obyektlar sonlar bo&apos;lishi mumkin, matnlar bo&apos;lishi mumkin, yoki mantiqiy malumotlar. Bazida obyektlar komplex malumot turlari ham bo&apos;lishi mumkin, list, hash yoki class kabi.</p><p>Dasturlarda obyektlardan unumli foydalanish uchun ularni xotiraga saqlab qo&apos;</p>]]></description><link>https://ubaydullo.digitalpress.blog/python-garbage-collector/</link><guid isPermaLink="false">624a886eaad635000181cca6</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Mon, 04 Apr 2022 07:57:42 GMT</pubDate><content:encoded><![CDATA[<h3 id="xotira-boshqaruvi">Xotira boshqaruvi</h3><p>Dasturlash tillar malumotlar ustida operatsiya bajarish uchun obyektlardan foydalanishadi. Obyektlar sonlar bo&apos;lishi mumkin, matnlar bo&apos;lishi mumkin, yoki mantiqiy malumotlar. Bazida obyektlar komplex malumot turlari ham bo&apos;lishi mumkin, list, hash yoki class kabi.</p><p>Dasturlarda obyektlardan unumli foydalanish uchun ularni xotiraga saqlab qo&apos;yadilar va kerak bo&apos;lganda xotiradan olib ishlatadilar. Bazi dasturlash tillarida o&apos;zgaruvchilar aslida xotirada saqlangan obyektga shunchaki havola bo&apos;ladi.</p><p>Birinchi dasturlash tillarida xotira boshqaruvi uchun dasturchi to&apos;liq javobgar bo&apos;lgan, agar u biror obyekt yaratmoqchi bo&apos;lsa uning uchun avval xotiradan joy ajratgan, obyektni ishlatib bo&apos;lgandan so&apos;ng esa xotirani bo&apos;shatib qo&apos;yishi kerak bo&apos;lgan. </p><p>Bu yerda ikkita muammo bor:</p><ol><li><strong>Xotirani bo&apos;shatib qo&apos;yish esadan chiqib qolishi</strong>. Xotirani ishlatib bo&apos;lgandan keyin uni bo&apos;shatishni unutib qo&apos;yaverish xotirani to&apos;lib qolishiga olib keladi.</li><li><strong>Xotirani erta bo&apos;shatib qo&apos;yish</strong>. Ikkinchi muammo esa xotira hali foydalanilayotgan vaqtda uni bo&apos;shatib yuborish.</li></ol><h3 id="avtomatik-xotira-boshqaruvi-va-axlat-yig-uvchi-garbage-collector-">Avtomatik xotira boshqaruvi va axlat yig&apos;uvchi (garbage collector)</h3><p>Avtomatik xotira boshqaruvi uchun turli xil metodlardan foydalaniladi. Eng keng tarqalgan boshqaruv usullaridan biri bu reference counting. Dastur obyketlarning referencelarini doim kuzatib boradi, reference counti 0 ga teng bo&apos;lga obyket ishlatilmayotgan hisoblanadi va u band qilib turgan xotira ozod qilinadi. </p><p>Ammo avtomatik xotira boshqaruvi biroz qimmatga tushadi, sababi buning uchun qo&apos;shimcha xotira va qo&apos;shimcha hisob kitob kerak bo&apos;ladi. Ko&apos;plab dasturlash tillarida &quot;stop-the-world&quot; metodikasi ishlaydi, bunda garbage collector ishlatilmayotgan obyektlarni collect qilayotgan vaqtda boshqa hama narsa to&apos;xtatiladi.</p><p>Kompyuter olami Moor qonunida aytilgani kabi rivojlanib yangi kompyuterlarda katta miqdordagi RAM lar sabab, &#xA0;avtomatik xotira boshqaruvining kamchiliklari ortib borayapti. Shunga qaramay zamonaviy dasturlash tillari Golang, Java va Python kabi dasturlash tillarida avtomatik xotira boshqaruvi mavjud.</p><p>Uzoq ishlovchi va tezlik o&apos;ta muhim bo&apos;lgan dasturlarda ishlatilgadigan dasturlash tillarida hali ham manula xotira boshqaruvi ishlatiladi. Klassik misol C++. Yana MacOS va IOS uchun ishlatiladigan objective-C, va yangi dasturlash tillaridan Rust ni misol qilishimiz mumkin.</p><h3 id="pythonda-garbage-collection-qanday-ishlaydi">Pythonda garbage collection qanday ishlaydi</h3><p>Pythonda xotira boshqaruvida ikkita aspekt mavjud:</p><ol><li>Recerence counting</li><li>Generational garbage collection</li></ol><p><strong>Reference counting</strong></p><p>Pythonda garbage collectionning asosiy quroli bu reference countlar. Pythonda biz doim obyekt yaratganimizda, yaratilgan obyektning ikkita havolasi bo&apos;ladi, birinchisi C type - list, dictionary, yoki int ga o&apos;xshaga, ikkinchisi reference count.</p><p>Bazilar python garbage collectorni &quot;poor man&apos;s garbage collector&quot;i deb nomlashadi. Sababi u davriy reference larni aniqlay olmaydi. Ammo reference countingning bir joyib tomoni u xotiraga hechkim murojaat qilmasa u xotirani bo&apos;shatib qo&apos;yadi. </p><p><strong>Generational garbage collection</strong></p><p>Reference countga qo&apos;shimcha tarzda Python garbage collector metodini ham xotira boshqaruvi uchun ishlatadi.</p><p>Avalgi bo&apos;limda biz obyektni arrayga qo&apos;shib uning reference counti ishganini ko&apos;rdik. Ammo obyekti uning o&apos;ziga qo&apos;shsak nima bo&apos;ladi.</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; class MyClass(object):
...     pass
...
&gt;&gt;&gt; a = MyClass()
&gt;&gt;&gt; a.obj = a
&gt;&gt;&gt; del a</code></pre><!--kg-card-end: html--><p>Ushbu misolda biz class yasadik va shu classga instance yasadik, va shu instance ning proertysi sifatida o&apos;zini ko&apos;rsatdik. Xullas instanceni o&apos;chirib tashladik.</p><p>Endi Python uchun ushbu instance mavhum, lekin uni Python xotiradan o&apos;chirib tashlamadi. Instancening reference counti 0 emas, sababi uning o&apos;ziga o&apos;zi reference qilingan edi. </p><p>Ushbu muammo reference sikli deyiladi, biz bu muammoni reference count bilan hal qila olmaymiz. Ushbu muammoni hal qilish garbage collectorning ishi, standard bibliotekada u GC nomi ostida.</p><p><strong>Generational garbage collection terminology</strong></p><p>Garbage collectorni tushunish uchun ikkita muhim konsepsiya mavjud:</p><ol><li>birinchi konsepsiya avlod (level, type).</li><li>ikkinchisi esa chegara.</li></ol><p>Garbage collector xotiradagi barcha obyektarni kuzatib boradi. Yangi yaratilgan obyekt garbage collectorning birinchi avlodida yashashni boshlaydi. Agar Python garbage collectionni boshlasa va unda obyket saqlanib qolsa u ikkinchi avlodga o&apos;tib yashashni boshlaydi. Pythonda garbage collectorning umumiy uchta avlodi bor, har bir ovlod bo&apos;yicha garbage collect qilinganda saqlanib qolgan obyektlar o&apos;zidan keyingi avoldga o&apos;tib yashashni davom ettirishadi. </p><p>Har bir avlod uchun garbage collector modulining chegaralangan miqdorda obyektlar soni mavjud. Agar biror avlodda obyektlar soni belgilangandan oshib ketsa garbage collection jarayoni boshlanadi. Istalgan garbage collectiondan omon qolgan obyketlar o&apos;zi turgan avolddan keyingi avlodga o&apos;tib yashashda davom etadilar. </p><p>Reference countdan farqli o&apos;laroq, siz garbage collectorni boshqarishingiz mumkin. Misol uchun obyektlar soni chegarasini o&apos;zgartirish. Yoki garbage collection jarayonini o&apos;zingiz boshlashingiz yoki garbage collect qilishni umuman to&apos;xtatib qo&apos;yishingiz ham mumkin. </p><p><strong>GC moduldan foydalanish</strong></p><p>gc modulini import qiling va python uchun hozirda belgilangan garbage collector chegarasini ko&apos;ring:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; import gc
&gt;&gt;&gt; gc.get_threshold()
(700, 10, 10)</code></pre><!--kg-card-end: html--><p>Demak o&apos;z o&apos;rnida, birinchi avlod uchun 700 ta obyekt, va keyingi ikkita avlod uchun esa 10 tadan obyekt uchun ruxsat berilgan ekan.</p><p>get_count() orqali siz har bir avlodda nechtadan obyekt yashayotganini ham ko&apos;rishingiz mumkin:</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; import gc
&gt;&gt;&gt; gc.get_count()
(596, 2, 1)</code></pre><!--kg-card-end: html--><p>Ushbu holatda sizda eng yosh avlodingizda 596 ta ikkinchi avlodda esa 2 ta va uchinchi avlodda 1 ta obyket bor.</p><p>Ko&apos;rib turganingizdek Python hali dasturni yozmasingizdan yoki ishga tushirmasingizdan o&apos;zi bir olam obyket yaratib ulguradi. Biz garbage collection jarayonini o&apos;zimiz ham gc.collect() funksiyasi orqali ishga tushira olamiz.</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; gc.get_count()
(595, 2, 1)
&gt;&gt;&gt; gc.collect()
577
&gt;&gt;&gt; gc.get_count()
(18, 0, 0)</code></pre><!--kg-card-end: html--><p>Ko&apos;rib turganingizdek collect() funksiyasi katta miqdorda obyektlarni tozalab tashlaydi. Bu xolatda u naqd 577 ta obyektdan xotirani tozaladi.</p><p>Biz set_threshold() funksiyasi orqali avlodlarda saqlanadigan obyketlar soni o&apos;zimiz o&apos;rnatishimiz mumkin.</p><!--kg-card-begin: html--><pre><code>&gt;&gt;&gt; import gc
&gt;&gt;&gt; gc.get_threshold()
(700, 10, 10)
&gt;&gt;&gt; gc.set_threshold(1000, 15, 15)
&gt;&gt;&gt; gc.get_threshold()
(1000, 15, 15)
</code></pre><!--kg-card-end: html--><p>Yuqoridagi misolda biz garbage collection chegaraladini o&apos;zimiz o&apos;rnatdik. Ushbu chegaralarni uzaytirish garbage collection ishga tushish vaqtini uzaytiradi, va o&apos;lik obyektlarni xotirada uzoqroq saqlab turishi evaziga dasturingizda yuz beradigan hisob kitoblarni kamaytiradi.</p><h3 id="python-dasturchi-sifatida-siz-uchun-garbage-collector-nima-mano-anglatadi">Python dasturchi sifatida siz uchun garbage collector nima mano anglatadi ?</h3><p>Garbage collectoring asl konfiguratsiyasini o&apos;zgartirmang. Asosiy jihatlardan biri Python dasturchining foydali ish koeffetsentini sezilarli oshiradi. Va albatta bu low level dasturlash tillarida dasturchi qilishi kerak bo&apos;lga mayda ishlarni Python o&apos;z bo&apos;yniga olishidir. </p><p>Zich muhitlar uchun xotirani manual boshqarish muhim bo&apos;lishi mumkin. Bu bilimlar bilan endi siz bazida sizning dasturingiz unumdorligi pastligini garbage collectionga to&apos;nkashingiz ham odatiy xol, lekin ishonavering shunday xolatda ham garbage collector chegaralarini kengaytirgandan ko&apos;ra dasturingiz ishlab turgan muhitni kuchaytirganingiz foydaliroq. Moore ning qoidasi aytganidek hozirda bizga kerakli kuchga ega mexanizmlarni arzonga topish hozirgi kunda oson.</p><p>Python o&apos;zi ozod qilgan xotirani o&apos;zi ishlab turgan OS ga qaytarmasligi aniq. Shu sababli istalgan manual garbage collection sizga o&apos;zingiz kutgan natijani bermasligi mumkin. </p>]]></content:encoded></item><item><title><![CDATA[Pythonda generator va yield dan foydalanish]]></title><description><![CDATA[<p>Biror marta sistemangizning xotirasini to&apos;ldirib qo&apos;yadigan darajada yirik dataset bilan ishlaganmisiz ? Balki sizda har doim chaqirilgan tizimning ichgi xolatidan xabar berib turuvchi komplex funksiya yozgandursiz, lekin funksiyaning o&apos;ziga class yaratish uchun funksiyaning hajmi arzimas bo&apos;lgandur. Shunday vaziyatlarda generator va yield sizga yordam</p>]]></description><link>https://ubaydullo.digitalpress.blog/pythonda-generator-va-yield-dan-foydalanish/</link><guid isPermaLink="false">62468713aad635000181cc48</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Mon, 04 Apr 2022 05:33:49 GMT</pubDate><content:encoded><![CDATA[<p>Biror marta sistemangizning xotirasini to&apos;ldirib qo&apos;yadigan darajada yirik dataset bilan ishlaganmisiz ? Balki sizda har doim chaqirilgan tizimning ichgi xolatidan xabar berib turuvchi komplex funksiya yozgandursiz, lekin funksiyaning o&apos;ziga class yaratish uchun funksiyaning hajmi arzimas bo&apos;lgandur. Shunday vaziyatlarda generator va yield sizga yordam beradi.</p><!--kg-card-begin: markdown--><blockquote>
<p>Ushbu maqoladagi misollarni o&apos;zingzda sinash uchun <a href="https://github.com/realpython/materials/blob/master/generators/techcrunch.csv?__s=gqxuuszifeoki21ev8rx">bu yerdan</a> datasetni yuklab oling</p>
</blockquote>
<!--kg-card-end: markdown--><h3 id="generatorlardan-foydalanish">Generatorlardan foydalanish</h3><p>PEP 255 da tafsif berilgan, generatorlar <a href="https://stackoverflow.com/questions/2155788/most-of-the-iterators-and-iterables-methods-are-lazy-what-does-this-mean">lazy iterator</a> qaytaradigan maxsus funksiyalardir. Ular iteratsiya qilsa bo&apos;ladigan listga o&apos;xshagan obyektlardir. Listlardan farqi, gerator o&apos;zining kontentini xotirada saqlamaydi. </p><!--kg-card-begin: html--><pre><code>

import sys
# Generatorlar bilan data pipeline yasash
# Biz yirik malumotlar ustida ishlaganimizda, generatordan foydalanishimiz mumkin
# Sababi generator kontentini list kabi xotirada saqlamaydi
try:
    file_name = sys.argv[1]
except:
    print(&quot;Iltimos fayl nomini kiriting: \&gt; python file_name.py file_name.csv&quot;)
    sys.exit()

# Faylning har bir qatorini o&apos;qiydigan generator
lines = (line for line in open(file_name))

# Har bir qatorning valuelarini vergul bilan bo&apos;lib olib listga 
# qo&apos;shib beradigan generator
list_line = (s.strip().split(&quot;,&quot;) for s in lines)

# bir marta next() ni chaqirib ustunlarning nomlarini o&apos;zgaruvchiga 
# biriktirib olamiz
cols = next(list_line)
# data = next(list_line) # ikkinchi qatordagi datani olamiz

# print(dict(zip(cols, data))) # ustun nomlari va dataning qiymatlari # yordamida dictionary yasaydi.

# zip() ni chaqirib columt nomlari bilan datani birlashitirib 
# olamizda keyin undan dictionary yasaymiz:
#    1. keylar column nomlar bo&apos;ladilar cols o&apos;zgaruvchisiga biriktirilgan
#    2. valuelar esa list_line o&apos;zgaruvchisiga generator orqali ketma ket biriktiriladigan malumotlar bo&apos;ladi 
company_dicts = (dict(zip(cols, data)) for data in list_line)

# Seriasi aga teng bo&apos;lgan har bir kompaniyani filterlaydi. 
# va shu kompaniyalarni raisedAmt sini generatorning yield 
# statementidagi elementi qilib belgilaydi.
funding = (
    int(company_dict[&apos;raisedAmt&apos;])
    for company_dict in company_dicts
    if company_dict[&apos;round&apos;] == &quot;a&quot;
)

# CSV fayldagi A seriaga ega kompaniyalarning raisedAmt fondining 
# yig&apos;indisini olish uchun sum() ni chaqirib generatordagi 
# iteratsiyani ishga tushiramiz.
total_series = sum(funding)
print(f&quot;A seriadagai umumiy fond miqdori: ${total_series}&quot;)

</code></pre><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Python GIL (Global Interpreter Lock)]]></title><description><![CDATA[<p>Pythonning Global Interpretator blocki bu, sodda qilib aytganda mutex (yoki qulf, bloklash), qaysiki Python interpretatorini faqat bitta potok boshqarishini taminlaydi.</p><p>Dasturchi uchun bitta potok ishlayotgani sezilmaydi, lekin ayrim vaqtlardi u CPU da probka hosil qilib unumdorlikni kamaytiradi, yani sekinlashadi, yoki ko&apos;p potokli kodlarda muammolar yuzaga kelishi mumkin. </p><p>Python</p>]]></description><link>https://ubaydullo.digitalpress.blog/python-gil-global-interpreter-lock/</link><guid isPermaLink="false">62414ae0aad635000181c9c8</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Wed, 30 Mar 2022 11:17:31 GMT</pubDate><content:encoded><![CDATA[<p>Pythonning Global Interpretator blocki bu, sodda qilib aytganda mutex (yoki qulf, bloklash), qaysiki Python interpretatorini faqat bitta potok boshqarishini taminlaydi.</p><p>Dasturchi uchun bitta potok ishlayotgani sezilmaydi, lekin ayrim vaqtlardi u CPU da probka hosil qilib unumdorlikni kamaytiradi, yani sekinlashadi, yoki ko&apos;p potokli kodlarda muammolar yuzaga kelishi mumkin. </p><p>Python GIL bir vaqtda bittadan ortiq potok ishlashiga ruxsat bermaganligi sababli bittadan ortiq yardoga ega bo&apos;lgan Ko&apos;p Potokli CPU lar Python code uchun ahamiyatsizdek bo&apos;ladi, shuning uchun GIL Pythonning &quot;infamos&quot; xususiyati degan nomni ham olib ulgurgan.</p><p>Bu maqolada biz Python GIL ni unumdorlikga salbiy tasiri va bu tasirni qanaqa qilib chetklab o&apos;tsa bo&apos;lishini o&apos;rganamiz.</p><h3 id="pythonga-gil-nima-uchun-kerak-u-qanaqa-muammoni-hal-qiladi">Pythonga GIL nima uchun kerak ?, u qanaqa muammoni hal qiladi ?</h3><p>Python xotira boshqaruvi uchun reference count ishlatadi. Yani Pythonda yaratilgan har bir obyektning reference count degan o&apos;zgaruvchisi bo&apos;ladi, shu o&apos;zgaruvchi orqali Python obyekt necha marta ishlatilgani yoki umuman ishlatilmayotgani haqida xabar berib turadi, qachon ushbu count nolga yetsa, shu obyekt band qilib turgan xotira bo&apos;shatiladi.</p><p> Qisqacha misol:</p><pre><code>&gt;&gt;&gt; import sys
&gt;&gt;&gt; a = []
&gt;&gt;&gt; b = a
&gt;&gt;&gt; sys.getrefcount(a)
3</code></pre><p>Bu yerda etibor bergan bo&apos;lsangiz bo&apos;sh a listning reference counti 3 ta, birinchisi o&apos;zi yaratilgan holatda, ikkinchisi b o&apos;zgaruvchiga havola berilganda, uchinchisi getrefcount() funksiyasiga argument qilib berilganda.</p><p>GIL ga qaytamiz:</p><p>Muammo shundaki reference count uchun uni ikkita yoki undan ortiq potok bir vaqtning o&apos;zida ketma ket o&apos;zgatirishini oldini olish uchun himoyachi kerak edi. Agar shu hoalt yuz beradigon bo&apos;lsa, biror obyekt band qilib turgan xotira hech qachon ozod qilinmasligi mumkin, yoki undan ham yomoni, xotirada hali reference counti 0 ga teng bo&apos;lmagan obyektni xotiradan o&apos;chirib yuborishi, bunday xolatlar sizning Python dasturingizda kutilmagan noodatiy baglar paydo bo&apos;ladi.</p><p>Reference countni himoya qilish uchun har bir potok bo&apos;ylab tarqatilgan data stukturaga begona potok o&apos;zgartirib yubormasligi uchun block qo&apos;yiladi.</p><p>Lekin har bir obyektga yoki obyektlar guruhiga block qo&apos;yish degani bu ko&apos;plab blocklar bir vaqtning o&apos;zida mavjud bo&apos;ladi degani, bu DEADLOCK ga olib keladi (Deadlock bu bittadan ortiq locklar mavjud bo&apos;lganda yuzaga keladi). Boshqa minus esa blocklarning ketma ket qo&apos;yilishi va olinishi sababli yuzaga keladigan unumdorlikdagi muammolardir.</p><p>GIL bu interpretatorning o&apos;zidagi block bo&apos;lib, &#xA0;qaysiki har bir Python kode interpretatsiya bo&apos;lishi uchun interpretator lockdan ruxsat so&apos;rash qoidasini o&apos;rnatadi. Bu narsa deadlocklarning oldini oladi (Faqat block bir dona bo&apos;lgan vaqtda) va unchalik unumdorlikga salbiy tasir qilmaydi. Ammo istalgan CPU talab qiladigan Python dasturni bir potokli qilib qo&apos;yadi.</p><p> GIL Ruby va shunga o&apos;xshagab bir nechta tillarda ham foydalanilgan bo&apos;lsada u yagona yechim emas. Ayrim dasturlash potokdan himoyalangan xotira boshqaruvi uchun reference countdan boshqa usullardan foydalangan xolda GIL dan foydalanishning oldini olishadi, misol uchun <strong>garbage collection</strong>.</p><p>Bunday dasturlash tillari GIL ning bir potoklilik bilan keltiradigan unumdorligini JIT compaylerlar kabi xususiyatlar orqali kompensatsiya qiladi.</p><h3 id="nima-uchun-aynan-gil-yechim-sifatida-olingan">Nima uchun aynan GIL yechim sifatida olingan ?</h3><p>Python hali kompyuterlarda ko&apos;p potoklilik tushunchasi yo&apos;q bo&apos;lgan davrlardan buyon mavjud. Python developmetni tezlashtirish maqsadida foydalanish uchun oson qilib yaratilgan va shu sababli Pythonni kun sain ko&apos;plab dasturchilar ishlata boshlashgan.</p><p>Python uchun kerak bo&apos;lgan C kutubxonalari uchun juda ko&apos;plab extentionlar yozilgan. Nojo&apos;ya o&apos;zgarishlarning oldini olish maqsadida, ushbu C extentionlari uchun GIL taminlab beradigan potokdan himoyalangan xotira boshqaruvi talab etilgan.</p><p>GIL ni implement qilish juda oson hamda osongina Pythonga qo&apos;shilgan. GIL bir potokli dasturlarda bizga yuqori unumdorlik beradi, sababi dastur faqat bitta lock ustida ishlaydi.</p><p>Potokdan himoyalanmagan C extentionlari oson integratsiya qilingan. Va aynan shu extentionlar Pythonning ko&apos;plab jamoalar tomonidan osongina qabul qilinishining asosidir.</p><p>Ko&apos;rib turganingizdek GIL Pythonning boshlanish davrida ishlab chiqaruvchilar yuz tutgan katta muammoning pragmatik yechimi bo&apos;lgan. </p><h3 id="ko-p-potokli-python-dasturlariga-tasiri">Ko&apos;p potokli Python dasturlariga tasiri</h3><p> Kompyuter dasturlariga qaraganimizda CPU bound dastrlar va I/O bound dasturlarning unumdorligida biroz farq bo&apos;ladi. </p><p>CPU bound dasturlar CPU ni maksimum ishlatadi. Misol uchun matematik hisob kitoblar, matretsalarni ko&apos;paytirish, qidiruv, rasmlar ustida operatsiyalar va h.kz.</p><p>I/O bound dasturlar esa ko&apos;proq vaqtni Inputni qabul qilish va Outputni yetkazib berishga sarflaydilar. Bular foydalanuvchidan kelayotgan signal, yoki internetdan yuklanayotgan malumot, yoki malumotlar bazasida bajarilayotgan amallardir. Bazida I/O bound dasturlar qabul qilayotgan malumotri protsessdan o&apos;tib tayor bo&apos;lishini ham kutish evaziga umumiy olganda judayam uzoq kutib qolishlari mumkin, misol uchun siz foydalanuvchidan nimadur qabul qilmoqchi bo&apos;lib input so&apos;radingiz, u nima kiritishini uzoq o&apos;ylashi mumkin, yoki siz malumotlar bazasidan so&apos;ragan so&apos;rovingizni tayorlash uchun malumotlar bazasining o&apos;zida ushbu malumotni tayorlash uchun turli operatsiyalar talab etilishi mumkin.</p><p>Taymer implementatsiya qilingan dasturga misol:</p><pre><code># single_threaded.py
import time
from threading import Thread

COUNT = 50000000

def countdown(n):
    while n&gt;0:
        n -= 1

start = time.time()
countdown(COUNT)
end = time.time()

print(&apos;Time taken in seconds -&apos;, end - start)</code></pre><p>Mening 4 potokdan iborat bo&apos;lgan protsessorimda bu code 1.902301549911499 sekund vaqt oldi</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-17.png" class="kg-image" alt loading="lazy" width="503" height="45"></figure><p>endi bizor kodga o&apos;zgaritirish kiritib shu countdownni ikkita potokga ajratib beramiz:</p><pre><code># multi_threaded.py
import time
from threading import Thread

COUNT = 50000000

def countdown(n):
    while n&gt;0:
        n -= 1

t1 = Thread(target=countdown, args=(COUNT//2,))
t2 = Thread(target=countdown, args=(COUNT//2,))

start = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end = time.time()

print(&apos;Time taken in seconds -&apos;, end - start)</code></pre><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-18.png" class="kg-image" alt loading="lazy" width="608" height="76"></figure><p>Ko&apos;rib turganingizdek ikkala misol ham deyarli bir xil vaqt oldi, sababi biz ikkinchi kodda ikkita potokga ajratgan bo&apos;lsakda GIL ikkita potokni paraller bajarilishiga yo&apos;l qo&apos;ymadi. </p><p>I/O bound tizimlarda ko&apos;p potokli dasturlarga GIL unchalik sezilarli tasir ko&apos;rsatmaydi, potoklar I/O ni kutish vaqtida locklarni o&apos;zaro almashadilar.</p><p>Lekin &#xA0;potoklar to&apos;liq CPU bound bo&apos;lgan dasturlarda, misol uchun rasmlarni bo&apos;laklarga bo&apos;lib ishlov beradigan potoklar, lock evaziga nafaqat bir potokli bolib qoladi, balki unga ketadigan vaqtda ham o&apos;sish ko&apos;rishingiz mumkin, yuqoridagi misolga o&apos;xshab, to&apos;liq bitta potokdan foydalanilgan xolatga o&apos;xshab.</p><p>Bu vaqtdagi o&apos;sish potoklardagi locklarni ochish va lock qo&apos;yish evaziga qo&apos;shiladi. </p><h3 id="nega-gil-hamon-olib-tashlanmagan">Nega GIL hamon olib tashlanmagan ?</h3><p>Ko&apos;plab dasturchilar anchadan buyot norozilik bilan GIL ni olib tashlash kerakligi bilan murojaat qiladilar. Lekin Python kabi ko&apos;p qo&apos;llaniladigan dasturlash tiliga GIL ni olib tashlashchalik katta o&apos;zgarishni backward compatible likka tasir qilmasdan amalga oshirishning imkoni yo&apos;q.</p><p>Aslida Pythonning boshlanish fazalarida GIL bir necha marta Python contrubutorlari tomonidan o&apos;chirib tashlangan, lekin bu urunishlar Pythonni ko&apos;tarib turuvchi va GIL taqdim etayotgan xususiyatgan to&apos;g&apos;ridan to&apos;g&apos;ri bog&apos;liq bo&apos;lgan C extentionlarinign ishlay olmasligiga olib kelgan. </p><p>Va albatta GILning o&apos;rniga ishlatishimiz mukin bo&apos;lgan boshqa yechimlarning bazilari I/O bound tizimlarda sizning ko&apos;p potokli hamda bir potokli Python dasturingiz ham bir varakayiga sezilarli darajada sekinlashishiga olib kelsa, bazilarini Pythonda implement qilish juda ham qiyin. Xullas Pythonning yangi versiyasini o&apos;rnatishingiz dasturlaringizni sekin ishlashiga xizmat qilishini xoxlamasangiz kerak )).</p><p>Python BDFLi Guido Van Rossum Python comyunitiyga yuzlanib &quot;GIL ni olib tashlash oson emas&quot; degan edi.</p><!--kg-card-begin: markdown--><blockquote>
<p>Men Py3k (Pythonning 3... versialari) ga istalgan I/O bound tizimlarda Pythonning tezligiga tasir qilmaydigan o&apos;zgarishlarni mamnunlik bilan qabul qilaman<br>
[Guido Van Rossum]</p>
</blockquote>
<!--kg-card-end: markdown--><p>GIL ni olib tashlashdagi harakatlarda ushbu shart hozirgacha qanoatlantirilgani yo&apos;q.</p><h3 id="nima-uchun-gil-python3-da-ham-o-chirilmadi">Nima uchun GIL Python3 da ham o&apos;chirilmadi ?</h3><p>GIL ning Pythondan o&apos;chirilishi Python3 ni Python2 &#xA0;dan ko&apos;ra sekin qilib qo&apos;yar edi. Hozirgi Python3 ning bir potokli lekin unumdorlik jhatdan kuchliligiga hechkim etiroz bildira olmaydi. Shunday ekan Pythonda hali hamon GIL mavjud.</p><p>Lekin Python3 da GIL ga ham bir qator o&apos;zgartirishlar kiritilgan.</p><p>Biz yuqorida GIL ning CPU bound hamda I/O bound ko&apos;p potokli dasturlarga tasirini o&apos;rgandik. Lekin bir qismi CPU bound, bir qisim I/O bound dasturlarchi ?</p><p>Bunday dasturlarda GIL I/O bound potoklarni to&apos;sib qoyadi, va shu tariqa ular CPU bound potoklarni olib qo&apos;yishdan checklaydi.</p><p>Sababi Pythonda potokdan GIL malum vaqt intervalida ochib yuborilishi belgilangan, agar GIL ni boshqa potok talab qilmasagina avalgi potok yana o&apos;z ishini davom ettirishi mumkin.</p><pre><code>&gt;&gt;&gt; import sys
&gt;&gt;&gt; # The interval is set to 100 instructions:
&gt;&gt;&gt; sys.getcheckinterval()
100</code></pre><p>Bu usulning muammosi shundaki ko&apos;pincha CPU bound potok boshqa potoklar GILni olmasdan oldin u qaytadan olib qo&apos;yadi. </p><p>Bu muammo Python3.2 da 2009 yil Antoine Pitrou tomonidan hal qilingan. &#xA0; &#xA0;</p><h3 id="qanday-qilib-python-gil-ni-chetlab-o-tish-mumkin">Qanday qilib Python GIL ni chetlab o&apos;tish mumkin</h3><p>Ko&apos;p-protsesslik - ko&apos;p potoklilik: Ko&apos;p protsesslikni eng qulay ishlatiladigan vaqti bu ko&apos;p potoklilikning o&apos;rniga ko&apos;p protsesslar hosil qilib ishlatishdir. Shunda Python dastur har bir protsess uchun alohida Python interpreter hosil qiladi va shunda GIL bu yerda muammo bo&apos;la olmaydi. Ushbu xususiyatni implement qilish uchun Pythonda multiprocessing moduli mavjud: </p><pre><code>from multiprocessing import Pool
import time

COUNT = 50000000
def countdown(n):
    while n&gt;0:
        n -= 1

if __name__ == &apos;__main__&apos;:
    pool = Pool(processes=2)
    start = time.time()
    r1 = pool.apply_async(countdown, [COUNT//2])
    r2 = pool.apply_async(countdown, [COUNT//2])
    pool.close()
    pool.join()
    end = time.time()
    print(&apos;Time taken in seconds -&apos;, end - start)</code></pre><p>Mening tizimimda ushbu dastur quyidagi vaqtda bajarildi:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-19.png" class="kg-image" alt loading="lazy" width="592" height="96"></figure><p>Ko&apos;p potokga ajratib tekshirgan dasturimizga nisbatan o&apos;sish bo&apos;ldi.</p><p>Nega Ketadigan vaqt 2 barobar kamayib ketmadi, sababi ko&apos;p protsesslilikni ham boshqarishni o&apos;ziga yarasha qiyin vaqt oladigan jihatlari bor.</p><p><strong>Alternativ Python interpretatorlari: </strong>Pythonda ko&apos;plab interpretator turlari bor. Cpython, JPython, IronPython and PyPy, written in C, Java, C# and Python lar eng ko&apos;p qo&apos;llaniladiganlaridur. GIL faqatgina Pythonning asl implementatsiyasida bor qaysiki C da yozilgan. </p><p>....</p>]]></content:encoded></item><item><title><![CDATA[CPU bound & I/O bound]]></title><description><![CDATA[<h3 id="cpu-bound">CPU bound</h3><p>CPU (Central Processing Unit) kompyuterning integral qismi hisoblanadi, u kompyuterning asosiy protsesslarini bajaradi. CPU asosiy operatsiyalarni bajaradigan bir vaqtda cache va xotira ham protsesslarni yakunlanishiga yordam beradi. CPU bound Kompyuter degani bu boshqa komponentlardan foydalanish o&apos;rniga protsessni qatiy CPU zimmasiga yuklaydi. Bunday kompyuterlar CPU kuchli bo&</p>]]></description><link>https://ubaydullo.digitalpress.blog/cpu-bound-i-o-bound/</link><guid isPermaLink="false">6243e3bbaad635000181caa1</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Wed, 30 Mar 2022 05:31:36 GMT</pubDate><content:encoded><![CDATA[<h3 id="cpu-bound">CPU bound</h3><p>CPU (Central Processing Unit) kompyuterning integral qismi hisoblanadi, u kompyuterning asosiy protsesslarini bajaradi. CPU asosiy operatsiyalarni bajaradigan bir vaqtda cache va xotira ham protsesslarni yakunlanishiga yordam beradi. CPU bound Kompyuter degani bu boshqa komponentlardan foydalanish o&apos;rniga protsessni qatiy CPU zimmasiga yuklaydi. Bunday kompyuterlar CPU kuchli bo&apos;lsa juda tezkor bo&apos;ladi, ammo boshqa komponentlar ishlamaganligi sabab balans yo&apos;qoladi.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-16.png" class="kg-image" alt loading="lazy" width="696" height="800"><figcaption>CPU</figcaption></figure><p>Tizim CPU bound deyilganda barcha protsesslar faqat CPU orqali bajarilishi tushuniladi. Bunday xolatda CPU odatiy 10-20% emas balki 90-100% ishlaydi. CPU kuchli bo&apos;lsa u kompyuterning umumiy tezligini ham tabiikiy oshiradi. Bunday xolat ko&apos;proq sizning dasturlaringiz hisob kitob talab qiladigan dasturlar bo&apos;lsa kuzatiladi. Agar dasturlar grafika yoki boshqa komponentlari ishlashini talab qiladigan dasturlar bo&apos;lsa ular CPU bound tizimlarda yetarlicha ish ko&apos;rsata olmaydilar.</p><h3 id="i-o-bound">I/O bound</h3><p>Kompyuter tizimida I/O bound deb operatorlarning qabul qilinishi va qaytarib yuborilishini kutishga ketgan vaqt protsessni bajarishga ketgan vaqt sifatida qo&apos;shib hisoblanishiga aytiladi, yani protsessning tugatilishi Input va Outputga bevosita bog&apos;liq bo&apos;lsa. Bu CPU bound terminining qarama qarshisi. Sodda qilib aytganda malumotni qabul qilish shu malumot ustida bajariladigan operatsiyadan ko&apos;ra ko&apos;p vaqt olishidir.</p>]]></content:encoded></item><item><title><![CDATA[Linklangan listlar (Linked lists)]]></title><description><![CDATA[<p>Linklangan listlar unchalik taniqli bo&apos;lmagan pythondagi odatiy listlar avlodidir. Lekin linklangan listlar bazi vaziyatlarda odatiy listlarga qaraganda ishlatish uchun eng to&apos;g&apos;ri tanlov.</p><p>Linklangan listlar tartiblangan obyektlar jamlanmasidir. Linklangan listlarning odatiy listlardan farqi ular elementlarni xotirada odatiy listlarga qaraganda boshqacharoq saqlaydi. Odatiy listlar xotira blocklarida</p>]]></description><link>https://ubaydullo.digitalpress.blog/linkli-listlar-linked-lists/</link><guid isPermaLink="false">623c2d2daad635000181c69c</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Sun, 27 Mar 2022 05:28:18 GMT</pubDate><content:encoded><![CDATA[<p>Linklangan listlar unchalik taniqli bo&apos;lmagan pythondagi odatiy listlar avlodidir. Lekin linklangan listlar bazi vaziyatlarda odatiy listlarga qaraganda ishlatish uchun eng to&apos;g&apos;ri tanlov.</p><p>Linklangan listlar tartiblangan obyektlar jamlanmasidir. Linklangan listlarning odatiy listlardan farqi ular elementlarni xotirada odatiy listlarga qaraganda boshqacharoq saqlaydi. Odatiy listlar xotira blocklarida o&apos;z elementlariga reference lar saqlaydi, Linklangan listlar esa referencelarni elementining bir qismi sifatida saqlaydi. </p><h2 id="asosiy-tushuncha">Asosiy tushuncha</h2><p>Linklangan listlarning elementlari <strong>node </strong>deb ataladi, har bitta nodaning ikkita maydoni bo&apos;ladi</p><!--kg-card-begin: markdown--><ul>
<li><strong>Data:</strong> nodada saqlanadigan malumot</li>
<li><strong>Next:</strong> keyingi nodaga havola</li>
</ul>
<!--kg-card-end: markdown--><p>Odatiy nodaning ko&apos;rinishi:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-6.png" class="kg-image" alt loading="lazy" width="350" height="178"></figure><p>Linklangan listlar nodalar kolleksiyasidir. Birinchi noda <strong>head </strong>deb ataladi, u linklangan list ustida bajariladigan istalgan interatsiyaning boshlang&apos;ich nuqtasi hisoblanadi. Oxirgi nodaning next maydonidagi havola None bo&apos;lishi zarur, sababi uning oxirgi nodaligini faqat shunaqa qilib bildirish mumkin. </p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-7.png" class="kg-image" alt loading="lazy" width="1248" height="332"></figure><p><strong>Amaliy dasturlar</strong></p><p>Linked listlar amalda queue, stack yoki graph larni realizatsiya qilishda qo&apos;l keladi. </p><p><strong>Queue - Navbat yoki Stack - Taxmon</strong></p><p>Queue bilan Stack faqat bir biridan elementlarni olish usuli bilan farq qiladi. Queue uchun biz First-In/First-Out (FIFO) usulini ishlatamiz. Bu degani birinchi qo&apos;shilgan element birinchi chiqarib olinadi.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-8.png" class="kg-image" alt loading="lazy" width="752" height="384"><figcaption>Queue</figcaption></figure><p>Yuqoridagi rasmda ko&apos;rib turibsiz, queue ikkita tomoni bor, birinchisi <strong>front </strong>ikkinchisi <strong>rear. </strong>Elemement qo&apos;shilganda rear tomondan qo&apos;shiladi, chiqarilganda esa front tomondan chiqariladi, yani birinchi qo&apos;shilgan element birinchi bo&apos;lib chiqadi.</p><p>Stack uchun esa biz Last-In/First-Out nazariyasini ishlatamiz (LIFO). Bu degani oxirgi qo&apos;shilgan element birinchi bo&apos;lib chiqariladi.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-9.png" class="kg-image" alt loading="lazy" width="482" height="592"><figcaption>Stack</figcaption></figure><p>Rasmda ko&apos;rganingizdek, birinchi kiritilgan element yani indexi 0 bolgan element eng pastda, eng oxirgi qo&apos;shilgan element esa eng tepada. </p><p><strong>Graf (Graph)</strong></p><p>Graflar obyektlar orasidagi bog&apos;liqlikni ko&apos;rsatish orqali qandaydur networkni namoyon qilish uchun ishlatiladi. Misol uchun Directed Acyclic graph (DAG) - (Yo&apos;naltirilgan lekin siklga ega bo&apos;lmagan graf)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-10.png" class="kg-image" alt loading="lazy" width="456" height="220"><figcaption>Directed Acyclic graph</figcaption></figure><p>Grafni turli xil ko&apos;rinishda implement qilish mumkin, va ulardan biri <strong>adjecency list </strong>(Qo&apos;shnilik ro&apos;yhati. Grafning qirrasini uning qo&apos;shni qirralariga bog&apos;liqligini namoyon qiluvchi tartiblanmagan list)<strong>. Adjecency list </strong>linklangan listlar ro&apos;yhati bo&apos;lib unda grafning har bir qirrasi va unga qo&apos;shni bo&apos;lgan qirralar birgalikda saqlanadi.</p><!--kg-card-begin: html--><table class="table table-hover" style="box-sizing: border-box; border-collapse: collapse; width: 690px; margin-bottom: 1.125rem; color: rgb(34, 34, 34); font-family: &quot;source sans pro&quot;, -apple-system, BlinkMacSystemFont, &quot;segoe ui&quot;, Roboto, &quot;helvetica neue&quot;, Arial, sans-serif, &quot;apple color emoji&quot;, &quot;segoe ui emoji&quot;, &quot;segoe ui symbol&quot;; font-size: 18px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><th style="box-sizing: border-box; text-align: -webkit-match-parent; padding: 0.75rem; vertical-align: bottom; border-top: 1px solid rgb(222, 226, 230); border-bottom: 2px solid rgb(222, 226, 230);">Vertex</th><th style="box-sizing: border-box; text-align: -webkit-match-parent; padding: 0.75rem; vertical-align: bottom; border-top: 1px solid rgb(222, 226, 230); border-bottom: 2px solid rgb(222, 226, 230);">Linked List of Vertices</th></tr></thead><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">1</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">2 &#x2192; 3 &#x2192; None</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">2</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">4 &#x2192; None</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">3</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">None</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">4</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">5 &#x2192; 6 &#x2192; None</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">5</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">6 &#x2192; None</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">6</td><td style="box-sizing: border-box; padding: 0.75rem; vertical-align: top; border-top: 1px solid rgb(222, 226, 230);">None</td></tr></tbody></table><!--kg-card-end: html--><p>Xuddi shu ulangan listni Pythonda quyidagicha ko&apos;rsatilishi ham mumkin. </p><pre><code>&gt;&gt;&gt; graph = {
...     1: [2, 3, None],
...     2: [4, None],
...     3: [None],
...     4: [5, 6, None],
...     5: [6, None],
...     6: [None]
... }</code></pre><p>Ushbu dictionary dagi keylar source qirralardir, uning valuelari yani listlar bo&apos;lsa shu qirraga qo&apos;shni bo&apos;lgan qirralarning.</p><p><strong>Ishlash unumdorligini taqqoslash: Listlar va linklangan Listlar (Performance comparison: Lists vs Linked Lists)</strong></p><p>Ko&apos;p dasturlash tillarida linklangan listlar va odatiy listlarning xotirada saqlanishida aniq farqlar bor. Pythonda esa ikkalasi ham bir xil usulda xotirada saqlanadi. Shuning uchun unumdorlik haqida o&apos;ylaganimizda Pythonda linklangan list va odatiy listlarning biror operatsiyani bajarishga ketadigan vaqti nuqtai nazardan taqqoslashimiz to&apos;g&apos;ri bo&apos;ladi.</p><p><strong>Element qo&apos;shish va o&apos;chirish</strong></p><p>Pythonda listga element qo&apos;shish uchun insert() yoki append() ishlatamiz. O&apos;chirish uchun esa pop() yoki remove(). Ushbu metodlarning bir biridan farqi shundaki insert() va remove() odatiy holatda listning boshidagi elementlar ustida amal bajaradi, pop() va append() esa listning oxiridagi elementlar ustida amal bajaradi. </p><p>Bilishimiz joiz bo&apos;lgan narsa, insert() va remove() ishlatilganda parda ortida elementlarni shift qilish talab etiladi va o&apos;z o&apos;rnida bu operatsiyalar ham qo&apos;shimcha vaqt talab qiladi. Biz insert() yoki append() metodlarini listning oxiriga ishlatadigan bo&apos;lsak unga konstant vaqt ketadi O(1), agar biz list metodlarini listning boshida yoki boshiga yaqin qo&apos;llaydigan bo&apos;lsak ushbu metodlar list hajmi ortgani sari operatsiyani bajarilishiga ketadigan vaqt ham proportsional tarzda oshadi O(n).</p><p>Linklangan listlar esa element o&apos;chirish yoki qo&apos;shishga kelganda unumdor hisoblanadi, yani u listning boshidami oxiridami farqi yo&apos;q ketadigan vaqt O(1) bo&apos;ladi.</p><p>Ushbu jihatda queue (FIFO) qilib ishlatganda linked listlar odatiy listlardan tezroq ishlaydi. Sababi Queueda element boshiga qo&apos;shiladi va boshidan o&apos;chiradi. Lekin linklangan listlarda Stackni implement qiladigan bo&apos;lsak (LIFO) unda odatiy list bilan o&apos;xshash ishlaydi. Sababi elementlar oxiridan qo&apos;shiladi va o&apos;chiriladi. </p><p><strong>Elementlarni olish</strong></p><p>Elementlarni olishga qolganda listlar linked listlarga qaraganda ancha tez ishlaydi. Agar biz qaysi element bizga kerakligini bilsa listdan uni O(1) vaqtda chiqarib olishimiz mumkin. Xuddi shu ishni linked listda bajaradigan bo&apos;lsak O(n) vaqt ketadi, sababi berilgan elementni topish uchun butun listni aylanib chiqish kerak bo&apos;ladi. </p><p>Malum elementli izlashga qolganda ikkala list ham bir xil ishlaydi. Ikkala holatda ham biz listni to&apos;liq iteratsiya qilib chiqishimiz kerak bo&apos;ladi.</p><p><em>collections.deque</em><strong> bilan tanishamiz</strong></p><p>Pythonning <strong>collections</strong> modulida linklangan listlarni implement qilish uchun <strong>deque</strong> deb nomlangan maxsus obyekt bor, <strong>double-ended-queue</strong>.</p><p><em>collections.deque</em> linklangan listlarda elementlarni olish, o&apos;chirish, qo&apos;shish, boshidan yoki oxiridan farqi yo&apos;q, barchasini O(1) vaqtda bajaradi.</p><p><em>collections.deque</em> <strong>dan foydalanish</strong></p><p>Deque o&apos;zi bilan bir nechta metodlarni olib keladi.</p><p>Birinchi linked list yasaymiz:</p><pre><code>&gt;&gt;&gt; from collections import deque
&gt;&gt;&gt; deque()
deque([])</code></pre><p>yuqoridagi kod bo&apos;sh linklangan list yasaydi. Yaratgan zahotimiz uni elementlar bilan to&apos;ldirishimiz mumkin, buning uchun argument sifatida istalgan iterable berib yuborsak bas:</p><pre><code>&gt;&gt;&gt; deque([&apos;a&apos;,&apos;b&apos;,&apos;c&apos;])
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;])

&gt;&gt;&gt; deque(&apos;abc&apos;)
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;])

&gt;&gt;&gt; deque([{&apos;data&apos;: &apos;a&apos;}, {&apos;data&apos;: &apos;b&apos;}])
deque([{&apos;data&apos;: &apos;a&apos;}, {&apos;data&apos;: &apos;b&apos;}])</code></pre><p>deque ga stringni argument sifatida berib, unga element qo&apos;shib va o&apos;chirib ko&apos;ramiz:</p><pre><code>&gt;&gt;&gt; llist = deque(&quot;abcde&quot;)
&gt;&gt;&gt; llist
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;, &apos;e&apos;])

&gt;&gt;&gt; llist.append(&quot;f&quot;)
&gt;&gt;&gt; llist
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;, &apos;e&apos;, &apos;f&apos;])

&gt;&gt;&gt; llist.pop()
&apos;f&apos;

&gt;&gt;&gt; llist
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;, &apos;e&apos;])</code></pre><p>Bu yerda append() ham pop() ham elementning oxirida amalga oshadi. Ammo biz deque bilan bemalol ushbu operatsiyalarni linked list boshida bajarishim ham mumkin:</p><pre><code>&gt;&gt;&gt; llist.appendleft(&quot;z&quot;)
&gt;&gt;&gt; llist
deque([&apos;z&apos;, &apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;, &apos;e&apos;])

&gt;&gt;&gt; llist.popleft()
&apos;z&apos;

&gt;&gt;&gt; llist
deque([&apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos;, &apos;e&apos;])</code></pre><p><strong>Queue va Stackni implement qilish</strong></p><p>Queue - Navbat</p><p>Queueni implement qilishda siz listga yangi value qo&apos;shib queue yaratasiz (enqueue), vaqti kelganda eng uzoq vaqt queueda qolgan elementni o&apos;chirasiz (dequeue). </p><pre><code>&gt;&gt;&gt; from collections import deque
&gt;&gt;&gt; queue = deque()
&gt;&gt;&gt; queue
deque([])

&gt;&gt;&gt; queue.append(&quot;Mary&quot;)
&gt;&gt;&gt; queue.append(&quot;John&quot;)
&gt;&gt;&gt; queue.append(&quot;Susan&quot;)
&gt;&gt;&gt; queue
deque([&apos;Mary&apos;, &apos;John&apos;, &apos;Susan&apos;])</code></pre><p>Hozir sizdagi navbatda Mary, John, va Susan bor, esingizda bo&apos;lsin queue FIFO qonuniga bo&apos;ysunadi, yani birinchi queuega kirgan element birinchi bo&apos;lib chiqib ketadi. </p><p>Bir oz vaqt o&apos;tgach navbatda turganlar uchun stollarda joylar bo&apos;shaydi va siz navbatga eng birinchi kelgan element ni queuedan mana bu tarzda o&apos;chirasiz:</p><pre><code>&gt;&gt;&gt; queue.popleft()
&apos;Mary&apos;

&gt;&gt;&gt; queue
deque([&apos;John&apos;, &apos;Susan&apos;])

&gt;&gt;&gt; queue.popleft()
&apos;John&apos;

&gt;&gt;&gt; queue
deque([&apos;Susan&apos;])</code></pre><p>har doim siz queuedan popleft() orqali element o&apos;chirsangiz parda ortida linked listdan head element o&apos;chadi, shu tariqa siz queueni implement qilgan bo&apos;lasiz.</p><h4 id="stack-taxmon">Stack - taxmon</h4><p>Stack yaratmoqchi bo&apos;lsangizchi, g&apos;oya juda ham queuega o&apos;xshash, yagona farq stacklar LIFO qonuniga bo&apos;ysunadi, bu degani stackga oxirgi qo&apos;shilgan elementni birinchi bo&apos;lib olib tashlasa bo&apos;ladi. </p><p>Tasavur qiling, siz web browser tarixi funksiyasini implement qilmoqchisiz, browser tarixida siz bemalol oxirgi kirgan websaytingizga birinchi bo&apos;lib qaytolasiz.</p><p>Biz bu xusisiyatni stack yordamida quyidagicha amalga oshirishimiz mumkin:</p><pre><code>&gt;&gt;&gt; from collections import deque
&gt;&gt;&gt; history = deque()

&gt;&gt;&gt; history.appendleft(&quot;https://realpython.com/&quot;)
&gt;&gt;&gt; history.appendleft(&quot;https://realpython.com/pandas-read-write-files/&quot;)
&gt;&gt;&gt; history.appendleft(&quot;https://realpython.com/python-csv/&quot;)
&gt;&gt;&gt; history
deque([&apos;https://realpython.com/python-csv/&apos;,
       &apos;https://realpython.com/pandas-read-write-files/&apos;,
       &apos;https://realpython.com/&apos;])</code></pre><p>Bu misolda siz birinchi bo&apos;sh browser tarixi yaratdingiz, va ketma ket unga uchta sayt urlini qo&apos;shdingiz, appendleft() yordamida siz har bir urlni linked listni head qismiga qo&apos;shdingiz. </p><p>Birozdan so&apos;ng foydalanuvchi realpython websaytining bosh sahifasiga qaytishga qaror qildi, biz tarixni yaratishda stackdan foydalanganimizni bilgan xolda, oxirgi elementdan boshlab stackdan chiqarib tashlaymiz (LIFO): </p><pre><code>&gt;&gt;&gt; history.popleft()
&apos;https://realpython.com/python-csv/&apos;

&gt;&gt;&gt; history.popleft()
&apos;https://realpython.com/pandas-read-write-files/&apos;

&gt;&gt;&gt; history
deque([&apos;https://realpython.com/&apos;])</code></pre><p>Va nixoyat, biz popleft() orqali elementlar qo&apos;shilgan tomondan boshlab biz xoxlagan urlga yetib kelguncha elementlarni chiqarib tashladik, va ushbu namuna stackning real qo&apos;llanishidir, bundan buyon stack yoki queuedagi challangelar bemalol pythonning collection modulidagi deque funksiyasi orqali amaliy stack yoki queue implement qilishimiz mumkin.</p><p><strong>O&apos;zingizni linklangan listingizni yarating</strong></p><p>Linklangan listni qanaqa qilib yaratish mumkin.</p><p>Linklangan listimizni boshlash uchun class yaratib olamiz:</p><pre><code>class LinkedList:
    def __init__(self):
        self.head = None</code></pre><p>Linked listni saqlash uchun bizga kerak bo&apos;ladigan yagona malumot bu listning qayerda boshlanishi yani <em>head, </em>biz uni yaratib oldik. Endi linked listning nodalarini implement qilish uchun boshqa class yaratamiz:</p><pre><code>class Node:
    def __init__(self, data):
        self.data = data
        self.next = None</code></pre><p>Yuqoridagi class yaratilishida siz ikkita asosiy noda elementlarini ko&apos;rishingiz mumkin, data va next, siz bunga yana __ repr __ method ham qo&apos;shishingiz mumkin, instance haqida to&apos;liqroq malumot bilan taminlash maqsadida:</p><pre><code>class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

    def __repr__(self):
        return self.data

class LinkedList:
    def __init__(self):
        self.head = None

    def __repr__(self):
        node = self.head
        nodes = []
        while node is not None:
            nodes.append(node.data)
            node = node.next
        nodes.append(&quot;None&quot;)
        return &quot; -&gt; &quot;.join(nodes)</code></pre><p>Ushbu yaratilgan ikkita class orqali biz tezda uchta nodaga ega bo&apos;lgan linked list yaratamiz.</p><pre><code>&gt;&gt;&gt; llist = LinkedList()
&gt;&gt;&gt; llist
None

&gt;&gt;&gt; first_node = Node(&quot;a&quot;)
&gt;&gt;&gt; llist.head = first_node
&gt;&gt;&gt; llist
a -&gt; None

&gt;&gt;&gt; second_node = Node(&quot;b&quot;)
&gt;&gt;&gt; third_node = Node(&quot;c&quot;)
&gt;&gt;&gt; first_node.next = second_node
&gt;&gt;&gt; second_node.next = third_node
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; None</code></pre><p>Node ning data va next qiymatlarini berish orqali biz anchagina tez linked list yasashimiz mumkin. LinkedList va Node classlar bizning linked list implement qlishimizning boshlanishi, bundan buyogiga faqat funksionalni oshiramiz.</p><p>Linked list classning __ init __() metodiga linked listni malumot bilan to&apos;ldirib olish uchun ozgina o&apos;zgarish qilamiz:</p><pre><code>def __init__(self, nodes=None):
    self.head = None
    if nodes is not None:
        node = Node(data=nodes.pop(0))
        self.head = node
        for elem in nodes:
            node.next = Node(data=elem)
            node = node.next</code></pre><p>Ushbu o&apos;zgarishdan so&apos;ng linked list yasash yanada tezroq bo&apos;ladi.</p><p><strong>Qanday qilib linked listni loop (traverse) qilish mumkin</strong></p><p>Traverse sodda qilib aytgandan iteratsiya qilish. Demak biz traverse qilish uchun __ iter __() funksiyasini yaratamiz, shunda bizning linked list ham odatiy listga o&apos;xshab loop qilish imkoniyatini beradi:</p><pre><code>def __iter__(self):
    node = self.head
    while node is not None:
        yield node
        node = node.next</code></pre><p>Ushbu metod listning har bir nodini yield qiladi. Muhimi __ iter __() metodida yield qilishdan oldin node ni None emasligini tekshring, sababi agar node Nonde bo&apos;lsa biz linked listning oxiriga yetib kelgan bo&apos;lamiz. </p><pre><code>&gt;&gt;&gt; llist = LinkedList([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;])
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; e -&gt; None

&gt;&gt;&gt; for node in llist:
...     print(node)
a
b
c
d
e</code></pre><p><strong>Yangi noda qo&apos;shish</strong></p><p>Yangi noda qo&apos;shishning bir nechta usullari bor va har birining o&apos;ziga yarasha qiyinchiligi bor, shuning uchun biz nodeni boshiga qo&apos;shish, oxiriga qo&apos;shish yoki qaysidur ikkita noda orasiga qo&apos;shishni alohida funksiyalarga ajratib olamiz.</p><p>Boshidan qo&apos;shish</p><p>Boshidan qo&apos;shish bu eng osoni, sababi yangi elementni head deb belgilab qo&apos;ysak bas, listni traverse qilishga xojat yo&apos;q:</p><pre><code>def add_first(self, node):
    node.next = self.head
    self.head = node</code></pre><p>Ushbu metod quyidagicha ishlaydi:</p><pre><code>&gt;&gt;&gt; llist = LinkedList()
&gt;&gt;&gt; llist
None

&gt;&gt;&gt; llist.add_first(Node(&quot;b&quot;))
&gt;&gt;&gt; llist
b -&gt; None

&gt;&gt;&gt; llist.add_first(Node(&quot;a&quot;))
&gt;&gt;&gt; llist
a -&gt; b -&gt; None</code></pre><p>Oxiriga qo&apos;shish</p><p>Yangi nodeni oxiriga qo&apos;shish uchun linked listni to&apos;liq traverse qilishimiz kerak bo&apos;ladi, next label None ga teng bo&apos;lganda qo&apos;shib qo&apos;yamiz, oddiy listdagi kabi linked listda append qilib qo&apos;yishning iloji yo&apos;q, sababi biz oxirgi element qaysiligini bilmaymiz.</p><p>Ushbu metod bilan biz linked list oxiriga node qo&apos;shamiz:</p><pre><code>def add_last(self, node):
    if self.head is None:
        self.head = node
        return
    for current_node in self:
        pass
    current_node.next = node</code></pre><p>Bu yerda for loop StopIteration Exception otgunicha linked listning o&apos;zini loop qilaveramiz, loopdan chiqib ketganda bizning current_node o&apos;zgaruvchimiz oxirgi nodaga teng bo&apos;lgan bo&apos;ladi, shunda biz oxirgi nodaning next referensini yangi nodaga qaratamiz, shunda oxirgi noda yangi qo&apos;shilgan nodaga aylanadi.</p><p>misol:</p><pre><code>&gt;&gt;&gt; llist = LinkedList([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;])
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; None

&gt;&gt;&gt; llist.add_last(Node(&quot;e&quot;))
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; e -&gt; None

&gt;&gt;&gt; llist.add_last(Node(&quot;f&quot;))
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; e -&gt; f -&gt; None</code></pre><p>Ikkita noda orasiga noda qo&apos;shish</p><p>Ikkita noda orasiga noda qo&apos;shish, yani biz xoxlagan nodadan oldin yoki keyin noda qo&apos;shish navbatdagi challange, uni amalga oshirish uchun ikkita metod yaratib olamiz:</p><ol><li>Berilgan nodadan keyin qo&apos;shish</li><li>Berilgan nodadan oldin qo&apos;shish</li></ol><p>Berilgan nodaning datasini qiymatiga qarab shu qiymatdan keyin noda qo&apos;shish metodi:</p><pre><code>def add_after(self, target_node_data, new_node):
    if self.head is None:
        raise Exception(&quot;List is empty&quot;)

    for node in self:
        if node.data == target_node_data:
            new_node.next = node.next
            node.next = new_node
            return

    raise Exception(&quot;Node with data &apos;%s&apos; not found&quot; % target_node_data)</code></pre><p>Bu yerda birinchi ishimiz biz izlayotgan dataga ega bo&apos;lgan noda bor yo&apos;qligi, biz izlayotgan datani topganimizda, list ketmaketligini buzmaslik uchun birinchi yangi nodaning next valuesini hozirgi nodaning next valuesiga tenglab olamiz, keyin hozirgi nodaning next valuesini yangi nodaga tenglaymiz.</p><p>Bu metodda ikkita exception qo&apos;lladik, birinchisi list bo&apos;sh bo&apos;lsa xabar beradi, ikkinchisi esa biz izlagan dataga ega noda yo&apos;q bo&apos;lsa.</p><pre><code>&gt;&gt;&gt; llist = LinkedList()
&gt;&gt;&gt; llist.add_after(&quot;a&quot;, Node(&quot;b&quot;))
Exception: List is empty

&gt;&gt;&gt; llist = LinkedList([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;])
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; None

&gt;&gt;&gt; llist.add_after(&quot;c&quot;, Node(&quot;cc&quot;))
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; cc -&gt; d -&gt; None

&gt;&gt;&gt; llist.add_after(&quot;f&quot;, Node(&quot;g&quot;))
Exception: Node with data &apos;f&apos; not found</code></pre><p>add_before() metodi implement qilishga harakat qilamiz:</p><pre><code> 1 def add_before(self, target_node_data, new_node):
 2    if self.head is None:
 3        raise Exception(&quot;List is empty&quot;)
 4
 5    if self.head.data == target_node_data:
 6        return self.add_first(new_node)
 7
 8    prev_node = self.head
 9    for node in self:
10        if node.data == target_node_data:
11            prev_node.next = new_node
12            new_node.next = node
13            return
14        prev_node = node
15
16    raise Exception(&quot;Node with data &apos;%s&apos; not found&quot; % target_node_data)</code></pre><p>Bu yerda ayrim narsalarni eslab qolish juda muhim. Birinchi add_after() da qilganimiz kabi list bo&apos;sh yoki bo&apos;sh emasligini tekshirishimiz lozim.</p><p>Ikkinchisi agar biz yangi nodani head element oldiga qo&apos;shmoqchi bo&apos;lsak add_first() metodigan qayta foydalanib qo&apos;ysak bo&apos;ladi, sababi biz head ni oldiga qo&apos;shmoqchi bo&apos;lsak demak biz shunchaki headni almashtirib qo&apos;ymoqchimiz xolos.</p><p>Oxirgisi biz element oldidan element qo&apos;shayotgandan undan oldinda turgan eski elementni (prev_node) bilishimiz shart, sababi yangi qo&apos;shilgan elementni undan orqada qolayotgan elementga next qilib belgilashimiz kerak, ketma ketlik buzilmasligi uchun.</p><p>Qimmatbaho namuna ))</p><pre><code>&gt;&gt;&gt; llist = LinkedList()
&gt;&gt;&gt; llist.add_before(&quot;a&quot;, Node(&quot;a&quot;))
Exception: List is empty

&gt;&gt;&gt; llist = LinkedList([&quot;b&quot;, &quot;c&quot;])
&gt;&gt;&gt; llist
b -&gt; c -&gt; None

&gt;&gt;&gt; llist.add_before(&quot;b&quot;, Node(&quot;a&quot;))
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; None

&gt;&gt;&gt; llist.add_before(&quot;b&quot;, Node(&quot;aa&quot;))
&gt;&gt;&gt; llist.add_before(&quot;c&quot;, Node(&quot;bb&quot;))
&gt;&gt;&gt; llist
a -&gt; aa -&gt; b -&gt; bb -&gt; c -&gt; None

&gt;&gt;&gt; llist.add_before(&quot;n&quot;, Node(&quot;m&quot;))
Exception: Node with data &apos;n&apos; not found</code></pre><p>Linklangan listga element qo&apos;shish borasida barcha metodlar tayyor.</p><p><strong>Linklangan listdan nodani o&apos;chirish</strong></p><p>Linklangan listdan element o&apos;chirishda o&apos;chirilishi kerak bo&apos;lgan elementni topish uchun biz avval listni to&apos;liq aylanib chiqishimiz kerak bo&apos;ladi. Kerakli elementni topganimizdan keyin undan bitta oldingi va bitta keyingi elementlarni ulab qo&apos;yamiz.</p><p>Bu degani siz Listni traverse qilayotganda izlanayotgan elementdan oldingi nodani track qilishingiz kerak bo&apos;ladi:</p><pre><code> 1 def remove_node(self, target_node_data):
 2    if self.head is None:
 3        raise Exception(&quot;List is empty&quot;)
 4
 5    if self.head.data == target_node_data:
 6        self.head = self.head.next
 7        return
 8
 9    previous_node = self.head
10    for node in self:
11        if node.data == target_node_data:
12            previous_node.next = node.next
13            return
14        previous_node = node
15
16    raise Exception(&quot;Node with data &apos;%s&apos; not found&quot; % target_node_data)</code></pre><p> &#xA0;Here is an example:</p><pre><code>&gt;&gt;&gt; llist = LinkedList()
&gt;&gt;&gt; llist.remove_node(&quot;a&quot;)
Exception: List is empty

&gt;&gt;&gt; llist = LinkedList([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;])
&gt;&gt;&gt; llist
a -&gt; b -&gt; c -&gt; d -&gt; e -&gt; None

&gt;&gt;&gt; llist.remove_node(&quot;a&quot;)
&gt;&gt;&gt; llist
b -&gt; c -&gt; d -&gt; e -&gt; None

&gt;&gt;&gt; llist.remove_node(&quot;e&quot;)
&gt;&gt;&gt; llist
b -&gt; c -&gt; d -&gt; None

&gt;&gt;&gt; llist.remove_node(&quot;c&quot;)
&gt;&gt;&gt; llist
b -&gt; d -&gt; None

&gt;&gt;&gt; llist.remove_node(&quot;a&quot;)
Exception: Node with data &apos;a&apos; not found</code></pre><p>Shu xolos, endi biz linklangan listni implement qilishni bilamiz. Agar biz hozir o&apos;rgangan bilimlarimizni o&apos;zlashtirishga ulgurgan bo&apos;lsak, maslahat berardim quyidagi topshiriqlarni mustaqil bajarishingizga:</p><ol><li>Ma&apos;lum o&apos;rinda turgan elementni olish: llist.get(i) yoki llist[i].</li><li>Linked listni teskari sort qilish yani reverse qilish, llist.reverse()</li><li>LinkedList classdan inherit qiluvchi Queue classini yaratish va shu classda enqueue(), dequeue() metodlarini realizatsiya qiling.</li></ol><hr><p><strong>Komplex Linked Listlardan foydalanish</strong></p><p>Hozirgacha biz faqat bir tomonlama (singly linked lists) ulangan listnarning tuzilishi va ishlashini o&apos;rgandik. Ammo linked listlarning boshqacha turlari ham mavjud va ular biroz boshqa maqsadlarda ishlatiladi.</p><p>Ikki tomonlama ulangan listlar (<strong>Doubly linked lists</strong>)</p><p>Ikki tomonlama ulangan listlarni nodasida ikkita reference bo&apos;ladi:</p><ol><li>Birinchisi Prev yani oldingi elementga</li><li>Ikkinchisi Next yani keyingi elementga reference</li></ol><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-11.png" class="kg-image" alt loading="lazy" width="548" height="178"></figure><p>Yuqoridagi namunaga biroz o&apos;zgarish kiritib ikki tomonlama ulangan list yasashimiz mumkin:</p><pre><code>class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        self.previous = None</code></pre><p>Shu yo&apos;l bilan biz listni faqat oldinga emas orqaga qarab ham traverse qilishimiz mumkin, previous reference yordamida.</p><p>Sturktura jihatdan ushbu ko&apos;rinishda bo&apos;ladi:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-12.png" class="kg-image" alt loading="lazy" width="1496" height="314"></figure><p>collections.deque linked listlarni sturkturasi ichida ishlatishadi, lekin u ikki tomonlama ulangan listlarni ishlatmaydi. Ikki tomonlama ulangan listlar bilan esa deque istalgan elementni O(1) muddatda o&apos;chirgan bo&apos;lar edi.</p><p>Halqasimon ulangan listlar (<strong>Circular linked lists</strong>)</p><p>Halqasimon ulangan listlarda oxirgi elementning next referensi birnchi elementga yani headga qaratilgan bo&apos;ladi, va ushbu ko&apos;rinish tabiikiy halqasimon ko&apos;rinish yasaydi.</p><p>Halqasimon ulangan listlarni ajoyib ishlatilish holatlari mavjud:</p><!--kg-card-begin: markdown--><ul>
<li>Qayta qayta har bir o&apos;yinchiga navbatni berish ko&apos;p o&apos;yinchilar qatnasha oladigan o&apos;yinlarda</li>
<li>Berilgan operatsion sistemada applicationning life cycle ini boshqarish uchun</li>
<li>Fibonacci heap yasashda</li>
</ul>
<!--kg-card-end: markdown--><p>Ko&apos;rinish jihatdan quyidagicha:</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-13.png" class="kg-image" alt loading="lazy" width="1446" height="402"></figure><p>Halqasimon ulangan listlarning bir ustunligi siz bu listni istalgan elementidan boshlab to&apos;liq traverse qilishingiz mukin, faqat traversing boshlangan elementni eslab qolish va shu elementga qaytib kelganda loopni to&apos;xtatish zarur, aks holda checksiz loop hosil bo&apos;ladi.</p><p>Halqasimon ulangan listlarni implement qilish unchalik qiyinmas, bitta o&apos;zgarish bu listlarda siz traversing boshlanish nuqtasini o&apos;zingiz bera olasiz:</p><pre><code>class CircularLinkedList:
    def __init__(self):
        self.head = None

    def traverse(self, starting_point=None):
        if starting_point is None:
            starting_point = self.head
        node = starting_point
        while node is not None and (node.next != starting_point):
            yield node
            node = node.next
        yield node

    def print_list(self, starting_point=None):
        nodes = []
        for node in self.traverse(starting_point):
            nodes.append(str(node))
        print(&quot; -&gt; &quot;.join(nodes))</code></pre><p>Endi listni traverse qilish bittagina argument oladi, starting_point, bu argument biz uchun ham traversingning boshi va oxiri bo&apos;lib xizmat qiladi.</p><p>Oxirgi namuna halqasimon listlarni ishlatish namunasi bo&apos;ladi:</p><pre><code>&gt;&gt;&gt; circular_llist = CircularLinkedList()
&gt;&gt;&gt; circular_llist.print_list()
None

&gt;&gt;&gt; a = Node(&quot;a&quot;)
&gt;&gt;&gt; b = Node(&quot;b&quot;)
&gt;&gt;&gt; c = Node(&quot;c&quot;)
&gt;&gt;&gt; d = Node(&quot;d&quot;)
&gt;&gt;&gt; a.next = b
&gt;&gt;&gt; b.next = c
&gt;&gt;&gt; c.next = d
&gt;&gt;&gt; d.next = a
&gt;&gt;&gt; circular_llist.head = a
&gt;&gt;&gt; circular_llist.print_list()
a -&gt; b -&gt; c -&gt; d

&gt;&gt;&gt; circular_llist.print_list(b)
b -&gt; c -&gt; d -&gt; a

&gt;&gt;&gt; circular_llist.print_list(d)
d -&gt; a -&gt; b -&gt; c</code></pre><p>Sezgan bo&apos;lsangiz None degan element yo&apos;q, sababi listda oxirgi element degan narsani o&apos;zi yo&apos;q. Keyingi farq biz starting_point ni berganimizda go&apos;yoki butunlay boshqa list hosil bo&apos;layapti )).</p><hr><p>O&apos;qib chiqganlar uchun rahmat ! <a href="https://realpython.com/linked-lists-python/">RealPython</a> web sahifasidan tarjima qilindi. Tarjima hechqanaqa adabiy til yoki termin tarjimasiga suyanmagan. Izohlar bo&apos;lsa izohingizni <a href="http://ubaydullo.uz">ubaydullo.uz</a> sahifasida xabar sifatida qoldirishingiz mumkin.</p>]]></content:encoded></item><item><title><![CDATA[Pythonda xotira boshqaruvi (Memory management)]]></title><description><![CDATA[<p>Xotira bu bo&apos;sh kitobga o&apos;xshaydi, qisqa hikoyalarga mo&apos;ljallangan, lekin hali biror hikoya yozilmagan. Xotiradan foydalanish boshlanganda har xil avtorlar paydo bo&apos;ladi va har bir sahifaga o&apos;zlarining hikoyalarini yozishni boshlaydi. </p><p>Har bir avtor kitobga hikoya yozishdan oldin ehtiyot bo&apos;lishlari</p>]]></description><link>https://ubaydullo.digitalpress.blog/pythonda-xotira-boshqaruvi/</link><guid isPermaLink="false">623aab30aad635000181c4be</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Thu, 24 Mar 2022 05:24:56 GMT</pubDate><content:encoded><![CDATA[<p>Xotira bu bo&apos;sh kitobga o&apos;xshaydi, qisqa hikoyalarga mo&apos;ljallangan, lekin hali biror hikoya yozilmagan. Xotiradan foydalanish boshlanganda har xil avtorlar paydo bo&apos;ladi va har bir sahifaga o&apos;zlarining hikoyalarini yozishni boshlaydi. </p><p>Har bir avtor kitobga hikoya yozishdan oldin ehtiyot bo&apos;lishlari kerak, yani birovning sahifasiga boshqa avtor hikoya yozib yuborishi mumkin emas, shuning uchun hikoya yozmoqchi bo&apos;lgan yozuvchi kitob menejeri bilan bog&apos;lanadi va u ruxsat bergan sahifaga hikoya yozadi.</p><p>Kitob ko&apos;p yillardan beri foydalanilayotgani uchun unda keraksiz hikoyalar ko&apos;payib ketishi tabiiy. Shunda ushbu hikoyalar boshqa yangi hikoyalar yozilishu uchun o&apos;chirib tashlanadi. </p><p>Kitobni biz yaxlit xotira va uning varoqlarini malum bir chegaralangan miqdordagi xotira blocklarini saqlovchi soha sifatida qarayapmiz, sahifalarga hikoya yozadigan avtorlar esa kompyuterda ishga tushadigan turli dasturlardir. Avtorlar qaysi sahifaga hikoya yozishga ruxsat etilganligini belgilovchi kitob menejeri bu Xotira boshqaruvchisidir <strong>(Memory manager)</strong>. Yangi xotira yaratish uchun eski hikoyalarni o&apos;chiradigan kishi esa musorchi<strong> (Garbage collector)</strong></p><p><strong>Xotira boshqaruvi (Memory management)</strong></p><p>Xotira boshqaruvi bu har bir dastur xotiradan o&apos;qish va unga yozilishi tushuniladi. Dastur o&apos;zi uchun malum xotira band qilishi mumkin, yoki malum xotira ishlatilmagan taqdirda uni bo&apos;shatishi mumkin. Ushbu protsess umumiy qilib memory allocation deyiladi.</p><p><strong>Python turlari</strong></p><p>Asl Python C dasturlash tilida yozilgan. Python interpretastsiya jarayonida bytecode ga o&apos;giriladi, va bu bytecode lar .pyc fayllarda yoki __ pycache __ papkasida saqlanadi. Pythonning Cpythondan boshqa ko&apos;plab turlari borligini ham sanab o&apos;tish joiz: Iron Python Microsoftning Common Language Runtime modulida ishlay olish uchun kompilyatsiya bo&apos;ladi. JPython Java virtual mashenasida Python code ni Java bytecode ga kompile qilish uchun. PyPy, bu haqda alohida <a href="https://realpython.com/pypy-faster-python/">maqola</a> o&apos;qib chiqishni taklif qilar edim.</p><p><strong>Python obyektlari</strong></p><p>Pythonda hama narsa obyekt deb eshitgan bo&apos;lsangiz kerak, misol uchun str malumot turi, int malumot turi, ularning barchasi obyekt. CPythonda barcha obyekt ishlatadigan PyObject degan struct bor.</p><p>Struct bu C dasturlash tilida turli malumot turlarini birlashtiruvchi strukturadir. OOP qiyosida qaraydigan bo&apos;lsak u faqat atributlari bor lekin metodlari yo&apos;q klassga o&apos;xshaydi.</p><p>PyObject bu barcha Python obyektlarning eng katta bobosi hisoblanadi, va u faqat ikkita narsadan tashkil topadi.</p><ol><li>ob_refcnt: &#xA0;reference count</li><li>ob_type: &#xA0; pointer to another object</li></ol><p>ob_refcnt Pythonda garbage collection uchun ishlatiladi. ob_type esa boshqa bir malumot turiga havola (dict, int va h.kz)</p><p>Har bir obyektning o&apos;zi uchun specific xotira beruvchi boshqaruvchisi bo&apos;ladi (memory allocator), u obyektga qarab qanaqa qilib shu obyektga taaluqli malumotno xotiraga yozish uchun qanaqa qilib xotira olishni biladi, shu bilan &#xA0;birga xotirani deallocation qiladigan ham manager bo&apos;ladi, xotirga ishlatilmay qolganda uni boshqa maqsadlar uchun ozod qiladi.</p><p>Xotira ajratish va xotirani ozod qilish haqida gap ketganda bir muhim narsani esda tutish lozim. Xotira bu barcha uchun birdek bo&apos;lishiladigan joy, shu sababli har xil xotira boshqaruvchisi bitta xotiraga yozishga harakat qilganda nojuya natijalarga olib kelishi mumkin. </p><p><strong>GIL Global interpreter lock</strong></p><p>Pythonda thread tarqatilgan xotira ustida amal bajarayotganda, boshqa thread uning dumini bosib olmasligi uchun GIL yechim hisoblanadi. Misol uchun ikkita shoir bitta listga sher yozsa oxirgi natija tushunarsiz text bo&apos;lib qoladi, GIL bu muammoga bitta listga bir vaqtda faqat bitta shoir sher yozoladi degan qoida bilan buning oldini oladi.</p><p><strong>Axlat yig&apos;ish (Garbage collection) </strong></p><p>Yuqorida misol keltirilgan shoirlar tushunchasida misol qiladigon bo&apos;lsak, biror varoqdagi sher endi bizga kerak bo&apos;lmaydigan bo&apos;lsa biz undan qutilishimiz mumkin, yani o&apos;chirib boshqa sher yozishimiz mumkin.</p><p>O&apos;chirib yuborilgan eski sherni biz 0 (nol) ga tushirib qo&apos;yilgan ob_refcnt yani object reference countga o&apos;xshatishimiz mumkin. </p><p>Pythonda ref_count har xil sabablarga ko&apos;ra o&apos;sib borishi mumkin, misol uchun yangi o&apos;zgaruvchiga biriktirilsa.</p><!--kg-card-begin: html--><pre><code>numbers = [1, 2, 3]
# Reference count = 1
more_numbers = numbers
# Reference count = 2
</code></pre><!--kg-card-end: html--><p>ref_count o&apos;zgaruvchini funksiyaga argument qilib bergan taqdirda ham o&apos;zgaradi</p><!--kg-card-begin: html--><pre><code>total = sum(numbers)</code></pre><!--kg-card-end: html--><p>ref_count o&apos;zgarishiga oxirgi misol bu, agar siz o&apos;zgaruvchini list elementlari qilib bergan taqdiringizda ref_count oshib boradi.</p><!--kg-card-begin: html--><pre><code>matrix = [numbers, numbers, numbers]
</code></pre><!--kg-card-end: html--><p>Pythonda istalgan obyektni ref_countini bilib olishingiz mumkin, bu funksiya sys modulning getrefcount() funksiyasi orqali amalga oshiriladi, lekin yodingizda bo&apos;lsin, obyektning refcountini ko&apos;rish uning ref_countini yana bittaga oshiradi.</p><p><strong>Xotira boshqaruvi (Memory management)</strong></p><p>CPythondan hardware qadar orada abstraksiya qatlamlari mavjud. OS har doim applicationlar amal bajarishlari uchun fizik xotiradan joy ajratib virtual xotira yaratadi. Quyidagi to&apos;q kulrang sohalar Python uchun mo&apos;ljallangan xotiradir.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image.png" class="kg-image" alt loading="lazy" width="960" height="540"></figure><p>Cpythonning object allocatori object memory sohasidan xotira ajratish uchun javobgardir. Ushbu yashil object allocator soha asosiy mo&apos;jiza yuz beradigon yerdir. U har doim pythonda yangi object yaratilayotganda yoki o&apos;chirilayotganda ishga tushadi.</p><p>Pythonning <a href="https://github.com/python/cpython/blob/7d6ddb96b34b94c1cbdf95baa94492c48426404e/Objects/obmalloc.c"><strong>source cod</strong></a>iga berilgan izohlarda object allocatorga &quot;umumiy malloc ustida ishlovchi va kichik hajmdagi blocklar uchun qulay&quot; deyiladi. Bu yerda malloc C ning xotira boshqaruvi bibliotekasining funksiyasi hisoblanadi.</p><p>Hozir CPythonning xotira boshqaruvi strategiyasidagi 3 ta asosiy aspektga etibor beramiz.</p><p>Arena bu xotiradagi bir varoq deb hisoblangan Soha chegarasidir (page boundary). Soha chegarasi (page boundary) bu malum hajmdagi birlik deb hisoblangan va OS foydalanadigan xotiradagi bir bo&apos;shliq. Python xotiradagi sohani 256 kb deb tasavvur qiladi.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-1.png" class="kg-image" alt loading="lazy" width="960" height="540"></figure><p>Sohalar orasida havzalar (pool) lar mavjud, ular virtual xotirada 4 kb hisoblanadi. Kitob qiyosida oladigan bo&apos;lsak bitta pool bir varoq degani. Har bir pool yanada kichikroq xotira blocklariga bo&apos;linadi. </p><p>Pooldagi har bir blockning o&apos;zining size class i bo&apos;ladi. Bar bir size class mahsus block hajmini bildiradi, maxsus block hajmi so&apos;ralayotgan bosh xotira hajmiga bog&apos;liq, Pythonning source codida aynan ushbu izohlar qancha hajm egallaydigan object qanaqa blockga tushishi jadvali keltirilgan.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-2.png" class="kg-image" alt loading="lazy" width="776" height="730"></figure><p> Misol uchun, 42 byte hajmdagi obyektni saqlamoqchi bo&apos;lsa, python bizga 48 byteli blockga yo&apos;naltiradi.</p><p>Poollar bir xil size class dan yaratilgan xotira blocklaridir. Har bir pool o&apos;zida o&apos;xshash size classga tegishli boshqa pool uchun double linked lists saqlaydilar (qo&apos;shaloq ulanganlik havolasi). &#xA0;Shu usulda Python so&apos;ralayotgan xotirani osongina bir nechta pool bo&apos;ylab izlab topishi mumkin.</p><p>usedpools har bir xotira blocki uchun ishlatilgan lekin bo&apos;sh joylari bor xotira blocklari listini o&apos;zida saqlaydi. Poollar 3 ta holatda bo&apos;lishlari mumkin: used, full, yoki empty. used ishlatilgan lekin bo&apos;sh orin bor, full bo&apos;sh o&apos;rin yoq, empty ishlatilmagan. </p><p>freepools ro&apos;yhati ishlatilmagan poollarni ro&apos;yhatini o&apos;z ichida saqlaydi, lekin qachon poollari ishlatilmasdan qoladi, yoki bo&apos;shatiladi ? </p><p>Tasavur qiling, siz 8 byte lik xotira so&apos;radingiz, biror usedpoolda uncha xotira topilmadi, shunda biz freepoollardan birortasini olamiz va unga 8 byte lik xotira blockini yaratib malumotni saqlaymiz, shunda ushbu pool usedpoolss listiga qo&apos;shiladi, keyingi xotira allocationida ishlatiladi.</p><p>Yoki biror fullpool ning biror blocki bo&apos;shasa, ushbu block boshqa kerak bo&apos;lmaganligi sababli, u pool o&apos;z size classiga qarab usedpoolsga qo&apos;shiladi.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-3.png" class="kg-image" alt loading="lazy" width="960" height="540"></figure><p>Diagrammada ko&apos;rib turganingizdek poolning bo&apos;sh xotira blocklariga pointeri qaratilgan bo&apos;ladi. Bu sturkturaning ishlash prinsipida biroz yetishmovchilik bor. Pointer uch qatlam bo&apos;yicha ishlaydi (arena, pool, block) va u haqiqatdan kerak bo&apos;lmasa xotira blockini ishlatmaydi.</p><p>Poolning blocklarida 3 ta holat bo&apos;ladi:</p><!--kg-card-begin: markdown--><ul>
<li><strong>Untouched:</strong> Hali allocatsiya qilinmagan xotira blocki</li>
<li><strong>Free:</strong> Allocation qilingan lekin keyinchalik CPython uni bo&apos;shatgan, va hozircha kerakli malumot o&apos;zida saqlamayatkan block</li>
<li><strong>Allocated:</strong> O&apos;zida kerakli malumot saqlab turgan xotira blocki</li>
</ul>
<!--kg-card-end: markdown--><p>Freeblock pointeri doim ishlatilmayotgan yani biror malumot saqlasa bo&apos;ladigan blocklarga qaratilgan bo&apos;ladi. Agar so&apos;ralayotgan xotira freeblocklarda yetarli bo&apos;lmasa, allocator pooldagi untouched blocklardan kerakli miqdorda oladi.</p><p>Qachonki xotira menejeri biror xotira blockini bo&apos;shatsa ushbu block freeblocks listga qo&apos;shib qo&apos;yiladi. Freeblocklar tepadagi diagrammaga o&apos;xshab ketma ket yopishib turmasligi ham mumkin aksincha quyidagi diagrammada ko&apos;rsatilgandek bo&apos;lishi mumkin: </p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-4.png" class="kg-image" alt loading="lazy" width="960" height="540"></figure><p><strong>Arenas</strong></p><p>Arenalar poollardan tashkil topadi. Poollar uch holatda yani used, full, empty bo&apos;lishi mumkin. Arenaning o&apos;zida esa pool kabi malum xolat mavjud emas. </p><p>Arenalar o&apos;zaro bog&apos;langan list ko&apos;rinishida qurilgan va bu list usable_arenas deb nomlanadi. Bu list foydalanilgan poollar soniga qarab sort qilingan bo&apos;ladi, yani qancha ko&apos;p poool ishlatilgan bo&apos;lsa shu arena listning boshiga yaqin bo&apos;ladi. </p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2022/03/image-5.png" class="kg-image" alt loading="lazy" width="960" height="540"></figure><p>Bundan chiqdi xotira zarur bo&apos;lganda eng malumotga to&apos;la arena tanlanadi, eng malumoti kam erana emas. Buning sababi nima ? nima uchun teskarisi emas ?</p><p>Bu narsa bizni xotirani to&apos;laqonli bo&apos;shatish tushunchasiga olib keladi, yani xotira blocki bo&apos;shatilganganda u to&apos;laqonli bo&apos;shatilmaydi, yani OS ga qaytarilmaydi, uni Python allocation xolatida saqlaydi. Xotira to&apos;laqonli bo&apos;shatilsa u OS ga qaytarilishi kerak.</p><p>To&apos;laqonli bo&apos;shatilishi mumkin bo&apos;lgan narsa bu faqat Arenadir. usable_arenas listni maqsadi shuki bo&apos;sh xolatga yaqin bo&apos;lgan arenalar bo&apos;shatilishu zarur, shunda malum xotira to&apos;laqonli bo&apos;shatilishi mumkin, va Python programmasi ishlatayotgan umumiy xotira hajmi kamayadi.</p><p><strong>Xulosa</strong></p><p>Xotira boshqaruvi kompyuter olamining muhim integral qismi hisoblanadi. Yaxshimi yoki yomonmi Python buning barchasini parda ortida bajaradi.</p><p>Biz ushbu maqolada o&apos;rgandik:</p><!--kg-card-begin: markdown--><ul>
<li>Xotira boshqaruvi nima va u nima uchun muhim ?</li>
<li>Pythonning o&apos;z asl xolati, CPython, C dasturlash tilida yozilgan</li>
<li>CPythonda xotira boshqaruvini taminlash uchun malumotlar strukturasi va lagoritmlar birgalikda qanday ishlaydi</li>
</ul>
<!--kg-card-end: markdown--><p>Python compyuter bilan ishlashning mayda detallarini abstraktsiyalashtiradi. Bu bizga yuqori qatlamdagi funksionallarni har bitta bit hardwareda qanday saqlanishi haqida qayg&apos;urmasdan yaratishimizga imkon beradi.</p>]]></content:encoded></item><item><title><![CDATA[Django kabi ba'zi web freymworklar bilan integratsiyalashish uchun vue ilovasini yaratishda yordam beradigan shp..., ee uzbekcha so'z yoqda, xullas shpargalka.]]></title><description><![CDATA[<p>Django uchun vue ilovasini yaratish, Proyektingizning bosh papkasiga kiring va shu yerda Vue js ning oxirgi variantini o&apos;rnating:</p><p><strong><em>npm install -g @ vue / cli</em></strong></p><p><strong><br></strong>Va ushubu buyruq yordamida frontend dasturingizni osongina yarating:</p><p><em><strong>vue create &lt;application_name&gt;</strong></em></p><p>Shu zahoti siz vue frontend dastur yaratish uchun sozlamalar tanlovini ko&</p>]]></description><link>https://ubaydullo.digitalpress.blog/prostaia-shparghalka-po-sozdaniiu-prilozhieniia-vue-dlia-intieghratsii-s-niekotorymi-frieimvorkami-takimi-kak-django/</link><guid isPermaLink="false">6136e87d2eb01f0001429268</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Tue, 07 Sep 2021 04:33:39 GMT</pubDate><content:encoded><![CDATA[<p>Django uchun vue ilovasini yaratish, Proyektingizning bosh papkasiga kiring va shu yerda Vue js ning oxirgi variantini o&apos;rnating:</p><p><strong><em>npm install -g @ vue / cli</em></strong></p><p><strong><br></strong>Va ushubu buyruq yordamida frontend dasturingizni osongina yarating:</p><p><em><strong>vue create &lt;application_name&gt;</strong></em></p><p>Shu zahoti siz vue frontend dastur yaratish uchun sozlamalar tanlovini ko&apos;rasiz:<br></p><ol><li>Dastur opsiyalarini qo&apos;lda sozlashni tanlang, &quot;manual&quot;</li><li>ushbu fundamental paketlarni tanlang: babel, vuex, css preprocessors, router</li><li>Vue ning oxirgi versiyasini tanlang, misol uchun 4.X</li><li>marshrutizator tarixini saqlash funksiyasi uchun &quot;ha&quot; ni tanlang</li><li>CSS -ni minifikatsiya qilish uchun o&apos;zingiz maqul ko&apos;rgan texnologiyani tanlang (dart sass)</li><li>Babel, Es Lint va boshqala paket konfiguratsiyalarini saqlash usulini tanlang.</li><li>Agar siz ushbu konfiguratsiyani kelajakdagi loyihalar uchun saqlamoqchi bo&apos;lsangiz, &quot;Ha&quot; ni tanlang, aks holda &quot;Yo&apos;q&quot;.</li><li>Bajarildi!<br></li></ol><p>Endi siz front end dasturingizni ushbu komanda bilan ishlatishingiz mumkin:<br><strong><em>npm run serve</em></strong></p><p>Va ushbu buyruq yordamida dasturingiz uchun kerak bo&apos;lgan Js paketlarni o&apos;rnatib olishingiz mumkin:</p><p><em><strong>npm install &lt;package_name&gt;</strong></em> </p><p>Tamom!</p><hr><p>&#x421;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; vue &#x434;&#x43B;&#x44F; django, &#x43F;&#x435;&#x440;&#x435;&#x439;&#x434;&#x438;&#x442;&#x435; &#x432; &#x43A;&#x43E;&#x440;&#x43D;&#x435;&#x432;&#x443;&#x44E; &#x43F;&#x430;&#x43F;&#x43A;&#x443; &#x41F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x430;,<br>&#x438; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x44E;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; vue: </p><p><em><strong>npm install -g @vue/cli</strong></em></p><p>&#x410; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x441; &#x43B;&#x435;&#x433;&#x43A;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x43C; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;:</p><p><strong><em>vue create &lt;&#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;_&#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F;&gt;</em></strong></p><p><br>&#x41F;&#x43E;&#x441;&#x43B;&#x435; &#x447;&#x435;&#x433;&#x43E; &#x432;&#x44B; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x435; &#x432;&#x430;&#x440;&#x438;&#x430;&#x43D;&#x442;&#x44B; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x43D;&#x438;&#x44F; &#x432;&#x43D;&#x435;&#x448;&#x43D;&#x435;&#x433;&#x43E; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x441; vue:</p><ol><li><em>&#x432;&#x44B;&#x431;&#x440;&#x430;&#x442;&#x44C; &#x440;&#x443;&#x447;&#x43D;&#x43E;&#x439; &#x432;&#x44B;&#x431;&#x43E;&#x440;</em></li><li><em>&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435;: Babel, vuex, &#x43F;&#x440;&#x435;&#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x43E;&#x440;&#x44B; css, &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;</em></li><li><em>&#x430; &#x437;&#x430;&#x442;&#x435;&#x43C; &#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x44E;&#x44E; &#x432;&#x435;&#x440;&#x441;&#x438;&#x44E; vue, &#x43D;&#x430;&#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440; 4.x</em></li><li><em>&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x434;&#x430; &#x434;&#x43B;&#x44F; &#x438;&#x441;&#x442;&#x43E;&#x440;&#x438;&#x438; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x430;</em></li><li><em>&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x43E;&#x447;&#x438;&#x442;&#x430;&#x435;&#x442;&#x435; &#x434;&#x43B;&#x44F; &#x43C;&#x438;&#x43D;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438; CSS (dart sass)</em></li><li><em>&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#x444;&#x430;&#x439;&#x43B;&#x44B; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x439; Babel, Es Lint &#x438; &#x442;. &#x434;.</em></li><li><em>&#x432;&#x44B;&#x431;&#x435;&#x440;&#x438;&#x442;&#x435; &#xAB;&#x414;&#x430;&#xBB;, &#x435;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x445;&#x43E;&#x442;&#x438;&#x442;&#x435; &#x441;&#x43E;&#x445;&#x440;&#x430;&#x43D;&#x438;&#x442;&#x44C; &#x44D;&#x442;&#x443; &#x43A;&#x43E;&#x43D;&#x444;&#x438;&#x433;&#x443;&#x440;&#x430;&#x446;&#x438;&#x44E; &#x434;&#x43B;&#x44F; &#x431;&#x443;&#x434;&#x443;&#x449;&#x438;&#x445; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x432; &#x43F;&#x440;&#x43E;&#x442;&#x438;&#x432;&#x43D;&#x43E;&#x43C; &#x441;&#x43B;&#x443;&#x447;&#x430;&#x435; - &#xAB;&#x41D;&#x435;&#x442;&#xBB;.</em></li><li><em>&#x412;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x435;&#x43D;&#x43E;!</em></li></ol><p>&#x422;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x437;&#x430;&#x43F;&#x443;&#x441;&#x442;&#x438;&#x442;&#x44C; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x441;&#x43A;&#x43E;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x435; &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;:</p><p><em><strong>npm run serve</strong></em></p><p>&#x418;&#x43B;&#x438; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x438;&#x442;&#x44C; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x43F;&#x430;&#x43A;&#x435;&#x442; js, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x430;&#x43C; &#x43D;&#x443;&#x436;&#x435;&#x43D;, &#x441; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x44C;&#x44E; &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;:</p><p><em><strong>npm install &lt;&#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435;_&#x43F;&#x430;&#x43A;&#x435;&#x442;&#x430;&gt;</strong></em></p><p>&#x421; &#x44D;&#x442;&#x438;&#x43C; &#x432;&#x441;&#x435;!</p>]]></content:encoded></item><item><title><![CDATA[ERP tizim nima va u nima uchun kerak?]]></title><description><![CDATA[<blockquote>ERP (inglizcha &quot;Enterprise Resource Planning&quot; qisqartmasi) - bu moliya, ta&apos;minot zanjiri, operatsiyalar, savdo, hisobot, ishlab chiqarish, inson resurslarini birlashtirgan va boshqaradigan biznes jarayonlarini boshqarish dasturi. Aksariyat kompaniyalarda moliyaviy va ish jarayonlarini boshqarish tizimlari mavjud, biroq bu dasturiy ta&apos;minotning imkoniyatlari odatda kundalik ish rejalari yoki</blockquote>]]></description><link>https://ubaydullo.digitalpress.blog/chto-takoie-erp-i-zachiem-eto-nuzhno/</link><guid isPermaLink="false">6136e7e32eb01f0001429256</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Tue, 07 Sep 2021 04:19:07 GMT</pubDate><content:encoded><![CDATA[<blockquote>ERP (inglizcha &quot;Enterprise Resource Planning&quot; qisqartmasi) - bu moliya, ta&apos;minot zanjiri, operatsiyalar, savdo, hisobot, ishlab chiqarish, inson resurslarini birlashtirgan va boshqaradigan biznes jarayonlarini boshqarish dasturi. Aksariyat kompaniyalarda moliyaviy va ish jarayonlarini boshqarish tizimlari mavjud, biroq bu dasturiy ta&apos;minotning imkoniyatlari odatda kundalik ish rejalari yoki kelajakdagi rivojlanish rejalari bilan chegaralanadi.</blockquote><blockquote>ERP (&#x441;&#x43E;&#x43A;&#x440;. &#x43E;&#x442; Enterprise Resource Planning) &#x43E;&#x437;&#x43D;&#x430;&#x447;&#x430;&#x435;&#x442; &quot;&#x43F;&#x43B;&#x430;&#x43D;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432; &#x43F;&#x440;&#x435;&#x434;&#x43F;&#x440;&#x438;&#x44F;&#x442;&#x438;&#x44F;&quot;. &#x42D;&#x442;&#x43E; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x43D;&#x43E;&#x435; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x435; &#x434;&#x43B;&#x44F; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;-&#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430;&#x43C;&#x438;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x43E;&#x431;&#x44A;&#x435;&#x434;&#x438;&#x43D;&#x44F;&#x435;&#x442; &#x444;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x44B;, &#x446;&#x435;&#x43F;&#x43E;&#x447;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x442;&#x430;&#x432;&#x43E;&#x43A;, &#x43E;&#x43F;&#x435;&#x440;&#x430;&#x446;&#x438;&#x438;, &#x442;&#x43E;&#x440;&#x433;&#x43E;&#x432;&#x43B;&#x44E;, &#x43E;&#x442;&#x447;&#x435;&#x442;&#x43D;&#x43E;&#x441;&#x442;&#x44C;, &#x43F;&#x440;&#x43E;&#x438;&#x437;&#x432;&#x43E;&#x434;&#x441;&#x442;&#x432;&#x43E;, &#x43A;&#x430;&#x434;&#x440;&#x44B; &#x438; &#x43F;&#x43E;&#x437;&#x432;&#x43E;&#x43B;&#x44F;&#x435;&#x442; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x44F;&#x442;&#x44C; &#x438;&#x43C;&#x438;. &#x411;&#x43E;&#x43B;&#x44C;&#x448;&#x438;&#x43D;&#x441;&#x442;&#x432;&#x43E; &#x43A;&#x43E;&#x43C;&#x43F;&#x430;&#x43D;&#x438;&#x439; &#x440;&#x430;&#x441;&#x43F;&#x43E;&#x43B;&#x430;&#x433;&#x430;&#x44E;&#x442; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x430;&#x43C;&#x438; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x444;&#x438;&#x43D;&#x430;&#x43D;&#x441;&#x430;&#x43C;&#x438; &#x438; &#x431;&#x438;&#x437;&#x43D;&#x435;&#x441;-&#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430;&#x43C;&#x438;, &#x43D;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x44D;&#x442;&#x43E;&#x433;&#x43E; &#x41F;&#x41E;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x430;&#x432;&#x438;&#x43B;&#x43E;, &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x438;&#x432;&#x430;&#x44E;&#x442;&#x441;&#x44F; &#x43F;&#x43E;&#x432;&#x441;&#x435;&#x434;&#x43D;&#x435;&#x432;&#x43D;&#x43E;&#x439; &#x440;&#x443;&#x442;&#x438;&#x43D;&#x43E;&#x439; &#x438;&#x43B;&#x438; &#x43F;&#x43B;&#x430;&#x43D;&#x430;&#x43C;&#x438; &#x431;&#x443;&#x434;&#x443;&#x449;&#x435;&#x433;&#x43E; &#x440;&#x430;&#x437;&#x432;&#x438;&#x442;&#x438;&#x44F;.</blockquote>]]></content:encoded></item><item><title><![CDATA[CAPTCHA]]></title><description><![CDATA[<p>A dystopian world like this needs a reliable way to differentiate an evil bot from a well-intentioned human. How can a banking website be sure that an innocent grandma who is logging in to check that the holiday gift money was successfully transferred to her grandchildren, is in fact, an</p>]]></description><link>https://ubaydullo.digitalpress.blog/captcha/</link><guid isPermaLink="false">60b883afd6e1cd0001d8e1d6</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Thu, 03 Jun 2021 07:54:23 GMT</pubDate><content:encoded><![CDATA[<p>A dystopian world like this needs a reliable way to differentiate an evil bot from a well-intentioned human. How can a banking website be sure that an innocent grandma who is logging in to check that the holiday gift money was successfully transferred to her grandchildren, is in fact, an innocent grandma? Enter, the <em><em>&#x201C;Completely Automated Public Turing test to tell Computers and Humans Apart&#x201D;</em></em>, or more simply, the CAPTCHA.</p><p>&#x412; &#x442;&#x430;&#x43A;&#x43E;&#x43C; &#x430;&#x43D;&#x442;&#x438;&#x443;&#x442;&#x43E;&#x43F;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x43C; &#x43C;&#x438;&#x440;&#x435; &#x43D;&#x443;&#x436;&#x435;&#x43D; &#x43D;&#x430;&#x434;&#x435;&#x436;&#x43D;&#x44B;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x437;&#x43B;&#x43E;&#x433;&#x43E; &#x431;&#x43E;&#x442;&#x430; &#x43E;&#x442; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A;&#x430; &#x441; &#x431;&#x43B;&#x430;&#x433;&#x438;&#x43C;&#x438; &#x43D;&#x430;&#x43C;&#x435;&#x440;&#x435;&#x43D;&#x438;&#x44F;&#x43C;&#x438;. &#x41A;&#x430;&#x43A; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x432;&#x435;&#x431;-&#x441;&#x430;&#x439;&#x442; &#x431;&#x430;&#x43D;&#x43A;&#x430; &#x431;&#x44B;&#x442;&#x44C; &#x443;&#x432;&#x435;&#x440;&#x435;&#x43D;&#x43D;&#x44B;&#x43C;, &#x447;&#x442;&#x43E; &#x43D;&#x438; &#x432; &#x447;&#x435;&#x43C; &#x43D;&#x435; &#x43F;&#x43E;&#x432;&#x438;&#x43D;&#x43D;&#x430;&#x44F; &#x431;&#x430;&#x431;&#x443;&#x448;&#x43A;&#x430;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x432;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x432; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x443;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x438;&#x442;&#x44C;, &#x447;&#x442;&#x43E; &#x434;&#x435;&#x43D;&#x44C;&#x433;&#x438; &#x43D;&#x430; &#x43F;&#x440;&#x430;&#x437;&#x434;&#x43D;&#x438;&#x447;&#x43D;&#x44B;&#x439; &#x43F;&#x43E;&#x434;&#x430;&#x440;&#x43E;&#x43A; &#x431;&#x44B;&#x43B;&#x438; &#x443;&#x441;&#x43F;&#x435;&#x448;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x44B; &#x435;&#x435; &#x432;&#x43D;&#x443;&#x43A;&#x430;&#x43C;, &#x43D;&#x430; &#x441;&#x430;&#x43C;&#x43E;&#x43C; &#x434;&#x435;&#x43B;&#x435; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x43D;&#x435;&#x432;&#x438;&#x43D;&#x43D;&#x43E;&#x439; &#x431;&#x430;&#x431;&#x443;&#x448;&#x43A;&#x43E;&#x439;? &#x412;&#x432;&#x435;&#x434;&#x438;&#x442;&#x435; &#xAB;&#x41F;&#x43E;&#x43B;&#x43D;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x437;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43E;&#x431;&#x449;&#x435;&#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x439; &#x442;&#x435;&#x441;&#x442; &#x422;&#x44C;&#x44E;&#x440;&#x438;&#x43D;&#x433;&#x430;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x442;&#x43B;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x43A;&#x43E;&#x43C;&#x43F;&#x44C;&#x44E;&#x442;&#x435;&#x440;&#x44B; &#x43E;&#x442; &#x43B;&#x44E;&#x434;&#x435;&#x439;&#xBB;, &#x438;&#x43B;&#x438;, &#x43F;&#x440;&#x43E;&#x449;&#x435; &#x433;&#x43E;&#x432;&#x43E;&#x440;&#x44F;, CAPTCHA.</p><p>Bunday distopiya olamida sizga yomon botni yaxshi niyatli odamdan ajratib olishning ishonchli usuli kerak. Bayram sovg&apos;asi pullari nevaralariga muvaffaqiyatli o&apos;tkazilganligini tekshirish uchun tizimga kirgan begunoh buvisi aslida begunoh buvi ekanligiga bank veb-saytida qanday amin bo&apos;lish mumkin? &quot;Kompyuterlarni odamlardan farqlash uchun to&apos;liq avtomatlashtirilgan ommaviy turing testi&quot; yoki oddiygina CAPTCHA-ga kiring.</p><hr><p>The search engine Alta Vista was one of the first popular websites that introduced a CAPTCHA-like protection when submitting new websites to its database.</p><figure class="kg-card kg-image-card"><img src="https://digitalpress.fra1.cdn.digitaloceanspaces.com/zlc50cz/2021/06/image.png" class="kg-image" alt loading="lazy" width="700" height="344"></figure><p>There are many other forms of CAPTCHAs, including an audio version for the visually impaired. But it is the curiously simple variety &#x2014; the &#x201C;I&#x2019;m not a robot&#x201D; checkbox seen on many of today&#x2019;s websites &#x2014; that inspired the original question behind this article. This checkbox, endearingly called the &#x201C;no CAPTCHA reCAPTCHA&#x201D;, is a Google product that unsurprisingly uses a combination of advanced Google technology to produce a very simple result. Google will analyse your behaviour before, during and after clicking the checkbox to determine whether you appear human. This analysis might include everything from your browsing history (malicious bots don&#x2019;t necessarily watch a few YouTube videos and check their Gmail before signing up for a bank account), to the way you organically move your mouse on the page. If Google is still unsure of your humanness after clicking the checkbox, you will be shown a visual reCAPTCHA (with words, street signs or images) as an additional security measure. This multi-faceted approach is necessary as computers become more skilled at complex image recognition and with the <a href="https://www.npr.org/templates/story/story.php?storyId=130594039" rel="noopener nofollow">rise of CAPTCHA sweatshopping</a> (think a large room of underpaid workers tasked with generating a heap of fake social media accounts).</p><p>Check out the video from google </p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/hMJsCBUBhcY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure>]]></content:encoded></item><item><title><![CDATA[GMO (Genetically modified organism) - Genetik jihatdan o'zgartirilgan organizm]]></title><description><![CDATA[<p>Ta&apos;rif Genetik modifikatsiyalangan organizm genetik muhandislik usullari yordamida sun&apos;iy ravishda o&apos;zgartirilgan organizmdir. Ushbu ta&apos;rifni o&apos;simliklar, hayvonlar va mikroorganizmlarga nisbatan qo&apos;llash mumkin.</p><hr><!--kg-card-begin: markdown--><h1 id><strong>&#x413;&#x435;&#x43D;&#x435;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;</strong></h1>]]></description><link>https://ubaydullo.digitalpress.blog/gmo/</link><guid isPermaLink="false">60a752d0f5cd7b000172936d</guid><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Fri, 21 May 2021 06:31:55 GMT</pubDate><content:encoded><![CDATA[<p>Ta&apos;rif Genetik modifikatsiyalangan organizm genetik muhandislik usullari yordamida sun&apos;iy ravishda o&apos;zgartirilgan organizmdir. Ushbu ta&apos;rifni o&apos;simliklar, hayvonlar va mikroorganizmlarga nisbatan qo&apos;llash mumkin.</p><hr><!--kg-card-begin: markdown--><h1 id><strong>&#x413;&#x435;&#x43D;&#x435;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43E;&#x440;&#x433;&#x430;&#x43D;&#x438;&#x437;&#x43C;</strong></h1>
<!--kg-card-end: markdown--><p></p><p>&#x41E;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435;&#x413;&#x435;&#x43D;&#x435;&#x442;&#x438;&#x301;&#x447;&#x435;&#x441;&#x43A;&#x438; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x446;&#x438;&#x301;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x439; &#x43E;&#x440;&#x433;&#x430;&#x43D;&#x438;&#x301;&#x437;&#x43C; &#x2014; &#x43E;&#x440;&#x433;&#x430;&#x43D;&#x438;&#x437;&#x43C;, &#x433;&#x435;&#x43D;&#x43E;&#x442;&#x438;&#x43F; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x433;&#x43E; &#x431;&#x44B;&#x43B; &#x438;&#x441;&#x43A;&#x443;&#x441;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x451;&#x43D; &#x43F;&#x440;&#x438; &#x43F;&#x43E;&#x43C;&#x43E;&#x449;&#x438; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x433;&#x435;&#x43D;&#x43D;&#x43E;&#x439; &#x438;&#x43D;&#x436;&#x435;&#x43D;&#x435;&#x440;&#x438;&#x438;. &#x42D;&#x442;&#x43E; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x43D;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x43B;&#x44F; &#x440;&#x430;&#x441;&#x442;&#x435;&#x43D;&#x438;&#x439;, &#x436;&#x438;&#x432;&#x43E;&#x442;&#x43D;&#x44B;&#x445; &#x438; &#x43C;&#x438;&#x43A;&#x440;&#x43E;&#x43E;&#x440;&#x433;&#x430;&#x43D;&#x438;&#x437;&#x43C;&#x43E;&#x432;.</p><!--kg-card-begin: markdown--><h1 id="geneticallymodifiedorganism"><strong>Genetically modified organism</strong></h1>
<!--kg-card-end: markdown--><p>Description<br>Description A genetically modified organism is an organism whose genotype has been artificially altered using genetic engineering methods. This definition can be applied to plants, animals and microorganisms.</p>]]></content:encoded></item><item><title><![CDATA[Horizontal and Vertical scaling in the Cloud]]></title><description><![CDATA[<p>In this world of cloud, one of the biggest features is the ability to scale. There are different ways to accomplish scaling, which is a transformation that enlarges or diminishes. One is vertical scaling and the other is horizontal scaling.</p><p>What is the difference between the two? If you look</p>]]></description><link>https://ubaydullo.digitalpress.blog/horizontal-and-vertical-scaling-in-cloud/</link><guid isPermaLink="false">6064731c954a2c0001f72ec5</guid><category><![CDATA[Programming]]></category><dc:creator><![CDATA[Ubaydullo]]></dc:creator><pubDate>Wed, 31 Mar 2021 13:07:32 GMT</pubDate><content:encoded><![CDATA[<p>In this world of cloud, one of the biggest features is the ability to scale. There are different ways to accomplish scaling, which is a transformation that enlarges or diminishes. One is vertical scaling and the other is horizontal scaling.</p><p>What is the difference between the two? If you look at just the definitions of vertical and horizontal you might see the following:</p><p>&#x2022; Vertical: something that is standing directly upright at a right angle to the flat ground<br>&#x2022; Horizontal: something that is parallel to the horizon (the area where the sky seems to meet the earth)</p><p>If you are a visual kind of person you may be able to see this. Let&#x2019;s add some technology to this and see what we get.</p><p>Vertical scaling can essentially resize your server with no change to your code. It is the ability to increase the capacity of existing hardware or software by adding resources. Vertical scaling is limited by the fact that you can only get as big as the size of the server.</p><p>Horizontal scaling affords the ability to scale wider to deal with traffic. It is the ability to connect multiple hardware or software entities, such as servers, so that they work as a single logical unit. This kind of scale cannot be implemented at a moment&#x2019;s notice.</p><p>So, having said all that, I always like to provide an example that you might be able to visually imagine.</p><p>Imagine, if you will, an apartment building that has many rooms and floors where people move in and out all the time. In this apartment building, 200 spaces are available but not all are taken at one time. So, in a sense, the apartment scales vertically as more people come and there are rooms to accommodate them. As long as the 200-space capacity is not exceeded, life is good.</p><p>This could even apply to a restaurant. You have seen the signs that tell you how many people could be held in the establishment. As more patrons come in more tables may be set up and more chairs added (scaling vertically). However when capacity is reached no more patrons would be able to fit. You can only be as big as the building and patio of the restaurant. This is much like in your cloud environment, where you could add more hardware to the existing machine (RAM and hard drive space) but you are limited to capacity of your actual machine.</p><p>On the horizontal scaling side, imagine a two lane expressway. The expressway is good to handle the 2,000 or so vehicles that travel the expressway. As commerce begins to expand, more buildings are constructed and more homes are built. As a result the expressway that once handled 2,000 or so vehicles is now having an increase to 8,000 vehicles. This makes a major traffic jam during rush hour. To alleviate this problem of traffic jams and an increase in accidents, the expressway can be scaled horizontally by constructing more lanes and quite possibly adding an overpass. In this example the construction will take some time. Much like scaling your cloud horizontally, you add additional machines to your environment (scaling wider). This requires planning and making sure you have resources available as well as making sure your architecture can handle the scalability.</p><p>I think this could be a simple way to explain scalability to a customer if they wanted to know the difference between vertical and horizontal scaling in the cloud. What are your thoughts? How have you described scalability? Leave a comment below and let me know.</p><hr><p><strong>&#x413;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x438; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432; &#x43E;&#x431;&#x43B;&#x430;&#x43A;&#x435;</strong></p><p>&#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43E;&#x431;&#x43B;&#x430;&#x447;&#x43D;&#x43E;&#x43C; &#x43C;&#x438;&#x440;&#x435; &#x43E;&#x434;&#x43D;&#x43E;&#x439; &#x438;&#x437; &#x432;&#x430;&#x436;&#x43D;&#x435;&#x439;&#x448;&#x438;&#x445; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x439; &#x44F;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x441;&#x44F; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;. &#x415;&#x441;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43D;&#x44B;&#x435; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431;&#x44B; &#x432;&#x44B;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x44C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;, &#x442;&#x43E; &#x435;&#x441;&#x442;&#x44C; &#x43F;&#x440;&#x435;&#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x438;&#x432;&#x430;&#x435;&#x442; &#x438;&#x43B;&#x438; &#x443;&#x43C;&#x435;&#x43D;&#x44C;&#x448;&#x430;&#x435;&#x442;. &#x41E;&#x434;&#x438;&#x43D; - &#x44D;&#x442;&#x43E; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;, &#x430; &#x434;&#x440;&#x443;&#x433;&#x43E;&#x439; - &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;.</p><p>&#x41A;&#x430;&#x43A;&#x430;&#x44F; &#x440;&#x430;&#x437;&#x43D;&#x438;&#x446;&#x430; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x434;&#x432;&#x443;&#x43C;&#x44F;? &#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x442;&#x435; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x43D;&#x430; &#x43E;&#x43F;&#x440;&#x435;&#x434;&#x435;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x438; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C; &#x441;&#x43B;&#x435;&#x434;&#x443;&#x44E;&#x449;&#x435;&#x435;:</p><p>&#x2022; &#x412;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;: &#x447;&#x442;&#x43E;-&#x442;&#x43E;, &#x447;&#x442;&#x43E; &#x441;&#x442;&#x43E;&#x438;&#x442; &#x43F;&#x440;&#x44F;&#x43C;&#x43E; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x43E;&#x434; &#x43F;&#x440;&#x44F;&#x43C;&#x44B;&#x43C; &#x443;&#x433;&#x43B;&#x43E;&#x43C; &#x43A; &#x200B;&#x200B;&#x43F;&#x43B;&#x43E;&#x441;&#x43A;&#x43E;&#x439; &#x437;&#x435;&#x43C;&#x43B;&#x435;.<br>&#x2022; &#x41F;&#x43E; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x438;: &#x447;&#x442;&#x43E;-&#x442;&#x43E; &#x43F;&#x430;&#x440;&#x430;&#x43B;&#x43B;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x443; (&#x43E;&#x431;&#x43B;&#x430;&#x441;&#x442;&#x44C;, &#x433;&#x434;&#x435; &#x43A;&#x430;&#x436;&#x435;&#x442;&#x441;&#x44F;, &#x447;&#x442;&#x43E; &#x43D;&#x435;&#x431;&#x43E; &#x432;&#x441;&#x442;&#x440;&#x435;&#x447;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x441; &#x437;&#x435;&#x43C;&#x43B;&#x435;&#x439;).</p><p>&#x415;&#x441;&#x43B;&#x438; &#x432;&#x44B; &#x432;&#x438;&#x437;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x439; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A;, &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x44D;&#x442;&#x43E; &#x443;&#x432;&#x438;&#x434;&#x435;&#x442;&#x44C;. &#x414;&#x430;&#x432;&#x430;&#x439;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x43C; &#x43A; &#x44D;&#x442;&#x43E;&#x43C;&#x443; &#x442;&#x435;&#x445;&#x43D;&#x43E;&#x43B;&#x43E;&#x433;&#x438;&#x44E; &#x438; &#x43F;&#x43E;&#x441;&#x43C;&#x43E;&#x442;&#x440;&#x438;&#x43C;, &#x447;&#x442;&#x43E; &#x443; &#x43D;&#x430;&#x441; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x441;&#x44F;.</p><p>&#x412;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x435;&#x43D;&#x43D;&#x43E; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x438;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430; &#x431;&#x435;&#x437; &#x438;&#x437;&#x43C;&#x435;&#x43D;&#x435;&#x43D;&#x438;&#x44F; &#x432;&#x430;&#x448;&#x435;&#x433;&#x43E; &#x43A;&#x43E;&#x434;&#x430;. &#x42D;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x438;&#x442;&#x44C; &#x435;&#x43C;&#x43A;&#x43E;&#x441;&#x442;&#x44C; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x433;&#x43E; &#x43E;&#x431;&#x43E;&#x440;&#x443;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x438;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x437;&#x430; &#x441;&#x447;&#x435;&#x442; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432;. &#x412;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x43E; &#x442;&#x435;&#x43C; &#x444;&#x430;&#x43A;&#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x442;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x430;.</p><p>&#x413;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x434;&#x430;&#x435;&#x442; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x448;&#x438;&#x440;&#x435; &#x434;&#x43B;&#x44F; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x442;&#x440;&#x430;&#x444;&#x438;&#x43A;&#x430;. &#x42D;&#x442;&#x43E; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x441;&#x43E;&#x435;&#x434;&#x438;&#x43D;&#x438;&#x442;&#x44C; &#x43D;&#x435;&#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x430;&#x43F;&#x43F;&#x430;&#x440;&#x430;&#x442;&#x43D;&#x44B;&#x445; &#x438;&#x43B;&#x438; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x43D;&#x44B;&#x445; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432;, &#x442;&#x430;&#x43A;&#x438;&#x445; &#x43A;&#x430;&#x43A; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440;&#x44B;, &#x442;&#x430;&#x43A;, &#x447;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x43D;&#x438; &#x440;&#x430;&#x431;&#x43E;&#x442;&#x430;&#x43B;&#x438; &#x43A;&#x430;&#x43A; &#x435;&#x434;&#x438;&#x43D;&#x43E;&#x435; &#x43B;&#x43E;&#x433;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x435; &#x443;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x441;&#x442;&#x432;&#x43E;. &#x422;&#x430;&#x43A;&#x430;&#x44F; &#x448;&#x43A;&#x430;&#x43B;&#x430; &#x43D;&#x435; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x430; &#x432; &#x43B;&#x44E;&#x431;&#x43E;&#x439; &#x43C;&#x43E;&#x43C;&#x435;&#x43D;&#x442;.</p><p>&#x418;&#x442;&#x430;&#x43A;, &#x441;&#x43A;&#x430;&#x437;&#x430;&#x432; &#x432;&#x441;&#x435; &#x44D;&#x442;&#x43E;, &#x44F; &#x432;&#x441;&#x435;&#x433;&#x434;&#x430; &#x445;&#x43E;&#x442;&#x435;&#x43B; &#x431;&#x44B; &#x43F;&#x440;&#x438;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x439; &#x432;&#x44B; &#x43C;&#x43E;&#x433;&#x43B;&#x438; &#x431;&#x44B; &#x432;&#x438;&#x437;&#x443;&#x430;&#x43B;&#x44C;&#x43D;&#x43E; &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x438;&#x442;&#x44C;.</p><p>&#x41F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x441;&#x435;&#x431;&#x435; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43A;&#x432;&#x430;&#x440;&#x442;&#x438;&#x440;&#x43D;&#x44B;&#x439; &#x434;&#x43E;&#x43C; &#x441; &#x43C;&#x43D;&#x43E;&#x436;&#x435;&#x441;&#x442;&#x432;&#x43E;&#x43C; &#x43A;&#x43E;&#x43C;&#x43D;&#x430;&#x442; &#x438; &#x44D;&#x442;&#x430;&#x436;&#x435;&#x439;, &#x43A;&#x443;&#x434;&#x430; &#x43B;&#x44E;&#x434;&#x438; &#x43F;&#x43E;&#x441;&#x442;&#x43E;&#x44F;&#x43D;&#x43D;&#x43E; &#x432;&#x445;&#x43E;&#x434;&#x44F;&#x442; &#x438; &#x432;&#x44B;&#x445;&#x43E;&#x434;&#x44F;&#x442;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43C;&#x43D;&#x43E;&#x433;&#x43E;&#x43A;&#x432;&#x430;&#x440;&#x442;&#x438;&#x440;&#x43D;&#x43E;&#x43C; &#x434;&#x43E;&#x43C;&#x435; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x43E; 200 &#x43C;&#x435;&#x441;&#x442;, &#x43D;&#x43E; &#x43D;&#x435; &#x432;&#x441;&#x435; &#x43E;&#x43D;&#x438; &#x437;&#x430;&#x43D;&#x44F;&#x442;&#x44B; &#x43E;&#x434;&#x43D;&#x43E;&#x432;&#x440;&#x435;&#x43C;&#x435;&#x43D;&#x43D;&#x43E;. &#x422;&#x430;&#x43A;&#x438;&#x43C; &#x43E;&#x431;&#x440;&#x430;&#x437;&#x43E;&#x43C;, &#x432; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x43C; &#x441;&#x43C;&#x44B;&#x441;&#x43B;&#x435; &#x43A;&#x432;&#x430;&#x440;&#x442;&#x438;&#x440;&#x430; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x443;&#x435;&#x442;&#x441;&#x44F; &#x43F;&#x43E; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x438; &#x43F;&#x43E; &#x43C;&#x435;&#x440;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43B;&#x44E;&#x434;&#x435;&#x439; &#x438; &#x43F;&#x43E;&#x44F;&#x432;&#x43B;&#x44F;&#x44E;&#x442;&#x441;&#x44F; &#x43A;&#x43E;&#x43C;&#x43D;&#x430;&#x442;&#x44B; &#x434;&#x43B;&#x44F; &#x438;&#x445; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x449;&#x435;&#x43D;&#x438;&#x44F;. &#x41F;&#x43E;&#x43A;&#x430; &#x435;&#x43C;&#x43A;&#x43E;&#x441;&#x442;&#x44C; 200 &#x43C;&#x435;&#x441;&#x442; &#x43D;&#x435; &#x43F;&#x440;&#x435;&#x432;&#x44B;&#x448;&#x435;&#x43D;&#x430;, &#x436;&#x438;&#x437;&#x43D;&#x44C; &#x445;&#x43E;&#x440;&#x43E;&#x448;&#x430;.</p><p>&#x42D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x43E;&#x442;&#x43D;&#x43E;&#x441;&#x438;&#x442;&#x44C;&#x441;&#x44F; &#x434;&#x430;&#x436;&#x435; &#x43A; &#x440;&#x435;&#x441;&#x442;&#x43E;&#x440;&#x430;&#x43D;&#x443;. &#x412;&#x44B; &#x432;&#x438;&#x434;&#x435;&#x43B;&#x438; &#x442;&#x430;&#x431;&#x43B;&#x438;&#x447;&#x43A;&#x438;, &#x43D;&#x430; &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x445; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x43D;&#x43E;, &#x441;&#x43A;&#x43E;&#x43B;&#x44C;&#x43A;&#x43E; &#x447;&#x435;&#x43B;&#x43E;&#x432;&#x435;&#x43A; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x441;&#x43E;&#x434;&#x435;&#x440;&#x436;&#x430;&#x442;&#x44C;&#x441;&#x44F; &#x432; &#x437;&#x430;&#x432;&#x435;&#x434;&#x435;&#x43D;&#x438;&#x438;. &#x41F;&#x43E; &#x43C;&#x435;&#x440;&#x435; &#x442;&#x43E;&#x433;&#x43E;, &#x43A;&#x430;&#x43A; &#x43F;&#x440;&#x438;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43F;&#x43E;&#x441;&#x435;&#x442;&#x438;&#x442;&#x435;&#x43B;&#x435;&#x439;, &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x443;&#x441;&#x442;&#x430;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x441;&#x442;&#x43E;&#x43B;&#x43E;&#x432; &#x438; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x43E; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x441;&#x442;&#x443;&#x43B;&#x44C;&#x435;&#x432; (&#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43F;&#x43E; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x438;). &#x41E;&#x434;&#x43D;&#x430;&#x43A;&#x43E;, &#x43A;&#x43E;&#x433;&#x434;&#x430; &#x435;&#x43C;&#x43A;&#x43E;&#x441;&#x442;&#x44C; &#x431;&#x443;&#x434;&#x435;&#x442; &#x434;&#x43E;&#x441;&#x442;&#x438;&#x433;&#x43D;&#x443;&#x442;&#x430;, &#x43F;&#x43E;&#x441;&#x435;&#x442;&#x438;&#x442;&#x435;&#x43B;&#x438; &#x443;&#x436;&#x435; &#x43D;&#x435; &#x441;&#x43C;&#x43E;&#x433;&#x443;&#x442; &#x43F;&#x43E;&#x43C;&#x435;&#x441;&#x442;&#x438;&#x442;&#x44C;&#x441;&#x44F;. &#x412;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x431;&#x44B;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43C;&#x435;&#x440;&#x43E;&#x43C; &#x441; &#x437;&#x434;&#x430;&#x43D;&#x438;&#x435; &#x438; &#x432;&#x43D;&#x443;&#x442;&#x440;&#x435;&#x43D;&#x43D;&#x438;&#x439; &#x434;&#x432;&#x43E;&#x440;&#x438;&#x43A; &#x440;&#x435;&#x441;&#x442;&#x43E;&#x440;&#x430;&#x43D;&#x430;. &#x42D;&#x442;&#x43E; &#x43E;&#x447;&#x435;&#x43D;&#x44C; &#x43F;&#x43E;&#x445;&#x43E;&#x436;&#x435; &#x43D;&#x430; &#x432;&#x430;&#x448;&#x443; &#x43E;&#x431;&#x43B;&#x430;&#x447;&#x43D;&#x443;&#x44E; &#x441;&#x440;&#x435;&#x434;&#x443;, &#x433;&#x434;&#x435; &#x432;&#x44B; &#x43C;&#x43E;&#x436;&#x435;&#x442;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x435; &#x43E;&#x431;&#x43E;&#x440;&#x443;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x43A; &#x441;&#x443;&#x449;&#x435;&#x441;&#x442;&#x432;&#x443;&#x44E;&#x449;&#x435;&#x439; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x435; (&#x41E;&#x417;&#x423; &#x438; &#x43C;&#x435;&#x441;&#x442;&#x43E; &#x43D;&#x430; &#x436;&#x435;&#x441;&#x442;&#x43A;&#x43E;&#x43C; &#x434;&#x438;&#x441;&#x43A;&#x435;), &#x43D;&#x43E; &#x432;&#x44B; &#x43E;&#x433;&#x440;&#x430;&#x43D;&#x438;&#x447;&#x435;&#x43D;&#x44B; &#x435;&#x43C;&#x43A;&#x43E;&#x441;&#x442;&#x44C;&#x44E; &#x432;&#x430;&#x448;&#x435;&#x439; &#x440;&#x435;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x44B;.</p><p>&#x427;&#x442;&#x43E; &#x43A;&#x430;&#x441;&#x430;&#x435;&#x442;&#x441;&#x44F; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;, &#x43F;&#x440;&#x435;&#x434;&#x441;&#x442;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x441;&#x435;&#x431;&#x435; &#x434;&#x432;&#x443;&#x445;&#x43F;&#x43E;&#x43B;&#x43E;&#x441;&#x43D;&#x443;&#x44E; &#x441;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x43D;&#x443;&#x44E; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x433;&#x438;&#x441;&#x442;&#x440;&#x430;&#x43B;&#x44C;. &#x421;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x43D;&#x430;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x433;&#x438;&#x441;&#x442;&#x440;&#x430;&#x43B;&#x44C; &#x43F;&#x43E;&#x434;&#x445;&#x43E;&#x434;&#x438;&#x442; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x43D;&#x43E; 2000 &#x442;&#x440;&#x430;&#x43D;&#x441;&#x43F;&#x43E;&#x440;&#x442;&#x43D;&#x44B;&#x445; &#x441;&#x440;&#x435;&#x434;&#x441;&#x442;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x435;&#x434;&#x443;&#x442; &#x43F;&#x43E; &#x43D;&#x435;&#x439;. &#x41F;&#x43E; &#x43C;&#x435;&#x440;&#x435; &#x442;&#x43E;&#x433;&#x43E; &#x43A;&#x430;&#x43A; &#x442;&#x43E;&#x440;&#x433;&#x43E;&#x432;&#x43B;&#x44F; &#x43D;&#x430;&#x447;&#x438;&#x43D;&#x430;&#x435;&#x442; &#x440;&#x430;&#x441;&#x448;&#x438;&#x440;&#x44F;&#x442;&#x44C;&#x441;&#x44F;, &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x437;&#x434;&#x430;&#x43D;&#x438;&#x439; &#x438; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x441;&#x44F; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x434;&#x43E;&#x43C;&#x43E;&#x432;. &#x412; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;&#x435; &#x441;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x43D;&#x430;&#x44F; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x433;&#x438;&#x441;&#x442;&#x440;&#x430;&#x43B;&#x44C;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x430;&#x44F; &#x43A;&#x43E;&#x433;&#x434;&#x430;-&#x442;&#x43E; &#x43E;&#x431;&#x441;&#x43B;&#x443;&#x436;&#x438;&#x432;&#x430;&#x43B;&#x430; &#x43E;&#x43A;&#x43E;&#x43B;&#x43E; 2 000 &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x43E;&#x431;&#x438;&#x43B;&#x435;&#x439;, &#x442;&#x435;&#x43F;&#x435;&#x440;&#x44C; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x438;&#x43B;&#x430;&#x441;&#x44C; &#x434;&#x43E; 8 000 &#x43C;&#x430;&#x448;&#x438;&#x43D;. &#x42D;&#x442;&#x43E; &#x441;&#x43E;&#x437;&#x434;&#x430;&#x435;&#x442; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x443;&#x44E; &#x43F;&#x440;&#x43E;&#x431;&#x43A;&#x443; &#x432; &#x447;&#x430;&#x441; &#x43F;&#x438;&#x43A;. &#x427;&#x442;&#x43E;&#x431;&#x44B; &#x43E;&#x431;&#x43B;&#x435;&#x433;&#x447;&#x438;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x431;&#x43B;&#x435;&#x43C;&#x443; &#x43F;&#x440;&#x43E;&#x431;&#x43E;&#x43A; &#x438; &#x443;&#x432;&#x435;&#x43B;&#x438;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x430; &#x430;&#x432;&#x430;&#x440;&#x438;&#x439;, &#x441;&#x43A;&#x43E;&#x440;&#x43E;&#x441;&#x442;&#x43D;&#x443;&#x44E; &#x430;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x433;&#x438;&#x441;&#x442;&#x440;&#x430;&#x43B;&#x44C; &#x43C;&#x43E;&#x436;&#x43D;&#x43E; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43F;&#x43E; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x438;, &#x43F;&#x43E;&#x441;&#x442;&#x440;&#x43E;&#x438;&#x432; &#x431;&#x43E;&#x43B;&#x44C;&#x448;&#x435; &#x43F;&#x43E;&#x43B;&#x43E;&#x441; &#x438;, &#x432;&#x43F;&#x43E;&#x43B;&#x43D;&#x435; &#x432;&#x43E;&#x437;&#x43C;&#x43E;&#x436;&#x43D;&#x43E;, &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x432; &#x44D;&#x441;&#x442;&#x430;&#x43A;&#x430;&#x434;&#x443;. &#x412; &#x44D;&#x442;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x441;&#x442;&#x440;&#x43E;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x442;&#x432;&#x43E; &#x437;&#x430;&#x439;&#x43C;&#x435;&#x442; &#x43D;&#x435;&#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x43E;&#x435; &#x432;&#x440;&#x435;&#x43C;&#x44F;. &#x41A;&#x430;&#x43A; &#x438; &#x43F;&#x440;&#x438; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x43E;&#x43C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x43E;&#x431;&#x43B;&#x430;&#x43A;&#x430;, &#x432;&#x44B; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x442;&#x435; &#x432; &#x441;&#x440;&#x435;&#x434;&#x443; &#x434;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x43C;&#x430;&#x448;&#x438;&#x43D;&#x44B; (&#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x448;&#x438;&#x440;&#x435;). &#x42D;&#x442;&#x43E; &#x442;&#x440;&#x435;&#x431;&#x443;&#x435;&#x442; &#x43F;&#x43B;&#x430;&#x43D;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; &#x438; &#x43E;&#x431;&#x435;&#x441;&#x43F;&#x435;&#x447;&#x435;&#x43D;&#x438;&#x44F; &#x43D;&#x430;&#x43B;&#x438;&#x447;&#x438;&#x44F; &#x434;&#x43E;&#x441;&#x442;&#x443;&#x43F;&#x43D;&#x44B;&#x445; &#x440;&#x435;&#x441;&#x443;&#x440;&#x441;&#x43E;&#x432;, &#x430; &#x442;&#x430;&#x43A;&#x436;&#x435; &#x443;&#x432;&#x435;&#x440;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x438; &#x432; &#x442;&#x43E;&#x43C;, &#x447;&#x442;&#x43E; &#x432;&#x430;&#x448;&#x430; &#x430;&#x440;&#x445;&#x438;&#x442;&#x435;&#x43A;&#x442;&#x443;&#x440;&#x430; &#x43F;&#x43E;&#x434;&#x434;&#x435;&#x440;&#x436;&#x438;&#x432;&#x430;&#x435;&#x442; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x441;&#x442;&#x44C;.</p><p>&#x42F; &#x434;&#x443;&#x43C;&#x430;&#x44E;, &#x447;&#x442;&#x43E; &#x44D;&#x442;&#x43E; &#x43C;&#x43E;&#x436;&#x435;&#x442; &#x431;&#x44B;&#x442;&#x44C; &#x43F;&#x440;&#x43E;&#x441;&#x442;&#x43E;&#x439; &#x441;&#x43F;&#x43E;&#x441;&#x43E;&#x431; &#x43E;&#x431;&#x44A;&#x44F;&#x441;&#x43D;&#x438;&#x442;&#x44C; &#x437;&#x430;&#x43A;&#x430;&#x437;&#x447;&#x438;&#x43A;&#x443; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x441;&#x442;&#x44C;, &#x435;&#x441;&#x43B;&#x438; &#x43E;&#x43D; &#x445;&#x43E;&#x447;&#x435;&#x442; &#x437;&#x43D;&#x430;&#x442;&#x44C; &#x440;&#x430;&#x437;&#x43D;&#x438;&#x446;&#x443; &#x43C;&#x435;&#x436;&#x434;&#x443; &#x432;&#x435;&#x440;&#x442;&#x438;&#x43A;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x438; &#x433;&#x43E;&#x440;&#x438;&#x437;&#x43E;&#x43D;&#x442;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435;&#x43C; &#x432; &#x43E;&#x431;&#x43B;&#x430;&#x43A;&#x435;. &#x43E; &#x447;&#x435;&#x43C; &#x442;&#x44B; &#x434;&#x443;&#x43C;&#x430;&#x435;&#x448;&#x44C;? &#x41A;&#x430;&#x43A; &#x432;&#x44B; &#x43E;&#x43F;&#x438;&#x441;&#x430;&#x43B;&#x438; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x43E;&#x441;&#x442;&#x44C;? &#x41E;&#x441;&#x442;&#x430;&#x432;&#x44C;&#x442;&#x435; &#x43A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x439; &#x43D;&#x438;&#x436;&#x435; &#x438; &#x434;&#x430;&#x439;&#x442;&#x435; &#x43C;&#x43D;&#x435; &#x437;&#x43D;&#x430;&#x442;&#x44C;.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.ibm.com/blogs/cloud-computing/2014/04/09/explain-vertical-horizontal-scaling-cloud/#:~:text=Vertical%20scaling%20can%20essentially%20resize,or%20software%20by%20adding%20resources.&amp;text=It%20is%20the%20ability%20to%20connect%20multiple%20hardware%20or%20software,as%20a%20single%20logical%20unit."><div class="kg-bookmark-content"><div class="kg-bookmark-title">How to explain vertical and horizontal scaling in the cloud - Cloud computing news</div><div class="kg-bookmark-description">In this world of cloud, one of the biggest features is the ability to scale. There are different ways to accomplish scaling, which is a transformation that enlarges or diminishes. One is vertical scaling and the other is horizontal scaling. What is the difference between the two? If you look at just&#x2026;</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.ibm.com/favicon.ico" alt><span class="kg-bookmark-author">Cloud computing news</span><span class="kg-bookmark-publisher">David Beaumont</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.ibm.com/blogs/cloud-computing/wp-content/uploads/2015/04/cloud-scaling.png" alt></div></a></figure><p>This article get from ibm.com, Bu maqola ibm.com dan olindi, yuqorida maqolani asl nusxasiga havola keltirilgan.</p>]]></content:encoded></item></channel></rss>