<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mvaliolahi</title>
        <link>https://virgool.io/feed/@mvaliolahi</link>
        <description>Programmer</description>
        <language>fa</language>
        <pubDate>2026-06-10 16:07:23</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/23375/avatar/nwe7CI.png?height=120&amp;width=120</url>
            <title>Mvaliolahi</title>
            <link>https://virgool.io/@mvaliolahi</link>
        </image>

                    <item>
                <title>یادگیری زبان بدون خون ریزی</title>
                <link>https://virgool.io/@mvaliolahi/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%AF%D9%88%D9%86-%D8%AF%D8%B1%D8%AF-%D9%88-%D8%AE%D9%88%D9%86-%D8%B1%DB%8C%D8%B2%DB%8C-rllaictn2dpm</link>
                <description>آیا برای شروع یک سفر زبانی هیجان انگیز آماده اید؟ یادگیری زبان درها را به روی فرهنگ ها، فرصت ها و ارتباطات جدید باز می کند. چه یک زبان آموز با تجربه باشید و چه تازه سفر خود را به دنیای زبان ها آغاز کرده اید، Upword اینجاست تا تجربه شما را تغییر دهد. در این پست وبلاگ، بررسی خواهیم کرد که چگونه برنامه ما انقلابی در یادگیری زبان برای کاربران در سراسر جهان ایجاد می کند.1. با MovieBox وارد دنیای زبان شویدیادگیری زبان فقط مربوط به واژگان و دستور زبان نیست. همچنین در مورد درک فرهنگ و زمینه است. اینجاست که فیچر MovieBox ما وارد می‌شود. تصور کنید بتوانید یک کلمه یا عبارت را جستجو کنید و فوراً به صحنه‌های مرتبط از فیلم‌ها یا انیمیشن های مختلف دسترسی داشته باشید. این فیچر جذاب به شما کمک می کند تا در حین تفریح، تفاوت های ظریف زبان و فرهنگ را درک کنید.2. ایجاد و اشتراک گذاری فلش کارت های تعاملیفلش کارت ها برای مدت طولانی جزء اصلی یادگیری زبان بوده اند، اما Upword آنها را به سطح بعدی می برد.برنامه ما به شما امکان می دهد فلش کارت های پویا با تصاویر، صدا و متن ایجاد کنید. جالب‌تر این است که می‌توانید این فلش کارت‌ها را با دانش‌آموزان به اشتراک بگذارید. همکاری کنید، دانش یکدیگر را آزمایش کنید، و شاهد رشد مهارت های زبانی خود باشید.3. ترجمه و ساخت واژگان یکپارچههنگامی که در حین مرور، تماشای فیلم یا درگیر شدن در مکالمات در برنامه با کلمه جدیدی روبرو می شوید، می توانید به راحتی آن را ترجمه کنید یا به فلش کارت های خود اضافه کنید. این رویکرد یکپارچه به این معنی است که هرگز فرصتی را برای گسترش دایره لغات خود از دست نمی دهید.4. تمرین مکالمه بدون نیاز به پارتنراعتماد به نفس در صحبت کردن یک جنبه حیاتی در یادگیری زبان است. با قابلیت گفتگوی Upword، می‌توانید با قابلیت‌های تبدیل متن به گفتار و گفتار به متن در مکالمات ساختگی شرکت کنید. تلفظ را تمرین کنید، مهارت های گفتاری خود را تقویت کنید و اعتماد به نفس برقراری ارتباط موثر را به دست آورید.5. به انجمن زبان آموزی پر رونق بپیوندیدیادگیری زبان زمانی لذت بخش تر است که یک تجربه مشترک باشد. Upword بستری را برای زبان آموزان در سراسر جهان فراهم می کند تا بتوانند با یکدیگر ارتباط برقرار کنند، نکات را به اشتراک بگذارند و از یکدیگر حمایت کنند. به جامعه ای پر رونق بپیوندید که چالش ها و پیروزی های سفر یادگیری زبان را درک می کند.6. سفر یادگیری شخصی Upword با سرعت یادگیری و ترجیحات شما سازگار است. توصیه‌های متناسب، ردیابی پیشرفت، و تمرین‌های سفارشی تضمین می‌کنند که تجربه یادگیری زبان شما به همان اندازه منحصربه‌فرد است.آماده ای برای تغییر یادگیری زبان خود؟یادگیری یک زبان جدید یک ماجراجویی ارزشمند است و Upword همراه مورد اعتماد شما در این سفر است. خواه قصد سفر به دنیا، پیشرفت شغلی یا به سادگی گسترش افق های خود را داشته باشید، برنامه ما دارای ابزارها و ویژگی هایی است که یادگیری زبان را جذاب، موثر و لذت بخش می کند.همین امروز Upword را دانلود کنید و ماجراجویی یادگیری زبان خود را ارتقا دهید. با موانع زبانی خداحافظی کنید و به آینده ای پر از ارتباطات و فرصت های هیجان انگیز سلام کنید!هم اکنون انقلاب یادگیری زبان خود را با Upword شروع کنید!لینک دانلود از کافه بازار:https://cafebazaar.ir/app/ir.upword.twa?l=enدر این سفر هیجان انگیز یادگیری زبان به ما بپیوندید. با هم، فرهنگ‌های جدید را کشف می‌کنیم، با مردم سراسر جهان ارتباط برقرار می‌کنیم، و از طریق قدرت زبان، درهایی را به روی امکانات بی‌پایان باز می‌کنیم.Upword - جایی که یادگیری زبان رشد می کند!برای دسترسی به آپ ورد به آدرس: https://upword.irمراجعه کنید.</description>
                <category>Mvaliolahi</category>
                <author>Mvaliolahi</author>
                <pubDate>Sat, 02 Sep 2023 22:52:00 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت API Document بدون خون ریزی‌!</title>
                <link>https://virgool.io/eastcloudmedia/%D8%B3%D8%A7%D8%AE%D8%AA-api-document-%D8%A8%D8%AF%D9%88%D9%86-%D8%AE%D9%88%D9%86-%D8%B1%DB%8C%D8%B2%DB%8C-xwzti1nidbzc</link>
                <description>برای ساخت مستندات API بدون در نظر گرفتن اینکه قراره به صورت عمومی یا داخلی مورد استفاده بشه راه های متفاوتی وجود داره از جمله: Sample Code، فایل متنی ساده شامل Endpoint ها و مقادیری که بعنوان ورودی قبول میکنن و یا استفاده از ابزارهای مثل Postman و Swagger که هر کدوم از این روش ها مزایا و معایب خودشون رو دارن.اگر توسعه دهنده ی PHP هستید و یا با این زبان آشنایی نسبتا کمی هم داشته باشید میتونید بدون سروکار داشتن با annotation توی سریع ترین زمان مستندات API خودتون رو با فرمت HTML بسازید و در اختیار تیم توسعه دهنده قرار بدین (امکان ساخت مستندات با فرمت های دیگه هم وجود داره).1- شروع کار (نصب)بدون در نظر گرفتن اینکه توی چه فریم ورکی مشغول کد زدن هستین یا اینکه پروژه ی شما pure هست میتونید کتابخونه‌ی SibDoc رو از طریق Composer نصب کنید.composer require mvaliolahi/sibdocاین کتابخونه از طریق آدرس https://github.com/mvaliolahi/sibdoc قابل دسترسیت.بعد از نصب کافیه یه Object از کلاس Mvaliolahi\SIbDoc بصورت زیر بسازید:کد کاملا گویای این هست که هر پارامتر چه وظیفه‌ای رو به عهده داره. علاوه بر آرگمان های بالا میتونید از آرگمان background_color با پاس دادن کد رنگ مورد نظرتون رنگ پس زمینه داکیومنت رو تغییر بدین.2- تعریف Endpoint هابا فرض اینکه endpoint ای دارید که اطلاعات یه تراکنش خاص رو نشون میده میتونید به صورت زیر مستندش کنید!خروجی کد بالا نمای زیرو خواهد داشت:توجه: کلاس هاس Request و Response رو از Namespace کتابخونه یعنی Mvaliolahi\SibDoc وارد کنید.اشیاء $request و $response  هر دو امکان تعریف Header اختصاصی خودشون رو از طریق متد headers دارن، کافیه یه آرایه انجمنی به این متد پاس بدین. اگه قصد داشته باشید برای تمام Requet ها و یا Response ها هدر پیش فرض تعریف کنید میتونید اینکارو به کمک:$api-&gt;requestHeaders([]) $api-&gt;responseHeaders([])انجام بدین.نکته: هر request میتونه چندین response داشته باشه. در نتیجه میتونید هر تعداد شیء $request با مشخصات مورد نیاز بسازید و به کمک: $request-&gt;response($anotherResponse)به request اضافه کنید.نیاز به توضیح نیست که با شیء api میتونید متدهای getpostputpatchdeleteheadconnectoptionstraceرو تعریف کنید.تعریف Groupتعریف گروه به صورت: انجام میشه.تعریف Modelبرای تعریف مدل کافیه به صورت:هر تعداد مدل که نیاز دارید تعریف کنید. مدل ها توی خروجی مستندات قابل دسترسی هستن. همچنین میتونید از مدل ها توی بدنه response ها استفاده کنید. مثلا:3- ذخیره مستندات بصورت HTMLبعد از اینکه تمام endpoint ها و model ها رو تعریف کردید میتونید از طریق متد saveTo مستندات رو در مسیر دلخواه با فرمت html ذخیره کنید.اگر فایل داکیومنت رو از طریق command-line و یا browser اجرا کنید در مسیر مشخص شده فایلی با اسم document.html ذخیره خواهد شد.نکته: در صورتی که نیاز داشته باشید داکیومنت رو با فرمت دلخواه مثلا Json یا Markdown ذخیره کنید میتونید کلاس های دلخواه خودتون رو بسازید و اون رو از کلاس Document Generator مشتق کنید. با اینکار به endpoint, group و model هایی که تعریف کردید از طریق متدهایی با همین اسامی دسترسی خواهید داشت. این کتابخونه از آدرس https://github.com/mvaliolahi/sibdoc قابل دسترسی هست. در صورت علاقه میتونید start بدین :)کانال تلگرام: http://t.me/cleancastshttp://twitter.com/cleancasts</description>
                <category>Mvaliolahi</category>
                <author>Mvaliolahi</author>
                <pubDate>Thu, 24 Jan 2019 23:01:52 +0330</pubDate>
            </item>
                    <item>
                <title>از میرعماد تا Uncle Bob</title>
                <link>https://virgool.io/@mvaliolahi/%D8%A7%D8%B2-%D9%85%DB%8C%D8%B1%D8%B9%D9%85%D8%A7%D8%AF-%D8%AA%D8%A7-uncle-bob-pcuzrxnsyafb</link>
                <description>شاید این سوال براتون به وجود بیاد که برنامه نویسی چه ارتباطی با میرعماد داره؟ میر عماد حسنی یکی مشهور ترین خوشنویس های ایران هست که در واقع به بزرگترین خوشنویس خط نستعلیق معروفه. میرعماد در واقع هنر خوشنویسی رو به اوج رسوند. توی این مقاله قصد دارم principle هایی که خوشنویس ها برای بهتر شدن  کارشون استفاده میکنن رو با principle هایی که برنامه نویس ها استفاده میکنن مقایسه ای کنم.ابزارهای خوشنویسقلم نیمرکبورقزیردستیابزارهای برنامه نویسزبان برنامه نویسیمحیط مجتمع (IDE)مهم نیست شما خودتون رو خوشنویس یا برنامه نویس میدونین، داشتن ابزارها به تنهایی، شما رو اینکاره نمیکنه! برای خوشنویس شدن باید ابزارهاتون بهترین نوع باشه یعنی هرچه کیفیت قلمی که استفاده میکنید بهتر باشه خطی که مینویسید بهتر خواهد بود طبیعتا کیفیت خط به مهارت خوش نویس هم بستگی داره. هرآنچه باید بگم قبلا در قالب شعر عنوان شده:پنج چيز است كه تا جمع نگردد باهمهست خطاط شدن نزد خرد امر محالدقت طبع و وقوفي ز خط و خوبی دستطاقت محنت و اسباب كتابت به كمالگر از اين پنج، يكي راست قصوري حاصلندهد فايده گر سعي نمايي صد سال...این شعر دقیقا میتونه کلید برنامه نویس شدن هم باشه :)خوشنویس ها چه Workflow ای دارن؟!خوشنویس ها قبل از نوشتن خط نهایی که با با قلم نی نوشته میشه،‌ روی کاغذ با خودکار یا مداد ترکیب چیزی که میخوان خلق کنن رو مینویسن و تا وقتی که ترکیبی که میخوان نهایی نشده کار رو با قلم نی شروع نمیکنن.ترکیب های بالا ایراد دارن!جالبه، نه تنها دارن Test مینوسن :) اونم TDD :)واژه‌ی Testing اطمینان از درست کار کردن یه چیزی هست. در واقع برای Test یه قطعه کد،‌ کد دیگه ی نوشته میشه که مطمئن بشیم عملکرد کدمون درست هستقطعه کد زیر در واقع Test یه کد هست:/** @test */public function it_should_return_result_of_commands()  {      $this-&gt;scheduler-&gt;exec(&#x27;cd&#x27;)                -&gt;everyMinute();      $command = &#x27;echo http://t.me/cleancasts&#x27;;      $this-&gt;scheduler-&gt;exec($command)                -&gt;everyMinute();      $this-&gt;scheduler-&gt;start();      $this-&gt;assertEquals(                &#x27;http://t.me/cleancasts&#x27;,                $this-&gt;getProcessResult($this-&gt;scheduler-&gt;result()[$command])      );  }کد بالا ادعا میکنه اگر هر دقیقه دستور $ echo http://t.me/cleancastsاجرا بشه کلاس Scheduler به خروجی دستور دسترسی داره. اگر تست pass بشه که کد کلاس مورد نظر داره درست کار میکنه.واژه‌ی TDDیا Test Driven Development  در واقع برعکس پروسه قبلی هست. یعنی اول قطعه کدی که همون Test هست نوشته میشه، این قطعه کد فرض رو بر وجود کدهای برنامه میذاره و نهایتا ادعا میکنه که کدبرنامه باید عملکردی که مدنظر هست رو داشته باشه. چه اتفاقی میوفته؟! تست رو اجرا میکنیم و fail میشه،‌اینجاست که باید حداقل کدی که کمک میکنه تست pass بشه رو بنویسیم و کار رو با یه Testدیگه پیش ببریم و ... با این کار نهایتا کد برنامه Coverage بالایی خواهد داشت یعنی کدها درصد بالایی تست دارن (توی TDD قبل از اینکه کدی نوشته بشه دیزاین و معماری کد رو هم لحاظ میکنیم در نتیجه کد کیفیت بالاتری داره).مشق نظری خوشنویس هاخوشنویس های برای بهترشدن دستخطشون تمرینی دارن که خط اساتید این حوزه رو به صورت چشمی روزانه نگاه کنن این کار باعث میشه شکل کلمات توی ذهن بهتر نقش ببنده و موقع نوشتن بهتر بتونن کلمات رو بنویسن. در کنار این کار یه تمرین دیگه دارن که کنار استادشون میشینن و خط نوشتن استادشون رو نگاه میکنن این کار معادل Pair Programming هست. مشق نظری برنامه نویس هم همون نگاه کردن به source code افراد مشهور هست.اصول طراحیجالبه بدونید خوشنویس ها توی هر برگه فقط یه نوع خط مینویسن (شکسته، نستعلیق، کتابت و ...) خطی که مینویسن Open Close هم هست یعنی وقتی کلمه ای رو نوشتن دیگه نقاشیش نمیکنن و بخوان با ظاهر چیزی که نوشتن بازی کنن،‌کارو ادامه میدن و نهایتا اگر لازم بشه کلمه ای رو Decorate می کنن. یه تفاوتی که توی خوشنویس با برنامه نویسی هست اینه که: اینور ما Interface ها رو وضع میکنیم، ولی توی خوشنویسی طی قرن ها آدمهای شاخصی مثل میرعماد Contract هایی رو وضع کردن که برای هر خطی شرایط مخصوص خودش رو داره و خوشنویس باید اونها رو Implement کنه (interface segregation کاملا رعایت شده). نکته کجاست؟نکته همینجاست! هنر نوعی تقلیده.شاید فکر کنید آدمهای هنرمند، هنرمند به دنیا میان، شاید این جمله درست باشه ولی همه ی ما فرصت اینو داریم که توی یه کاری رشد کنیم. برنامه نویسی هنر اجرا شدن یه کد نیست،‌ هنر نوشتن و اجرا شدن یه کده. یعنی کدی که مینویسیم علاوه بر انجام کاری که برای اون نوشته شده قابلیت نگهداری و توسعه رو داشته باشه. شاید بتونم بگم : تفاوت کد خوب و کد بد توی جزئیات کوچیه.نمیخوام مطلب بیشتر از این طولانی بشه به عنوان سخن آخر اشاره ای میکنم به جمله ی Des Traynor:There&#x27;s a big different between making a sample product and making a product sample.مهم نیست میرعماد قائده ای رو معرفی کرده یا Uncle Bob هرچیزی که کمک کنه محصولی با پیچیدگی های کمتر خلق کنیم قطعا چیز خوبیه. قوائد میتونن رعایت بشن یا نه، نکته ایه که تصمیمش با شماست :) اینکه کجا از چه قائده ای هم استفاده کنید به عهده‌ی شماست. به نظرم شناخت قوائد مهم تر از رعایت کردن قوائد بدون چرایی اونهاست.http://t.me/cleancastshttp://twitter.com/cleancasts </description>
                <category>Mvaliolahi</category>
                <author>Mvaliolahi</author>
                <pubDate>Thu, 06 Dec 2018 13:46:11 +0330</pubDate>
            </item>
                    <item>
                <title>Refactoring  یک بار برای همیشه</title>
                <link>https://virgool.io/@mvaliolahi/%D8%B1%DB%8C%D9%81%DA%A9%D8%AA%D9%88%D8%B1-%DB%8C%DA%A9-%D8%A8%D8%A7%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%87%D9%85%DB%8C%D8%B4%D9%87-vg1xomgrv6xm</link>
                <description>هر زمان شخصی رو میبینم که سریع شروع به کد زدن میکنه یاد جمله ی زیبای Jeffery Way توی کتاب Testing Decoded میوفتم: &quot;اجازه نده گاو چرون باشی&quot; گاو چرون اول کد میزنه بعد فکر میکنه، ولی برنامه نویس قبل از کد زدن فکر میکنه. به عنوان برنامه نویس شاید تقریبا واژه ی عزیز Refactor رو هر روز به زبون بیاریم یا از آدم های اطراف بشنویم! اگه فکر میکنید ریفکتور کار سختیه! لطفا تا آخر مطلب مهمون من باشین.  ریفکتور یعنی تغییر ساختار یه کد بدون اینکه عملکرد کد تغییر کنه. اگه بعد از ریفکتور ساید افکت به وجود بیاد قطعا ریفکتور نکردیم! جملم به این معنی نیست که کار رو ادامه بدیم تا ساید افکت از بین بره! نه اصلا! چطوره یه بار برای همیشه ریفکتور رو با هم معنی کنیم؟استاد Ron Jeffries چی میگه؟! Refactoring isn’t rewriting. Certainly if we have a program with a bad design, we can write a new program, using a better design. It would take a long time, however, and in Scrum we don’t have a long time: we need a better design by the end of the current Sprint.ریفکتور دوباره نویسی نیست. قطعا اگه برنامه ای داریم که بد طراحی شده میتونیم با طراحی بهتر برنامه ی جدیدی بنویسیم. زمان زیادی میگیره، با اینکه، توی اسکرام زمان زیادی نداریم: &quot;ما به دیزاین بهتر در پایان اسپرینت فعلی نیاز داریم&quot; از سخن استاد که بگذریم، جدا چطور میتونیم ادعا کنیم کدی رو ریفکتور کردیم ولی ساید افکت داشته! یا بدتر، بگیم ریفکتور کار سختیه… اصلا چرا ریفکتور کنیم وقتی احتمال ساید افکت وجود داره؟ اصلا ریفکتور کی و کجا باید انجام بشه؟! قصد ندارم خیلی سرتون رو درد بیارم، اگه بعد از ریفکتور ساید افکت به وجود بیاد قطعا یه چیزی به اسم Test توی پروژه کمه! یا اینکه Test هایی که داریم  Valuable نیست. زمانی که داریم روی کدی کار میکنیم که ‌Test نداره یا اصطلاحا Legacy Code هست خنده داره بخوایم راجب ریفکتور حرف بزنیم. در واقع بهتره قبل از تغییر ساختار کد اول از عملکردش به کمک Test مطمئن بشیم. زمانی که مطمئن شدیم کد داره درست کار میکنه ریفکتور آغاز میشه. نتیجتا اگر بعد از ریفکتور تست ها پاس شد کار تمامه! (میزان Code Coverage و Valuable بودن تست ها رو در نظر داشته باشین).جمله ی بالا رو میتونم اینجوری عنوان کنم که Test به ما این اطمینان رو میده که کدها رو با اعتماد به نفس Refactor کنیم. (اگر فرصت داشته باشم بعدا راجب تست مطلب مینویسم) ریفکتور نه تنها کار سختی نیست شاید یکی از لذت بخش ترین قسمت های برنامه نویسی باشه چیزی که کمک میکنه اخر اسپرینت نرم فراری با طراحی خوب داشته باشیم (حتی آخر روز). ریفکتور تسک نیست که بخواد در قالب اسپرینت بگنجه ریفکتور یه پروسه هست که دائم درگیریم باهاش. First, solve the problem. Then, write the code. “John Johnson”اول مسأله رو حل کن، بعد کد رو بنویس. این جمله واقعیت ارزشمندی رو بیان میکنه، اولین قدم حل کردن مساله هست، به نظر من روی کاغذ، بعد نوشتن کد هست، و نهایتا بهتر کردن کد با هدف اینکه قراره بعدا توسط خودمون یا شخص دیگه ای توسعه پیدا کنه. تا کی ریفکتور کنیم؟ به نظرم تقریبا هر کدی قابلیت بهتر شدن رو داره، چه از نظر زیبایی چه از نظر performance، شاید یکی از هدف های ریفکتور قابل خوندن تر شدن کد باشه. به عبارتی ما کد رو ریفکتور میکنیم که پیچیدگی ها کمتر بشه و معماری کدمون تمیز تر بشه تا نهایتا به کدی برسیم که نگهداری و توسعه ی اون راحتتره. اینکه ریفکتور رو تا کی ادامه بدیم جای بحث داره. اگر یکسال پیش این سوال رو ازم میپرسیدن میگفتم تا وقتی امکانش هست! (یه جورابیتا بی نهایت)، الان نظرم اینه تا وقتی حس کنی زمانبندی محصول رو خیلی دچار مشکل نمیکنی و نفر بعدی برای خوندن کدت زمان زیادی نیاز نداشته باشه و اینکه راحت بتونه کدت رو توسعه بده. http://t.me/cleancastshttp://twitter.com/cleancasts </description>
                <category>Mvaliolahi</category>
                <author>Mvaliolahi</author>
                <pubDate>Wed, 05 Dec 2018 23:55:51 +0330</pubDate>
            </item>
            </channel>
</rss>