<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های mohammad mhammadi</title>
        <link>https://virgool.io/feed/@m_57794990</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 12:52:10</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>mohammad mhammadi</title>
            <link>https://virgool.io/@m_57794990</link>
        </image>

                    <item>
                <title>react notes68to85</title>
                <link>https://virgool.io/@m_57794990/react-notes-lemlfawn1lte</link>
                <description>چرخه حیات کامپوننت : باید بفهمیم کد های ما کی و به چه صورت render می شوند که در این قسمت به این موضوع میپردازیم . ما سه نوع چرخه حیات برای کامپوننت ها داریم: چرخه حیات ساخت کامپوننت Mount ، آپدیت کامپوننت و unMount شدن کامپوننت . در این لینک میتوانیم دیاگرام چرخه حیات را در یک نگاه ببیینیم : https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/ .  هوک ها در واقع تابع هایی هستند که برای اضافه کردن امکانات کامپوننت کلاسی به تابعی در کامپوننت های نوع تابعی مورد استفاده قرار میگیرند . همانطور که هوک useState جهت استفاده از امکان state   در  کامپوننت نوع تابعی مورد استفاده قرار میگرد ، هوک useEffect نیز جهت استفاده از چرخه حیات مورد  استفاده قرار میگیر . در مثال زیر نحوه پیاده سازی mount , didmount, update در هوک useeffect را مشاهده خواهید کرد:import React, { useEffect, useState } from &#039;react&#039;;const MyComponent = () =&gt; {  // State to track some data  const [data, setData] = useState([]);  // useEffect for component mount (equivalent to componentDidMount)  useEffect(() =&gt; { در دل خودش یک کال بک داره    // Code to run when the component mounts    console.log(&#039;Component mounted&#039;);    // Fetch data or perform any initial setup    fetchData();    // Cleanup function (equivalent to componentWillUnmount)    return () =&gt; {      console.log(&#039;Component will unmount&#039;);      // Perform cleanup tasks if needed    };  }, []); // Empty dependency array means it runs only on mount  // useEffect for component update (equivalent to componentDidUpdate)  useEffect(() =&gt; {    // Code to run when data state is updated    console.log(&#039;Component updated&#039;);    // Additional logic for updates if needed    // Cleanup function (optional)    return () =&gt; {      // Cleanup tasks on component update (if needed)      console.log(&#039;Cleanup on component update&#039;);    };  }, [data]); // Dependency array with &#039;data&#039; means it runs whenever &#039;data&#039; changes  // Function to simulate fetching data  const fetchData = () =&gt; {    // Simulating asynchronous data fetching    setTimeout(() =&gt; {      setData([&#039;Item 1&#039;, &#039;Item 2&#039;, &#039;Item 3&#039;]);    }, 1000);  };  return (    &lt;div&gt;      &lt;h2&gt;My Component&lt;/h2&gt;      &lt;ul&gt;        {data.map((item, index) =&gt; (          &lt;li key={index}&gt;{item}&lt;/li&gt;        ))}      &lt;/ul&gt;    &lt;/div&gt;  );};export default MyComponent;اشنایی با context api: یادمان باشد ،تمامی امکاناتی که در کامپوننت های نوع کلاسی بودند جهت دسترسی در کامپوننت های نوع تابعی از هوک ها استفاده شد و context api هم جزو همین موارد می باشد. از کانتکست  جهت ارسال داده ( props , state ...) از یک کامپوننت به کامپوننت دیگه ای استفاده میشه که دیگه نیاز به دریل کردن وجود ندارد. وقتی ما از context استفاده کنیم در صورتی که زیاد از ان استفاده کنیم باعث میشه که از کاپوننت هامون اگه بخوایم مجدد استفاده کنیم کار سخت بشه.با توجه به این که هر فایل و یا هر کامپوننت وظیفه انجام تنها یک کار را دارد ،پس برای کاتکست هم نیاز به یک فایل مجزا داریم.https://react.dev/learn/passing-data-deeply-with-context </description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Thu, 16 Nov 2023 14:55:58 +0330</pubDate>
            </item>
                    <item>
                <title>react notes (font $ Rout)</title>
                <link>https://virgool.io/@m_57794990/react-notes-font-rout-mwtatsxkqqn1</link>
                <description>فونت : برای استفاده از بوت استراپ داخل پروژه به راحتی انرا توسط npm نصب و ازمستندات اموزش انرا پیاده سازی میکنیم . برای استفاده از font awesome نیز به راحتیم میتوان هم از npm دانلود کرد و هم از سایت cdn استفاده کرد و cdn مخصوص اونو اضافه کرد.بعد از نصب بوت استراپ جهت استفاده از آن می توان آن را در فایل Index.js ایمپورت کرد که از مسیر موجود در node.module میتوان نسخه min انرا Import کرد و در نهایت هر جای برنامه می توان از کلاس های بوت استراپ استفاده کرد.همچنین راه دیگه برای استفاده از بوت استراپ اینه که بریم تو پوشه node.module و بیایم دو تا فایل botstrap.min.css and bootstrap.min.js را در پوشه public قرار میدیم و اینبار در فایل html بهش Link میدیم و این کار برای سبک تر شدن برنامه می باشد. برای font awesomme هم دقیقا به همین روش می توان استفاده کرد  ، فقط تنها تفاوتش اینه که باید پوشه font هم به طور کامل وارد پروژه کنیم و در نهایت میتوان آنرا حذف کرد و برای استفاده از فونت هم کافیه از طریق classname کلاس مخصوصشو مثلا به یه span بدیم.      جهت اضافه کردن فونت مد نظر خودمون ،  اول میایم و اون فونت رو دانلود میکنیم ، با پسوند tft و بعد برای اینکه در همه مرورگرها مشکل نخوریم میایم و در سایت transfonter فونت مد نظرمون رو انتخواب میکنیم و تمامی فرمت هاشو به عنوان خروجی میگیریم و بعد فونت هارو میایم داخل فولدر مد نظرمون داخل پروژمون میزاریم مثلا داخل پوش public/font و همچنین فایل css مد نظر که داخل پوشه فونت هست را نیز میایم داخل پروژه مثلا در مسیر public/css میزاریم و سپس در فایل css فونت مسیر ها را درست میکنیم و در نهایت در فایلhtml پروژه به css لینک میدیم و در این مرحله هر جای کد که بخوایم استایل مربوط به فونتو میدیم : &lt;p style={{&#x27;vazir&#x27;}} &gt;hello&lt;/p&gt;      همچنین میتونیم این فونتو در جایی از پروژه بزاریم که برای همه اعمال شود مثلا در Index.cssنکات جلسه 52 : fragment: در jsx همان طور که میدانید در صورتی که بخواهیم از چند المنت مثلا &lt;p&gt; کنار هم استفاده کنیم و در یک کامپوننت آنهارا return دهیم ، حتما باید یک المنت والد مثل &lt;div&gt; داشته باشند ، اما در جایی که ما بخواهیم از هیچ المنت والدی استفاده نکنیم ، در این هنگام از fragment ها استفاده می شود چون فراگمنتها هیچ node را به dom آضافه نمی کند و به این صورت نوشته میشود :       &lt;fragment&gt;&lt;/fragment&gt; or &lt;&gt;&lt;/&gt; هر دوی این ها فراگمنت هستند و فرقی در استفاده از انها نیستنکات جلسه 56: نحوه import بهتر:فرض کنید داخل یک پوشه با نام contact تعدادی کامپوننت داریم مثلا با نام های addContact,editContact,... حال میخواهیم تمامی این کامپوننت هارو بیایم و داخل یک کامپوننت دیگه مثلا App ایمپورت کنیم ، روش معمول به این صورت هست که تک تک اینارو بیایم و ایمپورت کنیم import addContact from &#x27;./component/contact/addContact&#x27; ; اما روش بهتری نیز وجود دارد که میایم مثلا داخل همون پوشه component و یک فایل با نام index.js میسازیم و بعدش همه این کامپوننت هارو داخل اون فایل export میگیریم برای مثال :     export {default as addContact} from &#x27;./component&#x27;;   و در نهایت داخل کامپوننت App خیلی راحت تو یه خط هر چند تاشونو که بخوایم Import میکنیم:import {addContact,...} from &#x27;./component&#x27;;روت Rout : ما در ریکت نمیتوانیم وقتی درون برنامه از یک صفحه به یک صفحه دیگه میخوایم بریم از تگ &lt;a&gt; استفاده کنیم ، به علت اینکه در ریکت ما درواقع به صورت spa کار میکنیم و یک صفحه جدیدو به صورت یک کامپوننت جدید در اوردیمو استفاده میکنیم . پس برای استفاده از روت در ریکت از یک کتابخانه با نام react-router-dom استفاده میکنیم.جهت نصب هم کافی است از طریق npm install انرا نصب کنیم .سپس داخل فایل index.js شروع میکنیم و از این کتابخانه موارد دلخواه را ایمپورت میکنیم که اولین مورد browserRoture هست که در این فایل بالاترین جای ممکن قرارش میدیم تا کل اپلیکیشن ما دسترسی به مرورگرو داشته باشن .import { BrowserRouter } from &amp;quotreact-router-dom&amp;quot.....const root = ReactDOM.createRoot(document.getElementById(&amp;quotroot&amp;quot));root.render(  &lt;React.StrictMode&gt;    &lt;BrowserRouter&gt;      &lt;App /&gt;    &lt;/BrowserRouter&gt;  &lt;/React.StrictMode&gt;,);     حال در صورتی که بخواهیم در یکی از صفحاتمون به یک صفحه دیگمون لینک بدیم( بین کامپوننت ها جابه جا شیم و صفحه قرار نیست reload شه چون ما spa هستیم) برای اینکار باید ابتدا از داخل react-roture-dom یک Link را ایمپورت می کنیم سپس از طریق این سینتکس لینک را در صفحه مد نظر قرار مید هیم : &lt;Link to={/destinationPath}&gt; نام مدنظر &lt;/Link&gt;  اما در نظر داشته باشین که وقتی ما از link استفاده می کنیم در نهایت به تگ &lt;a&gt; تبدیل میشوند ، اما این Link به ما اجازه دسترسی ایمن از تگ a را میدهد و باعث میشه لینک به صورت داخل اپلیکیشنی باشد.اشنایی با Routs and Rout : جهت مسیر دهی مناسب در پروژه باید از این دو استفاده کرد و مسیر ها را مشخص کرد که در اینجا App / About / Books کامپوننت های ما هستند و ما این مسیرهارو در فایل Index.js تعریف کردیم : &lt;BrowserRouter&gt;      &lt;Routes&gt;        &lt;Route path=&amp;quot/&amp;quot element={&lt;App /&gt;}&gt; // مسیر روت          &lt;Route path=&amp;quot/about&amp;quot element={&lt;About /&gt;} /&gt;          &lt;Route path=&amp;quot/books&amp;quot element={&lt;Books /&gt;} /&gt;        &lt;/Route&gt;      &lt;/Routes&gt;    &lt;/BrowserRouter&gt;  حال نکته این که خیلی مهم است اینه که، ما در صورتی که بخوایم مسیرهامون به هم ربط نداشته باشه ، &lt;Rout &gt; ها زیر هم و هم ردیف هم قرار میگیرند اما در صورتی که بخوایم برای مثال داخل خود App باشیم و اون جا وقتی با استفاده از Link به مثلا Books بریم و Books هم داخل خود App نشون داده بشه مثل بالا به صورت فرزند مسیر App تعریفشون میکنیم و در کامپوننت App هم محلی که میخوایم فرزنداش نمایش داده شن  از &lt;outlet&gt; استفاده میکنیم :import { Link, Outlet } from &amp;quotreact-router-dom&amp;quot
......
const App = () =&gt; {  return (    &lt;div className=&amp;quotApp&amp;quot&gt;      &lt;h1&gt;کتابخانه من&lt;/h1&gt;      {/*About - Books*/}      &lt;nav style={{ borderBottom: &amp;quotsolid 1px&amp;quot, paddingBottom: &amp;quot1rem&amp;quot }}&gt;        &lt;Link to=&amp;quot/books&amp;quot&gt;کتاب ها&lt;/Link&gt;{&amp;quot  &amp;quot}&lt;Link to=&amp;quot/about&amp;quot&gt;درباره ما&lt;/Link&gt;      &lt;/nav&gt;      &lt;Outlet /&gt; // اینجا محل قرار گیری فرزندهاش هستند    &lt;/div&gt;  );}; هر جایی که در ریکت ما روی هر چیزی حلقه میزنیم حتما از key نیز استفاده باید کرد ، چون ریکت بفهمه با کدوم یک از اعضا دره کار میکنه . حال در نظر بگیریم حالتی که برای مثال ما لیستی از کتاب ها دریم که نمایششون میدیم مثل زیر و میخوایم روی هر کتابی که کلیک میکنیم یه لینک بدیم و مثلا بریم داخل جذییات کتاب ، خب کدهای زیر نحوه استفاده از آی دی در لینکو نشون میدن : {books.map((book) =&gt; (          &lt;Link            style={{ display: &amp;quotblock&amp;quot }}            to={`/books/${book.number}`}            key={book.number}          &gt;            {book.name}          &lt;/Link&gt;        ))}و داخل مسیر دهی هم به این صورت میشه :&lt;Route path=&quot;/books/:bookId&quot; element={&lt;Book /&gt;} /&gt;لازم به ذکر است حال وقتی روی این لینک میزنیم در URL هم آی دی Book نمایش داده میشود و ما برای اینکه در صفحه Book بخواهیم کتاب مد نظر را نمایش دهیم باید آی دی کتاب را از URL دریافت کنیم که برای اینکار ابتدا Use-params را از react-router-dom ایمپورت میکنیم و با چند خط زیر اینکارو انجام میدیم (لازم به ذکر است که useparams یک object برمیگردونه که داخلش هم به صورت string هست:Import { useParams } from &amp;quotreact-router-dom&amp;quot
...
const Book = () =&gt; {  const params = useParams();  const book = getBook(parseInt(params.bookId));// چون رشته است باید تبدیل شه  return (    &lt;main style={{ padding: &amp;quot1rem&amp;quot }}&gt;      &lt;h2&gt;قیمت کل : {`${book.amount} تومان`}&lt;/h2&gt;// book یک ابجت است      &lt;p&gt;        {book.name}      &lt;/p&gt;      &lt;p&gt;        تاریخ انتشار : {book.due}      &lt;/p&gt;      &lt;p&gt;        &lt;button&gt;حذف کتاب&lt;/button&gt;      &lt;/p&gt;    &lt;/main&gt;  );};  چند نکته هم در اخر مهم می باشد وقتی در مسیر دهی ، یک المنت فرزند المنت دیگری می شود ، دیگه نیاز نیست در قسمت مربوط به path ادرس را کامل بزنیم و ادرس والد از والد میگیره و همچنین اگه در فرزندی به جای استفاده از path از index استفاده کنیم به این معنی است که مسیرش دقیقا مسیر والد می باشد مثل کد زیر : &lt;Route path=&amp;quot/books&amp;quot element={&lt;Books /&gt;}&gt;            &lt;Route              index // مسیرش میشه دقیقا مسیر اولیه والد               element={                &lt;main style={{ padding: &amp;quot1rem&amp;quot }}&gt;                  &lt;p&gt;کتاب مورد نظر خود را انتخاب نمائید&lt;/p&gt;                &lt;/main&gt;              }            /&gt;            &lt;Route path=&amp;quot:bookId&amp;quot element={&lt;Book /&gt;} /&gt;// در مسیر دیگه لازم نیست مسیر کامل داده بشه          &lt;/Route&gt;نحوه پیاده سازی مسیر Not Found : برای وقتی است که کاربر هر Url دیگه ای غیر از مواردی که ما تغریف کردیمو وارد کرد ، اینو ببینه که برای این کار کافی است یک &lt;Rout&gt; جدید ، خارج در سایر روت ها قرار میدیم و در قسمت path = {*} قرار میدهیم که به این معنی است که هرچیزی وارد کرد کاربر به این آدرس برود البته به غیر از مسیر هایی که خودمون تعریف کردیم و خیلی راحت یک کامپوننت هم براش میسازیم در قسمت element قرار میدیم. نکته اخر اینه که الان فقط یه مشکل میمونه ، اونم وقتیه که کاربر مثلا میاد یه کتاب رو میخواد از روی آی دیش وارد صفحه جذییاتش بشه ، اما در صورتی که اون آی دی نباشه با ارور مواجه میشیم که فعلا میشه از رندر شرطی استفاده کرد و اینو هندل کرد که مثلا اگه کتابی با آی دی مد نظر پیدا شند چه اتفاقی بیفته.پیاده سازی Nav Link : در حالتی که برای مثال شما لیستی از کتاب های ، کاربران یا هر لیستی داشته باشین وبخواین هندل کنید که وقتی کاربر روی یکی از اونها کلیک کرد به حالت active دربیاد ، در این حالت از navlink ها می توان استفاده کرد.نحوه استفاده کردنش دقیقا مثل Link میمونه و در پایین نحوه پیاده سازیشو اوردم : &lt;NavLink            style={({ isActive }) =&gt; { // در اینجا داخل پرانتزو خود نو لینک میده بهمون              return {                display: &amp;quotblock&amp;quot,                margin: &amp;quot1rem 0&amp;quot,                color: isActive ? &amp;quotred&amp;quot : &amp;quot&amp;quot,              };            }}            to={`/books/${book.number}`}            key={book.number}          &gt;            {book.name}          &lt;/NavLink&gt;آشنایی با هوک های useSearchParams و useLocation : هوک useSearchParams دقیقا مثل state داخل ریکت عمل میکند ولی به جای اینکه داده را داخل حافظه سیستم ذخیره کند ، در آدرس مرورگر ذخیره میکند . در اینجا فرض کنیم که میخواهیم از طریق این هوک روی لیستی از کتابها سرچ لحظه ای انجام دهیم ، نحوه این کار در پایین اورده شده است(چیزی که در URl مشاهد میکنید به این صورت است که بعد از مسیر مد نظر  ):?filter=مقداری که در اینپوت تایپ میشودimport {  NavLink,  Outlet,  useLocation,  useSearchParams,} from &amp;quotreact-router-dom&amp;quotconst Books = () =&gt; {  const [searchParams, setSearchParams] = useSearchParams(); // دقیقا مثل استیت و با اسامی دلخواه..............  return (    &lt;div style={{ display: &amp;quotflex&amp;quot }}&gt;      &lt;nav style={{ borderLeft: &amp;quotsolid 1px&amp;quot, padding: &amp;quot1rem&amp;quot }}&gt;
      // داخل اینپوت زیر عملیات سرچ انجام می شود        &lt;input          type=&amp;quottext&amp;quot          value={searchParams.get(&amp;quotfilter&amp;quot) || &amp;quot&amp;quot} // فیلتر یک نام دلخواه است که به عنوان کلید از یو ار  ال 
                                                                                  دریافت میشود          ={(event) =&gt; { // از این طریق مقدار این هوک پر میشود            let filter = event.target.value;            if (filter) {              setSearchParams({ filter });            } else {              setSearchParams({});            }          }}          placeholder=&amp;quotجستجوی کتاب&amp;quot        /&gt;        {books.filter((book) =&gt; { // جهت نمایش کتاب هایی که فیلتر شده است          let filter = searchParams.get(&amp;quotfilter&amp;quot);          if (!filter) return true;          let name = book.name.toLowerCase();          return name.startsWith(filter.toLowerCase());        })          .map((book) =&gt; (            &lt;NavLink              style={({ isActive }) =&gt; {                return {                  display: &amp;quotblock&amp;quot,                  margin: &amp;quot1rem 0&amp;quot,                  color: isActive ? &amp;quotred&amp;quot : &amp;quot&amp;quot,                };              }}              to={`/books/${book.number}`}              key={book.number}            &gt;              {book.name}            &lt;/NavLink&gt;          ))}      &lt;/nav&gt;      &lt;Outlet /&gt;    &lt;/div&gt;  );};export default Books;اما در ارتباط با هوک useLocation وظیفه در اختیار دادن اطلاعاتی از ادرس مدنظر مثل مقدار سرچ برابر چیست ، داخل کدام ادرسیم  ، مقدار کلید و state  چیست و ... . برای استفاده از آن کافی است آنرا از react-router-dom ایمپورت کنیم . سپس از این سینتکس  ()const location = useLocation در دسترس خواهد بود و در مثال بالا ، استفاده که به کار ما میاد اینه که با توجه به این که ما صفحه Books و Book را در داخل هم قرار داده ایم به این صورت که لیست کتاب ها در سمت راست باشند و با انتخواب هر کتاب مقابل این لیست جذییات مربوط به کتاب باز شود و از طریق NavLink به صفحه Book اتصال میابیم به جهت اینکه مقدار سرچ شده را نیز داخل URL قرار دهیم تا وقتی که روی اون کتاب کلیک کردیم نیز مقدار سرچ شده هم ارسال شود و لیست کتاب ها به حالت اولیه برنگردد ، جهت دریافت مقدار سرچ در اینجا از این هوک استفاده میکنیم که فقط کافی است در قسمت NavLink به این صورت عمل کنیم :       to={`/books/${book.number}${location.search}`}  لازم به ذکر است location نیز یک ابجکت را برمیگرداند و جهت استفاده از داخل ان به این شکل عمل می شود.استفاده از هوک useNavigate : برای موقعی استفاده میشه که مثلا بخوایم تو یه صفحه جذییات کتاب ، بخوایم اون کتابو حذف کنیم که خب یک btton پس می سازیم که با کلیک روش اون کتاب حذف شه و اینجا با استفاده از این هوک بعد از حذف یه مسیر جدید میدیم که کاربر بره اونجا ، مثلا بره به صفحه نمایش همه کتاب ها ، نمونه کد در زیر اومده : &lt;button            ={() =&gt; {              deleteBook(book.number);              navigate(&amp;quot/books&amp;quot + location.search); // اینجا چون سرچ داریم از لوکیشن هم استفاده شده            }}          &gt;         delete           &lt;/button&gt;</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 02 Sep 2023 10:25:58 +0330</pubDate>
            </item>
                    <item>
                <title>react notes untill 46</title>
                <link>https://virgool.io/@m_57794990/react-notes-untill-46-odx3k0x4a5hf</link>
                <description> استیت state چیست :شی state جایی است که مقادیر خاصیت متعلق به کامپوننت را در آن ذخیره می کنید. هنگامی که شیء حالت تغییر می کند، کامپوننت دوباره render می شود. برای استفاده از state کافی است ابتدا هوک useState را import کنیم ، سپس از طریق این سینتکس state را می سازیم :const [count, setCount] = useState(inistialstate : 0);که این دو مقدار ، اولی مقدار state می باشد و دومی قابلیت پر کردن state را می دهد و InitialState هم مقدار اولیه state می باشد.برای تغییر مقدار state نیز به این صورت عمل می کنیم :setCount(value: 10);رویداد event : یک event بهتر است به صورت camelCase نام گزاری شود ، تمامی event های خود react مثل  به صورت camelCase می باشد . یک event هم یک تابع معمولی است که تعریف می شود و در موقع مد نظر ما فراخوانی و اجرا می شود.نکات جلسه 41: اعتبار سنجی Props: این اعتبار سنجی برای developer می باشد ، در صورتی که از type script آستفاده کنیم دیگه نیاز به استفاده از کتابخانه جدا برای هندل کردن type برای props ها نمی باشدنکات جلسه 42: استایل دهی : برای دادن استایل در jsx کار راحتی پیش رو داریم ، در صورتی که بخواهیم به صورت Inline بهش استایل بدیم به این صورت عمل میکنیم: &lt;div style={{color: &#x27;red&#x27; }} &gt; &lt;/div&gt;و همچنین در صورتی که بخواهیم به صورت جدا استایل بدیم یک object تعریف میکنیم و اونوقت اون object رو داخل style قرار می دهیم &lt;div style={myStyle} &gt; &lt;/div&gt;نکته قابل توجه اینه که اگر یک استایلیو به صورت کلی داخل یک کامپوننت import و ازش استفاده کنیم ، در این صورت این استایل برای کلیه کامپوننت های فرزند هم اعمال می شود.برای استفاده از استایل به صورت داینامیک نیز از این سینتکس استفاده می کنیم:&lt;div style={{color: count === 0 ? &#x27;red&#x27; : &#x27;blue&#x27; }}&gt;&lt;/div&gt;نکته نهایی در ارتباط با استفاده از className به صورت داینامیک می باشد که برای این کار یک بسته در Npm با همین نام وجود دارد و میتوان انرا نصب و از آن استفاده کرد.نکات جلسه 44 : css.modules : در صورتی که یک کامپوننت داشته باشیم ، مثلا با نام App اگر کنارش یک فایل با نام App.module.css بسازیم ، این css به صورت لوکال مخصوس App می باشد و جهت import کافی است به این صورت استفاده شود :import styles from&#x27;./App.module.css&#x27;;در این حالت به صورت object استایل در اختیار ما قرار میدهد که جهت فراخوانی استایل مد نظر کافی است به صورت زیر عمل کنیم :&lt;div className={styles.divColor}&gt;&lt;/div&gt;</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 26 Aug 2023 16:19:10 +0330</pubDate>
            </item>
                    <item>
                <title>react notes 1 untill 35</title>
                <link>https://virgool.io/@m_57794990/react-notes-1-untill-35-abuhq0kvkovs</link>
                <description>نکات جلسه 9: ریکت : در جاوا اسکریپت یه مشکلی این بود که برای هر مرورگر باید کدهای متفاوتی می نوشتیم .تنها کاری که جاوا اسکریپت در واقع انجام میدهد ویرایش dom می باشد . نکات جلسه 10 :  امری و اعلامی : در جاوا اسکریپت همه چیز به صورت امری است و مستقیم ما dom را عوض میکنیم یعنی وقتی المنتی تغییر میکنه در جاوا اسکریپت مستقیم dom تغییر میکند ، اما در react تغییر dom را خود react انجام میدهد که به این مدل اعلامی می گویند به همین خاطر این رویکرد ، سرعت بیشتر و هزینه کمتری را دارد نکات جلسه 11: ساختار کامپوننت : قابلیت مهم react ساختار کامپوننت می باشد که مزیت اصلی کامپونتت قابلیت استفاده در جاهای مخلف می باشد . در واقع می توان از کامپونتت های اماده مانند material ui / antd  / .. نیز استفاده کرد .نکات جلسه 12: ساختار داده یک طرفه : یکی دیگر از قابلیت های اصلی ریکت ، جریان داده یک طرفه است ، در واقع تا الان بررسی کردیم که ریکت یک کتابخانه جاوا اسکریپتی است که اجازه استفاده بهتر از جاوا اسکریپت را میده، قابلیت دیباگ راحت ، استفاده از کامپونتت و ... که تمامی این موارد باهم virtual dom را به وجود اورده اند به معنای دام مجازی که ریکت بر اساس این دام مجازی ، دام واقعی را دستکاری میکند . درواقع ریکت میاد و ابتدا دام مجازی را تغییر میدهد و بعد دام مجازی و دام واقعی را باهم مقایسه میکند و تنها چیزی که تغییر داده شده است را عوض میکند نه کل صفحه و دام . پس در ابتدا state تغییر میکند و سپس کامپونتت و سپس دام مجازی و در نهایت دام واقعی تغییر داده میشود.نکات جلسه 15: آشنایی با ابزار vite : برای استفاده از ریکت از npx استفاده نکنیم بهتره چون به صورت آنلاین از ریکت استفاده میکنه و انرا نصب نمیکند. بهتر است از npm استفاده کنیم و تنها با وارد کردن کامندnpm -g create-react- app به راحتی ریکت را نصب میکنیم .و برای حذف نیز npm unistall -g create-react-app را وارد میکنیم . ابزار vite نیز برخی از مشکلات create-react-app را برطرف کرده و سرعت را افزایش داده است.نکات جلسه 16: ساخت اولین پروژه: بعد از نصب react-app برای به وجود اوردن پروژه مد نظر کافی است تایپ کنیم create-react-app projectName و پروژه بالا میاید. در صورتی که بخوایم از template خاصی استفاده کنیم کافی است create-react-app projName --template typescript را تایپ کنیم و سپس برای اجرای پروژه کافی است تایپ کنیم npm startنکات جلسه 17 : آشنایی با ساختار برنامه : در پوشه node-modules وابستگی های پروژه قرار دارد که ریکت خودش هندل میکنه و ما نیازی بهش نداریم و وقتی پروژه را برای کسی میفرستیم این پوشه را لازم نیست براش بفرستیم و خودش دانلود میکنه . در پوشه public یک فایل Index.html هست که تنها html داخل پروژه می باشد .فایل manifest.json نیز اطلاعات مربوط به pwa را در خود نگه داری میکند. فایل robot.txt نیز فایلی است که به خزنده هایی مانند گوگل مواردی را اطلاع میدهد که مثلا داخل فلان فایل نرود .داخل دایرکتوری src نیز تعدادی فایل می باشد ، فایل app.js تنها کامپوننت فعلی ما می باشد که زیرش نیز فایل تست مربوط به این فایل می باشد و فایل Index.js وظیفه رندر کردن کامپوننتها توسط react dom را دارد. فایل report.webvitals که جهت برداشت لاگ میباشد.فایل Package.json درواقع metadata پروژه میباشد که داخل ان در قسمت eslint نیز مربوط به وارنینگ در حال اجرای برنامه می باشد و همچنین در قسمت production نیز تنظیمات مربوط به اجرای پروژه بعد از publish شدن را انجام میدهیم.در فایبل package.lock.json نیز تمامی وابستگی هایی که npm نصب میکند را داخل خودش نمایش میدهد.درباره jsx : به ما اجازه میدهد که html را در جاوا اسکریپت قرار دهیم . در واقع در پشت صحنه توسط babel تمامی کدها تبدیل به جاوا اسکریپت می شود .در کل 4 تا قانون در استفاده از jsx وجود دارد  : 1- در صورتی که بخواییم کلاس css بدیم از className استفاده میکنیم 2- در jsx حتما باید یک المنت والد وجود داشته باشد 3- نحوه کامنت گزاری فرق میکند 4- هر المنتی که باز میکنیم باید بسته شود حتی در صورتی که المنت single باشد . هر موقع بخوایم js داخل jsx بنویسیم باید از { } استفاده کنیم و تنها یک expression میتوانیم بنویسیم به این معنی است که تنها یک خط که با ; به پایان میرسد ، همچنین میتوانیم که تابع را نیز قرار دهیم داخل {} . برای استفاده از شرط در jsx میتوان به سادگی از turnay operator استفاده کرد به این صورت که در صورت درست بودن user سمت چپ پرانتز اجار شده و در صورت غلط بود سمت راست اجرا میشود.user ? () : () همچنین برای حلقه زدن داخل jsx میتوان از این syntax استفاده می کنیم که غیر از map از موارد دیگه ای نظیر filter نیز میتوان استفاده کرد{user.map(x =&gt; ( &lt;div&gt;{x.firstName}&lt;div&gt; ))}کامپوننت : سینتکس یک کامپوننت خام به این صورت است :const myComp = () =&gt; {return (&lt;div&gt; &lt;p&gt; heloo &lt;/p&gt; &lt;/div&gt;   )}export default myComp;که در نهایت این کامپوننت را استخراج میکنیم تا بتوانیم در جای دیگه اونو Import کنیم و ازش استفاده کنیم.پس وقتی بخوایم از یک css داخل ان استفاده کنیم کافی است انرا ساخته و درون کامپوننت ادد کنیم.وقتی از strictMode استفاده میکنیم به ما لاگ های متتنوعی میدهد.جهت استفاده از یک کامپوننت داخل کامپوننت دیگه ای کافی است ازش export گرفته و داخل کامپوننت مد نظر import شه و در نهایت مثل یک المنت داخل jsx اضافه میکنیم &lt;/user&gt; .پراپز props چیست : بسیار راحت برای دریافت props به این شکل عمل میکنیم: const myComp = (props ) =&gt; {return (&lt;div&gt; &lt;p&gt; heloo {props.name} &lt;/p&gt; &lt;/div&gt;   )}export default myComp;همچنین برای ارسال props که از سمت کامپوننت والد به فرزند ارسال میشه ، به این صورت هست که هر چند تا بخوایم میتونیم ارسال کنیم و همشونو میتونیم سمت فرزند دریافت کنیم و برای ارسالش به این شکل عمل میکنیم:&lt;myComp name={&quot;ali&quot;} /&gt;نکته قابل توجه این است که props ها تغییر پذیر نیستند و به هیچ عنوان نباید در کامپوننت دیگر آنرا تغییر دهیم به دلیل عدم امکان پیگییری توسط ریکت می باشد . نکته دیگه اینه که تنها در حالتی که state و prop تغییر کنه render مجدد اتفاق میفته اما prop نباید در کامپوننت دیگه تغییر کنه.نکته دیگه این است که props ها میتونن انواع نوع داده ای داشته باشن و ارسال بشن .همچنین موردی داریم به اسم prps chlidren که به این صورته که موقع ارسال props اگه به این شکلی چیزیو بفرستیم ، میاد و با نام children در قسمت کامپوننت فرزند دریافت میشه :&lt;myComp&gt;&quot;hello&quot; &lt;/myComp&gt;و در نهایت در قسمت مربوط به کاممپوننت فرزند جهت خواند این props از این روش استفاده میکنیم :props.children</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 26 Aug 2023 13:43:42 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی کامل .NET cryptography به همراه مثال کاربردی</title>
                <link>https://virgool.io/@m_57794990/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D9%85%D9%84-net-cryptography-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-wnbvlrnk9qc8</link>
                <description>رمزنگاری دات نت (.NET cryptography) به مجموعه ای از کلاس ها و کتابخانه های رمزنگاری اطلاق می  شود که توسط چارچوب دات نت مایکروسافت برای اجرای عملیات رمزنگاری مختلف  ارائه می شود. رمزنگاری در دات نت به توسعه دهندگان اجازه می دهد تا  کارهایی مانند رمزگذاری، رمزگشایی، هش کردن، امضای دیجیتال، تولید اعداد  تصادفی ایمن و غیره را انجام دهند. این یک راه استاندارد و ایمن برای  مدیریت داده ها و ارتباطات حساس در برنامه ها ارائه می دهد.پس به زبان ساده ما در دات نت یه سری قابلیت داریم که با توجه به هدفمون ازشون بهره میبریم ، برای مثال برای بحث پسورد بهترین کار استفاده از password hashing هست . حالا تو این مقاله طوری توضیح میدیمو مثال میزنیم که تمام این مواردی که دات نت بهمون میده رو درک کنیم و خودمون تصمیم بگیریم کی از کدوم استفاده کنیم.نکات کلی که در ابتدا مختصر بهشون نگاه میکنیمو در ادامه خیلی دقیق بررسی میشن:security: رمزنگاری دات نت طیفی از الگوریتم ها و تکنیک های رمزنگاری را ارائه  می دهد که استانداردهای امنیتی صنعت را رعایت می کنند. این به توسعه  دهندگان کمک می کند تا از داده های حساس در برابر دسترسی غیرمجاز، دستکاری و  استراق سمع محافظت کنند.Namespaces: فضای نام اصلی برای دات نت  رمزنگاری System.Security.Cryptography است. این فضای نام، کلاس‌هایی را  برای کارهای رمزنگاری مختلف، از جمله رمزگذاری متقارن، رمزگذاری نامتقارن،  هش، امضای دیجیتال و مدیریت کلید، فراهم می‌کند.رمزگذاری متقارن و  نامتقارن(Symmetric and Asymmetric Encryption:): دات نت کلاس هایی را برای رمزگذاری متقارن (با استفاده از یک  کلید برای رمزگذاری و رمزگشایی) و نامتقارن (با استفاده از یک جفت کلید  عمومی و خصوصی) ارائه می دهد. این امکان ارتباط امن و حفاظت از داده ها را  فراهم می کند.هش کردن: هش برای تولید یک خروجی با اندازه ثابت  (مقدار هش) از یک ورودی استفاده می شود. دات نت الگوریتم های هش مختلفی  مانند MD5، SHA-1، SHA-256 و موارد دیگر را برای کارهایی مانند هش رمز عبور  و تأیید صحت داده ها ارائه می دهد.امضاهای دیجیتال: دات نت به  شما امکان می دهد امضاهای دیجیتال را با استفاده از رمزگذاری نامتقارن  ایجاد و تأیید کنید. این برای تأیید صحت و صحت پیام ها یا داده ها بسیار  مهم است.تولید اعداد تصادفی: تولید اعداد تصادفی ایمن رمزنگاری  برای کارهایی مانند ایجاد کلیدهای رمزگذاری یا بردارهای اولیه مهم است. دات  نت راهی برای تولید اعداد تصادفی قوی از نظر رمزنگاری فراهم می کند.مدیریت  کلید: مدیریت ایمن کلیدهای رمزگذاری ضروری است. دات نت کلاس هایی را برای  مدیریت تولید، ذخیره سازی و مدیریت کلید ارائه می دهد.ارتباطات  ایمن: رمزنگاری نقش مهمی در تضمین ارتباطات ایمن از طریق شبکه ایفا می کند.  دات نت از پروتکل ها و الگوریتم های مختلف برای پیاده سازی ارتباطات شبکه  ایمن مانند SSL/TLS پشتیبانی می کند.بهترین روش ها: رمزنگاری دات  نت توسعه دهندگان را تشویق می کند تا بهترین شیوه های امنیتی مانند  استفاده از طول کلید ایمن، انتخاب الگوریتم مناسب و مدیریت کلید ایمن را  دنبال کنند.در اینجا یه دید کلی پیدا کردیم از کلیات دات نت ، حالا در دات نت تعداد مختلفی الگوریتم وجود داره که با توجه به نیازمون از اونا استفاده میکنیم که لیستشون در زیر اومدهData privacy:Aes&lt;br/&gt;Data integrity:HMACSHA256&lt;br/&gt;HMACSHA512&lt;br/&gt;Digital signature:ECDsa&lt;br/&gt;RSA&lt;br/&gt;Key exchange:ECDiffieHellman&lt;br/&gt;RSA&lt;br/&gt;Random number generation:RandomNumberGenerator.Create&lt;br/&gt;Generating a key from a password:Rfc2898DeriveBytes&lt;br/&gt;</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Tue, 22 Aug 2023 13:42:07 +0330</pubDate>
            </item>
                    <item>
                <title>what is sign data and how it work in dotnet?</title>
                <link>https://virgool.io/@m_57794990/what-is-sign-data-and-how-it-work-in-dotnet-mkffb54vfofr</link>
                <description>when and in witch scenario  we can use Digital signatures ?Data Integrity and Authentication: Digital signatures ensure that data hasn&#x27;t been tampered with during transmission or storage. By signing data, you can guarantee its integrity and verify that it was indeed created by the expected sender.Document Signing: In digital document management, digital signatures are used to replace physical signatures on electronic documents. This is crucial for contracts, agreements, and other legal documents.Software Distribution: When distributing software or updates, digital signatures can be applied to verify that the software hasn&#x27;t been modified by unauthorized parties. Users can then verify the signature to ensure the software is from the legitimate source.Email Security: Digital signatures can be used to sign emails, ensuring that the sender is authentic and the email content hasn&#x27;t been altered in transit.Authentication Tokens: Digital signatures are often used in authentication protocols, like OAuth, to verify the identity of parties involved in communication and to prevent impersonation.Financial Transactions: In financial systems, digital signatures are employed to sign transactions, ensuring that financial data remains secure and tamper-proof.Blockchain and Cryptocurrencies: Digital signatures are fundamental to the security of blockchain networks. They validate transactions and provide cryptographic proof of ownership in cryptocurrency systems.Regulatory Compliance: Some industries, such as healthcare and finance, require the use of digital signatures to comply with regulatory standards and ensure data security.API Security: APIs (Application Programming Interfaces) can be secured using digital signatures to authenticate requests and prevent unauthorized access.Data Sharing and Exchange: When data is shared between different entities, digital signatures can be used to validate the origin of the data and protect it from unauthorized modifications.It&#x27;s important to note that digital signatures are not encryption. While encryption focuses on data confidentiality, digital signatures focus on data integrity and authenticity. If you need both confidentiality and integrity, a combination of encryption and digital signatures might be used.When deciding whether to use digital signatures, consider the sensitivity of the data, the potential impact of data tampering, and the need to establish trust between parties. Digital signatures provide a robust way to achieve these goals in scenarios where data security is a priority.How we can use it , be with me to explain step to step:Step 1: Generate Key PairsYou, as the sender, generate a pair of keys: a public key and a private key. Think of the private key like a secret key that only you should know, and the public key as a lock that others can use to check your signature.Step 2: Sign the Data2. When you want to send a piece of data (like a message or a file), you use your private key to &quot;sign&quot; it. This creates a special code that only your private key can generate. It&#x27;s like locking the data with your secret key.Step 3: Send the Data and Signature3. You send the data along with the special code (the digital signature) to the receiver. They will need your public key to verify the signature.Step 4: Receiver Gets the Data4. The receiver gets the data and the signature. They know your public key because it&#x27;s freely available, like a lock that anyone can use.Step 5: Verify the Signature5. Using your public key, the receiver &quot;unlocks&quot; the signature to see if it matches the data. If the signature is valid and matches the data, it means the data hasn&#x27;t been changed since you signed it. They can be confident that you were the one who signed it.Step 6: Trust and Authenticity6. Because only your private key could have created the correct signature, the receiver can trust that the data is from you and hasn&#x27;t been tampered with. This helps ensure the authenticity and integrity of the data.How can we use it by dotnet?Step 1: Create a .NET Core Console ApplicationStart by creating a new .NET Core Console Application using your preferred development environment (Visual Studio, Visual Studio Code, etc.).Step 2: Add System.Security.Cryptography NamespaceIn your console application, make sure you have access to the System.Security.Cryptography namespace, which contains the classes needed for cryptographic operations.Step 3: Generate Key PairGenerate an RSA key pair (public and private keys) that you&#x27;ll use for signing and verification. Here&#x27;s how to do it:csharpusing System;
using System.Security.Cryptography;

class Program
{
    static void Main()
    {
        using RSA rsa = RSA.Create(); // Create an RSA object
        // Generate the key pair
        RSAParameters publicKey = rsa.ExportParameters(false); // Public key
        RSAParameters privateKey = rsa.ExportParameters(true); // Private key

        // Now you have your public and private keys
        // You can save them for future use
    }
}Step 4: Sign DataSign a piece of data (e.g., a message) using your private key:csharpbyte[] data = System.Text.Encoding.UTF8.GetBytes(&amp;quotHello, this is the data to sign.&amp;quot);

using RSA rsa = RSA.Create();
rsa.ImportParameters(privateKey); // Use your private key

byte[] signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);Step 5: Verify SignatureVerify the signature using the public key:csharpusing RSA rsa = RSA.Create();
rsa.ImportParameters(publicKey); // Use the public key

bool isSignatureValid = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

if (isSignatureValid)
{
    Console.WriteLine(&amp;quotSignature is valid.&amp;quot);
}
else
{
    Console.WriteLine(&amp;quotSignature is not valid.&amp;quot);
}Remember that this is a simplified example to demonstrate the steps involved. In a real-world scenario, you might need to handle key storage securely, manage the encoding of data, and handle exceptions that could occur during cryptographic operations.and here is another and better way to do it:using SHA256 alg = SHA256.Create();this.logger.LogError(&quot;task started sign validation&quot;);byte[] data = Encoding.ASCII.GetBytes(&quot;Hello, from the .NET Docs!&quot;);byte[] hash = alg.ComputeHash(data);RSAParameters sharedParameters;byte[] signedHash;// Generate signatureusing (RSA rsa = RSA.Create()){    sharedParameters = rsa.ExportParameters(false);    RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);    rsaFormatter.SetHashAlgorithm(nameof(SHA256));    signedHash = rsaFormatter.CreateSignature(hash);}// Verify signature
using (RSA rsa = RSA.Create())
{
    rsa.ImportParameters(sharedParameters);

    RSAPKCS1SignatureDeformatter rsaDeformatter = new(rsa);
    rsaDeformatter.SetHashAlgorithm(nameof(SHA256));

    if (rsaDeformatter.VerifySignature(hash, signedHash))
    {
        Console.WriteLine(&amp;quotThe signature is valid.&amp;quot);
    }
    else
    {
        Console.WriteLine(&amp;quotThe signature is not valid.&amp;quot);
    }
}

</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Mon, 21 Aug 2023 09:33:10 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی openTelemetry در دات نت</title>
                <link>https://virgool.io/@m_57794990/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-opentelemetry-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-lgdzolovkrfo</link>
                <description>در این مقاله ابتدا به بررسی metric و opentelemetry خواهیم پرداخت و سپس تنظیمات آن در dotnet را بررسی میکنیم برای ارسال اطلاعاتی از سرور بک اند مانند ( زمان طول کشیدن برای اجرای یک متد ، تعداد درخواست های http و یا اطلاعاتی در ارتباط با منابعی که روی سرور در حال مصرف است ) از Metric ها استفاده می شود ، metric های مختلفی وجود دارد مانند stadsD یا openteletry و ... در دات نت ، در دو حالت console application و حالت web تنظیمات متفاوتی برای openteletry وجود دارد (لازم به ذکر است تنظیمات به دو دسته تقسیم می شوند : 1. تنظیماتی که برای ارسال metric ها به مقصد مورد نظر انجام میشود. 2. تنظیمات مربوط بع خودر metric ها که مورد دوم به راحتی مثال های مختلفی از ان در اینترنت وجود دارد) ، ابتدا به بررسی تنظیمات در dotnet console application می پردازیم ، به جهت این کار ابتدا باید در قسمت program.cs موارد زیر را اضافه کنیم ( تنظمات metric به صورت ابتدایی در نظر گرفته شده است ) services.AddOpenTelemetry()    .WithMetrics(builder =&gt; builder            //we can see our metrics in the console window            .AddConsoleExporter()            //A Resource is the immutable representation of the entity producing the telemetry            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(&quot;ScannerAv&quot;))            //AddMeter() extension method configures OpenTelemetry to transmit all the metrics collected by this concrete Meter            .AddMeter(meters.MetricName)            //With AddPrometheusHttpListener(), OpenTelemetry PrometheusExporter will export data via            //the endpoint defined by PrometheusHttpListenerOptions.UriPrefixes, which is http://localhost:9464/ by default.            //prometheusUrl= *:5000/ =&gt; how its work + open as a administrator            .AddPrometheusHttpListener(options =&gt; options.UriPrefixes = new string[] { prometheusUrl })            //is the specific configuration that will collect metrics for our incoming HTTP requests.            .AddAspNetCoreInstrumentation()            //collect metrics for outgoing HTTP requests through the HttpClient class            .AddHttpClientInstrumentation()            //Runtime metrics give us some interesting measurements,            //such as the count of exceptions that have been thrown, or the number of thread pools that currently exist.            .AddRuntimeInstrumentation()            //A View in OpenTelemetry defines an aggregation, which takes a series of measurements and expresses them            //as a single metric value at that point in time.            .AddView(             instrumentName: &quot;scan-time-elapse&quot;,            new ExplicitBucketHistogramConfiguration { Boundaries = new double[] { 100, 1000, 7000, 12000, 15000, 17000, 20000, 50000, 100000 } })            );در تنظیمات فوق تعدادی از تنظیمات ، تنظیماتی است که گویای این مورد است که به چه metric ها و یا log هایی ما نیاز دارم برای ارسال  و قسمتی از تنظمات مربوط به این است که این metric کجا و به چه نحوی نمایش داده شونددر صورت استفاده از .AddConsoleExporter به برنامه میگوییم که metric ها در کنسول (cmd) نمایش داده شوددر صورتی که بخواهیم metric ها به یک سرور بیرونی ارسال شود ( درحالت console app ) از       .AddPrometheusHttpListener(http:/*:5000/) استفاده می کنیم ، لازم به ذکر است حتما برنامه بصورت administratro باید اجرا شود و با این فرمت تنظیم شود که در این صورت می توانیم این اطلاعات را در هر سرور دیگری تحویل بگیریمحال در صورتی که از پروژه dotnet web استفاده می کنیم ، به جای استفاده از AddPrometheusHttpListener باید ازAddPrometheusExporter استفاده شود هم چنین باید خط کد زیر نیز دقسمت مربوط به pipeline ها اظافه شود app.UseOpenTelemetryPrometheusScrapingEndpointهمچنین در صورتی که بخواهیم اطلاعات metric را به collector ساخته شده توسط خودمان ارسال کنیم باید از پکیج   OpenTelemetry.Exporter.OpenTelemetryProtocol&quot; &quot; استفاده نماییم و بعد از نصب پکیج به جای استفاده از سایر exporter ها کافی است در قسمت اخر کانفیگ داخل program.cs این خط را قرار دهیم  .AddOtlpExporter(option =&gt;            {                option.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc;                option.Endpoint =  new(&quot;http://172.22.30.62:4317&quot;);            })--------------------------------------------------------------------------------------------------------------------------------------------------------پکیج های زیر جهت استفاده از openTelemtry  در دات نت نیاز به نصب است  &lt;PackageReference Include=&quot;OpenTelemetry&quot; Version=&quot;1.5.0-alpha.1&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Exporter.Console&quot; Version=&quot;1.4.0&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Exporter.Prometheus.AspNetCore&quot; Version=&quot;1.5.0-alpha.1&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Exporter.Prometheus.HttpListener&quot; Version=&quot;1.5.0-alpha.1&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Extensions.Hosting&quot; Version=&quot;1.4.0&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Instrumentation.AspNetCore&quot; Version=&quot;1.0.0-rc9.14&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Instrumentation.Http&quot; Version=&quot;1.0.0-rc9.14&quot; /&gt;    &lt;PackageReference Include=&quot;OpenTelemetry.Instrumentation.Runtime&quot; Version=&quot;1.1.0-rc.2&quot; /&gt;در مرحله بعدی اطلاعاتی که مد نظر ما می باشد را به راحتی در داخل متد ها تنظیم میکنیم جهت ارسال ، که این تنظیمات بسته به نوع نیاز ما می باشد و در اینترنت به راحتی پیدا میشود (https://signoz.io/blog/opentelemetry-dotnet/) سپس در سروری که prometheus در ان تنظیم شده است و روی پورت 9090 بالا می باشد ، آی پی و پورت سرورمون رو تو تنظمات yml وارد میکنیم تا در prometheus در قسمت target ها قابل مشاهده باشد و در نهایت میتوان در گرافانا هم نمودار مد نظر خودمونو با این اطلاعات درست کنیم و داشبودرشو بسازیم</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Mon, 24 Apr 2023 09:58:46 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از auto mapper در asp .net core با استفاده از Boxed.Mapping</title>
                <link>https://virgool.io/@m_57794990/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-auto-mapper-%D8%AF%D8%B1-asp-net-core-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-boxedmapping-t91hos54mvoi</link>
                <description>هدف استفاده از auto mapper جهت map کردن یک object به object دیگری است که عمده استفاده از این قابلیت ، وقتی است که یک مدل در دیتا بیس داریم و میخواهیم برای مثال انرا از دیتابیس query بزنیم و دریافت کنیم ، اما از این جدول ، تمامی فیلد های آنرا لازم نداریم ، پس مجبوریم که تک تک property های آنرا در متد مد نظر بصورت متناظر با مدل دیگمون (dto ) پر کنیم و اینکارو در هر متد جداگانه باید انجام داد ، حال با استفاده از auto mapper میایم و مدل دیتابیس را در مدل dto یکبار با شرایط دلخواه map میکنیم و هر چند بار بخوایم استفاده می کنیم.جهت استفاده از mapper مراحل زیر را باید طی کنیم :  1. ابتدا پکیج Boxed.Mapping را نصب می نماییم   2. سپس در قسمتی از برنامه ( مثلا زیر مجموعه service یک پوشه با نام mapper می سازیم و داخل ان به ازای هر map یک کلاس می سازیم ) در زیر نمونه ای از کلاس مد نظر ساخته شده اورده شده است:namespace Service.Services.Mapper;// dar in ja ba estefade az using pakcage made nazaro vared mikonimusing Boxed.Mapping;using Common.DataBase;using Models.ViewModels;using Utility;public class UserMapper : IMapper&lt;User, UserDto&gt;, IMapper&lt;UserDto, User&gt;{    public void Map(User source, UserDto destination)    {        ArgumentNullException.ThrowIfNull(source);        ArgumentNullException.ThrowIfNull(destination);        destination.Id = source.Id;        destination.FirstName = source.FirstName;        destination.LastName = source.LastName;        destination.IsDisabled = source.IsDisabled;        destination.UserName = source.UserName;        destination.CreateDate = source.CreateDate;        destination.IsBot = source.IsBot;        destination.PublicKey = source.PublicKey;        destination.FullName = source.FullName;        if (source.Groups is not null)        {            destination.Groups = source.Groups.Select(x =&gt; new GroupDto()            {                Description = x.Description,                Id = x.Id,                Name = x.Name,            }).ToList();        }    }    public void Map(UserDto source, User destination)    {        ArgumentNullException.ThrowIfNull(source);        ArgumentNullException.ThrowIfNull(destination);        destination.IsDisabled = source.IsDisabled;        destination.UserName = source.UserName;        destination.FirstName = source.FirstName;        destination.LastName = source.LastName;        destination.IsBot = source.IsBot;        destination.CreateDate = DateTime.UtcNow;        if (source.IsBot &amp;&amp; source.Id != null &amp;&amp; source.BotPassword != null)        {            destination.AuthPwd = AuthenticationUtils.CreateBotHash(source.Id.Value, source.BotPassword);        }        else        {            destination.AuthPwd = null;        }    }}3. و در نهایت کافی است در کلاس program یک service جدید بصورت transiant ایجاد کنیم از کلاس مد نظر مانند زیر:builder.Services.AddTransient&lt;IMapper&lt;UserDto, User&gt;, UserMapper&gt;()4. سپس جهت استفاده از این mapper کافی است بصورت dependency injection داخل constructor کلاس مد نظر آنرا injec کنیم  private readonly IMapper&lt;User, UserDto&gt; userToDtoMapper;5. و در نهایت در متد مد نظر به صورت زیر ازش استفاده می کنیم و میتونیم فقط مدل دیتابیسو به عنوان وروردی بهش بدیم var result = this.userToDtoMapper.MapList(users);و در نهایت به عنوان خروجی یک مدل به صورت Dto به ما تحویل میده</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Mon, 03 Apr 2023 12:42:03 +0330</pubDate>
            </item>
                    <item>
                <title>Stopwatch class in C#</title>
                <link>https://virgool.io/@m_57794990/stopwatch-class-in-c-vhbj0gxekzmj</link>
                <description>what is stopWatch: Stopwatch is a class in C# to measure the elapsed time. Use it to calculate the time a function took to execute. It is found under System.Diagnostics.How stopWatch work: To get the elapsed time, firstly begin the Stopwatch −var sw = Stopwatch.StartNew();For elapsed tickslong ticks = sw.ElapsedTicks;exampleusing System;
using System.Linq;
using System.Diagnostics;
public class Demo {
   public static void Main() {
      var sw = Stopwatch.StartNew();
      long ticks = sw.ElapsedTicks;
      Console.WriteLine(ticks);
   }
}</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 28 Jan 2023 16:25:20 +0330</pubDate>
            </item>
                    <item>
                <title>In-Memory Caching in .Net Core with IMemoryCache</title>
                <link>https://virgool.io/@m_57794990/in-memory-caching-in-net-core-with-imemorycache-fimi9lz51eop</link>
                <description>what is caching : Caching is the process of storing the data that’s frequently used so that data can be served faster for any future requests.why IMemoryCach: Suppose we have a very lightweight process which talks to another server whose data is not going to change frequently , so we can use memory cach in this case. Without any caching in place, we would be making multiple requests which will ultimately result in timeouts or making the remote server unnecessarily busy.How we can use it in .net: First, we need to inject the in-memory caching service into the constructor of the our class , like this :public class HomeController : Controller
{
    private readonly IMemoryCache _cache;

    public HomeController(ILogger&lt;HomeController&gt; logger, IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }now we want to cache the response of the API.// Code removed for brevity
...

// Look for cache key.
if (!_cache.TryGetValue(CacheKeys.Entry, out cacheEntry))
{
    // Key not in cache, so get data.
    cacheEntry = DateTime.Now;

    // Set cache options.
    var cacheEntryOptions = new MemoryCacheEntryOptions()
        // Keep in cache for this time, reset time if accessed.
        .SetSlidingExpiration(TimeSpan.FromSeconds(3));

    // Save data in cache.
    _cache.Set(CacheKeys.Entry, cacheEntry, cacheEntryOptions);
}</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 28 Jan 2023 16:14:33 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی نحوه mount کردن samba داخل Linux:</title>
                <link>https://virgool.io/@m_57794990/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%86%D8%AD%D9%88%D9%87-mount-%DA%A9%D8%B1%D8%AF%D9%86-samba-%D8%AF%D8%A7%D8%AE%D9%84-linux-cnor77uuolel</link>
                <description>. بررسی نحوه mount کردن samba داخل Linux:ابتدا داخل سرور smb می شویم  وسپس وارد تنظیمات samba که در مسیر etc/samba قرار دارد ، می شویم .فایل smb.conf را باز می کنیم  و موارد زیر را در انتهای تنظیمات وارد می کنیم[servicesamba] ​    comment = Samba for file process      path = /home/vishkav/samba        read only = no ​     guest ok = yes ​      browsable = yes ​        writeable = yesسپس وارد سروری می شویم که قصد داریم ، دیسک سرور smb را به مسیر لوکالی از این سیستم mount کنیمدر این سیستم ابتدا کامند زیر را اجرا می کنیمsudo apt install cifs-utilsو سپس مسیر لوکال مد نظر را می سازیم و در نهایت وارد فایل fstab میشویم (لازم به ذکر  است جهت باز  کردن این فایل از این کامند استفاده می کنیم :sudo nano etc/fstab )و سپس در آخر تنظیمات موجود در این فایل این دستورات را اضافه می کنیم//&lt;your-ip-address&gt;/&lt;mount-name&gt; /mnt/myFolder/ cifs username=YOURUSERNAME,password=YOURPASSWORD,iocharset=utf8,file_mode=0777,dir_mode=0777که در قسمت ip-address ، آی پی سرور را وارد کرده و در قسمت mount-name نامی را که  در تنظیمات  سامبا در سرور smb قرار دادیم را وارد می کنیم(servicesamba)*لازم به ذکر است این روش به صورت دائمی ، دیسک را از سرور smb به مسیر لوکال مد نظر  Mount می کندwhat is fstab: Your Linux system&#x27;s filesystem table, aka fstab, is a configuration table designed to ease the burden of mounting and unmounting file systems to a machine. It is a set of rules used to control how different filesystems are treated each time they are introduced to a system.table structure: Device: usually the given name or UUID of the mounted device (sda1/sda2/etc).Mount Point: designates the directory where the device is/will be mounted.File System Type: nothing trick here, shows the type of filesystem in use.Options: lists any active mount options. If using multiple options they must be separated by commas.Backup Operation: (the first digit) this is a binary system where 1 = dump utility backup of a partition. 0 = no backup. This is an outdated backup method and should NOT be used.File System Check Order: (second digit) Here we can see three possible outcomes.  0 means that fsck will not check the filesystem. Numbers higher than this represent the check order. The root filesystem should be set to 1 and other partitions set to 2.</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 14 Jan 2023 09:51:19 +0330</pubDate>
            </item>
                    <item>
                <title>حل مشکل vs code برای debug</title>
                <link>https://virgool.io/@m_57794990/%D8%AD%D9%84-%D9%85%D8%B4%DA%A9%D9%84-vs-code-%D8%A8%D8%B1%D8%A7%DB%8C-debug-mhdvigfuwwki</link>
                <description> ابتدا f1 را می زنیم و سپس omnisharp: selectProject را انتخواب می کنیم و سپس از موارد در دسترس فایل داری پسوند crcproj را انتخواب می کنیم و یکبار f5 را زده و مشکل حل می شود ابتدا f1 را می زنیم و سپس omnisharp: selectProject را انتخواب می کنیم و سپس از موارد در دسترس فایل داری پسوند crcproj را انتخواب می کنیم و یکبار f5 را زده و مشکل حل می شود ابتدا f1 را می زنیم و سپس omnisharp: selectProject را انتخواب می کنیم و سپس از موارد در دسترس فایل داری پسوند crcproj را انتخواب می کنیم و یکبار f5 را زده و مشکل حل می شود</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Tue, 10 Jan 2023 10:43:59 +0330</pubDate>
            </item>
                    <item>
                <title>certificate in httpclinet</title>
                <link>https://virgool.io/@m_57794990/certificate-in-httpclinet-a6wo4bhannqf</link>
                <description>برای ارسال درخواست HTTP ، با استفاده از یک URL استفاده می  شود.HttpClient می تواند برای ساخت درخواست های Web API در برنامه Console ،  برنامه Winform ، برنامه Web form ، Windows store Applicatio و...  استفاده شود..سوال اصلی اینه که کاربردش چیه ؟وقتی یه درخواست از کلاینت ( مثلا وقتی کاربر در صفحه مرورگر محصولیو انتخواب میکنه ، خب این درخواست میاد سمت سرور و خب مشخصا ، قبلش این کاربر log in کرده و هم authaticate شده و هم authorize شده )اما وقتی دو تا سرویس داریم ( هر دو سمت بک اند هستند ) ، مثلا یک سرویس مسول اینه که درخواست کاربرو بگیره بعدش مثلا بیاد بریزتش تو یه سرویس دیگه برای ذخیره سازی مثل kafka بعد از این دوباره اون سرویس درخواستو میگیره و این بار میده به سرویس دیگه مثلا vdb . حالا وقتی درخواست بین دو تا سرویس هست که جفتشون هم بک اند مون هستند پس برای این که این مطمین بشیم این دو سرویس همو میشناسن و کسی نمیتونه خودشو جای یکی از اینا بزاره و هکمون کنه میایم از این قابلیت استفاده میکنیمتنظیمات سمت سرور ؟ یکی از این سرویس ها میشه سرورمون تو این سناریو ، یعنی سرویسی که api اونجا قرار داره و در دات نت این تنظیماتو براش باید انجام بدیم  میایم در program از طریق kestrel این تنظیماتو بهش اضافه میکنیم که در اینجا certificatePath و certificateUtilities.pfxPassword هم می تونیم از appsetting بخونیم یا دستی بهش بدیمbuilder.Services.Configure&lt;KestrelServerOptions&gt;(options =&gt; options.ConfigureHttpsDefaults(listenOptions =&gt;    {        listenOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;       listenOptions.AllowAnyClientCertificate();        listenOptions.ServerCertificate = new X509Certificate2(certificatePath, CertificateUtilities.PfxPassword);    }));داخل program یه کار دیگه ام باید بکنیم ، اونم اینه که اول باید فایل cert بسازیم در محلی که بهش میگیم که در نهایت در تنظیمات بالا بفرستیمش سمت کلاینت ، پس می تونیم این خطو به program اضافه کنیم CertificateUtilities.GenerateCertificate(certificatePath);که میاد یه تابع رو فراخوانی میکنه که یه جای دیگه اونو ساختیم (هر جا خواستید میتونید این تابعو بزارید)namespace myNameSpace;using System.Security.Cryptography.X509Certificates;using System.Security.Cryptography;public static class CertificateUtilities{    public const string PfxPassword = &quot;MyPassword &quot;;    public static void GenerateCertificate(string certPath)    {        if (string.IsNullOrEmpty(certPath))        {            میتونیم مثلا یه لاگ بزاریم اینجا        }        if (!File.Exists(certPath))        {            GenerateCertificate(certPath, PfxPassword);            if (!File.Exists(certPath))            {                throw new ArgumentException($&quot;Could not create new certificate in: {certPath}&quot;);            }        }    }    private static void GenerateCertificate(string path, string password)    {        using var rsa = RSA.Create(2048);        var req = new CertificateRequest(&quot;C=IR/CO=Amnpardaz CO./Team=Vishkav/App=VDB&quot;, rsa, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);        req.CertificateExtensions.Add(new X509BasicConstraintsExtension(false, false, 0, true));        req.CertificateExtensions.Add(new X509SubjectKeyIdentifierExtension(req.PublicKey, false));        var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(1));        var bytes = cert.Export(X509ContentType.Pfx, password);        File.WriteAllBytes(path, bytes);    }}لازم به ذکر است  با انجام این تنظیمات در سمت سرور ( سمتی که api وجود دارد ) ، تنها فایل cert را ساخته ایم و اماده جهت ارسال به کلاینت کرده ایم .حال نکته ای که وجود دارد هنگامی که کلاینت به ما درخواستی ارسال می کند ، ما نیز باید در سمت سرور از درستی certificate کلاینت مطمین شویم ، پس این کار را مانند مثال زیر در بدنه خود api انجام می دهیم : [HttpGet(&quot;{Storage}/{Id}&quot;)]    public IActionResult GetFile&#40;[FromServices] GetFileCommand command, [FromRoute] FileRequest request, CancellationToken cancellationToken&#41;    {        var cert = this.HttpContext.Connection.ClientCertificate?.Thumbprint.ToString();        if (cert == null || this.options.Value.CertThumbprint != cert)        {            return new UnauthorizedResult();        }        return command.Run(request, cancellationToken);    }2. تنظیمات سمت کلاینت : بعد از اینکه سمت سرور کامل تنظیماتشو انجام دادیم ( ساخت یه فایل cert در ابتدای کار ، رمز نگاریش , و ارسالش به هر کی که به سرور دخواست بده )حالا میرسیم به تنظیمات مربوط که کلاینت ، یعنی سرویسی که سمت بک اند هست و ارسال درخواست میده (post / delete/ get / ... ) به سمت سرور میایم یه کلاس می سازیم و این تنظیماتو انجام میدیمnamespace ..... ;using System.Security.Cryptography.X509Certificates;using Microsoft.Extensions.Options;public class HttpclientService{    private readonly ILogger&lt;HttpclientService&gt; logger;    private readonly IOptions&lt;.......&gt; options;     public HttpclientService(ILogger&lt;HttpclientService&gt; logger, IOptions&lt;......&gt; options, )    {        this.logger = logger;        this.options = options;     }    public HttpClient HttpClient()    {        var handler = new HttpClientHandler();        var pss = CertificateUtilities.PfxPassword;        var clientCertificate = ConvertFromPfx(this.options.Value.CertificatePath, pss);         ّFile.TryWriteAllTextToFile&#40;&quot;ThumbPrint.txt&quot;, clientCertificate.Thumbprint, CancellationToken.None&#41;;        handler.ClientCertificates.Add(clientCertificate);        handler.ClientCertificateOptions = ClientCertificateOption.Manual;        handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =&gt;        {             if (cert?.Thumbprint == this.options.Value.VishkadehServerCertThumbprint)            { return true; }            return false;        };        var client = new HttpClient(handler)        {        };        var uriString = this.options.Value.VishkadehURL ?? &quot;&quot;;        if (string.IsNullOrEmpty(uriString))        {            throw new ArgumentException(&quot;.......&quot;);        }        if (!uriString.EndsWith(&quot;/&quot;, StringComparison.Ordinal))        {            uriString += &quot;/&quot;;        }        client.BaseAddress = new Uri(uriString);        return client;    }    private static X509Certificate2 ConvertFromPfx(string pfx, string password)    {        var clientCertificate = new X509Certificate2(pfx, password,            X509KeyStorageFlags.Exportable);        return clientCertificate;    }}و در نهایت تو هر کلاسی که خواستیم ، خیلی راحت میتونیم درخواست رو ارسال کنیمawait this.client.PostAsync(&quot;path&quot;, content, token)</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 07 Jan 2023 09:46:29 +0330</pubDate>
            </item>
                    <item>
                <title>singleTone vs Transient vs Scoped and HostedService</title>
                <link>https://virgool.io/@m_57794990/singletone-vs-transient-vs-scoped-and-hostedservice-adspyn19kdcl</link>
                <description>Transient — Services are created each time they are requested.  It gets a new instance of the injected object, on each request of this  object. For each time you inject this object is injected in the class,  it will create a new instance.Scoped — Services are created on each request (once per request). This is most recommended for WEB applications. So  for example, if during a request you use the same dependency injection,  in many places, you will use the same instance of that object, it will  make reference to the same memory allocation.Singleton — Services are created once for the lifetime of the application. It uses the same instance for the whole application.transient &gt; scoped &gt; singletonfor using &#x27;scoped&#x27; in &#x27;singleton&#x27; we can use &#x27;serviceprovider&#x27; using(varscope=this.serviceProvider.CreateScope())  { ();&quot;&gt; varscopeService=scope.ServiceProvider.GetRequiredService();  Console.WriteLine(&quot;scopeforExecuteAsync2&quot;);  awaitscopeService.scopeTask(stoppingToken);  } we cant use &#x27;transient&#x27; in &#x27;singleton&#x27; or &#x27;scoped&#x27;Hostedservice life time is singletonthere is no diffrrenc between hostedService and backgroundService , they all working parallel </description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Mon, 26 Dec 2022 14:51:50 +0330</pubDate>
            </item>
                    <item>
                <title>reffrence type vs value type</title>
                <link>https://virgool.io/@m_57794990/reffrence-type-vs-value-type-sb82e6bivizc</link>
                <description>داخل c# ، چند data type وجود دارد که با توجه به نحوه ذخیره سازی value آن ها داخل memory , دسته بندی می شوند ( value type, Reference type, pointer type)برای اطلاعات بیشتر مطالعه کنید https://www.tutorialsteacher.com/csharp/csharp-value-type-and-reference-type</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sun, 25 Dec 2022 12:41:35 +0330</pubDate>
            </item>
                    <item>
                <title>اضافه کردن test و تنظیمات اولیه :</title>
                <link>https://virgool.io/@m_57794990/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-test-%D9%88-%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA-%D8%A7%D9%88%D9%84%DB%8C%D9%87-veu72tdrfnho</link>
                <description>اول دو تا پوشه به اسم های source و test می سازیم و همه فایل های اصلی پروژه به غیر از global.json /.gitignore /.editorconfigو فایل های مربوط به توضیحات را داخل source قرار میدهیمبعد میریم داخل پوشه test و از اونجا وارد cmd میشیم و یک پروژه تست میسازیم ( dotnet new xunit )مرحله بعدی از طریق cmd میایم به پوشه اصلی و وارد vs code می شیم ، اول یه بار sln پاک میکنیم و بعد  مجددا می  سازیمش و پروژه هامونو بهش اضافه می کنیمdotnet new sln /  dotnet sln add  &#x27;myProj&#x27;همچنین تو قسمت global.json میایم &quot;rollForward&quot;: &quot;major&quot;, این تنظیماتو میزاریم که چون دات نت جدیدتری اومده ولی ما داریم با 6 کار میکنیم ، نیاد چیزای جدید دانلود کنه و به مشکل نخوریم</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 24 Dec 2022 09:54:45 +0330</pubDate>
            </item>
                    <item>
                <title>OneOf&lt;T0, …Tn&gt; Class Library In C#</title>
                <link>https://virgool.io/@m_57794990/oneoft0-tn-class-library-in-c-s9l0q6bser6d</link>
                <description>این کلاس کلا به چه دردی می خوره ؟اصلی ترین کاری که از پسش بر میاد ، اینه که می تونه کاری کنه که متد ما ، بجای یک خروجی ، چند خروجی داشته باشهنحوه استفاده از این کلاس چجوریه ؟خیلی خیلی راحته میایم داخل visual studio بعدش میریم از داخل NuGet Package سرچ می کنیم OneOf و اولین چیزی که اومد ، همونو نصب می کنیم ، میتونیمم بجای این کار خیلی راحت console package باز کنیم و تایپ کنیم install-package OneOfاین library خیلی قابلیت های مختلفی داره ولی اینجا کاربردی ترینشو یه مثال می زنیم ، حالا خواستین بیشتر یاد بگیرین ، هم بکشین و برین سرچ کنین namespace ConsoleApp{  class Program  {    static void Main(string[] args)    {      Program p = new Program();      var outcome = p.GetDynamicTypeResponse(3); // put parameter as 1,2 or 3 then we can see the different response type output.باحال ترین پراپرتی که داره ، isT هستش ، که با توجه به اینکه کدوم یکی از نوع هایی که متد میتونه برگدونرو مد نظرمون باشه ، میتونیم ازش استفاده کنیم و بصورت bool برامون برمیگردونه که بدرد مثلا همین If میخوره که بفهمیم کدوم نوع رو برگردونده      if (outcome.IsT0) // check if response is string type using IsT0(for first type)      {هر جا هم مطمین بودیم که متدمون ، چه نوعیو برگدونده ، خیلی راحت از پراپرتی AsT استفاده میکنیم و دقیقا اون نوع رو واکشی میکنیم        string stringValue = outcome.AsT0; // access to first response type value using AsT0        Console.WriteLine(stringValue);      }      else if (outcome.IsT1) // check if response is int type using IsT0(for second type)      {        int integerValue = outcome.AsT1; // access to second response type value using AsT1        Console.WriteLine(integerValue);      }      else // otherwise a response is bool or we can also use IsT2(for the third type)      {        bool booleanValue = outcome.AsT2; // access to third response type value using AsT2        Console.WriteLine(booleanValue);      }      Console.ReadKey();    }اینجا متدی که گفتمو تعریف کردیم که سه نوع خروجی میتونه داشته باشه که خیلی راحت داخل OneOf هر نوعی میخوایمو اضافه میکنیم و تو داخل متد هر کدوم از این سه نوع رو میتونیم return کنیم    private OneOf&lt;string, int, bool&gt; GetDynamicTypeResponse(int choice = 1)    {      if (choice == 1)      {        return &quot;string&quot;; // return string type value      }      else if (choice == 2)      {         return 10; // return integer type value      }      else      {        return true; // return boolean type value      }    }  }}</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Sat, 17 Dec 2022 10:51:54 +0330</pubDate>
            </item>
                    <item>
                <title>NoLock in entity framework</title>
                <link>https://virgool.io/@m_57794990/nolock-in-entity-framework-ewpkc95bljxs</link>
                <description>وقتی ما از noLock استفاده میکنیم که ، دیتایی که داخلی دیتا بیس هست برامون خیلی اهمیت نداشته باشه .حالا این یعنی چی ؟؟؟فرض کنیم که داریم از بانک مثلا سامان موجودی میگریم ( که این به معنی زدن query select و خواند از دیتابیس ) و در همان لحظه با کارتمون که مثلا دسته زیدمون هست داره خرید انجام میشه ، تو این مثال ما اصلا نباید از noLock استفاده کنیم ، چون ااگه استفاده کنیم مثلا موجودیمون باید 5 هزار تومن نشون بده ( چون موجودی 10 بوده و تو همون لحظه 5 تومن برداشت انجام شده ) ولی چون از noLock استفاده کردیم ، منتظر اجرای ( write ) کویری برداشت پول نمیشه و موجودیمونو به اشتباه 10 نشون میده حالا جاهایی که اطلاعات خیلی حساس نیست مثل لیست فایل هایی که اپلود کردیم ، از NoLock استفاده میکنیم که در این صورت همزمان هرکی خواست بتونه write انجام بده و ما به دیتاهای جدید نیاز نداریم و درخواست read به راحتی فراخوانی میشه</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Tue, 13 Dec 2022 12:38:36 +0330</pubDate>
            </item>
                    <item>
                <title>Entity Framework and AsNoTracking</title>
                <link>https://virgool.io/@m_57794990/entity-framework-and-asnotracking-ppdacqpbdeji</link>
                <description>- در entity framework مسولیت track (پیگیری ) , object ها با DbContext/Object Context  می باشد و یادمان باشد هر تغییری که روی دیتابیس انجام دهیم ، اگر saveChanges() را فراخوانی نکنیم ، تغییر در دیتابیس رقم نمی خورد.وقتی ما یک entity را بازیابی میکنیم از دیتابیس ، entitiy framework بررسی میکنه و تغییرات مارو داخل حافظه cache ذخیره میکنه ، وقتیم که متد saveChange() فراخوانی میشه ، تغییرات ذخیره میشهبعضی وقت ها هست که ما نیاز نداریم که این اتفاق بیفته و قرار نیست که تغییر در دیتابیس ایجاد کنیم ، مثلا وقتی که بخوایم فقط چند تا جدولو نمایش بدیم که در این شرایط میایم از AsNoTracking() استفاده می کنیم که در این صورت دیگه entity framewrok نماید چیزیو cache کنه و خب این برای performance خیلی خوب و حیاتیهusing(Entities context = new Entities()){var employee = context.Employees.AsNoTracking().ToList();var employee2 = context.Employees.Where(p =&gt; p.EmployeeId &gt;= 3).AsNoTracking().ToList();}</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Tue, 13 Dec 2022 12:06:43 +0330</pubDate>
            </item>
                    <item>
                <title>static modifier در دات نت چیست</title>
                <link>https://virgool.io/@m_57794990/static-modifier-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-%DA%86%DB%8C%D8%B3%D8%AA-lryqitikr19u</link>
                <description>فرض کنید داخل یک کلاس ساده ، یک متد داریم که static  ، خب این یعنی از این متد یدونه داخل این کلاس بیشتر ساخته نمی شه به عبارت دیگه از این کلاس نمونه سازی کنیم ،  به این متد دسترسی نداریمclass MyClass{     public string name;    public static string website;}-----------------------------------------------------------------class SeoncdClass{MyClass ali = new MyClass();در این خط از کلاس نمونه سازی کردیم و خیلی راحت به فیلد هاش دسترسی داریمali.name = &quot;ali&quot;;اما به فیلد website چون بصورت static هست از طریق نمونه سازی بهش دسترسی ندارم و فقط از طریق نام کلاس بهش دسترسی داریم ( چون این فیلد برای همه کلاس های دیگه یکیه ولی فیلد های دیگه جاهای مختلف می تونن مقدارهای مختلف بگیرن )ali.website = &quot;varzesh.com&quot;; // errormyclass.website = &quot;vaarzesh.com&quot;;}برای متد هم دقیقا همینطوره ، مثلا وقتی قراره یه متد فقط کارش این باشه که دو تا ورودی بگیره و اونهارو با هم جمع کنه ، چه نیازیه که اول از کلاسمون نمونه سازی کنیم ، بعدش بیایم به اون متد دسترسی داشته باشیم ، پس اون متدو static می کنیم و فقط با صدا کردن اسم کلاس به همراه نام متد ، در همه جای پروژه قابل دسترس خواهد بوداگه یه کلاس هم static باشه ، کاملا واضحه که کلیه اعضای کلاس static میشه و نمی شه از اون کلاس نمونه سازی کرداگه داخل یه کلاس ، یه کانستراکتور داشته باشیم که static هم باشه ، این به این معنیه که هر چقدم از این کلاس نمونه سازی شه ، این کانستراکتور فقط یکبار اجرا می شه</description>
                <category>mohammad mhammadi</category>
                <author>mohammad mhammadi</author>
                <pubDate>Tue, 06 Dec 2022 10:19:34 +0330</pubDate>
            </item>
            </channel>
</rss>