[{"content":" Experience # Shahid Beheshti University Teacher Assistant 09/2022 - 06/2024 Artificial Intelligence and Expert Systems course Advanced Programming course Introduction to Programming course Education # Shahid Beheshti University Bachelor\u0026#39;s degree 09/2021 - 06/2025 Alavi Highschool Mathematics \u0026amp; Physics 09/2015 - 06/2021 ","date":"6 September 2024","externalUrl":null,"permalink":"/en/about/","section":"Welcome to Moein!","summary":"\u003ch2 class=\"relative group\"\u003eExperience \n    \u003cdiv id=\"experience\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#experience\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003col class=\"border-l-2 border-primary-500 dark:border-primary-300 list-none\"\u003e\n\n\n\n\n\n\n\u003cli\u003e\n  \u003cdiv class=\"flex flex-start\"\u003e\n    \u003cdiv class=\"bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full -ml-12 mt-5\"\u003e\n      \n\n  \u003cspan class=\"relative block icon\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"\u003e\n\u003cpath fill=\"currentColor\"  d=\"M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3L562.7 256l-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z\"/\u003e\u003c/svg\u003e\n  \u003c/span\u003e\n\n\n    \u003c/div\u003e\n    \u003cdiv class=\"block p-6 rounded-lg shadow-2xl min-w-full ml-6 mb-10 break-words\"\u003e\n      \u003cdiv class=\"flex justify-between\"\u003e\n        \n        \u003ch2 class=\"mt-0\"\u003e\n          Shahid Beheshti University \n        \u003c/h2\u003e\n        \n        \n      \u003c/div\u003e\n      \n      \u003ch4 class=\"mt-0\"\u003e\n        Teacher Assistant\n      \u003c/h4\u003e\n      \n      \u003cdiv class=\"mb-6\"\u003e\n\n09/2022 - 06/2024\n\n\u003cul\u003e\n    \u003cli\u003eArtificial Intelligence and Expert Systems course\u003c/li\u003e\n    \u003cli\u003eAdvanced Programming course\u003c/li\u003e\n    \u003cli\u003eIntroduction to Programming course\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/li\u003e\n\n\n\u003c/ol\u003e\n\n\n\u003ch2 class=\"relative group\"\u003eEducation \n    \u003cdiv id=\"education\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#education\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003col class=\"border-l-2 border-primary-500 dark:border-primary-300 list-none\"\u003e\n\n\n\n\n\n\n\u003cli\u003e\n  \u003cdiv class=\"flex flex-start\"\u003e\n    \u003cdiv class=\"bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full -ml-12 mt-5\"\u003e\n      \n\n  \u003cspan class=\"relative block icon\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"\u003e\n\u003cpath fill=\"currentColor\" d=\"M320 32c-8.1 0-16.1 1.4-23.7 4.1L15.8 137.4C6.3 140.9 0 149.9 0 160s6.3 19.1 15.8 22.6l57.9 20.9C57.3 229.3 48 259.8 48 291.9v28.1c0 28.4-10.8 57.7-22.3 80.8c-6.5 13-13.9 25.8-22.5 37.6C0 442.7-.9 448.3 .9 453.4s6 8.9 11.2 10.2l64 16c4.2 1.1 8.7 .3 12.4-2s6.3-6.1 7.1-10.4c8.6-42.8 4.3-81.2-2.1-108.7C90.3 344.3 86 329.8 80 316.5V291.9c0-30.2 10.2-58.7 27.9-81.5c12.9-15.5 29.6-28 49.2-35.7l157-61.7c8.2-3.2 17.5 .8 20.7 9s-.8 17.5-9 20.7l-157 61.7c-12.4 4.9-23.3 12.4-32.2 21.6l159.6 57.6c7.6 2.7 15.6 4.1 23.7 4.1s16.1-1.4 23.7-4.1L624.2 182.6c9.5-3.4 15.8-12.5 15.8-22.6s-6.3-19.1-15.8-22.6L343.7 36.1C336.1 33.4 328.1 32 320 32zM128 408c0 35.3 86 72 192 72s192-36.7 192-72L496.7 262.6 354.5 314c-11.1 4-22.8 6-34.5 6s-23.5-2-34.5-6L143.3 262.6 128 408z\"/\u003e\u003c/svg\u003e\n  \u003c/span\u003e\n\n\n    \u003c/div\u003e\n    \u003cdiv class=\"block p-6 rounded-lg shadow-2xl min-w-full ml-6 mb-10 break-words\"\u003e\n      \u003cdiv class=\"flex justify-between\"\u003e\n        \n        \u003ch2 class=\"mt-0\"\u003e\n          Shahid Beheshti University \n        \u003c/h2\u003e\n        \n        \n      \u003c/div\u003e\n      \n      \u003ch4 class=\"mt-0\"\u003e\n        Bachelor\u0026#39;s degree\n      \u003c/h4\u003e\n      \n      \u003cdiv class=\"mb-6\"\u003e\n\n09/2021 - 06/2025\n\n\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/li\u003e\n\n\n\n\n\n\n\n\u003cli\u003e\n  \u003cdiv class=\"flex flex-start\"\u003e\n    \u003cdiv class=\"bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full -ml-12 mt-5\"\u003e\n      \n\n  \u003cspan class=\"relative block icon\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"\u003e\n\u003cpath fill=\"currentColor\" d=\"M320 32c-8.1 0-16.1 1.4-23.7 4.1L15.8 137.4C6.3 140.9 0 149.9 0 160s6.3 19.1 15.8 22.6l57.9 20.9C57.3 229.3 48 259.8 48 291.9v28.1c0 28.4-10.8 57.7-22.3 80.8c-6.5 13-13.9 25.8-22.5 37.6C0 442.7-.9 448.3 .9 453.4s6 8.9 11.2 10.2l64 16c4.2 1.1 8.7 .3 12.4-2s6.3-6.1 7.1-10.4c8.6-42.8 4.3-81.2-2.1-108.7C90.3 344.3 86 329.8 80 316.5V291.9c0-30.2 10.2-58.7 27.9-81.5c12.9-15.5 29.6-28 49.2-35.7l157-61.7c8.2-3.2 17.5 .8 20.7 9s-.8 17.5-9 20.7l-157 61.7c-12.4 4.9-23.3 12.4-32.2 21.6l159.6 57.6c7.6 2.7 15.6 4.1 23.7 4.1s16.1-1.4 23.7-4.1L624.2 182.6c9.5-3.4 15.8-12.5 15.8-22.6s-6.3-19.1-15.8-22.6L343.7 36.1C336.1 33.4 328.1 32 320 32zM128 408c0 35.3 86 72 192 72s192-36.7 192-72L496.7 262.6 354.5 314c-11.1 4-22.8 6-34.5 6s-23.5-2-34.5-6L143.3 262.6 128 408z\"/\u003e\u003c/svg\u003e\n  \u003c/span\u003e\n\n\n    \u003c/div\u003e\n    \u003cdiv class=\"block p-6 rounded-lg shadow-2xl min-w-full ml-6 mb-10 break-words\"\u003e\n      \u003cdiv class=\"flex justify-between\"\u003e\n        \n        \u003ch2 class=\"mt-0\"\u003e\n          Alavi Highschool \n        \u003c/h2\u003e\n        \n        \n      \u003c/div\u003e\n      \n      \u003ch4 class=\"mt-0\"\u003e\n        Mathematics \u0026amp; Physics\n      \u003c/h4\u003e\n      \n      \u003cdiv class=\"mb-6\"\u003e\n\n09/2015 - 06/2021\n\n\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/li\u003e\n\n\n\u003c/ol\u003e","title":"About Me","type":"page"},{"content":" Complicated Projects # Title Description Link Toolbox My personal toolbox for my life! GitHub Repo Connect-4 My AI course final project. Develop an AI agent that utilizes both mini-max and reinforcement learning algorithms to play Connect-4. The game is playable in a web-based GUI environment. GitHub Repo Namakala My Advanced Programming course project - A mobile app for buying and selling products GitHub Repo Minesweeper The Minesweeper game with a graphical user interface GitHub Repo Flappy Bird Flappy Bird game with a graphical interface in DOS. My Microprocessor course final project. GitHub Repo Tiny Projects # Title Description Link Digikala API This python package requests to Digikala API and gets a product detail. GitHub Repo Stack Underflow A simple Django web application similar to stack overflow. GitHub Repo URL Shortener A website that shorts any URL GitHub Repo Calculator Telegram Bot A simple calculator with Telegram bot GitHub Repo ","date":"6 September 2024","externalUrl":null,"permalink":"/en/projects/","section":"Welcome to Moein!","summary":"\u003ch2 class=\"relative group\"\u003eComplicated Projects \n    \u003cdiv id=\"complicated-projects\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#complicated-projects\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: left\"\u003eTitle\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eDescription\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eLink\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eToolbox\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eMy personal toolbox for my life!\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/toolbox\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eConnect-4\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eMy AI course final project. Develop an AI agent that utilizes both mini-max and reinforcement learning algorithms to play Connect-4. The game is playable in a web-based GUI environment.\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/connect-4\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eNamakala\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eMy Advanced Programming course project - A mobile app for buying and selling products\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/namakala\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eMinesweeper\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eThe Minesweeper game with a graphical user interface\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/minesweeper-gui\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eFlappy Bird\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eFlappy Bird game with a graphical interface in DOS. My Microprocessor course final project.\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/flappy-bird\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003ch2 class=\"relative group\"\u003eTiny Projects \n    \u003cdiv id=\"tiny-projects\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#tiny-projects\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: left\"\u003eTitle\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eDescription\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eLink\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eDigikala API\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eThis python package requests to Digikala API and gets a product detail.\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/digikala-api\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eStack Underflow\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eA simple Django web application similar to stack overflow.\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/stack-underflow\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eURL Shortener\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eA website that shorts any URL\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/url-shortener\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eCalculator Telegram Bot\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eA simple calculator with Telegram bot\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ca href=\"https://github.com/ILoveBacteria/calculator-telegram-bot\" target=\"_blank\"\u003eGitHub Repo\u003c/a\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e","title":"Projects","type":"page"},{"content":"","date":"6 September 2024","externalUrl":null,"permalink":"/en/","section":"Welcome to Moein!","summary":"","title":"Welcome to Moein!","type":"page"},{"content":"","date":"2 September 2024","externalUrl":null,"permalink":"/tags/algorithm/","section":"Tags","summary":"","title":"Algorithm","type":"tags"},{"content":"","date":"2 September 2024","externalUrl":null,"permalink":"/categories/educational/","section":"Categories","summary":"","title":"Educational","type":"categories"},{"content":"","date":"2 September 2024","externalUrl":null,"permalink":"/tags/graph/","section":"Tags","summary":"","title":"Graph","type":"tags"},{"content":"","date":"2 September 2024","externalUrl":null,"permalink":"/tags/minimum-spanning-tree/","section":"Tags","summary":"","title":"Minimum Spanning Tree","type":"tags"},{"content":" مقدمه # اخیرا سوال 1584. Min Cost to Connect All Points از Leetcode رو داشتم حل می‌کردم که هدف اصلی سوال پیاده‌سازی یه الگوریتم MST بود. مونده بودم پریم بزنم یا کراسکال. یکم که فکر کردم، احساس کردم پیاده‌سازی کراسکال آسون‌تره و اون رو انتخاب کردم 😁\nاگر نمی‌دونید بدونید که توی کراسکال اول باید بیایم همه‌ی یال‌ها رو بر اساس وزنشون مرتب کنیم و بعد دونه‌دونه از اونی که وزنش کم‌تره انتخاب کنیم و درخت رو تشکیل بدیم. اما باید هر بار چک کنیم که توی گراف دور ایجاد نشه. هر جا هم که درخت تشکیل شد (مثلا تعداد یال‌ها فقط یکی کمتر از تعداد راس‌ها بود) الگوریتم تموم میشه.\nاگر نمی‌دونید بدونید که توی پریم دوتا مجموعه باید نگه داریم. یه مجموعه از راس‌هایی که انتخاب شدن برای تشکیل درخت، یه مجموعه هم راس‌هایی که انتخاب نشدن هنوز. بعد هر بار باید کم وزن‌ترین یالی که یه سرش توی مجموعه اوله و یه سرش توی مجموعه دوم هست رو انتخاب کنیم. دیگه هم لازم نیست چک کنیم دور تشکیل شده یا نه.\nوقتی با کراسکال پیاده‌سازی کردم نتیجش شد این:\nبعدش یکم با کد ور رفتم ببینم نتیجه بهتری میده یا نه، دیدم بازم همون طوری موند.\nگفتم حتما با پریم می‌رفتم بهتر بود 😁 (منطق انتخاب الگوریتم من!)\nبا پریم زدم و نتیجش شد این:\nبا خودم گفتم حتما یه جایی می‌لنگه دیگه. یکم جستجو کردم ببینم واقعا فرق این دوتا چیه و کجا باید چی رو استفاده کنیم و چی رو نکنیم.\nکراسکال یا پریم # طبق منبع استک اور فلو: الگوریتم پریم برای زمانی خوب است که استفاده شود که گراف ما تعداد یال‌های زیادی نسبت به راس‌هایش دارد. مانند سوال Leetcodeی که لینکش را در بالا قرار دادم؛ گراف آن مسئله یک گراف کامل بوده است.\nولی مشکل فقط این نبوده. پیاده‌سازی دوتا الگوریتم من اصلا بهینه نبوده.\nپیچیدگی زمانی الگوریتم پریم برابر O(E + V log V) و پیچیدگی زمانی کراسکال برابر O(E log V) است. که E برابر تعداد یال‌ها و V برابر تعداد راس‌ها است.\nبرای پیاده‌سازی الگوریتم پریم باید از ساختمان داده Heap یا همان Priority Queue استفاده کنیم. البته خیلی بهتر از آن هم ساختمان داده Fibonacci Heap است. (اصلا نمیدونم چیه)\nبرای پیاده‌سازی الگوریتم کراسکال باید از ساختمان داده Union-Find یا همان Disjoint-Set استفاده کنیم.\nطبیعیه که پیاده‌سازی کراسکال راحت‌تر از پریم باشه. به قول یکی از کامنت‌های استک اور فلو، کی اصلا فیبوناچی هیپ می‌دونه چیه :)\nیه بار دیگه کراسکال رو پیاده‌سازی کردم ولی این بار با مجموعه‌های مجزا و نتیجش شد این:\nخیلی فرقی نکرد ولی کاملا مشخصه که کراسکال خیلی اینجا زورش نمی‌رسه. چون کد اون‌هایی که سریع‌تره با پریم زدن (به خاطر اینکه گراف مسئله یال‌هاش زیاد بوده)\n","date":"2 September 2024","externalUrl":null,"permalink":"/blogs/prim_vs_kruskal/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eمقدمه \n    \u003cdiv id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%D9%85%D9%82%D8%AF%D9%85%D9%87\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eاخیرا سوال \u003ca href=\"https://leetcode.com/problems/min-cost-to-connect-all-points/description/\" target=\"_blank\"\u003e1584. Min Cost to Connect All Points\u003c/a\u003e از Leetcode رو داشتم حل می‌کردم که هدف اصلی سوال پیاده‌سازی یه الگوریتم \u003ccode\u003eMST\u003c/code\u003e بود. مونده بودم پریم بزنم یا کراسکال. یکم که فکر کردم، احساس کردم پیاده‌سازی کراسکال آسون‌تره و اون رو انتخاب کردم 😁\u003c/p\u003e","title":"Prim vs Kruskal","type":"blogs"},{"content":"","date":"2 September 2024","externalUrl":null,"permalink":"/tags/time-complexity/","section":"Tags","summary":"","title":"Time Complexity","type":"tags"},{"content":"","date":"20 July 2024","externalUrl":null,"permalink":"/tags/golang/","section":"Tags","summary":"","title":"Golang","type":"tags"},{"content":"","date":"20 July 2024","externalUrl":null,"permalink":"/tags/memory/","section":"Tags","summary":"","title":"Memory","type":"tags"},{"content":"","date":"20 July 2024","externalUrl":null,"permalink":"/tags/slice/","section":"Tags","summary":"","title":"Slice","type":"tags"},{"content":"","date":"20 July 2024","externalUrl":null,"permalink":"/categories/tip/","section":"Categories","summary":"","title":"Tip","type":"categories"},{"content":" مقدمه # همیشه یاد گرفتن یه زبون جدید چالش‌های خاصی داره. یادم میاد زمانی که شروع کرده بودم شی گرایی پایتون رو یاد می‌گرفتم و با جاوا مقایسش می‌کردم، همه چیزش خیلی عجیب بود. الان هم که دارم go رو یاد می‌گیرم یه چیزاییش عجیبه ولی می‌دونم زمان بگذره همه این‌ها عادی و بدیهی میشه.\nدر این مطلب هم می‌خوام در مورد تابع append بنویسم.\nتصور اشتباه از این تابع # همونطور که می‌دونید این تابع یک slice به همراه داده‌های جدیدی که قراره به اسلایس اضافه بشن رو ورودی می‌گیره و بعد یک اسلایس جدید بر می‌گردونه.\nولی دقیقا تصور اشتباه من همین جا بود: اسلایس جدید!\nمن همیشه سعی می‌کنم توابع و کلاس‌هایی که در هر زبونی استفاده می‌کنم رو خوب بشناسم. بدونم اون پشتش چه اتفاقی داره می‌افته؛ صرفا یه مصرف‌کننده نباشم. به خاطر همین سعی کردم اتفاقی که پشت این تابع در حال رخ دادن هست رو با زبون c++ تصور کنم. می‌گفتم خب اگر قرار بود این رو توی c++ پیاده‌سازی کنم، باید اول یه حافظه جدید با یه سایز اضافه‌تر می‌ساختم (new)، بعد تمام المنت‌های آرایه قبلی رو کپی می‌کردم و در آخر حافظه قبلی رو delete می‌کردم.\nولی اشتباه من همین جا بود که فکر می‌کردم capacity همزمان با length یه دونه یه دونه زیاد میشه. ولی در واقع capacity جلوتر حرکت میکنه و احتمالا 1.5 برابر میشه. خب در چنین حالتی سر آدم که درد نمی‌کنه که اگر capacity کافی برای اضافه کردن المنت جدید وجود داره بیاد کلا یه آرایه جدید بسازه و همه‌ی اون المنت‌های قبلی رو هم کپی کنه.\nکد # مثلا کد زیر همین اتفاق رو خیلی جالب داره نشون میده:\npackage main import \u0026#34;fmt\u0026#34; func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) } خروجی:\n[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6] اگر همین s سایزش 4 بود به جای 5 خروجی این میشد:\n[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5] پس همیشه از اسلایس قبلی کپی گرفته نمیشه و یه اسلایس جدید ساخته بشه.\n","date":"20 July 2024","externalUrl":null,"permalink":"/blogs/append-function-in-golang/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eمقدمه \n    \u003cdiv id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%D9%85%D9%82%D8%AF%D9%85%D9%87\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eهمیشه یاد گرفتن یه زبون جدید چالش‌های خاصی داره. یادم میاد زمانی که شروع کرده بودم شی گرایی پایتون رو یاد می‌گرفتم و با جاوا مقایسش می‌کردم، همه چیزش خیلی عجیب بود. الان هم که دارم go رو یاد می‌گیرم یه چیزاییش عجیبه ولی می‌دونم زمان بگذره همه این‌ها عادی و بدیهی میشه.\u003c/p\u003e","title":"رفتارهای عجیب تابع append در golang","type":"blogs"},{"content":"","date":"30 June 2024","externalUrl":null,"permalink":"/tags/leetcode/","section":"Tags","summary":"","title":"Leetcode","type":"tags"},{"content":"","date":"30 June 2024","externalUrl":null,"permalink":"/tags/optimization/","section":"Tags","summary":"","title":"Optimization","type":"tags"},{"content":" چی شده بود؟ # داشتم یکی از مسائل Leetcode رو با گو حل می‌کردم که بعد از ارسال کردن کد و Accept شدنش، تصمیم گرفتم یکم کدم رو بهینه‌تر کنم.\nمن همیشه عادت داشتم مسئله‌های الگوریتمی رو با پایتون حل کنم ولی از موقعی که شروع کردم به یاد گرفتن گو، از گو استفاده می‌کنم و همین سطح پایین‌تر بودن گو باعث شده به بهینه‌ بودن بیشتر فکر کنم.\nکد غیر بهینه # کدی که برای این مسئله زده بودم رو این پایین می‌بینید. از دیدنش وحشت نکنید 😊 اگر گو بلد نیستید یا کد خیلی طولانیه، قرار نیست بفهمید چیه. صرفا همین رو در نظر داشته باشید که چند حلقه for تو در تو داره که در هر پیمایش یک Hash-map رو دوباره می‌سازه و زباله روب1 عزیز بابد زحمت بکشه Hash-map قبلی رو پاک بکنه.\nهمونطور که مشخصه متغیری به اسم seen داریم که چند بار در حال از بین رفتن و ساخته شدن است.\nfunc isValidSudoku(board [][]byte) bool { for _, row := range board { seen := map[byte]struct{}{} for _, column := range row { if column == \u0026#39;.\u0026#39; { continue } if _, ok := seen[column]; ok { return false } seen[column] = struct{}{} } } for column := 0; column \u0026lt; 9; column++ { seen := map[byte]struct{}{} for _, row := range board { if row[column] == \u0026#39;.\u0026#39; { continue } if _, ok := seen[row[column]]; ok { return false } seen[row[column]] = struct{}{} } } for i := 0; i \u0026lt; 9; i += 3 { for j := 0; j \u0026lt; 9; j += 3 { seen := map[byte]struct{}{} for k := i; k \u0026lt; i+3; k++ { for l := j; l \u0026lt; j+3; l++ { if board[k][l] == \u0026#39;.\u0026#39; { continue } if _, ok := seen[board[k][l]]; ok { return false } seen[board[k][l]] = struct{}{} } } } } return true } کد بهینه # در هر پیمایش حلقه نیاز به یک Hash-map خالی بود که به همین خاطر من اومده بودم هر بار یک Hash-map جدید می‌ساختم. حالا کاری که انجام دادم این بود که فقط یک بار اون هم در ابتدای کد این Hash-map رو می‌ساختم و هر بار که نیاز به یک Hash-map خالی داشتم همون رو clear می‌کردم.\nfunc isValidSudoku(board [][]byte) bool { +\tseen := map[byte]struct{}{} for _, row := range board { +\tclear(seen) -\tseen := map[byte]struct{}{} for _, column := range row { if column == \u0026#39;.\u0026#39; { continue } if _, ok := seen[column]; ok { return false } seen[column] = struct{}{} } } for column := 0; column \u0026lt; 9; column++ { +\tclear(seen) -\tseen := map[byte]struct{}{} for _, row := range board { if row[column] == \u0026#39;.\u0026#39; { continue } if _, ok := seen[row[column]]; ok { return false } seen[row[column]] = struct{}{} } } for i := 0; i \u0026lt; 9; i += 3 { for j := 0; j \u0026lt; 9; j += 3 { +\tclear(seen) -\tseen := map[byte]struct{}{} for k := i; k \u0026lt; i+3; k++ { for l := j; l \u0026lt; j+3; l++ { if board[k][l] == \u0026#39;.\u0026#39; { continue } if _, ok := seen[board[k][l]]; ok { return false } seen[board[k][l]] = struct{}{} } } } } return true } همین تغییر ریز باعث شد عملکرد کد تغییر محسوسی بکنه:\nپس حواسمون به سیستم-کال‌هایی که بیهوده در روند اجرایی کد وقفه ایجاد می‌کنند باشه.\nGarbage Collector\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"30 June 2024","externalUrl":null,"permalink":"/blogs/allocate-deallocate-optimization/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eچی شده بود؟ \n    \u003cdiv id=\"%DA%86%DB%8C-%D8%B4%D8%AF%D9%87-%D8%A8%D9%88%D8%AF\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%DA%86%DB%8C-%D8%B4%D8%AF%D9%87-%D8%A8%D9%88%D8%AF\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eداشتم یکی از مسائل \u003ca href=\"https://leetcode.com/problems/valid-sudoku/submissions/1304929030/\" target=\"_blank\"\u003eLeetcode\u003c/a\u003e رو با گو حل می‌کردم که بعد از ارسال کردن کد و Accept شدنش، تصمیم گرفتم یکم کدم رو بهینه‌تر کنم.\u003c/p\u003e","title":"تاثیر Allocate و Deallocate کردن‌های بیهوده بر زمان اجرایی","type":"blogs"},{"content":"","date":"22 June 2024","externalUrl":null,"permalink":"/tags/markdown/","section":"Tags","summary":"","title":"Markdown","type":"tags"},{"content":" مقدمه # احتمالا توی گشت و گذارتون در وب، این لوگوی خوشگل فایل Markdown رو دیدید! یا با فایل‌هایی رو به رو شدید که پسوند md. داشتن. اینجا می‌خوام یکم درباره‌ی کاربرد Markdown و سینتکس نوشتنش حرف بزنم.\nچرا از Markdown استفاده کنیم؟ # شاید براتون عجیب بیاد که چرا باید به خودمون زحمت بدیم تا همچین متنی رو بنویسیم؛ چرا از ادیتورهایی مثل Microsoft Word استفاده نکنیم تا تنها با چند کلیک ساده یه عبارت رو bold کنیم؟\nاینجا چندتا علت رو بررسی می‌کنیم تا به تفاوت‌هاشون پی ببریم:\nمتن Markdown می‌تونه توی هر چیزی استفاده بشه. مثل سایت‌ها، مستندات، کتاب‌ها، ایمیل‌ها و خیلی چیزای دیگه. از این جهت کاربرد گسترده‌تری داره\nمتن Markdown وابسته به پلتفرم نیست. شما می‌تونید Markdown رو در وب یا روی هر دستگاهی با هر سیستم عاملی باز کنید و بخونید. ولی مثلا تجربه منتقل کردن یک فایل Word رو روی دستگاه دیگه‌ای حتما داشتین؛ فونت بهم می‌ریزه، جمله‌ها می‌پرن.\nادیتورهای متنی مثل word دیتا رو به شکل باینری ذخیره می‌کنند و تنها با خود همون ادیتور اجرا میشه ولی اگر یک فایل Markdown داشته باشین به راحتی میشه حتی توی محیط ترمینال بخونیم و تغییر بدیم.\nوب‌سایت‌هایی مثل GitHub به شکل ویژه‌ای از Markdown پشتیبانی می‌کنن. مثلا اگر با گیت‌هاب کار کرده باشید برای معرفی مخزن خود، فایلی با فرمت Markdown قرار می‌دین.\nسینتکس نوشتاری Markdown # چندتا از سینتکس‌های ساده رو بررسی می‌کنیم:\nتیتر # # Heading level 1 ## Heading level 2 ### Heading level 3 #### Heading level 4 ##### Heading level 5 ###### Heading level 6 نتیجه:\nHeading level 1 # Heading level 2 # Heading level 3 # Heading level 4 # Heading level 5 # Heading level 6 # ضخیم # **Bold Text** Bold Text\nمورب # _Italic Text_ Italic Text\nضخیم و مورب # **_Bold and Italic text_** Bold and Italic text\nلینک # [Google](https://www.google.com) Google\nجدول # |name|age| |---|---| |moein|21| |ali|20| name age moein 21 ali 20 ","date":"22 June 2024","externalUrl":null,"permalink":"/blogs/markdown/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eمقدمه \n    \u003cdiv id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%D9%85%D9%82%D8%AF%D9%85%D9%87\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eاحتمالا توی گشت و گذارتون در وب، این لوگوی خوشگل فایل Markdown رو دیدید! یا با فایل‌هایی رو به رو شدید که پسوند \u003ccode\u003emd.\u003c/code\u003e داشتن. اینجا می‌خوام یکم درباره‌ی کاربرد Markdown و سینتکس نوشتنش حرف بزنم.\u003c/p\u003e","title":"چگونه یک متن Markdown بنویسیم؟","type":"blogs"},{"content":"","date":"28 May 2024","externalUrl":null,"permalink":"/tags/git/","section":"Tags","summary":"","title":"Git","type":"tags"},{"content":"","date":"28 May 2024","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"Github","type":"tags"},{"content":" مقدمه # چند روز پیش به یه ویدیو با عنوان با حال \u0026ldquo;از git pull هیچ وقت استفاده نکن\u0026rdquo; بر خوردم. با خودم گفتم مگه چه مشکلی می‌تونه داشته باشه؟\nداستان از چه قراره؟ # داستان از این قراره که همه ما وقتی میخوایم آخرین تغییرات یه رپو رو از جایی مثل گیتهاب دریافت کنیم، از دستور git pull استفاده می‌کنیم. این دستور در اصل دوتا دستور در دل یک دستوره. در اصل وقتی ما دستور git pull رو اجرا می‌کنیم، اون پشت اول دستور git fetch اجرا میشه که میاد برنچ ریموتی به اسم \u0026lt;origin\u0026gt;/\u0026lt;branch_name\u0026gt; رو توی سیستم لوکالمون آپدیت می‌کنه و بعد با دستور git merge این برنچ رو روی برنچ اصلی با نام \u0026lt;branch_name\u0026gt; مرج می‌کنه.\nداستان اصلی از اینجا شروع میشه که یک مرج در حال اتفاق افتادنه. حالا اگر یه هم‌تیمی داشته باشیم که روی همون برنچ کامیت زده باشه، اون وقته که اتفاق خوبی نمی‌افته.\nمثلا در تصویر بالا، ما یه هم‌گروهی به اسم John داریم که هر دومون از کامیت A شروع به کار کردیم. John زودتر از ما کار خودش رو انجام داده، کامیت C رو اعمال کرده و تغییرات رو پوش کرده. حالا اگر ما بخوایم تغییرات خودمون رو پوش کنیم، گیت ارور میده و از ما می‌خواد که قبلش pull انجام بدیم. اگر توی چنین شرایطی pull انجام بدیم، حتی اگر هم کانفلیکتی رخ نده، دو برنچ لوکال و ریموت مرج میشن. مثل عکس پایین:\nیعنی یک کامیت اضافه‌تر!\nحالا همین رو تصور کنید ولی با تعداد رخداد بیشتر. برنچ ما پر میشه از کامیت‌های الکی و اضافی که گراف کامیت‌ها رو کثیف می‌کنه:\nنکته اینجاست که کانفلیکتی هم اگر نداشته باشیم، این اتفاق می‌افته. پس راه بهتر این جور موقع‌ها چیه؟\nراه بهتر # به جای اینکه pull انجام بدیم و مرج اتفاق بیفته، rebase می‌کنیم. rebase کردن باعث میشه تغییرات برنچ ریموت پشت سر کامیت ما قرار بگیره:\ngit pull --rebase حالا ممکنه سوال پیش بیاد اگر کانفلیکت داشتیم چطور؟\nناچارن از همون دستور git pull استفاده می‌کنیم تا resolve انجام بدیم و بعدش هم مرج.\n","date":"28 May 2024","externalUrl":null,"permalink":"/blogs/why-git-pull-is-not-good/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eمقدمه \n    \u003cdiv id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%D9%85%D9%82%D8%AF%D9%85%D9%87\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eچند روز پیش به یه \u003ca href=\"https://www.youtube.com/watch?v=xN1-2p06Urc\" target=\"_blank\"\u003eویدیو\u003c/a\u003e با عنوان با حال \u0026ldquo;از \u003ccode\u003egit pull\u003c/code\u003e هیچ وقت استفاده نکن\u0026rdquo; بر خوردم. با خودم گفتم مگه چه مشکلی می‌تونه داشته باشه؟\u003c/p\u003e","title":"چرا git pull خوب نیست؟!","type":"blogs"},{"content":" ","date":"6 March 2022","externalUrl":null,"permalink":"/en/blogs/","section":"Blog","summary":"\u003chr\u003e","title":"Blog","type":"blogs"},{"content":"","date":"6 March 2022","externalUrl":null,"permalink":"/en/tags/example-tag/","section":"Tags","summary":"","title":"Example Tag","type":"tags"},{"content":"Welcome to Hugo theme Stack. This is your first post. Edit or delete it, then start writing!\nFor more information about this theme, check the documentation: https://stack.jimmycai.com/\nWant a site like this? Check out hugo-theme-stack-stater\nPhoto by Pawel Czerwinski on Unsplash\n","date":"6 March 2022","externalUrl":null,"permalink":"/en/blogs/hello-world/","section":"Blog","summary":"\u003cp\u003eWelcome to Hugo theme Stack. This is your first post. Edit or delete it, then start writing!\u003c/p\u003e\n\u003cp\u003eFor more information about this theme, check the documentation: \u003ca href=\"https://stack.jimmycai.com/\" target=\"_blank\"\u003ehttps://stack.jimmycai.com/\u003c/a\u003e\u003c/p\u003e","title":"Hello World","type":"blogs"},{"content":" Tag # ","date":"6 March 2022","externalUrl":null,"permalink":"/en/tags/","section":"Tags","summary":"\u003ch2 class=\"relative group\"\u003eTag \n    \u003cdiv id=\"tag\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#tag\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e","title":"Tags","type":"tags"},{"content":"","date":"1 March 2022","externalUrl":null,"permalink":"/tags/ide/","section":"Tags","summary":"","title":"IDE","type":"tags"},{"content":"","date":"1 March 2022","externalUrl":null,"permalink":"/tags/jar/","section":"Tags","summary":"","title":"Jar","type":"tags"},{"content":"","date":"1 March 2022","externalUrl":null,"permalink":"/tags/java/","section":"Tags","summary":"","title":"Java","type":"tags"},{"content":" مقدمه # فرض کنید به عنوان یک توسعه‌دهنده می‌خواهید پروژه خودتون رو برای استفاده کاربر منتشر کنید. آیا پروژتون رو با ده‌ها یا صدها کلاس نوشته شده در فولدرهای مختلف در اختیار کاربر قرار می‌دید؟ نه! اینجاست که باید با jar آشنا بشید. فایل jar یک فایل فشرده‌شده است که کلاس‌های جاوا، عکس، متن و\u0026hellip; به همراه فایل Manifest(در ادامه بهش می‌رسیم) را در خود جای می‌دهد و از فرمت‌های فشرده‌سازی مانند zip استفاده می‌کند.\nساختن فایل jar # برای شروع اول مطمئن بشید که JDK روی سیستمتون نصب است. از این لینک می‌تونید نسخه مورد نظرتون رو دانلود کنید. برای ساخت فایل jar کافیست به فولدری که فایل‌ها و کلاس‌ها قرار گرفته‌اند برویم و با دستور زیر در محیط ترمینال فایل jar ساخته می‌شود:\nSyntax:\njar -cf jarfilename inputfiles jarfilename: نام فایل خروجی inputfiles: نام فایل‌هایی است که قرار است فشرده شوند -c: یک فایل آرشیو خالی و جدید می‌سازد -f: مشخص می‌کند پس از آن، نام فایل خروجی به عنوان پارامتر دریافت شود مثال از ساخت فایل jar # در اینجا ما با دو فایل JavaClass1.class و JavaClass2.class روبه‌رو هستیم و با دستور زیر یک فایل jar ساخته شده:\njar -cvf export.jar *.class استفاده از v- فرایند فشرده‌سازی را در خروجی نمایش می‌دهد. اگر تعداد زیادی فایل کلاس را می‌خواهید در فایل jar قرار دهید می‌توانید از class.* استفاده کنید به جای اینکه تک تک نام فایل‌ها را بنویسید.\nمشاهده محتوای فایل jar # پس از آنکه یک فایل jar بدست آمد، برای دیدن فایل‌های موجود در آن از دستور زیر استفاده می‌شود:\nSyntax:\njar -tf jarfilename Example: jar -tf export.jar خروجی:\nMETA-INF/ META-INF/MANIFEST.MF JavaClass1.class JavaClass2.class یک فایل jar به طور پیش فرض دارای فایل Manifest می‌باشد و همیشه در فولدر META-INF قرار دارد.\nاستخراج کردن فایل jar # برای extract کردن از دستور زیر استفاده می‌شود:\nSyntax:\njar -xf jarfilename Example: jar -xf export.jar برای extract کردن حتی می‌توان از ابزارهایی که یک فایل zip را extract می‌کنند، استفاده کرد.\nآپدیت کردن فایل jar # اگر پروژه‌ی ما یک پروژه‌ی حجیم و بزرگی باشد، پس از تغییراتی که در پروژه اعمال می‌کنیم، برای تبدیل آن به فایل جدید jar زمان طولانی‌ صرف می‌شود. در اینجا بهتر است به جای ساختن یک فایل جدید jar، فایل قبلی را آپدیت بکنیم. برای آپدیت کردن محتوای فایل از دستور زیر استفاده می‌کنیم:\nSyntax:\njar -uf jar-file input-file(s) Example:\njava -uf export.jar *.class بعد از نوشتن نام فایل jar مورد نظر، فایل‌ها و کلاس‌هایی را که می‌خواهیم آپدیت بکنیم می‌نویسیم. این امکان باعث می‌شود تا به جای اینکه دوباره تمام فایل‌ها را فشرده بکنیم، فقط فایل‌هایی که تغییرات داشتنند را جایگزین فایل‌های قبلی در jar بکنیم.\nقابلیت اجرا شدن فایل jar # پیش از آنکه یاد بگیریم چگونه یک فایل jar را اجرا کنیم، باید آن را برای اجرا شدن آماده‌سازی کنیم. فرض می‌کنیم در پروژه، کلاسی با نام Main.class ساخته‌ایم و در آن متد main را پیاده‌سازی کرده‌ایم. اکنون باید به فایل jar بفهمانیم که متد main در چه کلاسی قرار دارد تا هنگام اجرا شدن jar، آن را اجرا کند. با استفاده از دستور زیر هنگام ساخت فایل jar این امکان را اضافه می‌کنیم:\nSyntax:\njar -cfe jarfilename mainclass import-files Example:\njar -cfe export.jar Main client.class server.class logo.jpeg توجه کنید که کلاس Main بدون class. نوشته می‌شود. روش دیگری هم برای اضافه کردن Main وجود دارد که در ادامه در مبحت Manifest به آن می‌رسیم.\nاکنون می‌توان فایل jar خود را با دستور زیر اجرا کرد:\nSyntax:\njava -jar jarfilename Example:\njava -jar export.jar فایل Manifest # زمانی که یک فایل jar ساخته می‌شود به صورت اتوماتیک در آن فایل Manifast هم ساخته می‌شود. حالا اصلا Manifast چی است؟\nهر فایل jar یک فایل Manifest دارد که جزئیات و اطلاعات آن در Manifest نوشته شده است. نام این فایل به صورت پیش فرض MANIFEST.MF نام‌گذاری شده و در فولدر META-INF قرار دارد. در تصویر بالا نمونه‌ای از این فایل آمده‌است؛ حتی می‌تواند شامل جزئیات بیشتری باشد. ورودی فایل Manifest از دو قسمت تشکیل شده است، نام و مقدار. نوشتن نام و مقدارهای Manifest چند نکته دارد که به آن می‌پردازیم: باید یک اسپیس پس از \u0026quot;:\u0026quot; و قبل از مقدار باشد. بعد از آخرین خط، یک خط باید خالی باشد. متن باید از انکودر UTF-8 استفاده کند. وقتی کلاس main را مشخص می‌کنیم نباید پسوند class. را پس از آن بنویسیم.\nآپدیت کردن فایل Manifest # اگر فایل jar را ساخته‌ایم و می‌خواهیم تغییراتی روی فایل Manifest بدهیم؛ ابتدا یک فایل txt. می‌سازیم و سپس برای اعمال تغییرات از دستور زیر استفاده می‌کنیم:\nExample:\njar -ufm export.jar manifest.txt شناساندن کلاس main از طریق Manifest در قسمت‌های بالاتر توضیح داده شد که چگونه هنگام ساخت یک فایل jar، کلاس main را برای اجرا شدن به آن اضافه کنیم. حال اگر فایل jar را قبلا ساخته باشیم و کلاس main را به آن اضافه نکرده باشیم، کافیست خط زیر را به فایل Manifest اضافه کنیم:\nMain-Class: Main حتما دقت کنید که class. پس از آن را نباید بنویسیم.\nاستفاده از IDE # تا به این جا با jar و با انواع دستورهاش آشنا شدیم. اگر پروژه‌ی ما از کتابخانه‌های خارجی استفاده می‌کرد، قرار دادن این کتابخانه‌ها در فایل jar کمی پیچیده می‌شد. محیط‌های توسعه قابلیت‌های پیشرفته‌ای در اختیارمان قرار می‌دهند که کار را برای ما ساده‌تر می‌کنند. در این قسمت ساختن یک فایل jar را در IntelliJ بررسی می‌کنیم.\nابتدا از نوار بالا گزینه File را انتخاب می‌کنیم و به قسمت Artifacts می‌رویم. روی علامت + و سپس روی jar کلیک می‌کنیم. گزینه‌ی From modules with dependencies انتخاب می‌کنیم. در فیلدهای پیش رو می‌توان کلاس Main را انتخاب کرد. در انتها روی OK کلیک می‌کنیم. در صفحه اصلی نرم‌افزار از نوار بالا روی Build و سپس Build Artifacts کلیک می‌کنیم. فایل jar مورد نظر را انتخاب کنید تا فرایند ساخت فایل jar آغاز شود. فایل‌های jar به طور پیش فرض در مسیر out/artifacts قرار می‌گیرد.\nمنابع # Working with JAR and Manifest files In Java - GeeksforGeeks Jar files in Java - GeeksforGeeks Compile and build applications with IntelliJ IDEA | IntelliJ IDEA JAR (file format) - Wikipedia ","date":"1 March 2022","externalUrl":null,"permalink":"/blogs/jar-file/","section":"وبلاگ","summary":"\u003ch2 class=\"relative group\"\u003eمقدمه \n    \u003cdiv id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\" class=\"anchor\"\u003e\u003c/div\u003e\n    \n    \u003cspan\n        class=\"absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100\"\u003e\n        \u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\"\n            style=\"text-decoration-line: none !important;\" href=\"#%D9%85%D9%82%D8%AF%D9%85%D9%87\" aria-label=\"لنگر\"\u003e#\u003c/a\u003e\n    \u003c/span\u003e        \n    \n\u003c/h2\u003e\n\u003cp\u003eفرض کنید به عنوان یک توسعه‌دهنده می‌خواهید پروژه خودتون رو برای استفاده کاربر منتشر کنید. آیا پروژتون رو با ده‌ها یا صدها کلاس نوشته شده در فولدرهای مختلف در اختیار کاربر قرار می‌دید؟ نه! اینجاست که باید با \u003ccode\u003ejar\u003c/code\u003e آشنا بشید.\nفایل \u003ccode\u003ejar\u003c/code\u003e یک فایل فشرده‌شده است که کلاس‌های جاوا، عکس، متن و\u0026hellip; به همراه فایل \u003cem\u003eManifest\u003c/em\u003e(در ادامه بهش می‌رسیم) را در خود جای می‌دهد و از فرمت‌های فشرده‌سازی مانند \u003ccode\u003ezip\u003c/code\u003e استفاده می‌کند.\u003c/p\u003e","title":"ساختن و اجرا کردن فایل jar در زبان جاوا","type":"blogs"},{"content":"","externalUrl":null,"permalink":"/en/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/en/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/en/series/","section":"Series","summary":"","title":"Series","type":"series"}]