<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Alireza Shirmohammadi</title><link>https://virgool.ir/feed/@alireza.sh076</link><description></description><language>fa</language><pubDate>2026-11-10 19:45:55</pubDate><image><url>https://files.virgool.ir/upload/users/1068498/avatar/avatar.png</url><title>Alireza Shirmohammadi</title><link>https://virgool.ir/@alireza.sh076</link></image><item><title>Reindex data from a remote cluster in elasticsearch</title><link>https://virgool.ir/@alireza.sh076/reindex-data-from-a-remote-cluster-in-elasticsearch-ebcrixtkizhy</link><description>بزارید قبل از هر چیزی یه عذرخواهی کنم بابت اینکه این چند وقت به دلیل مشغله ی زیاد ، پستی نذاشتم .      از این به بعد سعی میکنم حداقل ۲ پست رو تو ماه منتشر کنم.برگردیم سر اصل مطلب ، تو این پست قراره در مورد ری ایندکس (reindex) داده ها از ریموت سرور در الستیک بپردازم .ولی اصلا reindex چی هست ؟ری ایندکس (reindex) به یک  روش یا متد برای کپی کردن دیتاهای موجود از یک ایندکس (index) مبدأ به یک ایندکس(index) مقصد گفته میشه .اگه قبلا با الستیک سرچ کار کرده باشید ممکنه براتون پیش بیاد که لازم باشه دیتا رو از یه کلاستر(cluster) و یا نود (node) به دیگری منتقل کنید بزارید یه مثال بزنم .فرض کنید که ما یه دیتابیس الستیک داریم که ورژنش قدیمی شده و میخوایم دیتا رو  به یک نسخه جدیدتر منتقل کنیم یکی از روش ها برای این کار ، reindex  هست.قبل از هرچیزی یک ایندکس با mapping دلخواه تو دیتابیس جدید بسازید.نکته ۱ : در صورتی که mapping رو تعریف نکنید خوده الستیک براتون میسازه پس بهتره که تعریفش کنید.نکته ۲ :‌ هنگام ساختن ایندکس جدید ترجیحا replica رو صفر قرار بدید تا عملیات reindex سریع تر انجام شود بعدا در صورت تمایل میتوانیدآنرا عوض کنید . بعد از ساخت ایندکس وارد کانفیگ فایل دیتابیس جدید بشید و تغییرات زیر رو اعمال کنید .اگر به صورت داکری بالاست :دستور زیر رو در قسمت environment داکر کامپوز وارد کنید :reindex.remote.whitelist=  OldHost : Portبه جای OldHost آدرس دیتابیس قدیمی و به جای Port ، پورت آنرا وارد کنید.اگر به صورت پکیچ نصبی هست :‌دستور زیر را در فایل elasticsearch.yml  وارد کنید : reindex.remote.whitelist: OldHost:Portنکته ۳ :‌ معمولا فایل کانفیگ در مسیر زیر قرار دارد :usr/share/elasticsearch/config/elasticsearch.ymlنکته ۴ : در صورتی که دیتابیس جدید به صورت کلاستر (cluster) بود لازم نیست تغییرات رو ، روی تک تک نود ها پیاده سازی کنید بعد از اعمال تغییرات دیتابیس جدید رو ریستارت کنید سپس وارد کیبانا (kibana) بشید  و api زیر رو  با تغییرات لازمه کال کنید .POST _reindex{  &#34;source&#34;: {    &#34;remote&#34;: {      &#34;host&#34;: &#34;http://oldhost:9200&#34;,      &#34;username&#34;: &#34;user&#34;,      &#34;password&#34;: &#34;pass&#34;    },    &#34;index&#34;: &#34;source&#34;  },  &#34;dest&#34;: {    &#34;index&#34;: &#34;dest&#34;  }}روبه روی  host آدرس دیتابیس قدیمی رو  به همراه پروتکل http وارد کنید.نکته ۵ :در صورت داشتن رمز در  قسمت username و password وارد کنید .به جای source اینکس مبدأ و به جای dest ایندکس  مقصد را  وارد کنید .نکته ۶ : ری ایندکس دیتا از ریموت سرور ، slicing به روش دستی و خودکار  رو پشتیبانی نمیکنه .در صورتی که بعد از اعمال تغییرات دستور بالا رو ران کنید احتمالا به ارور server timeout بر میخورید لازم نیست نگران بشید تسک تو بگراند داره انجام میشه .برای اینکه به ارور نخورید و  مراحل انجام تسک رو بعدا دنبال کنید میتونید به دستور بالا پارامتر wait_for_completion=false اضافه کنید . به صورت زیر :POST _reindex?wait_for_completion=false{  &#34;source&#34;: {    &#34;remote&#34;: {      &#34;host&#34;: &#34;http://oldhost:9200&#34;,      &#34;username&#34;: &#34;user&#34;,      &#34;password&#34;: &#34;pass&#34;    },    &#34;index&#34;: &#34;source&#34;,    &#34;query&#34;: {      &#34;match&#34;: {        &#34;test&#34;: &#34;data&#34;      }    }  },  &#34;dest&#34;: {    &#34;index&#34;: &#34;dest&#34;  }}نکته  ۷: در صورتی که دیتاهای خاصی رو میخواید منتقل کنید میتونید مثل دستور بالا داخل query مشخص کنید.در جواب دستور بالا یک تسک ایدی دریافت میکنید که میتونید با دستور زیر وضعیت  انجام تسک رو دنبال کنید. GET _tasks/task_idنکته ۸  :‌به جای task_id ایدی تسک رو وارد کنید.نکته ۹ : میتونید در قسمت index مبدأ به جای یک index چندین index  را  به صورت یک لیست وارد کنید .با دستور زیر میتوانید  تمامی تسک های مربوط به reindex رو مشاهده کنید . GET _tasks?actions=*reindex&amp;detailedبعد از انجام تمامی مراحل بالا و بعد از اتمام عملیات reindex میتونید index قدیمی رو حذف کنید.تا جایی که میشد سعی کردم مطلب بالا رو ساده و در عین حال کامل توضیح بدم ولی در صورتی میخواید بیشتر با مراحل اشنا بشید  میتونید به سایت elasticsearch مراجعه کنید.طبق روال همیشگیمون این پست رو هم با یک نقل قول دیگه به پایان میرسونم امیدوارم منو با نظرات خوبتون یاری کنید . نقل قول هفته  از Bill Gates:سنجش میزان برتری در کدنویسی با تعداد خطوط کد مثل سنجش میزان وزن در حین ساخت هواپیماست؛ پس هرچه کمتر بهتر.Enter to exit . . . .</description><category>Alireza Shirmohammadi</category><author>Alireza Shirmohammadi</author><pubDate>Sun, 17 Oct 2021 03:42:07 +0330</pubDate></item><item><title>معماری نرم افزار و فوایدش</title><link>https://virgool.ir/@alireza.sh076/معماری-نرم-افزار-و-فوایدش-wxzefaccfbm7</link><description>احتمالا این اواخر زیاد اسم معماری نرم افزار رو شنیده باشید و براتون سوال باشه که واقعا چه مزیتی داره ؟پس با من همراه باشید تا به بررسی معماری نرم افزار بپردازیم .پس بزارید از همون اول شروع کنیم اصلا معماری در طراحی نرم افزار چی هست؟احتمالا شما هم مثل من قبلا تو گوگل دنبال جوابتون گشتید ولی بزارید ساده ترش کنم .معماری نرم افزار یعنی اینکه ما با رعایت یک سری استاندارد ها و قواعد،  جوری کد بنویسیم که بشه پروژه رو به قسمت های مختلف، مستقل و بزرگ تقسیم  بندی کرد؛ در آخر با مرتبط کردن و ارتباط این قسمت ها با هم، نرم افزارمون  ساخته میشه! پس بصورت خلاصه معماری در برنامه نویسی یعنی تقسیم بندی پروژه و  کد ها به قسمت های بزرگ و مشخص!اما این کار چه مزیتی داره؟با توجه به بزرگ شدن روز افزون پروژه های نرم افزاری و به طبع اهمیت بیشتر کار گروهی یه سری مشکلات بزرگ و کوچیک پدید اومد و نگه داری از کد ها سخت و سختر شد و  به دنبالش خوانایی کد ها پایین اومد.اینجاست که معماری معماری نرم افزار به وجود اومد. استفاده از معماری ، به نرم افزار و سیستم شما ساختار میده و خوانایی کد رو  بالاتر میبره، میتونه لایه های مختلف نرم افزارتون رو از هم جدا بکنه و  هرکدوم از اونا رو از همدیگه مستقل کنه؛ با این کار شما میتونید یه نرم  افزاری بسازید که همه چیزش تفکیک شده یعنی لایه View(نمایش) شما از  لایه منطق و مدل هاتون جدا بشه و خب این خوانایی کد رو فوق العاده بالاتر میبره و نگهداری از کد ها رو خیلی بهتر میکنه.شاید بشه بدون معماری خاصی نرم افزار های زیادی رو ساخت اما برای  نگه داری و بروز رسانی و .... به مشکل میخورید چون ساختاری مشخص وجود نداره و احتمالا با بزرگ شدن نرم افرارتون ، توش گم میشید.باور کنید استفاده از ساختاری مشخص و قاعده مند میتونه برناممون رو ساده تر کنه و از پیچیدگی نوشتاری جلوگیری کنه و در عین حال  قدرت محاسباتی و کاربردی برناممون رو حفظ کنه .انواع معماری برنامه نویسیبرای اینکه مطلب طولانی نشه سراغ مهمترینشون میرم بعدا در پستی جداگانه مفصل در موردشون صحبت می کنم.معماری لایه­ ایدر سالهای اخیر، لایه‌بندی یکی از اصولی  هست که در این نوع معماری استفاده میشه . لایه‌بندی باعث می‌شه که بخشهای  مختلف برنامه با توجه به لایه خود، اقدامات فراخوانی شده را پردازش کنن  و بدون در نظر گرفتن لایه دیگه، سرویس مورد نظر را به لایه بالاتر ارسال  کنه. کاهش وابستگی لایه‌ها به همدیگه باعث می‌شه تا سرعت اجرای برنامه  افزایش پیدا کنه .نکته مهمی که در معماری چند لایه در  برنامه‌نویسی وجود داره ، تعداد لایه ها  و این که در هر لایه چه اقدامی  باید انجام بده ، هست  با رشد این گونه معماری،  معماری 2 لایه و 3 لایه  پدید اومد. معماری ۲ لایهسیستم های دو لایه client-server نوعی معماری لایه ای بود که  لایه Client یک رابط کاربری بود و سرور هم لایه ای بود که در ارتباط با پایگاه داده فعالیت می کرد.ولی بیشتر برنامه نویسان منطق را در لایه Server جای میدادن که این کار باعث  تکرار شدن کد ها و طبیعتا، کاهش خوانایی برنامه، سخت شدن مشکل پشتیبانی و  توسعه و... می­شد به طوری که یک تغییر ساده در کد باعث تغییر در بخش های  زیادی میشه.با اینکه معماری Client-Server در محبوبیت به سر می برد ، با گسترش روز افزون شی گرایی و تلاش برای حله ایراد معماری client-server ،منجر به معرفی معماری 3 لایه شد.معماری ۳ لایهدر روش معماری سه لایه، شی گرایی نیز به  مدل دو لایه اضافه شد. در معماری برنامه نویسی سه لایه، لایه کاربران یا  UI، لایه منطق و لایه پایگاه داده در کنار یکدیگر قرار می گیره . همین  لایه‌ها باعث میشه تا از افراد متفاوت برای ایجاد هر لایه به طور مجزا و همزمان استفاده کرد و در نهایت این سه لایه یک واحد کامل را  تشکیل می‌ده.نقل قول هفته از C.A.R. Hoare  :به‌ طور کلی دو راه برای طراحی معماری یک نرم‌افزار وجود داره. راه اول  اینکه آن‌قدر اون رو ساده طراحی کنی که هیچ نقصی داخلش وجود نداشته باشه و  راه دوم اینکه آن‌قدر اون رو پیچیده طراحی کنی که هیچ نقصی آشکارا داخلش دیده نشه.</description><category>Alireza Shirmohammadi</category><author>Alireza Shirmohammadi</author><pubDate>Tue, 10 Aug 2021 03:37:22 +0430</pubDate></item><item><title>نیم نگاهی به کد تمیز (ترجمه کتاب clean code) قسمت اول</title><link>https://virgool.ir/@alireza.sh076/نیم-نگاهی-به-کد-تمیز-ترجمه-کتاب-clean-code-قسمت-اول-ijnqphxfmbno</link><description>شاید براتون پیش اومده باشه  که بعد از مدتی که کد برنامتون رو نوشتید به هر دلیلی بخواید تغییرات جدیدی اعمال کنید مثلا اضافه کردن ویژگی های جدید(منظورم feature هستش) و یا دیباگ کردن ‌‍‍‍، تو کدتون گم بشید و وقت زیادی رو سرش صرف کنید حالا فرض کنید این کد هر دفعه توسط یک نفر توسعه پیدا میکنه ، فکرش رو کنید، اگه این کد ،کد تمیزی نباشه به مرور زمان از خوانایی کد کاسته میشه و به پیچیدگی کد اضافه میشه تا جایی که بازده کد به صفر نزدیک میشه.اگه بعد از خواندن مطلب بالا با خودتون فکر میکنیم :«هه راست میگها» پس دعوتتون میکنم تا در ادامه با ترجمه کتاب clean code اثر Robert C.Martin  با من همراه باشید .سعی کردم کتاب رو به صورت خودمونی و عامیانه ترجمه کنم و هر از گاهی یه بار وسطش نظرات و تجربیات خودم راجب اون موضوع رو بیان کنم . فکر کنم دیگه بسه بهتر بریم سر وقت کتاب .مقدمه نویسنده کتابکدامیک از این تصاویر شما را در کدنویسی نشان می‌دهد؟ کدامیک شما را در  تیم یا شرکت نشان می‌دهد؟ چرا ما در آن اتاق هستیم؟ آیا این فقط یک بررسی  ساده کد است یا یک سری مشکلات را مدت کمی بعد از اجرا پیدا خواهیم کرد؟ آیا  به خاطر وحشت از خراب شدن کدی که فکر می‌کردیم درست است آن را دیباگ  میکنیم؟ آیا مشتری‌ها برنامه ما را ترک می‌کنند و مدیران، ما را تنبیه  می‌کنند؟ چطور مطمئن شویم در لحظات سخت، پشت درب درست قرار گرفته ایم؟ پاسخ  این است: مهارت.یادگیری مهارت از دو بخش تشکیل شده است: دانش و تمرین. شما باید اصول،  الگوها، تمرین‌ها و شیوه‌های اکتشافی که یک هنرمند می‌داند را یاد بگیرید و  آن دانش را با انگشتان، چشم‌ها، دل و روده‌تان حس کنید و سخت کار کنید و  تمرین کنید.من می‌توانم به شما فیزیک راندن یک دوچرخه را یاد بدهم. در واقع،  ریاضیات کلاسیک سر راست است. جاذبه، اصطکاک، تکانه زاویه‌ای، مرکز جرم و  غیره را می‌توان در کمتر از یک صفحه پر از معادلات نشان داد. با توجه به  فرمول‌ها می‌توانم به شما ثابت کنم که دوچرخه سواری عملی است و می‌توانم  همه دانشی که برای عملی کردن آن نیاز دارید را یاد بدهم. ولی هنوز در اولین  دوچرخه سواری‌ات زمین خواهی خورد. کد نویسی تفاوتی ندارد. ما می‌توانیم  همه اصول کد تمیز را یادداشت کنیم و بعد به شما اطمینان دهیم که با انجام  آنها موفق می‌شوید(به عبارتی بگذاریم وقتی سوار دوچرخه شدید زمین بخورید)،  اما کدام معلم این کار را می‌کند؟نه، این راهی نیست که این کتاب می‌خواهد برود. یادگیری نوشتن کد تمیز،  کار سختی است.  به بیشتر از دانستن اصول و الگوها نیاز دارد. باید عرق  بریزید. باید تمرین کنید و شکست‌هایتان را ببینید. باید کارهای دیگران و  شکست هایشان را ببینید. باید ببینید چطور زمین می‌خورند و دوباره بلند  می‌شوند. باید ببینید چطور از شکست‌هایشان عذاب می‌کشند و چه قیمتی برای  تصمیمات بدشان پرداخته‌اند. آماده باشید که حین خواندن این کتاب سخت تمرین  کنید.این یک کتاب تفننی نیست که بتوانید آنرا در هواپیما بخوانید و قبل از  فرود آنرا تمام کنید. این کتاب شما را به کار وادار می‌کند، پس سخت کار  کنید. چه نوع کاری را انجام خواهید داد؟ باید کد بخوانید، مقدار زیادی کد؛ و  شما را به چالش می‌کشد تا در مورد اینکه چه چیز آن کد خوب است و چه  بدی‌هایی دارد فکر کنید. از ما خواسته می‌شود که بخش‌ها (modules) را از هم  جدا و دوباره به هم وصل کنیم. برای این کار زمان و تلاش صرف خواهد شد ولی  ما فکر می‌کنیم که ارزش آنرا دارد.من این کتاب را به سه بخش تقسیم کرده‌ام. اولین بخش اصول، الگوها و  تمرین نوشتن کد تمیز را در بر می‌گیرد. تعداد کمی کد در این بخش قرار دارد  که خواندن آنها چالش برانگیز است. آنها شما را برای خواندن بخش دوم آماده  خواهد کرد. اگر پس از خواندن فصل اول کتاب را کنار گذاشتید، موفق باشید!در بخش دوم کتاب کار سخت‌تر است. این فصل از چند بخش با پیچیدگی افزایشی  تشکیل شده است. هر بخش، تمرین تمیز کردن کمی کد است؛ تبدیل کردن کدی که  مشکلاتی دارد به کدی که مشکلات کمتری دارد. جزئیات این فصل سخت است. باید  دائم بین کتاب و یادداشت برداری جابه جا شوید. باید کدی که با آن کار  می‌کنیم را آنالیز و درک کنید و برای هر تغییری که در کد ایجاد می‌کنیم  استدلال کنید. کمی زمان بگذارید چون این کار باید چند روز زمان ببرد.بخش سوم کتاب نتیجه‌گیری نهایی است. این بخش شامل لیستی از اکتشافات و  بوهایی (منظور چیزهایی که کد را از حالت تمیز بودن خارج می‌کند که به بوی  بد شهرت دارد) است که هنگام یادگیری جمع‌آوری شده است. همینطور که پیش  می‌رویم و کدها را تمیز می‌کنیم، برای هر کاری که انجام می‌دهیم تحت عنوان  بو یا اکتشاف، نکته برداری می‌کنیم. ما تلاش میکنیم واکنش خودمان را نسبت  به کدی که خوانده‌ایم و تغییر داده‌ایم درک کنیم، و سخت تلاش کرده‌ایم که  آنچه احساس کرده‌ایم، آنچه انجام داده‌ایم و دلیل آن را ضبط کنیم. نتیجه  دانشی پایه است که به درک طرز تفکر من هنگام نوشتن، خواندن و تمیز کردن کمک  می‌کند. اگر شما بخش‌های فصل دوم را به دقت نخوانید این دانش پایه ارزش  محدودی خواهد داشت.در آن بخش‌های آموزشی هر تغییری که ایجاد کرده‌ایم را به دقت و با ارجاع  به اکتشافات به طور کامل تشریح کرده ایم. این ارجاعات در کروشه مثل این  ظاهر می‌شوند:[H22]. این به شما اجازه می‌دهد متنی که در آن از اکتشافات  استفاده شده را ببینید. این نه تنها خودش اکتشاف نیست بلکه بسیار ارزشمند  است، این رابطه آن اکتشافات و تصمیمات پراکنده‌ای که حین تمیزکردن کد در  بخش‌های آموزشی گرفته‌ایم را مشخص می‌کند. برای کمک بیشتر در رابطه با این  روابط، مرجعی در پایان کتاب قرار داده‌ایم که شماره صفحه هر ارجاع را نمایش  می‌دهد. می‌توانید از آن برای دیدن مکانی که هر اکتشاف ظاهر شده، استفاده  کنید.اگر فصل اول و سوم را بخوانید و از فصل دوم صرف نظر کنید، بهتر است یک  کتاب تفننی در باره نوشتن نرم‌افزار خوب بخوانید. اما اگر برای بخش‌های  آموزشی در فصل دوم وقت بگذارید، هر قدم کوچک را دنبال کنید، هر تصمیم  لحظه‌ای، اگر خودت را جای من قرار دهی، و خودت را به همان مسیری که ما  می‌رویم هدایت کنی، درک بیشتری از اصول و الگوها بدست خواهی اورد. آنها  دیگر دانش تفریحی نخواهند بود. آنها به دل و روده، انگشتان و قلبتان راه  پیدا کرده‌اند. آنها به بخشی از خودتان تبدیل خواهند شد همان طور که وقتی  دوچرخه سواری یاد می‌گیرید، به بخشی از وجودتان تبدیل می‌شود.میدونم یکم طولانی بود ولی از هفته های بعد ، سعی میکنم مطلب را به صورت قسمت های فشرده تر و خلاصه تر بنویسم پس هفته بعد متنظر فصل اول کتاب باشید .راستی خوشحال میشم نظراتتون رو برام بنویسید حتما لحاظشون میکنم .نقل قول هفته از Martin Fowler :هر احمقی می‌تونه کدهایی بنویسه که کامپیوتر بفهمه اما برنامه‌نویس خوب کدهایی می‌نویسه که دیگر انسان‌ها هم بتونن درک کنن.Enter to exit  . . . . </description><category>Alireza Shirmohammadi</category><author>Alireza Shirmohammadi</author><pubDate>Sun, 25 Jul 2021 19:58:14 +0430</pubDate></item></channel></rss>