<rss version="2.0">
  <channel>
    <title>بلاگ</title>
    <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF</link>
    <description><![CDATA[در اینجا در مورد چیزهایی که در حال  یادگیریشان هستم مینویسم]]></description>
    <item>
      <title>چه فرصتهایی ارزش وقت گذاشتن دارند</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DA%86%D9%87-%D9%81%D8%B1%D8%B5%D8%AA%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B1%D8%B2%D8%B4-%D9%88%D9%82%D8%AA-%DA%AF%D8%B0%D8%A7%D8%B4%D8%AA%D9%86-%D8%AF%D8%A7%D8%B1%D9%86%D8%AF</link>
      <description><![CDATA[<p style="direction: rtl">گاهی اوقات با فرصت هایی رو برو میشویم که به نظر درآمدزا می آیند هرچند درآمدهای کوچک و با کار اندک. اما خیلی اوقال این سوال پیش می آید که آیا کار مذکور هرچقدر کوچک ارزشش را دارد؟! مثلن اگر اپلیکیشنی وجود دارد که فقط با کلیک کردن بر روی آن من میتوانم درآمد داشته باشم آیا باید آن را انجام دهم؟ در اینجا دو دیدگاه مطرح است دیدگاه بلندمدت و دیدگاه کوتاه مدت. در دیدگاه بلندمدت هرچیزی که شما را به هدف نمیارساند و در راستای ارزش های شما نیست نباید وقت شما را مصرف کند. و در دیدگاه&nbsp; کوتاه مدت هرچیزی که درآمد آن از درآمد فعلی شما کمتر است نباید شما را به خود مشغول سازد. حداقل جواب شما به یکی از اینها باید بله باشد تا وارد بازی شوید. مثلن فرض کنید شما در ماه 15میلیون تومان حقوق دریافت میکنید برای 160ساعت کار در ماه هر ساعت شما 93،750تومان ارزش دارد. لذا کارهایی که درگیر آنها میشوید در نگاه کوتاه مدت میبایست بیشتر از این برای شما عایدی داشته باشد. در نگاه بلند مدت نیز اگر با ارزشهای شما سازگار نیست نباید به آن کار بپردازید. شاید بگویید با ارزش های من سازگار نیست ولی با درآمدی که برای من ایجاد میکند میتواند مرا به اهدافم نزدیکتر کند و پس از آن وقت بیشتری برای فکر کردن به ارزشهایم خواهم داشت. اما این چیزیست که تبدیل میشود فقط به دنبال پول دویدن و هرچقدر اینگونه در پی پول بدوید از شما دورتر میشود.</p>]]></description>
      <pubDate>Sat, 02 Aug 2025 13:51:28 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DA%86%D9%87-%D9%81%D8%B1%D8%B5%D8%AA%D9%87%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B1%D8%B2%D8%B4-%D9%88%D9%82%D8%AA-%DA%AF%D8%B0%D8%A7%D8%B4%D8%AA%D9%86-%D8%AF%D8%A7%D8%B1%D9%86%D8%AF</guid>
    </item>
    <item>
      <title>بنی آدم اعضای یکدیگرند</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A8%D9%86%DB%8C-%D8%A7%D8%AF%D9%85-%D8%A7%D8%B9%D8%B6%D8%A7%DB%8C-%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1%D9%86%D8%AF</link>
      <description><![CDATA[<p style="direction: rtl">امروز توی اوتوبان یادگار یه بیلبورد دیدم که روش این بیت از شعر سعدی نوشته شده بود " بنی آدم اعضای یکدیگرند" یاد این موضوع افتادم که انگار تصحیح و بررسی کرده بودن و به این نتیجه رسیده بودن که این بیت میبایست به این شکل باشه " بنی آدم&nbsp; اعضای یک پیکرند" منو به فکر فرو برد که آیا معنی شکل اولی (یکدیگرند) که به نظر فراگیر تر هست هم میتونه درست باشه! به این نتیجه رسیدم علاوه بر این که معنای جالبی نداره و با باقی شعر همخوان نیست یه مقدار هم یه جوریه. اعضای یکدیگر بودن برای من اینطوری تصویر میشه که مثلن پای من در بدن یکی دیگست و دست یکی در بدن من حالا با فرض اینکه دست من دست یکی دیگه باشه، یا من احساسش میکنم، یا اون یکی دیگه، یا هردو، که در حالت یک و دو این باعث بی قراری سایر اعضا&nbsp;<span style="background-color: var(--bs-body-bg); color: var(--bs-body-color); font-weight: var(--bs-body-font-weight); text-align: var(--bs-body-text-align)">(مجموع اعضای من و دیگری احتمالن)</span><span style="background-color: var(--bs-body-bg); color: var(--bs-body-color); font-weight: var(--bs-body-font-weight); text-align: var(--bs-body-text-align)">&nbsp;نمیشه. فقط در حالت سوم که هر دو همزمان حس کنیم برقرار میشه که اونم خیلی از تجربیات روزمره دوره و زیبا نمیشه.</span></p><p style="direction: rtl">اما اگر بگیم اعضای یک پیکرند خیلی منطقی تر به نظر میاد پیکر میتونه تشبیه یک جامعه باشه که ما اعضاش هستیم خیلی روون. و وقتی عضوی از جامعه به درد میاد مثلن در صورت جنگ، گرانی و ... کل جامعه متاثر میشه و اون کسی که از درد و رنج و محنت سایرین غمی نداره و استفاده هم میبره مثل مثلن کاسبان تحریم الان خودمون،&nbsp; خوب مسلمن نشاید که نامش نهند آدمی.</p>]]></description>
      <pubDate>Sun, 01 Dec 2024 05:28:00 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A8%D9%86%DB%8C-%D8%A7%D8%AF%D9%85-%D8%A7%D8%B9%D8%B6%D8%A7%DB%8C-%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1%D9%86%D8%AF</guid>
    </item>
    <item>
      <title>ارزش پول و پول بی ارزش</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A7%D8%B1%D8%B2%D8%B4-%D9%BE%D9%88%D9%84-%D9%88-%D9%BE%D9%88%D9%84-%D8%A8%DB%8C-%D8%A7%D8%B1%D8%B2%D8%B4</link>
      <description><![CDATA[<p class="MsoNormal" dir="RTL" style="text-align: right; direction: rtl; unicode-bidi: embed"><span lang="FA" style="font-size: 12pt; line-height: 107%; font-family: &quot;B Nazanin&quot;">در حال حاضر نه تنها ریال به کم ارزشترین ارز جهان با توجه
به نرخ برابری تبدیل شده بلکه از نظر کاربرد نیز بی ارزشترین است چرا که قیمت هیچ چیزی
را نمیشود با آن سنجید. نرخ های متفاوتی در حال حاضر در کشور برای دلار وجود. دلار
نیمایی، دلار آزاد، به تازگی دلاری به نام ناخدا که تا کنون معلوم نیست به چه معنی
است. با این حال نرخ اجناس اغلب بر اساس دلار آزاد توسط کسبه محاسبه میگردد. با
وجود نوسانات ساعتی دلار معمولن به این شکل نرخ ها محاسبه میشود که هروقت دلار سقف
جدید را در نوردد کالاها با نرخ جدید خود را به روز رسانی میکنند و اگر به هر دلیلی
کاهش یابد این قیمت ها کاهش نخواهند یافت. در برخی کالاها که نظارت شدیدتری دارند
معمولن این تغییر نرخ ها به صورت انفجاری انجام میگیرد یعنی به هر مدتی که بتواند
دولت این نرخ ها را نگه میدارد تا جایی که توان نگهداری آن را نداشته باشد و سپس
رها میکند و افزایشی در برخی موارد 100درصدی را در آن ها میبینم. همین دیروز برای
خرید نان سنگک رفته بودم به همان نانوایی که اغلب یک روز در میان میروم و متوجه
شدم نانی که تا روز قبل از آن 5000تومان بوده الان به قیمت 10000تومان عرضه میشود. حتا
تابلوی قیمت ها تغییری نکرده بود ولی تغییر نرخ اعمال شده بود. این موضوع در مورد
محصولات دیگر به صورت تغییر مداوم است یعنی مثلن شما هر بطری شیر را در هر بار
مراجعه به فروشگاه با اندکی تغییر خریداری میکنید. مثلن امروز 12000تومان، فردا
12200تومان و پس فردا 12500تومان این روند به ویژه در دو سال گذشته بدون توقف در جریان
بوده و مردم به آن شاید عادت کرده‌اند. به روند فقیر شدن همگانی. و هر کس زودتر یا
دیرتر با اثرات آن مواجه میشود. شاید دلیل اینکه مردم کمتر آن را حس میکنند یکی ناامیدی
از حکومت است دیگری شاید به دلیل این باشد که مثلن شخصی که خودرویی که دو سال پیش
به قیمت 60میلیون تومان خریده میبیند که میتواند الان آن را به قیمت 200میلیون
تومان به فروش برساند و تصور رشد سرمایه احساس فقیر شدن را در او کمتر میکند در
حالی که اغلب مردم میدانند که این وضعیت به طور کلی به ضررشان است. برخی نیز به
جای خودرو، دلار یا طلا یا ملک دارند که خیالشان را تا حدی از حفظ ارزش سرمایه شان
راحت میکند. بیشتر ضرر مربوط به افرادیست که کار مولد انجام میدهند و درگیر افزایش
هزینه ها و کاهش مشتریان هستند.&nbsp;</span></p>]]></description>
      <pubDate>Mon, 09 Dec 2024 05:18:50 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A7%D8%B1%D8%B2%D8%B4-%D9%BE%D9%88%D9%84-%D9%88-%D9%BE%D9%88%D9%84-%D8%A8%DB%8C-%D8%A7%D8%B1%D8%B2%D8%B4</guid>
    </item>
    <item>
      <title>یادگیری ماشین، از کجا شروع کنیم؟</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%A7%D8%B2-%DA%A9%D8%AC%D8%A7-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%DB%8C%D9%85</link>
      <description><![CDATA[<p dir="rtl"></p><p>یادگیری ماشین یا
Machine Learning یکی از شاخه‌های جدید دانش است که رفته رفته در حال تسخیر زندگی روزمره ماست.
و هر روز بیشتر اثرات آن را بر زندگی خود میبینیم. از تبلیغات هوشمند گرفته تا تشخیص سرطان و نحوه تعامل با ابزارهای الکترونیکی.</p>
<p>اما یادگیری ماشین دقیقن چیست و برای استفاده از آن باید چه کار کنیم؟ در اینجا میخواهیم نگاهی از بالا به این موضوع بیاندازیم.</p>
<p><strong>یادگیری ماشین چیست؟</strong>
یادگیری ماشین در واقع فرآیند ساخت سیستم‌هایی است که به طوری برنامه‌نویسی شده‌اند که یادمیگیرند و می‌توانند خودشان را بهبود دهند.</p>
<p>هدف نهایی یادگیری ماشین طراحی الگوریتم‌هایی است که به سیستمها کمک میکند که به صورت خودکار داده جمع آوری کنند و برای یادگیری بیشتر خود از این داده ها استفاده کنند.
انتظار می‌رود که این سیستم‌ها در داده‌های جمع آوری شده الگوهایی را بیابند و از آن ها برای اخذ تصمیمات حیاتی برای خودشان استفاده کنند.</p>
<p>به طور کلی یادگیری ماشین وادار کردن سیستم ها برای فکر کردن و عمل کردن شبیه انسان، بروز هوشی شبیه انسان و در واقع دادن مغز به آن‌ها است</p>
<p>در حال حاضر مدل های یادگیری ماشینی وجود دارند که میتوانند وظایفی مانند تشخیص ایمیلهای اسپم از ایمیلهای واقعی یا تصحیح خطاهای املایی و دستوری در نوشتار را انجام دهند.
همچنین به لطف یادگیری ماشین سیستم هایی وجود دارند که می توانند کارهایی پیچیده تر انسانی مثل</p>
<ul>
<li>تشخیص تصاویر و اشیا</li>
<li>تشخیص اخبار فیک</li>
<li>فهم کلمات نوشتاری و گفتاری</li>
<li>روباتهای گفتگو یا چت بات‌ها</li>
<li><p>و خودروهای خودران
را انجام دهند.</p>
<p><strong>مراحل ایجاد یادگیری ماشین</strong>
ایجاد هوشمندی برای ماشین ها آنقدرها هم ترسناک و غیر ممکن نیست و عملیات لازم برای ایجاد این هوش را میتوان به 7 گام اصلی تقسیم کرد.</p>
</li>
<li><p><strong>جمع آوری داده</strong></p>
</li>
</ul>
<p>ماشین‌ها در ابتدا از طریق داده‌هایی که ما در اختیارشان قرار میدهیم یاد میگیرند. برای همین بسیار مهم است که دادههای مطمئنی را فراهم کنیم تا مدل یادگیری ماشین بتواند الگوهای صحیح را از آنها استخراج کند. کیفیت داده‌هایی که به مدل میدهیم دقت مدل ما را تعیین میکند. اگر داده‌های ناصحیح یا داده‌هایی که به روز نیستند داشته باشیم، نتایج و پیش‌بینیهایی خواهیم داشت که بی ربط خواهند بود.</p>
<p>پس باید مطمئن شویم که دادههایی که استفاده میکنیم از یک منبع معتبر باشند، چرا که مستقیمن بر روی نتیجه تاثیر خواهند داشت. داده باکیفیت داده‌ایست که پیش از هرچیز مرتبط با موضوع مورد نظر ما باشد، همچنین مقادیر جا افتاده و تکراری کمی داشته باشد. به علاوه از دسته‌های مختلف داده‌ها به اندازه کافی در آن وجود داشته باشد.
یعنی مثلن اگر میخواهیم تعداد مشتریان یک کافه را در روزهای مختلف را پیش‌بینی کنیم داده‌های ما نباید فقط شامل داده‌های روزهای بارانی باشد و فاقد روزهای آفتابی یا تعدادی کمی داده از این دسته باشد.</p>
<ol>
<li><strong>آماده سازی داده‌ها</strong></li>

<p>بعد از این که داده‌های با کیفیت را به دست آوردیم باید آنها را برای یادگیری ماشین آماده کنیم. آماده سازی داده‌ها شامل مراحل زیر است.</p>
<ul>
<li>همه داده ها را در کنار هم قرار می‌دهیم و به صورت تصادفی آنها را پراکنده می‌کنیم، که باعث میشود داده‌ها به صورت متعادل توزیع شوند و ترتیب آنها بر روی فرآیند یادگیری اثر نگذارد.</li>
<li>پاکسازی دادهها: با حذف دادهای ناخواسته، مقادیر جا افتاده، سطرها و ستونهای جا افتاده یا فاقد مقدار و مقادیر تکراری داده‌ها را پاکسازی میکنیم. ممکن است حتا نیاز باشدجای سطرها و ستونها هم در داده‌ها تغییر کند.</li>
<li>تصویر سازی داده‌ها، برای درک بهتر از ساختار داده‌ها و فهم روابط بین آنها و دسته‌های موجود میتوانیم از تصویرسازی و ایجاد نمودارهای مختلف از داده‌ها استفاده کنیم.</li>
<li><p>تقسیم دادههای پاکسازی شده به دو مجموعه، یکی مجموعه آموزش و دیگری مجموعه تست. مجموعه آموزش مجموعه‌ایست که مدل ما از آن یاد میگیرد و مجموعه تست برای بررسی دقت مدل بعد از یادگیری به کار میرود.</p>
</li>
<li><p><strong>انتخاب مدل</strong></p>
</li>
</ul>
<p>در یادگیری ماشین مدل، خروجی حاصل از اجرای الگوریتم یادگیری ماشین بر روی داده‌ها را مشخص میکند. بنابراین انتخاب مدلی که با مساله مورد نظر متناسب باشد اهمیت زیادی دارد. مدلهای بسیاری تاکنون برای مسائل مختلف از جمله تشخیص گفتار، تشخیص تصویر و از این دست توسعه داده شده‌اند. علاوه بر این میبایست در نظر بگیرید که مدلی که انتخاب میکنید برای داده‌هایی که در دست دارید نیز مناسب باشد.</p>

<li><strong>آموزش مدل</strong></li>

<p>آموزش مهمترین مرحله در یادگیری ماشین است. در آموزش داده‌های آماده شده را به مدل میدهیم تا الگوهایی را درآنها بیابد و پیش‌بینی‌هایی انجام دهد.نتیجه آن یادگیری از داده‌ها خواهد بود تا بتواند وظیفه مورد نظر را به انجام برساند. در طول زمان با آموزش، مدل پیش‌بینی‌های بهتری ارائه میکند.</p>

<li><strong>ارزیابی مدل</strong></li>

<p>بعد از آموزش مدل باید بررسی کنیم که عملکرد آن تا چه حد مطلوب است. این کار با انجام تست بر روی مدل با داده‌هایی که قبلن توسط مدل دیده نشده‌اند قابل انجام است. این مجموعه دادههای دیده نشده داده‌هایی هستند که قبلن از مجموعه داده‌های اولیه جدا کرده‌ایم. اگر تست بر روی داده‌هایی که برای آموزش به کار رفته‌اند استفاده شود، معیار دقیقی حاصل نخواهد شد. چرا که مدل با آن داده آشنا است و همان الگوها را در آن پیدا خواهد کرد که قبلن در هنگام آموزش پیدا کرده بود و این به شما دقت نامتناسبی ارائه خواهد داد.
اما وقتی که بر روی داده‌های مجموعه تست انجام شود معیار دقیقتری برای ارزیابی صحت و سرعت مدل خواهیم داشت.</p>

<li><strong>تنظیم متغیرها</strong></li>

<p>پس از ایجاد و ارزیابی مدل باید ببینیم که چگونه میتوانیم دقت مدل را افزایش دهیم. این کار از طریق تنظیم متغیرهای موجود در مدل قابل انجام است.  متغیرها مقادیری در مدل هستند که معمولن برنامه نویس در مورد آنها تصمیم گیری میکند. در مقادیر خاصی برای متغیرها دقت مدل ما حداکثر خواهد بود. تنظیم متغیرها، پیدا کردن همین مقادیر است.</p>

<li><strong>پیش بینی</strong></li>
</ol>
<p>در آخر، میتوانید مدل را بر روی داده های دیده نشده و تازه اجرا کنید و پیش‌بینی‌هایی انجام دهید.</p>
<p>قسمت بعد 
Hello world in Machine learning</p><p></p>
]]></description>
      <pubDate>Sat, 05 Nov 2022 11:35:56 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%A7%D8%B2-%DA%A9%D8%AC%D8%A7-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%DB%8C%D9%85</guid>
    </item>
    <item>
      <title>چگونه بلاگ مینویسم؟</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D9%84%D8%A7%DA%AF-%D9%85%DB%8C%D9%86%D9%88%DB%8C%D8%B3%D9%85</link>
      <description><![CDATA[<p>مدت زیادیه که دوست داشتم یک بلاگ با محتواهای جدید به صورت منظم داشته باشم که چند بار شروع کردم اما به دلیل مشغله های مختلف پیوستگی پیدا نکرد. اما حالا یک استراتژی جدید برای نوشتن وبلاگ در نظر گرفتم که فکر میکنم به قول معروف sustainable باشد. که شرح این استراتژی موضوع این پست هست.</p><p><br></p><p>اول از همه لیستی از موضوعاتی که برایم جالب است یا میخواهم بیشتر یاد بگیرم و یا فکر میکنم در موردشان حرفی برای گفتن دارم را آماده دارم که اولویت بندی شده هم هستند. این اولویت هم بر اساس پروژه ای که در دست اجرا دارم ممکن است بالا یا پایین شود.</p><p><br></p><p>سپس یک نمای کلی از مواردی که میخواهم در موردشان صحبت کنم، یا سوالاتی که به ذهن خودم میرسد در مورد موضوعی که میخواهم یاد بگیرم یا مطرح کنم را می‌نویسم.</p><p><br></p><p>تا اینجا یک لیست موضوع دارم و در مورد هر موضوع هم یک سری زیر موضوع، واژگان کلیدی و سوالات درباره آن موضوع، حالا وقت تحقیق و به دست آوردن اطلاعات در مورد هر کدام از زیر موضوع ها و کلمات کلیدیست. که با جستجو در اینترنت و معمولن محتوای انگلیسی کامل میشود. سپس آنها را به زبان خودم بازنویسی میکنم. (زبان خودم مجموعه ای است دانسته ها&nbsp; و ندانسته های من) و این میشود یک پست بلاگ من و بعد از چند بازخوانی و ویرایش در این مرحله بلاگ را منتشر میکنم.</p><p><br></p><p>بعد از آنکه مثلن در مورد چیزی که میخواستم یاد بگیریم نوشتم و پس از کسب تجربه عملی با آن موضوع و استفاده آن در عمل برمیگردم و تجربه خودم را هم به آن اضافه میکنم تا هم یادآوری برای خودم باشد هم غنای مطلب بالاتر رود. و همینطور بلاگ بعد.</p><p><br></p><p>مثلن در مورد این بلاگ کلمات کلیدی من برای نوشتن این موارد بوده اند:</p><p>نحوه نوشتن، انواع موضوعات، موضوعاتی که میخواهم یاد بگیرم، موضوعاتی که فکرم میکنم در موردشان ایده و نظر دارم، بلاگهای بعدی رو چطور بنویسم؟، نقشه راه، فارسی و انگلیسی، اورجینال، چرا مینویسم؟</p><p>اما چرا مینویسم؟ چند وقت پیش ویدیویی را در یوتیوب دیدم در مورد اهمیت نوشتن که بیان میکرد که ما در واقع با نوشتن نحوه فکر کردن و انتقال افکارمان به دیگران را می‌آموزیم و این انتقال افکار به دیگران یکی از مهمترین مهارتهاست چرا که برای انجام هر کار مهمی نیاز به همراهی دیگران داریم و راه همراه کردن ارائه یک پروپوزال مشخص برای طرح ایده و افکارمان است. از طرفی این مهارت فقط با تمرین به دست می آید.</p><p><br></p><p>دلیل دیگر آن است که با وجود اهمیت نوشتن برای همه، این مسئله برای یک کارآفرین و مدیرعامل اهمیت بیشتری دارد چرا که به صورت روزانه و مکرر با این موضوع سرو کار دارد و هر روز باید کارکنان، هیئت مدیره، مشتریان، بازاریابان و سایرین را در جریان افکار و ایده ها در مورد هر طرح قرار دهد و فکر پشت هر طرح و ایده اصلی آن را به شکل موثری انتقال دهد.</p><p><br></p><p>مورد دیگر اینکه به صورت روزانه مینویسم و مثلن الان که در حال نوشتن این مطلب هستم، یک حداقل 10خطی برای نگارش روزانه در نظر گرفته ام که هر روز باید بنویسم. که البته از 5خط در روز شروع کردم و الان به 10 خط در روز رسیده ام و به مرور هم افزایش خواهد یافت. این باعث میشود که نوشتن به یک هدف مشخص، کوچکتر و قابل انجام تبدیل شود و بلاگ قدم به قدم پیش رفته و کامل شود.</p><p><br></p><p>موضوع دیگر تخصیص دادن یک زمان خاص در روز برای این کار است. یعنی هر روز سر یک ساعت خاص باید بنشینم و این وظیفه را انجام دهم که این هم زمان انجام کار را مشخص میکند که دیگر لازم نباشد منتظر باشیم تا حس نوشتن به سراغمان بیاد و بعد از یک مدت هم میتواند تبدیل به یک عادت و یک روتین شود.</p><p><br></p><p>موضوع دیگر این است که کدام پست و کدوم موضوع را بنویسم که علاوه بر اولویت بندی که مطرح کردم تحت تاثیر موضوعی که بیشتر ذهنم را در آن روز مشغول کرده نیز هست.</p><p><br></p><p>حالا اینکه یک موضوع در کجا تمام میشود هم موردی است برای خودش، مثلن الان نمیدانم کجا باید همین پست را تمام کنم. لبته این نوشته ها نیاز به ویرایش هم دارند پس در جلسات نوشتن روازنه باید ویرایش و بازخوانی هم گنجانده شوند که آن هم زمان بر است. که جدا&nbsp; کردن نوشتن از ویرایش هم توصیه یک کتاب بود که الان نامش در خاطرم نیست ولی به نظر توصیه موثری است.</p><p>آیا باید هر بار که شروع به نوشتن میکنم کل مطلب نوشته شده برای آن پست را اول بخوانم بعد شروع کنم به توسعه دادنش؟ خواند کل مطلب پیش از ادائه نوشتار یک خوبی دارد که و آن اینکه چندین بار بازخوانی و ویرایش صورت میگیرد و میتواند پست بهتری را بسازد. اما اضافه کردن به متن از جایی که تمام شده هم میتواند تنوع و ایده های بیشتری را در متن فراهم کند، که البته این دومی فقط یک حدس است شاید در عمل بدین شکل نباشد و بیشتر منجر به گسستگی متن شود تا تنوع ایده های مطرح شده آن، و موجب افزایش زمان ویرایش و بازنویسی شود.</p><p><br></p><p>این پست هم بیشتر از اینکه انتقال تجربه باشد به نوعی نقشه راه هست برای خودم، که امیدوارم برای دیگرانی نیز که خیال راه اندازی وبلاگ را دارند یه وبلاگ زنده و منظم مفید باشد.</p><p><br></p>]]></description>
      <pubDate>Mon, 14 Nov 2022 15:00:15 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D9%84%D8%A7%DA%AF-%D9%85%DB%8C%D9%86%D9%88%DB%8C%D8%B3%D9%85</guid>
    </item>
    <item>
      <title>نصب صحیح Git for Windows</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D9%86%D8%B5%D8%A8-git</link>
      <description><![CDATA[<div dir="rtl">
<p>این روزها اکثر برنامه نویسان برای مدیریت سورس کد از گیت استفاده میکنند، و با اینکه اغلب ابزار گیت به همراه IDE نصب میشود، اما خیلی وقت ها هم نیاز داریم به دلایلی برنامه setup گیت را دانلود و جداگانه نصب نماییم. اما نصب کلاینت گیت برای ویندوز هم دارای گزینه هایی برای نصب است که شاید برای همه خیلی ملموس نباشد و با استفاده از گزینه های پیش فرض هم همیشه کار راحت و بدون دردسر پیش نمیرود و گاهی مجبور میشویم این گزینه ها را تغییر دهیم.</p><p>پس در اینجا میخواهیم نگاهی بیندازیم به مراحل نصب git for windows و گزینه های موجود برای نصب را کمی دقیق تر نگاه کنیم. تا بتوانیم با نصب درست و مطابق با نیازمان در آینده کمتر دچار مشکل با این ابزار پرکابرد شویم.</p><h2>License</h2><p>بعد از دانلود برنامه نصب از <a href="https://git-scm.com/download/win">وب سایت گیت</a>&nbsp;و شروع نصب در اولین مرحله باید لایسنس را بپذیریم، این لایسنس GPL هست و در واقع برعکس بیشتر لایسنسها که محدودیت هایی برای استفاده و نحوه استفاده قائل میشوند این لایسنس برای این است که کسی نتواند استفاده شما از این نرم افزار را محدود کند.</p><p><br></p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-liscense.png"></p><p><span style="white-space: normal">	</span></p><p>که خیلی هم خوب هست پس می پذیریم.</p><h2>آدرس محل نصب</h2><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-path.png"></p><p><span style="white-space: normal">	</span></p><p><br></p><p>آدرس نصب از آن قسمتهاییست که معمولن گزینه پیش فرض در Program Files گزینه مناسبیست پس به مرحله بعدی میرویم.</p><h2>انتخاب امکانات مورد نیاز برای نصب</h2><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-components.png"></p><p><span style="white-space: normal">	</span></p><p>- اولی که قرار دادن آیکن گیت در دسکتاپ هست که خیلی کار خاصی نیست، و مثلن در مورد خود من، خیلی کم پیش می آید که از دسکتاپ برای باز کردن اپلیکیشنی استفاده کنم و معمولن از استارت استفاده میکنم. یکی از دلایلش هم این است که اغلب چندین پنجره باز دارم و خوب اگر بخواهم از آیکن های دسکتاپ استفاده کنم باید همه را مینیمایز کنم تا به دسکتاپ برسم درحالی که با یک دکمه کیبورد منوی استارت ظاهر میشود و هر اپلیکیشنی که لازم باشد را پیدا میکنم.</p><p>- مورد بعدی یکپارچگی با ویندوز اکسپلورر هست که این مورد هم معمولن به کار نمی آید. چرا که معمولن وقتی از یک IDE استفاده میکنیم هم رابط کاربری بهتری ارائه میکنند و هم از نظر کاربرد راحتتر هستند این هم اشاره کنم که GUI گیت فارسی را هم ساپورت نمیکند. و اگر بخواهیم با متنی کار کنیم که در آن محتوای فارسی هم هست خیلی مناسب نخواهد بود.&nbsp;</p><p>- git bash هم ارزش خاصی نسبت به CMD ویندوز برایمان ایجاد نمی کند البته شاید برای لینوکس کارها گزینه خوبی باشد و بیشتر از bash خوششان بیاید ولی برای کسانی که با ویندوز کار میکنند لطف خاصی ندارد.</p><p>- Git LFS(Large File Support) که همانطور که از اسمش پیداست برای پشتیبانی از فایلهای بزرگ است و کارکردش به این صورت است که فایل های بزرگ را در گیت با اشاره گرهای متنی جایگزین میکند و فایل هایی مثل فایل های صوتی، ویدئویی، دیتاست ها و فایلهای گرافیکی میتوانند در ذخیره سازهای ابری ذخیره شوند و یک اشاره گر از سورس داشته باشد. در صورتی که&nbsp; با این نوع فایلها سر و کار داریم میتوانیم این گزینه را فعال کنیم.</p><p>- Associate .git configuration files with the default text editor</p><p>خوب این گزینه فایل های .git را با ویرایشگر پیش فرض ویندوز مرتبط میکند که انتخاب خوبی هست چرا که به این معنیست که فایلهای .git که تنظیمات مرتبط با گیت هستند با دابل کلیک با نوت پد باز میشوند و میتوان آنهارا ویرایش کرد.</p><p>- Associate .sh files to be run with bash</p><p>این گزینه هم فایلهای .sh را با bash مرتبط میکند که خوب منطقیست چون .sh&nbsp; اصلن فایلهای bash هستند</p><p>- Check daily for Git for Windows updates</p><p>آن قدرها اتفاقی خاصی در گیت رخ نمیدهد که هر روز منتظر به روزرسانی جدید باشیم.</p><p>- Add a Git Bash Profile to Windows Terminal</p><p>این هم گزینه مناسبیست که Git Bash&nbsp; را به ترمینال جدید ویندوز که خاصیت ترسپرنت هم دارد اضافه میکند و در برخی موارد ممکن است به کار بیاید و داشتن این مورد در جعبه ابزار به ویژه در ترمینال ویندوز خالی از لطف نیست.</p><p><br></p><p>با این اوصاف گزینه های انتخابی ما مانند تصویر زیر خواهند بود.</p><p>&nbsp;</p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-components-picked.png"></p><h2>ایجاد منوی git در start ویندوز</h2><p>مرحله بعد انتخاب فولدر در start منوی ویندوز است، هرچند معمولن گیت را از اینجا اجرا نمیکنیم با این حال&nbsp; گزینه مناسبی است و دسترسی به گیت را آسان میکند.</p><h2>&nbsp;انتخاب ویرایشگر متنی</h2><p>اما مرحله بعد انتخاب ویرایشگر است و ویرایشگر پیش فرض گیت نیز VIM است که همانطور که میدانیم فرآیند خاصی که خارج شدن از Vim داره دستمایه طنزپردازیهای بسیاری در حوزه برنامه نویسی است.</p><p><br></p><p><img src="https://preview.redd.it/m9eh2jw08qm61.jpg?width=583&amp;format=pjpg&amp;auto=webp&amp;s=17994593b2b748b5087cc8ce786c7d161dd91747"></p><p><br></p><p>&nbsp;اما اگر خارج شدنش را&nbsp; بلد باشیم(که با تایپ دونقطه : وارد محیط کامند Vim میشویم و با تایپ q و بعد زدن کلید Enter میتوانیم از محیط آن خارج شویم، اگه بخوایم تغییراتمان ذخیره شود هم به جای q، تایپ میکنیم wq😊) یکی از خوبیهای Vim این است که در محیط ترمینال اجرا میشود. مثلن وقتی که میخواهیم تغییراتی را کامیت کنیم باید یک کامنت وارد کنیم که وارد کردن این کامنت در همان خط فرمان(Command Line) کار راحتتریست تا اینکه یک پنجره دیگر مثل notepad یا Notepad++ باز شود و آنجا تغییراتمان را اعمال کنیم و بعد ذخیره نماییم. اما اگر میپرسید "چرا باید در Command Line با گیت کار کنیم باید عرض کنم که خیلی از امکانات گیت از طریق کامند لاین در دسترس هستند و معمولن رابطهای گرافیکی که برای گیت درست شده‌اند سلیقه ای پیاده سازی شده اند و مواردی با نام های دیگری نسب به نام های خود گیت به کار برده شده اند و در کل اگر بخواهیم از گیت بیشتر از fetch، pull، push و کامیت ساده استفاده کنیم اغلب به دستورات کامندلاین نیاز پیدا میکنیم به ویژه موقعی که یک اشتباه انجام شده و میخواهیم آن را درست کنیم، مثل حذف شدن ناخواسته یک شاخه (Branch) ادغام نشده و از این دست. برای اینجا یک ویرایشگر ساده مثل همان Vim گزینه مناسبیست. در درجه دوم هم نوت پد را توصیه میکنم چرا که معمولن در این موارد کار پیچیده ای نمیخواهیم انجام دهیم و برای یک کار پیچیده مثل رفع تداخل ها (Conflict) هم یک ویرایشگر پیشرفته تر لازم خواهیم داشت که موقع رفع تداخل ها میتوانیم انتخاب کنیم.</p><p>&nbsp;</p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-editor.PNG"></p><h2>&nbsp;انتخاب نام انشعاب اصلی</h2><p>در مرحله بعد هم نام شاخه (Branch) اصلی را میتوانیم انتخاب کنیم که به صورت کلاسیک همیشه Master بوده است ولی الان بیشتر بعد از جریان black lives matter&nbsp; و همینطور جامع تر بودن مفهوم main در فرآیندهای کاری حال حاضر و نحوه ای که از گیت استفاده میشود بیشتر&nbsp; مورد توجه قرار گرفته و گیت هاب هم به استفاده از main روی آورده، پس اینجا میتوانیم main را انتخاب کنیم ولی در کل موضوع خیلی مهمی نیست. البته trunk&nbsp; و development هم برای نام برنچ اولیه متداول هستند ولی main درحال حاضر&nbsp; طرفداران بیشتری دارد. و واقعیت هم این است که رابطه برنچ ها در فرآیندهای متداول در گیت دیگر به صورت master/slave نیست.</p><p>&nbsp;</p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-main-branch.PNG"></p><h2>&nbsp;قرار گیری در ابزار git در Path ویندوز</h2><p>مرحله بعد هم تنظیم Path در ویندوز است که چند گزینه برای آن داریم اول اینکه git فقط در bash تعریف شود و Paths ویندوز دست نخورده بماند. اما بهتر است گیت در ابزارهای مختلف به راحتی در دسترس باشد. بعضی اوقات در powershell لازم میشود و بعضی وقتها در cmd، دست خوردن path هم مشکلی ایجاد نمیکند پس همان گزینه دوم گزینه مناسبیست، اما گزینه سوم هم برعکس گزینه اول میخواهد همه چیز را دستکاری کند و خودش هم اخطار داده که کامندها و ابزار ویندوز مثل find و sort با معادل یونیکسی آنها جایگزین میشوند که گزینه جالبی به نظر نمی آیند مگر اینکه لینوکسی باشید که اگر لینوکسی باشید هم که دیگر دلیل نصب گیت فور ویندوز&nbsp; چیست؟! 😉 .</p><p>&nbsp;</p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-path.png"></p><h2>&nbsp;انتخاب کلاینت SSH</h2><p>در مرحله بعد هم تعیین میکنیم که گیت از ssh.exe&nbsp; که به همراه دارد استفاده کند یا از یک ssh کلاینت دیگر که در Path قرار گرفته است. معمولن در ویندوز برای ssh از bitwise ssh استفاده میکنیم ولی&nbsp; دلیلی ندارد گیت را هم مجبور کنیم از آن استفاده کند همان ssh خودش را استفاده کند بهتر است.</p><p>&nbsp;</p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-sshtool.PNG"></p><h2>&nbsp;انتخاب SSL</h2><p>مرحله بعد انتخاب SSL هست که انتخاب نسبتن مهمیست. گزینه اول این است که از OpenSSL که یک کتابخانه خیلی معروف برای SSL هست استفاده شود یا از پیش فرض ویندوز که نامش windows secure channel هست. اهمیت این موضوع زمانی مشخص میشود که بخواهید از یک CA (Certificate Authority) شرکتی استفاده کنید اگر گزینه اول را انتخاب کرده باشیم حتا در صورتی که ویندوز CA شرکت را به عنوان معتبر بشناسد ولی چون گزینه اول با trustedهای خودش چک میکند کانکشن اس اس ال را نامعتبر تشخیص میدهد و ممکن است موقع استفاده از گیت به این خطا بر بخوریم</p><p>SSL Certificate problem: unable to get local issuer certificate.</p><p><br></p><p>البته با این دستور میتوانیم بعد از نصب گیت هم این تنظیم را تغییر بدهیم&nbsp;</p><p>git config --global http.sslbackend schannel</p><p>&nbsp;و مشکل را رفع کنیم ولی خوب همین الان این تنظیم را انجام بدهیم بعدن در وقت سرچ کردن در Stackoverflow&nbsp; نجاتمان میدهد و کمتر به خودمان و گیت ناسزا خواهیم گفت.</p><p>&nbsp;</p><p>&nbsp; <img src="/media/blog-install-git/git-for-windows-installer-ssl.PNG"></p><p><span style="white-space: normal">	</span></p><h2>انتخاب کاراکترهای پایان خط یا Line Ending</h2><p>مرحله بعد line ending&nbsp;هست که در محیطهایی که برنامه نویسان از سیستم عامل های متفاوتی استفاده میکنند اهمیت ویژه دارد چرا که هر سیستم عامل ساختار خودش را برای تعیین آخر خط دارد</p><p><br></p><p>- Windows - Lines end with both a &lt;CR&gt; followed by a &lt;LF&gt; character</p><p>- Linux&nbsp; - Lines end with only a &lt;LF&gt; character</p><p>- Macintosh (Mac OSX) - Lines end with only a &lt;LF&gt; character</p><p>- Macintosh (old) - Lines end with only a &lt;CR&gt; character</p><p><span style="white-space: normal">	</span></p><p>اگر اینجا مشکلی ایجاد شود به Conflictها عجیب و غریب برمیخوریم پس بهتر است از همان گزینه پیش فرض ویندوز استفاده کنیم که گزینه اول هست.</p><p>&nbsp;</p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-line-ending.PNG"></p><h2>انتخاب ترمینال</h2><p>در مرحله بعدی دو انتخاب داریم برای ترمینالی که گیت از آن استفاده میکند یکی MinTTY هست که همانطور که در همین مرحله توضیح داده شده است برخلاف cmd یونیکد را ساپورت میکند، و اسکرول به عقب هم مثل cmd محدود نیست. در نتیجه گزینه مناسبتری به نظر میرسد (هرچند نمیدونم کجا بازش میکنه)</p><p><span style="white-space: normal">	</span></p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-terminal.PNG"></p><h2>رفتار پیش فرض هنگام git pull</h2><p>در این مرحله نیز باید رفتار پیش فرض موقع pull کردن را مشخص کنیم. به خاطر اینکه کنترل بیشتری روی کامیتها داشته باشیم و کامیتی که انتظارش را نداریم موقع pull کردن اضافه شود و تاریخچه را شلوغ کند، بهترین گزینه به نظر گزینه آخر است که اگر میشد fast-forward میکند اگر نشد هم که خطا میدهد تا رسیدگی کنیم و ببینیم داستان چیست. البته rebase هم گزینه جذابیست شاید بعدن نظرم در موردش عوض شد.</p><p><br></p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-pull-behavior.PNG"></p><h2>انتخاب Credential Manager</h2><p>مرحله بعدی انتخاب credential manager&nbsp; هست که میتوانیم استفاده کنیم یا استفاده نکنیم که خوب none گزینه مناسبی به نظر نمیاد چرا که هیچ کس نمیخواد هر بار که چیزی را از ریموت pull یا push میکند دوباره نام کاربری و گذرواژه اش را وارد کند. خوب پس از آن استفاده میکنیم و گزینه Git Credential Manager را انتخاب میکنیم که به نام GCM هم شناخته میشود و اگر در تنظیمات ویژوال استادیو هم خواستید تغییرش دهید با همین نام GCM پیدایش میکنید.</p><p><br></p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-gcm.PNG"></p><h2>سایر گزینه ها</h2><p>این مرحله هم که فعال سازی کش و لینکهای سمبلیک هستند که فعال سازی کش روی پرفورمنس تاثیر به سزایی دارد برای همین فعالش میکنیم. سمبلیک لینک هم اگر فعال کنیم برای ریپوهایی که جدید ایجاد میکنیم فعال میشود فقط و کاری به ریپوهای قبلی ندارد.</p><p>https://github.com/git-for-windows/git/wiki/Symbolic-Links</p><p><span style="white-space: normal">	</span></p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-extra.PNG"></p><h2>امکانات آزمایش گیت&nbsp;</h2><p>مرحله بعد هم که فعال سازی استفاده از امکانات آزمایشی هست که در اینجا دو مورد داریم. اولی استفاده از شبه کنسول ها هست که گویا هنوز دارای باگ است و برای ........هست</p><p>دومی هم مانیتور فایل سیستم هست که سعی دارد پیدا کردن وضعیت فعلی گیت را راحتتر کند. که خوب خیلی به کار ما نمیان و وقتی از حالت آزمایشی خارج شدند شاید یک گوشه چشمی به آن انداختیم</p><p><br></p><p>&nbsp;<img src="/media/blog-install-git/git-for-windows-installer-experimental-options.PNG"></p><p><span style="white-space: normal">	</span></p><p>همانطور هم که در تصویر میبینیم مرحله بعد نصب هست و میرویم که نصب انجام شود و پیام نهایی تکمیل نصب را ببینیم.</p><h2>مرحله پایانی&nbsp;</h2><p>حالا یک گیت داریم که میتوانیم شروع کنیم به کار کردن با آن و در یک محیط با چند برنامه نویس همکاری داشته باشیم.</p><p><span style="white-space: normal">	</span></p><p><span style="white-space: normal"><span style="white-space: pre">	</span> <img src="/media/blog-install-git/git-for-windows-installer-complete.PNG"></span></p><p><span style="white-space: normal">	</span></p><p>برای امتحان آن هم میتوانید کامند لاین را باز کرده و دستور&nbsp;</p><p>Git –-version را اجرا کنید که خیالتان راحت شود که گیت به طور کامل نصب شده است.</p><p>و برای انجام پروژه ها آماده هستید.</p><p><br></p>
</div>]]></description>
      <pubDate>Sun, 03 Aug 2025 08:47:02 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D9%86%D8%B5%D8%A8-git</guid>
    </item>
    <item>
      <title>import/export در جاوا اسکریپت</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/import-export-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA</link>
      <description><![CDATA[<p>معمولن وقتی با جاوا اسکریپت یا تایپ اسکریپت برنامه مینویسیم به کتابخانه های مختلفی نیاز داریم که آن ها را برای استفاده در کدمان import میکنیم اما ببینیم کلیدواژه import چه قابلیت هایی دارد و چطور باید از آن استفاده کنیم.</p><p>با import میتوانیم کلاس ها یا متدهایی که توسط یک ماژول اکسپورت شده اند را در کد خودمان استفاده کنیم. ضن اینکه باید توجه داشته باشیم import استاتیک با شبه تابع import() هم تفاوت هایی دارد و یکسان نیستند.</p><p><br></p><p>از import&nbsp; به شکل های زیر میتوان از آن استفاده کرد</p><p>import defaultExport from "module-name";</p><p>که defaultExport نام آیتمی است که از آن ماژول به صورت دیفالت اکسپورت شده است. یعنی به چنین شکلی:</p><p>export default defaultExport;</p><p>که در ادامه شکل های دیگر default export هم خواهیم دید.</p><p>import * as name from "module-name";</p><p>در مثال name در واقع نام ماژولی که ایمپورت کرده‌ایم میشود و شبیه یک namespace عمل میکند، که پیش از استفاده از ممبرهایی که ماژول اکسپورت کرده از این نام استفاده میکنیم. مثلن اگر آن ماژول ممبری به نام aUsefulFunction را اکسپورت کرده باشد، پس از ایمپورت کردن آن به شکل بالا به صورت زیر قابل استفاده خواهد بود.</p><p>name.aUsefulFunction();</p><p>import { export1 } from "module-name";</p><p>ایمپورت کردن یک ممبر خاص از یک ماژول</p><p><br></p><p>کلن به چی میگیم ماژول؟</p><p>import { export1 as alias1 } from "module-name";</p><p>میتوانیم به ممبری که ایمپورت میکنیم یک نام مستعار هم بدهیم</p><p><br></p><p>سینتکسهای دیگری هم وجود دارند که به این شکل هستند</p><p>import { export1 , export2 } from "module-name";</p><p>import { export1 , export2 as alias2 , [...] } from "module-name";</p><p>import defaultExport, { export1 [ , [...] ] } from "module-name";</p><p>همینطور که میبینیم این امکان وجود دارد که یک اکسپورت پیش فرض در ماژول داشت که میشود به این شکل ایمپورت کرد، این اکسپورت میتواند یک آبجکت، فانکشن یا یک کلاس باشد</p><p>همچنین میشود این دیفالت با بقیه ایمپورت ها هم ترکیب شود که در این صورت باید قبل از بقیه ظاهر گردد</p><p>import defaultExport, * as name from "module-name";</p><p>import "module-name";</p><p>این ایمپورت زمانی به کار میرود که نیاز به چیزی که اکسپورت شده نداشته باشیم و در واقع به اثرات جنبی این ماژول نیاز داشته باشیم، یعنی&nbsp; اثراتی که لود شدن آن روی اسکوپ گلوبال می گذارد. البته توصیه میشود که در ماژول چنین ساید افکت هایی نداشته باشیم ولی روی بعضی از لایبرری هایی که استفاده میکنیم کنترلی نداریم</p><p><br></p><p>var promise = import("module-name");</p><p>این هم که ایپورت داینامیک هست که کمک میکند یک ماژول را به صورت داینامیک لود کنیم به عنوان مثال فقط تحت شرایطی اقدام به لود یک ماژول کنیم که این کار با ایمپورت استاتیک قابل انجام نیست.</p><p><br></p><p>**اکسپورت**</p><p><br></p><p>حالا ببینیم که اکسپورت کردن از ماژول چه شرایطی دارد و چطور میتواند انجام شود</p><p>طبق تعریفی که در سایت موزیلا عنوان شده اکسپورت برای استخراج live bindings به توابع، آبجکت ها و مقادیر ابتدایی از یک ماژول به کار میرود تا در یک برنامه دیگر با ایمپورت بتوانیم آنها را استفاده کنیم. مقدار یک ایمپورتد بایندینگ ممکن است توسط ماژولی که آن را اکسپورت کرده تغییر کند و این تغییر در ماژولی که آن را ایمپورت کرده قابل مشاهده خواهد بود.</p><p>ماژولهایی که اکسپورت شده اند در حالت strict mode خواهند بود. فارق از اینکه اکسپلیسیت عنوان شده باشد یا خیر.</p><p>همچنین اکسپورت در اسکریپتهای امبد شده قابل استفاده نیست.</p><p><br></p><p>معنی لایو بایندینگ این است که تغییر در ماژول ایمپورت شده در ماژولی که آن را ایمپورت کرده مشاهده میشود و مثل کپی نیست برخلاف چیزی که به عنوان مثال در&nbsp; CommonJS اتفاق می افتد</p><p>https://stackoverflow.com/a/57552682/1306720</p><p><br></p><p>دو نوع اکسپورت وجود دارد</p><p><br></p><p><br></p><p><br></p><p>اکسپورت دارای نام که هر ماژول میتواند چند اکسپورت با نام داشته باشد و اکسپورت پیش فرض که هر ماژول فقط یک اکسپورت پیش فرض میتواند داشته باشد</p><p><br></p><p>// Exporting individual features</p><p>export let name1, name2, …, nameN; // also var, const</p><p>export let name1 = …, name2 = …, …, nameN; // also var, const</p><p>export function functionName(){...}</p><p>export class ClassName {...}</p><p><br></p><p>// Export list</p><p>export { name1, name2, …, nameN };</p><p><br></p><p>// Renaming exports</p><p>export { variable1 as name1, variable2 as name2, …, nameN };</p><p><br></p><p>// Exporting destructured assignments with renaming</p><p>export const { name1, name2: bar } = o;</p><p><br></p><p>// Default exports</p><p>export default expression;</p><p>export default function (…) { … } // also class, function*</p><p>export default function name1(…) { … } // also class, function*</p><p>export { name1 as default, … };</p><p><br></p><p>// Aggregating modules</p><p>export * from …; // does not set the default export</p><p>export * as name1 from …; // ECMAScript® 2O20</p><p>export { name1, name2, …, nameN } from …;</p><p>export { import1 as name1, import2 as name2, …, nameN } from …;</p><p>export { default, … } from …;</p><p><br></p><p>اکسپورت دارای نام وقتی به کار می آید که چند تا مقدار را میخواهیم اکسپورت کنیم و وقتی میخواهیم ایمپورت کنیم باید آن ها را حتمن در آکولاد بنویسیم و با همان نامی که اکسپورت شده اند.</p><p><br></p><p>اما یک اکسپورت دیفالت میتواند به هرنامی ایمپورت شود</p><p>مثلن:</p><p>// file test.js</p><p>let k; export default k = 12;</p><p><br></p><p>// some other file</p><p>import m from './test'; // note that we have the freedom to use import m instead of import k, because k was default export</p><p>console.log(m);&nbsp; &nbsp; &nbsp; &nbsp; // will log 12</p><p><br></p><p>التبه میشود اکسپورتها را برای جلوگیری از تداخل&nbsp; نام با&nbsp; as تغییر نام داد&nbsp;</p><p>export { myFunction as function1,</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;myVariable as variable };</p><p><span style="white-space: pre">				</span>&nbsp;</p><p>یک کار دیگر که میشود با اکسپورت کرد این است که از ماژول دیگری ایمپورت کنیم و بعد اکسپورت کنیم، که چنین کاری برای تجمیع یک سری ماژول میتواند مفید باشد</p><p>با چنین سینتکسی</p><p>export { default as function1,</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;function2 } from 'bar.js';</p><p><span style="white-space: pre">				</span>&nbsp;</p><p>که معادل موارد زیر خواهد بود</p><p>import { default as function1,</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;function2 } from 'bar.js';</p><p>export { function1, function2 };</p><p>با این تفاوت که در اولی موارد fucntion1 , function2 قابل استفاده در همین ماژول نیستند و مستقیمن اکسپورت شده اند</p><p>و اینکه در مورد مقادیر پیش فرض (default) نمیشود چنین کاری کرد</p><p><br></p><p>import DefaultExport from 'bar.js'; // Valid</p><p><br></p><p>export DefaultExport from 'bar.js'; // Invalid</p><p><br></p><p>پس راه درست اکسپورت کردن به صورت زیر است</p><p>export { default as DefaultExport } from 'bar.js';</p><p><br></p><p>یک نکته این که ماژولی که اکسپورت دارد را وقتی میخواهیم با تگ اسکریپت لود کنیم حتمن تایپ آن را باید module ست کنیم تا درست تفسیر شود</p><p>&nbsp;و اینکه یک ماژول رو نمیشود با file:// URL&nbsp;</p><p>&nbsp;لود کرد و با خطای CORS&nbsp; مواجه میشویم و باید از HTTP Server&nbsp; استفاده شود.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>مرجع:</p><p>https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import</p><p><br></p>]]></description>
      <pubDate>Mon, 14 Nov 2022 15:00:41 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/import-export-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA</guid>
    </item>
    <item>
      <title>امکانات جدید در .net 6 و C# 10</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A7%D9%85%DA%A9%D8%A7%D9%86%D8%A7%D8%AA-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-net-6-%D9%88-c-10</link>
      <description><![CDATA[<p>&lt;div dir="auto"&gt;</p><p>چند وقت پیش بود که "رائول بنداری" دستش را روی دکمه ریلیز فشارداد و نسخه 6 فریم ورک دانت نت را همزمان با رویداد دات نت کانف منتشر کرد. ریلیزی که به خاطر حذف یک امکان و مختص کردنش به ویژوال استادیو خبر ساز شده بود و جامعه اوپن سورس را نگران کرده بود.</p><p><br></p><p>اما ببینیم تو دات نت 6 چه کارهایی انجام شده و امکاناتی که برای بهتر کد نوشتن اضافه شده چه مواردی هستند.</p><p><br></p><p>مهمترین کاری که در دات نت 6 انجام شده، اضافه شدن maui و فلانه اما ببینیم تو c# که در واقع زبان اصلی برنامه نویسی دات نت است چه اتفاقاتی افتاده.</p><p><br></p><p>برخی از تغییرات این نسخه از دات نت در زیر لیست شده که به مهمترین های اونها بیشتر می پردازیم.</p><p><br></p><p>* 1 Minimal API Framework</p><p>* 2 DateOnly and TimeOnly Types</p><p>* 3 LINQ OrDefault Enhancements</p><p>* 4 IEnumerable Chunk</p><p>* 5 SOCKS Proxy Support</p><p>* 6 MaxBy/MinBy</p><p>* 7 اضافه شدن record structs</p><p>* 8 بهبود structure typeها</p><p>* 9 دستکاری stringها با handler</p><p>* 10 global using</p><p>* 11 namespace در یک فایل بدون نیاز به آکولاد</p><p>* 12 الگوهای extended propery</p><p>* 13 بهبود عبارات لامبدا</p><p>* 14 دستکاری constantهخای از نوع رشته ای</p><p>* 15 تعریف و تخصیص در یک عبارت deconstruction</p><p>* 16 بهبود تخصیص مشخص</p><p>* 17 AsyncMethodBuilder بر روی متدها</p><p>* 18 callerArgumentExpression attribute diagnostics</p><p>* 19 بهبود پراگمای #line</p><p>* 20 Generic attributes</p><p>* 21 Priority Queue</p><p>* 22 file namespace</p><p><br></p><p><br></p><p>**1 Minimal API Framework**</p><p><br></p><p>مینیمال api شاید خیلی اتفاق خاصی نباشد چرا که فقط api زدن رو ساده تر و بدون کدهای اضافی کرده و شاید انگیزه اصلی آن رقابت با nodejs در سرعت ایجاد یک api و شوآف تعداد خط کد بوده، که البته نتیجه هم خوب، تمیز و ساده در آمده.</p><p>top levle programs در دات نت 5 معرفی شده بود که میتوانستیم فایل پروگرام را بدون نوشتن تابع Main و سایر مراسم معمول سی شارپ از جلمه فضای نام یک کنسول اپلیکیشن ساده بسازیم&nbsp;</p><p>به چنین شکلی:</p><p>تصویر ساختار پروژه</p><p>و تصویر کد Main</p><p>همان مفهوم الان در دات نت 6 بیشتر توسعه داده شده</p><p>با این دستور یک پروژه وب میسازیم</p><p>اگر به کد ایجاد شده نگاهی بیندازیم، میبینیم که پروژه ساخته شده شامل چند فایل بیشتر نیست فایل csproj یک فایل apsettings.json و یک فایل program که با 4 خط کد یک ای پی آی را شکل میدهند و میتوانیم اچ تی تی پی رکوئست ارسال کرده&nbsp; و پاسخ بگیریم. و خبری هم از تزریق وابستگی و تنظیمات نیست. که البته میتوان آن هار اضافه کرد ولی با همین چند خط یک وب اپلیکیشن داریم که کار میکند.</p><p><br></p><p>**2 DateOnly and TimeOnly Types**</p><p>اما این امکان، بسیار مفید است و میتواند کلی دردسرهای کار با datetime را رفع کند و از تنظیم کردن datetime بدون بخش time برای تاریخ هایی که فقط روز معنی دارد ما را نجات بدهد.</p><p>خیلی وقتها نیاز داشتیم فقط با یک تاریخ فارغ از ساعت(زمان) کار کنیم مثلن وقتی که با تاریخ تولد کار میکردیم. معمولن راه حل این بود که ساعت رو به نیمه شب یا ساعت صفر ست میکردیم. خود ما در فریم ورک شرکت&nbsp; متدی را داشتیم به نام ..... که این کار رو برامون بکنه. ولی خوب مشکل مناطق زمانی هم بود که اگر به یک منطقه زمانی دیگر تبدیل میشد ممکن بود یک روز دیگر را نشان دهد در حالی که روز تولد را فارغ از زمان و محل میدونیم یعنی اگر شما تاریخ تولدتون 5فروردین هست آمریکا هم که بروید تاریخ تولدتان همان 5 فروردین می ماند. این با وجودی بود که اکثر دیتابیس ها تاریخ خالی هم داشتند مثلن اس کیو ال سرور تایپ Date را علاوه بر datetime، date و time هم دارد که خوب همگی در سی شارپ به دیت تایم نگاشت میشدند که حالا با معرفی این دو تایپ دیگر نیازی به این کار نخواهد بود.</p><p>این موضوع در مورد تایم دردسر بیشتری داشت مثلن فرض کنید میخواستیم تایم تسکی که هر روز سر یک ساعت خاص قراراست اجرا شود را ذخیره کنیم که البته تا الان از تایم اسپن استفاده میکردیم ولی تایم اسپن هم طراحی شده برای زمان سپری شده نه اینکه برای نگه داشتن یک ساعت خاص باشد مثلن تایم اسپن میتواند ساعتش 25 باشد. مشکل دیگر هم وقتی بود که مثلن رویدادی ساعت 11 شب شروع میشد و 2ساعت ادامه داشت و پس از آن ساعت باید یک صبح می‌شد.</p><p>dateonly شامل منطقه زمانی نیست و مشکلی که در مورد تولد گفتیم پیش نمی آید.</p><p>این خیلی کار با ساعت و تاریخ را ساده تر میکند مثلن isbetween</p><p><br></p><p>**3 LINQ OrDefault Enhancements**</p><p>با این امکان میتونیم بخش orDefault رو تحت کنترل داشته باشیم و تعیین کنیم که default&nbsp; چی باشه غیر از دیفالت تعریف شده خود تایپ ها.</p><p>**4 IEnumerable Chunk**</p><p>این هم چانک کردن یا قسمت کردن یک IEnumerable رو ساده تر میکنه.</p><p>و به جای استفاده از skipو take میتونیم از chunk استفاده کنیم که تمیزتر بشه کدمون و چیز خاص دیگه ای نداره.</p><p>**5 SOCKS Proxy Support**</p><p>استفاده از پراکسی ها برای ما که تو ایران هستیم جدا از استفاده از اینترنت نیست. یکی از پروتکل های پراکسی هم ساکس هست که تا حالا دات نت ازش پشتیبانی نمیکرده ولی تو این ورژن اضافه شده و میتونیم اینطوری ازش استفاده کنیم و خیلی فرق خاصی با مثلن httpsproxy که قبلن استفاده میکردیم نداره.</p><p>**6 MaxBy/MinBy**</p><p>این قابلیت رو میده که ماکسیمم یا مینیم روی یک ویژگی رو پیدا کنیم و لی خود آبجکت رو ریترن کنیم که خوب تمیز تر از سورت کردن و بعد فرست یا لست گرفتن هست.</p><p><br></p><p>**7 Record Structs**</p><p><br></p><p>خیلی پر استفاده نیست ولی خوب طبیعتن وقتی برای کلاس اینو داشتیم برای استراکت هم باید بتونیم استفاده کنیم که در واقع فقط بتونیم با with استراکت ها رو هم استفاده کنیم</p><p><br></p><p>**8 بهبود structure typeها**</p><p>**9 دستکاری stringها با handler**</p><p>**10 global using**</p><p><br></p><p>دستورات using یه سری دستورات بی آزار بالای هر فایل کد C# هستن که کاری بهشون نداریم و اسکرول میکنیم تا برسیم به کلاس و فقط وقتی بهشون توجه میکنیم که کلی با یک باگ ور میریم بعد میفهمیم که وقتی کنترل دات زدیم نیم اسپیس اشتباه رو انتخاب کردیم مثلن به جای اینکه File از نیم اسپیس system.io اضافه کرده باشیم فایل از نیم اسپیس microstoft.aspnet.http اضافه کردیم و متدایی که دنبالشیم نداره. که گاهی وقتی پیش میاد ولی با گلوبال نیم اسپیس اون نیم اسپیسایی که همه جا هستنو دیگه میتونیم ننویسیم مثل system و فلان اضافی هم باشن مشکلی برای کسی پیش نمیاد.</p><p>**11 namespace&nbsp;</p><p>در یک فایل بدون نیاز به آکولاد</p><p><br></p><p>**12 الگوهای extended propery**</p><p>**13 **بهبود عبارات لامبدا</p><p>**14 دستکاری constantهای از نوع رشته ای</p><p>*15 تعریف و تخصیص در یک عبارت deconstruction</p><p>*16 بهبود تخصیص مشخص</p><p>*17 AsyncMethodBuilder بر روی متدها</p><p>*18 callerArgumentExpression attribute diagnostics</p><p>**نیم اسپیس فایل22 **</p><p><br></p><p>خوب گویا دوستان در مایکروسافت به این نتیجه رسیدن که نیم اسپیس یه لول ایندتیشن اضافی رو موجب میشه که هر فایلیو میخوای نگاه کنیم هیچ وقت از سر خط شروع نمیشه پس چه کاریه یه نیم اسپیس بنویسیم و ببندیمش همون اول و تکلیف کل فایل رو مشخص کنیم معمولنم که شروعش اول فایله و پایانش آخر فایل درستم فکر کردن دستشونم درد نکنه&nbsp;</p><p><br></p><p>حالا به جای این&nbsp;</p><p><br></p><p>میتونیم بنویسیم این</p><p><br></p><p><br></p><p>**19 بهبود پراگامای #line**</p><p>این هم خیلی به کار ما نمیاد ولی خوب باعث شده دیباگ بهتری رو تجربه کنیم</p><p><br></p><p>**20 Generic attributes**</p><p>این هم آپشن خوبیه که میتونیم attributeهارو به صورت generic تعریف کنیم</p><p><br></p><p>**21 Priority Queue**</p><p>صف رو مدت هاست در دات نت داشتیم و میدونیم که صف یعنی هرکی اول اومد اول هم خارج میشه FIFO و استک هم که LIFO هست هرکی آخر اومد اول خارج میشه اما صف اولویت یعنی اینکه مهم نیست کی اومده اونی که اولویت بالاتری داره اول خارج میشه. شاید بتونیم بگیم</p><p>whoever comes whenever priority matters که میشه</p><p>WCWPM که اختصاری خوبی در نمیاد پس چیزی نمیگیم بهش&nbsp;</p><p>یا&nbsp;</p><p>whatever in, highest priority out</p><p>که میشه wihpo</p><p>اولویت هم معمولن این طور تعریف میشه که عدد کمتر یعنی اولویت بالاتر 0 بالاترین اولویت. البته میشه اولویت هر جور دیگه تعریف کرد و یه IComparer برای مقایسه پیاده سازی کرد. که مثلن برای سناریوی پیمایش گراف و هزینه مسیر به عنوان اولویت میتونه باشه که بر اساس پرهزینه و کم هزینه پیمایش انجام بشه.</p><p><span style="white-space: pre">	</span></p><p><span style="white-space: pre">	</span>&lt;/div&gt;</p><p><br></p>]]></description>
      <pubDate>Mon, 14 Nov 2022 15:01:03 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D8%A7%D9%85%DA%A9%D8%A7%D9%86%D8%A7%D8%AA-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-net-6-%D9%88-c-10</guid>
    </item>
    <item>
      <title>قراردادهای هوشمند (Smart Contracts)</title>
      <link>http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-smart-contracts</link>
      <description><![CDATA[<p dir="rtl"></p><p>قرادادهای هوشمند مبحث جالبی در حوزه کریپتو کارنسی هاست</p><p>قرادادهای هوشمند مثل قرادادهای معمولی هستند با این تفاوت که توسط کامپیوتر اجرا می شوند. و ضمانت اجرایی آن ها یک برنامه کامپیوتری غیر قابل تغییراست.</p><p><br></p><p>فرض کنید مثلن من ادعا کنم که اگر این بلاگ من 1000 تا کامنت گرفت من 1 میلیون تومان به محک کمک میکنم. این میشود یک قرارداد اما چه ضمانت اجرایی دارد؟ افراد باید به من اعتماد کنند که این کار را میکنم و با اعتماد به من و برای کمک به یک کار خیر در آن مشارکت کنند.</p><p><br></p><p>ولی فرض کنید همین قرار من یک برنامه خودکار باشد که به محض این که تعداد کامنت های این پست به 1000 رسید از حساب من 1میلیون کسر کند و به حساب محک&nbsp;</p><p>&nbsp;واریز کند. یک برنامه که روی ساختار بلاک چین توسط همه قابل مشاهده هست و غیر قابل تغییر هم هست آن وقت دیگر نیازی به اعتماد به من نیست و شبکه قرار را اتوماتیک اجرا میکند. این یک نمونه از اسمارت کانترکت است.</p><p>&nbsp;اما چه کاربردهای دیگری برای قرادادهای هوشمند متصور است؟</p><p>&nbsp;یکی از ویژگی های این قرادادها این است که نیاز به نفر سوم و تضمین قرارداد را حذف میکند.</p><p>&nbsp;</p><p>&nbsp;این پست تکمیل میشود</p><p></p>]]></description>
      <pubDate>Mon, 14 Nov 2022 15:06:55 GMT</pubDate>
      <guid isPermaLink="true">http://vahidnaderi.com/%D8%A8%D9%84%D8%A7%DA%AF/%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-smart-contracts</guid>
    </item>
  </channel>
</rss>