<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های پدرام رمضان زاده</title><link>https://virgool.ir/feed/@m_59540305</link><description></description><language>fa</language><pubDate>2026-11-11 04:56:38</pubDate><image><url>https://files.virgool.ir/upload/users/2762739/avatar/t92REV.jpg</url><title>پدرام رمضان زاده</title><link>https://virgool.ir/@m_59540305</link></image><item><title>توسعه یک پنل حرفه‌ای با Next.js؛ از ساختار پروژه تا مدیریت دسترسی</title><link>https://virgool.ir/@m_59540305/توسعه-یک-پنل-حرفه-ای-با-nextjs-از-ساختار-پروژه-تا-مدیریت-دسترسی-axgsiphvntih</link><description>این نوشته حاصل تجربهای است که هنگام توسعه و تکمیل یک پنل تحت وب با Next.js به دست آوردم. در طول کار، با موضوعاتی مثل ساختاردهی پروژه، اضافه کردن سطح دسترسی جدید، مدیریت Routeها، طراحی Sidebar، کار با فرمها، ارتباط با API و حتی بعضی خطاهای رایج Next.js روبهرو شدم.تصمیم گرفتم بخشی از این تجربه را بهصورت ساده و آموزشی بنویسم؛ بدون ورود به جزئیات یک پروژه خاص، تا این مطالب برای کسانی که روی پروژههای مشابه کار میکنند هم قابل استفاده باشد.هدف این نیست که یک معماری پیچیده و ایدهآل معرفی کنم؛ بیشتر قرار است درباره چند نکته کاربردی صحبت کنیم که در پروژههای واقعی فرانتاند زیاد با آنها مواجه میشویم.اگر با Next.js، TypeScript و App Router کار میکنید یا قصد دارید یک پنل چندسطحی طراحی کنید، احتمالاً بخش زیادی از این تجربهها برایتان آشنا یا مفید خواهد بود.1. چرا ساختار پروژه اهمیت دارد؟یکی از اولین مشکلاتی که در پروژههای بزرگ فرانتاند ایجاد میشود، پراکندگی فایلهاست.برای مثال فرض کنید نرمافزار چند نوع کاربر دارد:کاربر عادیکارشناسمدیر سیستمهرکدام از این کاربران ممکن است صفحات و منوهای متفاوتی داشته باشند، اما در عین حال بخشهایی مانند Header، Sidebar یا سیستم نمایش پیامها بین آنها مشترک باشد.در Next.js App Router میتوان با استفاده از Route Groupها ساختار این بخشها را از یکدیگر جدا کرد.یک ساختار ساده میتواند به شکل زیر باشد:src/&#xA;└── app/&#xA;    ├── (user-panel)/&#xA;    │   ├── layout.tsx&#xA;    │   └── dashboard/&#xA;    │&#xA;    ├── (expert-panel)/&#xA;    │   ├── layout.tsx&#xA;    │   ├── requests/&#xA;    │   └── profile/&#xA;    │&#xA;    └── (admin-panel)/&#xA;        ├── layout.tsx&#xA;        └── dashboard/&#xA;پرانتز در App Router باعث میشود بتوانیم مسیرهای پروژه را از نظر ساختاری دستهبندی کنیم، بدون اینکه الزاماً نام آن گروه در URL نمایش داده شود.2. استفاده از Layout برای جلوگیری از تکرارمعمولاً صفحات یک پنل اجزای مشترکی دارند؛ برای مثال:Sidebar&#xA;Header&#xA;Main Content&#xA;Notifications&#xA;بهجای اینکه این اجزا را در تکتک صفحات قرار دهیم، میتوانیم یک layout.tsx برای پنل ایجاد کنیم.یک نمونه ساده:export default function PanelLayout({&#xA;  children,&#xA;}: {&#xA;  children: React.ReactNode;&#xA;}) {&#xA;  return (&#xA;    &lt;div className=&#34;flex&#34;&gt;&#xA;      &lt;Sidebar /&gt;&#xA;&#xA;      &lt;main className=&#34;flex-1&#34;&gt;&#xA;        {children}&#xA;      &lt;/main&gt;&#xA;    &lt;/div&gt;&#xA;  );&#xA;}&#xA;به این ترتیب تمام صفحات داخل این Route Group بهصورت خودکار Layout مشترک را دریافت میکنند.این روش هم کد را تمیزتر میکند و هم تغییرات آینده را سادهتر خواهد کرد.3. ساخت Sidebar براساس سطح دسترسییکی از نیازهای رایج پنلهای سازمانی این است که کاربران مختلف منوهای متفاوتی مشاهده کنند.بهتر است اطلاعات منو از خود کامپوننت Sidebar جدا باشد.برای مثال:const menuItems = [&#xA;  {&#xA;    title: &#34;داشبورد&#34;,&#xA;    href: &#34;/dashboard&#34;,&#xA;  },&#xA;  {&#xA;    title: &#34;درخواستها&#34;,&#xA;    href: &#34;/requests&#34;,&#xA;  },&#xA;  {&#xA;    title: &#34;پروفایل&#34;,&#xA;    href: &#34;/profile&#34;,&#xA;  },&#xA;];&#xA;سپس Sidebar فقط وظیفه نمایش این اطلاعات را بر عهده داشته باشد.در پروژههای بزرگتر حتی میتوان برای هر نقش مجموعه منوی جداگانه تعریف کرد:const menus = {&#xA;  user: [...],&#xA;  expert: [...],&#xA;  admin: [...],&#xA;};&#xA;با این روش اضافه کردن یک Role جدید به سیستم سادهتر میشود.4. مراقب تداخل Routeها باشیدیکی از نکات مهم Route Groupهای Next.js این است که نام داخل پرانتز بخشی از URL محسوب نمیشود.برای مثال:(user-panel)/profile/page.tsx&#xA;و:(expert-panel)/profile/page.tsx&#xA;ممکن است هر دو به مسیر زیر تبدیل شوند:/profile&#xA;در نتیجه Next.js نمیتواند تشخیص دهد کدام صفحه باید نمایش داده شود.این موضوع میتواند خطایی مشابه زیر ایجاد کند:You cannot have two parallel pages that resolve to the same path&#xA;بنابراین هنگام طراحی ساختار Routeها باید علاوه بر ساختار پوشهها، URL نهایی صفحات را نیز در نظر گرفت.5. اهمیت Export و Import صحیح کامپوننتهایکی دیگر از خطاهای متداول React و Next.js زمانی اتفاق میافتد که default export و named export اشتباه استفاده شوند.اگر کامپوننت به شکل زیر تعریف شده باشد:export default function Sidebar() {&#xA;  return &lt;aside&gt;...&lt;/aside&gt;;&#xA;}&#xA;باید آن را به این شکل Import کنیم:import Sidebar from &#34;./Sidebar&#34;;&#xA;اما اگر بنویسیم:export function Sidebar() {&#xA;  return &lt;aside&gt;...&lt;/aside&gt;;&#xA;}&#xA;Import صحیح آن خواهد بود:import { Sidebar } from &#34;./Sidebar&#34;;&#xA;اشتباه در این قسمت میتواند باعث خطاهایی مانند Element type is invalid شود.6. مدیریت فرمهای بزرگ با react-hook-formدر پنلهای واقعی معمولاً فرمها بخش مهمی از پروژه هستند.استفاده مستقیم از تعداد زیادی useState برای مدیریت فرمهای بزرگ، کد را پیچیده میکند.یکی از راهکارهای مناسب استفاده از react-hook-form است.نمونه ساده:const {&#xA;  register,&#xA;  handleSubmit,&#xA;  watch,&#xA;} = useForm();&#xA;&#xA;const  = (data: FormValues) =&gt; {&#xA;  console.log(data);&#xA;};&#xA;سپس میتوان ورودیها را ثبت کرد:&lt;input {...register(&#34;amount&#34;)} /&gt;&#xA;یکی از قابلیتهای کاربردی watch این است که میتوان تغییر مقادیر فرم را قبل از Submit مشاهده کرد.7. نمایش Preview قبل از ثبت اطلاعاتدر بسیاری از فرمهای مالی، سفارش، رزرو یا درخواست خدمات بهتر است کاربر قبل از ثبت نهایی نتیجه انتخابهایش را مشاهده کند.برای مثال کاربر ممکن است مقداری وارد کند و سیستم قبل از Submit اطلاعاتی مانند موارد زیر را محاسبه کند:مبلغ انتخابشده&#xA;مدت قرارداد&#xA;تعداد پرداختها&#xA;نرخ محاسباتی&#xA;مبلغ هر پرداخت&#xA;جدول پرداخت&#xA;در این حالت جریان رابط کاربری بهتر است به شکل زیر باشد:ورود اطلاعات&#xA;      ↓&#xA;اعتبارسنجی&#xA;      ↓&#xA;محاسبه Preview&#xA;      ↓&#xA;نمایش نتیجه&#xA;      ↓&#xA;تأیید کاربر&#xA;      ↓&#xA;ارسال درخواست&#xA;این طراحی احتمال ثبت اطلاعات اشتباه را کاهش میدهد و تجربه کاربری بهتری ایجاد میکند.8. TypeScript Typeها را از UI جدا کنیداگر API دادهای مانند زیر برگرداند:{&#xA;  &#34;amount&#34;: 100000,&#xA;  &#34;duration&#34;: 12,&#xA;  &#34;installments&#34;: 12&#xA;}&#xA;بهتر است Type مربوط به آن جدا تعریف شود:export type CalculationResult = {&#xA;  amount: number;&#xA;  duration: number;&#xA;  installments: number;&#xA;};&#xA;سپس در کامپوننت:const [result, setResult] =&#xA;  useState&lt;CalculationResult | null&gt;(null);&#xA;این کار چند مزیت دارد:خطاهای برنامهنویسی زودتر مشخص میشوند.ساختار داده API واضحتر میشود.تغییر API راحتتر قابل مدیریت است.قابلیت Auto Complete محیط توسعه بهتر میشود.9. کامپوننتها را بیدلیل زیاد نکنیدComponent-based بودن React به این معنی نیست که هر چند خط کد باید به یک فایل جدا تبدیل شود.برای مثال اگر یک صفحه دارای فرم و یک بخش Preview کوچک است، الزاماً نیازی نیست دهها فایل برای آن ساخته شود.تفکیک زمانی ارزشمند است که کامپوننت:در چند محل استفاده شود،مسئولیت مشخص و مستقلی داشته باشد،بیش از حد بزرگ شده باشد،یا تست و نگهداری جداگانه آن مفید باشد.هدف اصلی باید خوانایی و نگهداری بهتر کد باشد، نه صرفاً افزایش تعداد کامپوننتها.10. ارتباط Frontend و APIیک اصل مهم در توسعه فرانتاند این است که منطق تجاری حساس نباید صرفاً در مرورگر پیادهسازی شود.برای مثال در یک محاسبه مهم، Frontend میتواند اطلاعات را از کاربر دریافت کند، اما نتیجه معتبر بهتر است توسط Backend محاسبه یا تأیید شود.جریان کلی میتواند چنین باشد:Frontend&#xA;   ↓&#xA;User Input&#xA;   ↓&#xA;API Request&#xA;   ↓&#xA;Backend Validation&#xA;   ↓&#xA;Business Logic&#xA;   ↓&#xA;API Response&#xA;   ↓&#xA;Preview&#xA;   ↓&#xA;Final Confirmation&#xA;این تفکیک باعث میشود مسئولیت Frontend و Backend مشخصتر باشد.11. نقش Nginx در استقرار پروژهدر محیط توسعه معمولاً برنامه مستقیماً روی یک Port اجرا میشود:localhost:3000&#xA;اما در محیط Production معمولاً کاربر نباید شماره Port داخلی برنامه را بداند.اینجاست که Reverse Proxyهایی مانند Nginx کاربرد پیدا میکنند.ساختار کلی میتواند چنین باشد:User&#xA;  ↓&#xA;Domain&#xA;  ↓&#xA;Nginx&#xA;  ↓&#xA;Next.js Application&#xA;Nginx درخواستهای ورودی روی پورتهای استاندارد وب را دریافت کرده و آنها را به Port داخلی برنامه هدایت میکند.علاوه بر Reverse Proxy، میتوان از آن برای مواردی مانند SSL termination، تنظیم Headerها، محدودسازی درخواستها و مدیریت چند سرویس روی یک سرور نیز استفاده کرد.ساختار مناسب Routeها، استفاده صحیح از Layout، مدیریت Roleها، طراحی Sidebar، TypeScript، مدیریت فرمها، ارتباط صحیح با API و معماری مناسب استقرار همگی در کیفیت نهایی پروژه تأثیر دارند.اگر بخواهم این تجربه را در یک جمله خلاصه کنم:هرچقدر پروژه بزرگتر میشود، اهمیت ساختار درست بیشتر از نوشتن سریع کد میشود.یک معماری ساده و قابل نگهداری میتواند در آینده زمان زیادی برای توسعه، رفع باگ و اضافه کردن قابلیتهای جدید ذخیره کند.</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Mon, 14 Sep 2026 10:26:06 +0330</pubDate></item><item><title>Decision Tree in Machine learning</title><link>https://virgool.ir/@m_59540305/decision-tree-in-machine-learning-wsjkzdbzbnw5</link><description> ما به بررسی جزئیات الگوریتم درخت تصمیمی می‌پردازیم. ابتدا مفاهیم اولیه این الگوریتم و مزایا و معایب آن را مرور می‌کنیم. سپس به بررسی روش‌های آموزش درخت تصمیمی و نحوه ساخت درخت‌های بهینه می‌پردازیم. در ادامه، به کاربردهای مختلف این الگوریتم در زمینه‌های مختلف از جمله پزشکی، مالی، و صنعتی می‌پردازیم.درخت تصمیم گیری یک الگوریتم supervised algorithms و قدرتمند است که برای Classification استفاده میشود.این درخت دو عنصر دارد که عبارتند از، گره های تصمیم گیری (decision nodes) که داده در آنجا تقسیم می شود، و برگ ها (leaves) که خروجی را از آنها به دست می آوریم.بخش ۱: مفاهیم اولیه درخت تصمیمی در این بخش، به توضیح مفهوم درخت تصمیمی و ساختار آن می‌پردازیم. همچنین، مزایا و معایب استفاده از این الگوریتم در مقایسه با روش‌های دیگر یادگیری ماشین را بررسی می‌کنیم.1.1. مفهوم درخت تصمیمی: درخت تصمیمی یکی از قدرتمندترین و محبوب‌ترین الگوریتم‌های یادگیری ماشین است که در زمینه‌های مختلفی از جمله طبقه‌بندی داده‌ها و پیش‌بینی از آن استفاده می‌شود. تصویری ذهنی که از یک درخت تصمیمی می‌توان داشت، همانند یک دستورالعمل گام به گام است که به ما کمک می‌کند تا با استفاده از ویژگی‌های داده، داده‌ها را به دسته‌های مختلفی تقسیم بندیم و در نهایت یک تصمیم یا پیش‌بینی دقیق انجام دهیم.1.2. ساختار درخت تصمیمی: ساختار یک درخت تصمیمی شامل دو بخش اصلی است: گره‌های تصمیم‌گیری و برگ‌ها. در هر گره تصمیم‌گیری، یک سوال از مجموعه سوال‌های ما از داده‌ها مطرح می‌شود که بر اساس جواب آن سوال، داده‌ها به دسته‌های مختلفی تقسیم می‌شوند. در برگ‌ها، داده‌ها به یک دسته مشخص تعلق می‌گیرند و پیش‌بینی نهایی انجام می‌شود.1.3. مزایا و معایب درخت تصمیمی: استفاده از درخت تصمیمی دارای مزایا و معایبی است. از جمله مزایا می‌توان به قابلیت تفسیر و فهم آسان، عدم نیاز به پیش‌پردازش داده‌ها، و قابلیت کاربردی برای داده‌های گسسته و پیوسته اشاره کرد. اما معایبی نیز وجود دارد مانند حساسیت به تغییرات کوچک در داده‌ها، تمایل به بیش‌برازش در مواقعی که درخت عمیق است، و پرهزینه بودن ایجاد و آموزش درخت‌های پیچیده.بخش ۲: آموزش درخت تصمیمیآموزش درخت تصمیمی یک فرایند مهم و پیچیده است که نیازمند مراحل مشخصی برای ساختن یک مدل دقیق و مفید است. در این بخش، به بررسی جزئیات و مراحل فرایند آموزش درخت تصمیمی می‌پردازیم:2.1. انتخاب ویژگی‌ها: یکی از مراحل اساسی در آموزش درخت تصمیمی، انتخاب ویژگی‌های مناسب برای تقسیم داده‌ها است. این انتخاب بر اساس معیارهایی مانند اهمیت ویژگی‌ها و قابلیت تمایز آنها انجام می‌شود. همچنین، تکراری بودن ویژگی‌ها یا ویژگی‌های بی‌اهمیت نیز باید از مدل حذف شوند.2.2. معیارهای ارزیابی: برای تقسیم‌بندی داده‌ها در هر گره تصمیم‌گیری، نیاز به استفاده از معیارهایی برای ارزیابی کیفیت تقسیم‌بندی است. معیارهای متداول مانند انباشت واریانس (Gini Impurity) و آنتروپی (Entropy) می‌توانند برای این منظور استفاده شوند که با استفاده از آنها بهترین تقسیم‌بندی بر اساس ویژگی‌های مختلف داده‌ها را مشخص می‌کنیم.2.3. روش‌های پیشگیری از بیش‌برازش: یکی از چالش‌های مهم در آموزش درخت تصمیمی، بیش‌برازش (Overfitting) است. بیش‌برازش به معنای ایجاد یک مدل که به طور نامناسب به داده‌های آموزشی پیش‌بینی می‌کند، اما قابلیت عمومی سریع مدل را از دست می‌دهد. برای پیشگیری از بیش‌برازش، می‌توان از روش‌هایی مانند تنظیم پارامترهای مدل، استفاده از مجموعه‌های آموزش و ارزیابی جداگانه، و کاهش عمق درخت استفاده کرد.2.4. ساخت درخت: در این مرحله، با استفاده از معیارهای ارزیابی و ویژگی‌های انتخاب شده، درخت تصمیمی به صورت پیشرونده و بازگشتی ساخته می‌شود. هر گره تصمیم‌گیری بر اساس یک ویژگی انتخاب شده تقسیم می‌شود و به همین ترتیب، درخت از بالا به پایین ایجاد می‌شود تا به برگ‌ها برسیمبخش ۳: کاربردهای درخت تصمیمیکاربردهای درخت تصمیمی در صنایع مختلف بسیار گسترده و متنوع است و از تشخیص بیماری‌ها تا پیش‌بینی رفتار مشتریان و مدیریت ریسک در مالی، این الگوریتم مورد استفاده قرار می‌گیرد. در ادامه به برخی از کاربردهای این الگوریتم در زمینه‌های مختلف می‌پردازیم:3.1. تشخیص بیماری‌ها: یکی از کاربردهای مهم درخت تصمیمی در علوم پزشکی است. این الگوریتم به کمک ویژگی‌های بیماران مانند علایم، نتایج آزمایشات و سابقه پزشکی، می‌تواند برای تشخیص بیماری‌های مختلف از جمله سرطان، بیماری‌های قلبی و عصبی، استفاده شود.3.2. پیش‌بینی موجودی‌ها: درخت تصمیمی به عنوان یک ابزار قوی در صنعت و مدیریت زنجیره تأمین استفاده می‌شود. این الگوریتم می‌تواند با استفاده از ویژگی‌هایی مانند تقاضا، تأخیر تولید و میزان موجودی، موجودی‌های آینده را پیش‌بینی کند و به کاهش هزینه‌ها و بهبود عملکرد زنجیره تأمین کمک کند.3.3. تصمیم‌گیری در بازاریابی: درخت تصمیمی به عنوان یک ابزار مفید در تصمیم‌گیری‌های بازاریابی مورد استفاده قرار می‌گیرد. با استفاده از ویژگی‌هایی مانند ویژگی‌های مشتریان، رفتار خرید، و نوع تبلیغات، می‌توان به بهبود استراتژی‌های بازاریابی، افزایش فروش و جذب مشتریان جدید کمک کرد.3.4. مدیریت ریسک در مالی: درخت تصمیمی به عنوان یک ابزار قوی برای مدیریت ریسک در بازارهای مالی استفاده می‌شود. با تحلیل ویژگی‌های مختلف بازار مانند قیمت سهام، نرخ بهره، و شاخص‌های اقتصادی، می‌توان به پیش‌بینی رخدادهای مهم مانند رشد یا نزول بازار، و اتخاذ تصمیمات مناسب برای مدیریت ریسک پرداخت.</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Mon, 08 Apr 2024 13:50:15 +0330</pubDate></item><item><title>مرور کتاب نبرد من</title><link>https://virgool.ir/@m_59540305/مرور-کتاب-نبرد-من-cweho22b3pju</link><description>به نام خدادر کتاب &#34;نبرد من&#34;، آدولف هیتلر رهبر نازیست آلمان به عنوان نویسنده کتاب با تفکر ناسیونالیستی سعی در ارائه جوانب مختلف زندگی شخصی و حرفه‌ای و تفکرات سیاسی خود را داشته است. این کتاب، یکی از سندهای قابل اعتنا با رویکرد زندگی نامه در دهه‌های ۱۹۲۰ و ۱۹۳۰ می باشد که در آن دهه نقش بسزایی در ترویج ایدئولوژی نازیسم در اروپا داشته است.از جمله جنبه‌های جذاب کتاب، شخصیت ناسازگار هیتلر با خانواده و اطرافیانش می باشد که با جزئیات توضیح داده شده و بیان ناسازگاری محیطی به خواننده کمک می کند تا عقاید و اندیشه‌های هیتلر در طول زمان را بهتر درک نماید. اغراق‌های او درباره شخصیت خود و تأثیرگذاری زیادش بر محیط، نشان‌دهنده یک خودپرستی ژرف و افراطی است که به وضوح از میزان اهمیتی که به خودش می‌دهد، حکایت می‌کند و خواننده او را شخص مغرور و خودمحور می یابد.نقش و تاثیر معلمان و محیط در دوران کودکی در شکل‌گیری شخصیت هیتلر نیز یک نقطه اساسی در این کتاب است. جملاتی همچون &#34;خون آلمانی که برتر از بقیه است در رگ‌های ما جریان دارد&#34;، نشان‌دهنده اهمیت آموزه‌هایی است که از معلمان دریافت کرده و چگونگی تأثیر آن بر اندیشه‌های نازی او را تبیین می‌کند.به علاوه، تمرکز کتاب بر روی موقعیت سیاسی و اجتماعی آلمان، از دهه ۱۹۲۰ تا آغاز دهه ۱۹۳۰ از منظر هیتلر با جامعه شناختی کارگری است و این رویکرد ناشی از چالش‌هایی است که هیتلر پس از سرخوردگی در عدم ورود به دانشگاه هنر و پیوند او با جامعه کارگری می باشد.نقد به سیاست آلمان و اتحادهای بعد از جنگ جهانی اول، یکی از جنبه‌های پررنگ کتاب است. هیتلر با تحلیل بر مقررات و پیمان‌های ورسای، نگاهی نقادانه به اوضاع آلمان پس از جنگ دارد و معتقد است که این وضعیت تحریم‌ها و شرایط دشوار را برای آلمان ایجاد کرده است و آن را در پیوند با سیاست های آلمان در اروپای شرقی می داند.  هیتلر به تعاملات با کشورهای شرق اروپا، به ویژه شوروی، را به تفصیل بررسی می‌کند. تأثیر این تعاملات بر دیدگاه او به شرق به عنوان یک منطقه حیاتی برای آلمان نیز مورد بررسی قرار می‌گیرد.انتهای کتاب به موضوع &#34;حق دفاع از خود&#34; اختصاص دارد که در آن هیتلر در مقابله با تحریم های ناشی از قرارداد ورسای به مسائل نظامی و امنیتی آلمان می‌پردازد. او با اعتقاد به حق دفاع از خود به عنوان یک حق اساسی، توجیه تقویت نیروهای نظامی و تسلیحات را به عنوان ابزاری برای حفظ استقلال آلمان مطرح می‌کند.بررسی اجمالی کتاب نشان می دهد که همه زمامداران و حاکمان با رویکرهای مختلف برای اعمال قدرت نیاز به سرمایه های اجتماعی دارند و در این راستا شخص دیکتاتوری همچون هیتلر از این مهم غافل نبوده و برای جلب سرمایه اجتماعی جهت توسعه تفکرات نازیسم سعی در تغییر بینش مردم آلمان جهت همراهی با تفکراتش را داشته است، کتاب مورد بحث، همراه با سخنرانی های آتشین هیتلر در میان طرافدارنش، نشان می دهد موفقیت های اولیه او در جنگ جهانی دوم، همراهی مردم به عنوان سرمایه های اجتماعی بوده که ایشان به مرور زمان با تغییر بینش مخاطبان(احصاء غرور ملی از دست رفته در جنگ جهانی اول) ، تغییر رفتار آنها را حاصل نموده است. نتیجه گیری از این کتاب را می توان در یک جمله خلاصه کرد.تغییر در بینش جهت تغییر در نگرش برای تغییر در رفتار = تولید قدرت</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Sat, 13 Jan 2024 20:08:26 +0330</pubDate></item><item><title>MailKit</title><link>https://virgool.ir/@m_59540305/mailkit-vkmn4n2ttopw</link><description>به نام خداسلام اگه قصد نوشتن یک email service  با ASP.NET Core رو داشته باشید احتمالا اسم  MailKit  به گوشتون خورده خب بیاین یکم در موردش صحبت کنیم.اصلا Mailkit چیه؟یک کتابخانه متن باز است که در  Windows, MAC, Linux,IOS,Android قابل استفاده هست. برای به دسترسی به کتابخانه های  معروف مربوط به انتقال ایمیل مانند SMTP هم از استفاده MailKit  میکنیم.نصب MailKit :در ویژوال استادیو از پنل سلوشن   Nuget Package manager را  مانند تصوری زیر انتخاب میکنیم .مرحله بعد در Browse  مانند شکل زیر MailKit را نصب میکنیم.حالا که MailKit  رو نصب کردیم بریم سراغ اصل کار.باید یه سری از تنظیمات SMTP Server  رو انجام بدیم. این جزئیات نباید در برنامه هاردکد شود زیرا ممکن است در طول زمان تغییر کنند و باید به روز شوند. همچنین نگهداری آن را برای بقیه برنامه نویسان آسان تر می کند این تنظیمات در فایل appsettings.json قابل دسترسی است و به صورت زیر تعریف میشوند. { &#34;Logging&#34;: {    &#34;LogLevel&#34;: {      &#34;Default&#34;: &#34;Information&#34;,      &#34;Microsoft.AspNetCore&#34;: &#34;Warning&#34;    }  },  &#34;AllowedHosts&#34;: &#34;*&#34;,  &#34;MailSettings&#34;: {    &#34;DisplayName&#34;: &#34;pedram&#34;,    &#34;From&#34;: &#34;support&#34;,    &#34;Host&#34;: &#34;smtp.server.email&#34;,    &#34;Password&#34;: &#34;yourPass&#34;,    &#34;Port&#34;: 587,    &#34;UserName&#34;: &#34;yourmail@ethereal.email&#34;,    &#34;UseSSL&#34;: false,    &#34;UseStartTls&#34;: true  }}</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Tue, 15 Aug 2023 09:29:45 +0330</pubDate></item><item><title>SMTP</title><link>https://virgool.ir/@m_59540305/smtp-jalr3urtewtt</link><description>سلام هممون برای ارسال پیام از ایمیل استفاده کردیم اما این پیام به صورت نفر به نفر انجام می شود اما اگر بخواهیم به تعداد بالایی افراد پیام بدیم باید چی کار کنیم ؟پروتکل smtp،مخفف simple mail transfer protocol که به معنای پروتکل ساده انتقال ایمیل است .SMTP برای کاربران امکان ذخیره نامه‌ها را روی یک سرور یا دانلود آن ها را از سرور فراهم می‌کند.باید بدانیم که smtp server یک سرور نیست و نمیتوانید آن را با سرور مقایسه کنید. اگر بخواهیم بگوییم SMTP چیست باید بگوییم در واقع یک برنامه است که امکان ارسال و دریافت ایمیل را فراهم می‌کند. اما بعضا با عبارت سرور SMTP نام گذاری می شود. تعداد زیادی سرور SMTP به صورت رایگان وجود دارد که می‌توان به خوبی از آنها استفاده کرد.به عبارت ساده‌تر، سرور SMTP، مانند وب سرور یک رایانه است که مانند مسیریاب عمل می‌کند. هنگامی که پیام‌های پست الکترونیکی را از کاربران دریافت می‌کند آنها را به گیرندگان مورد نظر می‌فرستند.سرورهای SMTPاز پروتکل‌های ساده انتقال پست الکترونیکی یا برنامه ارسال پست الکترونیکی یونیکس استفاده می‌کنند. اغلب پیام‌ها باید از میان سرورهای مختلفی عبور کنند تا به مقصدشان برسند.حالا این بین به دو اصطلاح IMAP و POP3 بر میخوریم.این دو پروتکل‌های دریافت (Pull) ایمیل از گیرنده از سمت سرور ایمیلی خود گیرنده است؛ بنابراین این دو پروتکل انتقال ایمیلی را محدود می‌کنند و این کار را فقط برای سرورهای ایمیلی تاییدشده انجام می‌دهند. پروتکل‌های IMAP وPOP برای ارتباطات خارج از شبکهی شما استفاده نمی‌شوند در حالی که SMTP پروتکلی است که برای ارسال (Push) ایمیل از یک سرور ایمیلی ناشناخته به سرور دیگری استفاده می‌شود.</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Sun, 13 Aug 2023 09:22:30 +0330</pubDate></item><item><title>await in C sharp</title><link>https://virgool.ir/@m_59540305/await-in-c-sharp-lobop8gfu5os</link><description>اکثرا در برنامه نویسی برای ایجاد یک کد asynchronousیا concurrentاز threadاستفاده می کنیم . تو زبان C# یه راه ساده تر وجود داره که بدون نیاز به مدیریت thread ها این کار را انجام بدیم. برای این کار از awaitاستفاده می کنیم.در زبان برنامه‌نویسی C#، کلمه کلیدی `await` به همراه`async` برای ایجاد کد همروند (concurrent) و انجام عملیات‌های ناهمگام (asynchronous) استفاده می‌شود. این ابزار برای انجام عملیات‌های طولانی‌مدت، مانند فراخوانی وب سرویس‌ها یا دسترسی به پایگاه داده‌ها، بدون مسدود کردن رشته اصلی برنامه به کار می‌رود.شیوه  کارش هم به شکل زیره:1. ابتدا تابعی که می‌خواهید در آن عملیات ناهمگام انجام دهید، با استفاده از کلمه کلیدی `async` اعلان می‌شود. به این ترتیب، می‌توانید در داخل تابع از `await` استفاده کنید.2. با استفاده از `await` می‌توانید تماس ناهمگام را با یک تابع یا متد انجام دهید که از تابع‌ها یا متدهای ناهمگامی مثل `Task` یا `Task&lt;T&gt;` برگشتی دارند. این متدها معمولاً یک عملیات طولانی‌مدت را شروع کرده و یک نتیجه نهایی را به صورت ناهمگام بازگردانده یا همچنین بدون بازگشت نتیجه نیز به کار می‌روند.3. وقتی از `await` استفاده می‌کنید، اجرای کد در این نقطه متوقف می‌شود و نخ اجرایی (thread) به ادامه اجرای دستورات دیگر منتقل نمی‌شود تا تابع ناهمگام به اتمام برسد.4. زمانی که تابع ناهمگام به اتمام رسید و نتیجه نهایی آماده شد، اجرای نخ اجرایی به خط بعد از `await` باز می‌گردد و شما می‌توانید نتیجه را به کار ببرید.در واقع، استفاده از `await` باعث می‌شود نخ اجرایی اصلی به طور غیرهمگامانه وارد حالت انتظار بیافتد تا عملیات ناهمگام به اتمام برسد. این بهینه‌سازی کارایی اجازه می‌دهد تا نخ‌های اجرایی تا زمان انتظار برای عملیات‌های ناهمگام، به اجرای دستورات دیگر بپردازند و منابع سیستم را به بهترین نحو بهره‌برداری کنند.برای استفاده از `await`، ابتدا تابع موردنظر را با کلمه کلیدی`async` اعلان می‌کنیم. سپس در داخل تابع، می‌توانیم با استفاده از`await` انتظار برای اتمام یک عملیات ناهمگام را داشته باشیم.اینجا یک مثال ساده برای نمایش استفاده از `await` درC# آمده است:using System;using System.Net.Http;using System.Threading.Tasks;class Program{static async Task Main(string[] args){await DoAsyncOperation();Console.WriteLine(&#34;Async operation completed.&#34;);}static async Task DoAsyncOperation(){using (HttpClient client = new HttpClient()){string url = &#34;https://www.example.com&#34;;string result = await client.GetStringAsync(url);Console.WriteLine(&#34;Downloaded content length: &#34; + result.Length);}}}در این مثال، تابع `Main` با کلمه کلیدی `async` اعلان شده است و در داخل آن تابع `DoAsyncOperation` با استفاده از`await` فراخوانی می‌شود. وقتی که فراخوانی `GetStringAsync` به اتمام برسد، اجرای تابع `Main` ادامه پیدا می‌کند.استفاده از `await` به ما این امکان را می‌دهد که از سینتکس ساده‌تری برای برنامه‌نویسی ناهمگام استفاده کنیم و به طور مؤثر از منابع سیستم بهره‌برداری کنیم بدون اینکه نیاز به ایجاد و مدیریت دسته‌های نخ (thread) داشته باشیم.</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Fri, 11 Aug 2023 16:53:20 +0330</pubDate></item><item><title>GUID in c#</title><link>https://virgool.ir/@m_59540305/guid-in-c-ixjee1261ytg</link><description>ممکنه که در حین برنامه نویسی و یا دیدن کدهای مختلف کلمه GUID به چشمتون خورده باشه.بیاین یکمی درموردش بحث کنیم.خب اول باید بگم که GUID مخفف  &#34;Globally Unique Identifier&#34; هستش که معنی لغویش میشه شناسه منحصر به فرد جهانی.GUID ها به طور عمده برای شناسایی منابع یا موارد مختلف در سیستم‌های کامپیوتری استفاده میشن. ما GUID رو در زبان  سی شارپ بررسی میکنیمحالا یکم تخصصی تر توضیح بدیم:) در زبان سی شارپ برای دسترسی و استفاده از UUID (یک شناسه ی یکتای جهانی یا شناسه ی منحصر به فرد جهانی) از ساختار GUID استفاده میکنیم که از طریق کتابخانه System (System.Guid)در دسترس قرار گرفته.یک GUIDبه‌صورت یک رشته شناسایی 32 حرفی نمایش داده میشه، به طور معمول با قالبی مثل &#34;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&#34;، که در آن x مقادیر شناسه رو نشون میده. این شناسه‌ها به‌طور خودکار ایجاد میشن و  یکتا بودن اون ها تضمین میشه.استفاده اصلی از GUID در سی شارپ عبارتند از:1-شناسایی منابع در پایگاه‌داده: معمولاً GUID برای شناسایی رکوردها در پایگاه‌داده‌ها استفاده می‌شود، به‌طوری که هر رکورد دارای یک شناسه یکتا باشه.2-ایجاد شناسه‌های منحصربه‌فرد: GUID معمولاً برای ایجاد شناسه‌های منحصربه‌فرد در برنامه‌ها و سیستم‌ها استفاده میشه، به عنوان مثال برای شناسایی نمونه‌های مختلف از یک کلاس یا شیء.3-استفاده در برنامه‌نویسی توزیع‌شده: GUID برای شناسایی منابع در برنامه‌نویسی توزیع‌شده و شبکه‌های بزرگ مانند برنامه‌های پیام‌رسان و خدمات وب استفاده میشه.در آخر هم یه مثال از GUID ببینیم:// Create and display the value of two GUIDs.Guid g = Guid.NewGuid();Console.WriteLine(g);Console.WriteLine(Guid.NewGuid());// This code example produces a result similar to the following:// 0f8fad5b-d9cb-469f-a165-70867728950e// 7c9e6679-7425-40de-944b-e07fc1f90ae7</description><category>پدرام رمضان زاده</category><author>پدرام رمضان زاده</author><pubDate>Tue, 08 Aug 2023 22:41:07 +0330</pubDate></item></channel></rss>