<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حانیه مهدی ابادی</title>
        <link>https://virgool.io/feed/@Hanieh_mav99</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 15:44:23</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1091004/avatar/zkORej.jpeg?height=120&amp;width=120</url>
            <title>حانیه مهدی ابادی</title>
            <link>https://virgool.io/@Hanieh_mav99</link>
        </image>

                    <item>
                <title>یکم کار با ElasticSearch</title>
                <link>https://virgool.io/@Hanieh_mav99/%DB%8C%DA%A9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-elasticsearch-avvgfjulbczh</link>
                <description>سلام تو این پست میخوایم ببینیم چه جوری یه دیتا توی الستیک سرچ insert,retrieve,delete,update کنیم.اول از همه ما با kibana کار میکنیم که یک برنامه  رایگانه که  قابلیت کار با داده های فهرست شده در Elasticsearch ارائه می ده (تعریف ساده که به درد ما میخوره).اول به شکل بالا نگاه کنید این یه مفهوم دقیق نیست فقط یه مقایسه سادس واسه اینکه درکش راحت تر باشه مثلا من یه index دارم به اسم Person(یه table به اسم Person) که میخوام اطلاعات هر فرد و توش بریزم که میشه document (همون row) که هر کدوم یه فیلد سن دارن .الان میخوام  index به اسم Person دیتا  insert  کنم ولی به این کار تو الستیک میگیم index . پس inserting = indexing.سینتکس کلی به این شکله که باید اسم index و type و id  بهش بدین . فقط اینکه id باید unique  باشه و اگه id بهش ندین خود الستیک یه id واسش میسازه .الان من یه index به اسم person دارم که یک documnet داره و میبینین که فیلداشو به صورت json   میدیم و ذخیره میکنه .  نیجه اجرا به شکل زیر میشه که الان فیلدی که تو بحث ما میگنجه(مثلا shard  جدا بعدا ) version که میبینین زده ۱ اگه ۱۰ بار این دستورو اجرا کنین هر بار اضافه میشه چون دارین یک داکیومنت تکراری و هی over write میکنین. مثلا بعد ۱۰ بار تکرار:حالا برای retrieve کردن :و نتیجه :که دیتای شما توی قسمت source  هست . حالا اگه اون اطلاعات اضافه رو نمیخواین فقط source میخواین :و نتیجه :حالا اگه اصلا اطلاعات نمیخواین فقط میخواین ببینین این documnet وجود داره یا نه :و نتیجه به صورت : 200  هست اگه ام که نباشه 404وقتی شما یه فیلدی از یه  document  و update میکنین فقط اون فیلد update نمیشه بلکه کل document میاد update میشهالان من هم age عوض کردم و همlastname پاک کردم .میبینین که result شده updated .  و اگه بخوام دیتارو ببینم شده حالا اگه بخواین یه فیلد خاص و تغییر بدین از update_ و doc  استفاده میکنین و فقط name الان تغییر میکنه و بقیه فیلدا همون جوری می مونه.برای حذف کردن به داکیومنت : الان داکیومنت با id و۱ حذف شد ولی index که ساختیم person  وجود  داره که اگه دستور زیرو اجرا کنید ساختار اون index میاره واستون عکس کامل نیست :)برای پاک کردن index :DELETE /personخب اینم ساده ترین دستورای الستیک امیدوارم واسه شروع واستون مفید بوده باشه . اینکه واقعا اینا ساده ترینا بود :))راستی برای بالا اوردن الستیک و کیبانا از داکر کمک بگیرین حتما بدون اونم میشه ولی خب راه ساده رو انتخاب کنید.</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 30 Oct 2021 22:43:27 +0330</pubDate>
            </item>
                    <item>
                <title>سلام به Elasticsearch</title>
                <link>https://virgool.io/@Hanieh_mav99/%D8%B3%D9%84%D8%A7%D9%85-%D8%A8%D9%87-elasticsearch-spl02qnjhwj0</link>
                <description>سلام به همگی . تو این پست میخوایم یه سلامی به elastic بکنیم .فقط یه سلام!فقط یه نکته کوچولو اینکه واسه همه چی نمیشه یه ترجمه گذاشت به نظرم جالب نیست خلاصه یه سری چیزا رو ببخشید.من خودم مدتیه با elastic کار میکنم قبلا اسمشو شنیده بودم ولی خب سمتش نرفته بودم تا اینکه حالا الان قسمت شد و فهمیییدم چه قد خفنه واقعا دستشون درد نکنه :)خب Elasticsearch یک موتور جستجو و تجزیه و تحلیل open-source  که  روی Apache Lucene ساخته شده و تو جاوا توسعه داده شده. Elasticsearch به شما امکان می ده حجم عظیمی از داده ها را به سرعت و در زمان واقعی ذخیره ، جستجو و تجزیه و تحلیل کنید و پاسخ همه این کارا رو تو میلی ثانیه بهتون میده .  دارای API های REST گسترده ای برای ذخیره و جستجوی داده ها است. در اصل ، شما می تونین Elasticsearch را به عنوان سروری تصور کنید که می تونه درخواست های JSON را پردازش کنه و داده های JSON را به شما برگردونه.(اگه نمیدونین JSON چیه برین دنبالش چون ولتون نمیکنه)حالا کجا ها استفاده میشه مثلا:داده های ژنتیکی را با استفاده از Elasticsearch به عنوان ابزار تحقیق بیوانفورماتیک ذخیره و پردازش کنیدمدیریت ، ادغام و تجزیه و تحلیل اطلاعات فضایی با استفاده از Elasticsearch به عنوان یک سیستم اطلاعات جغرافیایی (GIS)با استفاده از Elasticsearch به عنوان موتور ذخیره سازی ، گردش کارهای تجاری را خودکار کنیدذخیره و تجزیه و تحلیل گزارش ها ، معیارها و داده های رویداد امنیتییک کادر جستجو به یک برنامه یا وب سایت اضافه کنیدحالا مثالای بالا رو که دیدین ولی دلیل اصلی وجود Elasticsearch برای سرچ کردنه .مثلا فرض کنید میرین تو گوگل یه چیزیو سرچ میکنید اون میاد همه صفحه هایی واستون میاره که نزدیک باشه به اون چیزی که شما سرچ کردین  کار الستیکم همین شکلیه میاد document هایی و میاره که نزدیک باشه به اون چیزی که میخواید.کلا Elasticsearch میشه  معرفیش کرد به عنوان  document oriented search engin که منظور اینه می تونین توش برای یک  document عملیات insert , delete,retrieve,search,analyze انجام بدین .حالا یکم دقیق تر شیم . این document که میگیم چیه؟ ۱۰۰ درصد منظورمون این نیس منظورمون اینه Documents:داکیومنتا میتونیم همون row توی database فرض کنید که نشون دهنده یک entity هست . این داکیومنتا تو قالب JSON توی الستیک ذخیره میشن .Index:میتونیم همون table توی database فرض کنید . که میشه مجموعه  ای از داکیومنتا خب حالا برگردیم سر مثالمون که از سرچ تو گوگل شروع شد . گفتیم Elasticsearch مثل همون کار میکنه ولی چه جوری ؟اول فرض کنید یه کتاب کلمات دارین الان دنبال یه کلمه میخواین بگردین خب میرین تو فهرست و شماره صفحه رو پیدا میکنید .کار Elastic مشابه اما چه جوری ؟ Elasticsearch از یک structure (ساختاری) به اسم inverted index  استفاده میکنه که از جستجوهای بسیار سریع full-text پشتیبانی می کنه . کارش اینجوریه که میاد یه لیستی از کلمات منحصر به فرد توی هر داکیومنت درست میکنه از اون ور میاد میگه هر کدوم از این کلمات توی کدون داکیومنتا وجود داره ..فرض کنید ۲ تا داکیومنت داریم که فیلدی به اسم content دارن که ۲ تا جمله زیرن محتواشن:برای ایجاد یه  inverted index ، ابتدا content  هر داکیومنت را به کلمات جداگانه تقسیم می کنیم یک لیست مرتب شده از همه کلمات منحصر به فرد ایجاد می کنیم و بعد مشخص می کنیم که هر عبارت تو کدوم داکیومنت ظاهر می شه که یه نتیجه شبیه زیر داره :همون طور که میبینین حتی به بزرگی و کوچیکی کلمات هم حساسه مثل quick و Quickمثلا من اومدم عبارت quick brown سرچ کردم کاری که انجام میده :خب الان هر ۲ تا داکیومنت اون شرط سرچ ما رو دارن خب ولی داکیومنت اول شباهت بیشتری داره مثلا الان بیایم یه الگوریتم ساده که بیاد تعداد شباهت و بشماره پیاده کنیم میاد داکیومنت ۱ نشون میده و تموم.ولی حالا چندتا مشکل این جا هست مثلا :اینجا quick و Quick  اومده جدا شده و توی ۲ تا داکیومنت نشون داده شده خب برای کاربر فرقی نداره که  این الان یه مشکلبرای کلمه های مثل fox و foxes خب اینم برای کاربر فرقی نداره که معنی اینا یکیه یعنی ریشه هاشون یکیهبرای کلمه های مثل jumped و leap خب معنی اینا هم یکیه دیگه بازم واسه کاربر فرقی ندارهبچه ها یه چیزی احساس کردم شاید پیش بیاد مثلا اینجوری فرض کنید میرید تو گوگل میزنید foxes انتظار ندارید که fox براتون نیاره که!! یا مثلا jumped(پریدن) میزنید انتظار دارین اون صفحه های مرتبط به leap هم بیاره دیگه تا تش اون چیزی که میخواین پیدا کنید :) اون مشکلای بالا رو اینجوری بهش فک کنید :)))))حالا کاری که الستیک میکنه اینجوریه که،حالا نمیدونم بگم نگم طولانی نشه! حالا میگم دیگه ببخشید اگه طولانی شد :))وقتی شما یه داکیومنت بخواین ذخیره کنید توی الستیک کاری که انجام میده برای تبدیل به inverted index اینه که میاد از یه مرحله ی Analyzer میگذرونه که خودش شامل ۲ تا مرحلس :1-Tokenizer : تقریبا میشه که جدا کردن کلمه ها بر اساس فاصله هایی که بغلشون و space ها (این یه تعریف کاملا مسخره به زبون خودم بود ۱۰۰ درصد میدونیم که تخصصی اصلا نیست )2-Filter :که الان میخوایم راجب این مرحله حرف بزنیم که مشکلاتمونو حل میکنه بعد این مراحل میاد تو shard ذخیره میکنه (این مفهوم ایشالله تو پست بعد)حالا اون ۲ تا جمله بالا مرحلهTokenize رد کرده میره سر مرحله Filter .مرحله Filter به این صورته که باید از فیلترای زیر رد بشه :Remove stop words:همون کلمه هایی که زیاد میبینیم ولی خب اهمیتی ام نداره مثل the ، a،....lowercasing:بیایم همه کلمه هارو به حروف کوچیک تبدیل کنیمStemming:بیایم ریشه یابی کنیم ، مثلا swimming تبدیل شه swim یا Foxes بشهFox Synonyms:کلمات هم معنی و پیدا کنیم مثلا jumped با leap هم معنی هستن  الان مثال بالای ما بعد این مراحل تبدیل میشه به این از اون ور شما اگه  سرچ کنید the Quick Brown حتی روی کويری شما این مراحل انجام میشه و تبدیل میشه به :quick brown بعد برای هر کلمه میاد مشخص میکنه تو کدوم داکیونتا هست و بهتون نشون میدهخب ببخشید طولانی شد امیدوارم مفید بوده باشه و استفاده کرده باشین .</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 23 Oct 2021 15:43:41 +0330</pubDate>
            </item>
                    <item>
                <title>صف و پیاده سازی در پایتون</title>
                <link>https://virgool.io/@Hanieh_mav99/%D8%B5%D9%81-%D9%88-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ivbakr8on3v2</link>
                <description>صف (queue) : یک ساختمان داده ای است که عمل حذف از ابتدا و اضافه یا درج به انتهای ان  انجام میشود . یعنی در یک صف موقعی که میخوایم یه عنصر حذف کنیم میایم اولین عنصری که وارد صف شده را حذف میکنیم.صف از سیاست FIFO(first in first out) پیروی میکنه یعنی در واقع اولین عنصری که وارد میشه اولین عنصری میشه که حذف و خارج میشه.توی صف ۲ تا تعریف داریم : front : مشخص کننده نفر اوله (ابتدای صف) rear : مشخص کننده نفر اخره (اشاره کننده به اخر صف )Enqueue: (O(1))اضافه کردن  به صف پیچیدگی زمانی Dequeue : (O(1))حذف کردن  از صف پیچیدگی زمانی  خب حالا میخوایم با پایتون با روش های زیر صف رو پیاده سازی کنیم :listبا استفاده از لیست ها میتونیم یه صف پیاده سازی کنیم به این صورت که عمل Enqueue با استفاده از append و عمل Dequeue با استفاده از  pop انجام میشه و خب لیست خیلی برای این کار کند هستند چون برای عمل حذف و اضافه از ابتدا نیازه که خمه عنصر ها یکی یکی شیفت پیدا کنند اون ور که یه زمان O(n) نیازه براش ولی کلا روش لیست برای کار با تعداد ایتم کم خوبه .collections.dequeصف را می توانیم با استفاده از کلاس deque از ماژول Collections پیاده سازی کنیم . عمل Enqueue با استفاده از append و عمل Dequeue با استفاده از  popleft انجام میشه . در مواردی که نیاز به عملیات سریعتر حذف و اضافه و پاپ از دو طرف ظر داریم ، Deque بهتر از لیسته ، زیرا deque پیچیدگی زمانی O (1) را برای عملیات درج و حذف فراهم می کند. (چون deques حذف و اضافه عناصر از هر دو طرف پشتیبانی می کند ، می تواند هم به عنوان صف و هم به عنوان پشته عمل کند.)queue.Queueاینجا Queue ماژول داخلی پایتون است که برای پیاده سازی صف استفاده می شود.این صف از قانون FIFO پیروی می کند.  عمل Enqueue با استفاده از put و عمل Dequeue با استفاده از  get انجام میشه.همانطور که مشاهده می کنید در خط اخر براش همیشه منتظر میمونه تا عنصری در دسترس شه میتونیم به جاش ازget_nowait استفاده کنیم که در صورت خالی بودن پشته به ما error میده.امیدوارم دوست داشته باشید برای توضیحات بیشتر به این سایت و این سایت میتونین برین .</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 18 Sep 2021 14:30:20 +0430</pubDate>
            </item>
                    <item>
                <title>پشته و پیاده سازی در پایتون</title>
                <link>https://virgool.io/@Hanieh_mav99/%D9%BE%D8%B4%D8%AA%D9%87-%D9%88-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-pkwvkum3ejhe</link>
                <description>پشته (Stack) : یک ساختمان داده ای است که عمل حذف و اضافه از بالای ان انجام میشود . یعنی در یک پشته موقعی که میخوایم یه عنصر حذف کنیم میایم اخرین عنصری که وارد پشته شده را حذف میکنیم.پشته از سیاست LIFO(last in first out) پیروی میکنه یعنی در واقع اخرین عنصری که وارد میشه اولین عنصری میشه که حذف میشه .به عمل اضافه کردن به پشته push میگن و به عمل حذف کردن از پشته pop میگن  و top مشخص کننده عنصر بالایی پشته است (اخرین عنصری که push شده در کدام خانه است )خب حالا میخوایم با پایتون با روش های زیر پشته رو پیاده سازی کنیم :list : با استفاده از لیست ها میتونیم یه پشته پیاده سازی کنیم به این صورت که عمل push  با استفاده از append و عمل pop با استفاده از همون pop انجام میشه و خب اینجا سیاست LIFO که گفتیم داره کامل پیاده سازی میشه . به این صورت که append میاد به اخر پشته یه عنصر درج میکنه و pop میاد اخرین عنصر و حذف میکنه Collections.deque :پشته  را می توانیم با استفاده از کلاس deque از ماژول Collections  پیاده سازی کنیم .همان متد هایی که در لیست داشتیم اینجا هم استفاده میشه append  و pop queue.LifoQueue :ماژول queue  دارای LIFO Queue است که اساساً Stack است. داده ها با استفاده از  put  وارد می شوند و با استفاده از get خارج می شوند.همانطور که مشاهده می کنید در خط اخر براش همیشه منتظر میمونه تا عنصری در دسترس شه میتونیم به جاش ازget_nowait استفاده کنیم که در صورت خالی بودن پشته به ما error میده.خب حالا چه کنیم با این ۳ تا پیاده سازی :))))))))مشکل ما تو پیاده سازی با لیست موقعی شروع میشه که پشته ما بزرگ باشه اون وقته که با مشکل سرعت روبه رو میشیم . توی لیست برای دسترسی سریع به عناصر، این عناصر توی حافظه کنار همدیگه دخیره میشن که هرموقع هر کدومو خواستیم دیگه با توجه به جایی که داره توی حافظه به راحتی پیدا میشه .حالا اگه پشته شما بزرگتر از بلوک حافظه ای است که در حال حاضر آن را نگه داشته است باشه ، پس پایتون باید بهش حافظه بده حالا همین موضوع باعث میشه از یه جا به بعد بعضی ازappend هایی که انجام میدین طولانی باشه  . حالا تو روش دوم deque بر اساس doubly linked list(لیست پیوند دوگانه) ساخته شده. توی  ساختار لیست پیوندی ، هر ورودی در بلوک حافظه خودش ذخیره می شه و دارای reference (مرجع )برای ورودی بعدی در لیست است. حالاdoubly linked list(لیست پیوند دوگانه) مثل همینه  ، با این تفاوت که هر ورودی دارای  reference (مرجع ) برای ورودی قبلی و بعدی در لیست است. واسه همین به راحتی میتونین گره ها را به هر دو انتهای لیست اضافه کنید.برای اضافه کردن ورودی جدید به ساختار لیست پیوندی فقط لازمه  مرجع ورودی جدید به  بالای  پشته اشاره کنه و مشکلی که تو لیست داشتیم حل میشه و اینکه اینجا   پیچیدگی زمانی O (1) و در لیست  O (n) است .اگه بخواین از پشته توی multi-threaded programs استفاده کنیم از روش سوم استفاده میکنیم .LifoQueue ساختارش thread-safe است . حالا این ویژگی  thread-safe  یه هزینه ای داره که باعث میشه هر عملیات یک زمان بیشتری صرف کنه که ولی این زمان اونقدری اهمیتی نداره ولی اگه دیدین نه اهمیت داره میتونین از deque استفاده کنید ولی چرا کلا نرفتیم سراغ اون چون که : توی  deque عملیات appendو  pop هر ۲ تاشون atomic هستند یعنی یه thread دیگه نمیتونه بیاد قطعشون کنه ولی توی این کلاس یه سری متد دیگه هست که atomic نیستن خب همین موضوع باعث میشه احتمال خطر باشه و سعی کنیم سراغ این راه نریم .لیستم که کلا توی  multi-threaded programs برای پیاده سازی پشته سراغش نمیریم .ولی در کل شد لیست تو پشته های بزرگ حافظه میخواد ولیdeque حل میکنه پس در حالت کلی از deque استفاده میکنیم و توی threading از LifoQueue .امیدوارم خوشتون اومده باشه و برای توضیح بهتر و کامل تر میتونین به این سایت برین .</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sun, 05 Sep 2021 19:35:02 +0430</pubDate>
            </item>
                    <item>
                <title>ساختمان داده (درخت)</title>
                <link>https://virgool.io/@Hanieh_mav99/%D8%B3%D8%A7%D8%AE%D8%AA%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1%D8%AE%D8%AA-c9vqwfojqhsv</link>
                <description>درخت یک مجموعه ای که دارای یک یا چند تا گره است . این گره ها توسط یال به هم وصل شده اند .هر گره میتونه پدر چندتا گره دیگه باشه و یا فرزند باشه یعنی دارای پدر باشه . درجه : تعداد زیر درختای یک گره (مثلا گره A درجه ان ۳ میباشد)ریشه : گره ای که هیچ پدری نداشته باشه( گره A)برگ : گره ای که هیچ فرزندی نداشته باشه ( درجه اون صفره)خواهر یا برادر : گره های که پدر مشترک داشته باشندارتفاع گره : ار گره به سمت برگ میریم . بزرگترین مسیر میشه ارتفاع اون گره (مثلا ارتفاع گره A برابر ۳ میباشد ارتفاع گرهH برابر ۰ )ارتفاع درخت : ارتفاع ریشه میشه ارتفاع درختسطح گره : سطح 0 به ریشه اختصاص داده میشه و برای همه گره های دیگه به ترتیب سطح ریشه به علاوه ۱ میشه (سطح گره A برابر 0 است . سطح گره های B,C برابر 1 است .)درخت دودویی (Binary Tree): یه درخت ریشه دار است که هر عنصر آن حداقل ۲ تا فرزند است یعنی هر عنصر صفر یا یک یا ۲ فرزند دارند . تو این درخت فرزند چپ یا راست متفاوت است .درخت دودویی (full ): درختی که همه گره ها حتما ۲ تا فرزند دارن به جز برگ ها و همه برگ ها هم سطح هستند.درخت دودویی کامل (complete): همه سطح های قبل از اولین سطح کاملا پر هستند . همه گره های تا جایی که ممکنه در سمت چپ قرار میگیرند .پیمایش درخت دودویی : در این روش میایم توی درخت حرکت میکنیم و هر گره را حداقل یکبار ملاقات میکنیم پیمایش پیشوندی (Preorder ) : ریشه - چپ - راست .پیمایش میانوندی (Inorder): چپ - ریشه - راستپیمایش پسوندی (Postorder): چپ - راست - ریشهبرای مثال در شکل بالا توی پیمایش پیشوندی : اول گره ریشه (۸) ملاقات میشه بعد میریم توی زیر درخت سمت چپ (۵و۳و۴) حالا باز همین پیمایش و اجرا میکنیم . باز اول ریشه یعنی ۵ ملاقات میشه بعد گره سمت چپ یعنی ۵ ملاقات میشه و حالا الان ۳ فرزند چپ نداره پس فرزند سمت راست یعنی ۴ را ملاقات میکنیمپیمایش میانوندی : اول زیر درخت چپ پیمایش میشه (۵و۳و۴) خب خودش  یه درخته پس همین پیمایش روش اجرا میشه . در زیر درخت با گره های ۳و۴ فرزند چپ نداریم پس ریشه ان یعنی ۳ ملاقات میشه و بعد فرزند راست یعنی ۴ ملاقات میشه . میایم بالا الان گره ۵ فرزند چپش پیمایش شده پس نوبت ریشه اس یعنی ۵ حالا باز میایم بالا میرسیم به ۸ که فرزند چپش کامل پیمایش شده حالا نوبت ریشس که خودشه یعنی ۸ . حالا میریم سراغ فرزند راستش و همین پیمایش و روش اجرا میکنیم .پیمایش پسوندی : اول زیر درخت چپ پیمایش میشه (۵و۳و۴) خب خودش  یه درخته پس همین پیمایش روش اجرا میشه . در زیر درخت با گره های ۳و۴ فرزند چپ نداریم پس فرزند راست ان یعنی ۴ ملاقات میشه و بعد ریشه  یعنی ۳ میشه . میایم بالا الان گره ۵ فرزند چپش پیمایش شده پس نوبت فرزند راسته که نداره پس نوبت ریشس یعنی ۵ حالا باز میایم بالا میرسیم به ۸ که فرزند چپش کامل پیمایش شده حالا نوبت فرزنده راستشه همین پیمایش و روش اجرا میکنیم .درخت جستجوی دودویی (‌BTS) : تو این درخت همه عنصر های زیر درخت چپ باید کوچیک تر از ریشه باشد .همه عنصرهای زیر درخت راست باید بزرگ تر از ریشه باشد . زیر درخت چپ و راست هر کدوم خودشون باید یک ‌BTS باشد . عنصر تکراری نداشته باشدجستجو در  ‌BTS:میایم اول عنصر مورد نظر را با ریشه مقایسه میکنیم اگه برابر بود که خب به جواب رسیدیم :)اگه کوچکتر از ریشه بود  میریم توی زیر درخت سمت چپ همین روش به صورت بازگشتی انجام میدیماگه بزرگتر از ریشه بود  میریم توی زیر درخت سمت راست همین روش به صورت بازگشتی انجام میدیمدنباله جستجو دنباله ای که برای جستجوی عنصر مورد نظر طی میشه . مثلا دنباله جستجوی ۷ برابر &lt;۷-۶-۸-۵&gt;درج در  ‌BTS:میایم اول عنصر مورد نظر را با ریشه مقایسه میکنیم اگه کوچکتر از ریشه بود  میریم توی زیر درخت سمت چپ اضافه میکنیم اگه بزرگتر از ریشه بود  میریم توی زیر درخت سمت راست اضافه میکنیم. بعد از اضافه کردن چک کنید درخت حاصل حتما ‌BTS باشد.حذف گره از ‌BTS: اگر گره فرزند نداشته باشد (یعنی گره  یک برگ باشد)خب میایم راحت حذفش میکنیم اگر گره  یک فرزند داشته باشد میایم همون فرزندو میزاریم جاشاگر گره  ۲ فرزند داشته باشد میایم کوچک‌ترین مقدار در زیردرخت راست گره را پیدا می‌کنیم.میزاریم جاشمرتب سازی ‌BTS : اگه پیمایش Inorder توی درخت انجام بدیم یه لیست مرتب شده  داریم . به این روش tree sort میگن .خب دوستان قطعا درخت خیلی مبحث بزرگتریه و من چیزای خیلی خیلی کمی بهتون گفتم امیدوارم زیاد گیج کننده و بد توضیح نداده باشم شبتون بخیر :)</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 28 Aug 2021 00:15:15 +0430</pubDate>
            </item>
                    <item>
                <title>یکم الگوریتم</title>
                <link>https://virgool.io/@Hanieh_mav99/%DB%8C%DA%A9%D9%85-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-uzo9swh6edg6</link>
                <description>تو این مطلب میخوایم خیلی خلاصه چندتا از الگوریتم های مرتب سازی و باهم ببینیمالگوریتم های مرتب سازی و بر اساس نحوه مرتب سازی به ۲ دسته میشه تقسیم کردمبتی بر مقایسه : با مقایسه بین کلید های عناصر ترتیب پیدا میشهمثل مرتب سازی های : حبابی - انتخابی - درجی - ادغامی - سریع - هیپ - درختی - شلغیرمقایسه ای (خطی):بدون مقایسه کلیدهای عناصر باهم مرتب سازی انجام میشهمثل مرتب سازی های : شمارشی - مبنایی - سطلی - لانه کبوتریخب شروع میکنیم روش کار چندتا از این الگوریتم هارو ببینیم :)مرتب سازی حبابی (Bubble sort): یه ارایه نامرتب و بهش میدیم بعد توی طول ارایه حرکت میکنیم و یک عنصر را با عنصر مجاورش با هم مقایسه میکنیم و اگه تو ترتیبی که میخوایم مرتب کنیم نباشن میایم جاشونو با هم عوض میکنیمشبه کد این الگوریتمBUBBLESORT(A):for i = 1 to A.length-1for j = A.length downto i + 1if A[j] &gt; A[j+1]exchange A[j] with A[j+1]
و کد این الگوریتم :def bubble_sort(array):for i in range(0, len(array) - 1):for j in range(len(array) - 1):if (array[j] &gt; array[j + 1]):temp = array[j]array[j] = array[j + 1]array[j + 1] = tempreturn arrayاین الگوریتم برای مجموعه داده‌های بزرگ مناسب نیست . پیچیدگی حالت میانگین و بدترین حالت آن برابر با (Ο(n2 است .مرتب سازی درجی (insertion sort):شما میتونید مثل یه بازی کارت در نظر بگیرید به این صورت که درست چپتون خالیه کارتارو یکی یکی بر میدارین میزارین تو مکان درست تو دست چپتون (درج میکنید) هر کارت جدیدم با کارتای قبلی تو دست چپتون مقایسه میشه تا مکان درستش انتخاب بشه  خب خیلی قلمبه سلمبه بود :| برای توضیح طرز کار این الگوریتم اول به شکل نگاه کنیدالان میایم ۵ رو با ۸ مقایسه میکنیم خب ۵ کوچیک تره پس جاش باهاش عوض میشه الان ۵و ۸ شدن یه دسته که مرتب شدن . حالا میایم ۳ رو با دسته ۵ و ۸ مقایسه میکنیم و توی جای درست بین اون دسته درج میشه الان ۳ و۵و۸ باهم شدن یه دسته مرتب شده . حالا میایم ۲۱ به این دسته مقایسه میکنیم که ۲۱توی جای درستشه پس به دسته اضافه میشه و همین طور تا به اخر ادامه میدیمشبه کد :INSERTION-SORT(A)for j = 2 to A.lengthkey = A[j]// Insert A[j] to into the sortedsequence A[1..j-1]i = j - 1while i&gt;0 and A[i] &gt; keyA[i+1] = A[i]i = i-1A[i+1] = keyکد الگوریتم:def insertion_sort(array):for i in range(1, len(array)):value = array[i]j = i - 1while j &gt;= 0 and value &lt; array[j]:array[j + 1] = array[j]j -= 1array[j + 1] = valuereturn arrayاین الگوریتم برای مجموعه داده‌های بزرگ مناسب نیست . پیچیدگی حالت میانگین و بدترین حالت آن برابر با (Ο(n2 است .مرتب سازی انتخابی(selection sort):میگردیم کوچیک ترین عنصر میزاریم مکان اول دوباره کوچیک ترین پیدا میکنیم میزاریم مکان دوم تا به اخر.به ازای n عنصر n-1 مرحله داریم.شبه کد :void selectionsort(int,arr[],int n){int i,jm;for(i=0;i&lt;n-1;i++){m=i;for(j=i+1;j&lt;n;j++)if(arr[j]&lt;arr[m])m=i;swap(&amp;arr[m],&amp;arr[i]);}}
کد الگوریتم :for i in range(len(A)):# Find the minimum element in remaining# unsorted arraymin_idx = ifor j in range(i+1, len(A)):if A[min_idx] &gt; A[j]:min_idx = j# Swap the found minimum element with# the first elementA[i], A[min_idx] = A[min_idx], A[i]# Driver code to test aboveprint (&amp;quotSorted array&amp;quot)for i in range(len(A)):print(&amp;quot%d&amp;quot %A[i]),این الگوریتم برای مجموعه داده‌های بزرگ مناسب نیست . پیچیدگی ان در حالت متوسط و بدترین حالت آن برابر با (Ο(n2 است .مرتب سازی ادغامی (merge sort):مرتب‌سازی ادغامی  بر مبنای الگوریتم حل مسئله «تقسیم و حل» عمل می‌کند. یک ارایه نامرتب را  در نظر می‌گیریم . در مرتب‌سازی ادغامی اول کل آرایه را به ۲ نیمه تقسیم میکنیم و بعد نیمه هارو دوباره به ۲ قسمت تقسیم میکنیم تا جایی که نشه تقسیم کرد. حالا این نیمه ها رو به صورت مرتب به همان روشی که تقسیم کردیم، با هم ترکیب می‌کنیم.شبه کد :MERGE-SORT(A,p,r)1 if p&lt;r2 q = (p+r)/23 MERGE-SORT(A,p,q)4 MERGE-SORT(A,p+1,r)5 MERGE(A,p,q,r)کد الگوریتم :def mergeSort(arr):if len(arr) &gt; 1:# Finding the mid of the arraymid = len(arr)//2# Dividing the array elementsL = arr[:mid]# into 2 halvesR = arr[mid:]# Sorting the first halfmergeSort(L)# Sorting the second halfmergeSort(R)i = j = k = 0# Copy data to temp arrays L[] and R[]while i &lt; len(L) and j &lt; len(R):if L[i] &lt; R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1# Checking if any element was leftwhile i &lt; len(L):arr[k] = L[i]i += 1k += 1while j &lt; len(R):arr[k] = R[j]j += 1k += 1# Code to print the listdef printList(arr):for i in range(len(arr)):print(arr[i], end=&amp;quot &amp;quot)print()# Driver Codeif __name__ == &#039;__main__&#039;:arr = [12, 11, 13, 5, 6, 7]print(&amp;quotGiven array is&amp;quot, end=&amp;quot\n&amp;quot)printList(arr)mergeSort(arr)print(&amp;quotSorted array is: &amp;quot, end=&amp;quot\n&amp;quot)printList(arr)پیچیدگی بدترین حالت برای این الگوریتم برابر با (Ο(n log n است و خب نسبت به بقیه خب خیلی بهتره :)امیدوارم زیاد خسته کننده نبوده باشه و خوب توضیح داده شده باشهراستی بیشتر کدارم از اینجا برداشتم .</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 21 Aug 2021 23:02:49 +0430</pubDate>
            </item>
                    <item>
                <title>یکم کار با داکر</title>
                <link>https://virgool.io/@Hanieh_mav99/%DB%8C%DA%A9%D9%85-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-xab5z03uuxup</link>
                <description>خب تو نوشته قبلی یکم با داکر اشنا شدیم (امیدوارم اشنا کرده باشه :) ) حالا چندتا دستور و با هم ببینیم ولی قبلش image:می تونیم اینجوری در نظر بگیریمش که همون برنامه هایی هستن که میخوایم نصب و اجرا کنیم در واقع container از رو همینا میسازیم و این برنامه ها درون کانتینر اجرا میشن docker hub :یه وبسایتی که خود داکر زده و یه منبع رسمیه که image هایی که میخواین  توش پیدا کنید.موقعی که یک image سرچ کنید ۳ نوع image براتون میاد .  نوع اول verified publisher : توسط توسعه دهندگان رسمی تأیید شدهنوع دوم official images : خود داکر نظارت رسمی روش داره نوع اخر که هیچی ندارن توسط خود برنامه نویسا توسعه داده شدنبعد برین توش و یه اکانت بسازین :)خود داکر از این اینجا می تونید نصب کنید .  برای شروع با دستور docker run میتونین اولین کانتینر خودتونو اجرا کنید یه توقف : اگه به مشکل خوردین چون تحریمیم :)))))))))))) بیاین از  سایت شکن کمک بگیرین و بعدش اگه خطای احراز هویت داشتین docker login بزنید و با یوزر و پس داکر هابتون وارد شینdocker run nginx الان شما اینجا یه کانتینر اجرا کردین و  nginx همون image که دارین توی کانتیر اجرا می کنید . نحوه کار به این شکله که وقتی این دستور و میزنین داکر اول میاد میبینه که nginx توی هاست داکر هست یا نه اگه بود که ازش استفاده میکنه و کانتینرشو میسازه اگه ببینه نه وجود نداره میاد از داکر هاب اونو بر میداره.حالا اگه شما بیاید ۱۰ بار این دستور و اجرا کنید داکر میاد ۱۰ تا کانتینر متفاوت میسازه . ۱۰ تا کانتینری که اصلا هیچ ربطی به هم نداره و برای هر کدوم یه اسم رندوم میسازه .docker ps                                                               با این دستور  میتونین لیست کانتیر های در حال اجرا رو ببینیدdocker ps -a                                                   برای دیدن لیست تمام کانتینرها حتی اونایی که در حال اجرا نیستن          الان من ۷ بار دستور اولو اجرا کردم و میبینین که که ۷ تا کانتینر متفاوت ساخته شده با نام های رندوم و انتخابی خود داکرdocker run --name test nginx                                                   با این دستور میتونین نام انتخابی خودتونو بدین docker run rm test  با این دستور میتونیم کانتینر تست که در حال اجرا نیست و حذف کنیم برای حذف کانتینر در حال اجرا    docker rm -f test   که با حالت اجبار حذف میکنه                                                     البته برای حذف کانتینر در حال اجرا باید اول اونو stop کنید بعد حذفش کنید که به اونم میرسیم .docker container prune                با دستور فوق میتوانید تمام کانتینر هایی که در حال اجرا نیستند را حذف کنید  docker run --name test --rm nginx                                                                                           با این دستور کانتینر با اسم تست ساخته میشه و بعد از اینکه کارش تموم شد همون موقع حذف میشه و تو لیست ارشیو ها نمیره دیگهحالا برای مثال من این دستور اجرا کردم که بعد چاپ hi کارش تموم شده ولی میخوام با یه ترمینالی به درون کانتینر وصل شم چندتا دستور بفرستم-t :                                                                                                    یک ترمینال جدید داخل کانتینر ایجاد می‌کند -i :                                      به شما اجازه می‌دهد با استفاده از ورودی استاندارد کانتینر یک ارتباط تعاملی برقرار کنید   تمام دستورات زیر با دستور بالا یکسان میباشد docker run --interactive --tty ubuntudocker run -i -t ubuntuخب نکته ای که هست اینه ما وقتی یه کانتینر می سازیم به محض اینکه کارش تموم شد exit میشه ولی ما مثلا اینجا داریم از nginx استفاده میکنیم که یه سروره و میخوایم تو کل زمان کارمون در حالت اجرا باشه نه اینکه سریع خارج بشه برای این کار ما کانتینرمونو به عنوان یه detached container اجرا میکنیم  حالا Detached یعنی اینکه کانتینر ما تو حالت پس زمینه (background) داره اجرا میشه بدون اتصال به هیچ ورودی و خروجی برای استفاده از این حالت از دستور های زیر که معادل هم هستند استفاده میکنیم docker run --name test --detach nginxdocker run --name test2 -d nginxهمان طور که مشاهده میکنید بعد از اجرای دستورات یک کد یونیک برای هر کانتینر ساخته میشود که میتونید به جای اسم از همین کد استفاده کنید . در هنگام دیدن لیست کانتیرها به status انها دقت کنید میبینید که در حالت اجرا هستندچرخه زندگی کانتینرها:تا الان دیدیم با docker run یه کانتینر میسازیم و میره تو حالت Up و بعد از اینکه کارش تموم میشه میره تو حالت  Exited . اینجا به معرفی چند دستور دیگه میرسیم docker create --name test ubuntuالان اینجا ما یه کانتینر به اسم تست ساختیم که تو حالت Created هست و هنوز run نیست پس میدونیم که Up هم نیست خب برای اجرا کردن این کانتینر میایم از دستور زیر استفاده میکنیمdocker start testدستور بالا کانتینر و اجرا میکنه و خب مثل همیشه وقتی کارش تموم شد ازش خارج میشهdocker stop test      docker kill testاین ۲ تا دستور معادل هم عمل میکنند و یه کانتینر که در حالت Up هست و stop میکنند  اما فرقشون تو اینه که stop میزاره کانتینر کارش تموم شه بعد اونو stop میکنه ولی kill اصلا کاری نداره که کانتینر کارش تموم شده یا نه همون لحظه اونو stop میکنه (بعد میتونین اون کانتینر و حذف کنید هموم جوری که بالا گفتیم پایین بهش میرسیم :| )docker restart testاین دستور میاد میبینه اگه کانتینر stop هست یه راست میبرتش run میکنه ولی اگه run هست میاد یه دور stop میکنه بعد میبره تو حالت rundocker pause test  کانتینری که run هست گفتیم تو حالت Up هست دیگه . اینجا میاد تو حالت Up متوقفش میکنه ولی stop نمیکنه فقط متوقف میکنه به شکل و   STATUS دقت کنید docker unpause test  اینم معلومه چیکار میکنه :)))))خب دوستان داکر خیلی گستردس این یه گوشه خیلی خیلی خیلی خیلی کوچیکی بود امیدوارم که گیج کننده نبوده باشه به بدردتون بخوره :))))) و ببخشید که طولانی شد .</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sun, 15 Aug 2021 00:52:10 +0430</pubDate>
            </item>
                    <item>
                <title>چرا داکر؟</title>
                <link>https://virgool.io/@Hanieh_mav99/%DA%86%D8%B1%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-uxo0pvcqduhw</link>
                <description>داکر یک پلتفرم open source است که اجرا، ساخت ، توزیع برنامه ها و همچنین امکان اجرا ی آن ها در محیط های مختلف در یک محیط ایزوله و بسته بندی شده ( container) انجام میدهد   Container :مثل یک کانتینر میتونید در نظر بگیرید که برنامه ها را حمل و اجرا میکند. همیطور درون خودش همه وابستگی ها و ابزار های لازم برای اجرای برنامه رو داره . برای اجرای هر برنامه یه container داریم که اینا هیچ کدوم به هم ربطی نداره و با هم تداخل ندارن.حالا اصلا چرا بیایم این روش دسته بندیو انجام بدیم .فرض کنید تو یک تیم چند تا برنامه نویس هست که نسخه های مختلفی از ابزار و استفاده میکنه خب همین جوری که معلومه نسخه های مختلف امکانات مختلف داره که تو نسخه پایین تر نیس اینجوری، هر کی تو سیستمش یه چیزی داره و یه جایی به ناسازگاری میرسیم و دعوامون میشه حالا راه حل چیه؟(قرار بزاریم همه یه نسخه نصب کنیم ? )ما اینجا میایم برنامه هارو دسته بندی میکنیم و ویژگی هایی که میخوایم میریزیم تو اون دسته (container) بعد به برنامه نویسا میگیم بیاین این بسترو اجرا کنید تا هرکی نره واسه خودش یه چیز بریزه.حالا یه مثال دیگه فرض کنید یه ابزاری داریم فقط رو لینوکس نصب میشه حالا ما ام میایم نصب میکنیم و برناممونو توسعه میدیم بعد مثلا رفتیم یه سرور خریدیم که سیستم عاملش ویندوزه (!) خب حالا چی میشه؟ error می خوره ولی تو سیستم خودتون به خوبی داره کار میکنه برای حل مشکل میایم داکرو نصب میکنیم برنامه رو بسته بنده میکنیم و اون بسته(container) رو می بریم رو سرور نصب میکنیم و اون سرور اصن دیگه کاری نداره تو اون container داره چی میشهبه دلایل دیگه از استفاده از داکر که میتونیم اشاره کنیممثلا شما هرچی نرم افزار و برنامه بیشتر داشته باشین مدیریتش دشوار تره . مثلا برنامه های java وابسته به java virtual machine هستند یا مثلا یه  web application وابسته به database  است (می تونه یه وایستگی این باشه مثلا) خب تو حالت عادی این برنامه ها با همه وابستگی هایی که باید نصب باشند سیستم شمارو مثل یه اتاق شلوغ و نامنظم میکنهولی با استفاده از داکر و بسته بندی کردن سیستم شما مرتب میمونه چرا چونکه یه برنامه با همه وابستگیاش میره تو یه بسته و با خارج از بستش با چیزی ارتباط نداره و وابستگی مشترک ایجاد نمیکنه و همه چی تمیز و مرتب میمونه احتمالا تو شکل بیشتر مشخص میشهحالا یه خوبی دیگه داکر ایمنیهمثلا یه مهاجم برنامه رو نوشته باشه یا مثلا برنامه bug های خیلی مخربی داشته باشهحالا وقتی برنامتون توی یه container باشه مثل یه زندان میشه براش و دسترسیشو به بقیه برنامه های در حال اجرا و data ها و منابع حساس دیگه محدود میکنه و اینجوری امنیت بیشتر میشهچرا داکر بهتر از ماشین مجازی ؟ تو ماشین مجازی  چون به خاطر وجود یه سیستم‌عامل اضافه  روی سیستم‌عامل میزبان، باعث میشه منابع زیادی هدر بره و حجم زیادی به پروژه اضافه کنهولی داکر این مشکل با  اشتراک‌گذاری هسته سیستم‌عامل بین container ها، به آسانی حل می‌کنه.این متن یه نگاه خیلی ساده به داکر بود و در کلام اخر ازش استفاده کنید :)منبع من کتاب  docker in action و سایت مونگارد بود</description>
                <category>حانیه مهدی ابادی</category>
                <author>حانیه مهدی ابادی</author>
                <pubDate>Sat, 07 Aug 2021 22:02:33 +0430</pubDate>
            </item>
            </channel>
</rss>